diff --git a/src/components/common/pagination/QPagination.jsx b/src/components/common/pagination/QPagination.jsx index c6cab52d..8c6032b7 100644 --- a/src/components/common/pagination/QPagination.jsx +++ b/src/components/common/pagination/QPagination.jsx @@ -12,10 +12,12 @@ export default function QPagination(props) { return (
  1. - +
  2. {pageRange.map((page) => (
  3. - +
  4. ))}
  5. - +
) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 3810bd7b..da241db1 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -1263,7 +1263,7 @@ export default function Estimate({}) { }} getOptionLabel={(x) => x.clCodeNm} getOptionValue={(x) => x.clCode} - isClearable={false} + isClearable={true} isSearchable={false} value={honorificCodeList.filter(function (option) { return option.clCodeNm === estimateContextState.objectNameOmit diff --git a/src/components/estimate/EstimateFileUploader.jsx b/src/components/estimate/EstimateFileUploader.jsx index c02d4637..b02daef1 100644 --- a/src/components/estimate/EstimateFileUploader.jsx +++ b/src/components/estimate/EstimateFileUploader.jsx @@ -28,6 +28,8 @@ export default function EstimateFileUploader({ uploadFiles, setUploadFiles }) { 'application/pdf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // PPTX 형식 + 'application/vnd.ms-powerpoint', // PPT 형식 ] Array.from(e.target.files).forEach((file) => { //엑셀, pdf, 이미지 @@ -61,6 +63,8 @@ export default function EstimateFileUploader({ uploadFiles, setUploadFiles }) { 'application/pdf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // PPTX 형식 + 'application/vnd.ms-powerpoint', // PPT 형식 ] Array.from(e.dataTransfer.files).forEach((file) => { diff --git a/src/components/estimate/popup/EstimateCopyPop.jsx b/src/components/estimate/popup/EstimateCopyPop.jsx index 3bc25c74..564a1aae 100644 --- a/src/components/estimate/popup/EstimateCopyPop.jsx +++ b/src/components/estimate/popup/EstimateCopyPop.jsx @@ -106,7 +106,7 @@ export default function EstimateCopyPop({ planNo, setEstimateCopyPopupOpen }) { useEffect(() => { if (estimateContextState?.charger) { - setCopyReceiveUser(estimateContextState.charger) + setCopyReceiveUser(session?.userNm) } }, [estimateContextState?.charger]) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index c97907c5..66d13c88 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -159,7 +159,7 @@ export default function CanvasMenu(props) { roof.set({ selectable: true }) setSurfaceShapePattern(roof, null, false, roof.roofMaterial) delete roof.moduleCompass - drawDirectionArrow(roof) + drawDirectionArrow(roof, false) }) } @@ -193,7 +193,6 @@ export default function CanvasMenu(props) { type: 'confirm', confirmFn: () => { //해당 메뉴 이동시 배치면 삭제 - initRoofs() const moduleSurfacesArray = canvas .getObjects() @@ -204,6 +203,7 @@ export default function CanvasMenu(props) { moduleSurfacesArray.forEach((moduleSurface) => { canvas.remove(moduleSurface) }) + canvas.renderAll() onClickNav(menu) } @@ -302,6 +302,7 @@ export default function CanvasMenu(props) { const settingsModalOptions = useRecoilState(settingModalFirstOptionsState) useEffect(() => { + console.log(selectedMenu) if (selectedMenu === 'placement') { onClickPlacementInitialMenu() } diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index 981201ec..e0d32bbc 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -563,8 +563,8 @@ export default function CircuitTrestleSetting({ id }) { goodsNo: model.goodsNo, serQtyList: [ { - serQty: result[index + 1].maxValue, - paralQty: result[index + 1].count, + serQty: result[(index + 1).toString()] ? result[(index + 1).toString()].maxValue : 0, + paralQty: result[(index + 1).toString()] ? result[(index + 1).toString()].count : 0, rmdYn: 'Y', usePossYn: 'Y', roofSurfaceList: canvas diff --git a/src/components/management/StuffSubHeader.jsx b/src/components/management/StuffSubHeader.jsx index f130b729..c22f4cb8 100644 --- a/src/components/management/StuffSubHeader.jsx +++ b/src/components/management/StuffSubHeader.jsx @@ -23,7 +23,7 @@ export default function StuffSubHeader({ type }) { const setFloorPlanObjectNo = useSetRecoilState(floorPlanObjectState) - const { managementState } = useContext(GlobalDataContext) + const { managementState, setManagementState } = useContext(GlobalDataContext) const [buttonStyle, setButtonStyle] = useState('') @@ -31,17 +31,20 @@ export default function StuffSubHeader({ type }) { useEffect(() => { window.scrollTo(0, 0) + setManagementState({}) }, []) useEffect(() => { - if (isObjectNotEmpty(managementState)) { - if (managementState?.createSaleStoreId === 'T01') { - if (session?.storeId !== 'T01') { - setButtonStyle('none') + if (type === 'detail') { + if (isObjectNotEmpty(managementState)) { + if (managementState?.createSaleStoreId === 'T01') { + if (session?.storeId !== 'T01') { + setButtonStyle('none') + } } } } - }, [managementState?.createSaleStoreId]) + }, [type, managementState]) const searchParams = useSearchParams() const objectNo = searchParams.get('objectNo') //url에서 물건번호 꺼내서 바로 set diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index dbad7a88..8ecb912b 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -17,6 +17,7 @@ export function useCommonUtils() { const { addCanvasMouseEventListener, addDocumentEventListener, initEvent } = useEvent() const dimensionSettings = useRecoilValue(dimensionLineSettingsState) const dimensionLineTextFont = useRecoilValue(fontSelector('dimensionLineText')) + const lengthTextFont = useRecoilValue(fontSelector('lengthText')) const commonTextFont = useRecoilValue(fontSelector('commonText')) const [commonUtils, setCommonUtilsState] = useRecoilState(commonUtilsState) const { addPopup } = usePopup() @@ -561,6 +562,7 @@ export function useCommonUtils() { obj.clone((cloned) => { clonedObj = cloned + clonedObj.fontSize = lengthTextFont.fontSize.value }) addCanvasMouseEventListener('mouse:move', (e) => { @@ -595,6 +597,7 @@ export function useCommonUtils() { //배치면일 경우 if (obj.name === 'roof') { clonedObj.setCoords() + clonedObj.fire('modified') clonedObj.fire('polygonMoved') clonedObj.set({ direction: obj.direction, directionText: obj.directionText, roofMaterial: obj.roofMaterial }) diff --git a/src/hooks/module/useModule.js b/src/hooks/module/useModule.js index 0896fe04..c6ca9ba3 100644 --- a/src/hooks/module/useModule.js +++ b/src/hooks/module/useModule.js @@ -412,6 +412,9 @@ export function useModule() { } const moduleColumnRemove = (type) => { + if (isFixedModule()) { + return + } const activeModule = canvas.getObjects().filter((obj) => canvas.getActiveObjects()[0].id === obj.id)[0] if (activeModule.circuit) { swalFire({ @@ -535,6 +538,9 @@ export function useModule() { } const moduleRowRemove = (type) => { + if (isFixedModule()) { + return + } const activeModule = canvas.getObjects().filter((obj) => canvas.getActiveObjects()[0].id === obj.id)[0] const rowModules = getRowModules(activeModule) const otherModules = getOtherModules(rowModules) @@ -651,6 +657,9 @@ export function useModule() { } const moduleColumnInsert = (type) => { + if (isFixedModule()) { + return + } const activeModule = canvas.getObjects().filter((obj) => canvas.getActiveObjects()[0].id === obj.id)[0] const columnModules = getColumnModules(activeModule) let otherModules = getOtherModules(columnModules) @@ -750,7 +759,25 @@ export function useModule() { setModuleStatisticsData() } + const isFixedModule = () => { + const completeSurfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE && obj.isComplete) + + if (completeSurfaces.length > 0) { + swalFire({ + title: getMessage('modal.module.can.not.edit'), + type: 'alert', + icon: 'error', + }) + return true + } + + return false + } + const muduleRowInsert = (type) => { + if (isFixedModule()) { + return + } const activeModule = canvas.getObjects().filter((obj) => canvas.getActiveObjects()[0].id === obj.id)[0] const rowModules = getRowModules(activeModule) let otherModules = getOtherModules(rowModules) diff --git a/src/hooks/module/useOrientation.js b/src/hooks/module/useOrientation.js index 9e57c687..649d8f79 100644 --- a/src/hooks/module/useOrientation.js +++ b/src/hooks/module/useOrientation.js @@ -27,6 +27,13 @@ export function useOrientation() { setCompasDeg(0) } const roofs = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) + const hasModules = canvas.getObjects().some((obj) => obj.name === 'module') + if (!hasModules) { + roofs.forEach((roof) => { + delete roof.directionText + }) + } + roofs.forEach((roof) => { roof.set({ moduleCompass: isNaN(compasDeg) ? 0 : compasDeg, diff --git a/src/hooks/module/useTrestle.js b/src/hooks/module/useTrestle.js index 73fca74e..b122a19e 100644 --- a/src/hooks/module/useTrestle.js +++ b/src/hooks/module/useTrestle.js @@ -9,6 +9,7 @@ import { basicSettingState, trestleDisplaySelector } from '@/store/settingAtom' import { useSwal } from '@/hooks/useSwal' import { useContext } from 'react' import { QcastContext } from '@/app/QcastProvider' +import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle' // 모듈간 같은 행, 열의 마진이 10 이하인 경우는 같은 행, 열로 간주 const MODULE_MARGIN = 10 @@ -22,6 +23,9 @@ export const useTrestle = () => { const isTrestleDisplay = useRecoilValue(trestleDisplaySelector) const { swalFire } = useSwal() const { setIsGlobalLoading } = useContext(QcastContext) + + const { getSelectedPcsItemList } = useCircuitTrestle() + const apply = () => { const notAllocationModules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE && !obj.circuit) if (notAllocationModules.length > 0) { @@ -723,11 +727,7 @@ export const useTrestle = () => { // circuitItemList 중복제거 circuitItemList = circuitItemList.filter((item, index) => circuitItemList.indexOf(item) === index) - circuitItemList = circuitItemList.map((circuitId) => { - return { - itemId: circuitId, - } - }) + circuitItemList = getSelectedPcsItemList() return { itemList, northArrangement, roofSurfaceList, circuitItemList } } diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 9d0a850a..671d4c7e 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -239,7 +239,7 @@ export function useRoofAllocationSetting(id) { */ const onAddRoofMaterial = () => { if (currentRoofList.length >= 4) { - swalFire({ type: 'alert', icon: 'error', text: getMessage('지붕재는 4개까지 선택 가능합니다.') }) + swalFire({ type: 'alert', icon: 'error', text: getMessage('roof.exceed.count') }) return } setCurrentRoofList([ diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index 3e706b84..04507c17 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -172,8 +172,9 @@ export const usePolygon = () => { /** * poolygon의 방향에 따라 화살표를 추가한다. * @param polygon + * @param showDirectionText */ - const drawDirectionArrow = (polygon) => { + const drawDirectionArrow = (polygon, showDirectionText = true) => { if (polygon.points.length < 3) { return } @@ -319,17 +320,16 @@ export const usePolygon = () => { pitch: polygon.roofMaterial?.pitch ?? 4, parentId: polygon.id, }) - arrow.setViewLengthText(false) polygon.arrow = arrow polygon.canvas.add(arrow) polygon.canvas.renderAll() - drawDirectionStringToArrow2(polygon) + drawDirectionStringToArrow2(polygon, showDirectionText) // drawDirectionStringToArrow() } //arrow의 compass 값으로 방향 글자 설정 필요 - const drawDirectionStringToArrow2 = (polygon) => { + const drawDirectionStringToArrow2 = (polygon, showDirectionText) => { 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}`, { @@ -510,24 +510,27 @@ export const usePolygon = () => { text = text + (sameDirectionCnt.length + 1) polygon.set('directionText', text) - 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, - pitch: arrow.pitch, - 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, - }) + const textObj = new fabric.Text( + `${showDirectionText && 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, + pitch: arrow.pitch, + 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) } @@ -755,10 +758,7 @@ export const usePolygon = () => { // innerLine이 세팅이 안되어있는경우 찾아서 세팅한다. if (!innerLines || innerLines.length === 0) { - let innerLineTypes = [] - Object.keys(LINE_TYPE.SUBLINE).forEach((key, value) => { - innerLineTypes.push(LINE_TYPE.SUBLINE[key]) - }) + let innerLineTypes = Object.keys(LINE_TYPE.SUBLINE).map((key, value) => LINE_TYPE.SUBLINE[key]) polygon.innerLines = canvas .getObjects() .filter( @@ -1102,6 +1102,8 @@ export const usePolygon = () => { } }) + // blue로 생성된 것들은 대표라인이 될 수 없음. + representLines = representLines.filter((line) => line.stroke !== 'blue') // representLines중 가장 긴 line을 찾는다. representLines.forEach((line) => { if (!representLine) { diff --git a/src/locales/ja.json b/src/locales/ja.json index ecaab098..76f16b36 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -1028,5 +1028,6 @@ "not.allocation.exist.module": "回路を割り当てていないモジュールがあります。", "roof.is.not.selected": "屋根の選択をお願いします。", "length.direction.is.required": "長さと方向を入力します。", - "canvas.infomation.text": "数字は [半角] 入力のみ可能です。" + "canvas.infomation.text": "数字は [半角] 入力のみ可能です。", + "roof.exceed.count": "屋根材は4つまで選択可能です。" } diff --git a/src/locales/ko.json b/src/locales/ko.json index eb853d83..0a1119d0 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1028,5 +1028,6 @@ "not.allocation.exist.module": "회로를 할당하지 않은 모듈이 있습니다.", "roof.is.not.selected": "지붕을 선택해주세요.", "length.direction.is.required": "길이와 방향을 입력하세요.", - "canvas.infomation.text": "숫자는 [반각] 입력만 가능합니다." + "canvas.infomation.text": "숫자는 [반각] 입력만 가능합니다.", + "roof.exceed.count": "지붕재는 4개까지 선택 가능합니다." }