From a60527a14ffef72b6b030f8ad76d508ec9e8a63c Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 11 Nov 2024 11:16:17 +0900 Subject: [PATCH 001/200] =?UTF-8?q?=EB=B0=B0=EC=B9=98=EB=A9=B4=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20contextmenu=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useContextMenu.js | 52 ------------------------------------- 1 file changed, 52 deletions(-) diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 32f56fd9..d7d45a74 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -165,58 +165,6 @@ export function useContextMenu() { ], ]) break - case MENU.BATCH_CANVAS.SLOPE_SETTING: - case MENU.BATCH_CANVAS.BATCH_DRAWING: - case MENU.BATCH_CANVAS.SURFACE_SHAPE_BATCH: - case MENU.BATCH_CANVAS.OBJECT_BATCH: - case MENU.BATCH_CANVAS.ALL_REMOVE: - case MENU.BATCH_CANVAS.DEFAULT: - setContextMenu([ - [ - { - id: 'sizeEdit', - name: getMessage('contextmenu.size.edit'), - component: , - }, - { - id: 'remove', - shortcut: ['d', 'D'], - name: `${getMessage('contextmenu.remove')}(D)`, - }, - { - id: 'move', - shortcut: ['m', 'M'], - name: `${getMessage('contextmenu.move')}(M)`, - }, - { - id: 'copy', - shortcut: ['c', 'C'], - name: `${getMessage('contextmenu.copy')}(C)`, - }, - { - id: 'imageSizeEdit', - name: getMessage('modal.image.size.setting'), - component: , - }, - ], - [ - { - id: 'roofMaterialEdit', - name: getMessage('contextmenu.roof.material.edit'), - }, - { - id: 'linePropertyEdit', - name: getMessage('contextmenu.line.property.edit'), - component: , - }, - { - id: 'flowDirectionEdit', - name: getMessage('contextmenu.flow.direction.edit'), - component: , - }, - ], - ]) - break default: setContextMenu([]) break From d985b587cf033c7ce85f0ed57f3d96868f775b4d Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Mon, 11 Nov 2024 15:37:10 +0900 Subject: [PATCH 002/200] =?UTF-8?q?=EB=B0=B0=EC=B9=98=EB=A9=B4=20=EB=B0=A9?= =?UTF-8?q?=ED=96=A5=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/common.js | 1 + src/components/fabric/QPolygon.js | 6 +- .../flowDirection/FlowDirectionSetting.jsx | 102 ++++++++++-------- src/hooks/popup/useFlowDirectionSetting.js | 30 ++++++ src/hooks/surface/useSurfaceShapeBatch.js | 9 -- 5 files changed, 93 insertions(+), 55 deletions(-) create mode 100644 src/hooks/popup/useFlowDirectionSetting.js diff --git a/src/common/common.js b/src/common/common.js index eb86bb89..8282f2f8 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -162,6 +162,7 @@ export const SAVE_KEY = [ 'planeSize', 'actualSize', 'surfaceId', + 'arrow', ] export const OBJECT_PROTOTYPE = [fabric.Line.prototype, fabric.Polygon.prototype, fabric.Triangle.prototype] diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index a248412e..0663c6f5 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -139,7 +139,7 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { this.on('removed', () => { // const children = getAllRelatedObjects(this.id, this.canvas) - const children = this.canvas.getObjects().filter((obj) => obj.parentId === this.id && obj.name === 'lengthText') + const children = this.canvas.getObjects().filter((obj) => obj.parentId === this.id) children.forEach((child) => { this.canvas.remove(child) }) @@ -167,6 +167,10 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { }, initLines() { + if (this.lines.length > 0) { + return + } + this.lines = [] this.points.forEach((point, i) => { diff --git a/src/components/floor-plan/modal/flowDirection/FlowDirectionSetting.jsx b/src/components/floor-plan/modal/flowDirection/FlowDirectionSetting.jsx index effb4717..a0573dd1 100644 --- a/src/components/floor-plan/modal/flowDirection/FlowDirectionSetting.jsx +++ b/src/components/floor-plan/modal/flowDirection/FlowDirectionSetting.jsx @@ -6,17 +6,27 @@ import { contextPopupPositionState } from '@/store/popupAtom' import { useMessage } from '@/hooks/useMessage' import { usePopup } from '@/hooks/usePopup' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' +import { FLOW_DIRECTION_TYPE, useFlowDirectionSetting } from '@/hooks/popup/useFlowDirectionSetting' +import { canvasState } from '@/store/canvasAtom' export default function FlowDirectionSetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) const { id, pos = contextPopupPosition, target } = props + const canvas = useRecoilValue(canvasState) const { getMessage } = useMessage() - const { closePopup } = usePopup() - const [compasDeg, setCompasDeg] = useState(360) + + useEffect(() => { + return () => { + canvas?.discardActiveObject() + } + }, []) + + const [compasDeg, setCompasDeg] = useState(null) const [flowDirection, setFlowDirection] = useState(target.direction) - const { changeSurfaceFlowDirection } = useSurfaceShapeBatch() + const { closePopup } = usePopup() + const { changeSurfaceFlowDirection, type, setType } = useFlowDirectionSetting(id) const orientations = [ - // { name: `${getMessage('commons.none')}`, value: 0 }, + { name: `${getMessage('commons.none')}`, value: 0 }, { name: `${getMessage('commons.south')}`, value: 360 }, { name: `${getMessage('commons.south')}${getMessage('commons.east')}`, value: 315 }, { name: `${getMessage('commons.south')}${getMessage('commons.west')}`, value: 45 }, @@ -27,41 +37,7 @@ export default function FlowDirectionSetting(props) { { name: `${getMessage('commons.north')}`, value: 180 }, ] const [selectedOrientation, setSelectedOrientation] = useState(orientations[0]) - const [type, setType] = useState('0') - useEffect(() => { - if (target?.angle === 0) { - setCompasDeg(360) - } else { - setCompasDeg(target?.angle ?? 360) - } - }, []) - useEffect(() => { - if (type === '0') { - setCompasDeg(selectedOrientation.value) - } - }, [selectedOrientation]) - useEffect(() => { - if (type === '1') { - if ([15, 345, 360].includes(compasDeg)) { - setSelectedOrientation(orientations[0]) - } else if ([30, 45, 60].includes(compasDeg)) { - setSelectedOrientation(orientations[2]) - } else if ([75, 90, 105].includes(compasDeg)) { - setSelectedOrientation(orientations[4]) - } else if ([120, 135, 150].includes(compasDeg)) { - setSelectedOrientation(orientations[6]) - } else if ([165, 180, 195].includes(compasDeg)) { - setSelectedOrientation(orientations[7]) - } else if ([210, 225, 240].includes(compasDeg)) { - setSelectedOrientation(orientations[5]) - } else if ([255, 270, 285].includes(compasDeg)) { - setSelectedOrientation(orientations[3]) - } else if ([300, 315, 330].includes(compasDeg)) { - setSelectedOrientation(orientations[1]) - } - } - }, [compasDeg]) return (
@@ -94,16 +70,43 @@ export default function FlowDirectionSetting(props) {
{getMessage('modal.shape.flow.direction.setting.orientation.setting.info')}
- setType(e.target.value)} /> + { + setCompasDeg(0) + setType(FLOW_DIRECTION_TYPE.EIGHT_AZIMUTH) + }} + />
- setSelectedOrientation(e)} /> + { + setType(FLOW_DIRECTION_TYPE.EIGHT_AZIMUTH) + setSelectedOrientation(e) + setCompasDeg(e.value) + }} + />
- setType(e.target.value)} /> + { + setType(FLOW_DIRECTION_TYPE.TWENTY_FOUR_AZIMUTH) + }} + />
@@ -114,18 +117,27 @@ export default function FlowDirectionSetting(props) {
setCompasDeg(15 * (12 + index))} + onClick={() => { + setType(FLOW_DIRECTION_TYPE.TWENTY_FOUR_AZIMUTH) + setCompasDeg(15 * (12 + index)) + }} >
))} {Array.from({ length: 180 / 15 - 1 }).map((dot, index) => (
setCompasDeg(15 * (index + 1))} + onClick={() => { + setType(FLOW_DIRECTION_TYPE.TWENTY_FOUR_AZIMUTH) + setCompasDeg(15 * (index + 1)) + }} >
))}
-
+
@@ -133,7 +145,7 @@ export default function FlowDirectionSetting(props) {
-
diff --git a/src/hooks/popup/useFlowDirectionSetting.js b/src/hooks/popup/useFlowDirectionSetting.js new file mode 100644 index 00000000..9611d807 --- /dev/null +++ b/src/hooks/popup/useFlowDirectionSetting.js @@ -0,0 +1,30 @@ +import { canvasState } from '@/store/canvasAtom' +import { useRecoilValue } from 'recoil' +import { usePolygon } from '@/hooks/usePolygon' +import { useState } from 'react' +import { usePopup } from '@/hooks/usePopup' + +export const FLOW_DIRECTION_TYPE = { + EIGHT_AZIMUTH: 'eightAzimuth', + TWENTY_FOUR_AZIMUTH: 'twentyFourAzimuth', +} + +export function useFlowDirectionSetting(id) { + const canvas = useRecoilValue(canvasState) + const { drawDirectionArrow } = usePolygon() + const { closePopup } = usePopup() + + const [type, setType] = useState(FLOW_DIRECTION_TYPE.EIGHT_AZIMUTH) + + const changeSurfaceFlowDirection = (roof, direction, orientation) => { + roof.set({ + direction: direction, + surfaceCompass: orientation, + }) + // drawDirectionArrow(roof) + canvas?.renderAll() + closePopup(id) + } + + return { changeSurfaceFlowDirection, type, setType } +} diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index 67ee1874..189fb4df 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -965,21 +965,12 @@ export function useSurfaceShapeBatch() { } } - const changeSurfaceFlowDirection = (roof, direction, orientation) => { - roof.set({ - direction: direction, - }) - drawDirectionArrow(roof) - canvas?.renderAll() - } - return { applySurfaceShape, deleteAllSurfacesAndObjects, moveSurfaceShapeBatch, resizeSurfaceShapeBatch, surfaceShapeActualSize, - changeSurfaceFlowDirection, changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, } From ed67cbd614d41d5da7cdf132253423b70ae72631 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 11 Nov 2024 15:51:07 +0900 Subject: [PATCH 003/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSearchCondition.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 59a4d23c..7828d873 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -267,7 +267,7 @@ export default function StuffSearchCondition() { const onInputChange = (key) => { if (key !== '') { setShowSaleStoreList(schSelSaleStoreList) - setOtherSaleStoreList([]) + // setOtherSaleStoreList([]) } else { setShowSaleStoreList(favoriteStoreList) } @@ -500,7 +500,9 @@ export default function StuffSearchCondition() { } else if (stuffSearch?.code === 'E' && schSelSaleStoreId !== '') { return option.saleStoreId === schSelSaleStoreId } else { - if (stuffSearch?.schSelSaleStoreId !== '') { + if (stuffSearch?.code === 'FINISH') { + return option.saleStoreId === schSelSaleStoreId + } else if (stuffSearch?.schSelSaleStoreId !== '') { return option.saleStoreId === stuffSearch.schSelSaleStoreId } else { return false From 8ed58b1618ef46f5685892963c34608178961d49 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Mon, 11 Nov 2024 16:31:45 +0900 Subject: [PATCH 004/200] =?UTF-8?q?=EB=9D=BC=EC=9D=B8=EC=86=8D=EC=84=B1=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/common.js | 33 +++-- src/components/auth/Login.jsx | 4 +- src/components/fabric/QPolygon.js | 1 + .../lineProperty/LinePropertySetting.jsx | 46 +++---- src/hooks/common/useCommonUtils.js | 2 +- src/hooks/surface/useSurfaceShapeBatch.js | 113 +++++++++++------- src/hooks/useCanvas.js | 11 ++ src/hooks/useContextMenu.js | 60 +++++++++- 8 files changed, 181 insertions(+), 89 deletions(-) diff --git a/src/common/common.js b/src/common/common.js index 8282f2f8..358852b5 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -61,6 +61,8 @@ export const LINE_TYPE = { DEFAULT: 'default', EAVES: 'eaves', GABLE: 'gable', + GABLE_LEFT: 'gableLeft', //케라바 왼쪽 + GABLE_RIGHT: 'gableRight', //케라바 오른쪽 WALL: 'wall', HIPANDGABLE: 'hipAndGable', JERKINHEAD: 'jerkinhead', @@ -76,28 +78,19 @@ export const LINE_TYPE = { GABLE: 'gable', VALLEY: 'valley', VERGE: 'verge', + ONESIDE_FLOW_RIDGE: 'onesideFlowRidge', //한쪽흐름 용마루 + YOSEMUNE: 'yosemune', //요세무네 + VALLEY: 'valley', //골짜기 + L_ABANDON_VALLEY: 'lAbandonValley', //l의버림계곡 + MANSARD: 'mansard', //맨사드 + WALL_COLLECTION: 'wallCollection', //벽취합 + WALL_COLLECTION_TYPE: 'wallCollectionType', //벽취합(형) + WALL_COLLECTION_FLOW: 'wallCollectionFlow', //벽취합(흐름) + WALL_COLLECTION_FLOW_LEFT: 'wallCollectionFlowLeft', //벽취합(흐름 왼쪽) + WALL_COLLECTION_FLOW_RIGHT: 'wallCollectionFlowRight', //벽취합(흐름 오른쪽) }, } -export const LineType = { - EAVES: 'eaves', // 처마 - RIDGE: 'ridge', // 용마루.... - YOSEMUNE: 'yosemune', //요세무네 - ONESIDE_FLOW_RIDGE: 'onesideFlowRidge', //한쪽흐름 용마루 - WALL_COLLECTION: 'wallCollection', //벽취합 - WALL_COLLECTION_TYPE: 'wallCollectionType', //벽취합(형) - WALL_COLLECTION_FLOW: 'wallCollectionFlow', //벽취합(흐름) - WALL_COLLECTION_FLOW_LEFT: 'wallCollectionFlowLeft', //벽취합(흐름 왼쪽) - WALL_COLLECTION_FLOW_RIGHT: 'wallCollectionFlowRight', //벽취합(흐름 오른쪽) - KERABA: 'keraba', //케라바 - KERABA_LEFT: 'kerabaLeft', //케라바 왼쪽 - KERABA_RIGHT: 'kerabaRight', //케라바 오른쪽 - VALLEY: 'valley', //골짜기 - L_ABANDON_VALLEY: 'lAbandonValley', //l의버림계곡 - MANSARD: 'mansard', //맨사드 - NO_SETTING: 'noSetting', //설정없음 -} - // 오브젝트 배치 > 개구배치, 그림자배치 export const BATCH_TYPE = { OPENING: 'opening', @@ -162,6 +155,8 @@ export const SAVE_KEY = [ 'planeSize', 'actualSize', 'surfaceId', + 'lines', + 'offset', 'arrow', ] diff --git a/src/components/auth/Login.jsx b/src/components/auth/Login.jsx index 283d7d99..5418dec7 100644 --- a/src/components/auth/Login.jsx +++ b/src/components/auth/Login.jsx @@ -83,7 +83,7 @@ export default function Login() { /////////////////////////////////////////////////////////// // 임시 로그인 처리 setSession({ - userId: 'NEW016610', + userId: 'NEW0166102', saleStoreId: null, name: null, mail: null, @@ -101,7 +101,7 @@ export default function Login() { custCd: '100000', }) setSessionState({ - userId: 'NEW016610', + userId: 'NEW0166102', saleStoreId: null, name: null, mail: null, diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index 0663c6f5..ce4d93c7 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -191,6 +191,7 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { line.endPoint = nextPoint this.lines.push(line) }) + // } }, // 보조선 그리기 diff --git a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx index 5b4075f0..ed84751c 100644 --- a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx +++ b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx @@ -6,48 +6,54 @@ import { usePopup } from '@/hooks/usePopup' import { useState, useEffect } from 'react' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' import { useEvent } from '@/hooks/useEvent' +import { LINE_TYPE } from '@/common/common' export default function LinePropertySetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) const { id, pos = contextPopupPosition, target } = props const { getMessage } = useMessage() const { closePopup } = usePopup() - const { changeSurfaceLinePropertyEvent, changeSurfaceLineProperty } = useSurfaceShapeBatch() + const { changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, changeSurfaceLinePropertyReset } = useSurfaceShapeBatch() const { initEvent } = useEvent() const properties = [ - { name: getMessage('eaves.line'), value: 'eaves' }, - { name: getMessage('ridge'), value: 'ridge' }, - { name: getMessage('oneside.flow.ridge'), value: 'onesideFlowRidge' }, - { name: getMessage('gable'), value: 'gable' }, - { name: getMessage('gable.left'), value: 'gableLeft' }, - { name: getMessage('gable.right'), value: 'gableRight' }, - { name: getMessage('yosemune'), value: 'yosemune' }, - { name: getMessage('valley'), value: 'valley' }, - { name: getMessage('l.abandon.valley'), value: 'lAbandonValley' }, - { name: getMessage('mansard'), value: 'mansard' }, - { name: getMessage('wall.merge'), value: 'wallCollection' }, - { name: getMessage('wall.merge.type'), value: 'wallCollectionType' }, - { name: getMessage('wall.merge.flow'), value: 'wallCollectionFlow' }, - { name: getMessage('wall.merge.flow.left'), value: 'wallCollectionFlowLeft' }, - { name: getMessage('wall.merge.flow.right'), value: 'wallCollectionFlowRight' }, - { name: getMessage('no.setting'), value: 'noSetting' }, + { name: getMessage('eaves.line'), value: LINE_TYPE.WALLLINE.EAVES }, + { name: getMessage('ridge'), value: LINE_TYPE.SUBLINE.RIDGE }, + { name: getMessage('oneside.flow.ridge'), value: LINE_TYPE.SUBLINE.ONESIDE_FLOW_RIDGE }, + { name: getMessage('gable'), value: LINE_TYPE.WALLLINE.GABLE }, + { name: getMessage('gable.left'), value: LINE_TYPE.WALLLINE.GABLE_LEFT }, + { name: getMessage('gable.right'), value: LINE_TYPE.WALLLINE.GABLE_RIGHT }, + { name: getMessage('yosemune'), value: LINE_TYPE.SUBLINE.YOSEMUNE }, + { name: getMessage('valley'), value: LINE_TYPE.SUBLINE.YOSEMUNE }, + { name: getMessage('l.abandon.valley'), value: LINE_TYPE.SUBLINE.L_ABANDON_VALLEY }, + { name: getMessage('mansard'), value: LINE_TYPE.SUBLINE.MANSARD }, + { name: getMessage('wall.merge'), value: LINE_TYPE.SUBLINE.WALL_COLLECTION }, + { name: getMessage('wall.merge.type'), value: LINE_TYPE.SUBLINE.WALL_COLLECTION_TYPE }, + { name: getMessage('wall.merge.flow'), value: LINE_TYPE.SUBLINE.WALL_COLLECTION_FLOW }, + { name: getMessage('wall.merge.flow.left'), value: LINE_TYPE.SUBLINE.WALL_COLLECTION_FLOW_LEFT }, + { name: getMessage('wall.merge.flow.right'), value: LINE_TYPE.SUBLINE.WALL_COLLECTION_FLOW_RIGHT }, + { name: getMessage('no.setting'), value: LINE_TYPE.WALLLINE.DEFAULT }, ] const [selectedProperty, setSelectedProperty] = useState(null) useEffect(() => { - changeSurfaceLinePropertyEvent(target) + changeSurfaceLinePropertyEvent() return () => { initEvent() } }, []) + const handleClosePopup = () => { + closePopup(id) + changeSurfaceLinePropertyReset(target) + } + return (

{getMessage('contextmenu.line.property.edit')}

-
@@ -79,7 +85,7 @@ export default function LinePropertySetting(props) {
-
diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 2902e0c3..1a0fa519 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -710,7 +710,7 @@ export function useCommonUtils() { canvas?.remove(centerLine, ...extendLine, ...arrows, textObj) const reGroup = new fabric.Group(reGroupObj, { - name: 'dimensionLine', + name: 'dimensionGroup', selectable: true, lineDirection: originLineDirection, groupId: id, diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index 189fb4df..2328b606 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -894,70 +894,75 @@ export function useSurfaceShapeBatch() { }) } - const changeSurfaceLinePropertyEvent = (roof) => { + const changeSurfaceLinePropertyEvent = () => { let tmpLines = [] - roof.set({ - selectable: false, - }) - canvas.discardActiveObject() - roof.lines.forEach((obj, index) => { - const tmpLine = new QLine([obj.x1, obj.y1, obj.x2, obj.y2], { - ...obj, - stroke: 'rgb(3, 255, 0)', - strokeWidth: 8, - selectable: true, - name: 'lineProperty', - index: index, + const roof = canvas.getActiveObject() + + if (roof) { + roof.set({ + selectable: false, }) - tmpLines.push(tmpLine) - canvas.add(tmpLine) - }) - - addCanvasMouseEventListener('mouse:down', (e) => { - const selectedLine = e.target - if (selectedLine) { - selectedLine.set({ - stroke: 'red', - name: 'selectedLineProperty', + roof.lines.forEach((obj, index) => { + const tmpLine = new QLine([obj.x1, obj.y1, obj.x2, obj.y2], { + ...obj, + stroke: 'rgb(3, 255, 0)', + strokeWidth: 8, + selectable: true, + name: 'lineProperty', + lineIndex: index, }) - tmpLines.forEach((line) => { - if (line.index !== selectedLine.index) { + + tmpLines.push(tmpLine) + canvas.add(tmpLine) + }) + + addCanvasMouseEventListener('mouse:down', (e) => { + const selectedLine = e.target + if (selectedLine && selectedLine.name !== 'roof') { + tmpLines.forEach((line) => { line.set({ stroke: 'rgb(3, 255, 0)', name: 'lineProperty', }) - } - }) - } else { - tmpLines.forEach((line) => { - line.set({ - stroke: 'rgb(3, 255, 0)', - name: 'lineProperty', }) - }) - } - }) + selectedLine.set({ + stroke: 'red', + name: 'selectedLineProperty', + }) + } else { + tmpLines.forEach((line) => { + line.set({ + stroke: 'rgb(3, 255, 0)', + name: 'lineProperty', + }) + }) + } + }) - canvas.renderAll() + canvas.renderAll() + } + canvas.discardActiveObject() } - const changeSurfaceLineProperty = (property) => { - console.log(property) + const changeSurfaceLineProperty = (property, roof) => { if (!property) { swalFire({ text: getMessage('modal.line.property.change'), icon: 'error' }) return } - const selectedLine = canvas.getActiveObjects() - if (selectedLine && selectedLine[0].name === 'selectedLineProperty') { + const selectedLine = canvas.getActiveObjects()[0] //배열로 떨어짐 한개만 선택가능 + if (selectedLine && selectedLine.name === 'selectedLineProperty') { swalFire({ text: getMessage('modal.line.property.change.confirm'), type: 'confirm', confirmFn: () => { - selectedLine.set({ + const lineIndex = selectedLine.lineIndex + roof.lines[lineIndex].attributes = { + ...roof.lines[lineIndex].attributes, type: property.value, - }) + } + canvas.renderAll() }, }) } else { @@ -965,6 +970,29 @@ export function useSurfaceShapeBatch() { } } + const changeSurfaceLinePropertyReset = (roof) => { + const lines = canvas.getObjects().filter((obj) => obj.name === 'lineProperty' || obj.name === 'selectedLineProperty') + + lines.forEach((line) => { + canvas.remove(line) + }) + + if (roof) { + roof.set({ + selectable: true, + }) + } + canvas?.renderAll() + } + + const changeSurfaceFlowDirection = (roof, direction, orientation) => { + roof.set({ + direction: direction, + }) + drawDirectionArrow(roof) + canvas?.renderAll() + } + return { applySurfaceShape, deleteAllSurfacesAndObjects, @@ -973,5 +1001,6 @@ export function useSurfaceShapeBatch() { surfaceShapeActualSize, changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, + changeSurfaceLinePropertyReset, } } diff --git a/src/hooks/useCanvas.js b/src/hooks/useCanvas.js index 6ffb03fc..c1bc760f 100644 --- a/src/hooks/useCanvas.js +++ b/src/hooks/useCanvas.js @@ -109,11 +109,22 @@ export function useCanvas(id) { OBJECT_PROTOTYPE.forEach((type) => { type.toObject = function (propertiesToInclude) { let source = {} + for (let key in this) { if (typeof this[key] !== 'function' && SAVE_KEY.includes(key)) { source.key = this[key] } } + + //QLine에 커스텀 어트리뷰트 넣기 + if (this.type === 'QLine') { + this.attributes.type = this.attributes.type || 'default' + source.attributes = { + ...this.attributes, + type: this.attributes.type, + } + } + return fabric.util.object.extend(this.callSuper('toObject', propertiesToInclude), source) } }) diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index d7edb496..f10f3d39 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -165,6 +165,59 @@ export function useContextMenu() { ], ]) break + case MENU.BATCH_CANVAS.SLOPE_SETTING: + case MENU.BATCH_CANVAS.BATCH_DRAWING: + case MENU.BATCH_CANVAS.SURFACE_SHAPE_BATCH: + case MENU.BATCH_CANVAS.OBJECT_BATCH: + case MENU.BATCH_CANVAS.ALL_REMOVE: + case MENU.BATCH_CANVAS.DEFAULT: + setContextMenu([ + [ + { + id: 'sizeEdit', + name: getMessage('contextmenu.size.edit'), + component: , + }, + { + id: 'remove', + shortcut: ['d', 'D'], + name: `${getMessage('contextmenu.remove')}(D)`, + }, + { + id: 'move', + shortcut: ['m', 'M'], + name: `${getMessage('contextmenu.move')}(M)`, + }, + { + id: 'copy', + shortcut: ['c', 'C'], + name: `${getMessage('contextmenu.copy')}(C)`, + }, + { + id: 'imageSizeEdit', + name: getMessage('modal.image.size.setting'), + component: , + }, + ], + [ + { + id: 'roofMaterialEdit', + name: getMessage('contextmenu.roof.material.edit'), + component: , + }, + { + id: 'linePropertyEdit', + name: getMessage('contextmenu.line.property.edit'), + component: , + }, + { + id: 'flowDirectionEdit', + name: getMessage('contextmenu.flow.direction.edit'), + component: , + }, + ], + ]) + break default: setContextMenu([]) break @@ -207,6 +260,8 @@ export function useContextMenu() { }, [currentContextMenu]) useEffect(() => { + console.log(currentObject) + if (currentObject?.name) { switch (currentObject.name) { case 'triangleDormer': @@ -252,11 +307,6 @@ export function useContextMenu() { case 'roof': setContextMenu([ [ - { - id: 'surfaceShapeActualSize', - name: '면형상 실측', - fn: () => surfaceShapeActualSize(), - }, { id: 'sizeEdit', name: '사이즈 변경', From 0b5356040674dc4ab39a5d161493803164678498 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Mon, 11 Nov 2024 16:39:06 +0900 Subject: [PATCH 005/200] =?UTF-8?q?=EB=B9=A0=EC=A7=84=20=EC=86=8C=EC=8A=A4?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePolygon.js | 72 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index 9b3a8e98..1b1538c9 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -181,7 +181,7 @@ export const usePolygon = () => { polygon.canvas .getObjects() - .filter((obj) => obj.name === 'flowText' && obj.parent === polygon.arrow) + .filter((obj) => obj.name === 'flowText' && obj.parentId === polygon.arrow?.id) .forEach((obj) => polygon.canvas.remove(obj)) let arrow = null @@ -265,6 +265,8 @@ export const usePolygon = () => { direction: direction, parent: polygon, stickeyPoint: stickeyPoint, + surfaceCompass: polygon.surfaceCompass, + moduleCompass: polygon.moduleCompass, visible: isFlowDisplay, pitch: polygon.pitch, parentId: polygon.id, @@ -274,7 +276,73 @@ export const usePolygon = () => { polygon.arrow = arrow polygon.canvas.add(arrow) polygon.canvas.renderAll() - drawDirectionStringToArrow(polygon.canvas, 0) + drawDirectionStringToArrow2(polygon) + // drawDirectionStringToArrow() + } + + //arrow의 compass 값으로 방향 글자 설정 필요 + const drawDirectionStringToArrow2 = (polygon) => { + const { direction, surfaceCompass, moduleCompass, arrow } = polygon + + if (!surfaceCompass && !moduleCompass) { + return + } + + let text = '' + + // 東,西,南,北 + if ([360].includes(surfaceCompass)) { + text = '南' + } else if ([345, 330].includes(surfaceCompass)) { + text = '南南東' + } else if ([315].includes(surfaceCompass)) { + text = '南東' + } else if ([300, 285].includes(surfaceCompass)) { + text = '東南東' + } else if ([270].includes(surfaceCompass)) { + text = '東' + } else if ([255, 240].includes(surfaceCompass)) { + text = '東北東' + } else if ([225].includes(surfaceCompass)) { + text = '北東' + } else if ([210, 195].includes(surfaceCompass)) { + text = '北北東' + } else if ([180].includes(surfaceCompass)) { + text = '北' + } else if ([165, 150].includes(surfaceCompass)) { + text = '北北西' + } else if ([135].includes(surfaceCompass)) { + text = '北西' + } else if ([120, 105].includes(surfaceCompass)) { + text = '西北西' + } else if ([90].includes(surfaceCompass)) { + text = '西' + } else if ([75, 60].includes(surfaceCompass)) { + text = '西南西' + } else if ([45].includes(surfaceCompass)) { + text = '西南' + } else if ([30, 15].includes(surfaceCompass)) { + text = '西西南' + } + + const textObj = new fabric.Text(`${text} (${currentAngleType === ANGLE_TYPE.SLOPE ? arrow.pitch : getDegreeByChon(arrow.pitch)}${pitchText})`, { + fontSize: flowFontOptions.fontSize.value, + fill: flowFontOptions.fontColor.value, + fontFamily: flowFontOptions.fontFamily.value, + fontWeight: flowFontOptions.fontWeight.value, + originX: 'center', + originY: 'center', + name: 'flowText', + originText: text, + selectable: false, + left: arrow.stickeyPoint.x, + top: arrow.stickeyPoint.y, + parent: arrow, + parentId: arrow.id, + visible: isFlowDisplay, + }) + + polygon.canvas.add(textObj) } /** From abb73beee1f24f8f35f57d997d4eaf51e6c1c023 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Mon, 11 Nov 2024 16:44:44 +0900 Subject: [PATCH 006/200] =?UTF-8?q?=EB=B0=B0=EC=B9=98=EB=A9=B4=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/surface/useSurfaceShapeBatch.js | 68 +---------------------- src/hooks/useContextMenu.js | 2 +- 2 files changed, 2 insertions(+), 68 deletions(-) diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index 2328b606..77beb6b1 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -828,72 +828,6 @@ export function useSurfaceShapeBatch() { canvas.renderAll() } - const surfaceShapeActualSize = () => { - const roofs = canvas.getObjects().filter((obj) => obj.name === 'roof') - let notParallelLines = [] - - const roofArray = [] - - roofs.forEach((obj) => { - const roof = { - id: obj.id, - surfaceId: obj.surfaceId, - targetLines: [], - baseLines: [], - direction: obj.direction, - } - obj.lines.forEach((line) => { - if (obj.direction === 'north' || obj.direction === 'south') { - if (line.y1 !== line.y2) { - roof.targetLines.push(line) - } else { - roof.baseLines.push(line) - } - } else { - if (line.x1 !== line.x2) { - roof.targetLines.push(line) - } else { - roof.baseLines.push(line) - } - } - }) - roofArray.push(roof) - }) - - const slopeRadians = slope.angleValue * (Math.PI / 180) - const tanSlope = Math.tan(slopeRadians) - - roofArray.forEach((roof) => { - roof.targetLines.forEach((line) => { - let calcLength = line.length - - if (roof.surfaceId === 1) { - calcLength = roof.direction === 'north' || roof.direction === 'south' ? Math.abs(line.y1 - line.y2) : Math.abs(line.x1 - line.x2) - } - - const h = calcLength * tanSlope - const resultLength = Math.sqrt(Math.pow(calcLength, 2) + Math.pow(h, 2)) - - line.set({ - attributes: { - ...line.attributes, - actualSize: parseInt((Math.floor(resultLength) * 10).toFixed(0)), - planeSize: parseInt(line.length * 10), - }, - }) - }) - roof.baseLines.forEach((line) => { - line.set({ - attributes: { - ...line.attributes, - actualSize: parseInt((Math.floor(line.length) * 10).toFixed(0)), - planeSize: parseInt(line.length * 10), - }, - }) - }) - }) - } - const changeSurfaceLinePropertyEvent = () => { let tmpLines = [] const roof = canvas.getActiveObject() @@ -998,7 +932,7 @@ export function useSurfaceShapeBatch() { deleteAllSurfacesAndObjects, moveSurfaceShapeBatch, resizeSurfaceShapeBatch, - surfaceShapeActualSize, + changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, changeSurfaceLinePropertyReset, diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index f10f3d39..345f1de3 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -51,7 +51,7 @@ export function useContextMenu() { const [column, setColumn] = useState(null) const { handleZoomClear } = useCanvasEvent() const { moveObjectBatch } = useObjectBatch({}) - const { moveSurfaceShapeBatch, surfaceShapeActualSize } = useSurfaceShapeBatch() + const { moveSurfaceShapeBatch } = useSurfaceShapeBatch() const currentMenuSetting = () => { switch (currentMenu) { case MENU.PLAN_DRAWING: From b35c26e6dc15d10ef780a362674bb999f9678bda Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Mon, 11 Nov 2024 17:01:36 +0900 Subject: [PATCH 007/200] =?UTF-8?q?border=20=EC=A0=9C=EA=B1=B0=20=ED=9B=84?= =?UTF-8?q?=20polygon=20=EB=82=B4=EB=B6=80=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=8B=9C=20=ED=95=B4=EB=8B=B9=20polygon=20=EC=84=A0=ED=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/fabric/QPolygon.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index ce4d93c7..aff3f1e0 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -131,10 +131,9 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { this.on('selected', () => { Object.keys(this.controls).forEach((controlKey) => { - if (controlKey !== 'ml' && controlKey !== 'mr') { - this.setControlVisible(controlKey, false) - } + this.setControlVisible(controlKey, false) }) + this.set({ hasBorders: false }) }) this.on('removed', () => { @@ -191,7 +190,12 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { line.endPoint = nextPoint this.lines.push(line) }) - // } + }, + + containsPoint: function (point) { + const isInside = this.inPolygon(point) + this.set('selectable', isInside) + return isInside }, // 보조선 그리기 From 8c34de2c0ea760c603abefb81b25daab7deeef88 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Mon, 11 Nov 2024 17:16:30 +0900 Subject: [PATCH 008/200] =?UTF-8?q?=ED=8C=A8=EB=84=90=20=EB=B0=B0=EC=B9=98?= =?UTF-8?q?=20=EC=A7=91=EA=B3=84=ED=91=9C=20=ED=91=9C=EC=8B=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasFrame.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index 6a48d83b..6e812930 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -13,6 +13,7 @@ import QContextMenu from '@/components/common/context-menu/QContextMenu' import { useCanvasConfigInitialize } from '@/hooks/common/useCanvasConfigInitialize' import { MENU } from '@/common/common' import PanelBatchStatistics from '@/components/floor-plan/modal/panelBatch/PanelBatchStatistics' +import { totalDisplaySelector } from '@/store/settingAtom' export default function CanvasFrame() { const canvasRef = useRef(null) @@ -21,6 +22,7 @@ export default function CanvasFrame() { const currentMenu = useRecoilValue(currentMenuState) const { contextMenu, handleClick } = useContextMenu() const { selectedPlan, modifiedPlanFlag, checkCanvasObjectEvent, resetModifiedPlans, currentCanvasPlan } = usePlan() + const totalDisplay = useRecoilValue(totalDisplaySelector) // 집계표 표시 여부 useEvent() const loadCanvas = () => { @@ -72,7 +74,8 @@ export default function CanvasFrame() { MENU.MODULE_CIRCUIT_SETTING.BASIC_SETTING, MENU.MODULE_CIRCUIT_SETTING.CIRCUIT_TRESTLE_SETTING, MENU.MODULE_CIRCUIT_SETTING.PLAN_ORIENTATION, - ].includes(currentMenu) && } + ].includes(currentMenu) && + totalDisplay && } ) } From 889dba952fe3a675a24c58bbda70d53d1475d441 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 11 Nov 2024 23:23:30 +0900 Subject: [PATCH 009/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 3 +- .../management/StuffSearchCondition.jsx | 69 ++++++++++++++++--- 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index fb7ecd76..4503591b 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -174,7 +174,8 @@ export default function Stuff() { schToDt: dayjs(new Date()).format('YYYY-MM-DD'), startRow: (pageNo - 1) * pageSize + 1, endRow: pageNo * pageSize, - schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : stuffSearchParams.schSelSaleStoreId, + schSelSaleStoreId: stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : '', + schOtherSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : '', schSortType: stuffSearchParams.schSortType, } diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 7828d873..895cd75d 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -80,7 +80,8 @@ export default function StuffSearchCondition() { schAddress: address ? address : '', schObjectName: objectName ? objectName : '', schDispCompanyName: dispCompanyName ? dispCompanyName : '', - schSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : stuffSearch.schSelSaleStoreId, + schSelSaleStoreId: stuffSearch?.schSelSaleStoreId ? stuffSearch.schSelSaleStoreId : '', + schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : '', schReceiveUser: receiveUser ? receiveUser : '', schDateType: dateType, schFromDt: dayjs(startDate).format('YYYY-MM-DD'), @@ -97,7 +98,8 @@ export default function StuffSearchCondition() { schAddress: address, schObjectName: objectName, schDispCompanyName: dispCompanyName, - schSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : stuffSearch.schSelSaleStoreId, + schSelSaleStoreId: stuffSearch?.schSelSaleStoreId, + schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId, schReceiveUser: receiveUser, schDateType: dateType, schFromDt: dayjs(startDate).format('YYYY-MM-DD'), @@ -184,11 +186,31 @@ export default function StuffSearchCondition() { setSchSelSaleStoreList(allList) setFavoriteStoreList(favList) setShowSaleStoreList(favList) - // setSchSelSaleStoreId(session?.storeId) + // if (stuffSearch.code === 'FINISH') { + if (stuffSearch.schSelSaleStoreId != '') { + setSchSelSaleStoreId(stuffSearch.schSelSaleStoreId) + // if (stuffSearch.schOtherSelSaleStoreId != '') { + url = `/api/object/saleStore/${stuffSearch.schSelSaleStoreId}/list?firstFlg=1&userId=${session?.userId}` + get({ url: url }).then((res) => { + if (!isEmptyArray(res)) { + res.map((row) => { + row.value = row.saleStoreId + row.label = row.saleStoreName + }) + + otherList = res.filter((row) => row.saleStoreLevel !== '1') + setOtherSaleStoreList(otherList) + setOtherSaleStoreId(stuffSearch.schOtherSelSaleStoreId) + } else { + setOtherSaleStoreList([]) + } + }) + // } + } + // } setStuffSearch({ ...stuffSearch, code: 'S', - // schSelSaleStoreId: session?.storeId, }) //T01일때 2차 판매점 호출하기 디폴트로 1차점을 본인으로 셋팅해서 세션storeId사용 @@ -224,8 +246,11 @@ export default function StuffSearchCondition() { setStuffSearch({ ...stuffSearch, code: 'S', - schSelSaleStoreId: allList[0].saleStoreId, }) + + if (stuffSearch.schOtherSelSaleStoreId != '') { + setOtherSaleStoreId(stuffSearch.schOtherSelSaleStoreId) + } } else { //10X22, 201X112 그냥2차점 //2차점인데 34들고있는애 202X217 @@ -241,7 +266,8 @@ export default function StuffSearchCondition() { setStuffSearch({ ...stuffSearch, code: 'S', - schSelSaleStoreId: otherList[0].saleStoreId, + schSelSaleStoreId: res[0].saleStoreId, + schOtherSelSaleStoreId: otherList[0].saleStoreId, }) } } @@ -311,12 +337,31 @@ export default function StuffSearchCondition() { if (isObjectNotEmpty(key)) { setOtherSaleStoreId(key.saleStoreId) stuffSearch.schOtherSelSaleStoreId = key.saleStoreId + + //2차점 골랐을때 1차점 값 + stuffSearch.schSelSaleStoreId = schSelSaleStoreId } else { //X누르면 검색조건에 1차점으로 셋팅 - setOtherSaleStoreId('') - setSchSelSaleStoreId(schSelSaleStoreId) - stuffSearch.schOtherSelSaleStoreId = '' - stuffSearch.schSelSaleStoreId = schSelSaleStoreId + if (session.storeLvl === '1') { + if (stuffSearch.schOtherSelSaleStoreId === '') { + stuffSearch.schSelSaleStoreId = '' + setSchSelSaleStoreId(session.storeId) + } else { + setStuffSearch({ + ...stuffSearch, + schSelSaleStoreId: '', + schOtherSelSaleStoreId: '', + }) + //1차점 로그인해서 2차점 고르고 초기화 눌렀을때 + //stuffSearch에 schSelSaleStoreId 날리고 + //schOtherSelSaleStoreId 날리고 + } + } else { + setOtherSaleStoreId('') + setSchSelSaleStoreId(schSelSaleStoreId) + stuffSearch.schOtherSelSaleStoreId = '' + stuffSearch.schSelSaleStoreId = schSelSaleStoreId + } } } @@ -533,7 +578,9 @@ export default function StuffSearchCondition() { } else if (stuffSearch?.code === 'E' && schSelSaleStoreId !== '') { return option.saleStoreId === schSelSaleStoreId } else { - if (stuffSearch?.schSelSaleStoreId !== '') { + if (stuffSearch?.code === 'FINISH') { + return option.saleStoreId === schSelSaleStoreId + } else if (stuffSearch?.schSelSaleStoreId !== '') { return option.saleStoreId === stuffSearch.schSelSaleStoreId } else { return false From 99aa175a1f99ab4eb57017bf46cbbee893056c34 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 11 Nov 2024 23:54:04 +0900 Subject: [PATCH 010/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSearchCondition.jsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 895cd75d..50ec3744 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -121,7 +121,7 @@ export default function StuffSearchCondition() { objectNameRef.current.value = '' dispCompanyNameRef.current.value = '' receiveUserRef.current.value = '' - + stuffSearch.schDateType = 'U' setObjectNo('') setAddress('') setobjectName('') @@ -655,10 +655,11 @@ export default function StuffSearchCondition() { type="radio" name="radio_ptype" id="radio_u" - checked={dateType === 'U' ? true : false} + checked={stuffSearch.schDateType === 'U' ? true : false} value={'U'} onChange={(e) => { setDateType(e.target.value) + stuffSearch.schDateType = e.target.value }} /> @@ -668,10 +669,11 @@ export default function StuffSearchCondition() { type="radio" name="radio_ptype" id="radio_r" - checked={dateType === 'R' ? true : false} + checked={stuffSearch.schDateType === 'R' ? true : false} value={'R'} onChange={(e) => { setDateType(e.target.value) + stuffSearch.schDateType = e.target.value }} /> From a924a9986893d6faa0228feb33ce3785782feb58 Mon Sep 17 00:00:00 2001 From: minsik Date: Tue, 12 Nov 2024 09:41:57 +0900 Subject: [PATCH 011/200] =?UTF-8?q?=ED=95=98=EB=8B=A8=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/modal/distance/Distance.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/floor-plan/modal/distance/Distance.jsx b/src/components/floor-plan/modal/distance/Distance.jsx index 745ca4f2..ac65c1e5 100644 --- a/src/components/floor-plan/modal/distance/Distance.jsx +++ b/src/components/floor-plan/modal/distance/Distance.jsx @@ -63,7 +63,9 @@ export default function Distance(props) {
- +
From c70fbc27e8dfb29cb6ccc757af032d180a446775 Mon Sep 17 00:00:00 2001 From: minsik Date: Tue, 12 Nov 2024 09:46:57 +0900 Subject: [PATCH 012/200] =?UTF-8?q?=EC=83=88=EB=A1=9C=EA=B3=A0=EC=B9=A8,?= =?UTF-8?q?=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=81=AC=EA=B8=B0=20=EC=A1=B0?= =?UTF-8?q?=EC=A0=88=20=EB=A9=94=EB=89=B4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useContextMenu.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index d7d45a74..8a99824c 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -24,7 +24,6 @@ import { useCommonUtils } from './common/useCommonUtils' import { useMessage } from '@/hooks/useMessage' import { useCanvasEvent } from '@/hooks/useCanvasEvent' import { contextMenuListState, contextMenuState } from '@/store/contextMenu' -import ImageSizeSetting from '@/components/floor-plan/modal/image/ImageSizeSetting' import PanelEdit from '@/components/floor-plan/modal/module/PanelEdit' import DimensionLineSetting from '@/components/floor-plan/modal/dimensionLine/DimensionLineSetting' import ColumnRemove from '@/components/floor-plan/modal/module/column/ColumnRemove' @@ -95,11 +94,6 @@ export function useContextMenu() { case MENU.ROOF_COVERING.DEFAULT: setContextMenu([ [ - { - id: 'refresh', - name: getMessage('refresh'), - fn: () => handleZoomClear(), - }, { id: 'roofMaterialPlacement', name: getMessage('contextmenu.roof.material.placement'), @@ -121,11 +115,6 @@ export function useContextMenu() { name: getMessage('contextmenu.wallline.remove'), fn: () => deleteOuterLineObject(), }, - { - id: 'imageSizeEdit', - name: getMessage('modal.image.size.setting'), - component: , - }, ], [ { @@ -208,6 +197,7 @@ export function useContextMenu() { useEffect(() => { if (currentObject?.name) { + console.log('object', currentObject) switch (currentObject.name) { case 'triangleDormer': case 'pentagonDormer': From 81c91114779f5dff2c4ea4f4a00c6d820bac9b3b Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Tue, 12 Nov 2024 10:45:04 +0900 Subject: [PATCH 013/200] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=B4=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EB=A1=9C=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=A7=88=ED=81=AC=EC=97=85=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/static/images/canvas/side_icon10.svg | 4 ++ src/components/floor-plan/CanvasMenu.jsx | 1 + src/components/floor-plan/modal/ImgLoad.jsx | 61 +++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 public/static/images/canvas/side_icon10.svg create mode 100644 src/components/floor-plan/modal/ImgLoad.jsx diff --git a/public/static/images/canvas/side_icon10.svg b/public/static/images/canvas/side_icon10.svg new file mode 100644 index 00000000..d7eba9ec --- /dev/null +++ b/public/static/images/canvas/side_icon10.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index e544dbec..09758a1e 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -235,6 +235,7 @@ export default function CanvasMenu(props) {
+ {/**/} diff --git a/src/components/floor-plan/modal/ImgLoad.jsx b/src/components/floor-plan/modal/ImgLoad.jsx new file mode 100644 index 00000000..52ca977c --- /dev/null +++ b/src/components/floor-plan/modal/ImgLoad.jsx @@ -0,0 +1,61 @@ +import WithDraggable from '@/components/common/draggable/WithDraggable' + +export default function ImgLoad() { + return ( + +
+
+

画像を読み込む

+ +
+
+
+ サイズ調整と回転 + +
+
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+
+ + +
+
+ +
+ +
+ + +
+
+
+
+ +
+
+
+
+ ) +} From bfbf2152b88b1a740be412b7024e49876ad2625d Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Tue, 12 Nov 2024 10:45:08 +0900 Subject: [PATCH 014/200] =?UTF-8?q?=F0=9F=9A=A8chore:=20Sync=20Sass?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/_contents.scss | 2781 +++++++++++++-------------- src/styles/_modal.scss | 3742 ++++++++++++++++++++----------------- src/styles/_reset.scss | 1806 ++++++++++-------- 3 files changed, 4397 insertions(+), 3932 deletions(-) diff --git a/src/styles/_contents.scss b/src/styles/_contents.scss index 6715d48b..441fccb4 100644 --- a/src/styles/_contents.scss +++ b/src/styles/_contents.scss @@ -17,1444 +17,1497 @@ // } // } // CanvasMenu -.canvas-menu-wrap{ - position: fixed; - top: 46px; - left: 0; - display: block; - width: 100%; - min-width: 1280px; - padding-bottom: 0; - background-color: #383838; - transition: padding .17s ease-in-out; - z-index: 999; - .canvas-menu-inner{ - position: relative; - display: flex; - align-items: center; - padding: 0 40px 0 20px; - background-color: #2C2C2C; - height: 46.8px; - z-index: 999; - .canvas-menu-list{ - display: flex; - align-items: center; - height: 100%; - .canvas-menu-item{ - display: flex; - align-items: center; - height: 100%; - button{ - display: flex; - align-items: center; - font-size: 12px; - height: 100%; - color: #fff; - font-weight: 600; - padding: 15px 20px; - opacity: 0.55; - transition: all .17s ease-in-out; - .menu-icon{ - display: block; - width: 14px; - height: 14px; - background-repeat: no-repeat; - background-position: center; - background-size: contain; - margin-right: 10px; - &.con00{background-image: url(/static/images/canvas/menu_icon00.svg);} - &.con01{background-image: url(/static/images/canvas/menu_icon01.svg);} - &.con02{background-image: url(/static/images/canvas/menu_icon02.svg);} - &.con03{background-image: url(/static/images/canvas/menu_icon03.svg);} - &.con04{background-image: url(/static/images/canvas/menu_icon04.svg);} - &.con05{background-image: url(/static/images/canvas/menu_icon05.svg);} - &.con06{background-image: url(/static/images/canvas/menu_icon06.svg);} - } - } - &.active{ - background-color: #383838; - button{ - opacity: 1; - } - } - } - } - .canvas-side-btn-wrap{ - display: flex; - align-items: center; - margin-left: auto; - .select-box{ - width: 124px; - margin: 0 5px; - height: 30px; - > div{ - width: 100%; - } - } - .btn-from{ - display: flex; - align-items: center; - gap: 5px; - button{ - display: block; - width: 30px; - height: 30px; - border-radius: 2px; - background-color: #3D3D3D; - background-position: center; - background-repeat: no-repeat; - background-size: 15px 15px; - transition: all .17s ease-in-out; - &.btn01{background-image: url(../../public/static/images/canvas/side_icon03.svg);} - &.btn02{background-image: url(../../public/static/images/canvas/side_icon02.svg);} - &.btn03{background-image: url(../../public/static/images/canvas/side_icon01.svg);} - &.btn04{background-image: url(../../public/static/images/canvas/side_icon04.svg);} - &.btn05{background-image: url(../../public/static/images/canvas/side_icon05.svg);} - &.btn06{background-image: url(../../public/static/images/canvas/side_icon06.svg);} - &.btn07{background-image: url(../../public/static/images/canvas/side_icon07.svg);} - &.btn08{background-image: url(../../public/static/images/canvas/side_icon08.svg);} - &.btn09{background-image: url(../../public/static/images/canvas/side_icon09.svg);} - &:hover{ - background-color: #1083E3; - } - &.active{ - background-color: #1083E3; - } - } - } - .ico-btn-from{ - display: flex; - align-items: center; - gap: 5px; - button{ - .ico{ - display: block; - width: 15px; - height: 15px; - background-repeat: no-repeat; - background-position: center; - background-size: contain; - &.ico01{background-image: url(../../public/static/images/canvas/ico-flx01.svg);} - &.ico02{background-image: url(../../public/static/images/canvas/ico-flx02.svg);} - &.ico03{background-image: url(../../public/static/images/canvas/ico-flx03.svg);} - &.ico04{background-image: url(../../public/static/images/canvas/ico-flx04.svg);} - } - .name{ - font-size: 12px; - color: #fff; - } - } - &.form06{ - .name{ - font-size: 13px; - } - } - } - .vertical-horizontal{ - display: flex; - min-width: 170px; - height: 28px; - margin-right: 5px; - border-radius: 2px; - background: #373737; - line-height: 28px; - overflow: hidden; - span{ - padding: 0 10px; - font-size: 13px; - color: #fff; - } - button{ - margin-left: auto; - height: 100%; - background-color: #4B4B4B; - font-size: 13px; - font-weight: 400; - color: #fff; - padding: 0 7.5px; - transition: all .17s ease-in-out; - } - &.on{ - button{ - background-color: #1083E3; - } - } - } - .size-control{ - display: flex; - align-items: center; - justify-content: center; - gap: 10px; - background-color: #3D3D3D; - border-radius: 2px; - width: 100px; - height: 30px; - margin: 0 5px; - span{ - font-size: 13px; - color: #fff; - } - .control-btn{ - display: block; - width: 12px; - height: 12px; - background-repeat: no-repeat; - background-size: cover; - background-position: center; - &.minus{ - background-image: url(../../public/static/images/canvas/minus.svg); - } - &.plus{ - background-image: url(../../public/static/images/canvas/plus.svg); - } - } - } - } - } - .canvas-depth2-wrap{ - position: absolute; - top: -100%; - left: 0; - background-color: #383838; - width: 100%; - height: 50px; - transition: all .17s ease-in-out; - .canvas-depth2-inner{ - display: flex; - align-items: center; - padding: 0 40px; - height: 100%; - .canvas-depth2-list{ - display: flex; - align-items: center ; - height: 100%; - .canvas-depth2-item{ - display: flex; - align-items: center; - margin-right: 26px; - height: 100%; - button{ - position: relative; - opacity: 0.55; - color: #fff; - font-size: 12px; - font-weight: normal; - height: 100%; - padding-right: 12px; - } - &.active{ - button{ - opacity: 1; - font-weight: 600; - &:after{ - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 5px; - height: 8px; - background: url(../../public/static/images/canvas/depth2-arr.svg) no-repeat center; - } - } - } - } - } - .canvas-depth2-btn-list{ - display: flex; - align-items: center; - margin-left: auto; - height: 100%; - .depth2-btn-box{ - display: flex; - align-items: center; - margin-right: 34px; - height: 100%; - transition: all .17s ease-in-out; - button{ - position: relative; - font-size: 12px; - font-weight: 400; - height: 100%; - color: #fff; - padding-right: 12px; - &:after{ - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 5px; - height: 8px; - background: url(../../public/static/images/canvas/depth2-arr.svg) no-repeat center; - } - } - &:last-child{ - margin-right: 0; - } - &.mouse{ - opacity: 0.55; - } - } - } - } - &.active{ - top: 47px; - } - } - &.active{ - padding-bottom: 50px; - } -} - -// canvas-layout -.canvas-content{ - padding-top: 46.8px; - transition: all .17s ease-in-out; - .canvas-frame{ - height: calc(100vh - 129.3px); - } - &.active{ - padding-top: calc(46.8px + 50px); - .canvas-frame{ - height: calc(100vh - 179.4px); - } - } -} -.canvas-layout{ - padding-top: 37px; - .canvas-page-list{ - position: fixed; - top: 92.8px; - left: 0; - display: flex; - background-color: #1C1C1C; - border-top: 1px solid #000; - width: 100%; - min-width: 1280px; - transition: all .17s ease-in-out; - z-index: 99; - &.active{ - top: calc(92.8px + 50px); - } - .canvas-plane-wrap{ - display: flex; - align-items: center; - max-width: calc(100% - 45px); - .canvas-page-box{ - display: flex; - align-items: center; - background-color: #1c1c1c; - padding: 9.6px 20px; - border-right:1px solid #000; - min-width: 0; - transition: all .17s ease-in-out; - span{ - display: flex; - align-items: center; - width: 100%; - font-size: 12px; - font-family: 'Pretendard', sans-serif; - color: #AAA; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - } - .close{ - flex: none; - display: block; - width: 7px; - height: 8px; - margin-left: 15px; - background: url(../../public/static/images/canvas/plan_close_gray.svg)no-repeat center; - background-size: cover; - } - &.on{ - background-color: #fff; - span{ - font-weight: 600; - color: #101010; - } - .close{ - background: url(../../public/static/images/canvas/plan_close_black.svg)no-repeat center; - } - &:hover{ - background-color: #fff; - } - } - &:hover{ - background-color: #000; - } - } - } - .plane-add{ - display: flex; - align-items: center; - justify-content: center; - width: 45px; - padding: 13.5px 0; - background-color: #1C1C1C; - border-right: 1px solid #000; - transition: all .17s ease-in-out; - span{ - display: block; - width: 9px; - height: 9px; - background: url(../../public/static/images/canvas/plane_add.svg)no-repeat center; - background-size: cover; - } - &:hover{ - background-color: #000; - } - } - } -} - -.canvas-frame{ +.canvas-menu-wrap { + position: fixed; + top: 46px; + left: 0; + display: block; + width: 100%; + min-width: 1280px; + padding-bottom: 0; + background-color: #383838; + transition: padding 0.17s ease-in-out; + z-index: 999; + .canvas-menu-inner { position: relative; - // height: calc(100% - 36.5px); - background-color: #F4F4F7; - overflow: auto; - transition: all .17s ease-in-out; - // &::-webkit-scrollbar { - // width: 10px; - // height: 10px; - // background-color: #fff; - // } - // &::-webkit-scrollbar-thumb { - // background-color: #C1CCD7; - // border-radius: 30px; - // } - // &::-webkit-scrollbar-track { - // background-color: #fff; - // } - .canvas-container{ - margin: 0 auto; - background-color: #fff; - } - canvas{ - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } -} - -// sub-page -.sub-header{ - position: fixed; - top: 46px; - left: 0; - width: 100%; - min-width: 1280px; - height: 46px; - border-bottom: 1px solid #000; - background: #2C2C2C; + display: flex; + align-items: center; + padding: 0 40px 0 20px; + background-color: #2c2c2c; + height: 46.8px; z-index: 999; - .sub-header-inner{ + .canvas-menu-list { + display: flex; + align-items: center; + height: 100%; + .canvas-menu-item { display: flex; align-items: center; height: 100%; - padding: 0 100px; - .sub-header-title-wrap{ - display: flex; - align-items: center; - .title-item{ - position: relative; - padding: 0 24px; - a{ - display: flex; - align-items: center; - .icon{ - width: 22px; - height: 22px; - margin-right: 8px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - &.drawing{background-image: url(../../public/static/images/main/drawing_icon.svg);} - } - } - &:after{ - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 1px; - height: 16px; - background-color: #D9D9D9; - } - &:first-child{ - padding-left: 0; - } - &:last-child{ - padding-right: 0; - &:after{ - display: none; - } - } + button { + display: flex; + align-items: center; + font-size: 12px; + height: 100%; + color: #fff; + font-weight: 600; + padding: 15px 20px; + opacity: 0.55; + transition: all 0.17s ease-in-out; + .menu-icon { + display: block; + width: 14px; + height: 14px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + margin-right: 10px; + &.con00 { + background-image: url(/static/images/canvas/menu_icon00.svg); } + &.con01 { + background-image: url(/static/images/canvas/menu_icon01.svg); + } + &.con02 { + background-image: url(/static/images/canvas/menu_icon02.svg); + } + &.con03 { + background-image: url(/static/images/canvas/menu_icon03.svg); + } + &.con04 { + background-image: url(/static/images/canvas/menu_icon04.svg); + } + &.con05 { + background-image: url(/static/images/canvas/menu_icon05.svg); + } + &.con06 { + background-image: url(/static/images/canvas/menu_icon06.svg); + } + } } - .sub-header-title{ - font-size: 16px; + &.active { + background-color: #383838; + button { + opacity: 1; + } + } + } + } + .canvas-side-btn-wrap { + display: flex; + align-items: center; + margin-left: auto; + .select-box { + width: 124px; + margin: 0 5px; + height: 30px; + > div { + width: 100%; + } + } + .btn-from { + display: flex; + align-items: center; + gap: 5px; + button { + display: block; + width: 30px; + height: 30px; + border-radius: 2px; + background-color: #3d3d3d; + background-position: center; + background-repeat: no-repeat; + background-size: 15px 15px; + transition: all 0.17s ease-in-out; + &.btn01 { + background-image: url(../../public/static/images/canvas/side_icon03.svg); + } + &.btn02 { + background-image: url(../../public/static/images/canvas/side_icon02.svg); + } + &.btn03 { + background-image: url(../../public/static/images/canvas/side_icon01.svg); + } + &.btn04 { + background-image: url(../../public/static/images/canvas/side_icon04.svg); + } + &.btn05 { + background-image: url(../../public/static/images/canvas/side_icon05.svg); + } + &.btn06 { + background-image: url(../../public/static/images/canvas/side_icon06.svg); + } + &.btn07 { + background-image: url(../../public/static/images/canvas/side_icon07.svg); + } + &.btn08 { + background-image: url(../../public/static/images/canvas/side_icon08.svg); + } + &.btn09 { + background-image: url(../../public/static/images/canvas/side_icon09.svg); + } + &.btn10 { + background-image: url(../../public/static/images/canvas/side_icon10.svg); + background-size: 15px 14px; + } + &:hover { + background-color: #1083e3; + } + &.active { + background-color: #1083e3; + } + } + } + .ico-btn-from { + display: flex; + align-items: center; + gap: 5px; + button { + .ico { + display: block; + width: 15px; + height: 15px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + &.ico01 { + background-image: url(../../public/static/images/canvas/ico-flx01.svg); + } + &.ico02 { + background-image: url(../../public/static/images/canvas/ico-flx02.svg); + } + &.ico03 { + background-image: url(../../public/static/images/canvas/ico-flx03.svg); + } + &.ico04 { + background-image: url(../../public/static/images/canvas/ico-flx04.svg); + } + } + .name { + font-size: 12px; color: #fff; - font-weight: 600; + } } - .sub-header-location{ - margin-left: auto; - display: flex; - align-items: center; - .location-item{ - position: relative; - display: flex; - align-items: center; - padding: 0 10px; - span{ - display: flex; - font-size: 12px; - color: #AAA; - font-weight: normal; - cursor: default; - } - &:after{ - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 4px; - height: 6px; - background: url(../../public/static/images/main/loaction_arr.svg)no-repeat center; - } - &:first-child{ - padding-left: 0; - } - &:last-child{ - padding-right: 0; - span{ - color: #fff; - } - &:after{ - display: none; - } - } - } + &.form06 { + .name { + font-size: 13px; + } } - } -} - -// sub content -.sub-content{ - padding-top: 46px; - .sub-content-inner{ - max-width: 1760px; - margin: 0 auto; - padding: 20px 20px 0; - .sub-content-box{ - margin-bottom: 20px; - &:last-child{ - margin-bottom: 0; - } - } - } - &.estimate{ + } + .vertical-horizontal { display: flex; - flex-direction: column; - padding-top: 0; - .sub-content-inner{ - flex: 1; - width: 100%; + min-width: 170px; + height: 28px; + margin-right: 5px; + border-radius: 2px; + background: #373737; + line-height: 28px; + overflow: hidden; + span { + padding: 0 10px; + font-size: 13px; + color: #fff; } - } -} -.sub-table-box{ - padding: 20px; - border-radius: 6px; - border: 1px solid #E9EAED; - background: #FFF; - box-shadow: 0px 3px 30px 0px rgba(0, 0, 0, 0.02); - .table-box-title-wrap{ - display: flex; - align-items: center; - margin-bottom: 15px; - .title-wrap{ - display: flex; - align-items: center; - h3{ - display: block; - font-size: 15px; - color: #101010; - font-weight: 600; - margin-right: 14px; - &.product{ - margin-right: 10px; - } - } - .product_tit{ - position: relative; - font-size: 15px; - font-weight: 600; - color: #1083E3; - padding-left: 10px; - &::before{ - content: ''; - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); - width: 1px; - height: 11px; - background-color: #D9D9D9; - } - } - .option{ - padding-left: 5px; - font-size: 13px; - color: #101010; - font-weight: 400; - } - .info-wrap{ - display: flex; - align-items: center; - li{ - position: relative; - padding: 0 6px; - font-size: 12px; - color: #101010; - font-weight: normal; - span{ - font-weight: 600; - &.red{ - color: #E23D70; - } - } - &:after{ - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 1px; - height: 11px; - background-color: #D9D9D9; - } - &:first-child{padding-left: 0;} - &:last-child{padding-right: 0;&::after{display: none;}} - } - } + button { + margin-left: auto; + height: 100%; + background-color: #4b4b4b; + font-size: 13px; + font-weight: 400; + color: #fff; + padding: 0 7.5px; + transition: all 0.17s ease-in-out; } - } - .left-unit-box{ - margin-left: auto; - display: flex; - align-items: center; - } - .promise-gudie{ - display: block; - font-size: 13px; - font-weight: 700; - color: #101010; - margin-bottom: 20px; - } - .important{ - color: #f00; - } - .sub-center-footer{ + &.on { + button { + background-color: #1083e3; + } + } + } + .size-control { display: flex; align-items: center; justify-content: center; - margin-top: 20px; - } - .sub-right-footer{ - display: flex; - align-items: center; - justify-content: flex-end; - margin-top: 20px; - } -} -.pagination-wrap{ - margin-top: 24px; -} - -.infomation-wrap{ - margin-bottom: 30px; -} - -.infomation-box-wrap{ - display: flex; - gap: 10px; - .sub-table-box{ - flex: 1 ; - } - .info-title{ - font-size: 14px; - font-weight: 500; - color: #344356; - margin-bottom: 10px; - } - .info-inner{ - position: relative; - font-size: 13px; - color: #344356; - .copy-ico{ - position: absolute; - bottom: 0; - right: 0; - width: 16px; - height: 16px; - background: url(../../public/static/images/sub/copy_ico.svg)no-repeat center; - background-size: cover; + gap: 10px; + background-color: #3d3d3d; + border-radius: 2px; + width: 100px; + height: 30px; + margin: 0 5px; + span { + font-size: 13px; + color: #fff; } - } -} - -// 견적서 -.estimate-list-wrap{ - display: flex; - align-items: center; - margin-bottom: 10px; - &.one{ - .estimate-box{ - &:last-child{ - min-width: unset; - } + .control-btn { + display: block; + width: 12px; + height: 12px; + background-repeat: no-repeat; + background-size: cover; + background-position: center; + &.minus { + background-image: url(../../public/static/images/canvas/minus.svg); + } + &.plus { + background-image: url(../../public/static/images/canvas/plus.svg); + } } + } } - .estimate-box{ - flex: 1 ; - display: flex; - align-items: center; - &:last-child{ - flex: none; - min-width: 220px; - } - .estimate-tit{ - width: 105px; - height: 30px; - line-height: 30px; - background-color: #F4F4F7; - border-radius: 100px; - text-align: center; - font-size: 13px; - font-weight: 500; - color: #344356; - } - .estimate-name{ - font-size: 13px; - color: #344356; - margin-left: 14px; - font-weight: 400; - &.blue{ - font-size: 16px; - font-weight: 700; - color: #1083E3; - } - &.red{ - font-size: 16px; - font-weight: 700; - color: #D72A2A; - } - } - } - &:last-child{ - margin-bottom: 0; - } -} - -// file drag box -.drag-file-box{ - padding: 10px; - .btn-area{ - padding-bottom: 15px; - border-bottom: 1px solid #ECF0F4; - .file-upload{ - display: inline-block; - height: 30px; - background-color: #94A0AD; - padding: 0 10px; - border-radius: 2px; - font-size: 13px; - line-height: 30px; - color: #fff; - font-weight: 500; - cursor: pointer; - transition: background .15s ease-in-out; - &:hover{ - background-color: #607F9A; - } - } - } - .drag-file-area{ - position: relative; - margin-top: 15px; - p{ - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - font-size: 13px; - color: #ccc; - font-weight: 400; - cursor: default; - } - } - .file-list{ - .file-item{ - margin-bottom: 15px; - span{ - position: relative; - font-size: 13px; - color: #45576F; - font-weight: 400; - white-space: nowrap; - padding-right: 55px; - button{ - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 15px; - height: 15px; - background: url(../../public/static/images/sub/file_delete.svg)no-repeat center; - background-size: cover; - } - } - &:last-child{ - margin-bottom: 0; - } - } - } -} - -.estimate-arr-btn{ - display: block; - width: 20px; - height: 20px; - background-color: #94A0AD; - border: 1px solid #94A0AD; - background-position: center; - background-repeat: no-repeat; - background-image: url(../../public/static/images/canvas/estiment_arr.svg); - background-size: 11px 7px; - border-radius: 2px; - &.up{ - rotate: 180deg; - } - &.on{ - background-color: #fff; - border-color: #C2D0DD; - background-image: url(../../public/static/images/canvas/estiment_arr_color.svg) - } -} -.estimate-check-wrap{ - .estimate-check-inner{ - display: block; - } - &.hide{ - border-bottom: 1px solid #ECF0F4; - margin-bottom: 15px; - .estimate-check-inner{ - display: none; - } - } -} - -.special-note-check-wrap{ - display: grid; - grid-template-columns: repeat(5, 1fr); - border-radius: 3px; - margin-bottom: 30px; - .special-note-check-item{ - padding: 14px 10px; - border: 1px solid #ECF0F4; - margin-top: -1px; - margin-right: -1px; - &.act{ - background-color: #F7F9FA; - } - } -} - -.calculation-estimate{ - border: 1px solid #ECF0F4; - border-radius: 3px; - padding: 24px; - max-height: 350px; - overflow-y: auto; - margin-bottom: 30px; - dl{ - margin-bottom: 35px; - &:last-child{ - margin-bottom: 0; - } - dt{ - font-size: 13px; - font-weight: 600; - color: #1083E3; - margin-bottom: 15px; - } - dd{ - font-size: 12px; - font-weight: 400; - color: #45576F; - margin-bottom: 8px; - &:last-child{ - margin-bottom: 0; - } - } - } - &::-webkit-scrollbar { - width: 4px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background-color: #d9dee2; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } -} -.esimate-wrap{ - margin-bottom: 20px; -} - -.estimate-product-option{ - display: flex; - align-items: center; - margin-bottom: 15px; - .product-price-wrap{ - display: flex; - align-items: center; - .product-price-tit{ - font-size: 13px; - font-weight: 400; - color: #45576F; - margin-right: 10px; - } - .select-wrap{ - width: 110px; - } - } - .product-edit-wrap{ - display: flex; - align-items: center; - margin-left: auto; - .product-edit-explane{ - display: flex; - align-items: center; - margin-right: 15px; - .explane-item{ - position: relative; - display: flex; - align-items: center; - padding: 0 10px; - font-size: 12px; - font-weight: 400; - span{ - width: 20px; - height: 20px; - margin-right: 5px; - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - &:before{ - content: ''; - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); - width: 1px; - height: 12px; - background-color: #D9D9D9; - } - &:first-child{ - padding-left: 0; - &::before{ - display: none; - } - } - &:last-child{ - padding-right: 0; - } - &.item01{ - color: #3BBB48; - span{ - background-image: url(../../public/static/images/sub/open_ico.svg); - } - } - &.item02{ - color: #909000; - span{ - background-image: url(../../public/static/images/sub/change_ico.svg); - } - } - &.item03{ - color: #0191C9; - span{ - background-image: url(../../public/static/images/sub/attachment_ico.svg); - } - } - &.item04{ - color: #F16A6A; - span{ - background-image: url(../../public/static/images/sub/click_check_ico.svg); - } - } - } - } - .product-edit-btn{ - display: flex; - align-items: center; - button{ - display: flex; - align-items: center; - span{ - width: 13px; - height: 13px; - margin-right: 5px; - background-size: cover; - &.plus{ - background: url(../../public/static/images/sub/plus_btn.svg)no-repeat center; - } - &.minus{ - background: url(../../public/static/images/sub/minus_btn.svg)no-repeat center; - } - } - } - } - } -} - -// 발전시물레이션 -.chart-wrap{ - display: flex; - gap: 20px; + } + .canvas-depth2-wrap { + position: absolute; + top: -100%; + left: 0; + background-color: #383838; width: 100%; - .sub-table-box{ - height: 100%; - } - .chart-inner{ - flex: 1; - .chart-box{ - margin-bottom: 30px; - } - } - .chart-table-wrap{ + height: 50px; + transition: all 0.17s ease-in-out; + .canvas-depth2-inner { + display: flex; + align-items: center; + padding: 0 40px; + height: 100%; + .canvas-depth2-list { display: flex; - flex-direction: column; - flex: none; - width: 650px; - .sub-table-box{ - flex: 1; - &:first-child{ - margin-bottom: 20px; - } - } - } -} - -.chart-month-table{ - table{ - table-layout: fixed; - border-collapse:collapse; - border: 1px solid #ECF0F4; - border-radius: 4px; - thead{ - th{ - padding: 4.5px 0; - border-bottom: 1px solid #ECF0F4; - text-align: center; - font-size: 13px; - color: #45576F; - font-weight: 500; - background-color: #F8F9FA; - } - } - tbody{ - td{ - font-size: 13px; - color: #45576F; - text-align: center; - padding: 4.5px 0; - } - } - } -} - -.simulation-guide-wrap{ - display: flex; - padding: 20px; - .simulation-tit-wrap{ - flex: none; - padding-right: 40px; - border-right: 1px solid #EEEEEE; - span{ - display: block; + align-items: center; + height: 100%; + .canvas-depth2-item { + display: flex; + align-items: center; + margin-right: 26px; + height: 100%; + button { position: relative; - padding-left: 60px; - font-size: 15px; - color: #14324F; - font-weight: 600; - &::before{ + opacity: 0.55; + color: #fff; + font-size: 12px; + font-weight: normal; + height: 100%; + padding-right: 12px; + } + &.active { + button { + opacity: 1; + font-weight: 600; + &:after { content: ''; position: absolute; top: 50%; - left: 0; + right: 0; transform: translateY(-50%); - width: 40px; - height: 40px; - background: url(../../public/static/images/sub/simulation_guide.svg)no-repeat center; - background-size: cover; + width: 5px; + height: 8px; + background: url(../../public/static/images/canvas/depth2-arr.svg) no-repeat center; + } } + } } - } - .simulation-guide-box{ - flex: 1; - padding-left: 40px; - dl{ - margin-bottom: 25px; - dt{ - font-size: 13px; - color: #101010; - font-weight: 600; - margin-bottom: 5px; - } - dd{ - font-size: 12px; - color: #45576F; - font-weight: 400; - line-height: 24px; - } - &:last-child{ - margin-bottom: 0; - } - } - ul, ol{ - list-style: unset; - } - } -} - -.module-total{ - display: flex; - align-items: center; - background-color: #F8F9FA; - padding: 9px 0; - margin-right: 4px; - border: 1px solid #ECF0F4; - border-top: none; - .total-title{ - flex: 1; - text-align: center; - font-size: 13px; - color: #344356; - font-weight: 500; - } - .total-num{ - flex: none; - width: 121px; - text-align: center; - font-size: 15px; - color: #344356; - font-weight: 500; - } -} - -// 물건상세 -.information-help-wrap{ - display: flex; - padding: 24px; - background-color: #F4F4F4; - border-radius: 4px; - margin-bottom: 15px; - .information-help-tit-wrap{ - position: relative; + } + .canvas-depth2-btn-list { display: flex; align-items: center; - padding-right: 40px; - border-right: 1px solid #E0E0E3; - .help-tit-icon{ - width: 40px; - height: 40px; - border-radius: 50%; - margin-right: 10px; - background: #fff url(../../public/static/images/sub/information_help.svg)no-repeat center; - background-size: 20px 20px; - } - .help-tit{ - font-size: 13px; - font-weight: 600; - color: #45576F; - } - } - .information-help-guide{ - padding-left: 40px; - span{ - display: block; + margin-left: auto; + height: 100%; + .depth2-btn-box { + display: flex; + align-items: center; + margin-right: 34px; + height: 100%; + transition: all 0.17s ease-in-out; + button { + position: relative; font-size: 12px; font-weight: 400; - color: #45576F; - margin-bottom: 7px; - &:last-child{ - margin-bottom: 0; + height: 100%; + color: #fff; + padding-right: 12px; + &:after { + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 5px; + height: 8px; + background: url(../../public/static/images/canvas/depth2-arr.svg) no-repeat center; } + } + &:last-child { + margin-right: 0; + } + &.mouse { + opacity: 0.55; + } } + } } + &.active { + top: 47px; + } + } + &.active { + padding-bottom: 50px; + } } -.community-search-warp{ +// canvas-layout +.canvas-content { + padding-top: 46.8px; + transition: all 0.17s ease-in-out; + .canvas-frame { + height: calc(100vh - 129.3px); + } + &.active { + padding-top: calc(46.8px + 50px); + .canvas-frame { + height: calc(100vh - 179.4px); + } + } +} +.canvas-layout { + padding-top: 37px; + .canvas-page-list { + position: fixed; + top: 92.8px; + left: 0; + display: flex; + background-color: #1c1c1c; + border-top: 1px solid #000; + width: 100%; + min-width: 1280px; + transition: all 0.17s ease-in-out; + z-index: 99; + &.active { + top: calc(92.8px + 50px); + } + .canvas-plane-wrap { + display: flex; + align-items: center; + max-width: calc(100% - 45px); + .canvas-page-box { + display: flex; + align-items: center; + background-color: #1c1c1c; + padding: 9.6px 20px; + border-right: 1px solid #000; + min-width: 0; + transition: all 0.17s ease-in-out; + span { + display: flex; + align-items: center; + width: 100%; + font-size: 12px; + font-family: 'Pretendard', sans-serif; + color: #aaa; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + .close { + flex: none; + display: block; + width: 7px; + height: 8px; + margin-left: 15px; + background: url(../../public/static/images/canvas/plan_close_gray.svg) no-repeat center; + background-size: cover; + } + &.on { + background-color: #fff; + span { + font-weight: 600; + color: #101010; + } + .close { + background: url(../../public/static/images/canvas/plan_close_black.svg) no-repeat center; + } + &:hover { + background-color: #fff; + } + } + &:hover { + background-color: #000; + } + } + } + .plane-add { + display: flex; + align-items: center; + justify-content: center; + width: 45px; + padding: 13.5px 0; + background-color: #1c1c1c; + border-right: 1px solid #000; + transition: all 0.17s ease-in-out; + span { + display: block; + width: 9px; + height: 9px; + background: url(../../public/static/images/canvas/plane_add.svg) no-repeat center; + background-size: cover; + } + &:hover { + background-color: #000; + } + } + } +} + +.canvas-frame { + position: relative; + // height: calc(100% - 36.5px); + background-color: #f4f4f7; + overflow: auto; + transition: all 0.17s ease-in-out; + // &::-webkit-scrollbar { + // width: 10px; + // height: 10px; + // background-color: #fff; + // } + // &::-webkit-scrollbar-thumb { + // background-color: #C1CCD7; + // border-radius: 30px; + // } + // &::-webkit-scrollbar-track { + // background-color: #fff; + // } + .canvas-container { + margin: 0 auto; + background-color: #fff; + } + canvas { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } +} + +// sub-page +.sub-header { + position: fixed; + top: 46px; + left: 0; + width: 100%; + min-width: 1280px; + height: 46px; + border-bottom: 1px solid #000; + background: #2c2c2c; + z-index: 999; + .sub-header-inner { display: flex; - flex-direction: column; align-items: center; - padding: 10px 0 30px 0; - border-bottom: 1px solid #E5E5E5; - margin-bottom: 24px; - .community-search-box{ + height: 100%; + padding: 0 100px; + .sub-header-title-wrap { + display: flex; + align-items: center; + .title-item { + position: relative; + padding: 0 24px; + a { + display: flex; + align-items: center; + .icon { + width: 22px; + height: 22px; + margin-right: 8px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + &.drawing { + background-image: url(../../public/static/images/main/drawing_icon.svg); + } + } + } + &:after { + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 1px; + height: 16px; + background-color: #d9d9d9; + } + &:first-child { + padding-left: 0; + } + &:last-child { + padding-right: 0; + &:after { + display: none; + } + } + } + } + .sub-header-title { + font-size: 16px; + color: #fff; + font-weight: 600; + } + .sub-header-location { + margin-left: auto; + display: flex; + align-items: center; + .location-item { position: relative; display: flex; align-items: center; - width: 580px; - height: 45px; - padding: 0 45px 0 20px; - margin-bottom: 20px; - border-radius: 2px; - border: 1px solid #101010; - .community-input{ - width: 100%; - height: 100%; - font-size: 13px; - font-weight: 400; - color: #101010; - &::placeholder{ - color: #C8C8C8; - } + padding: 0 10px; + span { + display: flex; + font-size: 12px; + color: #aaa; + font-weight: normal; + cursor: default; } - .community-search-ico{ - position: absolute; - top: 50%; - right: 20px; - transform: translateY(-50%); - flex: none; - width: 21px; - height: 100%; - background: url(../../public/static/images/sub/community_search.svg)no-repeat center; - background-size: 21px 21px; - z-index: 3; - } - } - .community-search-keyword{ - font-size: 13px; - font-weight: 400; - color: #45576F; - span{ - font-weight: 600; - color: #F16A6A; + &:after { + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 4px; + height: 6px; + background: url(../../public/static/images/main/loaction_arr.svg) no-repeat center; } + &:first-child { + padding-left: 0; + } + &:last-child { + padding-right: 0; + span { + color: #fff; + } + &:after { + display: none; + } + } + } } + } } -// 자료 다운로드 -.file-down-list{ - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 14px; - .file-down-item{ +// sub content +.sub-content { + padding-top: 46px; + .sub-content-inner { + max-width: 1760px; + margin: 0 auto; + padding: 20px 20px 0; + .sub-content-box { + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + } + } + &.estimate { + display: flex; + flex-direction: column; + padding-top: 0; + .sub-content-inner { + flex: 1; + width: 100%; + } + } +} +.sub-table-box { + padding: 20px; + border-radius: 6px; + border: 1px solid #e9eaed; + background: #fff; + box-shadow: 0px 3px 30px 0px rgba(0, 0, 0, 0.02); + .table-box-title-wrap { + display: flex; + align-items: center; + margin-bottom: 15px; + .title-wrap { + display: flex; + align-items: center; + h3 { + display: block; + font-size: 15px; + color: #101010; + font-weight: 600; + margin-right: 14px; + &.product { + margin-right: 10px; + } + } + .product_tit { + position: relative; + font-size: 15px; + font-weight: 600; + color: #1083e3; + padding-left: 10px; + &::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + width: 1px; + height: 11px; + background-color: #d9d9d9; + } + } + .option { + padding-left: 5px; + font-size: 13px; + color: #101010; + font-weight: 400; + } + .info-wrap { display: flex; align-items: center; - padding: 24px; - border-radius: 4px; - border: 1px solid #E5E5E5; - background: #FFF; - transition: all .15s ease-in-out; - .file-item-info{ - .item-num{ - display: inline-block; - padding: 6px 17.5px; - border-radius: 60px; - background-color: #F4F4F7; - font-size: 13px; - font-weight: 600; - color: #101010; - margin-bottom: 15px; + li { + position: relative; + padding: 0 6px; + font-size: 12px; + color: #101010; + font-weight: normal; + span { + font-weight: 600; + &.red { + color: #e23d70; } - .item-name{ - font-size: 16px; - color: #101010; - font-weight: 500; - margin-bottom: 13px; - } - .item-date{ - font-size: 13px; - font-weight: 400; - color: #344356; + } + &:after { + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 1px; + height: 11px; + background-color: #d9d9d9; + } + &:first-child { + padding-left: 0; + } + &:last-child { + padding-right: 0; + &::after { + display: none; } + } } - .file-down-box{ - display: flex; - align-items: center; - flex: none; - margin-left: auto; - height: 100%; - .file-down-btn{ - width: 36px; - height: 36px; - background: url(../../public/static/images/sub/file_down_btn.svg)no-repeat center; - background-size: cover; - } - } - &:hover{ - background-color: #F4F4F7; - } + } } -} - -.file-down-nodata{ + } + .left-unit-box { + margin-left: auto; + display: flex; + align-items: center; + } + .promise-gudie { + display: block; + font-size: 13px; + font-weight: 700; + color: #101010; + margin-bottom: 20px; + } + .important { + color: #f00; + } + .sub-center-footer { display: flex; align-items: center; justify-content: center; - width: 100%; - height: 148px; - padding: 24px; - border-radius: 4px; - border: 1px solid #E5E5E5; - font-size: 16px; + margin-top: 20px; + } + .sub-right-footer { + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: 20px; + } +} +.pagination-wrap { + margin-top: 24px; +} + +.infomation-wrap { + margin-bottom: 30px; +} + +.infomation-box-wrap { + display: flex; + gap: 10px; + .sub-table-box { + flex: 1; + } + .info-title { + font-size: 14px; font-weight: 500; color: #344356; + margin-bottom: 10px; + } + .info-inner { + position: relative; + font-size: 13px; + color: #344356; + .copy-ico { + position: absolute; + bottom: 0; + right: 0; + width: 16px; + height: 16px; + background: url(../../public/static/images/sub/copy_ico.svg) no-repeat center; + background-size: cover; + } + } +} + +// 견적서 +.estimate-list-wrap { + display: flex; + align-items: center; + margin-bottom: 10px; + &.one { + .estimate-box { + &:last-child { + min-width: unset; + } + } + } + .estimate-box { + flex: 1; + display: flex; + align-items: center; + &:last-child { + flex: none; + min-width: 220px; + } + .estimate-tit { + width: 105px; + height: 30px; + line-height: 30px; + background-color: #f4f4f7; + border-radius: 100px; + text-align: center; + font-size: 13px; + font-weight: 500; + color: #344356; + } + .estimate-name { + font-size: 13px; + color: #344356; + margin-left: 14px; + font-weight: 400; + &.blue { + font-size: 16px; + font-weight: 700; + color: #1083e3; + } + &.red { + font-size: 16px; + font-weight: 700; + color: #d72a2a; + } + } + } + &:last-child { + margin-bottom: 0; + } +} + +// file drag box +.drag-file-box { + padding: 10px; + .btn-area { + padding-bottom: 15px; + border-bottom: 1px solid #ecf0f4; + .file-upload { + display: inline-block; + height: 30px; + background-color: #94a0ad; + padding: 0 10px; + border-radius: 2px; + font-size: 13px; + line-height: 30px; + color: #fff; + font-weight: 500; + cursor: pointer; + transition: background 0.15s ease-in-out; + &:hover { + background-color: #607f9a; + } + } + } + .drag-file-area { + position: relative; + margin-top: 15px; + p { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 13px; + color: #ccc; + font-weight: 400; + cursor: default; + } + } + .file-list { + .file-item { + margin-bottom: 15px; + span { + position: relative; + font-size: 13px; + color: #45576f; + font-weight: 400; + white-space: nowrap; + padding-right: 55px; + button { + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 15px; + height: 15px; + background: url(../../public/static/images/sub/file_delete.svg) no-repeat center; + background-size: cover; + } + } + &:last-child { + margin-bottom: 0; + } + } + } +} + +.estimate-arr-btn { + display: block; + width: 20px; + height: 20px; + background-color: #94a0ad; + border: 1px solid #94a0ad; + background-position: center; + background-repeat: no-repeat; + background-image: url(../../public/static/images/canvas/estiment_arr.svg); + background-size: 11px 7px; + border-radius: 2px; + &.up { + rotate: 180deg; + } + &.on { + background-color: #fff; + border-color: #c2d0dd; + background-image: url(../../public/static/images/canvas/estiment_arr_color.svg); + } +} +.estimate-check-wrap { + .estimate-check-inner { + display: block; + } + &.hide { + border-bottom: 1px solid #ecf0f4; + margin-bottom: 15px; + .estimate-check-inner { + display: none; + } + } +} + +.special-note-check-wrap { + display: grid; + grid-template-columns: repeat(5, 1fr); + border-radius: 3px; + margin-bottom: 30px; + .special-note-check-item { + padding: 14px 10px; + border: 1px solid #ecf0f4; + margin-top: -1px; + margin-right: -1px; + &.act { + background-color: #f7f9fa; + } + } +} + +.calculation-estimate { + border: 1px solid #ecf0f4; + border-radius: 3px; + padding: 24px; + max-height: 350px; + overflow-y: auto; + margin-bottom: 30px; + dl { + margin-bottom: 35px; + &:last-child { + margin-bottom: 0; + } + dt { + font-size: 13px; + font-weight: 600; + color: #1083e3; + margin-bottom: 15px; + } + dd { + font-size: 12px; + font-weight: 400; + color: #45576f; + margin-bottom: 8px; + &:last-child { + margin-bottom: 0; + } + } + } + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #d9dee2; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } +} +.esimate-wrap { + margin-bottom: 20px; +} + +.estimate-product-option { + display: flex; + align-items: center; + margin-bottom: 15px; + .product-price-wrap { + display: flex; + align-items: center; + .product-price-tit { + font-size: 13px; + font-weight: 400; + color: #45576f; + margin-right: 10px; + } + .select-wrap { + width: 110px; + } + } + .product-edit-wrap { + display: flex; + align-items: center; + margin-left: auto; + .product-edit-explane { + display: flex; + align-items: center; + margin-right: 15px; + .explane-item { + position: relative; + display: flex; + align-items: center; + padding: 0 10px; + font-size: 12px; + font-weight: 400; + span { + width: 20px; + height: 20px; + margin-right: 5px; + background-size: cover; + background-repeat: no-repeat; + background-position: center; + } + &:before { + content: ''; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + width: 1px; + height: 12px; + background-color: #d9d9d9; + } + &:first-child { + padding-left: 0; + &::before { + display: none; + } + } + &:last-child { + padding-right: 0; + } + &.item01 { + color: #3bbb48; + span { + background-image: url(../../public/static/images/sub/open_ico.svg); + } + } + &.item02 { + color: #909000; + span { + background-image: url(../../public/static/images/sub/change_ico.svg); + } + } + &.item03 { + color: #0191c9; + span { + background-image: url(../../public/static/images/sub/attachment_ico.svg); + } + } + &.item04 { + color: #f16a6a; + span { + background-image: url(../../public/static/images/sub/click_check_ico.svg); + } + } + } + } + .product-edit-btn { + display: flex; + align-items: center; + button { + display: flex; + align-items: center; + span { + width: 13px; + height: 13px; + margin-right: 5px; + background-size: cover; + &.plus { + background: url(../../public/static/images/sub/plus_btn.svg) no-repeat center; + } + &.minus { + background: url(../../public/static/images/sub/minus_btn.svg) no-repeat center; + } + } + } + } + } +} + +// 발전시물레이션 +.chart-wrap { + display: flex; + gap: 20px; + width: 100%; + .sub-table-box { + height: 100%; + } + .chart-inner { + flex: 1; + .chart-box { + margin-bottom: 30px; + } + } + .chart-table-wrap { + display: flex; + flex-direction: column; + flex: none; + width: 650px; + .sub-table-box { + flex: 1; + &:first-child { + margin-bottom: 20px; + } + } + } +} + +.chart-month-table { + table { + table-layout: fixed; + border-collapse: collapse; + border: 1px solid #ecf0f4; + border-radius: 4px; + thead { + th { + padding: 4.5px 0; + border-bottom: 1px solid #ecf0f4; + text-align: center; + font-size: 13px; + color: #45576f; + font-weight: 500; + background-color: #f8f9fa; + } + } + tbody { + td { + font-size: 13px; + color: #45576f; + text-align: center; + padding: 4.5px 0; + } + } + } +} + +.simulation-guide-wrap { + display: flex; + padding: 20px; + .simulation-tit-wrap { + flex: none; + padding-right: 40px; + border-right: 1px solid #eeeeee; + span { + display: block; + position: relative; + padding-left: 60px; + font-size: 15px; + color: #14324f; + font-weight: 600; + &::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + width: 40px; + height: 40px; + background: url(../../public/static/images/sub/simulation_guide.svg) no-repeat center; + background-size: cover; + } + } + } + .simulation-guide-box { + flex: 1; + padding-left: 40px; + dl { + margin-bottom: 25px; + dt { + font-size: 13px; + color: #101010; + font-weight: 600; + margin-bottom: 5px; + } + dd { + font-size: 12px; + color: #45576f; + font-weight: 400; + line-height: 24px; + } + &:last-child { + margin-bottom: 0; + } + } + ul, + ol { + list-style: unset; + } + } +} + +.module-total { + display: flex; + align-items: center; + background-color: #f8f9fa; + padding: 9px 0; + margin-right: 4px; + border: 1px solid #ecf0f4; + border-top: none; + .total-title { + flex: 1; + text-align: center; + font-size: 13px; + color: #344356; + font-weight: 500; + } + .total-num { + flex: none; + width: 121px; + text-align: center; + font-size: 15px; + color: #344356; + font-weight: 500; + } +} + +// 물건상세 +.information-help-wrap { + display: flex; + padding: 24px; + background-color: #f4f4f4; + border-radius: 4px; + margin-bottom: 15px; + .information-help-tit-wrap { + position: relative; + display: flex; + align-items: center; + padding-right: 40px; + border-right: 1px solid #e0e0e3; + .help-tit-icon { + width: 40px; + height: 40px; + border-radius: 50%; + margin-right: 10px; + background: #fff url(../../public/static/images/sub/information_help.svg) no-repeat center; + background-size: 20px 20px; + } + .help-tit { + font-size: 13px; + font-weight: 600; + color: #45576f; + } + } + .information-help-guide { + padding-left: 40px; + span { + display: block; + font-size: 12px; + font-weight: 400; + color: #45576f; + margin-bottom: 7px; + &:last-child { + margin-bottom: 0; + } + } + } +} + +.community-search-warp { + display: flex; + flex-direction: column; + align-items: center; + padding: 10px 0 30px 0; + border-bottom: 1px solid #e5e5e5; + margin-bottom: 24px; + .community-search-box { + position: relative; + display: flex; + align-items: center; + width: 580px; + height: 45px; + padding: 0 45px 0 20px; + margin-bottom: 20px; + border-radius: 2px; + border: 1px solid #101010; + .community-input { + width: 100%; + height: 100%; + font-size: 13px; + font-weight: 400; + color: #101010; + &::placeholder { + color: #c8c8c8; + } + } + .community-search-ico { + position: absolute; + top: 50%; + right: 20px; + transform: translateY(-50%); + flex: none; + width: 21px; + height: 100%; + background: url(../../public/static/images/sub/community_search.svg) no-repeat center; + background-size: 21px 21px; + z-index: 3; + } + } + .community-search-keyword { + font-size: 13px; + font-weight: 400; + color: #45576f; + span { + font-weight: 600; + color: #f16a6a; + } + } +} + +// 자료 다운로드 +.file-down-list { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 14px; + .file-down-item { + display: flex; + align-items: center; + padding: 24px; + border-radius: 4px; + border: 1px solid #e5e5e5; + background: #fff; + transition: all 0.15s ease-in-out; + .file-item-info { + .item-num { + display: inline-block; + padding: 6px 17.5px; + border-radius: 60px; + background-color: #f4f4f7; + font-size: 13px; + font-weight: 600; + color: #101010; + margin-bottom: 15px; + } + .item-name { + font-size: 16px; + color: #101010; + font-weight: 500; + margin-bottom: 13px; + } + .item-date { + font-size: 13px; + font-weight: 400; + color: #344356; + } + } + .file-down-box { + display: flex; + align-items: center; + flex: none; + margin-left: auto; + height: 100%; + .file-down-btn { + width: 36px; + height: 36px; + background: url(../../public/static/images/sub/file_down_btn.svg) no-repeat center; + background-size: cover; + } + } + &:hover { + background-color: #f4f4f7; + } + } +} + +.file-down-nodata { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 148px; + padding: 24px; + border-radius: 4px; + border: 1px solid #e5e5e5; + font-size: 16px; + font-weight: 500; + color: #344356; } //신규물건 등록 -.product-input-wrap{ - display: flex; - align-items: center; - width: 200px; - height: 30px; - background-color: #FAFAFA; - border: 1px solid #EEE; - padding: 0 10px; - input{ - font-size: 13px; - font-weight: 400; - color: #999999; - padding: 0; - width: 100%; - height: 100%; - flex: 1 ; - background-color: inherit; - } - .product-delete{ - flex: none; - display: block; - width: 15px; - height: 100%; - background: url(../../public/static/images/sub/product-del.svg)no-repeat center; - background-size: 15px 15px; - } +.product-input-wrap { + display: flex; + align-items: center; + width: 200px; + height: 30px; + background-color: #fafafa; + border: 1px solid #eee; + padding: 0 10px; + input { + font-size: 13px; + font-weight: 400; + color: #999999; + padding: 0; + width: 100%; + height: 100%; + flex: 1; + background-color: inherit; + } + .product-delete { + flex: none; + display: block; + width: 15px; + height: 100%; + background: url(../../public/static/images/sub/product-del.svg) no-repeat center; + background-size: 15px 15px; + } } @media screen and (max-width: 1800px) { - .canvas-menu-wrap{ - .canvas-menu-inner{ - .canvas-menu-list{ - .canvas-menu-item button{ - .menu-icon{ - margin-right: 5px; - } - } - .canvas-menu-item{ - button{ - padding: 15px 15px; - font-size: 11px; - } - } - } + .canvas-menu-wrap { + .canvas-menu-inner { + .canvas-menu-list { + .canvas-menu-item button { + .menu-icon { + margin-right: 5px; + } } - .canvas-depth2-wrap{ - .canvas-depth2-inner{ - .canvas-depth2-list{ - .canvas-depth2-item{ - button{ - font-size: 11px; - } - } - } - } + .canvas-menu-item { + button { + padding: 15px 15px; + font-size: 11px; + } } - } + } + } + .canvas-depth2-wrap { + .canvas-depth2-inner { + .canvas-depth2-list { + .canvas-depth2-item { + button { + font-size: 11px; + } + } + } + } + } + } } @media screen and (max-width: 1600px) { - .canvas-menu-wrap{ - .canvas-menu-inner{ - .canvas-menu-list{ - .canvas-menu-item button{ - .menu-icon{ - display: none; - } - } - } + .canvas-menu-wrap { + .canvas-menu-inner { + .canvas-menu-list { + .canvas-menu-item button { + .menu-icon { + display: none; + } } - } - .canvas-content{ - .canvas-frame{ - height: calc(100vh - 129.5px); - } - &.active{ - .canvas-frame{ - height: calc(100vh - 179.5px); - } - } - } + } + } + } + .canvas-content { + .canvas-frame { + height: calc(100vh - 129.5px); + } + &.active { + .canvas-frame { + height: calc(100vh - 179.5px); + } + } + } } @media screen and (max-width: 1500px) { - .canvas-menu-wrap{ - .canvas-menu-inner{ - .canvas-menu-list{ - .canvas-menu-item{ - button{ - padding: 15px 10px; - font-size: 10px; - } - } - } - .canvas-side-btn-wrap{ - .btn-from{ - gap: 3px; - } - .vertical-horizontal{ - margin-right: 3px; - min-width: 150px; - } - .select-box{ - width: 100px; - margin: 0 3px; - } - .size-control{ - width: 90px; - margin: 0 3px; - } - } + .canvas-menu-wrap { + .canvas-menu-inner { + .canvas-menu-list { + .canvas-menu-item { + button { + padding: 15px 10px; + font-size: 10px; + } } + } + .canvas-side-btn-wrap { + .btn-from { + gap: 3px; + } + .vertical-horizontal { + margin-right: 3px; + min-width: 150px; + } + .select-box { + width: 100px; + margin: 0 3px; + } + .size-control { + width: 90px; + margin: 0 3px; + } + } } - .sub-header{ - .sub-header-inner{ - .sub-header-title{ - font-size: 15px; + } + .sub-header { + .sub-header-inner { + .sub-header-title { + font-size: 15px; + } + .sub-header-title-wrap { + .title-item { + a { + .icon { + width: 20px; + height: 20px; } - .sub-header-title-wrap{ - .title-item{ - a{ - .icon{ - width: 20px; - height: 20px; - } - } - } - } - } - } - + } + } + } + } + } } diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index 01b47c47..2914875d 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -4,1910 +4,2128 @@ $pop-bold-weight: 500; $pop-normal-size: 12px; $alert-color: #101010; -@keyframes mountpop{ - from{opacity: 0; scale: 0.95;} - to{opacity: 1; scale: 1;} +@keyframes mountpop { + from { + opacity: 0; + scale: 0.95; + } + to { + opacity: 1; + scale: 1; + } } -@keyframes unmountpop{ - from{opacity: 1; scale: 1;} - to{opacity: 0; scale: 0.95;} +@keyframes unmountpop { + from { + opacity: 1; + scale: 1; + } + to { + opacity: 0; + scale: 0.95; + } } -.normal-font{ - font-size: 12px; - font-weight: 400; - color: #fff; +.normal-font { + font-size: 12px; + font-weight: 400; + color: #fff; } -.bold-font{ - font-size: 12px; - font-weight: 500; - color: #fff; +.bold-font { + font-size: 12px; + font-weight: 500; + color: #fff; } -.modal-pop-wrap{ - position: fixed; - top: 0; - left: 0; - width: 100%; - height: -webkit-fit-content; - height: -moz-fit-content; - height: fit-content; - border: 1px solid #000; - border-radius: 4px; - background-color: #272727; - z-index: 9999999; - &.xsm{ - width: 200px; +.modal-pop-wrap { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: -webkit-fit-content; + height: -moz-fit-content; + height: fit-content; + border: 1px solid #000; + border-radius: 4px; + background-color: #272727; + z-index: 9999999; + &.xsm { + width: 200px; + } + &.xxxm { + width: 240px; + } + &.xxm { + width: 270px; + } + &.xm { + width: 300px; + } + &.ssm { + width: 380px; + } + &.sm { + width: 580px; + } + &.r { + width: 400px; + } + &.lr { + width: 440px; + } + &.lr-2 { + width: 450px; + } + &.lrr { + width: 480px; + } + &.ml { + width: 530px; + } + &.l-2 { + width: 640px; + } + &.lx-2 { + width: 740px; + } + &.lx { + width: 770px; + } + &.l { + width: 800px; + } + &.mount { + animation: mountpop 0.17s ease-in-out forwards; + } + &.unmount { + animation: unmountpop 0.17s ease-in-out forwards; + } + &.alert { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: transparent; + border: none; + .modal-head { + background-color: transparent; + padding: 0 0 8px; + .modal-close { + width: 20px; + height: 20px; + background: url(../../public/static/images/canvas/alert_close.svg) no-repeat center; + } } - &.xxxm{ - width: 240px; - } - &.xxm{ - width: 270px; - } - &.xm{ - width: 300px; - } - &.ssm{ - width: 380px; - } - &.sm{ - width: 580px; - } - &.r{ - width: 400px; - } - &.lr{ - width: 440px; - } - &.lr-2{ - width: 450px; - } - &.lrr{ - width: 480px; - } - &.ml{ - width: 530px; - } - &.l-2{ - width: 640px; - } - &.lx-2{ - width: 740px; - } - &.lx{ - width: 770px; - } - &.l{ - width: 800px; - } - &.mount{ - animation: mountpop .17s ease-in-out forwards; - } - &.unmount{ - animation: unmountpop .17s ease-in-out forwards; - } - &.alert{ - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: transparent; - border: none; - .modal-head{ - background-color: transparent; - padding: 0 0 8px; - .modal-close{ - width: 20px; - height: 20px; - background: url(../../public/static/images/canvas/alert_close.svg)no-repeat center; - } - } - .modal-body{ - background-color: #fff; - padding: 22px; - border-radius: 4px; - border: 1px solid #101010; - color: $alert-color; - .alert-title{ - font-size: 13px; - font-weight: 700; - color: $alert-color; - margin-bottom: 15px; - } - } - } -} -.modal-head{ - display: flex; - align-items: center; - padding: 10px 24px; - background-color: #000; - // overflow: hidden; - h1.title{ + .modal-body { + background-color: #fff; + padding: 22px; + border-radius: 4px; + border: 1px solid #101010; + color: $alert-color; + .alert-title { font-size: 13px; - color: $pop-color; font-weight: 700; - } - .modal-close{ - margin-left: auto; - color: transparent; - font-size: 0; - width: 10px; - height: 10px; - background: url(../../public/static/images/canvas/modal_close.svg)no-repeat center; - } -} -.modal-body{ - padding: 24px; - .modal-btn-wrap{ - display: flex; - align-items: center; - gap: 5px; - button{ - flex: 1; - } - &.sub{ - button{ - flex: 1 1 auto; - padding: 0; - } - margin-bottom: 14px; - } - } - .modal-check-btn-wrap{ - margin-top: 15px; - .check-wrap-title{ - font-size: $pop-normal-size; - color: $pop-color; - font-weight: 600; - &.light{ - font-weight: $pop-normal-weight; - } - } - .flex-check-box{ - display: flex; - flex-wrap: wrap; - gap: 10px; - margin-top: 15px; - &.for2{ - justify-content: flex-end; - button{ - width: calc(50% - 5px); - } - &.btn{ - gap: 5px; - button{ - width: calc(50% - 2.5px); - } - } - } - &.for-line{ - button{ - flex: 1; - } - } - } - } - .outer-line-wrap{ - border-top: 1px solid #3C3C3C; - margin-top: 10px; - padding-top: 15px; - margin-bottom: 15px; - > div{ - margin-bottom: 15px; - &:last-child{ - margin-bottom: 0; - } - } - } - .modal-guide{ - display: block; - font-size: $pop-normal-size; color: $alert-color; - font-weight: $pop-normal-weight; + margin-bottom: 15px; + } } + } } - -.adsorption-point{ +.modal-head { + display: flex; + align-items: center; + padding: 10px 24px; + background-color: #000; + // overflow: hidden; + h1.title { + font-size: 13px; + color: $pop-color; + font-weight: 700; + } + .modal-close { + margin-left: auto; + color: transparent; + font-size: 0; + width: 10px; + height: 10px; + background: url(../../public/static/images/canvas/modal_close.svg) no-repeat center; + } +} +.modal-body { + padding: 24px; + .modal-btn-wrap { display: flex; align-items: center; - background-color: #3A3A3A; - border-radius: 3px; - padding-left: 11px; - overflow: hidden; - transition: all 0.17s ease-in-out; - span{ - font-size: $pop-normal-size; - color: #898989; + gap: 5px; + button { + flex: 1; } - i{ - display: flex; - align-items: center; - padding: 0 7px; - margin-left: auto; - height: 100%; - font-size: 13px; - color: #898989; + &.sub { + button { + flex: 1 1 auto; + padding: 0; + } + margin-bottom: 14px; } - &.act{ - i{ - color: $pop-color; - background-color: #1083E3; + } + .modal-check-btn-wrap { + margin-top: 15px; + .check-wrap-title { + font-size: $pop-normal-size; + color: $pop-color; + font-weight: 600; + &.light { + font-weight: $pop-normal-weight; + } + } + .flex-check-box { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 15px; + &.for2 { + justify-content: flex-end; + button { + width: calc(50% - 5px); } + &.btn { + gap: 5px; + button { + width: calc(50% - 2.5px); + } + } + } + &.for-line { + button { + flex: 1; + } + } } + } + .outer-line-wrap { + border-top: 1px solid #3c3c3c; + margin-top: 10px; + padding-top: 15px; + margin-bottom: 15px; + > div { + margin-bottom: 15px; + &:last-child { + margin-bottom: 0; + } + } + } + .modal-guide { + display: block; + font-size: $pop-normal-size; + color: $alert-color; + font-weight: $pop-normal-weight; + } +} + +.adsorption-point { + display: flex; + align-items: center; + background-color: #3a3a3a; + border-radius: 3px; + padding-left: 11px; + overflow: hidden; + transition: all 0.17s ease-in-out; + span { + font-size: $pop-normal-size; + color: #898989; + } + i { + display: flex; + align-items: center; + padding: 0 7px; + margin-left: auto; + height: 100%; + font-size: 13px; + color: #898989; + } + &.act { + i { + color: $pop-color; + background-color: #1083e3; + } + } } // grid-option -.grid-check-form{ +.grid-check-form { + display: flex; + align-items: center; + gap: 15px; + padding-bottom: 15px; + &.border { + border-bottom: 1px solid #424242; + } +} +.grid-option-wrap { + .grid-option-box { display: flex; align-items: center; - gap: 15px; - padding-bottom: 15px; - &.border{ - border-bottom: 1px solid #424242; + background-color: transparent; + border: 1px solid #3d3d3d; + border-radius: 2px; + padding: 15px 10px; + gap: 20px; + margin-bottom: 10px; + .grid-input-form { + display: flex; + align-items: center; + span { + flex: none; + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-bold-weight; + } + .input-grid { + width: 54px; + input { + width: 100%; + } + } } + &:last-child { + margin-bottom: 0; + } + } } -.grid-option-wrap{ - .grid-option-box{ - display: flex; - align-items: center; - background-color: transparent; - border: 1px solid #3D3D3D; - border-radius: 2px; - padding: 15px 10px; - gap: 20px; - margin-bottom: 10px; - .grid-input-form{ - display: flex; - align-items: center; - span{ - flex: none; - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-bold-weight; - } - .input-grid{ - width: 54px; - input{ - width: 100%; - } - } - } - &:last-child{ - margin-bottom: 0; - } - } +.select-form { + .sort-select { + width: 100%; + } } -.select-form{ - .sort-select{width: 100%;} +.grid-select { + flex: 1; + &.no-flx { + flex: unset; + } + .sort-select { + width: 100%; + background-color: #313131; + min-width: auto; + font-size: 12px; + border: none; + p { + font-size: 12px; + } + > ul { + border: none; + } + } + &.right { + p { + text-align: right; + } + ul { + li { + justify-content: flex-end; + } + } + } } -.grid-select{ - flex: 1; - &.no-flx{ - flex: unset; - } - .sort-select{ - width: 100%; - background-color: #313131; - min-width: auto; - font-size: 12px; - border: none; - p{ - font-size: 12px; - } - > ul{ - border: none; - } - } - &.right{ - p{ - text-align: right; - } - ul{ - li{ - justify-content: flex-end; - } - } - } -} -.grid-btn-wrap{ - padding-top: 15px; - text-align: right; - button{ - padding: 0 10px; - } +.grid-btn-wrap { + padding-top: 15px; + text-align: right; + button { + padding: 0 10px; + } } // grid copy -.grid-option-tit{ - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-normal-weight; - padding-bottom: 15px; - +.grid-option-tit { + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-normal-weight; + padding-bottom: 15px; } -.grid-direction{ - display: flex; - align-items: center; - gap: 5px; - flex: 1; +.grid-direction { + display: flex; + align-items: center; + gap: 5px; + flex: 1; } -.direction{ - width: 22px; - height: 22px; - background-color: #757575; - background-image: url(../../public/static/images/canvas/grid_option_arr.svg); - background-repeat: no-repeat; - background-position: center; - background-size: 16px 15px; - border-radius: 50%; - transition: all .15s ease-in-out; - opacity: 0.6; - &.down{transform: rotate(180deg);} - &.left{transform: rotate(-90deg);} - &.right{transform: rotate(90deg);} - &:hover, - &.act{ - opacity: 1; - } +.direction { + width: 22px; + height: 22px; + background-color: #757575; + background-image: url(../../public/static/images/canvas/grid_option_arr.svg); + background-repeat: no-repeat; + background-position: center; + background-size: 16px 15px; + border-radius: 50%; + transition: all 0.15s ease-in-out; + opacity: 0.6; + &.down { + transform: rotate(180deg); + } + &.left { + transform: rotate(-90deg); + } + &.right { + transform: rotate(90deg); + } + &:hover, + &.act { + opacity: 1; + } } // grid-move -.move-form{ - width: 100%; - p{ - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-bold-weight; - } +.move-form { + width: 100%; + p { + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-bold-weight; + } } -.input-move-wrap{ - display: flex; - align-items: center; - gap: 5px; - span{ - color: $pop-color; - font-size: $pop-normal-size; - } - .input-move{ - width: 130px; - input{ - width: 100%; - } +.input-move-wrap { + display: flex; + align-items: center; + gap: 5px; + span { + color: $pop-color; + font-size: $pop-normal-size; + } + .input-move { + width: 130px; + input { + width: 100%; } + } } -.direction-move-wrap{ - flex: none; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 5px; - margin-left: auto; +.direction-move-wrap { + flex: none; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 5px; + margin-left: auto; } // 배치면 초기 설정 -.placement-table{ - table{ - table-layout: fixed; - tr{ - th{ - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-bold-weight; - padding: 18px 0; - border-bottom: 1px solid #424242; - vertical-align: middle; - .tip-wrap{ - display: flex; - align-items: center; - } - } - td{ - font-size: $pop-normal-size; - color: $pop-color; - border-bottom: 1px solid #424242; - padding: 18px 0 18px 20px; - vertical-align: middle; - .flex-box{ - display: flex; - align-items: center; - height: 100%; - } - } - &:first-child{ - td, - th{ - padding-top: 0; - } - } - } - } - .tooltip{ - position: relative; - display: block; - width: 15px; - height: 15px; - margin-left: 5px; - background: url(../../public/static/images/canvas/pop_tip.svg)no-repeat center; - background-size: cover; - } - &.light{ - padding: 0; - th,td{ - color: $alert-color; - border-bottom: none; - border-top: 1px solid #EFEFEF; - } - th{ - padding: 14px 0; - } - tr{ - &:first-child{ - td, - th{ - padding-top: 14px; - } - } - &:last-child{ - td, - th{ - padding-bottom: 0px; - } - } - } - } -} - -.pop-form-radio{ - display: flex; - align-items: center; - gap: 10px; -} -.placement-option{ - display: flex; - align-items: center; - gap: 20px; -} -.select-wrap{ - .sort-select{ - width: 100%; - } -} -.flex-ment{ - display: flex; - align-items: center; - gap: 5px; - span{ +.placement-table { + table { + table-layout: fixed; + tr { + th { font-size: $pop-normal-size; color: $pop-color; - font-weight: $pop-normal-weight; + font-weight: $pop-bold-weight; + padding: 18px 0; + border-bottom: 1px solid #424242; + vertical-align: middle; + .tip-wrap { + display: flex; + align-items: center; + } + } + td { + font-size: $pop-normal-size; + color: $pop-color; + border-bottom: 1px solid #424242; + padding: 18px 0 18px 20px; + vertical-align: middle; + .flex-box { + display: flex; + align-items: center; + } + } + &:first-child { + td, + th { + padding-top: 0; + } + } } - + } + .tooltip { + position: relative; + display: block; + width: 15px; + height: 15px; + margin-left: 5px; + background: url(../../public/static/images/canvas/pop_tip.svg) no-repeat center; + background-size: cover; + } + &.light { + padding: 0; + th, + td { + color: $alert-color; + border-bottom: none; + border-top: 1px solid #efefef; + } + th { + padding: 14px 0; + } + tr { + &:first-child { + td, + th { + padding-top: 14px; + } + } + &:last-child { + td, + th { + padding-bottom: 0px; + } + } + } + } } -.img-edit-wrap{ - flex: none; - .img-edit-btn{ - display: flex; - align-items: center; - height: 30px; - padding: 0 10px; - font-size: 12px; - font-weight: 400; - color: #101010; - background-color: #fff; - border-radius: 2px; - cursor: pointer; - transition: all .15s ease-in-out; - .img-edit{ - width: 16px; - height: 16px; - background: url(../../public/static/images/canvas/img_edit_ico.svg)no-repeat center; - background-size: cover; - margin-right: 5px; - } - &:hover{ - background-color: #ebebeb; - } - } +.pop-form-radio { + display: flex; + align-items: center; + gap: 10px; } -.img-name-wrap{ +.placement-option { + display: flex; + align-items: center; + gap: 20px; +} +.select-wrap { + .sort-select { + width: 100%; + } +} +.flex-ment { + display: flex; + align-items: center; + gap: 5px; + span { + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-normal-weight; + } +} + +.img-edit-wrap { + flex: none; + .img-edit-btn { display: flex; align-items: center; - width: 100%; - margin-left: 10px; - input{ - flex: 1; - + height: 30px; + padding: 0 10px; + font-size: 12px; + font-weight: 400; + color: #101010; + background-color: #fff; + border-radius: 2px; + cursor: pointer; + transition: all 0.15s ease-in-out; + .img-edit { + width: 16px; + height: 16px; + background: url(../../public/static/images/canvas/img_edit_ico.svg) no-repeat center; + background-size: cover; + margin-right: 5px; } - .img-check{ - flex: none; - width: 18px; - height: 18px; - margin-left: 5px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - background-image: url(../../public/static/images/canvas/img_check_fail.svg); + &:hover { + background-color: #ebebeb; } + } +} +.img-name-wrap { + display: flex; + align-items: center; + width: 100%; + margin-left: 10px; + input { + flex: 1; + } + .img-check { + flex: none; + width: 18px; + height: 18px; + margin-left: 5px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + background-image: url(../../public/static/images/canvas/img_check_fail.svg); + } } -.for-address{ - input{ - flex: 1; +.for-address { + input { + flex: 1; + } + .check-address { + flex: none; + width: 18px; + height: 18px; + margin-left: 5px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + &.fail { + background-image: url(../../public/static/images/canvas/img_check_fail.svg); } - .check-address{ - flex: none; - width: 18px; - height: 18px; - margin-left: 5px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - &.fail{background-image: url(../../public/static/images/canvas/img_check_fail.svg);} - &.success{background-image: url(../../public/static/images/canvas/img_check_success.svg);} + &.success { + background-image: url(../../public/static/images/canvas/img_check_success.svg); } + } } // 외벽선 그리기 -.outline-wrap{ - padding: 24px 0; - border-top: 1px solid #424242; - - .outline-inner{ - display: flex; - align-items: center; - margin-bottom: 14px; - &:last-child{ - margin-bottom: 0; - } - .outline-form{ - // width: 50%; - margin-right: 15px; - } - } - &:last-child{ - border-bottom: 1px solid #424242; - } -} -.outline-form{ +.outline-wrap { + padding: 24px 0; + border-top: 1px solid #424242; + + .outline-inner { display: flex; align-items: center; - - span{ - width: 60px; - flex: none; - font-size: $pop-normal-size; - font-weight: $pop-bold-weight; - color: $pop-color; - margin-right: 10px; - &.thin{ - width: auto; - font-weight: $pop-normal-weight; - margin-right: 0; - } + margin-bottom: 14px; + &:last-child { + margin-bottom: 0; } + .outline-form { + // width: 50%; + margin-right: 15px; + } + } + &:last-child { + border-bottom: 1px solid #424242; + } +} +.outline-form { + display: flex; + align-items: center; - .reset-btn{ - flex: none; - width: 30px; - height: 30px; - background: transparent; - border: 1px solid #484848; - border-radius: 2px; - margin-left: 5px; - background-image: url(../../public/static/images/canvas/reset_ico.svg); - background-repeat: no-repeat; - background-size: 12px 12px; - background-position: center; - } - &:last-child{ - margin-right: 0; + span { + width: 60px; + flex: none; + font-size: $pop-normal-size; + font-weight: $pop-bold-weight; + color: $pop-color; + margin-right: 10px; + &.thin { + width: auto; + font-weight: $pop-normal-weight; + margin-right: 0; } + } + + .reset-btn { + flex: none; + width: 30px; + height: 30px; + background: transparent; + border: 1px solid #484848; + border-radius: 2px; + margin-left: 5px; + background-image: url(../../public/static/images/canvas/reset_ico.svg); + background-repeat: no-repeat; + background-size: 12px 12px; + background-position: center; + } + &:last-child { + margin-right: 0; + } } -.cul-wrap{ +.cul-wrap { + display: flex; + .outline-box { + width: 50%; + margin-right: 15px; + .outline-form { + width: 100%; + margin-bottom: 14px; + margin-right: 0; + &:last-child { + margin-bottom: 0; + } + } + } + .cul-box { display: flex; - .outline-box{ - width: 50%; - margin-right: 15px; - .outline-form{ - width: 100%; - margin-bottom: 14px; - margin-right: 0; - &:last-child{ - margin-bottom: 0; - } - } - } - .cul-box{ - display: flex; - align-items: center; - justify-content: center; - width: 50%; - background-color: #3D3D3D; - border-radius: 2px ; - } + align-items: center; + justify-content: center; + width: 50%; + background-color: #3d3d3d; + border-radius: 2px; + } } // 외벽선 속성 설정 -.properties-guide{ - font-size: $pop-normal-size; - color: #AAA; - font-weight: $pop-normal-weight; - margin-bottom: 14px; +.properties-guide { + font-size: $pop-normal-size; + color: #aaa; + font-weight: $pop-normal-weight; + margin-bottom: 14px; } -.setting-tit{ - font-size: 13px; - color: $pop-color; - font-weight: $pop-bold-weight; - margin-bottom: 10px; +.setting-tit { + font-size: 13px; + color: $pop-color; + font-weight: $pop-bold-weight; + margin-bottom: 10px; } -.properties-setting-wrap{ - &.outer{ - margin-top: 24px; - } - .setting-btn-wrap{ - display: flex; - align-items: center; - padding: 14px 0; - border-top: 1px solid #424242; - border-bottom: 1px solid #424242; - .setting-btn{ - display: block; - width: 100%; - height: 40px; - font-size: 13px; - color: #fff; - font-weight: 700; - border-radius: 2px; - transition: all .15s ease-in-out; - &.green{ - background-color: #305941; - border: 1px solid #45CD7D; - &:hover{ - background-color: #3a6b4e; - } - } - &.blue{ - background-color: #2E5360; - border: 1px solid #3FBAE6; - &:hover{ - background-color: #365f6e; - } - } - } - } -} - -// 지붕형상 설정 -.roof-shape-menu{ - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; - grid-template-rows: 1fr 1fr; - gap: 24px 10px; - margin-bottom: 24px; - .shape-box{ - display: flex; - align-items: center; - justify-content: center; - width: 100%; - padding: 13px; - background-color: #3D3D3D; - transition: background .15s ease-in-out; - img{ - max-width: 100%; - } - } - .shape-title{ - font-size: $pop-normal-size; - font-weight: $pop-bold-weight; - color: $pop-color; - margin-top: 10px; - text-align: center; - transition: color .15s ease-in-out; - } - .shape-menu-box{ - &.act, - &:hover{ - .shape-box{background-color: #008BFF;} - .shape-title{color: #008BFF;} - } - } -} - -.setting-box{ +.properties-setting-wrap { + &.outer { + margin-top: 24px; + } + .setting-btn-wrap { + display: flex; + align-items: center; padding: 14px 0; border-top: 1px solid #424242; border-bottom: 1px solid #424242; -} -.padding-form{ - padding-left: 23px; -} -.discrimination-box{ - padding: 16px 12px; - border: 1px solid #3D3D3D; - border-radius: 2px; + .setting-btn { + display: block; + width: 100%; + height: 40px; + font-size: 13px; + color: #fff; + font-weight: 700; + border-radius: 2px; + transition: all 0.15s ease-in-out; + &.green { + background-color: #305941; + border: 1px solid #45cd7d; + &:hover { + background-color: #3a6b4e; + } + } + &.blue { + background-color: #2e5360; + border: 1px solid #3fbae6; + &:hover { + background-color: #365f6e; + } + } + } + } } -.modal-bottom-border-bx{ - margin-top: 24px; - padding-bottom: 14px; - border-bottom: 1px solid #424242; +// 지붕형상 설정 +.roof-shape-menu { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 24px 10px; + margin-bottom: 24px; + .shape-box { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + padding: 13px; + background-color: #3d3d3d; + transition: background 0.15s ease-in-out; + img { + max-width: 100%; + } + } + .shape-title { + font-size: $pop-normal-size; + font-weight: $pop-bold-weight; + color: $pop-color; + margin-top: 10px; + text-align: center; + transition: color 0.15s ease-in-out; + } + .shape-menu-box { + &.act, + &:hover { + .shape-box { + background-color: #008bff; + } + .shape-title { + color: #008bff; + } + } + } +} + +.setting-box { + padding: 14px 0; + border-top: 1px solid #424242; + border-bottom: 1px solid #424242; +} +.padding-form { + padding-left: 23px; +} +.discrimination-box { + padding: 16px 12px; + border: 1px solid #3d3d3d; + border-radius: 2px; +} + +.modal-bottom-border-bx { + margin-top: 24px; + padding-bottom: 14px; + border-bottom: 1px solid #424242; } // 처마∙케라바 변경 -.eaves-keraba-table{ - display: table; - border-collapse: collapse; - .eaves-keraba-item{ - display: table-row; - .eaves-keraba-th, - .eaves-keraba-td{ - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-normal-weight; - display: table-cell; - vertical-align: middle; - padding-bottom: 14px; - } - .eaves-keraba-td{ - padding-left: 10px; - } - .eaves-keraba-ico{ - display: flex; - align-items: center; - justify-content: center; - padding: 5px; - background-color: #3D3D3D; - border: 1px solid #3D3D3D; - border-radius: 2px; - cursor: pointer; - &.act{ - border: 1px solid #ED0004; - } - } - &:last-child{ - .eaves-keraba-th, - .eaves-keraba-td{ - padding-bottom: 0; - } - } +.eaves-keraba-table { + display: table; + border-collapse: collapse; + .eaves-keraba-item { + display: table-row; + .eaves-keraba-th, + .eaves-keraba-td { + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-normal-weight; + display: table-cell; + vertical-align: middle; + padding-bottom: 14px; } + .eaves-keraba-td { + padding-left: 10px; + } + .eaves-keraba-ico { + display: flex; + align-items: center; + justify-content: center; + padding: 5px; + background-color: #3d3d3d; + border: 1px solid #3d3d3d; + border-radius: 2px; + cursor: pointer; + &.act { + border: 1px solid #ed0004; + } + } + &:last-child { + .eaves-keraba-th, + .eaves-keraba-td { + padding-bottom: 0; + } + } + } } -.guide{ - font-size: $pop-normal-size; - font-weight: $pop-normal-weight; - color: $pop-color; - margin-bottom: 24px; - &.sm{ - margin-bottom: 15px; - } - span{ - display: block; - } +.guide { + font-size: $pop-normal-size; + font-weight: $pop-normal-weight; + color: $pop-color; + margin-bottom: 24px; + &.sm { + margin-bottom: 15px; + } + span { + display: block; + } } // 지붕면 할당 -.allocation-select-wrap{ +.allocation-select-wrap { + display: flex; + align-items: center; + padding-bottom: 14px; + border-bottom: 1px solid #424242; + margin-bottom: 14px; + span { + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-bold-weight; + margin-right: 10px; + } + .allocation-edit { display: flex; align-items: center; - padding-bottom: 14px; - border-bottom: 1px solid #424242; - margin-bottom: 14px; - span{ - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-bold-weight; - margin-right: 10px; - } - .allocation-edit{ - display: flex; - align-items: center; - height: 30px; - padding: 0 10px; - margin-left: 5px; - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-normal-weight; - border: 1px solid #484848; - background-color: #323234; - i{ - display: block; - width: 12px; - height: 12px; - margin-right: 5px; - background: url(../../public/static/images/canvas/allocation_edit.svg)no-repeat center; - background-size: cover; - } + height: 30px; + padding: 0 10px; + margin-left: 5px; + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-normal-weight; + border: 1px solid #484848; + background-color: #323234; + i { + display: block; + width: 12px; + height: 12px; + margin-right: 5px; + background: url(../../public/static/images/canvas/allocation_edit.svg) no-repeat center; + background-size: cover; } + } } -.block-box{ - display: flex; - align-items: center; +.block-box { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 10px; + .flex-ment { gap: 10px; - margin-bottom: 10px; - .flex-ment{ - gap: 10px; - .dec{ - text-decoration: underline; - } - .delete{ - display: block; - width: 15px; - height: 15px; - background: url(../../public/static/images/canvas/allocation_delete.svg)no-repeat center; - background-size: cover; - } + .dec { + text-decoration: underline; } - &:last-child{ - margin-bottom: 0; + .delete { + display: block; + width: 15px; + height: 15px; + background: url(../../public/static/images/canvas/allocation_delete.svg) no-repeat center; + background-size: cover; } + } + &:last-child { + margin-bottom: 0; + } } -.icon-btn-wrap{ - flex: 1; +.icon-btn-wrap { + flex: 1; + display: flex; + align-items: center; + gap: 5px; + button { display: flex; align-items: center; - gap: 5px; - button{ - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 30px; - font-size: $pop-normal-size; - font-weight: $pop-normal-weight; - color: $pop-color; - border: 1px solid #646464; - border-radius: 2px; - padding: 0 10px; - transition: all .15s ease-in-out; - i{ - height: 15px; - display: block; - margin-left: 10px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - transition: all .15s ease-in-out; - &.allocation01{ - background-image: url(../../public/static/images/canvas/allocation_icon01_white.svg); - width: 15px; - } - &.allocation02{ - background-image: url(../../public/static/images/canvas/allocation_icon02_white.svg); - width: 18px; - } - } - &.act, - &:hover{ - color: #101010; - border: 1px solid #101010; - background-color: #fff; - i{ - &.allocation01{ - background-image: url(../../public/static/images/canvas/allocation_icon01_black.svg); - } - &.allocation02{ - background-image: url(../../public/static/images/canvas/allocation_icon02_black.svg); - } - } - } - } -} - -// 경사설정 -.slope-wrap{ - padding-bottom: 24px; - border-bottom: 1px solid #424242; -} - -// 면형상 배치 -.plane-frame-wrap{ - display: flex; - gap: 10px; - .plane-shape-wrap{ - flex: none; - width: 73px; - } -} - -.plane-shape-menu{ - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 5px; - .shape-menu-box{ - border-radius: 2px; - width: 34px; - height: 34px; - background-color: #373737; - border: 1px solid #676767; - transition: background .15s ease-in-out, border .15s ease-in-out; - .shape-box{ - display: flex; - justify-content: center; - align-items: center; - position: relative; - width: 100%; - height: 100%; - border-radius: 2px; - } - &.act, - &:hover{ - border-color: #008BFF; - background-color: #008BFF; - } - } -} - -.shape-library{ - display: flex; - flex-direction: column; - align-items: center; justify-content: center; - gap: 5px; - padding-top: 5px; - .library-btn{ - width: 100%; - height: 34px; - border: 1px solid #6C6C6C; - border-radius: 2px; - background-color: #373737; - background-repeat: no-repeat; - background-position: center; - transition: all .15s ease-in-out; - &.ico01{background-image: url(../../public/static/images/canvas/shape_labrary01.svg); background-size: 19px 18px;} - &.ico02{background-image: url(../../public/static/images/canvas/shape_labrary02.svg); background-size: 15px 20px;} - &.ico03{background-image: url(../../public/static/images/canvas/shape_labrary03.svg); background-size: 19px 16px;} - &:hover{ - border-color: #1083E3; - background-color: #1083E3; - } - } -} - -.plane-detail-wrap{ - display: flex; - flex-direction: column; - flex: 1; -} -.plane-shape-wrapper{ - flex: 1; - display: flex; - flex-direction: column; - gap: 10px; - .plane-box{ - width: 100%; - padding: 10px 18px; - border-radius: 2px; - background-color: #313131; - border: 1px solid #484848; - .plane-box-tit{ - font-size: $pop-normal-size; - font-weight: 600; - color: $pop-color; - margin-bottom: 10px; - } - &.shape-box{ - .shape-box-inner{ - display: flex; - gap:15px; - min-height: 140px; - .shape-img{ - position: relative; - flex: none; - width: 150px; - background-color: #fff; - border-radius: 2px; - img{ - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - } - .shape-data{ - flex: 1; - .eaves-keraba-table{ - .eaves-keraba-item{ - .eaves-keraba-th, - .eaves-keraba-td{ - padding-bottom: 10px; - } - &:last-child{ - .eaves-keraba-th, - .eaves-keraba-td{ - padding-bottom: 0px; - } - } - } - } - } - } - } - &.direction-box{ - flex: 1; - display: flex; - flex-direction: column; - .plane-direction-box{ - flex: 1; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - } - } - } -} -.plane-direction{ - width: 150px; - position: relative; - height: 120px; - span{ - position: absolute; - font-size: 12px; - font-weight: 500; - color: #B1B1B1; - &.top{top: 0; left: 50%; transform: translateX(-50%);} - &.right{top: 50%; right: 0; transform: translateY(-50%);} - &.bottom{bottom: 0; left: 50%; transform: translateX(-50%);} - &.left{top: 50%; left: 0; transform: translateY(-50%);} - } - .plane-btn{ - position: absolute; - width: 28px; - height: 28px; - background-color: #777777; - background-image: url(../../public/static/images/canvas/plane_arr.svg); - background-size: 12px 13px; - background-repeat: no-repeat; - background-position: center; - border-radius: 50%; - transition: all .15s ease-in-out; - &.up{top: 22px; left: 50%; transform: translateX(-50%);} - &.right{top: 50%; right: 32px; transform: translateY(-50%) rotate(90deg);} - &.down{bottom: 22px; left: 50%; transform: translateX(-50%) rotate(180deg);} - &.left{top: 50%; left: 32px; transform: translateY(-50%) rotate(270deg);} - &:hover, - &.act{ - background-color: #fff; - background-image: url(../../public/static/images/canvas/plane_arr_act.svg); - } - } -} - -.plane-tab-guide{ + width: 100%; + height: 30px; font-size: $pop-normal-size; font-weight: $pop-normal-weight; color: $pop-color; - margin-top: 10px; -} -.plane-shape-btn{ - padding-top: 10px; - margin-top: auto; - button{ - display: block; - width: 100%; + border: 1px solid #646464; + border-radius: 2px; + padding: 0 10px; + transition: all 0.15s ease-in-out; + i { + height: 15px; + display: block; + margin-left: 10px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + transition: all 0.15s ease-in-out; + &.allocation01 { + background-image: url(../../public/static/images/canvas/allocation_icon01_white.svg); + width: 15px; + } + &.allocation02 { + background-image: url(../../public/static/images/canvas/allocation_icon02_white.svg); + width: 18px; + } } + &.act, + &:hover { + color: #101010; + border: 1px solid #101010; + background-color: #fff; + i { + &.allocation01 { + background-image: url(../../public/static/images/canvas/allocation_icon01_black.svg); + } + &.allocation02 { + background-image: url(../../public/static/images/canvas/allocation_icon02_black.svg); + } + } + } + } } -// 오브젝트 배치 -.mb-box{ - margin-bottom: 24px; +// 경사설정 +.slope-wrap { + padding-bottom: 24px; + border-bottom: 1px solid #424242; } -.object-direction-wrap{ - display: flex; - align-items: center; - justify-content: center; -} -.discrimination-tit{ - font-size: 13px; - color: #fff; - font-weight: 500; +// 면형상 배치 +.plane-frame-wrap { + display: flex; + gap: 10px; + .plane-shape-wrap { + flex: none; + width: 73px; + } } -.object-size-wrap{ - display: flex; - min-height: 206px; - gap: 24px; - margin-top: 14px; - .object-size-img{ - position: relative; - flex: none; - width: 200px; - background-color: #fff; - img{ +.plane-shape-menu { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 5px; + .shape-menu-box { + border-radius: 2px; + width: 34px; + height: 34px; + background-color: #373737; + border: 1px solid #676767; + transition: + background 0.15s ease-in-out, + border 0.15s ease-in-out; + .shape-box { + display: flex; + justify-content: center; + align-items: center; + position: relative; + width: 100%; + height: 100%; + border-radius: 2px; + } + &.act, + &:hover { + border-color: #008bff; + background-color: #008bff; + } + } +} + +.shape-library { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 5px; + padding-top: 5px; + .library-btn { + width: 100%; + height: 34px; + border: 1px solid #6c6c6c; + border-radius: 2px; + background-color: #373737; + background-repeat: no-repeat; + background-position: center; + transition: all 0.15s ease-in-out; + &.ico01 { + background-image: url(../../public/static/images/canvas/shape_labrary01.svg); + background-size: 19px 18px; + } + &.ico02 { + background-image: url(../../public/static/images/canvas/shape_labrary02.svg); + background-size: 15px 20px; + } + &.ico03 { + background-image: url(../../public/static/images/canvas/shape_labrary03.svg); + background-size: 19px 16px; + } + &:hover { + border-color: #1083e3; + background-color: #1083e3; + } + } +} + +.plane-detail-wrap { + display: flex; + flex-direction: column; + flex: 1; +} +.plane-shape-wrapper { + flex: 1; + display: flex; + flex-direction: column; + gap: 10px; + .plane-box { + width: 100%; + padding: 10px 18px; + border-radius: 2px; + background-color: #313131; + border: 1px solid #484848; + .plane-box-tit { + font-size: $pop-normal-size; + font-weight: 600; + color: $pop-color; + margin-bottom: 10px; + } + &.shape-box { + .shape-box-inner { + display: flex; + gap: 15px; + min-height: 140px; + .shape-img { + position: relative; + flex: none; + width: 150px; + background-color: #fff; + border-radius: 2px; + img { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); + } } - } -} - -// 표시변경 -.display-change-wrap{ - margin: 24px 0; -} -.warning{ - font-size: $pop-normal-size; - font-weight: $pop-normal-weight; - color: #FFAFAF; -} - -// 각 변 속성 변경 -.radio-grid-wrap{ - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 24px 15px; -} - -// 면 흐름 설정 -.drawing-flow-wrap{ - display: flex; - gap: 10px; - .discrimination-box{ - flex: 1; - display: flex; - flex-direction: column; - .object-direction-wrap{ - flex: 1; - } - &:first-child{ - flex: none; - width: 195px; - } - } -} - -.compas-box{ - display: flex; - align-items: center; - justify-content: center; -} -.compas-box-inner { - position: relative; - width: 200px; - height: 200px; - border-radius: 50%; - - .circle { - position: absolute; - width: 12px; - height: 12px; - border: 1px solid #fff; - border-radius: 50%; - top: 95%; - left: 50%; - transform-origin: 0 -90px; /* 중심에서 반지름 거리만큼 떨어져 위치 */ - cursor:pointer; - z-index: 3; - /* 0번을 180도 위치(아래)에, 13번을 0도 위치(위)에 배치 */ - i{ - position: absolute; - top: 12.5px; - left: 50%; - font-size: 11px; - color: #8B8B8B; - font-weight: 500; - -webkit-user-select: none; - -moz-user-select: none; - -ms-use-select: none; - user-select: none; - } - &:nth-child(1) { transform: rotate(180deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(180deg);}} - &:nth-child(2) { transform: rotate(195deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(165deg);}} - &:nth-child(3) { transform: rotate(210deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(150deg);}} - &:nth-child(4) { transform: rotate(225deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(135deg);}} - &:nth-child(5) { transform: rotate(240deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(120deg);}} - &:nth-child(6) { transform: rotate(255deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(105deg);}} - &:nth-child(7) { transform: rotate(270deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(90deg);}} - &:nth-child(8) { transform: rotate(285deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(75deg);}} - &:nth-child(9) { transform: rotate(300deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(60deg);}} - &:nth-child(10) { transform: rotate(315deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(45deg);}} - &:nth-child(11) { transform: rotate(330deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(30deg);}} - &:nth-child(12) { transform: rotate(345deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(15deg);}} - &:nth-child(13) { transform: rotate(0deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(0deg);}} - &:nth-child(14) { transform: rotate(15deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-15deg);}} - &:nth-child(15) { transform: rotate(30deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-30deg);}} - &:nth-child(16) { transform: rotate(45deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-45deg);}} - &:nth-child(17) { transform: rotate(60deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-60deg);}} - &:nth-child(18) { transform: rotate(75deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-75deg);}} - &:nth-child(19) { transform: rotate(90deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-90deg);}} - &:nth-child(20) { transform: rotate(105deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-105deg);}} - &:nth-child(21) { transform: rotate(120deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-120deg);}} - &:nth-child(22) { transform: rotate(135deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-135deg);}} - &:nth-child(23) { transform: rotate(150deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-150deg);}} - &:nth-child(24) { transform: rotate(165deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-165deg);}} - &.act{ - &::after{ - content: ''; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 5px; - height: 5px; - background-color: #fff; - border-radius: 50%; - } - i{ - color: #fff; - } - } - } - .compas{ - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 148px; - height: 148px; - border: 4px solid #fff; - border-radius: 50%; - .compas-arr{ - width: 100%; - height: 100%; - background: url(../../public/static/images/canvas/compas.svg)no-repeat center; - background-size: 122px 122px; - } - } -} - -.draw-flow-wrap{ - margin: 10px 0; -} - -// 지붕모듈선택 -.roof-module-tab{ - display: flex; - align-items: center; - gap: 10px; - margin-bottom: 14px; - .module-tab-bx{ - flex: 1; - height: 34px; - line-height: 31px; - border: 1px solid #484848; - border-radius: 2px; - background-color: transparent; - font-size: 12px; - color: #AAA; - text-align: center; - cursor: default; - transition: all .15s ease-in-out; - &.act{ - background-color: #1083E3; - border: 1px solid #1083E3; - color: #fff; - font-weight: 500; - } - } - .tab-arr{ - display: block; - width: 9px; - height: 14px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - background-image: url(../../public/static/images/canvas/module_tab_arr.svg); - transition: all .15s ease-in-out; - &.act{ - background-image: url(../../public/static/images/canvas/module_tab_arr_white.svg); - } - } -} - -.roof-module-compas{ - margin-bottom: 24px; - .compas-box-inner{ - width: 280px; - height: 253px; - .circle{ - top: 86%; - &:nth-child(1), - &:nth-child(7), - &:nth-child(13), - &:nth-child(19){ - &::before{ - content: ''; - position: absolute; - top: 20px; - left: 50%; - transform: translateX(-50%); - width: 1px; - height: 6px; - background-color: #8B8B8B; + .shape-data { + flex: 1; + .eaves-keraba-table { + .eaves-keraba-item { + .eaves-keraba-th, + .eaves-keraba-td { + padding-bottom: 10px; + } + &:last-child { + .eaves-keraba-th, + .eaves-keraba-td { + padding-bottom: 0px; } + } } - i{ - top: 32px; - } - &.act{ - i{color: #8B8B8B;} - } + } } + } } -} -.center-wrap{ - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; -} - -.module-table-flex-wrap{ - display: flex; - gap: 10px; - .outline-form{ + &.direction-box { + flex: 1; + display: flex; + flex-direction: column; + .plane-direction-box { flex: 1; - } -} - -.module-box-tab{ - display: flex; - .module-btn{ - flex: 1; - border-top: 1px solid #505050; - border-bottom: 1px solid #505050; - border-right: 1px solid #505050; - background-color: #454545; - color: #fff; - height: 30px; - font-size: 12px; - font-weight: 400; - transition: all .15s ease-in-out; - &:first-child{ - border-left: 1px solid #505050; - } - &.act{ - border-color: #fff; - background-color: #fff; - color: #101010; - } - } -} - -.module-table-box{ - flex: 1; - background-color: #3D3D3D; - border-radius: 2px; - .module-table-inner{ - padding: 10px; - .outline-form{ - span{ - width: auto; - } - } - .module-table-tit{ - padding: 10px 0; - font-size: 12px; - color: #fff; - border-bottom: 1px solid #4D4D4D; - } - .eaves-keraba-table{ - width: 100%; - margin-top: 15px; - .eaves-keraba-th{ - width: 72px; - } - .eaves-keraba-th, - .eaves-keraba-td{ - padding-bottom: 5px; - } - } - .self-table-tit{ - font-size: 12px; - font-weight: 500; - color: #fff; - padding-bottom: 15px; - } - } - .warning-guide{ - padding: 20px; - .warning{ - color: #FFCACA; - max-height: 55px; - overflow-y: auto; - padding-right: 30px; - &::-webkit-scrollbar { - width: 4px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background-color: #D9D9D9; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } - } - } -} - -.module-self-table{ - display: table; - border-top: 1px solid #4D4D4D; - border-collapse: collapse; - width: 100%; - .self-table-item{ - display: table-row; - .self-item-td, - .self-item-th{ - display: table-cell; - vertical-align: middle; - border-bottom: 1px solid #4D4D4D; - } - .self-item-th{ - width: 60px; - font-size: 12px; - font-weight: 500; - color: #fff; - } - .self-item-td{ - font-size: 12px; - font-weight: 400; - color: #fff; - padding: 15px 20px; - } - } -} - -.self-table-flx{ - display: flex; - align-items: center; - margin-top: 15px; - button{ - margin-left: auto; - } -} -.hexagonal-wrap{ - .hexagonal-item{ - padding: 15px 0; - border-bottom: 1px solid #4D4D4D; - &:first-child{ - padding-top: 0; - } - &:last-child{ - padding-bottom: 0; - border: none; - } - .hexagonal-flx-auto{ - display: flex; - justify-content: space-between; - } - .hexagonal-flx{ - display: flex; - align-items: center; - button{ - margin-left: auto; - } - } - } -} - -// 회로 및 가대설정 -.circuit-check-inner{ - padding: 5px 0; -} - -.x-scroll-table{ - overflow-x: auto; - padding-bottom: 5px; - .roof-module-table{ - min-width: 1200px; - } - &::-webkit-scrollbar { - height: 4px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background-color: #D9D9D9; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } -} - -.circuit-right-wrap{ - display: flex; - justify-content: flex-end; -} - -.circuit-data-form{ - display: flex; - flex-direction: column; - gap: 5px; - min-height: 60px; - padding: 12px; - border: 1px solid rgba(255, 255, 255, 0.20); - span{ - display: inline-flex; - align-items: center; - .del{ - display: block; - margin-left: 10px; - width: 15px; - height: 15px; - background: url(../../public/static/images/canvas/circuit_del.svg)no-repeat center; - background-size: cover; - } - } -} -.circuit-table-tit{ - color: #fff; - font-size: 12px; - font-weight: 600; - padding: 11px 10px; - background-color: #474747; - border: 1px solid #505050; - border-bottom: none; -} - -.circuit-overflow{ - max-height: 400px; - overflow-y: auto; - margin-bottom: 15px; - &::-webkit-scrollbar { - width: 4px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background-color: #D9D9D9; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } -} - -.circuit-table-flx-wrap{ - display: flex; - gap: 10px; - margin-bottom: 10px; - .circuit-table-flx-box{ - flex: 1; - display: flex; - flex-direction: column; - .bottom-wrap{ - margin-top: auto; - } - .roof-module-table{ - table{ - table-layout: fixed; - } - } - } -} - -.circuit-count-input{ - display: flex; - align-items: center; - gap: 10px; -} - -// 모듈부가기능 -.additional-radio-wrap{ - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 15px 0; - margin-bottom: 24px; -} -.additional-wrap{ - padding: 24px 0; - border-top: 1px solid #424242; -} - -.additional-color-wrap{ - display: flex; - align-items: center; - padding: 5px 0; - gap: 15px; - .additional-color-box{ - display: flex; - align-items: center; - gap: 8px; - .additional-color{ - display: block; - width: 16px; - height: 16px; - &.pink{ - border: 2px solid #ce1c9c; - background-color: #16417D; - } - &.white{ - border: 2px solid #FFF; - background-color: #001027; - } - } - } -} - -// color setting -.color-setting-wrap{ - padding-bottom: 15px; - border-bottom: 1px solid #424242; - .color-tit{ - font-size: 13px; - font-weight: 500; - color: #ffffff; - margin-bottom: 10px; - } - .color-picker{ - .react-colorful{ - width: 100%; - height: auto; - gap: 20px; - .react-colorful__pointer{ - width: 15px; - height: 15px; - border: 4px solid #Fff; - } - .react-colorful__saturation{ - border-radius: 2px; - height: 200px; - border-bottom: 5px solid #000; - } - .react-colorful__last-control{ - border-radius: 2px; - height: 10px; - } - } - .hex-color-box{ - display: flex; - align-items: center; - margin-top: 15px; - .color-box-tit{ - font-size: 12px; - color: #fff; - font-weight: 500; - margin-right: 10px; - } - .color-hex-input{ - width: 150px; - margin-right: 5px; - input{ - width: 100%; - } - } - .color-box{ - display: block; - width: 30px; - height: 30px; - border-radius: 4px; - } - } - .default-color-wrap{ - margin-top: 25px; - .default-tit{ - font-size: 12px; - font-weight: 500; - color: #fff; - margin-bottom: 10px; - } - .color-button-wrap{ - display: grid; - grid-template-columns: repeat(8, 1fr); - gap: 21px; - .default-color{ - display: block; - width: 100%; - height: 30px; - border-radius: 4px; - } - } - } - } -} - -// 글꼴 설정 팝업 -.font-option-warp{ - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 15px 5px; - margin-bottom: 15px; - .font-option-item{ - .option-item-tit{ - font-size: 12px; - font-weight: 500; - color: #fff; - margin-bottom: 10px; - } - } -} -.font-ex-wrap{ - margin-bottom: 15px; - .font-ex-tit{ - font-size: 12px; - font-weight: 500; - color: #fff; - margin-bottom: 10px; - } - .font-ex-box{ display: flex; align-items: center; justify-content: center; width: 100%; - min-height: 80px; - background-color: #fff; + } } - + } } - -// 치수선 설정 -.font-btn-wrap{ - margin-bottom: 15px; - button{ - width: 100%; - height: 30px; - line-height: 28px; +.plane-direction { + width: 150px; + position: relative; + height: 120px; + span { + position: absolute; + font-size: 12px; + font-weight: 500; + color: #b1b1b1; + &.top { + top: 0; + left: 50%; + transform: translateX(-50%); } -} - -.line-color-wrap{ - margin-bottom: 15px; - .color-btn{ - display: block; - width: 100%; - height: 30px; - border-radius: 2px; + &.right { + top: 50%; + right: 0; + transform: translateY(-50%); } -} - -.form-box{ - width: 100%; - background-color: #fff; - padding: 10px 15px 20px; - .line-form{ - position: relative; - display: flex; - flex-direction: column; - justify-content: flex-end; - min-width: 102px; - min-height: 40px; - margin: 0 auto; - - &::before{ - content: ''; - position: absolute; - bottom: 0px; - left: 0; - width: 100%; - height: 40px; - border-left: 1px dashed #101010; - border-right: 1px dashed #101010; - } - .line-font-box{ - .font{ - display: block; - padding-bottom: 15px; - color: #101010; - text-align: center; - line-height: 1; - } - .line{ - position: relative; - display: block; - width: 100%; - height: 1px; - border-radius: 30px; - &::before{ - content: ''; - position: absolute; - top: 50%; - transform: translateY(-50%) rotate(45deg); - left: 1px; - width: 9px; - height:+ 9px; - border: 1px solid; - border-color: inherit; - border-top: none; - border-right: none; - } - &::after{ - content: ''; - position: absolute; - top: 50%; - transform: translateY(-50%) rotate(45deg); - right: 1px; - width: 9px; - height: 9px; - border: 1px solid; - border-color: inherit; - border-bottom: none; - border-left: none; - } - } - } + &.bottom { + bottom: 0; + left: 50%; + transform: translateX(-50%); } + &.left { + top: 50%; + left: 0; + transform: translateY(-50%); + } + } + .plane-btn { + position: absolute; + width: 28px; + height: 28px; + background-color: #777777; + background-image: url(../../public/static/images/canvas/plane_arr.svg); + background-size: 12px 13px; + background-repeat: no-repeat; + background-position: center; + border-radius: 50%; + transition: all 0.15s ease-in-out; + &.up { + top: 22px; + left: 50%; + transform: translateX(-50%); + } + &.right { + top: 50%; + right: 32px; + transform: translateY(-50%) rotate(90deg); + } + &.down { + bottom: 22px; + left: 50%; + transform: translateX(-50%) rotate(180deg); + } + &.left { + top: 50%; + left: 32px; + transform: translateY(-50%) rotate(270deg); + } + &:hover, + &.act { + background-color: #fff; + background-image: url(../../public/static/images/canvas/plane_arr_act.svg); + } + } } -// 사이즈 변경 -.size-inner-warp{ - position: relative; +.plane-tab-guide { + font-size: $pop-normal-size; + font-weight: $pop-normal-weight; + color: $pop-color; + margin-top: 10px; } -.size-check-wrap{ - position: relative; +.plane-shape-btn { + padding-top: 10px; + margin-top: auto; + button { display: block; - width: 132px; - height: 132px; - margin: 0 auto; - .size-btn{ - position: absolute; - width: 16px; - height: 16px; - border: 1px solid #fff; - border-radius: 50%; - &.act{ - &::after{ - content: ''; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 8px; - height: 8px; - background-color: #fff; - border-radius: 50%; - } - } - &:nth-child(1){ top: 0; left: 0; } - &:nth-child(2){ top: 0; right: 0; } - &:nth-child(3){ bottom: 0; left: 0; } - &:nth-child(4){ bottom: 0; right: 0; } + width: 100%; + } +} + +// 오브젝트 배치 +.mb-box { + margin-bottom: 24px; +} + +.object-direction-wrap { + display: flex; + align-items: center; + justify-content: center; +} +.discrimination-tit { + font-size: 13px; + color: #fff; + font-weight: 500; +} + +.object-size-wrap { + display: flex; + min-height: 206px; + gap: 24px; + margin-top: 14px; + .object-size-img { + position: relative; + flex: none; + width: 200px; + background-color: #fff; + img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); } - .size-box{ + } +} + +// 표시변경 +.display-change-wrap { + margin: 24px 0; +} +.warning { + font-size: $pop-normal-size; + font-weight: $pop-normal-weight; + color: #ffafaf; +} + +// 각 변 속성 변경 +.radio-grid-wrap { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 24px 15px; +} + +// 면 흐름 설정 +.drawing-flow-wrap { + display: flex; + gap: 10px; + .discrimination-box { + flex: 1; + display: flex; + flex-direction: column; + .object-direction-wrap { + flex: 1; + } + &:first-child { + flex: none; + width: 195px; + } + } +} + +.compas-box { + display: flex; + align-items: center; + justify-content: center; +} +.compas-box-inner { + position: relative; + width: 200px; + height: 200px; + border-radius: 50%; + + .circle { + position: absolute; + width: 12px; + height: 12px; + border: 1px solid #fff; + border-radius: 50%; + top: 95%; + left: 50%; + transform-origin: 0 -90px; /* 중심에서 반지름 거리만큼 떨어져 위치 */ + cursor: pointer; + z-index: 3; + /* 0번을 180도 위치(아래)에, 13번을 0도 위치(위)에 배치 */ + i { + position: absolute; + top: 12.5px; + left: 50%; + font-size: 11px; + color: #8b8b8b; + font-weight: 500; + -webkit-user-select: none; + -moz-user-select: none; + -ms-use-select: none; + user-select: none; + } + &:nth-child(1) { + transform: rotate(180deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(180deg); + } + } + &:nth-child(2) { + transform: rotate(195deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(165deg); + } + } + &:nth-child(3) { + transform: rotate(210deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(150deg); + } + } + &:nth-child(4) { + transform: rotate(225deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(135deg); + } + } + &:nth-child(5) { + transform: rotate(240deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(120deg); + } + } + &:nth-child(6) { + transform: rotate(255deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(105deg); + } + } + &:nth-child(7) { + transform: rotate(270deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(90deg); + } + } + &:nth-child(8) { + transform: rotate(285deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(75deg); + } + } + &:nth-child(9) { + transform: rotate(300deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(60deg); + } + } + &:nth-child(10) { + transform: rotate(315deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(45deg); + } + } + &:nth-child(11) { + transform: rotate(330deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(30deg); + } + } + &:nth-child(12) { + transform: rotate(345deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(15deg); + } + } + &:nth-child(13) { + transform: rotate(0deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(0deg); + } + } + &:nth-child(14) { + transform: rotate(15deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-15deg); + } + } + &:nth-child(15) { + transform: rotate(30deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-30deg); + } + } + &:nth-child(16) { + transform: rotate(45deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-45deg); + } + } + &:nth-child(17) { + transform: rotate(60deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-60deg); + } + } + &:nth-child(18) { + transform: rotate(75deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-75deg); + } + } + &:nth-child(19) { + transform: rotate(90deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-90deg); + } + } + &:nth-child(20) { + transform: rotate(105deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-105deg); + } + } + &:nth-child(21) { + transform: rotate(120deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-120deg); + } + } + &:nth-child(22) { + transform: rotate(135deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-135deg); + } + } + &:nth-child(23) { + transform: rotate(150deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-150deg); + } + } + &:nth-child(24) { + transform: rotate(165deg) translate(-50%, -50%); + i { + transform: translateX(-50%) rotate(-165deg); + } + } + &.act { + &::after { + content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); - width: 100px; - height: 100px; + width: 5px; + height: 5px; background-color: #fff; + border-radius: 50%; + } + i { + color: #fff; + } } -} - -.size-option-top{ - margin-bottom: 15px; -} -.size-option-side{ + } + .compas { position: absolute; top: 50%; - left: 0; - transform: translateY(-50%); -} -.size-option-wrap{ - width: 88px; - margin: 0 auto; - .size-option{ - display: flex; - align-items: center; - input{ - width: 100%; - flex: 1; - } - span{ - flex: none; - } + left: 50%; + transform: translate(-50%, -50%); + width: 148px; + height: 148px; + border: 4px solid #fff; + border-radius: 50%; + .compas-arr { + width: 100%; + height: 100%; + background: url(../../public/static/images/canvas/compas.svg) no-repeat center; + background-size: 122px 122px; } + } +} + +.draw-flow-wrap { + margin: 10px 0; +} + +// 지붕모듈선택 +.roof-module-tab { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 14px; + .module-tab-bx { + flex: 1; + height: 34px; + line-height: 31px; + border: 1px solid #484848; + border-radius: 2px; + background-color: transparent; + font-size: 12px; + color: #aaa; + text-align: center; + cursor: default; + transition: all 0.15s ease-in-out; + &.act { + background-color: #1083e3; + border: 1px solid #1083e3; + color: #fff; + font-weight: 500; + } + } + .tab-arr { + display: block; + width: 9px; + height: 14px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + background-image: url(../../public/static/images/canvas/module_tab_arr.svg); + transition: all 0.15s ease-in-out; + &.act { + background-image: url(../../public/static/images/canvas/module_tab_arr_white.svg); + } + } +} + +.roof-module-compas { + margin-bottom: 24px; + .compas-box-inner { + width: 280px; + height: 253px; + .circle { + top: 86%; + &:nth-child(1), + &:nth-child(7), + &:nth-child(13), + &:nth-child(19) { + &::before { + content: ''; + position: absolute; + top: 20px; + left: 50%; + transform: translateX(-50%); + width: 1px; + height: 6px; + background-color: #8b8b8b; + } + } + i { + top: 32px; + } + &.act { + i { + color: #8b8b8b; + } + } + } + } +} +.center-wrap { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; +} + +.module-table-flex-wrap { + display: flex; + gap: 10px; + .outline-form { + flex: 1; + } +} + +.module-box-tab { + display: flex; + .module-btn { + flex: 1; + border-top: 1px solid #505050; + border-bottom: 1px solid #505050; + border-right: 1px solid #505050; + background-color: #454545; + color: #fff; + height: 30px; + font-size: 12px; + font-weight: 400; + transition: all 0.15s ease-in-out; + &:first-child { + border-left: 1px solid #505050; + } + &.act { + border-color: #fff; + background-color: #fff; + color: #101010; + } + } +} + +.module-table-box { + flex: 1; + background-color: #3d3d3d; + border-radius: 2px; + .module-table-inner { + padding: 10px; + .outline-form { + span { + width: auto; + } + } + .module-table-tit { + padding: 10px 0; + font-size: 12px; + color: #fff; + border-bottom: 1px solid #4d4d4d; + } + .eaves-keraba-table { + width: 100%; + margin-top: 15px; + .eaves-keraba-th { + width: 72px; + } + .eaves-keraba-th, + .eaves-keraba-td { + padding-bottom: 5px; + } + } + .self-table-tit { + font-size: 12px; + font-weight: 500; + color: #fff; + padding-bottom: 15px; + } + } + .warning-guide { + padding: 20px; + .warning { + color: #ffcaca; + max-height: 55px; + overflow-y: auto; + padding-right: 30px; + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #d9d9d9; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } + } + } +} + +.module-self-table { + display: table; + border-top: 1px solid #4d4d4d; + border-collapse: collapse; + width: 100%; + .self-table-item { + display: table-row; + .self-item-td, + .self-item-th { + display: table-cell; + vertical-align: middle; + border-bottom: 1px solid #4d4d4d; + } + .self-item-th { + width: 60px; + font-size: 12px; + font-weight: 500; + color: #fff; + } + .self-item-td { + font-size: 12px; + font-weight: 400; + color: #fff; + padding: 15px 20px; + } + } +} + +.self-table-flx { + display: flex; + align-items: center; + margin-top: 15px; + button { + margin-left: auto; + } +} +.hexagonal-wrap { + .hexagonal-item { + padding: 15px 0; + border-bottom: 1px solid #4d4d4d; + &:first-child { + padding-top: 0; + } + &:last-child { + padding-bottom: 0; + border: none; + } + .hexagonal-flx-auto { + display: flex; + justify-content: space-between; + } + .hexagonal-flx { + display: flex; + align-items: center; + button { + margin-left: auto; + } + } + } +} + +// 회로 및 가대설정 +.circuit-check-inner { + padding: 5px 0; +} + +.x-scroll-table { + overflow-x: auto; + padding-bottom: 5px; + .roof-module-table { + min-width: 1200px; + } + &::-webkit-scrollbar { + height: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #d9d9d9; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } +} + +.circuit-right-wrap { + display: flex; + justify-content: flex-end; +} + +.circuit-data-form { + display: flex; + flex-direction: column; + gap: 5px; + min-height: 60px; + padding: 12px; + border: 1px solid rgba(255, 255, 255, 0.2); + span { + display: inline-flex; + align-items: center; + .del { + display: block; + margin-left: 10px; + width: 15px; + height: 15px; + background: url(../../public/static/images/canvas/circuit_del.svg) no-repeat center; + background-size: cover; + } + } +} +.circuit-table-tit { + color: #fff; + font-size: 12px; + font-weight: 600; + padding: 11px 10px; + background-color: #474747; + border: 1px solid #505050; + border-bottom: none; +} + +.circuit-overflow { + max-height: 400px; + overflow-y: auto; + margin-bottom: 15px; + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #d9d9d9; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } +} + +.circuit-table-flx-wrap { + display: flex; + gap: 10px; + margin-bottom: 10px; + .circuit-table-flx-box { + flex: 1; + display: flex; + flex-direction: column; + .bottom-wrap { + margin-top: auto; + } + .roof-module-table { + table { + table-layout: fixed; + } + } + } +} + +.circuit-count-input { + display: flex; + align-items: center; + gap: 10px; +} + +// 모듈부가기능 +.additional-radio-wrap { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 15px 0; + margin-bottom: 24px; +} +.additional-wrap { + padding: 24px 0; + border-top: 1px solid #424242; +} + +.additional-color-wrap { + display: flex; + align-items: center; + padding: 5px 0; + gap: 15px; + .additional-color-box { + display: flex; + align-items: center; + gap: 8px; + .additional-color { + display: block; + width: 16px; + height: 16px; + &.pink { + border: 2px solid #ce1c9c; + background-color: #16417d; + } + &.white { + border: 2px solid #fff; + background-color: #001027; + } + } + } +} + +// color setting +.color-setting-wrap { + padding-bottom: 15px; + border-bottom: 1px solid #424242; + .color-tit { + font-size: 13px; + font-weight: 500; + color: #ffffff; + margin-bottom: 10px; + } + .color-picker { + .react-colorful { + width: 100%; + height: auto; + gap: 20px; + .react-colorful__pointer { + width: 15px; + height: 15px; + border: 4px solid #fff; + } + .react-colorful__saturation { + border-radius: 2px; + height: 200px; + border-bottom: 5px solid #000; + } + .react-colorful__last-control { + border-radius: 2px; + height: 10px; + } + } + .hex-color-box { + display: flex; + align-items: center; + margin-top: 15px; + .color-box-tit { + font-size: 12px; + color: #fff; + font-weight: 500; + margin-right: 10px; + } + .color-hex-input { + width: 150px; + margin-right: 5px; + input { + width: 100%; + } + } + .color-box { + display: block; + width: 30px; + height: 30px; + border-radius: 4px; + } + } + .default-color-wrap { + margin-top: 25px; + .default-tit { + font-size: 12px; + font-weight: 500; + color: #fff; + margin-bottom: 10px; + } + .color-button-wrap { + display: grid; + grid-template-columns: repeat(8, 1fr); + gap: 21px; + .default-color { + display: block; + width: 100%; + height: 30px; + border-radius: 4px; + } + } + } + } +} + +// 글꼴 설정 팝업 +.font-option-warp { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 15px 5px; + margin-bottom: 15px; + .font-option-item { + .option-item-tit { + font-size: 12px; + font-weight: 500; + color: #fff; + margin-bottom: 10px; + } + } +} +.font-ex-wrap { + margin-bottom: 15px; + .font-ex-tit { + font-size: 12px; + font-weight: 500; + color: #fff; + margin-bottom: 10px; + } + .font-ex-box { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + min-height: 80px; + background-color: #fff; + } +} + +// 치수선 설정 +.font-btn-wrap { + margin-bottom: 15px; + button { + width: 100%; + height: 30px; + line-height: 28px; + } +} + +.line-color-wrap { + margin-bottom: 15px; + .color-btn { + display: block; + width: 100%; + height: 30px; + border-radius: 2px; + } +} + +.form-box { + width: 100%; + background-color: #fff; + padding: 10px 15px 20px; + .line-form { + position: relative; + display: flex; + flex-direction: column; + justify-content: flex-end; + min-width: 102px; + min-height: 40px; + margin: 0 auto; + + &::before { + content: ''; + position: absolute; + bottom: 0px; + left: 0; + width: 100%; + height: 40px; + border-left: 1px dashed #101010; + border-right: 1px dashed #101010; + } + .line-font-box { + .font { + display: block; + padding-bottom: 15px; + color: #101010; + text-align: center; + line-height: 1; + } + .line { + position: relative; + display: block; + width: 100%; + height: 1px; + border-radius: 30px; + &::before { + content: ''; + position: absolute; + top: 50%; + transform: translateY(-50%) rotate(45deg); + left: 1px; + width: 9px; + height: +9px; + border: 1px solid; + border-color: inherit; + border-top: none; + border-right: none; + } + &::after { + content: ''; + position: absolute; + top: 50%; + transform: translateY(-50%) rotate(45deg); + right: 1px; + width: 9px; + height: 9px; + border: 1px solid; + border-color: inherit; + border-bottom: none; + border-left: none; + } + } + } + } +} + +// 사이즈 변경 +.size-inner-warp { + position: relative; +} +.size-check-wrap { + position: relative; + display: block; + width: 132px; + height: 132px; + margin: 0 auto; + .size-btn { + position: absolute; + width: 16px; + height: 16px; + border: 1px solid #fff; + border-radius: 50%; + &.act { + &::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 8px; + height: 8px; + background-color: #fff; + border-radius: 50%; + } + } + &:nth-child(1) { + top: 0; + left: 0; + } + &:nth-child(2) { + top: 0; + right: 0; + } + &:nth-child(3) { + bottom: 0; + left: 0; + } + &:nth-child(4) { + bottom: 0; + right: 0; + } + } + .size-box { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100px; + height: 100px; + background-color: #fff; + } +} + +.size-option-top { + margin-bottom: 15px; +} +.size-option-side { + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); +} +.size-option-wrap { + width: 88px; + margin: 0 auto; + .size-option { + display: flex; + align-items: center; + input { + width: 100%; + flex: 1; + } + span { + flex: none; + } + } } //이미지 크기 설정 -.range-wrap{ - display: flex; - align-items: center; - input{ - flex: 1; - margin-right: 10px; +.range-wrap { + display: flex; + align-items: center; + input { + flex: 1; + margin-right: 10px; + } + label { + flex: none; + text-align: right; + width: 38px; + font-size: 13px; + color: #fff; + font-weight: 500; + } +} + +// 이미지 불러오기 +.img-flex-box { + display: flex; + align-items: center; +} +.img-load-from { + margin-top: 20px; + .img-load-item { + border-top: 1px solid #424242; + padding: 18px 0; + .d-check-radio { + margin-bottom: 20px; } - label{ - flex: none; - text-align: right; - width: 38px; - font-size: 13px; - color: #fff; - font-weight: 500; - } -} \ No newline at end of file + } + border-bottom: 1px solid #424242; +} diff --git a/src/styles/_reset.scss b/src/styles/_reset.scss index 711ef44a..c871f7bb 100644 --- a/src/styles/_reset.scss +++ b/src/styles/_reset.scss @@ -1,912 +1,1106 @@ * { - -webkit-text-size-adjust:none; - -moz-text-size-adjust:none; - -ms-text-size-adjust:none; - text-size-adjust: none; - box-sizing: content-box + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + -ms-text-size-adjust: none; + text-size-adjust: none; + box-sizing: content-box; } -*, ::after, ::before { - box-sizing: border-box; +*, +::after, +::before { + box-sizing: border-box; } -html, body{ - font-size: 16px; +html, +body { + font-size: 16px; } -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font: inherit; - vertical-align: baseline; - font-family: 'Noto Sans JP', sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-smooth: never; +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; + font-family: 'Noto Sans JP', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-smooth: never; } /* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; } body { - line-height: 1.4; + line-height: 1.4; +} +body:first-of-type caption { + display: none; } -body:first-of-type caption { display:none;} -ol, ul { - list-style: none; +ol, +ul { + list-style: none; } -blockquote, q { - quotes: none; +blockquote, +q { + quotes: none; } -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; } table { - width: 100%; - border-collapse: separate; - border-spacing:0; - border:0 none; + width: 100%; + border-collapse: separate; + border-spacing: 0; + border: 0 none; } -caption, th, td { - text-align:left; - font-weight: normal; - border:0; +caption, +th, +td { + text-align: left; + font-weight: normal; + border: 0; } -a { - cursor:pointer; - color:#000; +a { + cursor: pointer; + color: #000; } -a, a:hover, a:active { - text-decoration:none; - -webkit-tap-highlight-color: transparent; +a, +a:hover, +a:active { + text-decoration: none; + -webkit-tap-highlight-color: transparent; } /*form_style*/ -input, select, textarea, button, a, label { - -webkit-tap-highlight-color:rgba(0,0,0,0); +input, +select, +textarea, +button, +a, +label { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } -button,input[type=text], input[type=button] { - -webkit-appearance: none; - -webkit-border-radius: 0; - -webkit-appearance:none; - appearance: none; - border-radius: 0 +button, +input[type='text'], +input[type='button'] { + -webkit-appearance: none; + -webkit-border-radius: 0; + -webkit-appearance: none; + appearance: none; + border-radius: 0; } -input[type=checkbox], input[type=radio] { - box-sizing: border-box; - padding: 0; +input[type='checkbox'], +input[type='radio'] { + box-sizing: border-box; + padding: 0; } -input, select, button { - border:0 none; - outline:none; - margin:0; +input, +select, +button { + border: 0 none; + outline: none; + margin: 0; } select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } select::-ms-expand { - display: none; + display: none; } ::-webkit-input-placeholder { - line-height:1; - font-weight:300; - font-size:0.938rem; - letter-spacing:-0.6px; - color:#8b8b8b; + line-height: 1; + font-weight: 300; + font-size: 0.938rem; + letter-spacing: -0.6px; + color: #8b8b8b; } -.log-box ::-webkit-input-placeholder{ - color:#8b8b8b; +.log-box ::-webkit-input-placeholder { + color: #8b8b8b; } -button{ - background: transparent; - font-family: 'Noto Sans JP', sans-serif; - border: none; - padding: 0; - margin: 0; - line-height: 1.4; - color: inherit; - outline: none; - cursor: pointer; +button { + background: transparent; + font-family: 'Noto Sans JP', sans-serif; + border: none; + padding: 0; + margin: 0; + line-height: 1.4; + color: inherit; + outline: none; + cursor: pointer; } -.pre{ - font-family: 'Pretendard', sans-serif !important; +.pre { + font-family: 'Pretendard', sans-serif !important; } -.no-click{ - cursor: no-drop !important; +.no-click { + cursor: no-drop !important; } // margin -.mt5{margin-top: 5px !important;} -.mt10{margin-top: 10px !important;} -.mt15{margin-top: 15px !important;} -.mb5{margin-bottom: 5px !important;} -.mb10{margin-bottom: 10px !important;} -.mb15{margin-bottom: 15px !important;} -.mr5{margin-right: 5px !important;} -.mr10{margin-right: 10px !important;} -.mr15{margin-right: 15px !important;} -.ml5{margin-left: 5px !important;} -.ml10{margin-left: 10px !important;} -.ml15{margin-left: 15px !important;} - -// align -.al-l{text-align: left !important;} -.al-r{text-align: right !important;} -.al-c{text-align: center !important;} - - -// button -.btn-frame{ - display: inline-block; - padding: 0 7px; - height: 34px; - line-height: 34px; - border-radius: 2px; - color: #fff; - font-size: 12px; - font-weight: 400; - border: 1px solid #000; - text-align: center; - font-family: 'Pretendard', sans-serif; - transition: all .17s ease-in-out; - cursor: pointer; - &.block{ - width: 100%; - } - &.small{ - font-family: 'Noto Sans JP', sans-serif; - height: 30px; - line-height: 30px; - font-size: 13px; - } - - &.deepgray{ - background-color: #2C2C2C; - border: 1px solid #484848; - } - &.gray{ - background-color: #3C3C3C; - border: 1px solid #545454; - } - &.dark{ - background-color: #1C1C1C; - border: 1px solid #484848; - } - &.modal{ - font-family: 'Noto Sans JP', sans-serif; - background-color: #272727; - border: 1px solid #484848; - color: #aaa; - &:hover{ - background-color: #1083E3; - border: 1px solid #1083E3; - color: #fff; - font-weight: 500; - } - } - &.sub-tab{ - height: 30px; - padding: 0 10px; - line-height: 28px; - font-family: 'Noto Sans JP', sans-serif; - background-color: #2D2D2D; - border: 1px solid #393939; - color: #aaa; - &.act, - &:hover{ - background-color: #414E6C; - border: 1px solid #414E6C; - color: #fff; - font-weight: 500; - } - } - &.roof{ - height: 30px; - padding: 0 10px; - line-height: 28px; - font-family: 'Noto Sans JP', sans-serif; - background-color: transparent; - border: 1px solid #484848; - color: #fff; - &.blue{ - background-color: #414E6C; - border: 1px solid #414E6C; - &:hover{ - background-color: #414E6C; - border: 1px solid #414E6C; - } - } - &.white{ - background-color: #fff; - border: 1px solid #fff; - color: #101010; - &:hover{ - background-color: #fff; - border: 1px solid #fff; - color: #101010; - } - } - &:hover{ - font-weight: 400; - background-color: transparent; - border: 1px solid #484848; - color: #fff; - } - } - &.self{ - height: 30px; - padding: 0 10px; - line-height: 28px; - font-family: 'Noto Sans JP', sans-serif; - background-color: transparent; - border: 1px solid #676767; - color: #AAAAAA; - &:hover{ - background-color: #272727; - border-color: #676767; - font-weight: 400; - } - } - &:hover, - &.act{ - background-color: #1083E3; - border: 1px solid #1083E3; - color: #fff; - font-weight: 500; - } - &.block{ - display: block; - width: 100%; - } - &.ico-flx{ - display: flex; - align-items: center; - .ico{ - margin-right: 10px; - } - &:hover, - &.act{ - font-weight: 400; - } - } +.mt5 { + margin-top: 5px !important; +} +.mt10 { + margin-top: 10px !important; +} +.mt15 { + margin-top: 15px !important; +} +.mb5 { + margin-bottom: 5px !important; +} +.mb10 { + margin-bottom: 10px !important; +} +.mb15 { + margin-bottom: 15px !important; +} +.mr5 { + margin-right: 5px !important; +} +.mr10 { + margin-right: 10px !important; +} +.mr15 { + margin-right: 15px !important; +} +.ml5 { + margin-left: 5px !important; +} +.ml10 { + margin-left: 10px !important; +} +.ml15 { + margin-left: 15px !important; } -.btn-origin{ - display: inline-block; +// align +.al-l { + text-align: left !important; +} +.al-r { + text-align: right !important; +} +.al-c { + text-align: center !important; +} + +// button +.btn-frame { + display: inline-block; + padding: 0 7px; + height: 34px; + line-height: 34px; + border-radius: 2px; + color: #fff; + font-size: 12px; + font-weight: 400; + border: 1px solid #000; + text-align: center; + font-family: 'Pretendard', sans-serif; + transition: all 0.17s ease-in-out; + cursor: pointer; + &.block { + width: 100%; + } + &.small { + font-family: 'Noto Sans JP', sans-serif; + height: 30px; + line-height: 30px; + font-size: 13px; + } + + &.deepgray { + background-color: #2c2c2c; + border: 1px solid #484848; + } + &.gray { + background-color: #3c3c3c; + border: 1px solid #545454; + } + &.dark { + background-color: #1c1c1c; + border: 1px solid #484848; + } + &.modal { + font-family: 'Noto Sans JP', sans-serif; + background-color: #272727; + border: 1px solid #484848; + color: #aaa; + &:hover { + background-color: #1083e3; + border: 1px solid #1083e3; + color: #fff; + font-weight: 500; + } + } + &.sub-tab { height: 30px; padding: 0 10px; - border-radius: 2px; - background-color: #101010; + line-height: 28px; + font-family: 'Noto Sans JP', sans-serif; + background-color: #2d2d2d; + border: 1px solid #393939; + color: #aaa; + &.act, + &:hover { + background-color: #414e6c; + border: 1px solid #414e6c; + color: #fff; + font-weight: 500; + } + } + &.roof { + height: 30px; + padding: 0 10px; + line-height: 28px; + font-family: 'Noto Sans JP', sans-serif; + background-color: transparent; + border: 1px solid #484848; color: #fff; - font-size: 13px; - font-weight: 400; - transition: all .15s ease-in-out; - &.navy{ - background-color: #304961; - &:hover{ - background-color: #233546; - } + &.blue { + background-color: #414e6c; + border: 1px solid #414e6c; + &:hover { + background-color: #414e6c; + border: 1px solid #414e6c; + } } - &.grey{ - background-color: #94A0AD; - &:hover{ - background-color: #607F9A; - } - } - &.green{ - background-color: #A6BBA8; - &:hover{ - background-color: #98af9b; - } - } - &.white{ - border: 1px solid #94A0AD; + &.white { + background-color: #fff; + border: 1px solid #fff; + color: #101010; + &:hover { background-color: #fff; - color: #94A0AD; - &:hover{ - background-color: #fff; - } + border: 1px solid #fff; + color: #101010; + } } + &:hover { + font-weight: 400; + background-color: transparent; + border: 1px solid #484848; + color: #fff; + } + } + &.self { + height: 30px; + padding: 0 10px; + line-height: 28px; + font-family: 'Noto Sans JP', sans-serif; + background-color: transparent; + border: 1px solid #676767; + color: #aaaaaa; + &:hover { + background-color: #272727; + border-color: #676767; + font-weight: 400; + } + } + &:hover, + &.act { + background-color: #1083e3; + border: 1px solid #1083e3; + color: #fff; + font-weight: 500; + } + &.block { + display: block; + width: 100%; + } + &.ico-flx { + display: flex; + align-items: center; + .ico { + margin-right: 10px; + } + &:hover, + &.act { + font-weight: 400; + } + } +} + +.btn-origin { + display: inline-block; + height: 30px; + padding: 0 10px; + border-radius: 2px; + background-color: #101010; + color: #fff; + font-size: 13px; + font-weight: 400; + transition: all 0.15s ease-in-out; + &.navy { + background-color: #304961; + &:hover { + background-color: #233546; + } + } + &.grey { + background-color: #94a0ad; + &:hover { + background-color: #607f9a; + } + } + &.green { + background-color: #a6bba8; + &:hover { + background-color: #98af9b; + } + } + &.white { + border: 1px solid #94a0ad; + background-color: #fff; + color: #94a0ad; + &:hover { + background-color: #fff; + } + } } // select -.sort-select{ - position: relative; - display: inline-block; - min-width: 100px; - height: 30px; - line-height: 30px; - padding: 0 25px 0 10px; - background-color: #373737; - border: 1px solid #3F3F3F; - border-radius: 2px; - border-top-left-radius: 2px; +.sort-select { + position: relative; + display: inline-block; + min-width: 100px; + height: 30px; + line-height: 30px; + padding: 0 25px 0 10px; + background-color: #373737; + border: 1px solid #3f3f3f; + border-radius: 2px; + border-top-left-radius: 2px; + color: #fff; + cursor: pointer; + p { + font-size: 13px; color: #fff; - cursor: pointer; - p{ - font-size: 13px; + height: 100%; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + } + .select-item-wrap { + position: absolute; + top: 100%; + left: -1px; + clip-path: inset(0 0 100% 0); + width: calc(100% + 2px); + padding: 8px 0; + max-height: 100px; + overflow-y: auto; + background-color: #373737; + border: 1px solid #3f3f3f; + border-radius: 2px; + transition: all 0.17s ease-in-out; + visibility: hidden; + z-index: 999; + .select-item { + display: flex; + align-items: center; + padding: 8px 20px; + line-height: 1.4; + transition: all 0.17s ease-in-out; + button { + font-size: 12px; color: #fff; - height: 100%; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; + line-height: 1.4; + } + &:hover { + background-color: #2c2c2c; + } } - .select-item-wrap{ - position: absolute; - top: 100%; - left: -1px; - clip-path:inset(0 0 100% 0); - width: calc(100% + 2px); - padding: 8px 0; - max-height: 100px; - overflow-y: auto; - background-color: #373737; - border: 1px solid #3F3F3F; - border-radius: 2px; - transition: all 0.17s ease-in-out; - visibility: hidden; - z-index: 999; - .select-item{ - display: flex; - align-items: center; - padding: 8px 20px; - line-height: 1.4; - transition: all .17s ease-in-out; - button{ - font-size: 12px; - color: #fff; - line-height: 1.4; - } - &:hover{ - background-color: #2C2C2C; - } - } - &::-webkit-scrollbar { - width: 2px; - background-color: transparent; - - } - &::-webkit-scrollbar-thumb { - background-color: #5a5a5a; - border-radius: 10px; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } + &::-webkit-scrollbar { + width: 2px; + background-color: transparent; } - &::after{ - content: ''; - position: absolute; - top: 50%; - right: 7px; - transform: translateY(-50%); - width: 10px; - height: 6px; - background: url(/static/images/common/select-arr.svg) no-repeat center; - background-size: cover; - transition: all .17s ease-in-out; + &::-webkit-scrollbar-thumb { + background-color: #5a5a5a; + border-radius: 10px; } - &.active{ - .select-item-wrap{ - clip-path: inset(0 0 0 0); - visibility: visible; - } - &:after{ - transform: translateY(-50%) rotate(-180deg); - } + &::-webkit-scrollbar-track { + background-color: transparent; } + } + &::after { + content: ''; + position: absolute; + top: 50%; + right: 7px; + transform: translateY(-50%); + width: 10px; + height: 6px; + background: url(/static/images/common/select-arr.svg) no-repeat center; + background-size: cover; + transition: all 0.17s ease-in-out; + } + &.active { + .select-item-wrap { + clip-path: inset(0 0 0 0); + visibility: visible; + } + &:after { + transform: translateY(-50%) rotate(-180deg); + } + } } -.select-light{ - position: relative; +.select-light { + position: relative; + display: block; + width: 100%; + height: 30px; + background: #fff url(../../public/static/images/common/select_light_arr.svg) calc(100% - 11px) center no-repeat; + background-size: 10px 6px; + border: 1px solid #eee; + padding: 0 30px 0 10px; + font-size: 13px; + color: #45576f; + font-family: 'Noto Sans JP', sans-serif; + cursor: pointer; + &:disabled { + opacity: 1; + background-color: #fafafa; + color: #999; + cursor: default; + } + &.black { + color: #101010; + } + &.dark { + background: #323234 url(../../public/static/images/common/select_dark_arr.svg) calc(100% - 11px) center no-repeat; + color: #898989; + font-size: 12px; + border-radius: 2px; + border: none; + } +} + +// input +.form-input { + label { + display: block; + color: #aaa; + font-size: 12px; + font-weight: 500; + margin-bottom: 10px; + } +} +input[type='password'], +input[type='number'], +input[type='text'] { + &.input-origin { + display: inline-block; + height: 30px; + line-height: 30px; + border-radius: 2px; + background-color: #323234; + border: 1px solid #323234; + color: #fff; + font-size: 12px; + font-weight: 500; + font-family: 'Pretendard', sans-serif; + padding: 0 10px; + letter-spacing: 0px; + text-align: right; + transition: border 0.15s ease-in-out; + &:focus { + border: 1px solid #1083e3; + } + &::placeholder { + font-family: 'Noto Sans JP', sans-serif; + opacity: 1; + font-size: 12px; + letter-spacing: 0px; + } + &.block { + width: 100%; + } + &:read-only { + color: #aaa; + &:focus { + border: 1px solid #323234; + } + } + &.plane { + font-family: 'Noto Sans JP', sans-serif; + border: 1px solid #525252; + background-color: transparent; + } + } + &.input-light { display: block; width: 100%; height: 30px; - background: #FFF url(../../public/static/images/common/select_light_arr.svg) calc(100% - 11px) center no-repeat; - background-size: 10px 6px; + padding: 0 10px; border: 1px solid #eee; - padding: 0 30px 0 10px; - font-size: 13px; - color: #45576F; + border-radius: 2px; + background-color: #fff; font-family: 'Noto Sans JP', sans-serif; - cursor: pointer; - &:disabled{ - opacity: 1; - background-color: #FAFAFA; - color: #999; - cursor: default; + font-size: 13px; + color: #45576f; + font-weight: normal; + transition: border-color 0.17s ease-in-out; + text-align: left; + &:focus { + border-color: #94a0ad; } - &.black{ - color: #101010; - } - &.dark{ - background: #323234 url(../../public/static/images/common/select_dark_arr.svg) calc(100% - 11px) center no-repeat; - color: #898989; - font-size: 12px; - border-radius: 2px; - border: none; + &:read-only { + background-color: #fafafa; + color: #999999; + &:focus { + border-color: #eee; + } } + } } - -// input -.form-input{ - label{ - display: block; - color: #aaa; - font-size: 12px; - font-weight: 500; - margin-bottom: 10px; - } -} -input[type=password], -input[type=number], -input[type=text]{ - &.input-origin{ - display: inline-block; - height: 30px; - line-height: 30px; - border-radius: 2px; - background-color: #323234; - border: 1px solid #323234; - color: #fff; - font-size: 12px; - font-weight: 500; - font-family: 'Pretendard', sans-serif; - padding: 0 10px; - letter-spacing: 0px; - text-align: right; - transition: border .15s ease-in-out; - &:focus{ - border: 1px solid #1083E3; - } - &::placeholder{ - opacity: 1; - font-size: 12px; - letter-spacing: 0px; - } - &.block{ - width: 100%; - } - &:read-only{ - color: #AAA; - &:focus{ - border: 1px solid #323234; - } - } - &.plane{ - font-family: 'Noto Sans JP', sans-serif; - border: 1px solid #525252; - background-color: transparent; - } - } - &.input-light{ - display: block; - width: 100%; - height: 30px; - padding: 0 10px; - border: 1px solid #eee; - border-radius: 2px; - background-color: #fff; - font-family: 'Noto Sans JP', sans-serif; - font-size: 13px; - color: #45576F; - font-weight: normal; - transition: border-color .17s ease-in-out; - text-align: left; - &:focus{ - border-color: #94A0AD; - } - &:read-only{ - background-color: #FAFAFA; - color: #999999; - &:focus{ - border-color: #eee; - } - } - } -} - - - // check-btn -.check-btn{ - display: flex; - align-items: center; - height: 30px; - background-color: #3A3A3A; - border-radius: 3px; - transition: all .17s ease-in-out; - .check-area{ - flex: none; - width: 30px; - height: 100%; - border-right: 1px solid #272727; - background: url(../../public/static/images/canvas/check-grey.svg)no-repeat center; - background-size: 11px 9px; +.check-btn { + display: flex; + align-items: center; + height: 30px; + background-color: #3a3a3a; + border-radius: 3px; + transition: all 0.17s ease-in-out; + .check-area { + flex: none; + width: 30px; + height: 100%; + border-right: 1px solid #272727; + background: url(../../public/static/images/canvas/check-grey.svg) no-repeat center; + background-size: 11px 9px; + } + .title-area { + padding: 0 10px; + font-size: 12px; + color: #898989; + font-weight: 400; + } + &.block { + width: 100%; + } + &:hover, + &.act { + background-color: #fff; + .check-area { + border-right: 1px solid #101010; + background: url(../../public/static/images/canvas/check-black.svg) no-repeat center; } - .title-area{ - padding: 0 10px; - font-size: 12px; - color: #898989; - font-weight: 400; - } - &.block{ - width: 100%; - } - &:hover, - &.act{ - background-color: #fff; - .check-area{ - border-right: 1px solid #101010; - background: url(../../public/static/images/canvas/check-black.svg)no-repeat center; - } - .title-area{ - color: #101010; - font-weight: 600; - } + .title-area { + color: #101010; + font-weight: 600; } + } } // arr-btn -.arr-btn{ - display: block; - height: 30px; - border-radius: 3px; - background-color: #3A3A3A; - padding: 0 11px; - text-align: left; - transition: all .17s ease-in-out; - span{ - position: relative; - font-size: 12px; - color: #898989; - font-weight: 400; - padding-right: 15px; - &:after{ - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 5px; - height: 8px; - background: url(../../public/static/images/canvas/arr_btn_ico.svg)no-repeat center; - } +.arr-btn { + display: block; + height: 30px; + border-radius: 3px; + background-color: #3a3a3a; + padding: 0 11px; + text-align: left; + transition: all 0.17s ease-in-out; + span { + position: relative; + font-size: 12px; + color: #898989; + font-weight: 400; + padding-right: 15px; + &:after { + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 5px; + height: 8px; + background: url(../../public/static/images/canvas/arr_btn_ico.svg) no-repeat center; + } + } + &:hover, + &.act { + background-color: #fff; + span { + color: #101010; + font-weight: 500; + &:after { + background: url(../../public/static/images/canvas/arr_btn_ico_black.svg) no-repeat center; + } + } + } + &.dark { + text-align: center; + background-color: #272727; + border: 1px solid #484848; + span { + color: #fff; + &:after { + background: url(../../public/static/images/canvas/arr_btn_ico_white.svg) no-repeat center; + } } &:hover, - &.act{ - background-color: #fff; - span{ - color: #101010; - font-weight: 500; - &:after{ - background: url(../../public/static/images/canvas/arr_btn_ico_black.svg)no-repeat center; - } - } - } - &.dark{ - text-align: center; - background-color: #272727; - border: 1px solid #484848; - span{ - color: #Fff; - &:after{ - background: url(../../public/static/images/canvas/arr_btn_ico_white.svg)no-repeat center; - } - } - &:hover, - &.act{ - background-color: #1083E3; - border: 1px solid #1083E3; - } + &.act { + background-color: #1083e3; + border: 1px solid #1083e3; } + } } // radio .d-check-radio, -.d-check-box{ - line-height: 1.1; +.d-check-box { + line-height: 1.1; + cursor: pointer; + input[type='checkbox'], + input[type='radio'] { + position: static; + margin-left: 0; cursor: pointer; - input[type=checkbox], - input[type=radio]{ - position: static; - margin-left: 0; - cursor: pointer; - opacity: 0; - z-index: 1; - flex: 0 0 auto; + opacity: 0; + z-index: 1; + flex: 0 0 auto; + } + label { + position: relative; + padding-left: 10px; + margin-bottom: 0; + word-break: break-all; + line-height: 1.2; + display: inline; + vertical-align: top; + color: #fff; + font-size: 13px; + font-weight: 400; + cursor: pointer; + } + &.light { + label { + color: #45576f; } - label{ - position: relative; - padding-left: 10px; - margin-bottom: 0; - word-break: break-all; - line-height: 1.2; - display: inline; - vertical-align: top; - color: #fff; - font-size: 13px; - font-weight: 400; - cursor: pointer; - } - &.light{ - label{ - color: #45576F; - } - } - &.no-text{ - label{ - padding-left: 0; - } + } + &.no-text { + label { + padding-left: 0; } + } } .d-check-radio { - label{ - &::before{ - cursor: pointer; - content: ""; - display: inline-block; - position: absolute; - width: 17px; - height: 17px; - top:2px; - left: 0; - margin-left: -12px; - border: 1px solid #999999; - border-radius: 100%; - background-color: transparent; - text-align:center; - font-size:13px; - line-height:1.4; - transition: border 0.15s ease-in-out, color 0.15s ease-in-out; - } - &::after{ - cursor: pointer; - content: ""; - display: inline-block; - position: absolute; - width: 9px; - height: 9px; - top:6px; - left: 4px; - margin-left: -12px; - border: none; - border-radius: 100%; - background-color: #fff; - text-align:center; - font-size:13px; - line-height:1.4; - opacity: 0; - visibility: hidden; - transition: opacity 0.15s ease-in-out, color 0.15s ease-in-out; - } + label { + &::before { + cursor: pointer; + content: ''; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + top: 2px; + left: 0; + margin-left: -12px; + border: 1px solid #999999; + border-radius: 100%; + background-color: transparent; + text-align: center; + font-size: 13px; + line-height: 1.4; + transition: + border 0.15s ease-in-out, + color 0.15s ease-in-out; } - &.light{ - label{ - &:before{ - border-color: #D6D6D7; - } - &:after{ - background-color: #697C8F; - } - } + &::after { + cursor: pointer; + content: ''; + display: inline-block; + position: absolute; + width: 9px; + height: 9px; + top: 6px; + left: 4px; + margin-left: -12px; + border: none; + border-radius: 100%; + background-color: #fff; + text-align: center; + font-size: 13px; + line-height: 1.4; + opacity: 0; + visibility: hidden; + transition: + opacity 0.15s ease-in-out, + color 0.15s ease-in-out; } - input[type=radio]:checked + label::after{ - opacity: 1; - visibility: visible; + } + &.light { + label { + &:before { + border-color: #d6d6d7; + } + &:after { + background-color: #697c8f; + } } - &.pop{ - label{ - font-size: 12px; - &:before{ - width: 16px; - height: 16px; - border-color: #fff; - } - &:after{ - width: 8px; - height: 8px; - background-color: #fff; - } - } + } + input[type='radio']:checked + label::after { + opacity: 1; + visibility: visible; + } + &.pop { + label { + font-size: 12px; + &:before { + width: 16px; + height: 16px; + border-color: #fff; + } + &:after { + width: 8px; + height: 8px; + background-color: #fff; + } } + } } // check-box -.d-check-box{ - label{ - &.red{color: #FFCACA;} - &::before{ - cursor: pointer; - content: ""; - display: inline-block; - position: absolute; - width: 17px; - height: 17px; - top: 2px; - left: 0; - margin-left: -12px; - border: 1px solid #D6D6D7; - background-color: #fff; - transition: border 0.15s ease-in-out, color 0.15s ease-in-out; - } - &:after{ - cursor: pointer; - content: ""; - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - top:0; - left: 0; - margin-left: -.8rem; - transition: border 0.05s ease-in-out, color 0.05s ease-in-out; - } +.d-check-box { + label { + &.red { + color: #ffcaca; } - input[type=checkbox]:checked + label::after{ - content: ""; - display: inline-block; - position: absolute; - top: 1px; - left: -1px; - width: 5px; - height: 8px; - border: 2px solid #697C8F; - border-left: none; - border-top: none; - transform: translate(7.75px,4.5px) rotate(45deg); - -ms-transform: translate(7.75px,4.5px) rotate(45deg); + &::before { + cursor: pointer; + content: ''; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + top: 2px; + left: 0; + margin-left: -12px; + border: 1px solid #d6d6d7; + background-color: #fff; + transition: + border 0.15s ease-in-out, + color 0.15s ease-in-out; } - &.pop{ - label{ - &:before{ - background-color: transparent; - } - } - input[type=checkbox]:checked + label::after{ - border-color: #fff; - } - &.no-text{ - label{ - padding-left: 0; - } - } + &:after { + cursor: pointer; + content: ''; + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + top: 0; + left: 0; + margin-left: -0.8rem; + transition: + border 0.05s ease-in-out, + color 0.05s ease-in-out; } - &.sel{ - input[type=checkbox]:checked + label{ - color: #D7C863; - } - input[type=checkbox]:checked + label::before, - input[type=checkbox]:checked + label::after{ - border-color: #D7C863; - } + } + input[type='checkbox']:checked + label::after { + content: ''; + display: inline-block; + position: absolute; + top: 1px; + left: -1px; + width: 5px; + height: 8px; + border: 2px solid #697c8f; + border-left: none; + border-top: none; + transform: translate(7.75px, 4.5px) rotate(45deg); + -ms-transform: translate(7.75px, 4.5px) rotate(45deg); + } + &.pop { + label { + &:before { + background-color: transparent; + } } + input[type='checkbox']:checked + label::after { + border-color: #fff; + } + &.no-text { + label { + padding-left: 0; + } + } + } + &.sel { + input[type='checkbox']:checked + label { + color: #d7c863; + } + input[type='checkbox']:checked + label::before, + input[type='checkbox']:checked + label::after { + border-color: #d7c863; + } + } } // date-picker -.date-picker{ - svg{display: none;} - .react-datepicker-wrapper{ - width: 100%; - } - input[type=text]{ - display: block; - width: 100%; - height: 30px; - padding: 0 34px 0 10px; - border-radius: 2px; - border: 1px solid #eee; - font-size: 13px; - color: #45576F; - font-weight: normal; - font-family: 'Noto Sans JP', sans-serif; - background: #fff url(../../public/static/images/common/datepicker.svg) calc(100% - 11px) center no-repeat; - background-size: 14px 15px; - cursor: pointer; - } +.date-picker { + svg { + display: none; + } + .react-datepicker-wrapper { + width: 100%; + } + input[type='text'] { + display: block; + width: 100%; + height: 30px; + padding: 0 34px 0 10px; + border-radius: 2px; + border: 1px solid #eee; + font-size: 13px; + color: #45576f; + font-weight: normal; + font-family: 'Noto Sans JP', sans-serif; + background: #fff url(../../public/static/images/common/datepicker.svg) calc(100% - 11px) center no-repeat; + background-size: 14px 15px; + cursor: pointer; + } } // react select -.react-select-custom{ - width: 100%; - .custom__control{ - height: 30px; - min-height: unset; - border-radius: 2px; - border-color: #EEE; - background-color: #fff; - &:hover{ - border-color: #EEE; - } +.react-select-custom { + width: 100%; + .custom__control { + height: 30px; + min-height: unset; + border-radius: 2px; + border-color: #eee; + background-color: #fff; + &:hover { + border-color: #eee; } - .custom__control--is-focused{ - border-color: #EEE; - box-shadow: unset; - &:hover{ - border-color: #EEE; + } + .custom__control--is-focused { + border-color: #eee; + box-shadow: unset; + &:hover { + border-color: #eee; + } + } + .custom__value-container { + height: 100%; + padding: 0 10px; + } + .custom__placeholder, + .custom__single-value { + margin: 0; + } + .custom__single-value { + font-size: 13px; + color: #45576f; + font-weight: 400; + } + .custom__placeholder { + font-size: 13px; + color: #bbbbbb; + font-weight: 400; + } + .custom__indicator { + padding: 0; + svg { + display: none; + } + } + .custom__clear-indicator { + width: 30px; + height: 100%; + background: url(../../public/static/images/common/select_del.svg) no-repeat center; + background-size: 8px 8px; + } + .custom__dropdown-indicator { + width: 30px; + height: 100%; + background: url(../../public/static/images/common/select_light_arr.svg) no-repeat center; + } - } + .custom__menu { + margin: 1px 0; + border-radius: 2px; + overflow: hidden; + } + .custom__menu-list { + padding: 0; + } + .custom__option { + font-size: 13px; + padding: 7px 10px; + color: #45576f; + } + .custom__option--is-selected { + color: #fff; + } + // disable + &.custom--is-disabled { + .custom__control { + background-color: #fafafa; } - .custom__value-container { - height: 100%; - padding: 0 10px; - } - .custom__placeholder, - .custom__single-value{ - margin: 0; - } - .custom__single-value{ - font-size: 13px; - color: #45576F; - font-weight: 400; - } - .custom__placeholder{ - font-size: 13px; - color: #bbbbbb; - font-weight: 400; - } - .custom__indicator{ - padding: 0; - svg{ - display: none; - } - } - .custom__clear-indicator{ - width: 30px; - height: 100%; - background: url(../../public/static/images/common/select_del.svg) no-repeat center; - background-size: 8px 8px; - } - .custom__dropdown-indicator{ - width: 30px; - height: 100%; - background: url(../../public/static/images/common/select_light_arr.svg) no-repeat center; + .custom__single-value { + color: #999999; } + } +} - .custom__menu { - margin: 1px 0; - border-radius: 2px; - overflow: hidden; - } - .custom__menu-list { - padding: 0; - } - .custom__option{ - font-size: 13px; - padding: 7px 10px; - color: #45576F; - } - .custom__option--is-selected{ - color: #fff; - } - // disable - &.custom--is-disabled{ - .custom__control{ - background-color: #FAFAFA ; - } - .custom__single-value{ - color: #999999; - } - } -} \ No newline at end of file +// toggle +.toggle-btn { + position: relative; + display: inline-block; + width: 55px; + height: 20px; + input { + display: none; + } +} +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #454545; + transition: 0.4s; + border-radius: 10px; + text-align: center; + line-height: 20px; + color: white; + font-size: 12px; + font-weight: 400; + &:after { + content: 'OFF'; + position: absolute; + right: 7px; + color: white; + font-size: 12px; + font-weight: 400; + } + &:before { + position: absolute; + content: ''; + height: 16px; + width: 16px; + left: 2px; + bottom: 2px; + background-color: white; + transition: 0.4s; + border-radius: 50%; + } +} +input:checked + .slider { + background-color: #2563eb; + &:after { + content: 'ON'; + left: 10px; + right: auto; + } + &:before { + transform: translateX(35px); + } +} From 0f1e7709b6a09b929d69e48570d13226220e899f Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 12 Nov 2024 13:32:07 +0900 Subject: [PATCH 015/200] =?UTF-8?q?=EB=AA=A8=EB=93=88=ED=9A=8C=EB=A1=9C?= =?UTF-8?q?=EA=B5=AC=EC=84=B1=20=EA=B8=B0=EB=B3=B8=EC=84=A4=EC=A0=95=20=3D?= =?UTF-8?q?>=20=EB=B0=A9=EC=9C=84=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/common.js | 3 +- .../floor-plan/modal/basic/BasicSetting.jsx | 17 ++- .../modal/basic/step/Orientation.jsx | 43 ++++--- src/hooks/popup/useFlowDirectionSetting.js | 2 +- src/hooks/popup/useOrientation.js | 25 +++++ src/hooks/usePolygon.js | 105 +++++++++++++++++- src/store/orientationAtom.js | 6 + src/util/canvas-util.js | 17 +++ 8 files changed, 192 insertions(+), 26 deletions(-) create mode 100644 src/hooks/popup/useOrientation.js create mode 100644 src/store/orientationAtom.js diff --git a/src/common/common.js b/src/common/common.js index 358852b5..5cbd3733 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -76,7 +76,6 @@ export const LINE_TYPE = { HIP: 'hip', RIDGE: 'ridge', GABLE: 'gable', - VALLEY: 'valley', VERGE: 'verge', ONESIDE_FLOW_RIDGE: 'onesideFlowRidge', //한쪽흐름 용마루 YOSEMUNE: 'yosemune', //요세무네 @@ -158,6 +157,8 @@ export const SAVE_KEY = [ 'lines', 'offset', 'arrow', + 'surfaceCompass', + 'moduleCompass', ] export const OBJECT_PROTOTYPE = [fabric.Line.prototype, fabric.Polygon.prototype, fabric.Triangle.prototype] diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 6a7a1d0e..51cf7280 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -1,7 +1,6 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' -import { useState } from 'react' -import Orientation from '@/components/floor-plan/modal/basic/step/Orientation' +import { useEffect, useRef, useState } from 'react' import Module from '@/components/floor-plan/modal/basic/step/Module' import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchModule' import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement' @@ -9,12 +8,22 @@ import Placement from '@/components/floor-plan/modal/basic/step/Placement' import { useRecoilState } from 'recoil' import { canvasSettingState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' +import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation' export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() const { closePopup } = usePopup() const [tabNum, setTabNum] = useState(1) const [canvasSetting, setCanvasSetting] = useRecoilState(canvasSettingState) + const orientationRef = useRef(null) + + const handleBtnNextStep = () => { + if (tabNum === 1) { + orientationRef.current.handleNextStep() + } + setTabNum(tabNum + 1) + } + return (
@@ -32,7 +41,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
{getMessage('modal.module.basic.setting.module.placement')}
- {tabNum === 1 && } + {tabNum === 1 && } {/*배치면 초기설정 - 입력방법: 복시도 입력 || 실측값 입력*/} {canvasSetting.roofSizeSet && canvasSetting.roofSizeSet != 3 && tabNum === 2 && } {canvasSetting.roofSizeSet && canvasSetting.roofSizeSet != 3 && tabNum === 3 && } @@ -49,7 +58,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { )} {/*{tabNum !== 3 && }*/} {tabNum !== 3 && ( - )} diff --git a/src/components/floor-plan/modal/basic/step/Orientation.jsx b/src/components/floor-plan/modal/basic/step/Orientation.jsx index 98e10c0c..85ff6b33 100644 --- a/src/components/floor-plan/modal/basic/step/Orientation.jsx +++ b/src/components/floor-plan/modal/basic/step/Orientation.jsx @@ -1,22 +1,21 @@ -import { useState } from 'react' +import { forwardRef, useImperativeHandle, useState } from 'react' import { useMessage } from '@/hooks/useMessage' +import { useOrientation } from '@/hooks/popup/useOrientation' +import { getDegreeInOrientation } from '@/util/canvas-util' -export default function Orientation({ setTabNum }) { +export const Orientation = forwardRef(({ tabNum }, ref) => { const { getMessage } = useMessage() - const [compasDeg, setCompasDeg] = useState(0) + + const { nextStep, compasDeg, setCompasDeg } = useOrientation() + const [hasAnglePassivity, setHasAnglePassivity] = useState(false) - const getDegree = (degree) => { - if (degree % 15 === 0) return degree + useImperativeHandle(ref, () => ({ + handleNextStep, + })) - let value = Math.floor(degree / 15) - const remain = ((degree / 15) % 1).toFixed(5) - - if (remain > 0.4) { - value++ - } - - return value * 15 + const handleNextStep = () => { + nextStep() } return ( @@ -31,7 +30,7 @@ export default function Orientation({ setTabNum }) { {Array.from({ length: 180 / 15 }).map((dot, index) => (
setCompasDeg(15 * (12 + index))} > {index === 0 && 180°} @@ -39,13 +38,17 @@ export default function Orientation({ setTabNum }) {
))} {Array.from({ length: 180 / 15 }).map((dot, index) => ( -
setCompasDeg(15 * index)}> +
setCompasDeg(15 * index)} + > {index === 0 && } {index === 6 && 90°}
))}
-
+
@@ -62,7 +65,11 @@ export default function Orientation({ setTabNum }) { className="input-origin block" value={compasDeg} readOnly={hasAnglePassivity} - onChange={(e) => setCompasDeg(e.target.value !== '' ? Number.parseInt(e.target.value) : 0)} + onChange={(e) => + setCompasDeg( + e.target.value !== '' && parseInt(e.target.value) <= 360 && parseInt(e.target.value) >= 0 ? Number.parseInt(e.target.value) : 0, + ) + } /> ° @@ -72,4 +79,4 @@ export default function Orientation({ setTabNum }) { ) -} +}) diff --git a/src/hooks/popup/useFlowDirectionSetting.js b/src/hooks/popup/useFlowDirectionSetting.js index 9611d807..9e77aa4a 100644 --- a/src/hooks/popup/useFlowDirectionSetting.js +++ b/src/hooks/popup/useFlowDirectionSetting.js @@ -21,7 +21,7 @@ export function useFlowDirectionSetting(id) { direction: direction, surfaceCompass: orientation, }) - // drawDirectionArrow(roof) + drawDirectionArrow(roof) canvas?.renderAll() closePopup(id) } diff --git a/src/hooks/popup/useOrientation.js b/src/hooks/popup/useOrientation.js new file mode 100644 index 00000000..4b8f4574 --- /dev/null +++ b/src/hooks/popup/useOrientation.js @@ -0,0 +1,25 @@ +import { useRecoilState, useRecoilValue } from 'recoil' +import { canvasState } from '@/store/canvasAtom' +import { usePolygon } from '@/hooks/usePolygon' +import { POLYGON_TYPE } from '@/common/common' +import { compasDegAtom } from '@/store/orientationAtom' + +// 모듈,회로 구성 탭 기본설정 > 방위설정 탭 +export function useOrientation() { + const canvas = useRecoilValue(canvasState) + const [compasDeg, setCompasDeg] = useRecoilState(compasDegAtom) + + const { drawDirectionArrow } = usePolygon() + + const nextStep = () => { + const roofs = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) + roofs.forEach((roof) => { + roof.set({ + moduleCompass: compasDeg, + }) + drawDirectionArrow(roof) + }) + } + + return { nextStep, compasDeg, setCompasDeg } +} diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index 1b1538c9..b0f902cd 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -1,7 +1,7 @@ import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, fontFamilyState, fontSizeState, pitchTextSelector } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' import { fabric } from 'fabric' -import { getDegreeByChon, getDirectionByPoint, isPointOnLine } from '@/util/canvas-util' +import { getDegreeByChon, getDegreeInOrientation, getDirectionByPoint, isPointOnLine } from '@/util/canvas-util' import { QPolygon } from '@/components/fabric/QPolygon' import { isSamePoint, removeDuplicatePolygons } from '@/util/qpolygon-utils' import { flowDisplaySelector } from '@/store/settingAtom' @@ -283,12 +283,113 @@ export const usePolygon = () => { //arrow의 compass 값으로 방향 글자 설정 필요 const drawDirectionStringToArrow2 = (polygon) => { const { direction, surfaceCompass, moduleCompass, arrow } = polygon + if (moduleCompass === null || moduleCompass === undefined) { + const textObj = new fabric.Text(`${currentAngleType === ANGLE_TYPE.SLOPE ? arrow.pitch : getDegreeByChon(arrow.pitch)}${pitchText}`, { + fontSize: flowFontOptions.fontSize.value, + fill: flowFontOptions.fontColor.value, + fontFamily: flowFontOptions.fontFamily.value, + fontWeight: flowFontOptions.fontWeight.value, + originX: 'center', + originY: 'center', + name: 'flowText', + selectable: false, + left: arrow.stickeyPoint.x, + top: arrow.stickeyPoint.y, + parent: arrow, + parentId: arrow.id, + visible: isFlowDisplay, + }) - if (!surfaceCompass && !moduleCompass) { + polygon.canvas.add(textObj) return } let text = '' + console.log('direction', direction, surfaceCompass, moduleCompass) + + const compassType = (375 - moduleCompass) / 15 + + if ([1, 25].includes(compassType)) { + direction === 'north' ? (text = '北') : direction === 'south' ? (text = '南') : direction === 'west' ? (text = '西') : (text = '東') + } else if ([2, 3].includes(compassType)) { + direction === 'north' + ? (text = '北北東') + : direction === 'south' + ? (text = '南南西') + : direction === 'west' + ? (text = '西北西') + : (text = '東南東') + } else if ([4].includes(compassType)) { + direction === 'north' ? (text = '北東') : direction === 'south' ? (text = '南西') : direction === 'west' ? (text = '北西') : (text = '南東') + } else if ([5, 6].includes(compassType)) { + direction === 'north' + ? (text = '東北東') + : direction === 'south' + ? (text = '西南西') + : direction === 'west' + ? (text = '北北西') + : (text = '南南東') + } else if ([7].includes(compassType)) { + direction === 'north' ? (text = '東') : direction === 'south' ? (text = '西') : direction === 'west' ? (text = '北') : (text = '南') + } else if ([8, 9].includes(compassType)) { + direction === 'north' + ? (text = '東南東') + : direction === 'south' + ? (text = '西北西') + : direction === 'west' + ? (text = '北北東') + : (text = '南南西') + } else if ([10].includes(compassType)) { + direction === 'north' ? (text = '南東') : direction === 'south' ? (text = '北西') : direction === 'west' ? (text = '南西') : (text = '北東') + } else if ([11, 12].includes(compassType)) { + direction === 'north' + ? (text = '南南東') + : direction === 'south' + ? (text = '北北西') + : direction === 'west' + ? (text = '東北東') + : (text = '西南西') + } else if ([13].includes(compassType)) { + direction === 'north' ? (text = '南') : direction === 'south' ? (text = '北') : direction === 'west' ? (text = '東') : (text = '西') + } else if ([14, 15].includes(compassType)) { + direction === 'north' + ? (text = '南南西') + : direction === 'south' + ? (text = '北北東') + : direction === 'west' + ? (text = '東南東') + : (text = '西北西') + } else if ([16].includes(compassType)) { + direction === 'north' ? (text = '南西') : direction === 'south' ? (text = '北東') : direction === 'west' ? (text = '南東') : (text = '北西') + } else if ([17, 18].includes(compassType)) { + direction === 'north' + ? (text = '西南西') + : direction === 'south' + ? (text = '東北東') + : direction === 'west' + ? (text = '南南東') + : (text = '北北西') + } else if ([19].includes(compassType)) { + direction === 'north' ? (text = '西') : direction === 'south' ? (text = '東') : direction === 'west' ? (text = '南') : (text = '北') + } else if ([20, 21].includes(compassType)) { + direction === 'north' + ? (text = '西北西') + : direction === 'south' + ? (text = '東南東') + : direction === 'west' + ? (text = '南南西') + : (text = '北北東') + } else if ([22].includes(compassType)) { + direction === 'north' ? (text = '北西') : direction === 'south' ? (text = '南東') : direction === 'west' ? (text = '南西') : (text = '北東') + } else if ([23, 24].includes(compassType)) { + direction === 'north' + ? (text = '北北西') + : direction === 'south' + ? (text = '南南東') + : direction === 'west' + ? (text = '西南西') + : (text = '東北東') + } // 東,西,南,北 if ([360].includes(surfaceCompass)) { diff --git a/src/store/orientationAtom.js b/src/store/orientationAtom.js new file mode 100644 index 00000000..d403c221 --- /dev/null +++ b/src/store/orientationAtom.js @@ -0,0 +1,6 @@ +import { atom } from 'recoil' + +export const compasDegAtom = atom({ + key: 'compasDegAtom', + default: 0, +}) diff --git a/src/util/canvas-util.js b/src/util/canvas-util.js index a78beb15..5f55092c 100644 --- a/src/util/canvas-util.js +++ b/src/util/canvas-util.js @@ -954,3 +954,20 @@ export const getAllRelatedObjects = (id, canvas) => { return result } + +// 모듈,회로 구성에서 사용하는 degree 범위 별 값 +export const getDegreeInOrientation = (degree) => { + if (degree >= 352) { + return 0 + } + if (degree % 15 === 0) return degree + + let value = Math.floor(degree / 15) + const remain = ((degree / 15) % 1).toFixed(5) + + if (remain > 0.4) { + value++ + } + + return value * 15 +} From 55932440b19aa4c1145fad78f0be16a07e1b7f96 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Tue, 12 Nov 2024 14:02:29 +0900 Subject: [PATCH 016/200] =?UTF-8?q?=EB=9D=BC=EC=9D=B8=20attribute=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/fabric/QPolygon.js | 6 +++--- src/hooks/useCanvas.js | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index ce4d93c7..64ec1125 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -167,9 +167,9 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { }, initLines() { - if (this.lines.length > 0) { - return - } + // if (this.lines.length > 0) { + // return + // } this.lines = [] diff --git a/src/hooks/useCanvas.js b/src/hooks/useCanvas.js index c1bc760f..46dbbb35 100644 --- a/src/hooks/useCanvas.js +++ b/src/hooks/useCanvas.js @@ -118,10 +118,12 @@ export function useCanvas(id) { //QLine에 커스텀 어트리뷰트 넣기 if (this.type === 'QLine') { - this.attributes.type = this.attributes.type || 'default' - source.attributes = { - ...this.attributes, - type: this.attributes.type, + if (this.attributes) { + this.attributes.type = this.attributes.type || 'default' + source.attributes = { + ...this.attributes, + type: this.attributes.type, + } } } From 0dd6e7d707ab2642fbdbc93086051b499fcf6ae3 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 12 Nov 2024 14:40:13 +0900 Subject: [PATCH 017/200] =?UTF-8?q?=EC=99=B8=EB=B2=BD=EC=84=A0=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EB=8B=AB=EC=9C=BC=EB=A9=B4=20startPoint=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0,=20=EC=A7=80=EB=B6=95=EB=A9=B4=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=20=EC=8B=9C=20=EC=9D=B4=EB=AF=B8=20=ED=95=A0=EB=8B=B9?= =?UTF-8?q?=EB=90=9C=20=EC=A7=80=EB=B6=95=EC=9D=80=20=EC=9E=AC=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=20=EC=95=88=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/common.js | 1 + src/hooks/roofcover/useOuterLineWall.js | 10 +++++++++- src/hooks/roofcover/useRoofAllocationSetting.js | 6 +++++- src/hooks/usePolygon.js | 1 - 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/common/common.js b/src/common/common.js index 5cbd3733..588b836c 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -159,6 +159,7 @@ export const SAVE_KEY = [ 'arrow', 'surfaceCompass', 'moduleCompass', + 'isFixed', ] export const OBJECT_PROTOTYPE = [fabric.Line.prototype, fabric.Polygon.prototype, fabric.Triangle.prototype] diff --git a/src/hooks/roofcover/useOuterLineWall.js b/src/hooks/roofcover/useOuterLineWall.js index b2244da8..7c4d5091 100644 --- a/src/hooks/roofcover/useOuterLineWall.js +++ b/src/hooks/roofcover/useOuterLineWall.js @@ -1,6 +1,6 @@ import { useEffect, useRef } from 'react' import { distanceBetweenPoints } from '@/util/canvas-util' -import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' +import { useRecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil' import { adsorptionPointAddModeState, adsorptionPointModeState, @@ -65,6 +65,7 @@ export function useOuterLineWall(id, propertiesId) { const [arrow1, setArrow1] = useRecoilState(outerLineArrow1State) const [arrow2, setArrow2] = useRecoilState(outerLineArrow2State) const [points, setPoints] = useRecoilState(outerLinePointsState) + const resetPoints = useResetRecoilState(outerLinePointsState) const [type, setType] = useRecoilState(outerLineTypeState) const [angle1, setAngle1] = useRecoilState(outerLineAngle1State) const [angle2, setAngle2] = useRecoilState(outerLineAngle2State) @@ -88,6 +89,13 @@ export function useOuterLineWall(id, propertiesId) { clear() return () => { initEvent() + + canvas + .getObjects() + .filter((obj) => obj.name === 'startPoint') + .forEach((obj) => { + canvas.remove(obj) + }) } }, [verticalHorizontalMode, points, adsorptionPointAddMode, adsorptionPointMode, adsorptionRange, interval, tempGridMode]) diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index b4118dc1..5626e075 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -176,7 +176,7 @@ export function useRoofAllocationSetting(id) { } const apply = () => { - const roofBases = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) + const roofBases = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF && !obj.isFixed) const wallLines = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.WALL) roofBases.forEach((roofBase) => { try { @@ -199,6 +199,10 @@ export function useRoofAllocationSetting(id) { const roofs = canvas.getObjects().filter((obj) => obj.name === 'roof') roofs.forEach((roof) => { + if (roof.isFixed) return + roof.set({ + isFixed: true, + }) setSurfaceShapePattern(roof, roofDisplay.column) drawDirectionArrow(roof) }) diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index b0f902cd..fd8e925d 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -305,7 +305,6 @@ export const usePolygon = () => { } let text = '' - console.log('direction', direction, surfaceCompass, moduleCompass) const compassType = (375 - moduleCompass) / 15 From ac6bf7eae38c94295e8484ebf4c3d9815f20fd2c Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 12 Nov 2024 15:05:19 +0900 Subject: [PATCH 018/200] =?UTF-8?q?=EA=B0=81=EB=8F=84=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePolygon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index fd8e925d..21c708ee 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -306,7 +306,7 @@ export const usePolygon = () => { let text = '' - const compassType = (375 - moduleCompass) / 15 + const compassType = (375 - getDegreeInOrientation(moduleCompass)) / 15 if ([1, 25].includes(compassType)) { direction === 'north' ? (text = '北') : direction === 'south' ? (text = '南') : direction === 'west' ? (text = '西') : (text = '東') From e71def740107e42e6bb96b96657fe80efccef559 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 12 Nov 2024 16:08:32 +0900 Subject: [PATCH 019/200] =?UTF-8?q?canvas=20=EC=A0=80=EC=9E=A5=20=EC=A0=84?= =?UTF-8?q?=20activeObject=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePlan.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index ab67452e..b0ed47d6 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -57,6 +57,7 @@ export function usePlan() { */ const currentCanvasData = (mode = '') => { removeMouseLines() + canvas.discardActiveObject() if (mode === 'save') { const groups = canvas.getObjects().filter((obj) => obj.type === 'group') From 0464cf81fffcfc868af6b2750c3a87434ba725d8 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 12 Nov 2024 16:14:01 +0900 Subject: [PATCH 020/200] =?UTF-8?q?option.id=20=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20key=20=EA=B4=80=EB=A0=A8=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/select/QSelectBox.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/common/select/QSelectBox.jsx b/src/components/common/select/QSelectBox.jsx index df745d64..3da9f30b 100644 --- a/src/components/common/select/QSelectBox.jsx +++ b/src/components/common/select/QSelectBox.jsx @@ -18,8 +18,8 @@ export default function QSelectBox({ title = '', options, onChange, value, disab
{} : () => setOpenSelect(!openSelect)}>

{selected}

    - {options?.map((option) => ( -
  • handleClickSelectOption(option)}> + {options?.map((option, index) => ( +
  • handleClickSelectOption(option)}>
  • ))} From 529d5b551bb863d89c0683bea6eedfb6422870a6 Mon Sep 17 00:00:00 2001 From: minsik Date: Tue, 12 Nov 2024 16:22:43 +0900 Subject: [PATCH 021/200] =?UTF-8?q?Canvas=20setting=20font=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/font/FontSetting.jsx | 82 ++++++------ .../modal/setting01/SecondOption.jsx | 103 ++++++++------- .../dimensionLine/DimensionLineSetting.jsx | 123 +++++++++--------- src/hooks/common/useCommonUtils.js | 13 +- src/hooks/common/useFont.js | 12 +- src/store/commonUtilsAtom.js | 4 - 6 files changed, 162 insertions(+), 175 deletions(-) diff --git a/src/components/common/font/FontSetting.jsx b/src/components/common/font/FontSetting.jsx index a658871d..b48f3882 100644 --- a/src/components/common/font/FontSetting.jsx +++ b/src/components/common/font/FontSetting.jsx @@ -3,76 +3,69 @@ import QSelectBox from '@/components/common/select/QSelectBox' import { usePopup } from '@/hooks/usePopup' import { useState } from 'react' import { useMessage } from '@/hooks/useMessage' -import { useRecoilState, useRecoilValue } from 'recoil' -import { fontSelector, globalFontAtom } from '@/store/fontAtom' +import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' const fonts = [ - { name: 'MS PGothic', value: 'MS PGothic' }, - { name: '@Yu Gothic', value: '@Yu Gothic' }, - { name: 'Yu Gothic', value: 'Yu Gothic' }, - { name: '@Yu Gothic UI', value: '@Yu Gothic UI' }, - { name: 'Yu Gothic UI', value: 'Yu Gothic UI' }, + { id: 1, name: 'MS PGothic', value: 'MS PGothic' }, + { id: 2, name: '@Yu Gothic', value: '@Yu Gothic' }, + { id: 3, name: 'Yu Gothic', value: 'Yu Gothic' }, + { id: 4, name: '@Yu Gothic UI', value: '@Yu Gothic UI' }, + { id: 5, name: 'Yu Gothic UI', value: 'Yu Gothic UI' }, + 3, ] const fontSizes = [ ...Array.from({ length: 4 }).map((_, index) => { - return { name: index + 8, value: index + 8 } + return { id: index + 8, name: index + 8, value: index + 8 } }), ...Array.from({ length: 9 }).map((_, index) => { - return { name: (index + 6) * 2, value: (index + 6) * 2 } + return { id: (index + 6) * 2, name: (index + 6) * 2, value: (index + 6) * 2 } }), - { name: 36, value: 36 }, - { name: 48, value: 48 }, - { name: 72, value: 72 }, + { id: 36, name: 36, value: 36 }, + { id: 48, name: 48, value: 48 }, + { id: 72, name: 72, value: 72 }, ] export default function FontSetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) - const { id, setIsShow, pos = contextPopupPosition, type, isConfig = false } = props + const { id, setIsShow, pos = contextPopupPosition, type, isConfig = false, onSave, font } = props const { getMessage } = useMessage() const { closePopup } = usePopup() - const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) - const currentFont = useRecoilValue(fontSelector(type)) - - const [selectedFont, setSelectedFont] = useState(currentFont.fontFamily) - const [selectedFontWeight, setSelectedFontWeight] = useState(currentFont.fontWeight) - const [selectedFontSize, setSelectedFontSize] = useState(currentFont.fontSize) - const [selectedFontColor, setSelectedFontColor] = useState(currentFont.fontColor) + const [selectedFont, setSelectedFont] = useState(font.fontFamily) + const [selectedFontWeight, setSelectedFontWeight] = useState(font.fontWeight) + const [selectedFontSize, setSelectedFontSize] = useState(font.fontSize) + const [selectedFontColor, setSelectedFontColor] = useState(font.fontColor) const fontOptions = [ - { name: getMessage('font.style.normal'), value: 'normal' }, - { name: getMessage('font.style.italic'), value: 'italic' }, + { id: 'normal', name: getMessage('font.style.normal'), value: 'normal' }, + { id: 'italic', name: getMessage('font.style.italic'), value: 'italic' }, { + id: 'bold', name: getMessage('font.style.bold'), value: 'bold', }, - { name: getMessage('font.style.bold.italic'), value: 'boldAndItalic' }, + { id: 'boldAndItalic', name: getMessage('font.style.bold.italic'), value: 'boldAndItalic' }, ] const fontColors = [ - { name: getMessage('color.black'), value: 'black' }, - { name: getMessage('color.red'), value: 'red' }, - { name: getMessage('color.blue'), value: 'blue' }, - { name: getMessage('color.gray'), value: 'gray' }, - { name: getMessage('color.yellow'), value: 'yellow' }, - { name: getMessage('color.green'), value: 'green' }, - { name: getMessage('color.pink'), value: 'pink' }, - { name: getMessage('color.gold'), value: 'gold' }, - { name: getMessage('color.darkblue'), value: 'darkblue' }, + { id: 'black', name: getMessage('color.black'), value: 'black' }, + { id: 'red', name: getMessage('color.red'), value: 'red' }, + { id: 'blue', name: getMessage('color.blue'), value: 'blue' }, + { id: 'gray', name: getMessage('color.gray'), value: 'gray' }, + { id: 'yellow', name: getMessage('color.yellow'), value: 'yellow' }, + { id: 'green', name: getMessage('color.green'), value: 'green' }, + { id: 'pink', name: getMessage('color.pink'), value: 'pink' }, + { id: 'gold', name: getMessage('color.gold'), value: 'gold' }, + { id: 'darkblue', name: getMessage('color.darkblue'), value: 'darkblue' }, ] const handleSaveBtn = () => { - setGlobalFont((prev) => { - return { - ...prev, - [type]: { - fontFamily: selectedFont, - fontSize: selectedFontSize, - fontColor: selectedFontColor, - fontWeight: selectedFontWeight, - }, - } + onSave({ + fontFamily: selectedFont, + fontSize: selectedFontSize, + fontColor: selectedFontColor, + fontWeight: selectedFontWeight, }) if (setIsShow) setIsShow(false) - closePopup(id) + closePopup(id, isConfig) } return ( @@ -125,7 +118,8 @@ export default function FontSetting(props) { style={{ fontFamily: selectedFont?.value ?? '', fontSize: selectedFontSize?.value ?? '12px', - fontWeight: '400', + fontStyle: selectedFontWeight?.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: selectedFontWeight?.value.toLowerCase().includes('bold') ? 'bold' : 'normal', color: selectedFontColor?.value ?? 'black', }} > diff --git a/src/components/floor-plan/modal/setting01/SecondOption.jsx b/src/components/floor-plan/modal/setting01/SecondOption.jsx index 385c7bef..91156ef3 100644 --- a/src/components/floor-plan/modal/setting01/SecondOption.jsx +++ b/src/components/floor-plan/modal/setting01/SecondOption.jsx @@ -1,4 +1,3 @@ -import { useRecoilValue } from 'recoil' import { useMessage } from '@/hooks/useMessage' import React, { useEffect, useState } from 'react' import DimensionLineSetting from '@/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting' @@ -6,55 +5,35 @@ import { usePopup } from '@/hooks/usePopup' import { v4 as uuidv4 } from 'uuid' import FontSetting from '@/components/common/font/FontSetting' import PlanSizeSetting from '@/components/floor-plan/modal/setting01/planSize/PlanSizeSetting' -import { dimensionLineSettingsState } from '@/store/commonUtilsAtom' import { useCanvasSetting } from '@/hooks/option/useCanvasSetting' +import { useRecoilState, useRecoilValue } from 'recoil' +import { fontSelector, globalFontAtom } from '@/store/fontAtom' export default function SecondOption() { const { getMessage } = useMessage() - const { addPopup, closePopup, closePopups } = usePopup() + const { addPopup, closePopup } = usePopup() const [showFontSettingModal, setShowFontSettingModal] = useState(false) const [showDimensionLineSettingModal, setShowDimensionLineSettingModal] = useState(false) const [showPlanSizeSettingModal, setShowPlanSizeSettingModal] = useState(false) - const dimensionSettings = useRecoilValue(dimensionLineSettingsState) - + const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) const [objectNo, setObjectNo] = useState('test123240912001') // 이후 삭제 필요 - const { settingModalFirstOptions, setSettingModalFirstOptions } = useCanvasSetting() const { settingModalSecondOptions, setSettingModalSecondOptions } = useCanvasSetting() const { adsorptionPointMode, setAdsorptionPointMode } = useCanvasSetting() const { fetchSettings, frontSettings, onClickOption } = useCanvasSetting() + const commonFont = useRecoilValue(fontSelector('commonText')) + const flowFont = useRecoilValue(fontSelector('flowText')) + const lengthFont = useRecoilValue(fontSelector('lengthText')) + const circuitNumberTextFont = useRecoilValue(fontSelector('circuitNumberText')) + const [dimensionId, setDimensionId] = useState(uuidv4()) + const [fontId, setFontId] = useState(uuidv4()) + const [planSizeId, setPlanSizeId] = useState(uuidv4()) // 데이터를 최초 한 번만 조회 useEffect(() => { - console.log('SecondOption useEffect 실행') //fetchSettings() }, [objectNo]) - let dimensionId = null - let fontId = null - let planSizeId = null - const [pixel, setPixel] = useState(dimensionSettings.pixel) - const [color, setColor] = useState(dimensionSettings.color) - const [font, setFont] = useState(null) - const [fontSize, setFontSize] = useState(dimensionSettings.fontSize) - const [fontColor, setFontColor] = useState(dimensionSettings.fontColor) - - useEffect(() => { - dimensionId = uuidv4() - fontId = uuidv4() - planSizeId = uuidv4() - }, []) - const dimensionProps = { - color, - setColor, - pixel, - setPixel, - font, - setFont, - fontSize, - setFontSize, - fontColor, - setFontColor, id: dimensionId, isShow: showDimensionLineSettingModal, setIsShow: setShowDimensionLineSettingModal, @@ -62,23 +41,6 @@ export default function SecondOption() { const [horizon, setHorizon] = useState(1600) const [vertical, setVertical] = useState(1600) - - const fontProps = { - id: fontId, - pos: { x: 745, y: 180 }, - setIsShow: setShowFontSettingModal, - isConfig: true, - } - const planSizeProps = { - id: planSizeId, - horizon, - setHorizon, - vertical, - setVertical, - setIsShow: setShowPlanSizeSettingModal, - pos: { x: 1025, y: 180 }, - } - const handlePopup = (type) => { setShowPlanSizeSettingModal(false) setShowFontSettingModal(false) @@ -90,6 +52,7 @@ export default function SecondOption() { setShowDimensionLineSettingModal(false) fontProps.type = 'commonText' fontProps.id = fontId + 1 + fontProps.font = commonFont addPopup(fontId + 1, 2, , true) break } @@ -99,6 +62,7 @@ export default function SecondOption() { setShowFontSettingModal(true) setShowDimensionLineSettingModal(false) fontProps.type = 'flowText' + fontProps.font = flowFont fontProps.id = fontId + 2 addPopup(fontId + 2, 2, , true) break @@ -107,9 +71,9 @@ export default function SecondOption() { case 'font3': { //치수 글꼴변경 setShowFontSettingModal(true) - setShowDimensionLineSettingModal(false) fontProps.type = 'lengthText' + fontProps.font = lengthFont fontProps.id = fontId + 3 addPopup(fontId + 3, 2, , true) break @@ -120,6 +84,7 @@ export default function SecondOption() { setShowFontSettingModal(true) setShowDimensionLineSettingModal(false) fontProps.type = 'circuitNumberText' + fontProps.font = circuitNumberTextFont fontProps.id = fontId addPopup(fontId, 2, , true) break @@ -129,6 +94,12 @@ export default function SecondOption() { //치수선 설정 if (!showDimensionLineSettingModal) { setShowDimensionLineSettingModal(true) + fontProps.font = { + fontFamily: '', + fontColor: '', + fontSize: '', + fontWeight: '', + } addPopup(dimensionId, 2, , true) } else { setShowDimensionLineSettingModal(false) @@ -147,6 +118,38 @@ export default function SecondOption() { } } + const handleFontSave = (font) => { + setGlobalFont((prev) => { + return { + ...prev, + [fontProps.type]: { + fontFamily: font.fontFamily, + fontWeight: font.fontWeight, + fontSize: font.fontSize, + fontColor: font.fontColor, + }, + } + }) + } + + const fontProps = { + id: fontId, + pos: { x: 745, y: 180 }, + setIsShow: setShowFontSettingModal, + onSave: handleFontSave, + isConfig: true, + } + + const planSizeProps = { + id: planSizeId, + horizon, + setHorizon, + vertical, + setVertical, + setIsShow: setShowPlanSizeSettingModal, + pos: { x: 1025, y: 180 }, + } + return ( <>
    diff --git a/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx b/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx index 1aa39e74..65fc2d28 100644 --- a/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx +++ b/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx @@ -8,68 +8,57 @@ import QSelectBox from '@/components/common/select/QSelectBox' import { useMessage } from '@/hooks/useMessage' import { dimensionLineSettingsState } from '@/store/commonUtilsAtom' import { useRecoilState } from 'recoil' +import { globalFontAtom } from '@/store/fontAtom' -/* - color: 치수선 색 - fontColor: 글꼴 색 - fontSize: 치수선 치수 색 - pixel: 치수선 두깨 -*/ export default function DimensionLineSetting(props) { - const { - color, - setColor, - font, - setFont, - fontColor, - setFontColor, - fontSize, - setFontSize, - pixel, - setPixel, - isShow, - setIsShow, - id, - pos = { x: 985, y: 180 }, - } = props + const { isShow, setIsShow, id, pos = { x: 985, y: 180 } } = props const { addPopup, closePopup, closePopups } = usePopup() const pixels = Array.from({ length: 5 }).map((_, index) => { - return { name: index + 1, value: index + 1 } + return { id: index, name: index + 1, value: index + 1 } }) - const [originColor, setOriginColor] = useState(color) - const [originFont, setOriginFont] = useState(font) - const [originFontColor, setOriginFontColor] = useState(fontColor) - const [originFontSize, setOriginFontSize] = useState(fontSize) - const [originPixel, setOriginPixel] = useState(pixel) + const [dimensionLineSettings, setDimensionLineSettings] = useRecoilState(dimensionLineSettingsState) + const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) + const [originPixel, setOriginPixel] = useState(dimensionLineSettings.pixel) + const [originColor, setOriginColor] = useState(dimensionLineSettings.color) + const [originFont, setOriginFont] = useState(globalFont.dimensionLineText.fontFamily) + const [originFontColor, setOriginFontColor] = useState(globalFont.dimensionLineText.fontColor) + const [originFontSize, setOriginFontSize] = useState(globalFont.dimensionLineText.fontSize) + const [originFontWeight, setOriginFontWeight] = useState(globalFont.dimensionLineText.fontWeight) const [fontModalId, setFontModalId] = useState(uuidv4()) - const [colorModalId, setColorModalId] = useState(uuidv4()) + const [colorModalId, setColorModalId] = useState(uuidv4()) const [showColorPickerModal, setShowColorPickerModal] = useState(false) const [showFontModal, setShowFontModal] = useState(false) const { getMessage } = useMessage() - const [dimensionLineSettings, setDimensionLineSettings] = useRecoilState(dimensionLineSettingsState) useEffect(() => { - console.log(2, isShow) - if (pixel) { - setOriginPixel(pixels?.filter((data) => data.value === pixel)[0]) + if (originPixel) { + setOriginPixel(pixels?.filter((data) => data.value === originPixel)[0]) } setIsShow(true) }, []) useEffect(() => { - console.log(1, isShow) if (!isShow) { closePopups([fontModalId, colorModalId]) } }, [isShow]) + const handleFontSave = (font) => { + setOriginFont(font.fontFamily) + setOriginFontSize(font.fontSize) + setOriginFontColor(font.fontColor) + setOriginFontWeight(font.fontWeight) + } + const handleColorSave = () => {} + const colorPickerProps = { isShow: showColorPickerModal, setIsShow: setShowColorPickerModal, color: originColor, setColor: setOriginColor, id: colorModalId, + isConfig: true, pos: { x: 495, y: 180, @@ -79,14 +68,13 @@ export default function DimensionLineSetting(props) { const fontProps = { isShow: showFontModal, setIsShow: setShowFontModal, - color: originColor, - setColor: setOriginColor, - font: originFont, - setFont: setOriginFont, - fontColor: 'black', - setFontColor: setOriginFontColor, - fontSize: originFontSize, - setFontSize: setOriginFontSize, + font: { + fontFamily: originFont, + fontSize: originFontSize, + fontColor: originFontColor, + fontWeight: originFontWeight, + }, + onSave: handleFontSave, isConfig: true, id: fontModalId, pos: { @@ -106,6 +94,29 @@ export default function DimensionLineSetting(props) { } } + const onSave = () => { + setGlobalFont((prev) => { + return { + ...prev, + dimensionLineText: { + fontFamily: originFont, + fontWeight: originFontWeight, + fontSize: originFontSize, + fontColor: originFontColor, + }, + } + }) + setDimensionLineSettings((prev) => { + return { + ...prev, + pixel: originPixel?.value, + color: originColor, + } + }) + setIsShow(false) + closePopups([fontModalId, colorModalId, id]) + } + return (
    @@ -149,9 +160,10 @@ export default function DimensionLineSetting(props) { className="font" style={{ fontFamily: originFont?.value ?? '', - color: originFontColor?.value ?? 'black', + color: originFontColor.value ?? 'black', fontSize: originFontSize?.value ?? '12px', - fontWeight: '400', + fontStyle: originFontWeight?.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: originFontWeight?.value.toLowerCase().includes('bold') ? 'bold' : 'normal', }} > 9,999 @@ -161,7 +173,7 @@ export default function DimensionLineSetting(props) { style={{ backgroundColor: originColor, borderColor: originColor, - height: originPixel.value, + height: originPixel?.value, }} >
    @@ -169,26 +181,7 @@ export default function DimensionLineSetting(props) {
-
diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 2902e0c3..bb6a11cd 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -1,16 +1,14 @@ import { useEffect } from 'react' -import { useRecoilValue, useRecoilState } from 'recoil' +import { useRecoilState, useRecoilValue } from 'recoil' import { wordDisplaySelector } from '@/store/settingAtom' import { useEvent } from '@/hooks/useEvent' import { checkLineOrientation, getDistance } from '@/util/canvas-util' -import { dimensionLineSettingsState } from '@/store/commonUtilsAtom' +import { commonUtilsState, dimensionLineSettingsState } from '@/store/commonUtilsAtom' import { fontSelector } from '@/store/fontAtom' import { canvasState } from '@/store/canvasAtom' import { v4 as uuidv4 } from 'uuid' import { usePopup } from '@/hooks/usePopup' import Distance from '@/components/floor-plan/modal/distance/Distance' -import { commonUtilsState } from '@/store/commonUtilsAtom' -import { center, point } from '@turf/turf' export function useCommonUtils() { const canvas = useRecoilValue(canvasState) @@ -39,6 +37,7 @@ export function useCommonUtils() { commonTextKeyEvent() addCanvasMouseEventListener('mouse:down', (event) => { const pointer = canvas?.getPointer(event.e) + textbox = new fabric.Textbox('', { left: pointer.x, top: pointer.y, @@ -49,7 +48,8 @@ export function useCommonUtils() { fill: commonTextFont.fontColor.value, fontFamily: commonTextFont.fontFamily.value, fontSize: commonTextFont.fontSize.value, - fontStyle: commonTextFont.fontWeight.value, + fontStyle: commonTextFont.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: commonTextFont.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', selectable: true, lockMovementX: true, lockMovementY: true, @@ -262,7 +262,8 @@ export function useCommonUtils() { fill: dimensionLineTextFont.fontColor.value, fontSize: dimensionLineTextFont.fontSize.value, fontFamily: dimensionLineTextFont.fontFamily.value, - fontStyle: dimensionLineTextFont.fontWeight.value, + fontStyle: dimensionLineTextFont.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: dimensionLineTextFont.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', selectable: true, textAlign: 'center', originX: 'center', diff --git a/src/hooks/common/useFont.js b/src/hooks/common/useFont.js index 595ec74c..e6decd1a 100644 --- a/src/hooks/common/useFont.js +++ b/src/hooks/common/useFont.js @@ -17,8 +17,8 @@ export function useFont() { textObjs.forEach((obj) => { obj.set({ fontFamily: commonText.fontFamily.value, - fontWeight: lengthText.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', - fontStyle: lengthText.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: commonText.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', + fontStyle: commonText.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', fontSize: commonText.fontSize.value, fill: commonText.fontColor.value, }) @@ -33,8 +33,8 @@ export function useFont() { textObjs.forEach((obj) => { obj.set({ fontFamily: dimensionLineText.fontFamily.value, - fontWeight: lengthText.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', - fontStyle: lengthText.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: dimensionLineText.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', + fontStyle: dimensionLineText.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', fontSize: dimensionLineText.fontSize.value, fill: dimensionLineText.fontColor.value, }) @@ -49,8 +49,8 @@ export function useFont() { textObjs.forEach((obj) => { obj.set({ fontFamily: flowText.fontFamily.value, - fontWeight: lengthText.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', - fontStyle: lengthText.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: flowText.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', + fontStyle: flowText.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', fontSize: flowText.fontSize.value, fill: flowText.fontColor.value, }) diff --git a/src/store/commonUtilsAtom.js b/src/store/commonUtilsAtom.js index 545f8196..29ef7982 100644 --- a/src/store/commonUtilsAtom.js +++ b/src/store/commonUtilsAtom.js @@ -11,10 +11,6 @@ export const dimensionLineSettingsState = atom({ default: { pixel: 1, color: '#000000', - font: 'Arial', - fontColor: '#000000', - fontSize: 15, - fontStyle: 'normal', }, }) From 64cd0ca1f3b958f794a38b086d0de6d4c7895f7e Mon Sep 17 00:00:00 2001 From: minsik Date: Tue, 12 Nov 2024 16:54:50 +0900 Subject: [PATCH 022/200] =?UTF-8?q?context=20menu=20=ED=8F=B0=ED=8A=B8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useContextMenu.js | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 9061782e..dc57bf12 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -33,6 +33,7 @@ import RowInsert from '@/components/floor-plan/modal/module/row/RowInsert' import CircuitNumberEdit from '@/components/floor-plan/modal/module/CircuitNumberEdit' import { useObjectBatch } from '@/hooks/object/useObjectBatch' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' +import { fontSelector, globalFontAtom } from '@/store/fontAtom' export function useContextMenu() { const currentMenu = useRecoilValue(currentMenuState) // 현재 메뉴 @@ -51,6 +52,9 @@ export function useContextMenu() { const { handleZoomClear } = useCanvasEvent() const { moveObjectBatch } = useObjectBatch({}) const { moveSurfaceShapeBatch } = useSurfaceShapeBatch() + const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) + const commonTextFont = useRecoilValue(fontSelector('commonText')) + const currentMenuSetting = () => { switch (currentMenu) { case MENU.PLAN_DRAWING: @@ -417,7 +421,26 @@ export function useContextMenu() { { id: 'commonTextFontSetting', name: getMessage('contextmenu.font.setting'), - component: , + component: ( + { + setGlobalFont((prev) => { + return { + ...prev, + commonText: { + fontFamily: font.fontFamily, + fontWeight: font.fontWeight, + fontSize: font.fontSize, + fontColor: font.fontColor, + }, + } + }) + }} + /> + ), }, { id: 'commonTextEdit', From d4a678aae6f4919c13f93356dd7ae922c35f8ade Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 12 Nov 2024 16:56:04 +0900 Subject: [PATCH 023/200] =?UTF-8?q?=ED=8F=B0=ED=8A=B8=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EC=88=98=EC=A0=95,=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/option/useFirstOption.js | 2 +- src/hooks/usePolygon.js | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/hooks/option/useFirstOption.js b/src/hooks/option/useFirstOption.js index c296a942..8757040a 100644 --- a/src/hooks/option/useFirstOption.js +++ b/src/hooks/option/useFirstOption.js @@ -40,7 +40,7 @@ export function useFirstOption() { optionName = ['roof', POLYGON_TYPE.ROOF] break case 'wordDisplay': //문자 표시 - optionName = ['6'] + optionName = ['commonText'] break case 'circuitNumDisplay': //회로번호 표시 optionName = ['7'] diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index 21c708ee..b3730493 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -285,12 +285,14 @@ export const usePolygon = () => { const { direction, surfaceCompass, moduleCompass, arrow } = polygon if (moduleCompass === null || moduleCompass === undefined) { const textObj = new fabric.Text(`${currentAngleType === ANGLE_TYPE.SLOPE ? arrow.pitch : getDegreeByChon(arrow.pitch)}${pitchText}`, { + fontFamily: flowFontOptions.fontFamily.value, + fontWeight: flowFontOptions.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', + fontStyle: flowFontOptions.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', fontSize: flowFontOptions.fontSize.value, fill: flowFontOptions.fontColor.value, - fontFamily: flowFontOptions.fontFamily.value, - fontWeight: flowFontOptions.fontWeight.value, originX: 'center', originY: 'center', + pitch: arrow.pitch, name: 'flowText', selectable: false, left: arrow.stickeyPoint.x, @@ -426,10 +428,12 @@ export const usePolygon = () => { } const textObj = new fabric.Text(`${text} (${currentAngleType === ANGLE_TYPE.SLOPE ? arrow.pitch : getDegreeByChon(arrow.pitch)}${pitchText})`, { + fontFamily: flowFontOptions.fontFamily.value, + fontWeight: flowFontOptions.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', + fontStyle: flowFontOptions.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', fontSize: flowFontOptions.fontSize.value, fill: flowFontOptions.fontColor.value, - fontFamily: flowFontOptions.fontFamily.value, - fontWeight: flowFontOptions.fontWeight.value, + pitch: arrow.pitch, originX: 'center', originY: 'center', name: 'flowText', @@ -641,10 +645,11 @@ export const usePolygon = () => { const textStr = `${txt} (${currentAngleType === ANGLE_TYPE.SLOPE ? arrow.pitch : getDegreeByChon(arrow.pitch)}${pitchText})` const text = new fabric.Text(`${textStr}`, { + fontFamily: flowFontOptions.fontFamily.value, + fontWeight: flowFontOptions.fontWeight.value.toLowerCase().includes('bold') ? 'bold' : 'normal', + fontStyle: flowFontOptions.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', fontSize: flowFontOptions.fontSize.value, fill: flowFontOptions.fontColor.value, - fontFamily: flowFontOptions.fontFamily.value, - fontWeight: flowFontOptions.fontWeight.value, pitch: arrow.pitch, originX: 'center', originY: 'center', From 045b6bf615bbf1f7d14b9b6f4fb360a197e3f8b4 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 12 Nov 2024 17:03:09 +0900 Subject: [PATCH 024/200] =?UTF-8?q?commonText=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/option/useCanvasSetting.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hooks/option/useCanvasSetting.js b/src/hooks/option/useCanvasSetting.js index 549cc9a4..a585109a 100644 --- a/src/hooks/option/useCanvasSetting.js +++ b/src/hooks/option/useCanvasSetting.js @@ -283,7 +283,7 @@ export function useCanvasSetting() { optionName = ['roof', POLYGON_TYPE.ROOF] break case 'wordDisplay': //문자 표시 - optionName = ['6'] + optionName = ['commonText'] break case 'circuitNumDisplay': //회로번호 표시 optionName = ['7'] @@ -313,6 +313,8 @@ export function useCanvasSetting() { //obj.set({ visible: !obj.visible }) }) + canvas.renderAll() + // console.log( // 'optionName', // optionName, From 7dac85cf3968c24845f97bdd499863b97f3c4c7a Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 12 Nov 2024 17:10:13 +0900 Subject: [PATCH 025/200] =?UTF-8?q?imageSizeSetting=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useContextMenu.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index dc57bf12..5dae113c 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -186,11 +186,6 @@ export function useContextMenu() { shortcut: ['c', 'C'], name: `${getMessage('contextmenu.copy')}(C)`, }, - { - id: 'imageSizeEdit', - name: getMessage('modal.image.size.setting'), - component: , - }, ], [ { From 173f26a1fc29db391193e731e67ef7b271819a7a Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 08:29:48 +0900 Subject: [PATCH 026/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 88 +++++++++++++------ .../estimate/useEstimateController.js | 8 +- 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 8c6af884..697a0fd0 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -17,7 +17,6 @@ import { SessionContext } from '@/app/SessionProvider' import Select, { components } from 'react-select' import { convertNumberToPriceDecimal } from '@/util/common-utils' import ProductFeaturesPop from './popup/ProductFeaturesPop' - export default function Estimate({ params }) { const { session } = useContext(SessionContext) const [objectNo, setObjectNo] = useState('') //물건번호 @@ -31,6 +30,7 @@ export default function Estimate({ params }) { const [productFeaturesPopupOpen, setProductFeaturesPopupOpen] = useState(false) //견적특이사항 팝업 const [showProductFeatureData, setShowProductFeatureData] = useState([]) //팝업에 보여줄 견적특이사항 데이터 + const [selection, setSelection] = useState(new Set()) //견적특이사항 접고 펼치기 const [hidden, setHidden] = useState(false) @@ -54,7 +54,7 @@ export default function Estimate({ params }) { const objectRecoil = useRecoilValue(floorPlanObjectState) //견적서 상세데이터 - const { state, setState } = useEstimateController(params.pid) + const { state, setState, addItem } = useEstimateController(params.pid) const [itemList, setItemList] = useState([]) //기존 아이템 리스트 @@ -191,25 +191,27 @@ export default function Estimate({ params }) { //가격표시 option 최초세팅 useEffect(() => { - const param = { - saleStoreId: session.storeId, - sapSalesStoreCd: session.custCd, - docTpCd: state?.estimateType, - } - - const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}` - get({ url: apiUrl }).then((res) => { - if (isNotEmptyArray(res?.data)) { - setStorePriceList(res.data) + if (state.estimateType !== '') { + const param = { + saleStoreId: session.storeId, + sapSalesStoreCd: session.custCd, + docTpCd: state?.estimateType, } - }) + + const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}` + get({ url: apiUrl }).then((res) => { + if (isNotEmptyArray(res?.data)) { + setStorePriceList(res.data) + } + }) + } }, [state?.estimateType]) - useEffect(() => { - if (state.priceCd) { - setTempPriceCd(state.priceCd) - } - }, [state?.priceCd]) + // useEffect(() => { + // if (state.priceCd) { + // setTempPriceCd(state.priceCd) + // } + // }, [state?.priceCd]) //가격표시 option 변경시 useEffect(() => { @@ -260,10 +262,37 @@ export default function Estimate({ params }) { }) } - // 제품 추가 테스트 - const addItemTest = () => { - const newItemDispOrder = (Math.max(...state.itemList.map((item) => item.dispOrder)) + 1) * 100 - console.log('newItemDispOrder::', newItemDispOrder) + //row 체크박스 컨트롤 + const onChangeSelect = (dispOrder) => { + const newSelection = new Set(selection) + if (newSelection.has(dispOrder)) { + newSelection.delete(dispOrder) + } else { + newSelection.add(dispOrder) + } + + setSelection(newSelection) + } + + // 아이템 자동완성 검색시 + const onChangeDisplayItem = (itemId, dispOrder) => { + console.log('아이템 자동완성:::::::', dispOrder) + const param = { + itemId: itemId, + } + const apiUrl = `/api/display-item/item-detail?${queryStringFormatter(param)}` + get({ url: apiUrl }).then((res) => { + console.log('제품상세 결과::::::::', res) + }) + // setState({ + // itemList: [{ itemNo: '123123123123' }], + // }) + } + + //제품 삭제 + const removeItem = () => { + const array = [...selection] + console.log(array) } return ( @@ -731,11 +760,11 @@ export default function Estimate({ params }) {
- - @@ -774,14 +803,14 @@ export default function Estimate({ params }) { - {itemList.length > 0 && - itemList.map((item, index) => { + {state?.itemList.length > 0 && + state.itemList.map((item, index) => { return (
- - + onChangeSelect(item.dispOrder)} /> +
{item?.dispOrder * 100} @@ -795,11 +824,14 @@ export default function Estimate({ params }) { classNamePrefix="custom" placeholder="Select" options={displayItemList} + onChange={(e) => onChangeDisplayItem(e.itemId, item.dispOrder)} getOptionLabel={(x) => x.itemName} getOptionValue={(x) => x.itemId} isClearable={true} isDisabled={false} value={displayItemList.filter(function (option) { + // console.log('옵션값???', option.itemId) + // console.log('골랐을때 여기오지???', item.itemId) return option.itemId === item.itemId })} /> diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 05d10554..d2e067ba 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -19,7 +19,7 @@ const defaultEstimateData = { charger: '', //담당자 objectName: '', //안건명 objectNameOmit: '', //경칭코드 - estimateType: 'YJOD', //주문분류 + estimateType: '', //주문분류 remarks: '', //비고 estimateOption: '', //견적특이사항 itemList: [], @@ -76,12 +76,14 @@ export const useEstimateController = (planNo) => { } const addItem = () => { - const newItemDispOrder = (Math.max(...state.itemList.map((item) => item.dispOrder)) + 1) * 100 + const newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + 1 setState({ itemList: [ ...state.itemList, { - dispOrder: newItemDispOrder, + objectNo: objectRecoil.floorPlanObjectNo, + planNo: planNo, + dispOrder: newItemDispOrder.toString(), itemId: '', //제품번호 itemNo: '', //형명 itemName: '', From 8b7c2fad0c4788e4533ed7fb017f23a428892d1e Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 08:42:26 +0900 Subject: [PATCH 027/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=951?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSearchCondition.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 50ec3744..c982491b 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -347,9 +347,9 @@ export default function StuffSearchCondition() { stuffSearch.schSelSaleStoreId = '' setSchSelSaleStoreId(session.storeId) } else { + setOtherSaleStoreId('') setStuffSearch({ ...stuffSearch, - schSelSaleStoreId: '', schOtherSelSaleStoreId: '', }) //1차점 로그인해서 2차점 고르고 초기화 눌렀을때 From 919a97f96768ea0ef0e049f3a701d1912f5764ff Mon Sep 17 00:00:00 2001 From: Jaeyoung Lee Date: Wed, 13 Nov 2024 09:38:13 +0900 Subject: [PATCH 028/200] =?UTF-8?q?=EC=A7=80=EB=B6=95=20=EB=A7=88=EB=A3=A8?= =?UTF-8?q?=20=EC=9E=AC=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Roof2.jsx | 6 +- src/hooks/useMode.js | 2 +- src/util/qpolygon-utils.js | 181 +++++++++++++++++++++++++++++-------- 3 files changed, 145 insertions(+), 44 deletions(-) diff --git a/src/components/Roof2.jsx b/src/components/Roof2.jsx index 021357c4..4e4ed3a0 100644 --- a/src/components/Roof2.jsx +++ b/src/components/Roof2.jsx @@ -445,11 +445,11 @@ export default function Roof2(props) { { x: 113, y: 371.9 }, { x: 762, y: 371.9 }, { x: 762, y: 818.7 }, - { x: 1468.6, y: 818.7 }, - { x: 1468.6, y: 114.9 }, + { x: 1478.6, y: 818.7 }, + { x: 1478.6, y: 114.9 }, ] - const polygon = new QPolygon(type2, { + const polygon = new QPolygon(eightPoint, { fill: 'transparent', stroke: 'green', strokeWidth: 1, diff --git a/src/hooks/useMode.js b/src/hooks/useMode.js index ce7b8210..2ab7de9f 100644 --- a/src/hooks/useMode.js +++ b/src/hooks/useMode.js @@ -1510,7 +1510,7 @@ export function useMode() { polygon.lines.forEach((line, index) => { line.attributes = { type: LINE_TYPE.WALLLINE.EAVES, - offset: 40, + offset: 50, width: 50, pitch: 4, sleeve: true, diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index ed375ec5..dca6fda3 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1249,8 +1249,6 @@ export const drawShedRoof = (roofId, canvas) => { const eaves = roof.lines.filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.EAVES) const gables = roof.lines.filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.GABLE) - console.log('gable', gables) - let shedDegree = sheds[0].attributes.degree || 0 const shedChon = sheds[0].attributes.pitch || 0 @@ -1276,9 +1274,9 @@ export const drawRidgeRoof = (roofId, canvas) => { return } drawRidge(roof, canvas) - drawHips(roof, canvas) - connectLinePoint(roof, canvas) - modifyRidge(roof, canvas) + // drawHips(roof, canvas) + /*connectLinePoint(roof, canvas) + modifyRidge(roof, canvas)*/ } /** @@ -1311,33 +1309,135 @@ const drawRidge = (roof, canvas) => { // 지붕의 길이가 짧은 순으로 정렬 ridgeRoof.sort((a, b) => a.length - b.length) - console.log('ridgeRoof', ridgeRoof) - ridgeRoof.forEach((item) => { if (getMaxRidge(roofLines.length) > roof.ridges.length) { - let index = item.index, - beforePrevRoof, - prevRoof, - currentRoof = item.roof, - nextRoof, - afterNextRoof + const index = item.index, + currentRoof = item.roof + const prevRoof = index === 0 ? roofLines[wallLines.length - 1] : roofLines[index - 1] + const nextRoof = index === roofLines.length - 1 ? roofLines[0] : index === roofLines.length ? roofLines[1] : roofLines[index + 1] + const beforePrevRoof = index <= 1 ? roofLines[roofLines.length - 2 + index] : roofLines[index - 2] + const afterNextRoof = index >= roofLines.length - 2 ? roofLines[(index + 2) % roofLines.length] : roofLines[index + 2] let startXPoint, startYPoint, endXPoint, endYPoint - prevRoof = index === 0 ? roofLines[wallLines.length - 1] : roofLines[index - 1] - nextRoof = index === roofLines.length - 1 ? roofLines[0] : index === roofLines.length ? roofLines[1] : roofLines[index + 1] - - beforePrevRoof = index <= 1 ? roofLines[roofLines.length - 2 + index] : roofLines[index - 2] - afterNextRoof = index >= roofLines.length - 2 ? roofLines[(index + 2) % roofLines.length] : roofLines[index + 2] + let wallLine = wallLines.filter((w) => w.id === currentRoof.attributes.wallLine) + if (wallLine.length > 0) { + wallLine = wallLine[0] + } const anotherRoof = roofLines.filter((roof) => roof !== currentRoof && roof !== prevRoof && roof !== nextRoof) - let xEqualInnerLines = anotherRoof.filter((roof) => roof.x1 === roof.x2 && isInnerLine(prevRoof, currentRoof, nextRoof, roof)), //x가 같은 내부선 + /*let xEqualInnerLines = anotherRoof.filter((roof) => roof.x1 === roof.x2 && isInnerLine(prevRoof, currentRoof, nextRoof, roof)), //x가 같은 내부선 yEqualInnerLines = anotherRoof.filter((roof) => roof.y1 === roof.y2 && isInnerLine(prevRoof, currentRoof, nextRoof, roof)) //y가 같은 내부선 - let ridgeBaseLength = Math.round(currentRoof.attributes.planeSize / 2), // 지붕의 기반 길이 - ridgeMaxLength = Math.min(prevRoof.attributes.planeSize, nextRoof.attributes.planeSize), // 지붕의 최대 길이. 이전, 다음 벽 중 짧은 길이 - ridgeAcrossLength = Math.abs(Math.max(prevRoof.attributes.planeSize, nextRoof.attributes.planeSize) - currentRoof.attributes.planeSize) // 맞은편 벽까지의 길이 - 지붕의 기반 길이 + console.log('xEqualInnerLines', xEqualInnerLines, 'yEqualInnerLines', yEqualInnerLines) +*/ + let currentX1 = currentRoof.x1, + currentY1 = currentRoof.y1, + currentX2 = currentRoof.x2, + currentY2 = currentRoof.y2 + anotherRoof + .filter((roof) => isInnerLine(prevRoof, currentRoof, nextRoof, roof)) + .forEach((roof) => { + const angle = calculateAngle(currentRoof.startPoint, currentRoof.endPoint) - calculateAngle(roof.startPoint, roof.endPoint) + console.log('확인 : ', angle) + if (angle === 90) { + } + }) + console.log('current angle : ', calculateAngle(currentRoof.startPoint, currentRoof.endPoint)) + const midX = (currentRoof.x1 + currentRoof.x2) / 2 // 지붕의 X 중심 + const midY = (currentRoof.y1 + currentRoof.y2) / 2 // 지붕의 Y 중심 + /* + const midWallY = (wallLine.y1 + wallLine.y2) / 2 // 벽의 Y 중심 + const midWallX = (wallLine.x1 + wallLine.x2) / 2 // 벽의 X 중심 + */ + const alpha = (currentRoof.x1 + currentRoof.x2) / 2 - (wallLine.x1 + wallLine.x2) / 2 // 벽과 지붕의 X 거리 + const beta = (currentRoof.y1 + currentRoof.y2) / 2 - (wallLine.y1 + wallLine.y2) / 2 // 벽과 지붕의 Y 거리 + const hypotenuse = Math.sqrt(Math.pow(alpha, 2) + Math.pow(beta, 2)) // 벽과 지붕의 거리 + + let ridgeBaseLength = Math.round(currentRoof.attributes.planeSize / 2) / 10, // 지붕의 기반 길이 + ridgeMaxLength = Math.min(prevRoof.attributes.planeSize, nextRoof.attributes.planeSize) / 10, // 지붕의 최대 길이. 이전, 다음 벽 중 짧은 길이 + ridgeAcrossLength = Math.abs(Math.max(prevRoof.attributes.planeSize, nextRoof.attributes.planeSize) - currentRoof.attributes.planeSize) / 10 // 맞은편 벽까지의 길이 - 지붕의 기반 길이 + + startXPoint = Math.round(midX + (-1 * (alpha / hypotenuse) * (currentRoof.attributes.planeSize / 2)) / 10) + startYPoint = Math.round(midY + (-1 * (beta / hypotenuse) * (currentRoof.attributes.planeSize / 2)) / 10) + + console.log('ridgeMaxLength', ridgeMaxLength, Math.sign(alpha), Math.sign(alpha) * -1 * ridgeMaxLength) + const checkEndXPoint = Math.round(startXPoint + Math.sign(alpha) * -1 * (ridgeMaxLength + ridgeBaseLength)) + + const checkEndYPoint = Math.round(startYPoint + Math.sign(beta) * -1 * (ridgeMaxLength + ridgeBaseLength)) + + console.log('startXPoint', startXPoint, 'startYPoint', startYPoint, 'endXPoint', checkEndXPoint, 'endYPoint', checkEndYPoint) + + const checkLine = new QLine([startXPoint, startYPoint, checkEndXPoint, checkEndYPoint], { + fontSize: roof.fontSize, + stroke: 'red', + strokeWidth: 1, + name: LINE_TYPE.SUBLINE.HIP, + attributes: { roofId: roof.id, currentRoof: currentRoof.id, actualSize: 0 }, + }) + const intersectLines = [] + roofLines.forEach((line) => { + const intersection = edgesIntersection( + { vertex1: { x: checkLine.x1, y: checkLine.y1 }, vertex2: { x: checkLine.x2, y: checkLine.y2 } }, + { vertex1: { x: line.x1, y: line.y1 }, vertex2: { x: line.x2, y: line.y2 } }, + ) + if (intersection && !intersection.isIntersectionOutside) { + intersectLines.push({ x: intersection.x, y: intersection.y, line: line }) + } + }) + if (intersectLines.length > 0) { + intersectLines.reduce((prev, current) => { + if (prev !== undefined) { + const prevDistance = Math.sqrt(Math.pow(prev.x - startXPoint, 2) + Math.pow(prev.y - startYPoint, 2)) + const currentDistance = Math.sqrt(Math.pow(current.x - startXPoint, 2) + Math.pow(current.y - startYPoint, 2)) + return prevDistance > currentDistance ? current : prev + } else { + return current + } + }, undefined) + } + + if (intersectLines.length > 0) { + const intersectLine = intersectLines[0] + const diffX = intersectLine.x - startXPoint + const diffY = intersectLine.y - startYPoint + + endXPoint = Math.sign(diffX) * Math.round(Math.abs(diffX) - ridgeBaseLength) + startXPoint + endYPoint = Math.sign(diffY) * Math.round(Math.abs(diffY) - ridgeBaseLength) + startYPoint + } else { + endXPoint = Math.round(startXPoint + Math.sign(alpha) * -1 * ridgeMaxLength) + endYPoint = Math.round(startYPoint + Math.sign(beta) * -1 * ridgeMaxLength) + } + console.log('startXPoint', startXPoint, 'startYPoint', startYPoint, 'endXPoint', endXPoint, 'endYPoint', endYPoint) + + const ridge = new QLine([startXPoint, startYPoint, endXPoint, endYPoint], { + fontSize: roof.fontSize, + stroke: 'blue', + strokeWidth: 1, + name: LINE_TYPE.SUBLINE.RIDGE, + attributes: { roofId: roof.id }, + }) + + ridge.attributes.planeSize = Math.round(Math.sqrt(Math.pow(ridge.x1 - ridge.x2, 2) + Math.pow(ridge.y1 - ridge.y2, 2)) * 10) + ridge.attributes.actualSize = Math.round(Math.sqrt(Math.pow(ridge.x1 - ridge.x2, 2) + Math.pow(ridge.y1 - ridge.y2, 2)) * 10) + + if (ridge.attributes.planeSize > 0) { + canvas.add(ridge) + roof.ridges.push(ridge) + roof.innerLines.push(ridge) + + const distance = (x1, y1, x2, y2) => Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)) + const dist1 = distance(startXPoint, startYPoint, currentRoof.x1, currentRoof.y1) + const dist2 = distance(endXPoint, endYPoint, currentRoof.x1, currentRoof.y1) + + currentRoof.attributes.ridgeCoordinate = { + x1: dist1 < dist2 ? startXPoint : endXPoint, + y1: dist1 < dist2 ? startYPoint : endYPoint, + } + } + + /* console.log('ridgeBaseLength', ridgeBaseLength, 'ridgeMaxLength', ridgeMaxLength, 'ridgeAcrossLength', ridgeAcrossLength) let acrossRoof = anotherRoof .filter((roof) => { @@ -1582,12 +1682,12 @@ const drawRidge = (roof, canvas) => { x1: dist1 < dist2 ? startXPoint : endXPoint, y1: dist1 < dist2 ? startYPoint : endYPoint, } - } + }*/ } }) //겹쳐지는 마루는 하나로 합침 - roof.ridges.forEach((ridge, index) => { + /*roof.ridges.forEach((ridge, index) => { roof.ridges .filter((ridge2) => !(ridge.x1 === ridge2.x1 && ridge.y1 === ridge2.y1 && ridge.x2 === ridge2.x2 && ridge.y2 === ridge2.y2)) .forEach((ridge2) => { @@ -1617,7 +1717,7 @@ const drawRidge = (roof, canvas) => { roof.innerLines.push(newRidge) } }) - }) + })*/ canvas?.renderAll() } @@ -2186,10 +2286,10 @@ const changeEavesRoof = (currentRoof, canvas) => { const alpha = midX - midWallX // 벽과 지붕의 X 거리 const beta = midY - midWallY // 벽과 지붕의 Y 거리 const hypotenuse = Math.sqrt(Math.pow(alpha, 2) + Math.pow(beta, 2)) // 벽과 지붕의 거리 - const addHipX2 = Math.sign(midX - midWallX) * (alpha / hypotenuse) * (currentRoof.length / 2) // 추녀마루의 X 너비 - const addHipY2 = Math.sign(midY - midWallY) * (beta / hypotenuse) * (currentRoof.length / 2) // 추녀마루의 Y 너비 - let hipX2 = 0 - let hipY2 = 0 + // const addHipX2 = Math.sign(midX - midWallX) * (alpha / hypotenuse) * (currentRoof.length / 2) // 추녀마루의 X 너비 + // const addHipY2 = Math.sign(midY - midWallY) * (beta / hypotenuse) * (currentRoof.length / 2) // 추녀마루의 Y 너비 + const hipX2 = Math.round(midX + -1 * (alpha / hypotenuse) * (currentRoof.length / 2)) + const hipY2 = Math.round(midY + -1 * (beta / hypotenuse) * (currentRoof.length / 2)) const innerLines = canvas ?.getObjects() @@ -2265,28 +2365,27 @@ const changeEavesRoof = (currentRoof, canvas) => { if (ridgeLines.length > 0) { const ridge = ridgeLines[0] + console.log(currentRoof.attributes.ridgeCoordinate) + console.log('ridge.x1 : ', ridge.x1, 'ridge.y1 : ', ridge.y1, 'ridge.x2 : ', ridge.x2, 'ridge.y2 : ', ridge.y2) if (ridge.x1 === currentRoof.attributes.ridgeCoordinate.x1 && ridge.y1 === currentRoof.attributes.ridgeCoordinate.y1) { ridge.set({ - x1: midX + addHipX2, - y1: midY + addHipY2, + x1: hipX2, + y1: hipY2, x2: ridge.x2, y2: ridge.y2, }) currentRoof.attributes.ridgeCoordinate = { x1: ridge.x1, y1: ridge.y1 } - hipX2 = midX + addHipX2 - hipY2 = midY + addHipY2 } if (ridge.x2 === currentRoof.attributes.ridgeCoordinate.x1 && ridge.y2 === currentRoof.attributes.ridgeCoordinate.y1) { ridge.set({ x1: ridge.x1, y1: ridge.y1, - x2: midX - addHipX2, - y2: midY - addHipY2, + x2: hipX2, + y2: hipY2, }) currentRoof.attributes.ridgeCoordinate = { x1: ridge.x2, y1: ridge.y2 } - hipX2 = midX - addHipX2 - hipY2 = midY - addHipY2 } + console.log('ridge.x1 : ', ridge.x1, 'ridge.y1 : ', ridge.y1, 'ridge.x2 : ', ridge.x2, 'ridge.y2 : ', ridge.y2) ridge.attributes.planeSize = Math.round(Math.sqrt(Math.pow(ridge.x1 - ridge.x2, 2) + Math.pow(ridge.y1 - ridge.y2, 2)) * 10) ridge.attributes.actualSize = Math.round(Math.sqrt(Math.pow(ridge.x1 - ridge.x2, 2) + Math.pow(ridge.y1 - ridge.y2, 2)) * 10) } @@ -2296,6 +2395,8 @@ const changeEavesRoof = (currentRoof, canvas) => { canvas.remove(hip) }) + canvas?.renderAll() + const prevDegree = prevRoof.attributes.pitch > 0 ? getDegreeByChon(prevRoof.attributes.pitch) : prevRoof.attributes.degree const currentDegree = currentRoof.attributes.pitch > 0 ? getDegreeByChon(currentRoof.attributes.pitch) : currentRoof.attributes.degree const nextDegree = nextRoof.attributes.pitch > 0 ? getDegreeByChon(nextRoof.attributes.pitch) : nextRoof.attributes.degree @@ -2912,7 +3013,7 @@ const changeJerkInHeadRoof = (currentRoof, canvas) => { gable1.attributes.planeSize = Math.round(Math.sqrt(Math.pow(gable1.x1 - gable1.x2, 2) + Math.pow(gable1.y1 - gable1.y2, 2))) * 10 gable1.attributes.actualSize = Math.round(Math.sqrt(Math.pow(gable1.attributes.planeSize, 2) + Math.pow(gable1Height, 2))) canvas?.add(gable1) - roof.innerLines.push(gable1) + // roof.innerLines.push(gable1) hipX1 = (Math.sign(currentRoof.x2 - midX) * currentRoof.attributes.width) / 2 hipY1 = (Math.sign(currentRoof.y2 - midY) * currentRoof.attributes.width) / 2 @@ -2933,7 +3034,7 @@ const changeJerkInHeadRoof = (currentRoof, canvas) => { gable2.attributes.planeSize = Math.round(Math.sqrt(Math.pow(gable2.x1 - gable2.x2, 2) + Math.pow(gable2.y1 - gable2.y2, 2))) * 10 gable2.attributes.actualSize = Math.round(Math.sqrt(Math.pow(gable2.attributes.planeSize, 2) + Math.pow(gable2Height, 2))) canvas?.add(gable2) - roof.innerLines.push(gable2) + // roof.innerLines.push(gable2) const gable3 = new QLine([gable1.x1, gable1.y1, gable2.x1, gable2.y1], { fontSize: roof.fontSize, @@ -2949,7 +3050,7 @@ const changeJerkInHeadRoof = (currentRoof, canvas) => { gable3.attributes.planeSize = Math.round(Math.sqrt(Math.pow(gable3.x1 - gable3.x2, 2) + Math.pow(gable3.y1 - gable3.y2, 2))) * 10 gable3.attributes.actualSize = Math.round(Math.sqrt(Math.pow(gable3.x1 - gable3.x2, 2) + Math.pow(gable3.y1 - gable3.y2, 2))) * 10 canvas?.add(gable3) - roof.innerLines.push(gable3) + // roof.innerLines.push(gable3) const hip1 = new QLine([currentRoof.x1, currentRoof.y1, gable1.x1, gable1.y1], { fontSize: roof.fontSize, From 9a387f5418b98edcbe37ff0a97dfe3af7c03807b Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 09:39:24 +0900 Subject: [PATCH 029/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=952?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSearchCondition.jsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index c982491b..f533e3ab 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -324,8 +324,9 @@ export default function StuffSearchCondition() { }) } else { //X누름 + //화면에선 지우는데 리코일은 조회누르지 않으면 보존 setSchSelSaleStoreId('') - stuffSearch.schSelSaleStoreId = '' + // stuffSearch.schSelSaleStoreId = '' //2차점 판매점목록비우기 setOtherSaleStoreList([]) @@ -344,17 +345,16 @@ export default function StuffSearchCondition() { //X누르면 검색조건에 1차점으로 셋팅 if (session.storeLvl === '1') { if (stuffSearch.schOtherSelSaleStoreId === '') { - stuffSearch.schSelSaleStoreId = '' + // 화면에선 지우는데 조회누르기 전이면 리코일은 남김 + // stuffSearch.schSelSaleStoreId = '' setSchSelSaleStoreId(session.storeId) } else { + // 화면에선 지우는데 조회누르기 전이면 리코일은 남김 setOtherSaleStoreId('') setStuffSearch({ ...stuffSearch, - schOtherSelSaleStoreId: '', + // schOtherSelSaleStoreId: '', }) - //1차점 로그인해서 2차점 고르고 초기화 눌렀을때 - //stuffSearch에 schSelSaleStoreId 날리고 - //schOtherSelSaleStoreId 날리고 } } else { setOtherSaleStoreId('') From 7e7673e676f45c98db3f53872a5d87a9f41b61d8 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Wed, 13 Nov 2024 09:45:12 +0900 Subject: [PATCH 030/200] =?UTF-8?q?fix:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=EB=A7=88=ED=81=AC=EC=97=85=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/modal/ImgLoad.jsx | 48 +++++++-- .../placementShape/PlacementShapeSetting.jsx | 100 ------------------ src/hooks/common/useRefFiles.js | 2 +- 3 files changed, 39 insertions(+), 111 deletions(-) diff --git a/src/components/floor-plan/modal/ImgLoad.jsx b/src/components/floor-plan/modal/ImgLoad.jsx index 52ca977c..fa365c84 100644 --- a/src/components/floor-plan/modal/ImgLoad.jsx +++ b/src/components/floor-plan/modal/ImgLoad.jsx @@ -1,12 +1,32 @@ +import { useMessage } from '@/hooks/useMessage' +import { useRefFiles } from '@/hooks/common/useRefFiles' +import { usePlan } from '@/hooks/usePlan' + import WithDraggable from '@/components/common/draggable/WithDraggable' export default function ImgLoad() { + const { + refImage, + queryRef, + setRefImage, + handleRefFile, + refFileMethod, + setRefFileMethod, + handleRefFileMethod, + mapPositionAddress, + setMapPositionAddress, + handleFileDelete, + handleMapImageDown, + } = useRefFiles() + const { currentCanvasPlan } = usePlan() + const { getMessage } = useMessage() + return (
-

画像を読み込む

- +

{getMessage('common.input.file')}

+ {/* */}
@@ -19,7 +39,7 @@ export default function ImgLoad() {
- + handleRefFileMethod(e)} checked={refFileMethod === '1'} />
@@ -28,26 +48,34 @@ export default function ImgLoad() { ファイルの追加 - + handleRefFile(e.target.files[0])} />
- - + {/* + */} + {currentCanvasPlan?.bgImageName === null ? ( + + ) : ( + + )} + {(refImage || currentCanvasPlan?.bgImageName) && }
- + handleRefFileMethod(e)} checked={refFileMethod === '2'} />
- +
- - + {mapPositionAddress && } + {/* */}
diff --git a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx index c8dbdbca..6a69aaca 100644 --- a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx +++ b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx @@ -8,8 +8,6 @@ import { useMessage } from '@/hooks/useMessage' import { useAxios } from '@/hooks/useAxios' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' -import useRefFiles from '@/hooks/common/useRefFiles' -import { usePlan } from '@/hooks/usePlan' import SizeGuide from '@/components/floor-plan/modal/placementShape/SizeGuide' import MaterialGuide from '@/components/floor-plan/modal/placementShape/MaterialGuide' @@ -24,20 +22,6 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, set const [canvasSetting, setCanvasSetting] = useRecoilState(canvasSettingState) const { closePopup } = usePopup() const [basicSetting, setBasicSettings] = useRecoilState(basicSettingState) - const { - refImage, - queryRef, - setRefImage, - handleRefFile, - refFileMethod, - setRefFileMethod, - handleRefFileMethod, - mapPositionAddress, - setMapPositionAddress, - handleFileDelete, - handleMapImageDown, - } = useRefFiles() - const { currentCanvasPlan } = usePlan() const { getMessage } = useMessage() const { get, post } = useAxios() @@ -503,90 +487,6 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, set
- - {getMessage('common.input.file')} - -
-
- handleRefFileMethod(e)} - checked={refFileMethod === '1'} - /> - -
-
- handleRefFileMethod(e)} - checked={refFileMethod === '2'} - /> - -
-
- - {/* 파일 불러오기 */} - {refFileMethod === '1' && ( -
-
- - handleRefFile(e.target.files[0])} /> -
-
- {currentCanvasPlan?.bgImageName === null ? ( - - ) : ( - - )} - {(refImage || currentCanvasPlan?.bgImageName) && } -
-
- )} - - {/* 주소 불러오기 */} - {refFileMethod === '2' && ( -
- setMapPositionAddress(e.target.value)} - /> -
- -
- {mapPositionAddress && } - {/* */} -
- )} - {/*
-
- - handleRefFile(e.target.files[0])} /> -
-
- - {refImage && } -
-
*/} - -
diff --git a/src/hooks/common/useRefFiles.js b/src/hooks/common/useRefFiles.js index a5d085cc..07680c17 100644 --- a/src/hooks/common/useRefFiles.js +++ b/src/hooks/common/useRefFiles.js @@ -7,7 +7,7 @@ import { convertDwgToPng } from '@/lib/cadAction' import { useAxios } from '../useAxios' import { currentCanvasPlanState } from '@/store/canvasAtom' -export default function useRefFiles() { +export function useRefFiles() { const converterUrl = process.env.NEXT_PUBLIC_CONVERTER_API_URL const [refImage, setRefImage] = useState(null) const [refFileMethod, setRefFileMethod] = useState('1') From cb3b59e33185e7c5c1b51b80d9a9ca0cc57a8819 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Wed, 13 Nov 2024 09:50:43 +0900 Subject: [PATCH 031/200] fix: Remove unused file --- src/lib/user.js | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 src/lib/user.js diff --git a/src/lib/user.js b/src/lib/user.js deleted file mode 100644 index d79e958a..00000000 --- a/src/lib/user.js +++ /dev/null @@ -1,41 +0,0 @@ -'use server' - -import { getSession } from './authActions' - -const { PrismaClient } = require('@prisma/client') - -const prisma = new PrismaClient() - -export async function getUserByIdAndPassword({ userId, password }) { - return prisma.m_USER.findFirst({ - where: { - USER_ID: userId, - PASSWORD: password, - }, - }) -} - -export async function getUser(userId) { - return prisma.m_USER.findUnique({ - where: { - user_id: userId, - }, - }) -} - -export async function getUsers() { - return prisma.m_USER.findMany({ - where: { - // USER_ID: 'daiwajoho01', - USER_ID: { in: ['daiwajoho01', 'daiwajoho', 'daiwabutsuryu'] }, - }, - }) -} - -export async function checkSession() { - const session = await getSession() - - return { - session, - } -} From d273e1d5c3fb2e3f0c3fa1a433fe36125453c186 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 09:52:35 +0900 Subject: [PATCH 032/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=84=A4=EA=B3=84=EC=9D=98=EB=A2=B0=ED=8C=9D=EC=97=85=20?= =?UTF-8?q?=EC=97=94=ED=84=B0=EA=B2=80=EC=83=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../management/popup/PlanRequestPop.jsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/components/management/popup/PlanRequestPop.jsx b/src/components/management/popup/PlanRequestPop.jsx index bbe0f6c9..e7c1142b 100644 --- a/src/components/management/popup/PlanRequestPop.jsx +++ b/src/components/management/popup/PlanRequestPop.jsx @@ -257,6 +257,16 @@ export default function PlanRequestPop(props) { const handleKeyUp = (e) => { let input = e.target input.value = input.value.replace(/[^0-9]/g, '') + if (e.key === 'Enter') { + onSubmit(pageNo, 'S') + } + } + + // 엔터 이벤트 + const handleByOnKeyUp = (e) => { + if (e.key === 'Enter') { + onSubmit(pageNo, 'S') + } } return ( @@ -324,6 +334,7 @@ export default function PlanRequestPop(props) { onChange={(e) => { setSchTitle(e.target.value) }} + onKeyUp={handleByOnKeyUp} />
@@ -337,6 +348,7 @@ export default function PlanRequestPop(props) { onChange={(e) => { setSchAddress(e.target.value) }} + onKeyUp={handleByOnKeyUp} /> @@ -352,6 +364,7 @@ export default function PlanRequestPop(props) { onChange={(e) => { setSchSaleStoreName(e.target.value) }} + onKeyUp={handleByOnKeyUp} /> @@ -365,6 +378,7 @@ export default function PlanRequestPop(props) { onChange={(e) => { setSchPlanReqName(e.target.value) }} + onKeyUp={handleByOnKeyUp} /> @@ -440,7 +454,7 @@ export default function PlanRequestPop(props) {
Plan List
- From 302ce0f10c211266a7e9865e7010ec8cb58de5fb Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 10:06:40 +0900 Subject: [PATCH 033/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=ED=92=8D=EC=86=8D=EA=B2=80=EC=83=89=ED=8C=9D=EC=97=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 602c6354..bba8a814 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -537,6 +537,7 @@ export default function StuffDetail() { //도도부현 / 주소 setPrefValue(detailData.prefId) form.setValue('prefId', detailData.prefId) + form.setValue('prefName', detailData.prefName) form.setValue('address', detailData.address) //발전시뮬 form.setValue('areaId', detailData.areaId) From c866714cb9e98aa90e0fd58b6ea8c94683bd8a09 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 10:27:49 +0900 Subject: [PATCH 034/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=84=A4=EA=B3=84=EC=9D=98=EB=A2=B0=ED=8C=9D=EC=97=85=20&=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=EC=84=A0=ED=83=9D=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=EC=85=8B=ED=8C=85=20=EC=88=98=EC=A0=953?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 1 + src/components/management/popup/PlanRequestPop.jsx | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index bba8a814..40febb86 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -857,6 +857,7 @@ export default function StuffDetail() { const setPlanReqInfo = (info) => { form.setValue('planReqNo', info.planReqNo) form.setValue('objectStatusId', info.building) + setSelectObjectStatusId(info.building) form.setValue('objectName', info.planReqName) form.setValue('zipNo', info.zipNo) form.setValue('address', info.address2) diff --git a/src/components/management/popup/PlanRequestPop.jsx b/src/components/management/popup/PlanRequestPop.jsx index e7c1142b..291549c6 100644 --- a/src/components/management/popup/PlanRequestPop.jsx +++ b/src/components/management/popup/PlanRequestPop.jsx @@ -98,8 +98,8 @@ export default function PlanRequestPop(props) { schPlanReqName: schPlanReqName, schPlanStatCd: schPlanStatCd, schDateGbn: schDateGbn, - schStartDt: dayjs(startDate).format('YYYY-MM-DD'), - schEndDt: dayjs(endDate).format('YYYY-MM-DD'), + schStartDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', + schEndDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', startRow: type === 'S' ? (1 - 1) * pageSize + 1 : (page - 1) * pageSize + 1, endRow: type === 'S' ? 1 * pageSize : page * pageSize, } @@ -226,7 +226,7 @@ export default function PlanRequestPop(props) { ], }) - //설계의뢰 그리드에서 선택한 설계의로 정보 + //설계의뢰 그리드에서 선택한 설계의뢰 정보 const getSelectedRowdata = (data) => { if (isNotEmptyArray(data)) { setPlanReqObject(data[0]) From fa201459565bd760a19689b3effd19f4b4768587 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Wed, 13 Nov 2024 10:33:21 +0900 Subject: [PATCH 035/200] fix: Remove unused file --- src/lib/file.js | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/lib/file.js diff --git a/src/lib/file.js b/src/lib/file.js deleted file mode 100644 index 418fbe96..00000000 --- a/src/lib/file.js +++ /dev/null @@ -1,22 +0,0 @@ -'use server' -import path from 'path' -import multer from 'multer' - -export const upload = (files) => { - console.log(files) - const storage = multer.diskStorage({ - destination: (req, file, callback) => { - const extension = path.extname(file.originalname) - const basename = path.basename(file.originalname, extension) - callback(null, `/public/upload/${basename}-${Date.now()}${extension}`) - }, - filename: (req, file, callback) => { - callback(null, `${file.fieldname}-${Date.now()}${path.extname(file.originalname)}`) - } - }) - const test = multer({ - storage: storage - }).array(files.name, 5) - - console.log(test) -} From eeb343ce19ac71f81c9e7253cfc1356c5044f429 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 10:38:01 +0900 Subject: [PATCH 036/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=84=A4=EA=B3=84=EC=9D=98=EB=A2=B0=ED=8C=9D=EC=97=85=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=85=8B?= =?UTF-8?q?=ED=8C=85=20=EC=88=98=EC=A0=95=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 40febb86..f3b25248 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -874,8 +874,11 @@ export default function StuffDetail() { form.setValue('standardWindSpeedId', `WL_${info.windSpeed}`) form.setValue('verticalSnowCover', info.verticalSnowCover) form.setValue('surfaceType', info.surfaceType) + if (info.surfaceType === 'Ⅱ') { form.setValue('saltAreaFlg', true) + } else { + form.setValue('saltAreaFlg', false) } form.setValue('installHeight', info.installHeight) form.setValue('remarks', info.remarks) From 1e7e0ffb64687b323c032cc80f43d56a67484ccc Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 11:04:09 +0900 Subject: [PATCH 037/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=ED=8C=90=EB=A7=A4=EB=8C=80=EB=A6=AC=EC=A0=90=20=EC=A7=80?= =?UTF-8?q?=EC=9A=B0=EA=B3=A0=20=EC=84=A4=EA=B3=84=EC=9D=98=EB=A2=B0=20?= =?UTF-8?q?=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=20=ED=8C=9D=EC=97=85=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EC=8B=9C=20=EC=88=98=EC=A0=955?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 10 ++++++++-- src/locales/ja.json | 3 ++- src/locales/ko.json | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index f3b25248..69403e7c 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -510,6 +510,8 @@ export default function StuffDetail() { setOtherSelOptions(detailData.saleStoreId) form.setValue('otherSaleStoreId', detailData.saleStoreId) form.setValue('otherSaleStoreLevel', detailData.saleStoreLevel) + + form.setValue('saleStoreLevel', '1') } //설계의뢰No. @@ -1039,7 +1041,12 @@ export default function StuffDetail() { //설계의뢰 팝업 오픈 const onSearchDesignRequestPopOpen = () => { - setShowDesignRequestButtonValid(true) + const saleStoreId = form.watch('saleStoreId') + if (saleStoreId === '') { + alert(getMessage('stuff.planReqPopup.error.message2')) + } else { + setShowDesignRequestButtonValid(true) + } } // 풍속선택 팝업 오픈 @@ -1862,7 +1869,6 @@ export default function StuffDetail() { > ) : null}
- {/* {detailData?.tempFlg === '1' ? ( */} {detailData?.tempFlg === '1' ? ( <>
-
- From 05e567360153b420f4f1c90df834d3fce9001f3a Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 14:51:04 +0900 Subject: [PATCH 039/200] =?UTF-8?q?session=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Main.jsx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/Main.jsx b/src/components/Main.jsx index 11046eed..76afea76 100644 --- a/src/components/Main.jsx +++ b/src/components/Main.jsx @@ -1,9 +1,8 @@ 'use client' -import React, { useEffect, useState } from 'react' +import { useEffect, useState, useContext } from 'react' import { useRouter } from 'next/navigation' import { useRecoilState, useRecoilValue } from 'recoil' -import { sessionStore } from '@/store/commonAtom' import { useAxios } from '@/hooks/useAxios' import { globalLocaleStore } from '@/store/localeAtom' import MainContents from './main/MainContents' @@ -12,8 +11,10 @@ import { stuffSearchState } from '@/store/stuffAtom' import '@/styles/contents.scss' import ChangePasswordPop from './main/ChangePasswordPop' import { searchState } from '@/store/boardAtom' +import { SessionContext } from '@/app/SessionProvider' + export default function MainPage() { - const sessionState = useRecoilValue(sessionStore) + const { session } = useContext(SessionContext) const globalLocaleState = useRecoilValue(globalLocaleStore) @@ -33,14 +34,14 @@ export default function MainPage() { const [searchForm, setSearchForm] = useRecoilState(searchState) useEffect(() => { - if (sessionState.pwdInitYn === 'Y') { + if (session.pwdInitYn === 'Y') { fetchObjectList() } - }, [sessionState]) + }, [session]) const fetchObjectList = async () => { try { - const apiUrl = `/api/main-page/object/${sessionState?.storeId}/list` + const apiUrl = `/api/main-page/object/${session?.storeId}/list` await promiseGet({ url: apiUrl, }).then((res) => { @@ -95,7 +96,7 @@ export default function MainPage() { return ( <> - {(sessionState?.pwdInitYn !== 'N' && ( + {(session?.pwdInitYn !== 'N' && ( <>
From fbd023c0bd596037b1d64320c8826d818b811a00 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 15:02:17 +0900 Subject: [PATCH 040/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=97=BC=ED=95=B4=EC=A7=80=EC=97=AD?= =?UTF-8?q?=EC=9A=A9=EC=95=84=EC=9D=B4=ED=85=9C=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=EB=B0=95=EC=8A=A4=20=EC=98=81=EC=97=AD?= =?UTF-8?q?=EC=9D=84=20=ED=95=9C=EB=9E=AD=EC=A7=80=EB=8C=80=EC=B1=85?= =?UTF-8?q?=EC=8B=9C=ED=96=89=20=EC=B2=B4=ED=81=AC=EB=B0=95=EC=8A=A4=20?= =?UTF-8?q?=EC=98=81=EC=97=AD=EA=B3=BC=20=EC=9D=BC=EC=B9=98=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 105 +++++++++++----------- 1 file changed, 55 insertions(+), 50 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 69403e7c..93328de3 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -1738,31 +1738,33 @@ export default function StuffDetail() {
-
- { - handleRadioChange(e) - }} - /> - -
-
- { - handleRadioChange(e) - }} - /> - +
+
+ { + handleRadioChange(e) + }} + /> + +
+
+ { + handleRadioChange(e) + }} + /> + +
@@ -2251,32 +2253,35 @@ export default function StuffDetail() {
-
- { - handleRadioChange(e) - }} - /> - -
-
- { - handleRadioChange(e) - }} - /> - +
+
+ { + handleRadioChange(e) + }} + /> + +
+
+ { + handleRadioChange(e) + }} + /> + +
+
From fee77f8563fbd3bbbda74484897c8ee4d6ae6a4b Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 15:18:03 +0900 Subject: [PATCH 041/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 44 ++++++++++++++++++---------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 697a0fd0..c4faccba 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -56,8 +56,6 @@ export default function Estimate({ params }) { //견적서 상세데이터 const { state, setState, addItem } = useEstimateController(params.pid) - const [itemList, setItemList] = useState([]) //기존 아이템 리스트 - //견적특이사항 List const [specialNoteList, setSpecialNoteList] = useState([]) @@ -183,11 +181,11 @@ export default function Estimate({ params }) { } //아이템 목록 - useEffect(() => { - if (isNotEmptyArray(state.itemList)) { - setItemList(state.itemList) - } - }, [state?.itemList]) + // useEffect(() => { + // if (isNotEmptyArray(state.itemList)) { + // setItemList(state.itemList) + // } + // }, [state?.itemList]) //가격표시 option 최초세팅 useEffect(() => { @@ -207,12 +205,6 @@ export default function Estimate({ params }) { } }, [state?.estimateType]) - // useEffect(() => { - // if (state.priceCd) { - // setTempPriceCd(state.priceCd) - // } - // }, [state?.priceCd]) - //가격표시 option 변경시 useEffect(() => { if (tempPriceCd !== '') { @@ -292,7 +284,24 @@ export default function Estimate({ params }) { //제품 삭제 const removeItem = () => { const array = [...selection] - console.log(array) + let tempList = [] + state.itemList.filter((row) => { + array.map((row2) => { + if (row2 === row.dispOrder) { + tempList.push({ ...row }) + } + }) + }) + + const result = state.itemList.filter((item) => { + return !tempList.some((other) => other.dispOrder === item.dispOrder) + }) + + setState({ + itemList: result, + }) + + setSelection(new Set()) } return ( @@ -809,7 +818,12 @@ export default function Estimate({ params }) {
- onChangeSelect(item.dispOrder)} /> + onChangeSelect(item.dispOrder)} + checked={selection.has(item.dispOrder) ? true : false} + />
From 77b3cd744e46691c65edc69b581b2d4d384a73de Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 15:39:18 +0900 Subject: [PATCH 042/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=EC=98=81=EC=97=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../management/StuffSearchCondition.jsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index f533e3ab..f6514667 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -91,6 +91,24 @@ export default function StuffSearchCondition() { endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100, schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', }) + } else if (stuffSearch.code === 'FINISH') { + setStuffSearch({ + schObjectNo: objectNo, + schSaleStoreName: saleStoreName, + schAddress: address, + schObjectName: objectName, + schDispCompanyName: dispCompanyName, + schSelSaleStoreId: schSelSaleStoreId, + schOtherSelSaleStoreId: otherSaleStoreId, + schReceiveUser: receiveUser, + schDateType: dateType, + schFromDt: dayjs(startDate).format('YYYY-MM-DD'), + schToDt: dayjs(endDate).format('YYYY-MM-DD'), + code: 'E', + startRow: 1, + endRow: 100, + schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', + }) } else { setStuffSearch({ schObjectNo: objectNo, From d222c60b89d4527e8dae7099b77c1c5183639135 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Wed, 13 Nov 2024 15:42:00 +0900 Subject: [PATCH 043/200] =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=EC=84=B8=ED=8C=85=20=EC=88=98=EB=8F=99=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dictionary.txt | 1 + src/common/common.js | 1 + .../floor-plan/modal/basic/BasicSetting.jsx | 25 +- src/hooks/module/useModuleBasicSetting.js | 595 ++++++++++++++++++ src/hooks/useCanvasEvent.js | 4 +- src/hooks/useEvent.js | 7 + src/store/canvasAtom.js | 21 + src/util/canvas-util.js | 16 +- 8 files changed, 659 insertions(+), 11 deletions(-) create mode 100644 src/hooks/module/useModuleBasicSetting.js diff --git a/docs/dictionary.txt b/docs/dictionary.txt index 268cde7a..94bfdb49 100644 --- a/docs/dictionary.txt +++ b/docs/dictionary.txt @@ -28,3 +28,4 @@ Allpainted : allPainted 치수선: dimensionLine 복도치수: planeSize 실제치수: actualSize +모듈설치면: moduleSetupSurface \ No newline at end of file diff --git a/src/common/common.js b/src/common/common.js index 588b836c..02a953fe 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -111,6 +111,7 @@ export const POLYGON_TYPE = { ROOF: 'roof', WALL: 'wall', TRESTLE: 'trestle', + MODULE_SETUP_SURFACE: 'moduleSetupSurface', } export const SAVE_KEY = [ diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 51cf7280..322e068f 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -5,18 +5,21 @@ import Module from '@/components/floor-plan/modal/basic/step/Module' import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchModule' import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement' import Placement from '@/components/floor-plan/modal/basic/step/Placement' -import { useRecoilState } from 'recoil' +import { useRecoilValue } from 'recoil' import { canvasSettingState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation' +import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' +import { useEvent } from '@/hooks/useEvent' export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() const { closePopup } = usePopup() const [tabNum, setTabNum] = useState(1) - const [canvasSetting, setCanvasSetting] = useRecoilState(canvasSettingState) + const canvasSetting = useRecoilValue(canvasSettingState) const orientationRef = useRef(null) - + const { initEvent } = useEvent() + const { makeModuleInstArea, manualModuleSetup, autoModuleSetup } = useModuleBasicSetting() const handleBtnNextStep = () => { if (tabNum === 1) { orientationRef.current.handleNextStep() @@ -24,6 +27,14 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { setTabNum(tabNum + 1) } + useEffect(() => { + makeModuleInstArea() + + return () => { + initEvent() + } + }, []) + return (
@@ -64,8 +75,12 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { )} {tabNum === 3 && ( <> - - + + )}
diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js new file mode 100644 index 00000000..ed2e91b1 --- /dev/null +++ b/src/hooks/module/useModuleBasicSetting.js @@ -0,0 +1,595 @@ +import { useEffect, useState } from 'react' +import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' +import { canvasState } from '@/store/canvasAtom' +import { setSurfaceShapePattern } from '@/util/canvas-util' +import { roofDisplaySelector } from '@/store/settingAtom' +import offsetPolygon from '@/util/qpolygon-utils' +import { QPolygon } from '@/components/fabric/QPolygon' +import { moduleSetupSurfaceState, moduleIsSetupState } from '@/store/canvasAtom' +import { useEvent } from '@/hooks/useEvent' +import { POLYGON_TYPE, BATCH_TYPE } from '@/common/common' +import * as turf from '@turf/turf' + +export function useModuleBasicSetting() { + const canvas = useRecoilValue(canvasState) + const roofDisplay = useRecoilValue(roofDisplaySelector) + const setModuleInstSurface = useSetRecoilState(moduleSetupSurfaceState) + const [moduleIsSetup, setModuleIsSetup] = useRecoilState(moduleIsSetupState) + const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() + let selectedModuleInstSurfaceArray = [] + + const makeModuleInstArea = () => { + //지붕 객체 반환 + const roofs = canvas.getObjects().filter((obj) => obj.name === 'roof') + + if (!roofs) { + return + } + + roofs.forEach((roof) => { + setSurfaceShapePattern(roof, roofDisplay.column, true) //패턴 변경 + const offsetPoints = offsetPolygon(roof.points, -20) //안쪽 offset + //모듈설치영역?? 생성 + const trestle = new QPolygon(offsetPoints, { + stroke: 'red', + fill: 'transparent', + strokeDashArray: [10, 4], + strokeWidth: 1, + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + selectable: true, + parentId: roof.id, //가대 폴리곤의 임시 인덱스를 넣어줌 + name: POLYGON_TYPE.MODULE_SETUP_SURFACE, + }) + + canvas.add(trestle) + //지붕면 선택 금지 + roof.set({ + selectable: false, + }) + + //모듈설치면 클릭이벤트 + addTargetMouseEventListener('mousedown', trestle, function () { + toggleSelection(trestle) + }) + }) + } + + //설치 범위 지정 클릭 이벤트 + const toggleSelection = (polygon) => { + const isExist = selectedModuleInstSurfaceArray.some((obj) => obj.parentId === polygon.parentId) + //최초 선택일때 + if (!isExist) { + //기본 선택이랑 스트로크 굵기가 같으면 선택 안됨으로 봄 + polygon.set({ + ...polygon, + strokeWidth: 3, + strokeDashArray: [0], + fill: 'transparent', + }) + canvas.discardActiveObject() // 객체의 활성 상태 해제 + //중복으로 들어가는걸 방지하기 위한 코드 + + canvas?.renderAll() + selectedModuleInstSurfaceArray.push(polygon) + } else { + //선택후 재선택하면 선택안됨으로 변경 + polygon.set({ + ...polygon, + fill: 'transparent', + strokeDashArray: [10, 4], + strokeWidth: 1, + }) + canvas.discardActiveObject() // 객체의 활성 상태 해제 + + //폴리곤에 커스텀 인덱스를 가지고 해당 배열 인덱스를 찾아 삭제함 + const removeIndex = polygon.parentId + const removeArrayIndex = selectedModuleInstSurfaceArray.findIndex((obj) => obj.parentId === removeIndex) + selectedModuleInstSurfaceArray.splice(removeArrayIndex, 1) + } + + canvas?.renderAll() + setModuleInstSurface([...selectedModuleInstSurfaceArray]) + } + + /** + * trestle에서 영역을 가져와 mouse:move 이벤트로 해당 영역에 진입했을때 booleanPointInPolygon 로 진입여부를 확인 + * 확인 후 셀을 이동시킴 + */ + const manualModuleSetup = () => { + const trestlePolygons = canvas?.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) //가대를 가져옴 + const batchObjects = canvas + ?.getObjects() + .filter( + (obj) => + obj.name === BATCH_TYPE.OPENING || + obj.name === BATCH_TYPE.TRIANGLE_DORMER || + obj.name === BATCH_TYPE.PENTAGON_DORMER || + obj.name === BATCH_TYPE.SHADOW, + ) //도머s 객체 + + if (trestlePolygons.length !== 0) { + let fabricPolygon = null + let inside = false + let turfPolygon + let manualDrawCells = moduleIsSetup // 앞에서 자동으로 했을때 추가됨 + let direction + let trestlePolygon + addCanvasMouseEventListener('mouse:move', (e) => { + //마우스 이벤트 삭제 후 재추가 + const mousePoint = canvas.getPointer(e.e) + + for (let i = 0; i < trestlePolygons.length; i++) { + turfPolygon = polygonToTurfPolygon(trestlePolygons[i]) + trestlePolygon = trestlePolygons[i] + direction = trestlePolygons[i].direction //도형의 방향 + let width = direction === 'south' || direction === 'north' ? 172 : 113 + let height = direction === 'south' || direction === 'north' ? 113 : 172 + + const points = [ + { x: mousePoint.x - width / 2, y: mousePoint.y - height / 2 }, + { x: mousePoint.x + width / 2, y: mousePoint.y - height / 2 }, + { x: mousePoint.x + width / 2, y: mousePoint.y + height / 2 }, + { x: mousePoint.x - width / 2, y: mousePoint.y + height / 2 }, + ] + + const turfPoints = coordToTurfPolygon(points) + + if (turf.booleanWithin(turfPoints, turfPolygon)) { + let isDrawing = false + + if (isDrawing) return + canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'tempModule')) //움직일때 일단 지워가면서 움직임 + + fabricPolygon = new fabric.Rect({ + fill: 'white', + stroke: 'black', + strokeWidth: 1, + width: width, + height: height, + left: mousePoint.x - width / 2, + top: mousePoint.y - height / 2, + selectable: false, + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + opacity: 0.8, + name: 'tempModule', + parentId: trestlePolygons[i].parentId, + }) + + canvas?.add(fabricPolygon) //움직여가면서 추가됨 + + /** + * 스냅기능 + */ + let snapDistance = 10 + let cellSnapDistance = 20 + + const trestleLeft = trestlePolygons[i].left + const trestleTop = trestlePolygons[i].top + const trestleRight = trestleLeft + trestlePolygons[i].width * trestlePolygons[i].scaleX + const trestleBottom = trestleTop + trestlePolygons[i].height * trestlePolygons[i].scaleY + const bigCenterY = (trestleTop + trestleTop + trestlePolygons[i].height) / 2 + + // 작은 폴리곤의 경계 좌표 계산 + const smallLeft = fabricPolygon.left + const smallTop = fabricPolygon.top + const smallRight = smallLeft + fabricPolygon.width * fabricPolygon.scaleX + const smallBottom = smallTop + fabricPolygon.height * fabricPolygon.scaleY + const smallCenterX = smallLeft + (fabricPolygon.width * fabricPolygon.scaleX) / 2 + const smallCenterY = smallTop + (fabricPolygon.height * fabricPolygon.scaleX) / 2 + + /** + * 미리 깔아놓은 셀이 있을때 셀에 흡착됨 + */ + if (manualDrawCells) { + manualDrawCells.forEach((cell) => { + const holdCellLeft = cell.left + const holdCellTop = cell.top + const holdCellRight = holdCellLeft + cell.width * cell.scaleX + const holdCellBottom = holdCellTop + cell.height * cell.scaleY + const holdCellCenterX = holdCellLeft + (cell.width * cell.scaleX) / 2 + const holdCellCenterY = holdCellTop + (cell.height * cell.scaleY) / 2 + + //설치된 셀에 좌측에 스냅 + if (Math.abs(smallRight - holdCellLeft) < snapDistance) { + fabricPolygon.left = holdCellLeft - width - 0.5 + } + + //설치된 셀에 우측에 스냅 + if (Math.abs(smallLeft - holdCellRight) < snapDistance) { + fabricPolygon.left = holdCellRight + 0.5 + } + + //설치된 셀에 위쪽에 스냅 + if (Math.abs(smallBottom - holdCellTop) < snapDistance) { + fabricPolygon.top = holdCellTop - height - 0.5 + } + + //설치된 셀에 밑쪽에 스냅 + if (Math.abs(smallTop - holdCellBottom) < snapDistance) { + fabricPolygon.top = holdCellBottom + 0.5 + } + //가운데 -> 가운데 + if (Math.abs(smallCenterX - holdCellCenterX) < cellSnapDistance) { + fabricPolygon.left = holdCellCenterX - width / 2 + } + //왼쪽 -> 가운데 + if (Math.abs(smallLeft - holdCellCenterX) < cellSnapDistance) { + fabricPolygon.left = holdCellCenterX + } + // 오른쪽 -> 가운데 + if (Math.abs(smallRight - holdCellCenterX) < cellSnapDistance) { + fabricPolygon.left = holdCellCenterX - width + } + //세로 가운데 -> 가운데 + if (Math.abs(smallCenterY - holdCellCenterY) < cellSnapDistance) { + fabricPolygon.top = holdCellCenterY - height / 2 + } + //위쪽 -> 가운데 + if (Math.abs(smallTop - holdCellCenterY) < cellSnapDistance) { + fabricPolygon.top = holdCellCenterY + } + //아랫쪽 -> 가운데 + if (Math.abs(smallBottom - holdCellCenterY) < cellSnapDistance) { + fabricPolygon.top = holdCellCenterY - height + } + }) + } + + // 위쪽 변에 스냅 + if (Math.abs(smallTop - trestleTop) < snapDistance) { + fabricPolygon.top = trestleTop + } + + // 아래쪽 변에 스냅 + if (Math.abs(smallTop + fabricPolygon.height * fabricPolygon.scaleY - (trestleTop + trestlePolygons[i].height)) < snapDistance) { + fabricPolygon.top = trestleTop + trestlePolygons[i].height - fabricPolygon.height * fabricPolygon.scaleY + } + + // 왼쪽변에 스냅 + if (Math.abs(smallLeft - trestleLeft) < snapDistance) { + fabricPolygon.left = trestleLeft + } + //오른쪽 변에 스냅 + if (Math.abs(smallRight - trestleRight) < snapDistance) { + fabricPolygon.left = trestleRight - fabricPolygon.width * fabricPolygon.scaleX + } + + if (direction === 'south' || direction === 'north') { + // 모듈왼쪽이 세로중앙선에 붙게 스냅 + if (Math.abs(smallLeft - (trestleLeft + trestlePolygons[i].width / 2)) < snapDistance) { + fabricPolygon.left = trestleLeft + trestlePolygons[i].width / 2 + } + + // 모듈이 가운데가 세로중앙선에 붙게 스냅 + if (Math.abs(smallCenterX - (trestleLeft + trestlePolygons[i].width / 2)) < snapDistance) { + fabricPolygon.left = trestleLeft + trestlePolygons[i].width / 2 - (fabricPolygon.width * fabricPolygon.scaleX) / 2 + } + + // 모듈오른쪽이 세로중앙선에 붙게 스냅 + if (Math.abs(smallRight - (trestleLeft + trestlePolygons[i].width / 2)) < snapDistance) { + fabricPolygon.left = trestleLeft + trestlePolygons[i].width / 2 - fabricPolygon.width * fabricPolygon.scaleX + } + } else { + // 모듈이 가로중앙선에 스냅 + if (Math.abs(smallTop + fabricPolygon.height / 2 - bigCenterY) < snapDistance) { + fabricPolygon.top = bigCenterY - fabricPolygon.height / 2 + } + + if (Math.abs(smallTop - (trestleTop + trestlePolygons[i].height / 2)) < snapDistance) { + fabricPolygon.top = trestleTop + trestlePolygons[i].height / 2 + } + // 모듈 밑면이 가로중앙선에 스냅 + if (Math.abs(smallBottom - (trestleTop + trestlePolygons[i].height / 2)) < snapDistance) { + fabricPolygon.top = trestleTop + trestlePolygons[i].height / 2 - fabricPolygon.height * fabricPolygon.scaleY + } + } + + fabricPolygon.setCoords() + canvas?.renderAll() + inside = true + break + } else { + inside = false + } + } + + if (!inside) { + canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'tempModule')) + canvas?.renderAll() + } + }) + + addCanvasMouseEventListener('mouse:up', (e) => { + let isIntersection = true + if (!inside) return + if (fabricPolygon) { + const rectPoints = [ + { x: fabricPolygon.left + 0.5, y: fabricPolygon.top + 0.5 }, + { x: fabricPolygon.left + 0.5 + fabricPolygon.width * fabricPolygon.scaleX, y: fabricPolygon.top + 0.5 }, + { + x: fabricPolygon.left + fabricPolygon.width * fabricPolygon.scaleX + 0.5, + y: fabricPolygon.top + fabricPolygon.height * fabricPolygon.scaleY + 0.5, + }, + { x: fabricPolygon.left + 0.5, y: fabricPolygon.top + fabricPolygon.height * fabricPolygon.scaleY + 0.5 }, + ] + + fabricPolygon.set({ points: rectPoints }) + const tempTurfModule = polygonToTurfPolygon(fabricPolygon) + + //도머 객체를 가져옴 + if (batchObjects) { + batchObjects.forEach((object) => { + const dormerTurfPolygon = polygonToTurfPolygon(object) //turf객체로 변환 + const intersection = turf.intersect(turf.featureCollection([dormerTurfPolygon, tempTurfModule])) //겹치는지 확인 + //겹치면 안됨 + if (intersection) { + alert('도머위에 모듈을 올릴 수 없습니다.') + isIntersection = false + } + }) + } + + if (!isIntersection) return + + fabricPolygon.setCoords() //좌표 재정렬 + + if (turf.booleanWithin(tempTurfModule, turfPolygon)) { + //마우스 클릭시 set으로 해당 위치에 셀을 넣음 + const isOverlap = manualDrawCells.some((cell) => turf.booleanOverlap(tempTurfModule, polygonToTurfPolygon(cell))) //겹치는지 확인 + if (!isOverlap) { + //안겹치면 넣는다 + fabricPolygon.setCoords() + fabricPolygon.set({ name: 'cell', fill: '#BFFD9F' }) + manualDrawCells.push(fabricPolygon) //모듈배열에 추가 + //해당 모듈에 프로퍼티로 넣는다 + trestlePolygon.set({ + modules: manualDrawCells, + }) + } else { + alert('셀끼리 겹치면 안되죠?') + } + } else { + alert('나갔죠?!!') + } + } + }) + } + } + + const coordToTurfPolygon = (points) => { + const coordinates = points.map((point) => [point.x, point.y]) + coordinates.push(coordinates[0]) + return turf.polygon([coordinates]) + } + + const polygonToTurfPolygon = (polygon) => { + const coordinates = polygon.points.map((point) => [point.x, point.y]) + coordinates.push(coordinates[0]) + return turf.polygon( + [coordinates], + {}, + { + parentId: polygon.parentId, + }, + ) + } + + const autoModuleSetup = () => { + const trestlePolygons = canvas?.getObjects().filter((obj) => obj.name === 'trestle' && obj.selected) + const notSelectedTrestlePolygons = canvas?.getObjects().filter((obj) => obj.name === 'trestle' && !obj.selected) + + const dormerTrestlePolygons = canvas?.getObjects().filter((obj) => obj.name === 'dormerTrestle') //도머 객체 + + if (trestlePolygons.length === 0) { + alert('가대가 없습니다.') + return + } + + if (drewRoofCells.length > 0) { + alert('기존 셀은 제거됩니다.') + } + + notSelectedTrestlePolygons.forEach((trestle) => { + trestle.cells.forEach((cell) => { + canvas?.remove(cell) + }) + trestle.cells = [] + }) + + const drawCellsArray = [] + trestlePolygons.forEach((trestle, index) => { + trestle.fire('mousedown') + let maxLengthLine = trestle.lines.reduce((acc, cur) => { + return acc.length > cur.length ? acc : cur + }) + + const turfTrestlePolygon = polygonToTurfPolygon(trestle) //폴리곤을 turf 객체로 변환 + + const containsDormerTrestlePolygons = dormerTrestlePolygons.filter((dormerTrestle) => { + // 폴리곤 안에 도머 폴리곤이 포함되어있는지 확인해서 반환하는 로직 + return ( + turf.booleanContains(turfTrestlePolygon, polygonToTurfPolygon(dormerTrestle)) || + turf.booleanWithin(polygonToTurfPolygon(dormerTrestle), turfTrestlePolygon) + ) + }) + + let difference = turfTrestlePolygon //기본 객체(면형상) + + if (containsDormerTrestlePolygons.length > 0) { + //turf로 도머를 제외시키는 로직 + for (let i = 0; i < containsDormerTrestlePolygons.length; i++) { + if (i === 0) { + difference = turf.difference(turf.featureCollection([turfTrestlePolygon, polygonToTurfPolygon(containsDormerTrestlePolygons[i])])) //한 면에 도머가 1개일때 + } else { + if (difference) { + difference = turf.difference(turf.featureCollection([difference, polygonToTurfPolygon(containsDormerTrestlePolygons[i])])) //한면에 도머가 여러개일때 계속 제외시킴 + } + } + } + } + + const bbox = turf.bbox(difference) + let width = maxLengthLine.direction === 'right' || maxLengthLine.direction === 'left' ? 172.2 : 113.4 + let height = maxLengthLine.direction === 'right' || maxLengthLine.direction === 'left' ? 113.4 : 172.2 + + //배치면때는 방향쪽으로 패널이 넓게 누워져야함 + if (trestle.direction !== undefined) { + width = trestle.direction === 'south' || trestle.direction === 'north' ? 172.2 : 113.4 + height = trestle.direction === 'south' || trestle.direction === 'north' ? 113.4 : 172.2 + } + const cols = Math.floor((bbox[2] - bbox[0]) / width) + const rows = Math.floor((bbox[3] - bbox[1]) / height) + + for (let col = 0; col <= cols; col++) { + for (let row = 0; row <= rows; row++) { + let x = 0, + y = 0, + square = [], + margin = 0 + + if (trestle.direction !== undefined) { + //배치면 처림 방향이 정해져있는 경우 + + if (trestle.direction === 'south' || trestle.direction === 'north') { + //남,북 + margin = (bbox[2] - bbox[0] - cols * width) / 2 //박스 끝에서 박스 시작값을 빼고 width와 계산된 cols를 곱한값을 뺀뒤 나누기 2 하면 가운데 배치됨 + if (trestle.direction === 'south') { + //남쪽 + x = col === 0 ? trestle.left + margin : bbox[0] + col * width + margin //상하 위치 기준이면 좌우 가운데 정렬한다 + y = bbox[3] - row * height + } else { + //북쪽 + x = col === 0 ? trestle.left + margin : bbox[0] + col * width + margin + y = bbox[1] + row * height + } + } else if (trestle.direction === 'east' || trestle.direction === 'west') { + //동쪽 + margin = (bbox[3] - bbox[1] - rows * height) / 2 + if (trestle.direction === 'east') { + x = bbox[2] - col * width + y = rows === 0 ? trestle.top + margin : bbox[1] + row * height + margin //좌우 위치 기준이면 상하 가운데 정렬한다 + } else { + x = bbox[0] + col * width + y = rows === 0 ? trestle.top + margin : bbox[1] + row * height + margin + } + } + } else { + //방향이 없는 경우 ex) 템플릿 + x = bbox[0] + col * width + y = bbox[1] + row * height + } + + square = [ + [x, y], + [x + width, y], + [x + width, y + height], + [x, y + height], + [x, y], + ] + + const squarePolygon = turf.polygon([square]) + + const disjointFromTrestle = turf.booleanContains(turfTrestlePolygon, squarePolygon) || turf.booleanWithin(squarePolygon, turfTrestlePolygon) + + if (disjointFromTrestle) { + let turfCoordnates = squarePolygon.geometry.coordinates[0].slice(0, -1) + const points = turfCoordnates.map((coord) => ({ x: coord[0], y: coord[1] })) + + if (containsDormerTrestlePolygons.length > 0) { + //도머가 있으면 적용되는 로직 + const isDisjoint = containsDormerTrestlePolygons.some((dormerTrestle) => { + return turf.booleanDisjoint(squarePolygon, polygonToTurfPolygon(dormerTrestle)) //도머가 여러개일수있으므로 겹치는게 있다면... + }) + if (isDisjoint) { + const fabricPolygon = new QPolygon(points, { + fill: '#BFFD9F', + stroke: 'black', + selectable: true, // 선택 가능하게 설정 + lockMovementX: false, // X 축 이동 잠금 + lockMovementY: false, // Y 축 이동 잠금 + lockRotation: false, // 회전 잠금 + lockScalingX: false, // X 축 크기 조정 잠금 + lockScalingY: false, // Y 축 크기 조정 잠금 + opacity: 0.8, + parentId: trestle.parentId, + }) + canvas?.add(fabricPolygon) + drawCellsArray.push(fabricPolygon) + } + } else { + //도머가 없을땐 그냥 그림 + const fabricPolygon = new QPolygon(points, { + fill: '#BFFD9F', + stroke: 'black', + selectable: true, // 선택 가능하게 설정 + lockMovementX: true, // X 축 이동 잠금 + lockMovementY: true, // Y 축 이동 잠금 + lockRotation: true, // 회전 잠금 + lockScalingX: true, // X 축 크기 조정 잠금 + lockScalingY: true, // Y 축 크기 조정 잠금 + opacity: 0.8, + parentId: trestle.parentId, + lineCol: col, + lineRow: row, + }) + canvas?.add(fabricPolygon) + drawCellsArray.push(fabricPolygon) + } + } + } + } + + // let drawRoofCells + // if (maxLengthLine.direction === 'right' || maxLengthLine.direction === 'left') { + // drawRoofCells = trestle.fillCell({ width: 113.4, height: 172.2, padding: 0 }) + // trestle.direction = 'south' + // } else { + // drawRoofCells = trestle.fillCell({ width: 172.2, height: 113.4, padding: 0 }) + // trestle.direction = 'east' + // } + + // drawRoofCells.forEach((cell) => { + // drawCellsArray.push(cell) + // }) + + /** + * 추후에 가대까지 완료하면 그룹시켜버림 + */ + // const groupCellObj = canvas + // ?.getObjects() + // .filter( + // (obj) => + // obj?.parentId === trestle.parentId || + // obj?.id === trestle.parentId || + // (obj?.name === 'arrow' && obj?.parent.id === trestle.parentId) || + // (obj?.name === 'directionText' && obj?.parent.parent.id === trestle.parentId), + // ) + + // console.log('groupCellObj', groupCellObj) + + // canvas?.add( + // new fabric.Group(groupCellObj, { + // name: 'cellGroup', + // originX: 'center', + // originY: 'center', + // }), + // ) + }) + + setDrewRoofCells(drawCellsArray) + } + + return { + makeModuleInstArea, + manualModuleSetup, + autoModuleSetup, + } +} diff --git a/src/hooks/useCanvasEvent.js b/src/hooks/useCanvasEvent.js index 42266c8a..b4cc4223 100644 --- a/src/hooks/useCanvasEvent.js +++ b/src/hooks/useCanvasEvent.js @@ -225,7 +225,9 @@ export function useCanvasEvent() { if (deselected?.length > 0) { deselected.forEach((obj) => { if (obj.type === 'QPolygon') { - obj.set({ stroke: 'black' }) + if (obj.name !== 'moduleInstSurface') { + obj.set({ stroke: 'black' }) + } } }) } diff --git a/src/hooks/useEvent.js b/src/hooks/useEvent.js index 891ad101..ba441b75 100644 --- a/src/hooks/useEvent.js +++ b/src/hooks/useEvent.js @@ -219,6 +219,12 @@ export function useEvent() { mouseEventListeners.current.length = 0 // 배열 초기화 } + const addTargetMouseEventListener = (eventType, target, handler) => { + target.off(eventType) + target.on(eventType, handler) + mouseEventListeners.current.push({ eventType, handler }) + } + /** * document 이벤트의 경우 이 함수를 통해서만 등록 * @param eventType @@ -264,6 +270,7 @@ export function useEvent() { return { addDocumentEventListener, addCanvasMouseEventListener, + addTargetMouseEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeDocumentEvent, diff --git a/src/store/canvasAtom.js b/src/store/canvasAtom.js index 0242a7b2..588808b1 100644 --- a/src/store/canvasAtom.js +++ b/src/store/canvasAtom.js @@ -363,3 +363,24 @@ export const showAngleUnitSelector = selector({ return roofAngleSet === 'slope' ? '寸' : '°' }, }) + +export const moduleSetupSurfaceState = atom({ + key: 'moduleSetupSurfaceState', + default: [], + dangerouslyAllowMutability: true, +}) + +export const moduleInstSurfaceSelector = selector({ + key: 'moduleInstSurfaceSelector', + get: ({ get, parentId }) => { + const moduleSetupSurfaceStateValue = get(moduleSetupSurfaceState) + return moduleSetupSurfaceStateValue.filter((obj) => obj.parentId === parentId) + }, +}) + +//셀 그린 이후에 생성하는 state +export const moduleIsSetupState = atom({ + key: 'moduleIsSetupState', + default: [], + dangerouslyAllowMutability: true, +}) diff --git a/src/util/canvas-util.js b/src/util/canvas-util.js index 5f55092c..4ef2a2ec 100644 --- a/src/util/canvas-util.js +++ b/src/util/canvas-util.js @@ -792,7 +792,7 @@ export const rectToPolygon = (rect) => { } //면형상 선택 클릭시 지붕 패턴 입히기 -export function setSurfaceShapePattern(polygon, mode = 'onlyBorder') { +export function setSurfaceShapePattern(polygon, mode = 'onlyBorder', trestleMode = false) { const ratio = window.devicePixelRatio || 1 let width = 265 / 10 @@ -820,6 +820,12 @@ export function setSurfaceShapePattern(polygon, mode = 'onlyBorder') { ctx.lineWidth = mode === 'allPainted' ? 1 : 0.4 ctx.fillStyle = mode === 'allPainted' ? 'rgba(0, 159, 64, 0.7)' : 'white' + if (trestleMode) { + ctx.strokeStyle = 'black' + ctx.lineWidth = 0.2 + ctx.fillStyle = 'rgba(0, 0, 0, 0.1)' + } + if (polygon.direction === 'east' || polygon.direction === 'west') { offset = roofStyle === 1 ? 0 : patternSize.height / 2 for (let col = 0; col <= cols; col++) { @@ -830,7 +836,7 @@ export function setSurfaceShapePattern(polygon, mode = 'onlyBorder') { ctx.moveTo(x, yStart) // 선 시작점 ctx.lineTo(x, yEnd) // 선 끝점 ctx.stroke() - if (mode === 'allPainted') { + if (mode === 'allPainted' || trestleMode) { ctx.fillRect(x, yStart, patternSize.width, yEnd - yStart) } @@ -842,7 +848,7 @@ export function setSurfaceShapePattern(polygon, mode = 'onlyBorder') { ctx.moveTo(xStart, y) // 선 시작점 ctx.lineTo(xEnd, y) // 선 끝점 ctx.stroke() - if (mode === 'allPainted') { + if (mode === 'allPainted' || trestleMode) { ctx.fillRect(xStart, y, xEnd - xStart, patternSize.height) } } @@ -855,7 +861,7 @@ export function setSurfaceShapePattern(polygon, mode = 'onlyBorder') { ctx.moveTo(0, y) // 선 시작점 ctx.lineTo(patternSourceCanvas.width, y) // 선 끝점 ctx.stroke() - if (mode === 'allPainted') { + if (mode === 'allPainted' || trestleMode) { ctx.fillRect(0, y, patternSourceCanvas.width, patternSize.height) } @@ -868,7 +874,7 @@ export function setSurfaceShapePattern(polygon, mode = 'onlyBorder') { ctx.moveTo(x, yStart) // 선 시작점 ctx.lineTo(x, yEnd) // 선 끝점 ctx.stroke() - if (mode === 'allPainted') { + if (mode === 'allPainted' || trestleMode) { ctx.fillRect(x, yStart, patternSize.width, yEnd - yStart) } } From 0f2d99d2aae8f893101b4b2602f96152c795e2b8 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 16:25:54 +0900 Subject: [PATCH 044/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../management/StuffSearchCondition.jsx | 38 ++----------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index f6514667..f82d83f3 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -151,6 +151,7 @@ export default function StuffSearchCondition() { setEndDate(dayjs(new Date()).format('YYYY-MM-DD')) if (session?.storeId === 'T01') { setSchSelSaleStoreId('') + setOtherSaleStoreId('') handleClear1() //판매대리점선택 자동완성 클리어 resetStuffRecoil() setStuffSearch({ @@ -204,10 +205,8 @@ export default function StuffSearchCondition() { setSchSelSaleStoreList(allList) setFavoriteStoreList(favList) setShowSaleStoreList(favList) - // if (stuffSearch.code === 'FINISH') { if (stuffSearch.schSelSaleStoreId != '') { setSchSelSaleStoreId(stuffSearch.schSelSaleStoreId) - // if (stuffSearch.schOtherSelSaleStoreId != '') { url = `/api/object/saleStore/${stuffSearch.schSelSaleStoreId}/list?firstFlg=1&userId=${session?.userId}` get({ url: url }).then((res) => { if (!isEmptyArray(res)) { @@ -223,30 +222,10 @@ export default function StuffSearchCondition() { setOtherSaleStoreList([]) } }) - // } } - // } - setStuffSearch({ - ...stuffSearch, - code: 'S', - }) - - //T01일때 2차 판매점 호출하기 디폴트로 1차점을 본인으로 셋팅해서 세션storeId사용 - // 디폴트 셋팅 안하기로 - // url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=0&userId=${session?.userId}` - - // get({ url: url }).then((res) => { - // if (!isEmptyArray(res)) { - // res.map((row) => { - // row.value = row.saleStoreId - // row.label = row.saleStoreName - // }) - - // otherList = res - // setOtherSaleStoreList(otherList) - // } else { - // setOtherSaleStoreList([]) - // } + // setStuffSearch({ + // ...stuffSearch, + // code: 'S', // }) } else { if (session?.storeLvl === '1') { @@ -261,11 +240,6 @@ export default function StuffSearchCondition() { setOtherSaleStoreList(otherList) - setStuffSearch({ - ...stuffSearch, - code: 'S', - }) - if (stuffSearch.schOtherSelSaleStoreId != '') { setOtherSaleStoreId(stuffSearch.schOtherSelSaleStoreId) } @@ -369,10 +343,6 @@ export default function StuffSearchCondition() { } else { // 화면에선 지우는데 조회누르기 전이면 리코일은 남김 setOtherSaleStoreId('') - setStuffSearch({ - ...stuffSearch, - // schOtherSelSaleStoreId: '', - }) } } else { setOtherSaleStoreId('') From 822476f5a62ffae393e43ecc0c62cbe023940b01 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 13 Nov 2024 18:02:48 +0900 Subject: [PATCH 045/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index d2e067ba..06f3d4b4 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -92,6 +92,7 @@ export const useEstimateController = (planNo) => { unit: '', //단위 salePrice: '0', //단가 saleTotPrice: '0', //금액(부가세별도) + itemChangeFlg: '1', //추가시 체인지플래그 1로 }, ], }) From 732ea8bb47097c524dbd5ed4d30e6a19a6175060 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Wed, 13 Nov 2024 18:05:39 +0900 Subject: [PATCH 046/200] =?UTF-8?q?=EC=88=98=EB=8F=99=20=EB=AA=A8=EB=93=88?= =?UTF-8?q?=20=EC=84=A4=EC=B9=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/basic/BasicSetting.jsx | 6 +- src/hooks/module/useModuleBasicSetting.js | 211 +++++++++--------- src/hooks/useCanvasEvent.js | 2 +- 3 files changed, 111 insertions(+), 108 deletions(-) diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 322e068f..8eda4a09 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -28,10 +28,10 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { } useEffect(() => { - makeModuleInstArea() + makeModuleInstArea() //기붕 모듈설치면 생성 return () => { - initEvent() + initEvent() //모듈설치면 선택 이벤트 삭제 } }, []) @@ -79,7 +79,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { {getMessage('modal.module.basic.setting.passivity.placement')} )} diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index ed2e91b1..3f25f49f 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -30,7 +30,7 @@ export function useModuleBasicSetting() { setSurfaceShapePattern(roof, roofDisplay.column, true) //패턴 변경 const offsetPoints = offsetPolygon(roof.points, -20) //안쪽 offset //모듈설치영역?? 생성 - const trestle = new QPolygon(offsetPoints, { + const setupSurface = new QPolygon(offsetPoints, { stroke: 'red', fill: 'transparent', strokeDashArray: [10, 4], @@ -43,29 +43,32 @@ export function useModuleBasicSetting() { selectable: true, parentId: roof.id, //가대 폴리곤의 임시 인덱스를 넣어줌 name: POLYGON_TYPE.MODULE_SETUP_SURFACE, + flowDirection: roof.direction, }) - canvas.add(trestle) + canvas.add(setupSurface) //지붕면 선택 금지 roof.set({ selectable: false, }) //모듈설치면 클릭이벤트 - addTargetMouseEventListener('mousedown', trestle, function () { - toggleSelection(trestle) + addTargetMouseEventListener('mousedown', setupSurface, function () { + toggleSelection(setupSurface) }) }) } //설치 범위 지정 클릭 이벤트 - const toggleSelection = (polygon) => { + const toggleSelection = (setupSurface) => { + console.log('polygon', setupSurface) + const isExist = selectedModuleInstSurfaceArray.some((obj) => obj.parentId === polygon.parentId) //최초 선택일때 if (!isExist) { //기본 선택이랑 스트로크 굵기가 같으면 선택 안됨으로 봄 - polygon.set({ - ...polygon, + setupSurface.set({ + ...setupSurface, strokeWidth: 3, strokeDashArray: [0], fill: 'transparent', @@ -74,11 +77,11 @@ export function useModuleBasicSetting() { //중복으로 들어가는걸 방지하기 위한 코드 canvas?.renderAll() - selectedModuleInstSurfaceArray.push(polygon) + selectedModuleInstSurfaceArray.push(setupSurface) } else { //선택후 재선택하면 선택안됨으로 변경 - polygon.set({ - ...polygon, + setupSurface.set({ + ...setupSurface, fill: 'transparent', strokeDashArray: [10, 4], strokeWidth: 1, @@ -86,7 +89,7 @@ export function useModuleBasicSetting() { canvas.discardActiveObject() // 객체의 활성 상태 해제 //폴리곤에 커스텀 인덱스를 가지고 해당 배열 인덱스를 찾아 삭제함 - const removeIndex = polygon.parentId + const removeIndex = setupSurface.parentId const removeArrayIndex = selectedModuleInstSurfaceArray.findIndex((obj) => obj.parentId === removeIndex) selectedModuleInstSurfaceArray.splice(removeArrayIndex, 1) } @@ -100,7 +103,7 @@ export function useModuleBasicSetting() { * 확인 후 셀을 이동시킴 */ const manualModuleSetup = () => { - const trestlePolygons = canvas?.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) //가대를 가져옴 + const moduleSetupSurfaces = canvas?.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) //모듈설치면를 가져옴 const batchObjects = canvas ?.getObjects() .filter( @@ -111,23 +114,23 @@ export function useModuleBasicSetting() { obj.name === BATCH_TYPE.SHADOW, ) //도머s 객체 - if (trestlePolygons.length !== 0) { - let fabricPolygon = null + if (moduleSetupSurfaces.length !== 0) { + let tempModule + let manualDrawModules = moduleIsSetup // 앞에서 자동으로 했을때 추가됨 let inside = false let turfPolygon - let manualDrawCells = moduleIsSetup // 앞에서 자동으로 했을때 추가됨 - let direction + let flowDirection let trestlePolygon addCanvasMouseEventListener('mouse:move', (e) => { //마우스 이벤트 삭제 후 재추가 const mousePoint = canvas.getPointer(e.e) - for (let i = 0; i < trestlePolygons.length; i++) { - turfPolygon = polygonToTurfPolygon(trestlePolygons[i]) - trestlePolygon = trestlePolygons[i] - direction = trestlePolygons[i].direction //도형의 방향 - let width = direction === 'south' || direction === 'north' ? 172 : 113 - let height = direction === 'south' || direction === 'north' ? 113 : 172 + for (let i = 0; i < moduleSetupSurfaces.length; i++) { + turfPolygon = polygonToTurfPolygon(moduleSetupSurfaces[i]) + trestlePolygon = moduleSetupSurfaces[i] + flowDirection = moduleSetupSurfaces[i].flowDirection //도형의 방향 + let width = flowDirection === 'south' || flowDirection === 'north' ? 172 : 113 + let height = flowDirection === 'south' || flowDirection === 'north' ? 113 : 172 const points = [ { x: mousePoint.x - width / 2, y: mousePoint.y - height / 2 }, @@ -144,7 +147,7 @@ export function useModuleBasicSetting() { if (isDrawing) return canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'tempModule')) //움직일때 일단 지워가면서 움직임 - fabricPolygon = new fabric.Rect({ + tempModule = new fabric.Rect({ fill: 'white', stroke: 'black', strokeWidth: 1, @@ -160,10 +163,10 @@ export function useModuleBasicSetting() { lockScalingY: true, opacity: 0.8, name: 'tempModule', - parentId: trestlePolygons[i].parentId, + parentId: moduleSetupSurfaces[i].parentId, }) - canvas?.add(fabricPolygon) //움직여가면서 추가됨 + canvas?.add(tempModule) //움직여가면서 추가됨 /** * 스냅기능 @@ -171,25 +174,25 @@ export function useModuleBasicSetting() { let snapDistance = 10 let cellSnapDistance = 20 - const trestleLeft = trestlePolygons[i].left - const trestleTop = trestlePolygons[i].top - const trestleRight = trestleLeft + trestlePolygons[i].width * trestlePolygons[i].scaleX - const trestleBottom = trestleTop + trestlePolygons[i].height * trestlePolygons[i].scaleY - const bigCenterY = (trestleTop + trestleTop + trestlePolygons[i].height) / 2 + const trestleLeft = moduleSetupSurfaces[i].left + const trestleTop = moduleSetupSurfaces[i].top + const trestleRight = trestleLeft + moduleSetupSurfaces[i].width * moduleSetupSurfaces[i].scaleX + const trestleBottom = trestleTop + moduleSetupSurfaces[i].height * moduleSetupSurfaces[i].scaleY + const bigCenterY = (trestleTop + trestleTop + moduleSetupSurfaces[i].height) / 2 // 작은 폴리곤의 경계 좌표 계산 - const smallLeft = fabricPolygon.left - const smallTop = fabricPolygon.top - const smallRight = smallLeft + fabricPolygon.width * fabricPolygon.scaleX - const smallBottom = smallTop + fabricPolygon.height * fabricPolygon.scaleY - const smallCenterX = smallLeft + (fabricPolygon.width * fabricPolygon.scaleX) / 2 - const smallCenterY = smallTop + (fabricPolygon.height * fabricPolygon.scaleX) / 2 + const smallLeft = tempModule.left + const smallTop = tempModule.top + const smallRight = smallLeft + tempModule.width * tempModule.scaleX + const smallBottom = smallTop + tempModule.height * tempModule.scaleY + const smallCenterX = smallLeft + (tempModule.width * tempModule.scaleX) / 2 + const smallCenterY = smallTop + (tempModule.height * tempModule.scaleX) / 2 /** * 미리 깔아놓은 셀이 있을때 셀에 흡착됨 */ - if (manualDrawCells) { - manualDrawCells.forEach((cell) => { + if (manualDrawModules) { + manualDrawModules.forEach((cell) => { const holdCellLeft = cell.left const holdCellTop = cell.top const holdCellRight = holdCellLeft + cell.width * cell.scaleX @@ -199,100 +202,100 @@ export function useModuleBasicSetting() { //설치된 셀에 좌측에 스냅 if (Math.abs(smallRight - holdCellLeft) < snapDistance) { - fabricPolygon.left = holdCellLeft - width - 0.5 + tempModule.left = holdCellLeft - width - 0.5 } //설치된 셀에 우측에 스냅 if (Math.abs(smallLeft - holdCellRight) < snapDistance) { - fabricPolygon.left = holdCellRight + 0.5 + tempModule.left = holdCellRight + 0.5 } //설치된 셀에 위쪽에 스냅 if (Math.abs(smallBottom - holdCellTop) < snapDistance) { - fabricPolygon.top = holdCellTop - height - 0.5 + tempModule.top = holdCellTop - height - 0.5 } //설치된 셀에 밑쪽에 스냅 if (Math.abs(smallTop - holdCellBottom) < snapDistance) { - fabricPolygon.top = holdCellBottom + 0.5 + tempModule.top = holdCellBottom + 0.5 } //가운데 -> 가운데 if (Math.abs(smallCenterX - holdCellCenterX) < cellSnapDistance) { - fabricPolygon.left = holdCellCenterX - width / 2 + tempModule.left = holdCellCenterX - width / 2 } //왼쪽 -> 가운데 if (Math.abs(smallLeft - holdCellCenterX) < cellSnapDistance) { - fabricPolygon.left = holdCellCenterX + tempModule.left = holdCellCenterX } // 오른쪽 -> 가운데 if (Math.abs(smallRight - holdCellCenterX) < cellSnapDistance) { - fabricPolygon.left = holdCellCenterX - width + tempModule.left = holdCellCenterX - width } //세로 가운데 -> 가운데 if (Math.abs(smallCenterY - holdCellCenterY) < cellSnapDistance) { - fabricPolygon.top = holdCellCenterY - height / 2 + tempModule.top = holdCellCenterY - height / 2 } //위쪽 -> 가운데 if (Math.abs(smallTop - holdCellCenterY) < cellSnapDistance) { - fabricPolygon.top = holdCellCenterY + tempModule.top = holdCellCenterY } //아랫쪽 -> 가운데 if (Math.abs(smallBottom - holdCellCenterY) < cellSnapDistance) { - fabricPolygon.top = holdCellCenterY - height + tempModule.top = holdCellCenterY - height } }) } // 위쪽 변에 스냅 if (Math.abs(smallTop - trestleTop) < snapDistance) { - fabricPolygon.top = trestleTop + tempModule.top = trestleTop } // 아래쪽 변에 스냅 - if (Math.abs(smallTop + fabricPolygon.height * fabricPolygon.scaleY - (trestleTop + trestlePolygons[i].height)) < snapDistance) { - fabricPolygon.top = trestleTop + trestlePolygons[i].height - fabricPolygon.height * fabricPolygon.scaleY + if (Math.abs(smallTop + tempModule.height * tempModule.scaleY - (trestleTop + moduleSetupSurfaces[i].height)) < snapDistance) { + tempModule.top = trestleTop + moduleSetupSurfaces[i].height - tempModule.height * tempModule.scaleY } // 왼쪽변에 스냅 if (Math.abs(smallLeft - trestleLeft) < snapDistance) { - fabricPolygon.left = trestleLeft + tempModule.left = trestleLeft } //오른쪽 변에 스냅 if (Math.abs(smallRight - trestleRight) < snapDistance) { - fabricPolygon.left = trestleRight - fabricPolygon.width * fabricPolygon.scaleX + tempModule.left = trestleRight - tempModule.width * tempModule.scaleX } - if (direction === 'south' || direction === 'north') { + if (flowDirection === 'south' || flowDirection === 'north') { // 모듈왼쪽이 세로중앙선에 붙게 스냅 - if (Math.abs(smallLeft - (trestleLeft + trestlePolygons[i].width / 2)) < snapDistance) { - fabricPolygon.left = trestleLeft + trestlePolygons[i].width / 2 + if (Math.abs(smallLeft - (trestleLeft + moduleSetupSurfaces[i].width / 2)) < snapDistance) { + tempModule.left = trestleLeft + moduleSetupSurfaces[i].width / 2 } // 모듈이 가운데가 세로중앙선에 붙게 스냅 - if (Math.abs(smallCenterX - (trestleLeft + trestlePolygons[i].width / 2)) < snapDistance) { - fabricPolygon.left = trestleLeft + trestlePolygons[i].width / 2 - (fabricPolygon.width * fabricPolygon.scaleX) / 2 + if (Math.abs(smallCenterX - (trestleLeft + moduleSetupSurfaces[i].width / 2)) < snapDistance) { + tempModule.left = trestleLeft + moduleSetupSurfaces[i].width / 2 - (tempModule.width * tempModule.scaleX) / 2 } // 모듈오른쪽이 세로중앙선에 붙게 스냅 - if (Math.abs(smallRight - (trestleLeft + trestlePolygons[i].width / 2)) < snapDistance) { - fabricPolygon.left = trestleLeft + trestlePolygons[i].width / 2 - fabricPolygon.width * fabricPolygon.scaleX + if (Math.abs(smallRight - (trestleLeft + moduleSetupSurfaces[i].width / 2)) < snapDistance) { + tempModule.left = trestleLeft + moduleSetupSurfaces[i].width / 2 - tempModule.width * tempModule.scaleX } } else { // 모듈이 가로중앙선에 스냅 - if (Math.abs(smallTop + fabricPolygon.height / 2 - bigCenterY) < snapDistance) { - fabricPolygon.top = bigCenterY - fabricPolygon.height / 2 + if (Math.abs(smallTop + tempModule.height / 2 - bigCenterY) < snapDistance) { + tempModule.top = bigCenterY - tempModule.height / 2 } - if (Math.abs(smallTop - (trestleTop + trestlePolygons[i].height / 2)) < snapDistance) { - fabricPolygon.top = trestleTop + trestlePolygons[i].height / 2 + if (Math.abs(smallTop - (trestleTop + moduleSetupSurfaces[i].height / 2)) < snapDistance) { + tempModule.top = trestleTop + moduleSetupSurfaces[i].height / 2 } // 모듈 밑면이 가로중앙선에 스냅 - if (Math.abs(smallBottom - (trestleTop + trestlePolygons[i].height / 2)) < snapDistance) { - fabricPolygon.top = trestleTop + trestlePolygons[i].height / 2 - fabricPolygon.height * fabricPolygon.scaleY + if (Math.abs(smallBottom - (trestleTop + moduleSetupSurfaces[i].height / 2)) < snapDistance) { + tempModule.top = trestleTop + moduleSetupSurfaces[i].height / 2 - tempModule.height * tempModule.scaleY } } - fabricPolygon.setCoords() + tempModule.setCoords() canvas?.renderAll() inside = true break @@ -310,19 +313,19 @@ export function useModuleBasicSetting() { addCanvasMouseEventListener('mouse:up', (e) => { let isIntersection = true if (!inside) return - if (fabricPolygon) { + if (tempModule) { const rectPoints = [ - { x: fabricPolygon.left + 0.5, y: fabricPolygon.top + 0.5 }, - { x: fabricPolygon.left + 0.5 + fabricPolygon.width * fabricPolygon.scaleX, y: fabricPolygon.top + 0.5 }, + { x: tempModule.left + 0.5, y: tempModule.top + 0.5 }, + { x: tempModule.left + 0.5 + tempModule.width * tempModule.scaleX, y: tempModule.top + 0.5 }, { - x: fabricPolygon.left + fabricPolygon.width * fabricPolygon.scaleX + 0.5, - y: fabricPolygon.top + fabricPolygon.height * fabricPolygon.scaleY + 0.5, + x: tempModule.left + tempModule.width * tempModule.scaleX + 0.5, + y: tempModule.top + tempModule.height * tempModule.scaleY + 0.5, }, - { x: fabricPolygon.left + 0.5, y: fabricPolygon.top + fabricPolygon.height * fabricPolygon.scaleY + 0.5 }, + { x: tempModule.left + 0.5, y: tempModule.top + tempModule.height * tempModule.scaleY + 0.5 }, ] - fabricPolygon.set({ points: rectPoints }) - const tempTurfModule = polygonToTurfPolygon(fabricPolygon) + tempModule.set({ points: rectPoints }) + const tempTurfModule = polygonToTurfPolygon(tempModule) //도머 객체를 가져옴 if (batchObjects) { @@ -339,19 +342,19 @@ export function useModuleBasicSetting() { if (!isIntersection) return - fabricPolygon.setCoords() //좌표 재정렬 + tempModule.setCoords() //좌표 재정렬 if (turf.booleanWithin(tempTurfModule, turfPolygon)) { //마우스 클릭시 set으로 해당 위치에 셀을 넣음 - const isOverlap = manualDrawCells.some((cell) => turf.booleanOverlap(tempTurfModule, polygonToTurfPolygon(cell))) //겹치는지 확인 + const isOverlap = manualDrawModules.some((cell) => turf.booleanOverlap(tempTurfModule, polygonToTurfPolygon(cell))) //겹치는지 확인 if (!isOverlap) { //안겹치면 넣는다 - fabricPolygon.setCoords() - fabricPolygon.set({ name: 'cell', fill: '#BFFD9F' }) - manualDrawCells.push(fabricPolygon) //모듈배열에 추가 + tempModule.setCoords() + tempModule.set({ name: 'module', fill: '#BFFD9F' }) + manualDrawModules.push(tempModule) //모듈배열에 추가 //해당 모듈에 프로퍼티로 넣는다 trestlePolygon.set({ - modules: manualDrawCells, + modules: manualDrawModules, }) } else { alert('셀끼리 겹치면 안되죠?') @@ -383,12 +386,12 @@ export function useModuleBasicSetting() { } const autoModuleSetup = () => { - const trestlePolygons = canvas?.getObjects().filter((obj) => obj.name === 'trestle' && obj.selected) + const moduleSetupSurfaces = canvas?.getObjects().filter((obj) => obj.name === 'trestle' && obj.selected) const notSelectedTrestlePolygons = canvas?.getObjects().filter((obj) => obj.name === 'trestle' && !obj.selected) const dormerTrestlePolygons = canvas?.getObjects().filter((obj) => obj.name === 'dormerTrestle') //도머 객체 - if (trestlePolygons.length === 0) { + if (moduleSetupSurfaces.length === 0) { alert('가대가 없습니다.') return } @@ -405,7 +408,7 @@ export function useModuleBasicSetting() { }) const drawCellsArray = [] - trestlePolygons.forEach((trestle, index) => { + moduleSetupSurfaces.forEach((trestle, index) => { trestle.fire('mousedown') let maxLengthLine = trestle.lines.reduce((acc, cur) => { return acc.length > cur.length ? acc : cur @@ -437,13 +440,13 @@ export function useModuleBasicSetting() { } const bbox = turf.bbox(difference) - let width = maxLengthLine.direction === 'right' || maxLengthLine.direction === 'left' ? 172.2 : 113.4 - let height = maxLengthLine.direction === 'right' || maxLengthLine.direction === 'left' ? 113.4 : 172.2 + let width = maxLengthLine.flowDirection === 'right' || maxLengthLine.flowDirection === 'left' ? 172.2 : 113.4 + let height = maxLengthLine.flowDirection === 'right' || maxLengthLine.flowDirection === 'left' ? 113.4 : 172.2 //배치면때는 방향쪽으로 패널이 넓게 누워져야함 - if (trestle.direction !== undefined) { - width = trestle.direction === 'south' || trestle.direction === 'north' ? 172.2 : 113.4 - height = trestle.direction === 'south' || trestle.direction === 'north' ? 113.4 : 172.2 + if (trestle.flowDirection !== undefined) { + width = trestle.flowDirection === 'south' || trestle.flowDirection === 'north' ? 172.2 : 113.4 + height = trestle.flowDirection === 'south' || trestle.flowDirection === 'north' ? 113.4 : 172.2 } const cols = Math.floor((bbox[2] - bbox[0]) / width) const rows = Math.floor((bbox[3] - bbox[1]) / height) @@ -455,13 +458,13 @@ export function useModuleBasicSetting() { square = [], margin = 0 - if (trestle.direction !== undefined) { + if (trestle.flowDirection !== undefined) { //배치면 처림 방향이 정해져있는 경우 - if (trestle.direction === 'south' || trestle.direction === 'north') { + if (trestle.flowDirection === 'south' || trestle.flowDirection === 'north') { //남,북 margin = (bbox[2] - bbox[0] - cols * width) / 2 //박스 끝에서 박스 시작값을 빼고 width와 계산된 cols를 곱한값을 뺀뒤 나누기 2 하면 가운데 배치됨 - if (trestle.direction === 'south') { + if (trestle.flowDirection === 'south') { //남쪽 x = col === 0 ? trestle.left + margin : bbox[0] + col * width + margin //상하 위치 기준이면 좌우 가운데 정렬한다 y = bbox[3] - row * height @@ -470,10 +473,10 @@ export function useModuleBasicSetting() { x = col === 0 ? trestle.left + margin : bbox[0] + col * width + margin y = bbox[1] + row * height } - } else if (trestle.direction === 'east' || trestle.direction === 'west') { + } else if (trestle.flowDirection === 'east' || trestle.flowDirection === 'west') { //동쪽 margin = (bbox[3] - bbox[1] - rows * height) / 2 - if (trestle.direction === 'east') { + if (trestle.flowDirection === 'east') { x = bbox[2] - col * width y = rows === 0 ? trestle.top + margin : bbox[1] + row * height + margin //좌우 위치 기준이면 상하 가운데 정렬한다 } else { @@ -509,7 +512,7 @@ export function useModuleBasicSetting() { return turf.booleanDisjoint(squarePolygon, polygonToTurfPolygon(dormerTrestle)) //도머가 여러개일수있으므로 겹치는게 있다면... }) if (isDisjoint) { - const fabricPolygon = new QPolygon(points, { + const tempModule = new QPolygon(points, { fill: '#BFFD9F', stroke: 'black', selectable: true, // 선택 가능하게 설정 @@ -521,12 +524,12 @@ export function useModuleBasicSetting() { opacity: 0.8, parentId: trestle.parentId, }) - canvas?.add(fabricPolygon) - drawCellsArray.push(fabricPolygon) + canvas?.add(tempModule) + drawCellsArray.push(tempModule) } } else { //도머가 없을땐 그냥 그림 - const fabricPolygon = new QPolygon(points, { + const tempModule = new QPolygon(points, { fill: '#BFFD9F', stroke: 'black', selectable: true, // 선택 가능하게 설정 @@ -540,20 +543,20 @@ export function useModuleBasicSetting() { lineCol: col, lineRow: row, }) - canvas?.add(fabricPolygon) - drawCellsArray.push(fabricPolygon) + canvas?.add(tempModule) + drawCellsArray.push(tempModule) } } } } // let drawRoofCells - // if (maxLengthLine.direction === 'right' || maxLengthLine.direction === 'left') { + // if (maxLengthLine.flowDirection === 'right' || maxLengthLine.flowDirection === 'left') { // drawRoofCells = trestle.fillCell({ width: 113.4, height: 172.2, padding: 0 }) - // trestle.direction = 'south' + // trestle.flowDirection = 'south' // } else { // drawRoofCells = trestle.fillCell({ width: 172.2, height: 113.4, padding: 0 }) - // trestle.direction = 'east' + // trestle.flowDirection = 'east' // } // drawRoofCells.forEach((cell) => { @@ -570,7 +573,7 @@ export function useModuleBasicSetting() { // obj?.parentId === trestle.parentId || // obj?.id === trestle.parentId || // (obj?.name === 'arrow' && obj?.parent.id === trestle.parentId) || - // (obj?.name === 'directionText' && obj?.parent.parent.id === trestle.parentId), + // (obj?.name === 'flowDirectionText' && obj?.parent.parent.id === trestle.parentId), // ) // console.log('groupCellObj', groupCellObj) diff --git a/src/hooks/useCanvasEvent.js b/src/hooks/useCanvasEvent.js index b4cc4223..0e8cd64b 100644 --- a/src/hooks/useCanvasEvent.js +++ b/src/hooks/useCanvasEvent.js @@ -225,7 +225,7 @@ export function useCanvasEvent() { if (deselected?.length > 0) { deselected.forEach((obj) => { if (obj.type === 'QPolygon') { - if (obj.name !== 'moduleInstSurface') { + if (obj.name !== 'moduleSetupSurface') { obj.set({ stroke: 'black' }) } } From 408d7fb04be1a64e30dd1539c3968a61238c2fa0 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 09:35:08 +0900 Subject: [PATCH 047/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 72 ++++++++++++++++--- .../estimate/useEstimateController.js | 12 ++-- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index c4faccba..77b9cd43 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -18,6 +18,7 @@ import Select, { components } from 'react-select' import { convertNumberToPriceDecimal } from '@/util/common-utils' import ProductFeaturesPop from './popup/ProductFeaturesPop' export default function Estimate({ params }) { + const [itemChangeYn, setItemChangeYn] = useState(false) const { session } = useContext(SessionContext) const [objectNo, setObjectNo] = useState('') //물건번호 const [planNo, setPlanNo] = useState('') //플랜번호 @@ -268,17 +269,45 @@ export default function Estimate({ params }) { // 아이템 자동완성 검색시 const onChangeDisplayItem = (itemId, dispOrder) => { - console.log('아이템 자동완성:::::::', dispOrder) const param = { itemId: itemId, } const apiUrl = `/api/display-item/item-detail?${queryStringFormatter(param)}` + let updateList = [] + let updates = {} get({ url: apiUrl }).then((res) => { - console.log('제품상세 결과::::::::', res) + console.log('아이템상세정보:::::::', res) + updates.objectNo = objectNo + updates.planNo = planNo + updates.itemId = res.itemId + updates.itemNo = '' //예정 + updates.itemName = res.itemName + updates.itemChangeFlg = '1' //무조건1 + updates.fileUploadFlg = res.fileUploadFlg + updates.unit = res.unit + updates.unitPrice = res.salePrice //unitPrice도 salePrice로 + updates.moduleFlg = res.moduleFlg + updates.pkgMaterialFlg = res.pkgMaterialFlg + updates.pnowW = res.pnowW + updates.salePrice = res.salePrice + updates.specification = res.specification + updates.unit = res.unit + updates.specialNoteCd = res.spnAttrCds + updates.itemGroup = res.itemGroup + + updateList = state.itemList.map((item) => { + if (item.dispOrder === dispOrder) { + return { ...item, ...updates } + } else { + return item + } + }) + setState({ + itemList: updateList, + }) + + setItemChangeYn(true) }) - // setState({ - // itemList: [{ itemNo: '123123123123' }], - // }) } //제품 삭제 @@ -302,8 +331,19 @@ export default function Estimate({ params }) { }) setSelection(new Set()) + setItemChangeYn(true) } + useEffect(() => { + if (itemChangeYn) { + // console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn) + // console.log('아이템상태가져오기::::::::::', state.itemList) + } + + //다시 false로 돌리기 여기서할지 가격정보 변경하는거 끝나고할지.. + setItemChangeYn(false) + }, [itemChangeYn]) + return (
@@ -844,8 +884,6 @@ export default function Estimate({ params }) { isClearable={true} isDisabled={false} value={displayItemList.filter(function (option) { - // console.log('옵션값???', option.itemId) - // console.log('골랐을때 여기오지???', item.itemId) return option.itemId === item.itemId })} /> @@ -877,14 +915,30 @@ export default function Estimate({ params }) {
- + { + //onChangeDisplayItem참고 + console.log('수량변경::::::::', e.target.value) + }} + />
{item.unit}
- + { + //onChangeDisplayItem참고 + console.log('단가변경:::::::', e.target.value) + }} + />
{/*
OPEN아이콘 처리 diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 06f3d4b4..8d2d8dc9 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -29,8 +29,8 @@ const defaultEstimateData = { } // Helper functions -const updateItemInList = (itemList, itemId, updates) => { - return itemList.map((item) => (item.itemId === itemId ? { ...item, ...updates } : item)) +const updateItemInList = (itemList, dispOrder, updates) => { + return itemList.map((item) => (item.dispOrder === dispOrder ? { ...item, ...updates } : item)) } export const useEstimateController = (planNo) => { @@ -69,9 +69,9 @@ export const useEstimateController = (planNo) => { } } - const updateItem = (itemId, updates) => { + const updateItem = (dispOrder, updates) => { setState({ - itemList: updateItemInList(state.itemList, itemId, updates), + itemList: updateItemInList(state.itemList, dispOrder, updates), }) } @@ -85,8 +85,8 @@ export const useEstimateController = (planNo) => { planNo: planNo, dispOrder: newItemDispOrder.toString(), itemId: '', //제품번호 - itemNo: '', //형명 - itemName: '', + itemNo: '', + itemName: '', //형명 amount: '', //수량 unitPrice: '0', unit: '', //단위 From cda5b1c1dd67a5ed12beb7cbd18a9dbb17b62bcc Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 11:23:33 +0900 Subject: [PATCH 048/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index b7b0d8d7..3dc9a2f4 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -218,10 +218,6 @@ export default function Stuff() { stuffSearchParams.endRow = 1 * pageSize stuffSearchParams.schSortType = defaultSortType setPageNo(1) - setStuffSearch({ - ...stuffSearch, - code: 'FINISH', - }) async function fetchData() { const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` @@ -239,6 +235,25 @@ export default function Stuff() { fetchData() } else if (stuffSearchParams?.code === 'C') { resetStuffRecoil() + } else if (stuffSearchParams?.code === 'FINISH') { + stuffSearchParams.startRow = 1 + stuffSearchParams.endRow = 1 * pageSize + stuffSearchParams.schSortType = defaultSortType + setPageNo(1) + async function fetchData() { + const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + await get({ url: apiUrl }).then((res) => { + if (!isEmptyArray(res)) { + setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) + setTotalCount(res[0].totCnt) + } else { + setGridProps({ ...gridProps, gridData: [], count: 0 }) + setTotalCount(0) + } + }) + } + + fetchData() } }, [stuffSearchParams]) From c3f03d86c2e664622805067f9362faa80a852302 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 11:27:40 +0900 Subject: [PATCH 049/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 32 ++++++----- src/components/management/StuffHeader.jsx | 2 +- .../estimate/useEstimateController.js | 55 +++++++++++++++---- src/locales/ja.json | 2 +- src/locales/ko.json | 2 +- 5 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 77b9cd43..4861e75c 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -55,7 +55,7 @@ export default function Estimate({ params }) { const objectRecoil = useRecoilValue(floorPlanObjectState) //견적서 상세데이터 - const { state, setState, addItem } = useEstimateController(params.pid) + const { state, setState, addItem, handleEstimateFileDownload } = useEstimateController(params.pid) //견적특이사항 List const [specialNoteList, setSpecialNoteList] = useState([]) @@ -170,7 +170,6 @@ export default function Estimate({ params }) { objectNo: objectNo, no: no, } - await promisePost({ url: 'api/file/fileDelete', data: delParams }).then((res) => { if (res.status === 204) { setOriginFiles(originFiles.filter((file) => file.objectNo === objectNo && file.no !== no)) @@ -181,13 +180,6 @@ export default function Estimate({ params }) { }) } - //아이템 목록 - // useEffect(() => { - // if (isNotEmptyArray(state.itemList)) { - // setItemList(state.itemList) - // } - // }, [state?.itemList]) - //가격표시 option 최초세팅 useEffect(() => { if (state.estimateType !== '') { @@ -267,7 +259,7 @@ export default function Estimate({ params }) { setSelection(newSelection) } - // 아이템 자동완성 검색시 + // 아이템 자동완성 검색시 아이템 변경 const onChangeDisplayItem = (itemId, dispOrder) => { const param = { itemId: itemId, @@ -282,7 +274,8 @@ export default function Estimate({ params }) { updates.itemId = res.itemId updates.itemNo = '' //예정 updates.itemName = res.itemName - updates.itemChangeFlg = '1' //무조건1 + updates.itemChangeFlg = '1' //무조건 1 + updates.partAdd = '1' //무조건1 NEW updates.fileUploadFlg = res.fileUploadFlg updates.unit = res.unit updates.unitPrice = res.salePrice //unitPrice도 salePrice로 @@ -294,6 +287,7 @@ export default function Estimate({ params }) { updates.unit = res.unit updates.specialNoteCd = res.spnAttrCds updates.itemGroup = res.itemGroup + updates.delFlg = '0' // 삭제플래그 0 updateList = state.itemList.map((item) => { if (item.dispOrder === dispOrder) { @@ -619,9 +613,16 @@ export default function Estimate({ params }) { originFiles.map((originFile) => { return (
  • - + handleEstimateFileDownload(originFile)}> {originFile.faileName} - +
  • ) @@ -888,7 +889,8 @@ export default function Estimate({ params }) { })} />
    - {item?.itemChangeFlg === '1' && ( + {/* {item?.itemChangeFlg === '1' && ( */} + {item?.partAdd === '1' && (
    @@ -921,6 +923,7 @@ export default function Estimate({ params }) { defaultValue={convertNumberToPriceDecimal(item?.amount)} onChange={(e) => { //onChangeDisplayItem참고 + //itemChangeFlg = 1, partAdd = 0 셋팅 console.log('수량변경::::::::', e.target.value) }} /> @@ -936,6 +939,7 @@ export default function Estimate({ params }) { value={convertNumberToPriceDecimal(item?.salePrice)} onChange={(e) => { //onChangeDisplayItem참고 + //itemChangeFlg, partAdd 받아온 그대로 console.log('단가변경:::::::', e.target.value) }} /> diff --git a/src/components/management/StuffHeader.jsx b/src/components/management/StuffHeader.jsx index d7e3246d..581163b6 100644 --- a/src/components/management/StuffHeader.jsx +++ b/src/components/management/StuffHeader.jsx @@ -22,7 +22,7 @@ export default function StuffHeader() { if (res != null && res != '') { setHeaderData(res) } else { - alert(getMessage('stuff.detail.header.message1')) + alert(getMessage('stuff.detail.header.notExistObjectNo')) router.push('/management/stuff') } }) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 8d2d8dc9..68252e95 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -93,6 +93,8 @@ export const useEstimateController = (planNo) => { salePrice: '0', //단가 saleTotPrice: '0', //금액(부가세별도) itemChangeFlg: '1', //추가시 체인지플래그 1로 + partAdd: '1', //NEW 체인지 플래그 + delFlg: '0', //삭제 플래그 0 삭제하면 1 }, ], }) @@ -102,34 +104,62 @@ export const useEstimateController = (planNo) => { setEstimateData({ ...state, userId: session.userId, sapSalesStoreCd: session.custCd }) }, [state]) + // 첨부파일 다운로드 + const handleEstimateFileDownload = async (originFile) => { + const options = { responseType: 'blob' } + + console.log('첨부파일 다운로드 호출:::::::', originFile) + + await promisePost({ url: `/api/file/fileDownload`, data: originFile, option: options }) + .then((resultData) => { + if (resultData) { + const blob = new Blob([resultData.data], { type: resultData.headers['content-type'] || 'application/octet-stream' }) + const fileUrl = window.URL.createObjectURL(blob) + const link = document.createElement('a') + + link.href = fileUrl + link.download = file.srcFileNm + document.body.appendChild(link) + link.click() + link.remove() + window.URL.revokeObjectURL(fileUrl) + } + }) + .catch((error) => { + alert('File does not exist.') + }) + } + //견적서 저장 const handleEstimateSubmit = async () => { //0. 필수체크 let flag = true console.log('::담긴 estimateData:::', estimateData) - + // console.log('첨부파일:::::', estimateData.fileList) + //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 - if (estimateData.itemList.length > 1) { - estimateData.itemList.map((row) => { - if (row.fileUploadFlg === '1') { - if (estimateData.fileFlg === '0') { - alert(getMessage('estimate.detail.save.requiredMsg')) - flag = false + if (estimateData.fileList.length < 1) { + if (estimateData.itemList.length > 1) { + estimateData.itemList.map((row) => { + if (row.fileUploadFlg === '1') { + if (estimateData.fileFlg === '0') { + alert(getMessage('estimate.detail.save.requiredMsg')) + flag = false + } } - } - }) + }) + } } + if (flag) { //1. 첨부파일 저장 const formData = new FormData() + console.log('첨부파일:!!!', estimateData.fileList) formData.append('file', estimateData.fileList) formData.append('objectNo', estimateData.objectNo) formData.append('planNo', estimateData.planNo) formData.append('category', '10') formData.append('userId', estimateData.userId) - // for (const value of formData.values()) { - // console.log('formData::', value) - // } await post({ url: '/api/file/fileUpload', data: formData }) @@ -162,5 +192,6 @@ export const useEstimateController = (planNo) => { addItem, handleEstimateSubmit, fetchSetting, + handleEstimateFileDownload, } } diff --git a/src/locales/ja.json b/src/locales/ja.json index 97d3f599..f849816e 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -616,7 +616,7 @@ "stuff.planReqPopup.title": "設計依頼のインポート", "stuff.temp.subTitle": "商品情報", "stuff.temp.subTitle2": "作図", - "stuff.detail.header.message1": "存在しないものです。", + "stuff.detail.header.notExistObjectNo": "存在しないものです。", "stuff.detail.header.message2": "商品番号がコピーされました。", "stuff.detail.header.message3": "存在しないものです。", "stuff.detail.header.objectNo": "商品番号のコピーに失敗しました。", diff --git a/src/locales/ko.json b/src/locales/ko.json index 2d42a11c..e22241bc 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -626,7 +626,7 @@ "stuff.planReqPopup.title": "설계의뢰 불러오기", "stuff.temp.subTitle": "물건정보", "stuff.temp.subTitle2": "도면작성", - "stuff.detail.header.message1": "존재하지 않는 물건입니다.", + "stuff.detail.header.notExistObjectNo": "존재하지 않는 물건입니다.", "stuff.detail.header.message2": "물건번호가 복사되었습니다.", "stuff.detail.header.message3": "물건번호 복사에 실패했습니다.", "stuff.detail.header.objectNo": "물건번호", From 045aa23af167d45e59ae5f09be1b889339bd7378 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 11:51:17 +0900 Subject: [PATCH 050/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=B2=A8?= =?UTF-8?q?=EB=B6=80=ED=8C=8C=EC=9D=BC=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 68252e95..4330a208 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -108,8 +108,6 @@ export const useEstimateController = (planNo) => { const handleEstimateFileDownload = async (originFile) => { const options = { responseType: 'blob' } - console.log('첨부파일 다운로드 호출:::::::', originFile) - await promisePost({ url: `/api/file/fileDownload`, data: originFile, option: options }) .then((resultData) => { if (resultData) { @@ -118,7 +116,7 @@ export const useEstimateController = (planNo) => { const link = document.createElement('a') link.href = fileUrl - link.download = file.srcFileNm + link.download = originFile.faileName document.body.appendChild(link) link.click() link.remove() @@ -126,6 +124,7 @@ export const useEstimateController = (planNo) => { } }) .catch((error) => { + console.log('::FileDownLoad Error::', error) alert('File does not exist.') }) } From 38cb4005b2c727940f26ec2e4cebd341b36bb725 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 12:08:21 +0900 Subject: [PATCH 051/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 4861e75c..1030962c 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -272,7 +272,7 @@ export default function Estimate({ params }) { updates.objectNo = objectNo updates.planNo = planNo updates.itemId = res.itemId - updates.itemNo = '' //예정 + updates.itemNo = res.itemNo updates.itemName = res.itemName updates.itemChangeFlg = '1' //무조건 1 updates.partAdd = '1' //무조건1 NEW @@ -316,6 +316,7 @@ export default function Estimate({ params }) { }) }) + // 필터안하고 플래그로 관리하는거로 변경하기 const result = state.itemList.filter((item) => { return !tempList.some((other) => other.dispOrder === item.dispOrder) }) @@ -879,7 +880,11 @@ export default function Estimate({ params }) { classNamePrefix="custom" placeholder="Select" options={displayItemList} - onChange={(e) => onChangeDisplayItem(e.itemId, item.dispOrder)} + onChange={(e) => { + if (isObjectNotEmpty(e)) { + onChangeDisplayItem(e.itemId, item.dispOrder) + } + }} getOptionLabel={(x) => x.itemName} getOptionValue={(x) => x.itemId} isClearable={true} @@ -889,8 +894,8 @@ export default function Estimate({ params }) { })} />
    - {/* {item?.itemChangeFlg === '1' && ( */} - {item?.partAdd === '1' && ( + {/* {item?.partAdd === '1' && ( */} + {item?.itemChangeFlg === '1' && (
    From 0d122ecdbd4c323d1c2ed4a16ce29cdb5ea276cd Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 12:29:27 +0900 Subject: [PATCH 052/200] =?UTF-8?q?=EB=A9=94=EC=9D=B8=20api=202=EB=B2=88?= =?UTF-8?q?=20=ED=98=B8=EC=B6=9C=ED=98=84=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/main/MainContents.jsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/main/MainContents.jsx b/src/components/main/MainContents.jsx index 77df845a..d2b3cc90 100644 --- a/src/components/main/MainContents.jsx +++ b/src/components/main/MainContents.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import { useEffect, useState, useContext } from 'react' import ProductItem from './ProductItem' import { useMessage } from '@/hooks/useMessage' import Image from 'next/image' @@ -8,17 +8,16 @@ import { useRecoilValue } from 'recoil' import { useRouter } from 'next/navigation' import { globalLocaleStore } from '@/store/localeAtom' import { queryStringFormatter } from '@/util/common-utils' -import { sessionStore } from '@/store/commonAtom' import MainSkeleton from '../ui/MainSkeleton' +import { SessionContext } from '@/app/SessionProvider' export default function MainContents() { + const { session } = useContext(SessionContext) const { getMessage } = useMessage() const router = useRouter() const globalLocaleState = useRecoilValue(globalLocaleStore) const { promiseGet } = useAxios(globalLocaleState) - const sessionState = useRecoilValue(sessionStore) - //최근 물건 const [objectList, setObjectList] = useState([]) @@ -36,12 +35,12 @@ export default function MainContents() { fetchObjectList() fetchNoticeList() fetchFaqList() - }, [sessionState]) + }, []) //최근 갱신 물건목록 / Sales Contact info 정보 const fetchObjectList = async () => { try { - const apiUrl = `/api/main-page/object/${sessionState?.storeId}/list` + const apiUrl = `/api/main-page/object/${session?.storeId}/list` await promiseGet({ url: apiUrl, }).then((res) => { From b88cecf6079b2dc806eeae29e18e1514021711f0 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 14 Nov 2024 13:35:40 +0900 Subject: [PATCH 053/200] feat: Add ManagementProvider --- src/app/management/ManagementProvider.js | 19 +++++++++++++++++++ src/app/management/layout.js | 7 +++++++ 2 files changed, 26 insertions(+) create mode 100644 src/app/management/ManagementProvider.js create mode 100644 src/app/management/layout.js diff --git a/src/app/management/ManagementProvider.js b/src/app/management/ManagementProvider.js new file mode 100644 index 00000000..9252d5f1 --- /dev/null +++ b/src/app/management/ManagementProvider.js @@ -0,0 +1,19 @@ +'ues client' + +import { createContext, useEffect, useState } from 'react' + +export const ManagementContext = createContext({ + managementState: {}, +}) + +const ManagementProvider = ({ children }) => { + const [managementState, setManagementState] = useState({}) + + useEffect(() => { + console.log('🚀 ~ managementState:', managementState) + }, [managementState]) + + return {children} +} + +export default ManagementProvider diff --git a/src/app/management/layout.js b/src/app/management/layout.js new file mode 100644 index 00000000..b0e031c7 --- /dev/null +++ b/src/app/management/layout.js @@ -0,0 +1,7 @@ +'use client' + +import ManagementProvider from './ManagementProvider' + +export default function ManagementLayout({ children }) { + return {children} +} From 7c048db6e40811c2799f610a30d4a5810fbddb43 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 14 Nov 2024 13:39:54 +0900 Subject: [PATCH 054/200] =?UTF-8?q?fix:=20provider=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/management/ManagementProvider.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/management/ManagementProvider.js b/src/app/management/ManagementProvider.js index 9252d5f1..197b30c0 100644 --- a/src/app/management/ManagementProvider.js +++ b/src/app/management/ManagementProvider.js @@ -4,6 +4,7 @@ import { createContext, useEffect, useState } from 'react' export const ManagementContext = createContext({ managementState: {}, + setManagementState: () => {}, }) const ManagementProvider = ({ children }) => { From 75a3cf3f73784faab4df9aa6846941fcf390a18d Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 14:18:21 +0900 Subject: [PATCH 055/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EA=B0=84=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EA=B3=B5=EC=9C=A0=20=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 118 +++++++++--------- src/components/management/StuffHeader.jsx | 43 ++----- .../management/StuffSearchCondition.jsx | 4 - src/locales/ja.json | 4 +- src/locales/ko.json | 4 +- 5 files changed, 77 insertions(+), 96 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 93328de3..6378aeec 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -18,6 +18,7 @@ import WindSelectPop from './popup/WindSelectPop' import { useCommonCode } from '@/hooks/common/useCommonCode' import StuffPlanQGrid from './StuffPlanQGrid' import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' +import { ManagementContext } from '@/app/management/ManagementProvider' export default function StuffDetail() { const setFloorPlanObjectNo = useSetRecoilState(floorPlanObjectState) //견적서 화면용 물건번호리코일 @@ -96,7 +97,7 @@ export default function StuffDetail() { const objectNo = searchParams.get('objectNo') //url에서 물건번호 꺼내서 바로 set const [editMode, setEditMode] = useState('NEW') - const [detailData, setDetailData] = useState({}) + const { managementState, setManagementState } = useContext(ManagementContext) const [planGridProps, setPlanGridProps] = useState({ planGridData: [], @@ -289,9 +290,9 @@ export default function StuffDetail() { promiseGet({ url: `/api/object/${objectNo}/detail` }).then((res) => { if (res.status === 200) { if (res.data != null) { - setDetailData(res.data) + setManagementState(res.data) } else { - setDetailData({}) + setManagementState({}) } if (isNotEmptyArray(res.data.planList)) { setPlanGridProps({ ...planGridProps, planGridData: res.data.planList }) @@ -299,7 +300,7 @@ export default function StuffDetail() { setPlanGridProps({ ...planGridProps, planGridData: [] }) } } else { - setDetailData({}) + setManagementState({}) setPlanGridProps({ ...planGridProps, planGridData: [] }) } }) @@ -415,7 +416,7 @@ export default function StuffDetail() { }, [commonCode]) useEffect(() => { - if (isObjectNotEmpty(detailData)) { + if (isObjectNotEmpty(managementState)) { // 도도부현API get({ url: '/api/object/prefecture/list' }).then((res) => { if (!isEmptyArray(res)) { @@ -449,18 +450,17 @@ export default function StuffDetail() { setFavoriteStoreList(favList) setShowSaleStoreList(favList) - if (detailData.firstAgentId != null) { - form.setValue('saleStoreId', detailData.firstAgentId) - setSelOptions(detailData.firstAgentId) + if (managementState.firstAgentId != null) { + form.setValue('saleStoreId', managementState.firstAgentId) + setSelOptions(managementState.firstAgentId) } else { - form.setValue('saleStoreId', detailData.saleStoreId) - setSelOptions(detailData.saleStoreId) + form.setValue('saleStoreId', managementState.saleStoreId) + setSelOptions(managementState.saleStoreId) } //상세데이터의 1차점 아이디로 2차점 목록 조회하기 - let data = detailData?.firstAgentId ? detailData.firstAgentId : detailData.saleStoreId - // url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=0&userId=${session?.userId}` + let data = managementState?.firstAgentId ? managementState.firstAgentId : managementState.saleStoreId url = `/api/object/saleStore/${data}/list?firstFlg=0&userId=${session?.userId}` get({ url: url }).then((res) => { @@ -502,74 +502,74 @@ export default function StuffDetail() { //상세데이터가 1차점이면 1차점에 세팅 //상세데이터가 2차점이면 2차점에 세팅하고 세션으로 1차점 세팅 - if (detailData.saleStoreLevel === '1') { - setSelOptions(detailData.saleStoreId) - form.setValue('saleStoreId', detailData.saleStoreId) - form.setValue('saleStoreLevel', detailData.saleStoreLevel) + if (managementState.saleStoreLevel === '1') { + setSelOptions(managementState.saleStoreId) + form.setValue('saleStoreId', managementState.saleStoreId) + form.setValue('saleStoreLevel', managementState.saleStoreLevel) } else { - setOtherSelOptions(detailData.saleStoreId) - form.setValue('otherSaleStoreId', detailData.saleStoreId) - form.setValue('otherSaleStoreLevel', detailData.saleStoreLevel) + setOtherSelOptions(managementState.saleStoreId) + form.setValue('otherSaleStoreId', managementState.saleStoreId) + form.setValue('otherSaleStoreLevel', managementState.saleStoreLevel) form.setValue('saleStoreLevel', '1') } //설계의뢰No. - form.setValue('planReqNo', detailData.planReqNo) + form.setValue('planReqNo', managementState.planReqNo) //담당자 - form.setValue('receiveUser', detailData.receiveUser) + form.setValue('receiveUser', managementState.receiveUser) //물건구분objectStatusId - setSelectObjectStatusId(detailData.objectStatusId) - form.setValue('objectStatusId', detailData.objectStatusId) + setSelectObjectStatusId(managementState.objectStatusId) + form.setValue('objectStatusId', managementState.objectStatusId) //물건명 - form.setValue('objectName', detailData.objectName) + form.setValue('objectName', managementState.objectName) //경칭코드 - setSelHonorificCode(detailData.objectNameOmit) - form.setValue('objectNameOmit', detailData.objectNameOmit) + setSelHonorificCode(managementState.objectNameOmit) + form.setValue('objectNameOmit', managementState.objectNameOmit) //물건명 후리가나 - form.setValue('objectNameKana', detailData.objectNameKana) + form.setValue('objectNameKana', managementState.objectNameKana) //우편번호 - form.setValue('zipNo', detailData.zipNo) + form.setValue('zipNo', managementState.zipNo) //도도부현 / 주소 - setPrefValue(detailData.prefId) - form.setValue('prefId', detailData.prefId) - form.setValue('prefName', detailData.prefName) - form.setValue('address', detailData.address) + setPrefValue(managementState.prefId) + form.setValue('prefId', managementState.prefId) + form.setValue('prefName', managementState.prefName) + form.setValue('address', managementState.address) //발전시뮬 - form.setValue('areaId', detailData.areaId) + form.setValue('areaId', managementState.areaId) //기준풍속 - form.setValue('standardWindSpeedId', detailData.standardWindSpeedId) + form.setValue('standardWindSpeedId', managementState.standardWindSpeedId) //수직적설량 - form.setValue('verticalSnowCover', detailData.verticalSnowCover) + form.setValue('verticalSnowCover', managementState.verticalSnowCover) //한랭지대책시행 coldRegionFlg 1이면 true - form.setValue('coldRegionFlg', detailData.coldRegionFlg === '1' ? true : false) + form.setValue('coldRegionFlg', managementState.coldRegionFlg === '1' ? true : false) //면조도구분 surfaceType null로 내려오면 셋팅 안하고 저장할때 필수값 체크하도록 // form.setValue('surfaceType', 'Ⅱ') // form.setValue('surfaceType', 'Ⅲ・Ⅳ') - form.setValue('surfaceType', detailData.surfaceType) + form.setValue('surfaceType', managementState.surfaceType) //염해지역용아이템사용 saltAreaFlg 1이면 true - form.setValue('saltAreaFlg', detailData.saltAreaFlg === '1' ? true : false) + form.setValue('saltAreaFlg', managementState.saltAreaFlg === '1' ? true : false) //설치높이 - form.setValue('installHeight', detailData.installHeight) + form.setValue('installHeight', managementState.installHeight) //계약조건 null로 내려오면 0으로 디폴트셋팅 - if (detailData.conType === null) { + if (managementState.conType === null) { form.setValue('conType', '0') } else { - form.setValue('conType', detailData.conType) + form.setValue('conType', managementState.conType) } //메모 - form.setValue('remarks', detailData.remarks) + form.setValue('remarks', managementState.remarks) }) } - }, [detailData, session]) + }, [managementState, session]) //경칭선택 변경 이벤트 const onChangeHonorificCode = (key) => { @@ -1189,9 +1189,9 @@ export default function StuffDetail() { return alert(getMessage('stuff.detail.save.valierror2')) } - let detail_sort = Object.keys(detailData) + let detail_sort = Object.keys(managementState) .sort() - .reduce((obj, key) => ((obj[key] = detailData[key]), obj), {}) + .reduce((obj, key) => ((obj[key] = managementState[key]), obj), {}) let params_sort = Object.keys(params) .sort() .reduce((obj, key) => ((obj[key] = params[key]), obj), {}) @@ -1313,7 +1313,7 @@ export default function StuffDetail() { // 물건삭제 const onDelete = () => { - const specificationConfirmDate = detailData.specificationConfirmDate + const specificationConfirmDate = managementState.specificationConfirmDate if (specificationConfirmDate != null) { alert(getMessage('stuff.detail.delete.message1')) } else { @@ -1860,8 +1860,7 @@ export default function StuffDetail() {
    - {/* {detailData?.tempFlg === '1' && form.watch('planReqNo') ? ( */} - {detailData?.tempFlg === '1' && form.watch('planReqNo') ? ( + {managementState?.tempFlg === '1' && form.watch('planReqNo') ? ( ) : null}
    - {detailData?.tempFlg === '1' ? ( + {managementState?.tempFlg === '1' ? ( <>
    - {/* {detailData?.tempFlg === '0' ? ( */} - {detailData?.tempFlg === '0' ? ( + {managementState?.tempFlg === '0' ? ( <> {/* 진짜R 플랜시작 */}
    @@ -2355,7 +2359,7 @@ export default function StuffDetail() {
    • {getMessage('stuff.detail.planList.cnt')} - {detailData.planList?.length} + {managementState.planList?.length}
    diff --git a/src/components/management/StuffHeader.jsx b/src/components/management/StuffHeader.jsx index 581163b6..f32c971c 100644 --- a/src/components/management/StuffHeader.jsx +++ b/src/components/management/StuffHeader.jsx @@ -1,40 +1,21 @@ 'use client' -import React, { useState, useEffect } from 'react' -import { useAxios } from '@/hooks/useAxios' -import { useRouter, useSearchParams } from 'next/navigation' -import { globalLocaleStore } from '@/store/localeAtom' -import { useRecoilValue } from 'recoil' +import { useContext } from 'react' import { useMessage } from '@/hooks/useMessage' import dayjs from 'dayjs' - +import { ManagementContext } from '@/app/management/ManagementProvider' export default function StuffHeader() { const { getMessage } = useMessage() - const router = useRouter() - const searchParams = useSearchParams() - const objectNo = searchParams.get('objectNo') //url에서 물건번호 꺼내서 바로 set - const globalLocaleState = useRecoilValue(globalLocaleStore) - const { get } = useAxios(globalLocaleState) - const [headerData, setHeaderData] = useState({}) - useEffect(() => { - get({ url: `/api/object/${objectNo}/detail` }).then((res) => { - if (res != null && res != '') { - setHeaderData(res) - } else { - alert(getMessage('stuff.detail.header.notExistObjectNo')) - router.push('/management/stuff') - } - }) - }, [objectNo]) + const { managementState } = useContext(ManagementContext) //물건번호 복사 const copyObjectNo = async (objectNo) => { await navigator.clipboard.writeText(objectNo) - alert(getMessage('stuff.detail.header.message2')) + alert(getMessage('stuff.detail.header.successCopy')) try { } catch (error) { - alert(getMessage('stuff.detail.header.message3')) + alert(getMessage('stuff.detail.header.failCopy')) } } @@ -43,31 +24,31 @@ export default function StuffHeader() {
    {getMessage('stuff.detail.header.objectNo')}
    - {headerData.objectNo}{' '} + {managementState?.objectNo}{' '}
    {getMessage('stuff.detail.header.specificationConfirmDate')}
    -
    {headerData.specificationConfirmDate}
    +
    {managementState?.specificationConfirmDate}
    {getMessage('stuff.detail.header.lastEditDatetime')}
    - {headerData?.lastEditDatetime ? `${dayjs(headerData.lastEditDatetime).format('YYYY.MM.DD HH:mm:ss')}` : ''}{' '} - {headerData?.lastEditUserName ? `(${headerData.lastEditUserName})` : null} + {managementState?.lastEditDatetime ? `${dayjs(managementState.lastEditDatetime).format('YYYY.MM.DD HH:mm:ss')}` : ''}{' '} + {managementState?.lastEditUserName ? `(${managementState.lastEditUserName})` : null}
    {getMessage('stuff.detail.header.createDatetime')}
    - {headerData?.createDatetime ? `${dayjs(headerData.lastEditDatetime).format('YYYY.MM.DD')}` : ''}{' '} - {headerData?.createUserName ? `(${headerData.createUserName})` : null} + {managementState?.createDatetime ? `${dayjs(managementState.lastEditDatetime).format('YYYY.MM.DD')}` : ''}{' '} + {managementState?.createUserName ? `(${managementState.createUserName})` : null}
    diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index f82d83f3..6a16695a 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -223,10 +223,6 @@ export default function StuffSearchCondition() { } }) } - // setStuffSearch({ - // ...stuffSearch, - // code: 'S', - // }) } else { if (session?.storeLvl === '1') { allList = res diff --git a/src/locales/ja.json b/src/locales/ja.json index f849816e..fad3e4df 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -617,8 +617,8 @@ "stuff.temp.subTitle": "商品情報", "stuff.temp.subTitle2": "作図", "stuff.detail.header.notExistObjectNo": "存在しないものです。", - "stuff.detail.header.message2": "商品番号がコピーされました。", - "stuff.detail.header.message3": "存在しないものです。", + "stuff.detail.header.successCopy": "商品番号がコピーされました。", + "stuff.detail.header.failCopy": "存在しないものです。", "stuff.detail.header.objectNo": "商品番号のコピーに失敗しました。", "stuff.detail.header.specificationConfirmDate": "仕様拡張日", "stuff.detail.header.lastEditDatetime": "更新日時", diff --git a/src/locales/ko.json b/src/locales/ko.json index e22241bc..1220279b 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -627,8 +627,8 @@ "stuff.temp.subTitle": "물건정보", "stuff.temp.subTitle2": "도면작성", "stuff.detail.header.notExistObjectNo": "존재하지 않는 물건입니다.", - "stuff.detail.header.message2": "물건번호가 복사되었습니다.", - "stuff.detail.header.message3": "물건번호 복사에 실패했습니다.", + "stuff.detail.header.successCopy": "물건번호가 복사되었습니다.", + "stuff.detail.header.failCopy": "물건번호 복사에 실패했습니다.", "stuff.detail.header.objectNo": "물건번호", "stuff.detail.header.specificationConfirmDate": "사양확장일", "stuff.detail.header.lastEditDatetime": "갱신일시", From 01495d734ac91ad05cac525d43525475da570c54 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Thu, 14 Nov 2024 15:17:48 +0900 Subject: [PATCH 056/200] =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EB=B0=B0=EC=B9=98?= =?UTF-8?q?=20=EC=88=98=EB=8F=99,=20=EC=9E=90=EB=8F=99=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useModuleBasicSetting.js | 213 ++++++++++++++-------- 1 file changed, 139 insertions(+), 74 deletions(-) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index 3f25f49f..3fbdf890 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react' import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' import { canvasState } from '@/store/canvasAtom' -import { setSurfaceShapePattern } from '@/util/canvas-util' +import { rectToPolygon, setSurfaceShapePattern } from '@/util/canvas-util' import { roofDisplaySelector } from '@/store/settingAtom' import offsetPolygon from '@/util/qpolygon-utils' import { QPolygon } from '@/components/fabric/QPolygon' @@ -13,7 +13,7 @@ import * as turf from '@turf/turf' export function useModuleBasicSetting() { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) - const setModuleInstSurface = useSetRecoilState(moduleSetupSurfaceState) + const [moduleSetupSurface, setModuleSetupSurface] = useRecoilState(moduleSetupSurfaceState) const [moduleIsSetup, setModuleIsSetup] = useRecoilState(moduleIsSetupState) const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() let selectedModuleInstSurfaceArray = [] @@ -61,9 +61,7 @@ export function useModuleBasicSetting() { //설치 범위 지정 클릭 이벤트 const toggleSelection = (setupSurface) => { - console.log('polygon', setupSurface) - - const isExist = selectedModuleInstSurfaceArray.some((obj) => obj.parentId === polygon.parentId) + const isExist = selectedModuleInstSurfaceArray.some((obj) => obj.parentId === setupSurface.parentId) //최초 선택일때 if (!isExist) { //기본 선택이랑 스트로크 굵기가 같으면 선택 안됨으로 봄 @@ -95,7 +93,7 @@ export function useModuleBasicSetting() { } canvas?.renderAll() - setModuleInstSurface([...selectedModuleInstSurfaceArray]) + setModuleSetupSurface([...selectedModuleInstSurfaceArray]) } /** @@ -330,7 +328,16 @@ export function useModuleBasicSetting() { //도머 객체를 가져옴 if (batchObjects) { batchObjects.forEach((object) => { - const dormerTurfPolygon = polygonToTurfPolygon(object) //turf객체로 변환 + let dormerTurfPolygon + + if (object.type === 'group') { + //도머는 그룹형태임 + dormerTurfPolygon = batchObjectGroupToTurfPolygon(object) + } else { + //개구, 그림자 + dormerTurfPolygon = polygonToTurfPolygon(rectToPolygon(object)) + } + const intersection = turf.intersect(turf.featureCollection([dormerTurfPolygon, tempTurfModule])) //겹치는지 확인 //겹치면 안됨 if (intersection) { @@ -346,7 +353,7 @@ export function useModuleBasicSetting() { if (turf.booleanWithin(tempTurfModule, turfPolygon)) { //마우스 클릭시 set으로 해당 위치에 셀을 넣음 - const isOverlap = manualDrawModules.some((cell) => turf.booleanOverlap(tempTurfModule, polygonToTurfPolygon(cell))) //겹치는지 확인 + const isOverlap = manualDrawModules.some((module) => turf.booleanOverlap(tempTurfModule, polygonToTurfPolygon(module))) //겹치는지 확인 if (!isOverlap) { //안겹치면 넣는다 tempModule.setCoords() @@ -367,73 +374,86 @@ export function useModuleBasicSetting() { } } - const coordToTurfPolygon = (points) => { - const coordinates = points.map((point) => [point.x, point.y]) - coordinates.push(coordinates[0]) - return turf.polygon([coordinates]) - } - - const polygonToTurfPolygon = (polygon) => { - const coordinates = polygon.points.map((point) => [point.x, point.y]) - coordinates.push(coordinates[0]) - return turf.polygon( - [coordinates], - {}, - { - parentId: polygon.parentId, - }, - ) - } - const autoModuleSetup = () => { - const moduleSetupSurfaces = canvas?.getObjects().filter((obj) => obj.name === 'trestle' && obj.selected) - const notSelectedTrestlePolygons = canvas?.getObjects().filter((obj) => obj.name === 'trestle' && !obj.selected) + initEvent() + const moduleSetupSurfaces = moduleSetupSurface + const notSelectedTrestlePolygons = canvas + ?.getObjects() + .filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE && !moduleSetupSurfaces.includes(obj)) - const dormerTrestlePolygons = canvas?.getObjects().filter((obj) => obj.name === 'dormerTrestle') //도머 객체 + const batchObjects = canvas + ?.getObjects() + .filter( + (obj) => + obj.name === BATCH_TYPE.OPENING || + obj.name === BATCH_TYPE.TRIANGLE_DORMER || + obj.name === BATCH_TYPE.PENTAGON_DORMER || + obj.name === BATCH_TYPE.SHADOW, + ) //도머s 객체 if (moduleSetupSurfaces.length === 0) { - alert('가대가 없습니다.') + alert('선택된 모듈 설치면이 없습니다.') return } - if (drewRoofCells.length > 0) { - alert('기존 셀은 제거됩니다.') + if (moduleIsSetup.length > 0) { + alert('기존 모듈은 제거됩니다.') } - notSelectedTrestlePolygons.forEach((trestle) => { - trestle.cells.forEach((cell) => { - canvas?.remove(cell) - }) - trestle.cells = [] + notSelectedTrestlePolygons.forEach((obj) => { + if (obj.modules) { + obj.modules.forEach((module) => { + canvas?.remove(module) + }) + obj.modules = [] + } }) - const drawCellsArray = [] - moduleSetupSurfaces.forEach((trestle, index) => { - trestle.fire('mousedown') - let maxLengthLine = trestle.lines.reduce((acc, cur) => { + const moduleSetupArray = [] + moduleSetupSurfaces.forEach((moduleSetupSurface, index) => { + moduleSetupSurface.fire('mousedown') + + let maxLengthLine = moduleSetupSurface.lines.reduce((acc, cur) => { return acc.length > cur.length ? acc : cur }) - const turfTrestlePolygon = polygonToTurfPolygon(trestle) //폴리곤을 turf 객체로 변환 + const turfModuleSetupSurface = polygonToTurfPolygon(moduleSetupSurface) //폴리곤을 turf 객체로 변환 + + const containsBatchObjects = batchObjects.filter((batchObject) => { + let convertBatchObject + + if (batchObject.type === 'group') { + //도머는 그룹형태임 + convertBatchObject = batchObjectGroupToTurfPolygon(batchObject) + } else { + //개구, 그림자 + batchObject.set({ + points: rectToPolygon(batchObject), + }) + convertBatchObject = polygonToTurfPolygon(batchObject) + } - const containsDormerTrestlePolygons = dormerTrestlePolygons.filter((dormerTrestle) => { // 폴리곤 안에 도머 폴리곤이 포함되어있는지 확인해서 반환하는 로직 - return ( - turf.booleanContains(turfTrestlePolygon, polygonToTurfPolygon(dormerTrestle)) || - turf.booleanWithin(polygonToTurfPolygon(dormerTrestle), turfTrestlePolygon) - ) + return turf.booleanContains(turfModuleSetupSurface, convertBatchObject) || turf.booleanWithin(convertBatchObject, turfModuleSetupSurface) }) - let difference = turfTrestlePolygon //기본 객체(면형상) + let difference = turfModuleSetupSurface //기본 객체(면형상) - if (containsDormerTrestlePolygons.length > 0) { + if (containsBatchObjects.length > 0) { //turf로 도머를 제외시키는 로직 - for (let i = 0; i < containsDormerTrestlePolygons.length; i++) { + for (let i = 0; i < containsBatchObjects.length; i++) { + let convertBatchObject + if (containsBatchObjects[i].type === 'group') { + convertBatchObject = batchObjectGroupToTurfPolygon(containsBatchObjects[i]) + } else { + convertBatchObject = polygonToTurfPolygon(containsBatchObjects[i]) + } + if (i === 0) { - difference = turf.difference(turf.featureCollection([turfTrestlePolygon, polygonToTurfPolygon(containsDormerTrestlePolygons[i])])) //한 면에 도머가 1개일때 + difference = turf.difference(turf.featureCollection([turfModuleSetupSurface, convertBatchObject])) //한 면에 도머가 1개일때 } else { if (difference) { - difference = turf.difference(turf.featureCollection([difference, polygonToTurfPolygon(containsDormerTrestlePolygons[i])])) //한면에 도머가 여러개일때 계속 제외시킴 + difference = turf.difference(turf.featureCollection([difference, convertBatchObject])) //한면에 도머가 여러개일때 계속 제외시킴 } } } @@ -444,9 +464,9 @@ export function useModuleBasicSetting() { let height = maxLengthLine.flowDirection === 'right' || maxLengthLine.flowDirection === 'left' ? 113.4 : 172.2 //배치면때는 방향쪽으로 패널이 넓게 누워져야함 - if (trestle.flowDirection !== undefined) { - width = trestle.flowDirection === 'south' || trestle.flowDirection === 'north' ? 172.2 : 113.4 - height = trestle.flowDirection === 'south' || trestle.flowDirection === 'north' ? 113.4 : 172.2 + if (moduleSetupSurface.flowDirection !== undefined) { + width = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 172.2 : 113.4 + height = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 113.4 : 172.2 } const cols = Math.floor((bbox[2] - bbox[0]) / width) const rows = Math.floor((bbox[3] - bbox[1]) / height) @@ -458,30 +478,30 @@ export function useModuleBasicSetting() { square = [], margin = 0 - if (trestle.flowDirection !== undefined) { + if (moduleSetupSurface.flowDirection !== undefined) { //배치면 처림 방향이 정해져있는 경우 - if (trestle.flowDirection === 'south' || trestle.flowDirection === 'north') { + if (moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north') { //남,북 margin = (bbox[2] - bbox[0] - cols * width) / 2 //박스 끝에서 박스 시작값을 빼고 width와 계산된 cols를 곱한값을 뺀뒤 나누기 2 하면 가운데 배치됨 - if (trestle.flowDirection === 'south') { + if (moduleSetupSurface.flowDirection === 'south') { //남쪽 - x = col === 0 ? trestle.left + margin : bbox[0] + col * width + margin //상하 위치 기준이면 좌우 가운데 정렬한다 + x = col === 0 ? moduleSetupSurface.left + margin : bbox[0] + col * width + margin //상하 위치 기준이면 좌우 가운데 정렬한다 y = bbox[3] - row * height } else { //북쪽 - x = col === 0 ? trestle.left + margin : bbox[0] + col * width + margin + x = col === 0 ? moduleSetupSurface.left + margin : bbox[0] + col * width + margin y = bbox[1] + row * height } - } else if (trestle.flowDirection === 'east' || trestle.flowDirection === 'west') { + } else if (moduleSetupSurface.flowDirection === 'east' || moduleSetupSurface.flowDirection === 'west') { //동쪽 margin = (bbox[3] - bbox[1] - rows * height) / 2 - if (trestle.flowDirection === 'east') { + if (moduleSetupSurface.flowDirection === 'east') { x = bbox[2] - col * width - y = rows === 0 ? trestle.top + margin : bbox[1] + row * height + margin //좌우 위치 기준이면 상하 가운데 정렬한다 + y = rows === 0 ? moduleSetupSurface.top + margin : bbox[1] + row * height + margin //좌우 위치 기준이면 상하 가운데 정렬한다 } else { x = bbox[0] + col * width - y = rows === 0 ? trestle.top + margin : bbox[1] + row * height + margin + y = rows === 0 ? moduleSetupSurface.top + margin : bbox[1] + row * height + margin } } } else { @@ -500,17 +520,29 @@ export function useModuleBasicSetting() { const squarePolygon = turf.polygon([square]) - const disjointFromTrestle = turf.booleanContains(turfTrestlePolygon, squarePolygon) || turf.booleanWithin(squarePolygon, turfTrestlePolygon) + const disjointFromTrestle = + turf.booleanContains(turfModuleSetupSurface, squarePolygon) || turf.booleanWithin(squarePolygon, turfModuleSetupSurface) if (disjointFromTrestle) { let turfCoordnates = squarePolygon.geometry.coordinates[0].slice(0, -1) const points = turfCoordnates.map((coord) => ({ x: coord[0], y: coord[1] })) - if (containsDormerTrestlePolygons.length > 0) { + if (containsBatchObjects.length > 0) { + let convertBatchObject + //도머가 있으면 적용되는 로직 - const isDisjoint = containsDormerTrestlePolygons.some((dormerTrestle) => { - return turf.booleanDisjoint(squarePolygon, polygonToTurfPolygon(dormerTrestle)) //도머가 여러개일수있으므로 겹치는게 있다면... + const isDisjoint = containsBatchObjects.some((batchObject) => { + if (batchObject.type === 'group') { + convertBatchObject = batchObjectGroupToTurfPolygon(batchObject) + } else { + convertBatchObject = polygonToTurfPolygon(batchObject) + } + + return turf.booleanDisjoint(squarePolygon, convertBatchObject) //도머가 여러개일수있으므로 겹치는게 있다면... }) + + console.log('isDisjoint', isDisjoint) + if (isDisjoint) { const tempModule = new QPolygon(points, { fill: '#BFFD9F', @@ -522,10 +554,10 @@ export function useModuleBasicSetting() { lockScalingX: false, // X 축 크기 조정 잠금 lockScalingY: false, // Y 축 크기 조정 잠금 opacity: 0.8, - parentId: trestle.parentId, + parentId: moduleSetupSurface.parentId, }) canvas?.add(tempModule) - drawCellsArray.push(tempModule) + moduleSetupArray.push(tempModule) } } else { //도머가 없을땐 그냥 그림 @@ -539,12 +571,12 @@ export function useModuleBasicSetting() { lockScalingX: true, // X 축 크기 조정 잠금 lockScalingY: true, // Y 축 크기 조정 잠금 opacity: 0.8, - parentId: trestle.parentId, + parentId: moduleSetupSurface.parentId, lineCol: col, lineRow: row, }) canvas?.add(tempModule) - drawCellsArray.push(tempModule) + moduleSetupArray.push(tempModule) } } } @@ -560,7 +592,7 @@ export function useModuleBasicSetting() { // } // drawRoofCells.forEach((cell) => { - // drawCellsArray.push(cell) + // moduleSetupArray.push(cell) // }) /** @@ -585,9 +617,42 @@ export function useModuleBasicSetting() { // originY: 'center', // }), // ) + + moduleSetupSurface.set({ modules: moduleSetupArray }) }) - setDrewRoofCells(drawCellsArray) + setModuleIsSetup(moduleSetupArray) + } + + const coordToTurfPolygon = (points) => { + const coordinates = points.map((point) => [point.x, point.y]) + coordinates.push(coordinates[0]) + return turf.polygon([coordinates]) + } + + const polygonToTurfPolygon = (object) => { + let coordinates + coordinates = object.points.map((point) => [point.x, point.y]) + coordinates.push(coordinates[0]) + return turf.polygon( + [coordinates], + {}, + { + parentId: object.parentId, + }, + ) + } + + function batchObjectGroupToTurfPolygon(group) { + const polygons = group.getObjects().filter((obj) => obj.type === 'QPolygon') + let allPoints = [] + + polygons.forEach((obj) => allPoints.push(...obj.get('points'))) + + const points = turf.featureCollection(allPoints.map((point) => turf.point([point.x, point.y]))) + const hull = turf.concave(points, { tolerance: 0.1 }) + + return hull } return { From 706ad9aed8d0626d2a8465d152cf1f5865f081b9 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 14 Nov 2024 15:36:57 +0900 Subject: [PATCH 057/200] =?UTF-8?q?=EC=A7=80=EB=B6=95=EB=A9=B4=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/MenuDepth01.jsx | 4 +- .../roofcover/useRoofAllocationSetting.js | 2 +- src/hooks/usePolygon.js | 151 ++++++++++++------ src/util/canvas-util.js | 24 +++ src/util/qpolygon-utils.js | 14 +- 5 files changed, 139 insertions(+), 56 deletions(-) diff --git a/src/components/floor-plan/MenuDepth01.jsx b/src/components/floor-plan/MenuDepth01.jsx index 351fdc97..5b1897b3 100644 --- a/src/components/floor-plan/MenuDepth01.jsx +++ b/src/components/floor-plan/MenuDepth01.jsx @@ -1,7 +1,7 @@ 'use client' import { useMessage } from '@/hooks/useMessage' -import { currentMenuState } from '@/store/canvasAtom' +import { canvasState, currentMenuState } from '@/store/canvasAtom' import { useRecoilState, useRecoilValue } from 'recoil' import { menuTypeState, subMenusState } from '@/store/menuAtom' import useMenu from '@/hooks/common/useMenu' @@ -9,6 +9,7 @@ import { useEffect } from 'react' export default function MenuDepth01() { const type = useRecoilValue(menuTypeState) + const canvas = useRecoilValue(canvasState) const { getMessage } = useMessage() const { handleMenu } = useMenu() const [currentMenu, setCurrentMenu] = useRecoilState(currentMenuState) @@ -24,6 +25,7 @@ export default function MenuDepth01() { useEffect(() => { handleMenu(type) + canvas.discardActiveObject() }, [currentMenu]) return (
    diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 5626e075..9a9973cb 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -107,7 +107,7 @@ export function useRoofAllocationSetting(id) { } }) }) - if (currentObject && currentObject.name && !currentObject.name.toLowerCase().includes('text')) { + if (currentObject && currentObject.name && ['auxiliaryLine', 'ridge', 'hip'].includes(currentObject.name)) { currentObject.set({ strokeWidth: 4, stroke: '#EA10AC', diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index b3730493..b83d8b1a 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -1,7 +1,7 @@ import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, fontFamilyState, fontSizeState, pitchTextSelector } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' import { fabric } from 'fabric' -import { getDegreeByChon, getDegreeInOrientation, getDirectionByPoint, isPointOnLine } from '@/util/canvas-util' +import { findAndRemoveClosestPoint, getDegreeByChon, getDegreeInOrientation, getDirectionByPoint, isPointOnLine } from '@/util/canvas-util' import { QPolygon } from '@/components/fabric/QPolygon' import { isSamePoint, removeDuplicatePolygons } from '@/util/qpolygon-utils' import { flowDisplaySelector } from '@/store/settingAtom' @@ -86,8 +86,8 @@ export const usePolygon = () => { parentDirection: line.direction, parentDegree: degree, parentId: polygon.id, - planeSize, - actualSize, + planeSize: planeSize ?? length, + actualSize: actualSize ?? length, editable: false, selectable: true, lockRotation: true, @@ -669,62 +669,107 @@ export const usePolygon = () => { const splitPolygonWithLines = (polygon) => { polygon.set({ visible: false }) let innerLines = [...polygon.innerLines] + + canvas.renderAll() let polygonLines = [...polygon.lines] const roofs = [] - let delIndexs = [] - let newLines = [] - - polygonLines.forEach((line, index) => { - line.tempIndex = index + //polygonLines를 순회하며 innerLines와 교차하는 점을 line의 속성에 배열로 저장한다. + polygonLines.forEach((line) => { + const intersections = [] innerLines.forEach((innerLine) => { - let newLine1, newLine2 if (isPointOnLine(line, innerLine.startPoint)) { - // 해당 line을 startPoint로 나눈 line2개를 canvas에 추가 하고 기존 line을 제거한다. - newLine1 = new QLine([line.x1, line.y1, innerLine.startPoint.x, innerLine.startPoint.y], { - fontSize: polygon.fontSize, - stroke: 'black', - strokeWidth: 3, - }) - - newLine2 = new QLine([innerLine.startPoint.x, innerLine.startPoint.y, line.x2, line.y2], { - fontSize: polygon.fontSize, - stroke: 'black', - strokeWidth: 3, - }) - delIndexs.push(polygonLines.indexOf(line)) - canvas.remove(polygonLines[polygonLines.indexOf(line)]) - if (newLine1.length / 10 > 10) { - newLines.push(newLine1) - } - if (newLine2.length / 10 > 10) { - newLines.push(newLine2) + if (isSamePoint(line.startPoint, innerLine.startPoint) || isSamePoint(line.endPoint, innerLine.startPoint)) { + return } + intersections.push(innerLine.startPoint) } if (isPointOnLine(line, innerLine.endPoint)) { - newLine1 = new QLine([line.x1, line.y1, innerLine.endPoint.x, innerLine.endPoint.y], { - fontSize: polygon.fontSize, - stroke: 'black', - strokeWidth: 3, - }) - - newLine2 = new QLine([innerLine.endPoint.x, innerLine.endPoint.y, line.x2, line.y2], { - fontSize: polygon.fontSize, - stroke: 'black', - strokeWidth: 3, - }) - delIndexs.push(polygonLines.indexOf(line)) - canvas.remove(polygonLines[polygonLines.indexOf(line)]) - if (newLine1.length / 10 > 10) { - newLines.push(newLine1) - } - if (newLine2.length / 10 > 10) { - newLines.push(newLine2) + if (isSamePoint(line.startPoint, innerLine.endPoint) || isSamePoint(line.startPoint, innerLine.endPoint)) { + return } + intersections.push(innerLine.endPoint) } }) + line.set({ intersections }) }) - polygonLines = polygonLines.filter((line) => !delIndexs.includes(line.tempIndex)) + + const divideLines = polygonLines.filter((line) => line.intersections.length > 0) + let newLines = [] + divideLines.forEach((line) => { + const { intersections, startPoint, endPoint } = line + + if (intersections.length === 1) { + // 한 점만 교차하는 경우 + const newLinePoint1 = [line.x1, line.y1, intersections[0].x, intersections[0].y] + const newLinePoint2 = [intersections[0].x, intersections[0].y, line.x2, line.y2] + const newLine1 = new QLine(newLinePoint1, { + stroke: 'blue', + strokeWidth: 3, + fontSize: polygon.fontSize, + attributes: line.attributes, + }) + const newLine2 = new QLine(newLinePoint2, { + stroke: 'blue', + strokeWidth: 3, + fontSize: polygon.fontSize, + attributes: line.attributes, + }) + newLine1.attributes = { + ...line.attributes, + planeSize: Math.round(Math.sqrt(Math.pow(newLine1.x1 - newLine1.x2, 2) + Math.pow(newLine1.y1 - newLine1.y2, 2))) * 10, + actualSize: Math.round(Math.sqrt(Math.pow(newLine1.x1 - newLine1.x2, 2) + Math.pow(newLine1.y1 - newLine1.y2, 2))) * 10, + } + newLine2.attributes = { + ...line.attributes, + planeSize: Math.round(Math.sqrt(Math.pow(newLine2.x1 - newLine2.x2, 2) + Math.pow(newLine2.y1 - newLine2.y2, 2))) * 10, + actualSize: Math.round(Math.sqrt(Math.pow(newLine2.x1 - newLine2.x2, 2) + Math.pow(newLine2.y1 - newLine2.y2, 2))) * 10, + } + newLines.push(newLine1) + newLines.push(newLine2) + } else { + // 두 점 이상 교차하는 경우 + //1. intersections중에 startPoint와 가장 가까운 점을 찾는다. + //2. 가장 가까운 점을 기준으로 line을 나눈다. + + let currentPoint = startPoint + + while (intersections.length !== 0) { + const minDistancePoint = findAndRemoveClosestPoint(currentPoint, intersections) + const newLinePoint = [currentPoint.x, currentPoint.y, minDistancePoint.x, minDistancePoint.y] + const newLine = new QLine(newLinePoint, { + stroke: 'blue', + strokeWidth: 3, + fontSize: polygon.fontSize, + attributes: line.attributes, + }) + newLine.attributes = { + ...line.attributes, + planeSize: Math.round(Math.sqrt(Math.pow(newLine.x1 - newLine.x2, 2) + Math.pow(newLine.y1 - newLine.y2, 2))) * 10, + actualSize: Math.round(Math.sqrt(Math.pow(newLine.x1 - newLine.x2, 2) + Math.pow(newLine.y1 - newLine.y2, 2))) * 10, + } + newLines.push(newLine) + currentPoint = minDistancePoint + } + + const newLinePoint = [currentPoint.x, currentPoint.y, endPoint.x, endPoint.y] + const newLine = new QLine(newLinePoint, { + stroke: 'blue', + strokeWidth: 3, + fontSize: polygon.fontSize, + attributes: line.attributes, + }) + newLine.attributes = { + ...line.attributes, + planeSize: Math.round(Math.sqrt(Math.pow(newLine.x1 - newLine.x2, 2) + Math.pow(newLine.y1 - newLine.y2, 2))) * 10, + actualSize: Math.round(Math.sqrt(Math.pow(newLine.x1 - newLine.x2, 2) + Math.pow(newLine.y1 - newLine.y2, 2))) * 10, + } + newLines.push(newLine) + } + }) + + //polygonLines에서 divideLines를 제거하고 newLines를 추가한다. + polygonLines = polygonLines.filter((line) => !divideLines.includes(line)) polygonLines = [...polygonLines, ...newLines] const allLines = [...polygonLines, ...innerLines] @@ -756,6 +801,9 @@ export const usePolygon = () => { }) polygonLines.forEach((line) => { + line.set({ strokeWidth: 5, stroke: 'green' }) + canvas.add(line) + canvas.renderAll() const startPoint = line.startPoint // 시작점 let arrivalPoint = line.endPoint // 도착점 @@ -819,17 +867,18 @@ export const usePolygon = () => { roofPoints.push(currentPoint) cnt++ if (cnt > 100) { - throw new Error('무한루프') + break } } roofs.push(roofPoints) + canvas.remove(line) + canvas.renderAll() }) - const newRoofs = removeDuplicatePolygons(roofs) + const newRoofs = removeDuplicatePolygons(roofs.filter((roof) => roof.length < 100)) newRoofs.forEach((roofPoint, index) => { let defense, pitch - const polygonLines = [...polygon.lines] let representLines = [] let representLine @@ -901,7 +950,7 @@ export const usePolygon = () => { //allLines중 생성된 roof와 관련있는 line을 찾는다. - roof.lines = [...polygon.lines, ...polygon.innerLines].filter((line) => { + roof.lines = [...polygonLines, ...polygon.innerLines].filter((line) => { let startFlag = false let endFlag = false const startPoint = line.startPoint diff --git a/src/util/canvas-util.js b/src/util/canvas-util.js index 4ef2a2ec..65c46b74 100644 --- a/src/util/canvas-util.js +++ b/src/util/canvas-util.js @@ -977,3 +977,27 @@ export const getDegreeInOrientation = (degree) => { return value * 15 } + +export function findAndRemoveClosestPoint(targetPoint, points) { + if (points.length === 0) { + return null + } + + let closestPoint = points[0] + let closestDistance = distanceBetweenPoints(targetPoint, points[0]) + let closestIndex = 0 + + for (let i = 1; i < points.length; i++) { + const distance = distanceBetweenPoints(targetPoint, points[i]) + if (distance < closestDistance) { + closestDistance = distance + closestPoint = points[i] + closestIndex = i + } + } + + // Remove the closest point from the array + points.splice(closestIndex, 1) + + return closestPoint +} diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index ed375ec5..a229d1a7 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -2949,7 +2949,8 @@ const changeJerkInHeadRoof = (currentRoof, canvas) => { gable3.attributes.planeSize = Math.round(Math.sqrt(Math.pow(gable3.x1 - gable3.x2, 2) + Math.pow(gable3.y1 - gable3.y2, 2))) * 10 gable3.attributes.actualSize = Math.round(Math.sqrt(Math.pow(gable3.x1 - gable3.x2, 2) + Math.pow(gable3.y1 - gable3.y2, 2))) * 10 canvas?.add(gable3) - roof.innerLines.push(gable3) + + // roof.innerLines.push(gable3) const hip1 = new QLine([currentRoof.x1, currentRoof.y1, gable1.x1, gable1.y1], { fontSize: roof.fontSize, @@ -2967,7 +2968,7 @@ const changeJerkInHeadRoof = (currentRoof, canvas) => { hip1.attributes.planeSize = Math.round(Math.sqrt(Math.pow(hip1.x1 - hip1.x2, 2) + Math.pow(hip1.y1 - hip1.y2, 2))) * 10 hip1.attributes.actualSize = Math.round(Math.sqrt(Math.pow(hip1.attributes.planeSize, 2) + Math.pow(hip1Height, 2))) canvas?.add(hip1) - roof.innerLines.push(hip1) + // roof.innerLines.push(hip1) const hip2 = new QLine([currentRoof.x2, currentRoof.y2, gable2.x1, gable2.y1], { fontSize: roof.fontSize, @@ -2985,7 +2986,14 @@ const changeJerkInHeadRoof = (currentRoof, canvas) => { hip2.attributes.planeSize = Math.round(Math.sqrt(Math.pow(hip2.x1 - hip2.x2, 2) + Math.pow(hip2.y1 - hip2.y2, 2))) * 10 hip2.attributes.actualSize = Math.round(Math.sqrt(Math.pow(hip2.attributes.planeSize, 2) + Math.pow(hip2Height, 2))) canvas?.add(hip2) - roof.innerLines.push(hip2) + // roof.innerLines.push(hip2) + + hip1.set({ visible: false }) + hip1.setViewLengthText(false) + gable3.set({ visible: false }) + gable3.setViewLengthText(false) + hip2.set({ visible: false }) + hip2.setViewLengthText(false) } } } From 3a3b32b1d171310dc9bff89e94fae5fd09a0eed0 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 15:38:17 +0900 Subject: [PATCH 058/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 53 ++++++++++++++++------------ src/locales/ja.json | 8 ++--- src/locales/ko.json | 8 ++--- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 1030962c..3f41b359 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -17,6 +17,8 @@ import { SessionContext } from '@/app/SessionProvider' import Select, { components } from 'react-select' import { convertNumberToPriceDecimal } from '@/util/common-utils' import ProductFeaturesPop from './popup/ProductFeaturesPop' +import { v4 as uuidv4 } from 'uuid' + export default function Estimate({ params }) { const [itemChangeYn, setItemChangeYn] = useState(false) const { session } = useContext(SessionContext) @@ -307,22 +309,25 @@ export default function Estimate({ params }) { //제품 삭제 const removeItem = () => { const array = [...selection] - let tempList = [] + let delList = [] state.itemList.filter((row) => { array.map((row2) => { if (row2 === row.dispOrder) { - tempList.push({ ...row }) + delList.push({ ...row }) } }) }) - // 필터안하고 플래그로 관리하는거로 변경하기 - const result = state.itemList.filter((item) => { - return !tempList.some((other) => other.dispOrder === item.dispOrder) + const updateList = state.itemList.map((item) => { + const isDeleted = delList.some((row) => item.dispOrder === row.dispOrder) + return { + ...item, + delFlg: isDeleted ? '1' : '0', + } }) setState({ - itemList: result, + itemList: updateList, }) setSelection(new Set()) @@ -331,8 +336,8 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { - // console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn) - // console.log('아이템상태가져오기::::::::::', state.itemList) + console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn) + console.log('아이템상태가져오기::::::::::', state.itemList) } //다시 false로 돌리기 여기서할지 가격정보 변경하는거 끝나고할지.. @@ -527,8 +532,8 @@ export default function Estimate({ params }) { return ( <> -
    -
    +
    +
    @@ -613,7 +618,7 @@ export default function Estimate({ params }) { {originFiles.length > 0 && originFiles.map((originFile) => { return ( -
  • +
  • handleEstimateFileDownload(originFile)}> {originFile.faileName}
  • @@ -280,6 +286,12 @@ export default function StuffDetail() { ], }) + // 문서다운로드 팝업 오픈 셋팅 + const handleEstimatePopup = (planNo) => { + setPopPlanNo(planNo) + setEstimatePopupOpen(true) + } + useEffect(() => { if (objectNo) { setEditMode('EDIT') @@ -2433,6 +2445,8 @@ export default function StuffDetail() { {showWindSpeedButtonValid && ( )} + + {estimatePopupOpen && } ) } diff --git a/src/locales/ja.json b/src/locales/ja.json index 64902f47..f5b59ce6 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -733,7 +733,7 @@ "stuff.detail.planGridHeader.pcTypeNo": "パワーコンディショナー", "stuff.detail.planGridHeader.management": "管理", "stuff.detail.planGrid.btn1": "見積書の照会", - "stuff.detail.planGrid.btn2": "Excel", + "stuff.detail.planGrid.docDownload": "文書のダウンロード", "stuff.grid.noData": "照会されたデータがありません", "length": "長さ", "height": "高さ", diff --git a/src/locales/ko.json b/src/locales/ko.json index 5b47e7fd..01d06042 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -743,7 +743,7 @@ "stuff.detail.planGridHeader.pcTypeNo": "파워컨디셔너", "stuff.detail.planGridHeader.management": "관리", "stuff.detail.planGrid.btn1": "견적서 조회", - "stuff.detail.planGrid.btn2": "Excel", + "stuff.detail.planGrid.docDownload": "문서 다운로드", "stuff.grid.noData": "조회된 데이터가 없습니다", "length": "길이", "height": "높이", From eb5bb77f1f5dcd3989dc0f5a4c9494a0543b0d35 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 15 Nov 2024 08:58:51 +0900 Subject: [PATCH 065/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/popup/DocDownOptionPop.jsx | 55 ++++++++++++------- src/locales/ja.json | 8 +-- src/locales/ko.json | 8 +-- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/components/estimate/popup/DocDownOptionPop.jsx b/src/components/estimate/popup/DocDownOptionPop.jsx index 3424b699..139f6f7b 100644 --- a/src/components/estimate/popup/DocDownOptionPop.jsx +++ b/src/components/estimate/popup/DocDownOptionPop.jsx @@ -9,6 +9,8 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { const { getMessage } = useMessage() const { promisePost } = useAxios() + //EXCEL, PDF 구분 + const [schDownload, setSchDownload] = useState('EXCEL') //다운로드 파일 EXCEL const [schUnitPriceFlg, setSchUnitPriceFlg] = useState('0') @@ -24,38 +26,45 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { //문서 다운로드 const handleFileDown = async () => { - // console.log('물건번호:::', objectRecoil.floorPlanObjectNo) - // console.log('planNo::', planNo) - // 고른 옵션값들 - //0 : 견적가 Excel 1 : 정가용Excel 2: 견적가 PDF 3 :정가용PDF - // console.log(schUnitPriceFlg) - // console.log(schDisplayFlg) - // console.log(schWeightFlg) - // console.log(schDrawingFlg) - //post방식 const url = '/api/estimate/excel-download' + let sendUnitPriceFlg + if (schUnitPriceFlg === '0') { + sendUnitPriceFlg = '0' + } else if (schUnitPriceFlg === '1') { + sendUnitPriceFlg = '1' + } else if (schUnitPriceFlg === '2') { + sendUnitPriceFlg = '0' + } else { + sendUnitPriceFlg = '1' + } + const params = { objectNo: objectRecoil.floorPlanObjectNo, planNo: planNo, - schUnitPriceFlg: schUnitPriceFlg, + schDownload: schDownload, + schUnitPriceFlg: sendUnitPriceFlg, schDisplayFlg: schDisplayFlg, schWeightFlg: schWeightFlg, schDrawingFlg: schDrawingFlg, } const options = { responseType: 'blob' } - + let fileName console.log('다운로드 PARAM:::', params) - return await promisePost({ url: url, data: params, option: options }) .then((resultData) => { - console.log('결과::::::', resultData) if (resultData) { + console.log('결과::::::', resultData) const blob = new Blob([resultData.data], { type: resultData.headers['content-type'] || 'application/octet-stream' }) const fileUrl = window.URL.createObjectURL(blob) const link = document.createElement('a') - link.href = fileUrl - // link.download = originFile.faileName //resultData에내려주는 파일명으로 변경?? + + if (schDownload === 'EXCEL') { + fileName = 'EXCEL_DOWN.xlsx' + } else { + fileName = 'PDF_DOWN.pdf' + } + link.download = fileName document.body.appendChild(link) link.click() link.remove() @@ -104,28 +113,30 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) {
    { + setSchDownload('EXCEL') setSchUnitPriceFlg(e.target.value) }} /> - +
    { + setSchDownload('EXCEL') setSchUnitPriceFlg(e.target.value) }} /> - +
    { + setSchDownload('PDF') setSchUnitPriceFlg(e.target.value) }} /> - +
    { + setSchDownload('PDF') setSchUnitPriceFlg(e.target.value) }} /> - +
    diff --git a/src/locales/ja.json b/src/locales/ja.json index f5b59ce6..6889f39e 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -860,10 +860,10 @@ "estimate.detail.docPopup.title": "ドキュメントダウンロードオプションの設定", "estimate.detail.docPopup.explane": "ダウンロードする文書のオプションを選択したら、 [文書のダウンロード]ボタンをクリックします.", "estimate.detail.docPopup.schUnitPriceFlg": "ダウンロードファイル", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg0": "見積もり Excel", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg1": "定価用 Excel", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg2": "見積もり PDF", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg3": "定価用 PDF", + "estimate.detail.docPopup.schUnitPriceFlg.excelFlg0": "見積もり Excel", + "estimate.detail.docPopup.schUnitPriceFlg.excelFlg1": "定価用 Excel", + "estimate.detail.docPopup.schUnitPriceFlg.pdfFlg0": "見積もり PDF", + "estimate.detail.docPopup.schUnitPriceFlg.pdfFlg1": "定価用 PDF", "estimate.detail.docPopup.schDisplayFlg": "見積提出先表示名", "estimate.detail.docPopup.schDisplayFlg.schDisplayFlg0": "販売店名", "estimate.detail.docPopup.schDisplayFlg.schDisplayFlg1": "案件名", diff --git a/src/locales/ko.json b/src/locales/ko.json index 01d06042..2916c9ed 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -870,10 +870,10 @@ "estimate.detail.docPopup.title": "문서다운로드 옵션설정", "estimate.detail.docPopup.explane": "다운로드할 문서 옵션을 선택한 후 문서 다운로드 버튼을 클릭합니다.", "estimate.detail.docPopup.schUnitPriceFlg": "다운로드 파일", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg0": "견적가 Excel", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg1": "정가용 Excel", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg2": "견적가 PDF", - "estimate.detail.docPopup.schUnitPriceFlg.schUnitPriceFlg3": "정가용 PDF", + "estimate.detail.docPopup.schUnitPriceFlg.excelFlg0": "견적가 Excel", + "estimate.detail.docPopup.schUnitPriceFlg.excelFlg1": "정가용 Excel", + "estimate.detail.docPopup.schUnitPriceFlg.pdfFlg0": "견적가 PDF", + "estimate.detail.docPopup.schUnitPriceFlg.pdfFlg1": "정가용 PDF", "estimate.detail.docPopup.schDisplayFlg": "견적제출서 표시명", "estimate.detail.docPopup.schDisplayFlg.schDisplayFlg0": "판매점명", "estimate.detail.docPopup.schDisplayFlg.schDisplayFlg1": "안건명", From 55f4a2441917a77a49c9a5c869e5da6ae8ed47b5 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Fri, 15 Nov 2024 09:44:03 +0900 Subject: [PATCH 066/200] =?UTF-8?q?samePoint=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/qpolygon-utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index 3ed8f9a1..9a12e4b3 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1201,7 +1201,7 @@ export function removeDuplicatePolygons(polygons) { } export const isSamePoint = (a, b) => { - return Math.abs(Math.round(a.x) - Math.round(b.x)) <= 1 && Math.abs(Math.round(a.y) - Math.round(b.y)) <= 1 + return Math.abs(Math.round(a.x) - Math.round(b.x)) <= 2 && Math.abs(Math.round(a.y) - Math.round(b.y)) <= 2 } /** From ae8b838e4c84c71d612eea64d632f3c20a6ac24c Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Fri, 15 Nov 2024 09:57:15 +0900 Subject: [PATCH 067/200] =?UTF-8?q?=EC=A7=80=EB=B6=95=EA=B0=81=EB=8F=84=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/placementShape/PlacementShapeSetting.jsx | 1 - src/hooks/common/useCanvasConfigInitialize.js | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx index 6a69aaca..26d6f1b9 100644 --- a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx +++ b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx @@ -12,7 +12,6 @@ import { usePopup } from '@/hooks/usePopup' import SizeGuide from '@/components/floor-plan/modal/placementShape/SizeGuide' import MaterialGuide from '@/components/floor-plan/modal/placementShape/MaterialGuide' import WithDraggable from '@/components/common/draggable/WithDraggable' -import { SessionContext } from '@/app/SessionProvider' export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, setShowPlaceShapeModal }) { const [objectNo, setObjectNo] = useState('test123241008001') // 후에 삭제 필요 diff --git a/src/hooks/common/useCanvasConfigInitialize.js b/src/hooks/common/useCanvasConfigInitialize.js index a07d4a00..18d1a052 100644 --- a/src/hooks/common/useCanvasConfigInitialize.js +++ b/src/hooks/common/useCanvasConfigInitialize.js @@ -40,19 +40,19 @@ export function useCanvasConfigInitialize() { const flowTexts = canvas.getObjects().filter((obj) => obj.name === 'flowText') if (basicSetting.roofAngleSet === 'slope') { offsetTexts.forEach((obj) => { - obj.set({ text: `${obj.originText}-∠${obj.pitch}${angleUnit}` }) + obj.set({ text: `${!obj.originText ? '' : obj.originText + '-'}∠${obj.pitch}${angleUnit}` }) }) flowTexts.forEach((obj) => { - obj.set({ text: `${obj.originText}-∠${obj.pitch}${pitchText}` }) + obj.set({ text: `${!obj.originText ? '' : obj.originText + '-'}∠${obj.pitch}${pitchText}` }) }) } if (basicSetting.roofAngleSet === 'flat') { offsetTexts.forEach((obj) => { - obj.set({ text: `${obj.originText}-∠${getDegreeByChon(obj.pitch)}${angleUnit}` }) + obj.set({ text: `${!obj.originText ? '' : obj.originText + '-'}∠${getDegreeByChon(obj.pitch)}${angleUnit}` }) }) flowTexts.forEach((obj) => { - obj.set({ text: `${obj.originText}-∠${getDegreeByChon(obj.pitch)}${pitchText}` }) + obj.set({ text: `${!obj.originText ? '' : obj.originText + '-'}∠${getDegreeByChon(obj.pitch)}${pitchText}` }) }) } From 79139f53aa393e1e8040d5df549be88a66a91e81 Mon Sep 17 00:00:00 2001 From: minsik Date: Fri, 15 Nov 2024 10:08:50 +0900 Subject: [PATCH 068/200] =?UTF-8?q?zoom=20clear=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasMenu.jsx | 2 +- src/styles/_contents.scss | 238 +++++++++++++++++++++++ 2 files changed, 239 insertions(+), 1 deletion(-) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 09758a1e..26538599 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -248,7 +248,7 @@ export default function CanvasMenu(props) { handleZoom(false) }} > - {canvasZoom}% + {canvasZoom}%
    From 18e3ebe7f5acaf065d9924ae7cfc3fe35acddd72 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Fri, 15 Nov 2024 16:00:17 +0900 Subject: [PATCH 076/200] =?UTF-8?q?=EC=95=88=EC=93=B0=EB=8A=94=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/option/useCanvasSetting.js | 2 +- src/hooks/option/useFirstOption.js | 81 ---------------------------- 2 files changed, 1 insertion(+), 82 deletions(-) delete mode 100644 src/hooks/option/useFirstOption.js diff --git a/src/hooks/option/useCanvasSetting.js b/src/hooks/option/useCanvasSetting.js index a585109a..6cb1d09c 100644 --- a/src/hooks/option/useCanvasSetting.js +++ b/src/hooks/option/useCanvasSetting.js @@ -277,7 +277,7 @@ export function useCanvasSetting() { optionName = ['outerLine', POLYGON_TYPE.WALL] break case 'gridDisplay': //그리드 표시 - optionName = ['lindGrid', 'dotGrid'] + optionName = ['lindGrid', 'dotGrid', 'tempGrid'] break case 'lineDisplay': //지붕선 표시 optionName = ['roof', POLYGON_TYPE.ROOF] diff --git a/src/hooks/option/useFirstOption.js b/src/hooks/option/useFirstOption.js deleted file mode 100644 index 8757040a..00000000 --- a/src/hooks/option/useFirstOption.js +++ /dev/null @@ -1,81 +0,0 @@ -import { useRecoilState, useRecoilValue } from 'recoil' -import { canvasState } from '@/store/canvasAtom' -import { useEffect } from 'react' -import { settingModalFirstOptionsState } from '@/store/settingAtom' -import { POLYGON_TYPE } from '@/common/common' - -export function useFirstOption() { - const canvas = useRecoilValue(canvasState) - - const [settingModalFirstOptions, setSettingModalFirstOptions] = useRecoilState(settingModalFirstOptionsState) - - useEffect(() => { - const option1 = settingModalFirstOptions.option1 - - // 'allocDisplay' 할당 표시 - // 'outlineDisplay' 외벽선 표시 'outerLine', POLYGON_TYPE.WALL - // 'gridDisplay' 그리드 표시 'lindGrid', 'dotGrid' - // 'lineDisplay' 지붕선 표시 'roof', POLYGON_TYPE.ROOF - // 'wordDisplay' 문자 표시 - // 'circuitNumDisplay' 회로번호 표시 - // 'flowDisplay' 흐름방향 표시 'arrow' - // 'trestleDisplay' 가대 표시 - // 'totalDisplay' 집계표 표시 - - let optionName //옵션명 - let optionSelected //옵션상태 - - for (let i = 0; i < option1.length; i++) { - switch (option1[i].column) { - case 'allocDisplay': //할당 표시 - optionName = ['1'] - break - case 'outlineDisplay': //외벽선 표시 - optionName = ['outerLine', POLYGON_TYPE.WALL] - break - case 'gridDisplay': //그리드 표시 - optionName = ['lineGrid', 'dotGrid', 'adsorptionPoint', 'tempGrid'] - break - case 'lineDisplay': //지붕선 표시 - optionName = ['roof', POLYGON_TYPE.ROOF] - break - case 'wordDisplay': //문자 표시 - optionName = ['commonText'] - break - case 'circuitNumDisplay': //회로번호 표시 - optionName = ['7'] - break - case 'flowDisplay': //흐름방향 표시 - optionName = ['arrow', 'flowText'] - break - case 'trestleDisplay': //가대 표시 - optionName = ['8'] - break - case 'totalDisplay': //집계표 표시 - optionName = ['9'] - break - } - // 표시 선택 상태(true/false) - optionSelected = option1[i].selected - - canvas - .getObjects() - .filter((obj) => optionName.includes(obj.name)) - //.filter((obj) => obj.name === optionName) - .forEach((obj) => { - obj.set({ visible: optionSelected }) - //obj.set({ visible: !obj.visible }) - }) - - canvas.renderAll() - - // console.log( - // 'optionName', - // optionName, - // canvas.getObjects().filter((obj) => optionName.includes(obj.name)), - // ) - } - }, [settingModalFirstOptions]) - - return { settingModalFirstOptions, setSettingModalFirstOptions } -} From 889ced564d347894b37b1963f3df01927dfaf759 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 15 Nov 2024 17:36:50 +0900 Subject: [PATCH 077/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 334 +++++++++++------- .../estimate/useEstimateController.js | 51 ++- src/locales/ja.json | 2 + src/locales/ko.json | 4 +- 4 files changed, 243 insertions(+), 148 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 3f41b359..86f8b029 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -28,6 +28,8 @@ export default function Estimate({ params }) { const [files, setFiles] = useState([]) // 보내는 첨부파일 const [originFiles, setOriginFiles] = useState([]) //기존 첨부파일 + const [showPriceCd, setShowPriceCd] = useState('') + const [showContentCode, setShowContentCode] = useState('ATTR001') const [productFeaturesPopupOpen, setProductFeaturesPopupOpen] = useState(false) //견적특이사항 팝업 @@ -46,8 +48,6 @@ export default function Estimate({ params }) { const [storePriceList, setStorePriceList] = useState([]) //가격표시 option - const [tempPriceCd, setTempPriceCd] = useState('') - const [startDate, setStartDate] = useState(new Date()) const singleDatePickerProps = { startDate, @@ -182,7 +182,7 @@ export default function Estimate({ params }) { }) } - //가격표시 option 최초세팅 + //가격표시 option 목록 최초세팅 && 주문분류 변경시 useEffect(() => { if (state.estimateType !== '') { const param = { @@ -200,23 +200,35 @@ export default function Estimate({ params }) { } }, [state?.estimateType]) - //가격표시 option 변경시 useEffect(() => { - if (tempPriceCd !== '') { - const param = { - saleStoreId: session.storeId, - sapSalesStoreCd: session.custCd, - docTpCd: tempPriceCd, - } - - const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}` - get({ url: apiUrl }).then((res) => { - if (isNotEmptyArray(res?.data)) { - setStorePriceList(res.data) - } - }) + if (state?.priceCd) { + setShowPriceCd(state.priceCd) } - }, [tempPriceCd]) + }, [state?.priceCd]) + + //가격 표시 option 변경 이벤트 + const onChangeStorePriceList = (priceCd) => { + const param = { + saleStoreId: session.storeId, + sapSalesStoreCd: session.custCd, + docTpCd: priceCd, + } + + //가격표시 바꾸만헀을때는 tempPriceCd에 바꾼값 관리 불필요? + //프라이싱 했을때 priceCd setState + //화면에 보여지는 값은 showPriceCd로 관리 + setShowPriceCd(priceCd) + //setState({ + // tempPriceCd: priceCd, + //}) + + const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}` + get({ url: apiUrl }).then((res) => { + if (isNotEmptyArray(res?.data)) { + setStorePriceList(res.data) + } + }) + } //Pricing 버튼 const handlePricing = async (priceCd) => { @@ -224,24 +236,55 @@ export default function Estimate({ params }) { saleStoreId: session.storeId, sapSalesStoreCd: session.custCd, docTpCd: state.estimateType, - priceCd: session.storeLvl === '1' ? tempPriceCd : priceCd, - itemIdList: state.itemList, //아이템 최초정보로 호출 + priceCd: priceCd, + //itemIdList: state.itemList, //아이템 최초정보로 호출 delFlg 0인거만.. + itemIdList: state.itemList.filter((item) => item.delFlg === '0'), + } + + if (param.itemIdList.length > 0) { + let pass = true + + param.itemIdList.map((item) => { + if (item.itemId === '') { + pass = false + } + }) + + if (!pass) { + //Pricing이 누락된 아이템이 있습니다. Pricing을 진행해주세요. + return alert(getMessage('estimate.detail.showPrice.pricingBtn.noItemId')) + } } - // console.log('프라이싱파람::', param) await promisePost({ url: '/api/estimate/price/item-price-list', data: param }).then((res) => { + let updateList = [] if (res) { if (res.status === 200) { const data = res.data + //기존itemList랑 프라이싱결과랑 비교해서 단가만 업뎃 서로 갯수가 안맞을 수 있음 없는 itemId면 unitPrice 0으로 + //itemId로 비교해서 단가정보만 업데이트 if (data.result.code === 200) { if (isNotEmptyArray(data.data2)) { - //아이템쪽 다 새로고침............ - //성공후.. - //기존itemList랑 프라이싱결과랑 비교해서 단가만 업뎃 서로 갯수가 안맞을 수 있음 없는 itemId면 unitPrice 0으로 - //itemId로 비교해서 단가정보만 업데이트 - setState({ - priceCd: session.storeLvl === '1' ? tempPriceCd : priceCd, + state.itemList.map((item) => { + let checkYn = false + data.data2.map((item2) => { + if (item2.itemId === item.itemId) { + updateList.push({ ...item, unitPrice: item2.unitPrice }) + checkYn = true + } + }) + + if (!checkYn) { + updateList.push({ ...item, unitPrice: '0' }) + } }) + + setState({ + priceCd: priceCd, + itemList: updateList, + }) + + setItemChangeYn(true) } } } @@ -319,13 +362,24 @@ export default function Estimate({ params }) { }) const updateList = state.itemList.map((item) => { - const isDeleted = delList.some((row) => item.dispOrder === row.dispOrder) + const isDeleted = delList.some((row) => item.delFlg === '1' || item.dispOrder === row.dispOrder) return { ...item, delFlg: isDeleted ? '1' : '0', } }) + let delCnt = 0 + updateList.map((item) => { + if (item.delFlg === '1') { + delCnt++ + } + }) + + if (delCnt === updateList.length) { + return alert(getMessage('estimate.detail.save.requiredItem')) + } + setState({ itemList: updateList, }) @@ -336,7 +390,7 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { - console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn) + // console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn) console.log('아이템상태가져오기::::::::::', state.itemList) } @@ -778,8 +832,9 @@ export default function Estimate({ params }) { key={uuidv4()} className="select-light" onChange={(e) => { - setTempPriceCd(e.target.value) + onChangeStorePriceList(e.target.value) }} + value={showPriceCd} > {storePriceList.length > 0 && storePriceList.map((row) => )} @@ -790,9 +845,10 @@ export default function Estimate({ params }) { )}
    @@ -862,108 +926,114 @@ export default function Estimate({ params }) { {state?.itemList.length > 0 && - state.itemList.map((item, index) => { - return ( - - -
    - onChangeSelect(item.dispOrder)} - checked={selection.has(item.dispOrder) ? true : false} - /> - -
    - - {item?.dispOrder * 100} - -
    -
    - onChangeSelect(item.dispOrder)} + checked={selection.has(item.dispOrder) ? true : false} + /> +
    - )} -
    - - -
    -
    {item?.itemNo}
    -
    - {item?.fileUploadFlg === '1' && } - {item?.specialNoteCd && ( - - )} -
    -
    - - -
    - { - //onChangeDisplayItem참고 - //itemChangeFlg = 1, partAdd = 0 셋팅 - console.log('수량변경::::::::', e.target.value) - }} - /> -
    - - {item.unit} - -
    -
    - { - //onChangeDisplayItem참고 - //itemChangeFlg, partAdd 받아온 그대로 - console.log('단가변경:::::::', e.target.value) - }} - /> -
    - {/*
    - OPEN아이콘 처리 -
    */} -
    - - {convertNumberToPriceDecimal(item?.saleTotPrice)} - - ) + /> +
    + + {item.unit} + +
    +
    + { + //onChangeDisplayItem참고 + //itemChangeFlg, partAdd 받아온 그대로 + console.log('단가변경:::::::', e.target.value) + }} + /> +
    + {/*
    + OPEN아이콘 처리 +
    */} +
    + + {convertNumberToPriceDecimal(item?.saleTotPrice)} + + + ) + } else { + return null + } })} diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 4330a208..5c29dcc0 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -59,6 +59,12 @@ export const useEstimateController = (planNo) => { try { await get({ url: `/api/estimate/${objectRecoil.floorPlanObjectNo}/${planNo}/detail` }).then((res) => { if (isObjectNotEmpty(res)) { + if (res.itemList.length > 0) { + res.itemList.map((item) => { + item.delFlg = '0' + }) + } + setState(res) } }) @@ -133,27 +139,26 @@ export const useEstimateController = (planNo) => { const handleEstimateSubmit = async () => { //0. 필수체크 let flag = true - console.log('::담긴 estimateData:::', estimateData) + // console.log('첨부파일:::::', estimateData.fileList) //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 - if (estimateData.fileList.length < 1) { - if (estimateData.itemList.length > 1) { - estimateData.itemList.map((row) => { - if (row.fileUploadFlg === '1') { - if (estimateData.fileFlg === '0') { - alert(getMessage('estimate.detail.save.requiredMsg')) - flag = false - } - } - }) - } - } + // if (estimateData.fileList.length < 1) { + // if (estimateData.itemList.length > 1) { + // estimateData.itemList.map((row) => { + // if (row.fileUploadFlg === '1') { + // if (estimateData.fileFlg === '0') { + // alert(getMessage('estimate.detail.save.requiredMsg')) + // flag = false + // } + // } + // }) + // } + // } if (flag) { - //1. 첨부파일 저장 + //1. 첨부파일 저장시작 const formData = new FormData() - console.log('첨부파일:!!!', estimateData.fileList) formData.append('file', estimateData.fileList) formData.append('objectNo', estimateData.objectNo) formData.append('planNo', estimateData.planNo) @@ -161,7 +166,23 @@ export const useEstimateController = (planNo) => { formData.append('userId', estimateData.userId) await post({ url: '/api/file/fileUpload', data: formData }) + //첨부파일저장끝 + //제품라인 추가했는데 아이템 안고르고 저장하면itemId=''은 날리고 나머지 저장하기 + estimateData.itemList = estimateData.itemList.filter((item) => item.itemId !== '') + + let delCnt = 0 + estimateData.itemList.map((item) => { + if (item.delFlg === '1') { + delCnt++ + } + }) + if (delCnt === estimateData.itemList.length) { + return alert(getMessage('estimate.detail.save.requiredItem')) + } + + console.log('최종 정보::;', estimateData) + console.log('최종 남은 아이템정보:::', estimateData.itemList) //2. 상세데이터 저장 return await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { diff --git a/src/locales/ja.json b/src/locales/ja.json index d5165248..29c46150 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -844,6 +844,7 @@ "estimate.detail.header.showPrice": "価格表示", "estimate.detail.header.unitPrice": "定価", "estimate.detail.showPrice.pricingBtn": "Pricing", + "estimate.detail.showPrice.pricingBtn.noItemId": "Pricingが欠落しているアイテムがあります。 Pricingを進めてください.", "estimate.detail.showPrice.description1": "製品価格 OPEN", "estimate.detail.showPrice.description2": "追加, 変更資材", "estimate.detail.showPrice.description3": "添付必須", @@ -879,6 +880,7 @@ "estimate.detail.productFeaturesPopup.close": "閉じる", "estimate.detail.save.alertMsg": "保存されている見積書で製品を変更した場合、図面や回路には反映されません.", "estimate.detail.save.requiredMsg": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください.", + "estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります.", "estimate.detail.reset.confirmMsg": "保存した見積書情報が初期化され、図面情報が反映されます。本当に初期化しますか?", "simulator.title.sub1": "物件番号", "simulator.title.sub2": "作成日", diff --git a/src/locales/ko.json b/src/locales/ko.json index 15fbe6f5..71819055 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -849,11 +849,12 @@ "estimate.detail.sepcialEstimateProductInfo.pkgUnitPrice": "주택PKG단가 (W)", "estimate.detail.sepcialEstimateProductInfo.pkgWeight": "PKG 용량 (Kw)", "estimate.detail.sepcialEstimateProductInfo.pkgPrice": "PKG 금액", - "estimate.detail.sepcialEstimateProductInfo.calcFormula1": "(모듈수량 * 수량)÷100", + "estimate.detail.sepcialEstimateProductInfo.calcFormula1": "(모듈용량 * 수량)÷100", "estimate.detail.sepcialEstimateProductInfo.calcFormula2": "PKG단가(W) * PKG용량(W)", "estimate.detail.header.showPrice": "가격표시", "estimate.detail.header.unitPrice": "정가", "estimate.detail.showPrice.pricingBtn": "Pricing", + "estimate.detail.showPrice.pricingBtn.noItemId": "Pricing이 누락된 아이템이 있습니다. Pricing을 진행해주세요.", "estimate.detail.showPrice.description1": "제품 가격 OPEN", "estimate.detail.showPrice.description2": "추가, 변경 자재", "estimate.detail.showPrice.description3": "첨부필수", @@ -889,6 +890,7 @@ "estimate.detail.productFeaturesPopup.close": "닫기", "estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우, 도면 및 회로에 반영되지 않습니다.", "estimate.detail.save.requiredMsg": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.", + "estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.", "estimate.detail.reset.confirmMsg": "저장된 견적서 정보가 초기화되고, 도면정보가 반영됩니다. 정말로 초기화 하시겠습니까?", "simulator.title.sub1": "물건번호", "simulator.title.sub2": "작성일", From f1bede7bd3c41e18389e0e4d914c812d8a000818 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 15 Nov 2024 23:42:41 +0900 Subject: [PATCH 078/200] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83?= =?UTF-8?q?=EC=8B=9C=20=EB=A6=AC=EC=BD=94=EC=9D=BC=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/header/Header.jsx | 15 +++++++++++++-- src/components/management/Stuff.jsx | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx index 29cec36b..548387ef 100644 --- a/src/components/header/Header.jsx +++ b/src/components/header/Header.jsx @@ -4,7 +4,7 @@ import { Fragment, useCallback, useEffect, useState } from 'react' import Link from 'next/link' import { usePathname } from 'next/navigation' -import { useRecoilState, useRecoilValue } from 'recoil' +import { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil' import { dimmedStore, sessionStore } from '@/store/commonAtom' import { useMessage } from '@/hooks/useMessage' @@ -16,6 +16,8 @@ import UserInfoModal from '@/components/myInfo/UserInfoModal' import { useAxios } from '@/hooks/useAxios' import { globalLocaleStore } from '@/store/localeAtom' +import { stuffSearchState } from '@/store/stuffAtom' + export const ToggleonMouse = (e, act, target) => { const listWrap = e.target.closest(target) const ListItem = Array.from(listWrap.childNodes) @@ -34,6 +36,8 @@ export const ToggleonMouse = (e, act, target) => { export default function Header(props) { const [userInfoModal, setUserInfoModal] = useState(false) + const resetStuffRecoil = useResetRecoilState(stuffSearchState) + const { userSession } = props const [sessionState, setSessionState] = useRecoilState(sessionStore) const { getMessage } = useMessage() @@ -184,7 +188,14 @@ export default function Header(props) { {userInfoModal && }
    -
    diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 3dc9a2f4..e4153691 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -209,6 +209,7 @@ export default function Stuff() { endRow: pageNo * pageSize, schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : stuffSearchParams.schSelSaleStoreId, schSortType: 'R', + code: 'S', } setStuffSearch({ ...params, From 7ffe95b73e2de8259ebe6e5a5ecff4e2b1f8118e Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 08:43:55 +0900 Subject: [PATCH 079/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 152 ++++++++++++++---- .../estimate/useEstimateController.js | 46 +++--- 2 files changed, 143 insertions(+), 55 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 86f8b029..093815b8 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -20,6 +20,7 @@ import ProductFeaturesPop from './popup/ProductFeaturesPop' import { v4 as uuidv4 } from 'uuid' export default function Estimate({ params }) { + const fixedKey = 'itemKey' const [itemChangeYn, setItemChangeYn] = useState(false) const { session } = useContext(SessionContext) const [objectNo, setObjectNo] = useState('') //물건번호 @@ -304,8 +305,70 @@ export default function Estimate({ params }) { setSelection(newSelection) } + // 수량 변경 + const onChangeAmount = (value, dispOrder, index) => { + //itemChangeFlg = 1, partAdd = 0 셋팅 + let amount = value + amount = Number(value.replaceAll(',', '')) + if (isNaN(amount)) { + amount = 0 + } else { + amount = amount.toLocaleString() + } + let updateList = [] + let updates = {} + updates.amount = amount + updates.itemChangeFlg = '1' + updates.partAdd = '0' + updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].salePrice).toLocaleString() + + updateList = state.itemList.map((item) => { + if (item.dispOrder === dispOrder) { + return { ...item, ...updates } + } else { + return item + } + }) + + setState({ + itemList: updateList, + }) + + setItemChangeYn(true) + } + + // 단가 변경 + const onChangeSalePrice = (value, dispOrder, index) => { + //itemChangeFlg, partAdd 받아온 그대로 + let salePrice + salePrice = Number(value.replaceAll(',', '')) + if (isNaN(salePrice)) { + salePrice = 0 + } else { + salePrice = salePrice.toLocaleString() + } + let updateList = [] + let updates = {} + updates.salePrice = salePrice + updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].amount).toLocaleString() + + updateList = state.itemList.map((item) => { + if (item.dispOrder === dispOrder) { + return { ...item, ...updates } + } else { + return item + } + }) + + setState({ + itemList: updateList, + }) + + setItemChangeYn(true) + } + // 아이템 자동완성 검색시 아이템 변경 - const onChangeDisplayItem = (itemId, dispOrder) => { + const onChangeDisplayItem = (itemId, dispOrder, index) => { const param = { itemId: itemId, } @@ -333,17 +396,37 @@ export default function Estimate({ params }) { updates.specialNoteCd = res.spnAttrCds updates.itemGroup = res.itemGroup updates.delFlg = '0' // 삭제플래그 0 + updates.saleTotPrice = res.salePrice * state.itemList[index].amount + //104671 + let bomList = res.itemBomList updateList = state.itemList.map((item) => { if (item.dispOrder === dispOrder) { return { ...item, ...updates } + } else if (item.paDispOrder === dispOrder) { + return { ...item, delFlg: '1' } } else { return item } }) - setState({ - itemList: updateList, - }) + //paDispOrder + if (bomList) { + bomList.map((bomItem, index) => { + let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + bomItem.dispOrder = index + 1 + newItemDispOrder + bomItem.delFlg = '0' + bomItem.objectNo = objectNo + bomItem.planNo = planNo + }) + + setState({ + itemList: [...updateList, ...bomList], + }) + } else { + setState({ + itemList: updateList, + }) + } setItemChangeYn(true) }) @@ -358,6 +441,9 @@ export default function Estimate({ params }) { if (row2 === row.dispOrder) { delList.push({ ...row }) } + if (row2 === row.paDispOrder) { + delList.push({ ...row }) + } }) }) @@ -390,14 +476,16 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { - // console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn) - console.log('아이템상태가져오기::::::::::', state.itemList) - } + console.log('아이템 상태 가져오기::::::::::', state.itemList) + // console.log('토탈쪽 셋팅해주기위한 함수::::::', itemList) + //delFlg 0인거 중에.. + setItemChangeYn(false) - //다시 false로 돌리기 여기서할지 가격정보 변경하는거 끝나고할지.. - setItemChangeYn(false) + // settingToalInfo(state.itemList) + } }, [itemChangeYn]) + // const settingToalInfo = (itemList) => {} return (
    @@ -588,10 +676,10 @@ export default function Estimate({ params }) { <>
    - +
    - +
    @@ -880,7 +968,7 @@ export default function Estimate({ params }) { type="button" onClick={() => { addItem() - setItemChangeYn(true) + // setItemChangeYn(true) }} > @@ -926,16 +1014,17 @@ export default function Estimate({ params }) { {state?.itemList.length > 0 && - state.itemList.map((item) => { + state.itemList.map((item, index) => { if (item.delFlg === '0') { return ( <> - +
    onChangeSelect(item.dispOrder)} checked={selection.has(item.dispOrder) ? true : false} /> @@ -955,13 +1044,13 @@ export default function Estimate({ params }) { options={displayItemList} onChange={(e) => { if (isObjectNotEmpty(e)) { - onChangeDisplayItem(e.itemId, item.dispOrder) + onChangeDisplayItem(e.itemId, item.dispOrder, index) } }} getOptionLabel={(x) => x.itemName} getOptionValue={(x) => x.itemId} - isClearable={true} - isDisabled={false} + isClearable={false} + isDisabled={item?.paDispOrder ? true : false} value={displayItemList.filter(function (option) { return option.itemId === item.itemId })} @@ -997,11 +1086,10 @@ export default function Estimate({ params }) { { - //onChangeDisplayItem참고 - //itemChangeFlg = 1, partAdd = 0 셋팅 - console.log('수량변경::::::::', e.target.value) + onChangeAmount(e.target.value, item.dispOrder, index) }} />
    @@ -1013,12 +1101,22 @@ export default function Estimate({ params }) { { - //onChangeDisplayItem참고 - //itemChangeFlg, partAdd 받아온 그대로 - console.log('단가변경:::::::', e.target.value) + onChangeSalePrice(e.target.value, item.dispOrder, index) }} />
    @@ -1027,7 +1125,7 @@ export default function Estimate({ params }) {
    */}
    - {convertNumberToPriceDecimal(item?.saleTotPrice)} + {item?.saleTotPrice} ) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 5c29dcc0..07f50ec8 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -82,7 +82,9 @@ export const useEstimateController = (planNo) => { } const addItem = () => { - const newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + 1 + // const newItemDispOrder = (Math.max(...state.itemList.map((item) => item.dispOrder)) / 100 + 1) * 100 + let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + newItemDispOrder = (Math.floor(newItemDispOrder / 100) + 1) * 100 setState({ itemList: [ ...state.itemList, @@ -96,8 +98,8 @@ export const useEstimateController = (planNo) => { amount: '', //수량 unitPrice: '0', unit: '', //단위 - salePrice: '0', //단가 - saleTotPrice: '0', //금액(부가세별도) + salePrice: '', //단가 + saleTotPrice: '', //금액(부가세별도) itemChangeFlg: '1', //추가시 체인지플래그 1로 partAdd: '1', //NEW 체인지 플래그 delFlg: '0', //삭제 플래그 0 삭제하면 1 @@ -143,18 +145,18 @@ export const useEstimateController = (planNo) => { // console.log('첨부파일:::::', estimateData.fileList) //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 - // if (estimateData.fileList.length < 1) { - // if (estimateData.itemList.length > 1) { - // estimateData.itemList.map((row) => { - // if (row.fileUploadFlg === '1') { - // if (estimateData.fileFlg === '0') { - // alert(getMessage('estimate.detail.save.requiredMsg')) - // flag = false - // } - // } - // }) - // } - // } + if (estimateData.fileList.length < 1) { + if (estimateData.itemList.length > 1) { + estimateData.itemList.map((row) => { + if (row.fileUploadFlg === '1') { + if (estimateData.fileFlg === '0') { + alert(getMessage('estimate.detail.save.requiredMsg')) + flag = false + } + } + }) + } + } if (flag) { //1. 첨부파일 저장시작 @@ -184,24 +186,12 @@ export const useEstimateController = (planNo) => { console.log('최종 정보::;', estimateData) console.log('최종 남은 아이템정보:::', estimateData.itemList) //2. 상세데이터 저장 - return + // return await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { if (res) { alert(getMessage('estimate.detail.save.alertMsg')) } }) - - // try { - // const result = await promisePost({ - // url: ESTIMATE_API_ENDPOINT, - // data: estimateData, - // }) - // alert(getMessage('estimate.detail.save.alertMsg')) - // return result - // } catch (error) { - // console.error('Failed to submit estimate:', error) - // throw error - // } } } From 5ba9c19f3ec546a4c3f4368fd6bd0469d7a5c1cc Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 09:21:08 +0900 Subject: [PATCH 080/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 4 ++-- src/components/management/StuffDetail.jsx | 7 ++++++- src/components/management/StuffSearchCondition.jsx | 5 ++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index e4153691..e6b281c4 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -39,9 +39,9 @@ export default function Stuff() { const copyNo = async (value) => { try { await navigator.clipboard.writeText(value) - alert(getMessage('stuff.detail.header.message2')) + alert(getMessage('stuff.detail.header.successCopy')) } catch (error) { - alert(getMessage('stuff.detail.header.message3')) + alert(getMessage('stuff.detail.header.failCopy')) } } diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 9f3cd1ec..eea328d8 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -301,10 +301,12 @@ export default function StuffDetail() { } promiseGet({ url: `/api/object/${objectNo}/detail` }).then((res) => { if (res.status === 200) { - if (res.data != null) { + if (isObjectNotEmpty(res.data)) { setManagementState(res.data) } else { setManagementState({}) + alert(getMessage('stuff.detail.header.notExistObjectNo')) + router.push('/management/stuff') } if (isNotEmptyArray(res.data.planList)) { setPlanGridProps({ ...planGridProps, planGridData: res.data.planList }) @@ -314,6 +316,9 @@ export default function StuffDetail() { } else { setManagementState({}) setPlanGridProps({ ...planGridProps, planGridData: [] }) + + alert(getMessage('stuff.detail.header.notExistObjectNo')) + router.push('/management/stuff') } }) } else { diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 4a625539..f1476fc7 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -312,8 +312,8 @@ export default function StuffSearchCondition() { } else { //X누름 //화면에선 지우는데 리코일은 조회누르지 않으면 보존 - setSchSelSaleStoreId('') - // stuffSearch.schSelSaleStoreId = '' + // setSchSelSaleStoreId('') //값이 안비워짐.. + setSchSelSaleStoreId(null) //2차점 판매점목록비우기 setOtherSaleStoreList([]) @@ -333,7 +333,6 @@ export default function StuffSearchCondition() { if (session.storeLvl === '1') { if (stuffSearch.schOtherSelSaleStoreId === '') { // 화면에선 지우는데 조회누르기 전이면 리코일은 남김 - // stuffSearch.schSelSaleStoreId = '' setSchSelSaleStoreId(session.storeId) } else { // 화면에선 지우는데 조회누르기 전이면 리코일은 남김 From 5002b1904392a0774d426b1140b8f2b7892f511c Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 09:54:57 +0900 Subject: [PATCH 081/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSearchCondition.jsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index f1476fc7..1c7ececb 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -116,8 +116,10 @@ export default function StuffSearchCondition() { schAddress: address, schObjectName: objectName, schDispCompanyName: dispCompanyName, - schSelSaleStoreId: stuffSearch?.schSelSaleStoreId, - schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId, + // schSelSaleStoreId: stuffSearch?.schSelSaleStoreId, + // schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId, + schSelSaleStoreId: schSelSaleStoreId, + schOtherSelSaleStoreId: otherSaleStoreId, schReceiveUser: receiveUser, schDateType: dateType, schFromDt: dayjs(startDate).format('YYYY-MM-DD'), @@ -157,6 +159,7 @@ export default function StuffSearchCondition() { setStuffSearch({ schSelSaleStoreId: '', schOtherSelSaleStoreId: '', + schDateType: 'U', }) } else { if (otherSaleStoreList.length > 1) { @@ -356,6 +359,7 @@ export default function StuffSearchCondition() { setobjectName(stuffSearch.schObjectName ? stuffSearch.schObjectName : objectName) setDispCompanyName(stuffSearch.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName) setReceiveUser(stuffSearch.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser) + setDateType(stuffSearch.schDateType ? stuffSearch.schDateType : dateType) }, [stuffSearch]) useEffect(() => { @@ -637,7 +641,7 @@ export default function StuffSearchCondition() { type="radio" name="radio_ptype" id="radio_u" - checked={stuffSearch.schDateType === 'U' ? true : false} + checked={dateType === 'U' ? true : false} value={'U'} onChange={(e) => { setDateType(e.target.value) @@ -651,7 +655,7 @@ export default function StuffSearchCondition() { type="radio" name="radio_ptype" id="radio_r" - checked={stuffSearch.schDateType === 'R' ? true : false} + checked={dateType === 'R' ? true : false} value={'R'} onChange={(e) => { setDateType(e.target.value) From 7dc02514ad1f7c7e781d66aebf3373391ba567eb Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Mon, 18 Nov 2024 10:03:15 +0900 Subject: [PATCH 082/200] =?UTF-8?q?=EB=B3=B4=EC=A1=B0=EC=84=A0=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=EC=83=9D=EC=84=B1=20line=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useAuxiliaryDrawing.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 6e95e79c..1a0d87bd 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -455,9 +455,24 @@ export function useAuxiliaryDrawing(id) { name: 'auxiliaryLine', }) - lineHistory.current.push(line) + const historyLines = [...lineHistory.current] + + const hasSameLine = historyLines.some((history) => { + return ( + (isSamePoint(history.startPoint, line.startPoint) && isSamePoint(history.endPoint, line.endPoint)) || + (isSamePoint(history.startPoint, line.endPoint) && isSamePoint(history.endPoint, line.startPoint)) + ) + }) + mousePointerArr.current = [] clear() + + if (hasSameLine) { + canvas.remove(line) + return + } + + lineHistory.current.push(line) } const mouseDown = (e) => { From f6cd20b6507a03ebdf85ff705c424deded895a15 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 12:25:32 +0900 Subject: [PATCH 083/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 35 +++++++++++++++++++++------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 093815b8..81d2a7e8 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -309,18 +309,19 @@ export default function Estimate({ params }) { const onChangeAmount = (value, dispOrder, index) => { //itemChangeFlg = 1, partAdd = 0 셋팅 let amount = value - amount = Number(value.replaceAll(',', '')) + amount = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(amount)) { amount = 0 } else { amount = amount.toLocaleString() } + let updateList = [] let updates = {} updates.amount = amount updates.itemChangeFlg = '1' updates.partAdd = '0' - updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].salePrice).toLocaleString() + updates.saleTotPrice = (Number(amount.replaceAll(',', '')) * state.itemList[index].salePrice.replaceAll(',', '')).toLocaleString() updateList = state.itemList.map((item) => { if (item.dispOrder === dispOrder) { @@ -341,7 +342,7 @@ export default function Estimate({ params }) { const onChangeSalePrice = (value, dispOrder, index) => { //itemChangeFlg, partAdd 받아온 그대로 let salePrice - salePrice = Number(value.replaceAll(',', '')) + salePrice = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(salePrice)) { salePrice = 0 } else { @@ -350,7 +351,7 @@ export default function Estimate({ params }) { let updateList = [] let updates = {} updates.salePrice = salePrice - updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].amount).toLocaleString() + updates.saleTotPrice = (Number(salePrice.replaceAll(',', '')) * state.itemList[index].amount.replaceAll(',', '')).toLocaleString() updateList = state.itemList.map((item) => { if (item.dispOrder === dispOrder) { @@ -476,16 +477,32 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { - console.log('아이템 상태 가져오기::::::::::', state.itemList) + // console.log('아이템 상태 가져오기::::::::::', state.itemList) // console.log('토탈쪽 셋팅해주기위한 함수::::::', itemList) //delFlg 0인거 중에.. - setItemChangeYn(false) + //수량(PCS) : totAmount + //용량( Kw) : totVolKw + //공급가액 : supplyPrice + //부가세(10%) : vatPrice + //총액 :totPrice - // settingToalInfo(state.itemList) + let totAmount = 0 + let amount = 0 + state.itemList.map((item) => { + if (item.delFlg === '0') { + amount = item.amount.replace(/[^0-9]/g, '').replaceAll(',', '') + totAmount += Number(amount) + } + }) + + setState({ + totAmount: totAmount, + }) + + setItemChangeYn(false) } }, [itemChangeYn]) - // const settingToalInfo = (itemList) => {} return (
    @@ -1109,7 +1126,7 @@ export default function Estimate({ params }) { : item.pkgMaterialFlg === '1' ? false : true - : item.itemdId === '' + : item.itemId === '' ? true : item?.paDispOrder ? true From 4fcf5398097b5b59e0698c5964038a1b8bc4a7b7 Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 16:02:22 +0900 Subject: [PATCH 084/200] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20=EC=A1=B0=EC=A0=88=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/image/ImageSizeSetting.jsx | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 src/components/floor-plan/modal/image/ImageSizeSetting.jsx diff --git a/src/components/floor-plan/modal/image/ImageSizeSetting.jsx b/src/components/floor-plan/modal/image/ImageSizeSetting.jsx deleted file mode 100644 index 309df494..00000000 --- a/src/components/floor-plan/modal/image/ImageSizeSetting.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import WithDraggable from '@/components/common/draggable/WithDraggable' -import { useState } from 'react' -import { usePopup } from '@/hooks/usePopup' -import { useRecoilValue } from 'recoil' -import { contextPopupPositionState } from '@/store/popupAtom' -import { useMessage } from '@/hooks/useMessage' - -export default function ImageSizeSetting(props) { - const contextPopupPosition = useRecoilValue(contextPopupPositionState) - const { id, pos = contextPopupPosition, size, setSize } = props - const [sizeValue, setSizeValue] = useState(100) - const { getMessage } = useMessage() - const { closePopup } = usePopup() - - return ( - -
    -
    -

    {getMessage('modal.image.size.setting')}

    - -
    -
    -
    - setSizeValue(e.target.value)} - /> - -
    -
    -
    -
    - ) -} From a7ab46d6e5e53d3fbfde5d17c36c021662c7fe48 Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 16:02:32 +0900 Subject: [PATCH 085/200] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20=EC=A1=B0=EC=A0=88=20=EB=8B=A4=EA=B5=AD=EC=96=B4=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ja.json | 1 - src/locales/ko.json | 1 - 2 files changed, 2 deletions(-) diff --git a/src/locales/ja.json b/src/locales/ja.json index 29c46150..d5721a78 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -284,7 +284,6 @@ "modal.panel.batch.statistic.total": "合計", "modal.flow.direction.setting": "流れ方向の設定", "modal.flow.direction.setting.info": "流れ方向を選択してください。", - "modal.image.size.setting": "画像のサイズ変更", "modal.actual.size.setting": "実測値設定", "modal.actual.size.setting.info": "※隅棟・谷・棟の実際の寸法を入力してください。", "modal.actual.size.setting.not.exist.auxiliary.line": "실측치 입력할 보조선을 선택해 주세요(JA)", diff --git a/src/locales/ko.json b/src/locales/ko.json index 71819055..fe4df330 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -289,7 +289,6 @@ "modal.panel.batch.statistic.total": "합계", "modal.flow.direction.setting": "흐름 방향 설정", "modal.flow.direction.setting.info": "흐름방향을 선택하세요.", - "modal.image.size.setting": "이미지 크기 조절", "modal.actual.size.setting": "실측치 설정", "modal.actual.size.setting.info": "※隅棟・谷・棟의 실제 치수를 입력해주세요.", "modal.actual.size.setting.not.exist.auxiliary.line": "실측치 입력할 보조선을 선택해 주세요", From e8cfe345e68bf3ed163f1318b769f93256aa568f Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 16:03:20 +0900 Subject: [PATCH 086/200] =?UTF-8?q?=EB=AA=A8=EB=93=88,=20=ED=9A=8C?= =?UTF-8?q?=EB=A1=9C=20=EA=B5=AC=EC=84=B1=EC=97=90=EC=84=9C=20=EC=A7=80?= =?UTF-8?q?=EB=B6=95=EB=8D=AE=EA=B0=9C=20=EB=A9=94=EB=89=B4=EB=A1=9C=20?= =?UTF-8?q?=EB=84=98=EC=96=B4=EA=B0=80=EC=A7=80=20=EB=AA=BB=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasMenu.jsx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 26538599..133cdfa2 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -184,7 +184,7 @@ export default function CanvasMenu(props) { }, [type, globalLocale]) useEffect(() => { - if (['2', '3'].includes(canvasSetting?.roofSizeSet?.toString())) { + if ([2, 3].some((num) => num === canvasSetting?.roofSizeSet)) { setMenuNumber(3) setType('surface') setCurrentMenu(MENU.BATCH_CANVAS.BATCH_DRAWING) @@ -195,8 +195,12 @@ export default function CanvasMenu(props) { } }, [canvasSetting]) + const checkMenuState = (menu) => { + return ([2, 3].some((num) => num === canvasSetting?.roofSizeSet) && menu.index === 2) || (menuNumber === 4 && menu.index === 2) + } + return ( -
    +
    num === menuNumber) ? 'active' : ''}`}>
      {canvasMenus.map((menu) => { @@ -205,11 +209,12 @@ export default function CanvasMenu(props) { key={`canvas-menu-${menu.index}`} className={`canvas-menu-item ${menuNumber === menu.index ? 'active' : ''}`} onClick={() => { - if (['2', '3'].includes(canvasSetting?.roofSizeSet?.toString()) && menu.index === 2) return + if ([2, 3].some((num) => num === canvasSetting?.roofSizeSet) && menu.index === 2) return + if (menuNumber === 4 && menu.index === 2) return onClickNav(menu) }} > - @@ -218,7 +223,7 @@ export default function CanvasMenu(props) { })}
    - {menuNumber !== 6 && menuNumber !== 5 && ( + {![5, 6].some((num) => num === menuNumber) && ( <> {
    @@ -314,8 +319,8 @@ export default function CanvasMenu(props) { )}
    -
    - {(menuNumber === 2 || menuNumber === 3 || menuNumber === 4) && } +
    num === menuNumber) ? 'active' : ''}`}> + {[2, 3, 4].some((num) => num === menuNumber) && }
    {/* 견적서(menuNumber=== 5) 상세화면인경우 문서다운로드 팝업 */} {estimatePopupOpen && } From 3223a858402fdb4602ff58f7817b4d02788ed1ec Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 16:04:01 +0900 Subject: [PATCH 087/200] =?UTF-8?q?=EC=A0=90,=20=EC=84=A0,=20=EC=9E=84?= =?UTF-8?q?=EC=9D=98=20=EA=B7=B8=EB=A6=AC=EB=93=9C=20=EC=BB=A8=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EB=89=B4=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=83=89=20=EC=84=A4=EC=A0=95=20=EB=AA=A8=EB=8B=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useContextMenu.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 5dae113c..8e7028d4 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -446,19 +446,24 @@ export function useContextMenu() { ]) break case 'lineGrid': + case 'dotGrid': + case 'tempGrid': setContextMenu([ [ { id: 'gridMove', name: getMessage('modal.grid.move'), + component: , }, { id: 'gridCopy', name: getMessage('modal.grid.copy'), + component: , }, { id: 'gridColorEdit', name: getMessage('contextmenu.grid.color.edit'), + component: , }, { id: 'remove', From 9554708dfaeb84eb84fa13b2d6df234cdd2626be Mon Sep 17 00:00:00 2001 From: yjnoh Date: Mon, 18 Nov 2024 16:34:53 +0900 Subject: [PATCH 088/200] =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EA=B0=80=EB=8C=80?= =?UTF-8?q?=20=EC=84=A4=EC=B9=98=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useModuleBasicSetting.js | 54 +++++++++++++++++++---- src/hooks/surface/useSurfaceShapeBatch.js | 45 ++----------------- 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index f918df41..b70810fd 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -62,6 +62,8 @@ export function useModuleBasicSetting() { //설치 범위 지정 클릭 이벤트 const toggleSelection = (setupSurface) => { + console.log('setupSurface', setupSurface) + const isExist = selectedModuleInstSurfaceArray.some((obj) => obj.parentId === setupSurface.parentId) //최초 선택일때 if (!isExist) { @@ -379,6 +381,7 @@ export function useModuleBasicSetting() { const autoModuleSetup = () => { initEvent() const moduleSetupSurfaces = moduleSetupSurface //선택 설치면 + const notSelectedTrestlePolygons = canvas ?.getObjects() .filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE && !moduleSetupSurfaces.includes(obj)) //설치면이 아닌것 @@ -464,6 +467,13 @@ export function useModuleBasicSetting() { const bbox = turf.bbox(difference) + let surfaceBbox = { + minX: bbox[0], + maxX: bbox[2], + minY: bbox[1], + maxY: bbox[3], + } + let width = maxLengthLine.flowDirection === 'right' || maxLengthLine.flowDirection === 'left' ? 172.2 : 113.4 let height = maxLengthLine.flowDirection === 'right' || maxLengthLine.flowDirection === 'left' ? 113.4 : 172.2 @@ -475,16 +485,21 @@ export function useModuleBasicSetting() { const cols = Math.floor((bbox[2] - bbox[0]) / width) const rows = Math.floor((bbox[3] - bbox[1]) / height) + let startCoords = { x: 0, y: 0 } + if (moduleSetupSurface.flowDirection === 'south') { + startCoords = { + x: surfaceBbox.minX, + y: surfaceBbox.maxY, + } + } for (let col = 0; col <= cols; col++) { for (let row = 0; row <= rows; row++) { let x = 0, y = 0, square = [], margin = 0 - if (moduleSetupSurface.flowDirection !== undefined) { //배치면 처림 방향이 정해져있는 경우 - if (moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north') { //남,북 margin = (bbox[2] - bbox[0] - cols * width) / 2 //박스 끝에서 박스 시작값을 빼고 width와 계산된 cols를 곱한값을 뺀뒤 나누기 2 하면 가운데 배치됨 @@ -513,7 +528,6 @@ export function useModuleBasicSetting() { x = bbox[0] + col * width y = bbox[1] + row * height } - square = [ [x, y], [x + width, y], @@ -521,18 +535,14 @@ export function useModuleBasicSetting() { [x, y + height], [x, y], ] - const squarePolygon = turf.polygon([square]) const disjointFromTrestle = turf.booleanContains(turfModuleSetupSurface, squarePolygon) || turf.booleanWithin(squarePolygon, turfModuleSetupSurface) - if (disjointFromTrestle) { let turfCoordnates = squarePolygon.geometry.coordinates[0].slice(0, -1) const points = turfCoordnates.map((coord) => ({ x: coord[0], y: coord[1] })) - if (containsBatchObjects.length > 0) { let convertBatchObject - //도머가 있으면 적용되는 로직 const isDisjoint = containsBatchObjects.every((batchObject) => { if (batchObject.type === 'group') { @@ -540,10 +550,8 @@ export function useModuleBasicSetting() { } else { convertBatchObject = polygonToTurfPolygon(batchObject) } - return turf.booleanDisjoint(squarePolygon, convertBatchObject) //도머가 여러개일수있으므로 겹치는게 있다면... }) - if (isDisjoint) { const tempModule = new QPolygon(points, { fill: '#BFFD9F', @@ -621,6 +629,34 @@ export function useModuleBasicSetting() { return hull } + //도형의 내각을 구하는 로직 + function calculateInteriorAngles(polygon) { + const points = polygon.get('points') + const angles = [] + + for (let i = 0; i < points.length; i++) { + // 현재 점과 이전 및 다음 점 정의 + const current = points[i] + const prev = points[(i - 1 + points.length) % points.length] + const next = points[(i + 1) % points.length] + + // 벡터 계산 + const vecA = { x: prev.x - current.x, y: prev.y - current.y } + const vecB = { x: next.x - current.x, y: next.y - current.y } + + // 두 벡터 간 각도 계산 + const dotProduct = vecA.x * vecB.x + vecA.y * vecB.y + const magA = Math.sqrt(vecA.x * vecA.x + vecA.y * vecA.y) + const magB = Math.sqrt(vecB.x * vecB.x + vecB.y * vecB.y) + const angleRad = Math.acos(dotProduct / (magA * magB)) + const angleDeg = (angleRad * 180) / Math.PI + + // 내부 각도 저장 + angles.push(180 - angleDeg) + } + return angles + } + return { makeModuleInstArea, manualModuleSetup, diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index 77beb6b1..116fe639 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -419,8 +419,8 @@ export function useSurfaceShapeBatch() { { fill: 'transparent', stroke: 'black', //black - strokeWidth: 2, - selectable: true, + strokeWidth: 1, + selectable: false, fontSize: 0, }, ) @@ -429,6 +429,7 @@ export function useSurfaceShapeBatch() { const scale = (length1 - length2) / coord.x tmpPolygon.set({ scaleX: scale }) + tmpPolygon.setViewLengthText(false) pointsArray[0].x = 0 pointsArray[0].y = length3 //바닥면부터 시작하게 @@ -584,18 +585,6 @@ export function useSurfaceShapeBatch() { text: '배치면 내용을 전부 삭제하시겠습니까?', type: 'confirm', confirmFn: () => { - // canvas?.getObjects().forEach((obj) => { - // if ( - // obj.name === POLYGON_TYPE.ROOF || - // obj.name === BATCH_TYPE.OPENING || - // obj.name === BATCH_TYPE.SHADOW || - // obj.name === BATCH_TYPE.TRIANGLE_DORMER || - // obj.name === BATCH_TYPE.PENTAGON_DORMER || - // obj.name === 'lengthText' - // ) { - // canvas?.remove(obj) - // } - // }) canvas.clear() swalFire({ text: '삭제 완료 되었습니다.' }) }, @@ -661,34 +650,6 @@ export function useSurfaceShapeBatch() { return groupObjectsArray } - function getAllRelatedObjects(id) { - const ult = [] - const map = new Map() - - // Create a map of objects by their id - canvas.getObjects().forEach((obj) => { - map.set(obj.id, obj) - }) - - // Helper function to recursively find all related objects - function findRelatedObjects(id) { - const obj = map.get(id) - if (obj) { - result.push(obj) - canvas.getObjects().forEach((o) => { - if (o.parentId === id) { - findRelatedObjects(o.id) - } - }) - } - } - - // Start the search with the given parentId - findRelatedObjects(id) - - return result - } - const moveSurfaceShapeBatch = () => { const roof = canvas.getActiveObject() From 7478c21b7312f4e5059c66696b748860eaa3ae83 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 16:55:46 +0900 Subject: [PATCH 089/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 307 ++++++++++++++++----------- src/locales/ja.json | 2 - src/locales/ko.json | 2 - 3 files changed, 186 insertions(+), 125 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 81d2a7e8..390d2f63 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -198,6 +198,8 @@ export default function Estimate({ params }) { setStorePriceList(res.data) } }) + + setItemChangeYn(true) } }, [state?.estimateType]) @@ -305,6 +307,21 @@ export default function Estimate({ params }) { setSelection(newSelection) } + //주택PKG input 변경 + const onChangePkgAsp = (value) => { + if (state.estimateType === 'YJSS') { + //현재 PKG용량값 가져오기 + + let totVolKw = state.totVolKw * 1000 + let pkgTotPrice = value * totVolKw + + setState({ + pkgAsp: value, + pkgTotPrice: pkgTotPrice.toFixed(3), + }) + } + } + // 수량 변경 const onChangeAmount = (value, dispOrder, index) => { //itemChangeFlg = 1, partAdd = 0 셋팅 @@ -397,7 +414,8 @@ export default function Estimate({ params }) { updates.specialNoteCd = res.spnAttrCds updates.itemGroup = res.itemGroup updates.delFlg = '0' // 삭제플래그 0 - updates.saleTotPrice = res.salePrice * state.itemList[index].amount + // updates.saleTotPrice = res.salePrice * state.itemList[index].amount + updates.saleTotPrice = '0' //추가때는 수량을 안받아서 합계를 무조건 0으로 //104671 let bomList = res.itemBomList @@ -477,31 +495,79 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { - // console.log('아이템 상태 가져오기::::::::::', state.itemList) - // console.log('토탈쪽 셋팅해주기위한 함수::::::', itemList) - //delFlg 0인거 중에.. - //수량(PCS) : totAmount - //용량( Kw) : totVolKw - //공급가액 : supplyPrice - //부가세(10%) : vatPrice - //총액 :totPrice - let totAmount = 0 - let amount = 0 - state.itemList.map((item) => { - if (item.delFlg === '0') { - amount = item.amount.replace(/[^0-9]/g, '').replaceAll(',', '') - totAmount += Number(amount) - } - }) + let totVolKw = 0 + let supplyPrice = 0 + let vatPrice = 0 + let totPrice = 0 + let addPkgPrice = 0 + if (state.estimateType === 'YJOD') { + state.itemList.map((item) => { + if (item.delFlg === '0') { + const amount = Number(item.amount.replace(/[^0-9]/g, '').replaceAll(',', '')) + const price = Number(item.saleTotPrice.replaceAll(',', '')) - setState({ - totAmount: totAmount, - }) + if (item.moduleFlg === '1') { + //용량(Kw)은 모듈플래그 1만 합산 + const volKw = (item.pnowW * amount) / 1000 + totVolKw += volKw + } + // const price + totAmount += amount + supplyPrice += price + } + }) + + vatPrice = supplyPrice * 0.1 + totPrice = supplyPrice + vatPrice + + setState({ + totAmount: totAmount, + totVolKw: totVolKw.toFixed(3), + supplyPrice: supplyPrice.toFixed(3), + vatPrice: vatPrice.toFixed(3), + totPrice: totPrice.toFixed(3), + }) + } else { + //YJSS + state.itemList.map((item) => { + if (item.delFlg === '0') { + const amount = Number(item.amount.replace(/[^0-9]/g, '').replaceAll(',', '')) + const price = Number(item.saleTotPrice.replaceAll(',', '')) + const salePrice = Number(item.salePrice.replaceAll(',', '')) + + if (item.moduleFlg === '1') { + //용량(Kw)은 모듈플래그 1만 합산 + const volKw = (item.pnowW * amount) / 1000 + totVolKw += volKw + } + if (item.pkgMaterialFlg === '1') { + const pkgPrice = amount * salePrice + //YJSS는 PKG제외상품들만 모아서 수량 * 단가를 공급가액에 추가로 더해줌 + addPkgPrice += pkgPrice + } + + // const price + totAmount += amount + supplyPrice += price + } + }) + + vatPrice = supplyPrice * 0.1 + totPrice = supplyPrice + vatPrice + + setState({ + totAmount: totAmount, + totVolKw: totVolKw.toFixed(3), + supplyPrice: supplyPrice.toFixed(3), + vatPrice: vatPrice.toFixed(3), + totPrice: totPrice.toFixed(3), + }) + } setItemChangeYn(false) } - }, [itemChangeYn]) + }, [itemChangeYn, state.itemList]) return (
    @@ -915,13 +981,20 @@ export default function Estimate({ params }) {
    - + { + onChangePkgAsp(e.target.value) + }} + />
    {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgWeight')} - {getMessage('estimate.detail.sepcialEstimateProductInfo.calcFormula1')} + {convertNumberToPriceDecimal(state?.totVolKw)} {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgPrice')} - {getMessage('estimate.detail.sepcialEstimateProductInfo.calcFormula2')} + {convertNumberToPriceDecimal(state?.pkgTotPrice)} @@ -1034,117 +1107,109 @@ export default function Estimate({ params }) { state.itemList.map((item, index) => { if (item.delFlg === '0') { return ( - <> - - -
    - onChangeSelect(item.dispOrder)} - checked={selection.has(item.dispOrder) ? true : false} + + +
    + onChangeSelect(item.dispOrder)} + checked={!!selection.has(item.dispOrder)} + /> + +
    + + {item?.dispOrder} + +
    +
    + { - if (isObjectNotEmpty(e)) { - onChangeDisplayItem(e.itemId, item.dispOrder, index) - } - }} - getOptionLabel={(x) => x.itemName} - getOptionValue={(x) => x.itemId} - isClearable={false} - isDisabled={item?.paDispOrder ? true : false} - value={displayItemList.filter(function (option) { - return option.itemId === item.itemId - })} - /> + {item?.itemChangeFlg === '1' && ( +
    +
    - {item?.itemChangeFlg === '1' && ( -
    - -
    + )} +
    + + +
    +
    {item?.itemNo}
    +
    + {item?.fileUploadFlg === '1' && } + {item?.specialNoteCd && ( + )}
    - - -
    -
    {item?.itemNo}
    -
    - {item?.fileUploadFlg === '1' && } - {item?.specialNoteCd && ( - - )} -
    -
    - - -
    +
    + + +
    + { + onChangeAmount(e.target.value, item.dispOrder, index) + }} + /> +
    + + {item.unit} + +
    +
    { - onChangeAmount(e.target.value, item.dispOrder, index) + onChangeSalePrice(e.target.value, item.dispOrder, index) }} />
    - - {item.unit} - -
    -
    - { - onChangeSalePrice(e.target.value, item.dispOrder, index) - }} - /> -
    - {/*
    + {/*
    OPEN아이콘 처리
    */} -
    - - {item?.saleTotPrice} - - +
    + + {convertNumberToPriceDecimal(item?.saleTotPrice.replaceAll(',', ''))} + ) } else { return null diff --git a/src/locales/ja.json b/src/locales/ja.json index d5721a78..3918cdba 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -838,8 +838,6 @@ "estimate.detail.sepcialEstimateProductInfo.pkgUnitPrice": "住宅PKG単価 (W)", "estimate.detail.sepcialEstimateProductInfo.pkgWeight": "PKG容量 (Kw)", "estimate.detail.sepcialEstimateProductInfo.pkgPrice": "PKG金額", - "estimate.detail.sepcialEstimateProductInfo.calcFormula1": "(モジュール容量 × 数量)÷1000", - "estimate.detail.sepcialEstimateProductInfo.calcFormula2": "PKG単価 (W)×PKG容量(W)", "estimate.detail.header.showPrice": "価格表示", "estimate.detail.header.unitPrice": "定価", "estimate.detail.showPrice.pricingBtn": "Pricing", diff --git a/src/locales/ko.json b/src/locales/ko.json index fe4df330..1549e7e6 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -848,8 +848,6 @@ "estimate.detail.sepcialEstimateProductInfo.pkgUnitPrice": "주택PKG단가 (W)", "estimate.detail.sepcialEstimateProductInfo.pkgWeight": "PKG 용량 (Kw)", "estimate.detail.sepcialEstimateProductInfo.pkgPrice": "PKG 금액", - "estimate.detail.sepcialEstimateProductInfo.calcFormula1": "(모듈용량 * 수량)÷100", - "estimate.detail.sepcialEstimateProductInfo.calcFormula2": "PKG단가(W) * PKG용량(W)", "estimate.detail.header.showPrice": "가격표시", "estimate.detail.header.unitPrice": "정가", "estimate.detail.showPrice.pricingBtn": "Pricing", From 26dd8d7a0f770b7cf7381e9797ac1ada6e1a3dbb Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 17:17:49 +0900 Subject: [PATCH 090/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 390d2f63..74d75e63 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -310,13 +310,19 @@ export default function Estimate({ params }) { //주택PKG input 변경 const onChangePkgAsp = (value) => { if (state.estimateType === 'YJSS') { + let pkgAsp = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) + if (isNaN(pkgAsp)) { + pkgAsp = 0 + } else { + pkgAsp = pkgAsp.toLocaleString() + } //현재 PKG용량값 가져오기 let totVolKw = state.totVolKw * 1000 - let pkgTotPrice = value * totVolKw + let pkgTotPrice = pkgAsp * totVolKw setState({ - pkgAsp: value, + pkgAsp: pkgAsp, pkgTotPrice: pkgTotPrice.toFixed(3), }) } @@ -325,8 +331,7 @@ export default function Estimate({ params }) { // 수량 변경 const onChangeAmount = (value, dispOrder, index) => { //itemChangeFlg = 1, partAdd = 0 셋팅 - let amount = value - amount = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) + let amount = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(amount)) { amount = 0 } else { @@ -358,8 +363,7 @@ export default function Estimate({ params }) { // 단가 변경 const onChangeSalePrice = (value, dispOrder, index) => { //itemChangeFlg, partAdd 받아온 그대로 - let salePrice - salePrice = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) + let salePrice = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(salePrice)) { salePrice = 0 } else { @@ -394,7 +398,7 @@ export default function Estimate({ params }) { let updateList = [] let updates = {} get({ url: apiUrl }).then((res) => { - console.log('아이템상세정보:::::::', res) + // console.log('아이템상세정보:::::::', res) updates.objectNo = objectNo updates.planNo = planNo updates.itemId = res.itemId @@ -984,7 +988,7 @@ export default function Estimate({ params }) { { onChangePkgAsp(e.target.value) }} From 6351e291b48e1e2f99944dd2b4afbc271683f5aa Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 17:53:40 +0900 Subject: [PATCH 091/200] =?UTF-8?q?=F0=9F=9A=A8chore:=20Sync=20Sass?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/_reset.scss | 1818 +++++++++++++++++++--------------------- 1 file changed, 844 insertions(+), 974 deletions(-) diff --git a/src/styles/_reset.scss b/src/styles/_reset.scss index c871f7bb..6c65fec7 100644 --- a/src/styles/_reset.scss +++ b/src/styles/_reset.scss @@ -1,1106 +1,976 @@ * { - -webkit-text-size-adjust: none; - -moz-text-size-adjust: none; - -ms-text-size-adjust: none; - text-size-adjust: none; - box-sizing: content-box; + -webkit-text-size-adjust:none; + -moz-text-size-adjust:none; + -ms-text-size-adjust:none; + text-size-adjust: none; + box-sizing: content-box } -*, -::after, -::before { - box-sizing: border-box; +*, ::after, ::before { + box-sizing: border-box; } -html, -body { - font-size: 16px; +html, body{ + font-size: 16px; } -html, -body, -div, -span, -applet, -object, -iframe, -h1, -h2, -h3, -h4, -h5, -h6, -p, -blockquote, -pre, -a, -abbr, -acronym, -address, -big, -cite, -code, -del, -dfn, -em, -img, -ins, -kbd, -q, -s, -samp, -small, -strike, -strong, -sub, -sup, -tt, -var, -b, -u, -i, -center, -dl, -dt, -dd, -ol, -ul, -li, -fieldset, -form, -label, -legend, -table, -caption, -tbody, -tfoot, -thead, -tr, -th, -td, -article, -aside, -canvas, -details, -embed, -figure, -figcaption, -footer, -header, -hgroup, -menu, -nav, -output, -ruby, -section, -summary, -time, -mark, -audio, -video { - margin: 0; - padding: 0; - border: 0; - font: inherit; - vertical-align: baseline; - font-family: 'Noto Sans JP', sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-smooth: never; +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; + font-family: 'Noto Sans JP', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-smooth: never; } /* HTML5 display-role reset for older browsers */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -menu, -nav, -section { - display: block; +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; } body { - line-height: 1.4; -} -body:first-of-type caption { - display: none; + line-height: 1.4; } +body:first-of-type caption { display:none;} -ol, -ul { - list-style: none; +ol, ul { + list-style: none; } -blockquote, -q { - quotes: none; +blockquote, q { + quotes: none; } -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ''; - content: none; +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; } table { - width: 100%; - border-collapse: separate; - border-spacing: 0; - border: 0 none; + width: 100%; + border-collapse: separate; + border-spacing:0; + border:0 none; } -caption, -th, -td { - text-align: left; - font-weight: normal; - border: 0; +caption, th, td { + text-align:left; + font-weight: normal; + border:0; } -a { - cursor: pointer; - color: #000; +a { + cursor:pointer; + color:#000; } -a, -a:hover, -a:active { - text-decoration: none; - -webkit-tap-highlight-color: transparent; +a, a:hover, a:active { + text-decoration:none; + -webkit-tap-highlight-color: transparent; } /*form_style*/ -input, -select, -textarea, -button, -a, -label { - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +input, select, textarea, button, a, label { + -webkit-tap-highlight-color:rgba(0,0,0,0); } -button, -input[type='text'], -input[type='button'] { - -webkit-appearance: none; - -webkit-border-radius: 0; - -webkit-appearance: none; - appearance: none; - border-radius: 0; +button,input[type=text], input[type=button] { + -webkit-appearance: none; + -webkit-border-radius: 0; + -webkit-appearance:none; + appearance: none; + border-radius: 0 } -input[type='checkbox'], -input[type='radio'] { - box-sizing: border-box; - padding: 0; +input[type=checkbox], input[type=radio] { + box-sizing: border-box; + padding: 0; } -input, -select, -button { - border: 0 none; - outline: none; - margin: 0; +input, select, button { + border:0 none; + outline:none; + margin:0; } select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } select::-ms-expand { - display: none; + display: none; } ::-webkit-input-placeholder { - line-height: 1; - font-weight: 300; - font-size: 0.938rem; - letter-spacing: -0.6px; - color: #8b8b8b; + line-height:1; + font-weight:300; + font-size:0.938rem; + letter-spacing:-0.6px; + color:#8b8b8b; } -.log-box ::-webkit-input-placeholder { - color: #8b8b8b; +.log-box ::-webkit-input-placeholder{ + color:#8b8b8b; } -button { - background: transparent; - font-family: 'Noto Sans JP', sans-serif; - border: none; - padding: 0; - margin: 0; - line-height: 1.4; - color: inherit; - outline: none; - cursor: pointer; +button{ + background: transparent; + font-family: 'Noto Sans JP', sans-serif; + border: none; + padding: 0; + margin: 0; + line-height: 1.4; + color: inherit; + outline: none; + cursor: pointer; } -.pre { - font-family: 'Pretendard', sans-serif !important; +.pre{ + font-family: 'Pretendard', sans-serif !important; } -.no-click { - cursor: no-drop !important; +.no-click{ + cursor: no-drop !important; } // margin -.mt5 { - margin-top: 5px !important; -} -.mt10 { - margin-top: 10px !important; -} -.mt15 { - margin-top: 15px !important; -} -.mb5 { - margin-bottom: 5px !important; -} -.mb10 { - margin-bottom: 10px !important; -} -.mb15 { - margin-bottom: 15px !important; -} -.mr5 { - margin-right: 5px !important; -} -.mr10 { - margin-right: 10px !important; -} -.mr15 { - margin-right: 15px !important; -} -.ml5 { - margin-left: 5px !important; -} -.ml10 { - margin-left: 10px !important; -} -.ml15 { - margin-left: 15px !important; -} +.mt5{margin-top: 5px !important;} +.mt10{margin-top: 10px !important;} +.mt15{margin-top: 15px !important;} +.mb5{margin-bottom: 5px !important;} +.mb10{margin-bottom: 10px !important;} +.mb15{margin-bottom: 15px !important;} +.mr5{margin-right: 5px !important;} +.mr10{margin-right: 10px !important;} +.mr15{margin-right: 15px !important;} +.ml5{margin-left: 5px !important;} +.ml10{margin-left: 10px !important;} +.ml15{margin-left: 15px !important;} // align -.al-l { - text-align: left !important; -} -.al-r { - text-align: right !important; -} -.al-c { - text-align: center !important; -} +.al-l{text-align: left !important;} +.al-r{text-align: right !important;} +.al-c{text-align: center !important;} + // button -.btn-frame { - display: inline-block; - padding: 0 7px; - height: 34px; - line-height: 34px; - border-radius: 2px; - color: #fff; - font-size: 12px; - font-weight: 400; - border: 1px solid #000; - text-align: center; - font-family: 'Pretendard', sans-serif; - transition: all 0.17s ease-in-out; - cursor: pointer; - &.block { - width: 100%; - } - &.small { - font-family: 'Noto Sans JP', sans-serif; - height: 30px; - line-height: 30px; - font-size: 13px; - } +.btn-frame{ + display: inline-block; + padding: 0 7px; + height: 34px; + line-height: 34px; + border-radius: 2px; + color: #fff; + font-size: 12px; + font-weight: 400; + border: 1px solid #000; + text-align: center; + font-family: 'Pretendard', sans-serif; + transition: all .17s ease-in-out; + cursor: pointer; + &.block{ + width: 100%; + } + &.small{ + font-family: 'Noto Sans JP', sans-serif; + height: 30px; + line-height: 30px; + font-size: 13px; + } - &.deepgray { - background-color: #2c2c2c; - border: 1px solid #484848; - } - &.gray { - background-color: #3c3c3c; - border: 1px solid #545454; - } - &.dark { - background-color: #1c1c1c; - border: 1px solid #484848; - } - &.modal { - font-family: 'Noto Sans JP', sans-serif; - background-color: #272727; - border: 1px solid #484848; - color: #aaa; - &:hover { - background-color: #1083e3; - border: 1px solid #1083e3; - color: #fff; - font-weight: 500; + &.deepgray{ + background-color: #2C2C2C; + border: 1px solid #484848; } - } - &.sub-tab { - height: 30px; - padding: 0 10px; - line-height: 28px; - font-family: 'Noto Sans JP', sans-serif; - background-color: #2d2d2d; - border: 1px solid #393939; - color: #aaa; - &.act, - &:hover { - background-color: #414e6c; - border: 1px solid #414e6c; - color: #fff; - font-weight: 500; + &.gray{ + background-color: #3C3C3C; + border: 1px solid #545454; } - } - &.roof { - height: 30px; - padding: 0 10px; - line-height: 28px; - font-family: 'Noto Sans JP', sans-serif; - background-color: transparent; - border: 1px solid #484848; - color: #fff; - &.blue { - background-color: #414e6c; - border: 1px solid #414e6c; - &:hover { - background-color: #414e6c; - border: 1px solid #414e6c; - } + &.dark{ + background-color: #1C1C1C; + border: 1px solid #484848; } - &.white { - background-color: #fff; - border: 1px solid #fff; - color: #101010; - &:hover { - background-color: #fff; - border: 1px solid #fff; - color: #101010; - } + &.modal{ + font-family: 'Noto Sans JP', sans-serif; + background-color: #272727; + border: 1px solid #484848; + color: #aaa; + &:hover{ + background-color: #1083E3; + border: 1px solid #1083E3; + color: #fff; + font-weight: 500; + } } - &:hover { - font-weight: 400; - background-color: transparent; - border: 1px solid #484848; - color: #fff; + &.sub-tab{ + height: 30px; + padding: 0 10px; + line-height: 28px; + font-family: 'Noto Sans JP', sans-serif; + background-color: #2D2D2D; + border: 1px solid #393939; + color: #aaa; + &.act, + &:hover{ + background-color: #414E6C; + border: 1px solid #414E6C; + color: #fff; + font-weight: 500; + } } - } - &.self { - height: 30px; - padding: 0 10px; - line-height: 28px; - font-family: 'Noto Sans JP', sans-serif; - background-color: transparent; - border: 1px solid #676767; - color: #aaaaaa; - &:hover { - background-color: #272727; - border-color: #676767; - font-weight: 400; + &.roof{ + height: 30px; + padding: 0 10px; + line-height: 28px; + font-family: 'Noto Sans JP', sans-serif; + background-color: transparent; + border: 1px solid #484848; + color: #fff; + &.blue{ + background-color: #414E6C; + border: 1px solid #414E6C; + &:hover{ + background-color: #414E6C; + border: 1px solid #414E6C; + } + } + &.white{ + background-color: #fff; + border: 1px solid #fff; + color: #101010; + &:hover{ + background-color: #fff; + border: 1px solid #fff; + color: #101010; + } + } + &:hover{ + font-weight: 400; + background-color: transparent; + border: 1px solid #484848; + color: #fff; + } } - } - &:hover, - &.act { - background-color: #1083e3; - border: 1px solid #1083e3; - color: #fff; - font-weight: 500; - } - &.block { - display: block; - width: 100%; - } - &.ico-flx { - display: flex; - align-items: center; - .ico { - margin-right: 10px; + &.self{ + height: 30px; + padding: 0 10px; + line-height: 28px; + font-family: 'Noto Sans JP', sans-serif; + background-color: transparent; + border: 1px solid #676767; + color: #AAAAAA; + &:hover{ + background-color: #272727; + border-color: #676767; + font-weight: 400; + } } &:hover, - &.act { - font-weight: 400; + &.act{ + background-color: #1083E3; + border: 1px solid #1083E3; + color: #fff; + font-weight: 500; } - } + &.block{ + display: block; + width: 100%; + } + &.ico-flx{ + display: flex; + align-items: center; + .ico{ + margin-right: 10px; + } + &:hover, + &.act{ + font-weight: 400; + } + } } -.btn-origin { - display: inline-block; - height: 30px; - padding: 0 10px; - border-radius: 2px; - background-color: #101010; - color: #fff; - font-size: 13px; - font-weight: 400; - transition: all 0.15s ease-in-out; - &.navy { - background-color: #304961; - &:hover { - background-color: #233546; +.btn-origin{ + display: inline-block; + height: 30px; + padding: 0 10px; + border-radius: 2px; + background-color: #101010; + color: #fff; + font-size: 13px; + font-weight: 400; + transition: all .15s ease-in-out; + &.navy{ + background-color: #304961; + &:hover{ + background-color: #233546; + } } - } - &.grey { - background-color: #94a0ad; - &:hover { - background-color: #607f9a; + &.grey{ + background-color: #94A0AD; + &:hover{ + background-color: #607F9A; + } } - } - &.green { - background-color: #a6bba8; - &:hover { - background-color: #98af9b; + &.green{ + background-color: #A6BBA8; + &:hover{ + background-color: #98af9b; + } } - } - &.white { - border: 1px solid #94a0ad; - background-color: #fff; - color: #94a0ad; - &:hover { - background-color: #fff; + &.white{ + border: 1px solid #94A0AD; + background-color: #fff; + color: #94A0AD; + &:hover{ + background-color: #fff; + } } - } } // select -.sort-select { - position: relative; - display: inline-block; - min-width: 100px; - height: 30px; - line-height: 30px; - padding: 0 25px 0 10px; - background-color: #373737; - border: 1px solid #3f3f3f; - border-radius: 2px; - border-top-left-radius: 2px; - color: #fff; - cursor: pointer; - p { - font-size: 13px; - color: #fff; - height: 100%; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - } - .select-item-wrap { - position: absolute; - top: 100%; - left: -1px; - clip-path: inset(0 0 100% 0); - width: calc(100% + 2px); - padding: 8px 0; - max-height: 100px; - overflow-y: auto; - background-color: #373737; - border: 1px solid #3f3f3f; - border-radius: 2px; - transition: all 0.17s ease-in-out; - visibility: hidden; - z-index: 999; - .select-item { - display: flex; - align-items: center; - padding: 8px 20px; - line-height: 1.4; - transition: all 0.17s ease-in-out; - button { - font-size: 12px; - color: #fff; - line-height: 1.4; - } - &:hover { - background-color: #2c2c2c; - } - } - &::-webkit-scrollbar { - width: 2px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background-color: #5a5a5a; - border-radius: 10px; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } - } - &::after { - content: ''; - position: absolute; - top: 50%; - right: 7px; - transform: translateY(-50%); - width: 10px; - height: 6px; - background: url(/static/images/common/select-arr.svg) no-repeat center; - background-size: cover; - transition: all 0.17s ease-in-out; - } - &.active { - .select-item-wrap { - clip-path: inset(0 0 0 0); - visibility: visible; - } - &:after { - transform: translateY(-50%) rotate(-180deg); - } - } -} - -.select-light { - position: relative; - display: block; - width: 100%; - height: 30px; - background: #fff url(../../public/static/images/common/select_light_arr.svg) calc(100% - 11px) center no-repeat; - background-size: 10px 6px; - border: 1px solid #eee; - padding: 0 30px 0 10px; - font-size: 13px; - color: #45576f; - font-family: 'Noto Sans JP', sans-serif; - cursor: pointer; - &:disabled { - opacity: 1; - background-color: #fafafa; - color: #999; - cursor: default; - } - &.black { - color: #101010; - } - &.dark { - background: #323234 url(../../public/static/images/common/select_dark_arr.svg) calc(100% - 11px) center no-repeat; - color: #898989; - font-size: 12px; - border-radius: 2px; - border: none; - } -} - -// input -.form-input { - label { - display: block; - color: #aaa; - font-size: 12px; - font-weight: 500; - margin-bottom: 10px; - } -} -input[type='password'], -input[type='number'], -input[type='text'] { - &.input-origin { +.sort-select{ + position: relative; display: inline-block; + min-width: 100px; height: 30px; line-height: 30px; + padding: 0 25px 0 10px; + background-color: #373737; + border: 1px solid #3F3F3F; border-radius: 2px; - background-color: #323234; - border: 1px solid #323234; + border-top-left-radius: 2px; color: #fff; - font-size: 12px; - font-weight: 500; - font-family: 'Pretendard', sans-serif; - padding: 0 10px; - letter-spacing: 0px; - text-align: right; - transition: border 0.15s ease-in-out; - &:focus { - border: 1px solid #1083e3; + cursor: pointer; + p{ + font-size: 13px; + color: #fff; + height: 100%; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; } - &::placeholder { - font-family: 'Noto Sans JP', sans-serif; - opacity: 1; - font-size: 12px; - letter-spacing: 0px; + .select-item-wrap{ + position: absolute; + top: 100%; + left: -1px; + clip-path:inset(0 0 100% 0); + width: calc(100% + 2px); + padding: 8px 0; + max-height: 100px; + overflow-y: auto; + background-color: #373737; + border: 1px solid #3F3F3F; + border-radius: 2px; + transition: all 0.17s ease-in-out; + visibility: hidden; + z-index: 999; + .select-item{ + display: flex; + align-items: center; + padding: 8px 20px; + line-height: 1.4; + transition: all .17s ease-in-out; + button{ + font-size: 12px; + color: #fff; + line-height: 1.4; + } + &:hover{ + background-color: #2C2C2C; + } + } + &::-webkit-scrollbar { + width: 2px; + background-color: transparent; + + } + &::-webkit-scrollbar-thumb { + background-color: #5a5a5a; + border-radius: 10px; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } } - &.block { - width: 100%; + &::after{ + content: ''; + position: absolute; + top: 50%; + right: 7px; + transform: translateY(-50%); + width: 10px; + height: 6px; + background: url(/static/images/common/select-arr.svg) no-repeat center; + background-size: cover; + transition: all .17s ease-in-out; } - &:read-only { - color: #aaa; - &:focus { - border: 1px solid #323234; - } + &.active{ + .select-item-wrap{ + clip-path: inset(0 0 0 0); + visibility: visible; + } + &:after{ + transform: translateY(-50%) rotate(-180deg); + } } - &.plane { - font-family: 'Noto Sans JP', sans-serif; - border: 1px solid #525252; - background-color: transparent; - } - } - &.input-light { +} + +.select-light{ + position: relative; display: block; width: 100%; height: 30px; - padding: 0 10px; + background: #FFF url(../../public/static/images/common/select_light_arr.svg) calc(100% - 11px) center no-repeat; + background-size: 10px 6px; border: 1px solid #eee; - border-radius: 2px; - background-color: #fff; - font-family: 'Noto Sans JP', sans-serif; + padding: 0 30px 0 10px; font-size: 13px; - color: #45576f; - font-weight: normal; - transition: border-color 0.17s ease-in-out; - text-align: left; - &:focus { - border-color: #94a0ad; + color: #45576F; + font-family: 'Noto Sans JP', sans-serif; + cursor: pointer; + &:disabled{ + opacity: 1; + background-color: #FAFAFA; + color: #999; + cursor: default; } - &:read-only { - background-color: #fafafa; - color: #999999; - &:focus { - border-color: #eee; - } + &.black{ + color: #101010; + } + &.dark{ + background: #323234 url(../../public/static/images/common/select_dark_arr.svg) calc(100% - 11px) center no-repeat; + color: #898989; + font-size: 12px; + border-radius: 2px; + border: none; } - } } + +// input +.form-input{ + label{ + display: block; + color: #aaa; + font-size: 12px; + font-weight: 500; + margin-bottom: 10px; + } +} +input[type=password], +input[type=number], +input[type=text]{ + &.input-origin{ + display: inline-block; + height: 30px; + line-height: 30px; + border-radius: 2px; + background-color: #323234; + border: 1px solid #323234; + color: #fff; + font-size: 12px; + font-weight: 500; + font-family: 'Pretendard', sans-serif; + padding: 0 10px; + letter-spacing: 0px; + text-align: right; + transition: border .15s ease-in-out; + &:focus{ + border: 1px solid #1083E3; + } + &::placeholder{ + font-family: 'Noto Sans JP', sans-serif; + opacity: 1; + font-size: 12px; + letter-spacing: 0px; + } + &.block{ + width: 100%; + } + &:read-only{ + color: #AAA; + &:focus{ + border: 1px solid #323234; + } + } + &.plane{ + font-family: 'Noto Sans JP', sans-serif; + border: 1px solid #525252; + background-color: transparent; + } + } + &.input-light{ + display: block; + width: 100%; + height: 30px; + padding: 0 10px; + border: 1px solid #eee; + border-radius: 2px; + background-color: #fff; + font-family: 'Noto Sans JP', sans-serif; + font-size: 13px; + color: #45576F; + font-weight: normal; + transition: border-color .17s ease-in-out; + text-align: left; + &:focus{ + border-color: #94A0AD; + } + &:read-only{ + background-color: #FAFAFA; + color: #999999; + &:focus{ + border-color: #eee; + } + } + } +} + + + // check-btn -.check-btn { - display: flex; - align-items: center; - height: 30px; - background-color: #3a3a3a; - border-radius: 3px; - transition: all 0.17s ease-in-out; - .check-area { - flex: none; - width: 30px; - height: 100%; - border-right: 1px solid #272727; - background: url(../../public/static/images/canvas/check-grey.svg) no-repeat center; - background-size: 11px 9px; - } - .title-area { - padding: 0 10px; - font-size: 12px; - color: #898989; - font-weight: 400; - } - &.block { - width: 100%; - } - &:hover, - &.act { - background-color: #fff; - .check-area { - border-right: 1px solid #101010; - background: url(../../public/static/images/canvas/check-black.svg) no-repeat center; +.check-btn{ + display: flex; + align-items: center; + height: 30px; + background-color: #3A3A3A; + border-radius: 3px; + transition: all .17s ease-in-out; + .check-area{ + flex: none; + width: 30px; + height: 100%; + border-right: 1px solid #272727; + background: url(../../public/static/images/canvas/check-grey.svg)no-repeat center; + background-size: 11px 9px; } - .title-area { - color: #101010; - font-weight: 600; + .title-area{ + padding: 0 10px; + font-size: 12px; + color: #898989; + font-weight: 400; + } + &.block{ + width: 100%; + } + &:hover, + &.act{ + background-color: #fff; + .check-area{ + border-right: 1px solid #101010; + background: url(../../public/static/images/canvas/check-black.svg)no-repeat center; + } + .title-area{ + color: #101010; + font-weight: 600; + } } - } } // arr-btn -.arr-btn { - display: block; - height: 30px; - border-radius: 3px; - background-color: #3a3a3a; - padding: 0 11px; - text-align: left; - transition: all 0.17s ease-in-out; - span { - position: relative; - font-size: 12px; - color: #898989; - font-weight: 400; - padding-right: 15px; - &:after { - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 5px; - height: 8px; - background: url(../../public/static/images/canvas/arr_btn_ico.svg) no-repeat center; - } - } - &:hover, - &.act { - background-color: #fff; - span { - color: #101010; - font-weight: 500; - &:after { - background: url(../../public/static/images/canvas/arr_btn_ico_black.svg) no-repeat center; - } - } - } - &.dark { - text-align: center; - background-color: #272727; - border: 1px solid #484848; - span { - color: #fff; - &:after { - background: url(../../public/static/images/canvas/arr_btn_ico_white.svg) no-repeat center; - } +.arr-btn{ + display: block; + height: 30px; + border-radius: 3px; + background-color: #3A3A3A; + padding: 0 11px; + text-align: left; + transition: all .17s ease-in-out; + span{ + position: relative; + font-size: 12px; + color: #898989; + font-weight: 400; + padding-right: 15px; + &:after{ + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 5px; + height: 8px; + background: url(../../public/static/images/canvas/arr_btn_ico.svg)no-repeat center; + } } &:hover, - &.act { - background-color: #1083e3; - border: 1px solid #1083e3; + &.act{ + background-color: #fff; + span{ + color: #101010; + font-weight: 500; + &:after{ + background: url(../../public/static/images/canvas/arr_btn_ico_black.svg)no-repeat center; + } + } + } + &.dark{ + text-align: center; + background-color: #272727; + border: 1px solid #484848; + span{ + color: #Fff; + &:after{ + background: url(../../public/static/images/canvas/arr_btn_ico_white.svg)no-repeat center; + } + } + &:hover, + &.act{ + background-color: #1083E3; + border: 1px solid #1083E3; + } } - } } // radio .d-check-radio, -.d-check-box { - line-height: 1.1; - cursor: pointer; - input[type='checkbox'], - input[type='radio'] { - position: static; - margin-left: 0; +.d-check-box{ + line-height: 1.1; cursor: pointer; - opacity: 0; - z-index: 1; - flex: 0 0 auto; - } - label { - position: relative; - padding-left: 10px; - margin-bottom: 0; - word-break: break-all; - line-height: 1.2; - display: inline; - vertical-align: top; - color: #fff; - font-size: 13px; - font-weight: 400; - cursor: pointer; - } - &.light { - label { - color: #45576f; + input[type=checkbox], + input[type=radio]{ + position: static; + margin-left: 0; + cursor: pointer; + opacity: 0; + z-index: 1; + flex: 0 0 auto; } - } - &.no-text { - label { - padding-left: 0; + label{ + position: relative; + padding-left: 10px; + margin-bottom: 0; + word-break: break-all; + line-height: 1.2; + display: inline; + vertical-align: top; + color: #fff; + font-size: 13px; + font-weight: 400; + cursor: pointer; + } + &.light{ + label{ + color: #45576F; + } + } + &.no-text{ + label{ + padding-left: 0; + } } - } } .d-check-radio { - label { - &::before { - cursor: pointer; - content: ''; - display: inline-block; - position: absolute; - width: 17px; - height: 17px; - top: 2px; - left: 0; - margin-left: -12px; - border: 1px solid #999999; - border-radius: 100%; - background-color: transparent; - text-align: center; - font-size: 13px; - line-height: 1.4; - transition: - border 0.15s ease-in-out, - color 0.15s ease-in-out; + label{ + &::before{ + cursor: pointer; + content: ""; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + top:2px; + left: 0; + margin-left: -12px; + border: 1px solid #999999; + border-radius: 100%; + background-color: transparent; + text-align:center; + font-size:13px; + line-height:1.4; + transition: border 0.15s ease-in-out, color 0.15s ease-in-out; + } + &::after{ + cursor: pointer; + content: ""; + display: inline-block; + position: absolute; + width: 9px; + height: 9px; + top:6px; + left: 4px; + margin-left: -12px; + border: none; + border-radius: 100%; + background-color: #fff; + text-align:center; + font-size:13px; + line-height:1.4; + opacity: 0; + visibility: hidden; + transition: opacity 0.15s ease-in-out, color 0.15s ease-in-out; + } } - &::after { - cursor: pointer; - content: ''; - display: inline-block; - position: absolute; - width: 9px; - height: 9px; - top: 6px; - left: 4px; - margin-left: -12px; - border: none; - border-radius: 100%; - background-color: #fff; - text-align: center; - font-size: 13px; - line-height: 1.4; - opacity: 0; - visibility: hidden; - transition: - opacity 0.15s ease-in-out, - color 0.15s ease-in-out; + &.light{ + label{ + &:before{ + border-color: #D6D6D7; + } + &:after{ + background-color: #697C8F; + } + } } - } - &.light { - label { - &:before { - border-color: #d6d6d7; - } - &:after { - background-color: #697c8f; - } + input[type=radio]:checked + label::after{ + opacity: 1; + visibility: visible; } - } - input[type='radio']:checked + label::after { - opacity: 1; - visibility: visible; - } - &.pop { - label { - font-size: 12px; - &:before { - width: 16px; - height: 16px; - border-color: #fff; - } - &:after { - width: 8px; - height: 8px; - background-color: #fff; - } + &.pop{ + label{ + font-size: 12px; + &:before{ + width: 16px; + height: 16px; + border-color: #fff; + } + &:after{ + width: 8px; + height: 8px; + background-color: #fff; + } + } } - } } // check-box -.d-check-box { - label { - &.red { - color: #ffcaca; +.d-check-box{ + label{ + &.red{color: #FFCACA;} + &::before{ + cursor: pointer; + content: ""; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + top: 2px; + left: 0; + margin-left: -12px; + border: 1px solid #D6D6D7; + background-color: #fff; + transition: border 0.15s ease-in-out, color 0.15s ease-in-out; + } + &:after{ + cursor: pointer; + content: ""; + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + top:0; + left: 0; + margin-left: -.8rem; + transition: border 0.05s ease-in-out, color 0.05s ease-in-out; + } } - &::before { - cursor: pointer; - content: ''; - display: inline-block; - position: absolute; - width: 17px; - height: 17px; - top: 2px; - left: 0; - margin-left: -12px; - border: 1px solid #d6d6d7; - background-color: #fff; - transition: - border 0.15s ease-in-out, - color 0.15s ease-in-out; + input[type=checkbox]:checked + label::after{ + content: ""; + display: inline-block; + position: absolute; + top: 1px; + left: -1px; + width: 5px; + height: 8px; + border: 2px solid #697C8F; + border-left: none; + border-top: none; + transform: translate(7.75px,4.5px) rotate(45deg); + -ms-transform: translate(7.75px,4.5px) rotate(45deg); } - &:after { - cursor: pointer; - content: ''; - display: inline-block; - position: absolute; - width: 16px; - height: 16px; - top: 0; - left: 0; - margin-left: -0.8rem; - transition: - border 0.05s ease-in-out, - color 0.05s ease-in-out; + input[type=checkbox]:disabled + label::before{ + background-color: #FAFAFA; } - } - input[type='checkbox']:checked + label::after { - content: ''; - display: inline-block; - position: absolute; - top: 1px; - left: -1px; - width: 5px; - height: 8px; - border: 2px solid #697c8f; - border-left: none; - border-top: none; - transform: translate(7.75px, 4.5px) rotate(45deg); - -ms-transform: translate(7.75px, 4.5px) rotate(45deg); - } - &.pop { - label { - &:before { - background-color: transparent; - } + input[type=checkbox]:disabled + label::after{ + border-color: #999; } - input[type='checkbox']:checked + label::after { - border-color: #fff; + &.pop{ + label{ + &:before{ + background-color: transparent; + } + } + input[type=checkbox]:checked + label::after{ + border-color: #fff; + } + &.no-text{ + label{ + padding-left: 0; + } + } } - &.no-text { - label { - padding-left: 0; - } + &.sel{ + input[type=checkbox]:checked + label{ + color: #D7C863; + } + input[type=checkbox]:checked + label::before, + input[type=checkbox]:checked + label::after{ + border-color: #D7C863; + } } - } - &.sel { - input[type='checkbox']:checked + label { - color: #d7c863; - } - input[type='checkbox']:checked + label::before, - input[type='checkbox']:checked + label::after { - border-color: #d7c863; - } - } } // date-picker -.date-picker { - svg { - display: none; - } - .react-datepicker-wrapper { - width: 100%; - } - input[type='text'] { - display: block; - width: 100%; - height: 30px; - padding: 0 34px 0 10px; - border-radius: 2px; - border: 1px solid #eee; - font-size: 13px; - color: #45576f; - font-weight: normal; - font-family: 'Noto Sans JP', sans-serif; - background: #fff url(../../public/static/images/common/datepicker.svg) calc(100% - 11px) center no-repeat; - background-size: 14px 15px; - cursor: pointer; - } +.date-picker{ + svg{display: none;} + .react-datepicker-wrapper{ + width: 100%; + } + input[type=text]{ + display: block; + width: 100%; + height: 30px; + padding: 0 34px 0 10px; + border-radius: 2px; + border: 1px solid #eee; + font-size: 13px; + color: #45576F; + font-weight: normal; + font-family: 'Noto Sans JP', sans-serif; + background: #fff url(../../public/static/images/common/datepicker.svg) calc(100% - 11px) center no-repeat; + background-size: 14px 15px; + cursor: pointer; + } } // react select -.react-select-custom { - width: 100%; - .custom__control { - height: 30px; - min-height: unset; - border-radius: 2px; - border-color: #eee; - background-color: #fff; - &:hover { - border-color: #eee; +.react-select-custom{ + width: 100%; + .custom__control{ + height: 30px; + min-height: unset; + border-radius: 2px; + border-color: #EEE; + background-color: #fff; + &:hover{ + border-color: #EEE; + } } - } - .custom__control--is-focused { - border-color: #eee; - box-shadow: unset; - &:hover { - border-color: #eee; - } - } - .custom__value-container { - height: 100%; - padding: 0 10px; - } - .custom__placeholder, - .custom__single-value { - margin: 0; - } - .custom__single-value { - font-size: 13px; - color: #45576f; - font-weight: 400; - } - .custom__placeholder { - font-size: 13px; - color: #bbbbbb; - font-weight: 400; - } - .custom__indicator { - padding: 0; - svg { - display: none; - } - } - .custom__clear-indicator { - width: 30px; - height: 100%; - background: url(../../public/static/images/common/select_del.svg) no-repeat center; - background-size: 8px 8px; - } - .custom__dropdown-indicator { - width: 30px; - height: 100%; - background: url(../../public/static/images/common/select_light_arr.svg) no-repeat center; - } + .custom__control--is-focused{ + border-color: #EEE; + box-shadow: unset; + &:hover{ + border-color: #EEE; - .custom__menu { - margin: 1px 0; - border-radius: 2px; - overflow: hidden; - } - .custom__menu-list { - padding: 0; - } - .custom__option { - font-size: 13px; - padding: 7px 10px; - color: #45576f; - } - .custom__option--is-selected { - color: #fff; - } - // disable - &.custom--is-disabled { - .custom__control { - background-color: #fafafa; + } } - .custom__single-value { - color: #999999; + .custom__value-container { + height: 100%; + padding: 0 10px; + } + .custom__placeholder, + .custom__single-value{ + margin: 0; + } + .custom__single-value{ + font-size: 13px; + color: #45576F; + font-weight: 400; + } + .custom__placeholder{ + font-size: 13px; + color: #bbbbbb; + font-weight: 400; + } + .custom__indicator{ + padding: 0; + svg{ + display: none; + } + } + .custom__clear-indicator{ + width: 30px; + height: 100%; + background: url(../../public/static/images/common/select_del.svg) no-repeat center; + background-size: 8px 8px; + } + .custom__dropdown-indicator{ + width: 30px; + height: 100%; + background: url(../../public/static/images/common/select_light_arr.svg) no-repeat center; + } + + .custom__menu { + margin: 1px 0; + border-radius: 2px; + overflow: hidden; + } + .custom__menu-list { + padding: 0; + } + .custom__option{ + font-size: 13px; + padding: 7px 10px; + color: #45576F; + } + .custom__option--is-selected{ + color: #fff; + } + // disable + &.custom--is-disabled{ + .custom__control{ + background-color: #FAFAFA ; + } + .custom__single-value{ + color: #999999; + } } - } } // toggle .toggle-btn { - position: relative; - display: inline-block; - width: 55px; - height: 20px; - input { - display: none; - } + position: relative; + display: inline-block; + width: 55px; + height: 20px; + input { + display: none; + } } .slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: #454545; - transition: 0.4s; - border-radius: 10px; - text-align: center; - line-height: 20px; - color: white; - font-size: 12px; - font-weight: 400; - &:after { - content: 'OFF'; position: absolute; - right: 7px; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #454545; + transition: .4s; + border-radius: 10px; + text-align: center; + line-height: 20px; color: white; font-size: 12px; font-weight: 400; - } - &:before { - position: absolute; - content: ''; - height: 16px; - width: 16px; - left: 2px; - bottom: 2px; - background-color: white; - transition: 0.4s; - border-radius: 50%; - } + &:after { + content: 'OFF'; + position: absolute; + right: 7px; + color: white; + font-size: 12px; + font-weight: 400; + } + &:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 2px; + bottom: 2px; + background-color: white; + transition: .4s; + border-radius: 50%; + } } input:checked + .slider { - background-color: #2563eb; - &:after { - content: 'ON'; - left: 10px; - right: auto; - } - &:before { - transform: translateX(35px); - } -} + background-color: #2563EB; + &:after { + content: 'ON'; + left: 10px; + right: auto; + } + &:before { + transform: translateX(35px); + } +} \ No newline at end of file From 7e144ec32073d3fdf499dfaedbb963bc54fd602f Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 18 Nov 2024 18:04:34 +0900 Subject: [PATCH 092/200] =?UTF-8?q?=F0=9F=9A=A8chore:=20Sync=20Sass?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/_contents.scss | 2926 +++++++++++++++++-------------------- 1 file changed, 1319 insertions(+), 1607 deletions(-) diff --git a/src/styles/_contents.scss b/src/styles/_contents.scss index 446e003f..08b40e93 100644 --- a/src/styles/_contents.scss +++ b/src/styles/_contents.scss @@ -17,1735 +17,1447 @@ // } // } // CanvasMenu -.canvas-menu-wrap { - position: fixed; - top: 46px; - left: 0; - display: block; - width: 100%; - min-width: 1280px; - padding-bottom: 0; - background-color: #383838; - transition: padding 0.17s ease-in-out; - z-index: 999; - - .canvas-menu-inner { - position: relative; - display: flex; - align-items: center; - padding: 0 40px 0 20px; - background-color: #2c2c2c; - height: 46.8px; - z-index: 999; - - .canvas-menu-list { - display: flex; - align-items: center; - height: 100%; - - .canvas-menu-item { - display: flex; - align-items: center; - height: 100%; - - button { - display: flex; - align-items: center; - font-size: 12px; - height: 100%; - color: #fff; - font-weight: 600; - padding: 15px 20px; - opacity: 0.55; - transition: all 0.17s ease-in-out; - - .menu-icon { - display: block; - width: 14px; - height: 14px; - background-repeat: no-repeat; - background-position: center; - background-size: contain; - margin-right: 10px; - - &.con00 { - background-image: url(/static/images/canvas/menu_icon00.svg); - } - - &.con01 { - background-image: url(/static/images/canvas/menu_icon01.svg); - } - - &.con02 { - background-image: url(/static/images/canvas/menu_icon02.svg); - } - - &.con03 { - background-image: url(/static/images/canvas/menu_icon03.svg); - } - - &.con04 { - background-image: url(/static/images/canvas/menu_icon04.svg); - } - - &.con05 { - background-image: url(/static/images/canvas/menu_icon05.svg); - } - - &.con06 { - background-image: url(/static/images/canvas/menu_icon06.svg); - } - } - } - - &.active { - background-color: #383838; - - button { - opacity: 1; - } - } - } - } - - .canvas-side-btn-wrap { - display: flex; - align-items: center; - margin-left: auto; - - .select-box { - width: 124px; - margin: 0 5px; - height: 30px; - - > div { - width: 100%; - } - } - - .btn-from { - display: flex; - align-items: center; - gap: 5px; - - button { - display: block; - width: 30px; - height: 30px; - border-radius: 2px; - background-color: #3d3d3d; - background-position: center; - background-repeat: no-repeat; - background-size: 15px 15px; - transition: all 0.17s ease-in-out; - - &.btn01 { - background-image: url(../../public/static/images/canvas/side_icon03.svg); - } - - &.btn02 { - background-image: url(../../public/static/images/canvas/side_icon02.svg); - } - - &.btn03 { - background-image: url(../../public/static/images/canvas/side_icon01.svg); - } - - &.btn04 { - background-image: url(../../public/static/images/canvas/side_icon04.svg); - } - - &.btn05 { - background-image: url(../../public/static/images/canvas/side_icon05.svg); - } - - &.btn06 { - background-image: url(../../public/static/images/canvas/side_icon06.svg); - } - - &.btn07 { - background-image: url(../../public/static/images/canvas/side_icon07.svg); - } - - &.btn08 { - background-image: url(../../public/static/images/canvas/side_icon08.svg); - } - - &.btn09 { - background-image: url(../../public/static/images/canvas/side_icon09.svg); - } - - &.btn10 { - background-image: url(../../public/static/images/canvas/side_icon10.svg); - background-size: 15px 14px; - } - - &:hover { - background-color: #1083e3; - } - - &.active { - background-color: #1083e3; - } - } - } - - .ico-btn-from { - display: flex; - align-items: center; - gap: 5px; - - button { - .ico { - display: block; - width: 15px; - height: 15px; - background-repeat: no-repeat; - background-position: center; - background-size: contain; - - &.ico01 { - background-image: url(../../public/static/images/canvas/ico-flx01.svg); - } - - &.ico02 { - background-image: url(../../public/static/images/canvas/ico-flx02.svg); - } - - &.ico03 { - background-image: url(../../public/static/images/canvas/ico-flx03.svg); - } - - &.ico04 { - background-image: url(../../public/static/images/canvas/ico-flx04.svg); - } - } - - .name { - font-size: 12px; - color: #fff; - } - } - - &.form06 { - .name { - font-size: 13px; - } - } - } - - .vertical-horizontal { - display: flex; - min-width: 170px; - height: 28px; - margin-right: 5px; - border-radius: 2px; - background: #373737; - line-height: 28px; - overflow: hidden; - - span { - padding: 0 10px; - font-size: 13px; - color: #fff; - } - - button { - margin-left: auto; - height: 100%; - background-color: #4b4b4b; - font-size: 13px; - font-weight: 400; - color: #fff; - padding: 0 7.5px; - transition: all 0.17s ease-in-out; - } - - &.on { - button { - background-color: #1083e3; - } - } - } - - .size-control { - display: flex; - align-items: center; - justify-content: center; - gap: 10px; - background-color: #3d3d3d; - border-radius: 2px; - width: 100px; - height: 30px; - margin: 0 5px; - - span { - font-size: 13px; - color: #fff; - cursor: pointer; - } - - .control-btn { - display: block; - width: 12px; - height: 12px; - background-repeat: no-repeat; - background-size: cover; - background-position: center; - - &.minus { - background-image: url(../../public/static/images/canvas/minus.svg); - } - - &.plus { - background-image: url(../../public/static/images/canvas/plus.svg); - } - } - } - } - } - - .canvas-depth2-wrap { - position: absolute; - top: -100%; +.canvas-menu-wrap{ + position: fixed; + top: 46px; left: 0; - background-color: #383838; + display: block; width: 100%; - height: 50px; - transition: all 0.17s ease-in-out; - - .canvas-depth2-inner { - display: flex; - align-items: center; - padding: 0 40px; - height: 100%; - - .canvas-depth2-list { + min-width: 1280px; + padding-bottom: 0; + background-color: #383838; + transition: padding .17s ease-in-out; + z-index: 999; + .canvas-menu-inner{ + position: relative; display: flex; align-items: center; - height: 100%; - - .canvas-depth2-item { - display: flex; - align-items: center; - margin-right: 26px; - height: 100%; - - button { - position: relative; - opacity: 0.55; - color: #fff; - font-size: 12px; - font-weight: normal; + padding: 0 40px 0 20px; + background-color: #2C2C2C; + height: 46.8px; + z-index: 999; + .canvas-menu-list{ + display: flex; + align-items: center; height: 100%; - padding-right: 12px; - } - - &.active { - button { - opacity: 1; - font-weight: 600; - - &:after { - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 5px; - height: 8px; - background: url(../../public/static/images/canvas/depth2-arr.svg) no-repeat center; - } + .canvas-menu-item{ + display: flex; + align-items: center; + height: 100%; + button{ + display: flex; + align-items: center; + font-size: 12px; + height: 100%; + color: #fff; + font-weight: 600; + padding: 15px 20px; + opacity: 0.55; + transition: all .17s ease-in-out; + .menu-icon{ + display: block; + width: 14px; + height: 14px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + margin-right: 10px; + &.con00{background-image: url(/static/images/canvas/menu_icon00.svg);} + &.con01{background-image: url(/static/images/canvas/menu_icon01.svg);} + &.con02{background-image: url(/static/images/canvas/menu_icon02.svg);} + &.con03{background-image: url(/static/images/canvas/menu_icon03.svg);} + &.con04{background-image: url(/static/images/canvas/menu_icon04.svg);} + &.con05{background-image: url(/static/images/canvas/menu_icon05.svg);} + &.con06{background-image: url(/static/images/canvas/menu_icon06.svg);} + } + } + &.active{ + background-color: #383838; + button{ + opacity: 1; + } + } } - } } - } - - .canvas-depth2-btn-list { - display: flex; - align-items: center; - margin-left: auto; - height: 100%; - - .depth2-btn-box { - display: flex; - align-items: center; - margin-right: 34px; - height: 100%; - transition: all 0.17s ease-in-out; - - button { - position: relative; - font-size: 12px; - font-weight: 400; + .canvas-side-btn-wrap{ + display: flex; + align-items: center; + margin-left: auto; + .select-box{ + width: 124px; + margin: 0 5px; + height: 30px; + > div{ + width: 100%; + } + } + .btn-from{ + display: flex; + align-items: center; + gap: 5px; + button{ + display: block; + width: 30px; + height: 30px; + border-radius: 2px; + background-color: #3D3D3D; + background-position: center; + background-repeat: no-repeat; + background-size: 15px 15px; + transition: all .17s ease-in-out; + &.btn01{background-image: url(../../public/static/images/canvas/side_icon03.svg);} + &.btn02{background-image: url(../../public/static/images/canvas/side_icon02.svg);} + &.btn03{background-image: url(../../public/static/images/canvas/side_icon01.svg);} + &.btn04{background-image: url(../../public/static/images/canvas/side_icon04.svg);} + &.btn05{background-image: url(../../public/static/images/canvas/side_icon05.svg);} + &.btn06{background-image: url(../../public/static/images/canvas/side_icon06.svg);} + &.btn07{background-image: url(../../public/static/images/canvas/side_icon07.svg);} + &.btn08{background-image: url(../../public/static/images/canvas/side_icon08.svg);} + &.btn09{background-image: url(../../public/static/images/canvas/side_icon09.svg);} + &.btn10{background-image: url(../../public/static/images/canvas/side_icon10.svg); background-size: 15px 14px;} + &:hover{ + background-color: #1083E3; + } + &.active{ + background-color: #1083E3; + } + } + } + .ico-btn-from{ + display: flex; + align-items: center; + gap: 5px; + button{ + .ico{ + display: block; + width: 15px; + height: 15px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + &.ico01{background-image: url(../../public/static/images/canvas/ico-flx01.svg);} + &.ico02{background-image: url(../../public/static/images/canvas/ico-flx02.svg);} + &.ico03{background-image: url(../../public/static/images/canvas/ico-flx03.svg);} + &.ico04{background-image: url(../../public/static/images/canvas/ico-flx04.svg);} + } + .name{ + font-size: 12px; + color: #fff; + } + } + &.form06{ + .name{ + font-size: 13px; + } + } + } + .vertical-horizontal{ + display: flex; + min-width: 170px; + height: 28px; + margin-right: 5px; + border-radius: 2px; + background: #373737; + line-height: 28px; + overflow: hidden; + span{ + padding: 0 10px; + font-size: 13px; + color: #fff; + } + button{ + margin-left: auto; + height: 100%; + background-color: #4B4B4B; + font-size: 13px; + font-weight: 400; + color: #fff; + padding: 0 7.5px; + transition: all .17s ease-in-out; + } + &.on{ + button{ + background-color: #1083E3; + } + } + } + .size-control{ + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + background-color: #3D3D3D; + border-radius: 2px; + width: 100px; + height: 30px; + margin: 0 5px; + span{ + font-size: 13px; + color: #fff; + cursor: pointer; + } + .control-btn{ + display: block; + width: 12px; + height: 12px; + background-repeat: no-repeat; + background-size: cover; + background-position: center; + &.minus{ + background-image: url(../../public/static/images/canvas/minus.svg); + } + &.plus{ + background-image: url(../../public/static/images/canvas/plus.svg); + } + } + } + } + } + .canvas-depth2-wrap{ + position: absolute; + top: -100%; + left: 0; + background-color: #383838; + width: 100%; + height: 50px; + transition: all .17s ease-in-out; + .canvas-depth2-inner{ + display: flex; + align-items: center; + padding: 0 40px; height: 100%; - color: #fff; - padding-right: 12px; - - &:after { - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 5px; - height: 8px; - background: url(../../public/static/images/canvas/depth2-arr.svg) no-repeat center; + .canvas-depth2-list{ + display: flex; + align-items: center ; + height: 100%; + .canvas-depth2-item{ + display: flex; + align-items: center; + margin-right: 26px; + height: 100%; + button{ + position: relative; + opacity: 0.55; + color: #fff; + font-size: 12px; + font-weight: normal; + height: 100%; + padding-right: 12px; + } + &.active{ + button{ + opacity: 1; + font-weight: 600; + &:after{ + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 5px; + height: 8px; + background: url(../../public/static/images/canvas/depth2-arr.svg) no-repeat center; + } + } + } + } + } + .canvas-depth2-btn-list{ + display: flex; + align-items: center; + margin-left: auto; + height: 100%; + .depth2-btn-box{ + display: flex; + align-items: center; + margin-right: 34px; + height: 100%; + transition: all .17s ease-in-out; + button{ + position: relative; + font-size: 12px; + font-weight: 400; + height: 100%; + color: #fff; + padding-right: 12px; + &:after{ + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 5px; + height: 8px; + background: url(../../public/static/images/canvas/depth2-arr.svg) no-repeat center; + } + } + &:last-child{ + margin-right: 0; + } + &.mouse{ + opacity: 0.55; + } + } } - } - - &:last-child { - margin-right: 0; - } - - &.mouse { - opacity: 0.55; - } } - } + &.active{ + top: 47px; + } } - - &.active { - top: 47px; + &.active{ + padding-bottom: 50px; } - } - - &.active { - padding-bottom: 50px; - } } // canvas-layout -.canvas-content { - padding-top: 46.8px; - transition: all 0.17s ease-in-out; - - .canvas-frame { - height: calc(100vh - 129.3px); - } - - &.active { - padding-top: calc(46.8px + 50px); - - .canvas-frame { - height: calc(100vh - 179.4px); +.canvas-content{ + padding-top: 46.8px; + transition: all .17s ease-in-out; + .canvas-frame{ + height: calc(100vh - 129.3px); + } + &.active{ + padding-top: calc(46.8px + 50px); + .canvas-frame{ + height: calc(100vh - 179.4px); + } } - } } - -.canvas-layout { - padding-top: 37px; - - .canvas-page-list { - position: fixed; - top: 92.8px; - left: 0; - display: flex; - background-color: #1c1c1c; - border-top: 1px solid #000; - width: 100%; - min-width: 1280px; - transition: all 0.17s ease-in-out; - z-index: 99; - - &.active { - top: calc(92.8px + 50px); - } - - .canvas-plane-wrap { - display: flex; - align-items: center; - max-width: calc(100% - 45px); - - .canvas-page-box { +.canvas-layout{ + padding-top: 37px; + .canvas-page-list{ + position: fixed; + top: 92.8px; + left: 0; display: flex; - align-items: center; - background-color: #1c1c1c; - padding: 9.6px 20px; - border-right: 1px solid #000; - min-width: 0; - transition: all 0.17s ease-in-out; - - span { - display: flex; - align-items: center; - width: 100%; - font-size: 12px; - font-family: 'Pretendard', sans-serif; - color: #aaa; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; + background-color: #1C1C1C; + border-top: 1px solid #000; + width: 100%; + min-width: 1280px; + transition: all .17s ease-in-out; + z-index: 99; + &.active{ + top: calc(92.8px + 50px); } - - .close { - flex: none; - display: block; - width: 7px; - height: 8px; - margin-left: 15px; - background: url(../../public/static/images/canvas/plan_close_gray.svg) no-repeat center; - background-size: cover; + .canvas-plane-wrap{ + display: flex; + align-items: center; + max-width: calc(100% - 45px); + .canvas-page-box{ + display: flex; + align-items: center; + background-color: #1c1c1c; + padding: 9.6px 20px; + border-right:1px solid #000; + min-width: 0; + transition: all .17s ease-in-out; + span{ + display: flex; + align-items: center; + width: 100%; + font-size: 12px; + font-family: 'Pretendard', sans-serif; + color: #AAA; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + .close{ + flex: none; + display: block; + width: 7px; + height: 8px; + margin-left: 15px; + background: url(../../public/static/images/canvas/plan_close_gray.svg)no-repeat center; + background-size: cover; + } + &.on{ + background-color: #fff; + span{ + font-weight: 600; + color: #101010; + } + .close{ + background: url(../../public/static/images/canvas/plan_close_black.svg)no-repeat center; + } + &:hover{ + background-color: #fff; + } + } + &:hover{ + background-color: #000; + } + } } - - &.on { - background-color: #fff; - - span { - font-weight: 600; - color: #101010; - } - - .close { - background: url(../../public/static/images/canvas/plan_close_black.svg) no-repeat center; - } - - &:hover { - background-color: #fff; - } + .plane-add{ + display: flex; + align-items: center; + justify-content: center; + width: 45px; + padding: 13.5px 0; + background-color: #1C1C1C; + border-right: 1px solid #000; + transition: all .17s ease-in-out; + span{ + display: block; + width: 9px; + height: 9px; + background: url(../../public/static/images/canvas/plane_add.svg)no-repeat center; + background-size: cover; + } + &:hover{ + background-color: #000; + } } - - &:hover { - background-color: #000; - } - } } - - .plane-add { - display: flex; - align-items: center; - justify-content: center; - width: 45px; - padding: 13.5px 0; - background-color: #1c1c1c; - border-right: 1px solid #000; - transition: all 0.17s ease-in-out; - - span { - display: block; - width: 9px; - height: 9px; - background: url(../../public/static/images/canvas/plane_add.svg) no-repeat center; - background-size: cover; - } - - &:hover { - background-color: #000; - } - } - } } -.canvas-frame { - position: relative; - // height: calc(100% - 36.5px); - background-color: #f4f4f7; - overflow: auto; - transition: all 0.17s ease-in-out; - // &::-webkit-scrollbar { - // width: 10px; - // height: 10px; - // background-color: #fff; - // } - // &::-webkit-scrollbar-thumb { - // background-color: #C1CCD7; - // border-radius: 30px; - // } - // &::-webkit-scrollbar-track { - // background-color: #fff; - // } - .canvas-container { - margin: 0 auto; - background-color: #fff; - } - - canvas { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } +.canvas-frame{ + position: relative; + // height: calc(100% - 36.5px); + background-color: #F4F4F7; + overflow: auto; + transition: all .17s ease-in-out; + // &::-webkit-scrollbar { + // width: 10px; + // height: 10px; + // background-color: #fff; + // } + // &::-webkit-scrollbar-thumb { + // background-color: #C1CCD7; + // border-radius: 30px; + // } + // &::-webkit-scrollbar-track { + // background-color: #fff; + // } + .canvas-container{ + margin: 0 auto; + background-color: #fff; + } + canvas{ + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } } // sub-page -.sub-header { - position: fixed; - top: 46px; - left: 0; - width: 100%; - min-width: 1280px; - height: 46px; - border-bottom: 1px solid #000; - background: #2c2c2c; - z-index: 999; - - .sub-header-inner { - display: flex; - align-items: center; - height: 100%; - padding: 0 100px; - - .sub-header-title-wrap { - display: flex; - align-items: center; - - .title-item { - position: relative; - padding: 0 24px; - - a { - display: flex; - align-items: center; - - .icon { - width: 22px; - height: 22px; - margin-right: 8px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - - &.drawing { - background-image: url(../../public/static/images/main/drawing_icon.svg); - } - } - } - - &:after { - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 1px; - height: 16px; - background-color: #d9d9d9; - } - - &:first-child { - padding-left: 0; - } - - &:last-child { - padding-right: 0; - - &:after { - display: none; - } - } - } - } - - .sub-header-title { - font-size: 16px; - color: #fff; - font-weight: 600; - } - - .sub-header-location { - margin-left: auto; - display: flex; - align-items: center; - - .location-item { - position: relative; +.sub-header{ + position: fixed; + top: 46px; + left: 0; + width: 100%; + min-width: 1280px; + height: 46px; + border-bottom: 1px solid #000; + background: #2C2C2C; + z-index: 999; + .sub-header-inner{ display: flex; align-items: center; - padding: 0 10px; - - span { - display: flex; - font-size: 12px; - color: #aaa; - font-weight: normal; - cursor: default; + height: 100%; + padding: 0 100px; + .sub-header-title-wrap{ + display: flex; + align-items: center; + .title-item{ + position: relative; + padding: 0 24px; + a{ + display: flex; + align-items: center; + .icon{ + width: 22px; + height: 22px; + margin-right: 8px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + &.drawing{background-image: url(../../public/static/images/main/drawing_icon.svg);} + } + } + &:after{ + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 1px; + height: 16px; + background-color: #D9D9D9; + } + &:first-child{ + padding-left: 0; + } + &:last-child{ + padding-right: 0; + &:after{ + display: none; + } + } + } } - - &:after { - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 4px; - height: 6px; - background: url(../../public/static/images/main/loaction_arr.svg) no-repeat center; - } - - &:first-child { - padding-left: 0; - } - - &:last-child { - padding-right: 0; - - span { + .sub-header-title{ + font-size: 16px; color: #fff; - } - - &:after { - display: none; - } + font-weight: 600; + } + .sub-header-location{ + margin-left: auto; + display: flex; + align-items: center; + .location-item{ + position: relative; + display: flex; + align-items: center; + padding: 0 10px; + span{ + display: flex; + font-size: 12px; + color: #AAA; + font-weight: normal; + cursor: default; + } + &:after{ + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 4px; + height: 6px; + background: url(../../public/static/images/main/loaction_arr.svg)no-repeat center; + } + &:first-child{ + padding-left: 0; + } + &:last-child{ + padding-right: 0; + span{ + color: #fff; + } + &:after{ + display: none; + } + } + } } - } } - } } // sub content -.sub-content { - padding-top: 46px; - - .sub-content-inner { - max-width: 1760px; - margin: 0 auto; - padding: 20px 20px 0; - - .sub-content-box { - margin-bottom: 20px; - - &:last-child { - margin-bottom: 0; - } +.sub-content{ + padding-top: 46px; + .sub-content-inner{ + max-width: 1760px; + margin: 0 auto; + padding: 20px 20px 0; + .sub-content-box{ + margin-bottom: 20px; + &:last-child{ + margin-bottom: 0; + } + } } - } - - &.estimate { - display: flex; - flex-direction: column; - padding-top: 0; - - .sub-content-inner { - flex: 1; - width: 100%; + &.estimate{ + display: flex; + flex-direction: column; + padding-top: 0; + .sub-content-inner{ + flex: 1; + width: 100%; + } } - } } - -.sub-table-box { - padding: 20px; - border-radius: 6px; - border: 1px solid #e9eaed; - background: #fff; - box-shadow: 0px 3px 30px 0px rgba(0, 0, 0, 0.02); - - .table-box-title-wrap { - display: flex; - align-items: center; - margin-bottom: 15px; - - .title-wrap { - display: flex; - align-items: center; - - h3 { - display: block; - font-size: 15px; - color: #101010; - font-weight: 600; - margin-right: 14px; - - &.product { - margin-right: 10px; - } - } - - .product_tit { - position: relative; - font-size: 15px; - font-weight: 600; - color: #1083e3; - padding-left: 10px; - - &::before { - content: ''; - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); - width: 1px; - height: 11px; - background-color: #d9d9d9; - } - } - - .option { - padding-left: 5px; - font-size: 13px; - color: #101010; - font-weight: 400; - } - - .info-wrap { +.sub-table-box{ + padding: 20px; + border-radius: 6px; + border: 1px solid #E9EAED; + background: #FFF; + box-shadow: 0px 3px 30px 0px rgba(0, 0, 0, 0.02); + .table-box-title-wrap{ display: flex; align-items: center; - - li { - position: relative; - padding: 0 6px; - font-size: 12px; - color: #101010; - font-weight: normal; - - span { - font-weight: 600; - - &.red { - color: #e23d70; + margin-bottom: 15px; + .title-wrap{ + display: flex; + align-items: center; + h3{ + display: block; + font-size: 15px; + color: #101010; + font-weight: 600; + margin-right: 14px; + &.product{ + margin-right: 10px; + } } - } - - &:after { - content: ''; - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 1px; - height: 11px; - background-color: #d9d9d9; - } - - &:first-child { - padding-left: 0; - } - - &:last-child { - padding-right: 0; - - &::after { - display: none; + .product_tit{ + position: relative; + font-size: 15px; + font-weight: 600; + color: #1083E3; + padding-left: 10px; + &::before{ + content: ''; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + width: 1px; + height: 11px; + background-color: #D9D9D9; + } + } + .option{ + padding-left: 5px; + font-size: 13px; + color: #101010; + font-weight: 400; + } + .info-wrap{ + display: flex; + align-items: center; + li{ + position: relative; + padding: 0 6px; + font-size: 12px; + color: #101010; + font-weight: normal; + span{ + font-weight: 600; + &.red{ + color: #E23D70; + } + } + &:after{ + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 1px; + height: 11px; + background-color: #D9D9D9; + } + &:first-child{padding-left: 0;} + &:last-child{padding-right: 0;&::after{display: none;}} + } } - } } - } } - } - - .left-unit-box { - margin-left: auto; - display: flex; - align-items: center; - } - - .promise-gudie { - display: block; - font-size: 13px; - font-weight: 700; - color: #101010; - margin-bottom: 20px; - } - - .important { - color: #f00; - } - - .sub-center-footer { - display: flex; - align-items: center; - justify-content: center; - margin-top: 20px; - } - - .sub-right-footer { - display: flex; - align-items: center; - justify-content: flex-end; - margin-top: 20px; - } -} - -.pagination-wrap { - margin-top: 24px; -} - -.infomation-wrap { - margin-bottom: 30px; -} - -.infomation-box-wrap { - display: flex; - gap: 10px; - - .sub-table-box { - flex: 1; - } - - .info-title { - font-size: 14px; - font-weight: 500; - color: #344356; - margin-bottom: 10px; - } - - .info-inner { - position: relative; - font-size: 13px; - color: #344356; - - .copy-ico { - position: absolute; - bottom: 0; - right: 0; - width: 16px; - height: 16px; - background: url(../../public/static/images/sub/copy_ico.svg) no-repeat center; - background-size: cover; + .left-unit-box{ + margin-left: auto; + display: flex; + align-items: center; + } + .promise-gudie{ + display: block; + font-size: 13px; + font-weight: 700; + color: #101010; + margin-bottom: 20px; + } + .important{ + color: #f00; + } + .sub-center-footer{ + display: flex; + align-items: center; + justify-content: center; + margin-top: 20px; + } + .sub-right-footer{ + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: 20px; + } +} +.pagination-wrap{ + margin-top: 24px; +} + +.infomation-wrap{ + margin-bottom: 30px; +} + +.infomation-box-wrap{ + display: flex; + gap: 10px; + .sub-table-box{ + flex: 1 ; + } + .info-title{ + font-size: 14px; + font-weight: 500; + color: #344356; + margin-bottom: 10px; + } + .info-inner{ + position: relative; + font-size: 13px; + color: #344356; + .copy-ico{ + position: absolute; + bottom: 0; + right: 0; + width: 16px; + height: 16px; + background: url(../../public/static/images/sub/copy_ico.svg)no-repeat center; + background-size: cover; + } } - } } // 견적서 -.estimate-list-wrap { - display: flex; - align-items: center; - margin-bottom: 10px; - - &.one { - .estimate-box { - &:last-child { - min-width: unset; - } - } - } - - .estimate-box { - flex: 1; +.estimate-list-wrap{ display: flex; align-items: center; - - &:last-child { - flex: none; - min-width: 220px; + margin-bottom: 10px; + &.one{ + .estimate-box{ + &:last-child{ + min-width: unset; + } + } } - - .estimate-tit { - width: 105px; - height: 30px; - line-height: 30px; - background-color: #f4f4f7; - border-radius: 100px; - text-align: center; - font-size: 13px; - font-weight: 500; - color: #344356; + .estimate-box{ + flex: 1 ; + display: flex; + align-items: center; + &:last-child{ + flex: none; + min-width: 220px; + } + .estimate-tit{ + width: 105px; + height: 30px; + line-height: 30px; + background-color: #F4F4F7; + border-radius: 100px; + text-align: center; + font-size: 13px; + font-weight: 500; + color: #344356; + } + .estimate-name{ + font-size: 13px; + color: #344356; + margin-left: 14px; + font-weight: 400; + &.blue{ + font-size: 16px; + font-weight: 700; + color: #1083E3; + } + &.red{ + font-size: 16px; + font-weight: 700; + color: #D72A2A; + } + } } - - .estimate-name { - font-size: 13px; - color: #344356; - margin-left: 14px; - font-weight: 400; - - &.blue { - font-size: 16px; - font-weight: 700; - color: #1083e3; - } - - &.red { - font-size: 16px; - font-weight: 700; - color: #d72a2a; - } + &:last-child{ + margin-bottom: 0; } - } - - &:last-child { - margin-bottom: 0; - } } // file drag box -.drag-file-box { - padding: 10px; - - .btn-area { - padding-bottom: 15px; - border-bottom: 1px solid #ecf0f4; - - .file-upload { - display: inline-block; - height: 30px; - background-color: #94a0ad; - padding: 0 10px; - border-radius: 2px; - font-size: 13px; - line-height: 30px; - color: #fff; - font-weight: 500; - cursor: pointer; - transition: background 0.15s ease-in-out; - - &:hover { - background-color: #607f9a; - } - } - } - - .drag-file-area { - position: relative; - margin-top: 15px; - - p { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - font-size: 13px; - color: #ccc; - font-weight: 400; - cursor: default; - } - } - - .file-list { - .file-item { - margin-bottom: 15px; - - span { - position: relative; - font-size: 13px; - color: #45576f; - font-weight: 400; - white-space: nowrap; - padding-right: 55px; - - button { - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); - width: 15px; - height: 15px; - background: url(../../public/static/images/sub/file_delete.svg) no-repeat center; - background-size: cover; +.drag-file-box{ + padding: 10px; + .btn-area{ + padding-bottom: 15px; + border-bottom: 1px solid #ECF0F4; + .file-upload{ + display: inline-block; + height: 30px; + background-color: #94A0AD; + padding: 0 10px; + border-radius: 2px; + font-size: 13px; + line-height: 30px; + color: #fff; + font-weight: 500; + cursor: pointer; + transition: background .15s ease-in-out; + &:hover{ + background-color: #607F9A; + } + } + } + .drag-file-area{ + position: relative; + margin-top: 15px; + p{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 13px; + color: #ccc; + font-weight: 400; + cursor: default; + } + } + .file-list{ + .file-item{ + margin-bottom: 15px; + span{ + position: relative; + font-size: 13px; + color: #45576F; + font-weight: 400; + white-space: nowrap; + padding-right: 55px; + cursor: pointer; + button{ + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 15px; + height: 15px; + background: url(../../public/static/images/sub/file_delete.svg)no-repeat center; + background-size: cover; + } + } + &:last-child{ + margin-bottom: 0; + } } - } - - &:last-child { - margin-bottom: 0; - } } - } } -.estimate-arr-btn { - display: block; - width: 20px; - height: 20px; - background-color: #94a0ad; - border: 1px solid #94a0ad; - background-position: center; - background-repeat: no-repeat; - background-image: url(../../public/static/images/canvas/estiment_arr.svg); - background-size: 11px 7px; - border-radius: 2px; - - &.up { - rotate: 180deg; - } - - &.on { - background-color: #fff; - border-color: #c2d0dd; - background-image: url(../../public/static/images/canvas/estiment_arr_color.svg); - } -} - -.estimate-check-wrap { - .estimate-check-inner { +.estimate-arr-btn{ display: block; - } - - &.hide { - border-bottom: 1px solid #ecf0f4; - margin-bottom: 15px; - - .estimate-check-inner { - display: none; + width: 20px; + height: 20px; + background-color: #94A0AD; + border: 1px solid #94A0AD; + background-position: center; + background-repeat: no-repeat; + background-image: url(../../public/static/images/canvas/estiment_arr.svg); + background-size: 11px 7px; + border-radius: 2px; + &.up{ + rotate: 180deg; + } + &.on{ + background-color: #fff; + border-color: #C2D0DD; + background-image: url(../../public/static/images/canvas/estiment_arr_color.svg) } - } } - -.special-note-check-wrap { - display: grid; - grid-template-columns: repeat(5, 1fr); - border-radius: 3px; - margin-bottom: 30px; - - .special-note-check-item { - padding: 14px 10px; - border: 1px solid #ecf0f4; - margin-top: -1px; - margin-right: -1px; - - &.act { - background-color: #f7f9fa; +.estimate-check-wrap{ + .estimate-check-inner{ + display: block; } - } -} - -.calculation-estimate { - border: 1px solid #ecf0f4; - border-radius: 3px; - padding: 24px; - max-height: 350px; - overflow-y: auto; - margin-bottom: 30px; - - dl { - margin-bottom: 35px; - - &:last-child { - margin-bottom: 0; - } - - dt { - font-size: 13px; - font-weight: 600; - color: #1083e3; - margin-bottom: 15px; - } - - dd { - font-size: 12px; - font-weight: 400; - color: #45576f; - margin-bottom: 8px; - - &:last-child { - margin-bottom: 0; - } - } - } - - &::-webkit-scrollbar { - width: 4px; - background-color: transparent; - } - - &::-webkit-scrollbar-thumb { - background-color: #d9dee2; - } - - &::-webkit-scrollbar-track { - background-color: transparent; - } -} - -.esimate-wrap { - margin-bottom: 20px; -} - -.estimate-product-option { - display: flex; - align-items: center; - margin-bottom: 15px; - - .product-price-wrap { - display: flex; - align-items: center; - - .product-price-tit { - font-size: 13px; - font-weight: 400; - color: #45576f; - margin-right: 10px; - } - - .select-wrap { - width: 110px; - } - } - - .product-edit-wrap { - display: flex; - align-items: center; - margin-left: auto; - - .product-edit-explane { - display: flex; - align-items: center; - margin-right: 15px; - - .explane-item { - position: relative; - display: flex; - align-items: center; - padding: 0 10px; - font-size: 12px; - font-weight: 400; - - span { - width: 20px; - height: 20px; - margin-right: 5px; - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - &:before { - content: ''; - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); - width: 1px; - height: 12px; - background-color: #d9d9d9; - } - - &:first-child { - padding-left: 0; - - &::before { + &.hide{ + border-bottom: 1px solid #ECF0F4; + margin-bottom: 15px; + .estimate-check-inner{ display: none; - } } - - &:last-child { - padding-right: 0; - } - - &.item01 { - color: #3bbb48; - - span { - background-image: url(../../public/static/images/sub/open_ico.svg); - } - } - - &.item02 { - color: #909000; - - span { - background-image: url(../../public/static/images/sub/change_ico.svg); - } - } - - &.item03 { - color: #0191c9; - - span { - background-image: url(../../public/static/images/sub/attachment_ico.svg); - } - } - - &.item04 { - color: #f16a6a; - - span { - background-image: url(../../public/static/images/sub/click_check_ico.svg); - } - } - } } +} - .product-edit-btn { - display: flex; - align-items: center; +.special-note-check-wrap{ + display: grid; + grid-template-columns: repeat(5, 1fr); + border-radius: 3px; + margin-bottom: 30px; + .special-note-check-item{ + padding: 14px 10px; + border: 1px solid #ECF0F4; + margin-top: -1px; + margin-right: -1px; + &.act{ + background-color: #F7F9FA; + } + } +} - button { +.calculation-estimate{ + border: 1px solid #ECF0F4; + border-radius: 3px; + padding: 24px; + max-height: 350px; + overflow-y: auto; + margin-bottom: 30px; + dl{ + margin-bottom: 35px; + &:last-child{ + margin-bottom: 0; + } + dt{ + font-size: 13px; + font-weight: 600; + color: #1083E3; + margin-bottom: 15px; + } + dd{ + font-size: 12px; + font-weight: 400; + color: #45576F; + margin-bottom: 8px; + &:last-child{ + margin-bottom: 0; + } + } + } + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #d9dee2; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } +} +.esimate-wrap{ + margin-bottom: 20px; +} + +.estimate-product-option{ + display: flex; + align-items: center; + margin-bottom: 15px; + .product-price-wrap{ display: flex; align-items: center; - - span { - width: 13px; - height: 13px; - margin-right: 5px; - background-size: cover; - - &.plus { - background: url(../../public/static/images/sub/plus_btn.svg) no-repeat center; - } - - &.minus { - background: url(../../public/static/images/sub/minus_btn.svg) no-repeat center; - } + .product-price-tit{ + font-size: 13px; + font-weight: 400; + color: #45576F; + margin-right: 10px; + } + .select-wrap{ + width: 110px; + } + } + .product-edit-wrap{ + display: flex; + align-items: center; + margin-left: auto; + .product-edit-explane{ + display: flex; + align-items: center; + margin-right: 15px; + .explane-item{ + position: relative; + display: flex; + align-items: center; + padding: 0 10px; + font-size: 12px; + font-weight: 400; + span{ + width: 20px; + height: 20px; + margin-right: 5px; + background-size: cover; + background-repeat: no-repeat; + background-position: center; + } + &:before{ + content: ''; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + width: 1px; + height: 12px; + background-color: #D9D9D9; + } + &:first-child{ + padding-left: 0; + &::before{ + display: none; + } + } + &:last-child{ + padding-right: 0; + } + &.item01{ + color: #3BBB48; + span{ + background-image: url(../../public/static/images/sub/open_ico.svg); + } + } + &.item02{ + color: #909000; + span{ + background-image: url(../../public/static/images/sub/change_ico.svg); + } + } + &.item03{ + color: #0191C9; + span{ + background-image: url(../../public/static/images/sub/attachment_ico.svg); + } + } + &.item04{ + color: #F16A6A; + span{ + background-image: url(../../public/static/images/sub/click_check_ico.svg); + } + } + } + } + .product-edit-btn{ + display: flex; + align-items: center; + button{ + display: flex; + align-items: center; + span{ + width: 13px; + height: 13px; + margin-right: 5px; + background-size: cover; + &.plus{ + background: url(../../public/static/images/sub/plus_btn.svg)no-repeat center; + } + &.minus{ + background: url(../../public/static/images/sub/minus_btn.svg)no-repeat center; + } + } + } } - } } - } } // 발전시물레이션 -.chart-wrap { - display: flex; - gap: 20px; - width: 100%; - - .sub-table-box { - height: 100%; - } - - .chart-inner { - flex: 1; - - .chart-box { - margin-bottom: 30px; - } - } - - .chart-table-wrap { +.chart-wrap{ display: flex; - flex-direction: column; - flex: none; - width: 650px; - - .sub-table-box { - flex: 1; - - &:first-child { - margin-bottom: 20px; - } + gap: 20px; + width: 100%; + .sub-table-box{ + height: 100%; + } + .chart-inner{ + flex: 1; + .chart-box{ + margin-bottom: 30px; + } + } + .chart-table-wrap{ + display: flex; + flex-direction: column; + flex: none; + width: 650px; + .sub-table-box{ + flex: 1; + &:first-child{ + margin-bottom: 20px; + } + } } - } } -.chart-month-table { - table { - table-layout: fixed; - border-collapse: collapse; - border: 1px solid #ecf0f4; - border-radius: 4px; +.chart-month-table{ + table{ + table-layout: fixed; + border-collapse:collapse; + border: 1px solid #ECF0F4; + border-radius: 4px; + thead{ + th{ + padding: 4.5px 0; + border-bottom: 1px solid #ECF0F4; + text-align: center; + font-size: 13px; + color: #45576F; + font-weight: 500; + background-color: #F8F9FA; + } + } + tbody{ + td{ + font-size: 13px; + color: #45576F; + text-align: center; + padding: 4.5px 0; + } + } + } +} - thead { - th { - padding: 4.5px 0; - border-bottom: 1px solid #ecf0f4; +.simulation-guide-wrap{ + display: flex; + padding: 20px; + .simulation-tit-wrap{ + flex: none; + padding-right: 40px; + border-right: 1px solid #EEEEEE; + span{ + display: block; + position: relative; + padding-left: 60px; + font-size: 15px; + color: #14324F; + font-weight: 600; + &::before{ + content: ''; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + width: 40px; + height: 40px; + background: url(../../public/static/images/sub/simulation_guide.svg)no-repeat center; + background-size: cover; + } + } + } + .simulation-guide-box{ + flex: 1; + padding-left: 40px; + dl{ + margin-bottom: 25px; + dt{ + font-size: 13px; + color: #101010; + font-weight: 600; + margin-bottom: 5px; + } + dd{ + font-size: 12px; + color: #45576F; + font-weight: 400; + line-height: 24px; + } + &:last-child{ + margin-bottom: 0; + } + } + ul, ol{ + list-style: unset; + } + } +} + +.module-total{ + display: flex; + align-items: center; + background-color: #F8F9FA; + padding: 9px 0; + margin-right: 4px; + border: 1px solid #ECF0F4; + border-top: none; + .total-title{ + flex: 1; text-align: center; font-size: 13px; - color: #45576f; + color: #344356; font-weight: 500; - background-color: #f8f9fa; - } } - - tbody { - td { - font-size: 13px; - color: #45576f; + .total-num{ + flex: none; + width: 121px; text-align: center; - padding: 4.5px 0; - } + font-size: 15px; + color: #344356; + font-weight: 500; } - } -} - -.simulation-guide-wrap { - display: flex; - padding: 20px; - - .simulation-tit-wrap { - flex: none; - padding-right: 40px; - border-right: 1px solid #eeeeee; - - span { - display: block; - position: relative; - padding-left: 60px; - font-size: 15px; - color: #14324f; - font-weight: 600; - - &::before { - content: ''; - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); - width: 40px; - height: 40px; - background: url(../../public/static/images/sub/simulation_guide.svg) no-repeat center; - background-size: cover; - } - } - } - - .simulation-guide-box { - flex: 1; - padding-left: 40px; - - dl { - margin-bottom: 25px; - - dt { - font-size: 13px; - color: #101010; - font-weight: 600; - margin-bottom: 5px; - } - - dd { - font-size: 12px; - color: #45576f; - font-weight: 400; - line-height: 24px; - } - - &:last-child { - margin-bottom: 0; - } - } - - ul, - ol { - list-style: unset; - } - } -} - -.module-total { - display: flex; - align-items: center; - background-color: #f8f9fa; - padding: 9px 0; - margin-right: 4px; - border: 1px solid #ecf0f4; - border-top: none; - - .total-title { - flex: 1; - text-align: center; - font-size: 13px; - color: #344356; - font-weight: 500; - } - - .total-num { - flex: none; - width: 121px; - text-align: center; - font-size: 15px; - color: #344356; - font-weight: 500; - } } // 물건상세 -.information-help-wrap { - display: flex; - padding: 24px; - background-color: #f4f4f4; - border-radius: 4px; - margin-bottom: 15px; - - .information-help-tit-wrap { - position: relative; +.information-help-wrap{ display: flex; - align-items: center; - padding-right: 40px; - border-right: 1px solid #e0e0e3; - - .help-tit-icon { - width: 40px; - height: 40px; - border-radius: 50%; - margin-right: 10px; - background: #fff url(../../public/static/images/sub/information_help.svg) no-repeat center; - background-size: 20px 20px; + padding: 24px; + background-color: #F4F4F4; + border-radius: 4px; + margin-bottom: 15px; + .information-help-tit-wrap{ + position: relative; + display: flex; + align-items: center; + padding-right: 40px; + border-right: 1px solid #E0E0E3; + .help-tit-icon{ + width: 40px; + height: 40px; + border-radius: 50%; + margin-right: 10px; + background: #fff url(../../public/static/images/sub/information_help.svg)no-repeat center; + background-size: 20px 20px; + } + .help-tit{ + font-size: 13px; + font-weight: 600; + color: #45576F; + } } - - .help-tit { - font-size: 13px; - font-weight: 600; - color: #45576f; + .information-help-guide{ + padding-left: 40px; + span{ + display: block; + font-size: 12px; + font-weight: 400; + color: #45576F; + margin-bottom: 7px; + &:last-child{ + margin-bottom: 0; + } + } } - } - - .information-help-guide { - padding-left: 40px; - - span { - display: block; - font-size: 12px; - font-weight: 400; - color: #45576f; - margin-bottom: 7px; - - &:last-child { - margin-bottom: 0; - } - } - } } -.community-search-warp { - display: flex; - flex-direction: column; - align-items: center; - padding: 10px 0 30px 0; - border-bottom: 1px solid #e5e5e5; - margin-bottom: 24px; - - .community-search-box { - position: relative; +.community-search-warp{ display: flex; + flex-direction: column; align-items: center; - width: 580px; - height: 45px; - padding: 0 45px 0 20px; - margin-bottom: 20px; - border-radius: 2px; - border: 1px solid #101010; - - .community-input { - width: 100%; - height: 100%; - font-size: 13px; - font-weight: 400; - color: #101010; - - &::placeholder { - color: #c8c8c8; - } + padding: 10px 0 30px 0; + border-bottom: 1px solid #E5E5E5; + margin-bottom: 24px; + .community-search-box{ + position: relative; + display: flex; + align-items: center; + width: 580px; + height: 45px; + padding: 0 45px 0 20px; + margin-bottom: 20px; + border-radius: 2px; + border: 1px solid #101010; + .community-input{ + width: 100%; + height: 100%; + font-size: 13px; + font-weight: 400; + color: #101010; + &::placeholder{ + color: #C8C8C8; + } + } + .community-search-ico{ + position: absolute; + top: 50%; + right: 20px; + transform: translateY(-50%); + flex: none; + width: 21px; + height: 100%; + background: url(../../public/static/images/sub/community_search.svg)no-repeat center; + background-size: 21px 21px; + z-index: 3; + } } - - .community-search-ico { - position: absolute; - top: 50%; - right: 20px; - transform: translateY(-50%); - flex: none; - width: 21px; - height: 100%; - background: url(../../public/static/images/sub/community_search.svg) no-repeat center; - background-size: 21px 21px; - z-index: 3; + .community-search-keyword{ + font-size: 13px; + font-weight: 400; + color: #45576F; + span{ + font-weight: 600; + color: #F16A6A; + } } - } - - .community-search-keyword { - font-size: 13px; - font-weight: 400; - color: #45576f; - - span { - font-weight: 600; - color: #f16a6a; - } - } } // 자료 다운로드 -.file-down-list { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 14px; - - .file-down-item { - display: flex; - align-items: center; - padding: 24px; - border-radius: 4px; - border: 1px solid #e5e5e5; - background: #fff; - transition: all 0.15s ease-in-out; - - .file-item-info { - .item-num { - display: inline-block; - padding: 6px 17.5px; - border-radius: 60px; - background-color: #f4f4f7; - font-size: 13px; - font-weight: 600; - color: #101010; - margin-bottom: 15px; - } - - .item-name { - font-size: 16px; - color: #101010; - font-weight: 500; - margin-bottom: 13px; - } - - .item-date { - font-size: 13px; - font-weight: 400; - color: #344356; - } +.file-down-list{ + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 14px; + .file-down-item{ + display: flex; + align-items: center; + padding: 24px; + border-radius: 4px; + border: 1px solid #E5E5E5; + background: #FFF; + transition: all .15s ease-in-out; + .file-item-info{ + .item-num{ + display: inline-block; + padding: 6px 17.5px; + border-radius: 60px; + background-color: #F4F4F7; + font-size: 13px; + font-weight: 600; + color: #101010; + margin-bottom: 15px; + } + .item-name{ + font-size: 16px; + color: #101010; + font-weight: 500; + margin-bottom: 13px; + } + .item-date{ + font-size: 13px; + font-weight: 400; + color: #344356; + } + } + .file-down-box{ + display: flex; + align-items: center; + flex: none; + margin-left: auto; + height: 100%; + .file-down-btn{ + width: 36px; + height: 36px; + background: url(../../public/static/images/sub/file_down_btn.svg)no-repeat center; + background-size: cover; + } + } + &:hover{ + background-color: #F4F4F7; + } } - - .file-down-box { - display: flex; - align-items: center; - flex: none; - margin-left: auto; - height: 100%; - - .file-down-btn { - width: 36px; - height: 36px; - background: url(../../public/static/images/sub/file_down_btn.svg) no-repeat center; - background-size: cover; - } - } - - &:hover { - background-color: #f4f4f7; - } - } } -.file-down-nodata { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 148px; - padding: 24px; - border-radius: 4px; - border: 1px solid #e5e5e5; - font-size: 16px; - font-weight: 500; - color: #344356; +.file-down-nodata{ + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 148px; + padding: 24px; + border-radius: 4px; + border: 1px solid #E5E5E5; + font-size: 16px; + font-weight: 500; + color: #344356; } //신규물건 등록 -.product-input-wrap { - display: flex; - align-items: center; - width: 200px; - height: 30px; - background-color: #fafafa; - border: 1px solid #eee; - padding: 0 10px; - - input { - font-size: 13px; - font-weight: 400; - color: #999999; - padding: 0; - width: 100%; - height: 100%; - flex: 1; - background-color: inherit; - } - - .product-delete { - flex: none; - display: block; - width: 15px; - height: 100%; - background: url(../../public/static/images/sub/product-del.svg) no-repeat center; - background-size: 15px 15px; - } +.product-input-wrap{ + display: flex; + align-items: center; + width: 200px; + height: 30px; + background-color: #FAFAFA; + border: 1px solid #EEE; + padding: 0 10px; + input{ + font-size: 13px; + font-weight: 400; + color: #999999; + padding: 0; + width: 100%; + height: 100%; + flex: 1 ; + background-color: inherit; + } + .product-delete{ + flex: none; + display: block; + width: 15px; + height: 100%; + background: url(../../public/static/images/sub/product-del.svg)no-repeat center; + background-size: 15px 15px; + } } @media screen and (max-width: 1800px) { - .canvas-menu-wrap { - .canvas-menu-inner { - .canvas-menu-list { - .canvas-menu-item button { - .menu-icon { - margin-right: 5px; - } - } - - .canvas-menu-item { - button { - padding: 15px 15px; - font-size: 11px; - } - } - } - } - - .canvas-depth2-wrap { - .canvas-depth2-inner { - .canvas-depth2-list { - .canvas-depth2-item { - button { - font-size: 11px; + .canvas-menu-wrap{ + .canvas-menu-inner{ + .canvas-menu-list{ + .canvas-menu-item button{ + .menu-icon{ + margin-right: 5px; + } + } + .canvas-menu-item{ + button{ + padding: 15px 15px; + font-size: 11px; + } + } } - } } - } - } - } + .canvas-depth2-wrap{ + .canvas-depth2-inner{ + .canvas-depth2-list{ + .canvas-depth2-item{ + button{ + font-size: 11px; + } + } + } + } + } + } } @media screen and (max-width: 1600px) { - .canvas-menu-wrap { - .canvas-menu-inner { - .canvas-menu-list { - .canvas-menu-item button { - .menu-icon { - display: none; - } + .canvas-menu-wrap{ + .canvas-menu-inner{ + .canvas-menu-list{ + .canvas-menu-item button{ + .menu-icon{ + display: none; + } + } + } } - } - } - } - .canvas-content { - .canvas-frame { - height: calc(100vh - 129.5px); - } - - &.active { - .canvas-frame { - height: calc(100vh - 179.5px); - } - } - } + } + .canvas-content{ + .canvas-frame{ + height: calc(100vh - 129.5px); + } + &.active{ + .canvas-frame{ + height: calc(100vh - 179.5px); + } + } + } } @media screen and (max-width: 1500px) { - .canvas-menu-wrap { - .canvas-menu-inner { - .canvas-menu-list { - .canvas-menu-item { - button { - padding: 15px 10px; - font-size: 10px; - } - } - } - - .canvas-side-btn-wrap { - .btn-from { - gap: 3px; - } - - .vertical-horizontal { - margin-right: 3px; - min-width: 150px; - } - - .select-box { - width: 100px; - margin: 0 3px; - } - - .size-control { - width: 90px; - margin: 0 3px; - } - } - } - } - .sub-header { - .sub-header-inner { - .sub-header-title { - font-size: 15px; - } - - .sub-header-title-wrap { - .title-item { - a { - .icon { - width: 20px; - height: 20px; + .canvas-menu-wrap{ + .canvas-menu-inner{ + .canvas-menu-list{ + .canvas-menu-item{ + button{ + padding: 15px 10px; + font-size: 10px; + } + } } - } + .canvas-side-btn-wrap{ + .btn-from{ + gap: 3px; + } + .vertical-horizontal{ + margin-right: 3px; + min-width: 150px; + } + .select-box{ + width: 100px; + margin: 0 3px; + } + .size-control{ + width: 90px; + margin: 0 3px; + } + } } - } } - } + .sub-header{ + .sub-header-inner{ + .sub-header-title{ + font-size: 15px; + } + .sub-header-title-wrap{ + .title-item{ + a{ + .icon{ + width: 20px; + height: 20px; + } + } + } + } + } + } + } From 776ddb00e2a091e2b74d601958a7546cc57743b9 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 18:09:16 +0900 Subject: [PATCH 093/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 74d75e63..6373a5f7 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -1117,7 +1117,7 @@ export default function Estimate({ params }) { onChangeSelect(item.dispOrder)} checked={!!selection.has(item.dispOrder)} /> From 5131b0d049ad7fd73a56bcbfd04a91356930cce4 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 18 Nov 2024 18:33:38 +0900 Subject: [PATCH 094/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 07f50ec8..0dd30512 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -12,7 +12,7 @@ const reducer = (prevState, nextState) => { } // Constants -const ESTIMATE_API_ENDPOINT = '/api/estimates' // API 엔드포인트 정의 +const ESTIMATE_API_ENDPOINT = '/api/estimate' // API 엔드포인트 정의 const defaultEstimateData = { estimateDate: new Date(), //견적일 @@ -183,13 +183,17 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredItem')) } + // console.log('최종 남은 아이템정보:::', estimateData.itemList) console.log('최종 정보::;', estimateData) - console.log('최종 남은 아이템정보:::', estimateData.itemList) + //drawingFlg null ???? //2. 상세데이터 저장 // return await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { - if (res) { + console.log('res::::::::::::', res) + if (res.status === 201) { + console.log('201:::::::::') alert(getMessage('estimate.detail.save.alertMsg')) + //어디로 보낼지 } }) } From 246bf3ea41ecc037574ffe7be5859faf2fab1ad4 Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 19 Nov 2024 09:45:32 +0900 Subject: [PATCH 095/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasMenu.jsx | 25 ++++++++++--------- .../estimate/useEstimateController.js | 3 +++ src/locales/ja.json | 2 +- src/locales/ko.json | 2 +- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 133cdfa2..27a95c90 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -35,6 +35,7 @@ import { MENU } from '@/common/common' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' import { estimateState } from '@/store/floorPlanObjectAtom' import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' +import { button } from '@nextui-org/react' export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props @@ -168,7 +169,6 @@ export default function CanvasMenu(props) { */ const handleEstimateCopy = () => { - // console.log('estimateRecoilState::', estimateRecoilState) //objectNo, planNo console.log('복사') console.log('물건정보+도면+견적서를 모두 복사') @@ -279,7 +279,6 @@ export default function CanvasMenu(props) { {getMessage('plan.menu.estimate.save')} - {/* {estimateRecoilState?.docNo != null && ( */} - {/* )} */} - + {estimateRecoilState?.docNo !== null && (sessionState.storeId === 'T01' || sessionState.storeLvl === '1') && ( + + )}
    )} diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 0dd30512..88e3efab 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -6,6 +6,7 @@ import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom import { isObjectNotEmpty } from '@/util/common-utils' import { SessionContext } from '@/app/SessionProvider' import { useMessage } from '@/hooks/useMessage' +import { useRouter } from 'next/navigation' const reducer = (prevState, nextState) => { return { ...prevState, ...nextState } @@ -34,6 +35,7 @@ const updateItemInList = (itemList, dispOrder, updates) => { } export const useEstimateController = (planNo) => { + const router = useRouter() const { session } = useContext(SessionContext) const globalLocaleState = useRecoilValue(globalLocaleStore) const objectRecoil = useRecoilValue(floorPlanObjectState) @@ -185,6 +187,7 @@ export const useEstimateController = (planNo) => { // console.log('최종 남은 아이템정보:::', estimateData.itemList) console.log('최종 정보::;', estimateData) + //drawingFlg null ???? //2. 상세데이터 저장 // return diff --git a/src/locales/ja.json b/src/locales/ja.json index 3918cdba..ce535e61 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -160,7 +160,7 @@ "plan.menu.estimate.docDown": "文書のダウンロード", "plan.menu.estimate.save": "保存", "plan.menu.estimate.reset": "初期化", - "plan.menu.estimate.copy": "コピー", + "plan.menu.estimate.copy": "見積書のコピー", "plan.menu.simulation": "発展シミュレーション", "plan.menu.simulation.excel": "Excel", "plan.menu.simulation.pdf": "PDF", diff --git a/src/locales/ko.json b/src/locales/ko.json index 1549e7e6..918de1a4 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -164,7 +164,7 @@ "plan.menu.estimate.docDown": "문서 다운로드", "plan.menu.estimate.save": "저장", "plan.menu.estimate.reset": "초기화", - "plan.menu.estimate.copy": "복사", + "plan.menu.estimate.copy": "견적서 복사", "plan.menu.simulation": "발전 시뮬레이션", "plan.menu.simulation.excel": "Excel", "plan.menu.simulation.pdf": "PDF", From a1d8341044c30447b22e0ffd7f9d8682c600fb3d Mon Sep 17 00:00:00 2001 From: minsik Date: Tue, 19 Nov 2024 10:38:42 +0900 Subject: [PATCH 096/200] =?UTF-8?q?=EC=A7=80=EB=B6=95=EB=A9=B4=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=20=EC=8B=9C=20=EB=B0=B0=EC=B9=98=EB=A9=B4=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useRoofAllocationSetting.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 9a9973cb..6cde3635 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -1,5 +1,5 @@ -import { useRecoilValue } from 'recoil' -import { canvasState, currentObjectState } from '@/store/canvasAtom' +import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' +import { canvasState, currentMenuState, currentObjectState } from '@/store/canvasAtom' import { useEffect, useState } from 'react' import { setSurfaceShapePattern } from '@/util/canvas-util' import { useSwal } from '@/hooks/useSwal' @@ -10,6 +10,9 @@ import { POLYGON_TYPE } from '@/common/common' import { v4 as uuidv4 } from 'uuid' import ActualSizeSetting from '@/components/floor-plan/modal/roofAllocation/ActualSizeSetting' import { useMessage } from '@/hooks/useMessage' +import useMenu from '@/hooks/common/useMenu' +import { useCanvasMenu } from '@/hooks/common/useCanvasMenu' +import { menuTypeState } from '@/store/menuAtom' // 지붕면 할당 export function useRoofAllocationSetting(id) { @@ -21,6 +24,8 @@ export function useRoofAllocationSetting(id) { const { getMessage } = useMessage() const currentObject = useRecoilValue(currentObjectState) const { swalFire } = useSwal() + const { setMenuNumber } = useCanvasMenu() + const setMenuType = useSetRecoilState(menuTypeState) const roofMaterials = [ { id: 'A', @@ -132,6 +137,9 @@ export function useRoofAllocationSetting(id) { setValues(values.filter((value) => value.id !== id)) } + const { handleMenu } = useMenu() + const [currentMenu, setCurrentMenu] = useRecoilState(currentMenuState) + // 선택한 지붕재로 할당 const handleSave = () => { // 모두 actualSize 있으면 바로 적용 없으면 actualSize 설정 @@ -213,6 +221,8 @@ export function useRoofAllocationSetting(id) { }) setEditingLines([]) closeAll() + setMenuNumber(3) + setMenuType('surface') } const setLineSize = (id, size) => { From bb84f31c644db1e5540b0cbe2d4f5585bb925199 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 19 Nov 2024 10:51:46 +0900 Subject: [PATCH 097/200] =?UTF-8?q?=EB=AA=A8=EB=93=88=20=ED=9A=8C=EB=A1=9C?= =?UTF-8?q?=20=EA=B5=AC=EC=84=B1=EC=9D=84=20=EB=B2=97=EC=96=B4=EB=82=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20moduleCompass=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/common/useCanvasMenu.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/hooks/common/useCanvasMenu.js b/src/hooks/common/useCanvasMenu.js index f8758e3e..7a883e55 100644 --- a/src/hooks/common/useCanvasMenu.js +++ b/src/hooks/common/useCanvasMenu.js @@ -1,8 +1,30 @@ import { menuNumberState } from '@/store/menuAtom' -import { useRecoilState } from 'recoil' +import { useRecoilState, useRecoilValue } from 'recoil' +import { useEffect } from 'react' +import { canvasState } from '@/store/canvasAtom' +import { usePolygon } from '@/hooks/usePolygon' +import { POLYGON_TYPE } from '@/common/common' export const useCanvasMenu = () => { const [menuNumber, setMenuNumber] = useRecoilState(menuNumberState) + const canvas = useRecoilValue(canvasState) + const { drawDirectionArrow } = usePolygon() + + useEffect(() => { + /* + * 모듈,회로 구성을 벗어나면 방향 표시 초기화 필요 + * */ + if (!canvas) return + if (![4, 5].includes(menuNumber)) { + canvas + .getObjects() + .filter((obj) => obj.name === POLYGON_TYPE.ROOF) + .forEach((obj) => { + obj.set('moduleCompass', null) + drawDirectionArrow(obj) + }) + } + }, [menuNumber]) return { menuNumber, From cdc0480db875c8d27d25456b6f5dc7b11108d852 Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 19 Nov 2024 11:14:05 +0900 Subject: [PATCH 098/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 8 ++++---- src/hooks/floorPlan/estimate/useEstimateController.js | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 6373a5f7..dba23f5f 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -234,12 +234,12 @@ export default function Estimate({ params }) { } //Pricing 버튼 - const handlePricing = async (priceCd) => { + const handlePricing = async (showPriceCd) => { const param = { saleStoreId: session.storeId, sapSalesStoreCd: session.custCd, docTpCd: state.estimateType, - priceCd: priceCd, + priceCd: showPriceCd, //itemIdList: state.itemList, //아이템 최초정보로 호출 delFlg 0인거만.. itemIdList: state.itemList.filter((item) => item.delFlg === '0'), } @@ -283,7 +283,7 @@ export default function Estimate({ params }) { }) setState({ - priceCd: priceCd, + priceCd: showPriceCd, itemList: updateList, }) @@ -1030,7 +1030,7 @@ export default function Estimate({ params }) { type="button" className="btn-origin grey ml5" onClick={() => { - handlePricing(state?.priceCd) + handlePricing(showPriceCd) }} > {getMessage('estimate.detail.showPrice.pricingBtn')} diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 88e3efab..f99ba2eb 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -49,7 +49,7 @@ export const useEstimateController = (planNo) => { const [state, setState] = useReducer(reducer, defaultEstimateData) useEffect(() => { - if (!isLoading) { + if (planNo && !isLoading) { if (objectRecoil.floorPlanObjectNo && planNo) { fetchSetting() } @@ -188,15 +188,14 @@ export const useEstimateController = (planNo) => { // console.log('최종 남은 아이템정보:::', estimateData.itemList) console.log('최종 정보::;', estimateData) - //drawingFlg null ???? //2. 상세데이터 저장 // return await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { console.log('res::::::::::::', res) if (res.status === 201) { - console.log('201:::::::::') alert(getMessage('estimate.detail.save.alertMsg')) //어디로 보낼지 + router.push(`/floor-plan/estimate/5/${estimateData.planNo}`) } }) } From 3413347003e1e664921d65126b03da6a3982ed14 Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 19 Nov 2024 13:12:13 +0900 Subject: [PATCH 099/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=ED=97=A4=EB=8D=94=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 4 ---- src/components/management/StuffSubHeader.jsx | 2 +- src/locales/ja.json | 1 + src/locales/ko.json | 1 + 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index dba23f5f..c420f072 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -217,13 +217,9 @@ export default function Estimate({ params }) { docTpCd: priceCd, } - //가격표시 바꾸만헀을때는 tempPriceCd에 바꾼값 관리 불필요? //프라이싱 했을때 priceCd setState //화면에 보여지는 값은 showPriceCd로 관리 setShowPriceCd(priceCd) - //setState({ - // tempPriceCd: priceCd, - //}) const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}` get({ url: apiUrl }).then((res) => { diff --git a/src/components/management/StuffSubHeader.jsx b/src/components/management/StuffSubHeader.jsx index 69c7b967..5270bd02 100644 --- a/src/components/management/StuffSubHeader.jsx +++ b/src/components/management/StuffSubHeader.jsx @@ -107,7 +107,7 @@ export default function StuffSubHeader({ type }) { {getMessage('header.menus.management')}
  • - {getMessage('header.menus.management.newStuff')} + {getMessage('header.menus.management.detail')}
  • diff --git a/src/locales/ja.json b/src/locales/ja.json index ce535e61..3487baf6 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -4,6 +4,7 @@ "header.menus.home": "ホームへv", "header.menus.management": "物品及び図面管理", "header.menus.management.newStuff": "新規 物件 登録", + "header.menus.management.detail": "物件詳細", "header.menus.management.stuffList": "物件の状況", "header.menus.community": "コミュニティ", "header.menus.community.notice": "お知らせ", diff --git a/src/locales/ko.json b/src/locales/ko.json index 918de1a4..96b55238 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -4,6 +4,7 @@ "header.menus.home": "Home", "header.menus.management": "물건 및 도면 관리", "header.menus.management.newStuff": "신규 물건 등록", + "header.menus.management.detail": "물건 상세", "header.menus.management.stuffList": "물건 현황", "header.menus.community": "커뮤니티", "header.menus.community.notice": "공지", From ea9f386e1185ebbb1b6042589290bf2e0247a4a2 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Tue, 19 Nov 2024 13:36:18 +0900 Subject: [PATCH 100/200] =?UTF-8?q?fix:=20=EB=8F=84=EB=A9=B4=20=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD=20=EC=84=A4=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 이벤트 정리 - 소스 코드 정리 --- src/app/floor-plan/FloorPlanProvider.js | 28 +- src/app/floor-plan/layout.js | 2 +- src/components/floor-plan/CanvasFrame.jsx | 3 + src/components/floor-plan/CanvasMenu.jsx | 10 +- src/components/floor-plan/modal/ImgLoad.jsx | 47 +- yarn.lock | 3773 ++++++++++--------- 6 files changed, 2127 insertions(+), 1736 deletions(-) diff --git a/src/app/floor-plan/FloorPlanProvider.js b/src/app/floor-plan/FloorPlanProvider.js index cb23116b..31ee1bd2 100644 --- a/src/app/floor-plan/FloorPlanProvider.js +++ b/src/app/floor-plan/FloorPlanProvider.js @@ -1,9 +1,27 @@ 'ues client' -import { ErrorBoundary } from 'next/dist/client/components/error-boundary' -import ServerError from '../error' +// import { ErrorBoundary } from 'next/dist/client/components/error-boundary' +// import ServerError from '../error' +import { createContext, useEffect, useState } from 'react' -export const FloorPlanProvider = ({ children }) => { - console.log('FloorPlanProvider') - return }>{children} +export const FloorPlanContext = createContext({ + floorPlanState: {}, + setFloorPlanState: () => {}, +}) + +const FloorPlanProvider = ({ children }) => { + const [floorPlanState, setFloorPlanState] = useState({ + // 플랜 파일 업로드 모달 오픈 제어 + refFileModalOpen: false, + // 플랜 회전 모드 제어 + toggleRotate: false, + }) + + useEffect(() => { + console.log('🚀 ~ floorPlanState:', floorPlanState) + }, [floorPlanState]) + + return {children} } + +export default FloorPlanProvider diff --git a/src/app/floor-plan/layout.js b/src/app/floor-plan/layout.js index 782bc51e..ff9c9572 100644 --- a/src/app/floor-plan/layout.js +++ b/src/app/floor-plan/layout.js @@ -1,6 +1,6 @@ 'use client' import FloorPlan from '@/components/floor-plan/FloorPlan' -import { FloorPlanProvider } from './FloorPlanProvider' +import FloorPlanProvider from './FloorPlanProvider' import CanvasLayout from '@/components/floor-plan/CanvasLayout' export default function FloorPlanLayout({ children }) { diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index 6e812930..9fcd5cfd 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -14,6 +14,7 @@ import { useCanvasConfigInitialize } from '@/hooks/common/useCanvasConfigInitial import { MENU } from '@/common/common' import PanelBatchStatistics from '@/components/floor-plan/modal/panelBatch/PanelBatchStatistics' import { totalDisplaySelector } from '@/store/settingAtom' +import ImgLoad from '@/components/floor-plan/modal/ImgLoad' export default function CanvasFrame() { const canvasRef = useRef(null) @@ -76,6 +77,8 @@ export default function CanvasFrame() { MENU.MODULE_CIRCUIT_SETTING.PLAN_ORIENTATION, ].includes(currentMenu) && totalDisplay && } + {/* 이미지 로드 팝업 */} +
    ) } diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 27a95c90..4d1d1820 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -1,6 +1,6 @@ 'use client' -import { useEffect, useState } from 'react' +import { useContext, useEffect, useState } from 'react' import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' @@ -35,7 +35,7 @@ import { MENU } from '@/common/common' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' import { estimateState } from '@/store/floorPlanObjectAtom' import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' -import { button } from '@nextui-org/react' +import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props @@ -68,6 +68,7 @@ export default function CanvasMenu(props) { const commonUtils = useRecoilValue(commonUtilsState) const { commonFunctions } = useCommonUtils() const SelectOption = [{ name: '瓦53A' }, { name: '瓦53A' }] + const { floorPlanState, setFloorPlanState } = useContext(FloorPlanContext) const onClickNav = (menu) => { setMenuNumber(menu.index) @@ -240,7 +241,10 @@ export default function CanvasMenu(props) {
    - + {/**/} diff --git a/src/components/floor-plan/modal/ImgLoad.jsx b/src/components/floor-plan/modal/ImgLoad.jsx index fa365c84..c67cc3f3 100644 --- a/src/components/floor-plan/modal/ImgLoad.jsx +++ b/src/components/floor-plan/modal/ImgLoad.jsx @@ -1,3 +1,6 @@ +import { useContext, useEffect } from 'react' +import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' + import { useMessage } from '@/hooks/useMessage' import { useRefFiles } from '@/hooks/common/useRefFiles' import { usePlan } from '@/hooks/usePlan' @@ -20,9 +23,24 @@ export default function ImgLoad() { } = useRefFiles() const { currentCanvasPlan } = usePlan() const { getMessage } = useMessage() + const { floorPlanState, setFloorPlanState } = useContext(FloorPlanContext) + + const handleModal = () => { + setFloorPlanState({ ...floorPlanState, refFileModalOpen: false }) + } + + useEffect(() => { + console.log('🚀 ~ ImgLoad ~ floorPlanState.refFileModalOpen:', floorPlanState.refFileModalOpen) + console.log('🚀 ~ ImgLoad ~ currentCanvasPlan:', currentCanvasPlan) + }, [floorPlanState.refFileModalOpen]) + + useEffect(() => { + const refFileMethod = currentCanvasPlan?.mapPositionAddress === null ? '1' : '2' + setRefFileMethod(refFileMethod) + }, [currentCanvasPlan]) return ( - +

    {getMessage('common.input.file')}

    @@ -32,7 +50,11 @@ export default function ImgLoad() {
    サイズ調整と回転
    @@ -48,13 +70,18 @@ export default function ImgLoad() { ファイルの追加 - handleRefFile(e.target.files[0])} /> + handleRefFile(e.target.files[0]) : () => {}} + />
    {/* */} {currentCanvasPlan?.bgImageName === null ? ( - + ) : ( )} @@ -64,13 +91,13 @@ export default function ImgLoad() {
    - handleRefFileMethod(e)} checked={refFileMethod === '2'} /> - + handleRefFileMethod(e)} checked={refFileMethod === '2'} /> +
    - +
    -
    @@ -80,7 +107,9 @@ export default function ImgLoad() {
    - +
    diff --git a/yarn.lock b/yarn.lock index ed2cceda..ed995603 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,35 +4,28 @@ "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== -"@azure/abort-controller@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz" - integrity sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw== - dependencies: - tslib "^2.2.0" - "@azure/abort-controller@^2.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d" integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== dependencies: tslib "^2.6.2" -"@azure/core-auth@^1.3.0", "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.5.0", "@azure/core-auth@^1.7.2": - version "1.7.2" - resolved "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz" - integrity sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g== +"@azure/core-auth@^1.3.0", "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.7.2", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.9.0.tgz#ac725b03fabe3c892371065ee9e2041bee0fd1ac" + integrity sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw== dependencies: "@azure/abort-controller" "^2.0.0" - "@azure/core-util" "^1.1.0" + "@azure/core-util" "^1.11.0" tslib "^2.6.2" "@azure/core-client@^1.3.0", "@azure/core-client@^1.5.0", "@azure/core-client@^1.9.2": version "1.9.2" - resolved "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz" + resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.9.2.tgz#6fc69cee2816883ab6c5cdd653ee4f2ff9774f74" integrity sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w== dependencies: "@azure/abort-controller" "^2.0.0" @@ -45,7 +38,7 @@ "@azure/core-http-compat@^2.0.1": version "2.1.2" - resolved "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/@azure/core-http-compat/-/core-http-compat-2.1.2.tgz#d1585ada24ba750dc161d816169b33b35f762f0d" integrity sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ== dependencies: "@azure/abort-controller" "^2.0.0" @@ -54,7 +47,7 @@ "@azure/core-lro@^2.2.0": version "2.7.2" - resolved "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz" + resolved "https://registry.yarnpkg.com/@azure/core-lro/-/core-lro-2.7.2.tgz#787105027a20e45c77651a98b01a4d3b01b75a08" integrity sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw== dependencies: "@azure/abort-controller" "^2.0.0" @@ -64,66 +57,80 @@ "@azure/core-paging@^1.1.1": version "1.6.2" - resolved "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz" + resolved "https://registry.yarnpkg.com/@azure/core-paging/-/core-paging-1.6.2.tgz#40d3860dc2df7f291d66350b2cfd9171526433e7" integrity sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA== dependencies: tslib "^2.6.2" -"@azure/core-rest-pipeline@^1.1.0", "@azure/core-rest-pipeline@^1.3.0", "@azure/core-rest-pipeline@^1.8.1", "@azure/core-rest-pipeline@^1.9.1": - version "1.16.3" - resolved "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.3.tgz" - integrity sha512-VxLk4AHLyqcHsfKe4MZ6IQ+D+ShuByy+RfStKfSjxJoL3WBWq17VNmrz8aT8etKzqc2nAeIyLxScjpzsS4fz8w== +"@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.3.0", "@azure/core-rest-pipeline@^1.8.0", "@azure/core-rest-pipeline@^1.8.1", "@azure/core-rest-pipeline@^1.9.1": + version "1.18.0" + resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.0.tgz#165f1cd9bb1060be3b6895742db3d1f1106271d3" + integrity sha512-QSoGUp4Eq/gohEFNJaUOwTN7BCc2nHTjjbm75JT0aD7W65PWM1H/tItz0GsABn22uaKyGxiMhWQLt2r+FGU89Q== dependencies: "@azure/abort-controller" "^2.0.0" - "@azure/core-auth" "^1.4.0" + "@azure/core-auth" "^1.8.0" "@azure/core-tracing" "^1.0.1" - "@azure/core-util" "^1.9.0" + "@azure/core-util" "^1.11.0" "@azure/logger" "^1.0.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.0" tslib "^2.6.2" "@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz" - integrity sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.2.0.tgz#7be5d53c3522d639cf19042cbcdb19f71bc35ab2" + integrity sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg== dependencies: tslib "^2.6.2" -"@azure/core-util@^1.0.0", "@azure/core-util@^1.1.0", "@azure/core-util@^1.2.0", "@azure/core-util@^1.3.0", "@azure/core-util@^1.6.1", "@azure/core-util@^1.9.0": - version "1.9.2" - resolved "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.2.tgz" - integrity sha512-l1Qrqhi4x1aekkV+OlcqsJa4AnAkj5p0JV8omgwjaV9OAbP41lvrMvs+CptfetKkeEaGRGSzby7sjPZEX7+kkQ== +"@azure/core-util@^1.0.0", "@azure/core-util@^1.10.0", "@azure/core-util@^1.11.0", "@azure/core-util@^1.2.0", "@azure/core-util@^1.6.1": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.11.0.tgz#f530fc67e738aea872fbdd1cc8416e70219fada7" + integrity sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g== dependencies: "@azure/abort-controller" "^2.0.0" tslib "^2.6.2" "@azure/identity@^4.2.1": - version "4.4.1" - resolved "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz" - integrity sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.5.0.tgz#93ce3757bf761a08cfd05f56ef181435e05b9e1c" + integrity sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ== dependencies: - "@azure/abort-controller" "^1.0.0" - "@azure/core-auth" "^1.5.0" + "@azure/abort-controller" "^2.0.0" + "@azure/core-auth" "^1.9.0" "@azure/core-client" "^1.9.2" - "@azure/core-rest-pipeline" "^1.1.0" + "@azure/core-rest-pipeline" "^1.17.0" "@azure/core-tracing" "^1.0.0" - "@azure/core-util" "^1.3.0" + "@azure/core-util" "^1.11.0" "@azure/logger" "^1.0.0" - "@azure/msal-browser" "^3.14.0" - "@azure/msal-node" "^2.9.2" + "@azure/msal-browser" "^3.26.1" + "@azure/msal-node" "^2.15.0" events "^3.0.0" jws "^4.0.0" open "^8.0.0" stoppable "^1.1.0" tslib "^2.2.0" -"@azure/keyvault-keys@^4.4.0": - version "4.8.0" - resolved "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.8.0.tgz" - integrity sha512-jkuYxgkw0aaRfk40OQhFqDIupqblIOIlYESWB6DKCVDxQet1pyv86Tfk9M+5uFM0+mCs6+MUHU+Hxh3joiUn4Q== +"@azure/keyvault-common@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@azure/keyvault-common/-/keyvault-common-2.0.0.tgz#91e50df01d9bfa8f55f107bb9cdbc57586b2b2a4" + integrity sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w== dependencies: - "@azure/abort-controller" "^1.0.0" + "@azure/abort-controller" "^2.0.0" + "@azure/core-auth" "^1.3.0" + "@azure/core-client" "^1.5.0" + "@azure/core-rest-pipeline" "^1.8.0" + "@azure/core-tracing" "^1.0.0" + "@azure/core-util" "^1.10.0" + "@azure/logger" "^1.1.4" + tslib "^2.2.0" + +"@azure/keyvault-keys@^4.4.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@azure/keyvault-keys/-/keyvault-keys-4.9.0.tgz#83ad2370429d1f576e6c5c59ff165761e2d8feab" + integrity sha512-ZBP07+K4Pj3kS4TF4XdkqFcspWwBHry3vJSOFM5k5ZABvf7JfiMonvaFk2nBF6xjlEbMpz5PE1g45iTMme0raQ== + dependencies: + "@azure/abort-controller" "^2.0.0" "@azure/core-auth" "^1.3.0" "@azure/core-client" "^1.5.0" "@azure/core-http-compat" "^2.0.1" @@ -132,150 +139,135 @@ "@azure/core-rest-pipeline" "^1.8.1" "@azure/core-tracing" "^1.0.0" "@azure/core-util" "^1.0.0" + "@azure/keyvault-common" "^2.0.0" "@azure/logger" "^1.0.0" tslib "^2.2.0" -"@azure/logger@^1.0.0": +"@azure/logger@^1.0.0", "@azure/logger@^1.1.4": version "1.1.4" - resolved "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.1.4.tgz#223cbf2b424dfa66478ce9a4f575f59c6f379768" integrity sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ== dependencies: tslib "^2.6.2" -"@azure/msal-browser@^3.14.0": - version "3.21.0" - resolved "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.21.0.tgz" - integrity sha512-BAwcFsVvOrYzKuUZHhFuvRykUmQGq6lDxst2qGnjxnpNZc3d/tnVPcmhgvUdeKl28VSE0ltgBzT3HkdpDtz9rg== +"@azure/msal-browser@^3.26.1": + version "3.27.0" + resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.27.0.tgz#b6f02f73c8e102d3f115009b4677539fb173fe2b" + integrity sha512-+b4ZKSD8+vslCtVRVetkegEhOFMLP3rxDWJY212ct+2r6jVg6OSQKc1Qz3kCoXo0FgwaXkb+76TMZfpHp8QtgA== dependencies: - "@azure/msal-common" "14.14.1" + "@azure/msal-common" "14.16.0" -"@azure/msal-common@14.14.1": - version "14.14.1" - resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.1.tgz" - integrity sha512-2Q3tqNz/PZLfSr8BvcHZVpRRfSn4MjGSqjj9J+HlBsmbf1Uu4P0WeXnemjTJwwx9KrmplsrN3UkZ/LPOR720rw== +"@azure/msal-common@14.16.0": + version "14.16.0" + resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.16.0.tgz#f3470fcaec788dbe50859952cd499340bda23d7a" + integrity sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA== -"@azure/msal-node@^2.9.2": - version "2.13.0" - resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.13.0.tgz" - integrity sha512-DhP97ycs7qlCVzzzWGzJiwAFyFj5okno74E4FUZ61oCLfKh4IxA1kxirqzrWuYZWpBe9HVPL6GA4NvmlEOBN5Q== +"@azure/msal-node@^2.15.0": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.16.1.tgz#89828832e8e6c8a88cecc4ef6d8d4e4352116b77" + integrity sha512-1NEFpTmMMT2A7RnZuvRl/hUmJU+GLPjh+ShyIqPktG2PvSd2yvPnzGd/BxIBAAvJG5nr9lH4oYcQXepDbaE7fg== dependencies: - "@azure/msal-common" "14.14.1" + "@azure/msal-common" "14.16.0" jsonwebtoken "^9.0.0" uuid "^8.3.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz" - integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/generator@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz" - integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== +"@babel/generator@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== dependencies: - "@babel/types" "^7.25.7" + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" "@babel/helper-module-imports@^7.16.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz" - integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-string-parser@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz" - integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== -"@babel/helper-validator-identifier@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz" - integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== -"@babel/highlight@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz" - integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== +"@babel/parser@^7.25.9", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== dependencies: - "@babel/helper-validator-identifier" "^7.25.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" + "@babel/types" "^7.26.0" -"@babel/parser@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz" - integrity sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw== - dependencies: - "@babel/types" "^7.25.7" - -"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz" - integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== +"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.25.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@^7.20.13", "@babel/runtime@^7.24.8": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz" - integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== dependencies: - regenerator-runtime "^0.14.0" + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/template@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz" - integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/traverse@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz" - integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg== - dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/template" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz" - integrity sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ== +"@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== dependencies: - "@babel/helper-string-parser" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@bedrock-layout/use-forwarded-ref@^1.3.1": version "1.6.1" - resolved "https://registry.npmjs.org/@bedrock-layout/use-forwarded-ref/-/use-forwarded-ref-1.6.1.tgz" + resolved "https://registry.yarnpkg.com/@bedrock-layout/use-forwarded-ref/-/use-forwarded-ref-1.6.1.tgz#e0d25c35af41ccaa36df809a7de8d5ccd9c70d1e" integrity sha512-GD9A9AFLzFNjr7k6fgerSqxfwDWl+wsPS11PErOKe1zkVz0y7RGC9gzlOiX/JrgpyB3NFHWIuGtoOQqifJQQpw== dependencies: "@bedrock-layout/use-stateful-ref" "^1.4.1" "@bedrock-layout/use-stateful-ref@^1.4.1": version "1.4.1" - resolved "https://registry.npmjs.org/@bedrock-layout/use-stateful-ref/-/use-stateful-ref-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/@bedrock-layout/use-stateful-ref/-/use-stateful-ref-1.4.1.tgz#c543c61d15885e19506f068618a4d6427a5bf817" integrity sha512-4eKO2KdQEXcR5LI4QcxqlJykJUDQJWDeWYAukIn6sRQYoabcfI5kDl61PUi6FR6o8VFgQ8IEP7HleKqWlSe8SQ== "@emotion/babel-plugin@^11.12.0": version "11.12.0" - resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2" integrity sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw== dependencies: "@babel/helper-module-imports" "^7.16.7" @@ -292,7 +284,7 @@ "@emotion/cache@^11.13.0", "@emotion/cache@^11.4.0": version "11.13.1" - resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.13.1.tgz#fecfc54d51810beebf05bf2a161271a1a91895d7" integrity sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw== dependencies: "@emotion/memoize" "^0.9.0" @@ -303,17 +295,17 @@ "@emotion/hash@^0.9.2": version "0.9.2" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== "@emotion/memoize@^0.9.0": version "0.9.0" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== "@emotion/react@^11.8.1": version "11.13.3" - resolved "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.13.3.tgz#a69d0de2a23f5b48e0acf210416638010e4bd2e4" integrity sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg== dependencies: "@babel/runtime" "^7.18.3" @@ -327,7 +319,7 @@ "@emotion/serialize@^1.2.0", "@emotion/serialize@^1.3.1": version "1.3.2" - resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.2.tgz#e1c1a2e90708d5d85d81ccaee2dfeb3cc0cccf7a" integrity sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA== dependencies: "@emotion/hash" "^0.9.2" @@ -338,149 +330,137 @@ "@emotion/sheet@^1.4.0": version "1.4.0" - resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== "@emotion/unitless@^0.10.0": version "0.10.0" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== "@emotion/use-insertion-effect-with-fallbacks@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf" integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw== "@emotion/utils@^1.4.0", "@emotion/utils@^1.4.1": version "1.4.1" - resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.1.tgz#b3adbb43de12ee2149541c4f1337d2eb7774f0ad" integrity sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA== "@emotion/weak-memoize@^0.4.0": version "0.4.0" - resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== "@floating-ui/core@^1.6.0": - version "1.6.7" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz" - integrity sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g== + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== dependencies: - "@floating-ui/utils" "^0.2.7" + "@floating-ui/utils" "^0.2.8" -"@floating-ui/dom@^1.0.0": - version "1.6.10" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz" - integrity sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A== - dependencies: - "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.7" - -"@floating-ui/dom@^1.0.1": - version "1.6.11" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz" - integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ== +"@floating-ui/dom@^1.0.0", "@floating-ui/dom@^1.0.1": + version "1.6.12" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" + integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== dependencies: "@floating-ui/core" "^1.6.0" "@floating-ui/utils" "^0.2.8" -"@floating-ui/react-dom@^2.1.1": - version "2.1.1" - resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz" - integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== +"@floating-ui/react-dom@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== dependencies: "@floating-ui/dom" "^1.0.0" -"@floating-ui/react@^0.26.2": - version "0.26.22" - resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.22.tgz" - integrity sha512-LNv4azPt8SpT4WW7Kku5JNVjLk2GcS0bGGjFTAgqOONRFo9r/aaGHHPpdiIuQbB1t8shmWyWqTTUDmZ9fcNshg== +"@floating-ui/react@^0.26.23": + version "0.26.28" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" + integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== dependencies: - "@floating-ui/react-dom" "^2.1.1" - "@floating-ui/utils" "^0.2.7" + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.8" tabbable "^6.0.0" -"@floating-ui/utils@^0.2.7": - version "0.2.7" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz" - integrity sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA== - "@floating-ui/utils@^0.2.8": version "0.2.8" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== -"@formatjs/ecma402-abstract@2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz" - integrity sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g== +"@formatjs/ecma402-abstract@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz#355e42d375678229d46dc8ad7a7139520dd03e7b" + integrity sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg== dependencies: - "@formatjs/intl-localematcher" "0.5.4" - tslib "^2.4.0" + "@formatjs/fast-memoize" "2.2.3" + "@formatjs/intl-localematcher" "0.5.8" + tslib "2" -"@formatjs/fast-memoize@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz" - integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA== +"@formatjs/fast-memoize@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz#74e64109279d5244f9fc281f3ae90c407cece823" + integrity sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA== dependencies: - tslib "^2.4.0" + tslib "2" -"@formatjs/icu-messageformat-parser@2.7.8": - version "2.7.8" - resolved "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz" - integrity sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA== +"@formatjs/icu-messageformat-parser@2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz#52501fbdc122a86097644f03ae1117b9ced00872" + integrity sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg== dependencies: - "@formatjs/ecma402-abstract" "2.0.0" - "@formatjs/icu-skeleton-parser" "1.8.2" - tslib "^2.4.0" + "@formatjs/ecma402-abstract" "2.2.4" + "@formatjs/icu-skeleton-parser" "1.8.8" + tslib "2" -"@formatjs/icu-skeleton-parser@1.8.2": - version "1.8.2" - resolved "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz" - integrity sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q== +"@formatjs/icu-skeleton-parser@1.8.8": + version "1.8.8" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz#a16eff7fd040acf096fb1853c99527181d38cf90" + integrity sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA== dependencies: - "@formatjs/ecma402-abstract" "2.0.0" - tslib "^2.4.0" + "@formatjs/ecma402-abstract" "2.2.4" + tslib "2" -"@formatjs/intl-localematcher@0.5.4": - version "0.5.4" - resolved "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz" - integrity sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g== +"@formatjs/intl-localematcher@0.5.8": + version "0.5.8" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz#b11bbd04bd3551f7cadcb1ef1e231822d0e3c97e" + integrity sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg== dependencies: - tslib "^2.4.0" + tslib "2" -"@internationalized/date@^3.5.4", "@internationalized/date@^3.5.5": - version "3.5.5" - resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.5.5.tgz" - integrity sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ== +"@internationalized/date@^3.5.4", "@internationalized/date@^3.5.6": + version "3.5.6" + resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.6.tgz#0833c2fa75efb3573f4e3bf10e3895f1019e87dd" + integrity sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/message@^3.1.4": - version "3.1.4" - resolved "https://registry.npmjs.org/@internationalized/message/-/message-3.1.4.tgz" - integrity sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw== +"@internationalized/message@^3.1.4", "@internationalized/message@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.1.5.tgz#7391bba7a0489022a099f5bc37eb161889d520c8" + integrity sha512-hjEpLKFlYA3m5apldLqzHqw531qqfOEq0HlTWdfyZmcloWiUbWsYXD6YTiUmQmOtarthzhdjCAwMVrB8a4E7uA== dependencies: "@swc/helpers" "^0.5.0" intl-messageformat "^10.1.0" -"@internationalized/number@^3.5.3": - version "3.5.3" - resolved "https://registry.npmjs.org/@internationalized/number/-/number-3.5.3.tgz" - integrity sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw== +"@internationalized/number@^3.5.3", "@internationalized/number@^3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.5.4.tgz#db1c648fa191b28062c2f4fd81fac89777ad3e91" + integrity sha512-h9huwWjNqYyE2FXZZewWqmCdkw1HeFds5q4Siuoms3hUQC5iPJK3aBmkFZoDSLN4UD0Bl8G22L/NdHpeOr+/7A== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/string@^3.2.3": - version "3.2.3" - resolved "https://registry.npmjs.org/@internationalized/string/-/string-3.2.3.tgz" - integrity sha512-9kpfLoA8HegiWTeCbR2livhdVeKobCnVv8tlJ6M2jF+4tcMqDo94ezwlnrUANBWPgd8U7OXIHCk2Ov2qhk4KXw== +"@internationalized/string@^3.2.3", "@internationalized/string@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.2.4.tgz#e05ddd93a7b83e936940c83f5b3a8597d8c3a370" + integrity sha512-BcyadXPn89Ae190QGZGDUZPqxLj/xsP4U1Br1oSy8yfIjmpJ8cJtGYleaodqW/EmzFjwELtwDojLkf3FhV6SjA== dependencies: "@swc/helpers" "^0.5.0" "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -492,7 +472,7 @@ "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -501,22 +481,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -524,7 +504,7 @@ "@js-joda/core@^5.6.1": version "5.6.3" - resolved "https://registry.npmjs.org/@js-joda/core/-/core-5.6.3.tgz" + resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-5.6.3.tgz#41ae1c07de1ebe0f6dde1abcbc9700a09b9c6056" integrity sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA== "@kurkle/color@^0.3.0": @@ -549,65 +529,65 @@ "@next/env@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== "@next/swc-darwin-arm64@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== "@next/swc-darwin-x64@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== "@next/swc-linux-arm64-gnu@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== "@next/swc-linux-arm64-musl@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== "@next/swc-linux-x64-gnu@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== "@next/swc-linux-x64-musl@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== "@next/swc-win32-arm64-msvc@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== "@next/swc-win32-ia32-msvc@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== "@next/swc-win32-x64-msvc@14.2.3": version "14.2.3" - resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== -"@nextui-org/accordion@2.0.38": - version "2.0.38" - resolved "https://registry.npmjs.org/@nextui-org/accordion/-/accordion-2.0.38.tgz" - integrity sha512-kFCZU1VaKkUI295Fg3NxuQR2+kZ5vTH4ftIs0oByrOs0+l14dVQGFOd9ZV402fHNykZJt7Sk6oWjTp4Qwl83JA== +"@nextui-org/accordion@2.0.40": + version "2.0.40" + resolved "https://registry.yarnpkg.com/@nextui-org/accordion/-/accordion-2.0.40.tgz#b163afd0c6249a7a48fed2c30467bebe9be9d18f" + integrity sha512-aJmhflLOXOFTjbBWlWto30hYzimw+sw1EZwSRG9CdxbjRact2dRfCLsZQmHkJW2ifVx51g/qLNE2NSFAi2L8dA== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/divider" "2.0.31" - "@nextui-org/framer-utils" "2.0.24" - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/divider" "2.0.32" + "@nextui-org/framer-utils" "2.0.25" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-aria-accordion" "2.0.7" "@react-aria/button" "3.9.5" "@react-aria/focus" "3.17.1" @@ -617,35 +597,35 @@ "@react-types/accordion" "3.0.0-alpha.21" "@react-types/shared" "3.23.1" -"@nextui-org/aria-utils@2.0.24": - version "2.0.24" - resolved "https://registry.npmjs.org/@nextui-org/aria-utils/-/aria-utils-2.0.24.tgz" - integrity sha512-YD+YvT01zFqN1Ey137OeFl9SEhAYf2BoZz+ykWiIJlMjl/LY1d5WE0nkzsjMHh6MV3HgS6CExxlf7TuApN6Piw== +"@nextui-org/aria-utils@2.0.26": + version "2.0.26" + resolved "https://registry.yarnpkg.com/@nextui-org/aria-utils/-/aria-utils-2.0.26.tgz#0113247f80bc558aea650c15e38ee0ab7c7ac9f8" + integrity sha512-e81HxkNI3/HCPPJT9OVK0g0ivTkuqeeQ043WlAxvgf+upFTEvNN5vmsSKBfWGgfZpsVHgNyHIzwbHjy9zKePLQ== dependencies: - "@nextui-org/react-rsc-utils" "2.0.13" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/system" "2.2.5" + "@nextui-org/react-rsc-utils" "2.0.14" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/system" "2.2.6" "@react-aria/utils" "3.24.1" "@react-stately/collections" "3.10.7" "@react-stately/overlays" "3.6.7" "@react-types/overlays" "3.8.7" "@react-types/shared" "3.23.1" -"@nextui-org/autocomplete@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nextui-org/autocomplete/-/autocomplete-2.1.5.tgz" - integrity sha512-VcSe3B/CmIvfZnAJHHYKp3r83QrqI0T8v9jjrpQ0PN8qKOc7LmQUsvnAkBRuHCLlaC1xPwZtyJp0TJyRF8tM3w== +"@nextui-org/autocomplete@2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@nextui-org/autocomplete/-/autocomplete-2.1.7.tgz#d30816f95a89564e3107887d080d03bddbc869ed" + integrity sha512-T3dF5akCXvJ21OxwPxAQmTjHoiB/GMUa2ppcJ9PStfCCPiI2vjwb4CO4q/duj/nXJIpQf/UfPhpSonnJ444o6g== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/button" "2.0.37" - "@nextui-org/input" "2.2.4" - "@nextui-org/listbox" "2.1.25" - "@nextui-org/popover" "2.1.27" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/scroll-shadow" "2.1.19" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/button" "2.0.38" + "@nextui-org/input" "2.2.5" + "@nextui-org/listbox" "2.1.27" + "@nextui-org/popover" "2.1.29" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/scroll-shadow" "2.1.20" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/spinner" "2.0.33" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/spinner" "2.0.34" "@nextui-org/use-aria-button" "2.0.10" "@nextui-org/use-safe-layout-effect" "2.0.6" "@react-aria/combobox" "3.9.1" @@ -658,49 +638,49 @@ "@react-types/combobox" "3.11.1" "@react-types/shared" "3.23.1" -"@nextui-org/avatar@2.0.32": - version "2.0.32" - resolved "https://registry.npmjs.org/@nextui-org/avatar/-/avatar-2.0.32.tgz" - integrity sha512-2dCpIKuGvbOVLJ6m2AkNhPqqamIin3FDqDLop2ILNhyAxgxPYitqE3JqsUA/hlZCzu79sZudruuubzHWzHqf0Q== +"@nextui-org/avatar@2.0.33": + version "2.0.33" + resolved "https://registry.yarnpkg.com/@nextui-org/avatar/-/avatar-2.0.33.tgz#1fe5d199bdc7967a0e19b4a422caf4a832e88740" + integrity sha512-SPnIKM+34T/a+KCRCBiG8VwMBzu2/bap7IPHhmICtQ6KmG8Dzmazj3tGZsVt7HjhMRVY7e1vzev4IMaHqkIdRg== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-image" "2.0.6" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" "@react-aria/utils" "3.24.1" -"@nextui-org/badge@2.0.31": - version "2.0.31" - resolved "https://registry.npmjs.org/@nextui-org/badge/-/badge-2.0.31.tgz" - integrity sha512-ayOw9j6Fa/RxZjk+2AhhBzXFm2Xv2RNYMrXAqGaJ+cbhofsqu8QnP0/4W+CiVXx8C0jpPmNAgSklRXgbKHs10Q== +"@nextui-org/badge@2.0.32": + version "2.0.32" + resolved "https://registry.yarnpkg.com/@nextui-org/badge/-/badge-2.0.32.tgz#b77fff53fbc932120eb6d9275a3301315c323457" + integrity sha512-vlV/SY0e7/AmpVP7hB57XoSOo95Fr3kRWcLfMx8yL8VDR2UWMFaMlrT7JTghdgTGFSO7L1Ov1BFwDRRKVe3eyg== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" -"@nextui-org/breadcrumbs@2.0.12": - version "2.0.12" - resolved "https://registry.npmjs.org/@nextui-org/breadcrumbs/-/breadcrumbs-2.0.12.tgz" - integrity sha512-PCZI7xqu1UrjJcCkd6HwGJ+h2L5k6LMBQRVbD8/7jMKkJxpoQXC7h5uCtEeLG2CafVih4cUCBTuzUnsubtKLnQ== +"@nextui-org/breadcrumbs@2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@nextui-org/breadcrumbs/-/breadcrumbs-2.0.13.tgz#09b036db83430ed7884cc08c756160de6be741ac" + integrity sha512-tdet47IBOwUaJL0PmxTuGH+ZI2nucyNwG3mX1OokfIXmq5HuMCGKaVFXaNP8mWb4Pii2bvtRqaqTfxmUb3kjGw== dependencies: - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@react-aria/breadcrumbs" "3.5.13" "@react-aria/focus" "3.17.1" "@react-aria/utils" "3.24.1" "@react-types/breadcrumbs" "3.7.5" "@react-types/shared" "3.23.1" -"@nextui-org/button@2.0.37": - version "2.0.37" - resolved "https://registry.npmjs.org/@nextui-org/button/-/button-2.0.37.tgz" - integrity sha512-dBtdO30qfu+K4YYLNmmpUy16Q82H1ucY8A4NjP4iEAJ1sPunoAYvba7h9xabrpUKW9IOyItOThSesxsfpaXYug== +"@nextui-org/button@2.0.38": + version "2.0.38" + resolved "https://registry.yarnpkg.com/@nextui-org/button/-/button-2.0.38.tgz#2756bb1d245e53bc3836d3bff3ffc6f0f03d52ac" + integrity sha512-XbgyqBv+X7QirXeriGwkqkMOENpAxXRo+jzfMyBMvfsM3kwrFj92OSF1F7/dWDvcW7imVZB9o2Ci7LIppq9ZZQ== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/ripple" "2.0.32" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/spinner" "2.0.33" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/ripple" "2.0.33" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/spinner" "2.0.34" "@nextui-org/use-aria-button" "2.0.10" "@react-aria/button" "3.9.5" "@react-aria/focus" "3.17.1" @@ -709,17 +689,17 @@ "@react-types/button" "3.9.4" "@react-types/shared" "3.23.1" -"@nextui-org/calendar@2.0.11": - version "2.0.11" - resolved "https://registry.npmjs.org/@nextui-org/calendar/-/calendar-2.0.11.tgz" - integrity sha512-pgCEekJHSr5QKxpJaABIFS2ItqgK8qZ7pKrCOJjmRHBh4Y9WGfndrIW6z3IkHZiO01CKJbpjb9ytTjufsU6kIA== +"@nextui-org/calendar@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@nextui-org/calendar/-/calendar-2.0.12.tgz#e3e5df719cd08b710a51602d279a25d737b3c5b2" + integrity sha512-FnEnOQnsuyN+F+hy4LEJBvZZcfXMpDGgLkTdnDdoZObXQWwd0PWPjU8GzY+ukhhR5eiU7QIj2AADVRCvuAkiLA== dependencies: "@internationalized/date" "^3.5.4" - "@nextui-org/button" "2.0.37" - "@nextui-org/framer-utils" "2.0.24" - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/button" "2.0.38" + "@nextui-org/framer-utils" "2.0.25" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-aria-button" "2.0.10" "@react-aria/calendar" "3.5.8" "@react-aria/focus" "3.17.1" @@ -736,14 +716,14 @@ lodash.debounce "^4.0.8" scroll-into-view-if-needed "3.0.10" -"@nextui-org/card@2.0.33": - version "2.0.33" - resolved "https://registry.npmjs.org/@nextui-org/card/-/card-2.0.33.tgz" - integrity sha512-iO/ThbUz75YlcFrWO9EssMhOxbc9LN0SSk181+2QnPDbKls9wbkUEfGjq/d9k3h6jb9FaR5N5XwVpT4aUt2Usw== +"@nextui-org/card@2.0.34": + version "2.0.34" + resolved "https://registry.yarnpkg.com/@nextui-org/card/-/card-2.0.34.tgz#d9c7f68f84f86dcb4965a365a59e122e75e252b4" + integrity sha512-2RYNPsQkM0FOifGCKmRBR3AuYgYCNmPV7dyA5M3D9Lf0APsHHtsXRA/GeIJ/AuPnglZrYBX8wpM5kLt3dnlQjQ== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/ripple" "2.0.32" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/ripple" "2.0.33" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-aria-button" "2.0.10" "@react-aria/button" "3.9.5" "@react-aria/focus" "3.17.1" @@ -751,13 +731,13 @@ "@react-aria/utils" "3.24.1" "@react-types/shared" "3.23.1" -"@nextui-org/checkbox@2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@nextui-org/checkbox/-/checkbox-2.1.4.tgz" - integrity sha512-74AD4imL064mvs4trQKQj/efwIZYaBt0TmXO6jV+6xGE6S9YjCAy+OBotrgRBG9fURQVQU1qJGnwwsOIdxCXkA== +"@nextui-org/checkbox@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nextui-org/checkbox/-/checkbox-2.1.5.tgz#6b3083b7b53cf8a6e3c20e6063ca21a66866432e" + integrity sha512-PSCWmxEzFPfeIJfoGAtbQS5T7JvBRblUMz5NdCMArA8MLvWW8EKL41cMPsqWjaUanjD0fAI8Q9HuDfBZnkcPbw== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-callback-ref" "2.0.6" "@nextui-org/use-safe-layout-effect" "2.0.6" "@react-aria/checkbox" "3.14.3" @@ -770,36 +750,36 @@ "@react-types/checkbox" "3.8.1" "@react-types/shared" "3.23.1" -"@nextui-org/chip@2.0.32": - version "2.0.32" - resolved "https://registry.npmjs.org/@nextui-org/chip/-/chip-2.0.32.tgz" - integrity sha512-fGqXamG7xs+DvKPra+rJEkIAjaQwPi8FSvsJ4P4LWzQ3U+HjymEI07BW8xQmaLceHInbTLTfdbTjAYdGNzAdOQ== +"@nextui-org/chip@2.0.33": + version "2.0.33" + resolved "https://registry.yarnpkg.com/@nextui-org/chip/-/chip-2.0.33.tgz#816ca9bf9bf183aa8891cceeb239d3c8af778780" + integrity sha512-6cQkMTV/34iPprjnfK6xlwkv5lnZjMsbYBN3ZqHHrQfV2zQg19ewFcuIw9XlRYA3pGYPpoycdOmSdQ6qXc66lQ== dependencies: - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" "@react-aria/utils" "3.24.1" "@react-types/checkbox" "3.8.1" -"@nextui-org/code@2.0.32": - version "2.0.32" - resolved "https://registry.npmjs.org/@nextui-org/code/-/code-2.0.32.tgz" - integrity sha512-YBLCWDgR+ebWIr+noN02/ls+PsQV9leLskgPLFUfpRzHoXdGeUUhE8IjTv14KFP3XlW3Cf9ALFy3IgPuIZ+yuQ== +"@nextui-org/code@2.0.33": + version "2.0.33" + resolved "https://registry.yarnpkg.com/@nextui-org/code/-/code-2.0.33.tgz#04ba9280e08505c6c4a57cac029f6db1411cac55" + integrity sha512-G2254ov2rsPxFEoJ0UHVHe+rSmNYwoHZc7STAtiTsJ2HfebZPQbNnfuCifMIpa+kgvHrMBGb85eGk0gy1R+ArA== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/system-rsc" "2.1.5" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/system-rsc" "2.1.6" -"@nextui-org/date-input@2.1.3": - version "2.1.3" - resolved "https://registry.npmjs.org/@nextui-org/date-input/-/date-input-2.1.3.tgz" - integrity sha512-Y6d+AVPnM7uYy7boSHrk+cW/pft1fKbpXh/ed5omTgFx6rKRZ/agQmP5erMcmNzpv3Bis4wCc89WNnBtCjEZMw== +"@nextui-org/date-input@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nextui-org/date-input/-/date-input-2.1.4.tgz#7705694ad313420b9b9d9a9574cacd9a143ac33a" + integrity sha512-U8Pbe7EhMp9VTfFxB/32+A9N9cJJWswebIz1qpaPy0Hmr92AHS3c1qVTcspkop6wbIM8AnHWEST0QkR95IXPDA== dependencies: "@internationalized/date" "^3.5.4" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@react-aria/datepicker" "3.10.1" "@react-aria/i18n" "3.11.1" "@react-aria/utils" "3.24.1" @@ -807,20 +787,20 @@ "@react-types/datepicker" "3.7.4" "@react-types/shared" "3.23.1" -"@nextui-org/date-picker@2.1.6": - version "2.1.6" - resolved "https://registry.npmjs.org/@nextui-org/date-picker/-/date-picker-2.1.6.tgz" - integrity sha512-PycYKAm1tmew64aQWQtZfTbV73S4GPGYJnK6hr9W0iXUCOQQH5UbzLwdWGXnVXvtrJzczFQllaXaQccwWCeTzg== +"@nextui-org/date-picker@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@nextui-org/date-picker/-/date-picker-2.1.8.tgz#6a3c343e9f34e6e0197d441dcd67b4c3496302b7" + integrity sha512-pokAFcrf6AdM53QHf1EzvqVhj8imQRZHWitK9eZPtIdGzJzx28dW0ir7ID0lQFMiNNIQTesSpBLzedTawbcJrg== dependencies: "@internationalized/date" "^3.5.4" - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/button" "2.0.37" - "@nextui-org/calendar" "2.0.11" - "@nextui-org/date-input" "2.1.3" - "@nextui-org/popover" "2.1.27" - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/button" "2.0.38" + "@nextui-org/calendar" "2.0.12" + "@nextui-org/date-input" "2.1.4" + "@nextui-org/popover" "2.1.29" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@react-aria/datepicker" "3.10.1" "@react-aria/i18n" "3.11.1" "@react-aria/utils" "3.24.1" @@ -830,58 +810,58 @@ "@react-types/datepicker" "3.7.4" "@react-types/shared" "3.23.1" -"@nextui-org/divider@2.0.31": - version "2.0.31" - resolved "https://registry.npmjs.org/@nextui-org/divider/-/divider-2.0.31.tgz" - integrity sha512-z9GhrpmhXhJGuW0GSO1OP01mwDTSItuIRIz0VGpKOPVTqOzOMHkXN978wgNXqJ+knWZcaiF7WHvd83O05jmbkg== +"@nextui-org/divider@2.0.32": + version "2.0.32" + resolved "https://registry.yarnpkg.com/@nextui-org/divider/-/divider-2.0.32.tgz#831a19f454e4dd259662134a066e6e6c25576f42" + integrity sha512-2B2j3VmvVDFnMc9Uw7UWMkByA+osgnRmVwMZNZjl9g3oCycz3UDXotNJXjgsLocT8tGO8UwMcrdgo7QBZl52uw== dependencies: - "@nextui-org/react-rsc-utils" "2.0.13" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/system-rsc" "2.1.5" + "@nextui-org/react-rsc-utils" "2.0.14" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/system-rsc" "2.1.6" "@react-types/shared" "3.23.1" -"@nextui-org/dropdown@2.1.29": - version "2.1.29" - resolved "https://registry.npmjs.org/@nextui-org/dropdown/-/dropdown-2.1.29.tgz" - integrity sha512-ujHJVHzOcfwqNqlkt14t8YV3AAn03sME7gBxujQcwtDFGYMJeP9pvTU24L/FjBEb3Fd1XdhjwowU/sTuVTK4Yg== +"@nextui-org/dropdown@2.1.31": + version "2.1.31" + resolved "https://registry.yarnpkg.com/@nextui-org/dropdown/-/dropdown-2.1.31.tgz#4606509b00101f9a04a420400837485fe0390081" + integrity sha512-tP6c5MAhWK4hJ6U02oX6APUpjjrn97Zn7t+56Xx4YyQOSj0CJx18VF0JsU+MrjFZxPX3UBKU3B2zGBHOEGE4Kw== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/menu" "2.0.28" - "@nextui-org/popover" "2.1.27" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/menu" "2.0.30" + "@nextui-org/popover" "2.1.29" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@react-aria/focus" "3.17.1" "@react-aria/menu" "3.14.1" "@react-aria/utils" "3.24.1" "@react-stately/menu" "3.7.1" "@react-types/menu" "3.9.9" -"@nextui-org/framer-utils@2.0.24": - version "2.0.24" - resolved "https://registry.npmjs.org/@nextui-org/framer-utils/-/framer-utils-2.0.24.tgz" - integrity sha512-Fc5ugVaLsXhd3bgJg+hvw20uaaz9gAxYY2ouS/3leN7QBSRAwpy3Dl+tX8BbLeyx3ZosVrHIJ3w4bhDMzFVk9Q== +"@nextui-org/framer-utils@2.0.25": + version "2.0.25" + resolved "https://registry.yarnpkg.com/@nextui-org/framer-utils/-/framer-utils-2.0.25.tgz#f8abb375ab4efe9a6514c7219e8b8ae32398f5fa" + integrity sha512-bhQKDg4c5Da4II4UYLKyvYagusTd62eVwPqpfUP+GHZKKZcmRaS6MQZTh4xJYbpyh298S4jRSH/AUAiN/OK3TQ== dependencies: - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/system" "2.2.5" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/system" "2.2.6" "@nextui-org/use-measure" "2.0.2" -"@nextui-org/image@2.0.31": - version "2.0.31" - resolved "https://registry.npmjs.org/@nextui-org/image/-/image-2.0.31.tgz" - integrity sha512-HxWaGUBtNaT9pLGvDo5Q2ruGxdhXYrdNcLvRhtoohiZeIKo1Y8jTbBUCVGxdxklTZAF3H7klrTcsdSwHTGfk0g== +"@nextui-org/image@2.0.32": + version "2.0.32" + resolved "https://registry.yarnpkg.com/@nextui-org/image/-/image-2.0.32.tgz#4011ca965f691a615fcc396aaf09542ebcc47927" + integrity sha512-JpE0O8qAeJpQA61ZnXNLH76to+dbx93PR5tTOxSvmTxtnuqVg4wl5ar/SBY3czibJPr0sj33k8Mv2EfULjoH7Q== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-image" "2.0.6" -"@nextui-org/input@2.2.4": - version "2.2.4" - resolved "https://registry.npmjs.org/@nextui-org/input/-/input-2.2.4.tgz" - integrity sha512-CVeTwwUJn9pEJC+kq3Jg0nAFeYVGBbIU7U2YFSG8XJK2X75odj8RSQdVd3Dt2U/b5Mtwt5sBh9gMzCedtjffWg== +"@nextui-org/input@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@nextui-org/input/-/input-2.2.5.tgz#3894addc37811ba498aed9b64b89fd6fd3f93e8a" + integrity sha512-xLgyKcnb+RatRZ62AbCFfTpS3exd2bPSSR75UFKylHHhgX+nvVOkX0dQgmr9e0V8IEECeRvbltw2s/laNFPTtg== dependencies: - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-safe-layout-effect" "2.0.6" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" @@ -892,39 +872,39 @@ "@react-types/textfield" "3.9.3" react-textarea-autosize "^8.5.3" -"@nextui-org/kbd@2.0.33": - version "2.0.33" - resolved "https://registry.npmjs.org/@nextui-org/kbd/-/kbd-2.0.33.tgz" - integrity sha512-1Q7vKKJjfn5RPMsySQEljo2clf03Ta4V4ZA4O92ktJ8YzbdNnDfUiWtfFxF64R183ZVfe869RBSpuOdzZLNuKQ== +"@nextui-org/kbd@2.0.34": + version "2.0.34" + resolved "https://registry.yarnpkg.com/@nextui-org/kbd/-/kbd-2.0.34.tgz#a83026ec29ab951c4571a58d238175f18a5f85f8" + integrity sha512-sO6RJPgEFccFV8gmfYMTVeQ4f9PBYh09OieRpsZhN4HqdfWwEaeT6LrmdBko3XnJ0T6Me3tBrYULgKWcDcNogw== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/system-rsc" "2.1.5" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/system-rsc" "2.1.6" "@react-aria/utils" "3.24.1" -"@nextui-org/link@2.0.34": - version "2.0.34" - resolved "https://registry.npmjs.org/@nextui-org/link/-/link-2.0.34.tgz" - integrity sha512-497AvjzckEB/TE1eJEziS2QkxwCY81RPsWoApNSeHGdYrMO1tfgUFKATgadfBQjoba6FdCcLc2QaUapOetqFaA== +"@nextui-org/link@2.0.35": + version "2.0.35" + resolved "https://registry.yarnpkg.com/@nextui-org/link/-/link-2.0.35.tgz#ce0428a8cc3e9dc0a8a6481bb39f1ea369aea9e8" + integrity sha512-0XVUsSsysu+WMssokTlLHiMnjr1N6D2Uh3bIBcdFwSqmTLyq+Llgexlm6Fuv1wADRwsR8/DGFp3Pr826cv2Svg== dependencies: - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-aria-link" "2.0.19" "@react-aria/focus" "3.17.1" "@react-aria/link" "3.7.1" "@react-aria/utils" "3.24.1" "@react-types/link" "3.5.5" -"@nextui-org/listbox@2.1.25": - version "2.1.25" - resolved "https://registry.npmjs.org/@nextui-org/listbox/-/listbox-2.1.25.tgz" - integrity sha512-WJqxhzPxADLIsenREaaoQ44bs3gQx5yqOvK86Jkiv/m9nXr0YuxZOJEsVa5GenkmyJBrEd6LkBV5cZ1TGNzbJw== +"@nextui-org/listbox@2.1.27": + version "2.1.27" + resolved "https://registry.yarnpkg.com/@nextui-org/listbox/-/listbox-2.1.27.tgz#1a6cfd5b4fa507226bbf53407aa0c17768fa980c" + integrity sha512-B9HW/k0awfXsYaNyjaqv/GvEioVzrsCsOdSxVQZgQ3wQ6jNXmGRe1/X6IKg0fIa+P0v379kSgAqrZcwfRpKnWw== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/divider" "2.0.31" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/divider" "2.0.32" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-is-mobile" "2.0.9" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" @@ -934,16 +914,16 @@ "@react-types/menu" "3.9.9" "@react-types/shared" "3.23.1" -"@nextui-org/menu@2.0.28": - version "2.0.28" - resolved "https://registry.npmjs.org/@nextui-org/menu/-/menu-2.0.28.tgz" - integrity sha512-/bcIeBCGpauDkdz6VZvl1YXP5xpSSSYVTvhsChkcvzWzDXLG004uVAsw4kjP2i9OGxoehrjkl9wkIzCFCEdsHw== +"@nextui-org/menu@2.0.30": + version "2.0.30" + resolved "https://registry.yarnpkg.com/@nextui-org/menu/-/menu-2.0.30.tgz#68dd28d06c37631eeb4af0e74cd4ca904aedcfd5" + integrity sha512-hZRr/EQ5JxB6yQFmUhDSv9pyLTJmaB4SFC/t5A17UljRhMexlvTU6QpalYIkbY0R/bUXvOkTJNzsRgI5OOQ/aA== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/divider" "2.0.31" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/use-aria-menu" "2.0.6" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/divider" "2.0.32" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/use-aria-menu" "2.0.7" "@nextui-org/use-is-mobile" "2.0.9" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" @@ -954,17 +934,17 @@ "@react-types/menu" "3.9.9" "@react-types/shared" "3.23.1" -"@nextui-org/modal@2.0.39": - version "2.0.39" - resolved "https://registry.npmjs.org/@nextui-org/modal/-/modal-2.0.39.tgz" - integrity sha512-b0G5IRNrfQumx8mQQO92rn2iC2ueUuk4XKvxYYmYNpx3/qpdEP9tckozw+s0QFyZocRPY+yYa0pBtMBGC2lWGQ== +"@nextui-org/modal@2.0.41": + version "2.0.41" + resolved "https://registry.yarnpkg.com/@nextui-org/modal/-/modal-2.0.41.tgz#3fba82661413236e9b41f3b4d6c50c3205d6292c" + integrity sha512-Sirn319xAf7E4cZqvQ0o0Vd3Xqy0FRSuhOTwp8dALMGTMY61c2nIyurgVCNP6hh8dMvMT7zQEPP9/LE0boFCEQ== dependencies: - "@nextui-org/framer-utils" "2.0.24" - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/framer-utils" "2.0.25" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-aria-button" "2.0.10" - "@nextui-org/use-aria-modal-overlay" "2.0.11" + "@nextui-org/use-aria-modal-overlay" "2.0.13" "@nextui-org/use-disclosure" "2.0.10" "@react-aria/dialog" "3.5.14" "@react-aria/focus" "3.17.1" @@ -974,16 +954,16 @@ "@react-stately/overlays" "3.6.7" "@react-types/overlays" "3.8.7" -"@nextui-org/navbar@2.0.36": - version "2.0.36" - resolved "https://registry.npmjs.org/@nextui-org/navbar/-/navbar-2.0.36.tgz" - integrity sha512-uobdPsh4TSPm2Us74/Vey43z0/oRqWb6x4+eHIJf9VhYP9pY733N2n17v2mvU7SvcNhkold/PWfXPYiA8kMlug== +"@nextui-org/navbar@2.0.37": + version "2.0.37" + resolved "https://registry.yarnpkg.com/@nextui-org/navbar/-/navbar-2.0.37.tgz#ccc1be6d43b35eedab251f3ecc8e1d0fd03f01ac" + integrity sha512-HuHXMU+V367LlvSGjqRPBNKmOERLvc4XWceva+KmiT99BLqHmMECkQVTR6ogO36eJUU96aR8JSfAiHLjvw5msw== dependencies: - "@nextui-org/framer-utils" "2.0.24" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/framer-utils" "2.0.25" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-aria-toggle-button" "2.0.10" - "@nextui-org/use-scroll-position" "2.0.8" + "@nextui-org/use-scroll-position" "2.0.9" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" "@react-aria/overlays" "3.22.1" @@ -992,31 +972,31 @@ "@react-stately/utils" "3.10.1" react-remove-scroll "^2.5.6" -"@nextui-org/pagination@2.0.35": - version "2.0.35" - resolved "https://registry.npmjs.org/@nextui-org/pagination/-/pagination-2.0.35.tgz" - integrity sha512-07KJgZcJBt2e9RY6TsiQm5qrjDLH+gT3yB7yQ4jPdCK9fkTB0r2kvTOYdPUvrtVJYRq2bwFCWOz+9mokdNfcwg== +"@nextui-org/pagination@2.0.36": + version "2.0.36" + resolved "https://registry.yarnpkg.com/@nextui-org/pagination/-/pagination-2.0.36.tgz#75728369c02b6ecbb4d400f376a8195707612358" + integrity sha512-VKs2vMj8dybNzb/WkAMmvFBsxdgBvpVihIA4eXSo2ve7fpcLjIF1iPLHuDgpSyv3h3dy009sQTVo3lVTVT1a6w== dependencies: - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/use-pagination" "2.0.9" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/use-pagination" "2.0.10" "@react-aria/focus" "3.17.1" "@react-aria/i18n" "3.11.1" "@react-aria/interactions" "3.21.3" "@react-aria/utils" "3.24.1" scroll-into-view-if-needed "3.0.10" -"@nextui-org/popover@2.1.27": - version "2.1.27" - resolved "https://registry.npmjs.org/@nextui-org/popover/-/popover-2.1.27.tgz" - integrity sha512-UV42nqvUR9IOy7Hgc5S2Xo+2YWzBAHCcU+C/9O9SchXL0DyU/ol+IPqxuBxdJDi5fiFYr9mTBoPZgAEGDoJjDg== +"@nextui-org/popover@2.1.29": + version "2.1.29" + resolved "https://registry.yarnpkg.com/@nextui-org/popover/-/popover-2.1.29.tgz#2972ff0f0ebc73afc5ec934bf026cdaba72d99fd" + integrity sha512-qGjMnAQVHQNfG571h9Tah2MXPs5mhxcTIj4TuBgwPzQTWXjjeffaHV3FlHdg5PxjTpNZOdDfrg0eRhDqIjKocQ== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/button" "2.0.37" - "@nextui-org/framer-utils" "2.0.24" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/button" "2.0.38" + "@nextui-org/framer-utils" "2.0.25" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-aria-button" "2.0.10" "@nextui-org/use-safe-layout-effect" "2.0.6" "@react-aria/dialog" "3.5.14" @@ -1029,26 +1009,26 @@ "@react-types/overlays" "3.8.7" react-remove-scroll "^2.5.6" -"@nextui-org/progress@2.0.33": - version "2.0.33" - resolved "https://registry.npmjs.org/@nextui-org/progress/-/progress-2.0.33.tgz" - integrity sha512-rP54lZbH7BSzX9sFj7k3ylrUpk10XDWngc1dB1M+GlPsI2XRnzI3s+GE9kuZG2+N6eL/KLVG1YOg8u9eAYnwpA== +"@nextui-org/progress@2.0.34": + version "2.0.34" + resolved "https://registry.yarnpkg.com/@nextui-org/progress/-/progress-2.0.34.tgz#05272545c4a06a637c76ea556f57e88ce2e6e3e8" + integrity sha512-rJmZCrLdufJKLsonJ37oPOEHEpZykD4c+0G749zcKOkRXHOD9DiQian2YoZEE/Yyf3pLdFQG3W9vSLbsgED3PQ== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-is-mounted" "2.0.6" "@react-aria/i18n" "3.11.1" "@react-aria/progress" "3.4.13" "@react-aria/utils" "3.24.1" "@react-types/progress" "3.5.4" -"@nextui-org/radio@2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@nextui-org/radio/-/radio-2.1.4.tgz" - integrity sha512-Y18TXvGVz/G1E3jjYmutSSx1EdQRs5iMCVZNS/Bz4avE9QMSrHl6fOhZIndrm8LwCTqn7lbKRQngZLN4tvPinQ== +"@nextui-org/radio@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nextui-org/radio/-/radio-2.1.5.tgz#6e8359b1a52313c668a4468211b10522eed0df05" + integrity sha512-0tF/VkMQv+KeYmFQpkrpz9S7j7U8gqCet+F97Cz7fFjdb+Q3w9waBzg84QayD7EZdjsYW4FNSkjPeiBhLdVUsw== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" "@react-aria/radio" "3.10.4" @@ -1058,101 +1038,101 @@ "@react-types/radio" "3.8.1" "@react-types/shared" "3.23.1" -"@nextui-org/react-rsc-utils@2.0.13": - version "2.0.13" - resolved "https://registry.npmjs.org/@nextui-org/react-rsc-utils/-/react-rsc-utils-2.0.13.tgz" - integrity sha512-QewsXtoQlMsR9stThdazKEImg9oyZkPLs7wsymhrzh6/HdQCl9bTdb6tJcROg4vg5LRYKGG11USSQO2nKlfCcQ== +"@nextui-org/react-rsc-utils@2.0.14": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@nextui-org/react-rsc-utils/-/react-rsc-utils-2.0.14.tgz#277523854e594858c0b713df783f2d5228915f83" + integrity sha512-s0GVgDhScyx+d9FtXd8BXf049REyaPvWsO4RRr7JDHrk91NlQ11Mqxka9o+8g5NX0rphI0rbe3/b1Dz+iQRx3w== -"@nextui-org/react-utils@2.0.16": - version "2.0.16" - resolved "https://registry.npmjs.org/@nextui-org/react-utils/-/react-utils-2.0.16.tgz" - integrity sha512-QdDoqzhx+4t9cDTVmtw5iOrfyLvpqyKsq8PARHUniCiQQDQd1ao7FCpzHgvU9poYcEdRk+Lsna66zbeMkFBB6w== +"@nextui-org/react-utils@2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@nextui-org/react-utils/-/react-utils-2.0.17.tgz#3ed7903496ca8a9f5678ad816a2b24f1cd0581f9" + integrity sha512-U/b49hToVfhOM4dg4n57ZyUjLpts4JogQ139lfQBYPTb8z/ATNsJ3vLIqW5ZvDK6L0Er+JT11UVQ+03m7QMvaQ== dependencies: - "@nextui-org/react-rsc-utils" "2.0.13" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-rsc-utils" "2.0.14" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/react@^2.4.2": - version "2.4.6" - resolved "https://registry.npmjs.org/@nextui-org/react/-/react-2.4.6.tgz" - integrity sha512-8o/k5A5g0xXj6hmV2AulkAswQnZGt2WI64Coq+toWBTumQLcW6iAqPJBDztCDiz+6yiU6Nvk/1ZuZJeRs3XMRw== + version "2.4.8" + resolved "https://registry.yarnpkg.com/@nextui-org/react/-/react-2.4.8.tgz#2a430cca1d2e1dc812a55ca763d61e2ba5b0e195" + integrity sha512-ZwXg6As3A+Gs+Jyc42t4MHNupHEsh9YmEaypE20ikqIPTCLQnrGQ/RWOGwzZ2a9kZWbZ89a/3rJwZMRKdcemxg== dependencies: - "@nextui-org/accordion" "2.0.38" - "@nextui-org/autocomplete" "2.1.5" - "@nextui-org/avatar" "2.0.32" - "@nextui-org/badge" "2.0.31" - "@nextui-org/breadcrumbs" "2.0.12" - "@nextui-org/button" "2.0.37" - "@nextui-org/calendar" "2.0.11" - "@nextui-org/card" "2.0.33" - "@nextui-org/checkbox" "2.1.4" - "@nextui-org/chip" "2.0.32" - "@nextui-org/code" "2.0.32" - "@nextui-org/date-input" "2.1.3" - "@nextui-org/date-picker" "2.1.6" - "@nextui-org/divider" "2.0.31" - "@nextui-org/dropdown" "2.1.29" - "@nextui-org/framer-utils" "2.0.24" - "@nextui-org/image" "2.0.31" - "@nextui-org/input" "2.2.4" - "@nextui-org/kbd" "2.0.33" - "@nextui-org/link" "2.0.34" - "@nextui-org/listbox" "2.1.25" - "@nextui-org/menu" "2.0.28" - "@nextui-org/modal" "2.0.39" - "@nextui-org/navbar" "2.0.36" - "@nextui-org/pagination" "2.0.35" - "@nextui-org/popover" "2.1.27" - "@nextui-org/progress" "2.0.33" - "@nextui-org/radio" "2.1.4" - "@nextui-org/ripple" "2.0.32" - "@nextui-org/scroll-shadow" "2.1.19" - "@nextui-org/select" "2.2.5" - "@nextui-org/skeleton" "2.0.31" - "@nextui-org/slider" "2.2.15" - "@nextui-org/snippet" "2.0.41" - "@nextui-org/spacer" "2.0.32" - "@nextui-org/spinner" "2.0.33" - "@nextui-org/switch" "2.0.33" - "@nextui-org/system" "2.2.5" - "@nextui-org/table" "2.0.39" - "@nextui-org/tabs" "2.0.35" - "@nextui-org/theme" "2.2.9" - "@nextui-org/tooltip" "2.0.39" - "@nextui-org/user" "2.0.33" + "@nextui-org/accordion" "2.0.40" + "@nextui-org/autocomplete" "2.1.7" + "@nextui-org/avatar" "2.0.33" + "@nextui-org/badge" "2.0.32" + "@nextui-org/breadcrumbs" "2.0.13" + "@nextui-org/button" "2.0.38" + "@nextui-org/calendar" "2.0.12" + "@nextui-org/card" "2.0.34" + "@nextui-org/checkbox" "2.1.5" + "@nextui-org/chip" "2.0.33" + "@nextui-org/code" "2.0.33" + "@nextui-org/date-input" "2.1.4" + "@nextui-org/date-picker" "2.1.8" + "@nextui-org/divider" "2.0.32" + "@nextui-org/dropdown" "2.1.31" + "@nextui-org/framer-utils" "2.0.25" + "@nextui-org/image" "2.0.32" + "@nextui-org/input" "2.2.5" + "@nextui-org/kbd" "2.0.34" + "@nextui-org/link" "2.0.35" + "@nextui-org/listbox" "2.1.27" + "@nextui-org/menu" "2.0.30" + "@nextui-org/modal" "2.0.41" + "@nextui-org/navbar" "2.0.37" + "@nextui-org/pagination" "2.0.36" + "@nextui-org/popover" "2.1.29" + "@nextui-org/progress" "2.0.34" + "@nextui-org/radio" "2.1.5" + "@nextui-org/ripple" "2.0.33" + "@nextui-org/scroll-shadow" "2.1.20" + "@nextui-org/select" "2.2.7" + "@nextui-org/skeleton" "2.0.32" + "@nextui-org/slider" "2.2.17" + "@nextui-org/snippet" "2.0.43" + "@nextui-org/spacer" "2.0.33" + "@nextui-org/spinner" "2.0.34" + "@nextui-org/switch" "2.0.34" + "@nextui-org/system" "2.2.6" + "@nextui-org/table" "2.0.40" + "@nextui-org/tabs" "2.0.37" + "@nextui-org/theme" "2.2.11" + "@nextui-org/tooltip" "2.0.41" + "@nextui-org/user" "2.0.34" "@react-aria/visually-hidden" "3.8.12" -"@nextui-org/ripple@2.0.32": - version "2.0.32" - resolved "https://registry.npmjs.org/@nextui-org/ripple/-/ripple-2.0.32.tgz" - integrity sha512-xOqoHWzpvv5KRh7P8pXt3aZEmI1tyhiTNhrwjJaRME0d5xSA0gNzYhrjP5g0+Dxy4nKRDIZ1znJcd87KI07JFA== +"@nextui-org/ripple@2.0.33": + version "2.0.33" + resolved "https://registry.yarnpkg.com/@nextui-org/ripple/-/ripple-2.0.33.tgz#b50e3d026566e30b5bbbee669985cbc38544a27a" + integrity sha512-Zsa60CXtGCF7weTCFbSfT0OlxlGHdd5b/sSJTYrmMZRHOIUpHW8kT0bxVYF/6X8nCCJYxzBKXUqdE3Y31fhNeQ== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" -"@nextui-org/scroll-shadow@2.1.19": - version "2.1.19" - resolved "https://registry.npmjs.org/@nextui-org/scroll-shadow/-/scroll-shadow-2.1.19.tgz" - integrity sha512-od5AnhX6iO0sHoTAVReWv1O1dbNCEeOBOFdnyzFins6ZC5EnAl/oBPR/KLd8glHtgM3Jt8dvIVlBXPEPZKZwaw== +"@nextui-org/scroll-shadow@2.1.20": + version "2.1.20" + resolved "https://registry.yarnpkg.com/@nextui-org/scroll-shadow/-/scroll-shadow-2.1.20.tgz#9d6934cf3f8807f66e5b0280d61d484817ab7ec6" + integrity sha512-8ULiUmbZ/Jzr1okI8Yzjzl5M4Ow3pJEm34hT5id0EaMIgklNa3Nnp/Dyp54JwwUbI8Kt3jOAMqkPitGIZyo5Ag== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/use-data-scroll-overflow" "2.1.6" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/use-data-scroll-overflow" "2.1.7" -"@nextui-org/select@2.2.5": - version "2.2.5" - resolved "https://registry.npmjs.org/@nextui-org/select/-/select-2.2.5.tgz" - integrity sha512-Il1eigjSXOBgJ745nhn6TDPD1jj1avrnvk9WV/DCjOsFRwfstRnDzsS1aNpZKHqJgHhFRQZ1ivz8hA4x3Zgasg== +"@nextui-org/select@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@nextui-org/select/-/select-2.2.7.tgz#991468745b5a4aa61e4dbd0bd99a9ad6724ee79f" + integrity sha512-lA2EOjquhiHmLSInHFEarq64ZOQV37+ry1d8kvsqJ7R9dsqw1QEuMzH2Kk8/NqwrYMccHh5iAZ7PaLp90NSSxg== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/listbox" "2.1.25" - "@nextui-org/popover" "2.1.27" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/scroll-shadow" "2.1.19" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/listbox" "2.1.27" + "@nextui-org/popover" "2.1.29" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/scroll-shadow" "2.1.20" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/spinner" "2.0.33" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/spinner" "2.0.34" "@nextui-org/use-aria-button" "2.0.10" - "@nextui-org/use-aria-multiselect" "2.2.3" + "@nextui-org/use-aria-multiselect" "2.2.5" "@nextui-org/use-safe-layout-effect" "2.0.6" "@react-aria/focus" "3.17.1" "@react-aria/form" "3.0.5" @@ -1163,30 +1143,30 @@ "@nextui-org/shared-icons@2.0.9": version "2.0.9" - resolved "https://registry.npmjs.org/@nextui-org/shared-icons/-/shared-icons-2.0.9.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/shared-icons/-/shared-icons-2.0.9.tgz#ecc674ec51ba7f0570ee821aed317fba4cc70376" integrity sha512-WG3yinVY7Tk9VqJgcdF4V8Ok9+fcm5ey7S1els7kujrfqLYxtqoKywgiY/7QHwZlfQkzpykAfy+NAlHkTP5hMg== -"@nextui-org/shared-utils@2.0.7": - version "2.0.7" - resolved "https://registry.npmjs.org/@nextui-org/shared-utils/-/shared-utils-2.0.7.tgz" - integrity sha512-FxY3N0i1Al7Oz3yOQN0dSpG8UUrLIP3iYh3ubD7BhdQoZLl5xbG6++q1gqOzZXV+ZWeUFMY/or0ofzWxGHiOow== +"@nextui-org/shared-utils@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@nextui-org/shared-utils/-/shared-utils-2.0.8.tgz#6e6e71a067c273581839c2226fd9fb4e1e3a3410" + integrity sha512-ZEtoMPXS+IjT8GvpJTS9IWDnT1JNCKV+NDqqgysAf1niJmOFLyJgl6dh/9n4ufcGf1GbSEQN+VhJasEw7ajYGQ== -"@nextui-org/skeleton@2.0.31": - version "2.0.31" - resolved "https://registry.npmjs.org/@nextui-org/skeleton/-/skeleton-2.0.31.tgz" - integrity sha512-pT0l2skPP6Nq9edLJNQxUJI/WLKu4Lx5Vvs7nlE/9NpkxyQ805l4LiYsMD30dkjjxe+WpXtIjjAXY0BQqdid0Q== +"@nextui-org/skeleton@2.0.32": + version "2.0.32" + resolved "https://registry.yarnpkg.com/@nextui-org/skeleton/-/skeleton-2.0.32.tgz#3815157bd137e5dd4004db22af0c56c6b216d7da" + integrity sha512-dS0vuRrc4oWktW3wa/KFhcBNnV0oiDqKXP4BqRj7wgS01fOAqj3cJiqwUDLKO8GbEnxLkbqLBFcUoLgktpRszQ== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" -"@nextui-org/slider@2.2.15": - version "2.2.15" - resolved "https://registry.npmjs.org/@nextui-org/slider/-/slider-2.2.15.tgz" - integrity sha512-ImsxvxAJ2wxRL45y4IbVWThZI/vw2Gq/6qUVZFAwyF54dlro08eJZJIOOG7bKfA5Ob63JLfroUijrlZ9kGP5cA== +"@nextui-org/slider@2.2.17": + version "2.2.17" + resolved "https://registry.yarnpkg.com/@nextui-org/slider/-/slider-2.2.17.tgz#f40b7a04d272a8fc191d52b27887861fd2c75d39" + integrity sha512-MgeJv3X+bT7Bw+LK1zba4vToOUzv8lCvDuGe0U5suJy1AKGN6uGDgSAxpIZhCYNWsuNRsopwdvsGtyeIjOEStA== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/tooltip" "2.0.39" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/tooltip" "2.0.41" "@react-aria/focus" "3.17.1" "@react-aria/i18n" "3.11.1" "@react-aria/interactions" "3.21.3" @@ -1195,45 +1175,45 @@ "@react-aria/visually-hidden" "3.8.12" "@react-stately/slider" "3.5.4" -"@nextui-org/snippet@2.0.41": - version "2.0.41" - resolved "https://registry.npmjs.org/@nextui-org/snippet/-/snippet-2.0.41.tgz" - integrity sha512-ZZopaecAZbKJIdabwGVF3ahL2MM7L0zZII61SO3LDPAwqXOuta9ixMYk1XVCI0V2PVqTkabQgdpt1ZLgmFH+Kw== +"@nextui-org/snippet@2.0.43": + version "2.0.43" + resolved "https://registry.yarnpkg.com/@nextui-org/snippet/-/snippet-2.0.43.tgz#759ac8b4693c6dd1a95f40520f92476f7fc2843b" + integrity sha512-PLxc9ph9CLj52L26XSv4vBmQcSytCNc3ZBxkOTBEqmLSHCWwGQExrqKPnVZTE1etr6dcULiy5vNIpD8R7taO8A== dependencies: - "@nextui-org/button" "2.0.37" - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/button" "2.0.38" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/tooltip" "2.0.39" - "@nextui-org/use-clipboard" "2.0.6" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/tooltip" "2.0.41" + "@nextui-org/use-clipboard" "2.0.7" "@react-aria/focus" "3.17.1" "@react-aria/utils" "3.24.1" -"@nextui-org/spacer@2.0.32": - version "2.0.32" - resolved "https://registry.npmjs.org/@nextui-org/spacer/-/spacer-2.0.32.tgz" - integrity sha512-NxqEYTig4OfkLDPlO2/jASB4gV8L9DLpsNZSqzaacIJZwk4BCTsNoBi3CuNt5ZsMoGYujtFP6QU0zH9fZbuzwA== - dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/system-rsc" "2.1.5" - -"@nextui-org/spinner@2.0.33": +"@nextui-org/spacer@2.0.33": version "2.0.33" - resolved "https://registry.npmjs.org/@nextui-org/spinner/-/spinner-2.0.33.tgz" - integrity sha512-c1wW4YEbzdn0t1MJAXhJ2W0PuNxrxtZg2DVqJeqh3180y4iQPYDzEy7oFoU0FpK53LcBPxjfsKHNL6v1pn+60A== + resolved "https://registry.yarnpkg.com/@nextui-org/spacer/-/spacer-2.0.33.tgz#6c8bb36fbe7e7e135f5e8dac9b2a92324b930db9" + integrity sha512-0YDtovMWuAVgBvVXUmplzohObGxMPFhisHXn6v+0nflAE9LiVeiXf121WVOEMrd08S7xvmrAANcMwo4TsYi49g== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/system-rsc" "2.1.5" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/system-rsc" "2.1.6" -"@nextui-org/switch@2.0.33": - version "2.0.33" - resolved "https://registry.npmjs.org/@nextui-org/switch/-/switch-2.0.33.tgz" - integrity sha512-T7w+8+ex7Pey9HVGXkNft4D11mO5J9iPfmemfLbSOYqbSydcOuINuGRQ1QWy7X+lLYhhZBHb9Ykcf4QtR4dqTQ== +"@nextui-org/spinner@2.0.34": + version "2.0.34" + resolved "https://registry.yarnpkg.com/@nextui-org/spinner/-/spinner-2.0.34.tgz#91f1d3db33fa4ceedbd88e00e7b1a10c7833c9b5" + integrity sha512-YKw/6xSLhsXU1k22OvYKyWhtJCHzW2bRAiieVSVG5xak3gYwknTds5H9s5uur+oAZVK9AkyAObD19QuZND32Jg== dependencies: - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/system-rsc" "2.1.6" + +"@nextui-org/switch@2.0.34": + version "2.0.34" + resolved "https://registry.yarnpkg.com/@nextui-org/switch/-/switch-2.0.34.tgz#69569063aa35561220177beb2d392b3cfe87cea1" + integrity sha512-SczQiHswo8eR94ecDgcULIsSIPfYVncqfKllcHEGqAs9BDpZun44KK0/R0xhWuPpx5oqB60VeSABN7JtEAxF+Q== + dependencies: + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-safe-layout-effect" "2.0.6" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" @@ -1243,37 +1223,37 @@ "@react-stately/toggle" "3.7.4" "@react-types/shared" "3.23.1" -"@nextui-org/system-rsc@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nextui-org/system-rsc/-/system-rsc-2.1.5.tgz" - integrity sha512-tkJLAyJu34Rr5KUMMqoB7cZjOVXB+7a/7N4ushZfuiLdoYijgmcXFMzLxjm+tbt9zA5AV+ivsfbHvscg77dJ6w== +"@nextui-org/system-rsc@2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@nextui-org/system-rsc/-/system-rsc-2.1.6.tgz#a1ea223c331d651eb629a55b0df271e34eea8399" + integrity sha512-Wl2QwEFjYwuvw26R1RH3ZY81PD8YmfgtIjFvJZRP2VEIT6rPvlQ4ojgqdrkVkQZQ0L/K+5ZLbTKgLEFkj5ysdQ== dependencies: "@react-types/shared" "3.23.1" clsx "^1.2.1" -"@nextui-org/system@2.2.5": - version "2.2.5" - resolved "https://registry.npmjs.org/@nextui-org/system/-/system-2.2.5.tgz" - integrity sha512-nrX6768aiyWtpxX3OTFBIVWR+v9nlMsC3KaBinNfek97sNm7gAfTHi7q5kylE3L5yIMpNG+DclAKpuxgDQEmvw== +"@nextui-org/system@2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@nextui-org/system/-/system-2.2.6.tgz#837223d2acbfb6499fbd03d6345387897fa3d2a0" + integrity sha512-tjIkOI0w32g68CGWleuSyIbEz8XBbeoNogR2lu7MWk3QovHCqgr4VVrP1cwMRYnwDPFQP3OpmH+NR9yzt+pIfg== dependencies: "@internationalized/date" "^3.5.4" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/system-rsc" "2.1.5" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/system-rsc" "2.1.6" "@react-aria/i18n" "3.11.1" "@react-aria/overlays" "3.22.1" "@react-aria/utils" "3.24.1" "@react-stately/utils" "3.10.1" -"@nextui-org/table@2.0.39": - version "2.0.39" - resolved "https://registry.npmjs.org/@nextui-org/table/-/table-2.0.39.tgz" - integrity sha512-VYvmrQ6GliwmzukKLZ7Nxp3sFXdskWZp8/BjwROLFE9Zco22CC0++7VPG3ebOYAIhi4e1Je+QUTx4/eh2wZZgg== +"@nextui-org/table@2.0.40": + version "2.0.40" + resolved "https://registry.yarnpkg.com/@nextui-org/table/-/table-2.0.40.tgz#2ee8e380402e0cf0eaf468cf1ec931712b5aa12f" + integrity sha512-qDbSsu6mpWnr1Mt3DYTBzTFtN8Z5Gv7GDqECGcDVradkDVuJFZvkB9Ke392LcVZoXSk99Rpamq4WSWkEewBhWg== dependencies: - "@nextui-org/checkbox" "2.1.4" - "@nextui-org/react-utils" "2.0.16" + "@nextui-org/checkbox" "2.1.5" + "@nextui-org/react-utils" "2.0.17" "@nextui-org/shared-icons" "2.0.9" - "@nextui-org/shared-utils" "2.0.7" - "@nextui-org/spacer" "2.0.32" + "@nextui-org/shared-utils" "2.0.8" + "@nextui-org/spacer" "2.0.33" "@react-aria/focus" "3.17.1" "@react-aria/interactions" "3.21.3" "@react-aria/table" "3.14.1" @@ -1284,15 +1264,15 @@ "@react-types/grid" "3.2.6" "@react-types/table" "3.9.5" -"@nextui-org/tabs@2.0.35": - version "2.0.35" - resolved "https://registry.npmjs.org/@nextui-org/tabs/-/tabs-2.0.35.tgz" - integrity sha512-K6uDZbJwn1qLRw8XeBS2TwGQl9zKXg3Q1ShLzVG2IjTGHGNAn9lwkUzn0FNUNaU1GK2o8wOyKhX7K02J3Ev5fw== +"@nextui-org/tabs@2.0.37": + version "2.0.37" + resolved "https://registry.yarnpkg.com/@nextui-org/tabs/-/tabs-2.0.37.tgz#15d810aecbf5f245266e66249b0a510f50040a98" + integrity sha512-IQicuDggxTL+JeW3fRoZR4Rr24EwinxAdfU1jqcvT6gZywumndV27+I00kARz8P03kobYoY9t73NY92qo8T5gg== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/framer-utils" "2.0.24" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/framer-utils" "2.0.25" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-is-mounted" "2.0.6" "@nextui-org/use-update-effect" "2.0.6" "@react-aria/focus" "3.17.1" @@ -1304,10 +1284,10 @@ "@react-types/tabs" "3.3.7" scroll-into-view-if-needed "3.0.10" -"@nextui-org/theme@2.2.9": - version "2.2.9" - resolved "https://registry.npmjs.org/@nextui-org/theme/-/theme-2.2.9.tgz" - integrity sha512-TN2I9sMriLaj00pXsIMlg19+UHeOdjzS2JV0u4gjL14mSbQl5BYNxgbvU3gbMqkZZQ6OpwT4RnT8RS+ks6TXCw== +"@nextui-org/theme@2.2.11": + version "2.2.11" + resolved "https://registry.yarnpkg.com/@nextui-org/theme/-/theme-2.2.11.tgz#e56bd6568326819c8bd22ae58fb9d75ac6c7cb39" + integrity sha512-bg9+KNnFxcP3w/ugivEJtvQibODbTxfl6UdVvx7TCY8Rd269U7F2+nhnw1Qd1xJT5yZQnX6m//9wOoGtJV+6Kg== dependencies: clsx "^1.2.1" color "^4.2.3" @@ -1322,15 +1302,15 @@ tailwind-merge "^1.14.0" tailwind-variants "^0.1.20" -"@nextui-org/tooltip@2.0.39": - version "2.0.39" - resolved "https://registry.npmjs.org/@nextui-org/tooltip/-/tooltip-2.0.39.tgz" - integrity sha512-DWP3XAmVb/SlcdI4SQodtT8ZyMzYMuvRbq4+JQwm+qq1+FGs55z15+8h9DRFQEseEEaDs0hCs6+kgbieZlUitw== +"@nextui-org/tooltip@2.0.41": + version "2.0.41" + resolved "https://registry.yarnpkg.com/@nextui-org/tooltip/-/tooltip-2.0.41.tgz#a2027bf1e0f836c98bfd6bcc541cfbdda711f4be" + integrity sha512-1c+vkCCszKcKl15HywlZ7UOL7c1UFgLudqBB/dEdWZiclT01BRiracMbcQ7McKHQCRl77Aa7LFv5x4wHOicWHQ== dependencies: - "@nextui-org/aria-utils" "2.0.24" - "@nextui-org/framer-utils" "2.0.24" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/aria-utils" "2.0.26" + "@nextui-org/framer-utils" "2.0.25" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-safe-layout-effect" "2.0.6" "@react-aria/interactions" "3.21.3" "@react-aria/overlays" "3.22.1" @@ -1342,7 +1322,7 @@ "@nextui-org/use-aria-accordion@2.0.7": version "2.0.7" - resolved "https://registry.npmjs.org/@nextui-org/use-aria-accordion/-/use-aria-accordion-2.0.7.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-aria-accordion/-/use-aria-accordion-2.0.7.tgz#2788f3875119b6c0fc8686ce69283c85ef291167" integrity sha512-VzGlxmsu2tWG2Pht1e0PBz40jz95v0OEKYVXq91WpDMwj8Bl1CYvxrw2Qz41/5Xi0X843Mmo4sPwrc/hk0+RHA== dependencies: "@react-aria/button" "3.9.5" @@ -1355,7 +1335,7 @@ "@nextui-org/use-aria-button@2.0.10": version "2.0.10" - resolved "https://registry.npmjs.org/@nextui-org/use-aria-button/-/use-aria-button-2.0.10.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-aria-button/-/use-aria-button-2.0.10.tgz#5346dadbd3015be11dce836b2969294bf785cbc7" integrity sha512-tUpp4QMr1zugKPevyToeRHIufTuc/g+67/r/oQLRTG0mMo3yGVmggykQuYn22fqqZPpW6nHcB9VYc+XtZZ27TQ== dependencies: "@react-aria/focus" "3.17.1" @@ -1366,7 +1346,7 @@ "@nextui-org/use-aria-link@2.0.19": version "2.0.19" - resolved "https://registry.npmjs.org/@nextui-org/use-aria-link/-/use-aria-link-2.0.19.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-aria-link/-/use-aria-link-2.0.19.tgz#c0d63e65b5ecca362120b12df0fff770b2e19e06" integrity sha512-ef61cJLlwcR4zBWiaeHZy4K18juFjUup2SslfLIAiZz3kVosBCGKmkJkw1SASYY8+D/oUc2B6BFIk25YEsRKRw== dependencies: "@react-aria/focus" "3.17.1" @@ -1375,10 +1355,10 @@ "@react-types/link" "3.5.5" "@react-types/shared" "3.23.1" -"@nextui-org/use-aria-menu@2.0.6": - version "2.0.6" - resolved "https://registry.npmjs.org/@nextui-org/use-aria-menu/-/use-aria-menu-2.0.6.tgz" - integrity sha512-fGDF25E99THbgeDV2r2w4BHw5ZbGW3Lu6Y+vbLUcLBBh6x8/W8cqrpYFrzSUzn1RCun1t17yOAHZEV2rbvtMzA== +"@nextui-org/use-aria-menu@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@nextui-org/use-aria-menu/-/use-aria-menu-2.0.7.tgz#6d1b29837a125594b20719ced458d1392a3f48e5" + integrity sha512-5U91zFiWTLXsOhE0W3CThsD5TmL3ANeTEtoimtPgSLWV9keZBD9Ja62WsnPZPPAWhmv7jtL0/qk4d/YOra7PVA== dependencies: "@react-aria/i18n" "3.11.1" "@react-aria/interactions" "3.21.3" @@ -1390,20 +1370,20 @@ "@react-types/menu" "3.9.9" "@react-types/shared" "3.23.1" -"@nextui-org/use-aria-modal-overlay@2.0.11": - version "2.0.11" - resolved "https://registry.npmjs.org/@nextui-org/use-aria-modal-overlay/-/use-aria-modal-overlay-2.0.11.tgz" - integrity sha512-crMOCHyGIiBJiihxqidJCNR3AHH62uewfImDLEwyE/SlIkhAqW5jteUhkq0QfCSH4U/ydWisQ14niWDEgtzxXg== +"@nextui-org/use-aria-modal-overlay@2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@nextui-org/use-aria-modal-overlay/-/use-aria-modal-overlay-2.0.13.tgz#2a505635f562fae12e1d94b39c263365b534b907" + integrity sha512-ifQxJwTX72lhVUofEVQqMbpe9vEUiCIqiimzlUjeVuE0cYOXaoJLEgPozHpYQrdjTNiwD5On0LLMRgz19XyAqw== dependencies: "@react-aria/overlays" "3.22.1" "@react-aria/utils" "3.24.1" "@react-stately/overlays" "3.6.7" "@react-types/shared" "3.23.1" -"@nextui-org/use-aria-multiselect@2.2.3": - version "2.2.3" - resolved "https://registry.npmjs.org/@nextui-org/use-aria-multiselect/-/use-aria-multiselect-2.2.3.tgz" - integrity sha512-VeRoyyUUVgJ7DrdfzU6onjohHxJfG7bmwpIfQyurMzvTZcmcVUGTnddAnRPVEoOro68tTAj4IuPs/4xkf1aXxg== +"@nextui-org/use-aria-multiselect@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@nextui-org/use-aria-multiselect/-/use-aria-multiselect-2.2.5.tgz#81e4783cb6971d2369566ca93f752ce3a4d7dbc4" + integrity sha512-Gxo2M0LdnFL4/WCi192ziFB8JmSZm6yZYT8RB021Z3iAPBu/Pp9GnWEPZu5g15mKnn3jW5Ecnfw03jTEAQBR+Q== dependencies: "@react-aria/i18n" "3.11.1" "@react-aria/interactions" "3.21.3" @@ -1422,7 +1402,7 @@ "@nextui-org/use-aria-toggle-button@2.0.10": version "2.0.10" - resolved "https://registry.npmjs.org/@nextui-org/use-aria-toggle-button/-/use-aria-toggle-button-2.0.10.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-aria-toggle-button/-/use-aria-toggle-button-2.0.10.tgz#a45f331274860b115e8aad3f6c91a163922e84af" integrity sha512-U5jOmEO+nMIgYvBF0+gJtdq8C6dynGMjzAboPG4FhuHOzDoNiC12G5FIbGnRe8K1hMsKVuaI72p9986NhfqNgw== dependencies: "@nextui-org/use-aria-button" "2.0.10" @@ -1433,26 +1413,26 @@ "@nextui-org/use-callback-ref@2.0.6": version "2.0.6" - resolved "https://registry.npmjs.org/@nextui-org/use-callback-ref/-/use-callback-ref-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-callback-ref/-/use-callback-ref-2.0.6.tgz#6720a1381d4ce79ae7075949a647b03be8309d99" integrity sha512-2WcwWuK1L/wIpTbibnLrysmmkzWomvkVIcgWayB6n/w+bpPrPCG7Zyg2WHzmMmDhe6imV//KKBgNKRi8Xhu/VA== dependencies: "@nextui-org/use-safe-layout-effect" "2.0.6" -"@nextui-org/use-clipboard@2.0.6": - version "2.0.6" - resolved "https://registry.npmjs.org/@nextui-org/use-clipboard/-/use-clipboard-2.0.6.tgz" - integrity sha512-UQbCoAX1vqEKYeMF8Xp2RdTqbDD8Or16+7W4f8OQc5+uaJeKaAL6LPITi5M5ipgruTvzM845XooHdiAStH322Q== +"@nextui-org/use-clipboard@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@nextui-org/use-clipboard/-/use-clipboard-2.0.7.tgz#f572f8c2c37f9248c4aebc7b31019e685ae33f82" + integrity sha512-Bn1fF/goMwOA5DQyw3A4ebfgozwR8U5k5TAZMPiy1RBWgTFw7+lB0GNbH+DOnUGY5Vyztyaw6gtUyc3tVzJxeg== -"@nextui-org/use-data-scroll-overflow@2.1.6": - version "2.1.6" - resolved "https://registry.npmjs.org/@nextui-org/use-data-scroll-overflow/-/use-data-scroll-overflow-2.1.6.tgz" - integrity sha512-z9XzBF64qjTSp6jTttMDEPku7Xpgci/tYTokEQHWgydRg3FZEaBqRgOOMeiXAV1Py/kQB062MjPSneUtwYlozA== +"@nextui-org/use-data-scroll-overflow@2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@nextui-org/use-data-scroll-overflow/-/use-data-scroll-overflow-2.1.7.tgz#667695beaf7759ec2dff865f40e643bbf832727c" + integrity sha512-MP4YLjBWyIt0KyWPndXyhnkKgOLqTZ2aPY82Czjqn+eZk/l8BNo0nfA+dZFfbfEuPJgqdt/JDkMOrS+uq0+vkQ== dependencies: - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@nextui-org/use-disclosure@2.0.10": version "2.0.10" - resolved "https://registry.npmjs.org/@nextui-org/use-disclosure/-/use-disclosure-2.0.10.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-disclosure/-/use-disclosure-2.0.10.tgz#9767ad6156fef3353a5bfb84207724f56456c850" integrity sha512-s2I58d7x2f1JRriZnNm9ZoxrGmxF+DnC9BXM1sD99Wq1VNMd0dhitmx0mUWfUB7l5HLyZgKOeiSLG+ugy1F1Yw== dependencies: "@nextui-org/use-callback-ref" "2.0.6" @@ -1461,65 +1441,65 @@ "@nextui-org/use-image@2.0.6": version "2.0.6" - resolved "https://registry.npmjs.org/@nextui-org/use-image/-/use-image-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-image/-/use-image-2.0.6.tgz#7f835521f77633e19bcbb5d4dae033fd04c8a0b6" integrity sha512-VelN9y3vzwIpPfubFMh00YRQ0f4+I5FElcAvAqoo0Kfb0K7sGrTo1lZNApHm6yBN2gJMMeccG9u7bZB+wcDGZQ== dependencies: "@nextui-org/use-safe-layout-effect" "2.0.6" "@nextui-org/use-is-mobile@2.0.9": version "2.0.9" - resolved "https://registry.npmjs.org/@nextui-org/use-is-mobile/-/use-is-mobile-2.0.9.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-is-mobile/-/use-is-mobile-2.0.9.tgz#6bced5d78b1845c180eaaa813026be6cfbdb20d8" integrity sha512-u5pRmPV0wacdpOcAkQnWwE30yNBl2uk1WvbWkrSELxIVRN22+fTIYn8ynnHK0JbJFTA6/5zh7uIfETQu3L6KjA== dependencies: "@react-aria/ssr" "3.9.4" "@nextui-org/use-is-mounted@2.0.6": version "2.0.6" - resolved "https://registry.npmjs.org/@nextui-org/use-is-mounted/-/use-is-mounted-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-is-mounted/-/use-is-mounted-2.0.6.tgz#005804825fe70e2d4d8579d5c64f42e55f3e34f6" integrity sha512-/lcMdYnwBZ1EuKMLRIhHeAZG8stXWNTz7wBweAlLId23VC4VHgCp/s9K9Vbj1A5/r8FiFQeoTmXQuMAMUoPRtg== "@nextui-org/use-measure@2.0.2": version "2.0.2" - resolved "https://registry.npmjs.org/@nextui-org/use-measure/-/use-measure-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-measure/-/use-measure-2.0.2.tgz#94f998c0e59819c0632b43ca8ddc4877e12a47bb" integrity sha512-H/RSPPA9B5sZ10wiXR3jLlYFEuiVnc0O/sgLLQfrb5M0hvHoaqMThnsZpm//5iyS7tD7kxPeYNLa1EhzlQKxDA== -"@nextui-org/use-pagination@2.0.9": - version "2.0.9" - resolved "https://registry.npmjs.org/@nextui-org/use-pagination/-/use-pagination-2.0.9.tgz" - integrity sha512-p5Gssyb71/SjRezq2o1aRsYTmC9idziW3pLCJFpVwLGfgWNARf9C6NS1oQsqKgjF5lvzoa88soZRDhKKvRAt/g== +"@nextui-org/use-pagination@2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@nextui-org/use-pagination/-/use-pagination-2.0.10.tgz#45c029b7f315a3b4c8ced7f0f0681cf45dc85fe1" + integrity sha512-PD6M8QKngUnTJfyoGiZrnrfUtA1A9ZVUjmbONO/1kxPuUegv0ZOQeFECPP2h7SFPxsyOceL1T97rg/2YPS247g== dependencies: - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/shared-utils" "2.0.8" "@react-aria/i18n" "3.11.1" "@nextui-org/use-safe-layout-effect@2.0.6": version "2.0.6" - resolved "https://registry.npmjs.org/@nextui-org/use-safe-layout-effect/-/use-safe-layout-effect-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-safe-layout-effect/-/use-safe-layout-effect-2.0.6.tgz#29a6c5afa1e3955420c681cdf7cec99eaa4a030f" integrity sha512-xzEJXf/g9GaSqjLpQ4+Z2/pw1GPq2Fc5cWRGqEXbGauEMXuH8UboRls1BmIV1RuOpqI6FgxkEmxL1EuVIRVmvQ== -"@nextui-org/use-scroll-position@2.0.8": - version "2.0.8" - resolved "https://registry.npmjs.org/@nextui-org/use-scroll-position/-/use-scroll-position-2.0.8.tgz" - integrity sha512-sUuoLEPWxCNlgzayy3VZSneVA1rKSdh4kBuBbYJTp/g2yyrpZYnyYzWpeNJ4dhDQr1cpTDODehJekWPBhNN+uw== +"@nextui-org/use-scroll-position@2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@nextui-org/use-scroll-position/-/use-scroll-position-2.0.9.tgz#7b946947cb041c9eaf225e2316828caef9dd01fa" + integrity sha512-tXbpb2bkKIjOp2I1uZ1T4T9Lxp0+Ta/TKu+5qvqsXkHRPbcoukdsquagYUDWK/fcumg72UPR8QP+na8KMn2gCg== "@nextui-org/use-update-effect@2.0.6": version "2.0.6" - resolved "https://registry.npmjs.org/@nextui-org/use-update-effect/-/use-update-effect-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/@nextui-org/use-update-effect/-/use-update-effect-2.0.6.tgz#107a4e0496232683578ee24dfae4be7edb58e371" integrity sha512-n5Qiv3ferKn+cSxU3Vv+96LdG8I/00mzc7Veoan+P9GL0aCTrsPB6RslTsiblaiAXQcqTiFXd8xwsK309DXOXA== -"@nextui-org/user@2.0.33": - version "2.0.33" - resolved "https://registry.npmjs.org/@nextui-org/user/-/user-2.0.33.tgz" - integrity sha512-v6gGTlsaqM7Ndwtx9N/AAQFRICcIE5DuFxRZRqPfLa+jbZhJuWG2OSIATPeUOxgr8pKWpeV78nETdFKEKcsUPA== +"@nextui-org/user@2.0.34": + version "2.0.34" + resolved "https://registry.yarnpkg.com/@nextui-org/user/-/user-2.0.34.tgz#53b79c9d2b5777e661a81672541a6bac2217a929" + integrity sha512-7MN/xBaMhDJ0b+hB2YpGIm2DsC9CTpN1ab+EKwhUuWn26SgXw2FNu8CSHViyDEkvOP7sYKdHLp9UtSo/f3JnsQ== dependencies: - "@nextui-org/avatar" "2.0.32" - "@nextui-org/react-utils" "2.0.16" - "@nextui-org/shared-utils" "2.0.7" + "@nextui-org/avatar" "2.0.33" + "@nextui-org/react-utils" "2.0.17" + "@nextui-org/shared-utils" "2.0.8" "@react-aria/focus" "3.17.1" "@react-aria/utils" "3.24.1" "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -1527,25 +1507,114 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" + integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== + +"@parcel/watcher-darwin-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" + integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== + +"@parcel/watcher-darwin-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" + integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== + +"@parcel/watcher-freebsd-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" + integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== + +"@parcel/watcher-linux-arm-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" + integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== + +"@parcel/watcher-linux-arm-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" + integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== + +"@parcel/watcher-linux-arm64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" + integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== + +"@parcel/watcher-linux-arm64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" + integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== + +"@parcel/watcher-linux-x64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d" + integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== + +"@parcel/watcher-linux-x64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef" + integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== + +"@parcel/watcher-win32-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" + integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== + +"@parcel/watcher-win32-ia32@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" + integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== + +"@parcel/watcher-win32-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" + integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== + +"@parcel/watcher@^2.4.1": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10" + integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.0" + "@parcel/watcher-darwin-arm64" "2.5.0" + "@parcel/watcher-darwin-x64" "2.5.0" + "@parcel/watcher-freebsd-x64" "2.5.0" + "@parcel/watcher-linux-arm-glibc" "2.5.0" + "@parcel/watcher-linux-arm-musl" "2.5.0" + "@parcel/watcher-linux-arm64-glibc" "2.5.0" + "@parcel/watcher-linux-arm64-musl" "2.5.0" + "@parcel/watcher-linux-x64-glibc" "2.5.0" + "@parcel/watcher-linux-x64-musl" "2.5.0" + "@parcel/watcher-win32-arm64" "2.5.0" + "@parcel/watcher-win32-ia32" "2.5.0" + "@parcel/watcher-win32-x64" "2.5.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@react-aria/breadcrumbs@3.5.13": version "3.5.13" - resolved "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.13.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.13.tgz#2686f7f460f20d67fe5cdfe185e32e3e78186962" integrity sha512-G1Gqf/P6kVdfs94ovwP18fTWuIxadIQgHsXS08JEVcFVYMjb9YjqnEBaohUxD1tq2WldMbYw53ahQblT4NTG+g== dependencies: "@react-aria/i18n" "^3.11.1" @@ -1557,7 +1626,7 @@ "@react-aria/button@3.9.5": version "3.9.5" - resolved "https://registry.npmjs.org/@react-aria/button/-/button-3.9.5.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.9.5.tgz#f0082f58394394f3d16fdf45de57b382748f3345" integrity sha512-dgcYR6j8WDOMLKuVrtxzx4jIC05cVKDzc+HnPO8lNkBAOfjcuN5tkGRtIjLtqjMvpZHhQT5aDbgFpIaZzxgFIg== dependencies: "@react-aria/focus" "^3.17.1" @@ -1570,7 +1639,7 @@ "@react-aria/calendar@3.5.8": version "3.5.8" - resolved "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.8.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.5.8.tgz#fd0858b34c8961b76957e9ac13b514f485c329a3" integrity sha512-Whlp4CeAA5/ZkzrAHUv73kgIRYjw088eYGSc+cvSOCxfrc/2XkBm9rNrnSBv0DvhJ8AG0Fjz3vYakTmF3BgZBw== dependencies: "@internationalized/date" "^3.5.4" @@ -1586,7 +1655,7 @@ "@react-aria/checkbox@3.14.3": version "3.14.3" - resolved "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.14.3.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.14.3.tgz#6e2579681008e460d2c764a03f1f1b54e0815868" integrity sha512-EtBJL6iu0gvrw3A4R7UeVLR6diaVk/mh4kFBc7c8hQjpEJweRr4hmJT3hrNg3MBcTWLxFiMEXPGgWEwXDBygtA== dependencies: "@react-aria/form" "^3.0.5" @@ -1603,7 +1672,7 @@ "@react-aria/combobox@3.9.1": version "3.9.1" - resolved "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.9.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.9.1.tgz#ab12b698b76fd063f386aa5516129b2c72f5bf60" integrity sha512-SpK92dCmT8qn8aEcUAihRQrBb5LZUhwIbDExFII8PvUvEFy/PoQHXIo3j1V29WkutDBDpMvBv/6XRCHGXPqrhQ== dependencies: "@react-aria/i18n" "^3.11.1" @@ -1624,7 +1693,7 @@ "@react-aria/datepicker@3.10.1": version "3.10.1" - resolved "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.10.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.10.1.tgz#513a9d18e118d4c3d078fdbfc45dca76b7eeb37f" integrity sha512-4HZL593nrNMa1GjBmWEN/OTvNS6d3/16G1YJWlqiUlv11ADulSbqBIjMmkgwrJVFcjrgqtXFy+yyrTA/oq94Zw== dependencies: "@internationalized/date" "^3.5.4" @@ -1648,7 +1717,7 @@ "@react-aria/dialog@3.5.14": version "3.5.14" - resolved "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.14.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.14.tgz#d4b078410c00b7cc7e6f25f67dfe53fa755be769" integrity sha512-oqDCjQ8hxe3GStf48XWBf2CliEnxlR9GgSYPHJPUc69WBj68D9rVcCW3kogJnLAnwIyf3FnzbX4wSjvUa88sAQ== dependencies: "@react-aria/focus" "^3.17.1" @@ -1658,9 +1727,9 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/focus@3.17.1", "@react-aria/focus@^3.17.1": +"@react-aria/focus@3.17.1": version "3.17.1" - resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.17.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.17.1.tgz#c796a188120421e2fedf438cadacdf463c77ad29" integrity sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ== dependencies: "@react-aria/interactions" "^3.21.3" @@ -1669,20 +1738,20 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/focus@^3.18.1": - version "3.18.1" - resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.18.1.tgz" - integrity sha512-N0Cy61WCIv+57mbqC7hiZAsB+3rF5n4JKabxUmg/2RTJL6lq7hJ5N4gx75ymKxkN8GnVDwt4pKZah48Wopa5jw== +"@react-aria/focus@^3.17.1", "@react-aria/focus@^3.18.4": + version "3.18.4" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" + integrity sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA== dependencies: - "@react-aria/interactions" "^3.22.1" - "@react-aria/utils" "^3.25.1" - "@react-types/shared" "^3.24.1" + "@react-aria/interactions" "^3.22.4" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/form@3.0.5", "@react-aria/form@^3.0.5": +"@react-aria/form@3.0.5": version "3.0.5" - resolved "https://registry.npmjs.org/@react-aria/form/-/form-3.0.5.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.5.tgz#abaf6ac005dc3f98760ac74fdb6524ad189399d6" integrity sha512-n290jRwrrRXO3fS82MyWR+OKN7yznVesy5Q10IclSTVYHHI3VI53xtAPr/WzNjJR1um8aLhOcDNFKwnNIUUCsQ== dependencies: "@react-aria/interactions" "^3.21.3" @@ -1691,28 +1760,39 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/grid@^3.9.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@react-aria/grid/-/grid-3.10.1.tgz" - integrity sha512-7dSgiYVQapBtPV4SIit+9fJ1qoEjtp+PXffJkWAPtGbg/jJ4b0jcVzykH7ARD4w/6jAJN/oVSfrKZqFPoLAd9w== +"@react-aria/form@^3.0.10", "@react-aria/form@^3.0.5": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@react-aria/form/-/form-3.0.10.tgz#0d21bd33aac4153fcbfdd87cc04fce9f8e148650" + integrity sha512-hWBrqEXxBxcpYTJv0telQKaiu2728EUFHta8/RGBqJ4+MhKKxI7+PnLoms78IuiK0MCYvukHfun1fuQvK+8jsg== dependencies: - "@react-aria/focus" "^3.18.1" - "@react-aria/i18n" "^3.12.1" - "@react-aria/interactions" "^3.22.1" - "@react-aria/live-announcer" "^3.3.4" - "@react-aria/selection" "^3.19.1" - "@react-aria/utils" "^3.25.1" - "@react-stately/collections" "^3.10.9" - "@react-stately/grid" "^3.9.1" - "@react-stately/selection" "^3.16.1" - "@react-types/checkbox" "^3.8.3" - "@react-types/grid" "^3.2.8" - "@react-types/shared" "^3.24.1" + "@react-aria/interactions" "^3.22.4" + "@react-aria/utils" "^3.25.3" + "@react-stately/form" "^3.0.6" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@3.11.1", "@react-aria/i18n@^3.11.1": +"@react-aria/grid@^3.9.1": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@react-aria/grid/-/grid-3.10.5.tgz#34caf94aa2442949e75a825684f6b7bea0b8af43" + integrity sha512-9sLa+rpLgRZk7VX+tvdSudn1tdVgolVzhDLGWd95yS4UtPVMihTMGBrRoByY57Wxvh1V+7Ptw8kc6tsRSotYKg== + dependencies: + "@react-aria/focus" "^3.18.4" + "@react-aria/i18n" "^3.12.3" + "@react-aria/interactions" "^3.22.4" + "@react-aria/live-announcer" "^3.4.0" + "@react-aria/selection" "^3.20.1" + "@react-aria/utils" "^3.25.3" + "@react-stately/collections" "^3.11.0" + "@react-stately/grid" "^3.9.3" + "@react-stately/selection" "^3.17.0" + "@react-types/checkbox" "^3.8.4" + "@react-types/grid" "^3.2.9" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/i18n@3.11.1": version "3.11.1" - resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.11.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.11.1.tgz#2d238d2be30d8c691b5fa3161f5fb48066fc8e4b" integrity sha512-vuiBHw1kZruNMYeKkTGGnmPyMnM5T+gT8bz97H1FqIq1hQ6OPzmtBZ6W6l6OIMjeHI5oJo4utTwfZl495GALFQ== dependencies: "@internationalized/date" "^3.5.4" @@ -1724,23 +1804,23 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@^3.12.1": - version "3.12.1" - resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.1.tgz" - integrity sha512-0q3gyogF9Ekah+9LOo6tcfshxsk2Ope+KdbtFHJVhznedMxn6RpHGcVur5ImbQ1dYafA5CmjBUGJW70b56+BGA== +"@react-aria/i18n@^3.11.1", "@react-aria/i18n@^3.12.3": + version "3.12.3" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.12.3.tgz#ec902787ea840755a1e7b4feb64435b8451baf62" + integrity sha512-0Tp/4JwnCVNKDfuknPF+/xf3/woOc8gUjTU2nCjO3mCVb4FU7KFtjxQ2rrx+6hpIVG6g+N9qfMjRa/ggVH0CJg== dependencies: - "@internationalized/date" "^3.5.5" - "@internationalized/message" "^3.1.4" - "@internationalized/number" "^3.5.3" - "@internationalized/string" "^3.2.3" - "@react-aria/ssr" "^3.9.5" - "@react-aria/utils" "^3.25.1" - "@react-types/shared" "^3.24.1" + "@internationalized/date" "^3.5.6" + "@internationalized/message" "^3.1.5" + "@internationalized/number" "^3.5.4" + "@internationalized/string" "^3.2.4" + "@react-aria/ssr" "^3.9.6" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-aria/interactions@3.21.3", "@react-aria/interactions@^3.21.3": +"@react-aria/interactions@3.21.3": version "3.21.3" - resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.3.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.21.3.tgz#a2a3e354a8b894bed7a46e1143453f397f2538d7" integrity sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA== dependencies: "@react-aria/ssr" "^3.9.4" @@ -1748,28 +1828,37 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/interactions@^3.22.1": - version "3.22.1" - resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.1.tgz" - integrity sha512-5TLzQaDAQQ5C70yG8GInbO4wIylKY67RfTIIwQPGR/4n5OIjbUD8BOj3NuSsuZ/frUPaBXo1VEBBmSO23fxkjw== +"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.4": + version "3.22.4" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.4.tgz#88ed61ab6a485f869bc1f65ae6688d48ca96064b" + integrity sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww== dependencies: - "@react-aria/ssr" "^3.9.5" - "@react-aria/utils" "^3.25.1" - "@react-types/shared" "^3.24.1" + "@react-aria/ssr" "^3.9.6" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-aria/label@3.7.8", "@react-aria/label@^3.7.8": +"@react-aria/label@3.7.8": version "3.7.8" - resolved "https://registry.npmjs.org/@react-aria/label/-/label-3.7.8.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.8.tgz#69f1c184836b04445fcedce78db9fd939a0570ea" integrity sha512-MzgTm5+suPA3KX7Ug6ZBK2NX9cin/RFLsv1BdafJ6CZpmUSpWnGE/yQfYUB7csN7j31OsZrD3/P56eShYWAQfg== dependencies: "@react-aria/utils" "^3.24.1" "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/link@3.7.1", "@react-aria/link@^3.7.1": +"@react-aria/label@^3.7.12", "@react-aria/label@^3.7.8": + version "3.7.12" + resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.12.tgz#d6aa0dca5d0ba280fd6f15c1f05327095a2526c5" + integrity sha512-u9xT90lAlgb7xiv+p0md9QwCHz65XL7tjS5e29e88Rs3ptkv3aQubTqxVOUTEwzbNUT4A1QqTjUm1yfHewIRUw== + dependencies: + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/link@3.7.1": version "3.7.1" - resolved "https://registry.npmjs.org/@react-aria/link/-/link-3.7.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.7.1.tgz#ae75feebc5c6f40e1031abf57f3125d45882e976" integrity sha512-a4IaV50P3fXc7DQvEIPYkJJv26JknFbRzFT5MJOMgtzuhyJoQdILEUK6XHYjcSSNCA7uLgzpojArVk5Hz3lCpw== dependencies: "@react-aria/focus" "^3.17.1" @@ -1779,9 +1868,21 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/listbox@3.12.1", "@react-aria/listbox@^3.12.1": +"@react-aria/link@^3.7.1": + version "3.7.6" + resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.7.6.tgz#d71e9f1c16b671f017b69f078887432ffc65ac65" + integrity sha512-8buJznRWoOud8ApygUAz7TsshXNs6HDGB6YOYEJxy0WTKILn0U5NUymw2PWC14+bWRPelHMKmi6vbFBrJWzSzQ== + dependencies: + "@react-aria/focus" "^3.18.4" + "@react-aria/interactions" "^3.22.4" + "@react-aria/utils" "^3.25.3" + "@react-types/link" "^3.5.8" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/listbox@3.12.1": version "3.12.1" - resolved "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.12.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.12.1.tgz#cc4f0d23630f496273ca5c31b4dfacf6d6f37df1" integrity sha512-7JiUp0NGykbv/HgSpmTY1wqhuf/RmjFxs1HZcNaTv8A+DlzgJYc7yQqFjP3ZA/z5RvJFuuIxggIYmgIFjaRYdA== dependencies: "@react-aria/interactions" "^3.21.3" @@ -1794,16 +1895,31 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/live-announcer@^3.3.4": - version "3.3.4" - resolved "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.4.tgz" - integrity sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA== +"@react-aria/listbox@^3.12.1": + version "3.13.5" + resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.13.5.tgz#67b628c5fc9c5dbee327a012ae82d05ebc60b75d" + integrity sha512-tn32L/PIELIPYfDWCJ3OBRvvb/jCEvIzs6IYs8xCISV5W4853Je/WnA8wumWnz07U9sODYFmHUx2ThO7Z7dH7Q== + dependencies: + "@react-aria/interactions" "^3.22.4" + "@react-aria/label" "^3.7.12" + "@react-aria/selection" "^3.20.1" + "@react-aria/utils" "^3.25.3" + "@react-stately/collections" "^3.11.0" + "@react-stately/list" "^3.11.0" + "@react-types/listbox" "^3.5.2" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/live-announcer@^3.3.4", "@react-aria/live-announcer@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@react-aria/live-announcer/-/live-announcer-3.4.0.tgz#0ad90fddc4731e93071d802c8cec9e1dfd2fc448" + integrity sha512-VBxEdMq2SbtRbNTQNcDR2G6E3lEl5cJSBiHTTO8Ln1AL76LiazrylIXGgoktqzCfRQmyq0v8CHk1cNKDU9mvJg== dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/menu@3.14.1", "@react-aria/menu@^3.14.1": +"@react-aria/menu@3.14.1": version "3.14.1" - resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.14.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.14.1.tgz#c9ec25bc374ee9bb02dc3d92d8260df702349133" integrity sha512-BYliRb38uAzq05UOFcD5XkjA5foQoXRbcH3ZufBsc4kvh79BcP1PMW6KsXKGJ7dC/PJWUwCui6QL1kUg8PqMHA== dependencies: "@react-aria/focus" "^3.17.1" @@ -1820,9 +1936,28 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/overlays@3.22.1", "@react-aria/overlays@^3.22.1": +"@react-aria/menu@^3.14.1": + version "3.15.5" + resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.15.5.tgz#b133a0d60da94dfbbd1bfe3db485cf91ccfff900" + integrity sha512-ygfS032hJSZCYYbMHnUSmUTVMaz99L9AUZ9kMa6g+k2X1t92K1gXfhYYkoClQD6+G0ch7zm0SwYFlUmRf9yOEA== + dependencies: + "@react-aria/focus" "^3.18.4" + "@react-aria/i18n" "^3.12.3" + "@react-aria/interactions" "^3.22.4" + "@react-aria/overlays" "^3.23.4" + "@react-aria/selection" "^3.20.1" + "@react-aria/utils" "^3.25.3" + "@react-stately/collections" "^3.11.0" + "@react-stately/menu" "^3.8.3" + "@react-stately/tree" "^3.8.5" + "@react-types/button" "^3.10.0" + "@react-types/menu" "^3.9.12" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/overlays@3.22.1": version "3.22.1" - resolved "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.22.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.22.1.tgz#7a01673317fa6517bb91b0b7504e303facdc9ccb" integrity sha512-GHiFMWO4EQ6+j6b5QCnNoOYiyx1Gk8ZiwLzzglCI4q1NY5AG2EAmfU4Z1+Gtrf2S5Y0zHbumC7rs9GnPoGLUYg== dependencies: "@react-aria/focus" "^3.17.1" @@ -1837,9 +1972,26 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" +"@react-aria/overlays@^3.22.1", "@react-aria/overlays@^3.23.4": + version "3.23.4" + resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.23.4.tgz#8fc2f7f5884f514056651490a17b9fd40e519df1" + integrity sha512-MZUW6SUlTWOwKuFTqUTxW5BnvdW3Y9cEwanWuz98NX3ST7JYe/3ZcZhb37/fGW4uoGHnQ9icEwVf0rbMrK2STg== + dependencies: + "@react-aria/focus" "^3.18.4" + "@react-aria/i18n" "^3.12.3" + "@react-aria/interactions" "^3.22.4" + "@react-aria/ssr" "^3.9.6" + "@react-aria/utils" "^3.25.3" + "@react-aria/visually-hidden" "^3.8.17" + "@react-stately/overlays" "^3.6.11" + "@react-types/button" "^3.10.0" + "@react-types/overlays" "^3.8.10" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + "@react-aria/progress@3.4.13": version "3.4.13" - resolved "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.13.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.4.13.tgz#dc86c98ed0f9a164cf62140e13865235c1991548" integrity sha512-YBV9bOO5JzKvG8QCI0IAA00o6FczMgIDiK8Q9p5gKorFMatFUdRayxlbIPoYHMi+PguLil0jHgC7eOyaUcrZ0g== dependencies: "@react-aria/i18n" "^3.11.1" @@ -1851,7 +2003,7 @@ "@react-aria/radio@3.10.4": version "3.10.4" - resolved "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.4.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.10.4.tgz#e1b54fa7a9ee3912a5fe170fc752000eef836c06" integrity sha512-3fmoMcQtCpgjTwJReFjnvIE/C7zOZeCeWUn4JKDqz9s1ILYsC3Rk5zZ4q66tFn6v+IQnecrKT52wH6+hlVLwTA== dependencies: "@react-aria/focus" "^3.17.1" @@ -1865,9 +2017,9 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/selection@3.18.1", "@react-aria/selection@^3.18.1": +"@react-aria/selection@3.18.1": version "3.18.1" - resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.18.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.18.1.tgz#fd6a10a86be187ac2a591cbbc1f41c3aa0c09f7f" integrity sha512-GSqN2jX6lh7v+ldqhVjAXDcrWS3N4IsKXxO6L6Ygsye86Q9q9Mq9twWDWWu5IjHD6LoVZLUBCMO+ENGbOkyqeQ== dependencies: "@react-aria/focus" "^3.17.1" @@ -1878,22 +2030,22 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/selection@^3.19.1": - version "3.19.1" - resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.19.1.tgz" - integrity sha512-mbExvq2Omi60sTWFGjwcNz1ja2P8VDsxWAqSypHRTyqXhtgqbv8V/v8Gp+7BmVPH1YHcbhztl6rvUZTDOSszzw== +"@react-aria/selection@^3.18.1", "@react-aria/selection@^3.20.1": + version "3.20.1" + resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.20.1.tgz#94b405214ea8506410f632fd2bfe470b9360ebfb" + integrity sha512-My0w8UC/7PAkz/1yZUjr2VRuzDZz1RrbgTqP36j5hsJx8RczDTjI4TmKtQNKG0ggaP4w83G2Og5JPTq3w3LMAw== dependencies: - "@react-aria/focus" "^3.18.1" - "@react-aria/i18n" "^3.12.1" - "@react-aria/interactions" "^3.22.1" - "@react-aria/utils" "^3.25.1" - "@react-stately/selection" "^3.16.1" - "@react-types/shared" "^3.24.1" + "@react-aria/focus" "^3.18.4" + "@react-aria/i18n" "^3.12.3" + "@react-aria/interactions" "^3.22.4" + "@react-aria/utils" "^3.25.3" + "@react-stately/selection" "^3.17.0" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" "@react-aria/slider@3.7.8": version "3.7.8" - resolved "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.8.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.8.tgz#6f2109527e0ebfaa1aaf46fce2460549d5550e1b" integrity sha512-MYvPcM0K8jxEJJicUK2+WxUkBIM/mquBxOTOSSIL3CszA80nXIGVnLlCUnQV3LOUzpWtabbWaZokSPtGgOgQOw== dependencies: "@react-aria/focus" "^3.17.1" @@ -1907,34 +2059,34 @@ "@swc/helpers" "^0.5.0" "@react-aria/spinbutton@^3.6.5": - version "3.6.7" - resolved "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.7.tgz" - integrity sha512-OCimp4yXoFIgh6WAMOls5DDDRDRO75ZFic3YA6wLWTRNHxo1Lj8S90i1A6pakY6bi4hdBCKmj4DnFSNKAw1iWg== + version "3.6.9" + resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.6.9.tgz#9a74c0ec927d0a7949463efcddb5c52fc9841fa8" + integrity sha512-m+uVJdiIc2LrLVDGjU7p8P2O2gUvTN26GR+NgH4rl+tUSuAB0+T1rjls/C+oXEqQjCpQihEB9Bt4M+VHpzmyjA== dependencies: - "@react-aria/i18n" "^3.12.1" - "@react-aria/live-announcer" "^3.3.4" - "@react-aria/utils" "^3.25.1" - "@react-types/button" "^3.9.6" - "@react-types/shared" "^3.24.1" + "@react-aria/i18n" "^3.12.3" + "@react-aria/live-announcer" "^3.4.0" + "@react-aria/utils" "^3.25.3" + "@react-types/button" "^3.10.0" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-aria/ssr@3.9.4", "@react-aria/ssr@^3.9.4": +"@react-aria/ssr@3.9.4": version "3.9.4" - resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.4.tgz#9da8b10342c156e816dbfa4c9e713b21f274d7ab" integrity sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ== dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/ssr@^3.9.5": - version "3.9.5" - resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.5.tgz" - integrity sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ== +"@react-aria/ssr@^3.9.4", "@react-aria/ssr@^3.9.6": + version "3.9.6" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.6.tgz#a9e8b351acdc8238f2b5215b0ce904636c6ea690" + integrity sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA== dependencies: "@swc/helpers" "^0.5.0" "@react-aria/switch@3.6.4": version "3.6.4" - resolved "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.4.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.6.4.tgz#6dba901414785de23ee2f4873ea5e23973fdf58d" integrity sha512-2nVqz4ZuJyof47IpGSt3oZRmp+EdS8wzeDYgf42WHQXrx4uEOk1mdLJ20+NnsYhj/2NHZsvXVrjBeKMjlMs+0w== dependencies: "@react-aria/toggle" "^3.10.4" @@ -1944,7 +2096,7 @@ "@react-aria/table@3.14.1": version "3.14.1" - resolved "https://registry.npmjs.org/@react-aria/table/-/table-3.14.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.14.1.tgz#6316349e17fe6adfe9132aab75ce72c4a44c028f" integrity sha512-WaPgQe4zQF5OaluO5rm+Y2nEoFR63vsLd4BT4yjK1uaFhKhDY2Zk+1SCVQvBLLKS4WK9dhP05nrNzT0vp/ZPOw== dependencies: "@react-aria/focus" "^3.17.1" @@ -1966,7 +2118,7 @@ "@react-aria/tabs@3.9.1": version "3.9.1" - resolved "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.9.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.9.1.tgz#3cfb44648de1f896499d210b80deb1ead8ec4295" integrity sha512-S5v/0sRcOaSXaJYZuuy1ZVzYc7JD4sDyseG1133GjyuNjJOFHgoWMb+b4uxNIJbZxnLgynn/ZDBZSO+qU+fIxw== dependencies: "@react-aria/focus" "^3.17.1" @@ -1978,9 +2130,9 @@ "@react-types/tabs" "^3.3.7" "@swc/helpers" "^0.5.0" -"@react-aria/textfield@3.14.5", "@react-aria/textfield@^3.14.5": +"@react-aria/textfield@3.14.5": version "3.14.5" - resolved "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.5.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.14.5.tgz#afb46b4af019dc88fc7f77396cea5ec0c9701f01" integrity sha512-hj7H+66BjB1iTKKaFXwSZBZg88YT+wZboEXZ0DNdQB2ytzoz/g045wBItUuNi4ZjXI3P+0AOZznVMYadWBAmiA== dependencies: "@react-aria/focus" "^3.17.1" @@ -1993,22 +2145,37 @@ "@react-types/textfield" "^3.9.3" "@swc/helpers" "^0.5.0" -"@react-aria/toggle@^3.10.4": - version "3.10.6" - resolved "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.6.tgz" - integrity sha512-AGlbtB1b8grrtjbiW5Au0LKYzxR83RHbHhaUkFwajyYRGyuEzr3Y03OiveoPB+DayA8Gz3H1ZVmW++8JZQOWHw== +"@react-aria/textfield@^3.14.5": + version "3.14.10" + resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.14.10.tgz#a6fab9993f26f97b27c5bba1a23d757d09c43d62" + integrity sha512-vG44FgxwfJUF2S6tRG+Sg646DDEgs0CO9RYniafEOHz8rwcNIH3lML7n8LAfzQa+BjBY28+UF0wmqEvd6VCzCQ== dependencies: - "@react-aria/focus" "^3.18.1" - "@react-aria/interactions" "^3.22.1" - "@react-aria/utils" "^3.25.1" - "@react-stately/toggle" "^3.7.6" - "@react-types/checkbox" "^3.8.3" - "@react-types/shared" "^3.24.1" + "@react-aria/focus" "^3.18.4" + "@react-aria/form" "^3.0.10" + "@react-aria/label" "^3.7.12" + "@react-aria/utils" "^3.25.3" + "@react-stately/form" "^3.0.6" + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" + "@react-types/textfield" "^3.9.7" + "@swc/helpers" "^0.5.0" + +"@react-aria/toggle@^3.10.4": + version "3.10.9" + resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.10.9.tgz#6876cdc963c311d73a11e33031a905b47927063b" + integrity sha512-dtfnyIU2/kcH9rFAiB48diSmaXDv45K7UCuTkMQLjbQa3QHC1oYNbleVN/VdGyAMBsIWtfl8L4uuPrAQmDV/bg== + dependencies: + "@react-aria/focus" "^3.18.4" + "@react-aria/interactions" "^3.22.4" + "@react-aria/utils" "^3.25.3" + "@react-stately/toggle" "^3.7.8" + "@react-types/checkbox" "^3.8.4" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" "@react-aria/tooltip@3.7.4": version "3.7.4" - resolved "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.4.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.7.4.tgz#0efe8b4cc543a39395e99861ad6f0c64cd746026" integrity sha512-+XRx4HlLYqWY3fB8Z60bQi/rbWDIGlFUtXYbtoa1J+EyRWfhpvsYImP8qeeNO/vgjUtDy1j9oKa8p6App9mBMQ== dependencies: "@react-aria/focus" "^3.17.1" @@ -2019,9 +2186,9 @@ "@react-types/tooltip" "^3.4.9" "@swc/helpers" "^0.5.0" -"@react-aria/utils@3.24.1", "@react-aria/utils@^3.24.1": +"@react-aria/utils@3.24.1": version "3.24.1" - resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.24.1.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.24.1.tgz#9d16023f07c23c41793c9030a9bd203a9c8cf0a7" integrity sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q== dependencies: "@react-aria/ssr" "^3.9.4" @@ -2030,20 +2197,20 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/utils@^3.25.1": - version "3.25.1" - resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.25.1.tgz" - integrity sha512-5Uj864e7T5+yj78ZfLnfHqmypLiqW2mN+nsdslog2z5ssunTqjolVeM15ootXskjISlZ7MojLpq97kIC4nlnAw== +"@react-aria/utils@^3.24.1", "@react-aria/utils@^3.25.3": + version "3.25.3" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.25.3.tgz#cad9bffc07b045cdc283df2cb65c18747acbf76d" + integrity sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA== dependencies: - "@react-aria/ssr" "^3.9.5" - "@react-stately/utils" "^3.10.2" - "@react-types/shared" "^3.24.1" + "@react-aria/ssr" "^3.9.6" + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/visually-hidden@3.8.12", "@react-aria/visually-hidden@^3.8.12": +"@react-aria/visually-hidden@3.8.12": version "3.8.12" - resolved "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.12.tgz" + resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.12.tgz#89388b4773b8fbea4b5f9682e807510c14218c93" integrity sha512-Bawm+2Cmw3Xrlr7ARzl2RLtKh0lNUdJ0eNqzWcyx4c0VHUAWtThmH5l+HRqFUGzzutFZVo89SAy40BAbd0gjVw== dependencies: "@react-aria/interactions" "^3.21.3" @@ -2051,9 +2218,19 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@3.5.1", "@react-stately/calendar@^3.5.1": +"@react-aria/visually-hidden@^3.8.12", "@react-aria/visually-hidden@^3.8.17": + version "3.8.17" + resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.17.tgz#b006aad526d78a9897fcbc793e57ddfe1adbd1af" + integrity sha512-WFgny1q2CbxxU6gu46TGQXf1DjsnuSk+RBDP4M7bm1mUVZzoCp7U7AtjNmsBrWg0NejxUdgD7+7jkHHCQ91qRA== + dependencies: + "@react-aria/interactions" "^3.22.4" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/calendar@3.5.1": version "3.5.1" - resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.5.1.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.5.1.tgz#3e865d69675ba78f56e7abfadff0ef667f438a69" integrity sha512-7l7QhqGUJ5AzWHfvZzbTe3J4t72Ht5BmhW4hlVI7flQXtfrmYkVtl3ZdytEZkkHmWGYZRW9b4IQTQGZxhtlElA== dependencies: "@internationalized/date" "^3.5.4" @@ -2062,9 +2239,20 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/checkbox@3.6.5", "@react-stately/checkbox@^3.6.5": +"@react-stately/calendar@^3.5.1": + version "3.5.5" + resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.5.5.tgz#52249991e1e9c40921cd3d6dce727c0dd37536cb" + integrity sha512-HzaiDRhrmaYIly8hRsjjIrydLkldiw1Ws6T/130NLQOt+VPwRW/x0R+nil42mA9LZ6oV0XN0NpmG5tn7TaKRGw== + dependencies: + "@internationalized/date" "^3.5.6" + "@react-stately/utils" "^3.10.4" + "@react-types/calendar" "^3.4.10" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/checkbox@3.6.5": version "3.6.5" - resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.5.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.5.tgz#0566eae3ba3a84af6f29526b3feaf124d3c3a66b" integrity sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg== dependencies: "@react-stately/form" "^3.0.3" @@ -2073,25 +2261,36 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/collections@3.10.7", "@react-stately/collections@^3.10.7": +"@react-stately/checkbox@^3.6.5": + version "3.6.9" + resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.6.9.tgz#e7ff459cb8fe2f57bac37ed666e8304eb70a8ed3" + integrity sha512-JrY3ecnK/SSJPxw+qhGhg3YV4e0CpUcPDrVwY3mSiAE932DPd19xr+qVCknJ34H7JYYt/q0l2z0lmgPnl96RTg== + dependencies: + "@react-stately/form" "^3.0.6" + "@react-stately/utils" "^3.10.4" + "@react-types/checkbox" "^3.8.4" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/collections@3.10.7": version "3.10.7" - resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.7.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.10.7.tgz#b1add46cb8e2f2a0d33938ef1b232fb2d0fd11eb" integrity sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA== dependencies: "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/collections@^3.10.9": - version "3.10.9" - resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.9.tgz" - integrity sha512-plyrng6hOQMG8LrjArMA6ts/DgWyXln3g90/hFNbqe/hdVYF53sDVsj8Jb+5LtoYTpiAlV6eOvy1XR0vPZUf8w== +"@react-stately/collections@^3.10.7", "@react-stately/collections@^3.11.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.11.0.tgz#d04dd728ce4f5036a4e2830b1bbbba36aafd2ef0" + integrity sha512-TiJeJjHMPSbbeAhmCXLJNSCk0fa5XnCvEuYw6HtQzDnYiq1AD7KAwkpjC5NfKkjqF3FLXs/v9RDm/P69q6rYzw== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-stately/combobox@3.8.4", "@react-stately/combobox@^3.8.4": +"@react-stately/combobox@3.8.4": version "3.8.4" - resolved "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.4.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.8.4.tgz#6540ec4d53af210e6f3a769ba3f2615a55380984" integrity sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA== dependencies: "@react-stately/collections" "^3.10.7" @@ -2104,9 +2303,24 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@3.9.4", "@react-stately/datepicker@^3.9.4": +"@react-stately/combobox@^3.8.4": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.10.0.tgz#33667983b8042b6dd342dcea2dd8944e834d4a90" + integrity sha512-4W4HCCjjoddW/LZM3pSSeLoV7ncYXlaICKmqlBcbtLR5jY4U5Kx+pPpy3oJ1vCdjDHatIxZ0tVKEBP7vBQVeGQ== + dependencies: + "@react-stately/collections" "^3.11.0" + "@react-stately/form" "^3.0.6" + "@react-stately/list" "^3.11.0" + "@react-stately/overlays" "^3.6.11" + "@react-stately/select" "^3.6.8" + "@react-stately/utils" "^3.10.4" + "@react-types/combobox" "^3.13.0" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/datepicker@3.9.4": version "3.9.4" - resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.4.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.9.4.tgz#c9862cdc09da72760ed3005169223c7743b44b2d" integrity sha512-yBdX01jn6gq4NIVvHIqdjBUPo+WN8Bujc4OnPw+ZnfA4jI0eIgq04pfZ84cp1LVXW0IB0VaCu1AlQ/kvtZjfGA== dependencies: "@internationalized/date" "^3.5.4" @@ -2118,43 +2332,57 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/flags@^3.0.3": - version "3.0.3" - resolved "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.3.tgz" - integrity sha512-/ha7XFA0RZTQsbzSPwu3KkbNMgbvuM0GuMTYLTBWpgBrovBNTM+QqI/PfZTdHg8PwCYF4H5Y8gjdSpdulCvJFw== +"@react-stately/datepicker@^3.9.4": + version "3.10.3" + resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.10.3.tgz#4c7ea07cc1e0d145c8ce1ad406ca44470e654c4c" + integrity sha512-6PJW1QMwk6BQMktV9L6DA4f2rfAdLfbq3iTNLy4qxd5IfNPLMUZiJGGTj+cuqx0WcEl+q5irp+YhKBpbmhPZHg== + dependencies: + "@internationalized/date" "^3.5.6" + "@internationalized/string" "^3.2.4" + "@react-stately/form" "^3.0.6" + "@react-stately/overlays" "^3.6.11" + "@react-stately/utils" "^3.10.4" + "@react-types/datepicker" "^3.8.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/flags@^3.0.3", "@react-stately/flags@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@react-stately/flags/-/flags-3.0.4.tgz#ac778647733b6f7c46f4b0f907cec82f08986490" + integrity sha512-RNJEkOALwKg+JeYsfNlfPc4GXm7hiBLX0yuHOkRapWEyDOfi0cinkV/TZG4goOZdQ5tBpHmemf2qqiHAxqHlzQ== dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/form@3.0.3", "@react-stately/form@^3.0.3": +"@react-stately/form@3.0.3": version "3.0.3" - resolved "https://registry.npmjs.org/@react-stately/form/-/form-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.0.3.tgz#9894f9b219cc4cfbbde814d43d3f897bc43b25b3" integrity sha512-92YYBvlHEWUGUpXgIaQ48J50jU9XrxfjYIN8BTvvhBHdD63oWgm8DzQnyT/NIAMzdLnhkg7vP+fjG8LjHeyIAg== dependencies: "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/form@^3.0.5": - version "3.0.5" - resolved "https://registry.npmjs.org/@react-stately/form/-/form-3.0.5.tgz" - integrity sha512-J3plwJ63HQz109OdmaTqTA8Qhvl3gcYYK7DtgKyNP6mc/Me2Q4tl2avkWoA+22NRuv5m+J8TpBk4AVHUEOwqeQ== +"@react-stately/form@^3.0.3", "@react-stately/form@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@react-stately/form/-/form-3.0.6.tgz#788c837a7967a499366928a91738b15dd7f87d77" + integrity sha512-KMsxm3/V0iCv/6ikt4JEjVM3LW2AgCzo7aNotMzRobtwIo0RwaUo7DQNY00rGgFQ3/IjzI6DcVo13D+AVE/zXg== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-stately/grid@^3.8.7", "@react-stately/grid@^3.9.1": - version "3.9.1" - resolved "https://registry.npmjs.org/@react-stately/grid/-/grid-3.9.1.tgz" - integrity sha512-LSVIcXO/cqwG0IgDSk2juDbpARBS1IzGnsTp/8vSOejMxq5MXrwxL5hUcqNczL8Ss6aLpELm42tCS0kPm3cMKw== +"@react-stately/grid@^3.8.7", "@react-stately/grid@^3.9.3": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.9.3.tgz#1ead7cc7b6d036c4609692eaf818a70f472ba8c8" + integrity sha512-P5KgCNYwm/n8bbLx6527li89RQWoESikrsg2MMyUpUd6IJ321t2pGONGRRQzxE0SBMolPRDJKV0Do2OlsjYKhQ== dependencies: - "@react-stately/collections" "^3.10.9" - "@react-stately/selection" "^3.16.1" - "@react-types/grid" "^3.2.8" - "@react-types/shared" "^3.24.1" + "@react-stately/collections" "^3.11.0" + "@react-stately/selection" "^3.17.0" + "@react-types/grid" "^3.2.9" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-stately/list@3.10.5", "@react-stately/list@^3.10.5": +"@react-stately/list@3.10.5": version "3.10.5" - resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.10.5.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.10.5.tgz#b68ebd595b5f4a51d6719cdcabd34f0780e95b85" integrity sha512-fV9plO+6QDHiewsYIhboxcDhF17GO95xepC5ki0bKXo44gr14g/LSo/BMmsaMnV+1BuGdBunB05bO4QOIaigXA== dependencies: "@react-stately/collections" "^3.10.7" @@ -2163,20 +2391,20 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/list@^3.10.7": - version "3.10.7" - resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.10.7.tgz" - integrity sha512-W5PG7uG5GQV2Q59vXJE7QLKHZIoUNEx+JmHrBUCMKUgyngSpKIIEDR/R/C1b6ZJ9jMqqZA68Zlnd5iK1/mBi1A== +"@react-stately/list@^3.10.5", "@react-stately/list@^3.11.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.11.0.tgz#8bb5d43f6468510562d1023a59f039052a7237f8" + integrity sha512-O+BxXcbtoLZWn4QIT54RoFUaM+QaJQm6s0ZBJ3Jv4ILIhukVOc55ra+aWMVlXFQSpbf6I3hyVP6cz1yyvd5Rtw== dependencies: - "@react-stately/collections" "^3.10.9" - "@react-stately/selection" "^3.16.1" - "@react-stately/utils" "^3.10.2" - "@react-types/shared" "^3.24.1" + "@react-stately/collections" "^3.11.0" + "@react-stately/selection" "^3.17.0" + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-stately/menu@3.7.1", "@react-stately/menu@^3.7.1": +"@react-stately/menu@3.7.1": version "3.7.1" - resolved "https://registry.npmjs.org/@react-stately/menu/-/menu-3.7.1.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.7.1.tgz#af3c259c519de036d9e80d7d8370278c7b042c6a" integrity sha512-mX1w9HHzt+xal1WIT2xGrTQsoLvDwuB2R1Er1MBABs//MsJzccycatcgV/J/28m6tO5M9iuFQQvLV+i1dCtodg== dependencies: "@react-stately/overlays" "^3.6.7" @@ -2184,27 +2412,37 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/overlays@3.6.7", "@react-stately/overlays@^3.6.7": +"@react-stately/menu@^3.7.1", "@react-stately/menu@^3.8.3": + version "3.8.3" + resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.8.3.tgz#88656fc799ab8591650c87711688a8ccb7986c2e" + integrity sha512-sV63V+cMgzipx/N7dq5GaXoItfXIfFEpCtlk3PM2vKstlCJalszXrdo+x996bkeU96h0plB7znAlhlXOeTKzUg== + dependencies: + "@react-stately/overlays" "^3.6.11" + "@react-types/menu" "^3.9.12" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/overlays@3.6.7": version "3.6.7" - resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.7.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.7.tgz#d4aa1b709e6e72306c33308bb031466730dd0480" integrity sha512-6zp8v/iNUm6YQap0loaFx6PlvN8C0DgWHNlrlzMtMmNuvjhjR0wYXVaTfNoUZBWj25tlDM81ukXOjpRXg9rLrw== dependencies: "@react-stately/utils" "^3.10.1" "@react-types/overlays" "^3.8.7" "@swc/helpers" "^0.5.0" -"@react-stately/overlays@^3.6.9": - version "3.6.9" - resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.9.tgz" - integrity sha512-4chfyzKw7P2UEainm0yzjUgYwG1ovBejN88eTrn+O62x5huuMCwe0cbMxmYh4y7IhRFSee3jIJd0SP0u/+i39w== +"@react-stately/overlays@^3.6.11", "@react-stately/overlays@^3.6.7": + version "3.6.11" + resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.11.tgz#67d413853d47d49ed2687c6b74b1749f4b26da6e" + integrity sha512-usuxitwOx4FbmOW7Og4VM8R8ZjerbHZLLbFaxZW7pWLs7Ypway1YhJ3SWcyNTYK7NEk4o602kSoU6MSev1Vgag== dependencies: - "@react-stately/utils" "^3.10.2" - "@react-types/overlays" "^3.8.9" + "@react-stately/utils" "^3.10.4" + "@react-types/overlays" "^3.8.10" "@swc/helpers" "^0.5.0" -"@react-stately/radio@3.10.4", "@react-stately/radio@^3.10.4": +"@react-stately/radio@3.10.4": version "3.10.4" - resolved "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.4.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.4.tgz#499ef1e781a47b5ac89b3af571fc61054327f55b" integrity sha512-kCIc7tAl4L7Hu4Wt9l2jaa+MzYmAJm0qmC8G8yPMbExpWbLRu6J8Un80GZu+JxvzgDlqDyrVvyv9zFifwH/NkQ== dependencies: "@react-stately/form" "^3.0.3" @@ -2213,31 +2451,42 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/select@^3.6.4": - version "3.6.6" - resolved "https://registry.npmjs.org/@react-stately/select/-/select-3.6.6.tgz" - integrity sha512-JEpBosWNSXRexE/iReATei1EiVdTIwOWlLcCGw6K7oC/5/f+OHMsh2Kkt/c/RzM/to3vgR+Wbbqwrb712AWgYQ== +"@react-stately/radio@^3.10.4": + version "3.10.8" + resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.10.8.tgz#1b6e146dc402ce9de05176be6fd75ed260a674c5" + integrity sha512-VRq6Gzsbk3jzX6hdrSoDoSra9vLRsOi2pLkvW/CMrJ0GSgMwr8jjvJKnNFvYJ3eYQb20EwkarsOAfk7vPSIt/Q== dependencies: - "@react-stately/form" "^3.0.5" - "@react-stately/list" "^3.10.7" - "@react-stately/overlays" "^3.6.9" - "@react-types/select" "^3.9.6" - "@react-types/shared" "^3.24.1" + "@react-stately/form" "^3.0.6" + "@react-stately/utils" "^3.10.4" + "@react-types/radio" "^3.8.4" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-stately/selection@^3.15.1", "@react-stately/selection@^3.16.1": - version "3.16.1" - resolved "https://registry.npmjs.org/@react-stately/selection/-/selection-3.16.1.tgz" - integrity sha512-qmnmYaXY7IhhzmIiInec1a/yPxlPSBHka6vrWddvt0S6zN7FU5cv6sm69ONUwYwLKSoaNHgOGvZhmsTzyV0O2A== +"@react-stately/select@^3.6.4", "@react-stately/select@^3.6.8": + version "3.6.8" + resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.6.8.tgz#37d331a4cf248c428aad5fc1349a7cdcae12f89b" + integrity sha512-fLAVzGeYSdYdBdrEVws6Pb1ywFPdapA0eWphoW5s3fS0/pKcVWwbCHeHlaBEi1ISyqEubQZFGQdeFKm/M46Hew== dependencies: - "@react-stately/collections" "^3.10.9" - "@react-stately/utils" "^3.10.2" - "@react-types/shared" "^3.24.1" + "@react-stately/form" "^3.0.6" + "@react-stately/list" "^3.11.0" + "@react-stately/overlays" "^3.6.11" + "@react-types/select" "^3.9.7" + "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" -"@react-stately/slider@3.5.4", "@react-stately/slider@^3.5.4": +"@react-stately/selection@^3.15.1", "@react-stately/selection@^3.17.0": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.17.0.tgz#92ada2cfe00bf47a5c4a53b2809c6703d71a9798" + integrity sha512-It3LRTaFOavybuDBvBH2mvCh73OL4awqvN4tZ0JzLzMtaYSBe9+YmFasYrzB0o7ca17B2q1tpUmsNWaAgIqbLA== + dependencies: + "@react-stately/collections" "^3.11.0" + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/slider@3.5.4": version "3.5.4" - resolved "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.4.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.5.4.tgz#f8c1b5133769380348fa1e8a7a513ebbd88a8355" integrity sha512-Jsf7K17dr93lkNKL9ij8HUcoM1sPbq8TvmibD6DhrK9If2lje+OOL8y4n4qreUnfMT56HCAeS9wCO3fg3eMyrw== dependencies: "@react-stately/utils" "^3.10.1" @@ -2245,9 +2494,19 @@ "@react-types/slider" "^3.7.3" "@swc/helpers" "^0.5.0" -"@react-stately/table@3.11.8", "@react-stately/table@^3.11.8": +"@react-stately/slider@^3.5.4": + version "3.5.8" + resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.5.8.tgz#b5370f2bc0b8833a191b9ce1e0d48e49d4b44972" + integrity sha512-EDgbrxMq1w3+XTN72MGl3YtAG/j65EYX1Uc3Fh56K00+inJbTdRWyYTrb3NA310fXCd0WFBbzExuH2ohlKQycg== + dependencies: + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" + "@react-types/slider" "^3.7.6" + "@swc/helpers" "^0.5.0" + +"@react-stately/table@3.11.8": version "3.11.8" - resolved "https://registry.npmjs.org/@react-stately/table/-/table-3.11.8.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.11.8.tgz#b5323b095be8937761b9c5598f38623089047cf8" integrity sha512-EdyRW3lT1/kAVDp5FkEIi1BQ7tvmD2YgniGdLuW/l9LADo0T+oxZqruv60qpUS6sQap+59Riaxl91ClDxrJnpg== dependencies: "@react-stately/collections" "^3.10.7" @@ -2260,9 +2519,24 @@ "@react-types/table" "^3.9.5" "@swc/helpers" "^0.5.0" -"@react-stately/tabs@3.6.6", "@react-stately/tabs@^3.6.6": +"@react-stately/table@^3.11.8": + version "3.12.3" + resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.12.3.tgz#aae5fa267af2de6ed77a79b8482758ffdd318e80" + integrity sha512-8uGrLcNJYeMbFtzRQZFWCBj5kV+7v3jzwoKIL1j9TmYUKow1PTDMQbPJpAZLQhnC2wVMlaFVgDbedSlbBij7Zg== + dependencies: + "@react-stately/collections" "^3.11.0" + "@react-stately/flags" "^3.0.4" + "@react-stately/grid" "^3.9.3" + "@react-stately/selection" "^3.17.0" + "@react-stately/utils" "^3.10.4" + "@react-types/grid" "^3.2.9" + "@react-types/shared" "^3.25.0" + "@react-types/table" "^3.10.2" + "@swc/helpers" "^0.5.0" + +"@react-stately/tabs@3.6.6": version "3.6.6" - resolved "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.6.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.6.6.tgz#69f4a042406cbe284ffe4c56d3bc8d57cad693fe" integrity sha512-sOLxorH2uqjAA+v1ppkMCc2YyjgqvSGeBDgtR/lyPSDd4CVMoTExszROX2dqG0c8il9RQvzFuufUtQWMY6PgSA== dependencies: "@react-stately/list" "^3.10.5" @@ -2270,36 +2544,55 @@ "@react-types/tabs" "^3.3.7" "@swc/helpers" "^0.5.0" -"@react-stately/toggle@3.7.4", "@react-stately/toggle@^3.7.4": +"@react-stately/tabs@^3.6.6": + version "3.6.10" + resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.6.10.tgz#89543e109e473b308ec12f2bc62ba99c74038f70" + integrity sha512-F7wfoiNsrBy7c02AYHyE1USGgj05HQ0hp7uXmQjp2LEa+AA0NKKi3HdswTHHySxb0ZRuoEE7E7vp/gXQYx2/Ow== + dependencies: + "@react-stately/list" "^3.11.0" + "@react-types/shared" "^3.25.0" + "@react-types/tabs" "^3.3.10" + "@swc/helpers" "^0.5.0" + +"@react-stately/toggle@3.7.4": version "3.7.4" - resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.4.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.7.4.tgz#3345b5c939db96305af7c22b73577db5536220ab" integrity sha512-CoYFe9WrhLkDP4HGDpJYQKwfiYCRBAeoBQHv+JWl5eyK61S8xSwoHsveYuEZ3bowx71zyCnNAqWRrmNOxJ4CKA== dependencies: "@react-stately/utils" "^3.10.1" "@react-types/checkbox" "^3.8.1" "@swc/helpers" "^0.5.0" -"@react-stately/toggle@^3.7.6": - version "3.7.6" - resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.6.tgz" - integrity sha512-xRZyrjNVu1VCd1xpg5RwmNYs9fXb+JHChoUaRcBmGCCjsPD0R5uR3iNuE17RXJtWS3/8o9IJVn90+/7NW7boOg== +"@react-stately/toggle@^3.7.4", "@react-stately/toggle@^3.7.8": + version "3.7.8" + resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.7.8.tgz#14bcc21a50c7196c084542aa83584db86c911d13" + integrity sha512-ySOtkByvIY54yIu8IZ4lnvomQA0H+/mkZnd6T5fKN3tjvIzHmkUk3TAPmNInUxHX148tSW6mWwec0xvjYqEd6w== dependencies: - "@react-stately/utils" "^3.10.2" - "@react-types/checkbox" "^3.8.3" + "@react-stately/utils" "^3.10.4" + "@react-types/checkbox" "^3.8.4" "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@3.4.9", "@react-stately/tooltip@^3.4.9": +"@react-stately/tooltip@3.4.9": version "3.4.9" - resolved "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.9.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.4.9.tgz#a6161db77bd5ad606caa1a302622f92bc381b4ac" integrity sha512-P7CDJsdoKarz32qFwf3VNS01lyC+63gXpDZG31pUu+EO5BeQd4WKN/AH1Beuswpr4GWzxzFc1aXQgERFGVzraA== dependencies: "@react-stately/overlays" "^3.6.7" "@react-types/tooltip" "^3.4.9" "@swc/helpers" "^0.5.0" -"@react-stately/tree@3.8.1", "@react-stately/tree@^3.8.1": +"@react-stately/tooltip@^3.4.9": + version "3.4.13" + resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.4.13.tgz#72381ef42afd6731d4a1b51c30632bb8d07f1757" + integrity sha512-zQ+8FQ7Pi0Cz852dltXb6yaryjE18K3byK4tIO3e5vnrZHEGvfdxowc+v9ak5UV93kVrYoOVmfZHRcEaTXTBNA== + dependencies: + "@react-stately/overlays" "^3.6.11" + "@react-types/tooltip" "^3.4.12" + "@swc/helpers" "^0.5.0" + +"@react-stately/tree@3.8.1": version "3.8.1" - resolved "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.1.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.1.tgz#a3ea36d503a0276a860842cc8bf7c759aa7fa75f" integrity sha512-LOdkkruJWch3W89h4B/bXhfr0t0t1aRfEp+IMrrwdRAl23NaPqwl5ILHs4Xu5XDHqqhg8co73pHrJwUyiTWEjw== dependencies: "@react-stately/collections" "^3.10.7" @@ -2308,23 +2601,34 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/utils@3.10.1", "@react-stately/utils@^3.10.1": +"@react-stately/tree@^3.8.1", "@react-stately/tree@^3.8.5": + version "3.8.5" + resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.8.5.tgz#4c08d29c75a809265c7ead00b78e26d10bb7aea7" + integrity sha512-0/tYhsKWQQJTOZFDwh8hY3Qk6ejNFRldGrLeK5kS22UZdvsMFyh7WAi40FTCJy561/VoB0WqQI4oyNPOa9lYWg== + dependencies: + "@react-stately/collections" "^3.11.0" + "@react-stately/selection" "^3.17.0" + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/utils@3.10.1": version "3.10.1" - resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.1.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.1.tgz#dc8685b4994bef0dc10c37b024074be8afbfba62" integrity sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg== dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/utils@^3.10.2": - version "3.10.2" - resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.2.tgz" - integrity sha512-fh6OTQtbeQC0ywp6LJuuKs6tKIgFvt/DlIZEcIpGho6/oZG229UnIk6TUekwxnDbumuYyan6D9EgUtEMmT8UIg== +"@react-stately/utils@^3.10.1", "@react-stately/utils@^3.10.4": + version "3.10.4" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.4.tgz#310663a834b67048d305e1680ed258130092fe51" + integrity sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw== dependencies: "@swc/helpers" "^0.5.0" "@react-stately/virtualizer@3.7.1", "@react-stately/virtualizer@^3.7.1": version "3.7.1" - resolved "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.7.1.tgz" + resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-3.7.1.tgz#eb962d2ce700c026ce1b1d901034601db9d370c0" integrity sha512-voHgE6EQ+oZaLv6u2umKxakvIKNkCQuUihqKACTjdslp7SJh4Mvs3oLBI0hf0JOh+rCcFIKDvQtFwy1fXFRYBA== dependencies: "@react-aria/utils" "^3.24.1" @@ -2333,65 +2637,88 @@ "@react-types/accordion@3.0.0-alpha.21": version "3.0.0-alpha.21" - resolved "https://registry.npmjs.org/@react-types/accordion/-/accordion-3.0.0-alpha.21.tgz" + resolved "https://registry.yarnpkg.com/@react-types/accordion/-/accordion-3.0.0-alpha.21.tgz#5e8d94c9627a0b188a21adb0cf71d180173b08ea" integrity sha512-cbE06jH/ZoI+1898xd7ocQ/A/Rtkz8wTJAVOYgc8VRY1SYNQ/XZTGH5T6dD6aERAmiDwL/kjD7xhsE80DyaEKA== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/breadcrumbs@3.7.5", "@react-types/breadcrumbs@^3.7.5": +"@react-types/breadcrumbs@3.7.5": version "3.7.5" - resolved "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.5.tgz" + resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.7.5.tgz#72bc6e8881446864d7bf786f4667a2fbdda279f8" integrity sha512-lV9IDYsMiu2TgdMIjEmsOE0YWwjb3jhUNK1DCZZfq6uWuiHLgyx2EncazJBUWSjHJ4ta32j7xTuXch+8Ai6u/A== dependencies: "@react-types/link" "^3.5.5" "@react-types/shared" "^3.23.1" -"@react-types/button@3.9.4", "@react-types/button@^3.9.4": +"@react-types/breadcrumbs@^3.7.5": + version "3.7.8" + resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.7.8.tgz#edcde11c06bad19008a066fa0a91eb5fda9723f5" + integrity sha512-+BW2a+PrY8ArZ+pKecz13oJFrUAhthvXx17o3x0BhWUhRpAdtmTYt2hjw8zNanm2j0Kvgo1HYKgvtskCRxYcOA== + dependencies: + "@react-types/link" "^3.5.8" + "@react-types/shared" "^3.25.0" + +"@react-types/button@3.9.4": version "3.9.4" - resolved "https://registry.npmjs.org/@react-types/button/-/button-3.9.4.tgz" + resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.9.4.tgz#ec10452e870660d31db1994f6fe4abfe0c800814" integrity sha512-raeQBJUxBp0axNF74TXB8/H50GY8Q3eV6cEKMbZFP1+Dzr09Ngv0tJBeW0ewAxAguNH5DRoMUAUGIXtSXskVdA== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/button@^3.9.6": - version "3.9.6" - resolved "https://registry.npmjs.org/@react-types/button/-/button-3.9.6.tgz" - integrity sha512-8lA+D5JLbNyQikf8M/cPP2cji91aVTcqjrGpDqI7sQnaLFikM8eFR6l1ZWGtZS5MCcbfooko77ha35SYplSQvw== +"@react-types/button@^3.10.0", "@react-types/button@^3.9.4": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.10.0.tgz#5044648401f9842c47a433c66180a5a520cc29af" + integrity sha512-rAyU+N9VaHLBdZop4zasn8IDwf9I5Q1EzHUKMtzIFf5aUlMUW+K460zI/l8UESWRSWAXK9/WPSXGxfcoCEjvAA== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" -"@react-types/calendar@3.4.6", "@react-types/calendar@^3.4.6": +"@react-types/calendar@3.4.6": version "3.4.6" - resolved "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.6.tgz" + resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.4.6.tgz#66ddcefc3058492b3cce58a6e63b01558048b669" integrity sha512-WSntZPwtvsIYWvBQRAPvuCn55UTJBZroTvX0vQvWykJRQnPAI20G1hMQ3dNsnAL+gLZUYxBXn66vphmjUuSYew== dependencies: "@internationalized/date" "^3.5.4" "@react-types/shared" "^3.23.1" -"@react-types/checkbox@3.8.1", "@react-types/checkbox@^3.8.1": +"@react-types/calendar@^3.4.10", "@react-types/calendar@^3.4.6": + version "3.4.10" + resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.4.10.tgz#65011c31fb497e25bd98d19c84da3b8d63d5a3aa" + integrity sha512-PyjqxwJxSW2IpQx6y0D9O34fRCWn1gv9q0qFhgaIigIQrPg8zTE/CC7owHLxAtgCnnCt8exJ5rqi414csaHKlA== + dependencies: + "@internationalized/date" "^3.5.6" + "@react-types/shared" "^3.25.0" + +"@react-types/checkbox@3.8.1": version "3.8.1" - resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.8.1.tgz" + resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.8.1.tgz#de82c93542b2dd85c01df2e0c85c33a2e6349d14" integrity sha512-5/oVByPw4MbR/8QSdHCaalmyWC71H/QGgd4aduTJSaNi825o+v/hsN2/CH7Fq9atkLKsC8fvKD00Bj2VGaKriQ== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/checkbox@^3.8.3": - version "3.8.3" - resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.8.3.tgz" - integrity sha512-f4c1mnLEt0iS1NMkyZXgT3q3AgcxzDk7w6MSONOKydcnh0xG5L2oefY14DhVDLkAuQS7jThlUFwiAs+MxiO3MA== +"@react-types/checkbox@^3.8.1", "@react-types/checkbox@^3.8.4": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.8.4.tgz#a51b90025fd362d8b755d8a95640a0134124f688" + integrity sha512-fvZrlQmlFNsYHZpl7GVmyYQlKdUtO5MczMSf8z3TlSiCb5Kl3ha9PsZgLhJqGuVnzB2ArIBz0eZrYa3k0PhcpA== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" -"@react-types/combobox@3.11.1", "@react-types/combobox@^3.11.1": +"@react-types/combobox@3.11.1": version "3.11.1" - resolved "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.11.1.tgz" + resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.11.1.tgz#d5ab2f3c12d01083a3fc7c6ed90b9a2ae9049aa0" integrity sha512-UNc3OHt5cUt5gCTHqhQIqhaWwKCpaNciD8R7eQazmHiA9fq8ROlV+7l3gdNgdhJbTf5Bu/V5ISnN7Y1xwL3zqQ== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/datepicker@3.7.4", "@react-types/datepicker@^3.7.4": +"@react-types/combobox@^3.11.1", "@react-types/combobox@^3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.13.0.tgz#2969ae4121c6d4c7a9e843530f60d9da6b520f49" + integrity sha512-kH/a+Fjpr54M2JbHg9RXwMjZ9O+XVsdOuE5JCpWRibJP1Mfl1md8gY6y6zstmVY8COrSqFvMZWB+PzwaTWjTGw== + dependencies: + "@react-types/shared" "^3.25.0" + +"@react-types/datepicker@3.7.4": version "3.7.4" - resolved "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.4.tgz" + resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.7.4.tgz#8b21df1041d7e51198621984920ac290b2f09744" integrity sha512-ZfvgscvNzBJpYyVWg3nstJtA/VlWLwErwSkd1ivZYam859N30w8yH+4qoYLa6FzWLCFlrsRHyvtxlEM7lUAt5A== dependencies: "@internationalized/date" "^3.5.4" @@ -2399,172 +2726,248 @@ "@react-types/overlays" "^3.8.7" "@react-types/shared" "^3.23.1" -"@react-types/dialog@^3.5.10": - version "3.5.12" - resolved "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.12.tgz" - integrity sha512-JmpQbSpXltqEyYfEwoqDolABIiojeExkqolHNdQlayIsfFuSxZxNwXZPOpz58Ri/iwv21JP7K3QF0Gb2Ohxl9w== +"@react-types/datepicker@^3.7.4", "@react-types/datepicker@^3.8.3": + version "3.8.3" + resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.8.3.tgz#3d54003a92c3a37f35309373ddbb9c663135b631" + integrity sha512-Y4qfPRBB6uzocosCOWSYMuwiZ3YXwLWQYiFB4KCglkvHyltbNz76LgoBEnclYA5HjwosIk4XywiXvHSYry8JnQ== dependencies: - "@react-types/overlays" "^3.8.9" - "@react-types/shared" "^3.24.1" + "@internationalized/date" "^3.5.6" + "@react-types/calendar" "^3.4.10" + "@react-types/overlays" "^3.8.10" + "@react-types/shared" "^3.25.0" -"@react-types/grid@3.2.6", "@react-types/grid@^3.2.6": +"@react-types/dialog@^3.5.10": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.13.tgz#7100f9d5a25626cea2d2d8a755f4c0aa625faa68" + integrity sha512-9k8daVcAqQsySkzDY6NIVlyGxtpEip4TKuLyzAehthbv78GQardD5fHdjQ6eXPRS4I2qZrmytrFFrlOnwWVGHw== + dependencies: + "@react-types/overlays" "^3.8.10" + "@react-types/shared" "^3.25.0" + +"@react-types/grid@3.2.6": version "3.2.6" - resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.6.tgz" + resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.6.tgz#c0aba4a748d1722bafe85acf87f8d9d5134653b3" integrity sha512-XfHenL2jEBUYrhKiPdeM24mbLRXUn79wVzzMhrNYh24nBwhsPPpxF+gjFddT3Cy8dt6tRInfT6pMEu9nsXwaHw== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/grid@^3.2.8": - version "3.2.8" - resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.8.tgz" - integrity sha512-6PJrpukwMqlv3IhJSDkJuVbhHM8Oe6hd2supWqd9adMXrlSP7QHt9a8SgFcFblCCTx8JzUaA0PvY5sTudcEtOQ== +"@react-types/grid@^3.2.6", "@react-types/grid@^3.2.9": + version "3.2.9" + resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.9.tgz#2a3e7b78cdca2df60e408b6f4f2bc6173ac98a0e" + integrity sha512-eMw0d2UIZ4QTzGgD1wGGPw0cv67KjAOCp4TcwWjgDV7Wa5SVV/UvOmpnIVDyfhkG/4KRI5OR9h+isy76B726qA== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" -"@react-types/link@3.5.5", "@react-types/link@^3.5.5": +"@react-types/link@3.5.5": version "3.5.5" - resolved "https://registry.npmjs.org/@react-types/link/-/link-3.5.5.tgz" + resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.5.5.tgz#5ed829aa32f226fe62efb0d906b1926c110daf02" integrity sha512-G6P5WagHDR87npN7sEuC5IIgL1GsoY4WFWKO4734i2CXRYx24G9P0Su3AX4GA3qpspz8sK1AWkaCzBMmvnunfw== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/listbox@^3.4.9": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.5.1.tgz" - integrity sha512-n5bOgD9lgfK1qaLtag9WPnu151SwXBCNn/OgGY/Br9mWRl+nPUEYtFcPX+2VCld7uThf54kwrTmzlFnaraIlcw== +"@react-types/link@^3.5.5", "@react-types/link@^3.5.8": + version "3.5.8" + resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.5.8.tgz#6a21ec7999cc1a5dbc71456b0739e27054114c3a" + integrity sha512-l/YGXddgAbLnIT7ekftXrK1D4n8NlLQwx0d4usyZpaxP1KwPzuwng20DxynamLc1atoKBqbUtZAnz32pe7vYgw== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" -"@react-types/menu@3.9.9", "@react-types/menu@^3.9.9": +"@react-types/listbox@^3.4.9", "@react-types/listbox@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.5.2.tgz#4a807338574e0560d0411b6ce60661d4ca74be6b" + integrity sha512-ML/Bt/MeO0FiixcuFQ+smpu1WguxTOqHDjSnhc1vcNxVQFWQOhyVy01LAY2J/T9TjfjyYGD41vyMTI0f6fcLEQ== + dependencies: + "@react-types/shared" "^3.25.0" + +"@react-types/menu@3.9.9": version "3.9.9" - resolved "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.9.tgz" + resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.9.tgz#d7f81f6ecad7dd04fc730b4ad5c3ca39e3c0883d" integrity sha512-FamUaPVs1Fxr4KOMI0YcR2rYZHoN7ypGtgiEiJ11v/tEPjPPGgeKDxii0McCrdOkjheatLN1yd2jmMwYj6hTDg== dependencies: "@react-types/overlays" "^3.8.7" "@react-types/shared" "^3.23.1" -"@react-types/overlays@3.8.7", "@react-types/overlays@^3.8.7": +"@react-types/menu@^3.9.12", "@react-types/menu@^3.9.9": + version "3.9.12" + resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.12.tgz#d8dd7ec5bdc4435db463cf56e79219a0f4a1a667" + integrity sha512-1SPnkHKJdvOfwv9fEgK1DI6DYRs4D3hW2XcWlLhVXSjaC68CzOHGwFhKIKvZiDTW/11L770PRSEloIxHR09uFQ== + dependencies: + "@react-types/overlays" "^3.8.10" + "@react-types/shared" "^3.25.0" + +"@react-types/overlays@3.8.7": version "3.8.7" - resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.7.tgz" + resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.7.tgz#a43faf524cb3fce74acceee43898b265e8dfee05" integrity sha512-zCOYvI4at2DkhVpviIClJ7bRrLXYhSg3Z3v9xymuPH3mkiuuP/dm8mUCtkyY4UhVeUTHmrQh1bzaOP00A+SSQA== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/overlays@^3.8.9": - version "3.8.9" - resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.9.tgz" - integrity sha512-9ni9upQgXPnR+K9cWmbYWvm3ll9gH8P/XsEZprqIV5zNLMF334jADK48h4jafb1X9RFnj0WbHo6BqcSObzjTig== +"@react-types/overlays@^3.8.10", "@react-types/overlays@^3.8.7": + version "3.8.10" + resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.10.tgz#9315b7d376f2877ef531cb42217327833eabcd15" + integrity sha512-IcnB+VYfAJazRjWhBKZTmVMh3KTp/B1rRbcKkPx6t8djP9UQhKcohP7lAALxjJ56Jjz/GFC6rWyUcnYH0NFVRA== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" -"@react-types/progress@3.5.4", "@react-types/progress@^3.5.4": +"@react-types/progress@3.5.4": version "3.5.4" - resolved "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.4.tgz" + resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.5.4.tgz#22032aa0a64a3ff99fcd6e6e4f22cbc09c9725f3" integrity sha512-JNc246sTjasPyx5Dp7/s0rp3Bz4qlu4LrZTulZlxWyb53WgBNL7axc26CCi+I20rWL9+c7JjhrRxnLl/1cLN5g== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/radio@3.8.1", "@react-types/radio@^3.8.1": +"@react-types/progress@^3.5.4": + version "3.5.7" + resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.5.7.tgz#adba7b5a15163f9c523a00a681513aa37e688314" + integrity sha512-EqMDHmlpoZUZzTjdejGIkSM0pS2LBI9NdadHf3bDNTycHv+5L1xpMHUg8RGOW8a3sRVLRvfN1aO9l75QZkyj+w== + dependencies: + "@react-types/shared" "^3.25.0" + +"@react-types/radio@3.8.1": version "3.8.1" - resolved "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.1.tgz" + resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.8.1.tgz#f12ddd21d88fa278baa8ddc237b778c70b67669f" integrity sha512-bK0gio/qj1+0Ldu/3k/s9BaOZvnnRgvFtL3u5ky479+aLG5qf1CmYed3SKz8ErZ70JkpuCSrSwSCFf0t1IHovw== dependencies: "@react-types/shared" "^3.23.1" +"@react-types/radio@^3.8.1", "@react-types/radio@^3.8.4": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.8.4.tgz#5133d4cd666f20d2449941ca88abe6e56a5c07ff" + integrity sha512-GCuOwQL19iwKa74NAIk9hv4ivyI8oW1+ZCuc2fzyDdeQjzTIlv3qrIyShwpVy1IoI7/4DYTMZm/YXPoKhu5TTA== + dependencies: + "@react-types/shared" "^3.25.0" + "@react-types/select@3.9.4": version "3.9.4" - resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.4.tgz" + resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.4.tgz#6283cdcb0583a87d23aa00fd118365f80fe68484" integrity sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/select@^3.9.6": - version "3.9.6" - resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.6.tgz" - integrity sha512-cVSFR0eJLup/ht1Uto+y8uyLmHO89J6wNh65SIHb3jeVz9oLBAedP3YNI2qB+F9qFMUcA8PBSLXIIuT6gXzLgQ== +"@react-types/select@^3.9.7": + version "3.9.7" + resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.9.7.tgz#d339cca27414c4f6e0bb5c9501a20d0c6249df42" + integrity sha512-Jva4ixfB4EEdy+WmZkUoLiQI7vVfHPxM73VuL7XDxvAO+YKiIztDTcU720QVNhxTMmQvCxfRBXWar8aodCjLiw== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" -"@react-types/shared@3.23.1", "@react-types/shared@^3.23.1": +"@react-types/shared@3.23.1": version "3.23.1" - resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.23.1.tgz" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.23.1.tgz#2f23c81d819d0ef376df3cd4c944be4d6bce84c3" integrity sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw== -"@react-types/shared@^3.24.1": - version "3.24.1" - resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.24.1.tgz" - integrity sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw== +"@react-types/shared@^3.23.1", "@react-types/shared@^3.25.0": + version "3.25.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.25.0.tgz#7223baf72256e918a3c29081bb1ecc6fad4fbf58" + integrity sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ== -"@react-types/slider@^3.7.3": - version "3.7.5" - resolved "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.5.tgz" - integrity sha512-bRitwQRQjQoOcKEdPMljnvm474dwrmsc6pdsVQDh/qynzr+KO9IHuYc3qPW53WVE2hMQJDohlqtCAWQXWQ5Vcg== +"@react-types/slider@^3.7.3", "@react-types/slider@^3.7.6": + version "3.7.6" + resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.7.6.tgz#4196b2bc98902b36de6de31a748d04b76770d228" + integrity sha512-z72wnEzSge6qTD9TUoUPp1A4j4jXk/MVii6rGE78XeE/Pq7HyyjU5bCagryMr9PC9MKa/oTiHcshKqWBDf57GA== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" "@react-types/switch@^3.5.3": - version "3.5.5" - resolved "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.5.tgz" - integrity sha512-SZx1Bd+COhAOs/RTifbZG+uq/llwba7VAKx7XBeX4LeIz1dtguy5bigOBgFTMQi4qsIVCpybSWEEl+daj4XFPw== + version "3.5.6" + resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.5.6.tgz#e18dcce0298ab52b70c9cdcdfe5e16224e7a248d" + integrity sha512-gJ8t2yTCgcitz4ON4ELcLLmtlDkn2MUjjfu3ez/cwA1X/NUluPYkhXj5Z6H+KOlnveqrKCZDRoTgK74cQ6Cvfg== dependencies: - "@react-types/shared" "^3.24.1" + "@react-types/shared" "^3.25.0" -"@react-types/table@3.9.5", "@react-types/table@^3.9.5": +"@react-types/table@3.9.5": version "3.9.5" - resolved "https://registry.npmjs.org/@react-types/table/-/table-3.9.5.tgz" + resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.9.5.tgz#7910debd618405598583a10588a75f97c7b15eeb" integrity sha512-fgM2j9F/UR4Anmd28CueghCgBwOZoCVyN8fjaIFPd2MN4gCwUUfANwxLav65gZk4BpwUXGoQdsW+X50L3555mg== dependencies: "@react-types/grid" "^3.2.6" "@react-types/shared" "^3.23.1" -"@react-types/tabs@3.3.7", "@react-types/tabs@^3.3.7": +"@react-types/table@^3.10.2", "@react-types/table@^3.9.5": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.10.2.tgz#5e0be00eb61899ac6c9c322c6bad9cf94cbe157b" + integrity sha512-YzA4hcsYfnFFpA2UyGb1KKhLpWgaj5daApqjp126tCIosl8k1KxZmhKD50cwH0Jm19lALJseqo5VdlcJtcr4qg== + dependencies: + "@react-types/grid" "^3.2.9" + "@react-types/shared" "^3.25.0" + +"@react-types/tabs@3.3.7": version "3.3.7" - resolved "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.7.tgz" + resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.7.tgz#8bb7a65998395bad75576f5ce32c8ce61329497f" integrity sha512-ZdLe5xOcFX6+/ni45Dl2jO0jFATpTnoSqj6kLIS/BYv8oh0n817OjJkLf+DS3CLfNjApJWrHqAk34xNh6nRnEg== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/textfield@3.9.3", "@react-types/textfield@^3.9.3": +"@react-types/tabs@^3.3.10", "@react-types/tabs@^3.3.7": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.10.tgz#98270b972b48e2272740391aaba033c620dec07e" + integrity sha512-s/Bw/HCIdWJPBw4O703ghKqhjGsIerRMIDxA88hbQYzfTDD6bkFDjCnsP2Tyy1G8Dg2rSPFUEE+k+PpLzqeEfQ== + dependencies: + "@react-types/shared" "^3.25.0" + +"@react-types/textfield@3.9.3": version "3.9.3" - resolved "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.3.tgz" + resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.9.3.tgz#23db9d87ddadc4eddff3f85406af91e442f01dc9" integrity sha512-DoAY6cYOL0pJhgNGI1Rosni7g72GAt4OVr2ltEx2S9ARmFZ0DBvdhA9lL2nywcnKMf27PEJcKMXzXc10qaHsJw== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/tooltip@3.4.9", "@react-types/tooltip@^3.4.9": +"@react-types/textfield@^3.9.3", "@react-types/textfield@^3.9.7": + version "3.9.7" + resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.9.7.tgz#79b0bd2286dbf8ba39233279d1d7a3a3575ad553" + integrity sha512-vU5+QCOF9HgWGjAmmy+cpJibVW5voFomC5POmYHokm7kivYcMMjlonsgWwg/0xXrqE2qosH3tpz4jFoEuig1NQ== + dependencies: + "@react-types/shared" "^3.25.0" + +"@react-types/tooltip@3.4.9": version "3.4.9" - resolved "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.9.tgz" + resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.9.tgz#fb2291bd0b915f7c7f5024ce146412405843ec9b" integrity sha512-wZ+uF1+Zc43qG+cOJzioBmLUNjRa7ApdcT0LI1VvaYvH5GdfjzUJOorLX9V/vAci0XMJ50UZ+qsh79aUlw2yqg== dependencies: "@react-types/overlays" "^3.8.7" "@react-types/shared" "^3.23.1" +"@react-types/tooltip@^3.4.12", "@react-types/tooltip@^3.4.9": + version "3.4.12" + resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.12.tgz#70f5f1552a8c68fc21e5c400481c0f7fedc5ce30" + integrity sha512-FwsdSQ3UDIDORanQMGMLyzSUabw4AkKhwcRdPv4d5OT8GmJr7mBdZynfcsrKLJ0fzskIypMqspoutZidsI0MQg== + dependencies: + "@react-types/overlays" "^3.8.10" + "@react-types/shared" "^3.25.0" + "@swc/counter@^0.1.3": version "0.1.3" - resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/helpers@0.5.5", "@swc/helpers@^0.5.0": +"@swc/helpers@0.5.5": version "0.5.5" - resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== dependencies: "@swc/counter" "^0.1.3" tslib "^2.4.0" +"@swc/helpers@^0.5.0": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== + dependencies: + tslib "^2.8.0" + "@tediousjs/connection-string@^0.5.0": version "0.5.0" - resolved "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.5.0.tgz" + resolved "https://registry.yarnpkg.com/@tediousjs/connection-string/-/connection-string-0.5.0.tgz#9b3d858c040aac6bdf5584bf45370cef5b6522b4" integrity sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ== "@tootallnate/once@2": version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@turf/along@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/along/-/along-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/along/-/along-7.1.0.tgz#1fb8a7f68f94dc752eddf5cf8a6ecfeb44d11310" integrity sha512-WLgBZJ/B6CcASF6WL7M+COtHlVP0hBrMbrtKyF7KBlicwRuijJZXDtEQA5oLgr+k1b2HqGN+UqH2A0/E719enQ== dependencies: "@turf/bearing" "^7.1.0" @@ -2577,7 +2980,7 @@ "@turf/angle@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/angle/-/angle-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/angle/-/angle-7.1.0.tgz#d2d07842d6818ed7509d102deea24f4cd9f0a8c5" integrity sha512-YMHEV/YrARsWgWoQuXEWrQMsvB8z67nTMw2eiLZ883V7jwkhWQGvCW6W+/mGgsWQdHppjCZNcKryryhD2GRWVA== dependencies: "@turf/bearing" "^7.1.0" @@ -2589,7 +2992,7 @@ "@turf/area@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/area/-/area-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/area/-/area-7.1.0.tgz#c8b506cfa9f8b06570c090c9cf915fa080ae7b66" integrity sha512-w91FEe02/mQfMPRX2pXua48scFuKJ2dSVMF2XmJ6+BJfFiCPxp95I3+Org8+ZsYv93CDNKbf0oLNEPnuQdgs2g== dependencies: "@turf/helpers" "^7.1.0" @@ -2599,7 +3002,7 @@ "@turf/bbox-clip@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/bbox-clip/-/bbox-clip-7.1.0.tgz#59dabb04d270949c9111619b54981bea25305f9c" integrity sha512-PhZubKCzF/afwStUzODqOJluiCbCw244lCtVhXA9F+Pgkhvk8KvbFdgpPquOZ45OwuktrchSB28BrBkSBiadHw== dependencies: "@turf/helpers" "^7.1.0" @@ -2609,7 +3012,7 @@ "@turf/bbox-polygon@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/bbox-polygon/-/bbox-polygon-7.1.0.tgz#5034eefcae4e497f72763220c191cc2b436649fa" integrity sha512-fvZB09ErCZOVlWVDop836hmpKaGUmfXnR9naMhS73A/8nn4M3hELbQtMv2R8gXj7UakXCuxS/i9erdpDFZ2O+g== dependencies: "@turf/helpers" "^7.1.0" @@ -2618,7 +3021,7 @@ "@turf/bbox@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/bbox/-/bbox-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-7.1.0.tgz#45a9287c084f7b79577ee88b7b539d83562b923b" integrity sha512-PdWPz9tW86PD78vSZj2fiRaB8JhUHy6piSa/QXb83lucxPK+HTAdzlDQMTKj5okRCU8Ox/25IR2ep9T8NdopRA== dependencies: "@turf/helpers" "^7.1.0" @@ -2628,7 +3031,7 @@ "@turf/bearing@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/bearing/-/bearing-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/bearing/-/bearing-7.1.0.tgz#77e2db3667f19b62a6b89669be1c4060faa9941d" integrity sha512-X5lackrZ6FW+YhgjWxwVFRgWD1j4xm4t5VvE6EE6v/1PVaHQ5OCjf6u1oaLx5LSG+gaHUhjTlAHrn9MYPFaeTA== dependencies: "@turf/helpers" "^7.1.0" @@ -2638,7 +3041,7 @@ "@turf/bezier-spline@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/bezier-spline/-/bezier-spline-7.1.0.tgz#489a00e6482580ec30ab9ef0945b6ddcb57848f2" integrity sha512-bhBY70bcVYJEosuW7B/TFtnE5rmPTTpxmJvljhGC0eyM84oNVv7apDBuseb5KdlTOOBIvdD9nIE4qV8lmplp6w== dependencies: "@turf/helpers" "^7.1.0" @@ -2648,7 +3051,7 @@ "@turf/boolean-clockwise@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-clockwise/-/boolean-clockwise-7.1.0.tgz#ccf8fe79cabac7250020ffe7f6e3b6d65246af18" integrity sha512-H5DYno+gHwZx+VaiC8DUBZXZQlxYecdSvqCfCACWi1uMsKvlht/O+xy65hz2P57lk2smlcV+1ETFVxJlEZduYg== dependencies: "@turf/helpers" "^7.1.0" @@ -2658,7 +3061,7 @@ "@turf/boolean-concave@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-concave/-/boolean-concave-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-concave/-/boolean-concave-7.1.0.tgz#1026cb8ac3708969aa48169a74e946f9f96756cf" integrity sha512-IFCN25DI+hvngxIsv4+MPuRJQRl/Lz/xnZgpH82leCn4Jqn5wW7KqKFMz7G4GoKK+93cK5/6ioAxY7hVWBXxJw== dependencies: "@turf/helpers" "^7.1.0" @@ -2668,7 +3071,7 @@ "@turf/boolean-contains@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-contains/-/boolean-contains-7.1.0.tgz#6ceaf8083c7ed82e41187951eccb2111c23c004e" integrity sha512-ldy4j1/RVChYTYjEb4wWaE/JyF1jA87WpsB4eVLic6OcAYJGs7POF1kfKbcdkJJiRBmhI3CXNA+u+m9y4Z/j3g== dependencies: "@turf/bbox" "^7.1.0" @@ -2681,7 +3084,7 @@ "@turf/boolean-crosses@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-crosses/-/boolean-crosses-7.1.0.tgz#9af2d6915a3922e0754910e7b2ce10fcb0c79705" integrity sha512-LK8UM3AENycuGinLCDaL0QSznGMnD0XsjFDGnY4KehshiL5Zd8ZsPyKmHOPygUJT9DWeH69iLx459lOc+5Vj2w== dependencies: "@turf/boolean-point-in-polygon" "^7.1.0" @@ -2694,7 +3097,7 @@ "@turf/boolean-disjoint@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-disjoint/-/boolean-disjoint-7.1.0.tgz#2ed06023f369ffc2bccfec463be13d7db2193acf" integrity sha512-JapOG03kOCoGeYMWgTQjEifhr1nUoK4Os2cX0iC5X9kvZF4qCHeruX8/rffBQDx7PDKQKusSTXq8B1ISFi0hOw== dependencies: "@turf/boolean-point-in-polygon" "^7.1.0" @@ -2707,7 +3110,7 @@ "@turf/boolean-equal@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-equal/-/boolean-equal-7.1.0.tgz#ccc50d34360cfe405ed4e2eed142cb64d1d66504" integrity sha512-deghtFMApc7fNsdXtZdgYR4gsU+TVfowcv666nrvZbPPsXL6NTYGBhDFmYXsJ8gPTCGT9uT0WXppdgT8diWOxA== dependencies: "@turf/clean-coords" "^7.1.0" @@ -2719,7 +3122,7 @@ "@turf/boolean-intersects@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-intersects/-/boolean-intersects-7.1.0.tgz#2004b3e866447c748c56ebf44ffadbbd1f7066bf" integrity sha512-gpksWbb0RT+Z3nfqRfoACY3KEFyv2BPaxJ3L76PH67DhHZviq3Nfg85KYbpuhS64FSm+9tXe4IaKn6EjbHo20g== dependencies: "@turf/boolean-disjoint" "^7.1.0" @@ -2730,7 +3133,7 @@ "@turf/boolean-overlap@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-overlap/-/boolean-overlap-7.1.0.tgz#040f31fb3cbf2a26fab27a0f9d72f3ba148c4bdc" integrity sha512-mJRN0X8JiPm8eDZk5sLvIrsP03A2GId6ijx4VgSE1AvHwV6qB561KlUbWxga2AScocIfv/y/qd2OCs+/TQSZcg== dependencies: "@turf/helpers" "^7.1.0" @@ -2744,7 +3147,7 @@ "@turf/boolean-parallel@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-parallel/-/boolean-parallel-7.1.0.tgz#ebd9b5ec081e3ce9a4a86bbe378c9eca9d69d54e" integrity sha512-tA84Oux0X91CxUc6c/lZph5W9wUZGNT4fxFOg5Gp1IMTSwtxSYL1LMvKsr/VmMnwdOUkNcqAgU06+t4wBLtDfg== dependencies: "@turf/clean-coords" "^7.1.0" @@ -2756,7 +3159,7 @@ "@turf/boolean-point-in-polygon@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.1.0.tgz#dec07b467d74b4409eb03acc60b874958f71b49a" integrity sha512-mprVsyIQ+ijWTZwbnO4Jhxu94ZW2M2CheqLiRTsGJy0Ooay9v6Av5/Nl3/Gst7ZVXxPqMeMaFYkSzcTc87AKew== dependencies: "@turf/helpers" "^7.1.0" @@ -2767,7 +3170,7 @@ "@turf/boolean-point-on-line@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-point-on-line/-/boolean-point-on-line-7.1.0.tgz#03a29be5e9806b1b34255e69f03c3af1adfbcc4d" integrity sha512-Kd83EjeTyY4kVMAhcW3Lb8aChwh24BUIhmpE9Or8M+ETNsFGzn9M7qtIySJHLRzKAL3letvWSKXKQPuK1AhAzg== dependencies: "@turf/helpers" "^7.1.0" @@ -2777,7 +3180,7 @@ "@turf/boolean-touches@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-touches/-/boolean-touches-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-touches/-/boolean-touches-7.1.0.tgz#0b77cf84923479b016a04720408c23f8f4603fdf" integrity sha512-qN4LCs3RfVtNAAdn5GpsUFBqoZyAaK9UzSnGSh67GP9sy5M8MEHwM/HAJ5zGWJqQADrczI3U6BRWGLcGfGSz3Q== dependencies: "@turf/boolean-point-in-polygon" "^7.1.0" @@ -2789,7 +3192,7 @@ "@turf/boolean-valid@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-valid/-/boolean-valid-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-valid/-/boolean-valid-7.1.0.tgz#b414652879dad18a15720c366c633c573d3ebad1" integrity sha512-zq1QCfQEyn+piHlvxxDifjmsJn2xl53i4mnKFYdMQI/i09XiX+Fi/MVM3i2hf3D5AsEPsud8Tk7C7rWNCm4nVw== dependencies: "@turf/bbox" "^7.1.0" @@ -2807,7 +3210,7 @@ "@turf/boolean-within@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/boolean-within/-/boolean-within-7.1.0.tgz#64f6f89ad14267b01a30a732819bba7d53cf1b47" integrity sha512-pgXgKCzYHssADQ1nClB1Q9aWI/dE1elm2jy3B5X59XdoFXKrKDZA+gCHYOYgp2NGO/txzVfl3UKvnxIj54Fa4w== dependencies: "@turf/bbox" "^7.1.0" @@ -2820,7 +3223,7 @@ "@turf/buffer@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/buffer/-/buffer-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/buffer/-/buffer-7.1.0.tgz#87afad8ff306eda6199769d040d7723a52553be1" integrity sha512-QM3JiCMYA19k5ouO8wJtvICX3Y8XntxVpDfHSKhFFidZcCkMTR2PWWOpwS6EoL3t75rSKw/FOLIPLZGtIu963w== dependencies: "@turf/bbox" "^7.1.0" @@ -2834,7 +3237,7 @@ "@turf/center-mean@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/center-mean/-/center-mean-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/center-mean/-/center-mean-7.1.0.tgz#00fe3786db54b74748fd4462850869ae249cad70" integrity sha512-NQZB1LUVsyAD+p0+D4huzX2XVnfVx1yEEI9EX602THmi+g+nkge4SK9OMV11ov/Tv8JJ6aVNVPo/cy1vm/LCIQ== dependencies: "@turf/bbox" "^7.1.0" @@ -2845,7 +3248,7 @@ "@turf/center-median@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/center-median/-/center-median-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/center-median/-/center-median-7.1.0.tgz#3bbfe023c486c8e3e228c281333b81f31969c964" integrity sha512-jx4/Ql5+v41Cd0J/gseNCUbLTzWUT2LUaiXn8eFWDrvmEgqHIx7KJcGcJd5HzV+9zJwng4AXxyh5NMvUR0NjwA== dependencies: "@turf/center-mean" "^7.1.0" @@ -2858,7 +3261,7 @@ "@turf/center-of-mass@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/center-of-mass/-/center-of-mass-7.1.0.tgz#f8356544105b1bb1c57dde03c0d861965f2678f1" integrity sha512-j38oBlj7LBoCjZbrIo8EoHVGhk7UQmMLQ1fe8ZPAF9pd05XEL1qxyHKZKdQ/deGISiaEhXCyfLNrKAHAuy25RA== dependencies: "@turf/centroid" "^7.1.0" @@ -2871,7 +3274,7 @@ "@turf/center@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/center/-/center-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/center/-/center-7.1.0.tgz#de0338ebabe2c1895d07a5585bcda2ebc51c48bc" integrity sha512-p9AvBMwNZmRg65kU27cGKHAUQnEcdz8Y7f/i5DvaMfm4e8zmawr+hzPKXaUpUfiTyLs8Xt2W9vlOmNGyH+6X3w== dependencies: "@turf/bbox" "^7.1.0" @@ -2881,7 +3284,7 @@ "@turf/centroid@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/centroid/-/centroid-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-7.1.0.tgz#7cd55ec0bab79b5fc0ef03a4870a8cbc75e6207f" integrity sha512-1Y1b2l+ZB1CZ+ITjUCsGqC4/tSjwm/R4OUfDztVqyyCq/VvezkLmTNqvXTGXgfP0GXkpv68iCfxF5M7QdM5pJQ== dependencies: "@turf/helpers" "^7.1.0" @@ -2891,7 +3294,7 @@ "@turf/circle@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/circle/-/circle-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/circle/-/circle-7.1.0.tgz#480d934568ec5e0f28e6723c20e5ac61602e32b5" integrity sha512-6qhF1drjwH0Dg3ZB9om1JkWTJfAqBcbtIrAj5UPlrAeHP87hGoCO2ZEsFEAL9Q18vntpivT89Uho/nqQUjJhYw== dependencies: "@turf/destination" "^7.1.0" @@ -2901,7 +3304,7 @@ "@turf/clean-coords@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/clean-coords/-/clean-coords-7.1.0.tgz#69c43911f713da9594e1913b2ebbea0adf351697" integrity sha512-q1U8UbRVL5cRdwOlNjD8mad8pWjFGe0s4ihg1pSiVNq7i47WASJ3k20yZiUFvuAkyNjV0rZ/A7Jd7WzjcierFg== dependencies: "@turf/helpers" "^7.1.0" @@ -2911,7 +3314,7 @@ "@turf/clone@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/clone/-/clone-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/clone/-/clone-7.1.0.tgz#b0cbf60b84fadd30ae8411f12d3bdcd3e773577f" integrity sha512-5R9qeWvL7FDdBIbEemd0eCzOStr09oburDvJ1hRiPCFX6rPgzcZBQ0gDmZzoF4AFcNLb5IwknbLZjVLaUGWtFA== dependencies: "@turf/helpers" "^7.1.0" @@ -2920,7 +3323,7 @@ "@turf/clusters-dbscan@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/clusters-dbscan/-/clusters-dbscan-7.1.0.tgz#44c1df9abc6e59f43b70d48b29dc4735f54817fd" integrity sha512-BmrBTOEaKN5FIED6b3yb3V3ejfK0A2Q3pT9/ji3mcRLJiBaRGeiN5V6gtGXe7PeMYdoqhHykU5Ye2uUtREWRdQ== dependencies: "@turf/clone" "^7.1.0" @@ -2933,7 +3336,7 @@ "@turf/clusters-kmeans@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/clusters-kmeans/-/clusters-kmeans-7.1.0.tgz#3811a68d43c3afa8ffa5c180f58a57f9116f8197" integrity sha512-M8cCqR6iE1jDSUF/UU9QdPUFrobZS2fo59TfF1IRHZ2G1EjbcK4GzZcUfmQS6DZraGudYutpMYIuNdm1dPMqdQ== dependencies: "@turf/clone" "^7.1.0" @@ -2946,7 +3349,7 @@ "@turf/clusters@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/clusters/-/clusters-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/clusters/-/clusters-7.1.0.tgz#d56200d185b145887129e419a52880fe7971f9d5" integrity sha512-7CY3Ai+5V6q2O9/IgqLpJQrmrTy7aUJjTW1iRan8Tz3WixvxyJHeS3iyRy8Oc0046chQIaHLtyTgKVt2QdsPSA== dependencies: "@turf/helpers" "^7.1.0" @@ -2956,7 +3359,7 @@ "@turf/collect@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/collect/-/collect-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/collect/-/collect-7.1.0.tgz#a4fa940fe5cb41037acd6aa50aaad3ba0ec1a224" integrity sha512-6indMWLiKeBh4AsioNeFeFnO0k9U5CBsWAFEje6tOEFI4c+P7LF9mNA9z91H8KkrhegR9XNO5Vm2rmdY63aYXw== dependencies: "@turf/bbox" "^7.1.0" @@ -2968,7 +3371,7 @@ "@turf/combine@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/combine/-/combine-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/combine/-/combine-7.1.0.tgz#8c2b9c77baee41275a912895f2068b2bfd7b3da2" integrity sha512-Xl7bGKKjgzIq2T/IemS6qnIykyuxU6cMxKtz+qLeWJGoNww/BllwxXePSV+dWRPXZTFFj96KIhBXAW0aUjAQKQ== dependencies: "@turf/helpers" "^7.1.0" @@ -2978,7 +3381,7 @@ "@turf/concave@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/concave/-/concave-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/concave/-/concave-7.1.0.tgz#ab2d5688e509e3b689a6dde32d5562c7d5149530" integrity sha512-aSid53gYRee4Tjc4pfeI3KI+RoBUnL/hRMilxIPduagTgZZS+cvvk01OQWBKm5UTVfHRGuy0XIqnK8y9RFinDQ== dependencies: "@turf/clone" "^7.1.0" @@ -2994,7 +3397,7 @@ "@turf/convex@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/convex/-/convex-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/convex/-/convex-7.1.0.tgz#9639c582149ba7e93a98a027af1c7e7641be6702" integrity sha512-w9fUMZYE36bLrEWEj7L7aVMCB7NBtr2o8G+avRvUIwF4DPqbtcjlcZE9EEBfq44uYdn+/Pke6Iq42T/zyD/cpg== dependencies: "@turf/helpers" "^7.1.0" @@ -3005,7 +3408,7 @@ "@turf/destination@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/destination/-/destination-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/destination/-/destination-7.1.0.tgz#2e11330f331c0fc699f5a22d02bd54d7fd958c14" integrity sha512-97XuvB0iaAiMg86hrnZ529WwP44TQAA9mmI5PMlchACiA4LFrEtWjjDzvO6234coieoqhrw6dZYcJvd5O2PwrQ== dependencies: "@turf/helpers" "^7.1.0" @@ -3015,7 +3418,7 @@ "@turf/difference@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/difference/-/difference-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/difference/-/difference-7.1.0.tgz#c69b56bf16d3642fc35f5432f829d2e9589f7fd8" integrity sha512-+JVzdskICQ8ULKQ9CpWUM5kBvoXxN4CO78Ez/Ki3/7NXl7+HM/nb12B0OyM8hkJchpb8TsOi0YwyJiKMqEpTBA== dependencies: "@turf/helpers" "^7.1.0" @@ -3026,7 +3429,7 @@ "@turf/dissolve@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/dissolve/-/dissolve-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/dissolve/-/dissolve-7.1.0.tgz#21a5e00082d7ded9a3d0bd029803fdc3753b18ad" integrity sha512-fyOnCSYVUZ8SF9kt9ROnQYlkJTE0hpWSoWwbMZQCAR7oVZVPiuPq7eIbzTP+k5jzEAnofsqoGs5qVDTjHcWMiw== dependencies: "@turf/flatten" "^7.1.0" @@ -3039,7 +3442,7 @@ "@turf/distance-weight@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/distance-weight/-/distance-weight-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/distance-weight/-/distance-weight-7.1.0.tgz#a60955ea465aee982fd638f3f9666a6ff102817e" integrity sha512-8m6s4y8Yyt6r3itf44yAJjXC+62UkrkhOpskIfaE0lHcBcvZz9wjboHoBf3bS4l/42E4StcanbFZdjOpODAdZw== dependencies: "@turf/centroid" "^7.1.0" @@ -3051,7 +3454,7 @@ "@turf/distance@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/distance/-/distance-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/distance/-/distance-7.1.0.tgz#12317573f9774e1c9d6fb08bf90338d9904d2f1d" integrity sha512-hhNHhxCHB3ddzAGCNY4BtE29OZh+DAJPvUapQz+wOjISnlwvMcwLKvslgHWSYF536QDVe/93FEU2q67+CsZTPA== dependencies: "@turf/helpers" "^7.1.0" @@ -3061,7 +3464,7 @@ "@turf/ellipse@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/ellipse/-/ellipse-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/ellipse/-/ellipse-7.1.0.tgz#362dee520f641bb7a662cc2d23cf51b7a78ec36e" integrity sha512-AfOahUmStDExWGPg8ZWxxkgom+fdJs7Mn9DzZH+fV/uZ+je1bLQpbPCUu9/ev6u/HhbYGl4VAL/CeQzjOyy6LQ== dependencies: "@turf/helpers" "^7.1.0" @@ -3073,7 +3476,7 @@ "@turf/envelope@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/envelope/-/envelope-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/envelope/-/envelope-7.1.0.tgz#0c50c62a643eab6329d971898d49c7ef1409cbc3" integrity sha512-WeLQse9wuxsxhzSqrJA6Ha7rLWnLKgdKY9cfxmJKHSpgqcJyNk60m7+T3UpI/nkGwpfbpeyB3EGC1EWPbxiDUg== dependencies: "@turf/bbox" "^7.1.0" @@ -3084,7 +3487,7 @@ "@turf/explode@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/explode/-/explode-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/explode/-/explode-7.1.0.tgz#b242878ddb6f66e7cd86d7c40eb7568670eddb52" integrity sha512-To+GUbU6HtcHZ8S0w/dw1EbdQIOCXALTr6Ug5/IFg8hIBMJelDpVr3Smwy8uqhDRFinY2eprBwQnDPcd10eCqA== dependencies: "@turf/helpers" "^7.1.0" @@ -3094,7 +3497,7 @@ "@turf/flatten@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/flatten/-/flatten-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/flatten/-/flatten-7.1.0.tgz#db1353e6dd9aafc414422a7ef028a37e0d6b1c50" integrity sha512-Kb23pqEarcLsdBqnQcK0qTrSMiWNTVb9tOFrNlZc66DIhDLAdpOKG4eqk00CMoUzWTixlnawDgJRqcStRrR4WA== dependencies: "@turf/helpers" "^7.1.0" @@ -3104,7 +3507,7 @@ "@turf/flip@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/flip/-/flip-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/flip/-/flip-7.1.0.tgz#11d40cae19c908d9add6a558431fd6d0c6ec7eab" integrity sha512-vac73W8WblzzNFanzWYLBzWDIcqc5xczOrtEO07RDEiKEI3Heo0471Jed3v9W506uuOX6/HAiCjXbRjTLjiLfw== dependencies: "@turf/clone" "^7.1.0" @@ -3115,7 +3518,7 @@ "@turf/geojson-rbush@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/geojson-rbush/-/geojson-rbush-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/geojson-rbush/-/geojson-rbush-7.1.0.tgz#7a7efcb64965b989ced1e7f5b849a0d46852c79f" integrity sha512-j1C7Ohlxa1z644bNOpgibcFGaDLgLXGLOzwF1tfQaP5y7E4PJQUXL0DWIgNb3Ke7gZC05LPHM25a5TRReUfFBQ== dependencies: "@turf/bbox" "^7.1.0" @@ -3126,7 +3529,7 @@ "@turf/great-circle@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/great-circle/-/great-circle-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/great-circle/-/great-circle-7.1.0.tgz#3a7276eb59b4dc5e6937ae9e26d9ee22b30f8b52" integrity sha512-92q5fqUp5oW+FYekUIrUVR5PZBWbOV6NHKHPIiNahiPvtkpZItbbjoO+tGn5+2i8mxZP9FGOthayJe4V0a1xkg== dependencies: "@turf/helpers" "^7.1.0" @@ -3135,7 +3538,7 @@ "@turf/helpers@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/helpers/-/helpers-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-7.1.0.tgz#eb734e291c9c205822acdd289fe20e91c3cb1641" integrity sha512-dTeILEUVeNbaEeoZUOhxH5auv7WWlOShbx7QSd4s0T4Z0/iz90z9yaVCtZOLbU89umKotwKaJQltBNO9CzVgaQ== dependencies: "@types/geojson" "^7946.0.10" @@ -3143,7 +3546,7 @@ "@turf/hex-grid@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/hex-grid/-/hex-grid-7.1.0.tgz#839e93f30257bb11b22ccc57eb5728b7494960a0" integrity sha512-I+Apx0smOPkMzaS5HHL44YOxSkSUvrz+wtSIETsDFWWLT2xKNkaaEcYU5MkgSoEfQsj082M7EkOIIpocXlA3kg== dependencies: "@turf/distance" "^7.1.0" @@ -3155,7 +3558,7 @@ "@turf/interpolate@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/interpolate/-/interpolate-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/interpolate/-/interpolate-7.1.0.tgz#64b2329eb955803fec8e22917c87e6470d2d8a24" integrity sha512-VWec1OW9gHZLPS3yYkUXAHKMGQuYO4aqh8WCltT7Ym4efrKqkSOE5T+mBqO68QgcL8nY4kiNa8lxwXd0SfXDSA== dependencies: "@turf/bbox" "^7.1.0" @@ -3173,7 +3576,7 @@ "@turf/intersect@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/intersect/-/intersect-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/intersect/-/intersect-7.1.0.tgz#8414c76b370de5b511f9768c5563e7e28fa3fdf0" integrity sha512-T0VhI6yhptX9EoMsuuBETyqV+edyq31SUC8bfuM6kdJ5WwJ0EvUfQoC+3bhMtCOn60lHawrUuGBgW+vCO8KGMg== dependencies: "@turf/helpers" "^7.1.0" @@ -3184,7 +3587,7 @@ "@turf/invariant@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/invariant/-/invariant-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/invariant/-/invariant-7.1.0.tgz#c90cffa093291316b597212396d68bf9e465cf2e" integrity sha512-OCLNqkItBYIP1nE9lJGuIUatWGtQ4rhBKAyTfFu0z8npVzGEYzvguEeof8/6LkKmTTEHW53tCjoEhSSzdRh08Q== dependencies: "@turf/helpers" "^7.1.0" @@ -3193,7 +3596,7 @@ "@turf/isobands@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/isobands/-/isobands-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/isobands/-/isobands-7.1.0.tgz#77765d8607e9e1e6808bb966503cb559485d7c5e" integrity sha512-iMLTOP/K5C05AttF4N1WeV+KrY4O5VWW/abO0N86XCWh1OeqmIUgqIBKEmhDzttAqC0UK2YrUfj0lI1Ez1fYZQ== dependencies: "@turf/area" "^7.1.0" @@ -3209,7 +3612,7 @@ "@turf/isolines@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/isolines/-/isolines-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/isolines/-/isolines-7.1.0.tgz#50d7f0a0aa1385b22754fd13eabc65d3099617ec" integrity sha512-V6QTHXBT5ZsL3s9ZVBJgHYtz3gCFKqNnQLysNE02LE0fVVqaSao3sFrcpghmdDxf0hBCDK8lZVvyRGO6o32LHQ== dependencies: "@turf/bbox" "^7.1.0" @@ -3222,14 +3625,14 @@ "@turf/jsts@^2.7.1": version "2.7.1" - resolved "https://registry.npmjs.org/@turf/jsts/-/jsts-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/@turf/jsts/-/jsts-2.7.1.tgz#c039569fcef704bef2bb7367c7ddada5008d9628" integrity sha512-+nwOKme/aUprsxnLSfr2LylV6eL6T1Tuln+4Hl92uwZ8FrmjDRCH5Bi1LJNVfWCiYgk8+5K+t2zDphWNTsIFDA== dependencies: jsts "2.7.1" "@turf/kinks@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/kinks/-/kinks-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/kinks/-/kinks-7.1.0.tgz#9511cbf2b51443acb0c38236ff24f19e18275de9" integrity sha512-KKLYUsyJPU17fODwA81mhHzFYGQYocdbk9NxDPCcdRHvxzM8t95lptkGx/2k/9rXBs1DK7NmyzI4m7zDO0DK7g== dependencies: "@turf/helpers" "^7.1.0" @@ -3238,7 +3641,7 @@ "@turf/length@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/length/-/length-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/length/-/length-7.1.0.tgz#bd04f024e1dfa8c4d767175ebbe6411bb8c52c82" integrity sha512-wUJj9WLKEudG1ngNao2ZwD+Dt6UkvWIbubuJ6lR6FndFDL3iezFhNGy0IXS+0xH9kXi2apiTnM9Vk5+i8BTEvQ== dependencies: "@turf/distance" "^7.1.0" @@ -3249,7 +3652,7 @@ "@turf/line-arc@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-arc/-/line-arc-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-arc/-/line-arc-7.1.0.tgz#108e76ae3b4106de88cd52eab38dee2c9c1294fa" integrity sha512-9/bM34PozTyJ5FXXPAzl/j0RpcTImgMFJZ0WhH0pZZEZRum6P0rJnENt2E2qI441zeozQ9H6X5DCiJogDmRUEw== dependencies: "@turf/circle" "^7.1.0" @@ -3260,7 +3663,7 @@ "@turf/line-chunk@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-chunk/-/line-chunk-7.1.0.tgz#a3fa68620bacbfa24f5cfb15228483ea11956b8f" integrity sha512-1lIUfqAQvCWAuUNC2ip8UYmM5kDltXOidLPW45Ee1OAIKYGBeFNtjwnxc0mQ40tnfTXclTYLDdOOP9LShspT9w== dependencies: "@turf/helpers" "^7.1.0" @@ -3271,7 +3674,7 @@ "@turf/line-intersect@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-intersect/-/line-intersect-7.1.0.tgz#60c46a62143e42d6663be93f893de1cfac584cf9" integrity sha512-JI3dvOsAoCqd4vUJ134FIzgcC42QpC/tBs+b4OJoxWmwDek3REv4qGaZY6wCg9X4hFSlCKFcnhMIQQZ/n720Qg== dependencies: "@turf/helpers" "^7.1.0" @@ -3281,7 +3684,7 @@ "@turf/line-offset@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-offset/-/line-offset-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-offset/-/line-offset-7.1.0.tgz#8d83e8d8f4559e3840a1ea3dda9837b61cb4a176" integrity sha512-pz6irzhiQlJurU7DoXada6k3ei7PzY+VpsE/Wotm0D2KEAnoxqum2WK0rqqrhKPHKn+xpUGsHN9W/6K+qtmaHg== dependencies: "@turf/helpers" "^7.1.0" @@ -3291,7 +3694,7 @@ "@turf/line-overlap@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-overlap/-/line-overlap-7.1.0.tgz#bf0ce579f0e2a64c8797dd2c88dfd613ce6f497c" integrity sha512-BdHuEoFAtqvVw3LkjCdivG035nfuwZuxji2ijst+mkmDnlv7uwSBudJqcDGjU6up2r8P1mXChS4im4xjUz+lwg== dependencies: "@turf/boolean-point-on-line" "^7.1.0" @@ -3307,7 +3710,7 @@ "@turf/line-segment@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-segment/-/line-segment-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-segment/-/line-segment-7.1.0.tgz#d47ec7d7c611daa59e7bbd6710ea8115ffdf1f86" integrity sha512-9rgIIH6ZzC3IiWxDQtKsq+j6eu8fRinMkJeusfI9HqOTm4vO02Ll4F/FigjOMOO/6X3TJ+Pqe3gS99TUaBINkw== dependencies: "@turf/helpers" "^7.1.0" @@ -3318,7 +3721,7 @@ "@turf/line-slice-along@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-slice-along/-/line-slice-along-7.1.0.tgz#ee928b62c0b7875616587d64da9cbbba0b4db7f5" integrity sha512-UwfnFORZnu4xdnuRXiQM3ODa8f9Q0FBjQF/XHNsPEI/xxmnwgQj3MZiULbAeHUbtU/7psTC7gEjfE3Lf0tcKQw== dependencies: "@turf/bearing" "^7.1.0" @@ -3329,7 +3732,7 @@ "@turf/line-slice@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-slice/-/line-slice-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-slice/-/line-slice-7.1.0.tgz#a9ac0956d761a01651d0e7f18d6bf5eaa001e130" integrity sha512-44xcjgMQxTa7tTAZlSD3t1cFjHi5SCfAqjg1ONv45EYKsQSonPaxD7LGzCbU5pR2RJjx3R7QRJx2G88hnGcXjQ== dependencies: "@turf/helpers" "^7.1.0" @@ -3339,7 +3742,7 @@ "@turf/line-split@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-split/-/line-split-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-split/-/line-split-7.1.0.tgz#f40e2540dd71cf93d9a86cdc85ec1ae240f4d95f" integrity sha512-QqUAmtlrnEu75cpLOmpEuiYU63BeVwpSKOBllBbu5gkP+7H/WBM/9fh7J0VgHNFHzqZCKiu8v4158k+CZr0QAg== dependencies: "@turf/bbox" "^7.1.0" @@ -3356,7 +3759,7 @@ "@turf/line-to-polygon@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/line-to-polygon/-/line-to-polygon-7.1.0.tgz#5029e4e7237e8a28497db4c1595f9f10cde1a4e7" integrity sha512-n/IWBRbo+l4XDTz4sfQsQm5bU9xex8KrthK397jQasd7a9PiOKGon9Z1t/lddTJhND6ajVyJ3hl+eZMtpQaghQ== dependencies: "@turf/bbox" "^7.1.0" @@ -3368,7 +3771,7 @@ "@turf/mask@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/mask/-/mask-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/mask/-/mask-7.1.0.tgz#e3f3260cfa60f48ee445bac563ca990f7a2217c0" integrity sha512-d+u3IIiRhe17TDfP/+UMn9qRlJYPJpK7sj6WorsssluGi0yIG/Z24uWpcLskWKSI8NNgkIbDrp+GIYkJi2t7SA== dependencies: "@turf/clone" "^7.1.0" @@ -3379,7 +3782,7 @@ "@turf/meta@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/meta/-/meta-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-7.1.0.tgz#b2af85afddd0ef08aeae8694a12370a4f06b6d13" integrity sha512-ZgGpWWiKz797Fe8lfRj7HKCkGR+nSJ/5aKXMyofCvLSc2PuYJs/qyyifDPWjASQQCzseJ7AlF2Pc/XQ/3XkkuA== dependencies: "@turf/helpers" "^7.1.0" @@ -3387,7 +3790,7 @@ "@turf/midpoint@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/midpoint/-/midpoint-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/midpoint/-/midpoint-7.1.0.tgz#0e3be2a63990951eadeae5ce2cf2f70ceb46e25c" integrity sha512-uiUU9TwRZOCeiTUn8+7oE6MJUvclfq+n6KQ5VCMTZXiRUJjPu7nDLpBle1t2WSv7/w7O0kSQ4FfKXh0gHnkJOw== dependencies: "@turf/bearing" "^7.1.0" @@ -3399,7 +3802,7 @@ "@turf/moran-index@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/moran-index/-/moran-index-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/moran-index/-/moran-index-7.1.0.tgz#baf115c1e2911e523d59b0103d1b43b29ec17300" integrity sha512-xsvAr3IRF/C6PlRMoN/ANrRx6c3QFUJgBCIVfI7re+Lkdprrzgw1HZA48ZjP4F91xbhgA1scnRgQdHFi2vO2SA== dependencies: "@turf/distance-weight" "^7.1.0" @@ -3410,7 +3813,7 @@ "@turf/nearest-neighbor-analysis@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/nearest-neighbor-analysis/-/nearest-neighbor-analysis-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/nearest-neighbor-analysis/-/nearest-neighbor-analysis-7.1.0.tgz#2673cfa6d60fe257864d2221b894d0d66dea65ac" integrity sha512-FAhT8/op3DuvqH0XFhv055JhYq/FC4aaIxEZ4hj8c7W6sYhUHAQgdRZ0tJ1RLe5/h+eXhCTbQ+DFfnfv3klu8g== dependencies: "@turf/area" "^7.1.0" @@ -3426,7 +3829,7 @@ "@turf/nearest-point-on-line@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/nearest-point-on-line/-/nearest-point-on-line-7.1.0.tgz#002dce6723ff6a01bff4ed6168ee36f62cc66f41" integrity sha512-aTjAOm7ab0tl5JoxGYRx/J/IbRL1DY1ZCIYQDMEQjK5gOllhclgeBC0wDXDkEZFGaVftjw0W2RtE2I0jX7RG4A== dependencies: "@turf/bearing" "^7.1.0" @@ -3441,7 +3844,7 @@ "@turf/nearest-point-to-line@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/nearest-point-to-line/-/nearest-point-to-line-7.1.0.tgz#b700c7ad91daf5fe99f7d56af754f4e4abfc21c1" integrity sha512-rY2F/iY4S6U8H0hIoOI25xMWYEiKywxeTvTvn5GP8KCu+2oemfZROWa7n2+hQDRwO2/uaegrGEpxO7zlFarvzg== dependencies: "@turf/helpers" "^7.1.0" @@ -3453,7 +3856,7 @@ "@turf/nearest-point@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/nearest-point/-/nearest-point-7.1.0.tgz#43fa0a27f047d14bf7897dad5b117f1c2caf9f13" integrity sha512-VyInmhqfVWp+jE7sCK95o46qc4tDjAgzbRfRjr+rTgfFS1Sndyy1PdwyNn6TjBFDxiM6e+mjMEeGPjb1smJlEg== dependencies: "@turf/clone" "^7.1.0" @@ -3465,7 +3868,7 @@ "@turf/planepoint@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/planepoint/-/planepoint-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/planepoint/-/planepoint-7.1.0.tgz#5d04c41f15e79410f50171740b5d561dc96d294a" integrity sha512-hFORBkCd7Q0kNUzLqksT4XglLgTQF9tCjG+dbnZ1VehpZu+w+vlHdoW/mY7XCX3Kj1ObiyzVmXffmVYgwXwF6Q== dependencies: "@turf/helpers" "^7.1.0" @@ -3475,7 +3878,7 @@ "@turf/point-grid@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/point-grid/-/point-grid-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/point-grid/-/point-grid-7.1.0.tgz#57f25c59d3d17b91dd4f7f13f5dafdddec6e7cf6" integrity sha512-ihuuUcWuCu4Z1+34UYCM5NGsU2DJaB4uE8cS3jDQoUqlc+8ii2ng8kcGEtTwVn0HdPsoKA7bgvSZcisJO0v6Ww== dependencies: "@turf/boolean-within" "^7.1.0" @@ -3487,7 +3890,7 @@ "@turf/point-on-feature@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/point-on-feature/-/point-on-feature-7.1.0.tgz#975a3031a240a137dad92c648dda26bf2d9b06a2" integrity sha512-lOO5J9I0diuGbN+r6jViEKRH3qfymsBvv25b7U0MuP8g/YC19ncUXZ86dmKfJx1++Rb485DS9h0nFvPmJpaOdg== dependencies: "@turf/boolean-point-in-polygon" "^7.1.0" @@ -3500,7 +3903,7 @@ "@turf/point-to-line-distance@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/point-to-line-distance/-/point-to-line-distance-7.1.0.tgz#52f076b91d4713c2c856da7cb0c44ca15dc70b3b" integrity sha512-Ps9eTOCaiNgxDaSNQux0wAcSLcrI0y0zYFaD9HnVm+yCMRliQXneFti2XXotS+gR7TpgnLRAAzyx4VzJMSN2tw== dependencies: "@turf/bearing" "^7.1.0" @@ -3516,7 +3919,7 @@ "@turf/points-within-polygon@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/points-within-polygon/-/points-within-polygon-7.1.0.tgz#bab97284a4805a5a0c2f156da8be553777c172d3" integrity sha512-SzqeD9Gcp11rEya+rCVMy6IPuYMrphNEkCiQ39W6ec9hsaqKlruqmtudKhhckMGVLVUUBCQAu5f55yjcDfVW2w== dependencies: "@turf/boolean-point-in-polygon" "^7.1.0" @@ -3527,7 +3930,7 @@ "@turf/polygon-smooth@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/polygon-smooth/-/polygon-smooth-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/polygon-smooth/-/polygon-smooth-7.1.0.tgz#c558be98acd06822872f853d83890fe3cdde8ebc" integrity sha512-mTlmg4XUP5rKgCP/73N91owkAXIc3t1ZKLuwsJGQM1/Op48T3rJmDwVR/WZIMnVlxl5tFbssWCCB3blj4ivx9g== dependencies: "@turf/helpers" "^7.1.0" @@ -3537,7 +3940,7 @@ "@turf/polygon-tangents@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/polygon-tangents/-/polygon-tangents-7.1.0.tgz#b7dce778658f62ed027f5e05a2748fc1d0705a25" integrity sha512-ffBgHXtkrpgkNs8E6s9sVLSKG4lPGH3WBk294FNKBt9NS+rbhNCv8yTuOMeP0bOm/WizaCq/SUtVryJpUSoI/g== dependencies: "@turf/bbox" "^7.1.0" @@ -3551,7 +3954,7 @@ "@turf/polygon-to-line@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/polygon-to-line/-/polygon-to-line-7.1.0.tgz#fcacd153ab481dec27d821889758452642f09288" integrity sha512-FBlfyBWNQZCTVGqlJH7LR2VXmvj8AydxrA8zegqek/5oPGtQDeUgIppKmvmuNClqbglhv59QtCUVaDK4bOuCTA== dependencies: "@turf/helpers" "^7.1.0" @@ -3561,7 +3964,7 @@ "@turf/polygonize@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/polygonize/-/polygonize-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/polygonize/-/polygonize-7.1.0.tgz#fa6a4cf7b64c887547ffe737fbcd89b2b412a56c" integrity sha512-FBjxnOzO29MbE7MWnMPHHYtOo93cQopT5pXhkuPyoKgcTUCntR1+iVFpl5YFbMkYup0j5Oexjo/pbY38lVSZGw== dependencies: "@turf/boolean-point-in-polygon" "^7.1.0" @@ -3574,7 +3977,7 @@ "@turf/projection@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/projection/-/projection-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/projection/-/projection-7.1.0.tgz#cfefa6cf2570ca15b2753b423c6e994604c34467" integrity sha512-3wHluMoOvXnTe7dfi0kcluTyLNG5MwGsSsK5OA98vkkLH6a1xvItn8e9GcesuT07oB2km/bgefxYEIvjQG5JCA== dependencies: "@turf/clone" "^7.1.0" @@ -3585,7 +3988,7 @@ "@turf/quadrat-analysis@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/quadrat-analysis/-/quadrat-analysis-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/quadrat-analysis/-/quadrat-analysis-7.1.0.tgz#f2260525403344e62c1fcd03bdce94bbedc1a983" integrity sha512-4O5h9PyWgpqYXja9O+kzr+qk5MUz0IkJqPtt5oWWX5s4jRcLNqiEUf+zi/GDBQkVV8jH3S5klT5CLrF1fxK3hQ== dependencies: "@turf/area" "^7.1.0" @@ -3602,7 +4005,7 @@ "@turf/random@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/random/-/random-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/random/-/random-7.1.0.tgz#8c3069466644c0c40675e6f33e5deaa2e536c640" integrity sha512-22mXv8ejDMUWkz8DSMMqdZb0s7a0ISJzXt6T9cHovfT//vsotzkVH+5PDxJQjvmigKMnpaUgobHmQss23tAwEQ== dependencies: "@turf/helpers" "^7.1.0" @@ -3611,7 +4014,7 @@ "@turf/rectangle-grid@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/rectangle-grid/-/rectangle-grid-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/rectangle-grid/-/rectangle-grid-7.1.0.tgz#824fefcc559d475cbbf58db49b26bf66fd2331bc" integrity sha512-4d2AuDj4LfMMJxNHbds5yX1oFR3mIVAB5D7mx6pFB0e+YkQW0mE2dUWhDTFGJZM+n45yqbNQ5hg19bmiXv94ug== dependencies: "@turf/boolean-intersects" "^7.1.0" @@ -3622,7 +4025,7 @@ "@turf/rewind@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/rewind/-/rewind-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/rewind/-/rewind-7.1.0.tgz#f07bae169466fce9dbc496d4e31db69910e12fb8" integrity sha512-zX0KDZpeiH89m1vYLTEJdDL6mFyoAsCxcG0P94mXO7/JXWf0AaxzA9MkNnA/d2QYX0G4ioCMjZ5cD6nXb8SXzw== dependencies: "@turf/boolean-clockwise" "^7.1.0" @@ -3635,7 +4038,7 @@ "@turf/rhumb-bearing@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/rhumb-bearing/-/rhumb-bearing-7.1.0.tgz#00e75d9a30d887c6b2867bcf48d677c779a43481" integrity sha512-ESZt70eOljHVnQMFKIdiu8LIHuQlpZgzh2nqSfV40BrYjsjI/sBKeK+sp2cBWk88nsSDlriPuMTNh4f50Jqpkw== dependencies: "@turf/helpers" "^7.1.0" @@ -3645,7 +4048,7 @@ "@turf/rhumb-destination@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/rhumb-destination/-/rhumb-destination-7.1.0.tgz#fb519ee65000bf8e04354cdf63d070826bd92536" integrity sha512-WA2TeO3qrv5ZrzNihtTLLYu8X4kd12WEC6JKElm99XhgLao1/4ao2SJUi43l88HqwbrnNiq4TueGQ6tYpXGU7A== dependencies: "@turf/helpers" "^7.1.0" @@ -3655,7 +4058,7 @@ "@turf/rhumb-distance@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/rhumb-distance/-/rhumb-distance-7.1.0.tgz#7a9fea71caf0fe99bf4fe847dde585700ef95232" integrity sha512-fR1V+yC4E1tnbdThomosiLcv0PQOwbfLSPM8rSWuxbMcJtffsncWxyJ0+N1F5juuHbcdaYhlduX8ri5I0ZCejw== dependencies: "@turf/helpers" "^7.1.0" @@ -3665,7 +4068,7 @@ "@turf/sample@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/sample/-/sample-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/sample/-/sample-7.1.0.tgz#c977f75487387d06a5a5de8bcb9a75ea40fc9dad" integrity sha512-9Iq/Ankr4+sgBoh4FpuVVvoW+AA10eej3FS89Zu79SFdCqUIdT7T42Nn3MlSVj4jMyA1oXyT2HIAlNWkwgLw6Q== dependencies: "@turf/helpers" "^7.1.0" @@ -3674,7 +4077,7 @@ "@turf/sector@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/sector/-/sector-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/sector/-/sector-7.1.0.tgz#bfb5a78460b48669a8bf6720605785b91d130737" integrity sha512-2FI2rg//eXpa/l+WJtFfvHaf1NJ7ie2MoJ+RH5dKANtrfoof1Ed+y9dXSyuhem2tp/Srq2GhrjaSofFN5/g5vA== dependencies: "@turf/circle" "^7.1.0" @@ -3687,7 +4090,7 @@ "@turf/shortest-path@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/shortest-path/-/shortest-path-7.1.0.tgz#27a123da9f9e65d0f28d71108c8805210073f4c3" integrity sha512-1UmFhS5zHNacLv5rszoFOXq02BGov1oJvjlDatXsSWAd+Z7tqxpDc8D+41edrXy0ZB0Yxsy6WPNagM6hG9PRaA== dependencies: "@turf/bbox" "^7.1.0" @@ -3704,7 +4107,7 @@ "@turf/simplify@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/simplify/-/simplify-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/simplify/-/simplify-7.1.0.tgz#4bf4d056d2e95337e9e1f2a54d48effb7d5976d8" integrity sha512-JypymaoiSiFzGHwEoUkK0OPW1KQSnH3hEsEW3UIRS+apzltJ4HdFovYjsfqQgGZJZ+NJ9+dv7h8pgGLYuqcBUQ== dependencies: "@turf/clean-coords" "^7.1.0" @@ -3716,7 +4119,7 @@ "@turf/square-grid@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/square-grid/-/square-grid-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/square-grid/-/square-grid-7.1.0.tgz#d78d9ba54b148e740e353a83e82c219b504cd53b" integrity sha512-JyhsALULVRlkh8htdTi9aXaXFSUv6wRNbeFbqyGJKKlA5eF+AYmyWdI/BlFGQN27xtbtMPeAuLmj+8jaB2omGw== dependencies: "@turf/helpers" "^7.1.0" @@ -3726,7 +4129,7 @@ "@turf/square@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/square/-/square-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/square/-/square-7.1.0.tgz#1f63445d2774469f0072ddf8a93584b61135a8eb" integrity sha512-ANuA+WXZheGTLW6Veq0i+/B2S4KMhEHAixDv9gQEb9e6FTyqTJVwrqP4CHI3OzA3DZ/ytFf+NTKVofetO/BBQg== dependencies: "@turf/distance" "^7.1.0" @@ -3736,7 +4139,7 @@ "@turf/standard-deviational-ellipse@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-7.1.0.tgz#a86dfa3bae0b634c8c7e57de5a321a5dd6453baf" integrity sha512-JqvQFH/witHh+3XgPC1Qk4+3G8w8WQta2NTJjnGinOgFulH+7RD4DcxCT+XXtCHoeq8IvL9VPJRX3ciaW5nSCg== dependencies: "@turf/center-mean" "^7.1.0" @@ -3750,7 +4153,7 @@ "@turf/tag@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/tag/-/tag-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/tag/-/tag-7.1.0.tgz#92268303db4b844ed95f563e9cf83c3706372ed9" integrity sha512-cD8TC++DnNmdI1B/apTf3nj2zRNY6SoLRliB8K76OB+70Kev8tOf4ZVgAqOd0u+Hpdg/T6l7dO7fyJ6UouE7jA== dependencies: "@turf/boolean-point-in-polygon" "^7.1.0" @@ -3762,7 +4165,7 @@ "@turf/tesselate@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/tesselate/-/tesselate-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/tesselate/-/tesselate-7.1.0.tgz#567eeca3c9f5b3fdbfa09fb616a2f2079699dffc" integrity sha512-E/Z94Mx6kUjvQVbEcSuM9MbEo2dkOczRe4ZzjhFlLgJh1dCkfRgwYLH49mb2CcfG/me1arxoCgmtG+qgm7LrCg== dependencies: "@turf/helpers" "^7.1.0" @@ -3772,7 +4175,7 @@ "@turf/tin@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/tin/-/tin-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/tin/-/tin-7.1.0.tgz#2f71da7ef63286833803a4cf0ed94dfdcc69e688" integrity sha512-h8Bdm0IYN6OpKHM8lBRWGxkJnZcxL0KYecf8U6pa6DCEYsEXuEExMTvYSD2OmqIsL5ml8P6RjwgyI+dZeE0O9A== dependencies: "@turf/helpers" "^7.1.0" @@ -3781,7 +4184,7 @@ "@turf/transform-rotate@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/transform-rotate/-/transform-rotate-7.1.0.tgz#ef810da4d6e199c97ad90466e10edd8b57968bc8" integrity sha512-Vp7VBZ6DqaPV8mkwSycksBFRLqSj3y16zg+uEPSCsXUjbFtw9DOLcyH2F5vMpnC2bOpS9NOB4hebhJRwBwAPWQ== dependencies: "@turf/centroid" "^7.1.0" @@ -3797,7 +4200,7 @@ "@turf/transform-scale@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/transform-scale/-/transform-scale-7.1.0.tgz#0bf1844aaec36c9a19ef19d4799aa3441f5c5f7e" integrity sha512-m5fLnh3JqrWSv0sAC8Aieet/fr5IZND8BFaE9LakMidtNaJqOIPOyVmUoklcrGn6eK6MX+66rRPn+5a1pahlLQ== dependencies: "@turf/bbox" "^7.1.0" @@ -3815,7 +4218,7 @@ "@turf/transform-translate@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/transform-translate/-/transform-translate-7.1.0.tgz#265489b0a32303c07f735fb35eb0840116f17b32" integrity sha512-XA6Oh7VqUDrieY9m9/OF4XpBTd8qlfVGi3ObywojCqtHaHKLK3aXwTBZ276i0QKmZqOQA+2jFa9NhgF/TgBDrw== dependencies: "@turf/clone" "^7.1.0" @@ -3828,7 +4231,7 @@ "@turf/triangle-grid@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/triangle-grid/-/triangle-grid-7.1.0.tgz#d37648a748b65d2dfaa8169d6fd51a6b30362967" integrity sha512-hrPyRAuX5PKu7txmc/11VPKrlJDR+JGzd+eijupKTspNLR4n2sqZUx8UXqSxZ/1nq06ScTyjIfGQJVzlRS8BTg== dependencies: "@turf/distance" "^7.1.0" @@ -3839,7 +4242,7 @@ "@turf/truncate@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/truncate/-/truncate-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/truncate/-/truncate-7.1.0.tgz#12331be95d3c6aca3588c73c51e252c1e9afc363" integrity sha512-rrF3AML9PGZw2i5wmt53ESI+Ln9cZyCXgJ7QrEvkT8NbE4OFgmw6p8/1xT8+VEWFSpD4gHz+hmM+5FaFxXvtNg== dependencies: "@turf/helpers" "^7.1.0" @@ -3849,7 +4252,7 @@ "@turf/turf@^7.0.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/turf/-/turf-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/turf/-/turf-7.1.0.tgz#464dcaaa5a3e85252f1dc75481a61e1290c5d234" integrity sha512-7NA6tAjbu9oIvIfpRO5AdPrZbFTlUFU02HVA7sLJM9jFeNIZovW09QuDo23uoS2z5l94SXV1GgKKxN5wo7prCw== dependencies: "@turf/along" "^7.1.0" @@ -3969,7 +4372,7 @@ "@turf/union@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/union/-/union-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/union/-/union-7.1.0.tgz#7b8f0cc7fd24c1269224eaa5f76946458bbb9c01" integrity sha512-7VI8jONdBg9qmbfNlLQycPr93l5aU9HGMgWI9M6pb4ERuU2+p8KgffCgs2NyMtP2HxPrKSybzj31g7bnbEKofQ== dependencies: "@turf/helpers" "^7.1.0" @@ -3980,7 +4383,7 @@ "@turf/unkink-polygon@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/unkink-polygon/-/unkink-polygon-7.1.0.tgz#e583e89fb84ad276332f278769dc5d3475107f2f" integrity sha512-pqkirni2aLpRA1ELFIuJz+mkjYyJQX8Ar6BflSu1b0ajY/CTrcDxbIv1x8UfvbybLzdJc4Gxzg5mo4cEtSwtaQ== dependencies: "@turf/area" "^7.1.0" @@ -3993,7 +4396,7 @@ "@turf/voronoi@^7.1.0": version "7.1.0" - resolved "https://registry.npmjs.org/@turf/voronoi/-/voronoi-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/@turf/voronoi/-/voronoi-7.1.0.tgz#bf241f6e8904c778651153658919d2cfe6206ca9" integrity sha512-xUvzPDG6GaqEekgxd+pjeMKJXOYJ3eFIqUHbTe/ISKzzv3f2cFGiR2VH7ZGXri8d4ozzCQbUQ27ilHPPLf5+xw== dependencies: "@turf/clone" "^7.1.0" @@ -4006,69 +4409,69 @@ "@types/d3-voronoi@^1.1.12": version "1.1.12" - resolved "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.12.tgz" + resolved "https://registry.yarnpkg.com/@types/d3-voronoi/-/d3-voronoi-1.1.12.tgz#99d1bbf5438ac222727493bef2283da62ffc0aa3" integrity sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw== "@types/geojson@^7946.0.10", "@types/geojson@^7946.0.14": version "7946.0.14" - resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== "@types/lodash.debounce@^4.0.7": version "4.0.9" - resolved "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz" + resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz#0f5f21c507bce7521b5e30e7a24440975ac860a5" integrity sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ== dependencies: "@types/lodash" "*" "@types/lodash@*": - version "4.17.7" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz" - integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" + integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== "@types/node@*", "@types/node@>=18": - version "22.3.0" - resolved "https://registry.npmjs.org/@types/node/-/node-22.3.0.tgz" - integrity sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g== + version "22.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365" + integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== dependencies: - undici-types "~6.18.2" + undici-types "~6.19.8" "@types/parse-json@^4.0.0": version "4.0.2" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/prop-types@*": version "15.7.13" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== "@types/react-transition-group@^4.4.0": version "4.4.11" - resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5" integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA== dependencies: "@types/react" "*" "@types/react@*": - version "18.3.11" - resolved "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz" - integrity sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ== + version "18.3.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" + integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== dependencies: "@types/prop-types" "*" csstype "^3.0.2" "@types/readable-stream@^4.0.0": - version "4.0.15" - resolved "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.15.tgz" - integrity sha512-oAZ3kw+kJFkEqyh7xORZOku1YAKvsFTogRY8kVl4vHpEKiDkfnSA/My8haRE7fvmix5Zyy+1pwzOi7yycGLBJw== + version "4.0.18" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.18.tgz#5d8d15d26c776500ce573cae580787d149823bfc" + integrity sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA== dependencies: "@types/node" "*" safe-buffer "~5.1.1" abab@^2.0.5, abab@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== abbrev@1: @@ -4078,14 +4481,14 @@ abbrev@1: abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" acorn-globals@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: acorn "^7.1.1" @@ -4093,90 +4496,83 @@ acorn-globals@^6.0.0: acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^7.1.1: version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.5.0: - version "8.12.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz" - integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== -ag-charts-types@10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/ag-charts-types/-/ag-charts-types-10.1.0.tgz" - integrity sha512-pk9ft8hbgTXJ/thI/SEUR1BoauNplYExpcHh7tMOqVikoDsta1O15TB1ZL4XWnl4TPIzROBmONKsz7d8a2HBuQ== +ag-charts-types@10.3.3: + version "10.3.3" + resolved "https://registry.yarnpkg.com/ag-charts-types/-/ag-charts-types-10.3.3.tgz#042c747f1247af827c29ccfdd0890d7b9adcaae9" + integrity sha512-8rmyquaTkwfP4Lzei/W/cbkq9wwEl8+grIo3z97mtxrMIXh9sHJK1oJipd/u08MmBZrca5Jjtn5F1+UNPu/4fQ== -ag-grid-community@32.1.0: - version "32.1.0" - resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-32.1.0.tgz" - integrity sha512-RVvkjRH61nuCXwIqTKQPqNbKR+8cGBKw7S1qmmMXsy0pCBAJaQn4kL3v31hKHxDtV4bPscBXLFKGnKzHuss0GQ== +ag-grid-community@32.3.3: + version "32.3.3" + resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-32.3.3.tgz#d0c2c15b342b49a3bb5dddfdad9d0332b08f1505" + integrity sha512-KhSJ3B6mwRFA4cLjNjOZkDndJBh8o83794ZHl4Q7xP9MJf43oCN9qoZ8pyBanohgpVfLcP0scYYCr9xIlzjdiA== dependencies: - ag-charts-types "10.1.0" + ag-charts-types "10.3.3" ag-grid-react@^32.0.2: - version "32.1.0" - resolved "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-32.1.0.tgz" - integrity sha512-GDbtvU3aicSajWXWxvQio5ZaPqJDx2jzgRBKQf1RF1IVzL+XATDmLFNuMND0+wJ/VW/xUjBFjiq9W1fjXg/DCA== + version "32.3.3" + resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-32.3.3.tgz#320be8fcef248fcd9d07b442263f00b2b6a815a3" + integrity sha512-0u6oYoSHf7P2eRgK8FtnXix+bW8hcbiGXhYhg+UpYJHNlKug+spNqjGSzX43f70AZ2QpOBLsL7Bz2FPsadv3HA== dependencies: - ag-grid-community "32.1.0" + ag-grid-community "32.3.3" prop-types "^15.8.1" agent-base@6: version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.1" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== dependencies: debug "^4.3.4" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -4197,35 +4593,26 @@ are-we-there-yet@^2.0.0: arg@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@^1.6.2: +axios@^1.6.2, axios@^1.7.3: version "1.7.7" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz" - integrity sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - babel-plugin-macros@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" @@ -4234,23 +4621,23 @@ babel-plugin-macros@^3.1.0: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bl@^6.0.11: - version "6.0.14" - resolved "https://registry.npmjs.org/bl/-/bl-6.0.14.tgz" - integrity sha512-TJfbvGdL7KFGxTsEbsED7avqpFdY56q9IW0/aiytyheJzxST/+Io6cx/4Qx0K2/u0BPRDs65mjaQzYvMZeNocQ== + version "6.0.16" + resolved "https://registry.yarnpkg.com/bl/-/bl-6.0.16.tgz#29b190f1a754e2d168de3dc8c74ed8d12bf78e6e" + integrity sha512-V/kz+z2Mx5/6qDfRCilmrukUXcXuCoXKg3/3hDvzKKoSUx8CJKudfIoT29XZc3UE9xBvxs5qictiHdprwtteEg== dependencies: "@types/readable-stream" "^4.0.0" buffer "^6.0.3" @@ -4259,7 +4646,7 @@ bl@^6.0.11: body-scroll-lock@^3.1.5: version "3.1.5" - resolved "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz" + resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz#c1392d9217ed2c3e237fee1e910f6cdd80b7aaec" integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== brace-expansion@^1.1.7: @@ -4272,31 +4659,31 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3, braces@~3.0.2: version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" browser-process-hrtime@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== buffer-equal-constant-time@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== buffer@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -4304,25 +4691,25 @@ buffer@^6.0.3: busboy@1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001579: - version "1.0.30001634" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001634.tgz" - integrity sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA== + version "1.0.30001680" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz#5380ede637a33b9f9f1fc6045ea99bd142f3da5e" + integrity sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA== canvas@^2.8.0: version "2.11.2" @@ -4333,15 +4720,6 @@ canvas@^2.8.0: nan "^2.17.0" simple-get "^3.0.3" -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chart.js@^4.4.6: version "4.4.6" resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.4.6.tgz#da39b84ca752298270d4c0519675c7659936abec" @@ -4349,9 +4727,9 @@ chart.js@^4.4.6: dependencies: "@kurkle/color" "^0.3.0" -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: +chokidar@^3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -4364,6 +4742,13 @@ chart.js@^4.4.6: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -4371,51 +4756,39 @@ chownr@^2.0.0: classnames@^2.3.1: version "2.5.1" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== client-only@0.0.1, client-only@^0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== clsx@^1.1.1, clsx@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -clsx@^2.0.0, clsx@^2.1.0: +clsx@^2.0.0, clsx@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.9.0: version "1.9.1" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -4428,12 +4801,12 @@ color-support@^1.1.2: color2k@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/color2k/-/color2k-2.0.3.tgz#a771244f6b6285541c82aa65ff0a0c624046e533" integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== color@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: color-convert "^2.0.1" @@ -4441,34 +4814,34 @@ color@^4.2.3: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@2: version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^11.0.0: version "11.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== commander@^4.0.0: version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -complex.js@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz" - integrity sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg== +complex.js@^2.2.5: + version "2.4.2" + resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.4.2.tgz#76f260a9e7e232d8ad26348484a9b128c13fcc9a" + integrity sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g== compute-scroll-into-view@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== concat-map@0.0.1: @@ -4478,7 +4851,7 @@ concat-map@0.0.1: concaveman@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/concaveman/-/concaveman-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/concaveman/-/concaveman-1.2.1.tgz#47d20b4521125c15fabf453653c2696d9ee41e0b" integrity sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw== dependencies: point-in-polygon "^1.1.0" @@ -4493,24 +4866,24 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: convert-source-map@^1.5.0: version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convertapi@^1.14.0: - version "1.14.0" - resolved "https://registry.npmjs.org/convertapi/-/convertapi-1.14.0.tgz" - integrity sha512-9Rzkn+Mjs4jVLQ5pRUC8KpIjnT9WFUkuJZ5yjCJaDJsDM7Na2lWPKtDJdkfKcYCNDuo1h+OYZedne5SLp60EkQ== + version "1.15.0" + resolved "https://registry.yarnpkg.com/convertapi/-/convertapi-1.15.0.tgz#98029ed776601663a0a09a3086424cacb7545e0b" + integrity sha512-wu1pJ27SuIc/mNlbjs8lP1hAsEN16AmKzMZNo9Qx/Z3CrH1ozGQYF2jGXaceXWSRNvKFoCuF0m5ek+vz8Nswrw== dependencies: axios "^1.6.2" -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== cosmiconfig@^7.0.0: version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -4520,9 +4893,9 @@ cosmiconfig@^7.0.0: yaml "^1.10.0" cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -4530,84 +4903,77 @@ cross-spawn@^7.0.0: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssom@^0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" csstype@^3.0.2: version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== d3-array@1: version "1.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== d3-geo@1.7.1: version "1.7.1" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.7.1.tgz#44bbc7a218b1fd859f3d8fd7c443ca836569ce99" integrity sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw== dependencies: d3-array "1" d3-voronoi@1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c" integrity sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw== data-urls@^3.0.1: version "3.0.2" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: abab "^2.0.6" whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" -date-fns@^3.3.1: +date-fns@^3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== dayjs@^1.11.13: version "1.11.13" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@4, debug@^4.3.3, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - -debug@^4.3.1: +debug@4, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" decimal.js@^10.3.1, decimal.js@^10.4.3: version "10.4.3" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decompress-response@^4.2.0: @@ -4619,17 +4985,17 @@ decompress-response@^4.2.0: deepmerge@4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: @@ -4637,6 +5003,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-libc@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" @@ -4644,22 +5015,22 @@ detect-libc@^2.0.0: detect-node-es@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== dlv@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== dom-helpers@^5.0.1: version "5.2.1" - resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -4667,63 +5038,58 @@ dom-helpers@^5.0.1: domexception@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: webidl-conversions "^7.0.0" earcut@^2.2.4: version "2.2.4" - resolved "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ecdsa-sig-formatter@1.0.11: version "1.0.11" - resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== dependencies: safe-buffer "^5.0.1" emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" escape-latex@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" @@ -4734,45 +5100,45 @@ escodegen@^2.0.0: esprima@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== events@^3.0.0, events@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== fabric@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/fabric/-/fabric-5.3.0.tgz" - integrity sha512-AVayKuzWoXM5cTn7iD3yNWBlfEa8r1tHaOe2g8NsZrmWKAHjryTxT/j6f9ncRfOWOF0I1Ci1AId3y78cC+GExQ== + version "5.4.2" + resolved "https://registry.yarnpkg.com/fabric/-/fabric-5.4.2.tgz#7bc1d33911799a4a4d1a20d512878770591b86c9" + integrity sha512-gTsmUdgHgACGrVd/ixUTa7YHqsMRh+zbBpZAjgZNfQHwGt45jXW2k6ntSQbiY9/f/7ZHx9trnTbj4lpXgYUuvg== optionalDependencies: canvas "^2.8.0" jsdom "^19.0.0" fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.3.0: +fast-glob@^3.3.2: version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -4783,45 +5149,45 @@ fast-glob@^3.3.0: fastq@^1.6.0: version "1.17.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-root@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== flat@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -4829,13 +5195,13 @@ form-data@^4.0.0: fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== framer-motion@^11.2.13: - version "11.3.21" - resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-11.3.21.tgz" - integrity sha512-D+hfIsvzV8eL/iycld4K+tKlg2Q2LdwnrcBEohtGw3cG1AIuNYATbT5RUqIM1ndsAk+EfGhoSGf0UaiFodc5Tw== + version "11.11.17" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.11.17.tgz#fff0fd26b9b5c16dc0cc7e450f9af7db13fb35d0" + integrity sha512-O8QzvoKiuzI5HSAHbcYuL6xU+ZLXbrH7C8Akaato4JzQbX2ULNeniqC2Vo5eiCtFktX9XsJ+7nUhxcl2E2IjpA== dependencies: tslib "^2.4.0" @@ -4853,17 +5219,17 @@ fs.realpath@^1.0.0: fs@^0.0.1-security: version "0.0.1-security" - resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" + resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w== fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gauge@^3.0.0: @@ -4883,46 +5249,47 @@ gauge@^3.0.0: geojson-equality-ts@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/geojson-equality-ts/-/geojson-equality-ts-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/geojson-equality-ts/-/geojson-equality-ts-1.0.2.tgz#2aed0b9aca1fedb17212fecbfc42f73020410480" integrity sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ== dependencies: "@types/geojson" "^7946.0.14" geojson-polygon-self-intersections@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/geojson-polygon-self-intersections/-/geojson-polygon-self-intersections-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/geojson-polygon-self-intersections/-/geojson-polygon-self-intersections-1.2.1.tgz#7018edabe58e9262f20821a7334953708c78bbb7" integrity sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA== dependencies: rbush "^2.0.1" get-nonce@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@^10.3.10: - version "10.4.1" - resolved "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz" - integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" minimatch "^9.0.4" minipass "^7.1.2" + package-json-from-dist "^1.0.0" path-scurry "^1.11.1" glob@^7.1.3: @@ -4939,53 +5306,48 @@ glob@^7.1.3: globals@^11.1.0: version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== graceful-fs@^4.2.11: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== hamt_plus@1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/hamt_plus/-/hamt_plus-1.0.2.tgz#e21c252968c7e33b20f6a1b094cd85787a265601" integrity sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -hasown@^2.0.0: +hasown@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hoist-non-react-statics@^3.3.1: version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" html-encoding-sniffer@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: whatwg-encoding "^2.0.0" http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: "@tootallnate/once" "2" @@ -4994,7 +5356,7 @@ http-proxy-agent@^5.0.0: http-proxy-agent@^7.0.0: version "7.0.2" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" @@ -5002,7 +5364,7 @@ http-proxy-agent@^7.0.0: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -5010,7 +5372,7 @@ https-proxy-agent@^5.0.0: https-proxy-agent@^7.0.0: version "7.0.5" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== dependencies: agent-base "^7.0.2" @@ -5018,24 +5380,24 @@ https-proxy-agent@^7.0.0: iconv-lite@0.6.3, iconv-lite@^0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -immutable@^4.0.0: - version "4.3.7" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz" - integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== +immutable@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.2.tgz#bb8a987349a73efbe6b3b292a9cbaf1b530d296b" + integrity sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -5056,112 +5418,112 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4: international-types@^0.8.1: version "0.8.1" - resolved "https://registry.npmjs.org/international-types/-/international-types-0.8.1.tgz" + resolved "https://registry.yarnpkg.com/international-types/-/international-types-0.8.1.tgz#c0e593d9911c1a23f64bbd6eb1abb2941fe2353f" integrity sha512-tajBCAHo4I0LIFlmQ9ZWfjMWVyRffzuvfbXCd6ssFt5u1Zw15DN0UBpVTItXdNa1ls+cpQt3Yw8+TxsfGF8JcA== intl-messageformat@^10.1.0: - version "10.5.14" - resolved "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz" - integrity sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w== + version "10.7.7" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.7.tgz#42085e1664729d02240a03346e31a2540b1112a0" + integrity sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA== dependencies: - "@formatjs/ecma402-abstract" "2.0.0" - "@formatjs/fast-memoize" "2.2.0" - "@formatjs/icu-messageformat-parser" "2.7.8" - tslib "^2.4.0" + "@formatjs/ecma402-abstract" "2.2.4" + "@formatjs/fast-memoize" "2.2.3" + "@formatjs/icu-messageformat-parser" "2.9.4" + tslib "2" invariant@^2.2.4: version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" iron-session@^8.0.2: - version "8.0.2" - resolved "https://registry.npmjs.org/iron-session/-/iron-session-8.0.2.tgz" - integrity sha512-p4Yf1moQr6gnCcXu5vCaxVKRKDmR9PZcQDfp7ZOgbsSHUsgaNti6OgDB2BdgxC2aS6V/6Hu4O0wYlj92sbdIJg== + version "8.0.4" + resolved "https://registry.yarnpkg.com/iron-session/-/iron-session-8.0.4.tgz#03ae73f9bb25b45c8a8506eccb7097837c3d9fed" + integrity sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA== dependencies: - cookie "0.6.0" - iron-webcrypto "1.2.1" - uncrypto "0.1.3" + cookie "^0.7.2" + iron-webcrypto "^1.2.1" + uncrypto "^0.1.3" -iron-webcrypto@1.2.1: +iron-webcrypto@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f" integrity sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -5169,32 +5531,32 @@ jackspeak@^3.1.2: javascript-natural-sort@^0.7.1: version "0.7.1" - resolved "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== -jiti@^1.21.0: +jiti@^1.21.6: version "1.21.6" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== js-cookie@^3.0.5: version "3.0.5" - resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== js-md4@^0.3.2: version "0.3.2" - resolved "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz" + resolved "https://registry.yarnpkg.com/js-md4/-/js-md4-0.3.2.tgz#cd3b3dc045b0c404556c81ddb5756c23e59d7cf5" integrity sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== jsdom@^19.0.0: version "19.0.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== dependencies: abab "^2.0.5" @@ -5227,17 +5589,17 @@ jsdom@^19.0.0: jsesc@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== jsonwebtoken@^9.0.0: version "9.0.2" - resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: jws "^3.2.2" @@ -5253,12 +5615,12 @@ jsonwebtoken@^9.0.0: jsts@2.7.1: version "2.7.1" - resolved "https://registry.npmjs.org/jsts/-/jsts-2.7.1.tgz" + resolved "https://registry.yarnpkg.com/jsts/-/jsts-2.7.1.tgz#a921c0cc9eefeef588bd53e952e0a7782d812d52" integrity sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg== jwa@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== dependencies: buffer-equal-constant-time "1.0.1" @@ -5267,7 +5629,7 @@ jwa@^1.4.1: jwa@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== dependencies: buffer-equal-constant-time "1.0.1" @@ -5276,7 +5638,7 @@ jwa@^2.0.0: jws@^3.2.2: version "3.2.2" - resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== dependencies: jwa "^1.4.1" @@ -5284,7 +5646,7 @@ jws@^3.2.2: jws@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== dependencies: jwa "^2.0.0" @@ -5292,95 +5654,95 @@ jws@^4.0.0: lilconfig@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lilconfig@^3.0.0: version "3.1.2" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.foreach@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ== lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.includes@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== lodash.isboolean@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== lodash.isinteger@^4.0.4: version "4.0.4" - resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== lodash.isnumber@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.isstring@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== lodash.kebabcase@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== lodash.mapkeys@^4.6.0: version "4.6.0" - resolved "https://registry.npmjs.org/lodash.mapkeys/-/lodash.mapkeys-4.6.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.mapkeys/-/lodash.mapkeys-4.6.0.tgz#df2cfa231d7c57c7a8ad003abdad5d73d3ea5195" integrity sha512-0Al+hxpYvONWtg+ZqHpa/GaVzxuN3V7Xeo2p+bY06EaK/n+Y9R7nBePPN2o1LxmL0TWQSwP8LYZ008/hc9JzhA== lodash.omit@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== lodash.once@^4.0.0: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== make-dir@^3.1.0: version "3.1.0" @@ -5391,16 +5753,16 @@ make-dir@^3.1.0: marchingsquares@^1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/marchingsquares/-/marchingsquares-1.3.3.tgz" + resolved "https://registry.yarnpkg.com/marchingsquares/-/marchingsquares-1.3.3.tgz#67404af4b883ade3a589221f4e9dd010a1f706fc" integrity sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg== mathjs@^13.0.2: - version "13.0.3" - resolved "https://registry.npmjs.org/mathjs/-/mathjs-13.0.3.tgz" - integrity sha512-GpP9OW6swA5POZXvgpc/1FYkAr8lKgV04QHS1tIU60klFfplVCYaNzn6qy0vSp0hAQQN7shcx9CeB507dlLujA== + version "13.2.2" + resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-13.2.2.tgz#22b6e2a86217325e79baf052266f37aaf2a10a4d" + integrity sha512-tBNMmwNsLMjD7xGHSF9IEuuzNVG8xPDgshDBY1eQ5ZS1HQr5O+bY8eG2peZYSkIsw79y2QcPkGMcQL5ZqtLu5A== dependencies: - "@babel/runtime" "^7.24.8" - complex.js "^2.1.1" + "@babel/runtime" "^7.25.7" + complex.js "^2.2.5" decimal.js "^10.4.3" escape-latex "^1.2.0" fraction.js "^4.3.7" @@ -5411,30 +5773,30 @@ mathjs@^13.0.2: memoize-one@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== merge2@^1.3.0: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.7" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== +micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" @@ -5452,9 +5814,9 @@ minimatch@^3.1.1: brace-expansion "^1.1.7" minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -5472,7 +5834,7 @@ minipass@^5.0.0: "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^2.1.1: @@ -5488,19 +5850,14 @@ mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mssql@^11.0.1: version "11.0.1" - resolved "https://registry.npmjs.org/mssql/-/mssql-11.0.1.tgz" + resolved "https://registry.yarnpkg.com/mssql/-/mssql-11.0.1.tgz#a32ab7763bfbb3f5d970e47563df3911fc04e21d" integrity sha512-KlGNsugoT90enKlR8/G36H0kTxPthDhmtNUCwEHvgRza5Cjpjoj+P2X6eMpFUDN7pFrJZsKadL4x990G8RBE1w== dependencies: "@tediousjs/connection-string" "^0.5.0" @@ -5512,7 +5869,7 @@ mssql@^11.0.1: mz@^2.7.0: version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -5526,18 +5883,18 @@ nan@^2.17.0: nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== native-duplexpair@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/native-duplexpair/-/native-duplexpair-1.0.0.tgz#7899078e64bf3c8a3d732601b3d40ff05db58fa0" integrity sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA== next-international@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/next-international/-/next-international-1.2.4.tgz" - integrity sha512-JQvp+h2iSgA/t8hu5S/Lwow1ZErJutQRdpnplxjv4VTlCiND8T95fYih8BjkHcVhQbtM+Wu9Mb1CM32wD9hlWQ== + version "1.3.1" + resolved "https://registry.yarnpkg.com/next-international/-/next-international-1.3.1.tgz#10db89c586286de0d1be673910d1f9809da4cbbe" + integrity sha512-ydU9jQe+4MohMWltbZae/yuWeKhmp0QKQqJNNi8WCCMwrly03qfMAHw/tWbT2qgAlG++CxF5jMXmGQZgOHeVOw== dependencies: client-only "^0.0.1" international-types "^0.8.1" @@ -5545,7 +5902,7 @@ next-international@^1.2.4: next@14.2.3: version "14.2.3" - resolved "https://registry.npmjs.org/next/-/next-14.2.3.tgz" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== dependencies: "@next/env" "14.2.3" @@ -5566,6 +5923,11 @@ next@14.2.3: "@next/swc-win32-ia32-msvc" "14.2.3" "@next/swc-win32-x64-msvc" "14.2.3" +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -5582,7 +5944,7 @@ nopt@^5.0.0: normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npmlog@^5.0.1: @@ -5596,18 +5958,18 @@ npmlog@^5.0.1: set-blocking "^2.0.0" nwsapi@^2.2.0: - version "2.2.10" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz" - integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== + version "2.2.13" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.13.tgz#e56b4e98960e7a040e5474536587e599c4ff4655" + integrity sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ== object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== once@^1.3.0, once@^1.3.1: @@ -5619,23 +5981,28 @@ once@^1.3.0, once@^1.3.1: open@^8.0.0: version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" is-wsl "^2.2.0" +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -5645,7 +6012,7 @@ parse-json@^5.0.0: parse5@6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== path-is-absolute@^1.0.0: @@ -5655,17 +6022,17 @@ path-is-absolute@^1.0.0: path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.11.1: version "1.11.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -5673,42 +6040,42 @@ path-scurry@^1.11.1: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1: version "4.0.6" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== point-in-polygon-hao@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/point-in-polygon-hao/-/point-in-polygon-hao-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/point-in-polygon-hao/-/point-in-polygon-hao-1.1.0.tgz#37f5f4fbe14e89fa8a3bb7f67c9158079d2ede7c" integrity sha512-3hTIM2j/v9Lio+wOyur3kckD4NxruZhpowUbEgmyikW+a2Kppjtu1eN+AhnMQtoHW46zld88JiYWv6fxpsDrTQ== point-in-polygon@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/point-in-polygon/-/point-in-polygon-1.1.0.tgz#b0af2616c01bdee341cbf2894df643387ca03357" integrity sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw== polygon-clipping@^0.15.3: version "0.15.7" - resolved "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.7.tgz" + resolved "https://registry.yarnpkg.com/polygon-clipping/-/polygon-clipping-0.15.7.tgz#3823ca1e372566f350795ce9dd9a7b19e97bdaad" integrity sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA== dependencies: robust-predicates "^3.0.2" @@ -5716,7 +6083,7 @@ polygon-clipping@^0.15.3: postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -5725,70 +6092,70 @@ postcss-import@^15.1.0: postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" -postcss-load-config@^4.0.1: +postcss-load-config@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: lilconfig "^3.0.0" yaml "^2.3.4" -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== +postcss-nested@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: - postcss-selector-parser "^6.0.11" + postcss-selector-parser "^6.1.1" -postcss-selector-parser@^6.0.11: - version "6.1.0" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz" - integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== +postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-value-parser@^4.0.0: version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@8.4.31: version "8.4.31" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.23: - version "8.4.38" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +postcss@^8, postcss@^8.4.47: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" + picocolors "^1.1.1" + source-map-js "^1.2.1" prettier@^3.3.3: version "3.3.3" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== process@^0.11.10: version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -5797,49 +6164,51 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== psl@^1.1.33: - version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + version "1.10.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.10.0.tgz#1450f7e16f922c3beeb7bd9db3f312635018fa15" + integrity sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA== + dependencies: + punycode "^2.3.1" -punycode@^2.1.1: +punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quickselect@^1.0.1: version "1.1.1" - resolved "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-1.1.1.tgz#852e412ce418f237ad5b660d70cffac647ae94c2" integrity sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ== quickselect@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== rbush@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/rbush/-/rbush-2.0.2.tgz#bb6005c2731b7ba1d5a9a035772927d16a614605" integrity sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA== dependencies: quickselect "^1.0.1" rbush@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/rbush/-/rbush-3.0.1.tgz#5fafa8a79b3b9afdfe5008403a720cc1de882ecf" integrity sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w== dependencies: quickselect "^2.0.0" @@ -5850,29 +6219,28 @@ react-chartjs-2@^5.2.0: integrity sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA== react-color-palette@^7.2.2: - version "7.2.2" - resolved "https://registry.npmjs.org/react-color-palette/-/react-color-palette-7.2.2.tgz" - integrity sha512-SHLPS3JO+xECRtWB14dAgUPranQMDiGWqn2QVPppAzqWhbUtsg2uVTUd3cpiK3OEa66j7xIDGa/RPjCw98D61g== + version "7.3.0" + resolved "https://registry.yarnpkg.com/react-color-palette/-/react-color-palette-7.3.0.tgz#2229230b0513ea0bb303c74319f1840c6f0608e0" + integrity sha512-GCgz+XEcbyFkq5wVvrPiXp8mUnOI3oObtmOtsZBCpDXgzHcDCJdssW8lTtVXbUqodo6pOw6pwYQRlXpi/ekkzQ== react-colorful@^5.6.1: version "5.6.1" - resolved "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz" + resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.6.1.tgz#7dc2aed2d7c72fac89694e834d179e32f3da563b" integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== react-datepicker@^7.3.0: - version "7.3.0" - resolved "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.3.0.tgz" - integrity sha512-EqRKLAtLZUTztiq6a+tjSjQX9ES0Xd229JPckAtyZZ4GoY3rtvNWAzkYZnQUf6zTWT50Ki0+t+W9VRQIkSJLfg== + version "7.5.0" + resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-7.5.0.tgz#e7b1014a6dbd3b314839a5c57a6dacfbb16074e4" + integrity sha512-6MzeamV8cWSOcduwePHfGqY40acuGlS1cG//ePHT6bVbLxWyqngaStenfH03n1wbzOibFggF66kWaBTb1SbTtQ== dependencies: - "@floating-ui/react" "^0.26.2" - clsx "^2.1.0" - date-fns "^3.3.1" - prop-types "^15.7.2" - react-onclickoutside "^6.13.0" + "@floating-ui/react" "^0.26.23" + clsx "^2.1.1" + date-fns "^3.6.0" + prop-types "^15.8.1" react-dom@^18: version "18.3.1" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" @@ -5880,49 +6248,44 @@ react-dom@^18: react-draggable@^4.4.6: version "4.4.6" - resolved "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.6.tgz#63343ee945770881ca1256a5b6fa5c9f5983fe1e" integrity sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw== dependencies: clsx "^1.1.1" prop-types "^15.8.1" react-hook-form@^7.53.0: - version "7.53.0" - resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz" - integrity sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ== + version "7.53.2" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.53.2.tgz#6fa37ae27330af81089baadd7f322cc987b8e2ac" + integrity sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw== react-icons@^5.3.0: version "5.3.0" - resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.3.0.tgz#ccad07a30aebd40a89f8cfa7d82e466019203f1c" integrity sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg== react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-loading-skeleton@^3.5.0: version "3.5.0" - resolved "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz" + resolved "https://registry.yarnpkg.com/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz#da2090355b4dedcad5c53cb3f0ed364e3a76d6ca" integrity sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ== -react-onclickoutside@^6.13.0: - version "6.13.1" - resolved "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz" - integrity sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w== - react-remove-scroll-bar@^2.3.6: version "2.3.6" - resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== dependencies: react-style-singleton "^2.2.1" tslib "^2.0.0" react-remove-scroll@^2.5.6: - version "2.5.10" - resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz" - integrity sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07" + integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ== dependencies: react-remove-scroll-bar "^2.3.6" react-style-singleton "^2.2.1" @@ -5932,7 +6295,7 @@ react-remove-scroll@^2.5.6: react-responsive-modal@^6.4.2: version "6.4.2" - resolved "https://registry.npmjs.org/react-responsive-modal/-/react-responsive-modal-6.4.2.tgz" + resolved "https://registry.yarnpkg.com/react-responsive-modal/-/react-responsive-modal-6.4.2.tgz#666b5c35b232cec617981006c9fe59414531a5a0" integrity sha512-ARjGEKE5Gu5CSvyA8U9ARVbtK4SMAtdXsjtzwtxRlQIHC99RQTnOUctLpl7+/sp1Kg1OJZ6yqvp6ivd4TBueEw== dependencies: "@bedrock-layout/use-forwarded-ref" "^1.3.1" @@ -5940,9 +6303,9 @@ react-responsive-modal@^6.4.2: classnames "^2.3.1" react-select@^5.8.1: - version "5.8.1" - resolved "https://registry.npmjs.org/react-select/-/react-select-5.8.1.tgz" - integrity sha512-RT1CJmuc+ejqm5MPgzyZujqDskdvB9a9ZqrdnVLsvAHjJ3Tj0hELnLeVPQlmYdVKCdCpxanepl6z7R5KhXhWzg== + version "5.8.3" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.8.3.tgz#64e89ad20a846348b18c6fbb395b939d0153ed74" + integrity sha512-lVswnIq8/iTj1db7XCG74M/3fbGB6ZaluCzvwPGT5ZOjCdL/k0CLWhEK0vCBLuU5bHTEf6Gj8jtSvi+3v+tO1w== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -5956,7 +6319,7 @@ react-select@^5.8.1: react-style-singleton@^2.2.1: version "2.2.1" - resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== dependencies: get-nonce "^1.0.0" @@ -5964,9 +6327,9 @@ react-style-singleton@^2.2.1: tslib "^2.0.0" react-textarea-autosize@^8.5.3: - version "8.5.3" - resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz" - integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== + version "8.5.5" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.5.tgz#987cc25ad7f8e51389a41f88239ff07d2e968761" + integrity sha512-CVA94zmfp8m4bSHtWwmANaBR8EPsKy2aZ7KwqhoS4Ftib87F9Kvi7XQhOixypPLMc6kVYgOXvKFuuzZDpHGRPg== dependencies: "@babel/runtime" "^7.20.13" use-composed-ref "^1.3.0" @@ -5974,7 +6337,7 @@ react-textarea-autosize@^8.5.3: react-transition-group@^4.3.0: version "4.4.5" - resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" @@ -5984,14 +6347,14 @@ react-transition-group@^4.3.0: react@^18: version "18.3.1" - resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" @@ -6007,7 +6370,7 @@ readable-stream@^3.6.0: readable-stream@^4.2.0: version "4.5.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== dependencies: abort-controller "^3.0.0" @@ -6016,38 +6379,43 @@ readable-stream@^4.2.0: process "^0.11.10" string_decoder "^1.3.0" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" recoil@^0.7.7: version "0.7.7" - resolved "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz" + resolved "https://registry.yarnpkg.com/recoil/-/recoil-0.7.7.tgz#c5f2c843224384c9c09e4a62c060fb4c1454dc8e" integrity sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ== dependencies: hamt_plus "1.0.2" regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.2: +resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.8: version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -6056,12 +6424,12 @@ resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.2: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.4.1" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^3.0.2: @@ -6073,69 +6441,71 @@ rimraf@^3.0.2: robust-predicates@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-2.0.4.tgz#0a2367a93abd99676d075981707f29cfb402248b" integrity sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg== robust-predicates@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass@^1.77.8: - version "1.77.8" - resolved "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz" - integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ== + version "1.81.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.81.0.tgz#a9010c0599867909dfdbad057e4a6fbdd5eec941" + integrity sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA== dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" + chokidar "^4.0.0" + immutable "^5.0.2" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" saxes@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: xmlchars "^2.2.0" scheduler@^0.23.2: version "0.23.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" scroll-into-view-if-needed@3.0.10: version "3.0.10" - resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz#38fbfe770d490baff0fb2ba34ae3539f6ec44e13" integrity sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg== dependencies: compute-scroll-into-view "^3.0.2" seedrandom@^3.0.5: version "3.0.5" - resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== semver@^6.0.0: @@ -6143,19 +6513,14 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5: +semver@^7.3.5, semver@^7.5.4: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@^7.5.4: - version "7.6.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - server-only@^0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/server-only/-/server-only-0.0.1.tgz#0f366bb6afb618c37c9255a314535dc412cd1c9e" integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA== set-blocking@^2.0.0: @@ -6165,14 +6530,14 @@ set-blocking@^2.0.0: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^3.0.0: @@ -6182,7 +6547,7 @@ signal-exit@^3.0.0: signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== simple-concat@^1.0.0: @@ -6201,61 +6566,52 @@ simple-get@^3.0.3: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" skmeans@0.9.7: version "0.9.7" - resolved "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz" + resolved "https://registry.yarnpkg.com/skmeans/-/skmeans-0.9.7.tgz#72670cebb728508f56e29c0e10d11e623529ce5d" integrity sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map@^0.5.7: version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@~0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== splaytree@^3.1.0: version "3.1.2" - resolved "https://registry.npmjs.org/splaytree/-/splaytree-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/splaytree/-/splaytree-3.1.2.tgz#d1db2691665a3c69d630de98d55145a6546dc166" integrity sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A== sprintf-js@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== stoppable@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6266,7 +6622,7 @@ streamsearch@^1.1.0: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -6280,42 +6636,35 @@ string_decoder@^1.1.1, string_decoder@^1.3.0: dependencies: safe-buffer "~5.2.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" styled-jsx@5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: client-only "0.0.1" stylis@4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -sucrase@^3.32.0: +sucrase@^3.35.0: version "3.35.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -6326,84 +6675,77 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== sweepline-intersections@^1.5.0: version "1.5.0" - resolved "https://registry.npmjs.org/sweepline-intersections/-/sweepline-intersections-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/sweepline-intersections/-/sweepline-intersections-1.5.0.tgz#85ab3629a291875926fae0acd508496430d8a647" integrity sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ== dependencies: tinyqueue "^2.0.0" sweetalert2-react-content@^5.0.7: version "5.0.7" - resolved "https://registry.npmjs.org/sweetalert2-react-content/-/sweetalert2-react-content-5.0.7.tgz" + resolved "https://registry.yarnpkg.com/sweetalert2-react-content/-/sweetalert2-react-content-5.0.7.tgz#6fd7299978b2e0221d3049746ff2b39c1a7aa72d" integrity sha512-8Fk82Mpk45lFXpJWKIFF/lq8k/dJKDDQGFcuqVosaL/qRdViyAs5+u37LoTGfnOIvf+rfQB3PAXcp1XLLn+0ew== sweetalert2@^11.14.1: - version "11.14.1" - resolved "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.14.1.tgz" - integrity sha512-xadhfcA4STGMh8nC5zHFFWURhRpWc4zyI3GdMDFH/m3hGWZeQQNWhX9xcG4lI9gZYsi/IlazKbwvvje3juL3Xg== + version "11.14.5" + resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.14.5.tgz#a3adf9d8c6c8eb8eacfd57e2261503f2181abb8d" + integrity sha512-8MWk5uc/r6bWhiJWkUXyEuApfXAhSCZT8FFX7pZXL7YwaPxq+9Ynhi2dUzWkOFn9jvLjKj22CXuccZ+IHcnjvQ== symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tabbable@^6.0.0: version "6.2.0" - resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== tailwind-merge@^1.14.0: version "1.14.0" - resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-1.14.0.tgz#e677f55d864edc6794562c63f5001f45093cdb8b" integrity sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ== tailwind-variants@^0.1.20: version "0.1.20" - resolved "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-0.1.20.tgz" + resolved "https://registry.yarnpkg.com/tailwind-variants/-/tailwind-variants-0.1.20.tgz#8aaed9094be0379a438641a42d588943e44c5fcd" integrity sha512-AMh7x313t/V+eTySKB0Dal08RHY7ggYK0MSn/ad8wKWOrDUIzyiWNayRUm2PIJ4VRkvRnfNuyRuKbLV3EN+ewQ== dependencies: tailwind-merge "^1.14.0" tailwindcss@^3.4.1: - version "3.4.4" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz" - integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== + version "3.4.15" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.15.tgz#04808bf4bf1424b105047d19e7d4bfab368044a9" + integrity sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" - chokidar "^3.5.3" + chokidar "^3.6.0" didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.3.0" + fast-glob "^3.3.2" glob-parent "^6.0.2" is-glob "^4.0.3" - jiti "^1.21.0" + jiti "^1.21.6" lilconfig "^2.1.0" - micromatch "^4.0.5" + micromatch "^4.0.8" normalize-path "^3.0.0" object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" + picocolors "^1.1.1" + postcss "^8.4.47" postcss-import "^15.1.0" postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" tar@^6.1.11: version "6.2.1" @@ -6419,13 +6761,13 @@ tar@^6.1.11: tarn@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== tedious@^18.2.1: - version "18.3.0" - resolved "https://registry.npmjs.org/tedious/-/tedious-18.3.0.tgz" - integrity sha512-/aVCX2VLu9Ihf5UyxifRXfmWQ1P8HNJvapk1as+LMzSdw9AmbNtEHllrffZpNrzBCptcK0Z4m06k+tutL2wowA== + version "18.6.1" + resolved "https://registry.yarnpkg.com/tedious/-/tedious-18.6.1.tgz#1c4a3f06c891be67a032117e2e25193286d44496" + integrity sha512-9AvErXXQTd6l7TDd5EmM+nxbOGyhnmdbp/8c3pw+tjaiSXW9usME90ET/CRG1LN1Y9tPMtz/p83z4Q97B4DDpw== dependencies: "@azure/core-auth" "^1.7.2" "@azure/identity" "^4.2.1" @@ -6440,57 +6782,52 @@ tedious@^18.2.1: thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" tiny-emitter@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== tinyqueue@^2.0.0, tinyqueue@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" topojson-client@3.x: version "3.1.0" - resolved "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== dependencies: commander "2" topojson-server@3.x: version "3.0.1" - resolved "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/topojson-server/-/topojson-server-3.0.1.tgz#d2b3ec095b6732299be76a48406111b3201a34f5" integrity sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw== dependencies: commander "2" tough-cookie@^4.0.0: version "4.1.4" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" @@ -6500,7 +6837,7 @@ tough-cookie@^4.0.0: tr46@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" @@ -6512,37 +6849,37 @@ tr46@~0.0.3: ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== +tslib@2, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== typed-function@^4.2.1: version "4.2.1" - resolved "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz" + resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-4.2.1.tgz#19aa51847aa2dea9ef5e7fb7641c060179a74426" integrity sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA== -uncrypto@0.1.3: +uncrypto@^0.1.3: version "0.1.3" - resolved "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz" + resolved "https://registry.yarnpkg.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== -undici-types@~6.18.2: - version "6.18.2" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.18.2.tgz" - integrity sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ== +undici-types@~6.19.8: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== universalify@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== url-parse@^1.5.3: version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -6550,31 +6887,31 @@ url-parse@^1.5.3: use-callback-ref@^1.3.0: version "1.3.2" - resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== dependencies: tslib "^2.0.0" use-composed-ref@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== use-isomorphic-layout-effect@^1.1.1, use-isomorphic-layout-effect@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== use-latest@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== dependencies: use-isomorphic-layout-effect "^1.1.1" use-sidecar@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== dependencies: detect-node-es "^1.1.0" @@ -6587,24 +6924,24 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: uuid@^10.0.0: version "10.0.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== uuid@^8.3.0: version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== w3c-hr-time@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" w3c-xmlserializer@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== dependencies: xml-name-validator "^4.0.0" @@ -6616,24 +6953,24 @@ webidl-conversions@^3.0.0: webidl-conversions@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: iconv-lite "0.6.3" whatwg-mimetype@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== whatwg-url@^10.0.0: version "10.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== dependencies: tr46 "^3.0.0" @@ -6641,7 +6978,7 @@ whatwg-url@^10.0.0: whatwg-url@^11.0.0: version "11.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== dependencies: tr46 "^3.0.0" @@ -6657,7 +6994,7 @@ whatwg-url@^5.0.0: which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" @@ -6671,7 +7008,7 @@ wide-align@^1.1.2: "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -6680,7 +7017,7 @@ wide-align@^1.1.2: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -6693,18 +7030,18 @@ wrappy@1: integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@^8.2.3: - version "8.17.1" - resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== xml-name-validator@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== yallist@^4.0.0: @@ -6714,10 +7051,10 @@ yallist@^4.0.0: yaml@^1.10.0: version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.3.4: - version "2.4.5" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz" - integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== + version "2.6.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3" + integrity sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ== From 334fbca188a29d47c3b29b3923af211a9471806c Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 19 Nov 2024 13:54:18 +0900 Subject: [PATCH 101/200] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSubHeader.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/management/StuffSubHeader.jsx b/src/components/management/StuffSubHeader.jsx index 5270bd02..dbdd974b 100644 --- a/src/components/management/StuffSubHeader.jsx +++ b/src/components/management/StuffSubHeader.jsx @@ -28,9 +28,7 @@ export default function StuffSubHeader({ type }) { const param = { pid: '1', } - //확인필요 const url = `/floor-plan?${queryStringFormatter(param)}` - console.log(url) router.push(url) } From 1c8007e96dd3f25e68bf26547c39d8c8b770e058 Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 19 Nov 2024 17:47:12 +0900 Subject: [PATCH 102/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=B3=B5?= =?UTF-8?q?=EC=82=AC=20=ED=8C=9D=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 2 +- .../estimate/popup/EstimateCopyPop.jsx | 208 ++++++++++++++++++ src/components/floor-plan/CanvasMenu.jsx | 20 +- .../estimate/useEstimateController.js | 28 +++ src/locales/ja.json | 8 + src/locales/ko.json | 8 + 6 files changed, 258 insertions(+), 16 deletions(-) create mode 100644 src/components/estimate/popup/EstimateCopyPop.jsx diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index c420f072..749892e4 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -757,7 +757,7 @@ export default function Estimate({ params }) { return ( <> -
    +
    diff --git a/src/components/estimate/popup/EstimateCopyPop.jsx b/src/components/estimate/popup/EstimateCopyPop.jsx new file mode 100644 index 00000000..632f0851 --- /dev/null +++ b/src/components/estimate/popup/EstimateCopyPop.jsx @@ -0,0 +1,208 @@ +'use client' +import { useEffect, useState, useContext, use } from 'react' +import { useMessage } from '@/hooks/useMessage' +import { useAxios } from '@/hooks/useAxios' +import { useRecoilValue } from 'recoil' +import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' +import Select, { components } from 'react-select' +import { SessionContext } from '@/app/SessionProvider' +import { isEmptyArray } from '@/util/common-utils' +import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' +import { ManagementContext } from '@/app/management/ManagementProvider' + +import { estimateState } from '@/store/floorPlanObjectAtom' + +export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { + const { getMessage } = useMessage() + const { get, promisePost } = useAxios() + const { managementState } = useContext(ManagementContext) + const { handleEstimateCopy, state } = useEstimateController(planNo) + + const { session } = useContext(SessionContext) + + // recoil 물건번호 + const objectRecoil = useRecoilValue(floorPlanObjectState) + + const [saleStoreList, setSaleStoreList] = useState([]) // 판매점 리스트 + const [favoriteStoreList, setFavoriteStoreList] = useState([]) //즐겨찾기한 판매점목록 + const [showSaleStoreList, setShowSaleStoreList] = useState([]) //보여줄 판매점목록 + + const estimateRecoilState = useRecoilValue(estimateState) + + const [otherSaleStoreList, setOtherSaleStoreList] = useState([]) + const [originOtherSaleStoreList, setOriginOtherSaleStoreList] = useState([]) + + const [sendPlanNo, setSendPlanNo] = useState('1') + const [sendCharger, setSendCharger] = useState('') + + // useEffect(() => { + // console.log(originState) + // }, [originState]) + + useEffect(() => { + if (state) { + console.log('state::::::::', state) + } + }, [state]) + useEffect(() => { + let url + let firstList + let favList + let otherList + if (session.storeId === 'T01') { + url = `/api/object/saleStore/${session?.storeId}/firstList?userId=${session?.userId}` + } else { + if (session.storeLvl === '1') { + url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` + } else { + url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` + } + } + + get({ url: url }).then((res) => { + if (!isEmptyArray(res)) { + res.map((row) => { + //자동완성 검색을 위한 필드명 셋팅 + row.value = row.saleStoreId + row.label = row.saleStoreName + }) + + if (session.storeId === 'T01') { + console.log('T01:::::::::::', res) + } else { + if (session.storeLvl === '1') { + console.log('T01아닌 1차점', res) + } else { + console.log('1차점 아님::::::::', res) + } + } + } + }) + }, []) + + useEffect(() => { + if (planNo) { + setSendPlanNo(planNo) + } + }, [planNo]) + return ( +
    +
    +
    +
    +

    {getMessage('estimate.detail.estimateCopyPopup.title')}

    + +
    +
    +
    +
    {getMessage('estimate.detail.estimateCopyPopup.explane')}
    +
    +
    +
    + {getMessage('estimate.detail.estimateCopyPopup.label.saleStoreId')} * +
    + {session.storeId === 'T01' && ( +
    +
    + +
    +
    로그인 1차점 선택한 1차점 아이디
    +
    + )} + {session.storeId !== 'T01' && session.storeLvl !== '1' && ( +
    +
    + +
    +
    선택한 2차점 아이디
    +
    +
    +
    +
    + {getMessage('estimate.detail.estimateCopyPopup.label.receiveUser')} * +
    +
    + { + setSendCharger(e.target.value) + }} + /> +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + ) +} diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 4d1d1820..99694f12 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -36,6 +36,7 @@ import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateCon import { estimateState } from '@/store/floorPlanObjectAtom' import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' +import EstimateCopyPop from '../estimate/popup/EstimateCopyPop' export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props @@ -60,6 +61,7 @@ export default function CanvasMenu(props) { const { handleEstimateSubmit } = useEstimateController() const estimateRecoilState = useRecoilValue(estimateState) const [estimatePopupOpen, setEstimatePopupOpen] = useState(false) + const [estimateCopyPopupOpen, setEstimateCopyPopupOpen] = useState(false) const { getMessage } = useMessage() const { currentCanvasPlan, saveCanvas } = usePlan() @@ -163,19 +165,6 @@ export default function CanvasMenu(props) { }) } - /** - * 견적서 복사버튼 - * (견적서 번호(estimateRecoilState.docNo)가 생성된 이후 버튼 활성화 ) - * T01관리자 계정 및 1차판매점에게만 제공 - */ - - const handleEstimateCopy = () => { - //objectNo, planNo - console.log('복사') - console.log('물건정보+도면+견적서를 모두 복사') - console.log('견적서 가격은 정가를 표시') - } - useEffect(() => { if (globalLocale === 'ko') { setAppMessageState(KO) @@ -295,10 +284,9 @@ export default function CanvasMenu(props) { {estimateRecoilState?.docNo !== null && (sessionState.storeId === 'T01' || sessionState.storeLvl === '1') && (
    {/* 견적서(menuNumber=== 5) 상세화면인경우 문서다운로드 팝업 */} {estimatePopupOpen && } + {/* 견적서(menuNumber ===5)복사 팝업 */} + {estimateCopyPopupOpen && }
    ) } diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index f99ba2eb..57ffd446 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -201,6 +201,33 @@ export const useEstimateController = (planNo) => { } } + /** + * 견적서 복사버튼 + * (견적서 번호(estimateData.docNo)가 생성된 이후 버튼 활성화 ) + * T01관리자 계정 및 1차판매점에게만 제공 + */ + const handleEstimateCopy = async (sendPlanNo, sendCharger) => { + console.log('입력한 값들!@@@@@', sendPlanNo, sendCharger) + const params = { + saleStoreId: session.storeId, + sapSalesStoreCd: session.custCd, + objectNo: objectRecoil.floorPlanObjectNo, + planNo: sendPlanNo, + copySaleStoreId: 'X11', + copyReceiveUser: sendCharger, + userId: session.userId, + } + console.log('전송파람:::', params) + + return + await promisePost({ url: '/api/estimate/save-estimate-copy', data: params }).then((res) => { + console.log('복사결과::::::::', res) + //물건 번호 새로 내려옴 + //견적서가 복사되었습니다. 복사된 물건정보로 이동합니다. + // alert(getMessage('estimate.detail.estimateCopyPopup.copy.alertMessage')) + }) + } + return { state, setState, @@ -209,5 +236,6 @@ export const useEstimateController = (planNo) => { handleEstimateSubmit, fetchSetting, handleEstimateFileDownload, + handleEstimateCopy, } } diff --git a/src/locales/ja.json b/src/locales/ja.json index 3487baf6..2c0767ac 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -874,6 +874,14 @@ "estimate.detail.docPopup.schDrawingFlg.schDrawingFlg0": "含まない", "estimate.detail.docPopup.close": "閉じる", "estimate.detail.docPopup.docDownload": "文書のダウンロード", + "estimate.detail.estimateCopyPopup.title": "見積もり", + "estimate.detail.estimateCopyPopup.explane": "見積書をコピーする販売店を設定します。見積もりは定価にコピーされます.", + "estimate.detail.estimateCopyPopup.label.saleStoreId": "一次販売店名 / ID", + "estimate.detail.estimateCopyPopup.label.otherSaleStoreId": "二次販売店名 / ID", + "estimate.detail.estimateCopyPopup.label.receiveUser": "担当者", + "estimate.detail.estimateCopyPopup.close": "閉じる", + "estimate.detail.estimateCopyPopup.copyBtn": "見積もり", + "estimate.detail.estimateCopyPopup.copy.alertMessage": "見積書がコピーされました. コピーした商品情報に移動します.", "estimate.detail.productFeaturesPopup.title": "製品特異事項", "estimate.detail.productFeaturesPopup.close": "閉じる", "estimate.detail.save.alertMsg": "保存されている見積書で製品を変更した場合、図面や回路には反映されません.", diff --git a/src/locales/ko.json b/src/locales/ko.json index 96b55238..55ad3b14 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -884,6 +884,14 @@ "estimate.detail.docPopup.schDrawingFlg.schDrawingFlg0": "미포함", "estimate.detail.docPopup.close": "닫기", "estimate.detail.docPopup.docDownload": "문서 다운로드", + "estimate.detail.estimateCopyPopup.title": "견적복사", + "estimate.detail.estimateCopyPopup.explane": "견적서를 복사할 판매점을 설정하십시오. 견적서는 정가로 복사됩니다.", + "estimate.detail.estimateCopyPopup.label.saleStoreId": "1차 판매점명 / ID", + "estimate.detail.estimateCopyPopup.label.otherSaleStoreId": "2차 판매점명 / ID", + "estimate.detail.estimateCopyPopup.label.receiveUser": "담당자", + "estimate.detail.estimateCopyPopup.close": "닫기", + "estimate.detail.estimateCopyPopup.copyBtn": "견적복사", + "estimate.detail.estimateCopyPopup.copy.alertMessage": "견적서가 복사되었습니다. 복사된 물건정보로 이동합니다.", "estimate.detail.productFeaturesPopup.title": "제품특이사항", "estimate.detail.productFeaturesPopup.close": "닫기", "estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우, 도면 및 회로에 반영되지 않습니다.", From 88a64282eb8223d13415a5abcb851be08812124d Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 19 Nov 2024 18:19:44 +0900 Subject: [PATCH 103/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=B3=B5?= =?UTF-8?q?=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/popup/EstimateCopyPop.jsx | 56 +++++++++++++++---- .../estimate/useEstimateController.js | 6 +- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/src/components/estimate/popup/EstimateCopyPop.jsx b/src/components/estimate/popup/EstimateCopyPop.jsx index 632f0851..8e2e4251 100644 --- a/src/components/estimate/popup/EstimateCopyPop.jsx +++ b/src/components/estimate/popup/EstimateCopyPop.jsx @@ -8,14 +8,15 @@ import Select, { components } from 'react-select' import { SessionContext } from '@/app/SessionProvider' import { isEmptyArray } from '@/util/common-utils' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' -import { ManagementContext } from '@/app/management/ManagementProvider' import { estimateState } from '@/store/floorPlanObjectAtom' export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { const { getMessage } = useMessage() const { get, promisePost } = useAxios() - const { managementState } = useContext(ManagementContext) + + const [selOptions, setSelOptions] = useState('') //선택한 1차점 전송할 + const { handleEstimateCopy, state } = useEstimateController(planNo) const { session } = useContext(SessionContext) @@ -35,15 +36,6 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { const [sendPlanNo, setSendPlanNo] = useState('1') const [sendCharger, setSendCharger] = useState('') - // useEffect(() => { - // console.log(originState) - // }, [originState]) - - useEffect(() => { - if (state) { - console.log('state::::::::', state) - } - }, [state]) useEffect(() => { let url let firstList @@ -72,6 +64,15 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { } else { if (session.storeLvl === '1') { console.log('T01아닌 1차점', res) + firstList = res + favList = res.filter((row) => row.priority !== 'B') + otherList = res.filter((row) => row.firstAgentYn === 'N') + setSaleStoreList(firstList) + setFavoriteStoreList(firstList) + setShowSaleStoreList(firstList) + setSelOptions(firstList[0].saleStoreId) + + setOtherSaleStoreList(otherList) } else { console.log('1차점 아님::::::::', res) } @@ -85,6 +86,28 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { setSendPlanNo(planNo) } }, [planNo]) + + useEffect(() => { + if (state?.charger) { + setSendCharger(state.charger) + } + }, [state.charger]) + + // 1차점 변경 이벤트 + const onSelectionChange = (key) => { + if (isObjectNotEmpty(key)) { + if (key.saleStoreId === selOptions) { + return + } + } + + if (isObjectNotEmpty(key)) { + console.log('KEY::', key) + } else { + console.log('XXXXXXXXXXX') + } + } + return (
    @@ -132,6 +155,15 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { className="react-select-custom" classNamePrefix="custom" placeholder="Select" + options={showSaleStoreList[0]} + onChange={onSelectionChange} + getOptionLabel={(x) => x.saleStoreName} + getOptionValue={(x) => x.saleStoreId} + isClearable={false} + isDisabled={session?.storeLvl !== '1' ? true : session?.storeId !== 'T01' ? true : false} + value={showSaleStoreList.filter(function (option) { + return option.saleStoreId === selOptions + })} />
    로그인 1차점 선택한 1차점 아이디
    @@ -194,7 +226,7 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { type="button" className="btn-origin navy" onClick={() => { - handleEstimateCopy(sendPlanNo, sendCharger) + handleEstimateCopy(sendPlanNo, sendCharger, selOptions) }} > {getMessage('estimate.detail.estimateCopyPopup.copyBtn')} diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 57ffd446..89b4c8f7 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -206,14 +206,14 @@ export const useEstimateController = (planNo) => { * (견적서 번호(estimateData.docNo)가 생성된 이후 버튼 활성화 ) * T01관리자 계정 및 1차판매점에게만 제공 */ - const handleEstimateCopy = async (sendPlanNo, sendCharger) => { - console.log('입력한 값들!@@@@@', sendPlanNo, sendCharger) + const handleEstimateCopy = async (sendPlanNo, sendCharger, selOptions) => { + console.log('입력한 값들!@@@@@', sendPlanNo, sendCharger, selOptions) const params = { saleStoreId: session.storeId, sapSalesStoreCd: session.custCd, objectNo: objectRecoil.floorPlanObjectNo, planNo: sendPlanNo, - copySaleStoreId: 'X11', + copySaleStoreId: selOptions, copyReceiveUser: sendCharger, userId: session.userId, } From 6ad0b8f9d43e7a83edf1f497e0555b2b4660dfb5 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 20 Nov 2024 11:17:25 +0900 Subject: [PATCH 104/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=B3=B5?= =?UTF-8?q?=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/popup/EstimateCopyPop.jsx | 169 +++++++++++++----- .../estimate/useEstimateController.js | 38 ++-- src/locales/ja.json | 2 + src/locales/ko.json | 2 + 4 files changed, 147 insertions(+), 64 deletions(-) diff --git a/src/components/estimate/popup/EstimateCopyPop.jsx b/src/components/estimate/popup/EstimateCopyPop.jsx index 8e2e4251..39ca5a28 100644 --- a/src/components/estimate/popup/EstimateCopyPop.jsx +++ b/src/components/estimate/popup/EstimateCopyPop.jsx @@ -1,40 +1,33 @@ 'use client' -import { useEffect, useState, useContext, use } from 'react' +import { useEffect, useState, useContext, useRef } from 'react' import { useMessage } from '@/hooks/useMessage' import { useAxios } from '@/hooks/useAxios' -import { useRecoilValue } from 'recoil' -import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' import Select, { components } from 'react-select' import { SessionContext } from '@/app/SessionProvider' -import { isEmptyArray } from '@/util/common-utils' +import { isEmptyArray, isObjectNotEmpty } from '@/util/common-utils' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' -import { estimateState } from '@/store/floorPlanObjectAtom' - export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { const { getMessage } = useMessage() - const { get, promisePost } = useAxios() - - const [selOptions, setSelOptions] = useState('') //선택한 1차점 전송할 + const { get } = useAxios() const { handleEstimateCopy, state } = useEstimateController(planNo) const { session } = useContext(SessionContext) - // recoil 물건번호 - const objectRecoil = useRecoilValue(floorPlanObjectState) - const [saleStoreList, setSaleStoreList] = useState([]) // 판매점 리스트 const [favoriteStoreList, setFavoriteStoreList] = useState([]) //즐겨찾기한 판매점목록 const [showSaleStoreList, setShowSaleStoreList] = useState([]) //보여줄 판매점목록 - - const estimateRecoilState = useRecoilValue(estimateState) - const [otherSaleStoreList, setOtherSaleStoreList] = useState([]) const [originOtherSaleStoreList, setOriginOtherSaleStoreList] = useState([]) + const [saleStoreId, setSaleStoreId] = useState('') //선택한 1차점 + const [otherSaleStoreId, setOtherSaleStoreId] = useState('') //선택한 1차점 이외 + const [sendPlanNo, setSendPlanNo] = useState('1') - const [sendCharger, setSendCharger] = useState('') + const [copyReceiveUser, setCopyReceiveUser] = useState('') + + const ref = useRef() //2차점 자동완성 초기화용 useEffect(() => { let url @@ -47,7 +40,8 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { if (session.storeLvl === '1') { url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } else { - url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` + //T01 or 1차점만 복사버튼 노출됨으로 + // url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } } @@ -60,21 +54,44 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { }) if (session.storeId === 'T01') { - console.log('T01:::::::::::', res) + firstList = res + //T01을 첫번째로 정렬 + firstList.sort((a, b) => (a.saleStoreId !== 'T01') - (b.saleStoreId !== 'T01') || a.saleStoreId - b.saleStoreId) + favList = firstList.filter((row) => row.saleStoreId === 'T01' || row.priority !== 'B') + + setSaleStoreList(firstList) + setFavoriteStoreList(favList) + setShowSaleStoreList(favList) + setSaleStoreId(session?.storeId) + + // T01때 디폴트로 T01셋팅하고 하위 2차목록 조회하기 바꾸면(onSelectionChange..) 바꾼거로 2차목록 조회하기 + url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=0&userId=${session?.userId}` + get({ url: url }).then((res) => { + if (!isEmptyArray(res)) { + res.map((row) => { + row.value == row.saleStoreId + row.label = row.saleStoreName + }) + otherList = res + setOtherSaleStoreList(otherList) + setOriginOtherSaleStoreList(otherList) + } else { + setOtherSaleStoreList([]) + } + }) } else { if (session.storeLvl === '1') { - console.log('T01아닌 1차점', res) firstList = res favList = res.filter((row) => row.priority !== 'B') otherList = res.filter((row) => row.firstAgentYn === 'N') setSaleStoreList(firstList) setFavoriteStoreList(firstList) setShowSaleStoreList(firstList) - setSelOptions(firstList[0].saleStoreId) + setSaleStoreId(firstList[0].saleStoreId) setOtherSaleStoreList(otherList) } else { - console.log('1차점 아님::::::::', res) + //T01 or 1차점만 복사버튼 노출됨으로 } } } @@ -89,22 +106,73 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { useEffect(() => { if (state?.charger) { - setSendCharger(state.charger) + setCopyReceiveUser(state.charger) } }, [state.charger]) + //T01 1차점 자동완성 인풋때 목록 변환 + const onInputChange = (key) => { + if (key !== '') { + setShowSaleStoreList(saleStoreList) + } else { + setShowSaleStoreList(favoriteStoreList) + } + } + // 1차점 변경 이벤트 const onSelectionChange = (key) => { if (isObjectNotEmpty(key)) { - if (key.saleStoreId === selOptions) { + if (key.saleStoreId === saleStoreId) { return } } if (isObjectNotEmpty(key)) { - console.log('KEY::', key) + setSaleStoreId(key.saleStoreId) + const url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` + let otherList + get({ url: url }).then((res) => { + if (!isEmptyArray(res)) { + res.map((row) => { + row.value = row.saleStoreId + row.label = row.saleStoreName + }) + + otherList = res + setOtherSaleStoreList(otherList) + setOtherSaleStoreId('') + } else { + setOtherSaleStoreId('') + setOtherSaleStoreList([]) + } + }) } else { - console.log('XXXXXXXXXXX') + setSaleStoreId('') + //otherSaleStoreId는 onSelectionChange2에서 초기화됨 + setOtherSaleStoreList(originOtherSaleStoreList) + handleClear() + } + } + + // 2차점 변경 이벤트 + const onSelectionChange2 = (key) => { + if (isObjectNotEmpty(key)) { + if (key.saleStoreId === otherSaleStoreId) { + return + } + } + + if (isObjectNotEmpty(key)) { + setOtherSaleStoreId(key.saleStoreId) + } else { + setOtherSaleStoreId('') + } + } + + //2차점 자동완성 초기화 + const handleClear = () => { + if (ref.current) { + ref.current.clearValue() } } @@ -141,9 +209,19 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { className="react-select-custom" classNamePrefix="custom" placeholder="Select" + options={showSaleStoreList} + onInputChange={onInputChange} + onChange={onSelectionChange} + getOptionLabel={(x) => x.saleStoreName} + getOptionValue={(x) => x.saleStoreId} + isClearable={true} + isDisabled={false} + value={saleStoreList.filter(function (option) { + return option.saleStoreId === saleStoreId + })} />
    -
    로그인T01 선택한 1차점 아이디
    +
    {saleStoreId}
    )} {session.storeId !== 'T01' && session.storeLvl === '1' && ( @@ -162,32 +240,16 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { isClearable={false} isDisabled={session?.storeLvl !== '1' ? true : session?.storeId !== 'T01' ? true : false} value={showSaleStoreList.filter(function (option) { - return option.saleStoreId === selOptions + return option.saleStoreId === saleStoreId })} />
    -
    로그인 1차점 선택한 1차점 아이디
    -
    - )} - {session.storeId !== 'T01' && session.storeLvl !== '1' && ( -
    -
    - x.saleStoreName} + getOptionValue={(x) => x.saleStoreId} + isClearable={true} + isDisabled={otherSaleStoreList.length > 0 ? false : true} + value={otherSaleStoreList.filter(function (option) { + return option.saleStoreId === otherSaleStoreId + })} />
    -
    선택한 2차점 아이디
    +
    {otherSaleStoreId}
    @@ -209,9 +281,10 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { { - setSendCharger(e.target.value) + setCopyReceiveUser(e.target.value) }} />
    @@ -226,7 +299,7 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { type="button" className="btn-origin navy" onClick={() => { - handleEstimateCopy(sendPlanNo, sendCharger, selOptions) + handleEstimateCopy(sendPlanNo, copyReceiveUser, saleStoreId, otherSaleStoreId) }} > {getMessage('estimate.detail.estimateCopyPopup.copyBtn')} diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 89b4c8f7..e3883125 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -51,15 +51,15 @@ export const useEstimateController = (planNo) => { useEffect(() => { if (planNo && !isLoading) { if (objectRecoil.floorPlanObjectNo && planNo) { - fetchSetting() + fetchSetting(objectRecoil.floorPlanObjectNo, planNo) } } }, []) // 상세 조회 - const fetchSetting = async () => { + const fetchSetting = async (objectNo, planNo) => { try { - await get({ url: `/api/estimate/${objectRecoil.floorPlanObjectNo}/${planNo}/detail` }).then((res) => { + await get({ url: `/api/estimate/${objectNo}/${planNo}/detail` }).then((res) => { if (isObjectNotEmpty(res)) { if (res.itemList.length > 0) { res.itemList.map((item) => { @@ -84,7 +84,6 @@ export const useEstimateController = (planNo) => { } const addItem = () => { - // const newItemDispOrder = (Math.max(...state.itemList.map((item) => item.dispOrder)) / 100 + 1) * 100 let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) newItemDispOrder = (Math.floor(newItemDispOrder / 100) + 1) * 100 setState({ @@ -191,11 +190,10 @@ export const useEstimateController = (planNo) => { //2. 상세데이터 저장 // return await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { - console.log('res::::::::::::', res) if (res.status === 201) { alert(getMessage('estimate.detail.save.alertMsg')) //어디로 보낼지 - router.push(`/floor-plan/estimate/5/${estimateData.planNo}`) + fetchSetting(objectRecoil.floorPlanObjectNo, estimateData.planNo) } }) } @@ -206,25 +204,33 @@ export const useEstimateController = (planNo) => { * (견적서 번호(estimateData.docNo)가 생성된 이후 버튼 활성화 ) * T01관리자 계정 및 1차판매점에게만 제공 */ - const handleEstimateCopy = async (sendPlanNo, sendCharger, selOptions) => { - console.log('입력한 값들!@@@@@', sendPlanNo, sendCharger, selOptions) + const handleEstimateCopy = async (sendPlanNo, copyReceiveUser, saleStoreId, otherSaleStoreId) => { + if (saleStoreId === '') { + return alert(getMessage('estimate.detail.productFeaturesPopup.requiredStoreId')) + } + + if (copyReceiveUser.trim().length === 0) { + return alert(getMessage('estimate.detail.productFeaturesPopup.requiredReceiveUser')) + } const params = { saleStoreId: session.storeId, sapSalesStoreCd: session.custCd, objectNo: objectRecoil.floorPlanObjectNo, planNo: sendPlanNo, - copySaleStoreId: selOptions, - copyReceiveUser: sendCharger, + copySaleStoreId: otherSaleStoreId ? otherSaleStoreId : saleStoreId, + copyReceiveUser: copyReceiveUser, userId: session.userId, } - console.log('전송파람:::', params) - return + // return await promisePost({ url: '/api/estimate/save-estimate-copy', data: params }).then((res) => { - console.log('복사결과::::::::', res) - //물건 번호 새로 내려옴 - //견적서가 복사되었습니다. 복사된 물건정보로 이동합니다. - // alert(getMessage('estimate.detail.estimateCopyPopup.copy.alertMessage')) + if (res.status === 201) { + if (isObjectNotEmpty(res.data)) { + let newObjectNo = res.data.objectNo + alert(getMessage('estimate.detail.estimateCopyPopup.copy.alertMessage')) + router.push(`/management/stuff/detail?objectNo=${newObjectNo.toString()}`, { scroll: false }) + } + } }) } diff --git a/src/locales/ja.json b/src/locales/ja.json index 2c0767ac..d1d56038 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -884,6 +884,8 @@ "estimate.detail.estimateCopyPopup.copy.alertMessage": "見積書がコピーされました. コピーした商品情報に移動します.", "estimate.detail.productFeaturesPopup.title": "製品特異事項", "estimate.detail.productFeaturesPopup.close": "閉じる", + "estimate.detail.productFeaturesPopup.requiredStoreId": "一次販売店は必須です.", + "estimate.detail.productFeaturesPopup.requiredReceiveUser": "担当者は必須です.", "estimate.detail.save.alertMsg": "保存されている見積書で製品を変更した場合、図面や回路には反映されません.", "estimate.detail.save.requiredMsg": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください.", "estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります.", diff --git a/src/locales/ko.json b/src/locales/ko.json index 55ad3b14..5ed1f4fc 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -894,6 +894,8 @@ "estimate.detail.estimateCopyPopup.copy.alertMessage": "견적서가 복사되었습니다. 복사된 물건정보로 이동합니다.", "estimate.detail.productFeaturesPopup.title": "제품특이사항", "estimate.detail.productFeaturesPopup.close": "닫기", + "estimate.detail.productFeaturesPopup.requiredStoreId": "1차 판매점은 필수값 입니다.", + "estimate.detail.productFeaturesPopup.requiredReceiveUser": "담당자는 필수값 입니다.", "estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우, 도면 및 회로에 반영되지 않습니다.", "estimate.detail.save.requiredMsg": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.", "estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.", From dce88e6406ed0bebb478592ad1e1fa17365b6836 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 20 Nov 2024 13:44:35 +0900 Subject: [PATCH 105/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 37 ++++++++++++++----- .../estimate/useEstimateController.js | 32 ++++++++++++---- src/locales/ja.json | 5 ++- src/locales/ko.json | 5 ++- 4 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 749892e4..14285f61 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -569,6 +569,20 @@ export default function Estimate({ params }) { } }, [itemChangeYn, state.itemList]) + //안건명 인풋 변경 + const handleBlurObjectName = (e) => { + setState({ objectName: e.target.value }) + } + + //담당자 인풋 변경 + const handleBlurCharger = (e) => { + setState({ charger: e.target.value }) + } + + useEffect(() => { + console.log('상세정보???????????', state) + console.log('업뎃날짜시간???????????', state.lastEditDatetime) + }, [state]) return (
    @@ -594,7 +608,8 @@ export default function Estimate({ params }) {
    {getMessage('estimate.detail.lastEditDatetime')}
    -
    {state?.lastEditDatetime ? `${dayjs(state.lastEditDatetime).format('YYYY.MM.DD HH:mm')}` : ''}
    + {/*
    {state?.lastEditDatetime ? `${dayjs(state.lastEditDatetime).format('YYYY.MM.DD HH:mm')}` : ''}
    */} +
    {state?.lastEditDatetime ? `${dayjs(state?.lastEditDatetime).format('HH:mm:ss')}` : ''}
    @@ -645,10 +660,11 @@ export default function Estimate({ params }) { type="text" className="input-light" defaultValue={state?.charger} - onChange={(e) => { - //담당자 charger - setState({ charger: e.target.value }) - }} + // onChange={(e) => { + // //담당자 charger + // setState({ charger: e.target.value }) + // }} + onBlur={handleBlurCharger} />
    @@ -665,10 +681,11 @@ export default function Estimate({ params }) { type="text" className="input-light" defaultValue={state?.objectName} - onChange={(e) => { - //안건명 objectName - setState({ objectName: e.target.value }) - }} + // onChange={(e) => { + // //안건명 objectName + // setState({ objectName: e.target.value }) + // }} + onBlur={handleBlurObjectName} />
    @@ -688,7 +705,7 @@ export default function Estimate({ params }) { }} getOptionLabel={(x) => x.clCodeNm} getOptionValue={(x) => x.clCode} - isClearable={true} + isClearable={false} isSearchable={false} value={honorificCodeList.filter(function (option) { return option.clCodeNm === state.objectNameOmit diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index e3883125..7def3c44 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -47,6 +47,7 @@ export const useEstimateController = (planNo) => { const [isLoading, setIsLoading] = useState(false) const [state, setState] = useReducer(reducer, defaultEstimateData) + const [newState, setNewState] = useState({}) useEffect(() => { if (planNo && !isLoading) { @@ -66,7 +67,8 @@ export const useEstimateController = (planNo) => { item.delFlg = '0' }) } - + console.log('조회 결과::::', res) + console.log('수정일::::', res.lastEditDatetime) setState(res) } }) @@ -142,24 +144,41 @@ export const useEstimateController = (planNo) => { const handleEstimateSubmit = async () => { //0. 필수체크 let flag = true + if (estimateData.charger.trim().length === 0) { + flag = false + return alert(getMessage('estimate.detail.save.requiredCharger')) + } + + if (estimateData.objectName.trim().length === 0) { + flag = false + return alert(getMessage('estimate.detail.save.requiredObjectName')) + } + + if (isNaN(Date.parse(estimateData.estimateDate))) { + flag = false + return alert(getMessage('estimate.detail.save.requiredEstimateDate')) + } // console.log('첨부파일:::::', estimateData.fileList) //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 + let fileFlg = true if (estimateData.fileList.length < 1) { if (estimateData.itemList.length > 1) { estimateData.itemList.map((row) => { if (row.fileUploadFlg === '1') { - if (estimateData.fileFlg === '0') { - alert(getMessage('estimate.detail.save.requiredMsg')) - flag = false + if (fileFlg) { + if (estimateData.fileFlg === '0') { + fileFlg = false + return alert(getMessage('estimate.detail.save.requiredFileUpload')) + } } } }) } } - if (flag) { + if (flag && fileFlg) { //1. 첨부파일 저장시작 const formData = new FormData() formData.append('file', estimateData.fileList) @@ -184,8 +203,7 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredItem')) } - // console.log('최종 남은 아이템정보:::', estimateData.itemList) - console.log('최종 정보::;', estimateData) + // console.log('최종 정보::;', estimateData) //2. 상세데이터 저장 // return diff --git a/src/locales/ja.json b/src/locales/ja.json index d1d56038..7bda9175 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -887,8 +887,11 @@ "estimate.detail.productFeaturesPopup.requiredStoreId": "一次販売店は必須です.", "estimate.detail.productFeaturesPopup.requiredReceiveUser": "担当者は必須です.", "estimate.detail.save.alertMsg": "保存されている見積書で製品を変更した場合、図面や回路には反映されません.", - "estimate.detail.save.requiredMsg": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください.", + "estimate.detail.save.requiredFileUpload": "ファイル添付が必須のアイテムがあります。ファイルを添付するか、後日添付をチェックしてください.", "estimate.detail.save.requiredItem": "製品は1つ以上登録する必要があります.", + "estimate.detail.save.requiredCharger": "担当者は必須です.", + "estimate.detail.save.requiredObjectName": "案件名は必須です.", + "estimate.detail.save.requiredEstimateDate": "見積日は必須です.", "estimate.detail.reset.confirmMsg": "保存した見積書情報が初期化され、図面情報が反映されます。本当に初期化しますか?", "simulator.title.sub1": "物件番号", "simulator.title.sub2": "作成日", diff --git a/src/locales/ko.json b/src/locales/ko.json index 5ed1f4fc..54f672a5 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -897,8 +897,11 @@ "estimate.detail.productFeaturesPopup.requiredStoreId": "1차 판매점은 필수값 입니다.", "estimate.detail.productFeaturesPopup.requiredReceiveUser": "담당자는 필수값 입니다.", "estimate.detail.save.alertMsg": "저장되었습니다. 견적서에서 제품을 변경할 경우, 도면 및 회로에 반영되지 않습니다.", - "estimate.detail.save.requiredMsg": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.", + "estimate.detail.save.requiredFileUpload": "파일첨부가 필수인 아이템이 있습니다. 파일을 첨부하거나 후일첨부를 체크해주십시오.", "estimate.detail.save.requiredItem": "제품은 1개이상 등록해야 됩니다.", + "estimate.detail.save.requiredCharger": "담당자는 필수값 입니다.", + "estimate.detail.save.requiredObjectName": "안건명은 필수값 입니다.", + "estimate.detail.save.requiredEstimateDate": "견적일은 필수값 입니다.", "estimate.detail.reset.confirmMsg": "저장된 견적서 정보가 초기화되고, 도면정보가 반영됩니다. 정말로 초기화 하시겠습니까?", "simulator.title.sub1": "물건번호", "simulator.title.sub2": "작성일", From d9e92bc151e3b7d8a7f4ca49ef0293c43c4173f0 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 20 Nov 2024 14:47:14 +0900 Subject: [PATCH 106/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSearchCondition.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 1c7ececb..f803452c 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -116,8 +116,6 @@ export default function StuffSearchCondition() { schAddress: address, schObjectName: objectName, schDispCompanyName: dispCompanyName, - // schSelSaleStoreId: stuffSearch?.schSelSaleStoreId, - // schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId, schSelSaleStoreId: schSelSaleStoreId, schOtherSelSaleStoreId: otherSaleStoreId, schReceiveUser: receiveUser, @@ -315,8 +313,10 @@ export default function StuffSearchCondition() { } else { //X누름 //화면에선 지우는데 리코일은 조회누르지 않으면 보존 - // setSchSelSaleStoreId('') //값이 안비워짐.. - setSchSelSaleStoreId(null) + setSchSelSaleStoreId('') + setOtherSaleStoreId('') + stuffSearch.schSelSaleStoreId = '' + stuffSearch.schOtherSelSaleStoreId = '' //2차점 판매점목록비우기 setOtherSaleStoreList([]) From 70127d96a3c49ac0b65306fde668365339449971 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 20 Nov 2024 15:04:45 +0900 Subject: [PATCH 107/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/auth/Login.jsx | 8 +++---- src/components/estimate/Estimate.jsx | 4 ++-- .../estimate/useEstimateController.js | 22 ++++++++++--------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/components/auth/Login.jsx b/src/components/auth/Login.jsx index 5418dec7..6060b308 100644 --- a/src/components/auth/Login.jsx +++ b/src/components/auth/Login.jsx @@ -83,12 +83,12 @@ export default function Login() { /////////////////////////////////////////////////////////// // 임시 로그인 처리 setSession({ - userId: 'NEW0166102', + userId: 'an1', saleStoreId: null, name: null, mail: null, tel: null, - storeId: 'TEMP02', + storeId: 'X42', userNm: 'ㅇㅇ6610', userNmKana: '신규사용자 16610', category: '인상6610', @@ -101,12 +101,12 @@ export default function Login() { custCd: '100000', }) setSessionState({ - userId: 'NEW0166102', + userId: 'an1', saleStoreId: null, name: null, mail: null, tel: null, - storeId: 'TEMP02', + storeId: 'X42', userNm: 'ㅇㅇ6610', userNmKana: '신규사용자 16610', category: '인상6610', diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 14285f61..7eb23fa5 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -580,9 +580,9 @@ export default function Estimate({ params }) { } useEffect(() => { - console.log('상세정보???????????', state) - console.log('업뎃날짜시간???????????', state.lastEditDatetime) + console.log('수정날짜시간???????????', state.lastEditDatetime) }, [state]) + return (
    diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 7def3c44..19dbac5e 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -43,7 +43,7 @@ export const useEstimateController = (planNo) => { const { getMessage } = useMessage() - const { get, post, promisePost } = useAxios(globalLocaleState) + const { promiseGet, get, post, promisePost } = useAxios(globalLocaleState) const [isLoading, setIsLoading] = useState(false) const [state, setState] = useReducer(reducer, defaultEstimateData) @@ -60,16 +60,18 @@ export const useEstimateController = (planNo) => { // 상세 조회 const fetchSetting = async (objectNo, planNo) => { try { - await get({ url: `/api/estimate/${objectNo}/${planNo}/detail` }).then((res) => { - if (isObjectNotEmpty(res)) { - if (res.itemList.length > 0) { - res.itemList.map((item) => { - item.delFlg = '0' - }) + await promiseGet({ url: `/api/estimate/${objectNo}/${planNo}/detail` }).then((res) => { + if (res.status === 200) { + if (isObjectNotEmpty(res.data)) { + if (res.data.itemList.length > 0) { + res.data.itemList.map((item) => { + item.delFlg = '0' + }) + } + console.log('조회결과;', res.data) + console.log('수정시간;', res.data.lastEditDatetime) + setState(res.data) } - console.log('조회 결과::::', res) - console.log('수정일::::', res.lastEditDatetime) - setState(res) } }) setIsLoading(true) From 729be84c97efdd5f877c7865cbd755907c03ff09 Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 20 Nov 2024 15:26:55 +0900 Subject: [PATCH 108/200] =?UTF-8?q?-=20AuxiliaryCopy,=20AuxiliaryMove=20?= =?UTF-8?q?=EB=B3=91=ED=95=A9=20-=20=EB=B3=B4=EC=A1=B0=EC=84=A0=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C,=20=EC=9D=B4=EB=8F=99,=20=EB=B3=B5=EC=82=AC,?= =?UTF-8?q?=20=EC=88=98=EC=A7=81=EC=9D=B4=EB=93=B1=EB=B6=84=EC=84=A0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/auxiliary/AuxiliaryCopy.jsx | 84 ------------------- .../{AuxiliaryMove.jsx => AuxiliaryEdit.jsx} | 47 ++++++++--- src/hooks/roofcover/useAuxiliaryDrawing.js | 43 ++++++++-- src/hooks/useContextMenu.js | 48 +++++++++-- 4 files changed, 118 insertions(+), 104 deletions(-) delete mode 100644 src/components/floor-plan/modal/auxiliary/AuxiliaryCopy.jsx rename src/components/floor-plan/modal/auxiliary/{AuxiliaryMove.jsx => AuxiliaryEdit.jsx} (66%) diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryCopy.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryCopy.jsx deleted file mode 100644 index 32ffc78d..00000000 --- a/src/components/floor-plan/modal/auxiliary/AuxiliaryCopy.jsx +++ /dev/null @@ -1,84 +0,0 @@ -import { useMessage } from '@/hooks/useMessage' -import WithDraggable from '@/components/common/draggable/WithDraggable' -import { usePopup } from '@/hooks/usePopup' -import { useRecoilValue } from 'recoil' -import { contextPopupPositionState } from '@/store/popupAtom' -import { useState } from 'react' - -export default function AuxiliaryCopy(props) { - const contextPopupPosition = useRecoilValue(contextPopupPositionState) - const { id, pos = contextPopupPosition } = props - const { getMessage } = useMessage() - const { closePopup } = usePopup() - const [arrow1, setArrow1] = useState(null) - const [arrow2, setArrow2] = useState(null) - return ( - -
    -
    -

    {getMessage('modal.auxiliary.copy')}

    - -
    -
    -
    {getMessage('modal.auxiliary.copy.info')}
    -
    -
    -
    -

    {getMessage('length')}

    -
    -
    - -
    - mm -
    - - -
    -
    -
    -
    - -
    - mm -
    - - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - ) -} diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryMove.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx similarity index 66% rename from src/components/floor-plan/modal/auxiliary/AuxiliaryMove.jsx rename to src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx index 733173b4..da00ac06 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliaryMove.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx @@ -1,37 +1,62 @@ -'use client' - import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' +import { usePopup } from '@/hooks/usePopup' import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' -import { usePopup } from '@/hooks/usePopup' import { useState } from 'react' +import { currentObjectState } from '@/store/canvasAtom' +import { useLine } from '@/hooks/useLine' +import { useAuxiliaryDrawing } from '@/hooks/roofcover/useAuxiliaryDrawing' -export default function AuxiliaryMove(props) { +export default function AuxiliaryEdit(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) - const { id, pos = contextPopupPosition } = props + const { id, pos = contextPopupPosition, type } = props const { getMessage } = useMessage() const { closePopup } = usePopup() + const { move, copy } = useAuxiliaryDrawing() + const [verticalSize, setVerticalSize] = useState('0') + const [horizonSize, setHorizonSize] = useState('0') const [arrow1, setArrow1] = useState(null) const [arrow2, setArrow2] = useState(null) + const { addLine, removeLine } = useLine() + const currentObject = useRecoilValue(currentObjectState) + const handleSave = () => { + if (type === 'copy') { + if (currentObject) { + copy( + currentObject, + arrow2 === '←' ? Number(horizonSize) * -1 : Number(horizonSize), + arrow1 === '↑' ? Number(verticalSize) * -1 : Number(verticalSize), + ) + } + } else { + move( + currentObject, + arrow2 === '←' ? Number(horizonSize) * -1 : Number(horizonSize), + arrow1 === '↑' ? Number(verticalSize) * -1 : Number(verticalSize), + ) + } + + closePopup(id) + } return (
    -

    {getMessage('modal.auxiliary.move')}

    +

    {getMessage(type === 'copy' ? 'modal.auxiliary.copy' : 'modal.auxiliary.move')}

    -
    {getMessage('modal.auxiliary.move.info')}
    +
    {getMessage(type === 'copy' ? 'modal.auxiliary.copy.info' : 'modal.auxiliary.move.info')}

    {getMessage('length')}

    - + setVerticalSize(e.target.value)} />
    mm
    @@ -53,7 +78,7 @@ export default function AuxiliaryMove(props) {
    - + setHorizonSize(e.target.value)} />
    mm
    @@ -77,7 +102,9 @@ export default function AuxiliaryMove(props) {
    - +
    diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 1a0d87bd..30e3982e 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -15,14 +15,12 @@ import { outerLineLength2State, outerLineTypeState, } from '@/store/outerLineAtom' -import { calculateIntersection, distanceBetweenPoints, findClosestPoint, isPointOnLine, polygonToTurfPolygon } from '@/util/canvas-util' +import { calculateIntersection, distanceBetweenPoints, findClosestPoint, isPointOnLine } from '@/util/canvas-util' import { fabric } from 'fabric' import { useAdsorptionPoint } from '@/hooks/useAdsorptionPoint' import { useSwal } from '@/hooks/useSwal' -import { booleanPointInPolygon } from '@turf/turf' import { usePopup } from '@/hooks/usePopup' import { calculateAngle, isSamePoint } from '@/util/qpolygon-utils' -import { QPolygon } from '@/components/fabric/QPolygon' import { POLYGON_TYPE } from '@/common/common' // 보조선 작성 @@ -122,6 +120,38 @@ export function useAuxiliaryDrawing(id) { setOuterLineDiagonalLength(0) } + const move = (object, x, y) => { + const line = copy(object, x, y) + canvas.remove(object) + canvas.setActiveObject(line) + } + + const copy = (object, x, y) => { + return addLine([object.x1 + x, object.y1 + y, object.x2 + x, object.y2 + y], { + stroke: 'red', + strokeWidth: 1, + selectable: true, + name: 'auxiliaryLine', + }) + } + + const addBisectorLine = (target) => { + const slope = (target.y2 - target.y1) / (target.x2 - target.x1) + const bisectorSlope = -1 / slope + const length = target.length + const dx = length / Math.sqrt(1 + bisectorSlope * bisectorSlope) + const dy = bisectorSlope * dx + const endX = (target.x1 + target.x2) / 2 + const endY = (target.y1 + target.y2) / 2 + + addLine([dx, dy, endX, endY], { + stroke: 'red', + strokeWidth: 1, + selectable: true, + name: 'auxiliaryLine', + }) + } + const keydown = { outerLine: (e) => { if (mousePointerArr.current.length === 0) { @@ -130,7 +160,7 @@ export function useAuxiliaryDrawing(id) { // 포커스가 length1에 있지 않으면 length1에 포커스를 줌 const activeElem = document.activeElement if (activeElem !== length1Ref.current) { - length1Ref.current.focus() + length1Ref?.current?.focus() } const key = e.key @@ -180,7 +210,7 @@ export function useAuxiliaryDrawing(id) { const activeElem = document.activeElement if (activeElem !== length1Ref.current && activeElem !== length2Ref.current) { - length1Ref.current.focus() + length1Ref?.current?.focus() } switch (key) { @@ -871,5 +901,8 @@ export function useAuxiliaryDrawing(id) { handleRollback, buttonAct, setButtonAct, + move, + copy, + addBisectorLine, } } diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 8e7028d4..1f5f59cb 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -1,8 +1,7 @@ import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' -import { currentMenuState, currentObjectState } from '@/store/canvasAtom' +import { canvasState, currentMenuState, currentObjectState } from '@/store/canvasAtom' import { useEffect, useState } from 'react' import { MENU } from '@/common/common' -import AuxiliaryMove from '@/components/floor-plan/modal/auxiliary/AuxiliaryMove' import AuxiliarySize from '@/components/floor-plan/modal/auxiliary/AuxiliarySize' import { usePopup } from '@/hooks/usePopup' import { v4 as uuidv4 } from 'uuid' @@ -11,7 +10,7 @@ import GridCopy from '@/components/floor-plan/modal/grid/GridCopy' import ColorPickerModal from '@/components/common/color-picker/ColorPickerModal' import { gridColorState } from '@/store/gridAtom' import { contextPopupPositionState, contextPopupState } from '@/store/popupAtom' -import AuxiliaryCopy from '@/components/floor-plan/modal/auxiliary/AuxiliaryCopy' +import AuxiliaryEdit from '@/components/floor-plan/modal/auxiliary/AuxiliaryEdit' import SizeSetting from '@/components/floor-plan/modal/object/SizeSetting' import RoofMaterialSetting from '@/components/floor-plan/modal/object/RoofMaterialSetting' import DormerOffset from '@/components/floor-plan/modal/object/DormerOffset' @@ -34,8 +33,10 @@ import CircuitNumberEdit from '@/components/floor-plan/modal/module/CircuitNumbe import { useObjectBatch } from '@/hooks/object/useObjectBatch' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' import { fontSelector, globalFontAtom } from '@/store/fontAtom' +import { useLine } from '@/hooks/useLine' export function useContextMenu() { + const canvas = useRecoilValue(canvasState) const currentMenu = useRecoilValue(currentMenuState) // 현재 메뉴 const setContextPopupPosition = useSetRecoilState(contextPopupPositionState) // 현재 메뉴 const [contextMenu, setContextMenu] = useRecoilState(contextMenuListState) // 메뉴.object 별 context menu @@ -53,6 +54,7 @@ export function useContextMenu() { const { moveObjectBatch } = useObjectBatch({}) const { moveSurfaceShapeBatch } = useSurfaceShapeBatch() const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) + const { addLine, removeLine } = useLine() const commonTextFont = useRecoilValue(fontSelector('commonText')) const currentMenuSetting = () => { @@ -130,22 +132,57 @@ export function useContextMenu() { id: 'auxiliaryMove', name: `${getMessage('contextmenu.auxiliary.move')}(M)`, shortcut: ['m', 'M'], - component: , + component: , }, { id: 'auxiliaryCopy', name: `${getMessage('contextmenu.auxiliary.copy')}(C)`, shortcut: ['c', 'C'], - component: , + component: , }, { id: 'auxiliaryRemove', shortcut: ['d', 'D'], name: `${getMessage('contextmenu.auxiliary.remove')}(D)`, + fn: () => { + canvas.remove(currentObject) + canvas.discardActiveObject() + }, }, { id: 'auxiliaryVerticalBisector', name: getMessage('contextmenu.auxiliary.vertical.bisector'), + fn: () => { + const slope = (currentObject.y2 - currentObject.y1) / (currentObject.x2 - currentObject.x1) + const length = currentObject.length + + let startX, startY, endX, endY + if (slope === 0) { + startX = endX = (currentObject.x1 + currentObject.x2) / 2 + startY = currentObject.y2 - length / 2 + endY = currentObject.y2 + length / 2 + } else if (slope === Infinity) { + startX = currentObject.x1 - length / 2 + startY = endY = (currentObject.y1 + currentObject.y2) / 2 + endX = currentObject.x1 + length / 2 + } else { + const bisectorSlope = -1 / slope + const dx = length / 2 / Math.sqrt(1 + bisectorSlope * bisectorSlope) + const dy = bisectorSlope * dx + + startX = (currentObject.x1 + currentObject.x2) / 2 + dx + startY = (currentObject.y1 + currentObject.y2) / 2 + dy + endX = (currentObject.x1 + currentObject.x2) / 2 - dx + endY = (currentObject.y1 + currentObject.y2) / 2 - dy + } + + addLine([startX, startY, endX, endY], { + stroke: 'red', + strokeWidth: 1, + selectable: true, + name: 'auxiliaryLine', + }) + }, }, { id: 'auxiliaryCut', @@ -472,6 +509,7 @@ export function useContextMenu() { { id: 'removeAll', name: getMessage('contextmenu.remove.all'), + fn: () => {}, }, ], ]) From d39f55c3666d8e9a4e2009c3f9dda4a65ab5164a Mon Sep 17 00:00:00 2001 From: leeyongjae Date: Wed, 20 Nov 2024 16:14:03 +0900 Subject: [PATCH 109/200] =?UTF-8?q?=EB=B0=9C=EC=A0=84=EC=8B=9C=EB=AC=BC?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=B0=A8=ED=8A=B8=20list=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/simulator/Simulator.jsx | 62 ++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/src/components/simulator/Simulator.jsx b/src/components/simulator/Simulator.jsx index f3a26ede..90687c1b 100644 --- a/src/components/simulator/Simulator.jsx +++ b/src/components/simulator/Simulator.jsx @@ -41,6 +41,7 @@ export default function Simulator() { // 차트 관련 const [chartData, setChartData] = useState([]) + const data = { labels: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], datasets: [ @@ -118,13 +119,30 @@ export default function Simulator() { // 파워컨디셔너 조회 const [pcsInfoList, setPcsInfoList] = useState([]) + // 타입별 list 조회 + const [hatsudenryouAll, setHatsudenryouAll] = useState([]) + const [hatsudenryouAllSnow, setHatsudenryouAllSnow] = useState([]) + const [hatsudenryouPeakcutAll, setHatsudenryouPeakcutAll] = useState([]) + const [hatsudenryouPeakcutAllSnow, setHatsudenryouPeakcutAllSnow] = useState([]) + const fetchObjectDetail = async (objectNo) => { const apiUrl = `/api/pwrGnrSimulation/calculations?objectNo=${objectNo}&planNo=${plan?.id}` + const resultData = await get({ url: apiUrl }) if (resultData) { setObjectDetail(resultData) - if (resultData.frcPwrGnrList) { - setChartData(resultData.frcPwrGnrList) + if (resultData.hatsudenryouAll) { + setHatsudenryouAll(resultData.hatsudenryouAll) + } + if (resultData.hatsudenryouAllSnow) { + setHatsudenryouAllSnow(resultData.hatsudenryouAllSnow) + } + if (resultData.hatsudenryouPeakcutAll) { + setHatsudenryouPeakcutAll(resultData.hatsudenryouPeakcutAll) + } + if (resultData.hatsudenryouPeakcutAllSnow) { + setHatsudenryouPeakcutAllSnow(resultData.hatsudenryouPeakcutAllSnow) + setChartData(resultData.hatsudenryouPeakcutAllSnow) } if (resultData.pcsList) { setPcsInfoList(resultData.pcsList) @@ -148,6 +166,26 @@ export default function Simulator() { }) } + // 차트 데이터 변경 시, list type 셋팅 + const [pwrGnrSimType, setPwrGnrSimType] = useState('D') + const handleChartChangeData = (type) => { + setPwrGnrSimType(type) + switch (type) { + case 'A': + setChartData(hatsudenryouAll) + break + case 'B': + setChartData(hatsudenryouAllSnow) + break + case 'C': + setChartData(hatsudenryouPeakcutAll) + break + case 'D': + setChartData(hatsudenryouPeakcutAllSnow) + break + } + } + return (
    @@ -176,7 +214,7 @@ export default function Simulator() { {/* 연간예측발전량 */}
    {getMessage('simulator.title.sub4')}
    -
    {objectDetail.anlFrcsGnrt ? convertNumberToPriceDecimal(objectDetail.anlFrcsGnrt) : ''}
    +
    {chartData[chartData.length - 1]}
    @@ -208,6 +246,22 @@ export default function Simulator() {
    + {/* chart */} +
    + +
    @@ -239,7 +293,7 @@ export default function Simulator() { {chartData.length > 0 ? ( {chartData.map((data) => ( - {convertNumberToPriceDecimal(data)} + {data} ))} ) : ( From 97354fea771be6f8d2d89fdde87b72254bbb94f8 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Wed, 20 Nov 2024 16:40:01 +0900 Subject: [PATCH 110/200] feat: add estimateState context --- src/app/floor-plan/FloorPlanProvider.js | 26 +++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/app/floor-plan/FloorPlanProvider.js b/src/app/floor-plan/FloorPlanProvider.js index 31ee1bd2..a02a9c1c 100644 --- a/src/app/floor-plan/FloorPlanProvider.js +++ b/src/app/floor-plan/FloorPlanProvider.js @@ -2,7 +2,25 @@ // import { ErrorBoundary } from 'next/dist/client/components/error-boundary' // import ServerError from '../error' -import { createContext, useEffect, useState } from 'react' +import { createContext, useEffect, useReducer, useState } from 'react' + +const reducer = (prevState, nextState) => { + return { ...prevState, ...nextState } +} + +const defaultEstimateData = { + estimateDate: new Date(), //견적일 + charger: '', //담당자 + objectName: '', //안건명 + objectNameOmit: '', //경칭코드 + estimateType: '', //주문분류 + remarks: '', //비고 + estimateOption: '', //견적특이사항 + itemList: [], + fileList: [], + fileFlg: '0', //후일 자료 제출 (체크 1 노체크 0) + priceCd: '', +} export const FloorPlanContext = createContext({ floorPlanState: {}, @@ -17,11 +35,15 @@ const FloorPlanProvider = ({ children }) => { toggleRotate: false, }) + const [estimateState, setEstimateState] = useReducer(reducer, defaultEstimateData) + useEffect(() => { console.log('🚀 ~ floorPlanState:', floorPlanState) }, [floorPlanState]) - return {children} + return ( + {children} + ) } export default FloorPlanProvider From 478b82f817a39af880be4af33a506048890d6efe Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Wed, 20 Nov 2024 16:41:14 +0900 Subject: [PATCH 111/200] fix: estimateState export --- src/app/floor-plan/FloorPlanProvider.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/floor-plan/FloorPlanProvider.js b/src/app/floor-plan/FloorPlanProvider.js index a02a9c1c..463b5ad4 100644 --- a/src/app/floor-plan/FloorPlanProvider.js +++ b/src/app/floor-plan/FloorPlanProvider.js @@ -25,6 +25,8 @@ const defaultEstimateData = { export const FloorPlanContext = createContext({ floorPlanState: {}, setFloorPlanState: () => {}, + estimateState: {}, + setEstimateState: () => {}, }) const FloorPlanProvider = ({ children }) => { From be137225c33cf3e2b90be49819cef2b219558435 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Wed, 20 Nov 2024 16:45:44 +0900 Subject: [PATCH 112/200] fix: modify variable name --- src/hooks/floorPlan/estimate/useEstimateController.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 19dbac5e..c9bfa59c 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -7,6 +7,7 @@ import { isObjectNotEmpty } from '@/util/common-utils' import { SessionContext } from '@/app/SessionProvider' import { useMessage } from '@/hooks/useMessage' import { useRouter } from 'next/navigation' +import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' const reducer = (prevState, nextState) => { return { ...prevState, ...nextState } @@ -46,7 +47,8 @@ export const useEstimateController = (planNo) => { const { promiseGet, get, post, promisePost } = useAxios(globalLocaleState) const [isLoading, setIsLoading] = useState(false) - const [state, setState] = useReducer(reducer, defaultEstimateData) + // const [state, setState] = useReducer(reducer, defaultEstimateData) + const { estimateContextState, setEstimateContextState } = useContext(FloorPlanContext) const [newState, setNewState] = useState({}) useEffect(() => { From 137c2685615b46cac2c393b7cef22808a9a3471b Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Wed, 20 Nov 2024 16:46:12 +0900 Subject: [PATCH 113/200] fix: modify variable name --- src/app/floor-plan/FloorPlanProvider.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/floor-plan/FloorPlanProvider.js b/src/app/floor-plan/FloorPlanProvider.js index 463b5ad4..fb6e6460 100644 --- a/src/app/floor-plan/FloorPlanProvider.js +++ b/src/app/floor-plan/FloorPlanProvider.js @@ -25,8 +25,8 @@ const defaultEstimateData = { export const FloorPlanContext = createContext({ floorPlanState: {}, setFloorPlanState: () => {}, - estimateState: {}, - setEstimateState: () => {}, + estimateContextState: {}, + setEstimateContextState: () => {}, }) const FloorPlanProvider = ({ children }) => { @@ -37,14 +37,16 @@ const FloorPlanProvider = ({ children }) => { toggleRotate: false, }) - const [estimateState, setEstimateState] = useReducer(reducer, defaultEstimateData) + const [estimateContextState, setEstimateContextState] = useReducer(reducer, defaultEstimateData) useEffect(() => { console.log('🚀 ~ floorPlanState:', floorPlanState) }, [floorPlanState]) return ( - {children} + + {children} + ) } From ca2864d2bfdcae3b48f4317185f369795bf384c2 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Wed, 20 Nov 2024 16:46:55 +0900 Subject: [PATCH 114/200] =?UTF-8?q?fix:=EC=86=8C=EC=8A=A4=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9B=90=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index c9bfa59c..de5fe873 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -47,8 +47,7 @@ export const useEstimateController = (planNo) => { const { promiseGet, get, post, promisePost } = useAxios(globalLocaleState) const [isLoading, setIsLoading] = useState(false) - // const [state, setState] = useReducer(reducer, defaultEstimateData) - const { estimateContextState, setEstimateContextState } = useContext(FloorPlanContext) + const [state, setState] = useReducer(reducer, defaultEstimateData) const [newState, setNewState] = useState({}) useEffect(() => { From 83476af5f396d688f471e9b189f28666d5c029d5 Mon Sep 17 00:00:00 2001 From: leeyongjae Date: Wed, 20 Nov 2024 16:48:33 +0900 Subject: [PATCH 115/200] =?UTF-8?q?=EC=9E=84=EC=8B=9C=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=9C=EA=B1=B0,=20api=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/auth/Login.jsx | 97 +++++++++-------------------------- 1 file changed, 25 insertions(+), 72 deletions(-) diff --git a/src/components/auth/Login.jsx b/src/components/auth/Login.jsx index 6060b308..af50a515 100644 --- a/src/components/auth/Login.jsx +++ b/src/components/auth/Login.jsx @@ -80,79 +80,32 @@ export default function Login() { e.preventDefault() const formData = new FormData(e.target) - /////////////////////////////////////////////////////////// - // 임시 로그인 처리 - setSession({ - userId: 'an1', - saleStoreId: null, - name: null, - mail: null, - tel: null, - storeId: 'X42', - userNm: 'ㅇㅇ6610', - userNmKana: '신규사용자 16610', - category: '인상6610', - telNo: '336610', - fax: null, - email: 't10t@naver.com', - pwdInitYn: 'Y', - storeLvl: '1', - groupId: '60000', - custCd: '100000', - }) - setSessionState({ - userId: 'an1', - saleStoreId: null, - name: null, - mail: null, - tel: null, - storeId: 'X42', - userNm: 'ㅇㅇ6610', - userNmKana: '신규사용자 16610', - category: '인상6610', - telNo: '336610', - fax: null, - email: 't10t@naver.com', - pwdInitYn: 'Y', - storeLvl: '1', - groupId: '60000', - custCd: '100000', - }) - if (chkLoginId) { - Cookies.set('chkLoginId', formData.get('id'), { expires: 7 }) - } else { - Cookies.remove('chkLoginId') + // 로그인 처리 시작 + const param = { + loginId: formData.get('id'), + pwd: formData.get('password'), } - router.push('/') - // 임시 로그인 처리 끝 - /////////////////////////////////////////////////////////// - - // 로그인 처리 시작 - ** 상단 임시 로그인 추후 삭제 필요 ** - // const param = { - // loginId: formData.get('id'), - // pwd: formData.get('password'), - // } - // await promisePost({ url: '/api/login/v1.0/login', data: param }) - // .then((res) => { - // if (res) { - // if (res.data.result.resultCode === 'S') { - // setSession(res.data.data) - // setSessionState(res.data.data) - // // ID SAVE 체크되어 있는 경우, 쿠키 저장 - // if (chkLoginId) { - // Cookies.set('chkLoginId', formData.get('id'), { expires: 7 }) - // } else { - // Cookies.remove('chkLoginId') - // } - // router.push('/') - // } else { - // alert(res.data.result.resultMsg) - // } - // } - // }) - // .catch((error) => { - // alert(error.response.data.message) - // }) + await promisePost({ url: '/api/login/v1.0/login', data: param }) + .then((res) => { + if (res) { + if (res.data.result.resultCode === 'S') { + setSession(res.data.data) + setSessionState(res.data.data) + // ID SAVE 체크되어 있는 경우, 쿠키 저장 + if (chkLoginId) { + Cookies.set('chkLoginId', formData.get('id'), { expires: 7 }) + } else { + Cookies.remove('chkLoginId') + } + router.push('/') + } else { + alert(res.data.result.resultMsg) + } + } + }) + .catch((error) => { + alert(error.response.data.message) + }) } // 비밀번호 초기화 관련 From 943c7fd4b2ce17155dbb47c11b8e8a887bc4e02d Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Wed, 20 Nov 2024 17:02:06 +0900 Subject: [PATCH 116/200] =?UTF-8?q?=EB=85=B8=EC=B6=9C=ED=95=98=EB=A9=B4,?= =?UTF-8?q?=20=EC=83=81=EB=A9=B4,=20=EC=A0=91=EB=A9=B4=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useModuleBasicSetting.js | 103 ++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index 9ddf86c4..94da1755 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -47,6 +47,8 @@ export function useModuleBasicSetting() { flowDirection: roof.direction, }) + setupSurface.setViewLengthText(false) + canvas.add(setupSurface) //지붕면 선택 금지 roof.set({ @@ -559,6 +561,7 @@ export function useModuleBasicSetting() { opacity: 0.8, parentId: moduleSetupSurface.parentId, }) + tempModule.setViewLengthText(false) canvas?.add(tempModule) moduleSetupArray.push(tempModule) } @@ -625,6 +628,106 @@ export function useModuleBasicSetting() { }) setModuleIsSetup(moduleSetupArray) + + console.log(calculateForApi(moduleSetupArray)) + } + + const calculateForApi = (moduleSetupArray) => { + const centerPoints = [] + moduleSetupArray.forEach((module, index) => { + module.tempIndex = index + const { x, y } = module.getCenterPoint() + const { width, height } = module + centerPoints.push({ x, y, width, height }) + const circle = new fabric.Circle({ + radius: 5, + fill: 'red', + name: 'redCircle', + left: x - 5, + top: y - 5, + index: index, + selectable: false, + }) + canvas.add(circle) + }) + + //완전 노출 하면 + let exposedBottom = 0 + // 반 노출 하면 + let exposedHalfBottom = 0 + // 완전 노출 상면 + let exposedTop = 0 + //반 노출 상면 + let exposedHalfTop = 0 + // 완전 접면 + let touchDimension = 0 + //반접면 + let halfTouchDimension = 0 + + // 노출하면 체크 + centerPoints.forEach((centerPoint, index) => { + const { x, y, width, height } = centerPoint + // centerPoints중에 현재 centerPoint와 x값이 같고, y값이 y-height값과 같은 centerPoint가 있는지 확인 + const bottomCell = centerPoints.filter((centerPoint) => centerPoint.x === x && Math.abs(centerPoint.y - (y + height)) < 2) + if (bottomCell.length === 1) { + touchDimension++ + return + } + + // 바로 아래에 셀이 없는 경우 물떼세 배치가 왼쪽 되어있는 셀을 찾는다. + const leftBottomCnt = centerPoints.filter( + (centerPoint) => Math.abs(centerPoint.x - (x - width / 2)) < 2 && Math.abs(centerPoint.y - (y + height)) < 2, + ).length + const rightBottomCnt = centerPoints.filter( + (centerPoint) => Math.abs(centerPoint.x - (x + width / 2)) < 2 && Math.abs(centerPoint.y - (y + height)) < 2, + ).length + if (leftBottomCnt + rightBottomCnt === 2) { + touchDimension++ + return + } + if (leftBottomCnt + rightBottomCnt === 1) { + halfTouchDimension++ + exposedHalfBottom++ + return + } + if (leftBottomCnt + rightBottomCnt === 0) { + exposedBottom++ + return + } + }) + // 노출상면 체크 + + centerPoints.forEach((centerPoint, index) => { + const { x, y, width, height } = centerPoint + const topCell = centerPoints.filter((centerPoint) => centerPoint.x === x && Math.abs(centerPoint.y - (y - height)) < 2) + if (topCell.length === 1) { + return + } + + const leftTopCnt = centerPoints.filter( + (centerPoint) => Math.abs(centerPoint.x - (x - width) < 2) && Math.abs(centerPoint.y - (y - height)) < 2, + ).length + const rightTopCnt = centerPoints.filter( + (centerPoint) => Math.abs(centerPoint.x - (x + width / 2) < 2) && Math.abs(centerPoint.y - (y - height)) < 2, + ).length + + if (leftTopCnt + rightTopCnt === 1) { + exposedHalfTop++ + return + } + if (leftTopCnt + rightTopCnt === 0) { + exposedTop++ + return + } + }) + return { + exposedBottom, + exposedHalfBottom, + exposedTop, + exposedHalfTop, + touchDimension, + halfTouchDimension, + } } const coordToTurfPolygon = (points) => { From 38f70437c695f71bcfbd15b418ed197ff29f9683 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 20 Nov 2024 17:09:59 +0900 Subject: [PATCH 117/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 210 ++++++++---------- .../estimate/useEstimateController.js | 47 ++-- src/locales/ja.json | 2 + src/locales/ko.json | 2 + 4 files changed, 111 insertions(+), 150 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 7eb23fa5..e506b6a2 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -58,7 +58,7 @@ export default function Estimate({ params }) { const objectRecoil = useRecoilValue(floorPlanObjectState) //견적서 상세데이터 - const { state, setState, addItem, handleEstimateFileDownload } = useEstimateController(params.pid) + const { estimateContextState, setEstimateContextState, addItem, handleEstimateFileDownload } = useEstimateController(params.pid) //견적특이사항 List const [specialNoteList, setSpecialNoteList] = useState([]) @@ -105,9 +105,9 @@ export default function Estimate({ params }) { let url = `/api/estimate/special-note-list` get({ url: url }).then((res) => { if (isNotEmptyArray(res)) { - if (state?.estimateOption) { + if (estimateContextState?.estimateOption) { res.map((row) => { - let estimateOption = state?.estimateOption?.split('、') + let estimateOption = estimateContextState?.estimateOption?.split('、') row.text = false estimateOption.map((row2) => { if (row2 === row.code) { @@ -119,16 +119,16 @@ export default function Estimate({ params }) { } } }) - }, [state?.estimateOption]) + }, [estimateContextState?.estimateOption]) //견적일 set useEffect(() => { let estimateDate = dayjs(startDate).format('YYYY-MM-DD') - setState({ estimateDate: estimateDate }) + setEstimateContextState({ estimateDate: estimateDate }) }, [startDate]) useEffect(() => { - //선택된 견적특이사항 setState + //선택된 견적특이사항 setEstimateContextState if (isNotEmptyArray(specialNoteList)) { const liveCheckedData = specialNoteList.filter((row) => row.text === true) @@ -138,7 +138,7 @@ export default function Estimate({ params }) { } const newData = data.join('、') - setState({ estimateOption: newData }) + setEstimateContextState({ estimateOption: newData }) } }, [specialNoteList]) @@ -148,23 +148,23 @@ export default function Estimate({ params }) { event.stopPropagation() } - // 추가한 첨부파일 state에 넣기 + // 추가한 첨부파일 estimateContextState에 넣기 useEffect(() => { if (isNotEmptyArray(files)) { files.map((row) => { - setState({ fileList: row.data }) + setEstimateContextState({ fileList: row.data }) }) } else { - setState({ fileList: [] }) + setEstimateContextState({ fileList: [] }) } }, [files]) //상세에서 내려온 첨부파일 set 만들기 useEffect(() => { - if (isNotEmptyArray(state.fileList)) { - setOriginFiles(state.fileList) + if (isNotEmptyArray(estimateContextState.fileList)) { + setOriginFiles(estimateContextState.fileList) } - }, [state?.fileList]) + }, [estimateContextState?.fileList]) // 기존첨부파일 삭제 const deleteOriginFile = async (objectNo, no) => { @@ -176,7 +176,7 @@ export default function Estimate({ params }) { await promisePost({ url: 'api/file/fileDelete', data: delParams }).then((res) => { if (res.status === 204) { setOriginFiles(originFiles.filter((file) => file.objectNo === objectNo && file.no !== no)) - setState({ + setEstimateContextState({ fileList: originFiles.filter((file) => file.objectNo === objectNo && file.no !== no), }) } @@ -185,11 +185,11 @@ export default function Estimate({ params }) { //가격표시 option 목록 최초세팅 && 주문분류 변경시 useEffect(() => { - if (state.estimateType !== '') { + if (estimateContextState.estimateType !== '') { const param = { saleStoreId: session.storeId, sapSalesStoreCd: session.custCd, - docTpCd: state?.estimateType, + docTpCd: estimateContextState?.estimateType, } const apiUrl = `/api/estimate/price/store-price-list?${queryStringFormatter(param)}` @@ -201,13 +201,13 @@ export default function Estimate({ params }) { setItemChangeYn(true) } - }, [state?.estimateType]) + }, [estimateContextState?.estimateType]) useEffect(() => { - if (state?.priceCd) { - setShowPriceCd(state.priceCd) + if (estimateContextState?.priceCd) { + setShowPriceCd(estimateContextState.priceCd) } - }, [state?.priceCd]) + }, [estimateContextState?.priceCd]) //가격 표시 option 변경 이벤트 const onChangeStorePriceList = (priceCd) => { @@ -217,7 +217,7 @@ export default function Estimate({ params }) { docTpCd: priceCd, } - //프라이싱 했을때 priceCd setState + //프라이싱 했을때 priceCd setEstimateContextState //화면에 보여지는 값은 showPriceCd로 관리 setShowPriceCd(priceCd) @@ -234,10 +234,10 @@ export default function Estimate({ params }) { const param = { saleStoreId: session.storeId, sapSalesStoreCd: session.custCd, - docTpCd: state.estimateType, + docTpCd: estimateContextState.estimateType, priceCd: showPriceCd, - //itemIdList: state.itemList, //아이템 최초정보로 호출 delFlg 0인거만.. - itemIdList: state.itemList.filter((item) => item.delFlg === '0'), + //itemIdList: estimateContextState.itemList, //아이템 최초정보로 호출 delFlg 0인거만.. + itemIdList: estimateContextState.itemList.filter((item) => item.delFlg === '0'), } if (param.itemIdList.length > 0) { @@ -264,7 +264,7 @@ export default function Estimate({ params }) { //itemId로 비교해서 단가정보만 업데이트 if (data.result.code === 200) { if (isNotEmptyArray(data.data2)) { - state.itemList.map((item) => { + estimateContextState.itemList.map((item) => { let checkYn = false data.data2.map((item2) => { if (item2.itemId === item.itemId) { @@ -278,7 +278,7 @@ export default function Estimate({ params }) { } }) - setState({ + setEstimateContextState({ priceCd: showPriceCd, itemList: updateList, }) @@ -305,7 +305,7 @@ export default function Estimate({ params }) { //주택PKG input 변경 const onChangePkgAsp = (value) => { - if (state.estimateType === 'YJSS') { + if (estimateContextState.estimateType === 'YJSS') { let pkgAsp = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(pkgAsp)) { pkgAsp = 0 @@ -314,10 +314,10 @@ export default function Estimate({ params }) { } //현재 PKG용량값 가져오기 - let totVolKw = state.totVolKw * 1000 + let totVolKw = estimateContextState.totVolKw * 1000 let pkgTotPrice = pkgAsp * totVolKw - setState({ + setEstimateContextState({ pkgAsp: pkgAsp, pkgTotPrice: pkgTotPrice.toFixed(3), }) @@ -339,9 +339,9 @@ export default function Estimate({ params }) { updates.amount = amount updates.itemChangeFlg = '1' updates.partAdd = '0' - updates.saleTotPrice = (Number(amount.replaceAll(',', '')) * state.itemList[index].salePrice.replaceAll(',', '')).toLocaleString() + updates.saleTotPrice = (Number(amount.replaceAll(',', '')) * estimateContextState.itemList[index].salePrice.replaceAll(',', '')).toLocaleString() - updateList = state.itemList.map((item) => { + updateList = estimateContextState.itemList.map((item) => { if (item.dispOrder === dispOrder) { return { ...item, ...updates } } else { @@ -349,7 +349,7 @@ export default function Estimate({ params }) { } }) - setState({ + setEstimateContextState({ itemList: updateList, }) @@ -368,9 +368,9 @@ export default function Estimate({ params }) { let updateList = [] let updates = {} updates.salePrice = salePrice - updates.saleTotPrice = (Number(salePrice.replaceAll(',', '')) * state.itemList[index].amount.replaceAll(',', '')).toLocaleString() + updates.saleTotPrice = (Number(salePrice.replaceAll(',', '')) * estimateContextState.itemList[index].amount.replaceAll(',', '')).toLocaleString() - updateList = state.itemList.map((item) => { + updateList = estimateContextState.itemList.map((item) => { if (item.dispOrder === dispOrder) { return { ...item, ...updates } } else { @@ -378,7 +378,7 @@ export default function Estimate({ params }) { } }) - setState({ + setEstimateContextState({ itemList: updateList, }) @@ -414,12 +414,12 @@ export default function Estimate({ params }) { updates.specialNoteCd = res.spnAttrCds updates.itemGroup = res.itemGroup updates.delFlg = '0' // 삭제플래그 0 - // updates.saleTotPrice = res.salePrice * state.itemList[index].amount + // updates.saleTotPrice = res.salePrice * estimateContextState.itemList[index].amount updates.saleTotPrice = '0' //추가때는 수량을 안받아서 합계를 무조건 0으로 //104671 let bomList = res.itemBomList - updateList = state.itemList.map((item) => { + updateList = estimateContextState.itemList.map((item) => { if (item.dispOrder === dispOrder) { return { ...item, ...updates } } else if (item.paDispOrder === dispOrder) { @@ -431,18 +431,18 @@ export default function Estimate({ params }) { //paDispOrder if (bomList) { bomList.map((bomItem, index) => { - let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + let newItemDispOrder = Math.max(...estimateContextState.itemList.map((item) => item.dispOrder)) bomItem.dispOrder = index + 1 + newItemDispOrder bomItem.delFlg = '0' bomItem.objectNo = objectNo bomItem.planNo = planNo }) - setState({ + setEstimateContextState({ itemList: [...updateList, ...bomList], }) } else { - setState({ + setEstimateContextState({ itemList: updateList, }) } @@ -455,7 +455,7 @@ export default function Estimate({ params }) { const removeItem = () => { const array = [...selection] let delList = [] - state.itemList.filter((row) => { + estimateContextState.itemList.filter((row) => { array.map((row2) => { if (row2 === row.dispOrder) { delList.push({ ...row }) @@ -466,7 +466,7 @@ export default function Estimate({ params }) { }) }) - const updateList = state.itemList.map((item) => { + const updateList = estimateContextState.itemList.map((item) => { const isDeleted = delList.some((row) => item.delFlg === '1' || item.dispOrder === row.dispOrder) return { ...item, @@ -485,7 +485,7 @@ export default function Estimate({ params }) { return alert(getMessage('estimate.detail.save.requiredItem')) } - setState({ + setEstimateContextState({ itemList: updateList, }) @@ -501,8 +501,8 @@ export default function Estimate({ params }) { let vatPrice = 0 let totPrice = 0 let addPkgPrice = 0 - if (state.estimateType === 'YJOD') { - state.itemList.map((item) => { + if (estimateContextState.estimateType === 'YJOD') { + estimateContextState.itemList.map((item) => { if (item.delFlg === '0') { const amount = Number(item.amount.replace(/[^0-9]/g, '').replaceAll(',', '')) const price = Number(item.saleTotPrice.replaceAll(',', '')) @@ -521,7 +521,7 @@ export default function Estimate({ params }) { vatPrice = supplyPrice * 0.1 totPrice = supplyPrice + vatPrice - setState({ + setEstimateContextState({ totAmount: totAmount, totVolKw: totVolKw.toFixed(3), supplyPrice: supplyPrice.toFixed(3), @@ -530,7 +530,7 @@ export default function Estimate({ params }) { }) } else { //YJSS - state.itemList.map((item) => { + estimateContextState.itemList.map((item) => { if (item.delFlg === '0') { const amount = Number(item.amount.replace(/[^0-9]/g, '').replaceAll(',', '')) const price = Number(item.saleTotPrice.replaceAll(',', '')) @@ -556,7 +556,7 @@ export default function Estimate({ params }) { vatPrice = supplyPrice * 0.1 totPrice = supplyPrice + vatPrice - setState({ + setEstimateContextState({ totAmount: totAmount, totVolKw: totVolKw.toFixed(3), supplyPrice: supplyPrice.toFixed(3), @@ -567,21 +567,22 @@ export default function Estimate({ params }) { setItemChangeYn(false) } - }, [itemChangeYn, state.itemList]) + }, [itemChangeYn, estimateContextState.itemList]) //안건명 인풋 변경 const handleBlurObjectName = (e) => { - setState({ objectName: e.target.value }) + setEstimateContextState({ objectName: e.target.value }) } //담당자 인풋 변경 const handleBlurCharger = (e) => { - setState({ charger: e.target.value }) + setEstimateContextState({ charger: e.target.value }) } - useEffect(() => { - console.log('수정날짜시간???????????', state.lastEditDatetime) - }, [state]) + //비고 인풋 변경 + const handleBlurRemarks = (e) => { + setEstimateContextState({ remarks: e.target.value }) + } return (
    @@ -598,18 +599,21 @@ export default function Estimate({ params }) {
    {getMessage('estimate.detail.docNo')}
    -
    {state.docNo}
    +
    {estimateContextState.docNo}
    {getMessage('estimate.detail.drawingEstimateCreateDate')}
    - {state?.drawingEstimateCreateDate ? `${dayjs(state.drawingEstimateCreateDate).format('YYYY.MM.DD')}` : ''} + {estimateContextState?.drawingEstimateCreateDate + ? `${dayjs(estimateContextState.drawingEstimateCreateDate).format('YYYY.MM.DD')}` + : ''}
    {getMessage('estimate.detail.lastEditDatetime')}
    - {/*
    {state?.lastEditDatetime ? `${dayjs(state.lastEditDatetime).format('YYYY.MM.DD HH:mm')}` : ''}
    */} -
    {state?.lastEditDatetime ? `${dayjs(state?.lastEditDatetime).format('HH:mm:ss')}` : ''}
    +
    + {estimateContextState?.lastEditDatetime ? `${dayjs(estimateContextState.lastEditDatetime).format('YYYY.MM.DD HH:mm')}` : ''} +
    @@ -635,7 +639,7 @@ export default function Estimate({ params }) { {/* 1차 판매점명 */} {getMessage('estimate.detail.saleStoreId')} - {state?.firstSaleStoreName} + {estimateContextState?.firstSaleStoreName} {/* 견적일 */} {getMessage('estimate.detail.estimateDate')} * @@ -649,23 +653,14 @@ export default function Estimate({ params }) { {/* 2차 판매점명 */} {getMessage('estimate.detail.otherSaleStoreId')} - {state?.agencySaleStoreName} + {estimateContextState?.agencySaleStoreName} {/* 담당자 */} {getMessage('estimate.detail.receiveUser')} *
    - { - // //담당자 charger - // setState({ charger: e.target.value }) - // }} - onBlur={handleBlurCharger} - /> +
    @@ -677,16 +672,7 @@ export default function Estimate({ params }) {
    - { - // //안건명 objectName - // setState({ objectName: e.target.value }) - // }} - onBlur={handleBlurObjectName} - /> +
    { - setState({ estimateType: e.target.value }) + setEstimateContextState({ estimateType: e.target.value }) }} /> - +
    @@ -761,16 +747,16 @@ export default function Estimate({ params }) { {/* 지붕재・사양시공 최대4개*/} {getMessage('estimate.detail.roofCns')} - {state?.roofMaterialIdMulti?.split('、').map((row, index) => { + {estimateContextState?.roofMaterialIdMulti?.split('、').map((row, index) => { //지붕재 let roofList = row - let roofListLength = state?.roofMaterialIdMulti?.split('、').length + let roofListLength = estimateContextState?.roofMaterialIdMulti?.split('、').length let style = 'mb5' if (roofListLength == index + 1) { style = '' } //사양시공 - let constructSpecificationMulti = state?.constructSpecificationMulti?.split('、') + let constructSpecificationMulti = estimateContextState?.constructSpecificationMulti?.split('、') return ( <> @@ -792,15 +778,7 @@ export default function Estimate({ params }) { {getMessage('estimate.detail.remarks')}
    - { - //비고 - setState({ remarks: e.target.value }) - }} - /> +
    @@ -815,9 +793,9 @@ export default function Estimate({ params }) { { - setState({ + setEstimateContextState({ fileFlg: e.target.checked ? '1' : '0', }) }} @@ -959,28 +937,28 @@ export default function Estimate({ params }) {
    {getMessage('estimate.detail.sepcialEstimateProductInfo.totAmount')}
    -
    {convertNumberToPriceDecimal(state?.totAmount)}
    +
    {convertNumberToPriceDecimal(estimateContextState?.totAmount)}
    {getMessage('estimate.detail.sepcialEstimateProductInfo.totVolKw')}
    -
    {convertNumberToPriceDecimal(state?.totVolKw)}
    +
    {convertNumberToPriceDecimal(estimateContextState?.totVolKw)}
    {getMessage('estimate.detail.sepcialEstimateProductInfo.supplyPrice')}
    -
    {convertNumberToPriceDecimal(state?.supplyPrice)}
    +
    {convertNumberToPriceDecimal(estimateContextState?.supplyPrice)}
    {getMessage('estimate.detail.sepcialEstimateProductInfo.vatPrice')}
    -
    {convertNumberToPriceDecimal(state?.vatPrice)}
    +
    {convertNumberToPriceDecimal(estimateContextState?.vatPrice)}
    {getMessage('estimate.detail.sepcialEstimateProductInfo.totPrice')}
    -
    {convertNumberToPriceDecimal(state?.totPrice)}
    +
    {convertNumberToPriceDecimal(estimateContextState?.totPrice)}
    {/* YJOD면 아래영역 숨김 */} -
    +
    @@ -1001,7 +979,7 @@ export default function Estimate({ params }) { { onChangePkgAsp(e.target.value) }} @@ -1009,9 +987,9 @@ export default function Estimate({ params }) { - + - +
    {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgWeight')}{convertNumberToPriceDecimal(state?.totVolKw)}{convertNumberToPriceDecimal(estimateContextState?.totVolKw)} {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgPrice')}{convertNumberToPriceDecimal(state?.pkgTotPrice)}{convertNumberToPriceDecimal(estimateContextState?.pkgTotPrice)}
    @@ -1120,8 +1098,8 @@ export default function Estimate({ params }) { - {state?.itemList.length > 0 && - state.itemList.map((item, index) => { + {estimateContextState?.itemList.length > 0 && + estimateContextState.itemList.map((item, index) => { if (item.delFlg === '0') { return ( @@ -1209,7 +1187,7 @@ export default function Estimate({ params }) { className="input-light al-r" value={convertNumberToPriceDecimal(item?.salePrice.replaceAll(',', ''))} disabled={ - state?.estimateType === 'YJSS' + estimateContextState?.estimateType === 'YJSS' ? item?.paDispOrder ? true : item.pkgMaterialFlg !== '1' diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index de5fe873..01575518 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -9,27 +9,9 @@ import { useMessage } from '@/hooks/useMessage' import { useRouter } from 'next/navigation' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' -const reducer = (prevState, nextState) => { - return { ...prevState, ...nextState } -} - // Constants const ESTIMATE_API_ENDPOINT = '/api/estimate' // API 엔드포인트 정의 -const defaultEstimateData = { - estimateDate: new Date(), //견적일 - charger: '', //담당자 - objectName: '', //안건명 - objectNameOmit: '', //경칭코드 - estimateType: '', //주문분류 - remarks: '', //비고 - estimateOption: '', //견적특이사항 - itemList: [], - fileList: [], - fileFlg: '0', //후일 자료 제출 (체크 1 노체크 0) - priceCd: '', -} - // Helper functions const updateItemInList = (itemList, dispOrder, updates) => { return itemList.map((item) => (item.dispOrder === dispOrder ? { ...item, ...updates } : item)) @@ -44,11 +26,10 @@ export const useEstimateController = (planNo) => { const { getMessage } = useMessage() - const { promiseGet, get, post, promisePost } = useAxios(globalLocaleState) + const { promiseGet, post, promisePost } = useAxios(globalLocaleState) const [isLoading, setIsLoading] = useState(false) - const [state, setState] = useReducer(reducer, defaultEstimateData) - const [newState, setNewState] = useState({}) + const { estimateContextState, setEstimateContextState } = useContext(FloorPlanContext) useEffect(() => { if (planNo && !isLoading) { @@ -69,9 +50,7 @@ export const useEstimateController = (planNo) => { item.delFlg = '0' }) } - console.log('조회결과;', res.data) - console.log('수정시간;', res.data.lastEditDatetime) - setState(res.data) + setEstimateContextState(res.data) } } }) @@ -83,17 +62,17 @@ export const useEstimateController = (planNo) => { } const updateItem = (dispOrder, updates) => { - setState({ - itemList: updateItemInList(state.itemList, dispOrder, updates), + setEstimateContextState({ + itemList: updateItemInList(estimateContextState.itemList, dispOrder, updates), }) } const addItem = () => { - let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + let newItemDispOrder = Math.max(...estimateContextState.itemList.map((item) => item.dispOrder)) newItemDispOrder = (Math.floor(newItemDispOrder / 100) + 1) * 100 - setState({ + setEstimateContextState({ itemList: [ - ...state.itemList, + ...estimateContextState.itemList, { objectNo: objectRecoil.floorPlanObjectNo, planNo: planNo, @@ -115,8 +94,8 @@ export const useEstimateController = (planNo) => { } useEffect(() => { - setEstimateData({ ...state, userId: session.userId, sapSalesStoreCd: session.custCd }) - }, [state]) + setEstimateData({ ...estimateContextState, userId: session.userId, sapSalesStoreCd: session.custCd }) + }, [estimateContextState]) // 첨부파일 다운로드 const handleEstimateFileDownload = async (originFile) => { @@ -206,7 +185,7 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredItem')) } - // console.log('최종 정보::;', estimateData) + console.log('최종 정보::;', estimateData) //2. 상세데이터 저장 // return @@ -256,8 +235,8 @@ export const useEstimateController = (planNo) => { } return { - state, - setState, + estimateContextState, + setEstimateContextState, updateItem, addItem, handleEstimateSubmit, diff --git a/src/locales/ja.json b/src/locales/ja.json index 7bda9175..5bc848f6 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -823,6 +823,8 @@ "estimate.detail.objectName": "案件名", "estimate.detail.objectRemarks": "メモ", "estimate.detail.estimateType": "注文分類", + "estimate.detail.estimateType.yjss": "住宅PKG", + "estimate.detail.estimateType.yjod": "積上げ( YJOD )", "estimate.detail.roofCns": "屋根材・仕様施工", "estimate.detail.remarks": "備考", "estimate.detail.fileFlg": "後日資料提出", diff --git a/src/locales/ko.json b/src/locales/ko.json index 54f672a5..6e34ea40 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -833,6 +833,8 @@ "estimate.detail.objectName": "안건명", "estimate.detail.objectRemarks": "메모", "estimate.detail.estimateType": "주문분류", + "estimate.detail.estimateType.yjss": "住宅PKG", + "estimate.detail.estimateType.yjod": "積上げ( YJOD )", "estimate.detail.roofCns": "지붕재・사양시공", "estimate.detail.remarks": "비고", "estimate.detail.fileFlg": "후일자료제출", From a4785c4a51397de10c97d6ff9b7ee7471995b971 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 20 Nov 2024 17:58:12 +0900 Subject: [PATCH 118/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index e506b6a2..662b63ca 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -127,6 +127,11 @@ export default function Estimate({ params }) { setEstimateContextState({ estimateDate: estimateDate }) }, [startDate]) + //API데이터로 견적일 셋팅 + useEffect(() => { + setStartDate(estimateContextState?.estimateDate) + }, [estimateContextState?.estimateDate]) + useEffect(() => { //선택된 견적특이사항 setEstimateContextState if (isNotEmptyArray(specialNoteList)) { From 76af0e208d5a1dfaedc71d554de1a64a77d41be3 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Thu, 21 Nov 2024 09:04:15 +0900 Subject: [PATCH 119/200] =?UTF-8?q?=EC=B9=98=EB=8F=84=EB=A6=AC=20=EB=B0=B0?= =?UTF-8?q?=EC=B9=98=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/basic/BasicSetting.jsx | 10 +- .../floor-plan/modal/basic/step/Placement.jsx | 31 +++- src/hooks/module/useModuleBasicSetting.js | 157 +++++++++++++----- src/hooks/surface/useSurfaceShapeBatch.js | 88 ++++++++-- src/hooks/useContextMenu.js | 2 - 5 files changed, 220 insertions(+), 68 deletions(-) diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 8eda4a09..20578b24 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -35,6 +35,12 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { } }, []) + const placementRef = { + isChidori: useRef('true'), + setupLocation: useRef(null), + isMaxSetup: useRef('false'), + } + return (
    @@ -55,7 +61,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { {tabNum === 1 && } {/*배치면 초기설정 - 입력방법: 복시도 입력 || 실측값 입력*/} {canvasSetting.roofSizeSet && canvasSetting.roofSizeSet != 3 && tabNum === 2 && } - {canvasSetting.roofSizeSet && canvasSetting.roofSizeSet != 3 && tabNum === 3 && } + {canvasSetting.roofSizeSet && canvasSetting.roofSizeSet != 3 && tabNum === 3 && } {/*배치면 초기설정 - 입력방법: 육지붕*/} {canvasSetting.roofSizeSet && canvasSetting.roofSizeSet == 3 && tabNum === 2 && } @@ -78,7 +84,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { - diff --git a/src/components/floor-plan/modal/basic/step/Placement.jsx b/src/components/floor-plan/modal/basic/step/Placement.jsx index 4771ab2a..8acaff70 100644 --- a/src/components/floor-plan/modal/basic/step/Placement.jsx +++ b/src/components/floor-plan/modal/basic/step/Placement.jsx @@ -1,7 +1,12 @@ import { useMessage } from '@/hooks/useMessage' +import { forwardRef, useState } from 'react' -export default function Placement() { +const Placement = forwardRef((props, refs) => { const { getMessage } = useMessage() + const [isChidori, setIsChidori] = useState('true') + + console.log(refs) + const moduleData = { header: [ { type: 'check', name: '', prop: 'check', width: 70 }, @@ -24,6 +29,12 @@ export default function Placement() { }, ], } + + const handleChangeChidori = (e) => { + setIsChidori(e.target.value) + refs.isChidori.current = e.target.value + } + return ( <>
    @@ -96,12 +107,20 @@ export default function Placement() {
    - +
    - - + +
    @@ -137,4 +156,6 @@ export default function Placement() {
    ) -} +}) + +export default Placement diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index 16debf6e..7d8ea54d 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -31,7 +31,7 @@ export function useModuleBasicSetting() { setSurfaceShapePattern(roof, roofDisplay.column, true) //패턴 변경 const offsetPoints = offsetPolygon(roof.points, -20) //안쪽 offset //모듈설치영역?? 생성 - const setupSurface = new QPolygon(offsetPoints, { + let setupSurface = new QPolygon(offsetPoints, { stroke: 'red', fill: 'transparent', strokeDashArray: [10, 4], @@ -45,6 +45,8 @@ export function useModuleBasicSetting() { parentId: roof.id, //가대 폴리곤의 임시 인덱스를 넣어줌 name: POLYGON_TYPE.MODULE_SETUP_SURFACE, flowDirection: roof.direction, + flipX: roof.flipX, + flipY: roof.flipY, }) setupSurface.setViewLengthText(false) @@ -65,7 +67,6 @@ export function useModuleBasicSetting() { //설치 범위 지정 클릭 이벤트 const toggleSelection = (setupSurface) => { console.log('setupSurface', setupSurface) - const isExist = selectedModuleInstSurfaceArray.some((obj) => obj.parentId === setupSurface.parentId) //최초 선택일때 if (!isExist) { @@ -380,7 +381,9 @@ export function useModuleBasicSetting() { } //자동 모듈 설치(그리드 방식) - const autoModuleSetup = () => { + const autoModuleSetup = (placementRef) => { + const isChidori = placementRef.isChidori.current + initEvent() const moduleSetupSurfaces = moduleSetupSurface //선택 설치면 @@ -405,6 +408,9 @@ export function useModuleBasicSetting() { if (moduleIsSetup.length > 0) { alert('기존 모듈은 제거됩니다.') + moduleIsSetup.forEach((module) => { + canvas?.remove(module) + }) } notSelectedTrestlePolygons.forEach((obj) => { @@ -484,16 +490,11 @@ export function useModuleBasicSetting() { width = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 172.2 : 113.4 height = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 113.4 : 172.2 } - const cols = Math.floor((bbox[2] - bbox[0]) / width) - const rows = Math.floor((bbox[3] - bbox[1]) / height) + let cols = Math.floor((bbox[2] - bbox[0]) / width) + let rows = Math.floor((bbox[3] - bbox[1]) / height) + + // cols = cols * 2 - let startCoords = { x: 0, y: 0 } - if (moduleSetupSurface.flowDirection === 'south') { - startCoords = { - x: surfaceBbox.minX, - y: surfaceBbox.maxY, - } - } for (let col = 0; col <= cols; col++) { for (let row = 0; row <= rows; row++) { let x = 0, @@ -530,13 +531,43 @@ export function useModuleBasicSetting() { x = bbox[0] + col * width y = bbox[1] + row * height } - square = [ - [x, y], - [x + width, y], - [x + width, y + height], - [x, y + height], - [x, y], - ] + + if (isChidori === 'true') { + if (row % 2 !== 0) { + square = [ + [x, y], + [x + width, y], + [x + width, y + height], + [x, y + height], + [x, y], + ] + } else { + square = [ + [x - width / 2, y], + [x - width / 2 + width, y], + [x - width / 2 + width, y + height], + [x - width / 2, y + height], + [x - width / 2, y], + ] + } + } else { + square = [ + [x, y], + [x + width, y], + [x + width, y + height], + [x, y + height], + [x, y], + ] + } + + // square = [ + // [x - width / 2, y], + // [x - width / 2 + width, y], + // [x - width / 2 + width, y + height], + // [x - width / 2, y + height], + // [x - width / 2, y], + // ] + const squarePolygon = turf.polygon([square]) const disjointFromTrestle = turf.booleanContains(turfModuleSetupSurface, squarePolygon) || turf.booleanWithin(squarePolygon, turfModuleSetupSurface) @@ -720,7 +751,7 @@ export function useModuleBasicSetting() { ) } - function batchObjectGroupToTurfPolygon(group) { + const batchObjectGroupToTurfPolygon = (group) => { const polygons = group.getObjects().filter((obj) => obj.type === 'QPolygon') let allPoints = [] @@ -732,32 +763,76 @@ export function useModuleBasicSetting() { return hull } - //도형의 내각을 구하는 로직 - function calculateInteriorAngles(polygon) { - const points = polygon.get('points') - const angles = [] + function calculatePerpendicularLine(hypotenuseStart, hypotenuseEnd, height) { + const { x: x1, y: y1 } = hypotenuseStart + const { x: x2, y: y2 } = hypotenuseEnd - for (let i = 0; i < points.length; i++) { - // 현재 점과 이전 및 다음 점 정의 - const current = points[i] - const prev = points[(i - 1 + points.length) % points.length] - const next = points[(i + 1) % points.length] + // 1. 빗변의 기울기 계산 + const slope = (y2 - y1) / (x2 - x1) - // 벡터 계산 - const vecA = { x: prev.x - current.x, y: prev.y - current.y } - const vecB = { x: next.x - current.x, y: next.y - current.y } + // 2. 중점 계산 + const xC = (x1 + x2) / 2 + const yC = (y1 + y2) / 2 - // 두 벡터 간 각도 계산 - const dotProduct = vecA.x * vecB.x + vecA.y * vecB.y - const magA = Math.sqrt(vecA.x * vecA.x + vecA.y * vecA.y) - const magB = Math.sqrt(vecB.x * vecB.x + vecB.y * vecB.y) - const angleRad = Math.acos(dotProduct / (magA * magB)) - const angleDeg = (angleRad * 180) / Math.PI + // 3. 수직 기울기의 정규화 인자 계산 + const norm = Math.sqrt(1 + Math.pow(slope, 2)) - // 내부 각도 저장 - angles.push(180 - angleDeg) + // 4. 수직선의 끝점 계산 + const xOffset = -height / norm + const yOffset = (height * slope) / norm + + const point1 = { x: xC + xOffset, y: yC + yOffset } + const point2 = { x: xC - xOffset, y: yC - yOffset } + + return { point1, point2 } + } + + // 예제 사용 + const hypotenuseStart = { x: 2, y: 3 } + const hypotenuseEnd = { x: 8, y: 9 } + const height = 4 + + const result = calculatePerpendicularLine(hypotenuseStart, hypotenuseEnd, height) + console.log(result) + + const calcMinXByHeightDistance = (surface) => { + let minXIndex = surface.lines.reduce((minIdx, current, index, arr) => { + console.log('reduce', minIdx, current, index, arr) + + return current.x1 < arr[minIdx].x1 ? index : minIdx + }, surface.lines[0].x1) + + console.log('minXIndex', minXIndex) + + function calculateIntersection(diagonalA, lineB) { + // Diagonal A coordinates + const { x1: ax1, y1: ay1, x2: ax2, y2: ay2 } = diagonalA + + // Line B coordinates + const { x2: bx2, y2: by2 } = lineB + + // Calculate slope (m) and intercept (c) for diagonal A + const slopeA = (ay2 - ay1) / (ax2 - ax1) + const interceptA = ay1 - slopeA * ax1 + + // Use fixed y (from lineB's y2) + const yFixed = by2 + + // Calculate x on diagonal A where y = yFixed + const xFixed = (yFixed - interceptA) / slopeA + + // Return the intersection point + return { x: xFixed, y: yFixed } } - return angles + + console.log('line', line) + + // Example usage: + const diagonalA = { x1: 490.4, y1: 94.7, x2: 303.7, y2: 654.7 } + const lineB = { x1: 303.7, y1: 654.7, x2: 303.7, y2: 541.3 } + + const intersection = calculateIntersection(diagonalA, lineB) + console.log(`Intersection point: x = ${intersection.x}, y = ${intersection.y}`) } return { diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index 116fe639..3731443d 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -102,6 +102,15 @@ export function useSurfaceShapeBatch() { canvas?.add(obj) + canvas?.renderAll() + closePopup(id) + }) + + addCanvasMouseEventListener('mouse:down', (e) => { + isDrawing = false + + canvas?.remove(obj) + //각도 추가 let originAngle = 0 //기본 남쪽 let direction = 'south' @@ -119,21 +128,31 @@ export function useSurfaceShapeBatch() { direction = 'north' } - obj.set({ direction: direction }) - obj.set({ originAngle: originAngle }) - - canvas?.renderAll() + //회전, flip등이 먹은 기준으로 새로생성 + const batchSurface = new QPolygon(obj.getCurrentPoints(), { + fill: 'transparent', + stroke: 'red', + strokeWidth: 1, + strokeDasharray: [10, 4], + fontSize: 12, + selectable: true, + lockMovementX: true, // X 축 이동 잠금 + lockMovementY: true, // Y 축 이동 잠금 + lockRotation: true, // 회전 잠금 + lockScalingX: true, // X 축 크기 조정 잠금 + lockScalingY: true, // Y 축 크기 조정 잠금 + name: POLYGON_TYPE.ROOF, + originX: 'center', + originY: 'center', + pitch: globalPitch, + surfaceId: surfaceId, + direction: direction, + }) + canvas?.add(batchSurface) + setSurfaceShapePattern(batchSurface, roofDisplay.column) + drawDirectionArrow(batchSurface) closePopup(id) - }) - - addCanvasMouseEventListener('mouse:down', (e) => { - isDrawing = false - obj.set('name', POLYGON_TYPE.ROOF) - obj.set('surfaceId', surfaceId) initEvent() - setSurfaceShapePattern(obj, roofDisplay.column) - closePopup(id) - drawDirectionArrow(obj) }) } } @@ -880,12 +899,45 @@ export function useSurfaceShapeBatch() { canvas?.renderAll() } - const changeSurfaceFlowDirection = (roof, direction, orientation) => { - roof.set({ - direction: direction, + const updateFlippedPoints = (polygon) => { + if (!(polygon instanceof fabric.Polygon)) { + console.error('The object is not a Polygon.') + return + } + + const { flipX, flipY, width, height, points, left, top, scaleX, scaleY } = polygon + + // 현재 points의 사본 가져오기 + const newPoints = points.map((point) => { + let x = point.x + let y = point.y + + // flipX 적용 + if (flipX) { + x = width - x + } + + // flipY 적용 + if (flipY) { + y = height - y + } + + // 스케일 및 전역 좌표 고려 + x = (x - width / 2) * scaleX + width / 2 + y = (y - height / 2) * scaleY + height / 2 + + return { x, y } }) - drawDirectionArrow(roof) - canvas?.renderAll() + + // flipX, flipY를 초기화 + polygon.flipX = false + polygon.flipY = false + + // points 업데이트 + polygon.set({ points: newPoints }) + polygon.setCoords() + + return polygon } return { diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 1f5f59cb..97b34c2c 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -285,8 +285,6 @@ export function useContextMenu() { }, [currentContextMenu]) useEffect(() => { - console.log(currentObject) - if (currentObject?.name) { console.log('object', currentObject) switch (currentObject.name) { From e0938c9db814d1b3d15fc8c7e4b5cb853ac3dd92 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 21 Nov 2024 10:12:53 +0900 Subject: [PATCH 120/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=EC=A1=B0=EA=B1=B4=20=EB=82=A0=EC=A7=9C=20?= =?UTF-8?q?=EB=B9=88=EA=B0=92=EC=8B=9C=20=EC=95=8C=EB=9F=BF=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../management/StuffSearchCondition.jsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index f803452c..ee038366 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -69,10 +69,15 @@ export default function StuffSearchCondition() { // 조회 const onSubmit = () => { let diff = dayjs(endDate).diff(startDate, 'day') + if (diff > 366) { return alert(getMessage('stuff.message.periodError')) } + if (isNaN(diff)) { + return alert(getMessage('stuff.message.periodError')) + } + if (stuffSearch.code === 'S') { setStuffSearch({ schObjectNo: objectNo ? objectNo : stuffSearch.schObjectNo, @@ -84,8 +89,8 @@ export default function StuffSearchCondition() { schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : '', schReceiveUser: receiveUser ? receiveUser : '', schDateType: dateType, - schFromDt: dayjs(startDate).format('YYYY-MM-DD'), - schToDt: dayjs(endDate).format('YYYY-MM-DD'), + schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', + schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', code: 'E', startRow: stuffSearch?.startRow ? stuffSearch.startRow : 1, endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100, @@ -102,8 +107,8 @@ export default function StuffSearchCondition() { schOtherSelSaleStoreId: otherSaleStoreId, schReceiveUser: receiveUser, schDateType: dateType, - schFromDt: dayjs(startDate).format('YYYY-MM-DD'), - schToDt: dayjs(endDate).format('YYYY-MM-DD'), + schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', + schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', code: 'E', startRow: 1, endRow: 100, @@ -120,8 +125,8 @@ export default function StuffSearchCondition() { schOtherSelSaleStoreId: otherSaleStoreId, schReceiveUser: receiveUser, schDateType: dateType, - schFromDt: dayjs(startDate).format('YYYY-MM-DD'), - schToDt: dayjs(endDate).format('YYYY-MM-DD'), + schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', + schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', code: 'E', startRow: 1, endRow: 100, From edc7a245530103e41d09ccc809bd7023a11a947c Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 21 Nov 2024 10:33:14 +0900 Subject: [PATCH 121/200] =?UTF-8?q?=EC=83=81=EB=A9=B4=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useModuleBasicSetting.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index 7d8ea54d..4f9e829d 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -640,7 +640,7 @@ export function useModuleBasicSetting() { module.tempIndex = index const { x, y } = module.getCenterPoint() const { width, height } = module - centerPoints.push({ x, y, width, height }) + centerPoints.push({ x, y, width, height, index }) const circle = new fabric.Circle({ radius: 5, fill: 'red', @@ -665,7 +665,6 @@ export function useModuleBasicSetting() { let touchDimension = 0 //반접면 let halfTouchDimension = 0 - // 노출하면 체크 centerPoints.forEach((centerPoint, index) => { const { x, y, width, height } = centerPoint @@ -676,12 +675,15 @@ export function useModuleBasicSetting() { return } + const bottomLeftPoint = { x: x - width / 2, y: y + height } + const bottomRightPoint = { x: x + width / 2, y: y + height } + // 바로 아래에 셀이 없는 경우 물떼세 배치가 왼쪽 되어있는 셀을 찾는다. const leftBottomCnt = centerPoints.filter( - (centerPoint) => Math.abs(centerPoint.x - (x - width / 2)) < 2 && Math.abs(centerPoint.y - (y + height)) < 2, + (centerPoint) => Math.abs(centerPoint.x - bottomLeftPoint.x) < 2 && Math.abs(centerPoint.y - bottomLeftPoint.y) < 2, ).length const rightBottomCnt = centerPoints.filter( - (centerPoint) => Math.abs(centerPoint.x - (x + width / 2)) < 2 && Math.abs(centerPoint.y - (y + height)) < 2, + (centerPoint) => Math.abs(centerPoint.x - bottomRightPoint.x) < 2 && Math.abs(centerPoint.y - bottomRightPoint.y) < 2, ).length if (leftBottomCnt + rightBottomCnt === 2) { touchDimension++ @@ -706,11 +708,14 @@ export function useModuleBasicSetting() { return } + const topLeftPoint = { x: x - width / 2, y: y - height } + const topRightPoint = { x: x + width / 2, y: y - height } + const leftTopCnt = centerPoints.filter( - (centerPoint) => Math.abs(centerPoint.x - (x - width) < 2) && Math.abs(centerPoint.y - (y - height)) < 2, + (centerPoint) => Math.abs(centerPoint.x - topLeftPoint.x) < 2 && Math.abs(centerPoint.y - topRightPoint.y) < 2, ).length const rightTopCnt = centerPoints.filter( - (centerPoint) => Math.abs(centerPoint.x - (x + width / 2) < 2) && Math.abs(centerPoint.y - (y - height)) < 2, + (centerPoint) => Math.abs(centerPoint.x - topRightPoint.x) < 2 && Math.abs(centerPoint.y - topRightPoint.y) < 2, ).length if (leftTopCnt + rightTopCnt === 1) { From c0553d8b17251ea3da6d49a7438269395a22f538 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 21 Nov 2024 11:06:15 +0900 Subject: [PATCH 122/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?//=20=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/popup/DocDownOptionPop.jsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/components/estimate/popup/DocDownOptionPop.jsx b/src/components/estimate/popup/DocDownOptionPop.jsx index 128b2dd0..e9dd4d4a 100644 --- a/src/components/estimate/popup/DocDownOptionPop.jsx +++ b/src/components/estimate/popup/DocDownOptionPop.jsx @@ -17,7 +17,7 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { const [schDisplayFlg, setSchSchDisplayFlg] = useState('0') //가대 중량표 포함(포함:1 미포함 : 0) const [schWeightFlg, setSchWeightFlg] = useState('1') - //도면/시뮬레이션 파일 포함(포함:1 미포함 : 0) + //도면/시뮬레이션 파일 포함 const [schDrawingFlg, setSchDrawingFlg] = useState('1') // recoil 물건번호 @@ -37,6 +37,18 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { sendUnitPriceFlg = '1' } + //schDrawingFlg 선택값은 의미없어짐 + //가대중량표 포함, 도면/시뮬레이션 파일 포함 선택값에따라 schDrawingFlg에 |구분자로 보냄 + //SchDrawingFlg (1 : 견적서,2 : 발전시뮬레이션, 3 : 도면, 4 : 가대) + // ex) 1|2|3|4 + let defaultSchDrawingFlg = '1' + if (schWeightFlg === '1') { + defaultSchDrawingFlg = defaultSchDrawingFlg.concat('|', '4') + } + if (schDrawingFlg === '1') { + defaultSchDrawingFlg = defaultSchDrawingFlg.concat('|', '3') + } + const params = { objectNo: objectRecoil.floorPlanObjectNo, planNo: planNo, @@ -44,8 +56,10 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { schUnitPriceFlg: sendUnitPriceFlg, schDisplayFlg: schDisplayFlg, schWeightFlg: schWeightFlg, - schDrawingFlg: schDrawingFlg, + schDrawingFlg: defaultSchDrawingFlg, + pwrGnrSimType: 'D', //default 화면에 안보여줌 } + const options = { responseType: 'blob' } await promisePost({ url: url, data: params, option: options }) .then((resultData) => { From c6fccf54412a47545aa3878b747107ff58770983 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 21 Nov 2024 11:32:14 +0900 Subject: [PATCH 123/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EC=98=B5?= =?UTF-8?q?=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/popup/DocDownOptionPop.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/estimate/popup/DocDownOptionPop.jsx b/src/components/estimate/popup/DocDownOptionPop.jsx index e9dd4d4a..d6b22eb2 100644 --- a/src/components/estimate/popup/DocDownOptionPop.jsx +++ b/src/components/estimate/popup/DocDownOptionPop.jsx @@ -46,7 +46,7 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { defaultSchDrawingFlg = defaultSchDrawingFlg.concat('|', '4') } if (schDrawingFlg === '1') { - defaultSchDrawingFlg = defaultSchDrawingFlg.concat('|', '3') + defaultSchDrawingFlg = defaultSchDrawingFlg.concat('|', '2', '|', '3') } const params = { From a6ccd78ad12adbba3b7e660715d55121712aa137 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 21 Nov 2024 13:17:28 +0900 Subject: [PATCH 124/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 64 +++++++++++-------- .../management/StuffSearchCondition.jsx | 8 ++- src/store/stuffAtom.js | 2 + 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index e6b281c4..1fc1bc47 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -172,8 +172,7 @@ export default function Stuff() { schDateType: stuffSearchParams.schDateType, schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), schToDt: dayjs(new Date()).format('YYYY-MM-DD'), - startRow: (pageNo - 1) * pageSize + 1, - // endRow: pageNo * pageSize, + startRow: (stuffSearch.pageNo - 1) * stuffSearchParams.pageSize + 1, endRow: stuffSearchParams?.endRow, schSelSaleStoreId: stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : '', schOtherSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : '', @@ -219,6 +218,7 @@ export default function Stuff() { stuffSearchParams.endRow = 1 * pageSize stuffSearchParams.schSortType = defaultSortType setPageNo(1) + stuffSearchParams.pageNo = 1 async function fetchData() { const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` @@ -241,6 +241,7 @@ export default function Stuff() { stuffSearchParams.endRow = 1 * pageSize stuffSearchParams.schSortType = defaultSortType setPageNo(1) + async function fetchData() { const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` await get({ url: apiUrl }).then((res) => { @@ -262,31 +263,31 @@ export default function Stuff() { const onChangePerPage = (e) => { let startRow = (1 - 1) * e.target.value + 1 stuffSearchParams.startRow = startRow - stuffSearchParams.endRow = 1 * e.target.value + stuffSearchParams.endRow = stuffSearchParams.pageNo * e.target.value stuffSearchParams.schSelSaleStoreId = stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : stuffSearchParams.schSelSaleStoreId setPageSize(e.target.value) setStuffSearch({ - // ...stuffSearchParams, ...stuffSearch, code: 'S', startRow: startRow, - endRow: 1 * e.target.value, + endRow: stuffSearchParams.pageNo * e.target.value, + pageSize: e.target.value, }) setPageNo(1) - const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` - get({ url: apiUrl }).then((res) => { - if (!isEmptyArray(res)) { - setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) - setTotalCount(res[0].totCnt) - } else { - setGridProps({ ...gridProps, gridData: [], count: 0 }) - setTotalCount(0) - } - }) + // const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + // get({ url: apiUrl }).then((res) => { + // if (!isEmptyArray(res)) { + // setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) + // setTotalCount(res[0].totCnt) + // } else { + // setGridProps({ ...gridProps, gridData: [], count: 0 }) + // setTotalCount(0) + // } + // }) } //최근 등록일 수정일 정렬 이벤트 @@ -309,16 +310,16 @@ export default function Stuff() { }) setPageNo(1) - const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` - get({ url: apiUrl }).then((res) => { - if (!isEmptyArray(res)) { - setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) - setTotalCount(res[0].totCnt) - } else { - setGridProps({ ...gridProps, gridData: [], count: 0 }) - setTotalCount(0) - } - }) + // const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + // get({ url: apiUrl }).then((res) => { + // if (!isEmptyArray(res)) { + // setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) + // setTotalCount(res[0].totCnt) + // } else { + // setGridProps({ ...gridProps, gridData: [], count: 0 }) + // setTotalCount(0) + // } + // }) } useEffect(() => { @@ -340,6 +341,7 @@ export default function Stuff() { code: 'S', startRow: (page - 1) * pageSize + 1, endRow: page * pageSize, + pageNo: page, }) setPageNo(page) @@ -368,7 +370,8 @@ export default function Stuff() {
    - + {/* { handleChartChangeData(e.target.value) + setPwrGnrSimType(e.target.value) }} > diff --git a/src/store/simulatorAtom.js b/src/store/simulatorAtom.js new file mode 100644 index 00000000..7bdfa363 --- /dev/null +++ b/src/store/simulatorAtom.js @@ -0,0 +1,8 @@ +import { atom } from 'recoil' + +export const pwrGnrSimTypeState = atom({ + key: 'pwrGnrSimType', + default: { + type: 'D', + }, +}) From 05ef45bd3802cff2ebc24070a6b98f9109684abc Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 21 Nov 2024 14:03:31 +0900 Subject: [PATCH 126/200] =?UTF-8?q?fix:=20=EB=8F=84=EB=A9=B4=20=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD=20=EC=84=A4=EC=A0=95=20=EA=B0=9C=EB=B0=9C=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - api 스펙 추가 및 수정 --- src/app/api/html2canvas/route.js | 2 +- src/app/api/image-upload/route.js | 25 + src/components/floor-plan/modal/ImgLoad.jsx | 9 +- src/hooks/common/useRefFiles.js | 52 +- src/lib/cadAction.js | 5 + src/lib/canvas.js | 5 + src/lib/fileAction.js | 64 + yarn.lock | 3768 +++++++++---------- 8 files changed, 1858 insertions(+), 2072 deletions(-) create mode 100644 src/app/api/image-upload/route.js create mode 100644 src/lib/fileAction.js diff --git a/src/app/api/html2canvas/route.js b/src/app/api/html2canvas/route.js index 02731f07..ada6c54a 100644 --- a/src/app/api/html2canvas/route.js +++ b/src/app/api/html2canvas/route.js @@ -5,7 +5,7 @@ import fs from 'fs/promises' import { NextResponse } from 'next/server' export async function GET(req) { - const path = 'public/mapImages' + const path = 'public/plan-map-images' const q = req.nextUrl.searchParams.get('q') const fileNm = req.nextUrl.searchParams.get('fileNm') const zoom = req.nextUrl.searchParams.get('zoom') diff --git a/src/app/api/image-upload/route.js b/src/app/api/image-upload/route.js new file mode 100644 index 00000000..e817bd3b --- /dev/null +++ b/src/app/api/image-upload/route.js @@ -0,0 +1,25 @@ +'use server' + +import fs from 'fs/promises' + +import { NextResponse } from 'next/server' + +export async function POST(req) { + const path = 'public/plan-bg-images' + + const formData = await req.formData() + const file = formData.get('file') + const arrayBuffer = await file.arrayBuffer() + const buffer = Buffer.from(arrayBuffer) + // const buffer = new Uint8Array(arrayBuffer) + + try { + await fs.readdir(path) + } catch { + await fs.mkdir(path) + } finally { + await fs.writeFile(`${path}/${file.name}`, buffer) + } + + return NextResponse.json({ fileNm: `${file.name}` }) +} diff --git a/src/components/floor-plan/modal/ImgLoad.jsx b/src/components/floor-plan/modal/ImgLoad.jsx index c67cc3f3..84c2dfdc 100644 --- a/src/components/floor-plan/modal/ImgLoad.jsx +++ b/src/components/floor-plan/modal/ImgLoad.jsx @@ -95,7 +95,14 @@ export default function ImgLoad() {
    - + setMapPositionAddress(e.target.value)} + />
    diff --git a/src/components/main/MainContents.jsx b/src/components/main/MainContents.jsx index d2b3cc90..e45cfd33 100644 --- a/src/components/main/MainContents.jsx +++ b/src/components/main/MainContents.jsx @@ -1,3 +1,5 @@ +'use client' + import { useEffect, useState, useContext } from 'react' import ProductItem from './ProductItem' import { useMessage } from '@/hooks/useMessage' @@ -10,6 +12,8 @@ import { globalLocaleStore } from '@/store/localeAtom' import { queryStringFormatter } from '@/util/common-utils' import MainSkeleton from '../ui/MainSkeleton' import { SessionContext } from '@/app/SessionProvider' +import { useMainContentsController } from '@/hooks/main/useMainContentsController' +import { QcastContext } from '@/app/QcastProvider' export default function MainContents() { const { session } = useContext(SessionContext) @@ -19,7 +23,7 @@ export default function MainContents() { const { promiseGet } = useAxios(globalLocaleState) //최근 물건 - const [objectList, setObjectList] = useState([]) + // const [objectList, setObjectList] = useState([]) //공지사항 const [recentNoticeList, setRecentNoticeList] = useState([]) @@ -28,36 +32,42 @@ export default function MainContents() { const [recentFaqList, setRecentFaqList] = useState([]) //Sales Contact info - const [businessCharger, setBusinessCharger] = useState(null) - const [businessChargerMail, setBusinessChargerMail] = useState(null) + // const [businessCharger, setBusinessCharger] = useState(null) + // const [businessChargerMail, setBusinessChargerMail] = useState(null) + + const { qcastState } = useContext(QcastContext) + const { fetchObjectList, initObjectList } = useMainContentsController() useEffect(() => { fetchObjectList() fetchNoticeList() fetchFaqList() + return () => { + initObjectList() + } }, []) //최근 갱신 물건목록 / Sales Contact info 정보 - const fetchObjectList = async () => { - try { - const apiUrl = `/api/main-page/object/${session?.storeId}/list` - await promiseGet({ - url: apiUrl, - }).then((res) => { - if (res.status === 200) { - setObjectList(res.data.objectList) - setBusinessCharger(res.data.businessCharger) - setBusinessChargerMail(res.data.businessChargerMail) - } else { - setObjectList([]) - setBusinessCharger(null) - setBusinessChargerMail(null) - } - }) - } catch (error) { - console.error('MAIN API fetching error:', error) - } - } + // const fetchObjectList = async () => { + // try { + // const apiUrl = `/api/main-page/object/${session?.storeId}/list` + // await promiseGet({ + // url: apiUrl, + // }).then((res) => { + // if (res.status === 200) { + // setObjectList(res.data.objectList) + // setBusinessCharger(res.data.businessCharger) + // setBusinessChargerMail(res.data.businessChargerMail) + // } else { + // setObjectList([]) + // setBusinessCharger(null) + // setBusinessChargerMail(null) + // } + // }) + // } catch (error) { + // console.error('MAIN API fetching error:', error) + // } + // } //공지사항 호출 const fetchNoticeList = async () => { @@ -109,9 +119,9 @@ export default function MainContents() {
    - {objectList.length > 0 ? ( + {qcastState?.objectList.length > 0 ? (
      - {objectList.map((row) => { + {qcastState?.objectList.map((row) => { return (
    • react
    - {(businessCharger &&
    {businessCharger}
    ) || ( + {(qcastState?.businessCharger &&
    {qcastState?.businessCharger}
    ) || (
    {getMessage('main.content.noBusiness')}
    )} @@ -198,7 +208,7 @@ export default function MainContents() {
    react
    - {(businessChargerMail &&
    {businessChargerMail}
    ) || ( + {(qcastState?.businessChargerMail &&
    {qcastState?.businessChargerMail}
    ) || (
    {getMessage('main.content.noBusiness')}
    )} diff --git a/src/hooks/main/useMainContentsController.js b/src/hooks/main/useMainContentsController.js new file mode 100644 index 00000000..0d2b0436 --- /dev/null +++ b/src/hooks/main/useMainContentsController.js @@ -0,0 +1,89 @@ +'use client' + +import { useContext } from 'react' +import { useAxios } from '../useAxios' +import { SessionContext } from '@/app/SessionProvider' +import { QcastContext } from '@/app/QcastProvider' + +export const useMainContentsController = () => { + const { session } = useContext(SessionContext) + const { promiseGet } = useAxios() + const { setQcastState } = useContext(QcastContext) + + /** + * main search area + */ + // const [saleStoreId, setSaleStoreId] = useState('') + // const [saleStoreName, setSaleStoreName] = useState('') + + /** + * main contents area + */ + // const [objectList, setObjectList] = useState([]) + // const [businessCharger, setBusinessCharger] = useState(null) + // const [businessChargerMail, setBusinessChargerMail] = useState(null) + + /** + * 최근 물건 목록 조회 + */ + const fetchObjectList = async () => { + try { + const apiUrl = `/api/main-page/object/${session?.storeId}/list` + await promiseGet({ + url: apiUrl, + }).then((res) => { + if (res.status === 200) { + // setSaleStoreId(res.data.saleStoreId) + // setSaleStoreName(res.data.saleStoreName) + + // setObjectList(res.data.objectList) + // setBusinessCharger(res.data.businessCharger) + // setBusinessChargerMail(res.data.businessChargerMail) + setQcastState({ + saleStoreId: res.data.saleStoreId, + saleStoreName: res.data.saleStoreName, + objectList: res.data.objectList, + businessCharger: res.data.businessCharger, + businessChargerMail: res.data.businessChargerMail, + }) + } else { + // setSaleStoreId('') + // setSaleStoreName('') + + // setObjectList([]) + // setBusinessCharger(null) + // setBusinessChargerMail(null) + setQcastState({ + saleStoreId: '', + saleStoreName: '', + objectList: [], + businessCharger: null, + businessChargerMail: null, + }) + } + }) + } catch (error) { + console.error('MAIN API fetching error:', error) + } + } + + const initObjectList = () => { + setQcastState({ + saleStoreId: '', + saleStoreName: '', + objectList: [], + businessCharger: null, + businessChargerMail: null, + }) + } + + return { + // saleStoreId, + // saleStoreName, + // objectList, + // businessCharger, + // businessChargerMail, + fetchObjectList, + initObjectList, + } +} diff --git a/yarn.lock b/yarn.lock index 9a01d87f..81129787 100644 --- a/yarn.lock +++ b/yarn.lock @@ -223,7 +223,14 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@^7.20.13", "@babel/runtime@^7.24.8": +"@babel/runtime@^7.20.13": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.24.8": version "7.25.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz" integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== @@ -532,21 +539,6 @@ resolved "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz" integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== -"@mapbox/node-pre-gyp@^1.0.0": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" - integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - "@next/env@14.2.3": version "14.2.3" resolved "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz" @@ -1251,7 +1243,7 @@ "@react-types/shared" "3.23.1" clsx "^1.2.1" -"@nextui-org/system@2.2.5": +"@nextui-org/system@>=2.0.0", "@nextui-org/system@>=2.1.0", "@nextui-org/system@2.2.5": version "2.2.5" resolved "https://registry.npmjs.org/@nextui-org/system/-/system-2.2.5.tgz" integrity sha512-nrX6768aiyWtpxX3OTFBIVWR+v9nlMsC3KaBinNfek97sNm7gAfTHi7q5kylE3L5yIMpNG+DclAKpuxgDQEmvw== @@ -1304,7 +1296,7 @@ "@react-types/tabs" "3.3.7" scroll-into-view-if-needed "3.0.10" -"@nextui-org/theme@2.2.9": +"@nextui-org/theme@>=2.1.0", "@nextui-org/theme@>=2.2.0", "@nextui-org/theme@2.2.9": version "2.2.9" resolved "https://registry.npmjs.org/@nextui-org/theme/-/theme-2.2.9.tgz" integrity sha512-TN2I9sMriLaj00pXsIMlg19+UHeOdjzS2JV0u4gjL14mSbQl5BYNxgbvU3gbMqkZZQ6OpwT4RnT8RS+ks6TXCw== @@ -1525,7 +1517,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1658,7 +1650,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/focus@3.17.1", "@react-aria/focus@^3.17.1": +"@react-aria/focus@^3.17.1", "@react-aria/focus@3.17.1": version "3.17.1" resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.17.1.tgz" integrity sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ== @@ -1680,7 +1672,7 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/form@3.0.5", "@react-aria/form@^3.0.5": +"@react-aria/form@^3.0.5", "@react-aria/form@3.0.5": version "3.0.5" resolved "https://registry.npmjs.org/@react-aria/form/-/form-3.0.5.tgz" integrity sha512-n290jRwrrRXO3fS82MyWR+OKN7yznVesy5Q10IclSTVYHHI3VI53xtAPr/WzNjJR1um8aLhOcDNFKwnNIUUCsQ== @@ -1710,7 +1702,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@3.11.1", "@react-aria/i18n@^3.11.1": +"@react-aria/i18n@^3.11.1", "@react-aria/i18n@3.11.1": version "3.11.1" resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.11.1.tgz" integrity sha512-vuiBHw1kZruNMYeKkTGGnmPyMnM5T+gT8bz97H1FqIq1hQ6OPzmtBZ6W6l6OIMjeHI5oJo4utTwfZl495GALFQ== @@ -1738,7 +1730,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/interactions@3.21.3", "@react-aria/interactions@^3.21.3": +"@react-aria/interactions@^3.21.3", "@react-aria/interactions@3.21.3": version "3.21.3" resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.3.tgz" integrity sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA== @@ -1758,7 +1750,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/label@3.7.8", "@react-aria/label@^3.7.8": +"@react-aria/label@^3.7.8", "@react-aria/label@3.7.8": version "3.7.8" resolved "https://registry.npmjs.org/@react-aria/label/-/label-3.7.8.tgz" integrity sha512-MzgTm5+suPA3KX7Ug6ZBK2NX9cin/RFLsv1BdafJ6CZpmUSpWnGE/yQfYUB7csN7j31OsZrD3/P56eShYWAQfg== @@ -1767,7 +1759,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/link@3.7.1", "@react-aria/link@^3.7.1": +"@react-aria/link@^3.7.1", "@react-aria/link@3.7.1": version "3.7.1" resolved "https://registry.npmjs.org/@react-aria/link/-/link-3.7.1.tgz" integrity sha512-a4IaV50P3fXc7DQvEIPYkJJv26JknFbRzFT5MJOMgtzuhyJoQdILEUK6XHYjcSSNCA7uLgzpojArVk5Hz3lCpw== @@ -1779,7 +1771,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/listbox@3.12.1", "@react-aria/listbox@^3.12.1": +"@react-aria/listbox@^3.12.1", "@react-aria/listbox@3.12.1": version "3.12.1" resolved "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.12.1.tgz" integrity sha512-7JiUp0NGykbv/HgSpmTY1wqhuf/RmjFxs1HZcNaTv8A+DlzgJYc7yQqFjP3ZA/z5RvJFuuIxggIYmgIFjaRYdA== @@ -1801,7 +1793,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/menu@3.14.1", "@react-aria/menu@^3.14.1": +"@react-aria/menu@^3.14.1", "@react-aria/menu@3.14.1": version "3.14.1" resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.14.1.tgz" integrity sha512-BYliRb38uAzq05UOFcD5XkjA5foQoXRbcH3ZufBsc4kvh79BcP1PMW6KsXKGJ7dC/PJWUwCui6QL1kUg8PqMHA== @@ -1820,7 +1812,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/overlays@3.22.1", "@react-aria/overlays@^3.22.1": +"@react-aria/overlays@^3.22.1", "@react-aria/overlays@3.22.1": version "3.22.1" resolved "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.22.1.tgz" integrity sha512-GHiFMWO4EQ6+j6b5QCnNoOYiyx1Gk8ZiwLzzglCI4q1NY5AG2EAmfU4Z1+Gtrf2S5Y0zHbumC7rs9GnPoGLUYg== @@ -1865,7 +1857,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/selection@3.18.1", "@react-aria/selection@^3.18.1": +"@react-aria/selection@^3.18.1", "@react-aria/selection@3.18.1": version "3.18.1" resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.18.1.tgz" integrity sha512-GSqN2jX6lh7v+ldqhVjAXDcrWS3N4IsKXxO6L6Ygsye86Q9q9Mq9twWDWWu5IjHD6LoVZLUBCMO+ENGbOkyqeQ== @@ -1918,7 +1910,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/ssr@3.9.4", "@react-aria/ssr@^3.9.4": +"@react-aria/ssr@^3.9.4", "@react-aria/ssr@3.9.4": version "3.9.4" resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz" integrity sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ== @@ -1978,7 +1970,7 @@ "@react-types/tabs" "^3.3.7" "@swc/helpers" "^0.5.0" -"@react-aria/textfield@3.14.5", "@react-aria/textfield@^3.14.5": +"@react-aria/textfield@^3.14.5", "@react-aria/textfield@3.14.5": version "3.14.5" resolved "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.5.tgz" integrity sha512-hj7H+66BjB1iTKKaFXwSZBZg88YT+wZboEXZ0DNdQB2ytzoz/g045wBItUuNi4ZjXI3P+0AOZznVMYadWBAmiA== @@ -2019,7 +2011,7 @@ "@react-types/tooltip" "^3.4.9" "@swc/helpers" "^0.5.0" -"@react-aria/utils@3.24.1", "@react-aria/utils@^3.24.1": +"@react-aria/utils@^3.24.1", "@react-aria/utils@3.24.1": version "3.24.1" resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.24.1.tgz" integrity sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q== @@ -2041,7 +2033,7 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/visually-hidden@3.8.12", "@react-aria/visually-hidden@^3.8.12": +"@react-aria/visually-hidden@^3.8.12", "@react-aria/visually-hidden@3.8.12": version "3.8.12" resolved "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.12.tgz" integrity sha512-Bawm+2Cmw3Xrlr7ARzl2RLtKh0lNUdJ0eNqzWcyx4c0VHUAWtThmH5l+HRqFUGzzutFZVo89SAy40BAbd0gjVw== @@ -2051,7 +2043,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@3.5.1", "@react-stately/calendar@^3.5.1": +"@react-stately/calendar@^3.5.1", "@react-stately/calendar@3.5.1": version "3.5.1" resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.5.1.tgz" integrity sha512-7l7QhqGUJ5AzWHfvZzbTe3J4t72Ht5BmhW4hlVI7flQXtfrmYkVtl3ZdytEZkkHmWGYZRW9b4IQTQGZxhtlElA== @@ -2062,7 +2054,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/checkbox@3.6.5", "@react-stately/checkbox@^3.6.5": +"@react-stately/checkbox@^3.6.5", "@react-stately/checkbox@3.6.5": version "3.6.5" resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.5.tgz" integrity sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg== @@ -2073,7 +2065,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/collections@3.10.7", "@react-stately/collections@^3.10.7": +"@react-stately/collections@^3.10.7", "@react-stately/collections@3.10.7": version "3.10.7" resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.7.tgz" integrity sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA== @@ -2089,7 +2081,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/combobox@3.8.4", "@react-stately/combobox@^3.8.4": +"@react-stately/combobox@^3.8.4", "@react-stately/combobox@3.8.4": version "3.8.4" resolved "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.4.tgz" integrity sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA== @@ -2104,7 +2096,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@3.9.4", "@react-stately/datepicker@^3.9.4": +"@react-stately/datepicker@^3.9.4", "@react-stately/datepicker@3.9.4": version "3.9.4" resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.4.tgz" integrity sha512-yBdX01jn6gq4NIVvHIqdjBUPo+WN8Bujc4OnPw+ZnfA4jI0eIgq04pfZ84cp1LVXW0IB0VaCu1AlQ/kvtZjfGA== @@ -2125,7 +2117,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/form@3.0.3", "@react-stately/form@^3.0.3": +"@react-stately/form@^3.0.3", "@react-stately/form@3.0.3": version "3.0.3" resolved "https://registry.npmjs.org/@react-stately/form/-/form-3.0.3.tgz" integrity sha512-92YYBvlHEWUGUpXgIaQ48J50jU9XrxfjYIN8BTvvhBHdD63oWgm8DzQnyT/NIAMzdLnhkg7vP+fjG8LjHeyIAg== @@ -2152,7 +2144,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/list@3.10.5", "@react-stately/list@^3.10.5": +"@react-stately/list@^3.10.5", "@react-stately/list@3.10.5": version "3.10.5" resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.10.5.tgz" integrity sha512-fV9plO+6QDHiewsYIhboxcDhF17GO95xepC5ki0bKXo44gr14g/LSo/BMmsaMnV+1BuGdBunB05bO4QOIaigXA== @@ -2174,7 +2166,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/menu@3.7.1", "@react-stately/menu@^3.7.1": +"@react-stately/menu@^3.7.1", "@react-stately/menu@3.7.1": version "3.7.1" resolved "https://registry.npmjs.org/@react-stately/menu/-/menu-3.7.1.tgz" integrity sha512-mX1w9HHzt+xal1WIT2xGrTQsoLvDwuB2R1Er1MBABs//MsJzccycatcgV/J/28m6tO5M9iuFQQvLV+i1dCtodg== @@ -2184,7 +2176,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/overlays@3.6.7", "@react-stately/overlays@^3.6.7": +"@react-stately/overlays@^3.6.7", "@react-stately/overlays@3.6.7": version "3.6.7" resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.7.tgz" integrity sha512-6zp8v/iNUm6YQap0loaFx6PlvN8C0DgWHNlrlzMtMmNuvjhjR0wYXVaTfNoUZBWj25tlDM81ukXOjpRXg9rLrw== @@ -2202,7 +2194,7 @@ "@react-types/overlays" "^3.8.9" "@swc/helpers" "^0.5.0" -"@react-stately/radio@3.10.4", "@react-stately/radio@^3.10.4": +"@react-stately/radio@^3.10.4", "@react-stately/radio@3.10.4": version "3.10.4" resolved "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.4.tgz" integrity sha512-kCIc7tAl4L7Hu4Wt9l2jaa+MzYmAJm0qmC8G8yPMbExpWbLRu6J8Un80GZu+JxvzgDlqDyrVvyv9zFifwH/NkQ== @@ -2235,7 +2227,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/slider@3.5.4", "@react-stately/slider@^3.5.4": +"@react-stately/slider@^3.5.4", "@react-stately/slider@3.5.4": version "3.5.4" resolved "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.4.tgz" integrity sha512-Jsf7K17dr93lkNKL9ij8HUcoM1sPbq8TvmibD6DhrK9If2lje+OOL8y4n4qreUnfMT56HCAeS9wCO3fg3eMyrw== @@ -2245,7 +2237,7 @@ "@react-types/slider" "^3.7.3" "@swc/helpers" "^0.5.0" -"@react-stately/table@3.11.8", "@react-stately/table@^3.11.8": +"@react-stately/table@^3.11.8", "@react-stately/table@3.11.8": version "3.11.8" resolved "https://registry.npmjs.org/@react-stately/table/-/table-3.11.8.tgz" integrity sha512-EdyRW3lT1/kAVDp5FkEIi1BQ7tvmD2YgniGdLuW/l9LADo0T+oxZqruv60qpUS6sQap+59Riaxl91ClDxrJnpg== @@ -2260,7 +2252,7 @@ "@react-types/table" "^3.9.5" "@swc/helpers" "^0.5.0" -"@react-stately/tabs@3.6.6", "@react-stately/tabs@^3.6.6": +"@react-stately/tabs@^3.6.6", "@react-stately/tabs@3.6.6": version "3.6.6" resolved "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.6.tgz" integrity sha512-sOLxorH2uqjAA+v1ppkMCc2YyjgqvSGeBDgtR/lyPSDd4CVMoTExszROX2dqG0c8il9RQvzFuufUtQWMY6PgSA== @@ -2270,7 +2262,7 @@ "@react-types/tabs" "^3.3.7" "@swc/helpers" "^0.5.0" -"@react-stately/toggle@3.7.4", "@react-stately/toggle@^3.7.4": +"@react-stately/toggle@^3.7.4", "@react-stately/toggle@3.7.4": version "3.7.4" resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.4.tgz" integrity sha512-CoYFe9WrhLkDP4HGDpJYQKwfiYCRBAeoBQHv+JWl5eyK61S8xSwoHsveYuEZ3bowx71zyCnNAqWRrmNOxJ4CKA== @@ -2288,7 +2280,7 @@ "@react-types/checkbox" "^3.8.3" "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@3.4.9", "@react-stately/tooltip@^3.4.9": +"@react-stately/tooltip@^3.4.9", "@react-stately/tooltip@3.4.9": version "3.4.9" resolved "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.9.tgz" integrity sha512-P7CDJsdoKarz32qFwf3VNS01lyC+63gXpDZG31pUu+EO5BeQd4WKN/AH1Beuswpr4GWzxzFc1aXQgERFGVzraA== @@ -2297,7 +2289,7 @@ "@react-types/tooltip" "^3.4.9" "@swc/helpers" "^0.5.0" -"@react-stately/tree@3.8.1", "@react-stately/tree@^3.8.1": +"@react-stately/tree@^3.8.1", "@react-stately/tree@3.8.1": version "3.8.1" resolved "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.1.tgz" integrity sha512-LOdkkruJWch3W89h4B/bXhfr0t0t1aRfEp+IMrrwdRAl23NaPqwl5ILHs4Xu5XDHqqhg8co73pHrJwUyiTWEjw== @@ -2308,7 +2300,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/utils@3.10.1", "@react-stately/utils@^3.10.1": +"@react-stately/utils@^3.10.1", "@react-stately/utils@3.10.1": version "3.10.1" resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.1.tgz" integrity sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg== @@ -2322,7 +2314,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/virtualizer@3.7.1", "@react-stately/virtualizer@^3.7.1": +"@react-stately/virtualizer@^3.7.1", "@react-stately/virtualizer@3.7.1": version "3.7.1" resolved "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.7.1.tgz" integrity sha512-voHgE6EQ+oZaLv6u2umKxakvIKNkCQuUihqKACTjdslp7SJh4Mvs3oLBI0hf0JOh+rCcFIKDvQtFwy1fXFRYBA== @@ -2338,7 +2330,7 @@ dependencies: "@react-types/shared" "^3.23.1" -"@react-types/breadcrumbs@3.7.5", "@react-types/breadcrumbs@^3.7.5": +"@react-types/breadcrumbs@^3.7.5", "@react-types/breadcrumbs@3.7.5": version "3.7.5" resolved "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.5.tgz" integrity sha512-lV9IDYsMiu2TgdMIjEmsOE0YWwjb3jhUNK1DCZZfq6uWuiHLgyx2EncazJBUWSjHJ4ta32j7xTuXch+8Ai6u/A== @@ -2346,7 +2338,7 @@ "@react-types/link" "^3.5.5" "@react-types/shared" "^3.23.1" -"@react-types/button@3.9.4", "@react-types/button@^3.9.4": +"@react-types/button@^3.9.4", "@react-types/button@3.9.4": version "3.9.4" resolved "https://registry.npmjs.org/@react-types/button/-/button-3.9.4.tgz" integrity sha512-raeQBJUxBp0axNF74TXB8/H50GY8Q3eV6cEKMbZFP1+Dzr09Ngv0tJBeW0ewAxAguNH5DRoMUAUGIXtSXskVdA== @@ -2360,7 +2352,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/calendar@3.4.6", "@react-types/calendar@^3.4.6": +"@react-types/calendar@^3.4.6", "@react-types/calendar@3.4.6": version "3.4.6" resolved "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.6.tgz" integrity sha512-WSntZPwtvsIYWvBQRAPvuCn55UTJBZroTvX0vQvWykJRQnPAI20G1hMQ3dNsnAL+gLZUYxBXn66vphmjUuSYew== @@ -2368,7 +2360,7 @@ "@internationalized/date" "^3.5.4" "@react-types/shared" "^3.23.1" -"@react-types/checkbox@3.8.1", "@react-types/checkbox@^3.8.1": +"@react-types/checkbox@^3.8.1", "@react-types/checkbox@3.8.1": version "3.8.1" resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.8.1.tgz" integrity sha512-5/oVByPw4MbR/8QSdHCaalmyWC71H/QGgd4aduTJSaNi825o+v/hsN2/CH7Fq9atkLKsC8fvKD00Bj2VGaKriQ== @@ -2382,14 +2374,14 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/combobox@3.11.1", "@react-types/combobox@^3.11.1": +"@react-types/combobox@^3.11.1", "@react-types/combobox@3.11.1": version "3.11.1" resolved "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.11.1.tgz" integrity sha512-UNc3OHt5cUt5gCTHqhQIqhaWwKCpaNciD8R7eQazmHiA9fq8ROlV+7l3gdNgdhJbTf5Bu/V5ISnN7Y1xwL3zqQ== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/datepicker@3.7.4", "@react-types/datepicker@^3.7.4": +"@react-types/datepicker@^3.7.4", "@react-types/datepicker@3.7.4": version "3.7.4" resolved "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.4.tgz" integrity sha512-ZfvgscvNzBJpYyVWg3nstJtA/VlWLwErwSkd1ivZYam859N30w8yH+4qoYLa6FzWLCFlrsRHyvtxlEM7lUAt5A== @@ -2407,7 +2399,7 @@ "@react-types/overlays" "^3.8.9" "@react-types/shared" "^3.24.1" -"@react-types/grid@3.2.6", "@react-types/grid@^3.2.6": +"@react-types/grid@^3.2.6", "@react-types/grid@3.2.6": version "3.2.6" resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.6.tgz" integrity sha512-XfHenL2jEBUYrhKiPdeM24mbLRXUn79wVzzMhrNYh24nBwhsPPpxF+gjFddT3Cy8dt6tRInfT6pMEu9nsXwaHw== @@ -2421,7 +2413,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/link@3.5.5", "@react-types/link@^3.5.5": +"@react-types/link@^3.5.5", "@react-types/link@3.5.5": version "3.5.5" resolved "https://registry.npmjs.org/@react-types/link/-/link-3.5.5.tgz" integrity sha512-G6P5WagHDR87npN7sEuC5IIgL1GsoY4WFWKO4734i2CXRYx24G9P0Su3AX4GA3qpspz8sK1AWkaCzBMmvnunfw== @@ -2435,7 +2427,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/menu@3.9.9", "@react-types/menu@^3.9.9": +"@react-types/menu@^3.9.9", "@react-types/menu@3.9.9": version "3.9.9" resolved "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.9.tgz" integrity sha512-FamUaPVs1Fxr4KOMI0YcR2rYZHoN7ypGtgiEiJ11v/tEPjPPGgeKDxii0McCrdOkjheatLN1yd2jmMwYj6hTDg== @@ -2443,7 +2435,7 @@ "@react-types/overlays" "^3.8.7" "@react-types/shared" "^3.23.1" -"@react-types/overlays@3.8.7", "@react-types/overlays@^3.8.7": +"@react-types/overlays@^3.8.7", "@react-types/overlays@3.8.7": version "3.8.7" resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.7.tgz" integrity sha512-zCOYvI4at2DkhVpviIClJ7bRrLXYhSg3Z3v9xymuPH3mkiuuP/dm8mUCtkyY4UhVeUTHmrQh1bzaOP00A+SSQA== @@ -2457,27 +2449,20 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/progress@3.5.4", "@react-types/progress@^3.5.4": +"@react-types/progress@^3.5.4", "@react-types/progress@3.5.4": version "3.5.4" resolved "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.4.tgz" integrity sha512-JNc246sTjasPyx5Dp7/s0rp3Bz4qlu4LrZTulZlxWyb53WgBNL7axc26CCi+I20rWL9+c7JjhrRxnLl/1cLN5g== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/radio@3.8.1", "@react-types/radio@^3.8.1": +"@react-types/radio@^3.8.1", "@react-types/radio@3.8.1": version "3.8.1" resolved "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.1.tgz" integrity sha512-bK0gio/qj1+0Ldu/3k/s9BaOZvnnRgvFtL3u5ky479+aLG5qf1CmYed3SKz8ErZ70JkpuCSrSwSCFf0t1IHovw== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/select@3.9.4": - version "3.9.4" - resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.4.tgz" - integrity sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg== - dependencies: - "@react-types/shared" "^3.23.1" - "@react-types/select@^3.9.6": version "3.9.6" resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.6.tgz" @@ -2485,7 +2470,14 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/shared@3.23.1", "@react-types/shared@^3.23.1": +"@react-types/select@3.9.4": + version "3.9.4" + resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.4.tgz" + integrity sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg== + dependencies: + "@react-types/shared" "^3.23.1" + +"@react-types/shared@^3.23.1", "@react-types/shared@3.23.1": version "3.23.1" resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.23.1.tgz" integrity sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw== @@ -2509,7 +2501,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/table@3.9.5", "@react-types/table@^3.9.5": +"@react-types/table@^3.9.5", "@react-types/table@3.9.5": version "3.9.5" resolved "https://registry.npmjs.org/@react-types/table/-/table-3.9.5.tgz" integrity sha512-fgM2j9F/UR4Anmd28CueghCgBwOZoCVyN8fjaIFPd2MN4gCwUUfANwxLav65gZk4BpwUXGoQdsW+X50L3555mg== @@ -2517,21 +2509,21 @@ "@react-types/grid" "^3.2.6" "@react-types/shared" "^3.23.1" -"@react-types/tabs@3.3.7", "@react-types/tabs@^3.3.7": +"@react-types/tabs@^3.3.7", "@react-types/tabs@3.3.7": version "3.3.7" resolved "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.7.tgz" integrity sha512-ZdLe5xOcFX6+/ni45Dl2jO0jFATpTnoSqj6kLIS/BYv8oh0n817OjJkLf+DS3CLfNjApJWrHqAk34xNh6nRnEg== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/textfield@3.9.3", "@react-types/textfield@^3.9.3": +"@react-types/textfield@^3.9.3", "@react-types/textfield@3.9.3": version "3.9.3" resolved "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.3.tgz" integrity sha512-DoAY6cYOL0pJhgNGI1Rosni7g72GAt4OVr2ltEx2S9ARmFZ0DBvdhA9lL2nywcnKMf27PEJcKMXzXc10qaHsJw== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/tooltip@3.4.9", "@react-types/tooltip@^3.4.9": +"@react-types/tooltip@^3.4.9", "@react-types/tooltip@3.4.9": version "3.4.9" resolved "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.9.tgz" integrity sha512-wZ+uF1+Zc43qG+cOJzioBmLUNjRa7ApdcT0LI1VvaYvH5GdfjzUJOorLX9V/vAci0XMJ50UZ+qsh79aUlw2yqg== @@ -2544,7 +2536,7 @@ resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/helpers@0.5.5", "@swc/helpers@^0.5.0": +"@swc/helpers@^0.5.0", "@swc/helpers@0.5.5": version "0.5.5" resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== @@ -4050,7 +4042,7 @@ dependencies: "@types/react" "*" -"@types/react@*": +"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0": version "18.3.11" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz" integrity sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ== @@ -4071,11 +4063,6 @@ abab@^2.0.5, abab@^2.0.6: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" @@ -4126,13 +4113,6 @@ ag-grid-react@^32.0.2: ag-grid-community "32.1.0" prop-types "^15.8.1" -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.1" resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz" @@ -4140,6 +4120,13 @@ agent-base@^7.0.2, agent-base@^7.1.0: dependencies: debug "^4.3.4" +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -4182,19 +4169,6 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - arg@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" @@ -4262,14 +4236,6 @@ body-scroll-lock@^3.1.5: resolved "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz" integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" @@ -4324,15 +4290,6 @@ caniuse-lite@^1.0.30001579: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001634.tgz" integrity sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA== -canvas@^2.8.0: - version "2.11.2" - resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860" - integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.0" - nan "^2.17.0" - simple-get "^3.0.3" - chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -4342,14 +4299,14 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chart.js@^4.4.6: +chart.js@^4.1.1, chart.js@^4.4.6: version "4.4.6" resolved "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz" integrity sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA== dependencies: "@kurkle/color" "^0.3.0" -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: +chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -4364,22 +4321,22 @@ chart.js@^4.4.6: optionalDependencies: fsevents "~2.3.2" -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - classnames@^2.3.1: version "2.5.1" resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== -client-only@0.0.1, client-only@^0.0.1: +client-only@^0.0.1, client-only@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -clsx@^1.1.1, clsx@^1.2.1: +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -4403,16 +4360,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-string@^1.9.0: version "1.9.1" resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" @@ -4421,16 +4378,6 @@ color-string@^1.9.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -color2k@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz" - integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== - color@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" @@ -4439,6 +4386,11 @@ color@^4.2.3: color-convert "^2.0.1" color-string "^1.9.0" +color2k@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz" + integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -4446,11 +4398,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@2: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@^11.0.0: version "11.1.0" resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" @@ -4461,6 +4408,11 @@ commander@^4.0.0: resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@2: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + complex.js@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz" @@ -4471,11 +4423,6 @@ compute-scroll-into-view@^3.0.2: resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz" integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - concaveman@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/concaveman/-/concaveman-1.2.1.tgz" @@ -4486,11 +4433,6 @@ concaveman@^1.2.1: robust-predicates "^2.0.4" tinyqueue "^2.0.3" -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" @@ -4591,13 +4533,6 @@ dayjs@^1.11.13: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@4, debug@^4.3.3, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - debug@^4.3.1: version "4.3.7" resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" @@ -4605,18 +4540,18 @@ debug@^4.3.1: dependencies: ms "^2.1.3" +debug@^4.3.3, debug@^4.3.4, debug@4: + version "4.3.5" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + decimal.js@^10.3.1, decimal.js@^10.4.3: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== - dependencies: - mimic-response "^2.0.0" - deepmerge@4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" @@ -4632,16 +4567,6 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" @@ -4832,25 +4757,13 @@ fraction.js@^4.3.7: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== -framer-motion@^11.2.13: +framer-motion@^11.2.13, framer-motion@>=10.17.0: version "11.3.21" resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-11.3.21.tgz" integrity sha512-D+hfIsvzV8eL/iycld4K+tKlg2Q2LdwnrcBEohtGw3cG1AIuNYATbT5RUqIM1ndsAk+EfGhoSGf0UaiFodc5Tw== dependencies: tslib "^2.4.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fs@^0.0.1-security: version "0.0.1-security" resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" @@ -4866,21 +4779,6 @@ function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - geojson-equality-ts@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/geojson-equality-ts/-/geojson-equality-ts-1.0.2.tgz" @@ -4925,18 +4823,6 @@ glob@^10.3.10: minipass "^7.1.2" path-scurry "^1.11.1" -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -4957,11 +4843,6 @@ has-flag@^3.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - hasown@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" @@ -5016,7 +4897,7 @@ https-proxy-agent@^7.0.0: agent-base "^7.0.2" debug "4" -iconv-lite@0.6.3, iconv-lite@^0.6.3: +iconv-lite@^0.6.3, iconv-lite@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -5041,17 +4922,9 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== international-types@^0.8.1: @@ -5382,13 +5255,6 @@ lru-cache@^10.2.0: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== -make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - marchingsquares@^1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/marchingsquares/-/marchingsquares-1.3.3.tgz" @@ -5439,18 +5305,6 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mimic-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - minimatch@^9.0.4: version "9.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" @@ -5458,37 +5312,17 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minipass@^3.0.0: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.1.2" resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" +minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.1.2, ms@^2.1.1: +ms@^2.1.1, ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -5519,11 +5353,6 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.17.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" - integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== - nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" @@ -5566,35 +5395,11 @@ next@14.2.3: "@next/swc-win32-ia32-msvc" "14.2.3" "@next/swc-win32-x64-msvc" "14.2.3" -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - nwsapi@^2.2.0: version "2.2.10" resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz" @@ -5610,13 +5415,6 @@ object-hash@^3.0.0: resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -once@^1.3.0, once@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - open@^8.0.0: version "8.4.2" resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" @@ -5648,11 +5446,6 @@ parse5@6.0.1: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -5758,6 +5551,15 @@ postcss-value-parser@^4.0.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^8, postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: + version "8.4.38" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -5767,15 +5569,6 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.23: - version "8.4.38" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - prettier@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" @@ -5870,7 +5663,7 @@ react-datepicker@^7.3.0: prop-types "^15.7.2" react-onclickoutside "^6.13.0" -react-dom@^18: +"react-dom@^15.5.x || ^16.x || ^17.x || ^18.x", "react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", "react-dom@^16.9.0 || ^17 || ^18", react-dom@^18, react-dom@^18.0.0, react-dom@^18.2.0, "react-dom@>= 16.3.0", react-dom@>=16.6.0, react-dom@>=16.8.0, react-dom@>=18: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -5982,7 +5775,7 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^18: +react@*, "react@^15.5.x || ^16.x || ^17.x || ^18.x", "react@^16.3.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17 || ^18", react@^18, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.3.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.13.1, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=18: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -5996,15 +5789,6 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@^4.2.0: version "4.5.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz" @@ -6064,13 +5848,6 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - robust-predicates@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz" @@ -6103,7 +5880,7 @@ safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.77.8: +sass@^1.3.0, sass@^1.77.8: version "1.77.8" resolved "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz" integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ== @@ -6138,16 +5915,6 @@ seedrandom@^3.0.5: resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== -semver@^6.0.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.5: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - semver@^7.5.4: version "7.6.2" resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" @@ -6158,11 +5925,6 @@ server-only@^0.0.1: resolved "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz" integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA== -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -6175,30 +5937,11 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" - integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== - dependencies: - decompress-response "^4.2.0" - once "^1.3.1" - simple-concat "^1.0.0" - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" @@ -6211,7 +5954,7 @@ skmeans@0.9.7: resolved "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz" integrity sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0: +source-map-js@^1.0.2, source-map-js@^1.2.0, "source-map-js@>=0.6.2 <2.0.0": version "1.2.0" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== @@ -6246,6 +5989,13 @@ streamsearch@^1.1.0: resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -6255,16 +6005,16 @@ streamsearch@^1.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: +string-width@^4.1.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: +string-width@^5.0.1: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -6273,14 +6023,23 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1, string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== +string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - safe-buffer "~5.2.0" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6343,7 +6102,7 @@ sweetalert2-react-content@^5.0.7: resolved "https://registry.npmjs.org/sweetalert2-react-content/-/sweetalert2-react-content-5.0.7.tgz" integrity sha512-8Fk82Mpk45lFXpJWKIFF/lq8k/dJKDDQGFcuqVosaL/qRdViyAs5+u37LoTGfnOIvf+rfQB3PAXcp1XLLn+0ew== -sweetalert2@^11.14.1: +sweetalert2@^11.0.0, sweetalert2@^11.14.1: version "11.14.1" resolved "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.14.1.tgz" integrity sha512-xadhfcA4STGMh8nC5zHFFWURhRpWc4zyI3GdMDFH/m3hGWZeQQNWhX9xcG4lI9gZYsi/IlazKbwvvje3juL3Xg== @@ -6370,7 +6129,7 @@ tailwind-variants@^0.1.20: dependencies: tailwind-merge "^1.14.0" -tailwindcss@^3.4.1: +tailwindcss@*, tailwindcss@^3.4.1, tailwindcss@>=3.4.0: version "3.4.4" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz" integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== @@ -6398,18 +6157,6 @@ tailwindcss@^3.4.1: resolve "^1.22.2" sucrase "^3.32.0" -tar@^6.1.11: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - tarn@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz" @@ -6498,11 +6245,6 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" @@ -6573,9 +6315,9 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^10.0.0: @@ -6602,11 +6344,6 @@ w3c-xmlserializer@^3.0.0: dependencies: xml-name-validator "^4.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" @@ -6640,14 +6377,6 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -6655,13 +6384,6 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -wide-align@^1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -6680,11 +6402,6 @@ wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - ws@^8.2.3: version "8.17.1" resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" @@ -6700,11 +6417,6 @@ xmlchars@^2.2.0: resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^1.10.0: version "1.10.2" resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" From c213cc3f1a5ca7fe5be52a7e17fc5322875d20df Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 21 Nov 2024 16:43:22 +0900 Subject: [PATCH 131/200] =?UTF-8?q?fix:=20=EB=8F=84=EB=A9=B4=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=ED=83=88?= =?UTF-8?q?=EC=8B=9C=20=EC=97=B4=EB=A0=A4=EC=9E=88=EB=8D=98=20=ED=8C=9D?= =?UTF-8?q?=EC=97=85=20=EC=B2=98=EB=A6=AC=20=EC=9D=B4=EC=8A=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 클린업 함수에서 usePopup -> closeAll 함수 호출로 해결 --- src/components/floor-plan/FloorPlan.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/floor-plan/FloorPlan.jsx b/src/components/floor-plan/FloorPlan.jsx index 4baf3eb0..ac2e141c 100644 --- a/src/components/floor-plan/FloorPlan.jsx +++ b/src/components/floor-plan/FloorPlan.jsx @@ -6,12 +6,14 @@ import { settingModalFirstOptionsState, settingModalSecondOptionsState } from '@ import CanvasMenu from '@/components/floor-plan/CanvasMenu' import { useCanvasMenu } from '@/hooks/common/useCanvasMenu' import { useCanvasSetting } from '@/hooks/option/useCanvasSetting' +import { usePopup } from '@/hooks/usePopup' import '@/styles/contents.scss' export default function FloorPlan({ children }) { const [settingModalFirstOptions, setSettingModalFirstOptions] = useRecoilState(settingModalFirstOptionsState) const [settingModalSecondOptions, setSettingModalSecondOptions] = useRecoilState(settingModalSecondOptionsState) const [objectNo, setObjectNo] = useState('test123240912001') // 이후 삭제 필요 + const { closeAll } = usePopup() const { menuNumber, setMenuNumber } = useCanvasMenu() @@ -24,6 +26,9 @@ export default function FloorPlan({ children }) { useEffect(() => { fetchSettings() + return () => { + closeAll() + } }, [objectNo]) return ( From eb5f329922a6be82077f2f23cfef852d0733ec09 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 21 Nov 2024 17:43:09 +0900 Subject: [PATCH 132/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20&&=20=EB=AC=BC=EA=B1=B4=20=EC=83=81=EC=84=B8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=EC=8B=9C=20url=EC=97=90=20objectNo=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 58 +++++++++++-------- src/components/management/StuffDetail.jsx | 14 ++--- .../management/StuffSearchCondition.jsx | 54 ++++++++++++++--- src/components/management/StuffSubHeader.jsx | 2 + 4 files changed, 87 insertions(+), 41 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 1fc1bc47..37cda261 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -177,8 +177,9 @@ export default function Stuff() { schSelSaleStoreId: stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : '', schOtherSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : '', schSortType: stuffSearchParams.schSortType, + pageNo: stuffSearchParams?.pageNo ? stuffSearchParams.pageNo : 1, + pageSize: stuffSearchParams?.pageSize ? stuffSearchParams.pageSize : 100, } - async function fetchData() { const apiUrl = `/api/object/list?${queryStringFormatter(params)}` await get({ @@ -209,6 +210,8 @@ export default function Stuff() { schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : stuffSearchParams.schSelSaleStoreId, schSortType: 'R', code: 'S', + pageNo: 1, + pageSize: 100, } setStuffSearch({ ...params, @@ -256,6 +259,31 @@ export default function Stuff() { } fetchData() + } else if (stuffSearchParams?.code === 'DELETE') { + const newParams = { + saleStoreId: session.storeId, + schObjectNo: '', + schAddress: '', + schObjectName: '', + schSaleStoreName: '', + schReceiveUser: '', + schDispCompanyName: '', + schDateType: 'U', + schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), + schToDt: dayjs(new Date()).format('YYYY-MM-DD'), + startRow: '1', + endRow: '100', + schSelSaleStoreId: '', + schOtherSelSaleStoreId: '', + schSortType: 'R', + code: 'S', + pageNo: 1, + pageSize: 100, + } + + setStuffSearch({ + ...newParams, + }) } }, [stuffSearchParams]) @@ -263,31 +291,23 @@ export default function Stuff() { const onChangePerPage = (e) => { let startRow = (1 - 1) * e.target.value + 1 stuffSearchParams.startRow = startRow - stuffSearchParams.endRow = stuffSearchParams.pageNo * e.target.value + stuffSearchParams.endRow = 1 * e.target.value stuffSearchParams.schSelSaleStoreId = stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : stuffSearchParams.schSelSaleStoreId + stuffSearchParams.pageNo = startRow + stuffSearchParams.pageSize = 1 * e.target.value setPageSize(e.target.value) + setStuffSearch({ ...stuffSearch, code: 'S', startRow: startRow, - endRow: stuffSearchParams.pageNo * e.target.value, + endRow: 1 * e.target.value, pageSize: e.target.value, }) setPageNo(1) - - // const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` - // get({ url: apiUrl }).then((res) => { - // if (!isEmptyArray(res)) { - // setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) - // setTotalCount(res[0].totCnt) - // } else { - // setGridProps({ ...gridProps, gridData: [], count: 0 }) - // setTotalCount(0) - // } - // }) } //최근 등록일 수정일 정렬 이벤트 @@ -310,16 +330,6 @@ export default function Stuff() { }) setPageNo(1) - // const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` - // get({ url: apiUrl }).then((res) => { - // if (!isEmptyArray(res)) { - // setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) - // setTotalCount(res[0].totCnt) - // } else { - // setGridProps({ ...gridProps, gridData: [], count: 0 }) - // setTotalCount(0) - // } - // }) } useEffect(() => { diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 3daa3a3a..4847ff02 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -1337,7 +1337,7 @@ export default function StuffDetail() { } else { await promisePost({ url: apiUrl, data: params }).then((res) => { if (res.status === 201) { - alert(getMessage('stuff.detail.save')) + alert(getMessage('stuff.detail.tempSave.message1')) router.push(`/management/stuff/tempdetail?objectNo=${res.data.objectNo.toString()}`, { scroll: false }) } }) @@ -1346,7 +1346,6 @@ export default function StuffDetail() { // 물건삭제 const onDelete = () => { - // console.log('검색조건리코일값:::::', stuffSearchParams) const specificationConfirmDate = managementState.specificationConfirmDate if (specificationConfirmDate != null) { alert(getMessage('stuff.detail.delete.message1')) @@ -1354,12 +1353,11 @@ export default function StuffDetail() { if (confirm(getMessage('common.message.data.delete'))) { del({ url: `/api/object/${objectNo}` }).then(() => { setFloorPlanObjectNo({ floorPlanObjectNo: '' }) - // console.log('초기화::::::::::') - // resetStuffRecoil() - // stuffSearchParams.code = 'DELETE' - // stuffSearchParams.schSelSaleStoreId = '' - // stuffSearchParams.schOtherSelSaleStoreId = '' - // console.log('판매점 초기화도') + if (session.storeId === 'T01') { + stuffSearchParams.code = 'DELETE' + } else { + resetStuffRecoil() + } router.push('/management/stuff') }) } diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index a1085beb..8208947f 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -360,15 +360,51 @@ export default function StuffSearchCondition() { } useEffect(() => { - setStartDate(stuffSearch?.schFromDt ? stuffSearch.schFromDt : dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD')) - setEndDate(stuffSearch?.schToDt ? stuffSearch.schToDt : dayjs(new Date()).format('YYYY-MM-DD')) - setObjectNo(stuffSearch.schObjectNo ? stuffSearch.schObjectNo : objectNo) - setSaleStoreName(stuffSearch.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName) - setAddress(stuffSearch.schAddress ? stuffSearch.schAddress : address) - setobjectName(stuffSearch.schObjectName ? stuffSearch.schObjectName : objectName) - setDispCompanyName(stuffSearch.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName) - setReceiveUser(stuffSearch.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser) - setDateType(stuffSearch.schDateType ? stuffSearch.schDateType : dateType) + if (session?.storeId === 'T01') { + if (stuffSearch.code === 'DELETE') { + setObjectNo('') + setSaleStoreName('') + setAddress('') + setobjectName('') + setDispCompanyName('') + setReceiveUser('') + objectNoRef.current.value = '' + saleStoreNameRef.current.value = '' + addressRef.current.value = '' + objectNameRef.current.value = '' + dispCompanyNameRef.current.value = '' + receiveUserRef.current.value = '' + stuffSearch.schObjectNo = '' + stuffSearch.schAddress = '' + stuffSearch.schObjectName = '' + stuffSearch.schSaleStoreName = '' + stuffSearch.schReceiveUser = '' + stuffSearch.schDispCompanyName = '' + stuffSearch.schDateType = 'U' + stuffSearch.schFromDt = dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD') + stuffSearch.schToDt = dayjs(new Date()).format('YYYY-MM-DD') + stuffSearch.startRow = '1' + stuffSearch.endRow = '100' + stuffSearch.schSelSaleStoreId = '' + stuffSearch.schOtherSelSaleStoreId = '' + stuffSearch.schSortType = 'R' + stuffSearch.pageNo = 1 + stuffSearch.pageSize = '100' + + setSchSelSaleStoreId('') + setOtherSaleStoreId('') + } + } else { + setStartDate(stuffSearch?.schFromDt ? stuffSearch.schFromDt : dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD')) + setEndDate(stuffSearch?.schToDt ? stuffSearch.schToDt : dayjs(new Date()).format('YYYY-MM-DD')) + setObjectNo(stuffSearch.schObjectNo ? stuffSearch.schObjectNo : objectNo) + setSaleStoreName(stuffSearch.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName) + setAddress(stuffSearch.schAddress ? stuffSearch.schAddress : address) + setobjectName(stuffSearch.schObjectName ? stuffSearch.schObjectName : objectName) + setDispCompanyName(stuffSearch.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName) + setReceiveUser(stuffSearch.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser) + setDateType(stuffSearch.schDateType ? stuffSearch.schDateType : dateType) + } }, [stuffSearch]) useEffect(() => { diff --git a/src/components/management/StuffSubHeader.jsx b/src/components/management/StuffSubHeader.jsx index dbdd974b..1ea2a699 100644 --- a/src/components/management/StuffSubHeader.jsx +++ b/src/components/management/StuffSubHeader.jsx @@ -27,8 +27,10 @@ export default function StuffSubHeader({ type }) { const param = { pid: '1', + objectNo: objectNo, } const url = `/floor-plan?${queryStringFormatter(param)}` + router.push(url) } From d7bdfa489266613eb6003bd21eca9d4bca3f5d37 Mon Sep 17 00:00:00 2001 From: Jaeyoung Lee Date: Thu, 21 Nov 2024 18:28:39 +0900 Subject: [PATCH 133/200] =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BFA,B=20?= =?UTF-8?q?=EC=A4=91=EA=B0=84=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Roof2.jsx | 35 +-- src/components/fabric/QPolygon.js | 13 +- src/hooks/useMode.js | 55 +---- src/util/qpolygon-utils.js | 361 ++++++++++++++++++++++++++++++ 4 files changed, 397 insertions(+), 67 deletions(-) diff --git a/src/components/Roof2.jsx b/src/components/Roof2.jsx index 721e3543..648c8bf3 100644 --- a/src/components/Roof2.jsx +++ b/src/components/Roof2.jsx @@ -5,7 +5,7 @@ import { useEffect, useRef, useState } from 'react' import { v4 as uuidv4 } from 'uuid' import { useMode } from '@/hooks/useMode' import { LINE_TYPE, Mode } from '@/common/common' -import { Button, Input } from '@nextui-org/react' +import { Button } from '@nextui-org/react' import RangeSlider from './ui/RangeSlider' import { useRecoilState, useRecoilValue } from 'recoil' import { @@ -410,10 +410,10 @@ export default function Roof2(props) { ] const rectangleType1 = [ - { x: 100, y: 100 }, - { x: 100, y: 600 }, - { x: 300, y: 600 }, - { x: 300, y: 100 }, + { x: 500, y: 100 }, + { x: 500, y: 800 }, + { x: 900, y: 800 }, + { x: 900, y: 100 }, ] const rectangleType2 = [ @@ -460,6 +460,15 @@ export default function Roof2(props) { { x: 200, y: 100 }, ] + const test4 = [ + { x: 100, y: 100 }, + { x: 100, y: 1000 }, + { x: 1100, y: 1000 }, + { x: 1100, y: 550 }, + { x: 500, y: 550 }, + { x: 500, y: 100 }, + ] + const polygon = new QPolygon(eightPoint4, { fill: 'transparent', stroke: 'green', @@ -1021,7 +1030,7 @@ export default function Roof2(props) { )} -
    + {/*

    각도 입력(0~360) 후 방향설정 클릭

    방향 설정 -
    -
    - {/* Compass Circle */} +
    */} + {/*
    + Compass Circle
    - {/* N, S, E, W Labels */} + N, S, E, W Labels
    N
    S
    @@ -1057,9 +1066,9 @@ export default function Roof2(props) {
    - {/* Compass Pointer */} + Compass Pointer
    - {/* Red Upper Triangle */} + Red Upper Triangle
    -
    +
    */}
    {!canvas ? null : mode === Mode.DRAW_LINE ? ( diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index c5a08cf1..808f6765 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -1,15 +1,8 @@ import { fabric } from 'fabric' import { v4 as uuidv4 } from 'uuid' import { QLine } from '@/components/fabric/QLine' -import { - distanceBetweenPoints, - findTopTwoIndexesByDistance, - getAllRelatedObjects, - getDirectionByPoint, - sortedPointLessEightPoint, - sortedPoints, -} from '@/util/canvas-util' -import { calculateAngle, drawRidgeRoof, drawShedRoof, inPolygon, toGeoJSON } from '@/util/qpolygon-utils' +import { distanceBetweenPoints, findTopTwoIndexesByDistance, getDirectionByPoint, sortedPointLessEightPoint, sortedPoints } from '@/util/canvas-util' +import { calculateAngle, drawGabledRoof, drawRidgeRoof, drawShedRoof, inPolygon, toGeoJSON } from '@/util/qpolygon-utils' import * as turf from '@turf/turf' import { LINE_TYPE } from '@/common/common' @@ -217,7 +210,7 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { (gableOdd.every((type) => type === LINE_TYPE.WALLLINE.EAVES) && gableEven.every((type) => gableType.includes(type))) || (gableEven.every((type) => type === LINE_TYPE.WALLLINE.EAVES) && gableOdd.every((type) => gableType.includes(type))) ) { - console.log('박공 지붕') + drawGabledRoof(this.id, this.canvas) } else if (hasShed) { const sheds = this.lines.filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.SHED) const areLinesParallel = function (line1, line2) { diff --git a/src/hooks/useMode.js b/src/hooks/useMode.js index 2ab7de9f..e97621f1 100644 --- a/src/hooks/useMode.js +++ b/src/hooks/useMode.js @@ -1508,55 +1508,14 @@ export function useMode() { const handleOuterlinesTest2 = (polygon, offset = 50) => { // TODO [ljyoung] : offset 입력 처리 후 제거 해야함. polygon.lines.forEach((line, index) => { - line.attributes = { + /*line.attributes = { type: LINE_TYPE.WALLLINE.EAVES, offset: 50, width: 50, pitch: 4, sleeve: true, - } - /*if (index === 1) { - line.attributes = { - type: LINE_TYPE.WALLLINE.SHED, - offset: 30, //출폭 - width: 30, //폭 - pitch: 4, //구배 - sleeve: true, //소매 - } - } else if (index === 5 || index === 3) { - line.attributes = { - type: LINE_TYPE.WALLLINE.EAVES, - offset: 50, //출폭 - width: 30, //폭 - pitch: 4, //구배 - sleeve: true, //소매 - } - } else { - line.attributes = { - type: LINE_TYPE.WALLLINE.GABLE, - offset: 20, - width: 50, - pitch: 4, - sleeve: true, - } }*/ - /* if (index === 1) { - line.attributes = { - type: LINE_TYPE.WALLLINE.SHED, - offset: 20, //출폭 - width: 30, //폭 - pitch: 4, //구배 - sleeve: true, //소매 - } - } else if (index === 3) { - line.attributes = { - type: LINE_TYPE.WALLLINE.EAVES, - offset: 50, //출폭 - width: 30, //폭 - pitch: 4, //구배 - sleeve: true, //소매 - } - } else { + if (index % 2 !== 0) { line.attributes = { type: LINE_TYPE.WALLLINE.GABLE, offset: 30, @@ -1564,7 +1523,15 @@ export function useMode() { pitch: 4, sleeve: true, } - }*/ + } else { + line.attributes = { + type: LINE_TYPE.WALLLINE.EAVES, + offset: 50, + width: 50, + pitch: 4, + sleeve: true, + } + } }) const roof = drawRoofPolygon(polygon) //지붕 그리기 diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index 3ed8f9a1..d7385305 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1232,6 +1232,367 @@ function calculateAngleBetweenLines(line1, line2) { return (angleInRadians * 180) / Math.PI } +/** + * 박공지붕(templateA, templateB)을 그린다. + * @param roofId + * @param canvas + */ +export const drawGabledRoof = (roofId, canvas) => { + const roof = canvas?.getObjects().find((object) => object.id === roofId) + const roofLines = roof.lines + const wallLines = canvas?.getObjects().find((object) => object.name === POLYGON_TYPE.WALL && object.attributes.roofId === roof.id).lines + const hasNonParallelLines = roofLines.filter((line) => line.x1 !== line.x2 && line.y1 !== line.y2) + if (hasNonParallelLines.length > 0) { + alert('대각선이 존재합니다.') + return + } + + const roofPoints = roof.points + const minX = Math.min(...roofPoints.map((point) => point.x)) + const maxX = Math.max(...roofPoints.map((point) => point.x)) + const minY = Math.min(...roofPoints.map((point) => point.y)) + const maxY = Math.max(...roofPoints.map((point) => point.y)) + + const checkLength = Math.abs(Math.sqrt(Math.pow(maxX - minX, 2) + Math.pow(maxY - minY, 2))) + + wallLines + .filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.GABLE) + .forEach((gable) => { + const gableLine = new QLine([gable.x1, gable.y1, gable.x2, gable.y2], { + fontSize: roof.fontSize, + stroke: 'cyan', + strokeWidth: 2, + }) + canvas.add(gableLine) + canvas.renderAll() + }) + + const eaves = [] + roofLines.forEach((currentRoof, index) => { + if (currentRoof.attributes !== undefined && currentRoof.attributes.type === LINE_TYPE.WALLLINE.EAVES) { + eaves.push({ index: index, roof: currentRoof, length: currentRoof.attributes.planeSize }) + } + }) + const ridgeCount = eaves.length - 1 + const ridges = [] + eaves.sort((a, b) => a.length - b.length) + + eaves.forEach((eave, index) => { + if (ridges.length < ridgeCount) { + const index = eave.index, + currentRoof = eave.roof + const currentWall = wallLines[index] + const prevRoof = index === 0 ? roofLines[wallLines.length - 1] : roofLines[index - 1] + const nextRoof = index === roofLines.length - 1 ? roofLines[0] : index === roofLines.length ? roofLines[1] : roofLines[index + 1] + + const midX = Math.round(((currentRoof.x1 + currentRoof.x2) / 2) * 10) / 10 + const midY = Math.round(((currentRoof.y1 + currentRoof.y2) / 2) * 10) / 10 + const deltaX = currentWall.x2 - currentWall.x1 + const deltaY = currentWall.y2 - currentWall.y1 + const length = Math.sqrt(deltaX * deltaX + deltaY * deltaY) + // currentWall과 직각인 기울기 계산 + const perpendicularDeltaX = deltaY / length + const perpendicularDeltaY = -deltaX / length + // midX와 midY를 기준으로 직각 기울기를 사용하여 midWallX와 midWallY 계산 + const midWallX = midX + perpendicularDeltaX * length + const midWallY = midY + perpendicularDeltaY * length + + const signX = Math.sign(midX - midWallX) + const signY = Math.sign(midY - midWallY) + const checkX = Math.round((midX - signX * checkLength) * 10) / 10 + const checkY = Math.round((midY - signY * checkLength) * 10) / 10 + + const intersectLines = [] + roofLines + .filter((line) => line !== currentRoof) + .forEach((line) => { + const intersect = edgesIntersection( + { vertex1: { x: midX, y: midY }, vertex2: { x: checkX, y: checkY } }, + { vertex1: { x: line.x1, y: line.y1 }, vertex2: { x: line.x2, y: line.y2 } }, + ) + if (intersect && !intersect.isIntersectionOutside) { + intersectLines.push({ x: intersect.x, y: intersect.y, line: line }) + } + }) + + const intersect = intersectLines.reduce((prev, current) => { + if (prev !== undefined) { + const prevDistance = Math.sqrt(Math.pow(prev.x - midX, 2) + Math.pow(prev.y - midY, 2)) + const currentDistance = Math.sqrt(Math.pow(current.x - midX, 2) + Math.pow(current.y - midY, 2)) + return prevDistance >= currentDistance ? current : prev + } else { + return current + } + }, undefined) + + const linesCenterX = Math.round(((midX + intersect.x) / 2) * 10) / 10 + const linesCenterY = Math.round(((midY + intersect.y) / 2) * 10) / 10 + + let addLength = currentRoof.attributes.planeSize / 2 / 10 + + let centerLineX1 = Math.sign(currentRoof.x1 - currentRoof.x2) * addLength + linesCenterX + let centerLineY1 = Math.sign(currentRoof.y1 - currentRoof.y2) * addLength + linesCenterY + let centerLineX2 = Math.sign(currentRoof.x2 - currentRoof.x1) * addLength + linesCenterX + let centerLineY2 = Math.sign(currentRoof.y2 - currentRoof.y1) * addLength + linesCenterY + + const point1Intersect = [] + const point2Intersect = [] + roofLines.forEach((line) => { + const point1 = edgesIntersection( + { vertex1: { x: linesCenterX, y: linesCenterY }, vertex2: { x: centerLineX1, y: centerLineY1 } }, + { vertex1: { x: line.x1, y: line.y1 }, vertex2: { x: line.x2, y: line.y2 } }, + ) + if (point1 && !point1.isIntersectionOutside) { + point1Intersect.push({ x: point1.x, y: point1.y }) + } + const point2 = edgesIntersection( + { vertex1: { x: linesCenterX, y: linesCenterY }, vertex2: { x: centerLineX2, y: centerLineY2 } }, + { vertex1: { x: line.x1, y: line.y1 }, vertex2: { x: line.x2, y: line.y2 } }, + ) + if (point2 && !point2.isIntersectionOutside) { + point2Intersect.push({ x: point2.x, y: point2.y }) + } + }) + point1Intersect.reduce((prev, current) => { + if (prev !== undefined) { + const prevDistance = Math.sqrt(Math.pow(prev.x - linesCenterX, 2) + Math.pow(prev.y - linesCenterY, 2)) + const currentDistance = Math.sqrt(Math.pow(current.x - linesCenterX, 2) + Math.pow(current.y - linesCenterY, 2)) + return prevDistance >= currentDistance ? current : prev + } else { + return current + } + }, undefined) + point2Intersect.reduce((prev, current) => { + if (prev !== undefined) { + const prevDistance = Math.sqrt(Math.pow(prev.x - linesCenterX, 2) + Math.pow(prev.y - linesCenterY, 2)) + const currentDistance = Math.sqrt(Math.pow(current.x - linesCenterX, 2) + Math.pow(current.y - linesCenterY, 2)) + return prevDistance >= currentDistance ? current : prev + } else { + return current + } + }, undefined) + + if (point1Intersect.length > 0) { + centerLineX1 = point1Intersect[0].x + centerLineY1 = point1Intersect[0].y + } + if (point2Intersect.length > 0) { + centerLineX2 = point2Intersect[0].x + centerLineY2 = point2Intersect[0].y + } + + const ridge = new QLine([centerLineX1, centerLineY1, centerLineX2, centerLineY2], { + fontSize: roof.fontSize, + stroke: 'blue', + strokeWidth: 1, + name: LINE_TYPE.SUBLINE.RIDGE, + attributes: { roofId: roof.id, currentRoof: currentRoof.id }, + }) + canvas.add(ridge) + canvas.renderAll() + ridges.push(ridge) + } + }) + eaves.forEach((eave) => { + const index = eave.index, + currentRoof = eave.roof + const currentWall = wallLines[index] + const prevRoof = index === 0 ? roofLines[wallLines.length - 1] : roofLines[index - 1] + const nextRoof = index === roofLines.length - 1 ? roofLines[0] : index === roofLines.length ? roofLines[1] : roofLines[index + 1] + + /*const midX = Math.round(((currentRoof.x1 + currentRoof.x2) / 2) * 10) / 10 + const midY = Math.round(((currentRoof.y1 + currentRoof.y2) / 2) * 10) / 10 + const midWallX = Math.round(((currentWall.x1 + currentWall.x2) / 2) * 10) / 10 + const midWallY = Math.round(((currentWall.y1 + currentWall.y2) / 2) * 10) / 10 + const signX = Math.sign(midX - midWallX) + const signY = Math.sign(midY - midWallY) +*/ + const midX = Math.round(((currentRoof.x1 + currentRoof.x2) / 2) * 10) / 10 + const midY = Math.round(((currentRoof.y1 + currentRoof.y2) / 2) * 10) / 10 + const deltaX = currentWall.x2 - currentWall.x1 + const deltaY = currentWall.y2 - currentWall.y1 + const length = Math.sqrt(deltaX * deltaX + deltaY * deltaY) + // currentWall과 직각인 기울기 계산 + const perpendicularDeltaX = deltaY / length + const perpendicularDeltaY = -deltaX / length + // midX와 midY를 기준으로 직각 기울기를 사용하여 midWallX와 midWallY 계산 + const midWallX = midX + perpendicularDeltaX * length + const midWallY = midY + perpendicularDeltaY * length + const signX = Math.sign(midX - midWallX) + const signY = Math.sign(midY - midWallY) + + let points = [] + const intersectRidge = [] + // 현재 roof가 wall보다 작을때 이전, 다음 지붕의 offset만큼 포인트를 조정한다. + if (currentRoof.attributes.planeSize >= currentWall.attributes.planeSize) { + points.push({ x: currentRoof.x1, y: currentRoof.y1 }, { x: currentRoof.x2, y: currentRoof.y2 }) + } else { + const deltaX = currentRoof.x2 - currentRoof.x1 + const deltaY = currentRoof.y2 - currentRoof.y1 + points.push( + { x: currentRoof.x1 - Math.sign(deltaX) * prevRoof.attributes.offset, y: currentRoof.y1 - Math.sign(deltaY) * prevRoof.attributes.offset }, + { x: currentRoof.x2 + Math.sign(deltaX) * nextRoof.attributes.offset, y: currentRoof.y2 + Math.sign(deltaY) * nextRoof.attributes.offset }, + ) + } + ridges.forEach((ridge) => { + const ridgeMidX = (ridge.x1 + ridge.x2) / 2 + const ridgeMidY = (ridge.y1 + ridge.y2) / 2 + if (midX === ridgeMidX || midY === ridgeMidY) { + const intersection = edgesIntersection( + { vertex1: { x: midX, y: midY }, vertex2: { x: ridgeMidX, y: ridgeMidY } }, + { vertex1: { x: ridge.x1, y: ridge.y1 }, vertex2: { x: ridge.x2, y: ridge.y2 } }, + ) + if (intersection && !intersection.isIntersectionOutside) { + intersectRidge.push({ line: ridge, name: 'mid' }) + } + } + console.log('signX : ', signX, 'signY : ', signY) + if (Math.sign(midX - ridgeMidX) === signX || Math.sign(midY - ridgeMidY) === signY) { + const prevIntersect = edgesIntersection( + { vertex1: { x: prevRoof.x1, y: prevRoof.y1 }, vertex2: { x: prevRoof.x2, y: prevRoof.y2 } }, + { vertex1: { x: ridge.x1, y: ridge.y1 }, vertex2: { x: ridge.x2, y: ridge.y2 } }, + ) + const nextIntersect = edgesIntersection( + { vertex1: { x: nextRoof.x1, y: nextRoof.y1 }, vertex2: { x: nextRoof.x2, y: nextRoof.y2 } }, + { vertex1: { x: ridge.x1, y: ridge.y1 }, vertex2: { x: ridge.x2, y: ridge.y2 } }, + ) + if (prevIntersect && !prevIntersect.isIntersectionOutside) { + intersectRidge.push({ line: ridge, name: 'prev' }) + } + if (nextIntersect && !nextIntersect.isIntersectionOutside) { + intersectRidge.push({ line: ridge, name: 'next' }) + } + } + }) + + intersectRidge.forEach((intersect) => { + const line = intersect.line + if (currentRoof.attributes.planeSize >= currentWall.attributes.planeSize) { + points.push({ x: line.x1, y: line.y1 }, { x: line.x2, y: line.y2 }) + } else { + if (intersect.name === 'mid') { + let lineX1 = line.x1, + lineY1 = line.y1, + lineX2 = line.x2, + lineY2 = line.y2 + const prevCheck1 = Math.sqrt(Math.pow(Math.round(lineX1 - currentRoof.x1), 2) + Math.pow(Math.round(lineY1 - currentRoof.y1), 2)) + const prevCheck2 = Math.sqrt(Math.pow(Math.round(lineX2 - currentRoof.x1), 2) + Math.pow(Math.round(lineY2 - currentRoof.y1), 2)) + const deltaX = currentRoof.x2 - currentRoof.x1 + const deltaY = currentRoof.y2 - currentRoof.y1 + console.log('deltaX : ', deltaX, 'deltaY : ', deltaY) + if (prevCheck1 < prevCheck2) { + lineX1 = lineX1 - Math.sign(deltaX) * prevRoof.attributes.offset + lineY1 = lineY1 - Math.sign(deltaY) * prevRoof.attributes.offset + lineX2 = lineX2 + Math.sign(deltaX) * nextRoof.attributes.offset + lineY2 = lineY2 + Math.sign(deltaY) * nextRoof.attributes.offset + } else { + lineX1 = lineX1 + Math.sign(deltaX) * prevRoof.attributes.offset + lineY1 = lineY1 + Math.sign(deltaY) * prevRoof.attributes.offset + lineX2 = lineX2 - Math.sign(deltaX) * nextRoof.attributes.offset + lineY2 = lineY2 - Math.sign(deltaY) * nextRoof.attributes.offset + } + points.push({ x: lineX1, y: lineY1 }, { x: lineX2, y: lineY2 }) + } + } + }) + points = points.filter((point, index, self) => index === self.findIndex((p) => p.x === point.x && p.y === point.y)) + + const startPoint = points + .filter((point) => point.x === Math.min(...points.map((point) => point.x))) + .reduce((prev, current) => { + return prev.y < current.y ? prev : current + }) + const sortedPoints = [startPoint] + points.forEach((p, index) => { + const lastPoint = sortedPoints[sortedPoints.length - 1] + if (index === 0) { + const underStartPoint = points.filter((point) => point.y > startPoint.y) + const nextPoint = underStartPoint + .filter((point) => point.x === startPoint.x) + .reduce((prev, current) => { + return Math.abs(prev.y - startPoint.y) < Math.abs(current.y - startPoint.y) ? prev : current + }) + if (nextPoint) { + sortedPoints.push(nextPoint) + } else { + const nextPoint = underStartPoint.reduce((prev, current) => { + const prevHypos = Math.sqrt(Math.abs(Math.pow(prev.x - startPoint.x, 2)) + Math.abs(Math.pow(prev.y - startPoint.y, 2))) + const currentHypos = Math.sqrt(Math.abs(Math.pow(current.x - startPoint.x, 2)) + Math.abs(Math.pow(current.y - startPoint.y, 2))) + return prevHypos < currentHypos ? prev : current + }) + sortedPoints.push(nextPoint) + } + } else { + const prevPoint = sortedPoints[sortedPoints.length - 2] + const otherPoints = points.filter((point) => sortedPoints.includes(point) === false) + const nextPoint = otherPoints.reduce((prev, current) => { + if (prev === undefined) { + const height = Math.abs(Math.sqrt(Math.abs(Math.pow(prevPoint.x - lastPoint.x, 2)) + Math.abs(Math.pow(prevPoint.y - lastPoint.y, 2)))) + const adjacent = Math.abs(Math.sqrt(Math.abs(Math.pow(current.x - lastPoint.x, 2)) + Math.abs(Math.pow(current.y - lastPoint.y, 2)))) + const hypotenuse = Math.abs(Math.sqrt(Math.abs(Math.pow(current.x - prevPoint.x, 2)) + Math.abs(Math.pow(current.y - prevPoint.y, 2)))) + + const angle = Math.round( + Math.acos((Math.pow(adjacent, 2) + Math.pow(height, 2) - Math.pow(hypotenuse, 2)) / (2 * adjacent * height)) * (180 / Math.PI), + ) + if (angle === 90) { + return current + } + } else { + return prev + } + }, undefined) + if (nextPoint) { + sortedPoints.push(nextPoint) + } else { + const nextPoint = otherPoints.reduce((prev, current) => { + if (prev !== undefined) { + const height = Math.abs(Math.sqrt(Math.abs(Math.pow(prevPoint.x - lastPoint.x, 2)) + Math.abs(Math.pow(prevPoint.y - lastPoint.y, 2)))) + const adjacentC = Math.abs(Math.sqrt(Math.abs(Math.pow(current.x - lastPoint.x, 2)) + Math.abs(Math.pow(current.y - lastPoint.y, 2)))) + const hypotenuseC = Math.abs(Math.sqrt(Math.abs(Math.pow(current.x - prevPoint.x, 2)) + Math.abs(Math.pow(current.y - prevPoint.y, 2)))) + + const angleC = Math.round( + Math.acos((Math.pow(adjacentC, 2) + Math.pow(height, 2) - Math.pow(hypotenuseC, 2)) / (2 * adjacentC * height)) * (180 / Math.PI), + ) + + const adjacentP = Math.abs(Math.sqrt(Math.abs(Math.pow(prev.x - lastPoint.x, 2)) + Math.abs(Math.pow(prev.y - lastPoint.y, 2)))) + const hypotenuseP = Math.abs(Math.sqrt(Math.abs(Math.pow(prev.x - prevPoint.x, 2)) + Math.abs(Math.pow(prev.y - prevPoint.y, 2)))) + + const angleP = Math.round( + Math.acos((Math.pow(adjacentP, 2) + Math.pow(height, 2) - Math.pow(hypotenuseP, 2)) / (2 * adjacentP * height)) * (180 / Math.PI), + ) + + if (Math.abs(90 - angleC) < Math.abs(90 - angleP)) { + return current + } else { + return prev + } + } else { + return current + } + }, undefined) + if (nextPoint) { + sortedPoints.push(nextPoint) + } + } + } + }) + console.log('sortedPoints : ', sortedPoints) + if (sortedPoints.length > 0) { + const roofPolygon = new QPolygon(sortedPoints, { + fill: 'transparent', + stroke: 'blue', + strokeWidth: 1, + selectable: false, + fontSize: roof.fontSize, + name: 'roofPolygon', + attributes: { roofId: roof.id, currentRoof: currentRoof.id }, + }) + canvas.add(roofPolygon) + canvas.renderAll() + } + }) +} + /** * 한쪽흐름 지붕 * @param roofId From c66a29cf35ad84d124bfd6db966e0094d122f10a Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 21 Nov 2024 22:50:47 +0900 Subject: [PATCH 134/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EC=9E=84=EC=8B=9C?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EB=90=98=EC=97=88=EC=8A=B5=EB=8B=88=EB=8B=A4?= =?UTF-8?q?=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/header/Header.jsx | 8 +++++--- src/components/management/StuffDetail.jsx | 2 +- src/locales/ja.json | 1 + src/locales/ko.json | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx index 548387ef..017bc1d1 100644 --- a/src/components/header/Header.jsx +++ b/src/components/header/Header.jsx @@ -36,7 +36,7 @@ export const ToggleonMouse = (e, act, target) => { export default function Header(props) { const [userInfoModal, setUserInfoModal] = useState(false) - const resetStuffRecoil = useResetRecoilState(stuffSearchState) + const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState) const { userSession } = props const [sessionState, setSessionState] = useRecoilState(sessionStore) @@ -191,8 +191,10 @@ export default function Header(props) {
    -
    - */} + { onChangeAmount(e.target.value, item.dispOrder, index) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 01575518..1c144b53 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -185,17 +185,26 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredItem')) } + estimateData.itemList.map((item) => { + item.amount = item.amount.replaceAll(',', '') + item.salePrice = parseFloat(item.salePrice.replaceAll(',', '')).toFixed(2) + item.saleTotPrice = parseFloat(item.saleTotPrice.replaceAll(',', '')).toFixed(2) + }) console.log('최종 정보::;', estimateData) //2. 상세데이터 저장 // return - await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { - if (res.status === 201) { - alert(getMessage('estimate.detail.save.alertMsg')) - //어디로 보낼지 - fetchSetting(objectRecoil.floorPlanObjectNo, estimateData.planNo) - } - }) + try { + await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { + if (res.status === 201) { + alert(getMessage('estimate.detail.save.alertMsg')) + //어디로 보낼지 + fetchSetting(objectRecoil.floorPlanObjectNo, estimateData.planNo) + } + }) + } catch (e) { + console.log('error::::::::::::', e.response.data.message) + } } } From f3b19f85a2575e83f39541107c29b00ac306fd33 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Fri, 22 Nov 2024 13:54:30 +0900 Subject: [PATCH 142/200] =?UTF-8?q?feat:=20floor-plan=20=EB=A7=81=ED=81=AC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/floor-plan/FloorPlanProvider.js | 22 +++++++++++++++++++--- src/app/floor-plan/layout.js | 6 ++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/app/floor-plan/FloorPlanProvider.js b/src/app/floor-plan/FloorPlanProvider.js index fb6e6460..e82f93e6 100644 --- a/src/app/floor-plan/FloorPlanProvider.js +++ b/src/app/floor-plan/FloorPlanProvider.js @@ -1,5 +1,6 @@ 'ues client' +import { notFound, usePathname, useSearchParams } from 'next/navigation' // import { ErrorBoundary } from 'next/dist/client/components/error-boundary' // import ServerError from '../error' import { createContext, useEffect, useReducer, useState } from 'react' @@ -30,19 +31,34 @@ export const FloorPlanContext = createContext({ }) const FloorPlanProvider = ({ children }) => { + const pathname = usePathname() + const searchParams = useSearchParams() + const objectNo = searchParams.get('objectNo') + const pid = searchParams.get('pid') + + if (pathname === '/floor-plan') { + if (pid === undefined || pid === '' || objectNo === undefined || objectNo === '') { + notFound() + } + } + const [floorPlanState, setFloorPlanState] = useState({ // 플랜 파일 업로드 모달 오픈 제어 refFileModalOpen: false, // 플랜 회전 모드 제어 toggleRotate: false, + // 물건 번호 + objectNo, + // 플랜 번호 + pid, }) - const [estimateContextState, setEstimateContextState] = useReducer(reducer, defaultEstimateData) - useEffect(() => { - console.log('🚀 ~ floorPlanState:', floorPlanState) + console.log('🚀 ~ FloorPlanProvider ~ floorPlanState:', floorPlanState) }, [floorPlanState]) + const [estimateContextState, setEstimateContextState] = useReducer(reducer, defaultEstimateData) + return ( {children} diff --git a/src/app/floor-plan/layout.js b/src/app/floor-plan/layout.js index ff9c9572..2a6fb8fd 100644 --- a/src/app/floor-plan/layout.js +++ b/src/app/floor-plan/layout.js @@ -1,10 +1,12 @@ 'use client' -import FloorPlan from '@/components/floor-plan/FloorPlan' + import FloorPlanProvider from './FloorPlanProvider' +import FloorPlan from '@/components/floor-plan/FloorPlan' import CanvasLayout from '@/components/floor-plan/CanvasLayout' export default function FloorPlanLayout({ children }) { - console.log('FloorPlanLayout') + console.log('🚀 ~ FloorPlanLayout ~ FloorPlanLayout:') + return ( <> From b36df2479218ba10454dabda51010d18a2336c07 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 22 Nov 2024 14:11:54 +0900 Subject: [PATCH 143/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 5 +++-- src/components/estimate/popup/ProductFeaturesPop.jsx | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index f7e8241e..40d18e4b 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -922,7 +922,8 @@ export default function Estimate({ params }) { return (
    {row.codeNm}
    -
    + {/*
    */} +
    ) } @@ -1082,7 +1083,7 @@ export default function Estimate({ params }) { - + diff --git a/src/components/estimate/popup/ProductFeaturesPop.jsx b/src/components/estimate/popup/ProductFeaturesPop.jsx index 3940065d..d958e7e2 100644 --- a/src/components/estimate/popup/ProductFeaturesPop.jsx +++ b/src/components/estimate/popup/ProductFeaturesPop.jsx @@ -42,7 +42,8 @@ export default function ProductFeaturesPop({ specialNoteList, showProductFeature return (
    {row.codeNm}
    -
    + {/*
    */} +
    ) })} From 4233958df2c439e1451ccf1221549499c0c134d2 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 22 Nov 2024 15:25:42 +0900 Subject: [PATCH 144/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 6 + .../management/StuffSearchCondition.jsx | 121 ++++++++++++------ 2 files changed, 89 insertions(+), 38 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index c57ec7e8..5a2b6170 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -236,6 +236,12 @@ export default function Stuff() { } else { setGridProps({ ...gridProps, gridData: [], count: 0 }) setTotalCount(0) + + setPageNo(1) + setPageSize(stuffSearchParams.pageSize) + stuffSearchParams.pageNo = 1 + stuffSearchParams.startRow = 1 + stuffSearchParams.endRow = 1 * stuffSearchParams.pageSize } }) } diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 0f399e61..8d454b85 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -77,26 +77,49 @@ export default function StuffSearchCondition() { if (isNaN(diff)) { return alert(getMessage('stuff.message.periodError')) } + if (stuffSearch.code === 'S') { - setStuffSearch({ - schObjectNo: objectNo ? objectNo : stuffSearch.schObjectNo, - schSaleStoreName: saleStoreName ? saleStoreName : '', - schAddress: address ? address : '', - schObjectName: objectName ? objectName : '', - schDispCompanyName: dispCompanyName ? dispCompanyName : '', - schSelSaleStoreId: stuffSearch?.schSelSaleStoreId ? stuffSearch.schSelSaleStoreId : '', - schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : '', - schReceiveUser: receiveUser ? receiveUser : '', - schDateType: dateType, - schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', - schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', - code: 'E', - startRow: stuffSearch?.startRow ? stuffSearch.startRow : 1, - endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100, - schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', - pageNo: stuffSearch?.pageNo, - pageSize: stuffSearch?.pageSize, - }) + if (stuffSearch.pageNo !== 1) { + setStuffSearch({ + schObjectNo: objectNo ? objectNo : stuffSearch.schObjectNo, + schSaleStoreName: saleStoreName ? saleStoreName : '', + schAddress: address ? address : '', + schObjectName: objectName ? objectName : '', + schDispCompanyName: dispCompanyName ? dispCompanyName : '', + schSelSaleStoreId: stuffSearch?.schSelSaleStoreId ? stuffSearch.schSelSaleStoreId : '', + schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : '', + schReceiveUser: receiveUser ? receiveUser : '', + schDateType: dateType, + schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', + schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', + code: 'E', + startRow: 1, + endRow: 1 * stuffSearch?.pageSize, + schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', + pageNo: 1, + pageSize: stuffSearch?.pageSize, + }) + } else { + setStuffSearch({ + schObjectNo: objectNo ? objectNo : stuffSearch.schObjectNo, + schSaleStoreName: saleStoreName ? saleStoreName : '', + schAddress: address ? address : '', + schObjectName: objectName ? objectName : '', + schDispCompanyName: dispCompanyName ? dispCompanyName : '', + schSelSaleStoreId: stuffSearch?.schSelSaleStoreId ? stuffSearch.schSelSaleStoreId : '', + schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : '', + schReceiveUser: receiveUser ? receiveUser : '', + schDateType: dateType, + schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', + schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', + code: 'E', + startRow: stuffSearch?.startRow ? stuffSearch.startRow : 1, + endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100, + schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', + pageNo: stuffSearch?.pageNo, + pageSize: stuffSearch?.pageSize, + }) + } } else if (stuffSearch.code === 'FINISH') { setStuffSearch({ schObjectNo: objectNo, @@ -137,25 +160,47 @@ export default function StuffSearchCondition() { pageSize: stuffSearch?.pageSize, }) } else if (session.storeId === 'T01') { - setStuffSearch({ - schObjectNo: stuffSearch?.schObjectNo ? stuffSearch.schObjectNo : objectNo, - schSaleStoreName: stuffSearch?.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName, - schAddress: stuffSearch?.schAddress ? stuffSearch.schAddress : address, - schObjectName: stuffSearch?.schObjectName ? stuffSearch.schObjectName : objectName, - schDispCompanyName: stuffSearch?.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName, - schSelSaleStoreId: schSelSaleStoreId, - schOtherSelSaleStoreId: otherSaleStoreId, - schReceiveUser: stuffSearch?.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser, - schDateType: dateType, - schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', - schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', - code: 'E', - startRow: stuffSearch?.startRow ? stuffSearch.startRow : 1, - endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100, - schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', - pageNo: stuffSearch?.pageNo, - pageSize: stuffSearch?.pageSize, - }) + if (stuffSearch.pageNo !== 1) { + setStuffSearch({ + schObjectNo: objectNo ? objectNo : stuffSearch.schObjectNo, + schSaleStoreName: saleStoreName ? saleStoreName : '', + schAddress: address ? address : '', + schObjectName: objectName ? objectName : '', + schDispCompanyName: dispCompanyName ? dispCompanyName : '', + schSelSaleStoreId: stuffSearch?.schSelSaleStoreId ? stuffSearch.schSelSaleStoreId : '', + schOtherSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : '', + schReceiveUser: receiveUser ? receiveUser : '', + schDateType: dateType, + schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', + schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', + code: 'E', + startRow: 1, + endRow: 1 * stuffSearch?.pageSize, + schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', + pageNo: 1, + pageSize: stuffSearch?.pageSize, + }) + } else { + setStuffSearch({ + schObjectNo: stuffSearch?.schObjectNo ? stuffSearch.schObjectNo : objectNo, + schSaleStoreName: stuffSearch?.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName, + schAddress: stuffSearch?.schAddress ? stuffSearch.schAddress : address, + schObjectName: stuffSearch?.schObjectName ? stuffSearch.schObjectName : objectName, + schDispCompanyName: stuffSearch?.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName, + schSelSaleStoreId: schSelSaleStoreId, + schOtherSelSaleStoreId: otherSaleStoreId, + schReceiveUser: stuffSearch?.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser, + schDateType: dateType, + schFromDt: startDate ? dayjs(startDate).format('YYYY-MM-DD') : '', + schToDt: endDate ? dayjs(endDate).format('YYYY-MM-DD') : '', + code: 'E', + startRow: stuffSearch?.startRow ? stuffSearch.startRow : 1, + endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100, + schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', + pageNo: stuffSearch?.pageNo, + pageSize: stuffSearch?.pageSize, + }) + } } else { setStuffSearch({ schObjectNo: stuffSearch?.schObjectNo ? stuffSearch.schObjectNo : objectNo, From 24dca05f752cd43079531cffc8d4d45f1d63d709 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Fri, 22 Nov 2024 16:02:10 +0900 Subject: [PATCH 145/200] feat: Add globalSpinner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 글로벌 스피너 추가 - 글로벌 스피너 on/off 기능 추가 --- package.json | 1 + src/app/QcastProvider.js | 11 ++- src/app/layout.js | 16 +-- .../common/spinner/GlobalSpinner.jsx | 7 ++ src/components/header/Header.jsx | 99 ++++++++++--------- src/hooks/main/useMainContentsController.js | 9 +- yarn.lock | 9 +- 7 files changed, 92 insertions(+), 60 deletions(-) create mode 100644 src/components/common/spinner/GlobalSpinner.jsx diff --git a/package.json b/package.json index f338fbe4..c92c5d80 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "react-icons": "^5.3.0", "react-loading-skeleton": "^3.5.0", "react-responsive-modal": "^6.4.2", + "react-spinners": "^0.14.1", "recoil": "^0.7.7", "sweetalert2": "^11.14.1", "sweetalert2-react-content": "^5.0.7", diff --git a/src/app/QcastProvider.js b/src/app/QcastProvider.js index bde4f380..3dfb02e9 100644 --- a/src/app/QcastProvider.js +++ b/src/app/QcastProvider.js @@ -7,14 +7,18 @@ import { usePlan } from '@/hooks/usePlan' import ServerError from './error' import '@/styles/common.scss' +import GlobalSpinner from '@/components/common/spinner/GlobalSpinner' export const QcastContext = createContext({ qcastState: {}, setQcastState: () => {}, + isGlobalLoading: true, + setIsGlobalLoading: () => {}, }) export const QcastProvider = ({ children }) => { const [planSave, setPlanSave] = useState(false) + const [isGlobalLoading, setIsGlobalLoading] = useState(true) const { currentCanvasPlan, modifiedPlans, checkUnsavedCanvasPlan } = usePlan() const { commonCode, findCommonCode } = useCommonCode() @@ -43,7 +47,12 @@ export const QcastProvider = ({ children }) => { return ( <> - + {isGlobalLoading && ( +
    + +
    + )} + }>{children} diff --git a/src/app/layout.js b/src/app/layout.js index 684dfb7f..fbe6c39a 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -62,16 +62,16 @@ export default async function RootLayout({ children }) { {headerPathname === '/login' || headerPathname === '/join' ? ( {children} ) : ( -
    -
    -
    - - + +
    +
    +
    + {children} - +
    +
    -
    -
    + )} diff --git a/src/components/common/spinner/GlobalSpinner.jsx b/src/components/common/spinner/GlobalSpinner.jsx new file mode 100644 index 00000000..c643cc30 --- /dev/null +++ b/src/components/common/spinner/GlobalSpinner.jsx @@ -0,0 +1,7 @@ +'use client' + +import { HashLoader } from 'react-spinners' + +export default function GlobalSpinner() { + return +} diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx index 017bc1d1..2674936c 100644 --- a/src/components/header/Header.jsx +++ b/src/components/header/Header.jsx @@ -1,5 +1,5 @@ 'use client' -import { Fragment, useCallback, useEffect, useState } from 'react' +import { Fragment, useCallback, useContext, useEffect, useState } from 'react' import Link from 'next/link' import { usePathname } from 'next/navigation' @@ -17,6 +17,7 @@ import { useAxios } from '@/hooks/useAxios' import { globalLocaleStore } from '@/store/localeAtom' import { stuffSearchState } from '@/store/stuffAtom' +import { QcastContext } from '@/app/QcastProvider' export const ToggleonMouse = (e, act, target) => { const listWrap = e.target.closest(target) @@ -47,6 +48,8 @@ export default function Header(props) { // } const [selected, setSelected] = useState('') + const { isGlobalLoading } = useContext(QcastContext) + const dimmedState = useRecoilValue(dimmedStore) const isDimmed = dimmedState ? 'opacity-50 bg-black' : '' @@ -164,54 +167,56 @@ export default function Header(props) { } return ( - !(pathName.includes('login') || pathName.includes('join') || sessionState.pwdInitYn === 'N') && ( -
    -
    -
    -

    - -

    - -
    -
    -
    - { - setUserInfoModal(true) - }} - > - - - {userInfoModal && } + <> + {!isGlobalLoading && !(pathName.includes('login') || pathName.includes('join') || sessionState.pwdInitYn === 'N') && ( +
    +
    +
    +

    + +

    +
    -
    - -
    -
    - -
    -
    - +
    +
    + { + setUserInfoModal(true) + }} + > + + + {userInfoModal && } +
    +
    + +
    +
    + +
    +
    + +
    -
    -
    - ) +
    + )} + ) } diff --git a/src/hooks/main/useMainContentsController.js b/src/hooks/main/useMainContentsController.js index 0d2b0436..01f75658 100644 --- a/src/hooks/main/useMainContentsController.js +++ b/src/hooks/main/useMainContentsController.js @@ -1,6 +1,6 @@ 'use client' -import { useContext } from 'react' +import { useContext, useEffect } from 'react' import { useAxios } from '../useAxios' import { SessionContext } from '@/app/SessionProvider' import { QcastContext } from '@/app/QcastProvider' @@ -8,7 +8,11 @@ import { QcastContext } from '@/app/QcastProvider' export const useMainContentsController = () => { const { session } = useContext(SessionContext) const { promiseGet } = useAxios() - const { setQcastState } = useContext(QcastContext) + const { setQcastState, setIsGlobalLoading } = useContext(QcastContext) + + useEffect(() => { + setIsGlobalLoading(true) + }, []) /** * main search area @@ -46,6 +50,7 @@ export const useMainContentsController = () => { businessCharger: res.data.businessCharger, businessChargerMail: res.data.businessChargerMail, }) + setIsGlobalLoading(false) } else { // setSaleStoreId('') // setSaleStoreName('') diff --git a/yarn.lock b/yarn.lock index 81129787..7bcccdcc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5663,7 +5663,7 @@ react-datepicker@^7.3.0: prop-types "^15.7.2" react-onclickoutside "^6.13.0" -"react-dom@^15.5.x || ^16.x || ^17.x || ^18.x", "react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", "react-dom@^16.9.0 || ^17 || ^18", react-dom@^18, react-dom@^18.0.0, react-dom@^18.2.0, "react-dom@>= 16.3.0", react-dom@>=16.6.0, react-dom@>=16.8.0, react-dom@>=18: +"react-dom@^15.5.x || ^16.x || ^17.x || ^18.x", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", "react-dom@^16.9.0 || ^17 || ^18", react-dom@^18, react-dom@^18.0.0, react-dom@^18.2.0, "react-dom@>= 16.3.0", react-dom@>=16.6.0, react-dom@>=16.8.0, react-dom@>=18: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -5747,6 +5747,11 @@ react-select@^5.8.1: react-transition-group "^4.3.0" use-isomorphic-layout-effect "^1.1.2" +react-spinners@^0.14.1: + version "0.14.1" + resolved "https://registry.npmjs.org/react-spinners/-/react-spinners-0.14.1.tgz" + integrity sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag== + react-style-singleton@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" @@ -5775,7 +5780,7 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@*, "react@^15.5.x || ^16.x || ^17.x || ^18.x", "react@^16.3.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17 || ^18", react@^18, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.3.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.13.1, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=18: +react@*, "react@^15.5.x || ^16.x || ^17.x || ^18.x", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.3.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17 || ^18", react@^18, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.3.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.13.1, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=18: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== From 4a099ffd5c353b71bdda8e82b38413ebb04a4f0d Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 22 Nov 2024 16:05:24 +0900 Subject: [PATCH 146/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 5a2b6170..d3b8f627 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -191,6 +191,12 @@ export default function Stuff() { } else { setGridProps({ ...gridProps, gridData: [], count: 0 }) setTotalCount(0) + + setPageNo(1) + setPageSize(stuffSearchParams.pageSize) + stuffSearchParams.pageNo = 1 + stuffSearchParams.startRow = 1 + stuffSearchParams.endRow = 1 * stuffSearchParams.pageSize } }) } @@ -320,20 +326,24 @@ export default function Stuff() { //최근 등록일 수정일 정렬 이벤트 const onChangeSortType = (e) => { - let startRow = (stuffSearchParams.pageNo - 1) * pageSize + 1 + // let startRow = (stuffSearchParams.pageNo - 1) * pageSize + 1 + let startRow = (1 - 1) * stuffSearchParams.pageSize + 1 stuffSearchParams.startRow = startRow - stuffSearchParams.endRow = stuffSearchParams.pageNo * pageSize - - stuffSearchParams.schSortType = e.target.value + stuffSearchParams.endRow = startRow * stuffSearchParams.pageSize stuffSearchParams.schSelSaleStoreId = stuffSearchParams.schSelSaleStoreId stuffSearchParams.schOtherSelSaleStoreId = stuffSearchParams.schOtherSelSaleStoreId + stuffSearchParams.pageNo = startRow + stuffSearchParams.pageSize = 1 * stuffSearchParams.pageSize + setPageSize(stuffSearchParams.pageSize) + stuffSearchParams.schSortType = e.target.value setDefaultSortType(e.target.value) setStuffSearch({ ...stuffSearch, code: 'S', startRow: startRow, - endRow: stuffSearchParams.pageNo * pageSize, + endRow: startRow * stuffSearchParams.pageSize, + pageSize: stuffSearchParams.pageSize, schSortType: e.target.value, }) From bc6fdd1b12c458a620dc5ab598f528dbef1a419c Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Fri, 22 Nov 2024 16:59:59 +0900 Subject: [PATCH 147/200] =?UTF-8?q?fix:=20spinner=20default=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/QcastProvider.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/QcastProvider.js b/src/app/QcastProvider.js index 3dfb02e9..23ad5a75 100644 --- a/src/app/QcastProvider.js +++ b/src/app/QcastProvider.js @@ -12,13 +12,13 @@ import GlobalSpinner from '@/components/common/spinner/GlobalSpinner' export const QcastContext = createContext({ qcastState: {}, setQcastState: () => {}, - isGlobalLoading: true, + isGlobalLoading: false, setIsGlobalLoading: () => {}, }) export const QcastProvider = ({ children }) => { const [planSave, setPlanSave] = useState(false) - const [isGlobalLoading, setIsGlobalLoading] = useState(true) + const [isGlobalLoading, setIsGlobalLoading] = useState(false) const { currentCanvasPlan, modifiedPlans, checkUnsavedCanvasPlan } = usePlan() const { commonCode, findCommonCode } = useCommonCode() From 57bc308dd2239a85800330357ec34ef4249f93fc Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 22 Nov 2024 23:22:01 +0900 Subject: [PATCH 148/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EB=A1=9C=EB=94=A9=ED=99=94=EB=A9=B4=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 18 ++++++++++++------ .../management/StuffSearchCondition.jsx | 11 ++++++++--- src/locales/ja.json | 6 +++--- src/locales/ko.json | 6 +++--- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index d3b8f627..ae34acf5 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -16,7 +16,11 @@ import JA from '@/locales/ja.json' import QPagination from '../common/pagination/QPagination' import { SessionContext } from '@/app/SessionProvider' +import { QcastContext } from '@/app/QcastProvider' + export default function Stuff() { + const { setIsGlobalLoading } = useContext(QcastContext) + const resetStuffRecoil = useResetRecoilState(stuffSearchState) const { session } = useContext(SessionContext) const setAppMessageState = useSetRecoilState(appMessageStore) @@ -198,9 +202,10 @@ export default function Stuff() { stuffSearchParams.startRow = 1 stuffSearchParams.endRow = 1 * stuffSearchParams.pageSize } + + setIsGlobalLoading(false) }) } - fetchData() } else if (stuffSearchParams?.code === 'M') { const params = { @@ -229,10 +234,8 @@ export default function Stuff() { stuffSearchParams.startRow = (stuffSearch.pageNo - 1) * stuffSearchParams.pageSize + 1 stuffSearchParams.endRow = stuffSearchParams.pageNo * stuffSearchParams.pageSize stuffSearchParams.schSortType = defaultSortType - //setPageNo(1) stuffSearchParams.pageNo = stuffSearchParams.pageNo - // return async function fetchData() { const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` await get({ url: apiUrl }).then((res) => { @@ -249,9 +252,10 @@ export default function Stuff() { stuffSearchParams.startRow = 1 stuffSearchParams.endRow = 1 * stuffSearchParams.pageSize } + + setIsGlobalLoading(false) }) } - fetchData() } else if (stuffSearchParams?.code === 'C') { resetStuffRecoil() @@ -273,7 +277,6 @@ export default function Stuff() { } }) } - fetchData() } else if (stuffSearchParams?.code === 'DELETE') { const newParams = { @@ -375,6 +378,10 @@ export default function Stuff() { setPageNo(page) } + useEffect(() => { + setIsGlobalLoading(true) + }, []) + return ( <> {/* 퍼블시작 */} @@ -410,7 +417,6 @@ export default function Stuff() {
    - {/* */} { let diff = dayjs(endDate).diff(startDate, 'day') @@ -78,6 +82,7 @@ export default function StuffSearchCondition() { return alert(getMessage('stuff.message.periodError')) } + setIsGlobalLoading(true) if (stuffSearch.code === 'S') { if (stuffSearch.pageNo !== 1) { setStuffSearch({ @@ -557,14 +562,14 @@ export default function StuffSearchCondition() {
    diff --git a/src/locales/ja.json b/src/locales/ja.json index 40df78f7..9250fe50 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -698,9 +698,9 @@ "stuff.planReqPopup.error.message1": "設計依頼を選択してください.", "stuff.planReqPopup.error.message2": "販売店を選択してください.", "stuff.search.title": "物件状況", - "stuff.search.btn1": "新規 物件 登録", - "stuff.search.btn2": "照会", - "stuff.search.btn3": "初期化", + "stuff.search.btn.register": "新規 物件 登録", + "stuff.search.btn.search": "照会", + "stuff.search.btn.reset": "初期化", "stuff.search.schObjectNo": "品番", "stuff.search.schSaleStoreName": "販売代理店名", "stuff.search.schAddress": "商品アドレス", diff --git a/src/locales/ko.json b/src/locales/ko.json index a11e6d0a..023ccdc8 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -708,9 +708,9 @@ "stuff.planReqPopup.error.message1": "설계의뢰를 선택해주세요.", "stuff.planReqPopup.error.message2": "판매점을 선택해주세요.", "stuff.search.title": "물건현황", - "stuff.search.btn1": "신규 물건 등록", - "stuff.search.btn2": "조회", - "stuff.search.btn3": "초기화", + "stuff.search.btn.register": "신규 물건 등록", + "stuff.search.btn.search": "조회", + "stuff.search.btn.reset": "초기화", "stuff.search.schObjectNo": "물건번호", "stuff.search.schSaleStoreName": "판매대리점명", "stuff.search.schAddress": "물건주소", From 603dc797c0c8e2125d76ec0d7f0eb5b3197878af Mon Sep 17 00:00:00 2001 From: basssy Date: Sat, 23 Nov 2024 01:07:21 +0900 Subject: [PATCH 149/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 48 ++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 40d18e4b..0e8803b7 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -108,10 +108,10 @@ export default function Estimate({ params }) { if (estimateContextState?.estimateOption) { res.map((row) => { let estimateOption = estimateContextState?.estimateOption?.split('、') - row.text = false + row.check = false estimateOption.map((row2) => { if (row2 === row.code) { - row.text = true + row.check = true } }) }) @@ -135,7 +135,7 @@ export default function Estimate({ params }) { useEffect(() => { //선택된 견적특이사항 setEstimateContextState if (isNotEmptyArray(specialNoteList)) { - const liveCheckedData = specialNoteList.filter((row) => row.text === true) + const liveCheckedData = specialNoteList.filter((row) => row.check === true) const data = [] for (let ele of liveCheckedData) { @@ -204,6 +204,24 @@ export default function Estimate({ params }) { } }) + if (estimateContextState.estimateType === 'YJSS') { + if (specialNoteList.length > 0) { + specialNoteList.map((item) => { + if (item.code === 'ATTR002') { + item.check = false + } + }) + } + } else { + if (specialNoteList.length > 0) { + specialNoteList.map((item) => { + if (item.code === 'ATTR002') { + item.check = true + } + }) + } + } + setItemChangeYn(true) } }, [estimateContextState?.estimateType]) @@ -241,7 +259,6 @@ export default function Estimate({ params }) { sapSalesStoreCd: session.custCd, docTpCd: estimateContextState.estimateType, priceCd: showPriceCd, - //itemIdList: estimateContextState.itemList, //아이템 최초정보로 호출 delFlg 0인거만.. itemIdList: estimateContextState.itemList.filter((item) => item.delFlg === '0'), } @@ -266,22 +283,22 @@ export default function Estimate({ params }) { if (res.status === 200) { const data = res.data //기존itemList랑 프라이싱결과랑 비교해서 단가만 업뎃 서로 갯수가 안맞을 수 있음 없는 itemId면 unitPrice 0으로 - //itemId로 비교해서 단가정보만 업데이트 + //itemId로 비교해서 salePrice만 업데이트 if (data.result.code === 200) { if (isNotEmptyArray(data.data2)) { - estimateContextState.itemList.map((item) => { + estimateContextState.itemList.map((item, itemIndex) => { let checkYn = false data.data2.map((item2) => { if (item2) { if (item2.itemId === item.itemId) { - updateList.push({ ...item, unitPrice: item2.unitPrice }) + updateList.push({ ...item, salePrice: item2.unitPrice, saleTotPrice: (item.amount * item2.unitPrice).toString() }) checkYn = true } } }) if (!checkYn) { - updateList.push({ ...item, unitPrice: '0' }) + updateList.push({ ...item, salePrice: '0', saleTotPrice: '0' }) } }) @@ -328,6 +345,8 @@ export default function Estimate({ params }) { pkgAsp: pkgAsp, pkgTotPrice: pkgTotPrice.toFixed(3), }) + + //아이템들 중 조건에 맞는애들 뽑아서 상단 공급가액 부가세 총액 수정 } } @@ -421,8 +440,8 @@ export default function Estimate({ params }) { updates.specialNoteCd = res.spnAttrCds updates.itemGroup = res.itemGroup updates.delFlg = '0' // 삭제플래그 0 - // updates.saleTotPrice = res.salePrice * estimateContextState.itemList[index].amount - updates.saleTotPrice = '0' //추가때는 수량을 안받아서 합계를 무조건 0으로 + updates.saleTotPrice = (res.salePrice * estimateContextState.itemList[index].amount).toString() + //104671 let bomList = res.itemBomList @@ -502,6 +521,8 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { + console.log(' 토탈만들어주기::::::::::', estimateContextState.itemList) + let totAmount = 0 let totVolKw = 0 let supplyPrice = 0 @@ -888,6 +909,7 @@ export default function Estimate({ params }) { {/* SpecialNoteList반복문 */} {specialNoteList.length > 0 && specialNoteList.map((row) => { + // console.log('rowL::::', row) return (
    { setSpecialNoteList((specialNote) => - specialNote.map((temp) => (temp.code === row.code ? { ...temp, text: !temp.text } : temp)), + specialNote.map((temp) => (temp.code === row.code ? { ...temp, check: !temp.check } : temp)), ) settingShowContent(row.code, event) }} From ad05fdea25df4b0fd164f5e036a3d5a2a3dc1393 Mon Sep 17 00:00:00 2001 From: basssy Date: Sat, 23 Nov 2024 13:38:13 +0900 Subject: [PATCH 150/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 0e8803b7..21553c52 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -212,6 +212,9 @@ export default function Estimate({ params }) { } }) } + + //YJSS UNIT_PIRCE로 프라이싱 실행 + handlePricing('UNIT_PRICE') } else { if (specialNoteList.length > 0) { specialNoteList.map((item) => { @@ -285,8 +288,15 @@ export default function Estimate({ params }) { //기존itemList랑 프라이싱결과랑 비교해서 단가만 업뎃 서로 갯수가 안맞을 수 있음 없는 itemId면 unitPrice 0으로 //itemId로 비교해서 salePrice만 업데이트 if (data.result.code === 200) { + console.log('data::확인해서 넣기:::::::::', data.data.pkgUnitPrice) + setEstimateContextState({ + pkgAsp: data.data.pkgUnitPrice, + }) + //주택PKG단가 체인지 이벤트 발생시키기 + onChangePkgAsp(data.data.pkgUnitPrice) + if (isNotEmptyArray(data.data2)) { - estimateContextState.itemList.map((item, itemIndex) => { + estimateContextState.itemList.map((item) => { let checkYn = false data.data2.map((item2) => { if (item2) { @@ -330,7 +340,7 @@ export default function Estimate({ params }) { //주택PKG input 변경 const onChangePkgAsp = (value) => { if (estimateContextState.estimateType === 'YJSS') { - let pkgAsp = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) + let pkgAsp = Number(value.replaceAll(',', '')) if (isNaN(pkgAsp)) { pkgAsp = 0 } else { @@ -339,14 +349,14 @@ export default function Estimate({ params }) { //현재 PKG용량값 가져오기 let totVolKw = estimateContextState.totVolKw * 1000 - let pkgTotPrice = pkgAsp * totVolKw + let pkgTotPrice = pkgAsp.replaceAll(',', '') * totVolKw setEstimateContextState({ pkgAsp: pkgAsp, pkgTotPrice: pkgTotPrice.toFixed(3), }) - //아이템들 중 조건에 맞는애들 뽑아서 상단 공급가액 부가세 총액 수정 + // setItemChangeYn(true) } } From b9968ea78662e74bb96ad32731fa2b80f91f1e7f Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 25 Nov 2024 00:09:21 +0900 Subject: [PATCH 151/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 21553c52..4f578b5e 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -114,6 +114,14 @@ export default function Estimate({ params }) { row.check = true } }) + //detail과 상관없이 디폴트 체크목록 + //ATTR003,ATTR007 + if (row.code === 'ATTR003') { + row.check = true + } + if (row.code === 'ATTR007') { + row.check = true + } }) setSpecialNoteList(res) } From e581d2fee8ac24d9ad7a08ace5c11420282e5d85 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 25 Nov 2024 00:11:08 +0900 Subject: [PATCH 152/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EB=A1=9C=EB=94=A9=EB=B0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 2 ++ src/components/management/StuffDetail.jsx | 8 +++++++- src/components/management/StuffSearchCondition.jsx | 10 +++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index ae34acf5..9eb50dca 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -51,6 +51,7 @@ export default function Stuff() { //물건번호 복사버튼 옆에 영역 const onDoubleClick = (data) => { + setIsGlobalLoading(true) if (data.tempFlg === '0') { router.push(`${pathname}/detail?objectNo=${data.objectNo.toString()}`, { scroll: false }) } else { @@ -153,6 +154,7 @@ export default function Stuff() { } else { //T 면 임시 R은 진짜 if (event.data.objectNo) { + setIsGlobalLoading(true) if (event.data.tempFlg === '0') { router.push(`${pathname}/detail?objectNo=${event.data.objectNo.toString()}`, { scroll: false }) } else { diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 9de52b54..87f07a8e 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -21,8 +21,9 @@ import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' import { ManagementContext } from '@/app/management/ManagementProvider' import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' import { stuffSearchState } from '@/store/stuffAtom' - +import { QcastContext } from '@/app/QcastProvider' export default function StuffDetail() { + const { setIsGlobalLoading } = useContext(QcastContext) const resetStuffRecoil = useResetRecoilState(stuffSearchState) const stuffSearchParams = useRecoilValue(stuffSearchState) @@ -418,6 +419,8 @@ export default function StuffDetail() { } } }) + + setIsGlobalLoading(false) } }, [objectNo, session]) @@ -590,6 +593,9 @@ export default function StuffDetail() { //메모 form.setValue('remarks', managementState.remarks) }) + + //상세끝 + setIsGlobalLoading(false) } } }, [managementState]) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 0cc723a3..2efdee3e 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -83,6 +83,7 @@ export default function StuffSearchCondition() { } setIsGlobalLoading(true) + if (stuffSearch.code === 'S') { if (stuffSearch.pageNo !== 1) { setStuffSearch({ @@ -181,7 +182,8 @@ export default function StuffSearchCondition() { code: 'E', startRow: 1, endRow: 1 * stuffSearch?.pageSize, - schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', + // schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R', + schSortType: 'R', pageNo: 1, pageSize: stuffSearch?.pageSize, }) @@ -447,8 +449,10 @@ export default function StuffSearchCondition() { //화면에선 지우는데 리코일은 조회누르지 않으면 보존 setSchSelSaleStoreId('') setOtherSaleStoreId('') - stuffSearch.schSelSaleStoreId = '' - stuffSearch.schOtherSelSaleStoreId = '' + if (stuffSearch.code === 'S') { + stuffSearch.schSelSaleStoreId = '' + stuffSearch.schOtherSelSaleStoreId = '' + } //2차점 판매점목록비우기 setOtherSaleStoreList([]) From ee2888b7a881f9012f990d5738358f8aec698a7c Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 25 Nov 2024 10:26:20 +0900 Subject: [PATCH 153/200] =?UTF-8?q?floorPlanObjectState=20=EC=97=90=20?= =?UTF-8?q?=ED=82=A4=20uuid=20=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/floorPlanObjectAtom.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/store/floorPlanObjectAtom.js b/src/store/floorPlanObjectAtom.js index d514fe54..37227b0a 100644 --- a/src/store/floorPlanObjectAtom.js +++ b/src/store/floorPlanObjectAtom.js @@ -1,7 +1,6 @@ import { atom } from 'recoil' -import { v1 } from 'uuid' export const floorPlanObjectState = atom({ - key: `floorPlanObjectState/${v1()}`, + key: 'floorPlanObjectState', default: { floorPlanObjectNo: '', //물건번호 }, @@ -9,7 +8,7 @@ export const floorPlanObjectState = atom({ }) export const estimateState = atom({ - key: `estimateState`, + key: 'estimateState', default: {}, dangerouslyAllowMutability: true, }) From 1ba86c336961b9e99428cc1647f017e2a7218bca Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Mon, 25 Nov 2024 10:32:48 +0900 Subject: [PATCH 154/200] =?UTF-8?q?fix:=20=EB=AC=BC=EA=B1=B4=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20recoil=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/floor-plan/FloorPlanProvider.js | 4 + src/store/settingAtom.js | 8 + yarn.lock | 606 +++++++++++++++++------- 3 files changed, 459 insertions(+), 159 deletions(-) diff --git a/src/app/floor-plan/FloorPlanProvider.js b/src/app/floor-plan/FloorPlanProvider.js index e82f93e6..59a05edb 100644 --- a/src/app/floor-plan/FloorPlanProvider.js +++ b/src/app/floor-plan/FloorPlanProvider.js @@ -1,9 +1,11 @@ 'ues client' +import { correntObjectNoState } from '@/store/settingAtom' import { notFound, usePathname, useSearchParams } from 'next/navigation' // import { ErrorBoundary } from 'next/dist/client/components/error-boundary' // import ServerError from '../error' import { createContext, useEffect, useReducer, useState } from 'react' +import { useSetRecoilState } from 'recoil' const reducer = (prevState, nextState) => { return { ...prevState, ...nextState } @@ -32,6 +34,7 @@ export const FloorPlanContext = createContext({ const FloorPlanProvider = ({ children }) => { const pathname = usePathname() + const setCurrentObjectNo = useSetRecoilState(correntObjectNoState) const searchParams = useSearchParams() const objectNo = searchParams.get('objectNo') const pid = searchParams.get('pid') @@ -40,6 +43,7 @@ const FloorPlanProvider = ({ children }) => { if (pid === undefined || pid === '' || objectNo === undefined || objectNo === '') { notFound() } + setCurrentObjectNo(objectNo) } const [floorPlanState, setFloorPlanState] = useState({ diff --git a/src/store/settingAtom.js b/src/store/settingAtom.js index 869cc004..9e64d72f 100644 --- a/src/store/settingAtom.js +++ b/src/store/settingAtom.js @@ -217,3 +217,11 @@ export const basicSettingState = atom({ ], }, }) + +/** + * 현재 선택된 물건 번호 + */ +export const correntObjectNoState = atom({ + key: 'correntObjectNoState', + default: '', +}) diff --git a/yarn.lock b/yarn.lock index 7bcccdcc..785c8ccb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -223,14 +223,7 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@^7.20.13": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz" - integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.24.8": +"@babel/runtime@^7.20.13", "@babel/runtime@^7.24.8": version "7.25.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz" integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== @@ -539,6 +532,21 @@ resolved "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz" integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@next/env@14.2.3": version "14.2.3" resolved "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz" @@ -1243,7 +1251,7 @@ "@react-types/shared" "3.23.1" clsx "^1.2.1" -"@nextui-org/system@>=2.0.0", "@nextui-org/system@>=2.1.0", "@nextui-org/system@2.2.5": +"@nextui-org/system@2.2.5": version "2.2.5" resolved "https://registry.npmjs.org/@nextui-org/system/-/system-2.2.5.tgz" integrity sha512-nrX6768aiyWtpxX3OTFBIVWR+v9nlMsC3KaBinNfek97sNm7gAfTHi7q5kylE3L5yIMpNG+DclAKpuxgDQEmvw== @@ -1296,7 +1304,7 @@ "@react-types/tabs" "3.3.7" scroll-into-view-if-needed "3.0.10" -"@nextui-org/theme@>=2.1.0", "@nextui-org/theme@>=2.2.0", "@nextui-org/theme@2.2.9": +"@nextui-org/theme@2.2.9": version "2.2.9" resolved "https://registry.npmjs.org/@nextui-org/theme/-/theme-2.2.9.tgz" integrity sha512-TN2I9sMriLaj00pXsIMlg19+UHeOdjzS2JV0u4gjL14mSbQl5BYNxgbvU3gbMqkZZQ6OpwT4RnT8RS+ks6TXCw== @@ -1517,7 +1525,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1650,7 +1658,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/focus@^3.17.1", "@react-aria/focus@3.17.1": +"@react-aria/focus@3.17.1", "@react-aria/focus@^3.17.1": version "3.17.1" resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.17.1.tgz" integrity sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ== @@ -1672,7 +1680,7 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/form@^3.0.5", "@react-aria/form@3.0.5": +"@react-aria/form@3.0.5", "@react-aria/form@^3.0.5": version "3.0.5" resolved "https://registry.npmjs.org/@react-aria/form/-/form-3.0.5.tgz" integrity sha512-n290jRwrrRXO3fS82MyWR+OKN7yznVesy5Q10IclSTVYHHI3VI53xtAPr/WzNjJR1um8aLhOcDNFKwnNIUUCsQ== @@ -1702,7 +1710,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/i18n@^3.11.1", "@react-aria/i18n@3.11.1": +"@react-aria/i18n@3.11.1", "@react-aria/i18n@^3.11.1": version "3.11.1" resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.11.1.tgz" integrity sha512-vuiBHw1kZruNMYeKkTGGnmPyMnM5T+gT8bz97H1FqIq1hQ6OPzmtBZ6W6l6OIMjeHI5oJo4utTwfZl495GALFQ== @@ -1730,7 +1738,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/interactions@^3.21.3", "@react-aria/interactions@3.21.3": +"@react-aria/interactions@3.21.3", "@react-aria/interactions@^3.21.3": version "3.21.3" resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.3.tgz" integrity sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA== @@ -1750,7 +1758,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/label@^3.7.8", "@react-aria/label@3.7.8": +"@react-aria/label@3.7.8", "@react-aria/label@^3.7.8": version "3.7.8" resolved "https://registry.npmjs.org/@react-aria/label/-/label-3.7.8.tgz" integrity sha512-MzgTm5+suPA3KX7Ug6ZBK2NX9cin/RFLsv1BdafJ6CZpmUSpWnGE/yQfYUB7csN7j31OsZrD3/P56eShYWAQfg== @@ -1759,7 +1767,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/link@^3.7.1", "@react-aria/link@3.7.1": +"@react-aria/link@3.7.1", "@react-aria/link@^3.7.1": version "3.7.1" resolved "https://registry.npmjs.org/@react-aria/link/-/link-3.7.1.tgz" integrity sha512-a4IaV50P3fXc7DQvEIPYkJJv26JknFbRzFT5MJOMgtzuhyJoQdILEUK6XHYjcSSNCA7uLgzpojArVk5Hz3lCpw== @@ -1771,7 +1779,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/listbox@^3.12.1", "@react-aria/listbox@3.12.1": +"@react-aria/listbox@3.12.1", "@react-aria/listbox@^3.12.1": version "3.12.1" resolved "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.12.1.tgz" integrity sha512-7JiUp0NGykbv/HgSpmTY1wqhuf/RmjFxs1HZcNaTv8A+DlzgJYc7yQqFjP3ZA/z5RvJFuuIxggIYmgIFjaRYdA== @@ -1793,7 +1801,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-aria/menu@^3.14.1", "@react-aria/menu@3.14.1": +"@react-aria/menu@3.14.1", "@react-aria/menu@^3.14.1": version "3.14.1" resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.14.1.tgz" integrity sha512-BYliRb38uAzq05UOFcD5XkjA5foQoXRbcH3ZufBsc4kvh79BcP1PMW6KsXKGJ7dC/PJWUwCui6QL1kUg8PqMHA== @@ -1812,7 +1820,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/overlays@^3.22.1", "@react-aria/overlays@3.22.1": +"@react-aria/overlays@3.22.1", "@react-aria/overlays@^3.22.1": version "3.22.1" resolved "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.22.1.tgz" integrity sha512-GHiFMWO4EQ6+j6b5QCnNoOYiyx1Gk8ZiwLzzglCI4q1NY5AG2EAmfU4Z1+Gtrf2S5Y0zHbumC7rs9GnPoGLUYg== @@ -1857,7 +1865,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-aria/selection@^3.18.1", "@react-aria/selection@3.18.1": +"@react-aria/selection@3.18.1", "@react-aria/selection@^3.18.1": version "3.18.1" resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.18.1.tgz" integrity sha512-GSqN2jX6lh7v+ldqhVjAXDcrWS3N4IsKXxO6L6Ygsye86Q9q9Mq9twWDWWu5IjHD6LoVZLUBCMO+ENGbOkyqeQ== @@ -1910,7 +1918,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-aria/ssr@^3.9.4", "@react-aria/ssr@3.9.4": +"@react-aria/ssr@3.9.4", "@react-aria/ssr@^3.9.4": version "3.9.4" resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz" integrity sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ== @@ -1970,7 +1978,7 @@ "@react-types/tabs" "^3.3.7" "@swc/helpers" "^0.5.0" -"@react-aria/textfield@^3.14.5", "@react-aria/textfield@3.14.5": +"@react-aria/textfield@3.14.5", "@react-aria/textfield@^3.14.5": version "3.14.5" resolved "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.5.tgz" integrity sha512-hj7H+66BjB1iTKKaFXwSZBZg88YT+wZboEXZ0DNdQB2ytzoz/g045wBItUuNi4ZjXI3P+0AOZznVMYadWBAmiA== @@ -2011,7 +2019,7 @@ "@react-types/tooltip" "^3.4.9" "@swc/helpers" "^0.5.0" -"@react-aria/utils@^3.24.1", "@react-aria/utils@3.24.1": +"@react-aria/utils@3.24.1", "@react-aria/utils@^3.24.1": version "3.24.1" resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.24.1.tgz" integrity sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q== @@ -2033,7 +2041,7 @@ "@swc/helpers" "^0.5.0" clsx "^2.0.0" -"@react-aria/visually-hidden@^3.8.12", "@react-aria/visually-hidden@3.8.12": +"@react-aria/visually-hidden@3.8.12", "@react-aria/visually-hidden@^3.8.12": version "3.8.12" resolved "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.12.tgz" integrity sha512-Bawm+2Cmw3Xrlr7ARzl2RLtKh0lNUdJ0eNqzWcyx4c0VHUAWtThmH5l+HRqFUGzzutFZVo89SAy40BAbd0gjVw== @@ -2043,7 +2051,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/calendar@^3.5.1", "@react-stately/calendar@3.5.1": +"@react-stately/calendar@3.5.1", "@react-stately/calendar@^3.5.1": version "3.5.1" resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.5.1.tgz" integrity sha512-7l7QhqGUJ5AzWHfvZzbTe3J4t72Ht5BmhW4hlVI7flQXtfrmYkVtl3ZdytEZkkHmWGYZRW9b4IQTQGZxhtlElA== @@ -2054,7 +2062,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/checkbox@^3.6.5", "@react-stately/checkbox@3.6.5": +"@react-stately/checkbox@3.6.5", "@react-stately/checkbox@^3.6.5": version "3.6.5" resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.5.tgz" integrity sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg== @@ -2065,7 +2073,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/collections@^3.10.7", "@react-stately/collections@3.10.7": +"@react-stately/collections@3.10.7", "@react-stately/collections@^3.10.7": version "3.10.7" resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.7.tgz" integrity sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA== @@ -2081,7 +2089,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/combobox@^3.8.4", "@react-stately/combobox@3.8.4": +"@react-stately/combobox@3.8.4", "@react-stately/combobox@^3.8.4": version "3.8.4" resolved "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.4.tgz" integrity sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA== @@ -2096,7 +2104,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/datepicker@^3.9.4", "@react-stately/datepicker@3.9.4": +"@react-stately/datepicker@3.9.4", "@react-stately/datepicker@^3.9.4": version "3.9.4" resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.4.tgz" integrity sha512-yBdX01jn6gq4NIVvHIqdjBUPo+WN8Bujc4OnPw+ZnfA4jI0eIgq04pfZ84cp1LVXW0IB0VaCu1AlQ/kvtZjfGA== @@ -2117,7 +2125,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/form@^3.0.3", "@react-stately/form@3.0.3": +"@react-stately/form@3.0.3", "@react-stately/form@^3.0.3": version "3.0.3" resolved "https://registry.npmjs.org/@react-stately/form/-/form-3.0.3.tgz" integrity sha512-92YYBvlHEWUGUpXgIaQ48J50jU9XrxfjYIN8BTvvhBHdD63oWgm8DzQnyT/NIAMzdLnhkg7vP+fjG8LjHeyIAg== @@ -2144,7 +2152,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/list@^3.10.5", "@react-stately/list@3.10.5": +"@react-stately/list@3.10.5", "@react-stately/list@^3.10.5": version "3.10.5" resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.10.5.tgz" integrity sha512-fV9plO+6QDHiewsYIhboxcDhF17GO95xepC5ki0bKXo44gr14g/LSo/BMmsaMnV+1BuGdBunB05bO4QOIaigXA== @@ -2166,7 +2174,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/menu@^3.7.1", "@react-stately/menu@3.7.1": +"@react-stately/menu@3.7.1", "@react-stately/menu@^3.7.1": version "3.7.1" resolved "https://registry.npmjs.org/@react-stately/menu/-/menu-3.7.1.tgz" integrity sha512-mX1w9HHzt+xal1WIT2xGrTQsoLvDwuB2R1Er1MBABs//MsJzccycatcgV/J/28m6tO5M9iuFQQvLV+i1dCtodg== @@ -2176,7 +2184,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/overlays@^3.6.7", "@react-stately/overlays@3.6.7": +"@react-stately/overlays@3.6.7", "@react-stately/overlays@^3.6.7": version "3.6.7" resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.7.tgz" integrity sha512-6zp8v/iNUm6YQap0loaFx6PlvN8C0DgWHNlrlzMtMmNuvjhjR0wYXVaTfNoUZBWj25tlDM81ukXOjpRXg9rLrw== @@ -2194,7 +2202,7 @@ "@react-types/overlays" "^3.8.9" "@swc/helpers" "^0.5.0" -"@react-stately/radio@^3.10.4", "@react-stately/radio@3.10.4": +"@react-stately/radio@3.10.4", "@react-stately/radio@^3.10.4": version "3.10.4" resolved "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.4.tgz" integrity sha512-kCIc7tAl4L7Hu4Wt9l2jaa+MzYmAJm0qmC8G8yPMbExpWbLRu6J8Un80GZu+JxvzgDlqDyrVvyv9zFifwH/NkQ== @@ -2227,7 +2235,7 @@ "@react-types/shared" "^3.24.1" "@swc/helpers" "^0.5.0" -"@react-stately/slider@^3.5.4", "@react-stately/slider@3.5.4": +"@react-stately/slider@3.5.4", "@react-stately/slider@^3.5.4": version "3.5.4" resolved "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.4.tgz" integrity sha512-Jsf7K17dr93lkNKL9ij8HUcoM1sPbq8TvmibD6DhrK9If2lje+OOL8y4n4qreUnfMT56HCAeS9wCO3fg3eMyrw== @@ -2237,7 +2245,7 @@ "@react-types/slider" "^3.7.3" "@swc/helpers" "^0.5.0" -"@react-stately/table@^3.11.8", "@react-stately/table@3.11.8": +"@react-stately/table@3.11.8", "@react-stately/table@^3.11.8": version "3.11.8" resolved "https://registry.npmjs.org/@react-stately/table/-/table-3.11.8.tgz" integrity sha512-EdyRW3lT1/kAVDp5FkEIi1BQ7tvmD2YgniGdLuW/l9LADo0T+oxZqruv60qpUS6sQap+59Riaxl91ClDxrJnpg== @@ -2252,7 +2260,7 @@ "@react-types/table" "^3.9.5" "@swc/helpers" "^0.5.0" -"@react-stately/tabs@^3.6.6", "@react-stately/tabs@3.6.6": +"@react-stately/tabs@3.6.6", "@react-stately/tabs@^3.6.6": version "3.6.6" resolved "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.6.tgz" integrity sha512-sOLxorH2uqjAA+v1ppkMCc2YyjgqvSGeBDgtR/lyPSDd4CVMoTExszROX2dqG0c8il9RQvzFuufUtQWMY6PgSA== @@ -2262,7 +2270,7 @@ "@react-types/tabs" "^3.3.7" "@swc/helpers" "^0.5.0" -"@react-stately/toggle@^3.7.4", "@react-stately/toggle@3.7.4": +"@react-stately/toggle@3.7.4", "@react-stately/toggle@^3.7.4": version "3.7.4" resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.4.tgz" integrity sha512-CoYFe9WrhLkDP4HGDpJYQKwfiYCRBAeoBQHv+JWl5eyK61S8xSwoHsveYuEZ3bowx71zyCnNAqWRrmNOxJ4CKA== @@ -2280,7 +2288,7 @@ "@react-types/checkbox" "^3.8.3" "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@^3.4.9", "@react-stately/tooltip@3.4.9": +"@react-stately/tooltip@3.4.9", "@react-stately/tooltip@^3.4.9": version "3.4.9" resolved "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.9.tgz" integrity sha512-P7CDJsdoKarz32qFwf3VNS01lyC+63gXpDZG31pUu+EO5BeQd4WKN/AH1Beuswpr4GWzxzFc1aXQgERFGVzraA== @@ -2289,7 +2297,7 @@ "@react-types/tooltip" "^3.4.9" "@swc/helpers" "^0.5.0" -"@react-stately/tree@^3.8.1", "@react-stately/tree@3.8.1": +"@react-stately/tree@3.8.1", "@react-stately/tree@^3.8.1": version "3.8.1" resolved "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.1.tgz" integrity sha512-LOdkkruJWch3W89h4B/bXhfr0t0t1aRfEp+IMrrwdRAl23NaPqwl5ILHs4Xu5XDHqqhg8co73pHrJwUyiTWEjw== @@ -2300,7 +2308,7 @@ "@react-types/shared" "^3.23.1" "@swc/helpers" "^0.5.0" -"@react-stately/utils@^3.10.1", "@react-stately/utils@3.10.1": +"@react-stately/utils@3.10.1", "@react-stately/utils@^3.10.1": version "3.10.1" resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.1.tgz" integrity sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg== @@ -2314,7 +2322,7 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-stately/virtualizer@^3.7.1", "@react-stately/virtualizer@3.7.1": +"@react-stately/virtualizer@3.7.1", "@react-stately/virtualizer@^3.7.1": version "3.7.1" resolved "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.7.1.tgz" integrity sha512-voHgE6EQ+oZaLv6u2umKxakvIKNkCQuUihqKACTjdslp7SJh4Mvs3oLBI0hf0JOh+rCcFIKDvQtFwy1fXFRYBA== @@ -2330,7 +2338,7 @@ dependencies: "@react-types/shared" "^3.23.1" -"@react-types/breadcrumbs@^3.7.5", "@react-types/breadcrumbs@3.7.5": +"@react-types/breadcrumbs@3.7.5", "@react-types/breadcrumbs@^3.7.5": version "3.7.5" resolved "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.5.tgz" integrity sha512-lV9IDYsMiu2TgdMIjEmsOE0YWwjb3jhUNK1DCZZfq6uWuiHLgyx2EncazJBUWSjHJ4ta32j7xTuXch+8Ai6u/A== @@ -2338,7 +2346,7 @@ "@react-types/link" "^3.5.5" "@react-types/shared" "^3.23.1" -"@react-types/button@^3.9.4", "@react-types/button@3.9.4": +"@react-types/button@3.9.4", "@react-types/button@^3.9.4": version "3.9.4" resolved "https://registry.npmjs.org/@react-types/button/-/button-3.9.4.tgz" integrity sha512-raeQBJUxBp0axNF74TXB8/H50GY8Q3eV6cEKMbZFP1+Dzr09Ngv0tJBeW0ewAxAguNH5DRoMUAUGIXtSXskVdA== @@ -2352,7 +2360,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/calendar@^3.4.6", "@react-types/calendar@3.4.6": +"@react-types/calendar@3.4.6", "@react-types/calendar@^3.4.6": version "3.4.6" resolved "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.6.tgz" integrity sha512-WSntZPwtvsIYWvBQRAPvuCn55UTJBZroTvX0vQvWykJRQnPAI20G1hMQ3dNsnAL+gLZUYxBXn66vphmjUuSYew== @@ -2360,7 +2368,7 @@ "@internationalized/date" "^3.5.4" "@react-types/shared" "^3.23.1" -"@react-types/checkbox@^3.8.1", "@react-types/checkbox@3.8.1": +"@react-types/checkbox@3.8.1", "@react-types/checkbox@^3.8.1": version "3.8.1" resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.8.1.tgz" integrity sha512-5/oVByPw4MbR/8QSdHCaalmyWC71H/QGgd4aduTJSaNi825o+v/hsN2/CH7Fq9atkLKsC8fvKD00Bj2VGaKriQ== @@ -2374,14 +2382,14 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/combobox@^3.11.1", "@react-types/combobox@3.11.1": +"@react-types/combobox@3.11.1", "@react-types/combobox@^3.11.1": version "3.11.1" resolved "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.11.1.tgz" integrity sha512-UNc3OHt5cUt5gCTHqhQIqhaWwKCpaNciD8R7eQazmHiA9fq8ROlV+7l3gdNgdhJbTf5Bu/V5ISnN7Y1xwL3zqQ== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/datepicker@^3.7.4", "@react-types/datepicker@3.7.4": +"@react-types/datepicker@3.7.4", "@react-types/datepicker@^3.7.4": version "3.7.4" resolved "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.4.tgz" integrity sha512-ZfvgscvNzBJpYyVWg3nstJtA/VlWLwErwSkd1ivZYam859N30w8yH+4qoYLa6FzWLCFlrsRHyvtxlEM7lUAt5A== @@ -2399,7 +2407,7 @@ "@react-types/overlays" "^3.8.9" "@react-types/shared" "^3.24.1" -"@react-types/grid@^3.2.6", "@react-types/grid@3.2.6": +"@react-types/grid@3.2.6", "@react-types/grid@^3.2.6": version "3.2.6" resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.6.tgz" integrity sha512-XfHenL2jEBUYrhKiPdeM24mbLRXUn79wVzzMhrNYh24nBwhsPPpxF+gjFddT3Cy8dt6tRInfT6pMEu9nsXwaHw== @@ -2413,7 +2421,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/link@^3.5.5", "@react-types/link@3.5.5": +"@react-types/link@3.5.5", "@react-types/link@^3.5.5": version "3.5.5" resolved "https://registry.npmjs.org/@react-types/link/-/link-3.5.5.tgz" integrity sha512-G6P5WagHDR87npN7sEuC5IIgL1GsoY4WFWKO4734i2CXRYx24G9P0Su3AX4GA3qpspz8sK1AWkaCzBMmvnunfw== @@ -2427,7 +2435,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/menu@^3.9.9", "@react-types/menu@3.9.9": +"@react-types/menu@3.9.9", "@react-types/menu@^3.9.9": version "3.9.9" resolved "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.9.tgz" integrity sha512-FamUaPVs1Fxr4KOMI0YcR2rYZHoN7ypGtgiEiJ11v/tEPjPPGgeKDxii0McCrdOkjheatLN1yd2jmMwYj6hTDg== @@ -2435,7 +2443,7 @@ "@react-types/overlays" "^3.8.7" "@react-types/shared" "^3.23.1" -"@react-types/overlays@^3.8.7", "@react-types/overlays@3.8.7": +"@react-types/overlays@3.8.7", "@react-types/overlays@^3.8.7": version "3.8.7" resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.7.tgz" integrity sha512-zCOYvI4at2DkhVpviIClJ7bRrLXYhSg3Z3v9xymuPH3mkiuuP/dm8mUCtkyY4UhVeUTHmrQh1bzaOP00A+SSQA== @@ -2449,20 +2457,27 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/progress@^3.5.4", "@react-types/progress@3.5.4": +"@react-types/progress@3.5.4", "@react-types/progress@^3.5.4": version "3.5.4" resolved "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.4.tgz" integrity sha512-JNc246sTjasPyx5Dp7/s0rp3Bz4qlu4LrZTulZlxWyb53WgBNL7axc26CCi+I20rWL9+c7JjhrRxnLl/1cLN5g== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/radio@^3.8.1", "@react-types/radio@3.8.1": +"@react-types/radio@3.8.1", "@react-types/radio@^3.8.1": version "3.8.1" resolved "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.1.tgz" integrity sha512-bK0gio/qj1+0Ldu/3k/s9BaOZvnnRgvFtL3u5ky479+aLG5qf1CmYed3SKz8ErZ70JkpuCSrSwSCFf0t1IHovw== dependencies: "@react-types/shared" "^3.23.1" +"@react-types/select@3.9.4": + version "3.9.4" + resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.4.tgz" + integrity sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg== + dependencies: + "@react-types/shared" "^3.23.1" + "@react-types/select@^3.9.6": version "3.9.6" resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.6.tgz" @@ -2470,14 +2485,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/select@3.9.4": - version "3.9.4" - resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.4.tgz" - integrity sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg== - dependencies: - "@react-types/shared" "^3.23.1" - -"@react-types/shared@^3.23.1", "@react-types/shared@3.23.1": +"@react-types/shared@3.23.1", "@react-types/shared@^3.23.1": version "3.23.1" resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.23.1.tgz" integrity sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw== @@ -2501,7 +2509,7 @@ dependencies: "@react-types/shared" "^3.24.1" -"@react-types/table@^3.9.5", "@react-types/table@3.9.5": +"@react-types/table@3.9.5", "@react-types/table@^3.9.5": version "3.9.5" resolved "https://registry.npmjs.org/@react-types/table/-/table-3.9.5.tgz" integrity sha512-fgM2j9F/UR4Anmd28CueghCgBwOZoCVyN8fjaIFPd2MN4gCwUUfANwxLav65gZk4BpwUXGoQdsW+X50L3555mg== @@ -2509,21 +2517,21 @@ "@react-types/grid" "^3.2.6" "@react-types/shared" "^3.23.1" -"@react-types/tabs@^3.3.7", "@react-types/tabs@3.3.7": +"@react-types/tabs@3.3.7", "@react-types/tabs@^3.3.7": version "3.3.7" resolved "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.7.tgz" integrity sha512-ZdLe5xOcFX6+/ni45Dl2jO0jFATpTnoSqj6kLIS/BYv8oh0n817OjJkLf+DS3CLfNjApJWrHqAk34xNh6nRnEg== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/textfield@^3.9.3", "@react-types/textfield@3.9.3": +"@react-types/textfield@3.9.3", "@react-types/textfield@^3.9.3": version "3.9.3" resolved "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.3.tgz" integrity sha512-DoAY6cYOL0pJhgNGI1Rosni7g72GAt4OVr2ltEx2S9ARmFZ0DBvdhA9lL2nywcnKMf27PEJcKMXzXc10qaHsJw== dependencies: "@react-types/shared" "^3.23.1" -"@react-types/tooltip@^3.4.9", "@react-types/tooltip@3.4.9": +"@react-types/tooltip@3.4.9", "@react-types/tooltip@^3.4.9": version "3.4.9" resolved "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.9.tgz" integrity sha512-wZ+uF1+Zc43qG+cOJzioBmLUNjRa7ApdcT0LI1VvaYvH5GdfjzUJOorLX9V/vAci0XMJ50UZ+qsh79aUlw2yqg== @@ -2536,7 +2544,7 @@ resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/helpers@^0.5.0", "@swc/helpers@0.5.5": +"@swc/helpers@0.5.5", "@swc/helpers@^0.5.0": version "0.5.5" resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== @@ -4042,7 +4050,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0": +"@types/react@*": version "18.3.11" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz" integrity sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ== @@ -4063,6 +4071,11 @@ abab@^2.0.5, abab@^2.0.6: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" @@ -4113,13 +4126,6 @@ ag-grid-react@^32.0.2: ag-grid-community "32.1.0" prop-types "^15.8.1" -agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.1" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" - agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -4127,6 +4133,13 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.1" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -4169,6 +4182,19 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + arg@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" @@ -4236,6 +4262,14 @@ body-scroll-lock@^3.1.5: resolved "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz" integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" @@ -4290,6 +4324,15 @@ caniuse-lite@^1.0.30001579: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001634.tgz" integrity sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA== +canvas@^2.8.0: + version "2.11.2" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860" + integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + nan "^2.17.0" + simple-get "^3.0.3" + chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -4299,14 +4342,14 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chart.js@^4.1.1, chart.js@^4.4.6: +chart.js@^4.4.6: version "4.4.6" resolved "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz" integrity sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA== dependencies: "@kurkle/color" "^0.3.0" -chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -4321,22 +4364,22 @@ chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": optionalDependencies: fsevents "~2.3.2" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + classnames@^2.3.1: version "2.5.1" resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== -client-only@^0.0.1, client-only@0.0.1: +client-only@0.0.1, client-only@^0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -clsx@^1.1.1: - version "1.2.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -clsx@^1.2.1: +clsx@^1.1.1, clsx@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -4360,16 +4403,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-string@^1.9.0: version "1.9.1" resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" @@ -4378,6 +4421,16 @@ color-string@^1.9.0: color-name "^1.0.0" simple-swizzle "^0.2.2" +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color2k@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz" + integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== + color@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" @@ -4386,11 +4439,6 @@ color@^4.2.3: color-convert "^2.0.1" color-string "^1.9.0" -color2k@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz" - integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -4398,6 +4446,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@2: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^11.0.0: version "11.1.0" resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" @@ -4408,11 +4461,6 @@ commander@^4.0.0: resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@2: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - complex.js@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz" @@ -4423,6 +4471,11 @@ compute-scroll-into-view@^3.0.2: resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz" integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + concaveman@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/concaveman/-/concaveman-1.2.1.tgz" @@ -4433,6 +4486,11 @@ concaveman@^1.2.1: robust-predicates "^2.0.4" tinyqueue "^2.0.3" +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" @@ -4533,6 +4591,13 @@ dayjs@^1.11.13: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== +debug@4, debug@^4.3.3, debug@^4.3.4: + version "4.3.5" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + debug@^4.3.1: version "4.3.7" resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" @@ -4540,18 +4605,18 @@ debug@^4.3.1: dependencies: ms "^2.1.3" -debug@^4.3.3, debug@^4.3.4, debug@4: - version "4.3.5" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - decimal.js@^10.3.1, decimal.js@^10.4.3: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + deepmerge@4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" @@ -4567,6 +4632,16 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" @@ -4757,13 +4832,25 @@ fraction.js@^4.3.7: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== -framer-motion@^11.2.13, framer-motion@>=10.17.0: +framer-motion@^11.2.13: version "11.3.21" resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-11.3.21.tgz" integrity sha512-D+hfIsvzV8eL/iycld4K+tKlg2Q2LdwnrcBEohtGw3cG1AIuNYATbT5RUqIM1ndsAk+EfGhoSGf0UaiFodc5Tw== dependencies: tslib "^2.4.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + fs@^0.0.1-security: version "0.0.1-security" resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" @@ -4779,6 +4866,21 @@ function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + geojson-equality-ts@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/geojson-equality-ts/-/geojson-equality-ts-1.0.2.tgz" @@ -4823,6 +4925,18 @@ glob@^10.3.10: minipass "^7.1.2" path-scurry "^1.11.1" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -4843,6 +4957,11 @@ has-flag@^3.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + hasown@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" @@ -4897,7 +5016,7 @@ https-proxy-agent@^7.0.0: agent-base "^7.0.2" debug "4" -iconv-lite@^0.6.3, iconv-lite@0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -4922,9 +5041,17 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -inherits@^2.0.4: +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== international-types@^0.8.1: @@ -5255,6 +5382,13 @@ lru-cache@^10.2.0: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + marchingsquares@^1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/marchingsquares/-/marchingsquares-1.3.3.tgz" @@ -5305,6 +5439,18 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^9.0.4: version "9.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" @@ -5312,17 +5458,37 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" -ms@^2.1.1, ms@2.1.2: +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -5353,6 +5519,11 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nan@^2.17.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== + nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" @@ -5395,11 +5566,35 @@ next@14.2.3: "@next/swc-win32-ia32-msvc" "14.2.3" "@next/swc-win32-x64-msvc" "14.2.3" +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + nwsapi@^2.2.0: version "2.2.10" resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz" @@ -5415,6 +5610,13 @@ object-hash@^3.0.0: resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== +once@^1.3.0, once@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + open@^8.0.0: version "8.4.2" resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" @@ -5446,6 +5648,11 @@ parse5@6.0.1: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -5551,15 +5758,6 @@ postcss-value-parser@^4.0.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8, postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: - version "8.4.38" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -5569,6 +5767,15 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8, postcss@^8.4.23: + version "8.4.38" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + prettier@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" @@ -5663,7 +5870,7 @@ react-datepicker@^7.3.0: prop-types "^15.7.2" react-onclickoutside "^6.13.0" -"react-dom@^15.5.x || ^16.x || ^17.x || ^18.x", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", "react-dom@^16.9.0 || ^17 || ^18", react-dom@^18, react-dom@^18.0.0, react-dom@^18.2.0, "react-dom@>= 16.3.0", react-dom@>=16.6.0, react-dom@>=16.8.0, react-dom@>=18: +react-dom@^18: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -5780,7 +5987,7 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@*, "react@^15.5.x || ^16.x || ^17.x || ^18.x", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.3.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17 || ^18", react@^18, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.3.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.13.1, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=18: +react@^18: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -5794,6 +6001,15 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^4.2.0: version "4.5.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz" @@ -5853,6 +6069,13 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + robust-predicates@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz" @@ -5885,7 +6108,7 @@ safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.3.0, sass@^1.77.8: +sass@^1.77.8: version "1.77.8" resolved "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz" integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ== @@ -5920,6 +6143,16 @@ seedrandom@^3.0.5: resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== +semver@^6.0.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + semver@^7.5.4: version "7.6.2" resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" @@ -5930,6 +6163,11 @@ server-only@^0.0.1: resolved "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz" integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA== +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -5942,11 +6180,30 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" @@ -5959,7 +6216,7 @@ skmeans@0.9.7: resolved "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz" integrity sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg== -source-map-js@^1.0.2, source-map-js@^1.2.0, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== @@ -5994,13 +6251,6 @@ streamsearch@^1.1.0: resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -6010,16 +6260,16 @@ string_decoder@^1.3.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1: +string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -6028,23 +6278,14 @@ string-width@^5.0.1: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" + safe-buffer "~5.2.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6107,7 +6348,7 @@ sweetalert2-react-content@^5.0.7: resolved "https://registry.npmjs.org/sweetalert2-react-content/-/sweetalert2-react-content-5.0.7.tgz" integrity sha512-8Fk82Mpk45lFXpJWKIFF/lq8k/dJKDDQGFcuqVosaL/qRdViyAs5+u37LoTGfnOIvf+rfQB3PAXcp1XLLn+0ew== -sweetalert2@^11.0.0, sweetalert2@^11.14.1: +sweetalert2@^11.14.1: version "11.14.1" resolved "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.14.1.tgz" integrity sha512-xadhfcA4STGMh8nC5zHFFWURhRpWc4zyI3GdMDFH/m3hGWZeQQNWhX9xcG4lI9gZYsi/IlazKbwvvje3juL3Xg== @@ -6134,7 +6375,7 @@ tailwind-variants@^0.1.20: dependencies: tailwind-merge "^1.14.0" -tailwindcss@*, tailwindcss@^3.4.1, tailwindcss@>=3.4.0: +tailwindcss@^3.4.1: version "3.4.4" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz" integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== @@ -6162,6 +6403,18 @@ tailwindcss@*, tailwindcss@^3.4.1, tailwindcss@>=3.4.0: resolve "^1.22.2" sucrase "^3.32.0" +tar@^6.1.11: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + tarn@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz" @@ -6250,6 +6503,11 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" @@ -6320,9 +6578,9 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^10.0.0: @@ -6349,6 +6607,11 @@ w3c-xmlserializer@^3.0.0: dependencies: xml-name-validator "^4.0.0" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" @@ -6382,6 +6645,14 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -6389,6 +6660,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -6407,6 +6685,11 @@ wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + ws@^8.2.3: version "8.17.1" resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" @@ -6422,6 +6705,11 @@ xmlchars@^2.2.0: resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.10.0: version "1.10.2" resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" From bfeba67088d9faf400b260889ee7ecc250c5e8f4 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Mon, 25 Nov 2024 14:56:12 +0900 Subject: [PATCH 155/200] =?UTF-8?q?refactor:=20CanvasLayout=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=82=B4=20objNo=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20=ED=8A=B9=EC=A0=95=20plan=EC=97=90=20=ED=8F=AC?= =?UTF-8?q?=EC=BB=A4=EC=8B=B1=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasLayout.jsx | 7 ++++--- src/hooks/usePlan.js | 14 ++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/components/floor-plan/CanvasLayout.jsx b/src/components/floor-plan/CanvasLayout.jsx index 1604a28f..1e69ec40 100644 --- a/src/components/floor-plan/CanvasLayout.jsx +++ b/src/components/floor-plan/CanvasLayout.jsx @@ -2,7 +2,7 @@ import { useContext, useEffect, useState } from 'react' import { useRecoilValue } from 'recoil' -import CanvasFrame from './CanvasFrame' +import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import { useMessage } from '@/hooks/useMessage' import { useSwal } from '@/hooks/useSwal' import { usePlan } from '@/hooks/usePlan' @@ -14,7 +14,8 @@ export default function CanvasLayout({ children }) { // const { menuNumber } = props const { menuNumber } = useCanvasMenu() const { session } = useContext(SessionContext) - const [objectNo, setObjectNo] = useState('test123240822001') // 이후 삭제 필요 + const { floorPlanState } = useContext(FloorPlanContext) + const { objectNo, pid } = floorPlanState const globalLocaleState = useRecoilValue(globalLocaleStore) const { getMessage } = useMessage() @@ -22,7 +23,7 @@ export default function CanvasLayout({ children }) { const { plans, modifiedPlans, loadCanvasPlanData, handleCurrentPlan, handleAddPlan, handleDeletePlan } = usePlan() useEffect(() => { - loadCanvasPlanData(session.userId, objectNo) + loadCanvasPlanData(session.userId, objectNo, pid) }, []) return ( diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index b0ed47d6..946cc628 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -23,6 +23,9 @@ export function usePlan() { const { getMessage } = useMessage() const { get, promisePost, promisePut, promiseDel } = useAxios() + const planLabel = 'Plan ' + const newPlanLabel = 'New Plan ' + /** * 마우스 포인터의 가이드라인을 제거합니다. */ @@ -184,7 +187,7 @@ export function usePlan() { return get({ url: `/api/canvas-management/canvas-statuses/by-object/${objectNo}/${userId}` }).then((res) => res.map((item) => ({ id: item.id, - name: item.objectNo + '-' + item.id, // tab button에 표출될 이름 (임시) + name: planLabel + item.id, userId: item.userId, canvasStatus: dbToCanvasFormat(item.canvasStatus), isCurrent: false, @@ -213,7 +216,7 @@ export function usePlan() { ? { ...plan, id: res.data, - name: currentCanvasPlan.objectNo + '-' + res.data, + name: planLabel + res.data, canvasStatus: canvasStatus, } : plan, @@ -318,7 +321,7 @@ export function usePlan() { const id = uuidv4() const newPlan = { id: id, - name: `Plan ${planNum + 1}`, + name: newPlanLabel + `${planNum + 1}`, objectNo: objectNo, userId: userId, canvasStatus: canvasStatus, @@ -364,14 +367,13 @@ export function usePlan() { /** * plan 조회 */ - const loadCanvasPlanData = (userId, objectNo) => { + const loadCanvasPlanData = (userId, objectNo, pid) => { getCanvasByObjectNo(userId, objectNo).then((res) => { // console.log('canvas 목록 ', res) if (res.length > 0) { setInitCanvasPlans(res) setPlans(res) - updateCurrentPlan(res.at(-1).id) // last 데이터에 포커싱 - setPlanNum(res.length) + updateCurrentPlan(Number(pid)) // last 데이터에 포커싱 } else { addPlan(userId, objectNo) } From 29fac012847ccf76f1b91923ebbd9ed38e2ddd1e Mon Sep 17 00:00:00 2001 From: Jaeyoung Lee Date: Mon, 25 Nov 2024 15:28:57 +0900 Subject: [PATCH 156/200] =?UTF-8?q?=EC=A7=80=EB=B6=95=20=EA=B7=B8=EB=A6=AC?= =?UTF-8?q?=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Roof2.jsx | 2 +- src/components/fabric/QPolygon.js | 1 + src/hooks/useMode.js | 2 +- src/util/qpolygon-utils.js | 58 +++++++++++++------------------ 4 files changed, 27 insertions(+), 36 deletions(-) diff --git a/src/components/Roof2.jsx b/src/components/Roof2.jsx index 648c8bf3..731fe8c6 100644 --- a/src/components/Roof2.jsx +++ b/src/components/Roof2.jsx @@ -469,7 +469,7 @@ export default function Roof2(props) { { x: 500, y: 100 }, ] - const polygon = new QPolygon(eightPoint4, { + const polygon = new QPolygon(test4, { fill: 'transparent', stroke: 'green', strokeWidth: 1, diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index 808f6765..2202bac0 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -31,6 +31,7 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { this.cells = [] this.innerLines = [] this.children = [] + this.separatePolygon = [] // 소수점 전부 제거 points.forEach((point) => { diff --git a/src/hooks/useMode.js b/src/hooks/useMode.js index e97621f1..5af1b0f8 100644 --- a/src/hooks/useMode.js +++ b/src/hooks/useMode.js @@ -1515,7 +1515,7 @@ export function useMode() { pitch: 4, sleeve: true, }*/ - if (index % 2 !== 0) { + if (index % 2 === 0) { line.attributes = { type: LINE_TYPE.WALLLINE.GABLE, offset: 30, diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index d7385305..7fd9009f 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1253,20 +1253,10 @@ export const drawGabledRoof = (roofId, canvas) => { const minY = Math.min(...roofPoints.map((point) => point.y)) const maxY = Math.max(...roofPoints.map((point) => point.y)) + // 맞은편 라인을 찾기 위해 현재 polygon으로 만들수 있는 최대한의 길이를 구한다. const checkLength = Math.abs(Math.sqrt(Math.pow(maxX - minX, 2) + Math.pow(maxY - minY, 2))) - wallLines - .filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.GABLE) - .forEach((gable) => { - const gableLine = new QLine([gable.x1, gable.y1, gable.x2, gable.y2], { - fontSize: roof.fontSize, - stroke: 'cyan', - strokeWidth: 2, - }) - canvas.add(gableLine) - canvas.renderAll() - }) - + // 처마라인의 기본속성 입력 const eaves = [] roofLines.forEach((currentRoof, index) => { if (currentRoof.attributes !== undefined && currentRoof.attributes.type === LINE_TYPE.WALLLINE.EAVES) { @@ -1282,9 +1272,10 @@ export const drawGabledRoof = (roofId, canvas) => { const index = eave.index, currentRoof = eave.roof const currentWall = wallLines[index] - const prevRoof = index === 0 ? roofLines[wallLines.length - 1] : roofLines[index - 1] - const nextRoof = index === roofLines.length - 1 ? roofLines[0] : index === roofLines.length ? roofLines[1] : roofLines[index + 1] + // const prevRoof = index === 0 ? roofLines[wallLines.length - 1] : roofLines[index - 1] + // const nextRoof = index === roofLines.length - 1 ? roofLines[0] : index === roofLines.length ? roofLines[1] : roofLines[index + 1] + //현재 지붕의 중심 좌표 const midX = Math.round(((currentRoof.x1 + currentRoof.x2) / 2) * 10) / 10 const midY = Math.round(((currentRoof.y1 + currentRoof.y2) / 2) * 10) / 10 const deltaX = currentWall.x2 - currentWall.x1 @@ -1303,6 +1294,7 @@ export const drawGabledRoof = (roofId, canvas) => { const checkY = Math.round((midY - signY * checkLength) * 10) / 10 const intersectLines = [] + // 현재 지붕의 맞은편 지붕을 찾는다. roofLines .filter((line) => line !== currentRoof) .forEach((line) => { @@ -1315,6 +1307,7 @@ export const drawGabledRoof = (roofId, canvas) => { } }) + // 가장 가까운 지붕을 찾는다. const intersect = intersectLines.reduce((prev, current) => { if (prev !== undefined) { const prevDistance = Math.sqrt(Math.pow(prev.x - midX, 2) + Math.pow(prev.y - midY, 2)) @@ -1400,13 +1393,6 @@ export const drawGabledRoof = (roofId, canvas) => { const prevRoof = index === 0 ? roofLines[wallLines.length - 1] : roofLines[index - 1] const nextRoof = index === roofLines.length - 1 ? roofLines[0] : index === roofLines.length ? roofLines[1] : roofLines[index + 1] - /*const midX = Math.round(((currentRoof.x1 + currentRoof.x2) / 2) * 10) / 10 - const midY = Math.round(((currentRoof.y1 + currentRoof.y2) / 2) * 10) / 10 - const midWallX = Math.round(((currentWall.x1 + currentWall.x2) / 2) * 10) / 10 - const midWallY = Math.round(((currentWall.y1 + currentWall.y2) / 2) * 10) / 10 - const signX = Math.sign(midX - midWallX) - const signY = Math.sign(midY - midWallY) -*/ const midX = Math.round(((currentRoof.x1 + currentRoof.x2) / 2) * 10) / 10 const midY = Math.round(((currentRoof.y1 + currentRoof.y2) / 2) * 10) / 10 const deltaX = currentWall.x2 - currentWall.x1 @@ -1446,7 +1432,6 @@ export const drawGabledRoof = (roofId, canvas) => { intersectRidge.push({ line: ridge, name: 'mid' }) } } - console.log('signX : ', signX, 'signY : ', signY) if (Math.sign(midX - ridgeMidX) === signX || Math.sign(midY - ridgeMidY) === signY) { const prevIntersect = edgesIntersection( { vertex1: { x: prevRoof.x1, y: prevRoof.y1 }, vertex2: { x: prevRoof.x2, y: prevRoof.y2 } }, @@ -1576,7 +1561,6 @@ export const drawGabledRoof = (roofId, canvas) => { } } }) - console.log('sortedPoints : ', sortedPoints) if (sortedPoints.length > 0) { const roofPolygon = new QPolygon(sortedPoints, { fill: 'transparent', @@ -1587,10 +1571,26 @@ export const drawGabledRoof = (roofId, canvas) => { name: 'roofPolygon', attributes: { roofId: roof.id, currentRoof: currentRoof.id }, }) + const currentDegree = currentRoof.attributes.pitch > 0 ? getDegreeByChon(currentRoof.attributes.pitch) : currentRoof.attributes.degree + //지붕 각도에 따른 실측치 조정 + roofPolygon.lines.forEach((line) => { + line.attributes.planeSize = Math.round(Math.sqrt(Math.pow(line.x2 - line.x1, 2) + Math.pow(line.y2 - line.y1, 2)) * 10) + const slope = (line) => (line.x2 - line.x1 === 0 ? Infinity : (line.y2 - line.y1) / (line.x2 - line.x1)) + + if (currentDegree > 0 && slope(line) !== slope(currentRoof)) { + const height = Math.tan(currentDegree * (Math.PI / 180)) * line.attributes.planeSize + line.attributes.actualSize = Math.round(Math.sqrt(Math.pow(line.attributes.planeSize, 2) + Math.pow(height, 2))) + } else { + line.attributes.actualSize = line.attributes.planeSize + } + }) + roof.separatePolygon.push(roofPolygon) canvas.add(roofPolygon) canvas.renderAll() } }) + //기준선 제거 + ridges.forEach((ridge) => canvas.remove(ridge)) } /** @@ -1607,7 +1607,7 @@ export const drawShedRoof = (roofId, canvas) => { } const sheds = roof.lines.filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.SHED) - const eaves = roof.lines.filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.EAVES) + // const eaves = roof.lines.filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.EAVES) const gables = roof.lines.filter((line) => line.attributes !== undefined && line.attributes.type === LINE_TYPE.WALLLINE.GABLE) let shedDegree = sheds[0].attributes.degree || 0 @@ -1708,16 +1708,11 @@ const drawRidge = (roof, canvas) => { const magnitude2 = Math.sqrt(vector2.x * vector2.x + vector2.y * vector2.y) const angle = (Math.acos(dotProduct / (magnitude1 * magnitude2)) * 180) / Math.PI - // console.log('innerRoof', innerRoof) - // console.log('현재라인', currentRoof, '현재라인의 각도 : ', currentAngle, 'inner 라인과의 각도:', angle) - //현재 지붕선과 직각인 선 if (Math.abs(angle) === 90) { const innerBefore = roofLines.find((line) => innerRoof.x1 === line.x2 && innerRoof.y1 === line.y2) const ibAngle = Math.atan2(innerBefore.y2 - innerBefore.y1, innerBefore.x2 - innerBefore.x1) * (180 / Math.PI) - // console.log('현재라인과 직각인 선의 이전라인', innerBefore, '각도', ibAngle) if (Math.abs(currentAngle - ibAngle) === 180) { - // console.log('currentRoof 의 x2,y2 좌표에서 연결된 라인') if (currentAngle === 0 || currentAngle === 180) { currentX2 = innerRoof.x1 ridgeMinLength = @@ -1740,7 +1735,6 @@ const drawRidge = (roof, canvas) => { } } if (Math.abs(currentAngle - ibAngle) === 0) { - // console.log('currentRoof 의 x1,y1 좌표에서 연결된 라인', currentAngle) if (currentAngle === 0 || currentAngle === 180) { currentX1 = innerRoof.x2 ridgeMinLength = @@ -1765,7 +1759,6 @@ const drawRidge = (roof, canvas) => { } //현재 지붕선과 반대인 선 if (Math.abs(angle) === 180) { - // console.log('현재라인과 반대인 선') if (currentAngle === 0 || currentAngle === 180) { } if (currentAngle === 90 || currentAngle === 270) { @@ -1829,8 +1822,6 @@ const drawRidge = (roof, canvas) => { const hypo = Math.sqrt(Math.pow(Math.abs(startXPoint - endXPoint), 2) + Math.pow(Math.abs(startYPoint - endYPoint), 2)) const intersectLength = Math.sqrt(Math.pow(Math.abs(midX - intersectLine.x), 2) + Math.pow(Math.abs(midY - intersectLine.y), 2)) - console.log('intersect 좌표까지의 거리 : ', intersectLength) - console.log('hypotenuse', hypo, 'ridgeMinLength', ridgeMinLength) if (intersectLength < prevRoof.attributes.planeSize / 10 && intersectLength < nextRoof.attributes.planeSize / 10) { endXPoint = startXPoint endYPoint = startYPoint @@ -1844,7 +1835,6 @@ const drawRidge = (roof, canvas) => { endXPoint = Math.round(startXPoint + Math.sign(alpha) * -1 * ridgeMinLength) endYPoint = Math.round(startYPoint + Math.sign(beta) * -1 * ridgeMinLength) } - console.log('startXPoint', startXPoint, 'startYPoint', startYPoint, 'endXPoint', endXPoint, 'endYPoint', endYPoint) const ridge = new QLine([startXPoint, startYPoint, endXPoint, endYPoint], { fontSize: roof.fontSize, From aee7d6aa1323de858842c0155c58a487ecdc062a Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 25 Nov 2024 17:00:08 +0900 Subject: [PATCH 157/200] =?UTF-8?q?'=EB=B0=A9=ED=96=A5=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D'=20=EB=8B=A4=EA=B5=AD=EC=96=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/modal/object/type/PentagonDormer.jsx | 2 +- src/components/floor-plan/modal/object/type/TriangleDormer.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/floor-plan/modal/object/type/PentagonDormer.jsx b/src/components/floor-plan/modal/object/type/PentagonDormer.jsx index c67a08fc..0bca7527 100644 --- a/src/components/floor-plan/modal/object/type/PentagonDormer.jsx +++ b/src/components/floor-plan/modal/object/type/PentagonDormer.jsx @@ -82,7 +82,7 @@ const PentagonDormer = forwardRef((props, refs) => {
    -
    方向の選択
    +
    {getMessage('modal.object.setting.direction.select')}
    {getMessage('commons.north')} diff --git a/src/components/floor-plan/modal/object/type/TriangleDormer.jsx b/src/components/floor-plan/modal/object/type/TriangleDormer.jsx index 34a87e44..229043c8 100644 --- a/src/components/floor-plan/modal/object/type/TriangleDormer.jsx +++ b/src/components/floor-plan/modal/object/type/TriangleDormer.jsx @@ -60,7 +60,7 @@ const TriangleDormer = forwardRef((props, refs) => {
    -
    方向の選択
    +
    {getMessage('modal.object.setting.direction.select')}
    {getMessage('commons.north')} From 09a709ff163e6a70a790ac249364de3d33f61440 Mon Sep 17 00:00:00 2001 From: minsik Date: Mon, 25 Nov 2024 17:02:17 +0900 Subject: [PATCH 158/200] =?UTF-8?q?=EB=B3=B4=EC=A1=B0=EC=84=A0=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/auxiliary/AuxiliaryDrawing.jsx | 4 ++ .../modal/auxiliary/AuxiliaryEdit.jsx | 8 ++- .../modal/auxiliary/AuxiliarySize.jsx | 8 ++- src/hooks/roofcover/useAuxiliaryDrawing.js | 65 ++++++++++--------- src/hooks/useContextMenu.js | 28 ++++++-- 5 files changed, 71 insertions(+), 42 deletions(-) diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryDrawing.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryDrawing.jsx index 84e7ab91..609ff975 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliaryDrawing.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliaryDrawing.jsx @@ -49,6 +49,7 @@ export default function AuxiliaryDrawing({ id, pos = { x: 50, y: 230 } }) { handleFix, buttonAct, setButtonAct, + cutAuxiliary, } = useAuxiliaryDrawing(id) const outerLineProps = { @@ -151,6 +152,9 @@ export default function AuxiliaryDrawing({ id, pos = { x: 50, y: 230 } }) { + diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx index da00ac06..07fc9e46 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx @@ -5,8 +5,8 @@ import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' import { useState } from 'react' import { currentObjectState } from '@/store/canvasAtom' -import { useLine } from '@/hooks/useLine' import { useAuxiliaryDrawing } from '@/hooks/roofcover/useAuxiliaryDrawing' +import { useSwal } from '@/hooks/useSwal' export default function AuxiliaryEdit(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -18,9 +18,13 @@ export default function AuxiliaryEdit(props) { const [horizonSize, setHorizonSize] = useState('0') const [arrow1, setArrow1] = useState(null) const [arrow2, setArrow2] = useState(null) - const { addLine, removeLine } = useLine() const currentObject = useRecoilValue(currentObjectState) + const { swalFire } = useSwal() const handleSave = () => { + if (!horizonSize || !verticalSize || !arrow1 || !arrow2) { + swalFire({ title: '길이와 방향을 입력하세요.', type: 'alert' }) + return + } if (type === 'copy') { if (currentObject) { copy( diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx index 70245626..e984be57 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx @@ -3,12 +3,14 @@ import WithDraggable from '@/components/common/draggable/WithDraggable' import { usePopup } from '@/hooks/usePopup' import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' +import { useCanvas } from '@/hooks/useCanvas' export default function AuxiliarySize(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) const { id, pos = contextPopupPosition } = props const { getMessage } = useMessage() const { closePopup } = usePopup() + const { currentObject } = useCanvas() return (
    @@ -26,7 +28,7 @@ export default function AuxiliarySize(props) {
    - +
    mm
    @@ -45,14 +47,14 @@ export default function AuxiliarySize(props) {
    - +
    mm
    {getMessage('length')}
    - +
    mm
    diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 30e3982e..0d23fd44 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -92,7 +92,7 @@ export function useAuxiliaryDrawing(id) { addCanvasMouseEventListener('mouse:move', mouseMove) addCanvasMouseEventListener('mouse:down', mouseDown) - addDocumentEventListener('contextmenu', document, cutAuxiliary) + // addDocumentEventListener('contextmenu', document, cutAuxiliary) addDocumentEventListener('keydown', document, keydown[type]) return () => { @@ -135,23 +135,6 @@ export function useAuxiliaryDrawing(id) { }) } - const addBisectorLine = (target) => { - const slope = (target.y2 - target.y1) / (target.x2 - target.x1) - const bisectorSlope = -1 / slope - const length = target.length - const dx = length / Math.sqrt(1 + bisectorSlope * bisectorSlope) - const dy = bisectorSlope * dx - const endX = (target.x1 + target.x2) / 2 - const endY = (target.y1 + target.y2) / 2 - - addLine([dx, dy, endX, endY], { - stroke: 'red', - strokeWidth: 1, - selectable: true, - name: 'auxiliaryLine', - }) - } - const keydown = { outerLine: (e) => { if (mousePointerArr.current.length === 0) { @@ -565,8 +548,24 @@ export function useAuxiliaryDrawing(id) { otherAdsorptionPoints.push(intersectionPoint) }) }) + let innerLinePoints = [] + canvas + .getObjects() + .filter((obj) => obj.innerLines) + .forEach((polygon) => { + polygon.innerLines.forEach((line) => { + innerLinePoints.push({ x: line.x1, y: line.y1 }) + innerLinePoints.push({ x: line.x2, y: line.y2 }) + }) + }) - const adsorptionPoints = [...getAdsorptionPoints(), ...roofAdsorptionPoints.current, ...otherAdsorptionPoints, ...intersectionPoints.current] + const adsorptionPoints = [ + ...getAdsorptionPoints(), + ...roofAdsorptionPoints.current, + ...otherAdsorptionPoints, + ...intersectionPoints.current, + ...innerLinePoints, + ] let arrivalPoint = { x: pointer.x, y: pointer.y } @@ -825,7 +824,6 @@ export function useAuxiliaryDrawing(id) { //lineHistory.current에 있는 선들 중 startPoint와 endPoint가 겹치는 line은 제거 // 겹치는 선 하나는 canvas에서 제거한다. - const tempLines = [...lineHistory.current] lineHistory.current = [] tempLines.forEach((line) => { @@ -849,27 +847,30 @@ export function useAuxiliaryDrawing(id) { const tempPolygonPoints = [...roofBase.points].map((obj) => { return { x: Math.round(obj.x), y: Math.round(obj.y) } }) - const roofInnerLines = innerLines.filter((line) => { + const roofInnerLines = [...roofBase.innerLines, ...innerLines].filter((line) => { const inPolygon1 = - tempPolygonPoints.some((point) => point.x === line.x1 && point.y === line.y1) || - roofBase.inPolygon({ x: line.x1, y: line.y1 }) || - roofBase.lines.some((line) => isPointOnLine(line, { x: line.x1, y: line.y1 })) + tempPolygonPoints.some((point) => Math.round(point.x) === Math.round(line.x1) && Math.round(point.y) === Math.round(line.y1)) || + roofBase.inPolygon({ x: Math.round(line.x1), y: Math.round(line.y1) }) || + roofBase.lines.some((line) => isPointOnLine(line, { x: Math.round(line.x1), y: Math.round(line.y1) })) const inPolygon2 = - tempPolygonPoints.some((point) => point.x === line.x2 && point.y === line.y2) || - roofBase.inPolygon({ x: line.x2, y: line.y2 }) || - roofBase.lines.some((line) => isPointOnLine(line, { x: line.x2, y: line.y2 })) + tempPolygonPoints.some((point) => Math.round(point.x) === Math.round(line.x2) && Math.round(point.y) === Math.round(line.y2)) || + roofBase.inPolygon({ x: Math.round(line.x2), y: Math.round(line.y2) }) || + roofBase.lines.some((line) => isPointOnLine(line, { x: Math.round(line.x2), y: Math.round(line.y2) })) if (inPolygon1 && inPolygon2) { - line.attributes = { ...line.attributes, roofId: roofBase.id, actualSize: 0, planeSize: line.getLength() } + line.attributes = { + ...line.attributes, + roofId: roofBase.id, + actualSize: line.attributes?.actualSize ?? 0, + planeSize: line.getLength(), + } return true } }) - roofBase.innerLines = [...roofInnerLines] - + roofBase.innerLines = lineHistory.current.length !== 0 ? [...roofInnerLines] : roofBase.innerLines canvas.renderAll() }) - closePopup(id) } @@ -903,6 +904,6 @@ export function useAuxiliaryDrawing(id) { setButtonAct, move, copy, - addBisectorLine, + cutAuxiliary, } } diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 1f5f59cb..331259e3 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -34,6 +34,7 @@ import { useObjectBatch } from '@/hooks/object/useObjectBatch' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' import { fontSelector, globalFontAtom } from '@/store/fontAtom' import { useLine } from '@/hooks/useLine' +import { useSwal } from '@/hooks/useSwal' export function useContextMenu() { const canvas = useRecoilValue(canvasState) @@ -56,6 +57,7 @@ export function useContextMenu() { const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) const { addLine, removeLine } = useLine() const commonTextFont = useRecoilValue(fontSelector('commonText')) + const { swalFire } = useSwal() const currentMenuSetting = () => { switch (currentMenu) { @@ -145,6 +147,9 @@ export function useContextMenu() { shortcut: ['d', 'D'], name: `${getMessage('contextmenu.auxiliary.remove')}(D)`, fn: () => { + const roof = canvas.getObjects().filter((obj) => obj.id === currentObject.attributes.roofId)[0] + const innerLines = roof.innerLines?.filter((line) => currentObject.id !== line.id) + roof.innerLines = [...innerLines] canvas.remove(currentObject) canvas.discardActiveObject() }, @@ -176,21 +181,34 @@ export function useContextMenu() { endY = (currentObject.y1 + currentObject.y2) / 2 - dy } - addLine([startX, startY, endX, endY], { + const line = addLine([startX, startY, endX, endY], { stroke: 'red', strokeWidth: 1, selectable: true, name: 'auxiliaryLine', + attributes: { ...currentObject.attributes }, }) + canvas + .getObjects() + .filter((obj) => obj.id === currentObject.attributes.roofId)[0] + .innerLines.push(line) }, }, - { - id: 'auxiliaryCut', - name: getMessage('contextmenu.auxiliary.cut'), - }, { id: 'auxiliaryRemoveAll', name: getMessage('contextmenu.auxiliary.remove.all'), + fn: () => { + if (!currentObject) { + swalFire({ text: '지붕을 선택해주세요.' }) + return + } + const innerLines = canvas.getObjects().filter((obj) => obj.id === currentObject.attributes.roofId)[0].innerLines + innerLines.forEach((line) => { + canvas.remove(line) + }) + innerLines.length = 0 + canvas.renderAll() + }, }, ], ]) From 0aaa54de733b0622592f5f66294841da53af0aaf Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 25 Nov 2024 17:10:57 +0900 Subject: [PATCH 159/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 172 +++++++++++++++++++-------- src/util/common-utils.js | 7 ++ 2 files changed, 128 insertions(+), 51 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 4f578b5e..c165c55e 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -15,7 +15,7 @@ import { useCommonCode } from '@/hooks/common/useCommonCode' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' import { SessionContext } from '@/app/SessionProvider' import Select, { components } from 'react-select' -import { convertNumberToPriceDecimal } from '@/util/common-utils' +import { convertNumberToPriceDecimal, convertNumberToPriceDecimalToFixed } from '@/util/common-utils' import ProductFeaturesPop from './popup/ProductFeaturesPop' import { v4 as uuidv4 } from 'uuid' @@ -129,17 +129,21 @@ export default function Estimate({ params }) { }) }, [estimateContextState?.estimateOption]) + //API데이터로 견적일 셋팅 + let begin = 1 + useEffect(() => { + if (begin === 1) { + setStartDate(estimateContextState?.estimateDate) + begin++ + } + }, [estimateContextState?.estimateDate]) + //견적일 set useEffect(() => { let estimateDate = dayjs(startDate).format('YYYY-MM-DD') setEstimateContextState({ estimateDate: estimateDate }) }, [startDate]) - //API데이터로 견적일 셋팅 - useEffect(() => { - setStartDate(estimateContextState?.estimateDate) - }, [estimateContextState?.estimateDate]) - useEffect(() => { //선택된 견적특이사항 setEstimateContextState if (isNotEmptyArray(specialNoteList)) { @@ -296,9 +300,8 @@ export default function Estimate({ params }) { //기존itemList랑 프라이싱결과랑 비교해서 단가만 업뎃 서로 갯수가 안맞을 수 있음 없는 itemId면 unitPrice 0으로 //itemId로 비교해서 salePrice만 업데이트 if (data.result.code === 200) { - console.log('data::확인해서 넣기:::::::::', data.data.pkgUnitPrice) setEstimateContextState({ - pkgAsp: data.data.pkgUnitPrice, + pkgAsp: data?.data?.pkgUnitPrice, }) //주택PKG단가 체인지 이벤트 발생시키기 onChangePkgAsp(data.data.pkgUnitPrice) @@ -333,6 +336,24 @@ export default function Estimate({ params }) { }) } + const getAbledItems = (items) => { + return items.filter((items) => items.paDispOrder === null) + } + + const onChangeSelectAll = (e) => { + if (e.target.checked) { + const allCheckedSelection = new Set(getAbledItems(estimateContextState.itemList).map((item) => item.dispOrder)) + + setSelection(allCheckedSelection) + } else { + setSelection(new Set()) + } + } + + const isSelectedAll = () => { + return selection.size === getAbledItems(estimateContextState.itemList).length + } + //row 체크박스 컨트롤 const onChangeSelect = (dispOrder) => { const newSelection = new Set(selection) @@ -358,13 +379,12 @@ export default function Estimate({ params }) { let totVolKw = estimateContextState.totVolKw * 1000 let pkgTotPrice = pkgAsp.replaceAll(',', '') * totVolKw - setEstimateContextState({ pkgAsp: pkgAsp, pkgTotPrice: pkgTotPrice.toFixed(3), }) //아이템들 중 조건에 맞는애들 뽑아서 상단 공급가액 부가세 총액 수정 - // setItemChangeYn(true) + setItemChangeYn(true) } } @@ -392,7 +412,6 @@ export default function Estimate({ params }) { return item } }) - setEstimateContextState({ itemList: updateList, }) @@ -429,7 +448,7 @@ export default function Estimate({ params }) { setItemChangeYn(true) } - // 아이템 자동완성 검색시 아이템 변경 + // 아이템 자동완성 검색시 아이템 추가/변경시 const onChangeDisplayItem = (itemId, dispOrder, index) => { const param = { itemId: itemId, @@ -438,7 +457,7 @@ export default function Estimate({ params }) { let updateList = [] let updates = {} get({ url: apiUrl }).then((res) => { - // console.log('아이템상세정보:::::::', res) + console.log('아이템디테일::::::::', res) updates.objectNo = objectNo updates.planNo = planNo updates.itemId = res.itemId @@ -460,6 +479,12 @@ export default function Estimate({ params }) { updates.delFlg = '0' // 삭제플래그 0 updates.saleTotPrice = (res.salePrice * estimateContextState.itemList[index].amount).toString() + if (estimateContextState.estimateType === 'YJSS') { + if (res.pkgMaterialFlg === '0') { + updates.showSalePrice = '0' + updates.showSaleTotPrice = '0' + } + } //104671 let bomList = res.itemBomList @@ -467,7 +492,8 @@ export default function Estimate({ params }) { if (item.dispOrder === dispOrder) { return { ...item, ...updates } } else if (item.paDispOrder === dispOrder) { - return { ...item, delFlg: '1' } + return { ...item, delFlg: '0' } + // return { ...item, delFlg: '1' } } else { return item } @@ -476,7 +502,14 @@ export default function Estimate({ params }) { if (bomList) { bomList.map((bomItem, index) => { let newItemDispOrder = Math.max(...estimateContextState.itemList.map((item) => item.dispOrder)) - bomItem.dispOrder = index + 1 + newItemDispOrder + if (newItemDispOrder == dispOrder) { + bomItem.dispOrder = (index + 1 + newItemDispOrder).toString() + bomItem.paDispOrder = dispOrder + } else { + bomItem.dispOrder = (index + 1 + Number(dispOrder)).toString() + bomItem.paDispOrder = dispOrder + } + bomItem.delFlg = '0' bomItem.objectNo = objectNo bomItem.planNo = planNo @@ -539,20 +572,26 @@ export default function Estimate({ params }) { useEffect(() => { if (itemChangeYn) { - console.log(' 토탈만들어주기::::::::::', estimateContextState.itemList) - let totAmount = 0 let totVolKw = 0 let supplyPrice = 0 let vatPrice = 0 let totPrice = 0 - let addPkgPrice = 0 + let addSupplyPrice = 0 if (estimateContextState.estimateType === 'YJOD') { - estimateContextState.itemList.map((item) => { - if (item.delFlg === '0') { - const amount = Number(item.amount.replace(/[^0-9]/g, '').replaceAll(',', '')) + console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) - const price = Number(item.saleTotPrice.replaceAll(',', '')) + estimateContextState.itemList.sort((a, b) => { + return a.dispOrder - b.dispOrder + }) + + estimateContextState.itemList.map((item) => { + delete item.showSalePrice + delete item.showSaleTotPrice + if (item.delFlg === '0') { + const amount = Number(item?.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) + + const price = Number(item?.saleTotPrice?.replaceAll(',', '')) if (item.moduleFlg === '1') { //용량(Kw)은 모듈플래그 1만 합산 @@ -567,7 +606,6 @@ export default function Estimate({ params }) { vatPrice = supplyPrice * 0.1 totPrice = supplyPrice + vatPrice - setEstimateContextState({ totAmount: totAmount, totVolKw: totVolKw.toFixed(3), @@ -577,11 +615,15 @@ export default function Estimate({ params }) { }) } else { //YJSS + console.log('YJSS 토탈만들어주기::::::::::', estimateContextState.itemList) + estimateContextState.itemList.sort((a, b) => { + return a.dispOrder - b.dispOrder + }) estimateContextState.itemList.map((item) => { if (item.delFlg === '0') { - const amount = Number(item.amount.replace(/[^0-9]/g, '').replaceAll(',', '')) - const price = Number(item.saleTotPrice.replaceAll(',', '')) - const salePrice = Number(item.salePrice.replaceAll(',', '')) + const amount = Number(item.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) + const price = Number(item.saleTotPrice?.replaceAll(',', '')) + const salePrice = Number(item.salePrice?.replaceAll(',', '')) if (item.moduleFlg === '1') { //용량(Kw)은 모듈플래그 1만 합산 @@ -590,19 +632,27 @@ export default function Estimate({ params }) { } if (item.pkgMaterialFlg === '1') { const pkgPrice = amount * salePrice - //YJSS는 PKG제외상품들만 모아서 수량 * 단가를 공급가액에 추가로 더해줌 - addPkgPrice += pkgPrice + //YJSS는 PKG제외상품들만(1) 모아서 수량 * 단가를 공급가액(supplyPrice)에 추가로 더해줌 + addSupplyPrice += pkgPrice + supplyPrice += price } // const price totAmount += amount - supplyPrice += price + + if (!item.paDispOrder) { + //paDispOrder + if (item.pkgMaterialFlg === '0') { + item.showSalePrice = '0' + item.showSaleTotPrice = '0' + } + } } }) + supplyPrice += addSupplyPrice vatPrice = supplyPrice * 0.1 totPrice = supplyPrice + vatPrice - setEstimateContextState({ totAmount: totAmount, totVolKw: totVolKw.toFixed(3), @@ -845,6 +895,23 @@ export default function Estimate({ params }) { setEstimateContextState({ fileFlg: e.target.checked ? '1' : '0', }) + if (e.target.checked) { + if (specialNoteList.length > 0) { + specialNoteList.map((item) => { + if (item.code === 'ATTR019') { + item.check = true + } + }) + } + } else { + if (specialNoteList.length > 0) { + specialNoteList.map((item) => { + if (item.code === 'ATTR019') { + item.check = false + } + }) + } + } }} />
    @@ -1036,9 +1102,9 @@ export default function Estimate({ params }) {
    {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgWeight')} - {convertNumberToPriceDecimal(estimateContextState?.totVolKw)} + {convertNumberToPriceDecimalToFixed(estimateContextState?.totVolKw, 2)} {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgPrice')} - {convertNumberToPriceDecimal(estimateContextState?.pkgTotPrice)} + {convertNumberToPriceDecimalToFixed(estimateContextState?.pkgTotPrice, 2)} @@ -1096,13 +1162,11 @@ export default function Estimate({ params }) {
    - {/*
    */}
    - {convertNumberToPriceDecimalToFixed(item?.saleTotPrice?.replaceAll(',', ''), 2)} + {convertNumberToPriceDecimal(item?.saleTotPrice?.replaceAll(',', ''))} {/* {item?.showSaleTotPrice === '0' ? ( ) : ( diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index c5b8537c..0bf4bad7 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -80,7 +80,7 @@ export const useEstimateController = (planNo) => { itemId: '', //제품번호 itemNo: '', itemName: '', //형명 - amount: '0', //수량 + amount: '', //수량 unitPrice: '0', unit: '', //단위 salePrice: '', //단가 @@ -88,6 +88,7 @@ export const useEstimateController = (planNo) => { itemChangeFlg: '1', //추가시 체인지플래그 1로 partAdd: '1', //NEW 체인지 플래그 delFlg: '0', //삭제 플래그 0 삭제하면 1 + // addFlg: '1', //제품추가해서 추가된건지 구분값 }, ], }) From e6b8c1a5eded9d09b41afa249a98459b1a091b13 Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 26 Nov 2024 15:37:12 +0900 Subject: [PATCH 169/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 8 +------- src/hooks/floorPlan/estimate/useEstimateController.js | 3 +-- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 94ad68ae..709c3448 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -477,8 +477,6 @@ export default function Estimate({ params }) { } }) - console.log('updateList::', updateList) - // return setEstimateContextState({ itemList: updateList, }) @@ -625,8 +623,6 @@ export default function Estimate({ params }) { } }) - console.log('updateList::', updateList) - let delCnt = 0 updateList.map((item) => { if (item.delFlg === '1') { @@ -655,11 +651,10 @@ export default function Estimate({ params }) { let totPrice = 0 let addSupplyPrice = 0 if (estimateContextState.estimateType === 'YJOD') { - console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) - estimateContextState.itemList.sort((a, b) => { return a.dispOrder - b.dispOrder }) + console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) estimateContextState.itemList.map((item) => { //delete item.showSalePrice @@ -703,7 +698,6 @@ export default function Estimate({ params }) { estimateContextState.itemList.map((item) => { if (item.delFlg === '0') { let amount = Number(item.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) - console.log('amount::', amount) let salePrice = Number(item.salePrice?.replaceAll(',', '')) let saleTotPrice = Number(item.saleTotPrice?.replaceAll(',', '')) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 0bf4bad7..04dcd477 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -88,7 +88,6 @@ export const useEstimateController = (planNo) => { itemChangeFlg: '1', //추가시 체인지플래그 1로 partAdd: '1', //NEW 체인지 플래그 delFlg: '0', //삭제 플래그 0 삭제하면 1 - // addFlg: '1', //제품추가해서 추가된건지 구분값 }, ], }) @@ -174,7 +173,7 @@ export const useEstimateController = (planNo) => { //첨부파일저장끝 //제품라인 추가했는데 아이템 안고르고 저장하면itemId=''은 날리고 나머지 저장하기 - estimateData.itemList = estimateData.itemList.filter((item) => item.itemId !== '') + estimateData.itemList = estimateData.itemList.filter((item) => item.itemId !== '' && item.delFlg === '0') let delCnt = 0 estimateData.itemList.map((item) => { From db70b0aba326aa831aea1bfe3131effbafd2434a Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Tue, 26 Nov 2024 15:47:02 +0900 Subject: [PATCH 170/200] =?UTF-8?q?fix:=20useEvent=20context=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useContext로 전역으로 옮김 --- src/app/floor-plan/EventProvider.js | 34 +++++++++++++++++++ src/app/floor-plan/layout.js | 13 ++++--- .../common/context-menu/QContextMenu.jsx | 6 ++-- src/components/floor-plan/CanvasFrame.jsx | 7 ++-- src/components/floor-plan/CanvasMenu.jsx | 4 ++- .../floor-plan/modal/basic/BasicSetting.jsx | 6 ++-- .../lineProperty/LinePropertySetting.jsx | 6 ++-- .../floor-plan/modal/object/SizeSetting.jsx | 12 ++++--- .../modal/wallLineOffset/type/Offset.jsx | 6 ++-- .../modal/wallLineOffset/type/WallLine.jsx | 6 ++-- src/hooks/common/useCommonUtils.js | 10 +++--- src/hooks/module/useModuleBasicSetting.js | 7 ++-- src/hooks/object/useObjectBatch.js | 6 ++-- src/hooks/roofcover/useAuxiliaryDrawing.js | 6 ++-- src/hooks/roofcover/useEavesGableEdit.js | 6 ++-- src/hooks/roofcover/useMovementSetting.js | 6 ++-- src/hooks/roofcover/useOuterLineWall.js | 11 +++++- .../roofcover/useRoofShapePassivitySetting.js | 6 ++-- .../roofcover/useWallLineOffsetSetting.js | 6 ++-- src/hooks/surface/usePlacementShapeDrawing.js | 7 ++-- src/hooks/surface/useSurfaceShapeBatch.js | 5 ++- src/hooks/useEvent.js | 2 +- 22 files changed, 131 insertions(+), 47 deletions(-) create mode 100644 src/app/floor-plan/EventProvider.js diff --git a/src/app/floor-plan/EventProvider.js b/src/app/floor-plan/EventProvider.js new file mode 100644 index 00000000..991b19bb --- /dev/null +++ b/src/app/floor-plan/EventProvider.js @@ -0,0 +1,34 @@ +import { useEvent } from '@/hooks/useEvent' +import { createContext, useState } from 'react' + +export const EventContext = createContext({}) + +const EventProvider = ({ children }) => { + const { + addDocumentEventListener, + addCanvasMouseEventListener, + addTargetMouseEventListener, + removeAllMouseEventListeners, + removeAllDocumentEventListeners, + removeDocumentEvent, + removeMouseEvent, + removeMouseLine, + initEvent, + } = useEvent() + + const [value, setValue] = useState({ + addDocumentEventListener, + addCanvasMouseEventListener, + addTargetMouseEventListener, + removeAllMouseEventListeners, + removeAllDocumentEventListeners, + removeDocumentEvent, + removeMouseEvent, + removeMouseLine, + initEvent, + }) + + return {children} +} + +export default EventProvider diff --git a/src/app/floor-plan/layout.js b/src/app/floor-plan/layout.js index 2a6fb8fd..532a83d6 100644 --- a/src/app/floor-plan/layout.js +++ b/src/app/floor-plan/layout.js @@ -3,17 +3,20 @@ import FloorPlanProvider from './FloorPlanProvider' import FloorPlan from '@/components/floor-plan/FloorPlan' import CanvasLayout from '@/components/floor-plan/CanvasLayout' +import EventProvider from './EventProvider' export default function FloorPlanLayout({ children }) { console.log('🚀 ~ FloorPlanLayout ~ FloorPlanLayout:') return ( <> - - - {children} - - + + + + {children} + + + ) } diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index f6665930..e7070aec 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -1,11 +1,12 @@ 'use client' -import { useEffect } from 'react' +import { useContext, useEffect } from 'react' import '@/styles/contents.scss' import { useRecoilState, useRecoilValue } from 'recoil' import { contextMenuListState, contextMenuState } from '@/store/contextMenu' import { useTempGrid } from '@/hooks/useTempGrid' import { useContextMenu } from '@/hooks/useContextMenu' import { useEvent } from '@/hooks/useEvent' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function QContextMenu(props) { const { contextRef, canvasProps } = props @@ -14,7 +15,8 @@ export default function QContextMenu(props) { const activeObject = canvasProps?.getActiveObject() //액티브된 객체를 가져옴 const { tempGridMode, setTempGridMode } = useTempGrid() const { handleKeyup } = useContextMenu() - const { addDocumentEventListener, removeDocumentEvent } = useEvent() + // const { addDocumentEventListener, removeDocumentEvent } = useEvent() + const { addDocumentEventListener, removeDocumentEvent } = useContext(EventContext) let contextType = '' diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index 9fcd5cfd..d43afc59 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -1,6 +1,6 @@ 'use client' -import { useEffect, useRef } from 'react' +import { useContext, useEffect, useRef } from 'react' import { useRecoilValue } from 'recoil' @@ -15,6 +15,7 @@ import { MENU } from '@/common/common' import PanelBatchStatistics from '@/components/floor-plan/modal/panelBatch/PanelBatchStatistics' import { totalDisplaySelector } from '@/store/settingAtom' import ImgLoad from '@/components/floor-plan/modal/ImgLoad' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function CanvasFrame() { const canvasRef = useRef(null) @@ -24,7 +25,9 @@ export default function CanvasFrame() { const { contextMenu, handleClick } = useContextMenu() const { selectedPlan, modifiedPlanFlag, checkCanvasObjectEvent, resetModifiedPlans, currentCanvasPlan } = usePlan() const totalDisplay = useRecoilValue(totalDisplaySelector) // 집계표 표시 여부 - useEvent() + // useEvent() + // const { initEvent } = useContext(EventContext) + // initEvent() const loadCanvas = () => { if (canvas) { diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index f6f2f481..65849256 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -41,6 +41,7 @@ import EstimateCopyPop from '../estimate/popup/EstimateCopyPop' import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' import { pwrGnrSimTypeState } from '@/store/simulatorAtom' import { useAxios } from '@/hooks/useAxios' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props @@ -70,7 +71,8 @@ export default function CanvasMenu(props) { const { getMessage } = useMessage() const { currentCanvasPlan, saveCanvas } = usePlan() const { swalFire } = useSwal() - const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() + // const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() + const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext) const commonUtils = useRecoilValue(commonUtilsState) const { commonFunctions } = useCommonUtils() const SelectOption = [{ name: '瓦53A' }, { name: '瓦53A' }] diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 6d9f2a42..68bb0a49 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -1,6 +1,6 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import Module from '@/components/floor-plan/modal/basic/step/Module' import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchModule' import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement' @@ -11,6 +11,7 @@ import { usePopup } from '@/hooks/usePopup' import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' import { useEvent } from '@/hooks/useEvent' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() @@ -18,7 +19,8 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const [tabNum, setTabNum] = useState(1) const canvasSetting = useRecoilValue(canvasSettingState) const orientationRef = useRef(null) - const { initEvent } = useEvent() + // const { initEvent } = useEvent() + const { initEvent } = useContext(EventContext) const { makeModuleInstArea, manualModuleSetup, autoModuleSetup } = useModuleBasicSetting() const handleBtnNextStep = () => { if (tabNum === 1) { diff --git a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx index ed84751c..789d048c 100644 --- a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx +++ b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx @@ -3,10 +3,11 @@ import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' import { useMessage } from '@/hooks/useMessage' import { usePopup } from '@/hooks/usePopup' -import { useState, useEffect } from 'react' +import { useState, useEffect, useContext } from 'react' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' import { useEvent } from '@/hooks/useEvent' import { LINE_TYPE } from '@/common/common' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function LinePropertySetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -14,7 +15,8 @@ export default function LinePropertySetting(props) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, changeSurfaceLinePropertyReset } = useSurfaceShapeBatch() - const { initEvent } = useEvent() + // const { initEvent } = useEvent() + const { initEvent } = useContext(EventContext) const properties = [ { name: getMessage('eaves.line'), value: LINE_TYPE.WALLLINE.EAVES }, diff --git a/src/components/floor-plan/modal/object/SizeSetting.jsx b/src/components/floor-plan/modal/object/SizeSetting.jsx index cadfd461..bddc9f07 100644 --- a/src/components/floor-plan/modal/object/SizeSetting.jsx +++ b/src/components/floor-plan/modal/object/SizeSetting.jsx @@ -5,11 +5,12 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' import { usePopup } from '@/hooks/usePopup' import { contextPopupPositionState } from '@/store/popupAtom' -import { useRef, useState, useEffect } from 'react' +import { useRef, useState, useEffect, useContext } from 'react' import { useObjectBatch } from '@/hooks/object/useObjectBatch' import { useEvent } from '@/hooks/useEvent' import { BATCH_TYPE, POLYGON_TYPE } from '@/common/common' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function SizeSetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -22,11 +23,12 @@ export default function SizeSetting(props) { const widthRef = useRef(null) const heightRef = useRef(null) - const { initEvent } = useEvent() + // const { initEvent } = useEvent() + // const { initEvent } = useContext(EventContext) - useEffect(() => { - initEvent() - }, []) + // useEffect(() => { + // initEvent() + // }, []) const handleReSizeObject = () => { const width = widthRef.current.value diff --git a/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx b/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx index 11fcd84f..d3afd459 100644 --- a/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx +++ b/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx @@ -1,10 +1,12 @@ import { useMessage } from '@/hooks/useMessage' -import { useEffect, useState } from 'react' +import { useContext, useEffect, useState } from 'react' import { useEvent } from '@/hooks/useEvent' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function Offset({ length1Ref, arrow1Ref, currentWallLineRef }) { const { getMessage } = useMessage() - const { addDocumentEventListener, initEvent } = useEvent() + // const { addDocumentEventListener, initEvent } = useEvent() + const { addDocumentEventListener, initEvent } = useContext(EventContext) useEffect(() => { addDocumentEventListener('keydown', document, keyDown) diff --git a/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx b/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx index 15ccefa3..c736d397 100644 --- a/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx +++ b/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx @@ -1,10 +1,12 @@ import { useMessage } from '@/hooks/useMessage' -import { forwardRef, useEffect, useImperativeHandle, useState } from 'react' +import { forwardRef, useContext, useEffect, useImperativeHandle, useState } from 'react' import { useEvent } from '@/hooks/useEvent' +import { EventContext } from '@/app/floor-plan/EventProvider' export default forwardRef(function WallLine({ length1Ref, length2Ref, arrow1Ref, arrow2Ref, radioTypeRef, currentWallLineRef }, ref) { const { getMessage } = useMessage() - const { addDocumentEventListener, initEvent } = useEvent() + // const { addDocumentEventListener, initEvent } = useEvent() + const { addDocumentEventListener, initEvent } = useContext(EventContext) const [type, setType] = useState(1) const [arrow1, setArrow1] = useState('up') const [arrow2, setArrow2] = useState('up') diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 594797bb..5c8fcfee 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -1,4 +1,4 @@ -import { useEffect } from 'react' +import { useContext, useEffect } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { wordDisplaySelector } from '@/store/settingAtom' import { useEvent } from '@/hooks/useEvent' @@ -9,11 +9,13 @@ import { canvasState } from '@/store/canvasAtom' import { v4 as uuidv4 } from 'uuid' import { usePopup } from '@/hooks/usePopup' import Distance from '@/components/floor-plan/modal/distance/Distance' +import { EventContext } from '@/app/floor-plan/EventProvider' export function useCommonUtils() { const canvas = useRecoilValue(canvasState) const wordDisplay = useRecoilValue(wordDisplaySelector) - const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useContext(EventContext) const dimensionSettings = useRecoilValue(dimensionLineSettingsState) const dimensionLineTextFont = useRecoilValue(fontSelector('dimensionLineText')) const commonTextFont = useRecoilValue(fontSelector('commonText')) @@ -21,7 +23,7 @@ export function useCommonUtils() { const { addPopup } = usePopup() useEffect(() => { - initEvent() + // initEvent() if (commonUtils.text) { commonTextMode() } else if (commonUtils.dimension) { @@ -37,7 +39,7 @@ export function useCommonUtils() { commonTextKeyEvent() addCanvasMouseEventListener('mouse:down', (event) => { const pointer = canvas?.getPointer(event.e) - + textbox = new fabric.Textbox('', { left: pointer.x, top: pointer.y, diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index 500568ac..eb6ac973 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import { useContext, useEffect, useState } from 'react' import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' import { canvasState } from '@/store/canvasAtom' import { rectToPolygon, setSurfaceShapePattern } from '@/util/canvas-util' @@ -11,14 +11,15 @@ import { useEvent } from '@/hooks/useEvent' import { POLYGON_TYPE, BATCH_TYPE } from '@/common/common' import * as turf from '@turf/turf' -import next from 'next' +import { EventContext } from '@/app/floor-plan/EventProvider' export function useModuleBasicSetting() { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) const [moduleSetupSurface, setModuleSetupSurface] = useRecoilState(moduleSetupSurfaceState) const [moduleIsSetup, setModuleIsSetup] = useRecoilState(moduleIsSetupState) - const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() + // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() + const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) let selectedModuleInstSurfaceArray = [] const makeModuleInstArea = () => { diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index 1820599b..2227e5db 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -1,5 +1,5 @@ 'use client' -import { useEffect } from 'react' +import { useContext, useEffect } from 'react' import { useMessage } from '@/hooks/useMessage' import { useRecoilValue } from 'recoil' import { canvasState } from '@/store/canvasAtom' @@ -12,11 +12,13 @@ import { usePolygon } from '@/hooks/usePolygon' import { QPolygon } from '@/components/fabric/QPolygon' import { v4 as uuidv4 } from 'uuid' import { fontSelector } from '@/store/fontAtom' +import { EventContext } from '@/app/floor-plan/EventProvider' export function useObjectBatch({ isHidden, setIsHidden }) { const { getMessage } = useMessage() const canvas = useRecoilValue(canvasState) - const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() + // const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() + const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useContext(EventContext) const { swalFire } = useSwal() const { drawDirectionArrow } = usePolygon() const lengthTextFont = useRecoilValue(fontSelector('lengthText')) diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 0d23fd44..6d5d384f 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { adsorptionRangeState, canvasState, verticalHorizontalModeState } from '@/store/canvasAtom' import { useEvent } from '@/hooks/useEvent' @@ -22,11 +22,13 @@ import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { calculateAngle, isSamePoint } from '@/util/qpolygon-utils' import { POLYGON_TYPE } from '@/common/common' +import { EventContext } from '@/app/floor-plan/EventProvider' // 보조선 작성 export function useAuxiliaryDrawing(id) { const canvas = useRecoilValue(canvasState) - const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useEvent() + // const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useEvent() + const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { tempGridMode } = useTempGrid() diff --git a/src/hooks/roofcover/useEavesGableEdit.js b/src/hooks/roofcover/useEavesGableEdit.js index 5619abfb..2c2a9b27 100644 --- a/src/hooks/roofcover/useEavesGableEdit.js +++ b/src/hooks/roofcover/useEavesGableEdit.js @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useRecoilValue } from 'recoil' import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, pitchTextSelector } from '@/store/canvasAtom' import { useMessage } from '@/hooks/useMessage' @@ -10,12 +10,14 @@ import { outerLineFixState } from '@/store/outerLineAtom' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree } from '@/util/canvas-util' +import { EventContext } from '@/app/floor-plan/EventProvider' // 처마.케라바 변경 export function useEavesGableEdit(id) { const canvas = useRecoilValue(canvasState) const { getMessage } = useMessage() - const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { closePopup } = usePopup() const TYPES = { EAVES: 'eaves', diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js index 34961ea0..7051fe49 100644 --- a/src/hooks/roofcover/useMovementSetting.js +++ b/src/hooks/roofcover/useMovementSetting.js @@ -2,11 +2,12 @@ import { useRecoilValue } from 'recoil' import { canvasState, currentObjectState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' import { useMessage } from '@/hooks/useMessage' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useEvent } from '@/hooks/useEvent' import { POLYGON_TYPE } from '@/common/common' import { OUTER_LINE_TYPE } from '@/store/outerLineAtom' import { QLine } from '@/components/fabric/QLine' +import { EventContext } from '@/app/floor-plan/EventProvider' //동선이동 형 올림 내림 export function useMovementSetting(id) { @@ -15,7 +16,8 @@ export function useMovementSetting(id) { UP_DOWN: 'updown', //형 올림내림 } const canvas = useRecoilValue(canvasState) - const { initEvent, addCanvasMouseEventListener } = useEvent() + // const { initEvent, addCanvasMouseEventListener } = useEvent() + const { initEvent, addCanvasMouseEventListener } = useContext(EventContext) const { closePopup } = usePopup() const { getMessage } = useMessage() const currentObject = useRecoilValue(currentObjectState) diff --git a/src/hooks/roofcover/useOuterLineWall.js b/src/hooks/roofcover/useOuterLineWall.js index 7c4d5091..c668dd60 100644 --- a/src/hooks/roofcover/useOuterLineWall.js +++ b/src/hooks/roofcover/useOuterLineWall.js @@ -1,4 +1,4 @@ -import { useEffect, useRef } from 'react' +import { useContext, useEffect, useRef } from 'react' import { distanceBetweenPoints } from '@/util/canvas-util' import { useRecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil' import { @@ -31,6 +31,7 @@ import { fabric } from 'fabric' import { outlineDisplaySelector } from '@/store/settingAtom' import { usePopup } from '@/hooks/usePopup' import PropertiesSetting from '@/components/floor-plan/modal/outerlinesetting/PropertiesSetting' +import { EventContext } from '@/app/floor-plan/EventProvider' //외벽선 그리기 export function useOuterLineWall(id, propertiesId) { @@ -43,6 +44,14 @@ export function useOuterLineWall(id, propertiesId) { removeAllDocumentEventListeners, removeMouseEvent, } = useEvent() + // const { + // initEvent, + // // addCanvasMouseEventListener, + // // addDocumentEventListener, + // removeAllMouseEventListeners, + // removeAllDocumentEventListeners, + // removeMouseEvent, + // } = useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { tempGridMode } = useTempGrid() diff --git a/src/hooks/roofcover/useRoofShapePassivitySetting.js b/src/hooks/roofcover/useRoofShapePassivitySetting.js index e0af3205..656094f2 100644 --- a/src/hooks/roofcover/useRoofShapePassivitySetting.js +++ b/src/hooks/roofcover/useRoofShapePassivitySetting.js @@ -1,6 +1,6 @@ import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, currentObjectState, pitchTextSelector } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useLine } from '@/hooks/useLine' import { useMessage } from '@/hooks/useMessage' import { useEvent } from '@/hooks/useEvent' @@ -11,6 +11,7 @@ import { outerLineFixState } from '@/store/outerLineAtom' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree } from '@/util/canvas-util' +import { EventContext } from '@/app/floor-plan/EventProvider' //지붕형상 수동 설정 export function useRoofShapePassivitySetting(id) { @@ -25,7 +26,8 @@ export function useRoofShapePassivitySetting(id) { const { getMessage } = useMessage() const { showLine, hideLine, addPitchTextsByOuterLines } = useLine() const { swalFire } = useSwal() - const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { drawRoofPolygon } = useMode() const { addPolygonByLines } = usePolygon() const currentObject = useRecoilValue(currentObjectState) diff --git a/src/hooks/roofcover/useWallLineOffsetSetting.js b/src/hooks/roofcover/useWallLineOffsetSetting.js index ba6453ef..b673bcc2 100644 --- a/src/hooks/roofcover/useWallLineOffsetSetting.js +++ b/src/hooks/roofcover/useWallLineOffsetSetting.js @@ -1,11 +1,12 @@ import { canvasState, currentObjectState } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useMessage } from '@/hooks/useMessage' import { useEvent } from '@/hooks/useEvent' import { useLine } from '@/hooks/useLine' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' +import { EventContext } from '@/app/floor-plan/EventProvider' // 외벽선 편집 및 오프셋 export function useWallLineOffsetSetting(id) { @@ -14,7 +15,8 @@ export function useWallLineOffsetSetting(id) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { swalFire } = useSwal() - const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const wallLineEditRef = useRef(null) const length1Ref = useRef(null) const length2Ref = useRef(null) diff --git a/src/hooks/surface/usePlacementShapeDrawing.js b/src/hooks/surface/usePlacementShapeDrawing.js index 24f641fe..822ea5c9 100644 --- a/src/hooks/surface/usePlacementShapeDrawing.js +++ b/src/hooks/surface/usePlacementShapeDrawing.js @@ -12,7 +12,7 @@ import { useEvent } from '@/hooks/useEvent' import { useMouse } from '@/hooks/useMouse' import { useLine } from '@/hooks/useLine' import { useTempGrid } from '@/hooks/useTempGrid' -import { useEffect, useRef } from 'react' +import { useContext, useEffect, useRef } from 'react' import { distanceBetweenPoints, setSurfaceShapePattern } from '@/util/canvas-util' import { fabric } from 'fabric' import { calculateAngle } from '@/util/qpolygon-utils' @@ -33,12 +33,15 @@ import { POLYGON_TYPE } from '@/common/common' import { usePopup } from '@/hooks/usePopup' import { roofDisplaySelector } from '@/store/settingAtom' +import { EventContext } from '@/app/floor-plan/EventProvider' // 면형상 배치 export function usePlacementShapeDrawing(id) { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) + // const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = + // useEvent() const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = - useEvent() + useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { addPolygonByLines, drawDirectionArrow } = usePolygon() diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index 3731443d..b0728ac8 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -15,6 +15,8 @@ import { usePolygon } from '@/hooks/usePolygon' import { fontSelector } from '@/store/fontAtom' import { slopeSelector } from '@/store/commonAtom' import { QLine } from '@/components/fabric/QLine' +import { EventContext } from '@/app/floor-plan/EventProvider' +import { useContext } from 'react' export function useSurfaceShapeBatch() { const { getMessage } = useMessage() @@ -26,7 +28,8 @@ export function useSurfaceShapeBatch() { const roofDisplay = useRecoilValue(roofDisplaySelector) const slope = useRecoilValue(slopeSelector(globalPitch)) const { swalFire } = useSwal() - const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { closePopup } = usePopup() const applySurfaceShape = (surfaceRefs, selectedType, id) => { diff --git a/src/hooks/useEvent.js b/src/hooks/useEvent.js index ba441b75..16d0896d 100644 --- a/src/hooks/useEvent.js +++ b/src/hooks/useEvent.js @@ -1,4 +1,4 @@ -import { useEffect, useRef } from 'react' +import { useCallback, useEffect, useRef } from 'react' import { useRecoilValue, useSetRecoilState } from 'recoil' import { canvasState, canvasZoomState, currentMenuState, textModeState } from '@/store/canvasAtom' import { fabric } from 'fabric' From 6c75a2feb03643d2cdc27dabbba21b822fdc26ed Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Tue, 26 Nov 2024 16:30:49 +0900 Subject: [PATCH 171/200] =?UTF-8?q?refactor:=20plan=EC=9D=98=20=ED=91=9C?= =?UTF-8?q?=EC=B6=9C=20name=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasLayout.jsx | 12 ++++++---- src/hooks/usePlan.js | 27 ++++++++++++---------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/components/floor-plan/CanvasLayout.jsx b/src/components/floor-plan/CanvasLayout.jsx index 1e69ec40..fcaabb6f 100644 --- a/src/components/floor-plan/CanvasLayout.jsx +++ b/src/components/floor-plan/CanvasLayout.jsx @@ -1,6 +1,6 @@ 'use client' -import { useContext, useEffect, useState } from 'react' +import { useContext, useEffect } from 'react' import { useRecoilValue } from 'recoil' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import { useMessage } from '@/hooks/useMessage' @@ -20,7 +20,7 @@ export default function CanvasLayout({ children }) { const { getMessage } = useMessage() const { swalFire } = useSwal() - const { plans, modifiedPlans, loadCanvasPlanData, handleCurrentPlan, handleAddPlan, handleDeletePlan } = usePlan() + const { plans, initCanvasPlans, modifiedPlans, loadCanvasPlanData, handleCurrentPlan, handleAddPlan, handleDeletePlan } = usePlan() useEffect(() => { loadCanvasPlanData(session.userId, objectNo, pid) @@ -37,14 +37,18 @@ export default function CanvasLayout({ children }) { onClick={() => handleCurrentPlan(session.userId, plan.id)} > - {plan.name} + {!initCanvasPlans.some((initCanvasPlans) => initCanvasPlans.id === plan.id) && 'New '} + {`Plan ${plan.ordering}`} {modifiedPlans.some((modifiedPlan) => modifiedPlan === plan.id) && ' [ M ]'} swalFire({ - text: `${plan.name} ` + getMessage('plan.message.confirm.delete'), + text: + (!initCanvasPlans.some((initCanvasPlans) => initCanvasPlans.id === plan.id) ? 'New ' : '') + + `Plan ${plan.ordering} ` + + getMessage('plan.message.confirm.delete'), type: 'confirm', confirmFn: () => { handleDeletePlan(e, plan.id) diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index 946cc628..3bf86021 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -23,9 +23,6 @@ export function usePlan() { const { getMessage } = useMessage() const { get, promisePost, promisePut, promiseDel } = useAxios() - const planLabel = 'Plan ' - const newPlanLabel = 'New Plan ' - /** * 마우스 포인터의 가이드라인을 제거합니다. */ @@ -145,7 +142,9 @@ export function usePlan() { */ const checkUnsavedCanvasPlan = async (userId) => { swalFire({ - text: `저장 안된 ${currentCanvasPlan.name} PLAN을 저장하시겠습니까? `, + text: + (!initCanvasPlans.some((initCanvasPlans) => initCanvasPlans.id === plan.id) ? 'New ' : '') + + `Plan ${plan.ordering}의 변경 사항을 저장하시겠습니까?`, type: 'confirm', confirmFn: async () => { initCanvasPlans.some((plan) => plan.id === currentCanvasPlan.id) @@ -185,20 +184,20 @@ export function usePlan() { */ const getCanvasByObjectNo = async (userId, objectNo) => { return get({ url: `/api/canvas-management/canvas-statuses/by-object/${objectNo}/${userId}` }).then((res) => - res.map((item) => ({ + res.map((item, index) => ({ id: item.id, - name: planLabel + item.id, userId: item.userId, canvasStatus: dbToCanvasFormat(item.canvasStatus), isCurrent: false, bgImageName: item.bgImageName, mapPositionAddress: item.mapPositionAddress, + ordering: index + 1, })), ) } /** - * canvas 데이터를 추가 + * 신규 canvas 데이터를 저장 */ const postCanvasStatus = async (userId, canvasStatus) => { const planData = { @@ -216,7 +215,6 @@ export function usePlan() { ? { ...plan, id: res.data, - name: planLabel + res.data, canvasStatus: canvasStatus, } : plan, @@ -306,7 +304,10 @@ export function usePlan() { const handleAddPlan = (userId, objectNo) => { JSON.parse(currentCanvasData()).objects.length > 0 ? swalFire({ - text: `${currentCanvasPlan.name} ` + getMessage('plan.message.confirm.copy'), + text: + (!initCanvasPlans.some((initCanvasPlans) => initCanvasPlans.id === plan.id) ? 'New ' : '') + + `Plan ${currentCanvasPlan.ordering} ` + + getMessage('plan.message.confirm.copy'), type: 'confirm', confirmFn: () => { addPlan(userId, objectNo, currentCanvasData()) @@ -321,10 +322,10 @@ export function usePlan() { const id = uuidv4() const newPlan = { id: id, - name: newPlanLabel + `${planNum + 1}`, objectNo: objectNo, userId: userId, canvasStatus: canvasStatus, + ordering: planNum + 1, } setPlans([...plans, newPlan]) handleCurrentPlan(userId, id) @@ -373,9 +374,10 @@ export function usePlan() { if (res.length > 0) { setInitCanvasPlans(res) setPlans(res) - updateCurrentPlan(Number(pid)) // last 데이터에 포커싱 + updateCurrentPlan(Number(pid)) + setPlanNum(res.length) } else { - addPlan(userId, objectNo) + addPlan(userId, objectNo, '') } }) } @@ -383,6 +385,7 @@ export function usePlan() { return { canvas, plans, + initCanvasPlans, selectedPlan, currentCanvasPlan, modifiedPlans, From 2f18a3d560b83db8b666473d2efbcfa7268f727f Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Tue, 26 Nov 2024 17:42:04 +0900 Subject: [PATCH 172/200] =?UTF-8?q?fix:=20plan=20=EC=B0=B8=EC=A1=B0=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EB=8C=80=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePlan.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index 3bf86021..7ed3fa6e 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -305,7 +305,7 @@ export function usePlan() { JSON.parse(currentCanvasData()).objects.length > 0 ? swalFire({ text: - (!initCanvasPlans.some((initCanvasPlans) => initCanvasPlans.id === plan.id) ? 'New ' : '') + + (!initCanvasPlans.some((initCanvasPlans) => initCanvasPlans.id === currentCanvasPlan.id) ? 'New ' : '') + `Plan ${currentCanvasPlan.ordering} ` + getMessage('plan.message.confirm.copy'), type: 'confirm', From cd1a32eaf9973538a83288d2cb383fbab648b18d Mon Sep 17 00:00:00 2001 From: changkyu choi Date: Tue, 26 Nov 2024 18:01:53 +0900 Subject: [PATCH 173/200] =?UTF-8?q?Canvas=20=EC=84=A4=EC=A0=95=20=EA=B8=80?= =?UTF-8?q?=EA=BC=B4=20null=20=EC=B2=98=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/font/FontSetting.jsx | 21 +- .../modal/setting01/SecondOption.jsx | 28 +- .../dimensionLine/DimensionLineSetting.jsx | 36 +-- .../setting01/planSize/PlanSizeSetting.jsx | 15 +- src/hooks/common/useFont.js | 8 +- src/hooks/option/useCanvasSetting.js | 239 +++++++++--------- 6 files changed, 142 insertions(+), 205 deletions(-) diff --git a/src/components/common/font/FontSetting.jsx b/src/components/common/font/FontSetting.jsx index 4ebdcfeb..15f1146a 100644 --- a/src/components/common/font/FontSetting.jsx +++ b/src/components/common/font/FontSetting.jsx @@ -54,23 +54,6 @@ export default function FontSetting(props) { { id: 'gold', name: getMessage('color.gold'), value: 'gold' }, { id: 'darkblue', name: getMessage('color.darkblue'), value: 'darkblue' }, ] - useEffect(() => { - if (font.fontFamily) { - setSelectedFont(fonts.filter((data) => data.value === font.fontFamily)[0]) - } - - if (font.fontWeight) { - setSelectedFontWeight(fontOptions.filter((data) => data.value === font.fontWeight)[0]) - } - - if (font.fontSize) { - setSelectedFontSize(fontSizes.filter((data) => data.value === font.fontSize)[0]) - } - - if (font.fontColor) { - setSelectedFontColor(fontColors.filter((data) => data.value === font.fontColor)[0]) - } - }, []) const handleSaveBtn = () => { onSave({ @@ -131,10 +114,10 @@ export default function FontSetting(props) {
    diff --git a/src/components/floor-plan/modal/setting01/SecondOption.jsx b/src/components/floor-plan/modal/setting01/SecondOption.jsx index 7dbb2673..b5e9d98d 100644 --- a/src/components/floor-plan/modal/setting01/SecondOption.jsx +++ b/src/components/floor-plan/modal/setting01/SecondOption.jsx @@ -25,11 +25,7 @@ export default function SecondOption() { const [planSizeId, setPlanSizeId] = useState(uuidv4()) const { - //horizon, setHorizon, vertical, setVertical, - // originHorizon, - // setOriginHorizon, - // originVertical, - // setOriginVertical, + fetchSettings, planSizeSettingMode, setPlanSizeSettingMode, settingModalSecondOptions, @@ -40,12 +36,9 @@ export default function SecondOption() { } = useCanvasSetting() const { option3, option4 } = settingModalSecondOptions - // const [horizon, setHorizon] = useState(originHorizon) - // const [vertical, setVertical] = useState(originVertical) - // 데이터를 최초 한 번만 조회 useEffect(() => { - console.log('SecondOption useEffect 실행', planSizeSettingMode) + console.log('SecondOption useEffect 실행') }, []) const handlePopup = (type) => { @@ -119,6 +112,7 @@ export default function SecondOption() { case 'planSize': { //도면크기 설정 if (!showPlanSizeSettingModal) { + fetchSettings() //화면 오픈 시 데이터 조회 setShowPlanSizeSettingModal(true) addPopup(planSizeId, 2, , true) } else { @@ -135,10 +129,14 @@ export default function SecondOption() { return { ...prev, [fontProps.type]: { - fontFamily: font.fontFamily.value, - fontWeight: font.fontWeight.value, - fontSize: font.fontSize.value, - fontColor: font.fontColor.value, + // fontFamily: font.fontFamily.value, + // fontWeight: font.fontWeight.value, + // fontSize: font.fontSize.value, + // fontColor: font.fontColor.value, + fontFamily: font.fontFamily, + fontWeight: font.fontWeight, + fontSize: font.fontSize, + fontColor: font.fontColor, }, fontFlag: true, } @@ -161,10 +159,6 @@ export default function SecondOption() { const planSizeProps = { id: planSizeId, - // horizon, - // setHorizon, - // vertical, - // setVertical, horizon: planSizeSettingMode.originHorizon, vertical: planSizeSettingMode.originVertical, isShow: showPlanSizeSettingModal, diff --git a/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx b/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx index f5753965..63581d5d 100644 --- a/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx +++ b/src/components/floor-plan/modal/setting01/dimensionLine/DimensionLineSetting.jsx @@ -77,28 +77,9 @@ export default function DimensionLineSetting(props) { { id: 'darkblue', name: getMessage('color.darkblue'), value: 'darkblue' }, ] - let originPixelView - useEffect(() => { if (originPixel) { setOriginPixel(pixels?.filter((data) => data.value === originPixel)[0]) - originPixelView = originPixel - } - - if (globalFont.dimensionLineText.fontFamily) { - setOriginFont(fonts.filter((data) => data.value === globalFont.dimensionLineText.fontFamily)[0]) - } - - if (globalFont.dimensionLineText.fontWeight) { - setOriginFontWeight(fontOptions.filter((data) => data.value === globalFont.dimensionLineText.fontWeight)[0]) - } - - if (globalFont.dimensionLineText.fontSize) { - setOriginFontSize(fontSizes.filter((data) => data.value === globalFont.dimensionLineText.fontSize)[0]) - } - - if (globalFont.dimensionLineText.fontColor) { - setOriginFontColor(fontColors.filter((data) => data.value === globalFont.dimensionLineText.fontColor)[0]) } setIsShow(true) @@ -106,7 +87,6 @@ export default function DimensionLineSetting(props) { useEffect(() => { if (originPixel.name) { - originPixelView = originPixel.name setOriginPixel(originPixel) } }, [originPixel]) @@ -142,10 +122,10 @@ export default function DimensionLineSetting(props) { isShow: showFontModal, setIsShow: setShowFontModal, font: { - fontFamily: originFont?.value, - fontWeight: originFontWeight?.value, - fontSize: originFontSize?.value, - fontColor: originFontColor?.value, + fontFamily: originFont, + fontWeight: originFontWeight, + fontSize: originFontSize, + fontColor: originFontColor, }, onSave: handleFontSave, isConfig: true, @@ -172,10 +152,10 @@ export default function DimensionLineSetting(props) { return { ...prev, dimensionLineText: { - fontFamily: originFont.value, - fontWeight: originFontWeight.value, - fontSize: originFontSize.value, - fontColor: originFontColor.value, + fontFamily: originFont, + fontWeight: originFontWeight, + fontSize: originFontSize, + fontColor: originFontColor, }, fontFlag: true, } diff --git a/src/components/floor-plan/modal/setting01/planSize/PlanSizeSetting.jsx b/src/components/floor-plan/modal/setting01/planSize/PlanSizeSetting.jsx index 5d4bde1c..a841efd5 100644 --- a/src/components/floor-plan/modal/setting01/planSize/PlanSizeSetting.jsx +++ b/src/components/floor-plan/modal/setting01/planSize/PlanSizeSetting.jsx @@ -13,28 +13,19 @@ export default function PlanSizeSetting(props) { const { getMessage } = useMessage() const canvas = useRecoilValue(canvasState) - - // const [originHorizon, setOriginHorizon] = useCanvasSetting(horizon) - // const [originVertical, setOriginVertical] = useCanvasSetting(vertical) - // const { originHorizon, setOriginHorizon, originVertical, setOriginVertical } = useCanvasSetting() const { planSizeSettingMode, setPlanSizeSettingMode } = useCanvasSetting() // 데이터를 최초 한 번만 조회 useEffect(() => { console.log('PlanSizeSetting useEffect 실행') - console.log('11111', planSizeSettingMode) - //setOriginHorizon({ originHorizon: horizon, flag: false }) - //setOriginVertical({ originVertical: vertical, flag: false }) }, []) const onSave = () => { - console.log('22222', planSizeSettingMode) setPlanSizeSettingMode((prev) => { - console.log('4', prev) return { ...prev, - originHorizon: planSizeSettingMode.originHorizon, - originVertical: planSizeSettingMode.originVertical, + originHorizon: Number(planSizeSettingMode.originHorizon), + originVertical: Number(planSizeSettingMode.originVertical), flag: true, } }) @@ -53,7 +44,7 @@ export default function PlanSizeSetting(props) { setPlanSizeSettingMode((prev) => { return { ...prev, - [name]: value, + [name]: Number(value), flag: false, } }) diff --git a/src/hooks/common/useFont.js b/src/hooks/common/useFont.js index bdcdaa4e..cb305565 100644 --- a/src/hooks/common/useFont.js +++ b/src/hooks/common/useFont.js @@ -12,7 +12,7 @@ export function useFont() { const circuitNumberText = useRecoilValue(fontSelector('circuitNumberText')) useEffect(() => { - if (canvas && commonText.fontWeight?.value) { + if (canvas && commonText.fontWeight.value) { const textObjs = canvas?.getObjects().filter((obj) => obj.name === 'commonText') textObjs.forEach((obj) => { obj.set({ @@ -28,7 +28,7 @@ export function useFont() { }, [commonText]) useEffect(() => { - if (canvas && dimensionLineText.fontWeight?.value) { + if (canvas && dimensionLineText.fontWeight.value) { const textObjs = canvas?.getObjects().filter((obj) => obj.name === 'dimensionLineText') textObjs.forEach((obj) => { obj.set({ @@ -44,7 +44,7 @@ export function useFont() { }, [dimensionLineText]) useEffect(() => { - if (canvas && flowText.fontWeight?.value) { + if (canvas && flowText.fontWeight.value) { const textObjs = canvas?.getObjects().filter((obj) => obj.name === 'flowText') textObjs.forEach((obj) => { obj.set({ @@ -60,7 +60,7 @@ export function useFont() { }, [flowText]) useEffect(() => { - if (canvas && lengthText.fontWeight?.value) { + if (canvas && lengthText.fontWeight.value) { const textObjs = canvas?.getObjects().filter((obj) => obj.name === 'lengthText') textObjs.forEach((obj) => { obj.set({ diff --git a/src/hooks/option/useCanvasSetting.js b/src/hooks/option/useCanvasSetting.js index ac03e054..fa3c42eb 100644 --- a/src/hooks/option/useCanvasSetting.js +++ b/src/hooks/option/useCanvasSetting.js @@ -32,7 +32,7 @@ export function useCanvasSetting() { const [adsorptionPointMode, setAdsorptionPointMode] = useRecoilState(adsorptionPointModeState) const [adsorptionRange, setAdsorptionRange] = useRecoilState(adsorptionRangeState) - const [planSizeSettingMode, setPlanSizeSettingMode] = useRecoilState(adsorptionRangeState) + const [planSizeSettingMode, setPlanSizeSettingMode] = useRecoilState(planSizeSettingState) //const setAdsorptionRange = useSetRecoilState(adsorptionRangeState) const [selectedFont, setSelectedFont] = useState() @@ -40,13 +40,8 @@ export function useCanvasSetting() { const [selectedFontSize, setSelectedFontSize] = useState() const [selectedFontColor, setSelectedFontColor] = useState() const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) - //const [objectNo, setObjectNo] = useState('test123240912001') // 이후 삭제 필요 - const [dimensionLineSettings, setDimensionLineSettings] = useRecoilState(dimensionLineSettingsState) - //const [originHorizon, setOriginHorizon] = useState({ originHorizon: 1600, flag: false }) - //const [originVertical, setOriginVertical] = useState({ originVertical: 1600, flag: false }) - useEffect(() => { if (!canvas) { return @@ -97,9 +92,9 @@ export function useCanvasSetting() { console.log('useCanvasSetting useEffect 실행3', settingModalFirstOptions.fontFlag, settingModalSecondOptions.fontFlag, correntObjectNo) if (settingModalFirstOptions.fontFlag || settingModalSecondOptions.fontFlag) { onClickOption2() + frontSettings() fetchSettings() } - frontSettings() }, [settingModalFirstOptions, settingModalSecondOptions]) // 글꼴 변경 시 @@ -114,20 +109,81 @@ export function useCanvasSetting() { // 도명크기 변경 시 useEffect(() => { - console.log( - 'useCanvasSetting useEffect 실행5', - correntObjectNo, - planSizeSettingMode.flag, - planSizeSettingMode.originHorizon, - planSizeSettingMode.originVertical, - ) + console.log('useCanvasSetting useEffect 실행5', planSizeSettingMode.flag, correntObjectNo) if (planSizeSettingMode.flag) { onClickOption2() frontSettings() fetchSettings() } - }, [planSizeSettingMode.flag]) + }, [planSizeSettingMode]) + + const getFonts = (itemValue) => { + const data = [ + { id: 1, name: 'MS PGothic', value: 'MS PGothic' }, + { id: 2, name: '@Yu Gothic', value: '@Yu Gothic' }, + { id: 3, name: 'Yu Gothic', value: 'Yu Gothic' }, + { id: 4, name: '@Yu Gothic UI', value: '@Yu Gothic UI' }, + { id: 5, name: 'Yu Gothic UI', value: 'Yu Gothic UI' }, + ].filter((font) => font.value === itemValue)[0] + if (data.length !== 0) { + return data + } else { + return { id: 1, name: 'MS PGothic', value: 'MS PGothic' } + } + } + + const getFontSizes = (itemValue) => { + const data = [ + ...Array.from({ length: 4 }).map((_, index) => { + return { id: index + 8, name: index + 8, value: index + 8 } + }), + ...Array.from({ length: 9 }).map((_, index) => { + return { id: (index + 6) * 2, name: (index + 6) * 2, value: (index + 6) * 2 } + }), + { id: 36, name: 36, value: 36 }, + { id: 48, name: 48, value: 48 }, + { id: 72, name: 72, value: 72 }, + ].filter((fontSize) => fontSize.value === itemValue)[0] + if (data.length !== 0) { + return data + } else { + return { id: 16, name: 16, value: 16 } + } + } + + const getFontStyles = (itemValue) => { + const data = [ + { id: 'normal', name: getMessage('font.style.normal'), value: 'normal' }, + { id: 'italic', name: getMessage('font.style.italic'), value: 'italic' }, + { id: 'bold', name: getMessage('font.style.bold'), value: 'bold' }, + { id: 'boldAndItalic', name: getMessage('font.style.bold.italic'), value: 'boldAndItalic' }, + ].filter((fontStyle) => fontStyle.value === itemValue)[0] + if (data.length !== 0) { + return data + } else { + return { id: 'normal', name: getMessage('font.style.normal'), value: 'normal' } + } + } + + const getFontColors = (itemValue) => { + const data = [ + { id: 'black', name: getMessage('color.black'), value: 'black' }, + { id: 'red', name: getMessage('color.red'), value: 'red' }, + { id: 'blue', name: getMessage('color.blue'), value: 'blue' }, + { id: 'gray', name: getMessage('color.gray'), value: 'gray' }, + { id: 'yellow', name: getMessage('color.yellow'), value: 'yellow' }, + { id: 'green', name: getMessage('color.green'), value: 'green' }, + { id: 'pink', name: getMessage('color.pink'), value: 'pink' }, + { id: 'gold', name: getMessage('color.gold'), value: 'gold' }, + { id: 'darkblue', name: getMessage('color.darkblue'), value: 'darkblue' }, + ].filter((fontColor) => fontColor.value === itemValue)[0] + if (data.length !== 0) { + return data + } else { + return { id: 'black', name: getMessage('color.black'), value: 'black' } + } + } const fetchSettings = async () => { try { @@ -141,8 +197,6 @@ export function useCanvasSetting() { const optionData4 = settingModalSecondOptions.option4.map((item) => ({ ...item, selected: res[item.column] })) const optionData5 = settingModalFirstOptions.dimensionDisplay.map((item) => ({ ...item })) - //setObjectNo(floorPlanState.objectNo) - //흡착점 ON/OFF setAdsorptionPointMode({ ...adsorptionPointMode, adsorptionPoint: res.adsorpPoint, fontFlag: false }) @@ -156,16 +210,6 @@ export function useCanvasSetting() { originVertical: res.originVertical, flag: false, }) - // setOriginHorizon({ - // ...originHorizon, - // originHorizon: res.originHorizon, - // flag: false, - // }) - // setOriginVertical({ - // ...originVertical, - // originVertical: res.originVertical, - // flag: false, - // }) // 데이터 설정 setSettingModalFirstOptions({ @@ -185,43 +229,43 @@ export function useCanvasSetting() { const fontPatternData = { commonText: { //문자 글꼴 조회 데이터 - fontFamily: res.wordFont, - fontWeight: res.wordFontStyle, - fontSize: res.wordFontSize, - fontColor: res.wordFontColor, + fontFamily: getFonts(res.wordFont), + fontWeight: getFontStyles(res.wordFontStyle), + fontSize: getFontSizes(res.wordFontSize), + fontColor: getFontColors(res.wordFontColor), }, flowText: { //흐름방향 글꼴 조회 데이터 - fontFamily: res.flowFont, - fontWeight: res.flowFontStyle, - fontSize: res.flowFontSize, - fontColor: res.flowFontColor, + fontFamily: getFonts(res.flowFont), + fontWeight: getFontStyles(res.flowFontStyle), + fontSize: getFontSizes(res.flowFontSize), + fontColor: getFontColors(res.flowFontColor), }, dimensionLineText: { //치수 글꼴 조회 데이터 - fontFamily: res.dimensioFont, - fontWeight: res.dimensioFontStyle, - fontSize: res.dimensioFontSize, - fontColor: res.dimensioFontColor, + fontFamily: getFonts(res.dimensioFont), + fontWeight: getFontStyles(res.dimensioFontStyle), + fontSize: getFontSizes(res.dimensioFontSize), + fontColor: getFontColors(res.dimensioFontColor), }, circuitNumberText: { //회로번호 글꼴 조회 데이터 - fontFamily: res.circuitNumFont, - fontWeight: res.circuitNumFontStyle, - fontSize: res.circuitNumFontSize, - fontColor: res.circuitNumFontColor, + fontFamily: getFonts(res.circuitNumFont), + fontWeight: getFontStyles(res.circuitNumFontStyle), + fontSize: getFontSizes(res.circuitNumFontSize), + fontColor: getFontColors(res.circuitNumFontColor), }, lengthText: { //치수선 글꼴 조회 데이터 - fontFamily: res.lengthFont, - fontWeight: res.lengthFontStyle, - fontSize: res.lengthFontSize, - fontColor: res.lengthFontColor, + fontFamily: getFonts(res.lengthFont), + fontWeight: getFontStyles(res.lengthFontStyle), + fontSize: getFontSizes(res.lengthFontSize), + fontColor: getFontColors(res.lengthFontColor), }, //글꼴 설정 Flag fontFlag: false, } - //console.log('fontPatternData', fontPatternData) + console.log('fontPatternData', fontPatternData) //조회된 글꼴 데이터 set setGlobalFont(fontPatternData) @@ -239,14 +283,6 @@ export function useCanvasSetting() { ...planSizeSettingMode, flag: false, }) - // setOriginHorizon({ - // ...originHorizon, - // flag: false, - // }) - // setOriginVertical({ - // ...originVertical, - // flag: false, - // }) // 데이터 설정 setSettingModalFirstOptions({ @@ -258,52 +294,7 @@ export function useCanvasSetting() { fontFlag: false, }) - //console.log('globalFont2', globalFont) - const fontPatternData = { - commonText: { - //문자 글꼴 - fontFamily: globalFont.commonText.fontFamily.value, - fontWeight: globalFont.commonText.fontWeight.value, - fontSize: globalFont.commonText.fontSize.value, - fontColor: globalFont.commonText.fontColor.value, - }, - flowText: { - //흐름방향 글꼴 - fontFamily: globalFont.flowText.fontFamily.value, - fontWeight: globalFont.flowText.fontWeight.value, - fontSize: globalFont.flowText.fontSize.value, - fontColor: globalFont.flowText.fontColor.value, - }, - dimensionLineText: { - //치수 글꼴 - fontFamily: globalFont.dimensionLineText.fontFamily.value, - fontWeight: globalFont.dimensionLineText.fontWeight.value, - fontSize: globalFont.dimensionLineText.fontSize.value, - fontColor: globalFont.dimensionLineText.fontColor.value, - }, - circuitNumberText: { - //회로번호 글꼴 - fontFamily: globalFont.circuitNumberText.fontFamily.value, - fontWeight: globalFont.circuitNumberText.fontWeight.value, - fontSize: globalFont.circuitNumberText.fontSize.value, - fontColor: globalFont.circuitNumberText.fontColor.value, - }, - lengthText: { - //치수선 글꼴 - fontFamily: globalFont.lengthText.fontFamily.value, - fontWeight: globalFont.lengthText.fontWeight.value, - fontSize: globalFont.lengthText.fontSize.value, - fontColor: globalFont.lengthText.fontColor.value, - }, - //글꼴 설정 Flag - fontFlag: false, - } - - //console.log('fontPatternData', fontPatternData) - - setGlobalFont(fontPatternData) - - //setGlobalFont({ ...globalFont, fontFlag: false }) + setGlobalFont({ ...globalFont, fontFlag: false }) } frontSettings() } catch (error) { @@ -332,7 +323,7 @@ export function useCanvasSetting() { selected: item.selected, })), } - + // console.log('globalFont', globalFont) const patternData = { //견적서 번호 objectNo: correntObjectNo, @@ -366,34 +357,34 @@ export function useCanvasSetting() { //글꼴 설정 //문자 글꼴 - wordFont: globalFont.commonText.fontFamily, - wordFontStyle: globalFont.commonText.fontWeight, - wordFontSize: globalFont.commonText.fontSize, - wordFontColor: globalFont.commonText.fontColor, + wordFont: globalFont.commonText.fontFamily?.value ?? 'MS PGothic', + wordFontStyle: globalFont.commonText.fontWeight?.value ?? 'normal', + wordFontSize: globalFont.commonText.fontSize?.value ?? 16, + wordFontColor: globalFont.commonText.fontColor?.value ?? 'black', //흐름방향 글꼴 - flowFont: globalFont.flowText.fontFamily, - flowFontStyle: globalFont.flowText.fontWeight, - flowFontSize: globalFont.flowText.fontSize, - flowFontColor: globalFont.flowText.fontColor, + flowFont: globalFont.flowText.fontFamily?.value ?? 'MS PGothic', + flowFontStyle: globalFont.flowText.fontWeight?.value ?? 'normal', + flowFontSize: globalFont.flowText.fontSize?.value ?? 16, + flowFontColor: globalFont.flowText.fontColor?.value ?? 'black', //치수 글꼴 - dimensioFont: globalFont.dimensionLineText.fontFamily, - dimensioFontStyle: globalFont.dimensionLineText.fontWeight, - dimensioFontSize: globalFont.dimensionLineText.fontSize, - dimensioFontColor: globalFont.dimensionLineText.fontColor, + dimensioFont: globalFont.dimensionLineText.fontFamily?.value ?? 'MS PGothic', + dimensioFontStyle: globalFont.dimensionLineText.fontWeight?.value ?? 'normal', + dimensioFontSize: globalFont.dimensionLineText.fontSize?.value ?? 16, + dimensioFontColor: globalFont.dimensionLineText.fontColor?.value ?? 'black', //회로번호 글꼴 - circuitNumFont: globalFont.circuitNumberText.fontFamily, - circuitNumFontStyle: globalFont.circuitNumberText.fontWeight, - circuitNumFontSize: globalFont.circuitNumberText.fontSize, - circuitNumFontColor: globalFont.circuitNumberText.fontColor, + circuitNumFont: globalFont.circuitNumberText.fontFamily?.value ?? 'MS PGothic', + circuitNumFontStyle: globalFont.circuitNumberText.fontWeight?.value ?? 'normal', + circuitNumFontSize: globalFont.circuitNumberText.fontSize?.value ?? 16, + circuitNumFontColor: globalFont.circuitNumberText.fontColor?.value ?? 'black', //치수선 글꼴 - lengthFont: globalFont.lengthText.fontFamily, - lengthFontStyle: globalFont.lengthText.fontWeight, - lengthFontSize: globalFont.lengthText.fontSize, - lengthFontColor: globalFont.lengthText.fontColor, + lengthFont: globalFont.lengthText.fontFamily?.value ?? 'MS PGothic', + lengthFontStyle: globalFont.lengthText.fontWeight?.value ?? 'normal', + lengthFontSize: globalFont.lengthText.fontSize?.value ?? 16, + lengthFontColor: globalFont.lengthText.fontColor?.value ?? 'black', //치수선 설정 originPixel: dimensionLineSettings.pixel, @@ -402,8 +393,6 @@ export function useCanvasSetting() { //치수선 설정 originHorizon: planSizeSettingMode.originHorizon, originVertical: planSizeSettingMode.originVertical, - // originHorizon: originHorizon.originHorizon, - // originVertical: originVertical.originVertical, } console.log('patternData ', patternData) From f4a4ac8e3679abf0ac312d0dab19866d41429944 Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 26 Nov 2024 18:29:34 +0900 Subject: [PATCH 174/200] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?&=20=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 101 ++++++++---------- .../estimate/popup/ProductFeaturesPop.jsx | 6 +- src/components/management/StuffDetail.jsx | 14 ++- .../estimate/useEstimateController.js | 35 ++++-- src/locales/ja.json | 4 +- src/locales/ko.json | 4 +- 6 files changed, 95 insertions(+), 69 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 709c3448..88e2fa1d 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -20,6 +20,7 @@ import ProductFeaturesPop from './popup/ProductFeaturesPop' import { v4 as uuidv4 } from 'uuid' export default function Estimate({ params }) { + const [handlePricingFlag, setHandlePricingFlag] = useState(false) const [specialNoteFirstFlg, setSpecialNoteFirstFlg] = useState(false) const fixedKey = 'itemKey' const [itemChangeYn, setItemChangeYn] = useState(false) @@ -63,6 +64,7 @@ export default function Estimate({ params }) { //견적특이사항 List const [specialNoteList, setSpecialNoteList] = useState([]) + const [popShowSpecialNoteList, setPopShowSpecialNoteList] = useState([]) const globalLocaleState = useRecoilValue(globalLocaleStore) const { get, promisePost } = useAxios(globalLocaleState) @@ -98,22 +100,40 @@ export default function Estimate({ params }) { setDisplayItemList(res) } }) + //견적특이사항 API호출 + //여러개 선택하면 구분자로 (、) + //제품영역 팝업용 + let url = '/api/estimate/special-note-list' + get({ url: url }).then((res) => { + if (isNotEmptyArray(res)) { + setPopShowSpecialNoteList(res) + } + }) }, []) useEffect(() => { //견적특이사항 API호출 //여러개 선택하면 구분자로 (、) + //체크용 if (!specialNoteFirstFlg) { - let url = `/api/estimate/special-note-list` + let url = `/api/estimate/special-note-title-list` get({ url: url }).then((res) => { if (isNotEmptyArray(res)) { + //디테일 ATTR001、ATTR002、ATTR003、ATTR007、ATTR009、ATTR010、ATTR015、ATTR019 if (estimateContextState?.estimateOption) { res.map((row) => { let estimateOption = estimateContextState?.estimateOption?.split('、') row.check = false estimateOption.map((row2) => { - if (row2 === row.code) { - row.check = true + if (row.pkgYn === '0') { + if (row2 === row.code) { + row.check = true + } + } else { + if (row.code.includes(row2)) { + row.check = true + return + } } }) //detail과 상관없이 디폴트 체크목록 @@ -135,48 +155,6 @@ export default function Estimate({ params }) { } }, [estimateContextState?.estimateOption]) - //변경버전 - // useEffect(() => { - // //견적특이사항 API호출 - // //여러개 선택하면 구분자로 (、) - // let url = `/api/estimate/special-note-title-list` - // // let url = `/api/estimate/special-note-list` - // get({ url: url }).then((res) => { - // if (isNotEmptyArray(res)) { - // if (estimateContextState?.estimateOption) { - // res.map((row) => { - // // console.log('API결과:::', row) - // //ATTR001、ATTR002、ATTR009、ATTR010 - // let estimateOption = estimateContextState?.estimateOption?.split('、') - // row.check = false - // estimateOption.map((row2) => { - // if (row.pkgYn === '0') { - // if (row2 === row.code) { - // row.check = true - // } - // } else { - // if (row.code.includes(row2)) { - // row.check = true - // return - // } - // } - // }) - // //detail과 상관없이 디폴트 체크목록 - // //ATTR003,ATTR007 - // if (row.code === 'ATTR003') { - // row.check = true - // } - // if (row.code === 'ATTR007') { - // row.check = true - // } - // }) - - // setSpecialNoteList(res) - // } - // } - // }) - // }, [estimateContextState?.estimateOption]) - //API데이터로 견적일 셋팅 let begin = 1 useEffect(() => { @@ -276,7 +254,9 @@ export default function Estimate({ params }) { } //YJSS UNIT_PIRCE로 프라이싱 실행 - handlePricing('UNIT_PRICE') + if (handlePricingFlag) { + handlePricing('UNIT_PRICE') + } } else { if (specialNoteList.length > 0) { specialNoteList.map((item) => { @@ -293,7 +273,9 @@ export default function Estimate({ params }) { }) //YJOD로 돌아가도 UNIT_PRICE로 프라이싱 실행해서 정가로 셋팅 - handlePricing('UNIT_PRICE') + if (handlePricingFlag) { + handlePricing('UNIT_PRICE') + } } setItemChangeYn(true) @@ -543,6 +525,7 @@ export default function Estimate({ params }) { updates.itemGroup = res.itemGroup updates.delFlg = '0' // 삭제플래그 0 updates.saleTotPrice = (res.salePrice * estimateContextState.itemList[index].amount).toString() + updates.amount = '' if (estimateContextState.estimateType === 'YJSS') { if (res.pkgMaterialFlg === '0') { @@ -557,7 +540,8 @@ export default function Estimate({ params }) { if (item.dispOrder === dispOrder) { return { ...item, ...updates } } else if (item.paDispOrder === dispOrder) { - return { ...item, delFlg: '0' } + //봄제품을 바꿨을떄 + return { ...item, delFlg: '1' } } else { return item } @@ -572,14 +556,14 @@ export default function Estimate({ params }) { bomItem.salePrice = '0' bomItem.saleTotPrice = '0' bomItem.unitPrice = '0' - bomItem.amount = bomItem.bomAmount + // bomItem.amount = null } else { bomItem.dispOrder = (index + 1 + Number(dispOrder)).toString() bomItem.paDispOrder = dispOrder bomItem.salePrice = '0' bomItem.saleTotPrice = '0' bomItem.unitPrice = '0' - bomItem.amount = bomItem.bomAmount + // bomItem.amount = null } bomItem.delFlg = '0' @@ -717,6 +701,11 @@ export default function Estimate({ params }) { const volKw = (item.pnowW * amount) / 1000 totVolKw += volKw } + + setEstimateContextState({ + pkgTotPrice: estimateContextState.pkgAsp.replaceAll(',', '') * totVolKw, + }) + //pkgTotPrice // const saleTotPrice totAmount += amount if (item.pkgMaterialFlg === '1') { @@ -735,7 +724,6 @@ export default function Estimate({ params }) { } } }) - supplyPrice = addSupplyPrice + Number(estimateContextState.pkgTotPrice) vatPrice = supplyPrice * 0.1 totPrice = supplyPrice + vatPrice @@ -905,6 +893,7 @@ export default function Estimate({ params }) { checked={estimateContextState?.estimateType === 'YJSS' ? true : false} onChange={(e) => { //주문분류 + setHandlePricingFlag(true) setEstimateContextState({ estimateType: e.target.value }) }} /> @@ -918,6 +907,7 @@ export default function Estimate({ params }) { value={'YJOD'} checked={estimateContextState?.estimateType === 'YJOD' ? true : false} onChange={(e) => { + setHandlePricingFlag(true) setEstimateContextState({ estimateType: e.target.value }) }} /> @@ -1101,7 +1091,9 @@ export default function Estimate({ params }) { settingShowContent(row.code, event) }} /> - +
    ) @@ -1188,7 +1180,7 @@ export default function Estimate({ params }) {
    {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgWeight')} - {convertNumberToPriceDecimalToFixed(estimateContextState?.totVolKw, 2)} + {convertNumberToPriceDecimalToFixed(estimateContextState?.totVolKw, 3)} {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgPrice')} {convertNumberToPriceDecimal(estimateContextState?.pkgTotPrice)} @@ -1222,6 +1214,7 @@ export default function Estimate({ params }) { type="button" className="btn-origin grey ml5" onClick={() => { + setHandlePricingFlag(true) handlePricing(showPriceCd) }} > @@ -1429,7 +1422,7 @@ export default function Estimate({ params }) {
    {productFeaturesPopupOpen && ( diff --git a/src/components/estimate/popup/ProductFeaturesPop.jsx b/src/components/estimate/popup/ProductFeaturesPop.jsx index d958e7e2..5b1af6aa 100644 --- a/src/components/estimate/popup/ProductFeaturesPop.jsx +++ b/src/components/estimate/popup/ProductFeaturesPop.jsx @@ -1,13 +1,13 @@ 'use client' import { useEffect, useState } from 'react' import { useMessage } from '@/hooks/useMessage' -export default function ProductFeaturesPop({ specialNoteList, showProductFeatureData, setProductFeaturesPopupOpen }) { +export default function ProductFeaturesPop({ popShowSpecialNoteList, showProductFeatureData, setProductFeaturesPopupOpen }) { const [showSpecialNoteList, setShowSpecialNoteList] = useState([]) const { getMessage } = useMessage() useEffect(() => { let pushData = [] - specialNoteList.map((row) => { + popShowSpecialNoteList.map((row) => { let option = showProductFeatureData.split('、') option.map((row2) => { if (row.code === row2) { @@ -16,7 +16,7 @@ export default function ProductFeaturesPop({ specialNoteList, showProductFeature }) }) setShowSpecialNoteList(pushData) - }, [specialNoteList]) + }, [popShowSpecialNoteList]) return (
    diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 87f07a8e..080a7cb6 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -142,6 +142,16 @@ export default function StuffDetail() { headerName: getMessage('stuff.detail.planGridHeader.capacity'), width: 120, cellStyle: { justifyContent: 'flex-end' /* 우측정렬*/ }, + cellRenderer: (params) => { + let origin = params.value + let capacity + if (origin) { + capacity = origin / 1000 + return capacity.toFixed(3) + } else { + return null + } + }, }, { field: 'roofMaterialIdMulti', @@ -170,8 +180,8 @@ export default function StuffDetail() { }, }, { - field: 'constructSpecification', - headerName: getMessage('stuff.detail.planGridHeader.constructSpecification'), + field: 'constructSpecificationMulti', + headerName: getMessage('stuff.detail.planGridHeader.constructSpecificationMulti'), wrapText: true, autoHeight: true, cellStyle: { justifyContent: 'flex-start' /* 좌측정렬*/ }, diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 04dcd477..23636c4c 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -141,7 +141,6 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredEstimateDate')) } - // console.log('첨부파일:::::', estimateData.fileList) //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 let fileFlg = true @@ -159,8 +158,34 @@ export const useEstimateController = (planNo) => { }) } } + let itemFlg = true + estimateData.itemList.map((item) => { + item.amount = item.amount?.replaceAll(',', '') + item.salePrice = parseFloat(item.salePrice?.replaceAll(',', '')).toFixed(2) + item.saleTotPrice = parseFloat(item.saleTotPrice?.replaceAll(',', '')).toFixed(2) - if (flag && fileFlg) { + if (!item.paDispOrder) { + if (itemFlg) { + if (isNaN(item.amount)) { + item.amount = 0 + } else { + Number(item.amount) + } + + if (item.amount < 1) { + itemFlg = false + return alert(getMessage('estimate.detail.save.requiredAmount')) + } + + if (Number(item.salePrice) < 1) { + itemFlg = false + return alert(getMessage('estimate.detail.save.requiredSalePrice')) + } + } + } + }) + + if (flag && fileFlg && itemFlg) { //1. 첨부파일 저장시작 const formData = new FormData() formData.append('file', estimateData.fileList) @@ -186,12 +211,6 @@ export const useEstimateController = (planNo) => { } console.log('최종 아이템 정보::;', estimateData.itemList) - estimateData.itemList.map((item) => { - item.amount = item.amount?.replaceAll(',', '') - item.salePrice = parseFloat(item.salePrice?.replaceAll(',', '')).toFixed(2) - item.saleTotPrice = parseFloat(item.saleTotPrice?.replaceAll(',', '')).toFixed(2) - }) - console.log('최종 정보::;', estimateData) //2. 상세데이터 저장 // return diff --git a/src/locales/ja.json b/src/locales/ja.json index 9250fe50..03ec0aa7 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -729,7 +729,7 @@ "stuff.detail.planGridHeader.moduleModel": "モジュール", "stuff.detail.planGridHeader.capacity": "システム容量", "stuff.detail.planGridHeader.roofMaterialIdMulti": "屋根材", - "stuff.detail.planGridHeader.constructSpecification": "施工方法", + "stuff.detail.planGridHeader.constructSpecificationMulti": "施工方法", "stuff.detail.planGridHeader.supportMethodIdMulti": "架台", "stuff.detail.planGridHeader.pcTypeNo": "パワーコンディショナー", "stuff.detail.planGridHeader.management": "管理", @@ -895,6 +895,8 @@ "estimate.detail.save.requiredCharger": "担当者は必須です.", "estimate.detail.save.requiredObjectName": "案件名は必須です.", "estimate.detail.save.requiredEstimateDate": "見積日は必須です.", + "estimate.detail.save.requiredAmount": "数量は0より大きい値を入力してください.", + "estimate.detail.save.requiredSalePrice": "単価は0より大きい値を入力してください.", "estimate.detail.reset.confirmMsg": "保存した見積書情報が初期化され、図面情報が反映されます。本当に初期化しますか?", "simulator.title.sub1": "物件番号", "simulator.title.sub2": "作成日", diff --git a/src/locales/ko.json b/src/locales/ko.json index 023ccdc8..85994982 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -739,7 +739,7 @@ "stuff.detail.planGridHeader.moduleModel": "모듈", "stuff.detail.planGridHeader.capacity": "시스템용량", "stuff.detail.planGridHeader.roofMaterialIdMulti": "지붕재", - "stuff.detail.planGridHeader.constructSpecification": "시공방법", + "stuff.detail.planGridHeader.constructSpecificationMulti": "시공방법", "stuff.detail.planGridHeader.supportMethodIdMulti": "가대", "stuff.detail.planGridHeader.pcTypeNo": "파워컨디셔너", "stuff.detail.planGridHeader.management": "관리", @@ -905,6 +905,8 @@ "estimate.detail.save.requiredCharger": "담당자는 필수값 입니다.", "estimate.detail.save.requiredObjectName": "안건명은 필수값 입니다.", "estimate.detail.save.requiredEstimateDate": "견적일은 필수값 입니다.", + "estimate.detail.save.requiredAmount": "수량은 0보다 큰값을 입력해주세요.", + "estimate.detail.save.requiredSalePrice": "단가는 0보다 큰값을 입력해주세요.", "estimate.detail.reset.confirmMsg": "저장된 견적서 정보가 초기화되고, 도면정보가 반영됩니다. 정말로 초기화 하시겠습니까?", "simulator.title.sub1": "물건번호", "simulator.title.sub2": "작성일", From ccabc805526071ec06e983b0333139e1ca6b1896 Mon Sep 17 00:00:00 2001 From: minsik Date: Tue, 26 Nov 2024 18:37:51 +0900 Subject: [PATCH 175/200] =?UTF-8?q?=F0=9F=9A=A8chore:=20Sync=20Sass=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=84=A4=EC=A0=95=20=EB=AA=A8=EB=8B=AC=20?= =?UTF-8?q?>=20=EB=AA=A8=EB=93=88=20=ED=8D=BC=EB=B8=94=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/basic/step/Module.jsx | 189 +- src/locales/ja.json | 4 +- src/locales/ko.json | 6 +- src/styles/_grid-detail.scss | 40 + src/styles/_modal.scss | 3734 ++++++++--------- src/styles/_reset.scss | 4 +- src/styles/_submodal.scss | 32 + 7 files changed, 2009 insertions(+), 2000 deletions(-) diff --git a/src/components/floor-plan/modal/basic/step/Module.jsx b/src/components/floor-plan/modal/basic/step/Module.jsx index f50bb408..e3e5c7bc 100644 --- a/src/components/floor-plan/modal/basic/step/Module.jsx +++ b/src/components/floor-plan/modal/basic/step/Module.jsx @@ -32,6 +32,16 @@ export default function Module({}) { }, ], } + const surfaceTypes = [ + { id: 1, name: 'Ⅱ', value: 'Ⅱ' }, + { id: 2, name: 'Ⅲ ∙ Ⅳ', value: 'Ⅲ ∙ Ⅳ' }, + ] + const fiftingHeights = Array.from({ length: 16 }).map((data, index) => { + return { id: index, name: index + 5, value: index + 5 } + }) + const windSpeeds = Array.from({ length: 7 }).map((data, index) => { + return { id: index, name: index * 2 + 30, value: index * 2 + 30 } + }) return ( <>
    @@ -47,11 +57,13 @@ export default function Module({}) { - {moduleData.header.map((data) => ( - - ))} + {moduleData.header.map((header) => { + return ( + + ) + })} @@ -88,37 +100,50 @@ export default function Module({}) { -
    -
    - - - - -
    +
    -
    {getMessage('modal.module.basic.setting.module.roof.material')}: スレーツ(4寸)
    +
    {getMessage('modal.module.basic.setting.module.stuff.info')}
    -
    {getMessage('modal.module.basic.setting.module.trestle.maker')}
    +
    {getMessage('modal.module.basic.setting.module.surface.type')}
    -
    - +
    +
    + +
    -
    {getMessage('modal.module.basic.setting.module.construction.method')}
    +
    {getMessage('modal.module.basic.setting.module.fitting.height')}
    -
    - +
    +
    + +
    + mm
    -
    {getMessage('modal.module.basic.setting.module.under.roof')}
    +
    {getMessage('modal.module.basic.setting.module.standard.wind.speed')}
    -
    - +
    +
    + +
    + m/s +
    +
    +
    +
    +
    {getMessage('modal.module.basic.setting.module.standard.snowfall.amount')}
    +
    +
    +
    + +
    + mm
    @@ -127,61 +152,93 @@ export default function Module({}) {
    +
    + + + + +
    -
    -
    - {getMessage('modal.module.basic.setting.module.cotton.classification')} -
    - +
    +
    +
    {getMessage('modal.module.basic.setting.module.roof.material')}:スレーツ(4寸)
    +
    +
    +
    {getMessage('modal.module.basic.setting.module.rafter.margin')}
    +
    +
    +
    + +
    +
    + 垂木の間隔 +
    + +
    +
    +
    +
    +
    +
    +
    {getMessage('modal.module.basic.setting.module.trestle.maker')}
    +
    +
    + +
    +
    +
    +
    +
    {getMessage('modal.module.basic.setting.module.construction.method')}
    +
    +
    + +
    +
    +
    +
    +
    {getMessage('modal.module.basic.setting.module.under.roof')}
    +
    +
    + +
    +
    +
    -
    - {getMessage('modal.module.basic.setting.module.fitting.height')} -
    - +
    +
    + + + + +
    -
    -
    - {getMessage('modal.module.basic.setting.module.standard.wind.speed')} -
    - -
    -
    -
    - {getMessage('modal.module.basic.setting.module.standard.snowfall.amount')} -
    - +
    +
    + + +
    +
    + + +
    -
    -
    -
    - {getMessage('modal.module.basic.setting.module.setting.info1')} -
    - {getMessage('modal.module.basic.setting.module.setting.info2')} -
    +
    +
    +
    +
    + {getMessage('modal.module.basic.setting.module.setting.info1')} +
    + {getMessage('modal.module.basic.setting.module.setting.info2')} +
    -
    -
    - - - - - -
    -
    -
    - - -
    -
    - - -
    + {/* 설정 오류시 노출 */} +
    ※ 施工方法が選択できません。 基準風速または基準積雪量を確認してください。
    ) diff --git a/src/locales/ja.json b/src/locales/ja.json index 9250fe50..2001c0a3 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -86,12 +86,14 @@ "modal.module.basic.setting.orientation.setting.angle.passivity": "角度を直接入力", "modal.module.basic.setting.module.roof.material": "屋根材", "modal.module.basic.setting.module.trestle.maker": "架台メーカー", + "modal.module.basic.setting.module.rafter.margin": "マンドンピッチ", "modal.module.basic.setting.module.construction.method": "工法", "modal.module.basic.setting.module.under.roof": "屋根の下", "modal.module.basic.setting.module.setting": "モジュールの選択", "modal.module.basic.setting.module.setting.info1": "※勾配の 範囲には制限があります。屋根傾斜が2.5値未満、10値を超える場合には施工が可能か 施工マニュアルを確認してください。", "modal.module.basic.setting.module.setting.info2": "モジュール配置時は、施工マニュアルに記載されている<モジュール配置条件>を必ず確認してください", - "modal.module.basic.setting.module.cotton.classification": "綿調道区分", + "modal.module.basic.setting.module.stuff.info": "商品情報", + "modal.module.basic.setting.module.surface.type": "면조도구분(JA)", "modal.module.basic.setting.module.fitting.height": "設置高さ", "modal.module.basic.setting.module.standard.wind.speed": "基準風速", "modal.module.basic.setting.module.standard.snowfall.amount": "基準積雪量", diff --git a/src/locales/ko.json b/src/locales/ko.json index 023ccdc8..66b8c2c4 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -89,12 +89,14 @@ "modal.module.basic.setting.orientation.setting.angle.passivity": "각도를 직접 입력", "modal.module.basic.setting.module.roof.material": "지붕재", "modal.module.basic.setting.module.trestle.maker": "가대메이거", + "modal.module.basic.setting.module.rafter.margin": "서까래 간격", "modal.module.basic.setting.module.construction.method": "공법", "modal.module.basic.setting.module.under.roof": "지붕밑바탕", - "modal.module.basic.setting.module.setting": "모듈 설정", + "modal.module.basic.setting.module.setting": "모듈 선택", "modal.module.basic.setting.module.setting.info1": "※ 구배의 범위에는 제한이 있습니다. 지붕경사가 2.5치 미만, 10치를 초과하는 경우에는 시공이 가능한지 시공 매뉴얼을 확인해주십시오.", "modal.module.basic.setting.module.setting.info2": "※ 모듈 배치 시에는 시공 매뉴얼에 기재된 <모듈 배치 조건>을 반드시 확인해주십시오.", - "modal.module.basic.setting.module.cotton.classification": "면조도구분", + "modal.module.basic.setting.module.stuff.info": "물건정보", + "modal.module.basic.setting.module.surface.type": "면조도구분", "modal.module.basic.setting.module.fitting.height": "설치높이", "modal.module.basic.setting.module.standard.wind.speed": "기준 풍속", "modal.module.basic.setting.module.standard.snowfall.amount": "기준 적설량", diff --git a/src/styles/_grid-detail.scss b/src/styles/_grid-detail.scss index d6f34b13..4bf432eb 100644 --- a/src/styles/_grid-detail.scss +++ b/src/styles/_grid-detail.scss @@ -59,6 +59,46 @@ .ag-icon-filter::before{ color: #fff; } + .ag-body-vertical-scroll{ + width: 4px !important; + max-width: 4px !important; + min-width: 4px !important; + .ag-body-vertical-scroll-viewport{ + width: 4px !important; + max-width: 4px !important; + min-width: 4px !important; + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #C1CCD7; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } + } + } + .ag-body-horizontal-scroll{ + height: 4px !important; + max-height: 4px !important; + min-height: 4px !important; + .ag-body-horizontal-scroll-viewport{ + height: 4px !important; + max-height: 4px !important; + min-height: 4px !important; + &::-webkit-scrollbar { + height: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #C1CCD7; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } + } + } } .copy-ico-wrap{ display: flex; diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index 2914875d..b4987651 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -4,2128 +4,2004 @@ $pop-bold-weight: 500; $pop-normal-size: 12px; $alert-color: #101010; -@keyframes mountpop { - from { - opacity: 0; - scale: 0.95; - } - to { - opacity: 1; - scale: 1; - } +@keyframes mountpop{ + from{opacity: 0; scale: 0.95;} + to{opacity: 1; scale: 1;} } -@keyframes unmountpop { - from { - opacity: 1; - scale: 1; - } - to { - opacity: 0; - scale: 0.95; - } +@keyframes unmountpop{ + from{opacity: 1; scale: 1;} + to{opacity: 0; scale: 0.95;} } -.normal-font { - font-size: 12px; - font-weight: 400; - color: #fff; +.normal-font{ + font-size: 12px; + font-weight: 400; + color: #fff; } -.bold-font { - font-size: 12px; - font-weight: 500; - color: #fff; +.bold-font{ + font-size: 12px; + font-weight: 500; + color: #fff; } -.modal-pop-wrap { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: -webkit-fit-content; - height: -moz-fit-content; - height: fit-content; - border: 1px solid #000; - border-radius: 4px; - background-color: #272727; - z-index: 9999999; - &.xsm { - width: 200px; - } - &.xxxm { - width: 240px; - } - &.xxm { - width: 270px; - } - &.xm { - width: 300px; - } - &.ssm { - width: 380px; - } - &.sm { - width: 580px; - } - &.r { - width: 400px; - } - &.lr { - width: 440px; - } - &.lr-2 { - width: 450px; - } - &.lrr { - width: 480px; - } - &.ml { - width: 530px; - } - &.l-2 { - width: 640px; - } - &.lx-2 { - width: 740px; - } - &.lx { - width: 770px; - } - &.l { - width: 800px; - } - &.mount { - animation: mountpop 0.17s ease-in-out forwards; - } - &.unmount { - animation: unmountpop 0.17s ease-in-out forwards; - } - &.alert { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: transparent; - border: none; - .modal-head { - background-color: transparent; - padding: 0 0 8px; - .modal-close { - width: 20px; - height: 20px; - background: url(../../public/static/images/canvas/alert_close.svg) no-repeat center; - } +.modal-pop-wrap{ + position: fixed; + top: 0; + left: 0; + width: 100%; + height: -webkit-fit-content; + height: -moz-fit-content; + height: fit-content; + border: 1px solid #000; + border-radius: 4px; + background-color: #272727; + z-index: 9999999; + &.xsm{ + width: 200px; } - .modal-body { - background-color: #fff; - padding: 22px; - border-radius: 4px; - border: 1px solid #101010; - color: $alert-color; - .alert-title { + &.xxxm{ + width: 240px; + } + &.xxm{ + width: 270px; + } + &.xm{ + width: 300px; + } + &.ssm{ + width: 380px; + } + &.sm{ + width: 580px; + } + &.r{ + width: 400px; + } + &.lr{ + width: 440px; + } + &.lr-2{ + width: 450px; + } + &.lrr{ + width: 480px; + } + &.ml{ + width: 530px; + } + &.l-2{ + width: 640px; + } + &.lx-2{ + width: 740px; + } + &.lx{ + width: 770px; + } + &.l{ + width: 800px; + } + &.mount{ + animation: mountpop .17s ease-in-out forwards; + } + &.unmount{ + animation: unmountpop .17s ease-in-out forwards; + } + &.alert{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: transparent; + border: none; + .modal-head{ + background-color: transparent; + padding: 0 0 8px; + .modal-close{ + width: 20px; + height: 20px; + background: url(../../public/static/images/canvas/alert_close.svg)no-repeat center; + } + } + .modal-body{ + background-color: #fff; + padding: 22px; + border-radius: 4px; + border: 1px solid #101010; + color: $alert-color; + .alert-title{ + font-size: 13px; + font-weight: 700; + color: $alert-color; + margin-bottom: 15px; + } + } + } +} +.modal-head{ + display: flex; + align-items: center; + padding: 10px 24px; + background-color: #000; + // overflow: hidden; + h1.title{ font-size: 13px; + color: $pop-color; font-weight: 700; - color: $alert-color; + } + .modal-close{ + margin-left: auto; + color: transparent; + font-size: 0; + width: 10px; + height: 10px; + background: url(../../public/static/images/canvas/modal_close.svg)no-repeat center; + } +} +.modal-body{ + padding: 24px; + .modal-btn-wrap{ + display: flex; + align-items: center; + gap: 5px; + button{ + flex: 1; + } + &.sub{ + button{ + flex: 1 1 auto; + padding: 0; + } + margin-bottom: 14px; + } + } + .modal-check-btn-wrap{ + margin-top: 15px; + .check-wrap-title{ + font-size: $pop-normal-size; + color: $pop-color; + font-weight: 600; + &.light{ + font-weight: $pop-normal-weight; + } + } + .flex-check-box{ + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 15px; + &.for2{ + justify-content: flex-end; + button{ + width: calc(50% - 5px); + } + &.btn{ + gap: 5px; + button{ + width: calc(50% - 2.5px); + } + } + } + &.for-line{ + button{ + flex: 1; + } + } + } + } + .outer-line-wrap{ + border-top: 1px solid #3C3C3C; + margin-top: 10px; + padding-top: 15px; margin-bottom: 15px; - } + > div{ + margin-bottom: 15px; + &:last-child{ + margin-bottom: 0; + } + } } - } -} -.modal-head { - display: flex; - align-items: center; - padding: 10px 24px; - background-color: #000; - // overflow: hidden; - h1.title { - font-size: 13px; - color: $pop-color; - font-weight: 700; - } - .modal-close { - margin-left: auto; - color: transparent; - font-size: 0; - width: 10px; - height: 10px; - background: url(../../public/static/images/canvas/modal_close.svg) no-repeat center; - } -} -.modal-body { - padding: 24px; - .modal-btn-wrap { - display: flex; - align-items: center; - gap: 5px; - button { - flex: 1; - } - &.sub { - button { - flex: 1 1 auto; - padding: 0; - } - margin-bottom: 14px; - } - } - .modal-check-btn-wrap { - margin-top: 15px; - .check-wrap-title { - font-size: $pop-normal-size; - color: $pop-color; - font-weight: 600; - &.light { + .modal-guide{ + display: block; + font-size: $pop-normal-size; + color: $alert-color; font-weight: $pop-normal-weight; - } } - .flex-check-box { - display: flex; - flex-wrap: wrap; - gap: 10px; - margin-top: 15px; - &.for2 { - justify-content: flex-end; - button { - width: calc(50% - 5px); - } - &.btn { - gap: 5px; - button { - width: calc(50% - 2.5px); - } - } - } - &.for-line { - button { - flex: 1; - } - } - } - } - .outer-line-wrap { - border-top: 1px solid #3c3c3c; - margin-top: 10px; - padding-top: 15px; - margin-bottom: 15px; - > div { - margin-bottom: 15px; - &:last-child { - margin-bottom: 0; - } - } - } - .modal-guide { - display: block; - font-size: $pop-normal-size; - color: $alert-color; - font-weight: $pop-normal-weight; - } } -.adsorption-point { - display: flex; - align-items: center; - background-color: #3a3a3a; - border-radius: 3px; - padding-left: 11px; - overflow: hidden; - transition: all 0.17s ease-in-out; - span { - font-size: $pop-normal-size; - color: #898989; - } - i { +.adsorption-point{ display: flex; align-items: center; - padding: 0 7px; - margin-left: auto; - height: 100%; - font-size: 13px; - color: #898989; - } - &.act { - i { - color: $pop-color; - background-color: #1083e3; + background-color: #3A3A3A; + border-radius: 3px; + padding-left: 11px; + overflow: hidden; + transition: all 0.17s ease-in-out; + span{ + font-size: $pop-normal-size; + color: #898989; + } + i{ + display: flex; + align-items: center; + padding: 0 7px; + margin-left: auto; + height: 100%; + font-size: 13px; + color: #898989; + } + &.act{ + i{ + color: $pop-color; + background-color: #1083E3; + } } - } } // grid-option -.grid-check-form { - display: flex; - align-items: center; - gap: 15px; - padding-bottom: 15px; - &.border { - border-bottom: 1px solid #424242; - } -} -.grid-option-wrap { - .grid-option-box { +.grid-check-form{ display: flex; align-items: center; - background-color: transparent; - border: 1px solid #3d3d3d; - border-radius: 2px; - padding: 15px 10px; - gap: 20px; - margin-bottom: 10px; - .grid-input-form { - display: flex; - align-items: center; - span { - flex: none; - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-bold-weight; - } - .input-grid { - width: 54px; - input { - width: 100%; + gap: 15px; + padding-bottom: 15px; + &.border{ + border-bottom: 1px solid #424242; + } +} +.grid-option-wrap{ + .grid-option-box{ + display: flex; + align-items: center; + background-color: transparent; + border: 1px solid #3D3D3D; + border-radius: 2px; + padding: 15px 10px; + gap: 20px; + margin-bottom: 10px; + .grid-input-form{ + display: flex; + align-items: center; + span{ + flex: none; + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-bold-weight; + } + .input-grid{ + width: 54px; + input{ + width: 100%; + } + } + } + &:last-child{ + margin-bottom: 0; } - } } - &:last-child { - margin-bottom: 0; - } - } } -.select-form { - .sort-select { - width: 100%; - } +.select-form{ + .sort-select{width: 100%;} } -.grid-select { - flex: 1; - &.no-flx { - flex: unset; - } - .sort-select { - width: 100%; - background-color: #313131; - min-width: auto; - font-size: 12px; - border: none; - p { - font-size: 12px; +.grid-select{ + flex: 1; + &.no-flx{ + flex: unset; } - > ul { - border: none; + .sort-select{ + width: 100%; + background-color: #313131; + min-width: auto; + font-size: 12px; + border: none; + p{ + font-size: 12px; + } + > ul{ + border: none; + } } - } - &.right { - p { - text-align: right; + &.right{ + p{ + text-align: right; + } + ul{ + li{ + justify-content: flex-end; + } + } } - ul { - li { - justify-content: flex-end; - } - } - } } -.grid-btn-wrap { - padding-top: 15px; - text-align: right; - button { - padding: 0 10px; - } +.grid-btn-wrap{ + padding-top: 15px; + text-align: right; + button{ + padding: 0 10px; + } } // grid copy -.grid-option-tit { - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-normal-weight; - padding-bottom: 15px; +.grid-option-tit{ + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-normal-weight; + padding-bottom: 15px; + } -.grid-direction { - display: flex; - align-items: center; - gap: 5px; - flex: 1; +.grid-direction{ + display: flex; + align-items: center; + gap: 5px; + flex: 1; } -.direction { - width: 22px; - height: 22px; - background-color: #757575; - background-image: url(../../public/static/images/canvas/grid_option_arr.svg); - background-repeat: no-repeat; - background-position: center; - background-size: 16px 15px; - border-radius: 50%; - transition: all 0.15s ease-in-out; - opacity: 0.6; - &.down { - transform: rotate(180deg); - } - &.left { - transform: rotate(-90deg); - } - &.right { - transform: rotate(90deg); - } - &:hover, - &.act { - opacity: 1; - } +.direction{ + width: 22px; + height: 22px; + background-color: #757575; + background-image: url(../../public/static/images/canvas/grid_option_arr.svg); + background-repeat: no-repeat; + background-position: center; + background-size: 16px 15px; + border-radius: 50%; + transition: all .15s ease-in-out; + opacity: 0.6; + &.down{transform: rotate(180deg);} + &.left{transform: rotate(-90deg);} + &.right{transform: rotate(90deg);} + &:hover, + &.act{ + opacity: 1; + } } // grid-move -.move-form { - width: 100%; - p { - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-bold-weight; - } -} -.input-move-wrap { - display: flex; - align-items: center; - gap: 5px; - span { - color: $pop-color; - font-size: $pop-normal-size; - } - .input-move { - width: 130px; - input { - width: 100%; - } - } -} -.direction-move-wrap { - flex: none; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 5px; - margin-left: auto; -} - -// 배치면 초기 설정 -.placement-table { - table { - table-layout: fixed; - tr { - th { +.move-form{ + width: 100%; + p{ font-size: $pop-normal-size; color: $pop-color; font-weight: $pop-bold-weight; - padding: 18px 0; - border-bottom: 1px solid #424242; - vertical-align: middle; - .tip-wrap { - display: flex; - align-items: center; - } - } - td { - font-size: $pop-normal-size; - color: $pop-color; - border-bottom: 1px solid #424242; - padding: 18px 0 18px 20px; - vertical-align: middle; - .flex-box { - display: flex; - align-items: center; - } - } - &:first-child { - td, - th { - padding-top: 0; - } - } } - } - .tooltip { - position: relative; - display: block; - width: 15px; - height: 15px; - margin-left: 5px; - background: url(../../public/static/images/canvas/pop_tip.svg) no-repeat center; - background-size: cover; - } - &.light { - padding: 0; - th, - td { - color: $alert-color; - border-bottom: none; - border-top: 1px solid #efefef; - } - th { - padding: 14px 0; - } - tr { - &:first-child { - td, - th { - padding-top: 14px; - } - } - &:last-child { - td, - th { - padding-bottom: 0px; - } - } - } - } } - -.pop-form-radio { - display: flex; - align-items: center; - gap: 10px; -} -.placement-option { - display: flex; - align-items: center; - gap: 20px; -} -.select-wrap { - .sort-select { - width: 100%; - } -} -.flex-ment { - display: flex; - align-items: center; - gap: 5px; - span { - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-normal-weight; - } -} - -.img-edit-wrap { - flex: none; - .img-edit-btn { +.input-move-wrap{ display: flex; align-items: center; - height: 30px; - padding: 0 10px; - font-size: 12px; - font-weight: 400; - color: #101010; - background-color: #fff; - border-radius: 2px; - cursor: pointer; - transition: all 0.15s ease-in-out; - .img-edit { - width: 16px; - height: 16px; - background: url(../../public/static/images/canvas/img_edit_ico.svg) no-repeat center; - background-size: cover; - margin-right: 5px; + gap: 5px; + span{ + color: $pop-color; + font-size: $pop-normal-size; } - &:hover { - background-color: #ebebeb; + .input-move{ + width: 130px; + input{ + width: 100%; + } } - } } -.img-name-wrap { - display: flex; - align-items: center; - width: 100%; - margin-left: 10px; - input { - flex: 1; - } - .img-check { +.direction-move-wrap{ flex: none; - width: 18px; - height: 18px; - margin-left: 5px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - background-image: url(../../public/static/images/canvas/img_check_fail.svg); - } + display: grid; + grid-template-columns: 1fr 1fr; + gap: 5px; + margin-left: auto; } -.for-address { - input { - flex: 1; - } - .check-address { +// 배치면 초기 설정 +.placement-table{ + table{ + table-layout: fixed; + tr{ + th{ + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-bold-weight; + padding: 18px 0; + border-bottom: 1px solid #424242; + vertical-align: middle; + .tip-wrap{ + display: flex; + align-items: center; + } + } + td{ + font-size: $pop-normal-size; + color: $pop-color; + border-bottom: 1px solid #424242; + padding: 18px 0 18px 20px; + vertical-align: middle; + .flex-box{ + display: flex; + align-items: center; + } + } + &:first-child{ + td, + th{ + padding-top: 0; + } + } + } + } + .tooltip{ + position: relative; + display: block; + width: 15px; + height: 15px; + margin-left: 5px; + background: url(../../public/static/images/canvas/pop_tip.svg)no-repeat center; + background-size: cover; + } + &.light{ + padding: 0; + th,td{ + color: $alert-color; + border-bottom: none; + border-top: 1px solid #EFEFEF; + } + th{ + padding: 14px 0; + } + tr{ + &:first-child{ + td, + th{ + padding-top: 14px; + } + } + &:last-child{ + td, + th{ + padding-bottom: 0px; + } + } + } + } +} + +.pop-form-radio{ + display: flex; + align-items: center; + gap: 10px; +} +.placement-option{ + display: flex; + align-items: center; + gap: 20px; +} +.select-wrap{ + .sort-select{ + width: 100%; + } +} +.flex-ment{ + display: flex; + align-items: center; + gap: 5px; + span{ + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-normal-weight; + } + +} + +.img-edit-wrap{ flex: none; - width: 18px; - height: 18px; - margin-left: 5px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - &.fail { - background-image: url(../../public/static/images/canvas/img_check_fail.svg); + .img-edit-btn{ + display: flex; + align-items: center; + height: 30px; + padding: 0 10px; + font-size: 12px; + font-weight: 400; + color: #101010; + background-color: #fff; + border-radius: 2px; + cursor: pointer; + transition: all .15s ease-in-out; + .img-edit{ + width: 16px; + height: 16px; + background: url(../../public/static/images/canvas/img_edit_ico.svg)no-repeat center; + background-size: cover; + margin-right: 5px; + } + &:hover{ + background-color: #ebebeb; + } } - &.success { - background-image: url(../../public/static/images/canvas/img_check_success.svg); +} +.img-name-wrap{ + display: flex; + align-items: center; + width: 100%; + margin-left: 10px; + input{ + flex: 1; + + } + .img-check{ + flex: none; + width: 18px; + height: 18px; + margin-left: 5px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + background-image: url(../../public/static/images/canvas/img_check_fail.svg); + } +} + +.for-address{ + input{ + flex: 1; + } + .check-address{ + flex: none; + width: 18px; + height: 18px; + margin-left: 5px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + &.fail{background-image: url(../../public/static/images/canvas/img_check_fail.svg);} + &.success{background-image: url(../../public/static/images/canvas/img_check_success.svg);} } - } } // 외벽선 그리기 -.outline-wrap { - padding: 24px 0; - border-top: 1px solid #424242; - - .outline-inner { +.outline-wrap{ + padding: 24px 0; + border-top: 1px solid #424242; + + .outline-inner{ + display: flex; + align-items: center; + margin-bottom: 14px; + &:last-child{ + margin-bottom: 0; + } + .outline-form{ + // width: 50%; + margin-right: 15px; + } + } + &:last-child{ + border-bottom: 1px solid #424242; + } +} +.outline-form{ display: flex; align-items: center; - margin-bottom: 14px; - &:last-child { - margin-bottom: 0; + + span{ + width: 60px; + flex: none; + font-size: $pop-normal-size; + font-weight: $pop-bold-weight; + color: $pop-color; + margin-right: 10px; + &.thin{ + width: auto; + font-weight: $pop-normal-weight; + margin-right: 0; + } } - .outline-form { - // width: 50%; - margin-right: 15px; - } - } - &:last-child { - border-bottom: 1px solid #424242; - } -} -.outline-form { - display: flex; - align-items: center; - span { - width: 60px; - flex: none; - font-size: $pop-normal-size; - font-weight: $pop-bold-weight; - color: $pop-color; - margin-right: 10px; - &.thin { - width: auto; - font-weight: $pop-normal-weight; - margin-right: 0; + .reset-btn{ + flex: none; + width: 30px; + height: 30px; + background: transparent; + border: 1px solid #484848; + border-radius: 2px; + margin-left: 5px; + background-image: url(../../public/static/images/canvas/reset_ico.svg); + background-repeat: no-repeat; + background-size: 12px 12px; + background-position: center; + } + &:last-child{ + margin-right: 0; } - } - - .reset-btn { - flex: none; - width: 30px; - height: 30px; - background: transparent; - border: 1px solid #484848; - border-radius: 2px; - margin-left: 5px; - background-image: url(../../public/static/images/canvas/reset_ico.svg); - background-repeat: no-repeat; - background-size: 12px 12px; - background-position: center; - } - &:last-child { - margin-right: 0; - } } -.cul-wrap { - display: flex; - .outline-box { - width: 50%; - margin-right: 15px; - .outline-form { - width: 100%; - margin-bottom: 14px; - margin-right: 0; - &:last-child { - margin-bottom: 0; - } - } - } - .cul-box { +.cul-wrap{ display: flex; - align-items: center; - justify-content: center; - width: 50%; - background-color: #3d3d3d; - border-radius: 2px; - } + .outline-box{ + width: 50%; + margin-right: 15px; + .outline-form{ + width: 100%; + margin-bottom: 14px; + margin-right: 0; + &:last-child{ + margin-bottom: 0; + } + } + } + .cul-box{ + display: flex; + align-items: center; + justify-content: center; + width: 50%; + background-color: #3D3D3D; + border-radius: 2px ; + } } // 외벽선 속성 설정 -.properties-guide { - font-size: $pop-normal-size; - color: #aaa; - font-weight: $pop-normal-weight; - margin-bottom: 14px; +.properties-guide{ + font-size: $pop-normal-size; + color: #AAA; + font-weight: $pop-normal-weight; + margin-bottom: 14px; } -.setting-tit { - font-size: 13px; - color: $pop-color; - font-weight: $pop-bold-weight; - margin-bottom: 10px; +.setting-tit{ + font-size: 13px; + color: $pop-color; + font-weight: $pop-bold-weight; + margin-bottom: 10px; } -.properties-setting-wrap { - &.outer { - margin-top: 24px; - } - .setting-btn-wrap { - display: flex; - align-items: center; - padding: 14px 0; - border-top: 1px solid #424242; - border-bottom: 1px solid #424242; - .setting-btn { - display: block; - width: 100%; - height: 40px; - font-size: 13px; - color: #fff; - font-weight: 700; - border-radius: 2px; - transition: all 0.15s ease-in-out; - &.green { - background-color: #305941; - border: 1px solid #45cd7d; - &:hover { - background-color: #3a6b4e; - } - } - &.blue { - background-color: #2e5360; - border: 1px solid #3fbae6; - &:hover { - background-color: #365f6e; - } - } +.properties-setting-wrap{ + &.outer{ + margin-top: 24px; + } + .setting-btn-wrap{ + display: flex; + align-items: center; + padding: 14px 0; + border-top: 1px solid #424242; + border-bottom: 1px solid #424242; + .setting-btn{ + display: block; + width: 100%; + height: 40px; + font-size: 13px; + color: #fff; + font-weight: 700; + border-radius: 2px; + transition: all .15s ease-in-out; + &.green{ + background-color: #305941; + border: 1px solid #45CD7D; + &:hover{ + background-color: #3a6b4e; + } + } + &.blue{ + background-color: #2E5360; + border: 1px solid #3FBAE6; + &:hover{ + background-color: #365f6e; + } + } + } } - } } // 지붕형상 설정 -.roof-shape-menu { - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; - grid-template-rows: 1fr 1fr; - gap: 24px 10px; - margin-bottom: 24px; - .shape-box { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - padding: 13px; - background-color: #3d3d3d; - transition: background 0.15s ease-in-out; - img { - max-width: 100%; - } - } - .shape-title { - font-size: $pop-normal-size; - font-weight: $pop-bold-weight; - color: $pop-color; - margin-top: 10px; - text-align: center; - transition: color 0.15s ease-in-out; - } - .shape-menu-box { - &.act, - &:hover { - .shape-box { - background-color: #008bff; - } - .shape-title { - color: #008bff; - } - } - } -} - -.setting-box { - padding: 14px 0; - border-top: 1px solid #424242; - border-bottom: 1px solid #424242; -} -.padding-form { - padding-left: 23px; -} -.discrimination-box { - padding: 16px 12px; - border: 1px solid #3d3d3d; - border-radius: 2px; -} - -.modal-bottom-border-bx { - margin-top: 24px; - padding-bottom: 14px; - border-bottom: 1px solid #424242; -} - -// 처마∙케라바 변경 -.eaves-keraba-table { - display: table; - border-collapse: collapse; - .eaves-keraba-item { - display: table-row; - .eaves-keraba-th, - .eaves-keraba-td { - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-normal-weight; - display: table-cell; - vertical-align: middle; - padding-bottom: 14px; - } - .eaves-keraba-td { - padding-left: 10px; - } - .eaves-keraba-ico { - display: flex; - align-items: center; - justify-content: center; - padding: 5px; - background-color: #3d3d3d; - border: 1px solid #3d3d3d; - border-radius: 2px; - cursor: pointer; - &.act { - border: 1px solid #ed0004; - } - } - &:last-child { - .eaves-keraba-th, - .eaves-keraba-td { - padding-bottom: 0; - } - } - } -} -.guide { - font-size: $pop-normal-size; - font-weight: $pop-normal-weight; - color: $pop-color; - margin-bottom: 24px; - &.sm { - margin-bottom: 15px; - } - span { - display: block; - } -} - -// 지붕면 할당 -.allocation-select-wrap { - display: flex; - align-items: center; - padding-bottom: 14px; - border-bottom: 1px solid #424242; - margin-bottom: 14px; - span { - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-bold-weight; - margin-right: 10px; - } - .allocation-edit { - display: flex; - align-items: center; - height: 30px; - padding: 0 10px; - margin-left: 5px; - font-size: $pop-normal-size; - color: $pop-color; - font-weight: $pop-normal-weight; - border: 1px solid #484848; - background-color: #323234; - i { - display: block; - width: 12px; - height: 12px; - margin-right: 5px; - background: url(../../public/static/images/canvas/allocation_edit.svg) no-repeat center; - background-size: cover; - } - } -} - -.block-box { - display: flex; - align-items: center; - gap: 10px; - margin-bottom: 10px; - .flex-ment { - gap: 10px; - .dec { - text-decoration: underline; - } - .delete { - display: block; - width: 15px; - height: 15px; - background: url(../../public/static/images/canvas/allocation_delete.svg) no-repeat center; - background-size: cover; - } - } - &:last-child { - margin-bottom: 0; - } -} - -.icon-btn-wrap { - flex: 1; - display: flex; - align-items: center; - gap: 5px; - button { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 30px; - font-size: $pop-normal-size; - font-weight: $pop-normal-weight; - color: $pop-color; - border: 1px solid #646464; - border-radius: 2px; - padding: 0 10px; - transition: all 0.15s ease-in-out; - i { - height: 15px; - display: block; - margin-left: 10px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - transition: all 0.15s ease-in-out; - &.allocation01 { - background-image: url(../../public/static/images/canvas/allocation_icon01_white.svg); - width: 15px; - } - &.allocation02 { - background-image: url(../../public/static/images/canvas/allocation_icon02_white.svg); - width: 18px; - } - } - &.act, - &:hover { - color: #101010; - border: 1px solid #101010; - background-color: #fff; - i { - &.allocation01 { - background-image: url(../../public/static/images/canvas/allocation_icon01_black.svg); - } - &.allocation02 { - background-image: url(../../public/static/images/canvas/allocation_icon02_black.svg); - } - } - } - } -} - -// 경사설정 -.slope-wrap { - padding-bottom: 24px; - border-bottom: 1px solid #424242; -} - -// 면형상 배치 -.plane-frame-wrap { - display: flex; - gap: 10px; - .plane-shape-wrap { - flex: none; - width: 73px; - } -} - -.plane-shape-menu { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 5px; - .shape-menu-box { - border-radius: 2px; - width: 34px; - height: 34px; - background-color: #373737; - border: 1px solid #676767; - transition: - background 0.15s ease-in-out, - border 0.15s ease-in-out; - .shape-box { - display: flex; - justify-content: center; - align-items: center; - position: relative; - width: 100%; - height: 100%; - border-radius: 2px; - } - &.act, - &:hover { - border-color: #008bff; - background-color: #008bff; - } - } -} - -.shape-library { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 5px; - padding-top: 5px; - .library-btn { - width: 100%; - height: 34px; - border: 1px solid #6c6c6c; - border-radius: 2px; - background-color: #373737; - background-repeat: no-repeat; - background-position: center; - transition: all 0.15s ease-in-out; - &.ico01 { - background-image: url(../../public/static/images/canvas/shape_labrary01.svg); - background-size: 19px 18px; - } - &.ico02 { - background-image: url(../../public/static/images/canvas/shape_labrary02.svg); - background-size: 15px 20px; - } - &.ico03 { - background-image: url(../../public/static/images/canvas/shape_labrary03.svg); - background-size: 19px 16px; - } - &:hover { - border-color: #1083e3; - background-color: #1083e3; - } - } -} - -.plane-detail-wrap { - display: flex; - flex-direction: column; - flex: 1; -} -.plane-shape-wrapper { - flex: 1; - display: flex; - flex-direction: column; - gap: 10px; - .plane-box { - width: 100%; - padding: 10px 18px; - border-radius: 2px; - background-color: #313131; - border: 1px solid #484848; - .plane-box-tit { - font-size: $pop-normal-size; - font-weight: 600; - color: $pop-color; - margin-bottom: 10px; - } - &.shape-box { - .shape-box-inner { - display: flex; - gap: 15px; - min-height: 140px; - .shape-img { - position: relative; - flex: none; - width: 150px; - background-color: #fff; - border-radius: 2px; - img { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - } - .shape-data { - flex: 1; - .eaves-keraba-table { - .eaves-keraba-item { - .eaves-keraba-th, - .eaves-keraba-td { - padding-bottom: 10px; - } - &:last-child { - .eaves-keraba-th, - .eaves-keraba-td { - padding-bottom: 0px; - } - } - } - } - } - } - } - &.direction-box { - flex: 1; - display: flex; - flex-direction: column; - .plane-direction-box { - flex: 1; +.roof-shape-menu{ + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 24px 10px; + margin-bottom: 24px; + .shape-box{ display: flex; align-items: center; justify-content: center; width: 100%; - } + padding: 13px; + background-color: #3D3D3D; + transition: background .15s ease-in-out; + img{ + max-width: 100%; + } } - } -} -.plane-direction { - width: 150px; - position: relative; - height: 120px; - span { - position: absolute; - font-size: 12px; - font-weight: 500; - color: #b1b1b1; - &.top { - top: 0; - left: 50%; - transform: translateX(-50%); + .shape-title{ + font-size: $pop-normal-size; + font-weight: $pop-bold-weight; + color: $pop-color; + margin-top: 10px; + text-align: center; + transition: color .15s ease-in-out; } - &.right { - top: 50%; - right: 0; - transform: translateY(-50%); + .shape-menu-box{ + &.act, + &:hover{ + .shape-box{background-color: #008BFF;} + .shape-title{color: #008BFF;} + } } - &.bottom { - bottom: 0; - left: 50%; - transform: translateX(-50%); - } - &.left { - top: 50%; - left: 0; - transform: translateY(-50%); - } - } - .plane-btn { - position: absolute; - width: 28px; - height: 28px; - background-color: #777777; - background-image: url(../../public/static/images/canvas/plane_arr.svg); - background-size: 12px 13px; - background-repeat: no-repeat; - background-position: center; - border-radius: 50%; - transition: all 0.15s ease-in-out; - &.up { - top: 22px; - left: 50%; - transform: translateX(-50%); - } - &.right { - top: 50%; - right: 32px; - transform: translateY(-50%) rotate(90deg); - } - &.down { - bottom: 22px; - left: 50%; - transform: translateX(-50%) rotate(180deg); - } - &.left { - top: 50%; - left: 32px; - transform: translateY(-50%) rotate(270deg); - } - &:hover, - &.act { - background-color: #fff; - background-image: url(../../public/static/images/canvas/plane_arr_act.svg); - } - } } -.plane-tab-guide { - font-size: $pop-normal-size; - font-weight: $pop-normal-weight; - color: $pop-color; - margin-top: 10px; +.setting-box{ + padding: 14px 0; + border-top: 1px solid #424242; + border-bottom: 1px solid #424242; } -.plane-shape-btn { - padding-top: 10px; - margin-top: auto; - button { - display: block; - width: 100%; - } +.padding-form{ + padding-left: 23px; +} +.discrimination-box{ + padding: 16px 12px; + border: 1px solid #3D3D3D; + border-radius: 2px; } -// 오브젝트 배치 -.mb-box { - margin-bottom: 24px; +.modal-bottom-border-bx{ + margin-top: 24px; + padding-bottom: 14px; + border-bottom: 1px solid #424242; } -.object-direction-wrap { - display: flex; - align-items: center; - justify-content: center; -} -.discrimination-tit { - font-size: 13px; - color: #fff; - font-weight: 500; -} - -.object-size-wrap { - display: flex; - min-height: 206px; - gap: 24px; - margin-top: 14px; - .object-size-img { - position: relative; - flex: none; - width: 200px; - background-color: #fff; - img { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); +// 처마∙케라바 변경 +.eaves-keraba-table{ + display: table; + border-collapse: collapse; + .eaves-keraba-item{ + display: table-row; + .eaves-keraba-th, + .eaves-keraba-td{ + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-normal-weight; + display: table-cell; + vertical-align: middle; + padding-bottom: 14px; + } + .eaves-keraba-td{ + padding-left: 10px; + } + .eaves-keraba-ico{ + display: flex; + align-items: center; + justify-content: center; + padding: 5px; + background-color: #3D3D3D; + border: 1px solid #3D3D3D; + border-radius: 2px; + cursor: pointer; + &.act{ + border: 1px solid #ED0004; + } + } + &:last-child{ + .eaves-keraba-th, + .eaves-keraba-td{ + padding-bottom: 0; + } + } + } +} +.guide{ + font-size: $pop-normal-size; + font-weight: $pop-normal-weight; + color: $pop-color; + margin-bottom: 24px; + &.sm{ + margin-bottom: 15px; + } + span{ + display: block; } - } } -// 표시변경 -.display-change-wrap { - margin: 24px 0; -} -.warning { - font-size: $pop-normal-size; - font-weight: $pop-normal-weight; - color: #ffafaf; +// 지붕면 할당 +.allocation-select-wrap{ + display: flex; + align-items: center; + padding-bottom: 14px; + border-bottom: 1px solid #424242; + margin-bottom: 14px; + span{ + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-bold-weight; + margin-right: 10px; + } + .allocation-edit{ + display: flex; + align-items: center; + height: 30px; + padding: 0 10px; + margin-left: 5px; + font-size: $pop-normal-size; + color: $pop-color; + font-weight: $pop-normal-weight; + border: 1px solid #484848; + background-color: #323234; + i{ + display: block; + width: 12px; + height: 12px; + margin-right: 5px; + background: url(../../public/static/images/canvas/allocation_edit.svg)no-repeat center; + background-size: cover; + } + } } -// 각 변 속성 변경 -.radio-grid-wrap { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 24px 15px; +.block-box{ + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 10px; + .flex-ment{ + gap: 10px; + .dec{ + text-decoration: underline; + } + .delete{ + display: block; + width: 15px; + height: 15px; + background: url(../../public/static/images/canvas/allocation_delete.svg)no-repeat center; + background-size: cover; + } + } + &:last-child{ + margin-bottom: 0; + } } -// 면 흐름 설정 -.drawing-flow-wrap { - display: flex; - gap: 10px; - .discrimination-box { +.icon-btn-wrap{ + flex: 1; + display: flex; + align-items: center; + gap: 5px; + button{ + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 30px; + font-size: $pop-normal-size; + font-weight: $pop-normal-weight; + color: $pop-color; + border: 1px solid #646464; + border-radius: 2px; + padding: 0 10px; + transition: all .15s ease-in-out; + i{ + height: 15px; + display: block; + margin-left: 10px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + transition: all .15s ease-in-out; + &.allocation01{ + background-image: url(../../public/static/images/canvas/allocation_icon01_white.svg); + width: 15px; + } + &.allocation02{ + background-image: url(../../public/static/images/canvas/allocation_icon02_white.svg); + width: 18px; + } + } + &.act, + &:hover{ + color: #101010; + border: 1px solid #101010; + background-color: #fff; + i{ + &.allocation01{ + background-image: url(../../public/static/images/canvas/allocation_icon01_black.svg); + } + &.allocation02{ + background-image: url(../../public/static/images/canvas/allocation_icon02_black.svg); + } + } + } + } +} + +// 경사설정 +.slope-wrap{ + padding-bottom: 24px; + border-bottom: 1px solid #424242; +} + +// 면형상 배치 +.plane-frame-wrap{ + display: flex; + gap: 10px; + .plane-shape-wrap{ + flex: none; + width: 73px; + } +} + +.plane-shape-menu{ + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 5px; + .shape-menu-box{ + border-radius: 2px; + width: 34px; + height: 34px; + background-color: #373737; + border: 1px solid #676767; + transition: background .15s ease-in-out, border .15s ease-in-out; + .shape-box{ + display: flex; + justify-content: center; + align-items: center; + position: relative; + width: 100%; + height: 100%; + border-radius: 2px; + } + &.act, + &:hover{ + border-color: #008BFF; + background-color: #008BFF; + } + } +} + +.shape-library{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 5px; + padding-top: 5px; + .library-btn{ + width: 100%; + height: 34px; + border: 1px solid #6C6C6C; + border-radius: 2px; + background-color: #373737; + background-repeat: no-repeat; + background-position: center; + transition: all .15s ease-in-out; + &.ico01{background-image: url(../../public/static/images/canvas/shape_labrary01.svg); background-size: 19px 18px;} + &.ico02{background-image: url(../../public/static/images/canvas/shape_labrary02.svg); background-size: 15px 20px;} + &.ico03{background-image: url(../../public/static/images/canvas/shape_labrary03.svg); background-size: 19px 16px;} + &:hover{ + border-color: #1083E3; + background-color: #1083E3; + } + } +} + +.plane-detail-wrap{ + display: flex; + flex-direction: column; + flex: 1; +} +.plane-shape-wrapper{ flex: 1; display: flex; flex-direction: column; - .object-direction-wrap { - flex: 1; + gap: 10px; + .plane-box{ + width: 100%; + padding: 10px 18px; + border-radius: 2px; + background-color: #313131; + border: 1px solid #484848; + .plane-box-tit{ + font-size: $pop-normal-size; + font-weight: 600; + color: $pop-color; + margin-bottom: 10px; + } + &.shape-box{ + .shape-box-inner{ + display: flex; + gap:15px; + min-height: 140px; + .shape-img{ + position: relative; + flex: none; + width: 150px; + background-color: #fff; + border-radius: 2px; + img{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + } + .shape-data{ + flex: 1; + .eaves-keraba-table{ + .eaves-keraba-item{ + .eaves-keraba-th, + .eaves-keraba-td{ + padding-bottom: 10px; + } + &:last-child{ + .eaves-keraba-th, + .eaves-keraba-td{ + padding-bottom: 0px; + } + } + } + } + } + } + } + &.direction-box{ + flex: 1; + display: flex; + flex-direction: column; + .plane-direction-box{ + flex: 1; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + } + } } - &:first-child { - flex: none; - width: 195px; +} +.plane-direction{ + width: 150px; + position: relative; + height: 120px; + span{ + position: absolute; + font-size: 12px; + font-weight: 500; + color: #B1B1B1; + &.top{top: 0; left: 50%; transform: translateX(-50%);} + &.right{top: 50%; right: 0; transform: translateY(-50%);} + &.bottom{bottom: 0; left: 50%; transform: translateX(-50%);} + &.left{top: 50%; left: 0; transform: translateY(-50%);} + } + .plane-btn{ + position: absolute; + width: 28px; + height: 28px; + background-color: #777777; + background-image: url(../../public/static/images/canvas/plane_arr.svg); + background-size: 12px 13px; + background-repeat: no-repeat; + background-position: center; + border-radius: 50%; + transition: all .15s ease-in-out; + &.up{top: 22px; left: 50%; transform: translateX(-50%);} + &.right{top: 50%; right: 32px; transform: translateY(-50%) rotate(90deg);} + &.down{bottom: 22px; left: 50%; transform: translateX(-50%) rotate(180deg);} + &.left{top: 50%; left: 32px; transform: translateY(-50%) rotate(270deg);} + &:hover, + &.act{ + background-color: #fff; + background-image: url(../../public/static/images/canvas/plane_arr_act.svg); + } } - } } -.compas-box { - display: flex; - align-items: center; - justify-content: center; +.plane-tab-guide{ + font-size: $pop-normal-size; + font-weight: $pop-normal-weight; + color: $pop-color; + margin-top: 10px; +} +.plane-shape-btn{ + padding-top: 10px; + margin-top: auto; + button{ + display: block; + width: 100%; + } +} + +// 오브젝트 배치 +.mb-box{ + margin-bottom: 24px; +} + +.object-direction-wrap{ + display: flex; + align-items: center; + justify-content: center; +} +.discrimination-tit{ + font-size: 13px; + color: #fff; + font-weight: 500; +} + +.object-size-wrap{ + display: flex; + min-height: 206px; + gap: 24px; + margin-top: 14px; + .object-size-img{ + position: relative; + flex: none; + width: 200px; + background-color: #fff; + img{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + } +} + +// 표시변경 +.display-change-wrap{ + margin: 24px 0; +} +.warning{ + font-size: $pop-normal-size; + font-weight: $pop-normal-weight; + color: #FFAFAF; +} + +// 각 변 속성 변경 +.radio-grid-wrap{ + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 24px 15px; +} + +// 면 흐름 설정 +.drawing-flow-wrap{ + display: flex; + gap: 10px; + .discrimination-box{ + flex: 1; + display: flex; + flex-direction: column; + .object-direction-wrap{ + flex: 1; + } + &:first-child{ + flex: none; + width: 195px; + } + } +} + +.compas-box{ + display: flex; + align-items: center; + justify-content: center; } .compas-box-inner { - position: relative; - width: 200px; - height: 200px; - border-radius: 50%; - - .circle { - position: absolute; - width: 12px; - height: 12px; - border: 1px solid #fff; + position: relative; + width: 200px; + height: 200px; border-radius: 50%; - top: 95%; - left: 50%; - transform-origin: 0 -90px; /* 중심에서 반지름 거리만큼 떨어져 위치 */ - cursor: pointer; - z-index: 3; - /* 0번을 180도 위치(아래)에, 13번을 0도 위치(위)에 배치 */ - i { - position: absolute; - top: 12.5px; - left: 50%; - font-size: 11px; - color: #8b8b8b; - font-weight: 500; - -webkit-user-select: none; - -moz-user-select: none; - -ms-use-select: none; - user-select: none; + + .circle { + position: absolute; + width: 12px; + height: 12px; + border: 1px solid #fff; + border-radius: 50%; + top: 95%; + left: 50%; + transform-origin: 0 -90px; /* 중심에서 반지름 거리만큼 떨어져 위치 */ + cursor:pointer; + z-index: 3; + /* 0번을 180도 위치(아래)에, 13번을 0도 위치(위)에 배치 */ + i{ + position: absolute; + top: 12.5px; + left: 50%; + font-size: 11px; + color: #8B8B8B; + font-weight: 500; + -webkit-user-select: none; + -moz-user-select: none; + -ms-use-select: none; + user-select: none; + } + &:nth-child(1) { transform: rotate(180deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(180deg);}} + &:nth-child(2) { transform: rotate(195deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(165deg);}} + &:nth-child(3) { transform: rotate(210deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(150deg);}} + &:nth-child(4) { transform: rotate(225deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(135deg);}} + &:nth-child(5) { transform: rotate(240deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(120deg);}} + &:nth-child(6) { transform: rotate(255deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(105deg);}} + &:nth-child(7) { transform: rotate(270deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(90deg);}} + &:nth-child(8) { transform: rotate(285deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(75deg);}} + &:nth-child(9) { transform: rotate(300deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(60deg);}} + &:nth-child(10) { transform: rotate(315deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(45deg);}} + &:nth-child(11) { transform: rotate(330deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(30deg);}} + &:nth-child(12) { transform: rotate(345deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(15deg);}} + &:nth-child(13) { transform: rotate(0deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(0deg);}} + &:nth-child(14) { transform: rotate(15deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-15deg);}} + &:nth-child(15) { transform: rotate(30deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-30deg);}} + &:nth-child(16) { transform: rotate(45deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-45deg);}} + &:nth-child(17) { transform: rotate(60deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-60deg);}} + &:nth-child(18) { transform: rotate(75deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-75deg);}} + &:nth-child(19) { transform: rotate(90deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-90deg);}} + &:nth-child(20) { transform: rotate(105deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-105deg);}} + &:nth-child(21) { transform: rotate(120deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-120deg);}} + &:nth-child(22) { transform: rotate(135deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-135deg);}} + &:nth-child(23) { transform: rotate(150deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-150deg);}} + &:nth-child(24) { transform: rotate(165deg) translate(-50%, -50%); i{transform: translateX(-50%) rotate(-165deg);}} + &.act{ + &::after{ + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 5px; + height: 5px; + background-color: #fff; + border-radius: 50%; + } + i{ + color: #fff; + } + } } - &:nth-child(1) { - transform: rotate(180deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(180deg); - } - } - &:nth-child(2) { - transform: rotate(195deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(165deg); - } - } - &:nth-child(3) { - transform: rotate(210deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(150deg); - } - } - &:nth-child(4) { - transform: rotate(225deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(135deg); - } - } - &:nth-child(5) { - transform: rotate(240deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(120deg); - } - } - &:nth-child(6) { - transform: rotate(255deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(105deg); - } - } - &:nth-child(7) { - transform: rotate(270deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(90deg); - } - } - &:nth-child(8) { - transform: rotate(285deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(75deg); - } - } - &:nth-child(9) { - transform: rotate(300deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(60deg); - } - } - &:nth-child(10) { - transform: rotate(315deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(45deg); - } - } - &:nth-child(11) { - transform: rotate(330deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(30deg); - } - } - &:nth-child(12) { - transform: rotate(345deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(15deg); - } - } - &:nth-child(13) { - transform: rotate(0deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(0deg); - } - } - &:nth-child(14) { - transform: rotate(15deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-15deg); - } - } - &:nth-child(15) { - transform: rotate(30deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-30deg); - } - } - &:nth-child(16) { - transform: rotate(45deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-45deg); - } - } - &:nth-child(17) { - transform: rotate(60deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-60deg); - } - } - &:nth-child(18) { - transform: rotate(75deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-75deg); - } - } - &:nth-child(19) { - transform: rotate(90deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-90deg); - } - } - &:nth-child(20) { - transform: rotate(105deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-105deg); - } - } - &:nth-child(21) { - transform: rotate(120deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-120deg); - } - } - &:nth-child(22) { - transform: rotate(135deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-135deg); - } - } - &:nth-child(23) { - transform: rotate(150deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-150deg); - } - } - &:nth-child(24) { - transform: rotate(165deg) translate(-50%, -50%); - i { - transform: translateX(-50%) rotate(-165deg); - } - } - &.act { - &::after { - content: ''; + .compas{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); - width: 5px; - height: 5px; - background-color: #fff; + width: 148px; + height: 148px; + border: 4px solid #fff; border-radius: 50%; - } - i { - color: #fff; - } + .compas-arr{ + width: 100%; + height: 100%; + background: url(../../public/static/images/canvas/compas.svg)no-repeat center; + background-size: 122px 122px; + } } - } - .compas { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 148px; - height: 148px; - border: 4px solid #fff; - border-radius: 50%; - .compas-arr { - width: 100%; - height: 100%; - background: url(../../public/static/images/canvas/compas.svg) no-repeat center; - background-size: 122px 122px; - } - } } -.draw-flow-wrap { - margin: 10px 0; +.draw-flow-wrap{ + margin: 10px 0; } // 지붕모듈선택 -.roof-module-tab { - display: flex; - align-items: center; - gap: 10px; - margin-bottom: 14px; - .module-tab-bx { +.roof-module-tab{ + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 14px; + .module-tab-bx{ + flex: 1; + height: 34px; + line-height: 31px; + border: 1px solid #484848; + border-radius: 2px; + background-color: transparent; + font-size: 12px; + color: #AAA; + text-align: center; + cursor: default; + transition: all .15s ease-in-out; + &.act{ + background-color: #1083E3; + border: 1px solid #1083E3; + color: #fff; + font-weight: 500; + } + } + .tab-arr{ + display: block; + width: 9px; + height: 14px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; + background-image: url(../../public/static/images/canvas/module_tab_arr.svg); + transition: all .15s ease-in-out; + &.act{ + background-image: url(../../public/static/images/canvas/module_tab_arr_white.svg); + } + } +} + +.roof-module-compas{ + margin-bottom: 24px; + .compas-box-inner{ + width: 280px; + height: 253px; + .circle{ + top: 86%; + &:nth-child(1), + &:nth-child(7), + &:nth-child(13), + &:nth-child(19){ + &::before{ + content: ''; + position: absolute; + top: 20px; + left: 50%; + transform: translateX(-50%); + width: 1px; + height: 6px; + background-color: #8B8B8B; + } + } + i{ + top: 32px; + } + &.act{ + i{color: #8B8B8B;} + } + } + } +} +.center-wrap{ + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; +} + +.module-table-flex-wrap{ + display: flex; + gap: 10px; + .outline-form{ + flex: 1; + } +} + +.module-box-tab{ + display: flex; + .module-btn{ + flex: 1; + border-top: 1px solid #505050; + border-bottom: 1px solid #505050; + border-right: 1px solid #505050; + background-color: #454545; + color: #fff; + height: 30px; + font-size: 12px; + font-weight: 400; + transition: all .15s ease-in-out; + &:first-child{ + border-left: 1px solid #505050; + } + &.act{ + border-color: #fff; + background-color: #fff; + color: #101010; + } + } +} + +.module-table-box{ flex: 1; - height: 34px; - line-height: 31px; - border: 1px solid #484848; + background-color: #3D3D3D; border-radius: 2px; - background-color: transparent; - font-size: 12px; - color: #aaa; - text-align: center; - cursor: default; - transition: all 0.15s ease-in-out; - &.act { - background-color: #1083e3; - border: 1px solid #1083e3; - color: #fff; - font-weight: 500; - } - } - .tab-arr { - display: block; - width: 9px; - height: 14px; - background-repeat: no-repeat; - background-position: center; - background-size: cover; - background-image: url(../../public/static/images/canvas/module_tab_arr.svg); - transition: all 0.15s ease-in-out; - &.act { - background-image: url(../../public/static/images/canvas/module_tab_arr_white.svg); - } - } -} - -.roof-module-compas { - margin-bottom: 24px; - .compas-box-inner { - width: 280px; - height: 253px; - .circle { - top: 86%; - &:nth-child(1), - &:nth-child(7), - &:nth-child(13), - &:nth-child(19) { - &::before { - content: ''; - position: absolute; - top: 20px; - left: 50%; - transform: translateX(-50%); - width: 1px; - height: 6px; - background-color: #8b8b8b; + .module-table-inner{ + padding: 10px; + .outline-form{ + span{ + width: auto; + } } - } - i { - top: 32px; - } - &.act { - i { - color: #8b8b8b; + .module-table-tit{ + padding: 10px 0; + font-size: 12px; + color: #fff; + border-bottom: 1px solid #4D4D4D; + } + .eaves-keraba-table{ + width: 100%; + margin-top: 15px; + .eaves-keraba-th{ + width: 72px; + } + .eaves-keraba-th, + .eaves-keraba-td{ + padding-bottom: 5px; + } + } + .self-table-tit{ + font-size: 12px; + font-weight: 500; + color: #fff; + padding-bottom: 15px; + } + } + .warning-guide{ + padding: 20px; + .warning{ + color: #FFCACA; + max-height: 55px; + overflow-y: auto; + padding-right: 30px; + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #D9D9D9; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } } - } } - } -} -.center-wrap { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; } -.module-table-flex-wrap { - display: flex; - gap: 10px; - .outline-form { - flex: 1; - } +.module-self-table{ + display: table; + border-top: 1px solid #4D4D4D; + border-collapse: collapse; + width: 100%; + .self-table-item{ + display: table-row; + .self-item-td, + .self-item-th{ + display: table-cell; + vertical-align: middle; + border-bottom: 1px solid #4D4D4D; + } + .self-item-th{ + width: 60px; + font-size: 12px; + font-weight: 500; + color: #fff; + } + .self-item-td{ + font-size: 12px; + font-weight: 400; + color: #fff; + padding: 15px 20px; + } + } } -.module-box-tab { - display: flex; - .module-btn { - flex: 1; - border-top: 1px solid #505050; - border-bottom: 1px solid #505050; - border-right: 1px solid #505050; - background-color: #454545; - color: #fff; - height: 30px; - font-size: 12px; - font-weight: 400; - transition: all 0.15s ease-in-out; - &:first-child { - border-left: 1px solid #505050; - } - &.act { - border-color: #fff; - background-color: #fff; - color: #101010; - } - } -} - -.module-table-box { - flex: 1; - background-color: #3d3d3d; - border-radius: 2px; - .module-table-inner { - padding: 10px; - .outline-form { - span { - width: auto; - } - } - .module-table-tit { - padding: 10px 0; - font-size: 12px; - color: #fff; - border-bottom: 1px solid #4d4d4d; - } - .eaves-keraba-table { - width: 100%; - margin-top: 15px; - .eaves-keraba-th { - width: 72px; - } - .eaves-keraba-th, - .eaves-keraba-td { - padding-bottom: 5px; - } - } - .self-table-tit { - font-size: 12px; - font-weight: 500; - color: #fff; - padding-bottom: 15px; - } - } - .warning-guide { - padding: 20px; - .warning { - color: #ffcaca; - max-height: 55px; - overflow-y: auto; - padding-right: 30px; - &::-webkit-scrollbar { - width: 4px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background-color: #d9d9d9; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } - } - } -} - -.module-self-table { - display: table; - border-top: 1px solid #4d4d4d; - border-collapse: collapse; - width: 100%; - .self-table-item { - display: table-row; - .self-item-td, - .self-item-th { - display: table-cell; - vertical-align: middle; - border-bottom: 1px solid #4d4d4d; - } - .self-item-th { - width: 60px; - font-size: 12px; - font-weight: 500; - color: #fff; - } - .self-item-td { - font-size: 12px; - font-weight: 400; - color: #fff; - padding: 15px 20px; - } - } -} - -.self-table-flx { - display: flex; - align-items: center; - margin-top: 15px; - button { - margin-left: auto; - } -} -.hexagonal-wrap { - .hexagonal-item { - padding: 15px 0; - border-bottom: 1px solid #4d4d4d; - &:first-child { - padding-top: 0; - } - &:last-child { - padding-bottom: 0; - border: none; - } - .hexagonal-flx-auto { - display: flex; - justify-content: space-between; - } - .hexagonal-flx { - display: flex; - align-items: center; - button { +.self-table-flx{ + display: flex; + align-items: center; + margin-top: 15px; + button{ margin-left: auto; - } } - } +} +.hexagonal-wrap{ + .hexagonal-item{ + padding: 15px 0; + border-bottom: 1px solid #4D4D4D; + &:first-child{ + padding-top: 0; + } + &:last-child{ + padding-bottom: 0; + border: none; + } + .hexagonal-flx-auto{ + display: flex; + justify-content: space-between; + } + .hexagonal-flx{ + display: flex; + align-items: center; + button{ + margin-left: auto; + } + } + } } // 회로 및 가대설정 -.circuit-check-inner { - padding: 5px 0; +.circuit-check-inner{ + padding: 5px 0; } -.x-scroll-table { - overflow-x: auto; - padding-bottom: 5px; - .roof-module-table { - min-width: 1200px; - } - &::-webkit-scrollbar { - height: 4px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background-color: #d9d9d9; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } -} - -.circuit-right-wrap { - display: flex; - justify-content: flex-end; -} - -.circuit-data-form { - display: flex; - flex-direction: column; - gap: 5px; - min-height: 60px; - padding: 12px; - border: 1px solid rgba(255, 255, 255, 0.2); - span { - display: inline-flex; - align-items: center; - .del { - display: block; - margin-left: 10px; - width: 15px; - height: 15px; - background: url(../../public/static/images/canvas/circuit_del.svg) no-repeat center; - background-size: cover; +.x-scroll-table{ + overflow-x: auto; + padding-bottom: 5px; + .roof-module-table{ + min-width: 1200px; + } + &::-webkit-scrollbar { + height: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #D9D9D9; + } + &::-webkit-scrollbar-track { + background-color: transparent; } - } -} -.circuit-table-tit { - color: #fff; - font-size: 12px; - font-weight: 600; - padding: 11px 10px; - background-color: #474747; - border: 1px solid #505050; - border-bottom: none; } -.circuit-overflow { - max-height: 400px; - overflow-y: auto; - margin-bottom: 15px; - &::-webkit-scrollbar { - width: 4px; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background-color: #d9d9d9; - } - &::-webkit-scrollbar-track { - background-color: transparent; - } +.circuit-right-wrap{ + display: flex; + justify-content: flex-end; } -.circuit-table-flx-wrap { - display: flex; - gap: 10px; - margin-bottom: 10px; - .circuit-table-flx-box { - flex: 1; +.circuit-data-form{ display: flex; flex-direction: column; - .bottom-wrap { - margin-top: auto; + gap: 5px; + min-height: 60px; + padding: 12px; + border: 1px solid rgba(255, 255, 255, 0.20); + span{ + display: inline-flex; + align-items: center; + .del{ + display: block; + margin-left: 10px; + width: 15px; + height: 15px; + background: url(../../public/static/images/canvas/circuit_del.svg)no-repeat center; + background-size: cover; + } } - .roof-module-table { - table { - table-layout: fixed; - } - } - } +} +.circuit-table-tit{ + color: #fff; + font-size: 12px; + font-weight: 600; + padding: 11px 10px; + background-color: #474747; + border: 1px solid #505050; + border-bottom: none; } -.circuit-count-input { - display: flex; - align-items: center; - gap: 10px; +.circuit-overflow{ + max-height: 400px; + overflow-y: auto; + margin-bottom: 15px; + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #D9D9D9; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } +} + +.circuit-table-flx-wrap{ + display: flex; + gap: 10px; + margin-bottom: 10px; + .circuit-table-flx-box{ + flex: 1; + display: flex; + flex-direction: column; + .bottom-wrap{ + margin-top: auto; + } + .roof-module-table{ + table{ + table-layout: fixed; + } + } + } +} + +.circuit-count-input{ + display: flex; + align-items: center; + gap: 10px; } // 모듈부가기능 -.additional-radio-wrap { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 15px 0; - margin-bottom: 24px; +.additional-radio-wrap{ + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 15px 0; + margin-bottom: 24px; } -.additional-wrap { - padding: 24px 0; - border-top: 1px solid #424242; +.additional-wrap{ + padding: 24px 0; + border-top: 1px solid #424242; } -.additional-color-wrap { - display: flex; - align-items: center; - padding: 5px 0; - gap: 15px; - .additional-color-box { +.additional-color-wrap{ display: flex; align-items: center; - gap: 8px; - .additional-color { - display: block; - width: 16px; - height: 16px; - &.pink { - border: 2px solid #ce1c9c; - background-color: #16417d; - } - &.white { - border: 2px solid #fff; - background-color: #001027; - } + padding: 5px 0; + gap: 15px; + .additional-color-box{ + display: flex; + align-items: center; + gap: 8px; + .additional-color{ + display: block; + width: 16px; + height: 16px; + &.pink{ + border: 2px solid #ce1c9c; + background-color: #16417D; + } + &.white{ + border: 2px solid #FFF; + background-color: #001027; + } + } } - } } // color setting -.color-setting-wrap { - padding-bottom: 15px; - border-bottom: 1px solid #424242; - .color-tit { - font-size: 13px; - font-weight: 500; - color: #ffffff; - margin-bottom: 10px; - } - .color-picker { - .react-colorful { - width: 100%; - height: auto; - gap: 20px; - .react-colorful__pointer { - width: 15px; - height: 15px; - border: 4px solid #fff; - } - .react-colorful__saturation { - border-radius: 2px; - height: 200px; - border-bottom: 5px solid #000; - } - .react-colorful__last-control { - border-radius: 2px; - height: 10px; - } - } - .hex-color-box { - display: flex; - align-items: center; - margin-top: 15px; - .color-box-tit { - font-size: 12px; - color: #fff; +.color-setting-wrap{ + padding-bottom: 15px; + border-bottom: 1px solid #424242; + .color-tit{ + font-size: 13px; font-weight: 500; - margin-right: 10px; - } - .color-hex-input { - width: 150px; - margin-right: 5px; - input { - width: 100%; - } - } - .color-box { - display: block; - width: 30px; - height: 30px; - border-radius: 4px; - } + color: #ffffff; + margin-bottom: 10px; } - .default-color-wrap { - margin-top: 25px; - .default-tit { + .color-picker{ + .react-colorful{ + width: 100%; + height: auto; + gap: 20px; + .react-colorful__pointer{ + width: 15px; + height: 15px; + border: 4px solid #Fff; + } + .react-colorful__saturation{ + border-radius: 2px; + height: 200px; + border-bottom: 5px solid #000; + } + .react-colorful__last-control{ + border-radius: 2px; + height: 10px; + } + } + .hex-color-box{ + display: flex; + align-items: center; + margin-top: 15px; + .color-box-tit{ + font-size: 12px; + color: #fff; + font-weight: 500; + margin-right: 10px; + } + .color-hex-input{ + width: 150px; + margin-right: 5px; + input{ + width: 100%; + } + } + .color-box{ + display: block; + width: 30px; + height: 30px; + border-radius: 4px; + } + } + .default-color-wrap{ + margin-top: 25px; + .default-tit{ + font-size: 12px; + font-weight: 500; + color: #fff; + margin-bottom: 10px; + } + .color-button-wrap{ + display: grid; + grid-template-columns: repeat(8, 1fr); + gap: 21px; + .default-color{ + display: block; + width: 100%; + height: 30px; + border-radius: 4px; + } + } + } + } +} + +// 글꼴 설정 팝업 +.font-option-warp{ + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 15px 5px; + margin-bottom: 15px; + .font-option-item{ + .option-item-tit{ + font-size: 12px; + font-weight: 500; + color: #fff; + margin-bottom: 10px; + } + } +} +.font-ex-wrap{ + margin-bottom: 15px; + .font-ex-tit{ font-size: 12px; font-weight: 500; color: #fff; margin-bottom: 10px; - } - .color-button-wrap { - display: grid; - grid-template-columns: repeat(8, 1fr); - gap: 21px; - .default-color { - display: block; - width: 100%; - height: 30px; - border-radius: 4px; - } - } } - } -} - -// 글꼴 설정 팝업 -.font-option-warp { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 15px 5px; - margin-bottom: 15px; - .font-option-item { - .option-item-tit { - font-size: 12px; - font-weight: 500; - color: #fff; - margin-bottom: 10px; + .font-ex-box{ + display: flex; + align-items: center; + justify-content: center; + width: 100%; + min-height: 80px; + background-color: #fff; } - } -} -.font-ex-wrap { - margin-bottom: 15px; - .font-ex-tit { - font-size: 12px; - font-weight: 500; - color: #fff; - margin-bottom: 10px; - } - .font-ex-box { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - min-height: 80px; - background-color: #fff; - } + } // 치수선 설정 -.font-btn-wrap { - margin-bottom: 15px; - button { - width: 100%; - height: 30px; - line-height: 28px; - } -} - -.line-color-wrap { - margin-bottom: 15px; - .color-btn { - display: block; - width: 100%; - height: 30px; - border-radius: 2px; - } -} - -.form-box { - width: 100%; - background-color: #fff; - padding: 10px 15px 20px; - .line-form { - position: relative; - display: flex; - flex-direction: column; - justify-content: flex-end; - min-width: 102px; - min-height: 40px; - margin: 0 auto; - - &::before { - content: ''; - position: absolute; - bottom: 0px; - left: 0; - width: 100%; - height: 40px; - border-left: 1px dashed #101010; - border-right: 1px dashed #101010; +.font-btn-wrap{ + margin-bottom: 15px; + button{ + width: 100%; + height: 30px; + line-height: 28px; } - .line-font-box { - .font { - display: block; - padding-bottom: 15px; - color: #101010; - text-align: center; - line-height: 1; - } - .line { - position: relative; +} + +.line-color-wrap{ + margin-bottom: 15px; + .color-btn{ display: block; width: 100%; - height: 1px; - border-radius: 30px; - &::before { - content: ''; - position: absolute; - top: 50%; - transform: translateY(-50%) rotate(45deg); - left: 1px; - width: 9px; - height: +9px; - border: 1px solid; - border-color: inherit; - border-top: none; - border-right: none; - } - &::after { - content: ''; - position: absolute; - top: 50%; - transform: translateY(-50%) rotate(45deg); - right: 1px; - width: 9px; - height: 9px; - border: 1px solid; - border-color: inherit; - border-bottom: none; - border-left: none; - } - } + height: 30px; + border-radius: 2px; + } +} + +.form-box{ + width: 100%; + background-color: #fff; + padding: 10px 15px 20px; + .line-form{ + position: relative; + display: flex; + flex-direction: column; + justify-content: flex-end; + min-width: 102px; + min-height: 40px; + margin: 0 auto; + + &::before{ + content: ''; + position: absolute; + bottom: 0px; + left: 0; + width: 100%; + height: 40px; + border-left: 1px dashed #101010; + border-right: 1px dashed #101010; + } + .line-font-box{ + .font{ + display: block; + padding-bottom: 15px; + color: #101010; + text-align: center; + line-height: 1; + } + .line{ + position: relative; + display: block; + width: 100%; + height: 1px; + border-radius: 30px; + &::before{ + content: ''; + position: absolute; + top: 50%; + transform: translateY(-50%) rotate(45deg); + left: 1px; + width: 9px; + height:+ 9px; + border: 1px solid; + border-color: inherit; + border-top: none; + border-right: none; + } + &::after{ + content: ''; + position: absolute; + top: 50%; + transform: translateY(-50%) rotate(45deg); + right: 1px; + width: 9px; + height: 9px; + border: 1px solid; + border-color: inherit; + border-bottom: none; + border-left: none; + } + } + } } - } } // 사이즈 변경 -.size-inner-warp { - position: relative; +.size-inner-warp{ + position: relative; } -.size-check-wrap { - position: relative; - display: block; - width: 132px; - height: 132px; - margin: 0 auto; - .size-btn { - position: absolute; - width: 16px; - height: 16px; - border: 1px solid #fff; - border-radius: 50%; - &.act { - &::after { - content: ''; +.size-check-wrap{ + position: relative; + display: block; + width: 132px; + height: 132px; + margin: 0 auto; + .size-btn{ + position: absolute; + width: 16px; + height: 16px; + border: 1px solid #fff; + border-radius: 50%; + &.act{ + &::after{ + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 8px; + height: 8px; + background-color: #fff; + border-radius: 50%; + } + } + &:nth-child(1){ top: 0; left: 0; } + &:nth-child(2){ top: 0; right: 0; } + &:nth-child(3){ bottom: 0; left: 0; } + &:nth-child(4){ bottom: 0; right: 0; } + } + .size-box{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); - width: 8px; - height: 8px; + width: 100px; + height: 100px; background-color: #fff; - border-radius: 50%; - } } - &:nth-child(1) { - top: 0; - left: 0; - } - &:nth-child(2) { - top: 0; - right: 0; - } - &:nth-child(3) { - bottom: 0; - left: 0; - } - &:nth-child(4) { - bottom: 0; - right: 0; - } - } - .size-box { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 100px; - height: 100px; - background-color: #fff; - } } -.size-option-top { - margin-bottom: 15px; +.size-option-top{ + margin-bottom: 15px; } -.size-option-side { - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); +.size-option-side{ + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); } -.size-option-wrap { - width: 88px; - margin: 0 auto; - .size-option { - display: flex; - align-items: center; - input { - width: 100%; - flex: 1; +.size-option-wrap{ + width: 88px; + margin: 0 auto; + .size-option{ + display: flex; + align-items: center; + input{ + width: 100%; + flex: 1; + } + span{ + flex: none; + } } - span { - flex: none; - } - } } //이미지 크기 설정 -.range-wrap { - display: flex; - align-items: center; - input { - flex: 1; - margin-right: 10px; - } - label { - flex: none; - text-align: right; - width: 38px; - font-size: 13px; - color: #fff; - font-weight: 500; - } +.range-wrap{ + display: flex; + align-items: center; + input{ + flex: 1; + margin-right: 10px; + } + label{ + flex: none; + text-align: right; + width: 38px; + font-size: 13px; + color: #fff; + font-weight: 500; + } } // 이미지 불러오기 -.img-flex-box { - display: flex; - align-items: center; +.img-flex-box{ + display: flex; + align-items: center; } -.img-load-from { - margin-top: 20px; - .img-load-item { - border-top: 1px solid #424242; - padding: 18px 0; - .d-check-radio { - margin-bottom: 20px; +.img-load-from{ + margin-top: 20px; + .img-load-item{ + border-top: 1px solid #424242; + padding: 18px 0; + .d-check-radio{ + margin-bottom: 20px; + } } - } - border-bottom: 1px solid #424242; + border-bottom: 1px solid #424242; } + +// 지붕모듈선택 변경 +.module-table-box{ + &.none-flex{ + flex: none; + width: 230px; + } +} +.module-table-flex-wrap{ + &.tab2{ + margin-top: 10px; + gap: 15px; + + } + .module-flex-item{ + flex: 1; + .module-flex-item-tit{ + font-size: 12px; + font-weight: 500; + color: #fff; + padding-bottom: 10px; + border-bottom: 1px solid #4D4D4D; + } + .flex-item-btn-wrap{ + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 8px; + margin-bottom: 24px; + } + &.non-flex{ + display: flex; + flex-direction: column; + justify-content: flex-end; + flex: none; + width: 260px; + } + } +} + +.module-table-box{ + .module-table-inner{ + .module-table-flex-wrap{ + &.tab2{ + .eaves-keraba-table{ + .eaves-keraba-th{ + width: 90px; + } + .eaves-keraba-td{ + padding-left: 0; + padding-bottom: 5px; + } + } + } + } + } +} +.keraba-flex{ + display: flex; + align-items: center; + .grid-select{ + flex: none; + width: 110px; + } + .outline-form{ + justify-content: flex-end; + } +} +.module-bottom{ + padding-bottom: 15px; + border-bottom: 1px solid #4D4D4D; +} + +.reset-word{ + font-size: 12px; + color: #FFCACA; + font-weight: 400; + margin-top: 10px; +} \ No newline at end of file diff --git a/src/styles/_reset.scss b/src/styles/_reset.scss index 6c65fec7..d87bbc76 100644 --- a/src/styles/_reset.scss +++ b/src/styles/_reset.scss @@ -226,8 +226,8 @@ button{ border: 1px solid #484848; color: #fff; &.blue{ - background-color: #414E6C; - border: 1px solid #414E6C; + background-color: #4C6FBF; + border: 1px solid #4C6FBF; &:hover{ background-color: #414E6C; border: 1px solid #414E6C; diff --git a/src/styles/_submodal.scss b/src/styles/_submodal.scss index de01ee36..de53d584 100644 --- a/src/styles/_submodal.scss +++ b/src/styles/_submodal.scss @@ -336,4 +336,36 @@ background-color: transparent; } } +} + +// 견적 복사 +.estimate-copy-info-item{ + margin-bottom: 20px; + &:last-child{ + margin-bottom: 0; + } + .estimate-copy-info-tit{ + font-size: 13px; + color: #101010; + font-weight: 500; + margin-bottom: 10px; + } + .estimate-copy-info-box{ + display: flex; + gap: 5px; + .estimate-copy-sel{ + flex: 1 1 auto; + } + .estimate-copy-id{ + flex: none; + display: flex; + align-items: center; + justify-content: center; + width: 150px; + background-color: #FAFAFA; + border: 1px solid #EEEEEE; + font-size: 13px; + color: #999; + } + } } \ No newline at end of file From 5fc977949070ef03ec9ae542589e6bc82a24bce1 Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 27 Nov 2024 10:03:48 +0900 Subject: [PATCH 176/200] =?UTF-8?q?=ED=8F=B0=ED=8A=B8=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/option/useCanvasSetting.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/hooks/option/useCanvasSetting.js b/src/hooks/option/useCanvasSetting.js index fa3c42eb..c3155512 100644 --- a/src/hooks/option/useCanvasSetting.js +++ b/src/hooks/option/useCanvasSetting.js @@ -7,7 +7,7 @@ import { useAxios } from '@/hooks/useAxios' import { useSwal } from '@/hooks/useSwal' import { correntObjectNoState, corridorDimensionSelector, settingModalFirstOptionsState, settingModalSecondOptionsState } from '@/store/settingAtom' import { POLYGON_TYPE } from '@/common/common' -import { fontSelector, globalFontAtom } from '@/store/fontAtom' +import { globalFontAtom } from '@/store/fontAtom' import { dimensionLineSettingsState } from '@/store/commonUtilsAtom' let objectNo @@ -119,21 +119,23 @@ export function useCanvasSetting() { }, [planSizeSettingMode]) const getFonts = (itemValue) => { + if (!itemValue) return { id: 1, name: 'MS PGothic', value: 'MS PGothic' } const data = [ { id: 1, name: 'MS PGothic', value: 'MS PGothic' }, { id: 2, name: '@Yu Gothic', value: '@Yu Gothic' }, { id: 3, name: 'Yu Gothic', value: 'Yu Gothic' }, { id: 4, name: '@Yu Gothic UI', value: '@Yu Gothic UI' }, { id: 5, name: 'Yu Gothic UI', value: 'Yu Gothic UI' }, - ].filter((font) => font.value === itemValue)[0] + ].filter((font) => font.value === itemValue) if (data.length !== 0) { - return data + return data[0] } else { return { id: 1, name: 'MS PGothic', value: 'MS PGothic' } } } const getFontSizes = (itemValue) => { + if (!itemValue) return { id: 16, name: 16, value: 16 } const data = [ ...Array.from({ length: 4 }).map((_, index) => { return { id: index + 8, name: index + 8, value: index + 8 } @@ -144,29 +146,31 @@ export function useCanvasSetting() { { id: 36, name: 36, value: 36 }, { id: 48, name: 48, value: 48 }, { id: 72, name: 72, value: 72 }, - ].filter((fontSize) => fontSize.value === itemValue)[0] + ].filter((fontSize) => fontSize.value === itemValue) if (data.length !== 0) { - return data + return data[0] } else { return { id: 16, name: 16, value: 16 } } } const getFontStyles = (itemValue) => { + if (!itemValue) return { id: 'normal', name: getMessage('font.style.normal'), value: 'normal' } const data = [ { id: 'normal', name: getMessage('font.style.normal'), value: 'normal' }, { id: 'italic', name: getMessage('font.style.italic'), value: 'italic' }, { id: 'bold', name: getMessage('font.style.bold'), value: 'bold' }, { id: 'boldAndItalic', name: getMessage('font.style.bold.italic'), value: 'boldAndItalic' }, - ].filter((fontStyle) => fontStyle.value === itemValue)[0] + ].filter((fontStyle) => fontStyle.value === itemValue) if (data.length !== 0) { - return data + return data[0] } else { return { id: 'normal', name: getMessage('font.style.normal'), value: 'normal' } } } const getFontColors = (itemValue) => { + if (!itemValue) return { id: 'black', name: getMessage('color.black'), value: 'black' } const data = [ { id: 'black', name: getMessage('color.black'), value: 'black' }, { id: 'red', name: getMessage('color.red'), value: 'red' }, @@ -177,9 +181,9 @@ export function useCanvasSetting() { { id: 'pink', name: getMessage('color.pink'), value: 'pink' }, { id: 'gold', name: getMessage('color.gold'), value: 'gold' }, { id: 'darkblue', name: getMessage('color.darkblue'), value: 'darkblue' }, - ].filter((fontColor) => fontColor.value === itemValue)[0] + ].filter((fontColor) => fontColor.value === itemValue) if (data.length !== 0) { - return data + return data[0] } else { return { id: 'black', name: getMessage('color.black'), value: 'black' } } From 5c3e4d76cf799b2a9bb76cccce42999c3190f3cd Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 10:48:00 +0900 Subject: [PATCH 177/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 2 +- .../estimate/useEstimateController.js | 79 ++++++++++--------- 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 88e2fa1d..29fe5c84 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -315,7 +315,7 @@ export default function Estimate({ params }) { sapSalesStoreCd: session.custCd, docTpCd: estimateContextState.estimateType, priceCd: showPriceCd, - itemIdList: estimateContextState.itemList.filter((item) => item.delFlg === '0'), + itemIdList: estimateContextState.itemList.filter((item) => item.delFlg === '0' && item.paDispOrder === null), } if (param.itemIdList.length > 0) { diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 23636c4c..b854bac7 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -126,6 +126,8 @@ export const useEstimateController = (planNo) => { const handleEstimateSubmit = async () => { //0. 필수체크 let flag = true + let fileFlg = true + let itemFlg = true if (estimateData.charger.trim().length === 0) { flag = false return alert(getMessage('estimate.detail.save.requiredCharger')) @@ -143,47 +145,50 @@ export const useEstimateController = (planNo) => { //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 - let fileFlg = true - if (estimateData.fileList.length < 1) { - if (estimateData.itemList.length > 1) { - estimateData.itemList.map((row) => { - if (row.fileUploadFlg === '1') { - if (fileFlg) { - if (estimateData.fileFlg === '0') { - fileFlg = false - return alert(getMessage('estimate.detail.save.requiredFileUpload')) + if (flag) { + if (estimateData.fileList.length < 1) { + if (estimateData.itemList.length > 1) { + estimateData.itemList.map((row) => { + if (row.fileUploadFlg === '1') { + if (fileFlg) { + if (estimateData.fileFlg === '0') { + fileFlg = false + return alert(getMessage('estimate.detail.save.requiredFileUpload')) + } } } - } - }) - } - } - let itemFlg = true - estimateData.itemList.map((item) => { - item.amount = item.amount?.replaceAll(',', '') - item.salePrice = parseFloat(item.salePrice?.replaceAll(',', '')).toFixed(2) - item.saleTotPrice = parseFloat(item.saleTotPrice?.replaceAll(',', '')).toFixed(2) - - if (!item.paDispOrder) { - if (itemFlg) { - if (isNaN(item.amount)) { - item.amount = 0 - } else { - Number(item.amount) - } - - if (item.amount < 1) { - itemFlg = false - return alert(getMessage('estimate.detail.save.requiredAmount')) - } - - if (Number(item.salePrice) < 1) { - itemFlg = false - return alert(getMessage('estimate.detail.save.requiredSalePrice')) - } + }) } } - }) + } + + if (fileFlg) { + estimateData.itemList.map((item) => { + item.amount = item.amount?.replaceAll(',', '') + item.salePrice = parseFloat(item.salePrice?.replaceAll(',', '')).toFixed(2) + item.saleTotPrice = parseFloat(item.saleTotPrice?.replaceAll(',', '')).toFixed(2) + + if (!item.paDispOrder) { + if (itemFlg) { + if (isNaN(item.amount)) { + item.amount = 0 + } else { + Number(item.amount) + } + + if (item.amount < 1) { + itemFlg = false + return alert(getMessage('estimate.detail.save.requiredAmount')) + } + + if (Number(item.salePrice) < 1) { + itemFlg = false + return alert(getMessage('estimate.detail.save.requiredSalePrice')) + } + } + } + }) + } if (flag && fileFlg && itemFlg) { //1. 첨부파일 저장시작 From b6873f4d27674e73b13ac1eb1a1fe287485cb90e Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 11:24:26 +0900 Subject: [PATCH 178/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 8 +++++--- src/hooks/floorPlan/estimate/useEstimateController.js | 10 ++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 29fe5c84..bbe7c4e0 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -422,7 +422,8 @@ export default function Estimate({ params }) { //현재 PKG용량값 가져오기 let totVolKw = estimateContextState.totVolKw * 1000 - let pkgTotPrice = pkgAsp.replaceAll(',', '') * totVolKw + let pkgTotPrice = pkgAsp.replaceAll(',', '') * totVolKw * 1000 + setEstimateContextState({ pkgAsp: pkgAsp, pkgTotPrice: pkgTotPrice.toFixed(3), @@ -655,6 +656,7 @@ export default function Estimate({ params }) { if (item.moduleFlg === '1') { //용량(Kw)은 모듈플래그 1만 합산 const volKw = (item.pnowW * amount) / 1000 + // const volKw = item.pnowW * amount totVolKw += volKw } // const price @@ -699,11 +701,11 @@ export default function Estimate({ params }) { if (item.moduleFlg === '1') { //용량(Kw)은 모듈플래그 1만 합산 const volKw = (item.pnowW * amount) / 1000 + // const volKw = item.pnowW * amount totVolKw += volKw } - setEstimateContextState({ - pkgTotPrice: estimateContextState.pkgAsp.replaceAll(',', '') * totVolKw, + pkgTotPrice: estimateContextState.pkgAsp.replaceAll(',', '') * totVolKw * 1000, }) //pkgTotPrice // const saleTotPrice diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index b854bac7..e7775408 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -173,7 +173,7 @@ export const useEstimateController = (planNo) => { if (isNaN(item.amount)) { item.amount = 0 } else { - Number(item.amount) + item.amount = Number(item.amount) } if (item.amount < 1) { @@ -181,7 +181,13 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredAmount')) } - if (Number(item.salePrice) < 1) { + if (isNaN(item.salePrice)) { + item.salePrice = 0 + } else { + item.salePrice = Number(item.salePrice) + } + + if (item.salePrice < 1) { itemFlg = false return alert(getMessage('estimate.detail.save.requiredSalePrice')) } From 19ed919cc107791694f17ce9defefaf6524dda22 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 11:50:41 +0900 Subject: [PATCH 179/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 6 ++--- .../estimate/useEstimateController.js | 22 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index bbe7c4e0..02bafff0 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -438,7 +438,7 @@ export default function Estimate({ params }) { //itemChangeFlg = 1, partAdd = 0 셋팅 let amount = Number(value.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(amount)) { - amount = 0 + amount = '0' } else { amount = amount.toLocaleString() } @@ -647,7 +647,7 @@ export default function Estimate({ params }) { if (item.delFlg === '0') { let amount = Number(item?.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(amount)) { - amount = 0 + amount = '0' } let price = Number(item?.saleTotPrice?.replaceAll(',', '')) if (isNaN(price)) { @@ -688,7 +688,7 @@ export default function Estimate({ params }) { let saleTotPrice = Number(item.saleTotPrice?.replaceAll(',', '')) if (isNaN(amount)) { - amount = 0 + amount = '0' } if (isNaN(saleTotPrice)) { diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index e7775408..171b01e1 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -171,9 +171,7 @@ export const useEstimateController = (planNo) => { if (!item.paDispOrder) { if (itemFlg) { if (isNaN(item.amount)) { - item.amount = 0 - } else { - item.amount = Number(item.amount) + item.amount = '0' } if (item.amount < 1) { @@ -181,15 +179,17 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredAmount')) } - if (isNaN(item.salePrice)) { - item.salePrice = 0 - } else { - item.salePrice = Number(item.salePrice) - } + console.log('상세::', estimateData) + if (estimateData.estimateType !== 'YJSS') { + console.log('아이템 체크::', item.salePrice) + if (isNaN(item.salePrice)) { + item.salePrice = '0' + } - if (item.salePrice < 1) { - itemFlg = false - return alert(getMessage('estimate.detail.save.requiredSalePrice')) + if (item.salePrice < 1) { + itemFlg = false + return alert(getMessage('estimate.detail.save.requiredSalePrice')) + } } } } From b728be3786ca0b4360d92d982cacdd2b2e974f68 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 12:13:07 +0900 Subject: [PATCH 180/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 27 +++++++++---------- .../estimate/useEstimateController.js | 2 -- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 02bafff0..7bb9c5ad 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -530,8 +530,8 @@ export default function Estimate({ params }) { if (estimateContextState.estimateType === 'YJSS') { if (res.pkgMaterialFlg === '0') { - //updates.showSalePrice = '0' - //updates.showSaleTotPrice = '0' + updates.showSalePrice = '0' + updates.showSaleTotPrice = '0' } } //104671 @@ -642,8 +642,8 @@ export default function Estimate({ params }) { console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) estimateContextState.itemList.map((item) => { - //delete item.showSalePrice - //delete item.showSaleTotPrice + delete item.showSalePrice + delete item.showSaleTotPrice if (item.delFlg === '0') { let amount = Number(item?.amount?.replace(/[^0-9]/g, '').replaceAll(',', '')) if (isNaN(amount)) { @@ -720,8 +720,8 @@ export default function Estimate({ params }) { if (!item.paDispOrder) { //paDispOrder if (item.pkgMaterialFlg === '0') { - //item.showSalePrice = '0' - //item.showSaleTotPrice = '0' + item.showSalePrice = '0' + item.showSaleTotPrice = '0' } } } @@ -1271,7 +1271,7 @@ export default function Estimate({ params }) {
    - + @@ -1397,16 +1397,13 @@ export default function Estimate({ params }) { /> {/*
    - OPEN아이콘 처리 -
    */} + + */} - - {/* {item?.showSaleTotPrice === '0' ? ( - - ) : ( - - )} */} + ) } else { diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 171b01e1..9ac68243 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -179,9 +179,7 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredAmount')) } - console.log('상세::', estimateData) if (estimateData.estimateType !== 'YJSS') { - console.log('아이템 체크::', item.salePrice) if (isNaN(item.salePrice)) { item.salePrice = '0' } From 0ed7efb3af641d70c0a3bc7bf290f073c168dd36 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 12:44:44 +0900 Subject: [PATCH 181/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=ED=8A=B9?= =?UTF-8?q?=EC=9D=B4=EC=82=AC=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 35 ++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 7bb9c5ad..3b5f72d7 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -1105,13 +1105,34 @@ export default function Estimate({ params }) {
    {specialNoteList.map((row) => { if (row.code === showContentCode) { - return ( -
    -
    {row.codeNm}
    - {/*
    */} -
    -
    - ) + let showcontent = popShowSpecialNoteList.find((item) => { + return item.code === showContentCode + }) + + if (isObjectNotEmpty(showcontent)) { + return ( +
    +
    {showcontent.codeNm}
    +
    +
    + ) + } else { + let pushData = [] + popShowSpecialNoteList.map((item) => { + let option = showContentCode.split(',') + option.map((item2) => { + if (item.code === item2) { + pushData.push(item) + } + }) + }) + return pushData.map((item) => ( +
    +
    {item.codeNm}
    +
    +
    + )) + } } })}
    From 19220bc3cc80cd79532149c93dc7898003434db0 Mon Sep 17 00:00:00 2001 From: Jaeyoung Lee Date: Wed, 27 Nov 2024 13:20:47 +0900 Subject: [PATCH 182/200] =?UTF-8?q?=EB=B0=95=EA=B3=B5=EC=A7=80=EB=B6=95=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useMode.js | 70 ++++++++++---------- src/util/qpolygon-utils.js | 131 ++++++++++++++++++++++++++++--------- 2 files changed, 136 insertions(+), 65 deletions(-) diff --git a/src/hooks/useMode.js b/src/hooks/useMode.js index 31336413..6f6f3ad7 100644 --- a/src/hooks/useMode.js +++ b/src/hooks/useMode.js @@ -1508,47 +1508,47 @@ export function useMode() { const handleOuterlinesTest2 = (polygon, offset = 50) => { // TODO [ljyoung] : offset 입력 처리 후 제거 해야함. polygon.lines.forEach((line, index) => { - /*line.attributes = { + line.attributes = { type: LINE_TYPE.WALLLINE.EAVES, offset: 50, width: 50, pitch: 4, sleeve: true, - }*/ - /*if (index % 2 === 0) { - line.attributes = { - type: LINE_TYPE.WALLLINE.GABLE, - offset: 30, - width: 50, - pitch: 4, - sleeve: true, - } - } else { - line.attributes = { - type: LINE_TYPE.WALLLINE.EAVES, - offset: 50, - width: 50, - pitch: 4, - sleeve: true, - } - }*/ - if (index === polygon.lines.length - 1) { - line.attributes = { - type: LINE_TYPE.WALLLINE.GABLE, - offset: 30, - width: 50, - pitch: 4, - sleeve: true, - } - } else { - line.attributes = { - type: LINE_TYPE.WALLLINE.EAVES, - offset: 50, - width: 50, - pitch: 4, - sleeve: true, - } } + /*if (index % 2 !== 0) { + line.attributes = { + type: LINE_TYPE.WALLLINE.GABLE, + offset: 30, + width: 50, + pitch: 4, + sleeve: true, + } + } else { + line.attributes = { + type: LINE_TYPE.WALLLINE.EAVES, + offset: 50, + width: 50, + pitch: 4, + sleeve: true, + } + }*/ + /*if (index === polygon.lines.length - 1) { + line.attributes = { + type: LINE_TYPE.WALLLINE.GABLE, + offset: 30, + width: 50, + pitch: 4, + sleeve: true, + } + } else { + line.attributes = { + type: LINE_TYPE.WALLLINE.EAVES, + offset: 50, + width: 50, + pitch: 4, + sleeve: true, + } + }*/ }) const roof = drawRoofPolygon(polygon) //지붕 그리기 diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index 493417bd..e580fbb7 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1410,8 +1410,39 @@ export const drawGabledRoof = (roofId, canvas) => { let points = [] const intersectRidge = [] // 현재 roof가 wall보다 작을때 이전, 다음 지붕의 offset만큼 포인트를 조정한다. - if (currentRoof.attributes.planeSize >= currentWall.attributes.planeSize) { + if (currentRoof.attributes.planeSize > currentWall.attributes.planeSize) { points.push({ x: currentRoof.x1, y: currentRoof.y1 }, { x: currentRoof.x2, y: currentRoof.y2 }) + } else if (currentRoof.attributes.planeSize === currentWall.attributes.planeSize) { + const deltaX = currentRoof.x2 - currentRoof.x1 + const deltaY = currentRoof.y2 - currentRoof.y1 + let x1 = currentRoof.x1, + y1 = currentRoof.y1, + x2 = currentRoof.x2, + y2 = currentRoof.y2 + + if (deltaX !== 0) { + const minX = Math.min(currentRoof.x1, currentRoof.x2, currentWall.x1, currentWall.x2) + const maxX = Math.max(currentRoof.x1, currentRoof.x2, currentWall.x1, currentWall.x2) + if (x1 > x2) { + x1 = maxX + x2 = minX + } else { + x1 = minX + x2 = maxX + } + } + if (deltaY !== 0) { + const minY = Math.min(currentRoof.y1, currentRoof.y2, currentWall.y1, currentWall.y2) + const maxY = Math.max(currentRoof.y1, currentRoof.y2, currentWall.y1, currentWall.y2) + if (y1 > y2) { + y1 = maxY + y2 = minY + } else { + y1 = minY + y2 = maxY + } + } + points.push({ x: x1, y: y1 }, { x: x2, y: y2 }) } else { const deltaX = currentRoof.x2 - currentRoof.x1 const deltaY = currentRoof.y2 - currentRoof.y1 @@ -1429,7 +1460,7 @@ export const drawGabledRoof = (roofId, canvas) => { { vertex1: { x: ridge.x1, y: ridge.y1 }, vertex2: { x: ridge.x2, y: ridge.y2 } }, ) if (intersection && !intersection.isIntersectionOutside) { - intersectRidge.push({ line: ridge, name: 'mid' }) + intersectRidge.push({ line: ridge }) } } if (Math.sign(midX - ridgeMidX) === signX || Math.sign(midY - ridgeMidY) === signY) { @@ -1442,43 +1473,80 @@ export const drawGabledRoof = (roofId, canvas) => { { vertex1: { x: ridge.x1, y: ridge.y1 }, vertex2: { x: ridge.x2, y: ridge.y2 } }, ) if (prevIntersect && !prevIntersect.isIntersectionOutside) { - intersectRidge.push({ line: ridge, name: 'prev' }) + intersectRidge.push({ line: ridge }) } if (nextIntersect && !nextIntersect.isIntersectionOutside) { - intersectRidge.push({ line: ridge, name: 'next' }) + intersectRidge.push({ line: ridge }) } } }) - intersectRidge.forEach((intersect) => { + intersectRidge.forEach((intersect, index) => { const line = intersect.line - if (currentRoof.attributes.planeSize >= currentWall.attributes.planeSize) { + const ridge = new fabric.Line([line.x1, line.y1, line.x2, line.y2], { + stroke: 'red', + strokeWidth: 2, + selectable: false, + }) + canvas.add(ridge) + canvas.renderAll() + if (currentRoof.attributes.planeSize > currentWall.attributes.planeSize) { points.push({ x: line.x1, y: line.y1 }, { x: line.x2, y: line.y2 }) - } else { - if (intersect.name === 'mid') { - let lineX1 = line.x1, - lineY1 = line.y1, - lineX2 = line.x2, - lineY2 = line.y2 - const prevCheck1 = Math.sqrt(Math.pow(Math.round(lineX1 - currentRoof.x1), 2) + Math.pow(Math.round(lineY1 - currentRoof.y1), 2)) - const prevCheck2 = Math.sqrt(Math.pow(Math.round(lineX2 - currentRoof.x1), 2) + Math.pow(Math.round(lineY2 - currentRoof.y1), 2)) - const deltaX = currentRoof.x2 - currentRoof.x1 - const deltaY = currentRoof.y2 - currentRoof.y1 - console.log('deltaX : ', deltaX, 'deltaY : ', deltaY) - if (prevCheck1 < prevCheck2) { - lineX1 = lineX1 - Math.sign(deltaX) * prevRoof.attributes.offset - lineY1 = lineY1 - Math.sign(deltaY) * prevRoof.attributes.offset - lineX2 = lineX2 + Math.sign(deltaX) * nextRoof.attributes.offset - lineY2 = lineY2 + Math.sign(deltaY) * nextRoof.attributes.offset + } else if (currentRoof.attributes.planeSize === currentWall.attributes.planeSize) { + const deltaX = currentRoof.x2 - currentRoof.x1 + const deltaY = currentRoof.y2 - currentRoof.y1 + let x1 = line.x1, + y1 = line.y1, + x2 = line.x2, + y2 = line.y2 + if (deltaX !== 0) { + const minX = Math.min(currentWall.x1, currentWall.x2, currentRoof.x1, currentRoof.x2, line.x1, line.x2) + const maxX = Math.max(currentWall.x1, currentWall.x2, currentRoof.x1, currentRoof.x2, line.x1, line.x2) + if (x1 > x2) { + x1 = maxX + x2 = minX } else { - lineX1 = lineX1 + Math.sign(deltaX) * prevRoof.attributes.offset - lineY1 = lineY1 + Math.sign(deltaY) * prevRoof.attributes.offset - lineX2 = lineX2 - Math.sign(deltaX) * nextRoof.attributes.offset - lineY2 = lineY2 - Math.sign(deltaY) * nextRoof.attributes.offset + x1 = minX + x2 = maxX } - points.push({ x: lineX1, y: lineY1 }, { x: lineX2, y: lineY2 }) } + if (deltaY !== 0) { + const minY = Math.min(currentWall.y1, currentWall.y2, currentRoof.y1, currentRoof.y2, line.y1, line.y2) + const maxY = Math.max(currentWall.y1, currentWall.y2, currentRoof.y1, currentRoof.y2, line.y1, line.y2) + if (y1 > y2) { + y1 = maxY + y2 = minY + } else { + y1 = minY + y2 = maxY + } + } + points.push({ x: x1, y: y1 }, { x: x2, y: y2 }) + } else { + let lineX1 = line.x1, + lineY1 = line.y1, + lineX2 = line.x2, + lineY2 = line.y2 + const prevCheck1 = Math.sqrt(Math.pow(Math.round(lineX1 - currentRoof.x1), 2) + Math.pow(Math.round(lineY1 - currentRoof.y1), 2)) + const prevCheck2 = Math.sqrt(Math.pow(Math.round(lineX2 - currentRoof.x1), 2) + Math.pow(Math.round(lineY2 - currentRoof.y1), 2)) + const deltaX = currentRoof.x2 - currentRoof.x1 + const deltaY = currentRoof.y2 - currentRoof.y1 + if (prevCheck1 < prevCheck2) { + lineX1 = lineX1 - Math.sign(deltaX) * prevRoof.attributes.offset + lineY1 = lineY1 - Math.sign(deltaY) * prevRoof.attributes.offset + lineX2 = lineX2 + Math.sign(deltaX) * nextRoof.attributes.offset + lineY2 = lineY2 + Math.sign(deltaY) * nextRoof.attributes.offset + } else { + lineX1 = lineX1 + Math.sign(deltaX) * prevRoof.attributes.offset + lineY1 = lineY1 + Math.sign(deltaY) * prevRoof.attributes.offset + lineX2 = lineX2 - Math.sign(deltaX) * nextRoof.attributes.offset + lineY2 = lineY2 - Math.sign(deltaY) * nextRoof.attributes.offset + } + points.push({ x: lineX1, y: lineY1 }, { x: lineX2, y: lineY2 }) } + + canvas.remove(ridge) + canvas.renderAll() }) points = points.filter((point, index, self) => index === self.findIndex((p) => p.x === point.x && p.y === point.y)) @@ -1495,8 +1563,11 @@ export const drawGabledRoof = (roofId, canvas) => { const nextPoint = underStartPoint .filter((point) => point.x === startPoint.x) .reduce((prev, current) => { + if (prev === undefined) { + return current + } return Math.abs(prev.y - startPoint.y) < Math.abs(current.y - startPoint.y) ? prev : current - }) + }, undefined) if (nextPoint) { sortedPoints.push(nextPoint) } else { @@ -1504,7 +1575,7 @@ export const drawGabledRoof = (roofId, canvas) => { const prevHypos = Math.sqrt(Math.abs(Math.pow(prev.x - startPoint.x, 2)) + Math.abs(Math.pow(prev.y - startPoint.y, 2))) const currentHypos = Math.sqrt(Math.abs(Math.pow(current.x - startPoint.x, 2)) + Math.abs(Math.pow(current.y - startPoint.y, 2))) return prevHypos < currentHypos ? prev : current - }) + }, undefined) sortedPoints.push(nextPoint) } } else { @@ -1565,7 +1636,7 @@ export const drawGabledRoof = (roofId, canvas) => { const roofPolygon = new QPolygon(sortedPoints, { fill: 'transparent', stroke: 'blue', - strokeWidth: 1, + strokeWidth: 2, selectable: false, fontSize: roof.fontSize, name: 'roofPolygon', From 04a45c1bc95adcc36f606e64d7bc1f6ca27c8192 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Wed, 27 Nov 2024 13:24:40 +0900 Subject: [PATCH 183/200] =?UTF-8?q?=EC=B2=98=EB=A7=88=EB=A9=B4=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=9E=90=EB=8F=99=EC=84=A4=EC=B9=98=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/basic/BasicSetting.jsx | 2 +- .../floor-plan/modal/basic/step/Placement.jsx | 48 +- src/hooks/module/useModuleBasicSetting.js | 749 ++++++------------ 3 files changed, 305 insertions(+), 494 deletions(-) diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 68bb0a49..1b2069d4 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -39,7 +39,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const placementRef = { isChidori: useRef('false'), - setupLocation: useRef(null), + setupLocation: useRef('center'), isMaxSetup: useRef('false'), } diff --git a/src/components/floor-plan/modal/basic/step/Placement.jsx b/src/components/floor-plan/modal/basic/step/Placement.jsx index e5acf6da..13c48a08 100644 --- a/src/components/floor-plan/modal/basic/step/Placement.jsx +++ b/src/components/floor-plan/modal/basic/step/Placement.jsx @@ -4,6 +4,8 @@ import { forwardRef, useState } from 'react' const Placement = forwardRef((props, refs) => { const { getMessage } = useMessage() const [isChidori, setIsChidori] = useState('false') + const [setupLocation, setSetupLocation] = useState('center') + const [isMaxSetup, setIsMaxSetup] = useState('false') const moduleData = { header: [ @@ -33,6 +35,23 @@ const Placement = forwardRef((props, refs) => { refs.isChidori.current = e.target.value } + const handleSetupLocation = (e) => { + setSetupLocation(e.target.value) + refs.setupLocation.current = e.target.value + } + + const handleMaxSetup = (e) => { + console.log(e.target.checked) + + if (e.target.checked) { + setIsMaxSetup('true') + refs.isMaxSetup.current = 'true' + } else { + setIsMaxSetup('false') + refs.isMaxSetup.current = 'false' + } + } + return ( <>
    @@ -128,15 +147,36 @@ const Placement = forwardRef((props, refs) => {
    - +
    - +
    - +
    @@ -145,7 +185,7 @@ const Placement = forwardRef((props, refs) => {
    - +
    diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index eb6ac973..a44c4e19 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -20,6 +20,7 @@ export function useModuleBasicSetting() { const [moduleIsSetup, setModuleIsSetup] = useRecoilState(moduleIsSetupState) // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const [flowModuleLine, setFlowModuleLine] = useState({}) let selectedModuleInstSurfaceArray = [] const makeModuleInstArea = () => { @@ -55,10 +56,12 @@ export function useModuleBasicSetting() { setupSurface.setViewLengthText(false) canvas.add(setupSurface) - bottomModuleLine(setupSurface) - topModuleLine(setupSurface) - leftModuleLine(setupSurface) - // rightModuleLine(setupSurface) + + if (setupSurface.flowDirection === 'south' || setupSurface.flowDirection === 'north') { + setFlowModuleLine(bottomTopFlowLine(setupSurface)) + } else { + setFlowModuleLine(leftRightFlowLine(setupSurface)) + } //지붕면 선택 금지 roof.set({ @@ -74,7 +77,6 @@ export function useModuleBasicSetting() { //설치 범위 지정 클릭 이벤트 const toggleSelection = (setupSurface) => { - console.log('setupSurface', setupSurface) const isExist = selectedModuleInstSurfaceArray.some((obj) => obj.parentId === setupSurface.parentId) //최초 선택일때 if (!isExist) { @@ -391,6 +393,8 @@ export function useModuleBasicSetting() { //자동 모듈 설치(그리드 방식) const autoModuleSetup = (placementRef) => { const isChidori = placementRef.isChidori.current + const setupLocation = placementRef.setupLocation.current + const isMaxSetup = placementRef.isMaxSetup.current initEvent() const moduleSetupSurfaces = moduleSetupSurface //선택 설치면 @@ -434,6 +438,8 @@ export function useModuleBasicSetting() { moduleSetupSurfaces.forEach((moduleSetupSurface, index) => { moduleSetupSurface.fire('mousedown') + const surfaceMaxLines = findSetupSurfaceMaxLines(moduleSetupSurface) + let maxLengthLine = moduleSetupSurface.lines.reduce((acc, cur) => { return acc.length > cur.length ? acc : cur }) @@ -470,21 +476,11 @@ export function useModuleBasicSetting() { } else { convertBatchObject = polygonToTurfPolygon(containsBatchObjects[i]) } - - if (i === 0) { - difference = turf.difference(turf.featureCollection([turfModuleSetupSurface, convertBatchObject])) //한 면에 도머가 1개일때 - } else { - if (difference) { - difference = turf.difference(turf.featureCollection([difference, convertBatchObject])) //한면에 도머가 여러개일때 계속 제외시킴 - } - } } } - const bbox = turf.bbox(difference) - - let width = maxLengthLine.flowDirection === 'right' || maxLengthLine.flowDirection === 'left' ? 172.2 : 113.4 - let height = maxLengthLine.flowDirection === 'right' || maxLengthLine.flowDirection === 'left' ? 113.4 : 172.2 + let width = maxLengthLine.flowDirection === 'east' || maxLengthLine.flowDirection === 'west' ? 172.2 : 113.4 + let height = maxLengthLine.flowDirection === 'east' || maxLengthLine.flowDirection === 'west' ? 113.4 : 172.2 //배치면때는 방향쪽으로 패널이 넓게 누워져야함 if (moduleSetupSurface.flowDirection !== undefined) { @@ -492,144 +488,97 @@ export function useModuleBasicSetting() { height = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 113.4 : 172.2 } - let cols = Math.floor((bbox[2] - bbox[0]) / width) - let rows = Math.floor((bbox[3] - bbox[1]) / height) + let square + let startPoint, endPoint - // cols = cols * 2 + if (setupLocation === 'eaves') { + if (moduleSetupSurface.flowDirection === 'south') { + startPoint = flowModuleLine.find((obj) => obj.target === 'bottom') + endPoint = flowModuleLine.find((obj) => obj.target === 'top') + const totalHeight = endPoint.y1 - startPoint.y1 + const diffHeight = Math.abs(totalHeight / height) + let leftMargin = 0 + let bottomMargin = 0 - for (let col = 0; col <= cols; col++) { - for (let row = 0; row <= rows; row++) { - let x = 0, - y = 0, - square = [], - margin = 0 - if (moduleSetupSurface.flowDirection !== undefined) { - //배치면 처림 방향이 정해져있는 경우 - if (moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north') { - //남,북 - margin = (bbox[2] - bbox[0] - cols * width) / 2 //박스 끝에서 박스 시작값을 빼고 width와 계산된 cols를 곱한값을 뺀뒤 나누기 2 하면 가운데 배치됨 - if (moduleSetupSurface.flowDirection === 'south') { - //남쪽 - x = col === 0 ? moduleSetupSurface.left + margin : bbox[0] + col * width + margin //상하 위치 기준이면 좌우 가운데 정렬한다 - y = bbox[3] - row * height - } else { - //북쪽 - x = col === 0 ? moduleSetupSurface.left + margin : bbox[0] + col * width + margin - y = bbox[1] + row * height - } - } else if (moduleSetupSurface.flowDirection === 'east' || moduleSetupSurface.flowDirection === 'west') { - //동쪽 - margin = (bbox[3] - bbox[1] - rows * height) / 2 - if (moduleSetupSurface.flowDirection === 'east') { - x = bbox[2] - col * width - y = rows === 0 ? moduleSetupSurface.top + margin : bbox[1] + row * height + margin //좌우 위치 기준이면 상하 가운데 정렬한다 - } else { - x = bbox[0] + col * width - y = rows === 0 ? moduleSetupSurface.top + margin : bbox[1] + row * height + margin - } - } - } else { - //방향이 없는 경우 ex) 템플릿 - x = bbox[0] + col * width - y = bbox[1] + row * height - } + for (let i = 0; i < diffHeight; i++) { + leftMargin = i === 0 ? 1 : 0 + bottomMargin = i === 0 ? 0 : 1 - if (isChidori === 'true') { - if (row % 2 !== 0) { - square = [ - [x, y], - [x + width, y], - [x + width, y + height], - [x, y + height], - [x, y], - ] - } else { - square = [ - [x - width / 2, y], - [x - width / 2 + width, y], - [x - width / 2 + width, y + height], - [x - width / 2, y + height], - [x - width / 2, y], - ] - } - } else { square = [ - [x, y], - [x + width, y], - [x + width, y + height], - [x, y + height], - [x, y], + [startPoint.x1 + leftMargin, startPoint.y1 - height - bottomMargin], + [startPoint.x1 + leftMargin, startPoint.y1 - bottomMargin], + [startPoint.x1 + leftMargin + width, startPoint.y1 - bottomMargin], + [startPoint.x1 + leftMargin + width, startPoint.y1 - height - bottomMargin], + [startPoint.x1 + leftMargin, startPoint.y1 - height - bottomMargin], ] - } - // square = [ - // [x - width / 2, y], - // [x - width / 2 + width, y], - // [x - width / 2 + width, y + height], - // [x - width / 2, y + height], - // [x - width / 2, y], - // ] + const squarePolygon = turf.polygon([square]) - const squarePolygon = turf.polygon([square]) - const disjointFromTrestle = - turf.booleanContains(turfModuleSetupSurface, squarePolygon) || turf.booleanWithin(squarePolygon, turfModuleSetupSurface) - if (disjointFromTrestle) { - let turfCoordnates = squarePolygon.geometry.coordinates[0].slice(0, -1) - const points = turfCoordnates.map((coord) => ({ x: coord[0], y: coord[1] })) - if (containsBatchObjects.length > 0) { - let convertBatchObject - //도머가 있으면 적용되는 로직 - const isDisjoint = containsBatchObjects.every((batchObject) => { - if (batchObject.type === 'group') { - convertBatchObject = batchObjectGroupToTurfPolygon(batchObject) - } else { - convertBatchObject = polygonToTurfPolygon(batchObject) + //설치면 안에 있는지 확인 + const disjointFromTrestle = + turf.booleanContains(turfModuleSetupSurface, squarePolygon) || turf.booleanWithin(squarePolygon, turfModuleSetupSurface) + + if (disjointFromTrestle) { + let turfCoordnates = squarePolygon.geometry.coordinates[0].slice(0, -1) + const points = turfCoordnates.map((coord) => ({ x: coord[0], y: coord[1] })) + + if (containsBatchObjects.length > 0) { + let convertBatchObject + //도머가 있으면 적용되는 로직 + const isDisjoint = containsBatchObjects.every((batchObject) => { + if (batchObject.type === 'group') { + convertBatchObject = batchObjectGroupToTurfPolygon(batchObject) + } else { + convertBatchObject = polygonToTurfPolygon(batchObject) + } + return turf.booleanDisjoint(squarePolygon, convertBatchObject) //도머가 여러개일수있으므로 겹치는게 있다면... + }) + if (isDisjoint) { + const tempModule = new QPolygon(points, { + fill: '#BFFD9F', + stroke: 'black', + strokeWidth: 0.1, + selectable: true, // 선택 가능하게 설정 + lockMovementX: false, // X 축 이동 잠금 + lockMovementY: false, // Y 축 이동 잠금 + lockRotation: false, // 회전 잠금 + lockScalingX: false, // X 축 크기 조정 잠금 + lockScalingY: false, // Y 축 크기 조정 잠금 + opacity: 0.8, + parentId: moduleSetupSurface.parentId, + name: 'module', + }) + tempModule.setViewLengthText(false) + canvas?.add(tempModule) + moduleSetupArray.push(tempModule) } - return turf.booleanDisjoint(squarePolygon, convertBatchObject) //도머가 여러개일수있으므로 겹치는게 있다면... - }) - if (isDisjoint) { + } else { + //도머가 없을땐 그냥 그림 const tempModule = new QPolygon(points, { fill: '#BFFD9F', stroke: 'black', selectable: true, // 선택 가능하게 설정 - lockMovementX: false, // X 축 이동 잠금 - lockMovementY: false, // Y 축 이동 잠금 - lockRotation: false, // 회전 잠금 - lockScalingX: false, // X 축 크기 조정 잠금 - lockScalingY: false, // Y 축 크기 조정 잠금 + lockMovementX: true, // X 축 이동 잠금 + lockMovementY: true, // Y 축 이동 잠금 + lockRotation: true, // 회전 잠금 + lockScalingX: true, // X 축 크기 조정 잠금 + lockScalingY: true, // Y 축 크기 조정 잠금 opacity: 0.8, parentId: moduleSetupSurface.parentId, - lineCol: col, - lineRow: row, name: 'module', + selectable: true, }) - tempModule.setViewLengthText(false) - // canvas?.add(tempModule) + canvas?.add(tempModule) moduleSetupArray.push(tempModule) } - } else { - //도머가 없을땐 그냥 그림 - const tempModule = new QPolygon(points, { - fill: '#BFFD9F', - stroke: 'black', - selectable: true, // 선택 가능하게 설정 - lockMovementX: true, // X 축 이동 잠금 - lockMovementY: true, // Y 축 이동 잠금 - lockRotation: true, // 회전 잠금 - lockScalingX: true, // X 축 크기 조정 잠금 - lockScalingY: true, // Y 축 크기 조정 잠금 - opacity: 0.8, - parentId: moduleSetupSurface.parentId, - lineCol: col, - lineRow: row, - name: 'module', - }) - // canvas?.add(tempModule) - moduleSetupArray.push(tempModule) + startPoint = { x1: points[0].x, y1: points[0].y, x2: points[3].x, y2: points[3].y } } } } + } else if (setupLocation === 'ridge') { + } else { } + moduleSetupSurface.set({ modules: moduleSetupArray }) }) @@ -772,48 +721,9 @@ export function useModuleBasicSetting() { return hull } - const bottomModuleLine = (nowSurface) => { - let selectedLine = null - - const sortedLines = sortLinesByTopLeft(nowSurface.lines) - - const moduleWidthLength = 173.3 + 5 //임시 약간 여유를 줌 - - // if (nowSurface.flowDirection === 'east') { - // const leftFlow = nowSurface.lines.reduce( - // (acc, line, index) => { - // if (line.x1 < acc.x1 || (line.x1 === acc.x1 && line.y1 < acc.y1)) { - // return { x1: line.x1, y1: line.y1, index: index } - // } - // return acc - // }, - // { x1: Infinity, y1: Infinity, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 - // ) - // selectedLine = leftFlow - // } else if (nowSurface.flowDirection === 'west') { - // const rightFlow = nowSurface.lines.reduce( - // (acc, line, index) => { - // if (line.x1 > acc.x1 || (line.x1 === acc.x1 && line.y1 > acc.y1)) { - // return { x1: line.x1, y1: line.y1, index: index } - // } - // return acc - // }, - // { x1: 0, y1: 0, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 - // ) - // selectedLine = rightFlow - // } else if (nowSurface.flowDirection === 'north') { - // const topFlow = nowSurface.lines.reduce( - // (acc, line, index) => { - // if (line.y1 < acc.y1 || (line.y1 === acc.y1 && line.x1 < acc.x1)) { - // return { x1: line.x1, y1: line.y1, index: index } - // } - // return acc - // }, - // { x1: Infinity, y1: Infinity, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 - // ) - // selectedLine = topFlow - // } else { - const bottomFlow = nowSurface.lines.reduce( + const bottomTopFlowLine = (surface) => { + const flowArray = [] + const bottomFlow = surface.lines.reduce( (acc, line, index) => { if (line.y1 > acc.y1 || (line.y1 === acc.y1 && line.x1 > acc.x1)) { return { x1: line.x1, y1: line.y1, index: index } @@ -822,103 +732,9 @@ export function useModuleBasicSetting() { }, { x1: 0, y1: 0, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 ) - selectedLine = bottomFlow - // } + flowArray.push(bottomFlow) - let prevLines = nowSurface.lines[(selectedLine.index - 1 + nowSurface.lines.length) % nowSurface.lines.length] - let nextLines = nowSurface.lines[selectedLine.index] - const overlapCoords = { x: nextLines.x1, y: nextLines.y1 } //겹치는 꼭지점 - - const m1 = (prevLines.y2 - prevLines.y1) / (prevLines.x2 - prevLines.x1) - const m2 = (nextLines.y2 - nextLines.y1) / (nextLines.x2 - nextLines.x1) - - const c1 = prevLines.y1 - m1 * prevLines.x1 - const c2 = nextLines.y1 - m2 * nextLines.x1 - - // Step 2: Calculate intersection point - - let xIntersectPrev = 0 - let yIntersectPrev = 0 - let xIntersectNext = 0 - let yIntersectNext = 0 - - let endPoint = prevLines.y1 > nextLines.y2 ? prevLines.y1 : nextLines.y2 - let biggerEndPoint = prevLines.y1 > nextLines.y2 ? 'left' : 'right' - - //bottom일 경우 - xIntersectPrev = (endPoint - c1) / m1 - yIntersectPrev = m1 * xIntersectPrev + c1 - xIntersectNext = (endPoint - c2) / m2 - yIntersectNext = m2 * xIntersectNext + c2 - - let lineCoords - let polygonCoords - let ratio = 1 - if (biggerEndPoint === 'left') { - //왼쪽이 더 밑이면 우측 라인에 절편으로 계산 - lineCoords = [prevLines.x1, yIntersectNext, xIntersectNext, yIntersectNext] - polygonCoords = [ - { x: prevLines.x1, y: yIntersectNext }, - { x: xIntersectNext, y: yIntersectNext }, - { x: overlapCoords.x, y: overlapCoords.y }, - ] - ratio = moduleWidthLength / Math.abs(prevLines.x1 - xIntersectNext) - } else { - lineCoords = [xIntersectPrev, yIntersectPrev, nextLines.x2, yIntersectPrev] - polygonCoords = [ - { x: xIntersectPrev, y: yIntersectPrev }, - { x: nextLines.x2, y: yIntersectPrev }, - { x: overlapCoords.x, y: overlapCoords.y }, - ] - ratio = moduleWidthLength / Math.abs(nextLines.x2 - xIntersectPrev) - } - - const tempTriangle = new QPolygon(polygonCoords, { - fill: 'transparent', - stroke: 'green', - strokeWidth: 2, - originY: 'bottom', - strokeDashArray: [5, 5], - // fontSize: 15, - }) - - // canvas.add(tempTriangle) - - let cloneCoords = [] - tempTriangle.clone((clone) => { - clone.scale(ratio) - cloneCoords = clone.getCurrentPoints() - }) - - //아래쪽에선 잴 작은 - const vertexPoints = cloneCoords.reduce((acc, point, index) => (acc['y'] > point['y'] ? acc : point)) - - const differenceDistance = overlapCoords.x - vertexPoints.x - - const newTriangleCoords = cloneCoords.map((point) => { - return { x: point.x + differenceDistance, y: point.y } - }) - - const deleteBottomPoint = newTriangleCoords.reduce((acc, point) => (acc['y'] > point['y'] ? acc : point)) - const deleteIndex = newTriangleCoords.indexOf(deleteBottomPoint) - if (deleteIndex !== -1) newTriangleCoords.splice(deleteIndex, 1) - - const newLine = new QLine([newTriangleCoords[0].x, newTriangleCoords[0].y, newTriangleCoords[1].x, newTriangleCoords[1].y], { - fill: 'transparent', - stroke: 'red', - strokeWidth: 2, - selectable: true, - fontSize: 14, - }) - canvas.add(newLine) - return newLine - } - - const topModuleLine = (nowSurface) => { - let selectedLine = null - const moduleWidthLength = 173.3 + 5 //임시 약간 여유를 줌 - - const topFlow = nowSurface.lines.reduce( + const topFlow = surface.lines.reduce( (acc, line, index) => { if (line.y1 < acc.y1 || (line.y1 === acc.y1 && line.x1 < acc.x1)) { return { x1: line.x1, y1: line.y1, index: index } @@ -927,117 +743,80 @@ export function useModuleBasicSetting() { }, { x1: Infinity, y1: Infinity, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 ) - selectedLine = topFlow + flowArray.push(topFlow) - let prevLines = nowSurface.lines[(selectedLine.index - 1 + nowSurface.lines.length) % nowSurface.lines.length] - let nextLines = nowSurface.lines[selectedLine.index] - const overlapCoords = { x: nextLines.x1, y: nextLines.y1 } //겹치는 꼭지점 + let idx = 0 + let rtnObjArray = [] + flowArray.forEach((center) => { + const linesArray = new Array() - const m1 = (prevLines.y2 - prevLines.y1) / (prevLines.x2 - prevLines.x1) - const m2 = (nextLines.y2 - nextLines.y1) / (nextLines.x2 - nextLines.x1) + surface.lines.filter((line) => { + if ((center.x1 === line.x1 && center.y1 === line.y1) || (center.x1 === line.x2 && center.y1 === line.y2)) { + linesArray.push(line) + } + }) - const c1 = prevLines.y1 - m1 * prevLines.x1 - const c2 = nextLines.y1 - m2 * nextLines.x1 + let coords = [] + if (center.index === 0) { + coords = [ + { x: linesArray[0].x2, y: linesArray[0].y2 }, + { x: center.x1, y: center.y1 }, + { x: linesArray[1].x1, y: linesArray[1].y1 }, + ] + } else { + coords = [ + { x: linesArray[0].x1, y: linesArray[0].y1 }, + { x: center.x1, y: center.y1 }, + { x: linesArray[1].x2, y: linesArray[1].y2 }, + ] + } - // Step 2: Calculate intersection point + const adjust1 = coords[0].x - coords[1].x + const height1 = coords[1].y - coords[0].y + const angle1 = Math.abs(Math.round(Math.atan(height1 / adjust1) * (180 / Math.PI) * 1000) / 1000) - let xIntersectPrev = 0 - let yIntersectPrev = 0 - let xIntersectNext = 0 - let yIntersectNext = 0 + const adjust2 = coords[2].x - coords[1].x + const height2 = coords[2].y - coords[1].y + const angle2 = Math.abs(Math.round(Math.atan(height2 / adjust2) * (180 / Math.PI) * 1000) / 1000) + const angle3 = 180 - (angle1 + angle2) - let endPoint = prevLines.y1 > nextLines.y2 ? nextLines.y2 : prevLines.y1 - let biggerEndPoint = prevLines.y1 < nextLines.y2 ? 'left' : 'right' + const charlie = 173.3 + 3 // 평행선길이 약간 여유를 줌 + const alpha = (charlie * Math.sin((angle1 * Math.PI) / 180)) / Math.sin((angle3 * Math.PI) / 180) + const beta = Math.sqrt(alpha ** 2 + charlie ** 2 - 2 * alpha * charlie * Math.cos((angle2 * Math.PI) / 180)) + const h = beta * Math.sin((angle1 * Math.PI) / 180) // 높이 + const sign = Math.sign(coords[0].y - coords[1].y) // 진행방향 + const top = coords[1].y + sign * h // 변경되는 높이 좌표 값 + // const line3 = new QLine([coords[1].x, coords[1].y, coords[1].x, top], { + // stroke: 'blue', + // strokeWidth: 1, + // selectable: true, + // }) + // // canvas?.add(line3) - //bottom일 경우 - xIntersectPrev = (endPoint - c1) / m1 - yIntersectPrev = m1 * xIntersectPrev + c1 - xIntersectNext = (endPoint - c2) / m2 - yIntersectNext = m2 * xIntersectNext + c2 + const pointX1 = coords[0].x + ((coords[0].y - top) / (coords[0].y - coords[1].y)) * (coords[1].x - coords[0].x) + const pointY1 = top + const pointX2 = coords[2].x + ((coords[2].y - top) / (coords[2].y - coords[1].y)) * (coords[1].x - coords[2].x) + const pointY2 = top - let lineCoords - let polygonCoords - let ratio = 1 + const finalLine = new QLine([pointX1, pointY1, pointX2, pointY2], { + stroke: 'red', + strokeWidth: 1, + selectable: true, + }) + canvas?.add(finalLine) + canvas?.renderAll() - if (biggerEndPoint === 'left') { - //왼쪽이 더 밑이면 우측 라인에 절편으로 계산 - lineCoords = [prevLines.x1, yIntersectNext, xIntersectNext, yIntersectNext] - polygonCoords = [ - { x: prevLines.x1, y: yIntersectNext }, - { x: xIntersectNext, y: yIntersectNext }, - { x: overlapCoords.x, y: overlapCoords.y }, - ] - ratio = moduleWidthLength / Math.abs(prevLines.x1 - xIntersectNext) - } else { - lineCoords = [xIntersectPrev, yIntersectPrev, nextLines.x2, yIntersectPrev] - polygonCoords = [ - { x: xIntersectPrev, y: yIntersectPrev }, - { x: nextLines.x2, y: yIntersectPrev }, - { x: overlapCoords.x, y: overlapCoords.y }, - ] - ratio = moduleWidthLength / Math.abs(nextLines.x2 - xIntersectPrev) - } - - const tempTriangle = new QPolygon(polygonCoords, { - fill: 'transparent', - stroke: 'green', - strokeWidth: 2, - originY: 'top', - strokeDashArray: [5, 5], - // fontSize: 15, + const rtnObj = { target: idx === 0 ? 'bottom' : 'top', x1: pointX1, y1: pointY1, x2: pointX2, y2: pointY2 } + rtnObjArray.push(rtnObj) + ++idx }) - // canvas.add(tempTriangle) - - let cloneCoords = [] - tempTriangle.clone((clone) => { - clone.scale(ratio) - cloneCoords = clone.getCurrentPoints() - }) - - //아래쪽에선 잴 작은 - const vertexPoints = cloneCoords.reduce((acc, point, index) => (acc['y'] < point['y'] ? acc : point)) - - const differenceDistance = overlapCoords.x - vertexPoints.x - - const newTriangleCoords = cloneCoords.map((point) => { - return { x: point.x + differenceDistance, y: point.y } - }) - - // const newTriangle1 = new QPolygon(newTriangleCoords, { - // fill: 'transparent', - // stroke: 'red', - // strokeWidth: 1, - // selectable: true, - // fontSize: 14, - // }) - // canvas.add(newTriangle1) - - const deleteBottomPoint = newTriangleCoords.reduce((acc, point) => (acc['y'] < point['y'] ? acc : point)) - const deleteIndex = newTriangleCoords.indexOf(deleteBottomPoint) - if (deleteIndex !== -1) newTriangleCoords.splice(deleteIndex, 1) - - const newLine = new QLine([newTriangleCoords[0].x, newTriangleCoords[0].y, newTriangleCoords[1].x, newTriangleCoords[1].y], { - fill: 'transparent', - stroke: 'red', - strokeWidth: 2, - selectable: true, - fontSize: 14, - }) - canvas.add(newLine) - return newLine + return rtnObjArray } - const leftModuleLine = (nowSurface) => { - let selectedLine = null - - sortLinesByTopLeft(nowSurface) - - console.log('nowSurface', nowSurface) - - const moduleWidthLength = 173.3 + 5 //임시 약간 여유를 줌 - - const leftFlow = nowSurface.lines.reduce( + const leftRightFlowLine = (surface) => { + const flowArray = [] + const leftFlow = surface.lines.reduce( (acc, line, index) => { if (line.x1 < acc.x1 || (line.x1 === acc.x1 && line.y1 < acc.y1)) { return { x1: line.x1, y1: line.y1, index: index } @@ -1046,143 +825,135 @@ export function useModuleBasicSetting() { }, { x1: Infinity, y1: Infinity, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 ) - selectedLine = leftFlow + flowArray.push(leftFlow) - let prevLines = nowSurface.lines[(selectedLine.index - 1 + nowSurface.lines.length) % nowSurface.lines.length] - let nextLines = nowSurface.lines[selectedLine.index] - const overlapCoords = { x: nextLines.x1, y: nextLines.y1 } //겹치는 꼭지점 + const rightFlow = surface.lines.reduce( + (acc, line, index) => { + if (line.x1 > acc.x1 || (line.x1 === acc.x1 && line.y1 > acc.y1)) { + return { x1: line.x1, y1: line.y1, index: index } + } + return acc + }, + { x1: 0, y1: 0, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 + ) + flowArray.push(rightFlow) - const m1 = (prevLines.y2 - prevLines.y1) / (prevLines.x2 - prevLines.x1) - const m2 = (nextLines.y2 - nextLines.y1) / (nextLines.x2 - nextLines.x1) + let idx = 0 + let rtnObjArray = [] + flowArray.forEach((center) => { + const linesArray = surface.lines.filter((line) => { + if ((center.x1 === line.x1 && center.y1 === line.y1) || (center.x1 === line.x2 && center.y1 === line.y2)) { + return line + } + }) - const c1 = prevLines.y1 - m1 * prevLines.x1 - const c2 = nextLines.y1 - m2 * nextLines.x1 + let coords = [] + if (center.index === 0) { + coords = [ + { x: linesArray[1].x1, y: linesArray[1].y1 }, + { x: center.x1, y: center.y1 }, + { x: linesArray[0].x2, y: linesArray[0].y2 }, + ] + } else { + coords = [ + { x: linesArray[0].x1, y: linesArray[0].y1 }, + { x: center.x1, y: center.y1 }, + { x: linesArray[1].x2, y: linesArray[1].y2 }, + ] + } - // Step 2: Calculate intersection point + const adjust1 = coords[0].x - coords[1].x + const height1 = coords[1].y - coords[0].y + const angle1 = Math.abs(Math.round(Math.atan(adjust1 / height1) * (180 / Math.PI) * 1000) / 1000) - let xIntersectPrev = 0 - let yIntersectPrev = 0 - let xIntersectNext = 0 - let yIntersectNext = 0 + const adjust2 = coords[2].x - coords[1].x + const height2 = coords[2].y - coords[1].y + const angle2 = Math.abs(Math.round(Math.atan(adjust2 / height2) * (180 / Math.PI) * 1000) / 1000) + const angle3 = 180 - (angle1 + angle2) - let biggerEndPoint = prevLines.x1 > nextLines.x2 ? 'top' : 'bottom' - console.log('prevLines.x1', prevLines.x1) - console.log('nextLines.x2', nextLines.x2) - console.log('biggerEndPoint', biggerEndPoint) + const charlie = 173.3 + 3 // 평행선길이 약간 여유를줌 + const alpha = (charlie * Math.sin((angle1 * Math.PI) / 180)) / Math.sin((angle3 * Math.PI) / 180) + const beta = Math.sqrt(alpha ** 2 + charlie ** 2 - 2 * alpha * charlie * Math.cos((angle2 * Math.PI) / 180)) - //bottom일 경우 - xIntersectPrev = prevLines.x1 - yIntersectPrev = m1 * xIntersectPrev + c1 - xIntersectNext = prevLines.x1 - yIntersectNext = m2 * xIntersectNext + c2 + const h = beta * Math.sin((angle1 * Math.PI) / 180) // 높이 + const sign = Math.sign(coords[0].x - coords[1].x) // 진행방향 + const top = coords[1].x + sign * h // 변경되는 높이 좌표 값 - let lineCoords - let polygonCoords - let ratio = 1 + // const line3 = new QLine([coords[1].x, coords[1].y, top, coords[1].y], { + // stroke: 'blue', + // strokeWidth: 1, + // selectable: true, + // }) + // canvas?.add(line3) - if (biggerEndPoint === 'top') { - //윗쪽이이 더 밑이면 아래 라인에 절편으로 계산 - lineCoords = [prevLines.x1, yIntersectNext, xIntersectNext, yIntersectNext] - polygonCoords = [ - { x: prevLines.x1, y: yIntersectNext }, - { x: xIntersectNext, y: yIntersectNext }, - { x: overlapCoords.x, y: overlapCoords.y }, - ] - ratio = moduleWidthLength / Math.abs(prevLines.x1 - xIntersectNext) - } else { - lineCoords = [xIntersectPrev, prevLines.y1, xIntersectPrev, yIntersectPrev] - polygonCoords = [ - { x: xIntersectNext, y: prevLines.y1 }, - { x: xIntersectNext, y: yIntersectNext }, - { x: overlapCoords.x, y: overlapCoords.y }, - ] - ratio = moduleWidthLength / Math.abs(prevLines.y1 - yIntersectNext) - } + const pointX1 = top + const pointY1 = coords[0].y + ((coords[0].x - top) / (coords[0].x - coords[1].x)) * (coords[1].y - coords[0].y) + const pointX2 = top + const pointY2 = coords[2].y + ((coords[2].x - top) / (coords[2].x - coords[1].x)) * (coords[1].y - coords[2].y) - const tempTriangle = new QPolygon(polygonCoords, { - fill: 'transparent', - stroke: 'green', - strokeWidth: 2, - originX: 'left', - strokeDashArray: [5, 5], - // fontSize: 15, - selectable: true, + const finalLine = new QLine([pointX1, pointY1, pointX2, pointY2], { + stroke: 'red', + strokeWidth: 1, + selectable: true, + }) + canvas?.add(finalLine) + canvas?.renderAll() + + const rtnObj = { target: idx === 0 ? 'left' : 'right', x1: pointX1, y1: pointY1, x2: pointX2, y2: pointY2 } + rtnObjArray.push(rtnObj) + ++idx }) - - // canvas.add(tempTriangle) - - let cloneCoords = [] - tempTriangle.clone((clone) => { - clone.scale(ratio) - cloneCoords = clone.getCurrentPoints() - // canvas.add(clone) - }) - - canvas.remove(tempTriangle) - - //left에선 가장 왼쪽 - const vertexPoints = cloneCoords.reduce((acc, point, index) => (acc['x'] < point['x'] ? acc : point)) - const differenceDistance = overlapCoords.y - vertexPoints.y - - const newTriangleCoords = cloneCoords.map((point) => { - return { x: point.x, y: point.y + differenceDistance } - }) - - // const newTriangle1 = new QPolygon(newTriangleCoords, { - // fill: 'transparent', - // stroke: 'red', - // strokeWidth: 1, - // selectable: true, - // fontSize: 14, - // }) - // canvas.add(newTriangle1) - - const deleteLeftPoint = newTriangleCoords.reduce((acc, point) => (acc['x'] < point['x'] ? acc : point)) - const deleteIndex = newTriangleCoords.indexOf(deleteLeftPoint) - if (deleteIndex !== -1) newTriangleCoords.splice(deleteIndex, 1) - - const newLine = new QLine([newTriangleCoords[0].x, newTriangleCoords[0].y, newTriangleCoords[1].x, newTriangleCoords[1].y], { - fill: 'transparent', - stroke: 'red', - strokeWidth: 2, - viewLengthText: false, - // selectable: true, - fontSize: 14, - }) - canvas.add(newLine) - return newLine } - function sortLinesByTopLeft(surface) { - // 좌측 상단 기준으로 정렬 - const sortedLines = surface.lines.sort((a, b) => { - // x1, y1 값을 기준으로 정렬 - if (a.x1 !== b.x1) { - return a.x1 - b.x1 // x1 기준 정렬 - } else { - return a.y1 - b.y1 // x1이 같으면 y1 기준 정렬 - } - }) + const findSetupSurfaceMaxLines = (surface) => { + const leftFlow = surface.lines.reduce( + (acc, line, index) => { + if (line.x1 < acc.x1 || (line.x1 === acc.x1 && line.y1 < acc.y1)) { + return { x1: line.x1, y1: line.y1 } + } + return acc + }, + { x1: Infinity, y1: Infinity, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 + ) - // 정렬된 결과를 기반으로 좌표 재정렬 - sortedLines.forEach((line) => { - // 좌측 상단이 (0,0) 기준이 되도록 좌표 이동 - const minX = Math.min(line.x1, line.x2) - const minY = Math.min(line.y1, line.y2) + const rightFlow = surface.lines.reduce( + (acc, line, index) => { + if (line.x1 > acc.x1 || (line.x1 === acc.x1 && line.y1 > acc.y1)) { + return { x1: line.x1, y1: line.y1 } + } + return acc + }, + { x1: 0, y1: 0, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 + ) - line.set({ - x1: line.x1 - minX, - y1: line.y1 - minY, - x2: line.x2 - minX, - y2: line.y2 - minY, - }) - }) + const topFlow = surface.lines.reduce( + (acc, line, index) => { + if (line.y1 < acc.y1 || (line.y1 === acc.y1 && line.x1 < acc.x1)) { + return { x1: line.x1, y1: line.y1 } + } + return acc + }, + { x1: Infinity, y1: Infinity, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 + ) - surface.set({ - sortedLines: sortedLines, - }) + const bottomFlow = surface.lines.reduce( + (acc, line, index) => { + if (line.y1 > acc.y1 || (line.y1 === acc.y1 && line.x1 > acc.x1)) { + return { x1: line.x1, y1: line.y1 } + } + return acc + }, + { x1: 0, y1: 0, index: -1 }, // 초기값: 무한대와 유효하지 않은 인덱스 + ) - return sortedLines + const obj = { + left: leftFlow, + right: rightFlow, + top: topFlow, + bottom: bottomFlow, + } + + return obj } return { From a084b5dbf3483b4884bdeb59bb422ef27bc85bba Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 27 Nov 2024 13:56:46 +0900 Subject: [PATCH 184/200] =?UTF-8?q?useContext=20->=20useEvent=20=EC=9B=90?= =?UTF-8?q?=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/floor-plan/layout.js | 15 ++- .../common/context-menu/QContextMenu.jsx | 7 +- src/components/floor-plan/CanvasMenu.jsx | 9 +- .../floor-plan/modal/basic/BasicSetting.jsx | 7 +- .../lineProperty/LinePropertySetting.jsx | 7 +- .../modal/wallLineOffset/type/Offset.jsx | 7 +- .../modal/wallLineOffset/type/WallLine.jsx | 7 +- src/hooks/common/useCommonUtils.js | 7 +- src/hooks/module/useModuleBasicSetting.js | 17 ++- src/hooks/object/useObjectBatch.js | 7 +- src/hooks/roofcover/useAuxiliaryDrawing.js | 7 +- src/hooks/roofcover/useEavesGableEdit.js | 7 +- src/hooks/roofcover/useMovementSetting.js | 8 +- .../roofcover/useRoofShapePassivitySetting.js | 13 +- .../roofcover/useWallLineOffsetSetting.js | 7 +- src/hooks/surface/usePlacementShapeDrawing.js | 114 +++++++++++++++--- src/hooks/surface/useSurfaceShapeBatch.js | 83 ++++++++++--- src/hooks/useCanvas.js | 12 +- src/hooks/useEvent.js | 3 +- 19 files changed, 229 insertions(+), 115 deletions(-) diff --git a/src/app/floor-plan/layout.js b/src/app/floor-plan/layout.js index 532a83d6..8c1d393d 100644 --- a/src/app/floor-plan/layout.js +++ b/src/app/floor-plan/layout.js @@ -3,20 +3,19 @@ import FloorPlanProvider from './FloorPlanProvider' import FloorPlan from '@/components/floor-plan/FloorPlan' import CanvasLayout from '@/components/floor-plan/CanvasLayout' -import EventProvider from './EventProvider' export default function FloorPlanLayout({ children }) { console.log('🚀 ~ FloorPlanLayout ~ FloorPlanLayout:') return ( <> - - - - {children} - - - + {/**/} + + + {children} + + + {/**/} ) } diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index e7070aec..19791ffc 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -1,12 +1,11 @@ 'use client' -import { useContext, useEffect } from 'react' +import { useEffect } from 'react' import '@/styles/contents.scss' import { useRecoilState, useRecoilValue } from 'recoil' import { contextMenuListState, contextMenuState } from '@/store/contextMenu' import { useTempGrid } from '@/hooks/useTempGrid' import { useContextMenu } from '@/hooks/useContextMenu' import { useEvent } from '@/hooks/useEvent' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function QContextMenu(props) { const { contextRef, canvasProps } = props @@ -15,8 +14,8 @@ export default function QContextMenu(props) { const activeObject = canvasProps?.getActiveObject() //액티브된 객체를 가져옴 const { tempGridMode, setTempGridMode } = useTempGrid() const { handleKeyup } = useContextMenu() - // const { addDocumentEventListener, removeDocumentEvent } = useEvent() - const { addDocumentEventListener, removeDocumentEvent } = useContext(EventContext) + const { addDocumentEventListener, removeDocumentEvent } = useEvent() + // const { addDocumentEventListener, removeDocumentEvent } = useContext(EventContext) let contextType = '' diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 65849256..79944044 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -33,15 +33,12 @@ import useMenu from '@/hooks/common/useMenu' import { MENU } from '@/common/common' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' -import { estimateState } from '@/store/floorPlanObjectAtom' +import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom' import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import EstimateCopyPop from '../estimate/popup/EstimateCopyPop' - -import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' import { pwrGnrSimTypeState } from '@/store/simulatorAtom' import { useAxios } from '@/hooks/useAxios' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props @@ -71,8 +68,8 @@ export default function CanvasMenu(props) { const { getMessage } = useMessage() const { currentCanvasPlan, saveCanvas } = usePlan() const { swalFire } = useSwal() - // const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() - const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext) + const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() + // const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext) const commonUtils = useRecoilValue(commonUtilsState) const { commonFunctions } = useCommonUtils() const SelectOption = [{ name: '瓦53A' }, { name: '瓦53A' }] diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 68bb0a49..68301128 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -1,6 +1,6 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import Module from '@/components/floor-plan/modal/basic/step/Module' import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchModule' import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement' @@ -11,7 +11,6 @@ import { usePopup } from '@/hooks/usePopup' import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' import { useEvent } from '@/hooks/useEvent' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() @@ -19,8 +18,8 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const [tabNum, setTabNum] = useState(1) const canvasSetting = useRecoilValue(canvasSettingState) const orientationRef = useRef(null) - // const { initEvent } = useEvent() - const { initEvent } = useContext(EventContext) + const { initEvent } = useEvent() + // const { initEvent } = useContext(EventContext) const { makeModuleInstArea, manualModuleSetup, autoModuleSetup } = useModuleBasicSetting() const handleBtnNextStep = () => { if (tabNum === 1) { diff --git a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx index 789d048c..13a00b06 100644 --- a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx +++ b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx @@ -3,11 +3,10 @@ import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' import { useMessage } from '@/hooks/useMessage' import { usePopup } from '@/hooks/usePopup' -import { useState, useEffect, useContext } from 'react' +import { useEffect, useState } from 'react' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' import { useEvent } from '@/hooks/useEvent' import { LINE_TYPE } from '@/common/common' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function LinePropertySetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -15,8 +14,8 @@ export default function LinePropertySetting(props) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, changeSurfaceLinePropertyReset } = useSurfaceShapeBatch() - // const { initEvent } = useEvent() - const { initEvent } = useContext(EventContext) + const { initEvent } = useEvent() + // const { initEvent } = useContext(EventContext) const properties = [ { name: getMessage('eaves.line'), value: LINE_TYPE.WALLLINE.EAVES }, diff --git a/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx b/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx index d3afd459..418a9419 100644 --- a/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx +++ b/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx @@ -1,12 +1,11 @@ import { useMessage } from '@/hooks/useMessage' -import { useContext, useEffect, useState } from 'react' +import { useEffect, useState } from 'react' import { useEvent } from '@/hooks/useEvent' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function Offset({ length1Ref, arrow1Ref, currentWallLineRef }) { const { getMessage } = useMessage() - // const { addDocumentEventListener, initEvent } = useEvent() - const { addDocumentEventListener, initEvent } = useContext(EventContext) + const { addDocumentEventListener, initEvent } = useEvent() + // const { addDocumentEventListener, initEvent } = useContext(EventContext) useEffect(() => { addDocumentEventListener('keydown', document, keyDown) diff --git a/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx b/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx index c736d397..581f57f3 100644 --- a/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx +++ b/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx @@ -1,12 +1,11 @@ import { useMessage } from '@/hooks/useMessage' -import { forwardRef, useContext, useEffect, useImperativeHandle, useState } from 'react' +import { forwardRef, useEffect, useImperativeHandle, useState } from 'react' import { useEvent } from '@/hooks/useEvent' -import { EventContext } from '@/app/floor-plan/EventProvider' export default forwardRef(function WallLine({ length1Ref, length2Ref, arrow1Ref, arrow2Ref, radioTypeRef, currentWallLineRef }, ref) { const { getMessage } = useMessage() - // const { addDocumentEventListener, initEvent } = useEvent() - const { addDocumentEventListener, initEvent } = useContext(EventContext) + const { addDocumentEventListener, initEvent } = useEvent() + // const { addDocumentEventListener, initEvent } = useContext(EventContext) const [type, setType] = useState(1) const [arrow1, setArrow1] = useState('up') const [arrow2, setArrow2] = useState('up') diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 5c8fcfee..1f9c2063 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -1,4 +1,4 @@ -import { useContext, useEffect } from 'react' +import { useEffect } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { wordDisplaySelector } from '@/store/settingAtom' import { useEvent } from '@/hooks/useEvent' @@ -9,13 +9,12 @@ import { canvasState } from '@/store/canvasAtom' import { v4 as uuidv4 } from 'uuid' import { usePopup } from '@/hooks/usePopup' import Distance from '@/components/floor-plan/modal/distance/Distance' -import { EventContext } from '@/app/floor-plan/EventProvider' export function useCommonUtils() { const canvas = useRecoilValue(canvasState) const wordDisplay = useRecoilValue(wordDisplaySelector) - // const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useContext(EventContext) const dimensionSettings = useRecoilValue(dimensionLineSettingsState) const dimensionLineTextFont = useRecoilValue(fontSelector('dimensionLineText')) const commonTextFont = useRecoilValue(fontSelector('commonText')) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index eb6ac973..07752606 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -1,25 +1,22 @@ -import { useContext, useEffect, useState } from 'react' -import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' -import { canvasState } from '@/store/canvasAtom' +import { useRecoilState, useRecoilValue } from 'recoil' +import { canvasState, moduleIsSetupState, moduleSetupSurfaceState } from '@/store/canvasAtom' import { rectToPolygon, setSurfaceShapePattern } from '@/util/canvas-util' import { roofDisplaySelector } from '@/store/settingAtom' import offsetPolygon from '@/util/qpolygon-utils' import { QPolygon } from '@/components/fabric/QPolygon' import { QLine } from '@/components/fabric/QLine' -import { moduleSetupSurfaceState, moduleIsSetupState } from '@/store/canvasAtom' import { useEvent } from '@/hooks/useEvent' -import { POLYGON_TYPE, BATCH_TYPE } from '@/common/common' +import { BATCH_TYPE, POLYGON_TYPE } from '@/common/common' import * as turf from '@turf/turf' -import { EventContext } from '@/app/floor-plan/EventProvider' export function useModuleBasicSetting() { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) const [moduleSetupSurface, setModuleSetupSurface] = useRecoilState(moduleSetupSurfaceState) const [moduleIsSetup, setModuleIsSetup] = useRecoilState(moduleIsSetupState) - // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() - const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() + // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) let selectedModuleInstSurfaceArray = [] const makeModuleInstArea = () => { @@ -700,7 +697,7 @@ export function useModuleBasicSetting() { } if (leftBottomCnt + rightBottomCnt === 0) { exposedBottom++ - return + } }) // 노출상면 체크 @@ -728,7 +725,7 @@ export function useModuleBasicSetting() { } if (leftTopCnt + rightTopCnt === 0) { exposedTop++ - return + } }) return { diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index 2227e5db..dd67b017 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -1,5 +1,5 @@ 'use client' -import { useContext, useEffect } from 'react' +import { useEffect } from 'react' import { useMessage } from '@/hooks/useMessage' import { useRecoilValue } from 'recoil' import { canvasState } from '@/store/canvasAtom' @@ -12,13 +12,12 @@ import { usePolygon } from '@/hooks/usePolygon' import { QPolygon } from '@/components/fabric/QPolygon' import { v4 as uuidv4 } from 'uuid' import { fontSelector } from '@/store/fontAtom' -import { EventContext } from '@/app/floor-plan/EventProvider' export function useObjectBatch({ isHidden, setIsHidden }) { const { getMessage } = useMessage() const canvas = useRecoilValue(canvasState) - // const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() - const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() + // const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useContext(EventContext) const { swalFire } = useSwal() const { drawDirectionArrow } = usePolygon() const lengthTextFont = useRecoilValue(fontSelector('lengthText')) diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 6d5d384f..55053b7e 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -1,4 +1,4 @@ -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { adsorptionRangeState, canvasState, verticalHorizontalModeState } from '@/store/canvasAtom' import { useEvent } from '@/hooks/useEvent' @@ -22,13 +22,12 @@ import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { calculateAngle, isSamePoint } from '@/util/qpolygon-utils' import { POLYGON_TYPE } from '@/common/common' -import { EventContext } from '@/app/floor-plan/EventProvider' // 보조선 작성 export function useAuxiliaryDrawing(id) { const canvas = useRecoilValue(canvasState) - // const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useEvent() - const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useEvent() + // const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { tempGridMode } = useTempGrid() diff --git a/src/hooks/roofcover/useEavesGableEdit.js b/src/hooks/roofcover/useEavesGableEdit.js index 2c2a9b27..27e00a86 100644 --- a/src/hooks/roofcover/useEavesGableEdit.js +++ b/src/hooks/roofcover/useEavesGableEdit.js @@ -1,4 +1,4 @@ -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useRecoilValue } from 'recoil' import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, pitchTextSelector } from '@/store/canvasAtom' import { useMessage } from '@/hooks/useMessage' @@ -10,14 +10,13 @@ import { outerLineFixState } from '@/store/outerLineAtom' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree } from '@/util/canvas-util' -import { EventContext } from '@/app/floor-plan/EventProvider' // 처마.케라바 변경 export function useEavesGableEdit(id) { const canvas = useRecoilValue(canvasState) const { getMessage } = useMessage() - // const { addCanvasMouseEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { closePopup } = usePopup() const TYPES = { EAVES: 'eaves', diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js index 7051fe49..509c53f3 100644 --- a/src/hooks/roofcover/useMovementSetting.js +++ b/src/hooks/roofcover/useMovementSetting.js @@ -2,12 +2,10 @@ import { useRecoilValue } from 'recoil' import { canvasState, currentObjectState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' import { useMessage } from '@/hooks/useMessage' -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useEvent } from '@/hooks/useEvent' import { POLYGON_TYPE } from '@/common/common' import { OUTER_LINE_TYPE } from '@/store/outerLineAtom' -import { QLine } from '@/components/fabric/QLine' -import { EventContext } from '@/app/floor-plan/EventProvider' //동선이동 형 올림 내림 export function useMovementSetting(id) { @@ -16,8 +14,8 @@ export function useMovementSetting(id) { UP_DOWN: 'updown', //형 올림내림 } const canvas = useRecoilValue(canvasState) - // const { initEvent, addCanvasMouseEventListener } = useEvent() - const { initEvent, addCanvasMouseEventListener } = useContext(EventContext) + const { initEvent, addCanvasMouseEventListener } = useEvent() + // const { initEvent, addCanvasMouseEventListener } = useContext(EventContext) const { closePopup } = usePopup() const { getMessage } = useMessage() const currentObject = useRecoilValue(currentObjectState) diff --git a/src/hooks/roofcover/useRoofShapePassivitySetting.js b/src/hooks/roofcover/useRoofShapePassivitySetting.js index 656094f2..a2c799f4 100644 --- a/src/hooks/roofcover/useRoofShapePassivitySetting.js +++ b/src/hooks/roofcover/useRoofShapePassivitySetting.js @@ -1,6 +1,6 @@ import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, currentObjectState, pitchTextSelector } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useLine } from '@/hooks/useLine' import { useMessage } from '@/hooks/useMessage' import { useEvent } from '@/hooks/useEvent' @@ -11,7 +11,6 @@ import { outerLineFixState } from '@/store/outerLineAtom' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree } from '@/util/canvas-util' -import { EventContext } from '@/app/floor-plan/EventProvider' //지붕형상 수동 설정 export function useRoofShapePassivitySetting(id) { @@ -26,8 +25,8 @@ export function useRoofShapePassivitySetting(id) { const { getMessage } = useMessage() const { showLine, hideLine, addPitchTextsByOuterLines } = useLine() const { swalFire } = useSwal() - // const { addCanvasMouseEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { drawRoofPolygon } = useMode() const { addPolygonByLines } = usePolygon() const currentObject = useRecoilValue(currentObjectState) @@ -204,7 +203,11 @@ export function useRoofShapePassivitySetting(id) { wall = addPolygonByLines(lines, { name: POLYGON_TYPE.WALL, fill: 'transparent', stroke: 'black' }) } else { // 그냥 닫을 경우 처리 - wall = addPolygonByLines([...initLines.current], { name: POLYGON_TYPE.WALL, fill: 'transparent', stroke: 'black' }) + wall = addPolygonByLines([...initLines.current], { + name: POLYGON_TYPE.WALL, + fill: 'transparent', + stroke: 'black', + }) lines.forEach((line, idx) => { line.attributes = initLines.current[idx].attributes }) diff --git a/src/hooks/roofcover/useWallLineOffsetSetting.js b/src/hooks/roofcover/useWallLineOffsetSetting.js index b673bcc2..22af0f49 100644 --- a/src/hooks/roofcover/useWallLineOffsetSetting.js +++ b/src/hooks/roofcover/useWallLineOffsetSetting.js @@ -1,12 +1,11 @@ import { canvasState, currentObjectState } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useMessage } from '@/hooks/useMessage' import { useEvent } from '@/hooks/useEvent' import { useLine } from '@/hooks/useLine' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' -import { EventContext } from '@/app/floor-plan/EventProvider' // 외벽선 편집 및 오프셋 export function useWallLineOffsetSetting(id) { @@ -15,8 +14,8 @@ export function useWallLineOffsetSetting(id) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { swalFire } = useSwal() - // const { addCanvasMouseEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const wallLineEditRef = useRef(null) const length1Ref = useRef(null) const length2Ref = useRef(null) diff --git a/src/hooks/surface/usePlacementShapeDrawing.js b/src/hooks/surface/usePlacementShapeDrawing.js index 822ea5c9..95388ca4 100644 --- a/src/hooks/surface/usePlacementShapeDrawing.js +++ b/src/hooks/surface/usePlacementShapeDrawing.js @@ -12,7 +12,7 @@ import { useEvent } from '@/hooks/useEvent' import { useMouse } from '@/hooks/useMouse' import { useLine } from '@/hooks/useLine' import { useTempGrid } from '@/hooks/useTempGrid' -import { useContext, useEffect, useRef } from 'react' +import { useEffect, useRef } from 'react' import { distanceBetweenPoints, setSurfaceShapePattern } from '@/util/canvas-util' import { fabric } from 'fabric' import { calculateAngle } from '@/util/qpolygon-utils' @@ -33,15 +33,15 @@ import { POLYGON_TYPE } from '@/common/common' import { usePopup } from '@/hooks/usePopup' import { roofDisplaySelector } from '@/store/settingAtom' -import { EventContext } from '@/app/floor-plan/EventProvider' + // 면형상 배치 export function usePlacementShapeDrawing(id) { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) - // const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = - // useEvent() const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = - useContext(EventContext) + useEvent() + // const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = + // useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { addPolygonByLines, drawDirectionArrow } = usePolygon() @@ -432,56 +432,104 @@ export function usePlacementShapeDrawing(id) { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length1Value / 10, + y: prev[prev.length - 1].y + length2Value / 10, + }, + ] }) } else if (arrow1Value === '↓' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length1Value / 10, + y: prev[prev.length - 1].y + length2Value / 10, + }, + ] }) } else if (arrow1Value === '↑' && arrow2Value === '→') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y - length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length1Value / 10, + y: prev[prev.length - 1].y - length2Value / 10, + }, + ] }) } else if (arrow1Value === '↑' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length1Value / 10, y: prev[prev.length - 1].y - length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length1Value / 10, + y: prev[prev.length - 1].y - length2Value / 10, + }, + ] }) } else if (arrow1Value === '→' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length2Value / 10, + y: prev[prev.length - 1].y + length1Value / 10, + }, + ] }) } else if (arrow1Value === '→' && arrow2Value === '↑') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length2Value / 10, + y: prev[prev.length - 1].y - length1Value / 10, + }, + ] }) } else if (arrow1Value === '←' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length2Value / 10, + y: prev[prev.length - 1].y + length1Value / 10, + }, + ] }) } else if (arrow1Value === '←' && arrow2Value === '↑') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length2Value / 10, + y: prev[prev.length - 1].y - length1Value / 10, + }, + ] }) } @@ -537,35 +585,65 @@ export function usePlacementShapeDrawing(id) { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length2Value / 10, + y: prev[prev.length - 1].y + length1Value / 10, + }, + ] }) } else if (arrow1Value === '↓' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length2Value / 10, + y: prev[prev.length - 1].y + length1Value / 10, + }, + ] }) } else if (arrow1Value === '↑' && arrow2Value === '→') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length2Value / 10, + y: prev[prev.length - 1].y - length1Value / 10, + }, + ] }) } else if (arrow1Value === '↑' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length2Value / 10, + y: prev[prev.length - 1].y - length1Value / 10, + }, + ] }) } else if (arrow1Value === '→' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length1Value / 10, + y: prev[prev.length - 1].y + length2Value / 10, + }, + ] }) } else if (arrow1Value === '→' && arrow2Value === '↑') { setPoints((prev) => { diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index b0728ac8..844829d3 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -2,7 +2,7 @@ import { useRecoilValue } from 'recoil' import { canvasState, globalPitchState } from '@/store/canvasAtom' -import { MENU, BATCH_TYPE, POLYGON_TYPE } from '@/common/common' +import { MENU, POLYGON_TYPE } from '@/common/common' import { getIntersectionPoint, setSurfaceShapePattern } from '@/util/canvas-util' import { degreesToRadians } from '@turf/turf' import { QPolygon } from '@/components/fabric/QPolygon' @@ -15,8 +15,6 @@ import { usePolygon } from '@/hooks/usePolygon' import { fontSelector } from '@/store/fontAtom' import { slopeSelector } from '@/store/commonAtom' import { QLine } from '@/components/fabric/QLine' -import { EventContext } from '@/app/floor-plan/EventProvider' -import { useContext } from 'react' export function useSurfaceShapeBatch() { const { getMessage } = useMessage() @@ -28,8 +26,8 @@ export function useSurfaceShapeBatch() { const roofDisplay = useRecoilValue(roofDisplaySelector) const slope = useRecoilValue(slopeSelector(globalPitch)) const { swalFire } = useSwal() - // const { addCanvasMouseEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { closePopup } = usePopup() const applySurfaceShape = (surfaceRefs, selectedType, id) => { @@ -329,8 +327,14 @@ export function useSurfaceShapeBatch() { const angleInRadians = Math.asin(length2 / length3) points = [ { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, - { x: pointer.x - length1 / 2 + length3 * Math.cos(angleInRadians), y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians) }, - { x: pointer.x + length1 / 2 + length3 * Math.cos(angleInRadians), y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians) }, + { + x: pointer.x - length1 / 2 + length3 * Math.cos(angleInRadians), + y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians), + }, + { + x: pointer.x + length1 / 2 + length3 * Math.cos(angleInRadians), + y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians), + }, { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, ] @@ -341,9 +345,18 @@ export function useSurfaceShapeBatch() { { x: pointer.x - (length1 + length2 + length3) / 2, y: pointer.y - (length4 + length5) / 2 }, { x: pointer.x - (length1 + length2 + length3) / 2, y: pointer.y + (length4 + length5) / 2 }, { x: pointer.x - (length1 + length2 + length3) / 2 + length1, y: pointer.y + (length4 + length5) / 2 }, - { x: pointer.x - (length1 + length2 + length3) / 2 + length1, y: pointer.y + (length4 + length5) / 2 - length5 }, - { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, y: pointer.y + (length4 + length5) / 2 - length5 }, - { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, y: pointer.y + (length4 + length5) / 2 - length5 + length5 }, + { + x: pointer.x - (length1 + length2 + length3) / 2 + length1, + y: pointer.y + (length4 + length5) / 2 - length5, + }, + { + x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, + y: pointer.y + (length4 + length5) / 2 - length5, + }, + { + x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, + y: pointer.y + (length4 + length5) / 2 - length5 + length5, + }, { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2 + length3, y: pointer.y + (length4 + length5) / 2 - length5 + length5, @@ -362,8 +375,14 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length3 }, { x: pointer.x - length1 / 2 + length1 - (length1 - length2), y: pointer.y + length4 / 2 - length3 }, - { x: pointer.x - length1 / 2 + length1 - (length1 - length2), y: pointer.y + length4 / 2 - length3 + (length3 - length4) }, - { x: pointer.x - length1 / 2 + length1 - (length1 - length2) - length2, y: pointer.y + length4 / 2 - length3 + (length3 - length4) }, + { + x: pointer.x - length1 / 2 + length1 - (length1 - length2), + y: pointer.y + length4 / 2 - length3 + (length3 - length4), + }, + { + x: pointer.x - length1 / 2 + length1 - (length1 - length2) - length2, + y: pointer.y + length4 / 2 - length3 + (length3 - length4), + }, ] break @@ -374,8 +393,14 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 }, { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 }, - { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 + (length4 - length5) }, - { x: pointer.x - length1 / 2 + length1 - length3 - length2, y: pointer.y + length4 / 2 - length4 + (length4 - length5) }, + { + x: pointer.x - length1 / 2 + length1 - length3, + y: pointer.y + length4 / 2 - length4 + (length4 - length5), + }, + { + x: pointer.x - length1 / 2 + length1 - length3 - length2, + y: pointer.y + length4 / 2 - length4 + (length4 - length5), + }, ] break } @@ -385,8 +410,14 @@ export function useSurfaceShapeBatch() { { x: pointer.x + length1 / 2 - length1, y: pointer.y + length4 / 2 }, { x: pointer.x + length1 / 2 - length1, y: pointer.y + length4 / 2 - length5 }, { x: pointer.x + length1 / 2 - length1 + length2, y: pointer.y + length4 / 2 - length5 }, - { x: pointer.x + length1 / 2 - length1 + length2, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, - { x: pointer.x + length1 / 2 - length1 + length2 + length3, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + { + x: pointer.x + length1 / 2 - length1 + length2, + y: pointer.y + length4 / 2 - length5 - (length4 - length5), + }, + { + x: pointer.x + length1 / 2 - length1 + length2 + length3, + y: pointer.y + length4 / 2 - length5 - (length4 - length5), + }, ] break } @@ -396,8 +427,14 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length5 }, { x: pointer.x - length1 / 2 + length1 - length2, y: pointer.y + length4 / 2 - length5 }, - { x: pointer.x - length1 / 2 + length1 - length2, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, - { x: pointer.x - length1 / 2 + length1 - length2 - length3, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + { + x: pointer.x - length1 / 2 + length1 - length2, + y: pointer.y + length4 / 2 - length5 - (length4 - length5), + }, + { + x: pointer.x - length1 / 2 + length1 - length2 - length3, + y: pointer.y + length4 / 2 - length5 - (length4 - length5), + }, ] break } @@ -408,7 +445,10 @@ export function useSurfaceShapeBatch() { const leftAngle = Math.acos((length1 - length2) / 2 / leftHypotenuse) points = [ - { x: pointer.x - length1 / 2 + leftHypotenuse * Math.cos(leftAngle), y: pointer.y + length3 / 2 - leftHypotenuse * Math.sin(leftAngle) }, + { + x: pointer.x - length1 / 2 + leftHypotenuse * Math.cos(leftAngle), + y: pointer.y + length3 / 2 - leftHypotenuse * Math.sin(leftAngle), + }, { x: pointer.x - length1 / 2, y: pointer.y + length3 / 2 }, { x: pointer.x + length1 / 2, y: pointer.y + length3 / 2 }, { @@ -497,7 +537,10 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 + length4 }, { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 + length4 }, - { x: pointer.x - length1 / 2 + length2 + (length1 - length2 - length3) / 2, y: pointer.y + length4 / 2 - length4 + length5 }, + { + x: pointer.x - length1 / 2 + length2 + (length1 - length2 - length3) / 2, + y: pointer.y + length4 / 2 - length4 + length5, + }, ] break } diff --git a/src/hooks/useCanvas.js b/src/hooks/useCanvas.js index 46dbbb35..c2dca8cc 100644 --- a/src/hooks/useCanvas.js +++ b/src/hooks/useCanvas.js @@ -13,7 +13,7 @@ import { writeImage } from '@/lib/canvas' import { useCanvasEvent } from '@/hooks/useCanvasEvent' import { useAxios } from '@/hooks/useAxios' import { useFont } from '@/hooks/common/useFont' -import { OBJECT_PROTOTYPE, RELOAD_TYPE_PROTOTYPE, SAVE_KEY } from '@/common/common' +import { OBJECT_PROTOTYPE, SAVE_KEY } from '@/common/common' export function useCanvas(id) { const [canvas, setCanvas] = useRecoilState(canvasState) @@ -37,6 +37,7 @@ export function useCanvas(id) { selection: false, }) + console.log('canvas', c) setCanvas(c) setCanvasForEvent(c) attachDefaultEventOnCanvas() @@ -394,7 +395,14 @@ export function useCanvas(id) { await post({ url: '/api/canvas-management/canvas-statuses', data: patternData }) - setThumbnails((prev) => [...prev, { imageName: `/canvasState/${title}.png`, userId, canvasStatus: JSON.stringify(canvasStatus) }]) + setThumbnails((prev) => [ + ...prev, + { + imageName: `/canvasState/${title}.png`, + userId, + canvasStatus: JSON.stringify(canvasStatus), + }, + ]) } const handleFlip = () => { diff --git a/src/hooks/useEvent.js b/src/hooks/useEvent.js index 16d0896d..2a1562ad 100644 --- a/src/hooks/useEvent.js +++ b/src/hooks/useEvent.js @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef } from 'react' +import { useEffect, useRef } from 'react' import { useRecoilValue, useSetRecoilState } from 'recoil' import { canvasState, canvasZoomState, currentMenuState, textModeState } from '@/store/canvasAtom' import { fabric } from 'fabric' @@ -41,6 +41,7 @@ export function useEvent() { const addDefaultEvent = () => { //default Event 추가 + console.log('addDefaultEvent', canvas) addCanvasMouseEventListener('mouse:move', defaultMouseMoveEvent) addCanvasMouseEventListener('mouse:out', defaultMouseOutEvent) addDocumentEventListener('contextmenu', document, defaultContextMenuEvent) From c92065b825adba169f50a683a949e20215b4f403 Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 27 Nov 2024 13:57:49 +0900 Subject: [PATCH 185/200] =?UTF-8?q?Revert=20"useContext=20->=20useEvent=20?= =?UTF-8?q?=EC=9B=90=EB=B3=B5"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a084b5dbf3483b4884bdeb59bb422ef27bc85bba. --- src/app/floor-plan/layout.js | 15 +-- .../common/context-menu/QContextMenu.jsx | 7 +- src/components/floor-plan/CanvasMenu.jsx | 9 +- .../floor-plan/modal/basic/BasicSetting.jsx | 7 +- .../lineProperty/LinePropertySetting.jsx | 7 +- .../modal/wallLineOffset/type/Offset.jsx | 7 +- .../modal/wallLineOffset/type/WallLine.jsx | 7 +- src/hooks/common/useCommonUtils.js | 7 +- src/hooks/module/useModuleBasicSetting.js | 17 +-- src/hooks/object/useObjectBatch.js | 7 +- src/hooks/roofcover/useAuxiliaryDrawing.js | 7 +- src/hooks/roofcover/useEavesGableEdit.js | 7 +- src/hooks/roofcover/useMovementSetting.js | 8 +- .../roofcover/useRoofShapePassivitySetting.js | 13 +- .../roofcover/useWallLineOffsetSetting.js | 7 +- src/hooks/surface/usePlacementShapeDrawing.js | 114 +++--------------- src/hooks/surface/useSurfaceShapeBatch.js | 83 +++---------- src/hooks/useCanvas.js | 12 +- src/hooks/useEvent.js | 3 +- 19 files changed, 115 insertions(+), 229 deletions(-) diff --git a/src/app/floor-plan/layout.js b/src/app/floor-plan/layout.js index 8c1d393d..532a83d6 100644 --- a/src/app/floor-plan/layout.js +++ b/src/app/floor-plan/layout.js @@ -3,19 +3,20 @@ import FloorPlanProvider from './FloorPlanProvider' import FloorPlan from '@/components/floor-plan/FloorPlan' import CanvasLayout from '@/components/floor-plan/CanvasLayout' +import EventProvider from './EventProvider' export default function FloorPlanLayout({ children }) { console.log('🚀 ~ FloorPlanLayout ~ FloorPlanLayout:') return ( <> - {/**/} - - - {children} - - - {/**/} + + + + {children} + + + ) } diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index 19791ffc..e7070aec 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -1,11 +1,12 @@ 'use client' -import { useEffect } from 'react' +import { useContext, useEffect } from 'react' import '@/styles/contents.scss' import { useRecoilState, useRecoilValue } from 'recoil' import { contextMenuListState, contextMenuState } from '@/store/contextMenu' import { useTempGrid } from '@/hooks/useTempGrid' import { useContextMenu } from '@/hooks/useContextMenu' import { useEvent } from '@/hooks/useEvent' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function QContextMenu(props) { const { contextRef, canvasProps } = props @@ -14,8 +15,8 @@ export default function QContextMenu(props) { const activeObject = canvasProps?.getActiveObject() //액티브된 객체를 가져옴 const { tempGridMode, setTempGridMode } = useTempGrid() const { handleKeyup } = useContextMenu() - const { addDocumentEventListener, removeDocumentEvent } = useEvent() - // const { addDocumentEventListener, removeDocumentEvent } = useContext(EventContext) + // const { addDocumentEventListener, removeDocumentEvent } = useEvent() + const { addDocumentEventListener, removeDocumentEvent } = useContext(EventContext) let contextType = '' diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 79944044..65849256 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -33,12 +33,15 @@ import useMenu from '@/hooks/common/useMenu' import { MENU } from '@/common/common' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' -import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom' +import { estimateState } from '@/store/floorPlanObjectAtom' import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import EstimateCopyPop from '../estimate/popup/EstimateCopyPop' + +import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' import { pwrGnrSimTypeState } from '@/store/simulatorAtom' import { useAxios } from '@/hooks/useAxios' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props @@ -68,8 +71,8 @@ export default function CanvasMenu(props) { const { getMessage } = useMessage() const { currentCanvasPlan, saveCanvas } = usePlan() const { swalFire } = useSwal() - const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() - // const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext) + // const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() + const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext) const commonUtils = useRecoilValue(commonUtilsState) const { commonFunctions } = useCommonUtils() const SelectOption = [{ name: '瓦53A' }, { name: '瓦53A' }] diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 68301128..68bb0a49 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -1,6 +1,6 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import Module from '@/components/floor-plan/modal/basic/step/Module' import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchModule' import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement' @@ -11,6 +11,7 @@ import { usePopup } from '@/hooks/usePopup' import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' import { useEvent } from '@/hooks/useEvent' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() @@ -18,8 +19,8 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const [tabNum, setTabNum] = useState(1) const canvasSetting = useRecoilValue(canvasSettingState) const orientationRef = useRef(null) - const { initEvent } = useEvent() - // const { initEvent } = useContext(EventContext) + // const { initEvent } = useEvent() + const { initEvent } = useContext(EventContext) const { makeModuleInstArea, manualModuleSetup, autoModuleSetup } = useModuleBasicSetting() const handleBtnNextStep = () => { if (tabNum === 1) { diff --git a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx index 13a00b06..789d048c 100644 --- a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx +++ b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx @@ -3,10 +3,11 @@ import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' import { useMessage } from '@/hooks/useMessage' import { usePopup } from '@/hooks/usePopup' -import { useEffect, useState } from 'react' +import { useState, useEffect, useContext } from 'react' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' import { useEvent } from '@/hooks/useEvent' import { LINE_TYPE } from '@/common/common' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function LinePropertySetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -14,8 +15,8 @@ export default function LinePropertySetting(props) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, changeSurfaceLinePropertyReset } = useSurfaceShapeBatch() - const { initEvent } = useEvent() - // const { initEvent } = useContext(EventContext) + // const { initEvent } = useEvent() + const { initEvent } = useContext(EventContext) const properties = [ { name: getMessage('eaves.line'), value: LINE_TYPE.WALLLINE.EAVES }, diff --git a/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx b/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx index 418a9419..d3afd459 100644 --- a/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx +++ b/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx @@ -1,11 +1,12 @@ import { useMessage } from '@/hooks/useMessage' -import { useEffect, useState } from 'react' +import { useContext, useEffect, useState } from 'react' import { useEvent } from '@/hooks/useEvent' +import { EventContext } from '@/app/floor-plan/EventProvider' export default function Offset({ length1Ref, arrow1Ref, currentWallLineRef }) { const { getMessage } = useMessage() - const { addDocumentEventListener, initEvent } = useEvent() - // const { addDocumentEventListener, initEvent } = useContext(EventContext) + // const { addDocumentEventListener, initEvent } = useEvent() + const { addDocumentEventListener, initEvent } = useContext(EventContext) useEffect(() => { addDocumentEventListener('keydown', document, keyDown) diff --git a/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx b/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx index 581f57f3..c736d397 100644 --- a/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx +++ b/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx @@ -1,11 +1,12 @@ import { useMessage } from '@/hooks/useMessage' -import { forwardRef, useEffect, useImperativeHandle, useState } from 'react' +import { forwardRef, useContext, useEffect, useImperativeHandle, useState } from 'react' import { useEvent } from '@/hooks/useEvent' +import { EventContext } from '@/app/floor-plan/EventProvider' export default forwardRef(function WallLine({ length1Ref, length2Ref, arrow1Ref, arrow2Ref, radioTypeRef, currentWallLineRef }, ref) { const { getMessage } = useMessage() - const { addDocumentEventListener, initEvent } = useEvent() - // const { addDocumentEventListener, initEvent } = useContext(EventContext) + // const { addDocumentEventListener, initEvent } = useEvent() + const { addDocumentEventListener, initEvent } = useContext(EventContext) const [type, setType] = useState(1) const [arrow1, setArrow1] = useState('up') const [arrow2, setArrow2] = useState('up') diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 1f9c2063..5c8fcfee 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -1,4 +1,4 @@ -import { useEffect } from 'react' +import { useContext, useEffect } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { wordDisplaySelector } from '@/store/settingAtom' import { useEvent } from '@/hooks/useEvent' @@ -9,12 +9,13 @@ import { canvasState } from '@/store/canvasAtom' import { v4 as uuidv4 } from 'uuid' import { usePopup } from '@/hooks/usePopup' import Distance from '@/components/floor-plan/modal/distance/Distance' +import { EventContext } from '@/app/floor-plan/EventProvider' export function useCommonUtils() { const canvas = useRecoilValue(canvasState) const wordDisplay = useRecoilValue(wordDisplaySelector) - const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() - // const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useContext(EventContext) + // const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useContext(EventContext) const dimensionSettings = useRecoilValue(dimensionLineSettingsState) const dimensionLineTextFont = useRecoilValue(fontSelector('dimensionLineText')) const commonTextFont = useRecoilValue(fontSelector('commonText')) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index 07752606..eb6ac973 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -1,22 +1,25 @@ -import { useRecoilState, useRecoilValue } from 'recoil' -import { canvasState, moduleIsSetupState, moduleSetupSurfaceState } from '@/store/canvasAtom' +import { useContext, useEffect, useState } from 'react' +import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' +import { canvasState } from '@/store/canvasAtom' import { rectToPolygon, setSurfaceShapePattern } from '@/util/canvas-util' import { roofDisplaySelector } from '@/store/settingAtom' import offsetPolygon from '@/util/qpolygon-utils' import { QPolygon } from '@/components/fabric/QPolygon' import { QLine } from '@/components/fabric/QLine' +import { moduleSetupSurfaceState, moduleIsSetupState } from '@/store/canvasAtom' import { useEvent } from '@/hooks/useEvent' -import { BATCH_TYPE, POLYGON_TYPE } from '@/common/common' +import { POLYGON_TYPE, BATCH_TYPE } from '@/common/common' import * as turf from '@turf/turf' +import { EventContext } from '@/app/floor-plan/EventProvider' export function useModuleBasicSetting() { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) const [moduleSetupSurface, setModuleSetupSurface] = useRecoilState(moduleSetupSurfaceState) const [moduleIsSetup, setModuleIsSetup] = useRecoilState(moduleIsSetupState) - const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() - // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) + // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() + const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) let selectedModuleInstSurfaceArray = [] const makeModuleInstArea = () => { @@ -697,7 +700,7 @@ export function useModuleBasicSetting() { } if (leftBottomCnt + rightBottomCnt === 0) { exposedBottom++ - + return } }) // 노출상면 체크 @@ -725,7 +728,7 @@ export function useModuleBasicSetting() { } if (leftTopCnt + rightTopCnt === 0) { exposedTop++ - + return } }) return { diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index dd67b017..2227e5db 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -1,5 +1,5 @@ 'use client' -import { useEffect } from 'react' +import { useContext, useEffect } from 'react' import { useMessage } from '@/hooks/useMessage' import { useRecoilValue } from 'recoil' import { canvasState } from '@/store/canvasAtom' @@ -12,12 +12,13 @@ import { usePolygon } from '@/hooks/usePolygon' import { QPolygon } from '@/components/fabric/QPolygon' import { v4 as uuidv4 } from 'uuid' import { fontSelector } from '@/store/fontAtom' +import { EventContext } from '@/app/floor-plan/EventProvider' export function useObjectBatch({ isHidden, setIsHidden }) { const { getMessage } = useMessage() const canvas = useRecoilValue(canvasState) - const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() - // const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useContext(EventContext) + // const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() + const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useContext(EventContext) const { swalFire } = useSwal() const { drawDirectionArrow } = usePolygon() const lengthTextFont = useRecoilValue(fontSelector('lengthText')) diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 55053b7e..6d5d384f 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { adsorptionRangeState, canvasState, verticalHorizontalModeState } from '@/store/canvasAtom' import { useEvent } from '@/hooks/useEvent' @@ -22,12 +22,13 @@ import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { calculateAngle, isSamePoint } from '@/util/qpolygon-utils' import { POLYGON_TYPE } from '@/common/common' +import { EventContext } from '@/app/floor-plan/EventProvider' // 보조선 작성 export function useAuxiliaryDrawing(id) { const canvas = useRecoilValue(canvasState) - const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useEvent() - // const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useContext(EventContext) + // const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useEvent() + const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { tempGridMode } = useTempGrid() diff --git a/src/hooks/roofcover/useEavesGableEdit.js b/src/hooks/roofcover/useEavesGableEdit.js index 27e00a86..2c2a9b27 100644 --- a/src/hooks/roofcover/useEavesGableEdit.js +++ b/src/hooks/roofcover/useEavesGableEdit.js @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useRecoilValue } from 'recoil' import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, pitchTextSelector } from '@/store/canvasAtom' import { useMessage } from '@/hooks/useMessage' @@ -10,13 +10,14 @@ import { outerLineFixState } from '@/store/outerLineAtom' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree } from '@/util/canvas-util' +import { EventContext } from '@/app/floor-plan/EventProvider' // 처마.케라바 변경 export function useEavesGableEdit(id) { const canvas = useRecoilValue(canvasState) const { getMessage } = useMessage() - const { addCanvasMouseEventListener, initEvent } = useEvent() - // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + // const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { closePopup } = usePopup() const TYPES = { EAVES: 'eaves', diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js index 509c53f3..7051fe49 100644 --- a/src/hooks/roofcover/useMovementSetting.js +++ b/src/hooks/roofcover/useMovementSetting.js @@ -2,10 +2,12 @@ import { useRecoilValue } from 'recoil' import { canvasState, currentObjectState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' import { useMessage } from '@/hooks/useMessage' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useEvent } from '@/hooks/useEvent' import { POLYGON_TYPE } from '@/common/common' import { OUTER_LINE_TYPE } from '@/store/outerLineAtom' +import { QLine } from '@/components/fabric/QLine' +import { EventContext } from '@/app/floor-plan/EventProvider' //동선이동 형 올림 내림 export function useMovementSetting(id) { @@ -14,8 +16,8 @@ export function useMovementSetting(id) { UP_DOWN: 'updown', //형 올림내림 } const canvas = useRecoilValue(canvasState) - const { initEvent, addCanvasMouseEventListener } = useEvent() - // const { initEvent, addCanvasMouseEventListener } = useContext(EventContext) + // const { initEvent, addCanvasMouseEventListener } = useEvent() + const { initEvent, addCanvasMouseEventListener } = useContext(EventContext) const { closePopup } = usePopup() const { getMessage } = useMessage() const currentObject = useRecoilValue(currentObjectState) diff --git a/src/hooks/roofcover/useRoofShapePassivitySetting.js b/src/hooks/roofcover/useRoofShapePassivitySetting.js index a2c799f4..656094f2 100644 --- a/src/hooks/roofcover/useRoofShapePassivitySetting.js +++ b/src/hooks/roofcover/useRoofShapePassivitySetting.js @@ -1,6 +1,6 @@ import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, currentObjectState, pitchTextSelector } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useLine } from '@/hooks/useLine' import { useMessage } from '@/hooks/useMessage' import { useEvent } from '@/hooks/useEvent' @@ -11,6 +11,7 @@ import { outerLineFixState } from '@/store/outerLineAtom' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree } from '@/util/canvas-util' +import { EventContext } from '@/app/floor-plan/EventProvider' //지붕형상 수동 설정 export function useRoofShapePassivitySetting(id) { @@ -25,8 +26,8 @@ export function useRoofShapePassivitySetting(id) { const { getMessage } = useMessage() const { showLine, hideLine, addPitchTextsByOuterLines } = useLine() const { swalFire } = useSwal() - const { addCanvasMouseEventListener, initEvent } = useEvent() - // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + // const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { drawRoofPolygon } = useMode() const { addPolygonByLines } = usePolygon() const currentObject = useRecoilValue(currentObjectState) @@ -203,11 +204,7 @@ export function useRoofShapePassivitySetting(id) { wall = addPolygonByLines(lines, { name: POLYGON_TYPE.WALL, fill: 'transparent', stroke: 'black' }) } else { // 그냥 닫을 경우 처리 - wall = addPolygonByLines([...initLines.current], { - name: POLYGON_TYPE.WALL, - fill: 'transparent', - stroke: 'black', - }) + wall = addPolygonByLines([...initLines.current], { name: POLYGON_TYPE.WALL, fill: 'transparent', stroke: 'black' }) lines.forEach((line, idx) => { line.attributes = initLines.current[idx].attributes }) diff --git a/src/hooks/roofcover/useWallLineOffsetSetting.js b/src/hooks/roofcover/useWallLineOffsetSetting.js index 22af0f49..b673bcc2 100644 --- a/src/hooks/roofcover/useWallLineOffsetSetting.js +++ b/src/hooks/roofcover/useWallLineOffsetSetting.js @@ -1,11 +1,12 @@ import { canvasState, currentObjectState } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useMessage } from '@/hooks/useMessage' import { useEvent } from '@/hooks/useEvent' import { useLine } from '@/hooks/useLine' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' +import { EventContext } from '@/app/floor-plan/EventProvider' // 외벽선 편집 및 오프셋 export function useWallLineOffsetSetting(id) { @@ -14,8 +15,8 @@ export function useWallLineOffsetSetting(id) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { swalFire } = useSwal() - const { addCanvasMouseEventListener, initEvent } = useEvent() - // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + // const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const wallLineEditRef = useRef(null) const length1Ref = useRef(null) const length2Ref = useRef(null) diff --git a/src/hooks/surface/usePlacementShapeDrawing.js b/src/hooks/surface/usePlacementShapeDrawing.js index 95388ca4..822ea5c9 100644 --- a/src/hooks/surface/usePlacementShapeDrawing.js +++ b/src/hooks/surface/usePlacementShapeDrawing.js @@ -12,7 +12,7 @@ import { useEvent } from '@/hooks/useEvent' import { useMouse } from '@/hooks/useMouse' import { useLine } from '@/hooks/useLine' import { useTempGrid } from '@/hooks/useTempGrid' -import { useEffect, useRef } from 'react' +import { useContext, useEffect, useRef } from 'react' import { distanceBetweenPoints, setSurfaceShapePattern } from '@/util/canvas-util' import { fabric } from 'fabric' import { calculateAngle } from '@/util/qpolygon-utils' @@ -33,15 +33,15 @@ import { POLYGON_TYPE } from '@/common/common' import { usePopup } from '@/hooks/usePopup' import { roofDisplaySelector } from '@/store/settingAtom' - +import { EventContext } from '@/app/floor-plan/EventProvider' // 면형상 배치 export function usePlacementShapeDrawing(id) { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) - const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = - useEvent() // const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = - // useContext(EventContext) + // useEvent() + const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = + useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { addPolygonByLines, drawDirectionArrow } = usePolygon() @@ -432,104 +432,56 @@ export function usePlacementShapeDrawing(id) { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x + length1Value / 10, - y: prev[prev.length - 1].y + length2Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] }) } else if (arrow1Value === '↓' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x - length1Value / 10, - y: prev[prev.length - 1].y + length2Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x - length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] }) } else if (arrow1Value === '↑' && arrow2Value === '→') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x + length1Value / 10, - y: prev[prev.length - 1].y - length2Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y - length2Value / 10 }] }) } else if (arrow1Value === '↑' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x - length1Value / 10, - y: prev[prev.length - 1].y - length2Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x - length1Value / 10, y: prev[prev.length - 1].y - length2Value / 10 }] }) } else if (arrow1Value === '→' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x + length2Value / 10, - y: prev[prev.length - 1].y + length1Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] }) } else if (arrow1Value === '→' && arrow2Value === '↑') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x + length2Value / 10, - y: prev[prev.length - 1].y - length1Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] }) } else if (arrow1Value === '←' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x - length2Value / 10, - y: prev[prev.length - 1].y + length1Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] }) } else if (arrow1Value === '←' && arrow2Value === '↑') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x - length2Value / 10, - y: prev[prev.length - 1].y - length1Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] }) } @@ -585,65 +537,35 @@ export function usePlacementShapeDrawing(id) { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x + length2Value / 10, - y: prev[prev.length - 1].y + length1Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] }) } else if (arrow1Value === '↓' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x - length2Value / 10, - y: prev[prev.length - 1].y + length1Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] }) } else if (arrow1Value === '↑' && arrow2Value === '→') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x + length2Value / 10, - y: prev[prev.length - 1].y - length1Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] }) } else if (arrow1Value === '↑' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x - length2Value / 10, - y: prev[prev.length - 1].y - length1Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] }) } else if (arrow1Value === '→' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [ - ...prev, - { - x: prev[prev.length - 1].x + length1Value / 10, - y: prev[prev.length - 1].y + length2Value / 10, - }, - ] + return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] }) } else if (arrow1Value === '→' && arrow2Value === '↑') { setPoints((prev) => { diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index 844829d3..b0728ac8 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -2,7 +2,7 @@ import { useRecoilValue } from 'recoil' import { canvasState, globalPitchState } from '@/store/canvasAtom' -import { MENU, POLYGON_TYPE } from '@/common/common' +import { MENU, BATCH_TYPE, POLYGON_TYPE } from '@/common/common' import { getIntersectionPoint, setSurfaceShapePattern } from '@/util/canvas-util' import { degreesToRadians } from '@turf/turf' import { QPolygon } from '@/components/fabric/QPolygon' @@ -15,6 +15,8 @@ import { usePolygon } from '@/hooks/usePolygon' import { fontSelector } from '@/store/fontAtom' import { slopeSelector } from '@/store/commonAtom' import { QLine } from '@/components/fabric/QLine' +import { EventContext } from '@/app/floor-plan/EventProvider' +import { useContext } from 'react' export function useSurfaceShapeBatch() { const { getMessage } = useMessage() @@ -26,8 +28,8 @@ export function useSurfaceShapeBatch() { const roofDisplay = useRecoilValue(roofDisplaySelector) const slope = useRecoilValue(slopeSelector(globalPitch)) const { swalFire } = useSwal() - const { addCanvasMouseEventListener, initEvent } = useEvent() - // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + // const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { closePopup } = usePopup() const applySurfaceShape = (surfaceRefs, selectedType, id) => { @@ -327,14 +329,8 @@ export function useSurfaceShapeBatch() { const angleInRadians = Math.asin(length2 / length3) points = [ { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, - { - x: pointer.x - length1 / 2 + length3 * Math.cos(angleInRadians), - y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians), - }, - { - x: pointer.x + length1 / 2 + length3 * Math.cos(angleInRadians), - y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians), - }, + { x: pointer.x - length1 / 2 + length3 * Math.cos(angleInRadians), y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians) }, + { x: pointer.x + length1 / 2 + length3 * Math.cos(angleInRadians), y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians) }, { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, ] @@ -345,18 +341,9 @@ export function useSurfaceShapeBatch() { { x: pointer.x - (length1 + length2 + length3) / 2, y: pointer.y - (length4 + length5) / 2 }, { x: pointer.x - (length1 + length2 + length3) / 2, y: pointer.y + (length4 + length5) / 2 }, { x: pointer.x - (length1 + length2 + length3) / 2 + length1, y: pointer.y + (length4 + length5) / 2 }, - { - x: pointer.x - (length1 + length2 + length3) / 2 + length1, - y: pointer.y + (length4 + length5) / 2 - length5, - }, - { - x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, - y: pointer.y + (length4 + length5) / 2 - length5, - }, - { - x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, - y: pointer.y + (length4 + length5) / 2 - length5 + length5, - }, + { x: pointer.x - (length1 + length2 + length3) / 2 + length1, y: pointer.y + (length4 + length5) / 2 - length5 }, + { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, y: pointer.y + (length4 + length5) / 2 - length5 }, + { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, y: pointer.y + (length4 + length5) / 2 - length5 + length5 }, { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2 + length3, y: pointer.y + (length4 + length5) / 2 - length5 + length5, @@ -375,14 +362,8 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length3 }, { x: pointer.x - length1 / 2 + length1 - (length1 - length2), y: pointer.y + length4 / 2 - length3 }, - { - x: pointer.x - length1 / 2 + length1 - (length1 - length2), - y: pointer.y + length4 / 2 - length3 + (length3 - length4), - }, - { - x: pointer.x - length1 / 2 + length1 - (length1 - length2) - length2, - y: pointer.y + length4 / 2 - length3 + (length3 - length4), - }, + { x: pointer.x - length1 / 2 + length1 - (length1 - length2), y: pointer.y + length4 / 2 - length3 + (length3 - length4) }, + { x: pointer.x - length1 / 2 + length1 - (length1 - length2) - length2, y: pointer.y + length4 / 2 - length3 + (length3 - length4) }, ] break @@ -393,14 +374,8 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 }, { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 }, - { - x: pointer.x - length1 / 2 + length1 - length3, - y: pointer.y + length4 / 2 - length4 + (length4 - length5), - }, - { - x: pointer.x - length1 / 2 + length1 - length3 - length2, - y: pointer.y + length4 / 2 - length4 + (length4 - length5), - }, + { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 + (length4 - length5) }, + { x: pointer.x - length1 / 2 + length1 - length3 - length2, y: pointer.y + length4 / 2 - length4 + (length4 - length5) }, ] break } @@ -410,14 +385,8 @@ export function useSurfaceShapeBatch() { { x: pointer.x + length1 / 2 - length1, y: pointer.y + length4 / 2 }, { x: pointer.x + length1 / 2 - length1, y: pointer.y + length4 / 2 - length5 }, { x: pointer.x + length1 / 2 - length1 + length2, y: pointer.y + length4 / 2 - length5 }, - { - x: pointer.x + length1 / 2 - length1 + length2, - y: pointer.y + length4 / 2 - length5 - (length4 - length5), - }, - { - x: pointer.x + length1 / 2 - length1 + length2 + length3, - y: pointer.y + length4 / 2 - length5 - (length4 - length5), - }, + { x: pointer.x + length1 / 2 - length1 + length2, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + { x: pointer.x + length1 / 2 - length1 + length2 + length3, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, ] break } @@ -427,14 +396,8 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length5 }, { x: pointer.x - length1 / 2 + length1 - length2, y: pointer.y + length4 / 2 - length5 }, - { - x: pointer.x - length1 / 2 + length1 - length2, - y: pointer.y + length4 / 2 - length5 - (length4 - length5), - }, - { - x: pointer.x - length1 / 2 + length1 - length2 - length3, - y: pointer.y + length4 / 2 - length5 - (length4 - length5), - }, + { x: pointer.x - length1 / 2 + length1 - length2, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + { x: pointer.x - length1 / 2 + length1 - length2 - length3, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, ] break } @@ -445,10 +408,7 @@ export function useSurfaceShapeBatch() { const leftAngle = Math.acos((length1 - length2) / 2 / leftHypotenuse) points = [ - { - x: pointer.x - length1 / 2 + leftHypotenuse * Math.cos(leftAngle), - y: pointer.y + length3 / 2 - leftHypotenuse * Math.sin(leftAngle), - }, + { x: pointer.x - length1 / 2 + leftHypotenuse * Math.cos(leftAngle), y: pointer.y + length3 / 2 - leftHypotenuse * Math.sin(leftAngle) }, { x: pointer.x - length1 / 2, y: pointer.y + length3 / 2 }, { x: pointer.x + length1 / 2, y: pointer.y + length3 / 2 }, { @@ -537,10 +497,7 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 + length4 }, { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 + length4 }, - { - x: pointer.x - length1 / 2 + length2 + (length1 - length2 - length3) / 2, - y: pointer.y + length4 / 2 - length4 + length5, - }, + { x: pointer.x - length1 / 2 + length2 + (length1 - length2 - length3) / 2, y: pointer.y + length4 / 2 - length4 + length5 }, ] break } diff --git a/src/hooks/useCanvas.js b/src/hooks/useCanvas.js index c2dca8cc..46dbbb35 100644 --- a/src/hooks/useCanvas.js +++ b/src/hooks/useCanvas.js @@ -13,7 +13,7 @@ import { writeImage } from '@/lib/canvas' import { useCanvasEvent } from '@/hooks/useCanvasEvent' import { useAxios } from '@/hooks/useAxios' import { useFont } from '@/hooks/common/useFont' -import { OBJECT_PROTOTYPE, SAVE_KEY } from '@/common/common' +import { OBJECT_PROTOTYPE, RELOAD_TYPE_PROTOTYPE, SAVE_KEY } from '@/common/common' export function useCanvas(id) { const [canvas, setCanvas] = useRecoilState(canvasState) @@ -37,7 +37,6 @@ export function useCanvas(id) { selection: false, }) - console.log('canvas', c) setCanvas(c) setCanvasForEvent(c) attachDefaultEventOnCanvas() @@ -395,14 +394,7 @@ export function useCanvas(id) { await post({ url: '/api/canvas-management/canvas-statuses', data: patternData }) - setThumbnails((prev) => [ - ...prev, - { - imageName: `/canvasState/${title}.png`, - userId, - canvasStatus: JSON.stringify(canvasStatus), - }, - ]) + setThumbnails((prev) => [...prev, { imageName: `/canvasState/${title}.png`, userId, canvasStatus: JSON.stringify(canvasStatus) }]) } const handleFlip = () => { diff --git a/src/hooks/useEvent.js b/src/hooks/useEvent.js index 2a1562ad..16d0896d 100644 --- a/src/hooks/useEvent.js +++ b/src/hooks/useEvent.js @@ -1,4 +1,4 @@ -import { useEffect, useRef } from 'react' +import { useCallback, useEffect, useRef } from 'react' import { useRecoilValue, useSetRecoilState } from 'recoil' import { canvasState, canvasZoomState, currentMenuState, textModeState } from '@/store/canvasAtom' import { fabric } from 'fabric' @@ -41,7 +41,6 @@ export function useEvent() { const addDefaultEvent = () => { //default Event 추가 - console.log('addDefaultEvent', canvas) addCanvasMouseEventListener('mouse:move', defaultMouseMoveEvent) addCanvasMouseEventListener('mouse:out', defaultMouseOutEvent) addDocumentEventListener('contextmenu', document, defaultContextMenuEvent) From b6d6ee7cacc989a0dec03e9124b31d5f6b64fb7a Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 27 Nov 2024 14:02:29 +0900 Subject: [PATCH 186/200] =?UTF-8?q?useContext=20->=20useEvent=20=EC=9B=90?= =?UTF-8?q?=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/context-menu/QContextMenu.jsx | 7 +- src/components/floor-plan/CanvasMenu.jsx | 9 +- .../floor-plan/modal/basic/BasicSetting.jsx | 7 +- .../lineProperty/LinePropertySetting.jsx | 7 +- .../modal/wallLineOffset/type/Offset.jsx | 7 +- .../modal/wallLineOffset/type/WallLine.jsx | 7 +- src/hooks/common/useCommonUtils.js | 7 +- src/hooks/module/useModuleBasicSetting.js | 17 ++- src/hooks/object/useObjectBatch.js | 7 +- src/hooks/roofcover/useAuxiliaryDrawing.js | 7 +- src/hooks/roofcover/useEavesGableEdit.js | 7 +- src/hooks/roofcover/useMovementSetting.js | 8 +- .../roofcover/useRoofShapePassivitySetting.js | 13 +- .../roofcover/useWallLineOffsetSetting.js | 7 +- src/hooks/surface/usePlacementShapeDrawing.js | 114 +++++++++++++++--- src/hooks/surface/useSurfaceShapeBatch.js | 83 ++++++++++--- 16 files changed, 210 insertions(+), 104 deletions(-) diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index e7070aec..19791ffc 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -1,12 +1,11 @@ 'use client' -import { useContext, useEffect } from 'react' +import { useEffect } from 'react' import '@/styles/contents.scss' import { useRecoilState, useRecoilValue } from 'recoil' import { contextMenuListState, contextMenuState } from '@/store/contextMenu' import { useTempGrid } from '@/hooks/useTempGrid' import { useContextMenu } from '@/hooks/useContextMenu' import { useEvent } from '@/hooks/useEvent' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function QContextMenu(props) { const { contextRef, canvasProps } = props @@ -15,8 +14,8 @@ export default function QContextMenu(props) { const activeObject = canvasProps?.getActiveObject() //액티브된 객체를 가져옴 const { tempGridMode, setTempGridMode } = useTempGrid() const { handleKeyup } = useContextMenu() - // const { addDocumentEventListener, removeDocumentEvent } = useEvent() - const { addDocumentEventListener, removeDocumentEvent } = useContext(EventContext) + const { addDocumentEventListener, removeDocumentEvent } = useEvent() + // const { addDocumentEventListener, removeDocumentEvent } = useContext(EventContext) let contextType = '' diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 65849256..79944044 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -33,15 +33,12 @@ import useMenu from '@/hooks/common/useMenu' import { MENU } from '@/common/common' import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' -import { estimateState } from '@/store/floorPlanObjectAtom' +import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom' import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import EstimateCopyPop from '../estimate/popup/EstimateCopyPop' - -import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' import { pwrGnrSimTypeState } from '@/store/simulatorAtom' import { useAxios } from '@/hooks/useAxios' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props @@ -71,8 +68,8 @@ export default function CanvasMenu(props) { const { getMessage } = useMessage() const { currentCanvasPlan, saveCanvas } = usePlan() const { swalFire } = useSwal() - // const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() - const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext) + const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useEvent() + // const { initEvent, addCanvasMouseEventListener, addDocumentEventListener } = useContext(EventContext) const commonUtils = useRecoilValue(commonUtilsState) const { commonFunctions } = useCommonUtils() const SelectOption = [{ name: '瓦53A' }, { name: '瓦53A' }] diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 68bb0a49..68301128 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -1,6 +1,6 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import Module from '@/components/floor-plan/modal/basic/step/Module' import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchModule' import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement' @@ -11,7 +11,6 @@ import { usePopup } from '@/hooks/usePopup' import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation' import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' import { useEvent } from '@/hooks/useEvent' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() @@ -19,8 +18,8 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const [tabNum, setTabNum] = useState(1) const canvasSetting = useRecoilValue(canvasSettingState) const orientationRef = useRef(null) - // const { initEvent } = useEvent() - const { initEvent } = useContext(EventContext) + const { initEvent } = useEvent() + // const { initEvent } = useContext(EventContext) const { makeModuleInstArea, manualModuleSetup, autoModuleSetup } = useModuleBasicSetting() const handleBtnNextStep = () => { if (tabNum === 1) { diff --git a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx index 789d048c..13a00b06 100644 --- a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx +++ b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx @@ -3,11 +3,10 @@ import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' import { useMessage } from '@/hooks/useMessage' import { usePopup } from '@/hooks/usePopup' -import { useState, useEffect, useContext } from 'react' +import { useEffect, useState } from 'react' import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' import { useEvent } from '@/hooks/useEvent' import { LINE_TYPE } from '@/common/common' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function LinePropertySetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -15,8 +14,8 @@ export default function LinePropertySetting(props) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, changeSurfaceLinePropertyReset } = useSurfaceShapeBatch() - // const { initEvent } = useEvent() - const { initEvent } = useContext(EventContext) + const { initEvent } = useEvent() + // const { initEvent } = useContext(EventContext) const properties = [ { name: getMessage('eaves.line'), value: LINE_TYPE.WALLLINE.EAVES }, diff --git a/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx b/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx index d3afd459..418a9419 100644 --- a/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx +++ b/src/components/floor-plan/modal/wallLineOffset/type/Offset.jsx @@ -1,12 +1,11 @@ import { useMessage } from '@/hooks/useMessage' -import { useContext, useEffect, useState } from 'react' +import { useEffect, useState } from 'react' import { useEvent } from '@/hooks/useEvent' -import { EventContext } from '@/app/floor-plan/EventProvider' export default function Offset({ length1Ref, arrow1Ref, currentWallLineRef }) { const { getMessage } = useMessage() - // const { addDocumentEventListener, initEvent } = useEvent() - const { addDocumentEventListener, initEvent } = useContext(EventContext) + const { addDocumentEventListener, initEvent } = useEvent() + // const { addDocumentEventListener, initEvent } = useContext(EventContext) useEffect(() => { addDocumentEventListener('keydown', document, keyDown) diff --git a/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx b/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx index c736d397..581f57f3 100644 --- a/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx +++ b/src/components/floor-plan/modal/wallLineOffset/type/WallLine.jsx @@ -1,12 +1,11 @@ import { useMessage } from '@/hooks/useMessage' -import { forwardRef, useContext, useEffect, useImperativeHandle, useState } from 'react' +import { forwardRef, useEffect, useImperativeHandle, useState } from 'react' import { useEvent } from '@/hooks/useEvent' -import { EventContext } from '@/app/floor-plan/EventProvider' export default forwardRef(function WallLine({ length1Ref, length2Ref, arrow1Ref, arrow2Ref, radioTypeRef, currentWallLineRef }, ref) { const { getMessage } = useMessage() - // const { addDocumentEventListener, initEvent } = useEvent() - const { addDocumentEventListener, initEvent } = useContext(EventContext) + const { addDocumentEventListener, initEvent } = useEvent() + // const { addDocumentEventListener, initEvent } = useContext(EventContext) const [type, setType] = useState(1) const [arrow1, setArrow1] = useState('up') const [arrow2, setArrow2] = useState('up') diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 5c8fcfee..1f9c2063 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -1,4 +1,4 @@ -import { useContext, useEffect } from 'react' +import { useEffect } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { wordDisplaySelector } from '@/store/settingAtom' import { useEvent } from '@/hooks/useEvent' @@ -9,13 +9,12 @@ import { canvasState } from '@/store/canvasAtom' import { v4 as uuidv4 } from 'uuid' import { usePopup } from '@/hooks/usePopup' import Distance from '@/components/floor-plan/modal/distance/Distance' -import { EventContext } from '@/app/floor-plan/EventProvider' export function useCommonUtils() { const canvas = useRecoilValue(canvasState) const wordDisplay = useRecoilValue(wordDisplaySelector) - // const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useContext(EventContext) const dimensionSettings = useRecoilValue(dimensionLineSettingsState) const dimensionLineTextFont = useRecoilValue(fontSelector('dimensionLineText')) const commonTextFont = useRecoilValue(fontSelector('commonText')) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index eb6ac973..07752606 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -1,25 +1,22 @@ -import { useContext, useEffect, useState } from 'react' -import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' -import { canvasState } from '@/store/canvasAtom' +import { useRecoilState, useRecoilValue } from 'recoil' +import { canvasState, moduleIsSetupState, moduleSetupSurfaceState } from '@/store/canvasAtom' import { rectToPolygon, setSurfaceShapePattern } from '@/util/canvas-util' import { roofDisplaySelector } from '@/store/settingAtom' import offsetPolygon from '@/util/qpolygon-utils' import { QPolygon } from '@/components/fabric/QPolygon' import { QLine } from '@/components/fabric/QLine' -import { moduleSetupSurfaceState, moduleIsSetupState } from '@/store/canvasAtom' import { useEvent } from '@/hooks/useEvent' -import { POLYGON_TYPE, BATCH_TYPE } from '@/common/common' +import { BATCH_TYPE, POLYGON_TYPE } from '@/common/common' import * as turf from '@turf/turf' -import { EventContext } from '@/app/floor-plan/EventProvider' export function useModuleBasicSetting() { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) const [moduleSetupSurface, setModuleSetupSurface] = useRecoilState(moduleSetupSurfaceState) const [moduleIsSetup, setModuleIsSetup] = useRecoilState(moduleIsSetupState) - // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() - const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() + // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) let selectedModuleInstSurfaceArray = [] const makeModuleInstArea = () => { @@ -700,7 +697,7 @@ export function useModuleBasicSetting() { } if (leftBottomCnt + rightBottomCnt === 0) { exposedBottom++ - return + } }) // 노출상면 체크 @@ -728,7 +725,7 @@ export function useModuleBasicSetting() { } if (leftTopCnt + rightTopCnt === 0) { exposedTop++ - return + } }) return { diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index 2227e5db..dd67b017 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -1,5 +1,5 @@ 'use client' -import { useContext, useEffect } from 'react' +import { useEffect } from 'react' import { useMessage } from '@/hooks/useMessage' import { useRecoilValue } from 'recoil' import { canvasState } from '@/store/canvasAtom' @@ -12,13 +12,12 @@ import { usePolygon } from '@/hooks/usePolygon' import { QPolygon } from '@/components/fabric/QPolygon' import { v4 as uuidv4 } from 'uuid' import { fontSelector } from '@/store/fontAtom' -import { EventContext } from '@/app/floor-plan/EventProvider' export function useObjectBatch({ isHidden, setIsHidden }) { const { getMessage } = useMessage() const canvas = useRecoilValue(canvasState) - // const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() - const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() + // const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useContext(EventContext) const { swalFire } = useSwal() const { drawDirectionArrow } = usePolygon() const lengthTextFont = useRecoilValue(fontSelector('lengthText')) diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 6d5d384f..55053b7e 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -1,4 +1,4 @@ -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { adsorptionRangeState, canvasState, verticalHorizontalModeState } from '@/store/canvasAtom' import { useEvent } from '@/hooks/useEvent' @@ -22,13 +22,12 @@ import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { calculateAngle, isSamePoint } from '@/util/qpolygon-utils' import { POLYGON_TYPE } from '@/common/common' -import { EventContext } from '@/app/floor-plan/EventProvider' // 보조선 작성 export function useAuxiliaryDrawing(id) { const canvas = useRecoilValue(canvasState) - // const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useEvent() - const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useEvent() + // const { addCanvasMouseEventListener, addDocumentEventListener, removeMouseLine, initEvent } = useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { tempGridMode } = useTempGrid() diff --git a/src/hooks/roofcover/useEavesGableEdit.js b/src/hooks/roofcover/useEavesGableEdit.js index 2c2a9b27..27e00a86 100644 --- a/src/hooks/roofcover/useEavesGableEdit.js +++ b/src/hooks/roofcover/useEavesGableEdit.js @@ -1,4 +1,4 @@ -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useRecoilValue } from 'recoil' import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, pitchTextSelector } from '@/store/canvasAtom' import { useMessage } from '@/hooks/useMessage' @@ -10,14 +10,13 @@ import { outerLineFixState } from '@/store/outerLineAtom' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree } from '@/util/canvas-util' -import { EventContext } from '@/app/floor-plan/EventProvider' // 처마.케라바 변경 export function useEavesGableEdit(id) { const canvas = useRecoilValue(canvasState) const { getMessage } = useMessage() - // const { addCanvasMouseEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { closePopup } = usePopup() const TYPES = { EAVES: 'eaves', diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js index 7051fe49..509c53f3 100644 --- a/src/hooks/roofcover/useMovementSetting.js +++ b/src/hooks/roofcover/useMovementSetting.js @@ -2,12 +2,10 @@ import { useRecoilValue } from 'recoil' import { canvasState, currentObjectState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' import { useMessage } from '@/hooks/useMessage' -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useEvent } from '@/hooks/useEvent' import { POLYGON_TYPE } from '@/common/common' import { OUTER_LINE_TYPE } from '@/store/outerLineAtom' -import { QLine } from '@/components/fabric/QLine' -import { EventContext } from '@/app/floor-plan/EventProvider' //동선이동 형 올림 내림 export function useMovementSetting(id) { @@ -16,8 +14,8 @@ export function useMovementSetting(id) { UP_DOWN: 'updown', //형 올림내림 } const canvas = useRecoilValue(canvasState) - // const { initEvent, addCanvasMouseEventListener } = useEvent() - const { initEvent, addCanvasMouseEventListener } = useContext(EventContext) + const { initEvent, addCanvasMouseEventListener } = useEvent() + // const { initEvent, addCanvasMouseEventListener } = useContext(EventContext) const { closePopup } = usePopup() const { getMessage } = useMessage() const currentObject = useRecoilValue(currentObjectState) diff --git a/src/hooks/roofcover/useRoofShapePassivitySetting.js b/src/hooks/roofcover/useRoofShapePassivitySetting.js index 656094f2..a2c799f4 100644 --- a/src/hooks/roofcover/useRoofShapePassivitySetting.js +++ b/src/hooks/roofcover/useRoofShapePassivitySetting.js @@ -1,6 +1,6 @@ import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, currentObjectState, pitchTextSelector } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useLine } from '@/hooks/useLine' import { useMessage } from '@/hooks/useMessage' import { useEvent } from '@/hooks/useEvent' @@ -11,7 +11,6 @@ import { outerLineFixState } from '@/store/outerLineAtom' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree } from '@/util/canvas-util' -import { EventContext } from '@/app/floor-plan/EventProvider' //지붕형상 수동 설정 export function useRoofShapePassivitySetting(id) { @@ -26,8 +25,8 @@ export function useRoofShapePassivitySetting(id) { const { getMessage } = useMessage() const { showLine, hideLine, addPitchTextsByOuterLines } = useLine() const { swalFire } = useSwal() - // const { addCanvasMouseEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { drawRoofPolygon } = useMode() const { addPolygonByLines } = usePolygon() const currentObject = useRecoilValue(currentObjectState) @@ -204,7 +203,11 @@ export function useRoofShapePassivitySetting(id) { wall = addPolygonByLines(lines, { name: POLYGON_TYPE.WALL, fill: 'transparent', stroke: 'black' }) } else { // 그냥 닫을 경우 처리 - wall = addPolygonByLines([...initLines.current], { name: POLYGON_TYPE.WALL, fill: 'transparent', stroke: 'black' }) + wall = addPolygonByLines([...initLines.current], { + name: POLYGON_TYPE.WALL, + fill: 'transparent', + stroke: 'black', + }) lines.forEach((line, idx) => { line.attributes = initLines.current[idx].attributes }) diff --git a/src/hooks/roofcover/useWallLineOffsetSetting.js b/src/hooks/roofcover/useWallLineOffsetSetting.js index b673bcc2..22af0f49 100644 --- a/src/hooks/roofcover/useWallLineOffsetSetting.js +++ b/src/hooks/roofcover/useWallLineOffsetSetting.js @@ -1,12 +1,11 @@ import { canvasState, currentObjectState } from '@/store/canvasAtom' import { useRecoilValue } from 'recoil' -import { useContext, useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { useMessage } from '@/hooks/useMessage' import { useEvent } from '@/hooks/useEvent' import { useLine } from '@/hooks/useLine' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' -import { EventContext } from '@/app/floor-plan/EventProvider' // 외벽선 편집 및 오프셋 export function useWallLineOffsetSetting(id) { @@ -15,8 +14,8 @@ export function useWallLineOffsetSetting(id) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { swalFire } = useSwal() - // const { addCanvasMouseEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const wallLineEditRef = useRef(null) const length1Ref = useRef(null) const length2Ref = useRef(null) diff --git a/src/hooks/surface/usePlacementShapeDrawing.js b/src/hooks/surface/usePlacementShapeDrawing.js index 822ea5c9..95388ca4 100644 --- a/src/hooks/surface/usePlacementShapeDrawing.js +++ b/src/hooks/surface/usePlacementShapeDrawing.js @@ -12,7 +12,7 @@ import { useEvent } from '@/hooks/useEvent' import { useMouse } from '@/hooks/useMouse' import { useLine } from '@/hooks/useLine' import { useTempGrid } from '@/hooks/useTempGrid' -import { useContext, useEffect, useRef } from 'react' +import { useEffect, useRef } from 'react' import { distanceBetweenPoints, setSurfaceShapePattern } from '@/util/canvas-util' import { fabric } from 'fabric' import { calculateAngle } from '@/util/qpolygon-utils' @@ -33,15 +33,15 @@ import { POLYGON_TYPE } from '@/common/common' import { usePopup } from '@/hooks/usePopup' import { roofDisplaySelector } from '@/store/settingAtom' -import { EventContext } from '@/app/floor-plan/EventProvider' + // 면형상 배치 export function usePlacementShapeDrawing(id) { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) - // const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = - // useEvent() const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = - useContext(EventContext) + useEvent() + // const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = + // useContext(EventContext) const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() const { addPolygonByLines, drawDirectionArrow } = usePolygon() @@ -432,56 +432,104 @@ export function usePlacementShapeDrawing(id) { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length1Value / 10, + y: prev[prev.length - 1].y + length2Value / 10, + }, + ] }) } else if (arrow1Value === '↓' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length1Value / 10, + y: prev[prev.length - 1].y + length2Value / 10, + }, + ] }) } else if (arrow1Value === '↑' && arrow2Value === '→') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y - length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length1Value / 10, + y: prev[prev.length - 1].y - length2Value / 10, + }, + ] }) } else if (arrow1Value === '↑' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length1Value / 10, y: prev[prev.length - 1].y - length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length1Value / 10, + y: prev[prev.length - 1].y - length2Value / 10, + }, + ] }) } else if (arrow1Value === '→' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length2Value / 10, + y: prev[prev.length - 1].y + length1Value / 10, + }, + ] }) } else if (arrow1Value === '→' && arrow2Value === '↑') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length2Value / 10, + y: prev[prev.length - 1].y - length1Value / 10, + }, + ] }) } else if (arrow1Value === '←' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length2Value / 10, + y: prev[prev.length - 1].y + length1Value / 10, + }, + ] }) } else if (arrow1Value === '←' && arrow2Value === '↑') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length2Value / 10, + y: prev[prev.length - 1].y - length1Value / 10, + }, + ] }) } @@ -537,35 +585,65 @@ export function usePlacementShapeDrawing(id) { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length2Value / 10, + y: prev[prev.length - 1].y + length1Value / 10, + }, + ] }) } else if (arrow1Value === '↓' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y + length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length2Value / 10, + y: prev[prev.length - 1].y + length1Value / 10, + }, + ] }) } else if (arrow1Value === '↑' && arrow2Value === '→') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length2Value / 10, + y: prev[prev.length - 1].y - length1Value / 10, + }, + ] }) } else if (arrow1Value === '↑' && arrow2Value === '←') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x - length2Value / 10, y: prev[prev.length - 1].y - length1Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x - length2Value / 10, + y: prev[prev.length - 1].y - length1Value / 10, + }, + ] }) } else if (arrow1Value === '→' && arrow2Value === '↓') { setPoints((prev) => { if (prev.length === 0) { return [] } - return [...prev, { x: prev[prev.length - 1].x + length1Value / 10, y: prev[prev.length - 1].y + length2Value / 10 }] + return [ + ...prev, + { + x: prev[prev.length - 1].x + length1Value / 10, + y: prev[prev.length - 1].y + length2Value / 10, + }, + ] }) } else if (arrow1Value === '→' && arrow2Value === '↑') { setPoints((prev) => { diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index b0728ac8..844829d3 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -2,7 +2,7 @@ import { useRecoilValue } from 'recoil' import { canvasState, globalPitchState } from '@/store/canvasAtom' -import { MENU, BATCH_TYPE, POLYGON_TYPE } from '@/common/common' +import { MENU, POLYGON_TYPE } from '@/common/common' import { getIntersectionPoint, setSurfaceShapePattern } from '@/util/canvas-util' import { degreesToRadians } from '@turf/turf' import { QPolygon } from '@/components/fabric/QPolygon' @@ -15,8 +15,6 @@ import { usePolygon } from '@/hooks/usePolygon' import { fontSelector } from '@/store/fontAtom' import { slopeSelector } from '@/store/commonAtom' import { QLine } from '@/components/fabric/QLine' -import { EventContext } from '@/app/floor-plan/EventProvider' -import { useContext } from 'react' export function useSurfaceShapeBatch() { const { getMessage } = useMessage() @@ -28,8 +26,8 @@ export function useSurfaceShapeBatch() { const roofDisplay = useRecoilValue(roofDisplaySelector) const slope = useRecoilValue(slopeSelector(globalPitch)) const { swalFire } = useSwal() - // const { addCanvasMouseEventListener, initEvent } = useEvent() - const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addCanvasMouseEventListener, initEvent } = useEvent() + // const { addCanvasMouseEventListener, initEvent } = useContext(EventContext) const { closePopup } = usePopup() const applySurfaceShape = (surfaceRefs, selectedType, id) => { @@ -329,8 +327,14 @@ export function useSurfaceShapeBatch() { const angleInRadians = Math.asin(length2 / length3) points = [ { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, - { x: pointer.x - length1 / 2 + length3 * Math.cos(angleInRadians), y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians) }, - { x: pointer.x + length1 / 2 + length3 * Math.cos(angleInRadians), y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians) }, + { + x: pointer.x - length1 / 2 + length3 * Math.cos(angleInRadians), + y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians), + }, + { + x: pointer.x + length1 / 2 + length3 * Math.cos(angleInRadians), + y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians), + }, { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, ] @@ -341,9 +345,18 @@ export function useSurfaceShapeBatch() { { x: pointer.x - (length1 + length2 + length3) / 2, y: pointer.y - (length4 + length5) / 2 }, { x: pointer.x - (length1 + length2 + length3) / 2, y: pointer.y + (length4 + length5) / 2 }, { x: pointer.x - (length1 + length2 + length3) / 2 + length1, y: pointer.y + (length4 + length5) / 2 }, - { x: pointer.x - (length1 + length2 + length3) / 2 + length1, y: pointer.y + (length4 + length5) / 2 - length5 }, - { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, y: pointer.y + (length4 + length5) / 2 - length5 }, - { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, y: pointer.y + (length4 + length5) / 2 - length5 + length5 }, + { + x: pointer.x - (length1 + length2 + length3) / 2 + length1, + y: pointer.y + (length4 + length5) / 2 - length5, + }, + { + x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, + y: pointer.y + (length4 + length5) / 2 - length5, + }, + { + x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, + y: pointer.y + (length4 + length5) / 2 - length5 + length5, + }, { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2 + length3, y: pointer.y + (length4 + length5) / 2 - length5 + length5, @@ -362,8 +375,14 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length3 }, { x: pointer.x - length1 / 2 + length1 - (length1 - length2), y: pointer.y + length4 / 2 - length3 }, - { x: pointer.x - length1 / 2 + length1 - (length1 - length2), y: pointer.y + length4 / 2 - length3 + (length3 - length4) }, - { x: pointer.x - length1 / 2 + length1 - (length1 - length2) - length2, y: pointer.y + length4 / 2 - length3 + (length3 - length4) }, + { + x: pointer.x - length1 / 2 + length1 - (length1 - length2), + y: pointer.y + length4 / 2 - length3 + (length3 - length4), + }, + { + x: pointer.x - length1 / 2 + length1 - (length1 - length2) - length2, + y: pointer.y + length4 / 2 - length3 + (length3 - length4), + }, ] break @@ -374,8 +393,14 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 }, { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 }, - { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 + (length4 - length5) }, - { x: pointer.x - length1 / 2 + length1 - length3 - length2, y: pointer.y + length4 / 2 - length4 + (length4 - length5) }, + { + x: pointer.x - length1 / 2 + length1 - length3, + y: pointer.y + length4 / 2 - length4 + (length4 - length5), + }, + { + x: pointer.x - length1 / 2 + length1 - length3 - length2, + y: pointer.y + length4 / 2 - length4 + (length4 - length5), + }, ] break } @@ -385,8 +410,14 @@ export function useSurfaceShapeBatch() { { x: pointer.x + length1 / 2 - length1, y: pointer.y + length4 / 2 }, { x: pointer.x + length1 / 2 - length1, y: pointer.y + length4 / 2 - length5 }, { x: pointer.x + length1 / 2 - length1 + length2, y: pointer.y + length4 / 2 - length5 }, - { x: pointer.x + length1 / 2 - length1 + length2, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, - { x: pointer.x + length1 / 2 - length1 + length2 + length3, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + { + x: pointer.x + length1 / 2 - length1 + length2, + y: pointer.y + length4 / 2 - length5 - (length4 - length5), + }, + { + x: pointer.x + length1 / 2 - length1 + length2 + length3, + y: pointer.y + length4 / 2 - length5 - (length4 - length5), + }, ] break } @@ -396,8 +427,14 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length5 }, { x: pointer.x - length1 / 2 + length1 - length2, y: pointer.y + length4 / 2 - length5 }, - { x: pointer.x - length1 / 2 + length1 - length2, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, - { x: pointer.x - length1 / 2 + length1 - length2 - length3, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + { + x: pointer.x - length1 / 2 + length1 - length2, + y: pointer.y + length4 / 2 - length5 - (length4 - length5), + }, + { + x: pointer.x - length1 / 2 + length1 - length2 - length3, + y: pointer.y + length4 / 2 - length5 - (length4 - length5), + }, ] break } @@ -408,7 +445,10 @@ export function useSurfaceShapeBatch() { const leftAngle = Math.acos((length1 - length2) / 2 / leftHypotenuse) points = [ - { x: pointer.x - length1 / 2 + leftHypotenuse * Math.cos(leftAngle), y: pointer.y + length3 / 2 - leftHypotenuse * Math.sin(leftAngle) }, + { + x: pointer.x - length1 / 2 + leftHypotenuse * Math.cos(leftAngle), + y: pointer.y + length3 / 2 - leftHypotenuse * Math.sin(leftAngle), + }, { x: pointer.x - length1 / 2, y: pointer.y + length3 / 2 }, { x: pointer.x + length1 / 2, y: pointer.y + length3 / 2 }, { @@ -497,7 +537,10 @@ export function useSurfaceShapeBatch() { { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 }, { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 + length4 }, { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 + length4 }, - { x: pointer.x - length1 / 2 + length2 + (length1 - length2 - length3) / 2, y: pointer.y + length4 / 2 - length4 + length5 }, + { + x: pointer.x - length1 / 2 + length2 + (length1 - length2 - length3) / 2, + y: pointer.y + length4 / 2 - length4 + length5, + }, ] break } From 6a4a3f42ed4ce4d1cab27cb6c0f173c4db58b58a Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 27 Nov 2024 15:05:13 +0900 Subject: [PATCH 187/200] =?UTF-8?q?EventProvider=20=EC=A3=BC=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/floor-plan/layout.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/floor-plan/layout.js b/src/app/floor-plan/layout.js index 532a83d6..4bb1e355 100644 --- a/src/app/floor-plan/layout.js +++ b/src/app/floor-plan/layout.js @@ -10,13 +10,13 @@ export default function FloorPlanLayout({ children }) { return ( <> - + {/**/} {children} - + {/**/} ) } From 1b3accc7bcc1e75a62fac92824426618624d2397 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 15:40:07 +0900 Subject: [PATCH 188/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 27 +++++++++++++++++-- .../estimate/useEstimateController.js | 12 +++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 3b5f72d7..fb1e17b5 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -146,6 +146,7 @@ export default function Estimate({ params }) { } }) + console.log('최초::::::::', res) setSpecialNoteList(res) setSpecialNoteFirstFlg(true) @@ -175,6 +176,7 @@ export default function Estimate({ params }) { useEffect(() => { //선택된 견적특이사항 setEstimateContextState if (isNotEmptyArray(specialNoteList)) { + console.log('specialNoteList::', specialNoteList) const liveCheckedData = specialNoteList.filter((row) => row.check === true) const data = [] @@ -738,6 +740,27 @@ export default function Estimate({ params }) { }) } + //새로 추가한 아이템 견적 특이사항 체크.. + console.log('specialNoteList::', specialNoteList) + // specialNoteList.map((row) => { + // let spnAttrCds = res?.spnAttrCds?.split('、') + // let estimateOption = estimateContextState?.estimateOption?.split('、') + // let combineArray = Array.from(new Set([...spnAttrCds, ...estimateOption])).sort() + // row.check = false + // combineArray.map((row2) => { + // if (row.pkgYn === '0') { + // if (row2 === row.code) { + // row.check = true + // } + // } else { + // if (row.code.includes(row2)) { + // row.check = true + // return + // } + // } + // }) + // }) + setItemChangeYn(false) } }, [itemChangeYn, estimateContextState.itemList]) @@ -1077,7 +1100,7 @@ export default function Estimate({ params }) { key={uuidv4()} className="special-note-check-item" onClick={(event) => { - settingShowContent(row.code, event) + // settingShowContent(row.code, event) }} >
    @@ -1119,7 +1142,7 @@ export default function Estimate({ params }) { } else { let pushData = [] popShowSpecialNoteList.map((item) => { - let option = showContentCode.split(',') + let option = showContentCode.split('、') option.map((item2) => { if (item.code === item2) { pushData.push(item) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 9ac68243..af97cb11 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -219,10 +219,18 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredItem')) } - console.log('최종 아이템 정보::;', estimateData.itemList) + // console.log('최종 아이템 정보::;', estimateData.itemList) + let option = [] + estimateData.itemList.forEach((item) => { + if (item.specialNoteCd) { + let split2 = item.specialNoteCd.split('、') + option = option.concat(split2) + } + }) + console.log('최종 정보::;', estimateData) //2. 상세데이터 저장 - // return + return try { await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { if (res.status === 201) { From a9fc8b0f302096bf0d00c1937eaffe2d4aeac0e2 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 16:06:18 +0900 Subject: [PATCH 189/200] =?UTF-8?q?return=20=EC=A3=BC=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index af97cb11..3ee7cdea 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -230,7 +230,7 @@ export const useEstimateController = (planNo) => { console.log('최종 정보::;', estimateData) //2. 상세데이터 저장 - return + // return try { await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { if (res.status === 201) { From 74f64cce565717bc982c63fc13d43b6852536d5a Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 16:29:03 +0900 Subject: [PATCH 190/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 68 ++++++++++++++++++---------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index fb1e17b5..b3b41626 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -146,7 +146,6 @@ export default function Estimate({ params }) { } }) - console.log('최초::::::::', res) setSpecialNoteList(res) setSpecialNoteFirstFlg(true) @@ -176,7 +175,6 @@ export default function Estimate({ params }) { useEffect(() => { //선택된 견적특이사항 setEstimateContextState if (isNotEmptyArray(specialNoteList)) { - console.log('specialNoteList::', specialNoteList) const liveCheckedData = specialNoteList.filter((row) => row.check === true) const data = [] @@ -643,6 +641,51 @@ export default function Estimate({ params }) { }) console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) + let pushData = [] + let uniquSet = new Set() + + estimateContextState.itemList.forEach((item) => { + if (item.delFlg === '1') { + if (item.specialNoteCd) { + let splitData = item.specialNoteCd.split('、') + splitData.forEach((note) => { + if (!uniquSet.has(note)) { + uniquSet.add(note) + pushData.push(note) + } + }) + + setSpecialNoteFirstFlg(false) + } + } + }) + let estimateOption = estimateContextState?.estimateOption?.split('、') + estimateOption = estimateOption.filter((option) => !pushData.includes(option)) + let estimateOptionString = estimateOption.join('、') + console.log('바꾼값:::::::', estimateOptionString) + + console.log('SpecialNoteLis::', specialNoteList) + + //새로 추가한 아이템 견적 특이사항 체크.. + // specialNoteList.map((row) => { + // let spnAttrCds = res?.spnAttrCds?.split('、') + // let estimateOption = estimateContextState?.estimateOption?.split('、') + // let combineArray = Array.from(new Set([...spnAttrCds, ...estimateOption])).sort() + // row.check = false + // combineArray.map((row2) => { + // if (row.pkgYn === '0') { + // if (row2 === row.code) { + // row.check = true + // } + // } else { + // if (row.code.includes(row2)) { + // row.check = true + // return + // } + // } + // }) + // }) + estimateContextState.itemList.map((item) => { delete item.showSalePrice delete item.showSaleTotPrice @@ -740,27 +783,6 @@ export default function Estimate({ params }) { }) } - //새로 추가한 아이템 견적 특이사항 체크.. - console.log('specialNoteList::', specialNoteList) - // specialNoteList.map((row) => { - // let spnAttrCds = res?.spnAttrCds?.split('、') - // let estimateOption = estimateContextState?.estimateOption?.split('、') - // let combineArray = Array.from(new Set([...spnAttrCds, ...estimateOption])).sort() - // row.check = false - // combineArray.map((row2) => { - // if (row.pkgYn === '0') { - // if (row2 === row.code) { - // row.check = true - // } - // } else { - // if (row.code.includes(row2)) { - // row.check = true - // return - // } - // } - // }) - // }) - setItemChangeYn(false) } }, [itemChangeYn, estimateContextState.itemList]) From 24e32f6a4a76e42b3f8a6139d9bd1a7bc0b8d458 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 17:06:35 +0900 Subject: [PATCH 191/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 43 ++++++++++++---------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index b3b41626..3b00d2ee 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -660,31 +660,25 @@ export default function Estimate({ params }) { } }) let estimateOption = estimateContextState?.estimateOption?.split('、') - estimateOption = estimateOption.filter((option) => !pushData.includes(option)) - let estimateOptionString = estimateOption.join('、') - console.log('바꾼값:::::::', estimateOptionString) + let removeEstimateOption = estimateOption.filter((option) => pushData.includes(option)) + // let estimateOptionString = estimateOption.join('、') - console.log('SpecialNoteLis::', specialNoteList) + // console.log('SpecialNoteLis::', specialNoteList) - //새로 추가한 아이템 견적 특이사항 체크.. - // specialNoteList.map((row) => { - // let spnAttrCds = res?.spnAttrCds?.split('、') - // let estimateOption = estimateContextState?.estimateOption?.split('、') - // let combineArray = Array.from(new Set([...spnAttrCds, ...estimateOption])).sort() - // row.check = false - // combineArray.map((row2) => { - // if (row.pkgYn === '0') { - // if (row2 === row.code) { - // row.check = true - // } - // } else { - // if (row.code.includes(row2)) { - // row.check = true - // return - // } - // } - // }) - // }) + specialNoteList.map((row) => { + row.check = false + estimateOption.map((row2) => { + if (row.pkgYn === '0') { + if (row2 === row.code) { + row.check = true + } + } else { + console.log('제품가대세팅::::', row.code) + console.log('removeEstimateOption::::', removeEstimateOption) + return + } + }) + }) estimateContextState.itemList.map((item) => { delete item.showSalePrice @@ -707,6 +701,7 @@ export default function Estimate({ params }) { // const price totAmount += amount supplyPrice += price + console.log('공급가액::::::::::::::::::::::', supplyPrice) } }) @@ -771,7 +766,7 @@ export default function Estimate({ params }) { } } }) - supplyPrice = addSupplyPrice + Number(estimateContextState.pkgTotPrice) + supplyPrice = addSupplyPrice + Number(estimateContextState.pkgTotPrice / 1000) vatPrice = supplyPrice * 0.1 totPrice = supplyPrice + vatPrice setEstimateContextState({ From 9b99be56a8525d85f9fbaae6a94372577c6fe3cc Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 27 Nov 2024 17:15:43 +0900 Subject: [PATCH 192/200] =?UTF-8?q?polygon=20=EA=B2=BD=EC=82=AC,=20?= =?UTF-8?q?=EA=B0=81=EB=8F=84,=20=EB=B0=A9=ED=96=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/qpolygon-utils.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index e580fbb7..4f1e9178 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1640,7 +1640,13 @@ export const drawGabledRoof = (roofId, canvas) => { selectable: false, fontSize: roof.fontSize, name: 'roofPolygon', - attributes: { roofId: roof.id, currentRoof: currentRoof.id }, + attributes: { + roofId: roof.id, + currentRoof: currentRoof.id, + pitch: currentRoof.attributes.pitch, + degree: currentRoof.attributes.degree, + direction: currentRoof.direction, + }, }) const currentDegree = currentRoof.attributes.pitch > 0 ? getDegreeByChon(currentRoof.attributes.pitch) : currentRoof.attributes.degree //지붕 각도에 따른 실측치 조정 From f603a5defa2667d2a1cf28d9696c02f03ae97133 Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 27 Nov 2024 17:16:07 +0900 Subject: [PATCH 193/200] =?UTF-8?q?useContext=20=20->=20useEvent=20?= =?UTF-8?q?=EC=9B=90=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useModuleBasicSetting.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index f9900f56..067d9f8a 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -18,8 +18,8 @@ export function useModuleBasicSetting() { const roofDisplay = useRecoilValue(roofDisplaySelector) const [moduleSetupSurface, setModuleSetupSurface] = useRecoilState(moduleSetupSurfaceState) const [moduleIsSetup, setModuleIsSetup] = useRecoilState(moduleIsSetupState) - // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() - const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) + const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useEvent() + // const { addTargetMouseEventListener, addCanvasMouseEventListener, initEvent } = useContext(EventContext) const [flowModuleLine, setFlowModuleLine] = useState({}) let selectedModuleInstSurfaceArray = [] From d5eb0c71aecd54a7b357dd3196ff18744898c3f8 Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 27 Nov 2024 17:16:24 +0900 Subject: [PATCH 194/200] =?UTF-8?q?A,=20B=20=ED=8C=A8=ED=84=B4=20=EC=A7=80?= =?UTF-8?q?=EB=B6=95=EB=A9=B4=20=ED=95=A0=EB=8B=B9=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roofcover/useRoofAllocationSetting.js | 11 +++-- src/hooks/usePolygon.js | 42 +++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 6cde3635..ebb0184a 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -18,7 +18,7 @@ import { menuTypeState } from '@/store/menuAtom' export function useRoofAllocationSetting(id) { const canvas = useRecoilValue(canvasState) const roofDisplay = useRecoilValue(roofDisplaySelector) - const { drawDirectionArrow, addLengthText, splitPolygonWithLines } = usePolygon() + const { drawDirectionArrow, addLengthText, splitPolygonWithLines, splitPolygonWithSeparate } = usePolygon() const [popupId, setPopupId] = useState(uuidv4()) const { addPopup, closePopup, closeAll } = usePopup() const { getMessage } = useMessage() @@ -188,16 +188,19 @@ export function useRoofAllocationSetting(id) { const wallLines = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.WALL) roofBases.forEach((roofBase) => { try { - splitPolygonWithLines(roofBase) + if (roofBase.separatePolygon.length > 0) { + splitPolygonWithSeparate(roofBase.separatePolygon) + } else { + splitPolygonWithLines(roofBase) + } } catch (e) { return } - roofBase.innerLines.forEach((line) => { canvas.remove(line) }) - // canvas.remove(roofBase) + canvas.remove(roofBase) }) wallLines.forEach((wallLine) => { diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index 56052379..a844dd6b 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -1026,6 +1026,47 @@ export const usePolygon = () => { }) } + const splitPolygonWithSeparate = (separates) => { + separates.forEach((separate) => { + const points = separate.lines.map((line) => { + return { x: line.x1, y: line.y1 } + }) + let defense = '' + switch (separate.attributes.direction) { + case 'top': + defense = 'east' + break + case 'right': + defense = 'south' + break + case 'bottom': + defense = 'west' + break + case 'left': + defense = 'north' + break + } + + const roof = new QPolygon(points, { + fontSize: separate.fontSize, + stroke: 'black', + fill: 'transparent', + strokeWidth: 3, + name: POLYGON_TYPE.ROOF, + originX: 'center', + originY: 'center', + selectable: true, + defense: defense, + pitch: separate.attributes.pitch, + direction: defense, + }) + + canvas.add(roof) + }) + + canvas.renderAll() + } + return { addPolygon, addPolygonByLines, @@ -1033,5 +1074,6 @@ export const usePolygon = () => { drawDirectionArrow, addLengthText, splitPolygonWithLines, + splitPolygonWithSeparate, } } From 4fccfbb62115eb507abc1e7d59a4e81a85f180da Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 18:12:02 +0900 Subject: [PATCH 195/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 60 ++++++++++++------- .../estimate/useEstimateController.js | 1 + 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 3b00d2ee..2c12918b 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -123,6 +123,7 @@ export default function Estimate({ params }) { if (estimateContextState?.estimateOption) { res.map((row) => { let estimateOption = estimateContextState?.estimateOption?.split('、') + // console.log('최초:::', estimateOption) row.check = false estimateOption.map((row2) => { if (row.pkgYn === '0') { @@ -207,8 +208,12 @@ export default function Estimate({ params }) { //상세에서 내려온 첨부파일 set 만들기 useEffect(() => { if (isNotEmptyArray(estimateContextState.fileList)) { + //드래그영역 비워주기 + setFiles([]) setOriginFiles(estimateContextState.fileList) } + + // setFiles([]) }, [estimateContextState?.fileList]) // 기존첨부파일 삭제 @@ -520,12 +525,14 @@ export default function Estimate({ params }) { updates.pkgMaterialFlg = res.pkgMaterialFlg updates.pnowW = res.pnowW updates.salePrice = res.salePrice + // updates.salePrice = '' updates.specification = res.specification updates.unit = res.unit updates.specialNoteCd = res.spnAttrCds updates.itemGroup = res.itemGroup updates.delFlg = '0' // 삭제플래그 0 updates.saleTotPrice = (res.salePrice * estimateContextState.itemList[index].amount).toString() + // updates.saleTotPrice = '' updates.amount = '' if (estimateContextState.estimateType === 'YJSS') { @@ -539,7 +546,11 @@ export default function Estimate({ params }) { updateList = estimateContextState.itemList.map((item) => { if (item.dispOrder === dispOrder) { - return { ...item, ...updates } + if (item?.addFlg) { + return { ...item, ...updates, saleTotPrice: '' } + } else { + return { ...item, ...updates, salePrice: '', saleTotPrice: '' } + } } else if (item.paDispOrder === dispOrder) { //봄제품을 바꿨을떄 return { ...item, delFlg: '1' } @@ -557,14 +568,12 @@ export default function Estimate({ params }) { bomItem.salePrice = '0' bomItem.saleTotPrice = '0' bomItem.unitPrice = '0' - // bomItem.amount = null } else { bomItem.dispOrder = (index + 1 + Number(dispOrder)).toString() bomItem.paDispOrder = dispOrder bomItem.salePrice = '0' bomItem.saleTotPrice = '0' bomItem.unitPrice = '0' - // bomItem.amount = null } bomItem.delFlg = '0' @@ -639,7 +648,7 @@ export default function Estimate({ params }) { estimateContextState.itemList.sort((a, b) => { return a.dispOrder - b.dispOrder }) - console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) + // console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) let pushData = [] let uniquSet = new Set() @@ -660,25 +669,33 @@ export default function Estimate({ params }) { } }) let estimateOption = estimateContextState?.estimateOption?.split('、') - let removeEstimateOption = estimateOption.filter((option) => pushData.includes(option)) - // let estimateOptionString = estimateOption.join('、') + // console.log('오리진::', estimateOption) + let removeEstimateOption = estimateOption.filter((option) => !pushData.includes(option)) + // console.log('남길거?? ', removeEstimateOption) + let removeEstimateOptionString = removeEstimateOption.join('、') // console.log('SpecialNoteLis::', specialNoteList) - specialNoteList.map((row) => { - row.check = false - estimateOption.map((row2) => { - if (row.pkgYn === '0') { - if (row2 === row.code) { - row.check = true - } - } else { - console.log('제품가대세팅::::', row.code) - console.log('removeEstimateOption::::', removeEstimateOption) - return - } - }) - }) + // specialNoteList.map((row) => { + // row.check = false + // estimateOption.map((row2) => { + // if (row.pkgYn === '0') { + // if (row2 === row.code) { + // row.check = true + // } + // } else { + // // console.log('지울꺼::', removeEstimateOptionString) + // if (row.code.includes(removeEstimateOptionString)) { + // // console.log('removeEstimateOption::::', removeEstimateOption) + // // row.check = false + // return + // } else { + // // console.log('제품가대세팅::::', row.code) + // // row.check = true + // } + // } + // }) + // }) estimateContextState.itemList.map((item) => { delete item.showSalePrice @@ -701,7 +718,6 @@ export default function Estimate({ params }) { // const price totAmount += amount supplyPrice += price - console.log('공급가액::::::::::::::::::::::', supplyPrice) } }) @@ -717,7 +733,7 @@ export default function Estimate({ params }) { }) } else { //YJSS - console.log('YJSS 토탈만들어주기::::::::::', estimateContextState.itemList) + // console.log('YJSS 토탈만들어주기::::::::::', estimateContextState.itemList) estimateContextState.itemList.sort((a, b) => { return a.dispOrder - b.dispOrder }) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 3ee7cdea..4cb00aba 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -88,6 +88,7 @@ export const useEstimateController = (planNo) => { itemChangeFlg: '1', //추가시 체인지플래그 1로 partAdd: '1', //NEW 체인지 플래그 delFlg: '0', //삭제 플래그 0 삭제하면 1 + addFlg: true, }, ], }) From 44323266e503775d639017beb160981bc93b5666 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 18:38:52 +0900 Subject: [PATCH 196/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 43 ++++++++++--------- .../estimate/useEstimateController.js | 12 +++--- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 2c12918b..65085072 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -1071,20 +1071,20 @@ export default function Estimate({ params }) {
    - {data.name} - + {header.name} +
    {convertNumberToPriceDecimal(item?.saleTotPrice?.replaceAll(',', ''))}{convertNumberToPriceDecimalToFixed(item?.saleTotPrice?.replaceAll(',', ''), 2)} + {convertNumberToPriceDecimal(item?.showSaleTotPrice === '0' ? null : item?.saleTotPrice?.replaceAll(',', ''))} +
    {/* 첨부파일 목록 시작 */} -
    - - - - - - - - - + + +
    {getMessage('estimate.detail.header.fileList2')} -
    -
      - {originFiles.length > 0 && - originFiles.map((originFile) => { + {originFiles.length > 0 && ( +
      + + + + + + + + + - - -
      {getMessage('estimate.detail.header.fileList2')} +
      +
        + {originFiles.map((originFile) => { return (
      • handleEstimateFileDownload(originFile)}> @@ -1101,13 +1101,14 @@ export default function Estimate({ params }) {
      • ) })} -
      -
      -
      -
      +
    +
    +
    +
    + )} {/* 첨부파일 목록 끝 */} {/* 파일첨부 끝 */} {/* 견적특이사항 시작 */} diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 4cb00aba..b3c662d7 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -150,11 +150,13 @@ export const useEstimateController = (planNo) => { if (estimateData.fileList.length < 1) { if (estimateData.itemList.length > 1) { estimateData.itemList.map((row) => { - if (row.fileUploadFlg === '1') { - if (fileFlg) { - if (estimateData.fileFlg === '0') { - fileFlg = false - return alert(getMessage('estimate.detail.save.requiredFileUpload')) + if (row.delFlg === '0') { + if (row.fileUploadFlg === '1') { + if (fileFlg) { + if (estimateData.fileFlg === '0') { + fileFlg = false + return alert(getMessage('estimate.detail.save.requiredFileUpload')) + } } } } From cf6e5da7a0269b455c1459eafa95b2cf02f66d47 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 18:46:02 +0900 Subject: [PATCH 197/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/useEstimateController.js | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index b3c662d7..ec0bbe77 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -167,29 +167,31 @@ export const useEstimateController = (planNo) => { if (fileFlg) { estimateData.itemList.map((item) => { - item.amount = item.amount?.replaceAll(',', '') - item.salePrice = parseFloat(item.salePrice?.replaceAll(',', '')).toFixed(2) - item.saleTotPrice = parseFloat(item.saleTotPrice?.replaceAll(',', '')).toFixed(2) + if (item.delFlg === '0') { + item.amount = item.amount?.replaceAll(',', '') + item.salePrice = parseFloat(item.salePrice?.replaceAll(',', '')).toFixed(2) + item.saleTotPrice = parseFloat(item.saleTotPrice?.replaceAll(',', '')).toFixed(2) - if (!item.paDispOrder) { - if (itemFlg) { - if (isNaN(item.amount)) { - item.amount = '0' - } - - if (item.amount < 1) { - itemFlg = false - return alert(getMessage('estimate.detail.save.requiredAmount')) - } - - if (estimateData.estimateType !== 'YJSS') { - if (isNaN(item.salePrice)) { - item.salePrice = '0' + if (!item.paDispOrder) { + if (itemFlg) { + if (isNaN(item.amount)) { + item.amount = '0' } - if (item.salePrice < 1) { + if (item.amount < 1) { itemFlg = false - return alert(getMessage('estimate.detail.save.requiredSalePrice')) + return alert(getMessage('estimate.detail.save.requiredAmount')) + } + + if (estimateData.estimateType !== 'YJSS') { + if (isNaN(item.salePrice)) { + item.salePrice = '0' + } + + if (item.salePrice < 1) { + itemFlg = false + return alert(getMessage('estimate.detail.save.requiredSalePrice')) + } } } } From 9c1caae2292f29d5a60a23fe9e63f68947abdbf0 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 27 Nov 2024 18:54:42 +0900 Subject: [PATCH 198/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index ec0bbe77..ddfa2e68 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -212,7 +212,7 @@ export const useEstimateController = (planNo) => { //첨부파일저장끝 //제품라인 추가했는데 아이템 안고르고 저장하면itemId=''은 날리고 나머지 저장하기 - estimateData.itemList = estimateData.itemList.filter((item) => item.itemId !== '' && item.delFlg === '0') + estimateData.itemList = estimateData.itemList.filter((item) => item.itemId !== '') let delCnt = 0 estimateData.itemList.map((item) => { @@ -233,7 +233,8 @@ export const useEstimateController = (planNo) => { } }) - console.log('최종 정보::;', estimateData) + // console.log('아이템리스트::', estimateData.itemList) + // console.log('최종 정보::;', estimateData) //2. 상세데이터 저장 // return try { From 10b9a2d42f8cfd160135b14bbf714ea5b1cff6ea Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 28 Nov 2024 09:33:40 +0900 Subject: [PATCH 199/200] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 65085072..aad02cc1 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -648,7 +648,7 @@ export default function Estimate({ params }) { estimateContextState.itemList.sort((a, b) => { return a.dispOrder - b.dispOrder }) - // console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) + console.log('YJOD 토탈만들어주기::::::::::', estimateContextState.itemList) let pushData = [] let uniquSet = new Set() @@ -733,7 +733,7 @@ export default function Estimate({ params }) { }) } else { //YJSS - // console.log('YJSS 토탈만들어주기::::::::::', estimateContextState.itemList) + console.log('YJSS 토탈만들어주기::::::::::', estimateContextState.itemList) estimateContextState.itemList.sort((a, b) => { return a.dispOrder - b.dispOrder }) @@ -1459,8 +1459,7 @@ export default function Estimate({ params }) { Date: Thu, 28 Nov 2024 09:38:33 +0900 Subject: [PATCH 200/200] =?UTF-8?q?[=EC=BB=A4=EB=AE=A4=EB=8B=88=ED=8B=B0]?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=20=ED=8C=9D=EC=97=85=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/community/modal/BoardDetailModal.jsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/community/modal/BoardDetailModal.jsx b/src/components/community/modal/BoardDetailModal.jsx index c1ba4213..aafb0d8f 100644 --- a/src/components/community/modal/BoardDetailModal.jsx +++ b/src/components/community/modal/BoardDetailModal.jsx @@ -69,7 +69,12 @@ export default function BoardDetailModal({ noticeNo, setOpen }) { )} -
    {boardDetail.contents}
    +
    ') : '', + }} + >