diff --git a/docs/dictionary.txt b/docs/dictionary.txt index 0864da77..6e81da01 100644 --- a/docs/dictionary.txt +++ b/docs/dictionary.txt @@ -24,4 +24,4 @@ Allpainted : allPainted 개구: openSpace 도머: dormer 그림자: shadow - +치수선: dimensionLine \ No newline at end of file diff --git a/src/components/Playground.jsx b/src/components/Playground.jsx index 3bdb7ccb..d1061306 100644 --- a/src/components/Playground.jsx +++ b/src/components/Playground.jsx @@ -138,7 +138,7 @@ export default function Playground() { pageNo: 1, pageSize: 10, pagePerBlock: 10, - totalCount: 501, + totalCount: 26, handleChangePage: (page) => { console.log('page', page) }, diff --git a/src/components/common/color-picker/ColorPickerModal.jsx b/src/components/common/color-picker/ColorPickerModal.jsx index 22a3c5c4..add20a7e 100644 --- a/src/components/common/color-picker/ColorPickerModal.jsx +++ b/src/components/common/color-picker/ColorPickerModal.jsx @@ -3,9 +3,12 @@ import ColorPicker from '@/components/common/color-picker/ColorPicker' import { useMessage } from '@/hooks/useMessage' import { useEffect, useState } from 'react' import { usePopup } from '@/hooks/usePopup' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' export default function ColorPickerModal(props) { - const { isShow, setIsShow, pos = { x: 770, y: -815 }, color = '#ff0000', setColor, id } = props + const contextPopupPosition = useRecoilValue(contextPopupPositionState) // 현재 메뉴 + const { isShow, setIsShow, pos = contextPopupPosition, color = '#ff0000', setColor, id } = props const { getMessage } = useMessage() const [originColor, setOriginColor] = useState(color) const { closePopup } = usePopup() @@ -15,14 +18,17 @@ export default function ColorPickerModal(props) { }, [isShow]) return ( - +

{getMessage('modal.color.picker.title')}

diff --git a/src/components/common/select/QSelectBox.jsx b/src/components/common/select/QSelectBox.jsx index d0538f1d..ee101898 100644 --- a/src/components/common/select/QSelectBox.jsx +++ b/src/components/common/select/QSelectBox.jsx @@ -20,7 +20,7 @@ export default function QSelectBox({ title = '', options, onChange, value }) {
    {options?.map((option) => (
  • handleClickSelectOption(option)}> - +
  • ))}
diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index 6887d07a..e6261edc 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -16,7 +16,7 @@ export default function CanvasFrame({ plan }) { const canvasRef = useRef(null) const { canvas } = useCanvas('canvas') const { handleZoomClear } = useCanvasEvent() - const { contextMenu, currentContextMenu, setCurrentContextMenu } = useContextMenu({ + const { contextMenu, currentContextMenu, setCurrentContextMenu, handleClick } = useContextMenu({ externalFn: { handleZoomClear, }, @@ -59,7 +59,7 @@ export default function CanvasFrame({ plan }) { if (menu.fn) { menu.fn() } - setCurrentContextMenu(menu) + handleClick(e, menu) }} > {menu.name} @@ -68,7 +68,6 @@ export default function CanvasFrame({ plan }) { ))} - {currentContextMenu?.component}
) } diff --git a/src/components/floor-plan/FloorPlan.jsx b/src/components/floor-plan/FloorPlan.jsx index 655c7340..bc95d9b3 100644 --- a/src/components/floor-plan/FloorPlan.jsx +++ b/src/components/floor-plan/FloorPlan.jsx @@ -5,14 +5,13 @@ import { useRecoilState, useRecoilValue } from 'recoil' import { useAxios } from '@/hooks/useAxios' import { globalLocaleStore } from '@/store/localeAtom' import { settingModalFirstOptionsState, settingModalSecondOptionsState } from '@/store/settingAtom' -import '@/styles/contents.scss' import CanvasMenu from '@/components/floor-plan/CanvasMenu' import CanvasLayout from '@/components/floor-plan/CanvasLayout' +import '@/styles/contents.scss' export default function FloorPlan() { const globalLocaleState = useRecoilValue(globalLocaleStore) const { get } = useAxios(globalLocaleState) - const [settingModalFirstOptions, setSettingModalFirstOptions] = useRecoilState(settingModalFirstOptionsState) const [settingModalSecondOptions, setSettingModalSecondOptions] = useRecoilState(settingModalSecondOptionsState) const [objectNo, setObjectNo] = useState('test123240912001') // 이후 삭제 필요 @@ -23,7 +22,6 @@ export default function FloorPlan() { menuNumber, setMenuNumber, } - useEffect(() => { console.log('FloorPlan useEffect 실행') fetchSettings() diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryCopy.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryCopy.jsx new file mode 100644 index 00000000..b88d7a3b --- /dev/null +++ b/src/components/floor-plan/modal/auxiliary/AuxiliaryCopy.jsx @@ -0,0 +1,55 @@ +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' + +export default function AuxiliaryCopy(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props + const { getMessage } = useMessage() + const { closePopup } = usePopup() + return ( + +
+
+

補助線のコピー

+ +
+
+
コピーする方向を入力してください
+
+
+
+

長さ

+
+
+ +
+ mm +
+
+
+ +
+ mm +
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryMove.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryMove.jsx index 28674c07..9b4beb8f 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliaryMove.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliaryMove.jsx @@ -1,14 +1,20 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' +import { usePopup } from '@/hooks/usePopup' -export default function AuxiliaryMove({ setCurrentContextMenu }) { +export default function AuxiliaryMove(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props const { getMessage } = useMessage() + const { closePopup } = usePopup() return ( - +

補助線の移動

-
diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx index c562e8dd..49cd2570 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliarySize.jsx @@ -1,14 +1,20 @@ 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' -export default function AuxiliarySize({ setCurrentContextMenu }) { +export default function AuxiliarySize(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props const { getMessage } = useMessage() + const { closePopup } = usePopup() return ( - +

補助線サイズ変更

-
diff --git a/src/components/floor-plan/modal/basic/step/Orientation.jsx b/src/components/floor-plan/modal/basic/step/Orientation.jsx index 3ef15a21..98e10c0c 100644 --- a/src/components/floor-plan/modal/basic/step/Orientation.jsx +++ b/src/components/floor-plan/modal/basic/step/Orientation.jsx @@ -6,6 +6,19 @@ export default function Orientation({ setTabNum }) { const [compasDeg, setCompasDeg] = useState(0) const [hasAnglePassivity, setHasAnglePassivity] = useState(false) + const getDegree = (degree) => { + 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 + } + return ( <>
@@ -18,7 +31,7 @@ export default function Orientation({ setTabNum }) { {Array.from({ length: 180 / 15 }).map((dot, index) => (
setCompasDeg(15 * (12 + index))} > {index === 0 && 180°} @@ -26,13 +39,13 @@ export default function Orientation({ setTabNum }) {
))} {Array.from({ length: 180 / 15 }).map((dot, index) => ( -
setCompasDeg(15 * index)}> +
setCompasDeg(15 * index)}> {index === 0 && } {index === 6 && 90°}
))}
-
+
diff --git a/src/components/floor-plan/modal/dimensionLine/DimensionLineSetting.jsx b/src/components/floor-plan/modal/dimensionLine/DimensionLineSetting.jsx new file mode 100644 index 00000000..57fe3364 --- /dev/null +++ b/src/components/floor-plan/modal/dimensionLine/DimensionLineSetting.jsx @@ -0,0 +1,74 @@ +import WithDraggable from '@/components/common/draggable/WithDraggable' +import { usePopup } from '@/hooks/usePopup' +import { useMessage } from '@/hooks/useMessage' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' +import QSelectBox from '@/components/common/select/QSelectBox' + +export default function DimensionLineSetting(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, setIsShow, pos = contextPopupPosition } = props + const { getMessage } = useMessage() + const { closePopup } = usePopup() + const SelectOption01 = [{ name: '0' }, { name: '0' }, { name: '0' }, { name: '0' }] + return ( + +
+
+

表示の変更

+ +
+
+
寸法線に表示する数値を入力してください
+
+
+
+ 既存の長さ +
+ +
+
+
+
+ 変更の長さ +
+ +
+
+
+
+ + +
+
+
+
+
傾斜を着せてください。
+
+
+ 傾斜 +
+ +
+ 寸法 +
+
+ 傾斜 +
+ +
+ 寸法 +
+
+
傾き設定されている場合、入力した数値に傾き計算をした数値が表示されます。
+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/distance/Distance.jsx b/src/components/floor-plan/modal/distance/Distance.jsx new file mode 100644 index 00000000..06a7a483 --- /dev/null +++ b/src/components/floor-plan/modal/distance/Distance.jsx @@ -0,0 +1,67 @@ +import WithDraggable from '@/components/common/draggable/withDraggable' +import { useMessage } from '@/hooks/useMessage' +import { usePopup } from '@/hooks/usePopup' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' + +export default function Distance(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition, distance } = props + const { getMessage } = useMessage() + const { closePopup } = usePopup() + + return ( + +
+
+

距離測定

+ +
+
+
+
+
+
2点間距離
+
+
+
+ +
+ mm +
+
+
+
+
水平距離
+
+
+
+ +
+ mm +
+
+
+
+
垂直距離
+
+
+
+ +
+ mm +
+
+
+
+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/flowDirection/FlowDirectionSetting.jsx b/src/components/floor-plan/modal/flowDirection/FlowDirectionSetting.jsx new file mode 100644 index 00000000..ff749a6f --- /dev/null +++ b/src/components/floor-plan/modal/flowDirection/FlowDirectionSetting.jsx @@ -0,0 +1,150 @@ +import WithDraggable from '@/components/common/draggable/withDraggable' +import { useState } from 'react' +import QSelectBox from '@/components/common/select/QSelectBox' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' +import { useMessage } from '@/hooks/useMessage' +import { usePopup } from '@/hooks/usePopup' + +const SelectOption01 = [{ name: 'M' }, { name: 'M' }, { name: 'M' }, { name: 'M' }] + +export default function FlowDirectionSetting(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props + const { getMessage } = useMessage() + const { closePopup } = usePopup() + const [compasDeg, setCompasDeg] = useState(0) + return ( + +
+
+

面フローの設定

+ +
+
+
+
+
流れ方向の設定
+
流れ方向を選択してください。
+
+
+ + ドン + + 立つ + + + + +
+
+
+
+
方位設定
+
シミュレーション計算の方向を指定します。面が向いている方位を選択してください。
+
+
+ + +
+
+ +
+
+
+
+ + +
+
+
+
+
setCompasDeg(180)}> + 13 +
+
setCompasDeg(195)}> + 12 +
+
setCompasDeg(210)}> + 11 +
+
setCompasDeg(225)}> + 10 +
+
setCompasDeg(240)}> + 9 +
+
setCompasDeg(255)}> + 8 +
+
setCompasDeg(270)}> + 7 +
+
setCompasDeg(285)}> + 6 +
+
setCompasDeg(300)}> + 5 +
+
setCompasDeg(315)}> + 4 +
+
setCompasDeg(330)}> + 3 +
+
setCompasDeg(345)}> + 2 +
+
setCompasDeg(0)}> + 1 +
+
setCompasDeg(15)}> + 24 +
+
setCompasDeg(30)}> + 23 +
+
setCompasDeg(45)}> + 22 +
+
setCompasDeg(60)}> + 21 +
+
setCompasDeg(75)}> + 20 +
+
setCompasDeg(90)}> + 19 +
+
setCompasDeg(105)}> + 18 +
+
setCompasDeg(120)}> + 17 +
+
setCompasDeg(135)}> + 16 +
+
setCompasDeg(150)}> + 15 +
+
setCompasDeg(165)}> + 14 +
+
+
+
+
+
+
+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/grid/GridCopy.jsx b/src/components/floor-plan/modal/grid/GridCopy.jsx index a6709d09..0f2bfc22 100644 --- a/src/components/floor-plan/modal/grid/GridCopy.jsx +++ b/src/components/floor-plan/modal/grid/GridCopy.jsx @@ -1,16 +1,21 @@ import WithDraggable from '@/components/common/draggable/WithDraggable' import { useMessage } from '@/hooks/useMessage' +import { usePopup } from '@/hooks/usePopup' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' export default function GridCopy(props) { - const { setShowGridMoveModal, setShowGridCopyModal } = props + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props const { getMessage } = useMessage() + const { closePopup } = usePopup() return ( - +

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

-
diff --git a/src/components/floor-plan/modal/grid/GridMove.jsx b/src/components/floor-plan/modal/grid/GridMove.jsx index db226872..6d901fe3 100644 --- a/src/components/floor-plan/modal/grid/GridMove.jsx +++ b/src/components/floor-plan/modal/grid/GridMove.jsx @@ -1,16 +1,21 @@ import WithDraggable from '@/components/common/draggable/WithDraggable' import { useMessage } from '@/hooks/useMessage' +import { usePopup } from '@/hooks/usePopup' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' export default function GridMove(props) { - const { setShowGridMoveModal, setShowGridCopyModal } = props + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props const { getMessage } = useMessage() + const { closePopup } = usePopup() return ( - +

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

-
diff --git a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx new file mode 100644 index 00000000..16871a19 --- /dev/null +++ b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx @@ -0,0 +1,104 @@ +import WithDraggable from '@/components/common/draggable/withDraggable' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' +import { useMessage } from '@/hooks/useMessage' +import { usePopup } from '@/hooks/usePopup' + +export default function LinePropertySetting(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props + const { getMessage } = useMessage() + const { closePopup } = usePopup() + return ( + +
+
+

各辺属性の変更

+ +
+
+
+ 属性を変更する辺を選択してください。 + 選択した値 [龍丸] +
+
+
設定
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/object/DormerOffset.jsx b/src/components/floor-plan/modal/object/DormerOffset.jsx new file mode 100644 index 00000000..442e92df --- /dev/null +++ b/src/components/floor-plan/modal/object/DormerOffset.jsx @@ -0,0 +1,55 @@ +import { useMessage } from '@/hooks/useMessage' +import WithDraggable from '@/components/common/draggable/WithDraggable' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' +import { usePopup } from '@/hooks/usePopup' + +export default function DormerOffset(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props + const { getMessage } = useMessage() + const { closePopup } = usePopup() + return ( + +
+
+

도머 오프셋

+ +
+
+
移動する方向を入力してください
+
+
+
+

長さ

+
+
+ +
+ mm +
+
+
+ +
+ mm +
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/object/RoofMaterialSetting.jsx b/src/components/floor-plan/modal/object/RoofMaterialSetting.jsx new file mode 100644 index 00000000..01d6f773 --- /dev/null +++ b/src/components/floor-plan/modal/object/RoofMaterialSetting.jsx @@ -0,0 +1,45 @@ +'use client' + +import { useRecoilValue } from 'recoil' +import { useMessage } from '@/hooks/useMessage' +import WithDraggable from '@/components/common/draggable/WithDraggable' +import { usePopup } from '@/hooks/usePopup' +import { contextPopupPositionState } from '@/store/popupAtom' +import QSelectBox from '@/components/common/select/QSelectBox' + +export default function RoofMaterialSetting(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props + const { getMessage } = useMessage() + const { closePopup } = usePopup() + const roofMaterials = [ + { name: '기와1', value: 'material1' }, + { name: '기와2', value: 'material2' }, + { name: '기와3', value: 'material3' }, + { name: '기와4', value: 'material4' }, + { name: '기와5', value: 'material5' }, + ] + + return ( + +
+
+

変更

+ +
+
+
+
+ +
+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/object/SizeSetting.jsx b/src/components/floor-plan/modal/object/SizeSetting.jsx new file mode 100644 index 00000000..ca7d4773 --- /dev/null +++ b/src/components/floor-plan/modal/object/SizeSetting.jsx @@ -0,0 +1,71 @@ +'use client' + +import { useRecoilValue } from 'recoil' +import { useMessage } from '@/hooks/useMessage' +import { canvasState } from '@/store/canvasAtom' +import WithDraggable from '@/components/common/draggable/WithDraggable' +import { usePopup } from '@/hooks/usePopup' +import { contextPopupPositionState } from '@/store/popupAtom' +import { useState } from 'react' + +export default function SizeSetting(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const [settingTarget, setSettingTarget] = useState(1) + const { id, pos = contextPopupPosition } = props + const { getMessage } = useMessage() + const canvas = useRecoilValue(canvasState) + const { closePopup } = usePopup() + + return ( + +
+
+

サイズ変更

+ +
+
+
+
+
+
+ + mm +
+
+ + mm +
+
+
+
+
+
+
+ + mm +
+
+ + mm +
+
+
+
+ + + + +
+
+
+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/roofAllocation/RoofAllocationSetting.jsx b/src/components/floor-plan/modal/roofAllocation/RoofAllocationSetting.jsx index 934f2f9d..c6afa44d 100644 --- a/src/components/floor-plan/modal/roofAllocation/RoofAllocationSetting.jsx +++ b/src/components/floor-plan/modal/roofAllocation/RoofAllocationSetting.jsx @@ -3,8 +3,12 @@ import WithDraggable from '@/components/common/draggable/WithDraggable' import QSelectBox from '@/components/common/select/QSelectBox' import { useRoofAllocationSetting } from '@/hooks/roofcover/useRoofAllocationSetting' import { usePopup } from '@/hooks/usePopup' +import { useRecoilValue } from 'recoil' +import { contextPopupPositionState } from '@/store/popupAtom' -export default function RoofAllocationSetting({ id, pos = { x: 50, y: 230 } }) { +export default function RoofAllocationSetting(props) { + const contextPopupPosition = useRecoilValue(contextPopupPositionState) + const { id, pos = contextPopupPosition } = props const { getMessage } = useMessage() const { closePopup } = usePopup() const { handleSave, onAddRoofMaterial, onDeleteRoofMaterial, values, roofMaterials, selectedRoofMaterial, setSelectedRoofMaterial } = diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index df057d8f..4a7e3052 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -25,7 +25,7 @@ export default function Stuff() { const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState) const { getMessage } = useMessage() const [pageNo, setPageNo] = useState(1) //현재 페이지 번호 - const [pageSize, setPageSize] = useState(100) //페이지 당 게시물 수 + const [pageSize, setPageSize] = useState(5) //페이지 당 게시물 수 const [totalCount, setTotalCount] = useState(0) //총 갯수 const [defaultSortType, setDefaultSortType] = useState('R') @@ -172,55 +172,54 @@ export default function Stuff() { } //물건삭제 - const fnDeleteRowData = (data) => { - console.log('물건삭제:::::::::::') - if (data.length === 0) { - return alert('삭제할 데이터를 선택하세요') - } - let errCount = 0 - data.forEach((cell) => { - if (!cell.objectNo) { - if (errCount === 0) { - alert('물건정보가 있는 행만 삭제 됩니다') - } - errCount++ - } - }) - } + // const fnDeleteRowData = (data) => { + // if (data.length === 0) { + // return alert('삭제할 데이터를 선택하세요') + // } + // let errCount = 0 + // data.forEach((cell) => { + // if (!cell.objectNo) { + // if (errCount === 0) { + // alert('물건정보가 있는 행만 삭제 됩니다') + // } + // errCount++ + // } + // }) + // } //행추가 - let newCount = 0 - const addRowItems = () => { - // console.log('girdRef::::::', gridRef.current.api) - const newItems = [ - { - mission: newCount + 1, - successful: true, - }, - ] - gridRef.current.api.applyTransaction({ - add: newItems, - addIndex: newCount, - }) - newCount++ - } + // let newCount = 0 + // const addRowItems = () => { + // // console.log('girdRef::::::', gridRef.current.api) + // const newItems = [ + // { + // mission: newCount + 1, + // successful: true, + // }, + // ] + // gridRef.current.api.applyTransaction({ + // add: newItems, + // addIndex: newCount, + // }) + // newCount++ + // } //행삭제 - const removeRowItems = () => { - // console.log('selectedRowData::', selectedRowData) - let errCount = 0 - selectedRowData.forEach((cell) => { - if (!cell.company) { - let newSelectedRowData = selectedRowData.filter((item) => item.company == null) - gridRef.current.api.applyTransaction({ remove: newSelectedRowData }) - } else { - if (errCount === 0) { - alert('행추가로 추가 한 행만 삭제됩니다.') - } - errCount++ - } - }) - } + // const removeRowItems = () => { + // // console.log('selectedRowData::', selectedRowData) + // let errCount = 0 + // selectedRowData.forEach((cell) => { + // if (!cell.company) { + // let newSelectedRowData = selectedRowData.filter((item) => item.company == null) + // gridRef.current.api.applyTransaction({ remove: newSelectedRowData }) + // } else { + // if (errCount === 0) { + // alert('행추가로 추가 한 행만 삭제됩니다.') + // } + // errCount++ + // } + // }) + // } // 진입시 그리드 데이터 조회 useEffect(() => { @@ -381,6 +380,7 @@ export default function Stuff() { // 페이징 현재페이지 변경 const handleChangePage = (page) => { + console.log('page:::', page) stuffSearchParams.code = 'S' setStuffSearch({ @@ -390,9 +390,13 @@ export default function Stuff() { endRow: page * pageSize, }) + // console.log('여기::::::::::::', page) setPageNo(page) } + // console.log('pageNo:::', pageNo) + // console.log('pageSize:::', pageSize) + // console.log('totalCount:::', totalCount) return ( <> {/* 퍼블시작 */} @@ -420,7 +424,7 @@ export default function Stuff() {
diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index a68771fa..3ecd471f 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -261,24 +261,21 @@ export default function StuffDetail() { }) useEffect(() => { - // console.log('objectNo::', objectNo) - if (objectNo) { setEditMode('EDIT') - - if (objectNo.substring(0, 1) === 'R') { + if (objectNo.substring(0, 1) !== 'T') { //벨리데이션 체크용.. setIsFormValid(true) } promiseGet({ url: `/api/object/${objectNo}/detail` }).then((res) => { if (res.status === 200) { + console.log('플랜데이타:::', res.data.planList) if (res.data != null) { setDetailData(res.data) } else { setDetailData({}) } if (isNotEmptyArray(res.data.planList)) { - // console.log('플랜RES::::::::', res.data.planList) setPlanGridProps({ ...planGridProps, planGridData: res.data.planList }) } else { setPlanGridProps({ ...planGridProps, planGridData: [] }) @@ -300,16 +297,23 @@ export default function StuffDetail() { //1차점 : X167 T01 //2차점 : 10X22, 201X112 get({ url: `/api/object/saleStore/${sessionState?.storeId}/list` }).then((res) => { - // get({ url: `/api/object/saleStore/T01/list` }).then((res) => { if (!isEmptyArray(res)) { const firstList = res.filter((row) => row.saleStoreLevel === '1') const otherList = res.filter((row) => row.saleStoreLevel !== '1') //1차점 셀렉트박스 setSaleStoreList(firstList) - //1차점 아닌 판매점 셀렉트박스 - setOriginOtherSaleStoreList(otherList) - setOtherSaleStoreList(otherList) + + let filterOtherList + if (sessionState?.storeId === 'T01') { + filterOtherList = otherList.filter((row) => row.firstAgentId === 'T01') + setOriginOtherSaleStoreList(filterOtherList) + setOtherSaleStoreList(filterOtherList) + } else { + //1차점 아닌 판매점 셀렉트박스 + setOriginOtherSaleStoreList(otherList) + setOtherSaleStoreList(otherList) + } if (sessionState?.storeLvl === '1') { setSelOptions(sessionState?.storeId) @@ -332,21 +336,19 @@ export default function StuffDetail() { const code2 = findCommonCode(201700) //신축/기축 const code3 = findCommonCode(202000) //기준풍속 202000 if (code1 != null) { - // console.log('경칭공코::::::', code1) setHonorificCodeList(code1) } if (code2 != null) { - // console.log('신축/기축공코::::', code2) setObjectStatusList(code2) } if (code3 != null) { - // console.log('기준풍속::::', code3) setWindSpeedList(code3) } }, [commonCode]) useEffect(() => { if (isObjectNotEmpty(detailData)) { + // console.log('상세데이타세팅:::::', detailData) // 도도부현API get({ url: '/api/object/prefecture/list' }).then((res) => { if (!isEmptyArray(res)) { @@ -357,19 +359,40 @@ export default function StuffDetail() { //1차점 : X167 T01 //2차점 : 10X22, 201X112 get({ url: `/api/object/saleStore/${sessionState?.storeId}/list` }).then((res) => { - // get({ url: `/api/object/saleStore/T01/list` }).then((res) => { if (!isEmptyArray(res)) { const firstList = res.filter((row) => row.saleStoreLevel === '1') const otherList = res.filter((row) => row.saleStoreLevel !== '1') + //1차점 셀렉트박스 setSaleStoreList(firstList) - //1차점 아닌 판매점 셀렉트박스 - setOriginOtherSaleStoreList(otherList) - setOtherSaleStoreList(otherList) - // console.log('1차점리스트::', firstList) - // console.log('2차점리스트::', otherList) + let filterOtherList + if (sessionState?.storeId === 'T01') { + filterOtherList = otherList.filter((row) => row.firstAgentId === 'T01') + setOriginOtherSaleStoreList(filterOtherList) + setOtherSaleStoreList(filterOtherList) + } else { + //1차점 아닌 판매점 셀렉트박스 + setOriginOtherSaleStoreList(otherList) + setOtherSaleStoreList(otherList) + } } + + //상세데이터가 1차점이면 1차점에 세팅 + //상세데이터가 2차점이면 2차점에 세팅하고 세션으로 1차점 세팅 + if (detailData.saleStoreLevel === '1') { + setSelOptions(detailData.saleStoreId) + form.setValue('saleStoreId', detailData.saleStoreId) + form.setValue('saleStoreLevel', detailData.saleStoreLevel) + } else { + setSelOptions(sessionState?.storeId) + form.setValue('saleStoreId', sessionState?.storeId) + form.setValue('saleStoreLevel', sessionState?.storeLvl) + setOtherSelOptions(detailData.saleStoreId) + form.setValue('otherSaleStoreId', detailData.saleStoreId) + form.setValue('otherSaleStoreLevel', detailData.saleStoreLevel) + } + //설계의뢰No. form.setValue('planReqNo', detailData.planReqNo) //담당자 @@ -389,21 +412,6 @@ export default function StuffDetail() { //물건명 후리가나 form.setValue('objectNameKana', detailData.objectNameKana) - console.log('상세데이타::세팅:::::', detailData) - //상세데이터에는 2차점까지 골랐으면 2차점 정보만 내려옴 - //로그인세션이 1차점이면 1차점은 본인으로 디폴트 셋팅하고 2차점에 상세데이터 넣어줌 - //1차점 - // setSelOptions(detailData.saleStoreId) - // form.setValue('saleStoreId', detailData.saleStoreId) - // form.setValue('saleStoreLevel', sessionState?.storeLvl) - - //2차점까지 고른경우 확인필요 - // console.log('2차점까지 고른경우 확인필요') - // setOtherSelOptions(sessionState?.storeId) - // form.setValue('saleStoreId', firstList[0].saleStoreId) - // form.setValue('otherSaleStoreId', sessionState?.storeId) - // form.setValue('otherSaleStoreLevel', sessionState?.storeLvl) - //우편번호 form.setValue('zipNo', detailData.zipNo) @@ -412,7 +420,11 @@ export default function StuffDetail() { form.setValue('prefId', detailData.prefId) //prefName ??? form.setValue('address', detailData.address) + //발전시뮬 + form.setValue('areaId', detailData.areaId) + //기준풍속 + form.setValue('standardWindSpeedId', detailData.standardWindSpeedId) //수직적설량 form.setValue('verticalSnowCover', detailData.verticalSnowCover) //한랭지대책시행 coldRegionFlg 1이면 true @@ -460,6 +472,10 @@ export default function StuffDetail() { } //1차점 변경 이벤트 const onSelectionChange = (key) => { + if (key.saleStoreId === selOptions) { + return + } + const planReqNo = form.watch('planReqNo') let delFlg = false @@ -486,7 +502,7 @@ export default function StuffDetail() { if (objectNo) { tempObjectNo = objectNo.substring(0, 1) } - if (tempObjectNo !== 'R') { + if (tempObjectNo === 'T') { if (planReqNo) { if (delFlg) { form.setValue('planReqNo', '') @@ -568,6 +584,10 @@ export default function StuffDetail() { //2차점 변경 이벤트 const onSelectionChange2 = (key) => { + if (key.saleStoreId === otherSelOptions) { + return + } + const planReqNo = form.watch('planReqNo') let delFlg = false if (editMode === 'NEW') { @@ -593,7 +613,7 @@ export default function StuffDetail() { if (objectNo) { tempObjectNo = objectNo.substring(0, 1) } - if (tempObjectNo !== 'R') { + if (tempObjectNo === 'T') { if (planReqNo) { if (delFlg) { form.setValue('planReqNo', '') @@ -646,7 +666,6 @@ export default function StuffDetail() { //팝업에서 넘어온 우편정보 const setZipInfo = (info) => { - // console.log('팝업에서 넘어온 우편 데이타::::::::', info) setPrefValue(info.prefId) form.setValue('prefId', info.prefId) form.setValue('prefName', info.address1) @@ -761,7 +780,7 @@ export default function StuffDetail() { setIsFormValid(Object.keys(errors).length === 0 ? true : false) } else { - console.log('상세일때 폼체크') + //상세일떄 폼체크 const formData = form.getValues() let errors = {} if (!formData.receiveUser || formData.receiveUser.trim().length === 0) { @@ -781,7 +800,7 @@ export default function StuffDetail() { errors.zipNo = true } - if (!formData.prefId) { + if (!formData.prefId || formData.prefId === '0') { errors.prefId = true } @@ -801,7 +820,7 @@ export default function StuffDetail() { errors.installHeight = true } - console.log('상세 저장용 에러결과?????::', errors) + // console.log('상세에러필드:::::', errors) setIsFormValid(Object.keys(errors).length === 0 ? true : false) } }, [ @@ -839,7 +858,7 @@ export default function StuffDetail() { } useEffect(() => { - if (prefValue !== '') { + if (prefValue) { // 발전량시뮬레이션 지역 목록 get({ url: `/api/object/prefecture/${prefValue}/list` }).then((res) => { if (!isEmptyArray(res)) { @@ -855,11 +874,66 @@ export default function StuffDetail() { form.setValue('areaName', e.prefName) } - //필수값 다 입력했을때 const onValid = async () => { const formData = form.getValues() + + let errors = {} + let fieldNm + if (!formData.receiveUser || formData.receiveUser.trim().length === 0) { + fieldNm = getMessage('stuff.detail.receiveUser') + errors = fieldNm + } + if (!formData.objectName || formData.objectName.trim().length === 0) { + fieldNm = getMessage('stuff.detail.objectStatusId') + errors = fieldNm + } + if (!formData.objectNameOmit) { + fieldNm = getMessage('stuff.detail.objectNameOmit') + errors = fieldNm + } + if (!formData.saleStoreId) { + fieldNm = getMessage('stuff.detail.saleStoreId') + errors = fieldNm + } + + if (!formData.zipNo) { + fieldNm = getMessage('stuff.detail.zipNo') + errors = fieldNm + } + + if (!formData.prefId || formData.prefId === '0') { + fieldNm = getMessage('stuff.detail.prefId') + errors = fieldNm + } + + if (!formData.areaId) { + fieldNm = getMessage('stuff.detail.areaId') + errors = fieldNm + } + + if (!formData.standardWindSpeedId) { + fieldNm = getMessage('stuff.detail.standardWindSpeedId') + errors = fieldNm + } + + if (!formData.verticalSnowCover) { + fieldNm = getMessage('stuff.detail.verticalSnowCover') + errors = fieldNm + } + + if (!formData.installHeight) { + fieldNm = getMessage('stuff.detail.installHeight') + errors = fieldNm + } + + if (Object.keys(errors).length > 0) { + return alert(getMessage('stuff.detail.save.valierror3', [errors])) + } + const apiUrl = '/api/object/save-object' + const params = { + objectNo: objectNo, planReqNo: formData.planReqNo, saleStoreId: formData.otherSaleStoreId ? formData.otherSaleStoreId : formData.saleStoreId, saleStoreName: formData.otherSaleStoreName ? formData.otherSaleStoreName : formData.saleStoreName, @@ -886,7 +960,6 @@ export default function StuffDetail() { workNo: null, workName: null, } - console.log('REAL저장::', params) //수직적설량, 설치높이 0인지 체크 let snow = params.verticalSnowCover @@ -899,20 +972,76 @@ export default function StuffDetail() { return alert(getMessage('stuff.detail.save.valierror2')) } - alert('작업중') - return + let detail_sort = Object.keys(detailData) + .sort() + .reduce((obj, key) => ((obj[key] = detailData[key]), obj), {}) + let params_sort = Object.keys(params) + .sort() + .reduce((obj, key) => ((obj[key] = params[key]), obj), {}) + + delete detail_sort.areaName + delete detail_sort.contentsPath + delete detail_sort.createDatetime + delete detail_sort.createUserName + delete detail_sort.dispCompanyName + delete detail_sort.firstAgentId + delete detail_sort.lastEditDatetime + delete detail_sort.lastEditUserName + delete detail_sort.planList + delete detail_sort.planNo + delete detail_sort.planTotCnt + delete detail_sort.receiveCompanyName + delete detail_sort.saleStoreName + delete detail_sort.rowNumber + delete detail_sort.prefName + delete detail_sort.sameObjectInfo + delete detail_sort.specificationConfirmDate + delete detail_sort.totCnt + delete detail_sort.workNo + delete detail_sort.workName + + delete params_sort.areaName + delete params_sort.contentsPath + delete params_sort.createDatetime + delete params_sort.createUserName + delete params_sort.dispCompanyName + delete params_sort.firstAgentId + delete params_sort.lastEditDatetime + delete params_sort.lastEditUserName + delete params_sort.planList + delete params_sort.planNo + delete params_sort.planTotCnt + delete params_sort.receiveCompanyName + delete params_sort.saleStoreName + delete params_sort.rowNumber + delete params_sort.prefName + delete params_sort.sameObjectInfo + delete params_sort.specificationConfirmDate + delete params_sort.totCnt + delete params_sort.workNo + delete params_sort.workName + + // console.log(JSON.stringify(detail_sort) === JSON.stringify(params_sort)) + // console.log(Object.entries(detail_sort).toString() === Object.entries(params_sort).toString()) + if (Object.entries(detail_sort).toString() === Object.entries(params_sort).toString()) { + return alert(getMessage('stuff.detail.noChgData')) + } + if (editMode === 'NEW') { await promisePost({ url: apiUrl, data: params }).then((res) => { - console.log('진짜저장결과::::', pathname, res) - //상세화면으로 전환 - //router.push(`${pathname}?objectNo=${res.data.objectNo.toString()}`) + if (res.status === 201) { + alert(getMessage('stuff.detail.save')) + router.push(`/management/stuff/detail?objectNo=${res.data.objectNo.toString()}`) + } }) } else { // 수정모드일때는 PUT await promisePut({ url: apiUrl, data: params }).then((res) => { - console.log('진짜데이터 수정 결과::::::::::', pathname, res) - //새로고침??? + if (res.status === 201) { + alert(getMessage('stuff.detail.save')) + router.refresh() + } }) } } @@ -963,12 +1092,9 @@ export default function StuffDetail() { if (height === '0') { return alert(getMessage('stuff.detail.save.valierror2')) } - - alert('작업중') - return await promisePost({ url: '/api/object/save-object', data: params }).then((res) => { if (res.status === 201) { - getMessage('stuff.detail.tempSave.message1') + alert(getMessage('stuff.detail.tempSave.message1')) router.push(`${pathname}?objectNo=${res.data.objectNo.toString()}`) } }) @@ -976,15 +1102,12 @@ export default function StuffDetail() { // 물건삭제 const onDelete = () => { - // console.log('물건번호::::::::', objectNo) - // console.log('detailData:::::::::', detailData) const specificationConfirmDate = detailData.specificationConfirmDate if (specificationConfirmDate != null) { alert(getMessage('stuff.detail.delete.message1')) } else { if (confirm(getMessage('common.message.data.delete'))) { del({ url: `/api/object/${objectNo}` }).then((res) => { - // console.log('삭제결과:::::::', res) router.push('/management/stuff') }) } @@ -1038,7 +1161,7 @@ export default function StuffDetail() { - {getMessage('stuff.detail.dispCompanyName')} * + {getMessage('stuff.detail.receiveUser')} *
@@ -1129,7 +1252,7 @@ export default function StuffDetail() { getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} isClearable={sessionState?.storeLvl === '1' ? true : false} - isDisabled={sessionState?.storeLel !== '1' ? true : false} + isDisabled={sessionState?.storeLvl !== '1' ? true : false} value={saleStoreList.filter(function (option) { return option.saleStoreId === selOptions })} @@ -1264,7 +1387,7 @@ export default function StuffDetail() { - {getMessage('stuff.detail.windSpeed')} * + {getMessage('stuff.detail.standardWindSpeedId')} *
@@ -1287,7 +1410,7 @@ export default function StuffDetail() { })} >
- {getMessage('stuff.detail.windSpeedSpan')} + {getMessage('stuff.detail.standardWindSpeedIdSpan')} @@ -1389,16 +1512,16 @@ export default function StuffDetail() {
{!isFormValid ? ( ) : ( )}
@@ -1425,6 +1548,7 @@ export default function StuffDetail() {
+ {/* {detailData?.tempFlg === '1' && form.watch('planReqNo') ? ( */} {objectNo.substring(0, 1) === 'T' && form.watch('planReqNo') ? ( ) : null}
+ {/* {detailData?.tempFlg === '1' ? ( */} {objectNo.substring(0, 1) === 'T' ? ( <> @@ -1812,7 +1937,8 @@ export default function StuffDetail() {
- {objectNo.substring(0, 1) === 'R' ? ( + {/* {detailData?.tempFlg === '0' ? ( */} + {objectNo.substring(0, 1) !== 'T' ? ( <> {/* 진짜R 플랜시작 */}
@@ -1840,7 +1966,6 @@ export default function StuffDetail() {
- {/*
페이징영역
*/}
{/* 진짜R 플랜끝 */} @@ -1862,7 +1987,7 @@ export default function StuffDetail() { <>
{!isFormValid ? ( - ) : ( diff --git a/src/components/management/StuffPlanQGrid.jsx b/src/components/management/StuffPlanQGrid.jsx index b4108342..108e17a2 100644 --- a/src/components/management/StuffPlanQGrid.jsx +++ b/src/components/management/StuffPlanQGrid.jsx @@ -45,6 +45,7 @@ export default function StuffPlanQGrid(props) { rowSelection={'singleRow'} pagination={isPageable} domLayout="autoHeight" + suppressCellFocus={true} />
) diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 8d0412c1..ec6f3fc7 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -2,10 +2,13 @@ import { useEffect } from 'react' import { useRecoilValue } from 'recoil' import { wordDisplaySelector } from '@/store/settingAtom' import { useEvent } from '@/hooks/useEvent' -import { checkLineOrientation, getDistance, setSurfaceShapePattern } from '@/util/canvas-util' +import { checkLineOrientation, getDistance } from '@/util/canvas-util' import { 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' export function useCommonUtils({ commonFunctionState, setCommonFunctionState }) { const canvas = useRecoilValue(canvasState) @@ -14,6 +17,7 @@ export function useCommonUtils({ commonFunctionState, setCommonFunctionState }) const dimensionSettings = useRecoilValue(dimensionLineSettingsState) const dimensionLineTextFont = useRecoilValue(fontSelector('dimensionLineText')) const commonTextFont = useRecoilValue(fontSelector('commonText')) + const { addPopup } = usePopup() useEffect(() => { initEvent() @@ -106,7 +110,8 @@ export function useCommonUtils({ commonFunctionState, setCommonFunctionState }) const lineOptions = { stroke: dimensionSettings.color, strokeWidth: dimensionSettings.pixel, - selectable: false, + name: 'dimensionLine', + selectable: true, } // 캔버스에 클릭 이벤트 추가 @@ -371,6 +376,19 @@ export function useCommonUtils({ commonFunctionState, setCommonFunctionState }) ...textOptions, }) canvas.add(distanceText) + const id = uuidv4() + addPopup( + id, + 1, + , + ) } // 거리 계산 후, 다음 측정을 위해 초기화 diff --git a/src/hooks/option/useCanvasSettingController.js b/src/hooks/option/useCanvasSettingController.js new file mode 100644 index 00000000..72a590eb --- /dev/null +++ b/src/hooks/option/useCanvasSettingController.js @@ -0,0 +1,126 @@ +import { settingModalFirstOptionsState, settingModalSecondOptionsState } from '@/store/settingAtom' +import { useEffect, useState } from 'react' +import { useRecoilState } from 'recoil' + +export const useCanvasSettingController = () => { + const [settingModalFirstOptions, setSettingModalFirstOptions] = useRecoilState(settingModalFirstOptionsState) + const [settingModalSecondOptions, setSettingModalSecondOptions] = useRecoilState(settingModalSecondOptionsState) + const [objectNo, setObjectNo] = useState('test123240912001') // 이후 삭제 필요 + const { get } = useAxios() + + useEffect(() => { + fetchSettings() + }, [objectNo]) + + useEffect(() => { + fetchSettings() + }, []) + + useEffect(() => { + onClickOnlyOne() + fetchSettings() + }, [settingModalFirstOptions, settingModalSecondOptions]) + + const fetchSettings = async () => { + try { + const res = await get({ url: `/api/canvas-management/canvas-settings/by-object/${objectNo}` }) + const optionData1 = settingModalFirstOptions.option1.map((item) => ({ ...item, selected: res[item.column] })) + const optionData2 = settingModalFirstOptions.option2.map((item) => ({ ...item, selected: res[item.column] })) + const optionData3 = settingModalSecondOptions.option3.map((item) => ({ ...item })) + const optionData4 = settingModalSecondOptions.option4.map((item) => ({ ...item, selected: res[item.column] })) + const optionData5 = settingModalFirstOptions.dimensionDisplay.map((item) => ({ + ...item, + })) + // 데이터 설정 + setSettingModalFirstOptions({ + option1: optionData1, + option2: optionData2, + dimensionDisplay: optionData5, + }) + setSettingModalSecondOptions({ + option3: optionData3, + option4: optionData4, + }) + } catch (error) { + console.error('Data fetching error:', error) + } + } + + const onClickOption = async (option) => { + option.selected = !option.selected + + setSettingModalFirstOptions({ option1, option2, dimensionDisplay }) + setSettingModalSecondOptions({ option3, option4 }) + + try { + // 서버에 전송할 데이터 + const dataToSend = { + firstOption1: option1.map((item) => ({ + column: item.column, + selected: item.selected, + })), + firstOption2: option2.map((item) => ({ + column: item.column, + selected: item.selected, + })), + firstOption3: dimensionDisplay.map((item) => ({ + column: item.column, + selected: item.selected, + })), + // secondOption1: secondOptions[0].option1.map((item) => ({ + // name: item.id, + // name: item.name, + // // 필요한 경우 데이터 항목 추가 + // })), + secondOption2: option4.map((item) => ({ + column: item.column, + selected: item.selected, + })), + } + + const patternData = { + objectNo, + //디스플레이 설정(다중) + allocDisplay: dataToSend.firstOption1[0].selected, + outlineDisplay: dataToSend.firstOption1[1].selected, + gridDisplay: dataToSend.firstOption1[2].selected, + lineDisplay: dataToSend.firstOption1[3].selected, + wordDisplay: dataToSend.firstOption1[4].selected, + circuitNumDisplay: dataToSend.firstOption1[5].selected, + flowDisplay: dataToSend.firstOption1[6].selected, + trestleDisplay: dataToSend.firstOption1[7].selected, + totalDisplay: dataToSend.firstOption1[8].selected, + //차수 표시(다건) + corridorDimension: dataToSend.firstOption3[0].selected, + realDimension: dataToSend.firstOption3[1].selected, + noneDimension: dataToSend.firstOption3[2].selected, + //화면 표시(다중) + onlyBorder: dataToSend.firstOption2[0].selected, + lineHatch: dataToSend.firstOption2[1].selected, + allPainted: dataToSend.firstOption2[2].selected, + //흡착범위 설정(단건) + adsorpRangeSmall: dataToSend.secondOption2[0].selected, + adsorpRangeSmallSemi: dataToSend.secondOption2[1].selected, + adsorpRangeMedium: dataToSend.secondOption2[2].selected, + adsorpRangeLarge: dataToSend.secondOption2[3].selected, + } + + // HTTP POST 요청 보내기 + await post({ url: `/api/canvas-management/canvas-settings`, data: patternData }).then((res) => { + swalFire({ text: getMessage(res.returnMessage) }) + }) + } catch (error) { + swalFire({ text: getMessage(res.returnMessage), icon: 'error' }) + } + } + + return { + fetchSettings, + settingModalFirstOptions, + setSettingModalFirstOptions, + settingModalSecondOptions, + setSettingModalSecondOptions, + onClickOption, + ß, + } +} diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 9ac4c2aa..3f355111 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -86,6 +86,12 @@ export function useRoofAllocationSetting(id) { swalFire({ text: '할당할 지붕이 없습니다.' }) closePopup(id) } + // if (type === 'roofBase') { + // // 지붕면 할당 + // + // } else if ('roof') { + // // 지붕재 변경 + // } }, []) const onAddRoofMaterial = () => { diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 4451c259..bbd5115b 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -1,18 +1,36 @@ -import { useRecoilValue } from 'recoil' +import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' import { 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' +import GridMove from '@/components/floor-plan/modal/grid/GridMove' +import GridCopy from '@/components/floor-plan/modal/grid/GridCopy' +import ColorPickerModal from '@/components/common/color-picker/ColorPickerModal' +import { gridColorState } from '@/store/gridAtom' +import { contextPopupPositionState } from '@/store/popupAtom' +import AuxiliaryCopy from '@/components/floor-plan/modal/auxiliary/AuxiliaryCopy' +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' +import FontSetting from '@/components/common/font/FontSetting' +import DimensionLineSetting from '@/components/floor-plan/modal/dimensionLine/DimensionLineSetting' +import RoofAllocationSetting from '@/components/floor-plan/modal/roofAllocation/RoofAllocationSetting' +import LinePropertySetting from '@/components/floor-plan/modal/lineProperty/LinePropertySetting' +import FlowDirectionSetting from '@/components/floor-plan/modal/flowDirection/FlowDirectionSetting' export function useContextMenu({ externalFn }) { - const currentMenu = useRecoilValue(currentMenuState) - const [contextMenu, setContextMenu] = useState([[]]) - const [currentContextMenu, setCurrentContextMenu] = useState(null) + const currentMenu = useRecoilValue(currentMenuState) // 현재 메뉴 + const setContextPopupPosition = useSetRecoilState(contextPopupPositionState) // 현재 메뉴 + const [contextMenu, setContextMenu] = useState([[]]) // 메뉴.object 별 context menu + const [currentContextMenu, setCurrentContextMenu] = useState(null) // 선택한 contextMenu const currentObject = useRecoilValue(currentObjectState) - - const currentMenuSetting = () => { - console.log(currentMenu) + const { addPopup } = usePopup() + const [popupId, setPopupId] = useState(uuidv4()) + const [gridColor, setGridColor] = useRecoilState(gridColorState) + const currentMenuSetting = (position) => { switch (currentMenu) { case MENU.PLAN_DRAWING: setContextMenu([ @@ -20,14 +38,17 @@ export function useContextMenu({ externalFn }) { { id: 'gridMove', name: '그리드 이동', + component: , }, { id: 'gridCopy', name: '그리드 복사', + component: , }, { id: 'gridColorEdit', name: '그리드 색 변경', + component: , }, { id: 'remove', @@ -84,16 +105,17 @@ export function useContextMenu({ externalFn }) { { id: 'sizeEdit', name: '사이즈 변경', - component: , + component: , }, { id: 'auxiliaryMove', name: '보조선 이동(M)', - component: , + component: , }, { id: 'auxiliaryCopy', name: '보조선 복사(C)', + component: , }, { id: 'auxiliaryRemove', @@ -160,19 +182,35 @@ export function useContextMenu({ externalFn }) { break } } - useEffect(() => { - currentMenuSetting() - }, [currentMenu]) + + const handleClick = (e, menu) => { + setContextPopupPosition({ + x: e.clientX, + y: e.clientY, + }) + setCurrentContextMenu(menu) + } useEffect(() => { + currentMenuSetting() + }, [gridColor, currentMenu]) + + useEffect(() => { + if (currentContextMenu?.component) addPopup(popupId, 1, currentContextMenu?.component) + }, [currentContextMenu]) + + useEffect(() => { + console.log('object name', currentObject?.name) if (currentObject?.name) { switch (currentObject.name) { case 'triangleDormer': + case 'pentagonDormer': setContextMenu([ [ { id: 'sizeEdit', name: '사이즈 변경', + component: , }, { id: 'dormerRemove', @@ -189,10 +227,12 @@ export function useContextMenu({ externalFn }) { { id: 'roofMaterialEdit', name: '지붕재 변경', + component: , }, { id: 'dormerOffset', name: '도머 오프셋', + component: , }, ], ]) @@ -203,6 +243,7 @@ export function useContextMenu({ externalFn }) { { id: 'sizeEdit', name: '사이즈 변경', + component: , }, { id: 'roofMaterialRemove', @@ -221,14 +262,17 @@ export function useContextMenu({ externalFn }) { { id: 'roofMaterialEdit', name: '지붕재 변경', + component: , }, { id: 'linePropertyEdit', name: '각 변 속성 변경', + component: , }, { id: 'flowDirectionEdit', name: '흐름 뱡향 변경', + component: , }, ], ]) @@ -259,6 +303,127 @@ export function useContextMenu({ externalFn }) { ], ]) break + case 'lengthText': + setContextMenu([ + [ + { + id: 'lengthTextRemove', + name: '삭제', + }, + { + id: 'lengthTextMove', + name: '이동', + }, + { + id: 'lengthTextAuxiliaryLineEdit', + name: '치수 보조선 변경', + }, + { + id: 'displayEdit', + name: '표시 변경', + }, + ], + ]) + break + case 'commonText': + setContextMenu([ + [ + { + id: 'commonTextRemove', + name: '삭제', + }, + { + id: 'commonTextMove', + name: '이동', + }, + { + id: 'commonTextCopy', + name: '복사', + }, + { + id: 'commonTextFontSetting', + name: '폰트 설정', + component: , + }, + { + id: 'commonTextEdit', + name: '편집', + }, + ], + ]) + break + case 'lineGrid': + setContextMenu([ + [ + { + id: 'gridMove', + name: '그리드 이동', + }, + { + id: 'gridCopy', + name: '그리드 복사', + }, + { + id: 'gridColorEdit', + name: '그리드 색 변경', + }, + { + id: 'remove', + name: '삭제', + }, + { + id: 'removeAll', + name: '전체 삭제', + }, + ], + ]) + break + case 'dimensionLine': + setContextMenu([ + [ + { + id: 'dimensionLineRemove', + name: '삭제', + }, + { + id: 'dimensionLineMove', + name: '이동', + }, + { + id: 'dimensionAuxiliaryLineEdit', + name: '치수 보조선 변경', + }, + { + id: 'dimensionLineDisplayEdit', + name: '표시 변경', + component: , + }, + ], + ]) + break + case 'shadow': + setContextMenu([ + [ + { + id: 'sizeEdit', + name: '사이즈 변경', + component: , + }, + { + id: 'remove', + name: '삭제(D)', + }, + { + id: 'move', + name: '이동(M)', + }, + { + id: 'copy', + name: '복사(C)', + }, + ], + ]) + break default: currentMenuSetting() } @@ -267,13 +432,10 @@ export function useContextMenu({ externalFn }) { } }, [currentObject]) - useEffect(() => { - console.log(currentContextMenu) - }, [currentContextMenu]) - return { contextMenu, currentContextMenu, setCurrentContextMenu, + handleClick, } } diff --git a/src/hooks/usePagination.js b/src/hooks/usePagination.js index 7d76d293..c0a9ea50 100644 --- a/src/hooks/usePagination.js +++ b/src/hooks/usePagination.js @@ -28,6 +28,15 @@ const usePagination = ({ pageNo = 1, pageSize = 10, pagePerBlock = 10, totalCoun return i + startPage }) + // console.log('pageRange', pageRange) + // console.log('startPage', startPage) + // console.log('endPage', endPage) + // console.log('totalPages', totalPages) + // console.log('pageGroup', pageGroup) + // console.log('pagePerBlock', pagePerBlock) + // console.log('currentPage', currentPage) + // console.log('pageNo', pageNo) + return { currentPage, changePage, pageGroup, totalPages, pages, startPage, endPage, pageRange } } diff --git a/src/hooks/usePopup.js b/src/hooks/usePopup.js index b54492b9..37730ec5 100644 --- a/src/hooks/usePopup.js +++ b/src/hooks/usePopup.js @@ -1,20 +1,14 @@ import { useRecoilState } from 'recoil' import { popupState } from '@/store/popupAtom' -import { useEffect } from 'react' export function usePopup() { const [popup, setPopup] = useRecoilState(popupState) - useEffect(() => { - console.log(popup) - }, [popup]) - const addPopup = (id, depth, component) => { setPopup({ children: [...filterDepth(depth), { id: id, depth: depth, component: component }] }) } const closePopup = (id) => { - console.log(id) setPopup({ children: [...filterChildrenPopup(id).filter((child) => child.id !== id)] }) } diff --git a/src/locales/ja.json b/src/locales/ja.json index 5a93188a..c5522fe2 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -477,10 +477,11 @@ "stuff.detail.header.createDatetime": "登録日", "stuff.detail.required": "必須入力項目", "stuff.detail.planReqNo": "設計依頼No.", - "stuff.detail.dispCompanyName": "担当者", + "stuff.detail.receiveUser": "担当者", "stuff.detail.objectStatusId": "物品区分/物件名", "stuff.detail.objectStatus0": "新築", "stuff.detail.objectStatus1": "基軸", + "stuff.detail.objectNameOmit": "敬称", "stuff.detail.objectNameKana": "商品名 ふりがな", "stuff.detail.saleStoreId": "一次販売店名/ID", "stuff.detail.otherSaleStoreId": "二次販売店名/ID", @@ -489,8 +490,8 @@ "stuff.detail.btn.addressPop.guide": "※ 郵便番号7桁を入力した後、アドレス検索ボタンをクリックしてください", "stuff.detail.prefId": "都道府県 / 住所 ", "stuff.detail.areaId": "発電量シミュレーション地域 ", - "stuff.detail.windSpeed": "基準風速", - "stuff.detail.windSpeedSpan": "m/s以下", + "stuff.detail.standardWindSpeedId": "基準風速", + "stuff.detail.standardWindSpeedIdSpan": "m/s以下", "stuff.detail.btn.windSpeedPop": "風速選択", "stuff.detail.verticalSnowCover": "垂直説説", "stuff.detail.coldRegionFlg": "寒冷地対策施行", @@ -516,8 +517,11 @@ "stuff.detail.btn.moveList": "商品リスト", "stuff.detail.btn.save": "保存", "stuff.detail.btn.tempSave": "一時保存", + "stuff.detail.save": "保存しました", + "stuff.detail.noChgData": "変更内容はありません", "stuff.detail.save.valierror1": "垂直説説は0より大きい値を入力してください", "stuff.detail.save.valierror2": "設置高さ0より大きい値を入力してください", + "stuff.detail.save.valierror3": "{0} 必須入力項目です.", "stuff.planReqPopup.popTitle": "設計依頼検索", "stuff.planReqPopup.btn1": "検索", "stuff.planReqPopup.btn2": "初期化", diff --git a/src/locales/ko.json b/src/locales/ko.json index 651e8473..529dc494 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -482,10 +482,11 @@ "stuff.detail.header.createDatetime": "등록일", "stuff.detail.required": "필수 입력항목", "stuff.detail.planReqNo": "설계의뢰No.", - "stuff.detail.dispCompanyName": "담당자", + "stuff.detail.receiveUser": "담당자", "stuff.detail.objectStatusId": "물건구분/물건명", "stuff.detail.objectStatus0": "신축", "stuff.detail.objectStatus1": "기축", + "stuff.detail.objectNameOmit": "경칭", "stuff.detail.objectNameKana": "물건명 후리가나", "stuff.detail.saleStoreId": "1차 판매점명 / ID", "stuff.detail.otherSaleStoreId": "2차 판매점명 / ID", @@ -494,8 +495,8 @@ "stuff.detail.btn.addressPop.guide": "※ 주소검색 버튼을 클릭한 후, 도도부현 정보를 선택해주십시오.", "stuff.detail.prefId": "도도부현 / 주소", "stuff.detail.areaId": "발전량시뮬레이션지역", - "stuff.detail.windSpeed": "기준풍속", - "stuff.detail.windSpeedSpan": "m/s이하", + "stuff.detail.standardWindSpeedId": "기준풍속", + "stuff.detail.standardWindSpeedIdSpan": "m/s이하", "stuff.detail.btn.windSpeedPop": "풍속선택", "stuff.detail.verticalSnowCover": "수직적설량", "stuff.detail.coldRegionFlg": "한랭지대책시행", @@ -521,8 +522,11 @@ "stuff.detail.btn.moveList": "물건목록", "stuff.detail.btn.save": "저장", "stuff.detail.btn.tempSave": "임시저장", + "stuff.detail.save": "저장되었습니다", + "stuff.detail.noChgData": "변경된 내용이 없습니다", "stuff.detail.save.valierror1": "수직적설량은 0보다 큰 값을 입력하세요", "stuff.detail.save.valierror2": "설치높이는 0보다 큰 값을 입력하세요", + "stuff.detail.save.valierror3": "{0} 필수 입력 항목입니다.", "stuff.planReqPopup.popTitle": "설계 요청 검색", "stuff.planReqPopup.btn1": "검색", "stuff.planReqPopup.btn2": "초기화", diff --git a/src/store/popupAtom.js b/src/store/popupAtom.js index 78de8660..498f4eed 100644 --- a/src/store/popupAtom.js +++ b/src/store/popupAtom.js @@ -11,3 +11,12 @@ export const popupState = atom({ }, dangerouslyAllowMutability: true, }) + +export const contextPopupPositionState = atom({ + key: 'contextPopupPositionState', + default: { + x: 50, + y: 180, + }, + dangerouslyAllowMutability: true, +}) diff --git a/src/styles/_contents.scss b/src/styles/_contents.scss index 70bd9f40..c242a96b 100644 --- a/src/styles/_contents.scss +++ b/src/styles/_contents.scss @@ -309,12 +309,12 @@ padding-top: 46.8px; transition: all .17s ease-in-out; .canvas-frame{ - height: 86.3vh; + height: calc(100vh - 129.3px); } &.active{ padding-top: calc(46.8px + 50px); .canvas-frame{ - height: 81vh; + height: calc(100vh - 179.4px); } } } @@ -1024,6 +1024,7 @@ display: flex; padding: 20px; .simulation-tit-wrap{ + flex: none; padding-right: 40px; border-right: 1px solid #EEEEEE; span{ @@ -1047,6 +1048,7 @@ } } .simulation-guide-box{ + flex: 1; padding-left: 40px; dl{ margin-bottom: 25px; @@ -1066,6 +1068,9 @@ margin-bottom: 0; } } + ul, ol{ + list-style: unset; + } } } diff --git a/src/styles/_main.scss b/src/styles/_main.scss index ea9b8833..b8783c3b 100644 --- a/src/styles/_main.scss +++ b/src/styles/_main.scss @@ -405,10 +405,15 @@ display: flex; align-items: center; border: 1px solid #E5E9EF; + border-radius: 4px; height: 45px; padding-left: 40px; padding-right: 15px; margin-bottom: 15px; + transition: border .15s ease-in-out; + &.focus{ + border-color: #A8B6C7; + } .login-input{ flex: 1; height: 100%;