Merge branch 'dev' into feature/test-jy
This commit is contained in:
commit
544a6e8b87
@ -1,12 +0,0 @@
|
|||||||
import Intro from '@/components/Intro'
|
|
||||||
import { initCheck } from '@/util/session-util'
|
|
||||||
|
|
||||||
export default async function IntroPage() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div className="container mx-auto p-4 m-4 border">
|
|
||||||
<Intro />
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,142 +0,0 @@
|
|||||||
'use client'
|
|
||||||
|
|
||||||
import { useEffect, useState } from 'react'
|
|
||||||
|
|
||||||
import Link from 'next/link'
|
|
||||||
|
|
||||||
import { useRecoilState } from 'recoil'
|
|
||||||
import { modalContent, modalState } from '@/store/modalAtom'
|
|
||||||
|
|
||||||
import { useAxios } from '@/hooks/useAxios'
|
|
||||||
|
|
||||||
import { Button } from '@nextui-org/react'
|
|
||||||
|
|
||||||
import SingleDatePicker from './common/datepicker/SingleDatePicker'
|
|
||||||
import RangeDatePicker from './common/datepicker/RangeDatePicker'
|
|
||||||
import QGrid from './common/grid/QGrid'
|
|
||||||
import { useSwal } from '@/hooks/useSwal'
|
|
||||||
|
|
||||||
export default function Intro() {
|
|
||||||
const { get } = useAxios()
|
|
||||||
const { swalFire } = useSwal()
|
|
||||||
|
|
||||||
// const [open, setOpen] = useState(false)
|
|
||||||
const [startDate, setStartDate] = useState(new Date())
|
|
||||||
const singleDatePickerProps = {
|
|
||||||
startDate,
|
|
||||||
setStartDate,
|
|
||||||
}
|
|
||||||
|
|
||||||
const [dateRange, setDateRange] = useState([null, null])
|
|
||||||
const [startRangeDate, endRangeDate] = dateRange
|
|
||||||
const rangeDatePickerProps = {
|
|
||||||
startRangeDate,
|
|
||||||
endRangeDate,
|
|
||||||
setDateRange,
|
|
||||||
}
|
|
||||||
|
|
||||||
// const gridProps = {
|
|
||||||
// isPageable: false,
|
|
||||||
// }
|
|
||||||
const [gridProps, setGridProps] = useState({
|
|
||||||
gridData: [],
|
|
||||||
isPageable: false,
|
|
||||||
})
|
|
||||||
|
|
||||||
const [open, setOpen] = useRecoilState(modalState)
|
|
||||||
const [contents, setContent] = useRecoilState(modalContent)
|
|
||||||
|
|
||||||
const modelProps = {
|
|
||||||
open,
|
|
||||||
setOpen,
|
|
||||||
}
|
|
||||||
|
|
||||||
const ipsum = (
|
|
||||||
<>
|
|
||||||
<p className="text-2xl">title</p>
|
|
||||||
<p>
|
|
||||||
저작자·발명가·과학기술자와 예술가의 권리는 법률로써 보호한다. 이 헌법은 1988년 2월 25일부터 시행한다. 다만, 이 헌법을 시행하기 위하여 필요한
|
|
||||||
법률의 제정·개정과 이 헌법에 의한 대통령 및 국회의원의 선거 기타 이 헌법시행에 관한 준비는 이 헌법시행 전에 할 수 있다.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
국가는 주택개발정책등을 통하여 모든 국민이 쾌적한 주거생활을 할 수 있도록 노력하여야 한다. 통신·방송의 시설기준과 신문의 기능을 보장하기
|
|
||||||
위하여 필요한 사항은 법률로 정한다.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
국회에서 의결된 법률안은 정부에 이송되어 15일 이내에 대통령이 공포한다. 선거에 관한 경비는 법률이 정하는 경우를 제외하고는 정당 또는
|
|
||||||
후보자에게 부담시킬 수 없다.
|
|
||||||
</p>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
async function fetchData() {
|
|
||||||
// const response = await fetch('https://www.ag-grid.com/example-assets/space-mission-data.json')
|
|
||||||
// const data = await response.json()
|
|
||||||
const data = await get({ url: 'https://www.ag-grid.com/example-assets/space-mission-data.json' })
|
|
||||||
setGridProps({ ...gridProps, gridData: data })
|
|
||||||
}
|
|
||||||
fetchData()
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div className="text-2xl">
|
|
||||||
<Link href={'/login'}>
|
|
||||||
<Button color="primary">로그인 페이지로 이동</Button>
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="my-2">
|
|
||||||
<div className="text-2xl">Single Date Picker</div>
|
|
||||||
<div>
|
|
||||||
<SingleDatePicker {...singleDatePickerProps} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="my-2">
|
|
||||||
<div className="text-2xl">Range Date Picker</div>
|
|
||||||
<div>
|
|
||||||
<RangeDatePicker {...rangeDatePickerProps} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="my-2">
|
|
||||||
<div className="text-2xl">QGrid</div>
|
|
||||||
<div>
|
|
||||||
<QGrid {...gridProps} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="my-2">
|
|
||||||
<div className="text-2xl">QModal</div>
|
|
||||||
<div>
|
|
||||||
{/* <Button color="primary" onClick={() => setOpen(true)}>
|
|
||||||
Open Modal
|
|
||||||
</Button>
|
|
||||||
<QModal {...modelProps}>{ipsum}</QModal> */}
|
|
||||||
<Button
|
|
||||||
color="primary"
|
|
||||||
onClick={() => {
|
|
||||||
setContent(ipsum)
|
|
||||||
setOpen(true)
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Open Modal
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="my-2">
|
|
||||||
<div className="text-2xl">QToast</div>
|
|
||||||
<div>
|
|
||||||
<Button
|
|
||||||
color="primary"
|
|
||||||
onClick={() => {
|
|
||||||
swalFire({
|
|
||||||
text: 'This is a toast message',
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Open Toast
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,9 +1,8 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useEffect, useState, useRef } from 'react'
|
import { useEffect, useState, useContext } from 'react'
|
||||||
import { useRecoilValue } from 'recoil'
|
import { useRecoilValue } from 'recoil'
|
||||||
import { floorPlanObjectState } from '@/store/floorPlanObjectAtom'
|
import { floorPlanObjectState } from '@/store/floorPlanObjectAtom'
|
||||||
import { sessionStore } from '@/store/commonAtom'
|
|
||||||
import { useMessage } from '@/hooks/useMessage'
|
import { useMessage } from '@/hooks/useMessage'
|
||||||
import { useCanvasMenu } from '@/hooks/common/useCanvasMenu'
|
import { useCanvasMenu } from '@/hooks/common/useCanvasMenu'
|
||||||
import SingleDatePicker from '../common/datepicker/SingleDatePicker'
|
import SingleDatePicker from '../common/datepicker/SingleDatePicker'
|
||||||
@ -15,15 +14,15 @@ import dayjs from 'dayjs'
|
|||||||
import { useCommonCode } from '@/hooks/common/useCommonCode'
|
import { useCommonCode } from '@/hooks/common/useCommonCode'
|
||||||
import Select from 'react-select'
|
import Select from 'react-select'
|
||||||
import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController'
|
import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController'
|
||||||
|
import { SessionContext } from '@/app/SessionProvider'
|
||||||
|
|
||||||
export default function Estimate({ params }) {
|
export default function Estimate({ params }) {
|
||||||
|
const { session } = useContext(SessionContext)
|
||||||
const [objectNo, setObjectNo] = useState('') //물건번호
|
const [objectNo, setObjectNo] = useState('') //물건번호
|
||||||
const [planNo, setPlanNo] = useState('') //플랜번호
|
const [planNo, setPlanNo] = useState('') //플랜번호
|
||||||
const [files, setFiles] = useState([]) // 보내는 첨부파일
|
|
||||||
|
|
||||||
//체크박스
|
const [files, setFiles] = useState([]) // 보내는 첨부파일
|
||||||
const [checkItems, setCheckItems] = useState(new Set())
|
const [originFiles, setOriginFiles] = useState([]) //기존 첨부파일
|
||||||
const [checkedList, setCheckedList] = useState([])
|
|
||||||
|
|
||||||
const [showContentCode, setShowContentCode] = useState('ATTR001')
|
const [showContentCode, setShowContentCode] = useState('ATTR001')
|
||||||
|
|
||||||
@ -40,7 +39,6 @@ export default function Estimate({ params }) {
|
|||||||
setStartDate,
|
setStartDate,
|
||||||
}
|
}
|
||||||
|
|
||||||
const sessionState = useRecoilValue(sessionStore)
|
|
||||||
const objectRecoil = useRecoilValue(floorPlanObjectState)
|
const objectRecoil = useRecoilValue(floorPlanObjectState)
|
||||||
|
|
||||||
//견적서 상세데이터
|
//견적서 상세데이터
|
||||||
@ -52,16 +50,14 @@ export default function Estimate({ params }) {
|
|||||||
const [specialNoteList, setSpecialNoteList] = useState([])
|
const [specialNoteList, setSpecialNoteList] = useState([])
|
||||||
|
|
||||||
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
||||||
const { get, post } = useAxios(globalLocaleState)
|
const { get, promisePost } = useAxios(globalLocaleState)
|
||||||
|
|
||||||
const { getMessage } = useMessage()
|
const { getMessage } = useMessage()
|
||||||
|
|
||||||
const { setMenuNumber } = useCanvasMenu()
|
const { setMenuNumber } = useCanvasMenu()
|
||||||
|
|
||||||
|
//새로 추가한 첨부파일 props
|
||||||
const fileUploadProps = {
|
const fileUploadProps = {
|
||||||
// objectNo: '',
|
|
||||||
// planNo: params.pid,
|
|
||||||
// category: '10',
|
|
||||||
uploadFiles: files,
|
uploadFiles: files,
|
||||||
setUploadFiles: setFiles,
|
setUploadFiles: setFiles,
|
||||||
}
|
}
|
||||||
@ -127,11 +123,42 @@ export default function Estimate({ params }) {
|
|||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 추가한 첨부파일 state에 넣기
|
||||||
|
useEffect(() => {
|
||||||
|
if (isNotEmptyArray(files)) {
|
||||||
|
files.map((row) => {
|
||||||
|
setState({ fileList: row.data })
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
setState({ fileList: [] })
|
||||||
|
}
|
||||||
|
}, [files])
|
||||||
|
|
||||||
|
//상세에서 내려온 첨부파일 set 만들기
|
||||||
|
useEffect(() => {
|
||||||
|
if (isNotEmptyArray(state.fileList)) {
|
||||||
|
setOriginFiles(state.fileList)
|
||||||
|
}
|
||||||
|
}, [state?.fileList])
|
||||||
|
|
||||||
|
// 기존첨부파일 삭제
|
||||||
|
const deleteOriginFile = async (objectNo, no) => {
|
||||||
|
const delParams = {
|
||||||
|
userId: session.userId,
|
||||||
|
objectNo: objectNo,
|
||||||
|
no: no,
|
||||||
|
}
|
||||||
|
await promisePost({ url: 'api/file/fileDelete', data: delParams }).then((res) => {
|
||||||
|
if (res.status === 204) {
|
||||||
|
setOriginFiles(originFiles.filter((file) => file.objectNo === objectNo && file.no !== no))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="sub-content estimate">
|
<div className="sub-content estimate">
|
||||||
<div className="sub-content-inner">
|
<div className="sub-content-inner">
|
||||||
{/* 물건번호, 견적서번호, 등록일, 변경일시 시작 */}
|
{/* 물건번호, 견적서번호, 등록일, 변경일시 시작 */}
|
||||||
{/* <form onSubmit={handleSubmit(onValid)}> */}
|
|
||||||
<div className="sub-content-box">
|
<div className="sub-content-box">
|
||||||
<div className="sub-table-box">
|
<div className="sub-table-box">
|
||||||
<div className="estimate-list-wrap one">
|
<div className="estimate-list-wrap one">
|
||||||
@ -206,7 +233,6 @@ export default function Estimate({ params }) {
|
|||||||
defaultValue={state?.charger}
|
defaultValue={state?.charger}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
//담당자 charger
|
//담당자 charger
|
||||||
// console.log('담당자:::::', e.target.value)
|
|
||||||
setState({ charger: e.target.value })
|
setState({ charger: e.target.value })
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@ -227,7 +253,6 @@ export default function Estimate({ params }) {
|
|||||||
defaultValue={state?.objectName}
|
defaultValue={state?.objectName}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
//안건명 objectName
|
//안건명 objectName
|
||||||
// console.log('안건명::::', e.target.value)
|
|
||||||
setState({ objectName: e.target.value })
|
setState({ objectName: e.target.value })
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@ -244,7 +269,6 @@ export default function Estimate({ params }) {
|
|||||||
if (isObjectNotEmpty(e)) {
|
if (isObjectNotEmpty(e)) {
|
||||||
setState({ objectNameOmit: e.clCodeNm })
|
setState({ objectNameOmit: e.clCodeNm })
|
||||||
} else {
|
} else {
|
||||||
// console.log('XXX')
|
|
||||||
setState({ objectNameOmit: '' })
|
setState({ objectNameOmit: '' })
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
@ -342,7 +366,6 @@ export default function Estimate({ params }) {
|
|||||||
defaultValue={state?.remarks}
|
defaultValue={state?.remarks}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
//비고
|
//비고
|
||||||
// console.log('비고:::::', e.target.value)
|
|
||||||
setState({ remarks: e.target.value })
|
setState({ remarks: e.target.value })
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@ -390,6 +413,23 @@ export default function Estimate({ params }) {
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{getMessage('estimate.detail.header.fileList2')}</th>
|
<th>{getMessage('estimate.detail.header.fileList2')}</th>
|
||||||
|
<td>
|
||||||
|
<div className="drag-file-box">
|
||||||
|
<ul className="file-list">
|
||||||
|
{isNotEmptyArray(originFiles) &&
|
||||||
|
originFiles.map((originFile) => {
|
||||||
|
return (
|
||||||
|
<li className="file-item">
|
||||||
|
<span>
|
||||||
|
{originFile.faileName}
|
||||||
|
<button className="delete" onClick={() => deleteOriginFile(originFile.objectNo, originFile.no)}></button>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@ -439,7 +479,7 @@ export default function Estimate({ params }) {
|
|||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
{/* 견적특이사항 선택한 내용?영역시작 */}
|
{/* 견적특이사항 선택한 내용 영역시작 */}
|
||||||
<div className="calculation-estimate">
|
<div className="calculation-estimate">
|
||||||
{specialNoteList.map((row) => {
|
{specialNoteList.map((row) => {
|
||||||
if (row.code === showContentCode) {
|
if (row.code === showContentCode) {
|
||||||
@ -570,7 +610,6 @@ export default function Estimate({ params }) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/* 기본정보끝 */}
|
{/* 기본정보끝 */}
|
||||||
{/* </form> */}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -9,13 +9,11 @@ import { useRecoilValue, useRecoilState, useSetRecoilState, useResetRecoilState
|
|||||||
import { stuffSearchState } from '@/store/stuffAtom'
|
import { stuffSearchState } from '@/store/stuffAtom'
|
||||||
import { queryStringFormatter, isEmptyArray } from '@/util/common-utils'
|
import { queryStringFormatter, isEmptyArray } from '@/util/common-utils'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import { isObjectNotEmpty } from '@/util/common-utils'
|
|
||||||
import { convertNumberToPriceDecimal } from '@/util/common-utils'
|
import { convertNumberToPriceDecimal } from '@/util/common-utils'
|
||||||
import { appMessageStore, globalLocaleStore } from '@/store/localeAtom'
|
import { appMessageStore, globalLocaleStore } from '@/store/localeAtom'
|
||||||
import KO from '@/locales/ko.json'
|
import KO from '@/locales/ko.json'
|
||||||
import JA from '@/locales/ja.json'
|
import JA from '@/locales/ja.json'
|
||||||
import QPagination from '../common/pagination/QPagination'
|
import QPagination from '../common/pagination/QPagination'
|
||||||
import { sessionStore } from '@/store/commonAtom'
|
|
||||||
import { SessionContext } from '@/app/SessionProvider'
|
import { SessionContext } from '@/app/SessionProvider'
|
||||||
|
|
||||||
export default function Stuff() {
|
export default function Stuff() {
|
||||||
@ -192,7 +190,9 @@ export default function Stuff() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchData()
|
if (stuffSearch.schSelSaleStoreId !== '') {
|
||||||
|
fetchData()
|
||||||
|
}
|
||||||
} else if (stuffSearchParams?.code === 'M') {
|
} else if (stuffSearchParams?.code === 'M') {
|
||||||
const params = {
|
const params = {
|
||||||
saleStoreId: session?.storeId,
|
saleStoreId: session?.storeId,
|
||||||
|
|||||||
@ -11,7 +11,6 @@ import { isEmptyArray, isNotEmptyArray, isObjectNotEmpty } from '@/util/common-u
|
|||||||
import { useMessage } from '@/hooks/useMessage'
|
import { useMessage } from '@/hooks/useMessage'
|
||||||
import { useForm } from 'react-hook-form'
|
import { useForm } from 'react-hook-form'
|
||||||
import { useRecoilValue, useSetRecoilState } from 'recoil'
|
import { useRecoilValue, useSetRecoilState } from 'recoil'
|
||||||
import { sessionStore } from '@/store/commonAtom'
|
|
||||||
import { SessionContext } from '@/app/SessionProvider'
|
import { SessionContext } from '@/app/SessionProvider'
|
||||||
import FindAddressPop from './popup/FindAddressPop'
|
import FindAddressPop from './popup/FindAddressPop'
|
||||||
import PlanRequestPop from './popup/PlanRequestPop'
|
import PlanRequestPop from './popup/PlanRequestPop'
|
||||||
@ -28,7 +27,6 @@ export default function StuffDetail() {
|
|||||||
const [selOptions, setSelOptions] = useState('') //선택한 1차점
|
const [selOptions, setSelOptions] = useState('') //선택한 1차점
|
||||||
const [otherSelOptions, setOtherSelOptions] = useState('') //선택한 1차점외
|
const [otherSelOptions, setOtherSelOptions] = useState('') //선택한 1차점외
|
||||||
|
|
||||||
const sessionState = useRecoilValue(sessionStore)
|
|
||||||
const { session } = useContext(SessionContext)
|
const { session } = useContext(SessionContext)
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@ -320,12 +318,11 @@ export default function StuffDetail() {
|
|||||||
let firstList
|
let firstList
|
||||||
let otherList
|
let otherList
|
||||||
let favList
|
let favList
|
||||||
// if (sessionState?.storeId === 'T01') {
|
|
||||||
if (session?.storeId === 'T01') {
|
if (session?.storeId === 'T01') {
|
||||||
url = `/api/object/saleStore/${session?.storeId}/firstList?userId=${session?.userId}`
|
url = `/api/object/saleStore/${session?.storeId}/firstList?userId=${session?.userId}`
|
||||||
} else {
|
} else {
|
||||||
if (session.storeLvl === '1') {
|
if (session.storeLvl === '1') {
|
||||||
url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}`
|
url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}`
|
||||||
} else {
|
} else {
|
||||||
url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}`
|
url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}`
|
||||||
}
|
}
|
||||||
@ -400,7 +397,6 @@ export default function StuffDetail() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// }, [objectNo, sessionState])
|
|
||||||
}, [objectNo, session])
|
}, [objectNo, session])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -1279,9 +1275,7 @@ export default function StuffDetail() {
|
|||||||
|
|
||||||
//1차점 or 2차점 안고르고 임시저장하면
|
//1차점 or 2차점 안고르고 임시저장하면
|
||||||
if (params.saleStoreId == '') {
|
if (params.saleStoreId == '') {
|
||||||
// params.saleStoreId = sessionState.storeId
|
|
||||||
params.saleStoreId = session.storeId
|
params.saleStoreId = session.storeId
|
||||||
// params.saleStoreLevel = sessionState.storeLvl
|
|
||||||
params.saleStoreLevel = session.storeLvl
|
params.saleStoreLevel = session.storeLvl
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1445,7 +1439,6 @@ export default function StuffDetail() {
|
|||||||
</th>
|
</th>
|
||||||
<td>
|
<td>
|
||||||
<div className="flx-box">
|
<div className="flx-box">
|
||||||
{/* {sessionState?.storeId === 'T01' && ( */}
|
|
||||||
{session?.storeId === 'T01' && (
|
{session?.storeId === 'T01' && (
|
||||||
<>
|
<>
|
||||||
<div className="select-wrap mr5" style={{ width: '567px' }}>
|
<div className="select-wrap mr5" style={{ width: '567px' }}>
|
||||||
@ -1479,7 +1472,6 @@ export default function StuffDetail() {
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl === '1' && ( */}
|
|
||||||
{session?.storeId !== 'T01' && session?.storeLvl === '1' && (
|
{session?.storeId !== 'T01' && session?.storeLvl === '1' && (
|
||||||
<>
|
<>
|
||||||
<div className="select-wrap mr5" style={{ width: '567px' }}>
|
<div className="select-wrap mr5" style={{ width: '567px' }}>
|
||||||
@ -1511,7 +1503,6 @@ export default function StuffDetail() {
|
|||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl !== '1' && ( */}
|
|
||||||
{session?.storeId !== 'T01' && session?.storeLvl !== '1' && (
|
{session?.storeId !== 'T01' && session?.storeLvl !== '1' && (
|
||||||
<>
|
<>
|
||||||
<div className="select-wrap mr5" style={{ width: '567px' }}>
|
<div className="select-wrap mr5" style={{ width: '567px' }}>
|
||||||
|
|||||||
@ -12,7 +12,6 @@ import { isEmptyArray } from '@/util/common-utils'
|
|||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import SingleDatePicker from '../common/datepicker/SingleDatePicker'
|
import SingleDatePicker from '../common/datepicker/SingleDatePicker'
|
||||||
import { sessionStore } from '@/store/commonAtom'
|
|
||||||
import { useMessage } from '@/hooks/useMessage'
|
import { useMessage } from '@/hooks/useMessage'
|
||||||
import { isObjectNotEmpty } from '@/util/common-utils'
|
import { isObjectNotEmpty } from '@/util/common-utils'
|
||||||
|
|
||||||
@ -20,7 +19,6 @@ import { SessionContext } from '@/app/SessionProvider'
|
|||||||
|
|
||||||
export default function StuffSearchCondition() {
|
export default function StuffSearchCondition() {
|
||||||
const { session } = useContext(SessionContext)
|
const { session } = useContext(SessionContext)
|
||||||
const sessionState = useRecoilValue(sessionStore)
|
|
||||||
const setAppMessageState = useSetRecoilState(appMessageStore)
|
const setAppMessageState = useSetRecoilState(appMessageStore)
|
||||||
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
||||||
const { getMessage } = useMessage()
|
const { getMessage } = useMessage()
|
||||||
@ -163,7 +161,7 @@ export default function StuffSearchCondition() {
|
|||||||
} else {
|
} else {
|
||||||
if (session.storeLvl === '1') {
|
if (session.storeLvl === '1') {
|
||||||
//T01아닌 1차점일때
|
//T01아닌 1차점일때
|
||||||
url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}`
|
url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}`
|
||||||
} else {
|
} else {
|
||||||
url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}`
|
url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}`
|
||||||
}
|
}
|
||||||
@ -323,6 +321,12 @@ export default function StuffSearchCondition() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setStartDate(stuffSearch?.schFromDt ? stuffSearch.schFromDt : dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'))
|
setStartDate(stuffSearch?.schFromDt ? stuffSearch.schFromDt : dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'))
|
||||||
setEndDate(stuffSearch?.schToDt ? stuffSearch.schToDt : dayjs(new Date()).format('YYYY-MM-DD'))
|
setEndDate(stuffSearch?.schToDt ? stuffSearch.schToDt : dayjs(new Date()).format('YYYY-MM-DD'))
|
||||||
|
setObjectNo(stuffSearch.schObjectNo ? stuffSearch.schObjectNo : objectNo)
|
||||||
|
setSaleStoreName(stuffSearch.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName)
|
||||||
|
setAddress(stuffSearch.schAddress ? stuffSearch.schAddress : address)
|
||||||
|
setobjectName(stuffSearch.schObjectName ? stuffSearch.schObjectName : objectName)
|
||||||
|
setDispCompanyName(stuffSearch.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName)
|
||||||
|
setReceiveUser(stuffSearch.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser)
|
||||||
}, [stuffSearch])
|
}, [stuffSearch])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -385,7 +389,7 @@ export default function StuffSearchCondition() {
|
|||||||
ref={objectNoRef}
|
ref={objectNoRef}
|
||||||
className="input-light"
|
className="input-light"
|
||||||
defaultValue={stuffSearch?.schObjectNo ? stuffSearch.schObjectNo : objectNo}
|
defaultValue={stuffSearch?.schObjectNo ? stuffSearch.schObjectNo : objectNo}
|
||||||
onChange={(e) => {
|
onChange={() => {
|
||||||
setObjectNo(objectNoRef.current.value)
|
setObjectNo(objectNoRef.current.value)
|
||||||
}}
|
}}
|
||||||
onKeyUp={handleByOnKeyUp}
|
onKeyUp={handleByOnKeyUp}
|
||||||
@ -400,7 +404,7 @@ export default function StuffSearchCondition() {
|
|||||||
ref={saleStoreNameRef}
|
ref={saleStoreNameRef}
|
||||||
className="input-light"
|
className="input-light"
|
||||||
defaultValue={stuffSearch?.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName}
|
defaultValue={stuffSearch?.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName}
|
||||||
onChange={(e) => {
|
onChange={() => {
|
||||||
setSaleStoreName(saleStoreNameRef.current.value)
|
setSaleStoreName(saleStoreNameRef.current.value)
|
||||||
}}
|
}}
|
||||||
onKeyUp={handleByOnKeyUp}
|
onKeyUp={handleByOnKeyUp}
|
||||||
@ -415,7 +419,7 @@ export default function StuffSearchCondition() {
|
|||||||
ref={addressRef}
|
ref={addressRef}
|
||||||
className="input-light"
|
className="input-light"
|
||||||
defaultValue={stuffSearch?.schAddress ? stuffSearch.schAddress : address}
|
defaultValue={stuffSearch?.schAddress ? stuffSearch.schAddress : address}
|
||||||
onChange={(e) => {
|
onChange={() => {
|
||||||
setAddress(addressRef.current.value)
|
setAddress(addressRef.current.value)
|
||||||
}}
|
}}
|
||||||
onKeyUp={handleByOnKeyUp}
|
onKeyUp={handleByOnKeyUp}
|
||||||
@ -430,7 +434,7 @@ export default function StuffSearchCondition() {
|
|||||||
ref={dispCompanyNameRef}
|
ref={dispCompanyNameRef}
|
||||||
className="input-light"
|
className="input-light"
|
||||||
defaultValue={stuffSearch?.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName}
|
defaultValue={stuffSearch?.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName}
|
||||||
onChange={(e) => {
|
onChange={() => {
|
||||||
setDispCompanyName(dispCompanyNameRef.current.value)
|
setDispCompanyName(dispCompanyNameRef.current.value)
|
||||||
}}
|
}}
|
||||||
onKeyUp={handleByOnKeyUp}
|
onKeyUp={handleByOnKeyUp}
|
||||||
@ -447,7 +451,7 @@ export default function StuffSearchCondition() {
|
|||||||
ref={objectNameRef}
|
ref={objectNameRef}
|
||||||
className="input-light"
|
className="input-light"
|
||||||
defaultValue={stuffSearch?.schObjectName ? stuffSearch.schObjectName : objectName}
|
defaultValue={stuffSearch?.schObjectName ? stuffSearch.schObjectName : objectName}
|
||||||
onChange={(e) => {
|
onChange={() => {
|
||||||
setobjectName(objectNameRef.current.value)
|
setobjectName(objectNameRef.current.value)
|
||||||
}}
|
}}
|
||||||
onKeyUp={handleByOnKeyUp}
|
onKeyUp={handleByOnKeyUp}
|
||||||
@ -462,7 +466,7 @@ export default function StuffSearchCondition() {
|
|||||||
className="input-light"
|
className="input-light"
|
||||||
ref={receiveUserRef}
|
ref={receiveUserRef}
|
||||||
defaultValue={stuffSearch?.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser}
|
defaultValue={stuffSearch?.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser}
|
||||||
onChange={(e) => {
|
onChange={() => {
|
||||||
setReceiveUser(receiveUserRef.current.value)
|
setReceiveUser(receiveUserRef.current.value)
|
||||||
}}
|
}}
|
||||||
onKeyUp={handleByOnKeyUp}
|
onKeyUp={handleByOnKeyUp}
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
import { useAxios } from '@/hooks/useAxios'
|
import { useAxios } from '@/hooks/useAxios'
|
||||||
import { useEffect, useReducer, useState } from 'react'
|
import { useContext, useEffect, useReducer, useState } from 'react'
|
||||||
import { useRecoilState, useRecoilValue } from 'recoil'
|
import { useRecoilState, useRecoilValue } from 'recoil'
|
||||||
import { globalLocaleStore } from '@/store/localeAtom'
|
import { globalLocaleStore } from '@/store/localeAtom'
|
||||||
import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom'
|
import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom'
|
||||||
import { isObjectNotEmpty } from '@/util/common-utils'
|
import { isObjectNotEmpty } from '@/util/common-utils'
|
||||||
|
import { SessionContext } from '@/app/SessionProvider'
|
||||||
|
|
||||||
const reducer = (prevState, nextState) => {
|
const reducer = (prevState, nextState) => {
|
||||||
return { ...prevState, ...nextState }
|
return { ...prevState, ...nextState }
|
||||||
}
|
}
|
||||||
@ -41,6 +43,7 @@ const defaultEstimateData = {
|
|||||||
unit: '',
|
unit: '',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
fileList: [],
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper functions
|
// Helper functions
|
||||||
@ -51,14 +54,14 @@ const updateItemInList = (itemList, itemId, updates) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const useEstimateController = (planNo) => {
|
export const useEstimateController = (planNo) => {
|
||||||
|
const { session } = useContext(SessionContext)
|
||||||
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
||||||
const objectRecoil = useRecoilValue(floorPlanObjectState)
|
const objectRecoil = useRecoilValue(floorPlanObjectState)
|
||||||
const [estimateData, setEstimateData] = useRecoilState(estimateState)
|
const [estimateData, setEstimateData] = useRecoilState(estimateState)
|
||||||
|
|
||||||
const { get, post } = useAxios(globalLocaleState)
|
const { get, post, promisePost } = useAxios(globalLocaleState)
|
||||||
|
|
||||||
const [isLoading, setIsLoading] = useState(false)
|
const [isLoading, setIsLoading] = useState(false)
|
||||||
const { promisePost } = useAxios()
|
|
||||||
const [state, setState] = useReducer(reducer, defaultEstimateData)
|
const [state, setState] = useReducer(reducer, defaultEstimateData)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -123,12 +126,32 @@ export const useEstimateController = (planNo) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setEstimateData({ ...state })
|
setEstimateData({ ...state, userId: session.userId })
|
||||||
|
//sapSalesStoreCd 추가예정 필수값
|
||||||
|
// setEstimateData({ ...state, userId: session.userId, sapSalesStoreCd : session.sapSalesStoreCd })
|
||||||
}, [state])
|
}, [state])
|
||||||
|
|
||||||
//견적서 저장
|
//견적서 저장
|
||||||
const handleEstimateSubmit = async () => {
|
const handleEstimateSubmit = async () => {
|
||||||
console.log('::담긴 estimateData:::', estimateData)
|
console.log('::담긴 estimateData:::', estimateData)
|
||||||
|
//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)
|
||||||
|
for (const value of formData.values()) {
|
||||||
|
console.log('formData::', value)
|
||||||
|
}
|
||||||
|
|
||||||
|
await promisePost({ url: '/api/file/fileUpload', data: formData }).then((res) => {
|
||||||
|
console.log('파일저장::::::::::', res)
|
||||||
|
})
|
||||||
|
|
||||||
|
//2. 상세데이터 저장
|
||||||
|
|
||||||
|
console.log('상세저장시작!!')
|
||||||
return
|
return
|
||||||
try {
|
try {
|
||||||
const result = await promisePost({
|
const result = await promisePost({
|
||||||
|
|||||||
@ -170,6 +170,7 @@ export function useRoofShapeSetting(id) {
|
|||||||
//기존 wallLine 삭제
|
//기존 wallLine 삭제
|
||||||
|
|
||||||
let outerLines
|
let outerLines
|
||||||
|
let direction
|
||||||
|
|
||||||
switch (shapeNum) {
|
switch (shapeNum) {
|
||||||
case 1: {
|
case 1: {
|
||||||
@ -196,6 +197,7 @@ export function useRoofShapeSetting(id) {
|
|||||||
// 서쪽
|
// 서쪽
|
||||||
initLineSetting()
|
initLineSetting()
|
||||||
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
|
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
|
||||||
|
direction = 'west'
|
||||||
|
|
||||||
outerLines.forEach((line) => {
|
outerLines.forEach((line) => {
|
||||||
setWestAndEastRoof(line)
|
setWestAndEastRoof(line)
|
||||||
@ -240,6 +242,7 @@ export function useRoofShapeSetting(id) {
|
|||||||
case 6: {
|
case 6: {
|
||||||
initLineSetting()
|
initLineSetting()
|
||||||
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
|
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
|
||||||
|
direction = 'east'
|
||||||
|
|
||||||
outerLines.forEach((line) => {
|
outerLines.forEach((line) => {
|
||||||
setWestAndEastRoof(line)
|
setWestAndEastRoof(line)
|
||||||
@ -285,6 +288,7 @@ export function useRoofShapeSetting(id) {
|
|||||||
case 7: {
|
case 7: {
|
||||||
initLineSetting()
|
initLineSetting()
|
||||||
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
|
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
|
||||||
|
direction = 'south'
|
||||||
|
|
||||||
outerLines.forEach((line) => {
|
outerLines.forEach((line) => {
|
||||||
setSouthAndNorthRoof(line)
|
setSouthAndNorthRoof(line)
|
||||||
@ -329,6 +333,7 @@ export function useRoofShapeSetting(id) {
|
|||||||
case 8: {
|
case 8: {
|
||||||
initLineSetting()
|
initLineSetting()
|
||||||
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
|
outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine')
|
||||||
|
direction = 'north'
|
||||||
|
|
||||||
outerLines.forEach((line) => {
|
outerLines.forEach((line) => {
|
||||||
setSouthAndNorthRoof(line)
|
setSouthAndNorthRoof(line)
|
||||||
@ -389,7 +394,7 @@ export function useRoofShapeSetting(id) {
|
|||||||
canvas.remove(obj)
|
canvas.remove(obj)
|
||||||
})
|
})
|
||||||
|
|
||||||
const polygon = addPolygonByLines(outerLines, { name: POLYGON_TYPE.WALL })
|
const polygon = addPolygonByLines(outerLines, { name: POLYGON_TYPE.WALL, direction })
|
||||||
polygon.lines = [...outerLines]
|
polygon.lines = [...outerLines]
|
||||||
|
|
||||||
addPitchTextsByOuterLines()
|
addPitchTextsByOuterLines()
|
||||||
|
|||||||
@ -1754,6 +1754,9 @@ export function useMode() {
|
|||||||
return { x1: point.x, y1: point.y }
|
return { x1: point.x, y1: point.y }
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
if (wall.direction) {
|
||||||
|
roof.direction = wall.direction
|
||||||
|
}
|
||||||
roof.name = POLYGON_TYPE.ROOF
|
roof.name = POLYGON_TYPE.ROOF
|
||||||
roof.setWall(wall)
|
roof.setWall(wall)
|
||||||
|
|
||||||
|
|||||||
@ -1340,6 +1340,7 @@ export const splitPolygonWithLines = (polygon) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const newRoofs = removeDuplicatePolygons(roofs)
|
const newRoofs = removeDuplicatePolygons(roofs)
|
||||||
|
|
||||||
newRoofs.forEach((roofPoint, index) => {
|
newRoofs.forEach((roofPoint, index) => {
|
||||||
let defense, pitch
|
let defense, pitch
|
||||||
const polygonLines = [...polygon.lines]
|
const polygonLines = [...polygon.lines]
|
||||||
@ -1378,7 +1379,8 @@ export const splitPolygonWithLines = (polygon) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const direction = representLine.direction
|
const direction = newRoofs.length === 1 ? polygon.direction : representLine.direction
|
||||||
|
const polygonDirection = polygon.direction
|
||||||
|
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
case 'top':
|
case 'top':
|
||||||
@ -1406,7 +1408,7 @@ export const splitPolygonWithLines = (polygon) => {
|
|||||||
originY: 'center',
|
originY: 'center',
|
||||||
selectable: true,
|
selectable: true,
|
||||||
defense: defense,
|
defense: defense,
|
||||||
direction: defense,
|
direction: newRoofs.length === 1 ? polygonDirection : defense,
|
||||||
pitch: pitch,
|
pitch: pitch,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -1,12 +0,0 @@
|
|||||||
import { checkSession } from '@/lib/user'
|
|
||||||
import { redirect } from 'next/navigation'
|
|
||||||
|
|
||||||
export const initCheck = async () => {
|
|
||||||
const { session } = await checkSession()
|
|
||||||
|
|
||||||
if (!session.isLoggedIn) {
|
|
||||||
redirect('/login')
|
|
||||||
}
|
|
||||||
|
|
||||||
return session
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user