diff --git a/package.json b/package.json index c92c5d80..1f272ce1 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "dependencies": { "@nextui-org/react": "^2.4.2", "ag-grid-react": "^32.0.2", - "axios": "^1.7.3", + "axios": "^1.7.8", "chart.js": "^4.4.6", "fabric": "^5.3.0", "framer-motion": "^11.2.13", @@ -20,7 +20,7 @@ "js-cookie": "^3.0.5", "mathjs": "^13.0.2", "mssql": "^11.0.1", - "next": "14.2.3", + "next": "14.2.14", "next-international": "^1.2.4", "react": "^18", "react-chartjs-2": "^5.2.0", @@ -32,20 +32,19 @@ "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", - "uuid": "^10.0.0" + "uuid": "^10.0.0", + "dayjs": "^1.11.13", + "react-select": "^5.8.1" }, "devDependencies": { "@turf/turf": "^7.0.0", "convertapi": "^1.14.0", - "dayjs": "^1.11.13", "postcss": "^8", "prettier": "^3.3.3", "react-color-palette": "^7.2.2", - "react-select": "^5.8.1", "sass": "^1.77.8", "tailwindcss": "^3.4.1" } diff --git a/src/app/floor-plan/FloorPlanProvider.js b/src/app/floor-plan/FloorPlanProvider.js index 59a05edb..ba2a8226 100644 --- a/src/app/floor-plan/FloorPlanProvider.js +++ b/src/app/floor-plan/FloorPlanProvider.js @@ -4,7 +4,7 @@ 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 { createContext, useReducer, useState } from 'react' import { useSetRecoilState } from 'recoil' const reducer = (prevState, nextState) => { @@ -40,7 +40,7 @@ const FloorPlanProvider = ({ children }) => { const pid = searchParams.get('pid') if (pathname === '/floor-plan') { - if (pid === undefined || pid === '' || objectNo === undefined || objectNo === '') { + if (pid === undefined || pid === '' || pid === null || objectNo === undefined || objectNo === '' || objectNo === null) { notFound() } setCurrentObjectNo(objectNo) @@ -57,10 +57,6 @@ const FloorPlanProvider = ({ children }) => { pid, }) - useEffect(() => { - console.log('๐Ÿš€ ~ FloorPlanProvider ~ floorPlanState:', floorPlanState) - }, [floorPlanState]) - const [estimateContextState, setEstimateContextState] = useReducer(reducer, defaultEstimateData) return ( diff --git a/src/app/floor-plan/layout.js b/src/app/floor-plan/layout.js index 4bb1e355..532a83d6 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} - {/**/} + ) } diff --git a/src/components/common/spinner/GlobalSpinner.jsx b/src/components/common/spinner/GlobalSpinner.jsx index c643cc30..1da91ef9 100644 --- a/src/components/common/spinner/GlobalSpinner.jsx +++ b/src/components/common/spinner/GlobalSpinner.jsx @@ -1,7 +1,13 @@ 'use client' -import { HashLoader } from 'react-spinners' +import '@/styles/spinner.scss' export default function GlobalSpinner() { - return + return ( + <> +
+ +
+ + ) } diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index aad02cc1..dcaef5f5 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -197,8 +197,10 @@ export default function Estimate({ params }) { // ์ถ”๊ฐ€ํ•œ ์ฒจ๋ถ€ํŒŒ์ผ estimateContextState์— ๋„ฃ๊ธฐ useEffect(() => { if (isNotEmptyArray(files)) { + let fileList = [] files.map((row) => { - setEstimateContextState({ fileList: row.data }) + fileList.push(row.data) + setEstimateContextState({ fileList: row.data, tempFileList: fileList }) }) } else { setEstimateContextState({ fileList: [] }) @@ -212,8 +214,6 @@ export default function Estimate({ params }) { setFiles([]) setOriginFiles(estimateContextState.fileList) } - - // setFiles([]) }, [estimateContextState?.fileList]) // ๊ธฐ์กด์ฒจ๋ถ€ํŒŒ์ผ ์‚ญ์ œ @@ -229,6 +229,8 @@ export default function Estimate({ params }) { setEstimateContextState({ fileList: originFiles.filter((file) => file.objectNo === objectNo && file.no !== no), }) + + alert(getMessage('plan.message.delete')) } }) } @@ -549,7 +551,11 @@ export default function Estimate({ params }) { if (item?.addFlg) { return { ...item, ...updates, saleTotPrice: '' } } else { - return { ...item, ...updates, salePrice: '', saleTotPrice: '' } + if (estimateContextState.estimateType === 'YJSS') { + return { ...item, ...updates, salePrice: '', saleTotPrice: '' } + } else { + return { ...item, ...updates } + } } } else if (item.paDispOrder === dispOrder) { //๋ด„์ œํ’ˆ์„ ๋ฐ”๊ฟจ์„๋–„ @@ -558,6 +564,7 @@ export default function Estimate({ params }) { return item } }) + //paDispOrder if (bomList) { bomList.map((bomItem, index) => { @@ -1459,7 +1466,9 @@ export default function Estimate({ params }) { { + if (e.target.files.length <= 0) { + return + } + + const { files } = e.target + const file = files[0] + const fileType = file.type + if (!fileType.includes('image')) { + return alert(getMessage('estimate.detail.fileList.extCheck')) + } + // const formData = new FormData() // formData.append('file', e.target.files[0]) // formData.append('objectNo', objectNo) // ๋ฐ›์•„์™€์•ผ ํ•˜๋Š” ๊ฐ’ @@ -65,7 +76,7 @@ export default function EstimateFileUploader({ uploadFiles, setUploadFiles }) { - onChangeFiles(e)} /> + onChangeFiles(e)} />
Number(point.toFixed(1))) diff --git a/src/components/floor-plan/modal/grid/GridCopy.jsx b/src/components/floor-plan/modal/grid/GridCopy.jsx index 0f2bfc22..86f79df7 100644 --- a/src/components/floor-plan/modal/grid/GridCopy.jsx +++ b/src/components/floor-plan/modal/grid/GridCopy.jsx @@ -3,13 +3,23 @@ import { useMessage } from '@/hooks/useMessage' import { usePopup } from '@/hooks/usePopup' import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' +import { useState } from 'react' +import { currentObjectState } from '@/store/canvasAtom' +import { useGrid } from '@/hooks/common/useGrid' export default function GridCopy(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) const { id, pos = contextPopupPosition } = props const { getMessage } = useMessage() const { closePopup } = usePopup() - + const [length, setLength] = useState('0') + const [arrow, setArrow] = useState(null) + const currentObject = useRecoilValue(currentObjectState) + const { copy } = useGrid() + const handleApply = () => { + // copy(currentObject, ) + copy(currentObject, ['โ†‘', 'โ†'].includes(arrow) ? Number(length) * -1 : Number(length)) + } return (
@@ -26,20 +36,46 @@ export default function GridCopy(props) {
{getMessage('modal.grid.copy.length')}
- + setLength(e.target.value)} />
mm
- - - - + + + +
- +
diff --git a/src/components/floor-plan/modal/grid/GridMove.jsx b/src/components/floor-plan/modal/grid/GridMove.jsx index 7b39c3f6..f853f135 100644 --- a/src/components/floor-plan/modal/grid/GridMove.jsx +++ b/src/components/floor-plan/modal/grid/GridMove.jsx @@ -1,21 +1,83 @@ import WithDraggable from '@/components/common/draggable/WithDraggable' import { useMessage } from '@/hooks/useMessage' import { usePopup } from '@/hooks/usePopup' -import { useRecoilValue } from 'recoil' +import { useRecoilState, useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' +import { useCanvas } from '@/hooks/useCanvas' +import { canvasState, currentObjectState } from '@/store/canvasAtom' +import { useEffect, useState } from 'react' +import { useGrid } from '@/hooks/common/useGrid' +import { useSwal } from '@/hooks/useSwal' +import { set } from 'react-hook-form' export default function GridMove(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) const { id, pos = contextPopupPosition } = props + const canvas = useRecoilValue(canvasState) const { getMessage } = useMessage() const { closePopup } = usePopup() + const { swalFire } = useSwal() + const { move } = useGrid() + const [currentObject, setCurrentObject] = useRecoilState(currentObjectState) + const [isAll, setIsAll] = useState(false) + const [verticalSize, setVerticalSize] = useState('0') + const [horizonSize, setHorizonSize] = useState('0') + const [arrow1, setArrow1] = useState(null) + const [arrow2, setArrow2] = useState(null) + useEffect(() => { + if (currentObject?.direction === 'vertical') { + setArrow1(null) + setVerticalSize('0') + } else { + setArrow2(null) + setHorizonSize('0') + } + }, [currentObject]) + + const handleApply = () => { + if (currentObject?.direction === 'vertical') { + if (!horizonSize || !arrow2) { + swalFire({ title: '๊ธธ์ด์™€ ๋ฐฉํ–ฅ์„ ์ž…๋ ฅํ•˜์„ธ์š”.', type: 'alert' }) + return + } + } else { + if (!verticalSize || !arrow1) { + swalFire({ title: '๊ธธ์ด์™€ ๋ฐฉํ–ฅ์„ ์ž…๋ ฅํ•˜์„ธ์š”.', type: 'alert' }) + } + } + + if (isAll) { + canvas + .getObjects() + .filter((obj) => ['lineGrid', 'tempGrid', 'dotGrid'].includes(obj.name)) + .forEach((grid) => { + move( + grid, + 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), + ) + } + canvas.renderAll() + handleClose() + } + + const handleClose = () => { + closePopup(id) + } return (

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

-
@@ -23,7 +85,7 @@ export default function GridMove(props) {
{getMessage('modal.grid.move.info')}
- + setIsAll(!isAll)} />
@@ -31,29 +93,67 @@ export default function GridMove(props) {

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

- + setVerticalSize(e.target.value)} + readOnly={!isAll && currentObject?.direction === 'vertical'} + />
mm
- - + +
- + setHorizonSize(e.target.value)} + readOnly={!isAll && currentObject?.direction === 'horizontal'} + />
mm
- - + +
- +
diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 080a7cb6..231ce94c 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -1215,6 +1215,7 @@ export default function StuffDetail() { tempFlg: '0', workNo: null, workName: null, + userId: session.userId, } //์ˆ˜์ง์ ์„ค๋Ÿ‰, ์„ค์น˜๋†’์ด 0์ธ์ง€ ์ฒดํฌ @@ -1334,6 +1335,7 @@ export default function StuffDetail() { workNo: null, workName: null, objectNo: objectNo ? objectNo : '', + userId: session.userId, } //1์ฐจ์  or 2์ฐจ์  ์•ˆ๊ณ ๋ฅด๊ณ  ์ž„์‹œ์ €์žฅํ•˜๋ฉด diff --git a/src/hooks/common/useGrid.js b/src/hooks/common/useGrid.js index 0c6159dd..5565ef54 100644 --- a/src/hooks/common/useGrid.js +++ b/src/hooks/common/useGrid.js @@ -3,7 +3,7 @@ import { canvasState, dotLineGridSettingState } from '@/store/canvasAtom' import { useEffect } from 'react' import { gridColorState } from '@/store/gridAtom' import { gridDisplaySelector } from '@/store/settingAtom' - +const GRID_PADDING = 5 export function useGrid() { const canvas = useRecoilValue(canvasState) @@ -108,6 +108,7 @@ export function useGrid() { name: 'lineGrid', strokeDashArray: [5, 2], opacity: 0.3, + padding: GRID_PADDING, direction: 'horizontal', visible: isGridDisplay, }, @@ -130,6 +131,7 @@ export function useGrid() { name: 'lineGrid', strokeDashArray: [5, 2], opacity: 0.3, + padding: GRID_PADDING, direction: 'vertical', visible: isGridDisplay, }, @@ -141,5 +143,46 @@ export function useGrid() { canvas.renderAll() }, [dotLineGridSetting]) - return {} + const move = (object, x, y) => { + object.set({ + ...object, + x1: object.direction === 'vertical' ? object.x1 + x : 0, + x2: object.direction === 'vertical' ? object.x1 + x : canvas.width, + y1: object.direction === 'vertical' ? 0 : object.y1 + y, + y2: object.direction === 'vertical' ? canvas.height : object.y1 + y, + }) + } + + const copy = (object, length) => { + const lineStartX = object.direction === 'vertical' ? object.x1 + length : 0 + const lineEndX = object.direction === 'vertical' ? object.x2 + length : canvas.width + const lineStartY = object.direction === 'vertical' ? 0 : object.y1 + length + const lineEndY = object.direction === 'vertical' ? canvas.width : object.y1 + length + + const line = new fabric.Line([lineStartX, lineStartY, lineEndX, lineEndY], { + stroke: gridColor, + strokeWidth: 1, + selectable: true, + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + strokeDashArray: [5, 2], + opacity: 0.3, + padding: GRID_PADDING, + direction: object.direction, + visible: isGridDisplay, + name: object.name, + }) + + canvas.add(line) + canvas.setActiveObject(line) + canvas.renderAll() + } + + return { + move, + copy, + } } diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index ddfa2e68..c797f5fc 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -3,7 +3,7 @@ import { useContext, useEffect, useReducer, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { globalLocaleStore } from '@/store/localeAtom' import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom' -import { isObjectNotEmpty } from '@/util/common-utils' +import { isObjectNotEmpty, isNotEmptyArray } from '@/util/common-utils' import { SessionContext } from '@/app/SessionProvider' import { useMessage } from '@/hooks/useMessage' import { useRouter } from 'next/navigation' @@ -202,17 +202,23 @@ export const useEstimateController = (planNo) => { if (flag && fileFlg && itemFlg) { //1. ์ฒจ๋ถ€ํŒŒ์ผ ์ €์žฅ์‹œ์ž‘ const formData = new FormData() - formData.append('file', estimateData.fileList) - formData.append('objectNo', estimateData.objectNo) - formData.append('planNo', estimateData.planNo) - formData.append('category', '10') - formData.append('userId', estimateData.userId) + if (isNotEmptyArray(estimateData.tempFileList) > 1) { + estimateData.tempFileList.forEach((file) => { + formData.append('files', file) + }) + formData.append('objectNo', estimateData.objectNo) + formData.append('planNo', estimateData.planNo) + formData.append('category', '10') + formData.append('userId', estimateData.userId) + + await post({ url: '/api/file/fileUpload', data: formData }) + } - await post({ url: '/api/file/fileUpload', data: formData }) //์ฒจ๋ถ€ํŒŒ์ผ์ €์žฅ๋ //์ œํ’ˆ๋ผ์ธ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ์•„์ดํ…œ ์•ˆ๊ณ ๋ฅด๊ณ  ์ €์žฅํ•˜๋ฉดitemId=''์€ ๋‚ ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ์ €์žฅํ•˜๊ธฐ - estimateData.itemList = estimateData.itemList.filter((item) => item.itemId !== '') + // estimateData.itemList = estimateData.itemList.filter((item) => item.itemId !== '') + estimateData.itemList = estimateData.itemList.filter((item) => item.delFlg === '0' || !item.addFlg) let delCnt = 0 estimateData.itemList.map((item) => { @@ -224,7 +230,6 @@ export const useEstimateController = (planNo) => { return alert(getMessage('estimate.detail.save.requiredItem')) } - // console.log('์ตœ์ข… ์•„์ดํ…œ ์ •๋ณด::;', estimateData.itemList) let option = [] estimateData.itemList.forEach((item) => { if (item.specialNoteCd) { @@ -233,8 +238,8 @@ export const useEstimateController = (planNo) => { } }) - // console.log('์•„์ดํ…œ๋ฆฌ์ŠคํŠธ::', estimateData.itemList) - // console.log('์ตœ์ข… ์ •๋ณด::;', estimateData) + console.log('์•„์ดํ…œ๋ฆฌ์ŠคํŠธ::', estimateData.itemList) + console.log('์ตœ์ข… ์ •๋ณด::;', estimateData) //2. ์ƒ์„ธ๋ฐ์ดํ„ฐ ์ €์žฅ // return try { diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index f7f79f23..cbf326e8 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -521,11 +521,23 @@ export function useContextMenu() { { id: 'remove', name: getMessage('contextmenu.remove'), + fn: () => { + canvas.remove(currentObject) + canvas.discardActiveObject() + }, }, { id: 'removeAll', name: getMessage('contextmenu.remove.all'), - fn: () => {}, + fn: () => { + canvas + .getObjects() + .filter((obj) => ['tempGrid', 'lineGrid', 'dotGrid'].includes(obj.name)) + .forEach((grid) => { + canvas.remove(grid) + }) + canvas.discardActiveObject() + }, }, ], ]) diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index 7ed3fa6e..6b1336a5 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -143,8 +143,8 @@ export function usePlan() { const checkUnsavedCanvasPlan = async (userId) => { swalFire({ text: - (!initCanvasPlans.some((initCanvasPlans) => initCanvasPlans.id === plan.id) ? 'New ' : '') + - `Plan ${plan.ordering}์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?`, + (!initCanvasPlans.some((initCanvasPlans) => initCanvasPlans.id === currentCanvasPlan.id) ? 'New ' : '') + + `Plan ${currentCanvasPlan.ordering}์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?`, type: 'confirm', confirmFn: async () => { initCanvasPlans.some((plan) => plan.id === currentCanvasPlan.id) @@ -374,7 +374,7 @@ export function usePlan() { if (res.length > 0) { setInitCanvasPlans(res) setPlans(res) - updateCurrentPlan(Number(pid)) + updateCurrentPlan(res[pid - 1].id) setPlanNum(res.length) } else { addPlan(userId, objectNo, '') diff --git a/src/hooks/useTempGrid.js b/src/hooks/useTempGrid.js index 30847a2f..7bfcf263 100644 --- a/src/hooks/useTempGrid.js +++ b/src/hooks/useTempGrid.js @@ -3,6 +3,7 @@ import { useRecoilState, useRecoilValue } from 'recoil' import { gridColorState } from '@/store/gridAtom' import { gridDisplaySelector } from '@/store/settingAtom' +const GRID_PADDING = 5 export function useTempGrid() { const canvas = useRecoilValue(canvasState) const gridColor = useRecoilValue(gridColorState) @@ -23,6 +24,7 @@ export function useTempGrid() { lockScalingY: true, strokeDashArray: [5, 2], opacity: 0.3, + padding: GRID_PADDING, direction: 'vertical', visible: isGridDisplay, name: 'tempGrid', @@ -50,6 +52,7 @@ export function useTempGrid() { lockScalingY: true, strokeDashArray: [5, 2], opacity: 0.3, + padding: GRID_PADDING, name: 'tempGrid', visible: isGridDisplay, direction: 'horizontal', diff --git a/src/lib/fileAction.js b/src/lib/fileAction.js index 1cea19be..d09473a8 100644 --- a/src/lib/fileAction.js +++ b/src/lib/fileAction.js @@ -12,7 +12,6 @@ const IMAGE_FILE_PATH = 'public/plan-bg-images' * @returns */ const convertDwgToPng = async (fileName, data) => { - console.log('fileName', fileName) try { await fs.readdir(CAD_FILE_PATH) } catch { diff --git a/src/locales/ja.json b/src/locales/ja.json index 2f8be755..23903120 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -833,6 +833,7 @@ "estimate.detail.fileFlg": "ๅพŒๆ—ฅ่ณ‡ๆ–™ๆๅ‡บ", "estimate.detail.header.fileList1": "ใƒ•ใ‚กใ‚คใƒซๆทปไป˜", "estimate.detail.fileList.btn": "ใƒ•ใ‚กใ‚คใƒซ้ธๆŠž", + "estimate.detail.fileList.extCheck": "ใใฎใƒ•ใ‚กใ‚คใƒซใฏใ‚คใƒกใƒผใ‚ธใƒ•ใ‚กใ‚คใƒซใงใฏใ‚ใ‚Šใพใ›ใ‚“", "estimate.detail.header.fileList2": "ๆทปไป˜ใƒ•ใ‚กใ‚คใƒซไธ€่ฆง", "estimate.detail.header.specialEstimate": "่ฆ‹็ฉใ‚‚ใ‚Šใฎๅ…ทไฝ“็š„ใช", "estimate.detail.header.specialEstimateProductInfo": "่ฃฝๅ“ๆƒ…ๅ ฑ", diff --git a/src/locales/ko.json b/src/locales/ko.json index 62c354a1..0cf7217b 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -843,6 +843,7 @@ "estimate.detail.fileFlg": "ํ›„์ผ์ž๋ฃŒ์ œ์ถœ", "estimate.detail.header.fileList1": "ํŒŒ์ผ์ฒจ๋ถ€", "estimate.detail.fileList.btn": "ํŒŒ์ผ์„ ํƒ", + "estimate.detail.fileList.extCheck": "ํ•ด๋‹น ํŒŒ์ผ์€ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค", "estimate.detail.header.fileList2": "์ฒจ๋ถ€ํŒŒ์ผ ๋ชฉ๋ก", "estimate.detail.header.specialEstimate": "๊ฒฌ์ ํŠน์ด์‚ฌํ•ญ", "estimate.detail.header.specialEstimateProductInfo": "์ œํ’ˆ์ •๋ณด", diff --git a/src/styles/spinner.scss b/src/styles/spinner.scss new file mode 100644 index 00000000..18993c78 --- /dev/null +++ b/src/styles/spinner.scss @@ -0,0 +1,109 @@ +.spinner-wrap { + width: 100%; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background-color: #fff; + .loader { + font-size: 10px; + width: 1.2em; + height: 1.2em; + border-radius: 50%; + position: relative; + text-indent: -9999em; + animation: mulShdSpin 1.1s infinite ease; + transform: translateZ(0); + } + @keyframes mulShdSpin { + 0%, + 100% { + box-shadow: + 0em -2.6em 0em 0em #101010, + 1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2), + 2.5em 0em 0 0em rgba(16, 16, 16, 0.2), + 1.75em 1.75em 0 0em rgba(16, 16, 16, 0.2), + 0em 2.5em 0 0em rgba(16, 16, 16, 0.2), + -1.8em 1.8em 0 0em rgba(16, 16, 16, 0.2), + -2.6em 0em 0 0em rgba(16, 16, 16, 0.5), + -1.8em -1.8em 0 0em rgba(16, 16, 16, 0.7); + } + 12.5% { + box-shadow: + 0em -2.6em 0em 0em rgba(16, 16, 16, 0.7), + 1.8em -1.8em 0 0em #101010, + 2.5em 0em 0 0em rgba(16, 16, 16, 0.2), + 1.75em 1.75em 0 0em rgba(16, 16, 16, 0.2), + 0em 2.5em 0 0em rgba(16, 16, 16, 0.2), + -1.8em 1.8em 0 0em rgba(16, 16, 16, 0.2), + -2.6em 0em 0 0em rgba(16, 16, 16, 0.2), + -1.8em -1.8em 0 0em rgba(16, 16, 16, 0.5); + } + 25% { + box-shadow: + 0em -2.6em 0em 0em rgba(16, 16, 16, 0.5), + 1.8em -1.8em 0 0em rgba(16, 16, 16, 0.7), + 2.5em 0em 0 0em #101010, + 1.75em 1.75em 0 0em rgba(16, 16, 16, 0.2), + 0em 2.5em 0 0em rgba(16, 16, 16, 0.2), + -1.8em 1.8em 0 0em rgba(16, 16, 16, 0.2), + -2.6em 0em 0 0em rgba(16, 16, 16, 0.2), + -1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2); + } + 37.5% { + box-shadow: + 0em -2.6em 0em 0em rgba(16, 16, 16, 0.2), + 1.8em -1.8em 0 0em rgba(16, 16, 16, 0.5), + 2.5em 0em 0 0em rgba(16, 16, 16, 0.7), + 1.75em 1.75em 0 0em #101010, + 0em 2.5em 0 0em rgba(16, 16, 16, 0.2), + -1.8em 1.8em 0 0em rgba(16, 16, 16, 0.2), + -2.6em 0em 0 0em rgba(16, 16, 16, 0.2), + -1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2); + } + 50% { + box-shadow: + 0em -2.6em 0em 0em rgba(16, 16, 16, 0.2), + 1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2), + 2.5em 0em 0 0em rgba(16, 16, 16, 0.5), + 1.75em 1.75em 0 0em rgba(16, 16, 16, 0.7), + 0em 2.5em 0 0em #101010, + -1.8em 1.8em 0 0em rgba(16, 16, 16, 0.2), + -2.6em 0em 0 0em rgba(16, 16, 16, 0.2), + -1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2); + } + 62.5% { + box-shadow: + 0em -2.6em 0em 0em rgba(16, 16, 16, 0.2), + 1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2), + 2.5em 0em 0 0em rgba(16, 16, 16, 0.2), + 1.75em 1.75em 0 0em rgba(16, 16, 16, 0.5), + 0em 2.5em 0 0em rgba(16, 16, 16, 0.7), + -1.8em 1.8em 0 0em #101010, + -2.6em 0em 0 0em rgba(16, 16, 16, 0.2), + -1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2); + } + 75% { + box-shadow: + 0em -2.6em 0em 0em rgba(16, 16, 16, 0.2), + 1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2), + 2.5em 0em 0 0em rgba(16, 16, 16, 0.2), + 1.75em 1.75em 0 0em rgba(16, 16, 16, 0.2), + 0em 2.5em 0 0em rgba(16, 16, 16, 0.5), + -1.8em 1.8em 0 0em rgba(16, 16, 16, 0.7), + -2.6em 0em 0 0em #101010, + -1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2); + } + 87.5% { + box-shadow: + 0em -2.6em 0em 0em rgba(16, 16, 16, 0.2), + 1.8em -1.8em 0 0em rgba(16, 16, 16, 0.2), + 2.5em 0em 0 0em rgba(16, 16, 16, 0.2), + 1.75em 1.75em 0 0em rgba(16, 16, 16, 0.2), + 0em 2.5em 0 0em rgba(16, 16, 16, 0.2), + -1.8em 1.8em 0 0em rgba(16, 16, 16, 0.5), + -2.6em 0em 0 0em rgba(16, 16, 16, 0.7), + -1.8em -1.8em 0 0em #101010; + } + } +} diff --git a/yarn.lock b/yarn.lock index 785c8ccb..1a4d340d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -547,55 +547,55 @@ 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" - integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== +"@next/env@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/env/-/env-14.2.14.tgz" + integrity sha512-/0hWQfiaD5//LvGNgc8PjvyqV50vGK0cADYzaoOOGN8fxzBn3iAiaq3S0tCRnFBldq0LVveLcxCTi41ZoYgAgg== -"@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" - integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== +"@next/swc-darwin-arm64@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.14.tgz" + integrity sha512-bsxbSAUodM1cjYeA4o6y7sp9wslvwjSkWw57t8DtC8Zig8aG8V6r+Yc05/9mDzLKcybb6EN85k1rJDnMKBd9Gw== -"@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" - integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== +"@next/swc-darwin-x64@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.14.tgz" + integrity sha512-cC9/I+0+SK5L1k9J8CInahduTVWGMXhQoXFeNvF0uNs3Bt1Ub0Azb8JzTU9vNCr0hnaMqiWu/Z0S1hfKc3+dww== -"@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" - integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== +"@next/swc-linux-arm64-gnu@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.14.tgz" + integrity sha512-RMLOdA2NU4O7w1PQ3Z9ft3PxD6Htl4uB2TJpocm+4jcllHySPkFaUIFacQ3Jekcg6w+LBaFvjSPthZHiPmiAUg== -"@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" - integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== +"@next/swc-linux-arm64-musl@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.14.tgz" + integrity sha512-WgLOA4hT9EIP7jhlkPnvz49iSOMdZgDJVvbpb8WWzJv5wBD07M2wdJXLkDYIpZmCFfo/wPqFsFR4JS4V9KkQ2A== -"@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" - integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== +"@next/swc-linux-x64-gnu@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.14.tgz" + integrity sha512-lbn7svjUps1kmCettV/R9oAvEW+eUI0lo0LJNFOXoQM5NGNxloAyFRNByYeZKL3+1bF5YE0h0irIJfzXBq9Y6w== -"@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" - integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== +"@next/swc-linux-x64-musl@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.14.tgz" + integrity sha512-7TcQCvLQ/hKfQRgjxMN4TZ2BRB0P7HwrGAYL+p+m3u3XcKTraUFerVbV3jkNZNwDeQDa8zdxkKkw2els/S5onQ== -"@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" - integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== +"@next/swc-win32-arm64-msvc@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.14.tgz" + integrity sha512-8i0Ou5XjTLEje0oj0JiI0Xo9L/93ghFtAUYZ24jARSeTMXLUx8yFIdhS55mTExq5Tj4/dC2fJuaT4e3ySvXU1A== -"@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" - integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== +"@next/swc-win32-ia32-msvc@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.14.tgz" + integrity sha512-2u2XcSaDEOj+96eXpyjHjtVPLhkAFw2nlaz83EPeuK4obF+HmtDJHqgR1dZB7Gb6V/d55FL26/lYVd0TwMgcOQ== -"@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" - integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== +"@next/swc-win32-x64-msvc@14.2.14": + version "14.2.14" + resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.14.tgz" + integrity sha512-MZom+OvZ1NZxuRovKt1ApevjiUJTcU2PmdJKL66xUPaJeRywnbGGRWUlaAOwunD6dX+pm83vj979NTC8QXjGWg== "@nextui-org/accordion@2.0.38": version "2.0.38" @@ -2544,7 +2544,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.5": version "0.5.5" resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== @@ -2552,6 +2552,13 @@ "@swc/counter" "^0.1.3" tslib "^2.4.0" +"@swc/helpers@^0.5.0": + version "0.5.13" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz" + integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== + dependencies: + tslib "^2.4.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" @@ -4205,19 +4212,10 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@^1.6.2: - version "1.7.7" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz" - 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== +axios@^1.6.2, axios@^1.7.8: + version "1.7.8" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz" + integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -5543,12 +5541,12 @@ next-international@^1.2.4: international-types "^0.8.1" server-only "^0.0.1" -next@14.2.3: - version "14.2.3" - resolved "https://registry.npmjs.org/next/-/next-14.2.3.tgz" - integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== +next@14.2.14: + version "14.2.14" + resolved "https://registry.npmjs.org/next/-/next-14.2.14.tgz" + integrity sha512-Q1coZG17MW0Ly5x76shJ4dkC23woLAhhnDnw+DfTc7EpZSGuWrlsZ3bZaO8t6u1Yu8FVfhkqJE+U8GC7E0GLPQ== dependencies: - "@next/env" "14.2.3" + "@next/env" "14.2.14" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -5556,15 +5554,15 @@ next@14.2.3: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.3" - "@next/swc-darwin-x64" "14.2.3" - "@next/swc-linux-arm64-gnu" "14.2.3" - "@next/swc-linux-arm64-musl" "14.2.3" - "@next/swc-linux-x64-gnu" "14.2.3" - "@next/swc-linux-x64-musl" "14.2.3" - "@next/swc-win32-arm64-msvc" "14.2.3" - "@next/swc-win32-ia32-msvc" "14.2.3" - "@next/swc-win32-x64-msvc" "14.2.3" + "@next/swc-darwin-arm64" "14.2.14" + "@next/swc-darwin-x64" "14.2.14" + "@next/swc-linux-arm64-gnu" "14.2.14" + "@next/swc-linux-arm64-musl" "14.2.14" + "@next/swc-linux-x64-gnu" "14.2.14" + "@next/swc-linux-x64-musl" "14.2.14" + "@next/swc-win32-arm64-msvc" "14.2.14" + "@next/swc-win32-ia32-msvc" "14.2.14" + "@next/swc-win32-x64-msvc" "14.2.14" node-fetch@^2.6.7: version "2.7.0" @@ -5954,11 +5952,6 @@ 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" @@ -6148,16 +6141,11 @@ 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"