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) {
-
-
-
-
+
+
+
+
-
+
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')}
- {getMessage('modal.grid.move.save')}
+
+ {getMessage('modal.grid.move.save')}
+
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"