Merge branch 'dev' into dev-yj

# Conflicts:
#	src/locales/ja.json
#	src/locales/ko.json
This commit is contained in:
yjnoh 2024-10-11 15:05:40 +09:00
commit 2a90a138c1
32 changed files with 4328 additions and 2592 deletions

View File

@ -0,0 +1,10 @@
<svg width="12" height="9" viewBox="0 0 12 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="icon" clip-path="url(#clip0_4212_2156)">
<path id="Vector" d="M1.125 0C0.503906 0 0 0.503906 0 1.125C0 1.47891 0.166406 1.81172 0.45 2.025L5.55 5.85C5.81719 6.04922 6.18281 6.04922 6.45 5.85L11.55 2.025C11.8336 1.81172 12 1.47891 12 1.125C12 0.503906 11.4961 0 10.875 0H1.125ZM0 2.625V7.5C0 8.32734 0.672656 9 1.5 9H10.5C11.3273 9 12 8.32734 12 7.5V2.625L6.9 6.45C6.36562 6.85078 5.63438 6.85078 5.1 6.45L0 2.625Z" fill="#A8B6C7"/>
</g>
<defs>
<clipPath id="clip0_4212_2156">
<rect width="12" height="9" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 647 B

View File

@ -0,0 +1,11 @@
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4220_3331)">
<path d="M17.8789 17.9736L19.8789 19.9736" stroke="#364864" stroke-width="1.5" stroke-linecap="round"/>
<path d="M9.98926 18.4036C14.6837 18.4036 18.4893 14.5986 18.4893 9.90494C18.4893 5.21124 14.6837 1.40625 9.98926 1.40625C5.29484 1.40625 1.48926 5.21124 1.48926 9.90494C1.48926 14.5986 5.29484 18.4036 9.98926 18.4036Z" stroke="#364864" stroke-width="1.5"/>
</g>
<defs>
<clipPath id="clip0_4220_3331">
<rect width="21" height="21" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 611 B

View File

@ -0,0 +1,4 @@
<svg width="22" height="23" viewBox="0 0 22 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.9598 10.4707C21.0134 11.3009 21.0134 12.1606 20.9598 12.9908C20.6856 17.2332 17.3536 20.6124 13.1706 20.8905C11.7435 20.9853 10.2536 20.9851 8.8294 20.8905C8.33896 20.8579 7.8044 20.7408 7.34401 20.5512C6.83177 20.3402 6.5756 20.2347 6.44544 20.2507C6.31527 20.2668 6.1264 20.406 5.74868 20.6846C5.08268 21.1757 4.24367 21.5284 2.99943 21.4981C2.37026 21.4828 2.05568 21.4751 1.91484 21.235C1.77401 20.9949 1.94941 20.6625 2.30021 19.9978C2.78674 19.0758 3.09501 18.0202 2.62791 17.1745C1.82343 15.9665 1.1401 14.5359 1.04024 12.9908C0.986587 12.1606 0.986587 11.3009 1.04024 10.4707C1.31441 6.22831 4.64639 2.84907 8.8294 2.57101C10.0318 2.49108 10.2812 2.4785 11.5 2.53362" stroke="#45576F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M20.9996 5C20.9996 6.933 19.4326 8.5 17.4996 8.5C15.5666 8.5 13.9996 6.933 13.9996 5C13.9996 3.067 15.5666 1.5 17.4996 1.5C19.4326 1.5 20.9996 3.067 20.9996 5Z" stroke="#45576F" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -75,7 +75,7 @@ export default async function RootLayout({ children }) {
<QcastProvider>{children}</QcastProvider> <QcastProvider>{children}</QcastProvider>
)} )}
<ToastContainer /> <ToastContainer />
<QModal /> {/* <QModal /> */}
</body> </body>
</html> </html>
</RecoilRootWrapper> </RecoilRootWrapper>

View File

@ -1,9 +1,169 @@
'use client' 'use client'
import React, { useEffect, useState } from 'react'
import { useRouter } from 'next/navigation'
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
import { modalContent, modalState, modalProps } from '@/store/modalAtom'
import { sessionStore } from '@/store/commonAtom'
import { useAxios } from '@/hooks/useAxios'
import { globalLocaleStore } from '@/store/localeAtom'
import MainContents from './main/MainContents'
import { useMessage } from '@/hooks/useMessage'
import { stuffSearchState } from '@/store/stuffAtom'
import { useForm } from 'react-hook-form'
import '@/styles/contents.scss'
import ChangePasswordPop from './main/ChangePasswordPop'
export default function MainPage() {
const [sessionState, setSessionState] = useRecoilState(sessionStore)
const globalLocaleState = useRecoilValue(globalLocaleStore)
const { get } = useAxios(globalLocaleState)
const router = useRouter()
const { getMessage } = useMessage()
const [searchTxt, setSearchTxt] = useState('')
const [searchRadioType, setSearchRadioType] = useState('object')
//
const [saleStoreId, setSaleStoreId] = useState('')
const [saleStoreName, setSaleStoreName] = useState('')
const [objectList, setObjectList] = useState([])
const [businessCharger, setBusinessCharger] = useState('')
const [businessChargerMail, setBusinessChargerMail] = useState('')
const [businessChargerTel, setBusinessChargerTel] = useState('')
const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState)
useEffect(() => {
if (sessionState.pwdInitYn === 'Y') {
fetchObjectList()
}
}, [sessionState])
const fetchObjectList = async () => {
try {
// const apiUrl = `/api/main-page/object/X167/list`
const apiUrl = `/api/main-page/object/${sessionState?.storeId}/list`
const res = await get({ url: apiUrl })
if (res) {
setSaleStoreId(res.saleStoreId)
setSaleStoreName(res.saleStoreName)
setObjectList(res.objectList)
setBusinessCharger(res.businessCharger)
setBusinessChargerMail(res.businessChargerMail)
setBusinessChargerTel(res.businessChargerTel)
}
} catch (error) {
console.error('MAIN API fetching error:', error)
}
}
//
const handleByOnKeyUp = (e) => {
if (e.key === 'Enter') {
//
if (searchRadioType === 'object') {
setStuffSearch({
...stuffSearch,
schObjectNo: searchTxt,
code: 'M',
})
router.push('/management/stuff')
} else {
alert('작업중')
return
//FAQ
//faq
//searchValue= e.target.value
//mainFlag:'Y'
// router.push('/community/faq')
}
}
}
//
const handleOnChangeRadio = (e) => {
setSearchRadioType(e.target.value)
}
//
const handleOnSubmit = () => {
if (searchRadioType === 'object') {
setStuffSearch({
...stuffSearch,
schObjectNo: searchTxt,
code: 'M',
})
router.push('/management/stuff')
} else {
alert('작업중')
return
//FAQ
//faq
//searchValue= e.target.value
//mainFlag:'Y'
// router.push('/community/faq')
}
}
export default function MainPage(props) {
return ( return (
<> <>
<h1>Main page</h1> {(sessionState?.pwdInitYn !== 'N' && (
<>
<div className="background-bord"></div>
<div className="main-contents">
<div className="store-id-wrap">
<div className="store-id-box">
<div className="store-id-title">
{getMessage('main.storeId')}/ {getMessage('main.storeName')}
</div>
</div>
<span className="store-arr"></span>
<div className="store-id-name">
{saleStoreId} / {saleStoreName}
</div>
</div>
<div className="main-search-wrap">
<div className="search-raido-wrap">
<div className="d-check-radio">
<input type="radio" name="radio01" id="object" value="object" defaultChecked onChange={handleOnChangeRadio} />
<label htmlFor="object">{getMessage('main.objectNo')}</label>
</div>
<div className="d-check-radio">
<input type="radio" name="radio01" id="faq" value="faq" onChange={handleOnChangeRadio} />
<label htmlFor="faq">{getMessage('main.faq')}</label>
</div>
</div>
<div className="search-input-box">
<input
type="text"
className="main-search"
placeholder=""
onKeyUp={handleByOnKeyUp}
onChange={(e) => {
setSearchTxt(e.target.value)
}}
/>
<button className="search-icon" onClick={handleOnSubmit}></button>
</div>
</div>
<MainContents
objectList={objectList}
businessCharger={businessCharger}
businessChargerMail={businessChargerMail}
businessChargerTel={businessChargerTel}
/>
</div>
</>
)) || (
<>
<ChangePasswordPop />
</>
)}
</> </>
) )
} }

View File

@ -1,5 +1,6 @@
'use client' 'use client'
import { Children, useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import '@/styles/contents.scss'
export default function QContextMenu(props) { export default function QContextMenu(props) {
const { contextRef, canvasProps } = props const { contextRef, canvasProps } = props
@ -7,7 +8,7 @@ export default function QContextMenu(props) {
// const children = useRecoilValue(modalContent) // const children = useRecoilValue(modalContent)
const [contextMenu, setContextMenu] = useState({ visible: false, x: 0, y: 0 }) const [contextMenu, setContextMenu] = useState({ visible: false, x: 0, y: 0 })
const activeObject = canvasProps.getActiveObject() // const activeObject = canvasProps?.getActiveObject() //
let contextType = '' let contextType = ''
@ -26,7 +27,8 @@ export default function QContextMenu(props) {
const handleContextMenu = (e) => { const handleContextMenu = (e) => {
e.preventDefault() // contextmenu e.preventDefault() // contextmenu
setContextMenu({ visible: true, x: e.pageX, y: e.pageY }) setContextMenu({ visible: true, x: e.pageX, y: e.pageY })
canvasProps.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) // console.log(111, canvasProps)
canvasProps?.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) //
} }
const handleClick = (e) => { const handleClick = (e) => {
@ -41,7 +43,7 @@ export default function QContextMenu(props) {
} }
} }
canvasProps.upperCanvasEl.addEventListener('contextmenu', handleContextMenu) canvasProps?.upperCanvasEl.addEventListener('contextmenu', handleContextMenu)
document.addEventListener('click', handleClick) document.addEventListener('click', handleClick)
document.addEventListener('click', handleOutsideClick) document.addEventListener('click', handleOutsideClick)
@ -57,7 +59,7 @@ export default function QContextMenu(props) {
lockMovementY: false, // Y lockMovementY: false, // Y
}) })
canvasProps.on('object:modified', function (e) { canvasProps?.on('object:modified', function (e) {
activeObject.set({ activeObject.set({
lockMovementX: true, // X lockMovementX: true, // X
lockMovementY: true, // Y lockMovementY: true, // Y
@ -89,19 +91,19 @@ export default function QContextMenu(props) {
return ( return (
<> <>
{contextMenu.visible && ( {contextMenu.visible && (
<div style={{ position: 'absolute', top: contextMenu.y, left: contextMenu.x, zIndex: 2000 }}> <div className="context-menu-wrap" style={{ position: 'fixed', top: contextMenu.y, left: contextMenu.x, zIndex: 2000 }}>
<ul style={{ listStyle: 'none', margin: 0, padding: '5px' }}> {/*<ul>*/}
<li style={{ padding: '8px 12px', cursor: 'pointer' }} onClick={() => handleObjectMove()}> {/*<li style={{ padding: '8px 12px', cursor: 'pointer' }} onClick={() => handleObjectMove()}>*/}
이동 {/* 이동*/}
</li> {/*</li>*/}
<li style={{ padding: '8px 12px', cursor: 'pointer' }} onClick={() => handleObjectDelete()}> {/*<li style={{ padding: '8px 12px', cursor: 'pointer' }} onClick={() => handleObjectDelete()}>*/}
삭제 {/* 삭제*/}
</li> {/*</li>*/}
<li style={{ padding: '8px 12px', cursor: 'pointer' }} onClick={() => handleObjectCopy()}> {/*<li style={{ padding: '8px 12px', cursor: 'pointer' }} onClick={() => handleObjectCopy()}>*/}
복사 {/* 복사*/}
</li> {/*</li>*/}
{props.children} {/*</ul>*/}
</ul> {props.children}
</div> </div>
)} )}
</> </>

View File

@ -1,13 +1,19 @@
'use client' 'use client'
import { useEffect, useRef } from 'react' import { useEffect, useRef, useState } from 'react'
import { useCanvas } from '@/hooks/useCanvas' import { useCanvas } from '@/hooks/useCanvas'
import { useEvent } from '@/hooks/useEvent' import { useEvent } from '@/hooks/useEvent'
import QContextMenu from '@/components/common/context-menu/QContextMenu'
import { useRecoilValue } from 'recoil'
import { currentMenuState } from '@/store/canvasAtom'
import { MENU } from '@/common/common'
export default function CanvasFrame({ plan }) { export default function CanvasFrame({ plan }) {
const canvasRef = useRef(null) const canvasRef = useRef(null)
const { canvas } = useCanvas('canvas') const { canvas } = useCanvas('canvas')
const currentMenu = useRecoilValue(currentMenuState)
const [contextMenu, setContextMenu] = useState([[]])
useEvent() useEvent()
const loadCanvas = () => { const loadCanvas = () => {
@ -25,9 +31,142 @@ export default function CanvasFrame({ plan }) {
loadCanvas() loadCanvas()
}, [plan]) }, [plan])
useEffect(() => {
switch (currentMenu) {
case MENU.PLAN_DRAWING:
setContextMenu([
[
{
name: '그리드 이동',
},
{
name: '그리드 복사',
},
{
name: '그리드 색 변경',
},
{
name: '삭제',
},
{
name: '전체 삭제',
},
],
])
break
case MENU.ROOF_COVERING.EXTERIOR_WALL_LINE:
case MENU.ROOF_COVERING.ROOF_SHAPE_SETTINGS:
case MENU.ROOF_COVERING.ROOF_SHAPE_PASSIVITY_SETTINGS:
case MENU.ROOF_COVERING.ROOF_SHAPE_EDITING:
case MENU.ROOF_COVERING.HELP_LINE_DRAWING:
case MENU.ROOF_COVERING.EAVES_KERAVA_EDIT:
case MENU.ROOF_COVERING.MOVEMENT_SHAPE_UPDOWN:
case MENU.ROOF_COVERING.OUTLINE_EDIT_OFFSET:
case MENU.ROOF_COVERING.ROOF_SHAPE_ALLOC:
case MENU.ROOF_COVERING.DEFAULT:
console.log('지붕덮개')
setContextMenu([
[
{
name: '지붕재 배치',
},
{
name: '지붕재 삭제',
},
{
name: '지붕재 전체 삭제',
},
{
name: '선택・이동',
},
{
name: '외벽선 삭제',
},
],
[
{
name: '사이즈 변경',
},
{
name: '보조선 이동(M)',
},
{
name: '보조선 복사(C)',
},
{
name: '보조선 삭제(D)',
},
{
name: '보조선 수직이등분선',
},
{
name: '보조선 절삭',
},
{
name: '보조선 전체 삭제',
},
],
])
break
case MENU.BATCH_CANVAS.SLOPE_SETTING:
case MENU.BATCH_CANVAS.BATCH_DRAWING:
case MENU.BATCH_CANVAS.SURFACE_SHAPE_BATCH:
case MENU.BATCH_CANVAS.OBJECT_BATCH:
case MENU.BATCH_CANVAS.ALL_REMOVE:
case MENU.BATCH_CANVAS.DEFAULT:
console.log('배치면')
setContextMenu([
[
{
name: '사이즈 변경',
},
{
name: '삭제(D)',
},
{
name: '이동(M)',
},
{
name: '복사(C)',
},
],
[
{
name: '지붕재 변경',
},
{
name: '각 변 속성 변경',
},
{
name: '흐름 방향 변경',
},
],
])
break
default:
console.log('default')
setContextMenu([])
break
}
}, [currentMenu])
useEffect(() => {
console.log('currentMenu', currentMenu)
console.log('contextMenu', contextMenu)
}, [contextMenu])
return ( return (
<div className="canvas-frame flex justify-center"> <div className="canvas-frame flex justify-center">
<canvas ref={canvasRef} id={'canvas'}></canvas> <canvas ref={canvasRef} id={'canvas'}></canvas>
<QContextMenu contextRef={canvasRef} canvasProps={canvas}>
{contextMenu.map((menus, index) => (
<ul key={index}>
{menus.map((menu) => (
<li>{menu.name}</li>
))}
</ul>
))}
</QContextMenu>
</div> </div>
) )
} }

View File

@ -44,7 +44,9 @@ export default function CanvasMenu(props) {
setShowRoofShapePassivitySettingModal, setShowRoofShapePassivitySettingModal,
setShowAuxiliaryModal, setShowAuxiliaryModal,
setShowEavesGableEditModal, setShowEavesGableEditModal,
setShowMovementModal,
setShowWallLineOffsetSettingModal, setShowWallLineOffsetSettingModal,
setShowRoofAllocationSettingModal,
} = props } = props
const [menuNumber, setMenuNumber] = useState(null) const [menuNumber, setMenuNumber] = useState(null)
@ -93,10 +95,12 @@ export default function CanvasMenu(props) {
setShowRoofShapePassivitySettingModal, setShowRoofShapePassivitySettingModal,
setShowAuxiliaryModal, setShowAuxiliaryModal,
setShowEavesGableEditModal, setShowEavesGableEditModal,
setShowMovementModal,
setShowSlopeSettingModal, setShowSlopeSettingModal,
setShowPlacementSurfaceSettingModal, setShowPlacementSurfaceSettingModal,
setShowPlaceShapeDrawingModal, setShowPlaceShapeDrawingModal,
setShowWallLineOffsetSettingModal, setShowWallLineOffsetSettingModal,
setShowRoofAllocationSettingModal,
setShowObjectSettingModal, setShowObjectSettingModal,
type, type,
} }
@ -125,6 +129,7 @@ export default function CanvasMenu(props) {
setShowOutlineModal(false) setShowOutlineModal(false)
setShowCanvasSettingModal(false) setShowCanvasSettingModal(false)
setShowEavesGableEditModal(false) setShowEavesGableEditModal(false)
setShowMovementModal(false)
setShowPlaceShapeModal(true) setShowPlaceShapeModal(true)
} }

View File

@ -23,6 +23,9 @@ import EavesGableEdit from '@/components/floor-plan/modal/eavesGable/EavesGableE
import WallLineOffsetSetting from '@/components/floor-plan/modal/wallLineOffset/WallLineOffsetSetting' import WallLineOffsetSetting from '@/components/floor-plan/modal/wallLineOffset/WallLineOffsetSetting'
import ObjectSetting from '@/components/floor-plan/modal/object/ObjectSetting' import ObjectSetting from '@/components/floor-plan/modal/object/ObjectSetting'
import PlacementSurfaceSetting from '@/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting' import PlacementSurfaceSetting from '@/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting'
import RoofShapePassivitySetting from '@/components/floor-plan/modal/roofShape/RoofShapePassivitySetting'
import MovementSetting from '@/components/floor-plan/modal/movement/MovementSetting'
import RoofAllocationSetting from '@/components/floor-plan/modal/roofAllocation/RoofAllocationSetting'
export default function FloorPlan() { export default function FloorPlan() {
const [showCanvasSettingModal, setShowCanvasSettingModal] = useState(false) const [showCanvasSettingModal, setShowCanvasSettingModal] = useState(false)
@ -37,7 +40,9 @@ export default function FloorPlan() {
const [showPlaceShapeDrawingModal, setShowPlaceShapeDrawingModal] = useState(false) const [showPlaceShapeDrawingModal, setShowPlaceShapeDrawingModal] = useState(false)
const [showObjectSettingModal, setShowObjectSettingModal] = useState(false) const [showObjectSettingModal, setShowObjectSettingModal] = useState(false)
const [showEavesGableEditModal, setShowEavesGableEditModal] = useState(false) const [showEavesGableEditModal, setShowEavesGableEditModal] = useState(false)
const [showMovementModal, setShowMovementModal] = useState(false)
const [showWallLineOffsetSettingModal, setShowWallLineOffsetSettingModal] = useState(false) const [showWallLineOffsetSettingModal, setShowWallLineOffsetSettingModal] = useState(false)
const [showRoofAllocationSettingModal, setShowRoofAllocationSettingModal] = useState(false)
const globalLocaleState = useRecoilValue(globalLocaleStore) const globalLocaleState = useRecoilValue(globalLocaleStore)
const { get } = useAxios(globalLocaleState) const { get } = useAxios(globalLocaleState)
@ -73,7 +78,9 @@ export default function FloorPlan() {
setShowRoofShapePassivitySettingModal, setShowRoofShapePassivitySettingModal,
setShowAuxiliaryModal, setShowAuxiliaryModal,
setShowEavesGableEditModal, setShowEavesGableEditModal,
setShowMovementModal,
setShowWallLineOffsetSettingModal, setShowWallLineOffsetSettingModal,
setShowRoofAllocationSettingModal,
} }
useEffect(() => { useEffect(() => {
@ -132,13 +139,18 @@ export default function FloorPlan() {
{showDotLineGridModal && <DotLineGrid {...dotLineProps} />} {showDotLineGridModal && <DotLineGrid {...dotLineProps} />}
{showColorPickerModal && <GridColorSetting {...gridColorProps} />} {showColorPickerModal && <GridColorSetting {...gridColorProps} />}
{showPropertiesSettingModal && <PropertiesSetting {...propertiesSettingProps} />} {showPropertiesSettingModal && <PropertiesSetting {...propertiesSettingProps} />}
{showPlaceShapeModal && <PlacementShapeSetting setShowPlaceShapeModal={setShowPlaceShapeModal} />} {showPlaceShapeModal && <PlacementShapeSetting setShowPlaceShapeModal={setShowPlaceShapeModal} />}
{showRoofShapeSettingModal && <RoofShapeSetting setShowRoofShapeSettingModal={setShowRoofShapeSettingModal} />} {showRoofShapeSettingModal && <RoofShapeSetting setShowRoofShapeSettingModal={setShowRoofShapeSettingModal} />}
{showRoofShapePassivitySettingModal && (
<RoofShapePassivitySetting setShowRoofShapePassivitySettingModal={setShowRoofShapePassivitySettingModal} />
)}
{showAuxiliaryModal && <AuxiliaryDrawing setShowAuxiliaryModal={setShowAuxiliaryModal} />} {showAuxiliaryModal && <AuxiliaryDrawing setShowAuxiliaryModal={setShowAuxiliaryModal} />}
{showSlopeSettingModal && <Slope setShowSlopeSettingModal={setShowSlopeSettingModal} />} {showSlopeSettingModal && <Slope setShowSlopeSettingModal={setShowSlopeSettingModal} />}
{showPlaceShapeDrawingModal && <PlacementShapeDrawing setShowPlaceShapeDrawingModal={setShowPlaceShapeDrawingModal} />} {showPlaceShapeDrawingModal && <PlacementShapeDrawing setShowPlaceShapeDrawingModal={setShowPlaceShapeDrawingModal} />}
{showEavesGableEditModal && <EavesGableEdit setShowEavesGableEditModal={setShowEavesGableEditModal} />} {showEavesGableEditModal && <EavesGableEdit setShowEavesGableEditModal={setShowEavesGableEditModal} />}
{/*<Movement />*/} {showMovementModal && <MovementSetting setShowMovementModal={setShowMovementModal} />}
{showRoofAllocationSettingModal && <RoofAllocationSetting setShowRoofAllocationSettingModal={setShowRoofAllocationSettingModal} />}
{showWallLineOffsetSettingModal && <WallLineOffsetSetting setShowWallLineOffsetSettingModal={setShowWallLineOffsetSettingModal} />} {showWallLineOffsetSettingModal && <WallLineOffsetSetting setShowWallLineOffsetSettingModal={setShowWallLineOffsetSettingModal} />}
{showObjectSettingModal && <ObjectSetting setShowObjectSettingModal={setShowObjectSettingModal} />} {showObjectSettingModal && <ObjectSetting setShowObjectSettingModal={setShowObjectSettingModal} />}
{showPlacementSurfaceSettingModal && <PlacementSurfaceSetting setShowPlacementSurfaceSettingModal={setShowPlacementSurfaceSettingModal} />} {showPlacementSurfaceSettingModal && <PlacementSurfaceSetting setShowPlacementSurfaceSettingModal={setShowPlacementSurfaceSettingModal} />}

View File

@ -15,10 +15,12 @@ export default function MenuDepth01(props) {
setShowRoofShapePassivitySettingModal, setShowRoofShapePassivitySettingModal,
setShowAuxiliaryModal, setShowAuxiliaryModal,
setShowEavesGableEditModal, setShowEavesGableEditModal,
setShowMovementModal,
setShowSlopeSettingModal, setShowSlopeSettingModal,
setShowPlacementSurfaceSettingModal, setShowPlacementSurfaceSettingModal,
setShowPlaceShapeDrawingModal, setShowPlaceShapeDrawingModal,
setShowWallLineOffsetSettingModal, setShowWallLineOffsetSettingModal,
setShowRoofAllocationSettingModal,
setShowObjectSettingModal, setShowObjectSettingModal,
} = props } = props
const { getMessage } = useMessage() const { getMessage } = useMessage()
@ -28,19 +30,29 @@ export default function MenuDepth01(props) {
setActiveMenu(menu) setActiveMenu(menu)
setShowOutlineModal(menu === MENU.ROOF_COVERING.EXTERIOR_WALL_LINE) setShowOutlineModal(menu === MENU.ROOF_COVERING.EXTERIOR_WALL_LINE)
setCurrentMenu(menu) setCurrentMenu(menu)
setShowPlaceShapeModal(false)
if (type === 'outline') { if (type === 'outline') {
setShowPlaceShapeModal(false)
setShowOutlineModal(id === 0) setShowOutlineModal(id === 0)
setShowRoofShapeSettingModal(id === 1) setShowRoofShapeSettingModal(id === 1)
setShowRoofShapePassivitySettingModal(id === 2) setShowRoofShapePassivitySettingModal(id === 2)
setShowAuxiliaryModal(id === 3) setShowAuxiliaryModal(id === 3)
setShowEavesGableEditModal(id === 4) setShowEavesGableEditModal(id === 4)
setShowMovementModal(id === 5)
setShowWallLineOffsetSettingModal(id === 6) setShowWallLineOffsetSettingModal(id === 6)
setShowRoofAllocationSettingModal(id === 7)
setShowPlaceShapeDrawingModal(false) setShowPlaceShapeDrawingModal(false)
} }
if (type === 'surface') { if (type === 'surface') {
setShowOutlineModal(false)
setShowRoofShapeSettingModal(false)
setShowRoofShapePassivitySettingModal(false)
setShowAuxiliaryModal(false)
setShowEavesGableEditModal(false)
setShowMovementModal(false)
setShowWallLineOffsetSettingModal(false)
setShowRoofAllocationSettingModal(false)
setShowSlopeSettingModal(id === 0) setShowSlopeSettingModal(id === 0)
setShowPlaceShapeDrawingModal(id === 1) setShowPlaceShapeDrawingModal(id === 1)
setShowPlacementSurfaceSettingModal(id === 2) setShowPlacementSurfaceSettingModal(id === 2)

View File

@ -1,21 +1,25 @@
import { useMessage } from '@/hooks/useMessage' import { useMessage } from '@/hooks/useMessage'
import WithDraggable from '@/components/common/draggable/WithDraggable' import WithDraggable from '@/components/common/draggable/WithDraggable'
import { useState } from 'react' import { useState } from 'react'
import FlowLine from '@/components/floor-plan/modal/movement/type/FlowLine'
import Updown from '@/components/floor-plan/modal/movement/type/Updown'
export default function Movement({}) { export default function MovementSetting({ setShowMovementModal }) {
const { getMessage } = useMessage() const { getMessage } = useMessage()
const [buttonAct, setButtonAct] = useState(1) const [buttonAct, setButtonAct] = useState(1)
const buttonMenu = [ const buttonMenu = [
{ id: 1, name: '銅線の移動軒' }, { id: 1, name: getMessage('modal.movement.flow.line.move') },
{ id: 2, name: '型上げ・降り' }, { id: 2, name: getMessage('modal.movement.flow.line.updown') },
] ]
return ( return (
<WithDraggable isShow={true} pos={{ x: 50, y: -950 }}> <WithDraggable isShow={true} pos={{ x: 50, y: -950 }}>
<div className={`modal-pop-wrap r`}> <div className={`modal-pop-wrap r`}>
<div className="modal-head"> <div className="modal-head">
<h1 className="title">ケラバ変更</h1> <h1 className="title">{getMessage('plan.menu.roof.cover.movement.shape.updown')}</h1>
<button className="modal-close">닫기</button> <button className="modal-close" onClick={() => setShowMovementModal(false)}>
닫기
</button>
</div> </div>
<div className="modal-body"> <div className="modal-body">
<div className="modal-btn-wrap"> <div className="modal-btn-wrap">
@ -26,12 +30,12 @@ export default function Movement({}) {
))} ))}
</div> </div>
<div className="properties-setting-wrap outer"> <div className="properties-setting-wrap outer">
<div className="setting-tit">設定</div> <div className="setting-tit">{getMessage('setting')}</div>
{/*{buttonAct === 1 && <MovingTab01 />}*/} {buttonAct === 1 && <FlowLine />}
{/*{buttonAct === 2 && <MovingTab02 />}*/} {buttonAct === 2 && <Updown />}
</div> </div>
<div className="grid-btn-wrap"> <div className="grid-btn-wrap">
<button className="btn-frame modal act">保存</button> <button className="btn-frame modal act">{getMessage('modal.common.save')}</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,46 @@
import { useMessage } from '@/hooks/useMessage'
export default function FlowLine({}) {
const { getMessage } = useMessage()
return (
<>
<div className="outline-wrap">
<div className="guide">{getMessage('modal.movement.flow.line.info')}</div>
<div className="eaves-keraba-table">
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra01" />
<label htmlFor="ra01">{getMessage('modal.movement.flow.line.bottom.left')}</label>
</div>
</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '100px' }}>
<input type="text" className="input-origin block" defaultValue={100} />
</div>
</div>
</div>
</div>
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra02" />
<label htmlFor="ra02">{getMessage('modal.movement.flow.line.top.right')}</label>
</div>
</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '100px' }}>
<input type="text" className="input-origin block" defaultValue={100} />
</div>
<span className="thin">mm</span>
</div>
</div>
</div>
</div>
</div>
</>
)
}

View File

@ -0,0 +1,46 @@
import { useMessage } from '@/hooks/useMessage'
export default function Updown({}) {
const { getMessage } = useMessage()
return (
<>
<div className="outline-wrap">
<div className="guide">{getMessage('modal.movement.flow.line.updown.info')}</div>
<div className="eaves-keraba-table">
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra01" />
<label htmlFor="ra01">{getMessage('modal.movement.flow.line.updown.up')}</label>
</div>
</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '100px' }}>
<input type="text" className="input-origin block" defaultValue={100} />
</div>
</div>
</div>
</div>
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra02" />
<label htmlFor="ra02">{getMessage('modal.movement.flow.line.updown.down')}</label>
</div>
</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '100px' }}>
<input type="text" className="input-origin block" defaultValue={100} />
</div>
<span className="thin">mm</span>
</div>
</div>
</div>
</div>
</div>
</>
)
}

View File

@ -0,0 +1,222 @@
import { useMessage } from '@/hooks/useMessage'
import WithDraggable from '@/components/common/draggable/WithDraggable'
import { useState } from 'react'
import QSelectBox from '@/components/common/select/QSelectBox'
export default function RoofAllocationSetting({ setShowRoofAllocationSettingModal }) {
const { getMessage } = useMessage()
const [selectedRoofMaterial, setSelectedRoofMaterial] = useState(null)
const [values, setValues] = useState([
{
id: '1',
type: 'A',
roofMaterial: { name: '기와1' },
width: { name: '200' },
length: { name: '250' },
rafter: { name: '300' },
alignType: 'stairs',
},
])
const roofMaterials = [
{
id: 'A',
name: '기와1',
type: 'A',
width: '200',
length: '200',
alignType: 'parallel',
},
{
id: 'B',
name: '기와2',
type: 'B',
rafter: '200',
alignType: 'parallel',
},
{
id: 'C',
name: '기와3',
type: 'C',
hajebichi: '200',
alignType: 'stairs',
},
{
id: 'D',
name: '기와4',
type: 'D',
length: '200',
alignType: 'stairs',
},
]
const widths = [
{ name: '200', id: 'q' },
{ name: '250', id: 'q1' },
{ name: '300', id: 'q2' },
]
const lengths = [
{ name: '200', id: 'w' },
{ name: '250', id: 'w1' },
{ name: '300', id: 'w2' },
]
const rafters = [
{ name: '200', id: 'e' },
{ name: '250', id: 'e1' },
{ name: '300', id: 'e2' },
]
const onAddRoofMaterial = () => {
setValues([...values, selectedRoofMaterial])
}
const onDeleteRoofMaterial = (id) => {
setValues(values.filter((value) => value.id !== id))
}
return (
<WithDraggable isShow={true} pos={{ x: 50, y: -950 }}>
<div className={`modal-pop-wrap ml`}>
<div className="modal-head">
<h1 className="title">{getMessage('plan.menu.estimate.roof.alloc')}</h1>
<button className="modal-close" onClick={() => setShowRoofAllocationSettingModal(false)}>
닫기
</button>
</div>
<div className="modal-body">
<div className="properties-guide">{getMessage('modal.roof.alloc.info')}</div>
<div className="allocation-select-wrap">
<span>{getMessage('modal.roof.alloc.select.roof.material')}</span>
<div className="grid-select">
<QSelectBox options={roofMaterials} value={selectedRoofMaterial} onChange={(e) => setSelectedRoofMaterial(e)} />
</div>
<button
className="allocation-edit"
onClick={() => {
onAddRoofMaterial()
}}
>
<i className="edit-ico"></i>
{getMessage('modal.common.add')}
</button>
</div>
<div className="grid-option-wrap">
{values.map((value, index) => (
<div className="grid-option-box" key={index}>
<div className="d-check-radio pop no-text">
<input type="radio" name="radio01" id="ra01" />
<label htmlFor="ra01"></label>
</div>
<div className="grid-option-block-form">
<div className="block-box">
<div className="flex-ment">
<div className="grid-select" style={{ width: '248px' }}>
<QSelectBox options={roofMaterials} value={value} />
</div>
{index === 0 && <span className="dec">基本屋根材</span>}
{index !== 0 && <button className="delete" onClick={() => onDeleteRoofMaterial(value.id)}></button>}
</div>
</div>
<div className="block-box">
{value.type === 'A' ? (
<>
<div className="flex-ment">
<span>W</span>
<div className="select-wrap" style={{ width: '84px' }}>
<select className="select-light dark" name="" id="">
<option>265</option>
</select>
</div>
</div>
<div className="flex-ment">
<span>L</span>
<div className="select-wrap" style={{ width: '84px' }}>
<select className="select-light dark" name="" id="">
<option>235</option>
</select>
</div>
</div>
<div className="flex-ment">
<span>{getMessage('modal.placement.initial.setting.rafter')}</span>
<div className="select-wrap" style={{ width: '84px' }}>
<select className="select-light dark" name="" id="">
<option>455</option>
</select>
</div>
</div>
</>
) : value.type === 'B' ? (
<>
<div className="flex-ment">
<span>{getMessage('hajebichi')}</span>
<div className="grid-select no-flx" style={{ width: '84px' }}>
<select className="select-light dark" name="" id="">
<option>265</option>
</select>
</div>
</div>
<div className="flex-ment">
<span>{getMessage('modal.placement.initial.setting.rafter')}</span>
<div className="grid-select no-flx right" style={{ width: '84px' }}>
<select className="select-light dark" name="" id="">
<option>265</option>
</select>
</div>
</div>
</>
) : value.type === 'C' ? (
<>
<div className="flex-ment">
<span>{getMessage('hajebichi')}</span>
<div className="grid-select no-flx" style={{ width: '84px' }}>
<select className="select-light dark" name="" id="">
<option>265</option>
</select>
</div>
</div>
</>
) : value.type === 'D' ? (
<>
<div className="flex-ment">
<span>L</span>
<div className="grid-select no-flx" style={{ width: '84px' }}>
<select className="select-light dark" name="" id="">
<option>265</option>
</select>
</div>
</div>
<div className="flex-ment">
<span>{getMessage('modal.placement.initial.setting.rafter')}</span>
<div className="grid-select no-flx right" style={{ width: '84px' }}>
<select className="select-light dark" name="" id="">
<option>265</option>
</select>
</div>
</div>
</>
) : (
''
)}
</div>
<div className="block-box">
<div className="icon-btn-wrap">
<button className={value.alignType === 'parallel' ? 'act' : ''}>
{getMessage('modal.roof.alloc.select.parallel')}
<i className="allocation01"></i>
</button>
<button className={value.alignType === 'stairs' ? 'act' : ''}>
{getMessage('modal.roof.alloc.select.stairs')} <i className="allocation02"></i>
</button>
</div>
</div>
</div>
</div>
))}
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal act">{getMessage('modal.roof.alloc.apply')}</button>
</div>
</div>
</div>
</WithDraggable>
)
}

View File

@ -25,7 +25,7 @@ export default function RoofShapePassivitySetting({ setShowRoofShapePassivitySet
<div className="modal-body"> <div className="modal-body">
<div className="modal-btn-wrap"> <div className="modal-btn-wrap">
{buttons.map((button) => ( {buttons.map((button) => (
<button className={`btn-frame modal ${buttonAct === button.id ? 'act' : ''}`} onClick={() => setButtonAct(button.id)}> <button id={button.id} className={`btn-frame modal ${buttonAct === button.id ? 'act' : ''}`} onClick={() => setButtonAct(button.id)}>
{button.name} {button.name}
</button> </button>
))} ))}

View File

@ -22,24 +22,6 @@ export default function Eaves() {
</div> </div>
<span className="thin">mm</span> <span className="thin">mm</span>
</div> </div>
<div className="outline-form mb10">
<span className="mr10" style={{ width: '63px' }}>
{getMessage('gable.offset')}
</span>
<div className="input-grid mr5">
<input type="text" className="input-origin block" defaultValue={100} />
</div>
<span className="thin">mm</span>
</div>
<div className="outline-form mb10">
<span className="mr10" style={{ width: '63px' }}>
{getMessage('shed.width')}
</span>
<div className="input-grid mr5">
<input type="text" className="input-origin block" defaultValue={100} />
</div>
<span className="thin">mm</span>
</div>
</> </>
) )
} }

View File

@ -0,0 +1,168 @@
import React from 'react'
import { useMessage } from '@/hooks/useMessage'
import { useForm } from 'react-hook-form'
import { sessionStore } from '@/store/commonAtom'
import { useRecoilValue, useRecoilState } from 'recoil'
import { useAxios } from '@/hooks/useAxios'
import { globalLocaleStore } from '@/store/localeAtom'
export default function ChangePasswordPop() {
const globalLocaleState = useRecoilValue(globalLocaleStore)
const { patch } = useAxios(globalLocaleState)
const { getMessage } = useMessage()
const [sessionState, setSessionState] = useRecoilState(sessionStore)
const formInitValue = {
password1: '',
password2: '',
}
const { register, setValue, getValues, handleSubmit, resetField, control, watch } = useForm({
defaultValues: formInitValue,
})
const form = { register, setValue, getValues, handleSubmit, resetField, control, watch }
//
const checkLength = (pwd1) => {
let str = new String(pwd1)
let _byte = 0
if (str.length !== 0) {
for (let i = 0; i < str.length; i++) {
let str2 = str.charAt(i)
if (encodeURIComponent(str2).length > 4) {
_byte += 2
} else {
_byte++
}
}
}
return _byte
}
//
const checkValue = (e) => {
let spaceChk = /\s/
if (spaceChk.exec(e.target.value)) {
e.target.value = e.target.value.replace(/\s|/gi, '')
return false
}
}
//
const updateProcess = async () => {
const _password1 = form.watch('password1')
const _password2 = form.watch('password2')
if (_password1 !== _password2) {
alert(getMessage('main.popup.login.validate1'))
return false
}
//
if (checkLength(_password1) > 10) {
alert(getMessage('main.popup.login.validate2'))
}
const param = {
loginId: sessionState.userId,
chgType: 'I',
chgPwd: _password1,
}
await patch({ url: '/api/login/v1.0/user/change-password', data: param }).then((res) => {
if (res) {
if (res.result.resultCode === 'S') {
alert(getMessage('main.popup.login.success'))
setSessionState({ ...sessionState, pwdInitYn: 'Y' })
} else {
alert(res.result.resultMsg)
}
}
})
}
return (
<div className="modal-popup">
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<h1 className="title">{getMessage('main.popup.login.popupTitle')}</h1>
</div>
<div className="modal-body">
<div className="modal-body-inner">
<div className="change-password-box">
<div className="form-table">
<div className="table-item">
<div className="table-item-th">
<div className="change-password-tit">
<div className="tit-b">
{getMessage('main.popup.login.newPassword1')}
<span className="important">*</span>
</div>
<div className="tit-s">{getMessage('main.popup.login.placeholder')}</div>
</div>
</div>
<div className="table-item-td">
<div className="change-password-input">
<input
type="text"
className="change-password"
{...form.register('password1')}
autoComplete="off"
onChange={checkValue}
onKeyUp={checkValue}
/>
</div>
</div>
</div>
<div className="table-item">
<div className="table-item-th">
<div className="change-password-tit">
<div className="tit-b">
{getMessage('main.popup.login.newPassword2')}
<span className="important">*</span>
</div>
<div className="tit-s">{getMessage('main.popup.login.placeholder')}</div>
</div>
</div>
<div className="table-item-td">
<div className="change-password-input">
<input
type="text"
className="change-password"
{...form.register('password2')}
autoComplete="off"
onChange={checkValue}
onKeyUp={checkValue}
/>
</div>
</div>
</div>
</div>
</div>
<div className="change-password-guide">
<span>{getMessage('main.popup.login.guide1')}</span>
<span>{getMessage('main.popup.login.guide2')}</span>
</div>
</div>
<div className="footer-btn-wrap">
<button type="sumbit" className="btn-origin navy mr5" onClick={updateProcess}>
{getMessage('main.popup.login.btn1')}
</button>
<button
type="button"
className="btn-origin grey"
onClick={() => {
router.push('/login')
setOpen(false)
}}
>
{getMessage('main.popup.login.btn2')}
</button>
</div>
</div>
</div>
</div>
</div>
)
}

View File

@ -0,0 +1,174 @@
import React, { useEffect, useState } from 'react'
import ProductItem from './ProductItem'
import { useMessage } from '@/hooks/useMessage'
import Image from 'next/image'
import dayjs from 'dayjs'
import { useAxios } from '@/hooks/useAxios'
import { useRecoilValue } from 'recoil'
import { useRouter } from 'next/navigation'
import { globalLocaleStore } from '@/store/localeAtom'
import { queryStringFormatter } from '@/util/common-utils'
export default function MainContents({ objectList, businessCharger, businessChargerMail, businessChargerTel }) {
const { getMessage } = useMessage()
const router = useRouter()
const globalLocaleState = useRecoilValue(globalLocaleStore)
const { get } = useAxios(globalLocaleState)
//
const [recentNoticeList, setRecentNoticeList] = useState([])
//FAQ
const [recentFaqList, setRecentFaqList] = useState([])
useEffect(() => {
fetchNoticeList()
fetchFaqList()
}, [])
//
const fetchNoticeList = async () => {
try {
const param = {
schNoticeTpCd: 'QC',
schNoticeClsCd: 'NOTICE',
startRow: 1,
endRow: 1,
}
// const noticeApiUrl = `api/board/list?schNoticeTpCd=QC&schNoticeClsCd=NOTICE&schTitle=&startRow=1&endRow=1`
const noticeApiUrl = `api/board/list?${queryStringFormatter(param)}`
const res = await get({ url: noticeApiUrl })
//console.log('res::', res)
if (res) {
if (res.data.length > 0) {
setRecentNoticeList(res.data)
}
}
} catch (error) {
console.error('NOTICE fetching error:', error)
}
}
//FAQ
const fetchFaqList = async () => {
try {
const param = {
schNoticeTpCd: 'QC',
schNoticeClsCd: 'FAQ',
startRow: 1,
endRow: 3,
}
// const faqApiUrl = `api/board/list?schNoticeTpCd=QC&schNoticeClsCd=FAQ&schTitle=&startRow=1&endRow=1`
const faqApiUrl = `api/board/list?${queryStringFormatter(param)}`
const res = await get({ url: faqApiUrl })
//console.log('FAQres::', res)
if (res) {
if (res.data.length > 0) {
setRecentFaqList(res.data)
}
}
} catch (error) {
console.error('FAQ fetching error:', error)
}
}
return (
<div className="main-product-list-wrap">
<div className="main-product-list">
<ProductItem num={1} name={getMessage('main.content.objectList')}>
<ul className="recently-list">
{objectList?.length > 0 ? (
<>
{objectList.map((row) => {
return (
<li
key={row.objectNo}
className="recently-item"
onClick={() => {
if (row.objectNo.substring(0, 1) === 'R') {
router.push(`/management/stuff/detail?objectNo=${row.objectNo.toString()}`)
} else {
router.push(`/management/stuff/tempdetail?objectNo=${row.objectNo.toString()}`)
}
}}
>
<div className="item-inner">
<span className="time">{dayjs(row.lastEditDatetime).format('YYYY.MM.DD HH:mm:ss')}</span>
<span>{row.objectNo}</span>
<span>{row.objectName}</span>
<span>{row.saleStoreName}</span>
</div>
</li>
)
})}
</>
) : (
<>
<li>
<div className="item-inner">최근 갱신 물건이 없습니다</div>
</li>
</>
)}
</ul>
</ProductItem>
<ProductItem num={2} name={getMessage('main.content.notice')}>
<div className="notice-box">
{recentNoticeList.length > 0 ? (
<>
<div className="notice-day pre">{dayjs(recentNoticeList[0]?.regDt).format('YYYY.MM.DD')}</div>
<div className="notice-title">{recentNoticeList[0]?.title}</div>
<div className="notice-contents">{recentNoticeList[0]?.contents}</div>
</>
) : null}
</div>
</ProductItem>
</div>
<div className="main-product-list">
<ProductItem num={3} name={getMessage('main.faq')}>
<ul className="faq-list">
{recentFaqList.length > 0 ? (
<>
{recentFaqList.map((row) => {
return (
<li key={row.rowNumber} className="faq-item">
<div className="faq-item-inner">
<div className="faq-num pre">FAQ {row.noticeNo}</div>
<div className="faq-title pre">{row.title}</div>
<div className="faq-day pre">{dayjs(row.regDt).format('YYYY.MM.DD')}</div>
</div>
</li>
)
})}
</>
) : null}
</ul>
</ProductItem>
<ProductItem num={4} name={'Data Download'}>
<div className="data-download-wrap">
<button className="data-down">
<span>{getMessage('main.content.download1')}</span>
</button>
<button className="data-down">
<span>{getMessage('main.content.download2')}</span>
</button>
</div>
</ProductItem>
<ProductItem num={5} name={'Sales Contact info'}>
<ul className="contact-info-list">
<li className="info-item">
<div className="icon-box">
<Image src="/static/images/main/user.svg" alt="react" width={20} height={20} />
</div>
<div className="infor-data">{businessCharger}</div>
</li>
<li className="info-item">
<div className="icon-box">
<Image src="/static/images/main/mail.svg" alt="react" width={20} height={20} />
</div>
<div className="infor-data pre">{businessChargerMail}</div>
</li>
</ul>
</ProductItem>
</div>
</div>
)
}

View File

@ -0,0 +1,35 @@
import React from 'react'
import { useRouter } from 'next/navigation'
export default function ProductItem({ num, name, children }) {
const router = useRouter()
//
const pageMove = (num) => {
if (num === 1) {
router.push('/management/stuff')
} else if (num === 2) {
router.push('/community/notice')
} else {
router.push('/community/faq')
}
}
return (
<div className={`product-item item0${num}`}>
<div className="product-item-title-wrap">
<h2 className="product-item-title">
<span className={`item-logo ico0${num}`}></span>
{name}
</h2>
{num !== 4 && num !== 5 && (
<button
className="more-btn"
onClick={() => {
pageMove(num)
}}
></button>
)}
</div>
<div className="product-item-content">{children}</div>
</div>
)
}

View File

@ -278,6 +278,54 @@ export default function Stuff() {
// const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(params)}` // const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(params)}`
// const apiUrl = `/api/object/list?saleStoreId=X167&${queryStringFormatter(params)}` // const apiUrl = `/api/object/list?saleStoreId=X167&${queryStringFormatter(params)}`
const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(params)}` const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(params)}`
await get({
url: apiUrl,
}).then((res) => {
if (!isEmptyArray(res)) {
setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt })
setGridCount(res[0].totCnt)
}
})
}
fetchData()
} else {
const params = {
schObjectNo: '',
schAddress: '',
schObjectName: '',
schSaleStoreName: '',
schReceiveUser: '',
schDispCompanyName: '',
schDateType: 'U',
schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'),
schToDt: dayjs(new Date()).format('YYYY-MM-DD'),
startRow: (curPage - 1) * defaultSize + 1,
endRow: curPage * defaultSize,
schSelSaleStoreId: '',
schSortType: 'R',
}
async function fetchData() {
//api startRow, endRow
// let startRow
// let endRow
// startRow = (curPage - 1) * size + 1
// endRow = curPage * size
// console.log('startrow::', startRow)
// console.log('endRow::', endRow)
// let curPage
// let totalpage
// let totalCount
// let size
// let pageCount
// console.log(' ::::::::::', sessionState)
// const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(params)}`
// const apiUrl = `/api/object/list?saleStoreId=X167&${queryStringFormatter(params)}`
const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(params)}`
await get({ await get({
url: apiUrl, url: apiUrl,
}).then((res) => { }).then((res) => {
@ -294,10 +342,10 @@ export default function Stuff() {
useEffect(() => { useEffect(() => {
if (stuffSearchParams?.code === 'E') { if (stuffSearchParams?.code === 'E') {
//console.log('::::::::', stuffSearchParams)
stuffSearchParams.startRow = (curPage - 1) * defaultSize + 1 stuffSearchParams.startRow = (curPage - 1) * defaultSize + 1
stuffSearchParams.endRow = curPage * defaultSize stuffSearchParams.endRow = curPage * defaultSize
stuffSearchParams.schSortType = defaultSortType stuffSearchParams.schSortType = defaultSortType
// console.log('::::::::', stuffSearchParams)
async function fetchData() { async function fetchData() {
// console.log(' :::::::::::::', sessionState) // console.log(' :::::::::::::', sessionState)
// const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(stuffSearchParams)}` // const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(stuffSearchParams)}`
@ -378,6 +426,7 @@ export default function Stuff() {
setAppMessageState(JA) setAppMessageState(JA)
} }
}, [globalLocaleState]) }, [globalLocaleState])
return ( return (
<> <>
{/* 퍼블시작 */} {/* 퍼블시작 */}

View File

@ -182,7 +182,7 @@ export default function StuffSearchCondition() {
type="text" type="text"
className="input-light" className="input-light"
placeholder="물건번호 입력" placeholder="물건번호 입력"
value={stuffSearch?.code === 'E' ? stuffSearch.schObjectNo : objectNo} value={stuffSearch?.code === 'E' || stuffSearch?.code === 'M' ? stuffSearch.schObjectNo : objectNo}
onChange={(e) => { onChange={(e) => {
setObjectNo(e.target.value) setObjectNo(e.target.value)
setStuffSearch({ ...stuffSearch, code: 'S', schObjectNo: e.target.value }) setStuffSearch({ ...stuffSearch, code: 'S', schObjectNo: e.target.value })
@ -255,9 +255,6 @@ export default function StuffSearchCondition() {
</td> </td>
<th>판매대리점 선택</th> <th>판매대리점 선택</th>
<td> <td>
{/* <div className="select-wrap">
<select className="select-light" name="" id=""></select>
</div> */}
{schSelSaleStoreList?.length > 0 && ( {schSelSaleStoreList?.length > 0 && (
<Select <Select
options={schSelSaleStoreList} options={schSelSaleStoreList}

View File

@ -40,9 +40,20 @@
"plan.menu.roof.cover.outline.drawing": "外壁線を描", "plan.menu.roof.cover.outline.drawing": "外壁線を描",
"plan.menu.roof.cover.roof.shape.setting": "屋根形状設定", "plan.menu.roof.cover.roof.shape.setting": "屋根形状設定",
"plan.menu.roof.cover.roof.shape.passivity.setting": "屋根形状設定", "plan.menu.roof.cover.roof.shape.passivity.setting": "屋根形状設定",
"plan.menu.roof.cover.roof.shape.edit": "지붕형상 편집", "plan.menu.roof.cover.eaves.kerava.edit": "처마·케라바 변경",
"plan.menu.roof.cover.movement.shape.updown": "동선이동·형올림내림(JA)",
"modal.movement.flow.line.move": "銅線の移動軒",
"modal.movement.flow.line.updown": "型上げ・降り",
"modal.movement.flow.line.updown.info": "を選択して幅を指定してください桁の異なる辺。",
"modal.movement.flow.line.updown.up": "桁を上げる",
"modal.movement.flow.line.updown.down": "桁数を下げる",
"modal.movement.flow.line.info": "家屋などの壁に面する屋根を作成します。",
"modal.movement.flow.line.bottom.left": "高さ変更:下、左",
"modal.movement.flow.line.top.right": "高さ変更:上、右",
"plan.menu.roof.cover.outline.edit.offset": "외벽선 편집 및 오프셋(JA)",
"plan.menu.roof.cover.roof.surface.alloc": "지붕면 할당(JA)",
"plan.menu.roof.cover.roof.shape.edit": "지붕형상 편집(JA)",
"plan.menu.roof.cover.auxiliary.line.drawing": "補助線を描", "plan.menu.roof.cover.auxiliary.line.drawing": "補助線を描",
"plan.menu.roof.cover.roof.surface.alloc": "지붕면 할당",
"modal.cover.outline.drawing": "外壁線を描", "modal.cover.outline.drawing": "外壁線を描",
"modal.cover.outline": "外壁線", "modal.cover.outline": "外壁線",
"modal.cover.outline.right.angle": "直角", "modal.cover.outline.right.angle": "直角",
@ -73,6 +84,11 @@
"plan.menu.module.circuit.setting.plan.orientation": "図面方位の適用", "plan.menu.module.circuit.setting.plan.orientation": "図面方位の適用",
"plan.menu.estimate": "見積", "plan.menu.estimate": "見積",
"plan.menu.estimate.roof.alloc": "屋根面の割り当て", "plan.menu.estimate.roof.alloc": "屋根面の割り当て",
"modal.roof.alloc.info": "※配置面初期設定で保存した[基本屋根材]を変更したり、屋根材を追加して割り当てることができます。",
"modal.roof.alloc.select.roof.material": "屋根材の選択",
"modal.roof.alloc.select.parallel": "並列式",
"modal.roof.alloc.select.stairs": "カスケード",
"modal.roof.alloc.apply": "選択した屋根材として割り当て",
"plan.menu.estimate.save": "保存", "plan.menu.estimate.save": "保存",
"plan.menu.estimate.reset": "初期化", "plan.menu.estimate.reset": "初期化",
"plan.menu.estimate.copy": "コピー", "plan.menu.estimate.copy": "コピー",
@ -109,6 +125,7 @@
"modal.grid.copy.length": "長さ", "modal.grid.copy.length": "長さ",
"modal.grid.copy.save": "保存", "modal.grid.copy.save": "保存",
"modal.common.save": "保存", "modal.common.save": "保存",
"modal.common.add": "追加",
"modal.canvas.setting.font.plan.edit": "フォントとサイズの変更", "modal.canvas.setting.font.plan.edit": "フォントとサイズの変更",
"modal.canvas.setting.font.plan.edit.word": "文字フォントの変更", "modal.canvas.setting.font.plan.edit.word": "文字フォントの変更",
"modal.canvas.setting.font.plan.edit.flow": "フロー方向フォントの変更", "modal.canvas.setting.font.plan.edit.flow": "フロー方向フォントの変更",
@ -362,6 +379,17 @@
"main.content.notice": "お知らせ", "main.content.notice": "お知らせ",
"main.content.download1": "操作マニュアル", "main.content.download1": "操作マニュアル",
"main.content.download2": "屋根の説明書", "main.content.download2": "屋根の説明書",
"main.popup.login.popupTitle": "パスワード変更",
"main.popup.login.newPassword1": "新しいパスワードを入力",
"main.popup.login.newPassword2": "新規パスワード再入力",
"main.popup.login.placeholder": "半角10文字以内 ",
"main.popup.login.guide1": "初期化されたパスワードでログインした場合、パスワードを変更しなければサイト利用が可能です。",
"main.popup.login.guide2": "パスワードを変更しない場合は、ログイン画面に進みます。",
"main.popup.login.btn1": "変更",
"main.popup.login.btn2": "変更しない",
"main.popup.login.validate1": "入力したパスワードが異なります。",
"main.popup.login.validate2": "半角10文字以内で入力してください。",
"main.popup.login.success": "パスワードが変更されました。",
"surface.shape.validate.size": "寸法を入力してください.", "surface.shape.validate.size": "寸法を入力してください.",
"surface.shape.validate.size.1to2": "①길이는 ②보다 큰 값을 넣어주세요.", "surface.shape.validate.size.1to2": "①길이는 ②보다 큰 값을 넣어주세요.",
"surface.shape.validate.size.1to3": "①길이는 ③보다 큰 값을 넣어주세요.", "surface.shape.validate.size.1to3": "①길이는 ③보다 큰 값을 넣어주세요.",

View File

@ -42,6 +42,14 @@
"plan.menu.roof.cover.roof.shape.passivity.setting": "지붕형상 수동 설정", "plan.menu.roof.cover.roof.shape.passivity.setting": "지붕형상 수동 설정",
"plan.menu.roof.cover.eaves.kerava.edit": "처마·케라바 변경", "plan.menu.roof.cover.eaves.kerava.edit": "처마·케라바 변경",
"plan.menu.roof.cover.movement.shape.updown": "동선이동·형올림내림", "plan.menu.roof.cover.movement.shape.updown": "동선이동·형올림내림",
"modal.movement.flow.line.move": "동선 이동",
"modal.movement.flow.line.updown": "형 올림·내림",
"modal.movement.flow.line.updown.info": "자릿수가 다른 변을 선택하고 폭을 지정하십시오.",
"modal.movement.flow.line.updown.up": "자릿수를 올리다",
"modal.movement.flow.line.updown.down": "자릿수를 낮추다",
"modal.movement.flow.line.info": "동선을 선택하고 이동 폭을 지정하십시오",
"modal.movement.flow.line.bottom.left": "높이 변경: 아래, 왼쪽",
"modal.movement.flow.line.top.right": "높이 변경: 위, 오른쪽",
"plan.menu.roof.cover.outline.edit.offset": "외벽선 편집 및 오프셋", "plan.menu.roof.cover.outline.edit.offset": "외벽선 편집 및 오프셋",
"plan.menu.roof.cover.roof.surface.alloc": "지붕면 할당", "plan.menu.roof.cover.roof.surface.alloc": "지붕면 할당",
"plan.menu.roof.cover.roof.shape.edit": "지붕형상 편집", "plan.menu.roof.cover.roof.shape.edit": "지붕형상 편집",
@ -79,6 +87,11 @@
"plan.menu.module.circuit.setting.plan.orientation": "도면 방위 적용", "plan.menu.module.circuit.setting.plan.orientation": "도면 방위 적용",
"plan.menu.estimate": "견적서", "plan.menu.estimate": "견적서",
"plan.menu.estimate.roof.alloc": "지붕면 할당", "plan.menu.estimate.roof.alloc": "지붕면 할당",
"modal.roof.alloc.info": "※ 배치면 초기설정에서 저장한 [기본 지붕재]를 변경하거나, 지붕재를 추가하여 할당할 수 있습니다.",
"modal.roof.alloc.select.roof.material": "지붕재 선택",
"modal.roof.alloc.select.parallel": "병렬식",
"modal.roof.alloc.select.stairs": "계단식",
"modal.roof.alloc.apply": "선택한 지붕재로 할당",
"plan.menu.estimate.save": "저장", "plan.menu.estimate.save": "저장",
"plan.menu.estimate.reset": "초기화", "plan.menu.estimate.reset": "초기화",
"plan.menu.estimate.copy": "복사", "plan.menu.estimate.copy": "복사",
@ -115,6 +128,7 @@
"modal.grid.copy.length": "길이", "modal.grid.copy.length": "길이",
"modal.grid.copy.save": "저장", "modal.grid.copy.save": "저장",
"modal.common.save": "저장", "modal.common.save": "저장",
"modal.common.add": "추가",
"modal.canvas.setting.font.plan.edit": "글꼴 및 크기 변경", "modal.canvas.setting.font.plan.edit": "글꼴 및 크기 변경",
"modal.canvas.setting.font.plan.edit.word": "문자 글꼴 변경", "modal.canvas.setting.font.plan.edit.word": "문자 글꼴 변경",
"modal.canvas.setting.font.plan.edit.flow": "흐름 방향 글꼴 변경", "modal.canvas.setting.font.plan.edit.flow": "흐름 방향 글꼴 변경",
@ -368,6 +382,17 @@
"main.content.notice": "공지사항", "main.content.notice": "공지사항",
"main.content.download1": "조작메뉴얼", "main.content.download1": "조작메뉴얼",
"main.content.download2": "지붕설명서", "main.content.download2": "지붕설명서",
"main.popup.login.popupTitle": "비밀번호변경",
"main.popup.login.newPassword1": "새 비밀번호 입력",
"main.popup.login.newPassword2": "새 비밀번호 재입력",
"main.popup.login.placeholder": "반각 10자 이내",
"main.popup.login.guide1": "초기화된 비밀번호로 로그인한 경우 비밀번호를 변경하지 않으면 사이트 이용이 가능합니다.",
"main.popup.login.guide2": "비밀번호를 변경하지 않으려면 로그인 화면으로 이동합니다.",
"main.popup.login.btn1": "변경",
"main.popup.login.btn2": "변경안함",
"main.popup.login.validate1": "입력한 패스워드가 다릅니다.",
"main.popup.login.validate2": "반각 10자 이내로 입력해주세요.",
"main.popup.login.success": "비밀번호가 변경되었습니다.",
"surface.shape.validate.size": "사이즈를 입력해 주세요.", "surface.shape.validate.size": "사이즈를 입력해 주세요.",
"surface.shape.validate.size.1to2": "①길이는 ②보다 큰 값을 넣어주세요.", "surface.shape.validate.size.1to2": "①길이는 ②보다 큰 값을 넣어주세요.",
"surface.shape.validate.size.1to3": "①길이는 ③보다 큰 값을 넣어주세요.", "surface.shape.validate.size.1to3": "①길이는 ③보다 큰 값을 넣어주세요.",

106
src/styles/_canvasside.scss Normal file
View File

@ -0,0 +1,106 @@
// 패널 배치 집계
.penal-wrap {
position: fixed;
top: 200px;
left: 50px;
z-index: 999999;
width: 237px;
height: 40px;
line-height: 40px;
background-color: #fff;
border: 1px solid #dfdfdf;
padding: 0 34px 0 10px;
border-radius: 2px;
box-shadow: 0px 7px 14px 0px rgba(0, 0, 0, 0.05);
cursor: pointer;
&::before {
content: '';
position: absolute;
top: 50%;
right: 12px;
transform: translateY(-50%);
width: 10px;
height: 6px;
background: url(../../public/static/images/canvas/penal_arr.svg) no-repeat center;
background-size: cover;
}
h2 {
font-size: 12px;
font-weight: 500;
color: #3d3d3d;
}
.penal-table-wrap {
display: none;
position: absolute;
top: 100%;
left: -1px;
min-width: calc(100% + 2px);
background-color: #3d3d3d;
border: 1px solid #3d3d3d;
padding: 20px;
.penal-table {
table-layout: fixed;
border-collapse: collapse;
thead {
th {
text-align: center;
background-color: rgba(255, 255, 255, 0.05);
font-size: 12px;
font-weight: 500;
color: #fff;
border: 1px solid #505050;
}
}
tbody {
td {
font-size: 12px;
color: #fff;
font-weight: 400;
text-align: center;
padding: 0 10px;
border: 1px solid #505050;
}
}
}
}
&.act {
border: 1px solid #3d3d3d;
background-color: #3d3d3d;
h2 {
color: #fff;
}
&::before {
background: url(../../public/static/images/canvas/penal_arr_white.svg) no-repeat center;
}
.penal-table-wrap {
display: block;
}
}
}
// context menu
.context-menu-wrap {
min-width: 238px;
border-radius: 4px;
border: 1px solid #e9e9e9;
background: #fff;
box-shadow: 0px 6px 14px 0px rgba(0, 0, 0, 0.05);
ul {
padding: 17px 0;
border-bottom: 1px solid #e9e9e9;
&:last-child {
border: none;
}
li {
padding: 4px 30px;
cursor: pointer;
font-size: 12px;
font-weight: 400;
color: #101010;
&:hover {
color: #fff;
background-color: #0d99ff;
}
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

198
src/styles/_submodal.scss Normal file
View File

@ -0,0 +1,198 @@
.modal-popup {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
background: rgba(0, 0, 0, 0.75);
z-index: 110000;
.modal-dialog {
position: relative;
display: flex;
align-items: center;
min-height: calc(100% - (1.5rem * 2));
width: 680px;
z-index: 200000;
margin: 1.5rem auto;
pointer-events: none;
&.middle {
width: 800px;
}
&.big {
width: 1000px;
}
.modal-content {
flex: 1;
position: relative;
background-clip: padding-box;
background-color: transparent;
outline: 0 none;
pointer-events: auto;
border-radius: 4px;
.modal-header {
display: flex;
align-items: center;
padding: 10px 24px;
background-color: #7992ba;
border-radius: 4px 4px 0px 0px;
// overflow: hidden;
h1.title {
font-size: 13px;
color: $pop-color;
font-weight: 700;
}
.modal-close {
margin-left: auto;
color: transparent;
font-size: 0;
width: 10px;
height: 10px;
background: url(../../public/static/images/canvas/modal_close.svg) no-repeat center;
}
}
.modal-body {
padding: 30px;
background-color: #fff;
border-radius: 0px 0px 4px 4px;
.modal-body-inner {
margin-bottom: 20px;
&.border {
padding-bottom: 20px;
border-bottom: 1px solid #ecf0f4;
}
}
.footer-btn-wrap {
display: flex;
align-items: center;
justify-content: flex-end;
}
}
}
}
}
// modal-contents
// 비밀번호 변경
.change-password-guide {
span {
display: block;
margin-bottom: 5px;
font-size: 13px;
font-weight: 400;
color: #101010;
&:last-child {
margin-bottom: 0;
}
}
}
.change-password-box {
padding: 30px;
border-radius: 4px;
background: #f4f4f7;
margin-bottom: 20px;
.change-password-tit {
.tit-b {
font-size: 13px;
font-weight: 500;
color: #344356;
}
.tit-s {
font-size: 12px;
font-weight: 400;
color: #898989;
}
}
.change-password-input {
width: 100%;
.change-password {
width: 100%;
height: 45px;
border-radius: 4px;
border: 1px solid #e9e9e9;
background-color: #fff;
padding: 0 10px;
font-size: 12px;
color: #364864;
font-family: 'Noto Sans JP', sans-serif;
&::placeholder {
font-size: 12px;
}
}
}
.table-item-th {
width: 145px;
}
}
.form-table {
display: table;
table-layout: auto;
width: 100%;
.table-item {
display: table-row;
.table-item-th,
.table-item-td {
display: table-cell;
vertical-align: middle;
padding-bottom: 10px;
}
&:last-child {
.table-item-th,
.table-item-td {
padding-bottom: 0;
}
}
.table-item-td {
padding-left: 10px;
}
}
}
// 주소찾기 팝업
.address-input-wrap {
position: relative;
height: 45px;
padding: 0 40px 0 15px;
border-radius: 4px;
border: 1px solid #e9e9e9;
background: #fff;
margin-bottom: 20px;
input {
width: 100%;
height: 100%;
font-size: 13px;
font-weight: 400;
font-family: 'Noto Sans JP' sans-serif;
color: #868686;
&::placeholder {
color: #aeaeae;
font-size: 13px;
font-weight: 400;
}
}
.search-btn {
position: absolute;
top: 0;
right: 15px;
width: 21px;
height: 100%;
background: url(../../public/static/images/sub/address_search.svg) no-repeat center;
background-size: 21px 21px;
}
}
// 설계의뢰 불러오기
.design-request-table {
margin-bottom: 20px;
}
.design-request-grid {
.design-request-grid-tit {
font-size: 13px;
font-weight: 600;
color: #101010;
margin-bottom: 15px;
}
}

View File

@ -1,205 +1,281 @@
@mixin flexbox(){ @mixin flexbox() {
display: flex; display: flex;
align-items: center; align-items: center;
} }
table{ table {
.overflow-lab{ .overflow-lab {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.al-l {
text-align: left !important;
}
}
.flx-box {
@include flexbox;
}
.common-table {
table {
table-layout: fixed;
border: 1px solid #ecf0f4;
border-radius: 3px;
border-collapse: collapse;
tbody {
th {
font-size: 13px;
font-weight: 500;
color: #344356;
padding: 14px 12px;
border: 1px solid #ecf0f4;
background-color: #f7f9fa;
vertical-align: middle;
}
td {
padding: 9px;
border: 1px solid #ecf0f4;
font-size: 13px;
font-weight: 400;
color: #45576f;
vertical-align: middle;
.radio-wrap {
flex: none;
@include flexbox;
}
.form-flex-wrap {
@include flexbox;
}
.date-picker-wrap {
width: 100%;
@include flexbox;
span {
margin: 0 4px;
}
}
}
}
}
&.bt-able {
margin-bottom: 30px;
}
}
.infomation-table {
table {
border-top: 1px solid #dee3ea;
border-bottom: 1px solid #dee3ea;
border-collapse: collapse;
tbody {
tr {
th {
font-size: 13px;
color: #344356;
font-weight: 500;
padding: 18px 0;
border-bottom: 1px solid #f4f4f7;
.title {
margin-right: 8px;
}
}
td {
padding: 0 0 0 15px;
border-bottom: 1px solid #f4f4f7;
.guide {
font-size: 13px;
color: #697c8f;
font-weight: normal;
margin-left: 15px;
margin-bottom: 0;
}
span {
font-size: 13px;
color: #697c8f;
font-weight: normal;
}
}
&:last-child {
th,
td {
border-bottom: none;
}
}
}
}
}
.tooltips {
display: block;
width: 14px;
height: 14px;
display: inline-block;
background: url(../../public/static/images/sub/tooltips.svg) no-repeat center;
background-size: cover;
cursor: pointer;
}
}
.module-table {
table {
table-layout: fixed;
border-collapse: collapse;
thead {
display: table;
table-layout: fixed;
width: 100%;
th {
padding: 13px 0;
font-size: 13px;
color: #344356;
font-weight: 500;
border-bottom: 2px solid #e0e5eb;
text-align: center;
}
}
tbody {
display: block;
overflow-y: auto;
tr {
display: table;
table-layout: fixed;
width: 100%;
border: 1px solid #ecf0f4;
td {
padding: 10px 0px;
font-size: 13px;
color: #45576f;
font-weight: 400;
text-align: center;
}
}
&::-webkit-scrollbar {
width: 4px;
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
background-color: #c1ccd7;
}
&::-webkit-scrollbar-track {
background-color: transparent;
}
}
&.small {
tbody {
height: 120px;
}
}
&.big {
td,
th {
&:nth-child(2) {
width: 121px;
}
}
tbody {
height: 160px;
td {
padding: 10px 20px;
}
}
}
}
}
.roof-module-table {
table {
border-collapse: collapse;
thead {
th {
height: 40px;
padding: 0px 10px;
font-size: 12px;
line-height: 1.1;
color: #fff;
font-weight: 500;
border: 1px solid #505050;
vertical-align: middle;
background-color: rgba(255, 255, 255, 0.05);
text-align: center;
word-break: keep-all;
.d-check-box {
opacity: 0.5;
}
}
}
tbody {
tr {
cursor: pointer;
&.on {
background-color: #272727;
}
}
td {
height: 40px;
vertical-align: middle;
font-size: 12px;
color: #fff;
font-weight: 400;
border: 1px solid #505050;
padding: 0 10px;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
.warning {
color: PCSオプションマスター;
}
.color-wrap {
display: flex;
align-items: center;
.color-box {
width: 14px;
height: 14px;
margin-right: 8px;
}
.name {
width: 0;
flex: 1;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
}
}
} }
.al-l{ }
text-align: left !important; &.overflow-y {
} table {
} table-layout: fixed;
border-collapse: collapse;
.common-table{ thead {
table{ display: table;
table-layout: fixed; table-layout: fixed;
border: 1px solid #ECF0F4; width: 100%;
border-radius: 3px; border-collapse: collapse;
border-collapse:collapse; }
tbody{ tbody {
th{
font-size: 13px;
font-weight: 500;
color: #344356;
padding: 14px 12px;
border: 1px solid #ECF0F4 ;
background-color: #F7F9FA;
vertical-align: middle;
}
td{
padding: 9px;
border: 1px solid #ECF0F4 ;
font-size: 13px;
font-weight: 400;
color: #45576F;
vertical-align: middle;
.radio-wrap{
flex: none;
@include flexbox;
}
.form-flex-wrap{
@include flexbox;
}
.date-picker-wrap{
width: 100%;
@include flexbox;
span{
margin: 0 4px;
}
}
}
}
}
&.bt-able{
margin-bottom: 30px;
}
}
.infomation-table{
table{
border-top: 1px solid #DEE3EA;
border-bottom: 1px solid #DEE3EA;
border-collapse:collapse;
tbody{
tr{
th{
font-size: 13px;
color: #344356;
font-weight: 500;
padding: 18px 0;
border-bottom: 1px solid #F4F4F7;
.title{
margin-right: 8px;
}
}
td{
padding: 0 0 0 15px;
border-bottom: 1px solid #F4F4F7;
.guide{
font-size: 13px;
color: #697C8F;
font-weight: normal;
margin-left: 15px;
}
span{
font-size: 13px;
color: #697C8F;
font-weight: normal;
}
}
&:last-child{
th,td{border-bottom: none;}
}
}
}
.flx-box{
@include flexbox;
}
}
.tooltips{
display: block; display: block;
width: 14px; max-height: 81px;
height: 14px; overflow-y: auto;
display: inline-block; tr {
background: url(../../public/static/images/sub/tooltips.svg)no-repeat center; display: table;
background-size: cover; table-layout: fixed;
cursor: pointer; width: 100%;
} border-collapse: collapse;
} margin-top: -1px;
}
.module-table{ &::-webkit-scrollbar {
table{ width: 2px;
table-layout: fixed; background-color: rgba(255, 255, 255, 0.05);
border-collapse: collapse; }
thead{ &::-webkit-scrollbar-thumb {
display: table; background-color: #c1ccd7;
table-layout: fixed; }
width: 100%; &::-webkit-scrollbar-track {
th{ background-color: rgba(255, 255, 255, 0.05);
padding: 13px 0; }
font-size: 13px; }
color: #344356;
font-weight: 500;
border-bottom: 2px solid #E0E5EB;
text-align: center;
}
}
tbody{
display: block;
overflow-y: auto;
tr{
display: table;
table-layout: fixed;
width: 100%;
border: 1px solid #ECF0F4;
td{
padding: 10px 0px;
font-size: 13px;
color: #45576F;
font-weight: 400;
text-align: center;
}
}
&::-webkit-scrollbar {
width: 4px;
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
background-color: #C1CCD7;
}
&::-webkit-scrollbar-track {
background-color: transparent;
}
}
&.small{
tbody{height: 120px;}
}
&.big{
td,
th{
&:nth-child(2){
width: 121px;
}
}
tbody{
height: 160px;
td{
padding: 10px 20px;
}
}
}
}
}
.roof-module-table{
table{
border-collapse: collapse;
thead{
th{
height: 40px;
padding: 0 10px;
font-size: 12px;
color: #fff;
font-weight: 500;
border: 1px solid #505050;
vertical-align: middle;
background-color: rgba(255, 255, 255, 0.05);
text-align: center;
word-break: keep-all;
}
}
tbody{
td{
font-size: 12px;
color: #fff;
font-weight: 400;
border: 1px solid #505050;
}
}
} }
}
} }

View File

@ -1,3 +1,5 @@
@import '_contents.scss'; @import '_contents.scss';
@import '_modal.scss'; @import '_modal.scss';
@import '_submodal.scss';
@import '_table.scss'; @import '_table.scss';
@import '_canvasside.scss';

View File

@ -1 +1,2 @@
@import '_main.scss'; @import '_main.scss';
@import '_contents';