Commit 003ed0c7b1b86e51c620b453b729c80a5502274a

Authored by 陈鑫涛
1 parent 29b14319

排版

src/components/Common/Typesetting/typesetting.js
... ... @@ -20,8 +20,10 @@ const Typesetting = props => {
20 20 boxWidth,
21 21 boxHeight,
22 22 textSize,
  23 + isMobile,
23 24 } = props;
24   - if (!slaveRowData) return
  25 + console.log("🚀 ~ Typesetting:", props);
  26 + if (!slaveRowData) return;
25 27 const {
26 28 dSBLB, // 上边留白
27 29 dXBLB, // 下边留白
... ... @@ -52,6 +54,8 @@ const Typesetting = props => {
52 54 const [dMaterialsKQty, setDMaterialsKQty] = useState(0);
53 55 const [dPartsLength, setDPartsLength] = useState(0);
54 56  
  57 + // 横板
  58 + const { dHorizontal, dPortrait, dHorizontalType, dPortraitType } = slaveRowData;
55 59 // 使用 useRef 获取 DOM 元素
56 60 const boxRef = useRef(null);
57 61 const boxsRef = useRef(null);
... ... @@ -67,8 +71,10 @@ const Typesetting = props => {
67 71 const slaveDataDetail = slaveData?.find(item => item.sTreeNodeName === selectedNode.showName && item.sBoxModel === boxModel);
68 72 const maxWidth = Number(slaveDataDetail?.dMaxLength);
69 73 const maxHeight = Number(slaveDataDetail?.dMaxWidth);
  74 +
70 75 const outerWidth = Number(slaveDataDetail?.dMaxLength); // 默认取最大上机尺寸
71 76 const outerHeight = Number(slaveDataDetail?.dMaxWidth); // 默认取最大上机尺寸
  77 + console.log("🚀 ~ maxWidth:", dHorizontal, dPortrait,dHorizontalType,dPortraitType, outerWidth, outerHeight);
72 78  
73 79 // 确认是竖向排列还是横向排列
74 80 const L = masterData?.dLength;
... ... @@ -215,7 +221,6 @@ const Typesetting = props => {
215 221 // 每个盒子加上边距 和第二组偏移量 如果根据次盒再加上次盒偏移量
216 222 let cols = Math.floor(outerWidth / (innerWidthCombined + boxLengthOffset + (reference ? 0 : dSLengthOffset)));
217 223 let rows = Math.floor(outerHeight / (innerHeightCombined + boxWidthOffset + (reference ? 0 : dSWidthOffset)));
218   -
219 224 let colsMaxLength = (cols - 1) * (innerWidthCombined + boxLengthOffset + (reference ? 0 : dSLengthOffset)) + innerWidthCombined;
220 225 while (colsMaxLength >= outerWidth && cols > 0) {
221 226 cols = cols - 1;
... ... @@ -240,6 +245,28 @@ const Typesetting = props => {
240 245 const commonHeightCheck = remainingHeight > jInnerHeight;
241 246 const commonWidthCheck = remainingWidth > jInnerWidth;
242 247 const remaining = isVertical ? commonHeightCheck : commonWidthCheck;
  248 + console.log(
  249 + cols,
  250 + rows,
  251 + innerWidth,
  252 + innerHeight,
  253 + jInnerWidth,
  254 + jInnerHeight,
  255 + innerWidthCombined,
  256 + innerHeightCombined,
  257 + remainingWidth,
  258 + remainingHeight,
  259 + colsMaxLength,
  260 + rowsMaxLength,
  261 + remaining,
  262 + isVertical,
  263 + boxLengthOffset,
  264 + boxWidthOffset,
  265 + dSLengthOffset,
  266 + dFLengthOffset,
  267 + "rowsMaxLength"
  268 + );
  269 +
243 270 // 抵扣盒默认展示 svg
244 271 // const isSvg = props.slaveRowData.sName === "扣抵盒";
245 272 // 组装svg数据
... ... @@ -265,16 +292,16 @@ const Typesetting = props => {
265 292 position: "absolute",
266 293 left: `${leftPosition}px`,
267 294 top: `${topPosition}px`,
268   - transform: `rotateZ(${offsetZ}deg)`,
  295 +
269 296 zIndex: 10,
270 297 }}
271 298 onDoubleClick={() => {
272 299 onClick();
273 300 }}
274 301 >
275   - {/* <img src={icon} width="100%" height="100%" /> */}
276   - <DynamicSVG {...svgProps} />
277   - {/* {isSvg ? <DynamicSVG {...props} /> : <img src={icon} width="100%" height="100%" />} */}
  302 + <div style={{ transform: `rotateZ(${offsetZ}deg)` }}>
  303 + <DynamicSVG {...svgProps} />
  304 + </div>
278 305 </div>
279 306 );
280 307 const createBox = (col, row, index, leftPosition, topPosition, offsetZ, icon) => (
... ... @@ -299,24 +326,25 @@ const Typesetting = props =&gt; {
299 326 <div
300 327 key={`${col}-${row}-${index}`}
301 328 style={{
302   - width: `${(iSAngle === 90 || iSAngle === 270) ? jInnerWidth:innerWidth}px`,
303   - height: `${(iFAngle === 90 || iFAngle === 270) ? jInnerHeight:innerHeight}px`,
  329 + width: `${iSAngle === 90 || iSAngle === 270 ? jInnerWidth : innerWidth}px`,
  330 + height: `${iFAngle === 90 || iFAngle === 270 ? jInnerHeight : innerHeight}px`,
304 331 display: "flex",
305 332 justifyContent: "center",
306 333 alignItems: "center",
307 334 position: "absolute",
308 335 left: `${dFLengthOffset + dYBJJ}px`,
309 336 top: `${iFAngle === 90 || iFAngle === 270 ? 0 : dFWidthOffset + dXBJJ}px`,
310   - transform: `rotateZ(${iFAngle}deg)`,
311 337 }}
312 338 >
313   - <DynamicSVG {...svgProps} />
  339 + <div style={{ transform: `rotateZ(${iFAngle}deg)` }}>
  340 + <DynamicSVG {...svgProps} />
  341 + </div>
314 342 </div>
315 343 <div
316 344 key={`${col}-${row}-${index}-1`}
317 345 style={{
318   - width: `${(iSAngle === 90 || iSAngle === 270) ? jInnerWidth:innerWidth}px`,
319   - height: `${(iSAngle === 90 || iSAngle === 270) ? jInnerHeight:innerHeight}px`,
  346 + width: `${iSAngle === 90 || iSAngle === 270 ? jInnerWidth : innerWidth}px`,
  347 + height: `${iSAngle === 90 || iSAngle === 270 ? jInnerHeight : innerHeight}px`,
320 348 display: "flex",
321 349 justifyContent: "center",
322 350 alignItems: "center",
... ... @@ -325,10 +353,11 @@ const Typesetting = props =&gt; {
325 353 top: `${
326 354 isVertical ? jInnerHeight + dXBJJ + dFWidthOffset + dSWidthOffset : iSAngle === 90 || iSAngle === 270 ? 0 : dSWidthOffset + dXBJJ
327 355 }px`,
328   - transform: `rotateZ(${iSAngle}deg)`,
329 356 }}
330 357 >
331   - <DynamicSVG {...svgProps} />
  358 + <div style={{ transform: `rotateZ(${iSAngle}deg)` }}>
  359 + <DynamicSVG {...svgProps} />
  360 + </div>
332 361 </div>
333 362 </div>
334 363 );
... ... @@ -362,12 +391,13 @@ const Typesetting = props =&gt; {
362 391 position: "absolute",
363 392 left: `${dFLengthOffset + dYBJJ}px`,
364 393 top: `${dFWidthOffset + dXBJJ}px`,
365   - transform: `rotateZ(${iFAngle}deg)`,
366 394 }}
367 395 >
368 396 {/* <img src={icon} width="100%" height="100%" /> */}
369 397 {/* {isSvg ? <DynamicSVG {...props} /> : <img src={icon} width="100%" height="100%" />} */}
370   - <DynamicSVG {...svgProps} />
  398 + <div style={{ transform: `rotateZ(${iFAngle}deg)` }}>
  399 + <DynamicSVG {...svgProps} />
  400 + </div>
371 401 </div>
372 402 </div>
373 403 );
... ... @@ -389,7 +419,6 @@ const Typesetting = props =&gt; {
389 419 const calculateTopPosition = (row, reference, isVertical, topPosition, dSWidthOffset, dXBJJ) => {
390 420 if (isVertical) {
391 421 if (reference) {
392   -
393 422 return row === 0 ? topPosition : topPosition + boxWidthOffset * row;
394 423 } else {
395 424 return row === 0 ? topPosition : topPosition + (dSWidthOffset + boxWidthOffset) * row;
... ... @@ -404,23 +433,20 @@ const Typesetting = props =&gt; {
404 433 };
405 434 const scaleXD = (clientWidth - 50) / (outerWidth + 110);
406 435 const scaleYD = (clientHeight - 5) / (outerHeight + 90);
407   - useEffect(
408   - () => {
409   - // 计算缩放比例
410   - // setBoxKey(new Date().getTime());
411   - setTimeout(() => {
412   - const scaleX = (clientWidth - 50) / (outerWidth + 110);
413   - const scaleY = (clientHeight - 5) / (outerHeight + 90);
414   - const newScale = Math.min(scaleX, scaleY);
415   - setScale(newScale);
416   - if (boxRef.current) {
417   - boxRef.current.style.transform = `scale(${scaleX}, ${scaleY})`;
418   - boxRef.current.style.transformOrigin = "top left";
419   - }
420   - }, 0);
421   - },
422   - [radioValue, slaveRowData, masterData, selectedNode, slaveData]
423   - );
  436 + useEffect(() => {
  437 + // 计算缩放比例
  438 + // setBoxKey(new Date().getTime());
  439 + setTimeout(() => {
  440 + const scaleX = (clientWidth - 50) / (outerWidth + 110);
  441 + const scaleY = (clientHeight - 5) / (outerHeight + 90);
  442 + const newScale = Math.min(scaleX, scaleY);
  443 + setScale(newScale);
  444 + if (boxRef.current) {
  445 + boxRef.current.style.transform = `scale(${scaleX}, ${scaleY})`;
  446 + boxRef.current.style.transformOrigin = "top left";
  447 + }
  448 + }, 0);
  449 + }, [radioValue, slaveRowData, masterData, selectedNode, slaveData]);
424 450 // 生成里层 div 的数组
425 451 const innerDivs = [];
426 452 for (let col = 0; col < cols; col++) {
... ... @@ -476,17 +502,21 @@ const Typesetting = props =&gt; {
476 502 const propsDataWidth = Number(propsData.props.style.width.slice(0, -2));
477 503 const propsDataHeight = Number(propsData.props.style.height.slice(0, -2));
478 504 const propsDataTop = Number(propsData.props.style.top.slice(0, -2));
479   -
480   - const newMaterialLength = propsDataLeft + innerWidthCombined; // 原纸长
  505 + // 判断列是否是单独的
  506 + const newMaterialLength = propsDataLeft + (remaining ? jInnerWidth : innerWidthCombined); // 原纸长
481 507 const newMaterialWidth = propsDataTop + propsDataHeight - dSBLB;
482 508 // 计算开数
483   - const dSinglePQty = variables
  509 + const dSinglePQty = isVertical
484 510 ? remaining
485 511 ? cols + cols * (rows * 2)
486 512 : cols * (rows * 2)
487 513 : remaining
488   - ? rows + rows * (cols * 2)
489   - : rows * (cols * 2);
  514 + ? rows + rows * (cols * 2)
  515 + : rows * (cols * 2);
  516 + // 计算竖版数量
  517 + const dHorizontalType = isVertical ? cols : remaining ? cols * 2 + 1 : cols * 2;
  518 + const dPortraitType = isVertical ? rows * 2 : remaining ? rows : rows;
  519 +
490 520 const newDProductQty = masterData.dProductQty;
491 521 const dMaterialsKQty = slaveDataDetail.dMaterialsKQty || 1;
492 522 if (
... ... @@ -516,7 +546,9 @@ const Typesetting = props =&gt; {
516 546 newMaterialLength,
517 547 newMaterialWidth,
518 548 innerWidth,
519   - innerHeight
  549 + innerHeight,
  550 + dHorizontalType,
  551 + dPortraitType
520 552 );
521 553 } else if (dProductQty !== newDProductQty) {
522 554 setDProductQty(newDProductQty);
... ... @@ -533,7 +565,9 @@ const Typesetting = props =&gt; {
533 565 slaveDataDetail.dWlcd,
534 566 slaveDataDetail.dWlkd,
535 567 innerWidth,
536   - innerHeight
  568 + innerHeight,
  569 + dHorizontalType,
  570 + dPortraitType
537 571 );
538 572 }
539 573 openEdition = (((newMaterialLength * newMaterialWidth) / (maxWidth * maxHeight)) * 100).toFixed(2);
... ... @@ -550,8 +584,9 @@ const Typesetting = props =&gt; {
550 584 }
551 585 const isMax = slaveDataDetail?.dMaxLength && Number(slaveDataDetail?.dMaxLength) >= Number(slaveRowData?.dMachineLength);
552 586 const isShow = slaveRowData && slaveRowData.dMachineLength && slaveRowData.dMaxWidth && slaveRowData.dMaxLength && isMax && innerDivs.length;
553   -
  587 +
554 588 const onClick = () => {
  589 + if (isMobile) return;
555 590 setIsModalOpen(true);
556 591 // setBoxKeys(new Date().getTime());
557 592 setTimeout(() => {
... ...
src/components/QuickQuote/index.jsx
... ... @@ -1525,7 +1525,8 @@ const BoxComponent = props =&gt; {
1525 1525  
1526 1526 // 使用 useCallback 确保回调函数的稳定性
1527 1527 const handleSaveState = useCallback(
1528   - (length, width, slaveData, masterData, dSinglePQty, dMaterialsKQty, dProductQty, scale, dWlcd, dWlkd, innerWidth, innerHeight) => {
  1528 + (length, width, slaveData, masterData, dSinglePQty, dMaterialsKQty, dProductQty, scale, dWlcd, dWlkd, innerWidth, innerHeight,dHorizontal,dPortrait) => {
  1529 + console.log("🚀 ~ dPortrait:",dHorizontal,dPortrait)
1529 1530 // 查找符合条件的索引
1530 1531 const { selectedNode } = props.state;
1531 1532  
... ... @@ -1564,6 +1565,10 @@ const BoxComponent = props =&gt; {
1564 1565 scale: scale,
1565 1566 dPartsLength: innerWidth,
1566 1567 dPartsWidth: innerHeight,
  1568 + dHorizontal:dHorizontal,
  1569 + dPortrait:dPortrait,
  1570 + dHorizontalType:dHorizontal,
  1571 + dPortraitType:dPortrait,
1567 1572 };
1568 1573 // 更新状态
1569 1574 props.setState(prevState => ({
... ... @@ -1707,6 +1712,7 @@ const BoxComponent = props =&gt; {
1707 1712 dSvgBoxHeight: 300,
1708 1713 showNew: 1,
1709 1714 };
  1715 + const isShowImg = boxList.find(x=>x.sName === '盒身')?.type !== '' || false
1710 1716 return (
1711 1717 <Tabs
1712 1718 key={boxModel}
... ... @@ -1773,7 +1779,7 @@ const BoxComponent = props =&gt; {
1773 1779 <div className={styles.boxPart1Right}>
1774 1780 <div className={styles.boxRreview}>
1775 1781 <Image.PreviewGroup>
1776   - {slaveRowData.sPackDetailPathUpLoad ? (
  1782 + {!isShowImg ? (
1777 1783 <Image width={300} src={slaveRowData.sPackDetailPathUpLoad} />
1778 1784 ) : svgProps.boxList.length ? (
1779 1785 <div style={{ width: " 300px", height: "300px" }}>
... ...
src/mobile/components/SelectInput.jsx
... ... @@ -59,9 +59,9 @@ const SelectInput = props =&gt; {
59 59 const handleConfirm = () => {
60 60 if (!values[0]) {
61 61 setVisible(false);
62   -
63 62 return;
64 63 }
  64 + // 判断是否是
65 65 const index = columns.findIndex(item => item.value === values[0]);
66 66 const data = coplyColumns[index];
67 67 data[itemDetail.sName] = data[itemDetail.sName] ? data[itemDetail.sName] : data.label || data.sName || data.sProcessName || data.sColorName;
... ...
src/mobile/quotation/detailNew.jsx
1 1 import { useRef, useEffect, useState, useCallback, useMemo } from "react";
2 2 import { history } from "umi";
3   -import { Toast, Input, Tabs, Selector, Grid, Image, Button, Checkbox, Switch, Dialog, Radio } from "antd-mobile";
4   -import { AddOutline, MinusOutline, EditFill } from "antd-mobile-icons";
  3 +import { Toast, Input, Tabs, Selector, Grid, Image, Button, Checkbox, Switch, Dialog, Radio, Space } from "antd-mobile";
  4 +import { AddOutline, MinusOutline, EditFill, CloseOutline } from "antd-mobile-icons";
5 5 import commonConfig from "@/utils/config";
6 6 import * as commonServices from "@/services/services";
7 7 import * as commonFunc from "@/components/Common/commonFunc";
... ... @@ -286,6 +286,14 @@ const QuickQuoteEvent = props =&gt; {
286 286 dMachineLength: slaveData[saveIndex].dWlcd,
287 287 };
288 288 }
  289 +
  290 + if (sFieldName === "dMaxLength") {
  291 + slaveData[saveIndex] = {
  292 + ...slaveData[saveIndex],
  293 + dMaxLength: changeValue.dMachineLength,
  294 + dMaxWidth: changeValue.dMachineWidth,
  295 + };
  296 + }
289 297 setState(pre => ({ ...pre, slaveData, ...extraState }));
290 298 } else if (name === "finished") {
291 299 const { productProcessInfo = [] } = masterData;
... ... @@ -939,7 +947,6 @@ const QuickQuoteEvent = props =&gt; {
939 947 };
940 948 // 入口
941 949 const QuotationAllprogressDetail = baseProps => {
942   - // const masterProps = getProps(baseProps);
943 950 const props = QuickQuoteEvent(baseProps);
944 951 const { selectedNode, slaveConfig, quotationData, app, sModelsId, masterData } = props;
945 952 const { showName, sUnit } = quotationData;
... ... @@ -1019,7 +1026,6 @@ const QuotationAllprogressDetail = baseProps =&gt; {
1019 1026 // 取上机尺寸
1020 1027 return commonUtils.convertStrToObj(sColumnNameConfigStr, []);
1021 1028 };
1022   -
1023 1029 return (
1024 1030 <div className={styles.quotationDetailBox}>
1025 1031 <QuotationDetail {...props} />
... ... @@ -1179,7 +1185,7 @@ const QuotationTabs = props =&gt; {
1179 1185 };
1180 1186 return (
1181 1187 <div>
1182   - <div>
  1188 + <div className={styles.tabsBox}>
1183 1189 <Tabs
1184 1190 activeKey={activeKey}
1185 1191 onChange={key => {
... ... @@ -1188,12 +1194,23 @@ const QuotationTabs = props =&gt; {
1188 1194 >
1189 1195 {sAllPartsNameList && sAllPartsNameList.length
1190 1196 ? sAllPartsNameList.map((pane, index) => (
1191   - <Tabs.Tab key={pane} title={pane}>
  1197 + <Tabs.Tab key={pane} title={pane} style={{ position: "relative" }}>
1192 1198 <BoxComponent {...tabsProps} paneKey={pane} />
  1199 + {/* <CloseOutline className={styles.tabClearBtn}/> */}
1193 1200 </Tabs.Tab>
1194 1201 ))
1195 1202 : ""}
1196 1203 </Tabs>
  1204 + {/* <Button
  1205 + className={styles.tabAddBtn}
  1206 + color="primary"
  1207 + fill="solid"
  1208 + size="small"
  1209 + style={{ width: "1.93rem", height: "1.93rem", display: "flex", justifyContent: "center", alignItems: "center", textAlign: "center" }}
  1210 + onClick={() => {}}
  1211 + >
  1212 + <AddOutline />
  1213 + </Button> */}
1197 1214 </div>
1198 1215 </div>
1199 1216 );
... ... @@ -1423,6 +1440,7 @@ const BoxComponent = props =&gt; {
1423 1440 useEffect(() => {
1424 1441 if (!sBackProcessData) return;
1425 1442 const newSwitchStates = downAbleConfigsNew;
  1443 + console.log("🚀 ~ switchStates:", switchStates)
1426 1444  
1427 1445 setSwitchStates(newSwitchStates);
1428 1446 }, [downAbleConfigsNew, boxModel]); // 依赖数组
... ... @@ -1469,7 +1487,8 @@ const BoxComponent = props =&gt; {
1469 1487 tableName: "finished",
1470 1488 };
1471 1489 const calcMethodData = commonUtils.convertStrToObj(slaveRowData?.sColumnNameConfigExclusion, []);
1472   - const radioValue = calcMethodData[0]?.sCode;
  1490 + // const radioValue = null;
  1491 + const { radioValue = calcMethodData[0]?.sCode } = slaveRowData
1473 1492 const [materialLength, setMaterialLength] = useState(0);
1474 1493 const [materialWidth, setMaterialWidth] = useState(0);
1475 1494 // 使用 useCallback 确保回调函数的稳定性
... ... @@ -1563,6 +1582,7 @@ const BoxComponent = props =&gt; {
1563 1582 boxWidth: 190,
1564 1583 boxHeight: 150,
1565 1584 textSize: 9,
  1585 + isMobile: true,
1566 1586 // boxPicData,
1567 1587 };
1568 1588 const showImgMProps = {
... ... @@ -1664,7 +1684,10 @@ const BoxComponent = props =&gt; {
1664 1684 );
1665 1685 };
1666 1686 const { loading } = props;
1667   -
  1687 + const calcMethod = calcMethodData.map(item => ({
  1688 + value: item.sCode,
  1689 + label: item.showName,
  1690 + }));
1668 1691 return (
1669 1692 <div>
1670 1693 <Selector
... ... @@ -1725,7 +1748,14 @@ const BoxComponent = props =&gt; {
1725 1748 <Grid.Item>
1726 1749 <div className={styles.customer} key={x.id || x.showName}>
1727 1750 <div>{x.showName}</div>
1728   - <SelectInput {...upViewProps20} itemDetail={x} bCanInput={true} />
  1751 + <SelectInput
  1752 + {...upViewProps20}
  1753 + itemDetail={x}
  1754 + bCanInput={() => {
  1755 + // if (x.showDropDown) return false;
  1756 + return true;
  1757 + }}
  1758 + />
1729 1759 </div>
1730 1760 </Grid.Item>
1731 1761 ))
... ... @@ -1740,6 +1770,22 @@ const BoxComponent = props =&gt; {
1740 1770 <ShowImgM {...showImgMProps} />
1741 1771 </div>
1742 1772 </div>
  1773 + <Radio.Group
  1774 + value={radioValue}
  1775 + onChange={e => {
  1776 + const iIndex = slaveData.findIndex(item => item.sId === slaveRowData.sId);
  1777 + console.log("🚀 ~ iIndex:", iIndex)
  1778 + slaveData[iIndex].radioValue = e;
  1779 + props.setState(pre => ({
  1780 + ...pre,
  1781 + slaveData: slaveData,
  1782 + }));
  1783 + }}
  1784 + >
  1785 + {calcMethod.map(item => (
  1786 + <Radio value={item.value} style={{marginRight:'0.5rem'}}> {item.label}</Radio>
  1787 + ))}
  1788 + </Radio.Group>
1743 1789 <div>
1744 1790 <MaterialsComponent {...props} slaveRowData={slaveRowData} boxModel={boxModel} />
1745 1791 </div>
... ...
src/mobile/quotation/quotationDetail.css
... ... @@ -126,3 +126,17 @@
126 126 margin-top: 1rem;
127 127 background-color: #dededf;
128 128 }
  129 +.tabsBox {
  130 + position: relative;
  131 + width: 100%;
  132 +}
  133 +.tabsBox .tabAddBtn {
  134 + position: absolute;
  135 + right: 0;
  136 + top: 0.75rem;
  137 +}
  138 +.tabsBox .tabClearBtn {
  139 + position: absolute;
  140 + right: 0;
  141 + top: 0;
  142 +}
... ...
src/mobile/quotation/quotationDetail.less
... ... @@ -115,23 +115,37 @@
115 115 width: 3.5rem;
116 116 }
117 117 }
118   -.projectBtn{
  118 +.projectBtn {
119 119 display: flex;
120 120 align-items: center;
121 121 justify-content: space-between;
122 122 }
123   -.boxTitle{
  123 +.boxTitle {
124 124 font-size: 1.5rem;
125 125 font-weight: 700;
126 126 margin-bottom: 2rem;
127 127 margin-top: 1rem;
128 128 }
129   -.quotationBody{
  129 +.quotationBody {
130 130 font-size: 1.25rem;
131   - .line{
  131 + .line {
132 132 width: 100%;
133 133 height: 1px;
134 134 margin-top: 1rem;
135 135 background-color: #dededf;
136 136 }
137   -}
138 137 \ No newline at end of file
  138 +}
  139 +.tabsBox {
  140 + position: relative;
  141 + width: 100%;
  142 + .tabAddBtn {
  143 + position: absolute;
  144 + right: 0;
  145 + top: .75rem;
  146 + }
  147 + .tabClearBtn{
  148 + position: absolute;
  149 + right: 0;
  150 + top: 0;
  151 + }
  152 +}
... ...