Merge branch 'qcast-pub' into dev

# Conflicts:
#	src/components/floor-plan/modal/dimensionLine/DimensionLineSetting.jsx
#	src/components/floor-plan/modal/distance/Distance.jsx
#	src/components/floor-plan/modal/roofShape/type/option/Shed.jsx
This commit is contained in:
minsik 2024-10-30 17:31:36 +09:00
commit 5510878cc2
19 changed files with 937 additions and 36 deletions

View File

@ -81,24 +81,24 @@ export default function DimensionLineSetting(props) {
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap xm`}>
<div className="modal-head">
<h1 className="title">表示の変更 </h1>
<h1 className="title">{getMessage('contextmenu.display.edit')} </h1>
<button className="modal-close" onClick={() => closePopup(id)}>
닫기
</button>
</div>
<div className="modal-body">
<div className="guide">寸法線に表示する数値を入力してください</div>
<div className="guide">{getMessage('modal.display.edit.info')}</div>
<div className="mb-box">
<div className="slope-wrap">
<div className="outline-form mb15">
<span className="mr10">既存の長さ</span>
<span className="mr10">{getMessage('modal.display.edit.before.length')}</span>
<div className="input-grid mr5">
<input type="text" className="input-origin block" value={basicLength} readOnly />
</div>
</div>
<div className="mb-box">
<div className="outline-form">
<span className="mr10">変更の長さ</span>
<span className="mr10">{getMessage('modal.display.edit.after.length')}</span>
<div className="input-grid mr5">
<input type="text" className="input-origin block" ref={changeSlopeRef} />
</div>
@ -106,34 +106,32 @@ export default function DimensionLineSetting(props) {
</div>
<div className="d-check-box pop">
<input type="checkbox" id="ch99" onChange={() => setSlopeAble(!slopeAble)} />
<label htmlFor="ch99">コーナーゴールの場合</label>
<label htmlFor="ch99">{getMessage('modal.display.edit.input.slope')}</label>
</div>
</div>
</div>
<div className="slope-wrap">
<div className="warning">傾斜を着せてください</div>
<div className="warning">{getMessage('modal.display.edit.input.slope')}</div>
<div className="display-change-wrap">
<div className="outline-form mb15">
<span className="mr10">傾斜</span>
<span className="mr10">{getMessage('slope')}</span>
<div className="grid-select mr10">
<QSelectBox title={''} options={SelectOption01} disabled={!slopeAble} params={{ index: 1 }} onChange={handleSelectbox} />
</div>
<span className="thin">{pitchText}</span>
</div>
<div className="outline-form">
<span className="mr10">傾斜</span>
<span className="mr10">{getMessage('slope')}</span>
<div className="grid-select mr10">
<QSelectBox title={''} options={SelectOption01} disabled={!slopeAble} params={{ index: 2 }} onChange={handleSelectbox} />
</div>
<span className="thin">{pitchText}</span>
</div>
</div>
<div className="warning">傾き設定されている場合入力した数値に傾き計算をした数値が表示されます</div>
<div className="warning">{getMessage('modal.display.edit.input.slope.info')}</div>
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal act" onClick={handleChangeLength}>
保存
</button>
<button className="btn-frame modal act" onClick={handleChangeLength}>{getMessage('modal.common.save')}</button>
</div>
</div>
</div>

View File

@ -19,7 +19,7 @@ export default function Distance(props) {
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap xxxm`}>
<div className="modal-head">
<h1 className="title">距離測定 </h1>
<h1 className="title">{getMessage('modal.distance')} </h1>
<button className="modal-close" onClick={() => closePopup(id)}>
닫기
</button>
@ -28,7 +28,7 @@ export default function Distance(props) {
<div className="slope-wrap">
<div className="eaves-keraba-table">
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">2点間距離</div>
<div className="eaves-keraba-th">{getMessage('modal.distance.dual.point')}</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '98px' }}>
@ -39,7 +39,7 @@ export default function Distance(props) {
</div>
</div>
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">水平距離</div>
<div className="eaves-keraba-th">{getMessage('modal.distance.horizon')}</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '98px' }}>
@ -50,7 +50,7 @@ export default function Distance(props) {
</div>
</div>
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">垂直距離</div>
<div className="eaves-keraba-th">{getMessage('modal.distance.vertical')}</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '98px' }}>
@ -63,9 +63,7 @@ export default function Distance(props) {
</div>
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal act" onClick={handleClose}>
確認
</button>
<button className="btn-frame modal act" onClick={handleClose}>{getMessage('common.require')}</button>
</div>
</div>
</div>

View File

@ -0,0 +1,48 @@
import WithDraggable from '@/components/common/draggable/withDraggable'
import { useRecoilValue } from 'recoil'
import { contextPopupPositionState } from '@/store/popupAtom'
import { usePopup } from '@/hooks/usePopup'
import { useMessage } from '@/hooks/useMessage'
export default function CircuitNumberEdit(props) {
const contextPopupPosition = useRecoilValue(contextPopupPositionState)
const { id, pos = contextPopupPosition, apply } = props
const { closePopup } = usePopup()
const { getMessage } = useMessage()
const handleApply = () => {
if (apply) apply()
closePopup(id)
}
return (
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap xm`}>
<div className="modal-head">
<h1 className="title"> {getMessage('modal.module.circuit.number.edit')}</h1>
<button className="modal-close" onClick={() => closePopup(id)}>
닫기
</button>
</div>
<div className="modal-body">
<div className="grid-option-tit"> {getMessage('modal.module.circuit.number.edit.info')}</div>
<div className="grid-option-wrap">
<div className="grid-option-box">
<div className="outline-form">
<span className="mr10" style={{ width: 'auto' }}>
{getMessage('modal.module.circuit.number')}
</span>
<div className="input-grid mr5">
<input type="text" className="input-origin block" />
</div>
</div>
</div>
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal act" onClick={handleApply}>
{getMessage('modal.common.save')}
</button>
</div>
</div>
</div>
</WithDraggable>
)
}

View File

@ -0,0 +1,78 @@
import WithDraggable from '@/components/common/draggable/WithDraggable'
import { useRecoilValue } from 'recoil'
import { contextPopupPositionState } from '@/store/popupAtom'
import { usePopup } from '@/hooks/usePopup'
import { useMessage } from '@/hooks/useMessage'
import { useState } from 'react'
export default function PanelEdit(props) {
const contextPopupPosition = useRecoilValue(contextPopupPositionState)
const { id, pos = contextPopupPosition, type = 'move', apply } = props
const { closePopup } = usePopup()
const [length, setLength] = useState(0)
const [direction, setDirection] = useState('')
const { getMessage } = useMessage()
const handleApply = () => {
apply()
closePopup(id)
}
return (
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap xm mount`}>
<div className="modal-head">
<h1 className="title">{getMessage(type === 'move' ? 'modal.move.setting' : 'modal.copy.setting')} </h1>
<button className="modal-close" onClick={() => closePopup(id)}>
닫기
</button>
</div>
<div className="modal-body">
<div className="grid-option-tit">{getMessage(type === 'move' ? 'modal.move.setting.info' : 'modal.copy.setting.info')}</div>
<div className="grid-option-wrap">
<div className="grid-option-box">
<div className="grid-input-form">
<span className="mr10">{getMessage('margin')}</span>
<div className="input-grid mr5">
<input type="text" className="input-origin" defaultValue={0} onClick={(e) => setLength(e.target.value)} />
</div>
<span>mm</span>
</div>
<div className="grid-direction">
<button
className={`direction up ${direction === '↑' ? 'act' : ''}`}
onClick={() => {
setDirection('↑')
}}
></button>
<button
className={`direction down ${direction === '↓' ? 'act' : ''}`}
onClick={() => {
setDirection('↓')
}}
></button>
<button
className={`direction left ${direction === '←' ? 'act' : ''}`}
onClick={() => {
setDirection('←')
}}
></button>
<button
className={`direction right ${direction === '→' ? 'act' : ''}`}
onClick={() => {
setDirection('→')
}}
></button>
</div>
</div>
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal mr5" onClick={handleApply}>
{getMessage('modal.common.save')}
</button>
</div>
</div>
</div>
</WithDraggable>
)
}

View File

@ -0,0 +1,95 @@
import WithDraggable from '@/components/common/draggable/WithDraggable'
import { useRecoilValue } from 'recoil'
import { contextPopupPositionState } from '@/store/popupAtom'
import { usePopup } from '@/hooks/usePopup'
import { useMessage } from '@/hooks/useMessage'
import { useState } from 'react'
import Image from 'next/image'
export default function ColumnInsert(props) {
const contextPopupPosition = useRecoilValue(contextPopupPositionState)
const { id, pos = contextPopupPosition, apply } = props
const { closePopup } = usePopup()
const [selectedType, setSelectedType] = useState(1)
const { getMessage } = useMessage()
const handleApply = () => {
if (apply) apply()
closePopup(id)
}
const HandleRadioChange = (e) => {
setSelectedType(Number(e.target.value))
}
return (
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap r`}>
<div className="modal-head">
<h1 className="title">{getMessage('modal.panel.column.insert')} </h1>
<button className="modal-close" onClick={() => closePopup(id)}>
닫기
</button>
</div>
<div className="modal-body">
<div className="properties-setting-wrap">
<div className="setting-tit">{getMessage('modal.panel.column.insert.info')}</div>
<div className="additional-wrap">
<div className="additional-radio-wrap">
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra01" onChange={HandleRadioChange} value={1} checked={selectedType === 1} />
<label htmlFor="ra01">{getMessage('modal.panel.column.insert.type.left')}</label>
</div>
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra02" onChange={HandleRadioChange} value={2} checked={selectedType === 2} />
<label htmlFor="ra02">{getMessage('modal.panel.column.insert.type.right')}</label>
</div>
</div>
<div className="additional-img-wrap">
{selectedType === 1 && (
<Image
src="/static/images/canvas/additional-edit01.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
{selectedType === 2 && (
<Image
src="/static/images/canvas/additional-edit02.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
</div>
</div>
</div>
<div className="properties-setting-wrap">
<div className="setting-tit">{getMessage('legend')}</div>
<div className="module-table-box">
<div className="module-table-inner">
<div className="additional-color-wrap">
<div className="additional-color-box">
<span className="additional-color pink"></span>
<span className="normal-font">{getMessage('modal.panel.select.column')}</span>
</div>
<div className="additional-color-box">
<span className="additional-color white"></span>
<span className="normal-font">{getMessage('modal.panel.insert.column')}</span>
</div>
</div>
</div>
</div>
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal act" onClick={handleApply}>
{getMessage('modal.common.save')}
</button>
</div>
</div>
</div>
</WithDraggable>
)
}

View File

@ -0,0 +1,118 @@
import WithDraggable from '@/components/common/draggable/WithDraggable'
import { useRecoilValue } from 'recoil'
import { contextPopupPositionState } from '@/store/popupAtom'
import { usePopup } from '@/hooks/usePopup'
import { useMessage } from '@/hooks/useMessage'
import { useState } from 'react'
import Image from 'next/image'
export default function ColumnRemove(props) {
const contextPopupPosition = useRecoilValue(contextPopupPositionState)
const { id, pos = contextPopupPosition, apply } = props
const { closePopup } = usePopup()
const [selectedType, setSelectedType] = useState(1)
const { getMessage } = useMessage()
const types = [
{ name: getMessage('modal.panel.column.remove.type.left'), value: 1 },
{ name: getMessage('modal.panel.column.remove.type.right'), value: 2 },
{ name: getMessage('modal.panel.column.remove.type.side'), value: 3 },
{ name: getMessage('modal.panel.column.remove.type.none'), value: 4 },
]
const handleApply = () => {
if (apply) apply()
closePopup(id)
}
return (
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap r`}>
<div className="modal-head">
<h1 className="title">{getMessage('modal.panel.column.remove')} </h1>
<button className="modal-close" onClick={() => closePopup(id)}>
닫기
</button>
</div>
<div className="modal-body">
<div className="properties-setting-wrap">
<div className="setting-tit">{getMessage('modal.panel.column.remove.info')}</div>
<div className="additional-wrap">
<div className="additional-radio-wrap">
{types.map((type, index) => {
return (
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id={`ra0${index + 1}`}
onClick={(e) => setSelectedType(Number(e.target.value))}
value={type.value}
checked={selectedType === type.value}
/>
<label htmlFor={`ra0${index + 1}`}>{type.name}</label>
</div>
)
})}
</div>
<div className="additional-img-wrap">
{selectedType === 1 && (
<Image
src="/static/images/canvas/additional_del01.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
{selectedType === 2 && (
<Image
src="/static/images/canvas/additional_del02.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
{selectedType === 3 && (
<Image
src="/static/images/canvas/additional_del03.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
{selectedType === 4 && (
<Image
src="/static/images/canvas/additional_del04.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
</div>
</div>
</div>
<div className="properties-setting-wrap">
<div className="setting-tit">{getMessage('legend')}</div>
<div className="module-table-box">
<div className="module-table-inner">
<div className="additional-color-wrap">
<div className="additional-color-box">
<span className="additional-color pink"></span>
<span className="normal-font">{getMessage('modal.panel.select.column')}</span>
</div>
</div>
</div>
</div>
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal act" onClick={handleApply}>
{getMessage('modal.common.save')}
</button>
</div>
</div>
</div>
</WithDraggable>
)
}

View File

@ -0,0 +1,95 @@
import WithDraggable from '@/components/common/draggable/withDraggable'
import Image from 'next/image'
import { useState } from 'react'
import { useRecoilValue } from 'recoil'
import { contextPopupPositionState } from '@/store/popupAtom'
import { usePopup } from '@/hooks/usePopup'
import { useMessage } from '@/hooks/useMessage'
export default function RowInsert(props) {
const contextPopupPosition = useRecoilValue(contextPopupPositionState)
const { id, pos = contextPopupPosition, apply } = props
const { closePopup } = usePopup()
const [selectedType, setSelectedType] = useState(1)
const { getMessage } = useMessage()
const handleApply = () => {
if (apply) apply()
closePopup(id)
}
const HandleRadioChange = (e) => {
setSelectedType(Number(e.target.value))
}
return (
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap r`}>
<div className="modal-head">
<h1 className="title">{getMessage('modal.row.insert')} </h1>
<button className="modal-close" onClick={() => closePopup(id)}>
닫기
</button>
</div>
<div className="modal-body">
<div className="properties-setting-wrap">
<div className="setting-tit">{getMessage('modal.row.insert.info')}</div>
<div className="additional-wrap">
<div className="additional-radio-wrap">
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra01" onChange={HandleRadioChange} value={1} checked={selectedType === 1} />
<label htmlFor="ra01">{getMessage('modal.row.insert.type.up')}</label>
</div>
<div className="d-check-radio pop">
<input type="radio" name="radio01" id="ra02" onChange={HandleRadioChange} value={2} checked={selectedType === 2} />
<label htmlFor="ra02">{getMessage('modal.row.insert.type.down')}</label>
</div>
</div>
<div className="additional-img-wrap">
{selectedType === 1 && (
<Image
src="/static/images/canvas/additional_bundle-edit01.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
{selectedType === 2 && (
<Image
src="/static/images/canvas/additional_bundle-edit02.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
</div>
</div>
</div>
<div className="properties-setting-wrap">
<div className="setting-tit">{getMessage('legend')}</div>
<div className="module-table-box">
<div className="module-table-inner">
<div className="additional-color-wrap">
<div className="additional-color-box">
<span className="additional-color pink"></span>
<span className="normal-font">{getMessage('modal.panel.select.row')}</span>
</div>
<div className="additional-color-box">
<span className="additional-color white"></span>
<span className="normal-font">{getMessage('modal.panel.insert.row')}</span>
</div>
</div>
</div>
</div>
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal act" onClick={handleApply}>
{getMessage('modal.common.save')}
</button>
</div>
</div>
</div>
</WithDraggable>
)
}

View File

@ -0,0 +1,118 @@
import WithDraggable from '@/components/common/draggable/withDraggable'
import Image from 'next/image'
import { useState } from 'react'
import { useRecoilValue } from 'recoil'
import { contextPopupPositionState } from '@/store/popupAtom'
import { usePopup } from '@/hooks/usePopup'
import { useMessage } from '@/hooks/useMessage'
export default function RowRemove(props) {
const contextPopupPosition = useRecoilValue(contextPopupPositionState)
const { id, pos = contextPopupPosition, apply } = props
const { closePopup } = usePopup()
const [selectedType, setSelectedType] = useState(1)
const { getMessage } = useMessage()
const types = [
{ name: getMessage('modal.row.remove.type.up'), value: 1 },
{ name: getMessage('modal.row.remove.type.down'), value: 2 },
{ name: getMessage('modal.row.remove.type.side'), value: 3 },
{ name: getMessage('modal.row.remove.type.none'), value: 4 },
]
const handleApply = () => {
if (apply) apply()
closePopup(id)
}
return (
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap r`}>
<div className="modal-head">
<h1 className="title">{getMessage('modal.row.remove')}</h1>
<button className="modal-close" onClick={() => closePopup(id)}>
닫기
</button>
</div>
<div className="modal-body">
<div className="properties-setting-wrap">
<div className="setting-tit">{getMessage('modal.row.remove.info')}</div>
<div className="additional-wrap">
<div className="additional-radio-wrap">
{types.map((type, index) => {
return (
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id={`ra0${index + 1}`}
onClick={() => setSelectedType(Number(e.target.value))}
value={type.value}
checked={selectedType === type.value}
/>
<label htmlFor="ra01">{getMessage(type.name)}</label>
</div>
)
})}
</div>
<div className="additional-img-wrap">
{selectedType === 1 && (
<Image
src="/static/images/canvas/additional_bundle-del01.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
{selectedType === 2 && (
<Image
src="/static/images/canvas/additional_bundle-del02.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
{selectedType === 3 && (
<Image
src="/static/images/canvas/additional_bundle-del03.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
{selectedType === 4 && (
<Image
src="/static/images/canvas/additional_bundle-del04.svg"
alt="react"
width={0}
height={0}
style={{ width: 'auto', height: 'auto' }}
/>
)}
</div>
</div>
</div>
<div className="properties-setting-wrap">
<div className="setting-tit">{getMessage('legend')}</div>
<div className="module-table-box">
<div className="module-table-inner">
<div className="additional-color-wrap">
<div className="additional-color-box">
<span className="additional-color pink"></span>
<span className="normal-font">{getMessage('modal.panel.select.row')}</span>
</div>
</div>
</div>
</div>
</div>
<div className="grid-btn-wrap">
<button className="btn-frame modal act" onClick={handleApply}>
{getMessage('modal.common.save')}
</button>
</div>
</div>
</div>
</WithDraggable>
)
}

View File

@ -16,7 +16,7 @@ export default function SizeSetting(props) {
return (
<WithDraggable isShow={true} pos={pos}>
<div className={`modal-pop-wrap ssm`}>
<div className={`modal-pop-wrap ssm mount`}>
<div className="modal-head">
<h1 className="title">{getMessage('modal.size.setting')} </h1>
<button className="modal-close" onClick={() => closePopup(id)}>

View File

@ -6,9 +6,7 @@ export default function Shed({ shedWidth, setShedWidth, shedPitch, setShedPitch,
return (
<>
<div className="outline-form mb10">
<span className="mr10" style={{ width: '24px' }}>
{getMessage('slope')}
</span>
<span className="mr10">{getMessage('slope')}</span>
<div className="input-grid mr5" style={{ width: '100px' }}>
<input type="text" className="input-origin block" value={shedPitch} onChange={(e) => onlyNumberWithDotInputChange(e, setShedPitch)} />
</div>

View File

@ -16,7 +16,6 @@ import SizeSetting from '@/components/floor-plan/modal/object/SizeSetting'
import RoofMaterialSetting from '@/components/floor-plan/modal/object/RoofMaterialSetting'
import DormerOffset from '@/components/floor-plan/modal/object/DormerOffset'
import FontSetting from '@/components/common/font/FontSetting'
import DimensionLineSetting from '@/components/floor-plan/modal/dimensionLine/DimensionLineSetting'
import RoofAllocationSetting from '@/components/floor-plan/modal/roofAllocation/RoofAllocationSetting'
import LinePropertySetting from '@/components/floor-plan/modal/lineProperty/LinePropertySetting'
import FlowDirectionSetting from '@/components/floor-plan/modal/flowDirection/FlowDirectionSetting'
@ -26,6 +25,13 @@ import { useMessage } from '@/hooks/useMessage'
import { useCanvasEvent } from '@/hooks/useCanvasEvent'
import { contextMenuState } from '@/store/contextMenu'
import ImageSizeSetting from '@/components/floor-plan/modal/image/ImageSizeSetting'
import PanelEdit from '@/components/floor-plan/modal/module/PanelEdit'
import DimensionLineSetting from '@/components/floor-plan/modal/dimensionLine/DimensionLineSetting'
import ColumnRemove from '@/components/floor-plan/modal/module/column/ColumnRemove'
import ColumnInsert from '@/components/floor-plan/modal/module/column/ColumnInsert'
import RowRemove from '@/components/floor-plan/modal/module/row/RowRemove'
import RowInsert from '@/components/floor-plan/modal/module/row/RowInsert'
import CircuitNumberEdit from '@/components/floor-plan/modal/module/CircuitNumberEdit'
export function useContextMenu() {
const currentMenu = useRecoilValue(currentMenuState) // 현재 메뉴
@ -39,6 +45,8 @@ export function useContextMenu() {
const [gridColor, setGridColor] = useRecoilState(gridColorState)
const { deleteObject, moveObject, copyObject, editText, changeDimensionExtendLine } = useCommonUtils({})
const [qContextMenu, setQContextMenu] = useRecoilState(contextMenuState)
const [cell, setCell] = useState(null)
const [column, setColumn] = useState(null)
const { handleZoomClear } = useCanvasEvent()
const currentMenuSetting = () => {
@ -245,6 +253,7 @@ export function useContextMenu() {
useEffect(() => {
if (currentObject?.name) {
console.log(currentObject?.name)
switch (currentObject.name) {
case 'triangleDormer':
case 'pentagonDormer':
@ -486,6 +495,110 @@ export function useContextMenu() {
],
])
break
case 'panel':
setContextMenu([
[
{
id: 'remove',
name: getMessage('contextmenu.remove'),
},
{
id: 'move',
name: getMessage('contextmenu.move'),
component: <PanelEdit id={popupId} type={'move'} />,
},
{
id: 'copy',
name: getMessage('contextmenu.copy'),
component: <PanelEdit id={popupId} type={'copy'} />,
},
],
[
{
id: 'columnMove',
name: getMessage('contextmenu.column.move'),
component: <PanelEdit id={popupId} type={'move'} />,
},
{
id: 'columnCopy',
name: getMessage('contextmenu.column.copy'),
component: <PanelEdit id={popupId} type={'copy'} />,
},
{
id: 'columnRemove',
name: getMessage('contextmenu.column.remove'),
component: <ColumnRemove id={popupId} />,
},
{
id: 'columnInsert',
name: getMessage('contextmenu.column.insert'),
component: <ColumnInsert id={popupId} />,
},
],
[
{
id: 'rowMove',
name: getMessage('contextmenu.row.move'),
component: <PanelEdit id={popupId} type={'move'} />,
},
{
id: 'rowCopy',
name: getMessage('contextmenu.row.copy'),
component: <PanelEdit id={popupId} type={'copy'} />,
},
{
id: 'rowRemove',
name: getMessage('contextmenu.row.remove'),
component: <RowRemove id={popupId} />,
},
{
id: 'rowInsert',
name: getMessage('contextmenu.row.insert'),
component: <RowInsert id={popupId} />,
},
],
])
break
case 'module':
case 'dimensionLineText':
setContextMenu([
[
{
id: 'moduleVerticalCenterAlign',
name: getMessage('contextmenu.module.vertical.align'),
},
{
id: 'moduleHorizonCenterAlign',
name: getMessage('contextmenu.module.horizon.align'),
},
{
id: 'moduleLeftAlign',
name: getMessage('contextmenu.module.left.align'),
},
{
id: 'moduleRightAlign',
name: getMessage('contextmenu.module.right.align'),
},
{
id: 'moduleUpAlign',
name: getMessage('contextmenu.module.up.align'),
},
{
id: 'moduleDownAlign',
name: getMessage('contextmenu.module.down.align'),
},
{
id: 'moduleRemove',
name: getMessage('contextmenu.module.remove'),
},
{
id: 'moduleCircuitNumberEdit',
name: getMessage('contextmenu.module.circuit.number.edit'),
component: <CircuitNumberEdit id={popupId} />,
},
],
])
break
default:
currentMenuSetting()
}

View File

@ -284,6 +284,7 @@
"delete": "삭제(JA)",
"delete.all": "전체 삭제(JA)",
"refresh": "새로고침(JA)",
"margin": "間隔",
"contextmenu.roof.material.placement": "지붕재 배치(JA)",
"contextmenu.roof.material.edit": "지붕재 변경(JA)",
"contextmenu.roof.material.remove": "지붕재 삭제(JA)",
@ -302,24 +303,75 @@
"contextmenu.column.move": "열 이동(JA)",
"contextmenu.column.copy": "열 복사(JA)",
"contextmenu.column.remove": "コピー設定",
"contextmenu.column.insert": "열 삽입(JA)",
"modal.panel.column.remove": "コピー設定",
"modal.panel.column.remove.info": "削除列をどのようにしますか?",
"modal.panel.column.remove.type.left": "左に減らす",
"modal.panel.column.remove.type.right": "右に減らす",
"modal.panel.column.remove.type.side": "両側に減る",
"modal.panel.column.remove.type.none": "減らさない",
"modal.panel.select.column": "選択列",
"modal.panel.select.row": "選択段",
"modal.panel.insert.column": "挿入列",
"modal.panel.insert.row": "挿入段",
"modal.panel.column.insert": "列の挿入",
"modal.panel.column.insert.info": "挿入する方向を選択してください。",
"modal.panel.column.insert.type.left": "左挿入",
"modal.panel.column.insert.type.right": "右挿入",
"contextmenu.column.insert": "列の挿入",
"contextmenu.row.move": "단 이동(JA)",
"contextmenu.row.copy": "단 복사(JA)",
"contextmenu.row.remove": "단 삭제(JA)",
"contextmenu.row.insert": "단 삽입(JA)",
"contextmenu.row.remove": "ただし削除",
"modal.row.remove": "ただし削除",
"modal.row.remove.info": "削除列をどのようにしますか?",
"modal.row.remove.type.up": "上向きに減らす",
"modal.row.remove.type.down": "下向きに減らす",
"modal.row.remove.type.side": "両側に減らす",
"modal.row.remove.type.none": "減らさない",
"contextmenu.row.insert": "段挿入",
"modal.row.insert": "段挿入",
"modal.row.insert.info": "挿入する方向を選択してください。",
"modal.row.insert.type.up": "上部挿入",
"modal.row.insert.type.down": "下の挿入",
"modal.move.setting": "移動設定",
"modal.move.setting.info": "間隔を設定し、移動方向を選択します。",
"modal.copy.setting": "コピー設定",
"modal.copy.setting.info": "間隔を設定し、コピー方向を選択します。",
"modal.line.property.edit.info": "属性を変更する辺を選択してください。",
"modal.line.property.edit.selected": "選択した値",
"contextmenu.flow.direction.edit": "흐름 방향 변경(JA)",
"contextmenu.font.setting": "폰트 설정(JA)",
"contextmenu.grid.color.edit": "그리드 색 변경(JA)",
"contextmenu.dimension.auxiliary.line.edit": "치수 보조선 변경(JA)",
"contextmenu.display.edit": "표시 변경(JA)",
"contextmenu.display.edit": "表示の変更",
"modal.display.edit.info": "寸法線に表示する数値を入力してください",
"modal.display.edit.before.length": "既存の長さ",
"modal.display.edit.after.length": "変更の長さ",
"modal.display.edit.corner.valley": "コーナー・ゴールの場合",
"modal.display.edit.input.slope": "경사를 傾斜を着せてください。",
"modal.display.edit.input.slope.info": "傾き設定されている場合、入力した数値に傾き計算をした数値が表示されます。",
"modal.distance": "距離測定",
"modal.distance.dual.point": "2点間距離",
"modal.distance.horizon": "水平距離",
"modal.distance.vertical": "垂直距離",
"contextmenu.opening.offset": "개구 오프셋(JA)",
"contextmenu.remove": "삭제(JA)",
"contextmenu.remove.all": "전체 삭제(JA)",
"contextmenu.move": "이동(JA)",
"contextmenu.copy": "복사(JA)",
"contextmenu.edit": "편집(JA)",
"contextmenu.module.vertical.align": "모듈 세로 가운데 정렬(JA)",
"contextmenu.module.horizon.align": "모듈 가로 가운데 정렬(JA)",
"contextmenu.module.left.align": "모듈 왼쪽 정렬(JA)",
"contextmenu.module.right.align": "모듈 오른쪽 정렬(JA)",
"contextmenu.module.up.align": "모듈 위쪽 정렬(JA)",
"contextmenu.module.down.align": "모듈 아래쪽 정렬(JA)",
"contextmenu.module.remove": "모듈 일괄 삭제(JA)",
"contextmenu.module.move": "모듈 일괄 이동(JA)",
"contextmenu.module.copy": "모듈 일괄 복사(JA)",
"contextmenu.module.circuit.number.edit": "モジュール一括回路番号の変更",
"modal.module.circuit.number.edit": "モジュール一括回路番号の変更",
"modal.module.circuit.number.edit.info": "回路番号を入力してください。",
"modal.module.circuit.number": "回路番号",
"common.message.no.data": "No data",
"common.message.no.dataDown": "ダウンロードするデータがありません",
"common.message.noData": "表示するデータがありません",
@ -410,6 +462,7 @@
"common.input.file": "ファイルを読み込む",
"common.input.file.load": "ファイルの追加",
"common.require": "必須",
"common.ok": "確認",
"commons.west": "立つ",
"commons.east": "ドン",
"commons.south": "南",
@ -685,6 +738,7 @@
"shed": "片側の流れ",
"apply": "適用",
"module": "モジュール",
"legend": "凡例",
"has.sleeve": "袖あり",
"has.not.sleeve": "袖なし",
"jerkinhead.width": "半折先幅",

View File

@ -289,6 +289,7 @@
"delete": "삭제",
"delete.all": "전체 삭제",
"refresh": "새로고침",
"margin": "간격",
"contextmenu.roof.material.placement": "지붕재 배치",
"contextmenu.roof.material.edit": "지붕재 변경",
"contextmenu.roof.material.remove": "지붕재 삭제",
@ -307,11 +308,39 @@
"contextmenu.column.move": "열 이동",
"contextmenu.column.copy": "열 복사",
"contextmenu.column.remove": "열 삭제",
"modal.panel.column.remove": "열 삭제",
"modal.panel.column.remove.info": "삭제열을 어떻게 하시겠습니까?",
"modal.panel.column.remove.type.left": "왼쪽으로 줄이다",
"modal.panel.column.remove.type.right": "오른쪽으로 줄이다",
"modal.panel.column.remove.type.side": "양쪽으로 줄이다",
"modal.panel.column.remove.type.none": "줄이지 않는다",
"modal.panel.select.column": "선택 열",
"modal.panel.select.row": "선택 단",
"modal.panel.insert.column": "삽입 열",
"modal.panel.insert.row": "삽입 단",
"contextmenu.column.insert": "열 삽입",
"modal.panel.column.insert": "열 삽입",
"modal.panel.column.insert.info": "삽입할 방향을 선택해주세요.",
"modal.panel.column.insert.type.left": "왼쪽 삽입",
"modal.panel.column.insert.type.right": "오른쪽 삽입",
"contextmenu.row.move": "단 이동",
"contextmenu.row.copy": "단 복사",
"contextmenu.row.remove": "단 삭제",
"modal.row.remove": "단 삭제",
"modal.row.remove.info": "삭제 단을 어떻게 하시겠습니까?",
"modal.row.remove.type.up": "위족으로 줄이다",
"modal.row.remove.type.down": "아래쪽으로 줄이다",
"modal.row.remove.type.side": "양쪽으로 줄이다",
"modal.row.remove.type.none": "줄이지 않는다",
"contextmenu.row.insert": "단 삽입",
"modal.row.insert": "단 삽입",
"modal.row.insert.info": "삽입할 방향을 선택해주세요.",
"modal.row.insert.type.up": "위쪽 삽입",
"modal.row.insert.type.down": "아래쪽 삽입",
"modal.move.setting": "이동 설정",
"modal.move.setting.info": "간격을 설정하고 이동 방향을 선택하십시오.",
"modal.copy.setting": "복사 설정",
"modal.copy.setting.info": "간격을 설정하고 복사 방향을 선택하십시오.",
"modal.line.property.edit.info": "속성을 변경할 변을 선택해주세요.",
"modal.line.property.edit.selected": "선택한 값",
"contextmenu.flow.direction.edit": "흐름 방향 변경",
@ -319,12 +348,35 @@
"contextmenu.grid.color.edit": "그리드 색 변경",
"contextmenu.dimension.auxiliary.line.edit": "치수 보조선 변경",
"contextmenu.display.edit": "표시 변경",
"modal.display.edit.info": "치수선에 표시할 수치를 입력해 주세요.",
"modal.display.edit.before.length": "기존 길이",
"modal.display.edit.after.length": "변경 길이",
"modal.display.edit.corner.valley": "구석・골의 경우",
"modal.display.edit.input.slope": "경사를 입력해주세요.",
"modal.display.edit.input.slope.info": "경사 설정되어 있는 경우 입력한 수치에 경사 계산을 한 수치가 표시됩니다.",
"modal.distance": "거리 측정",
"modal.distance.dual.point": "두 점간 거리",
"modal.distance.horizon": "수평 거리",
"modal.distance.vertical": "수직 거리",
"contextmenu.opening.offset": "개구 오프셋",
"contextmenu.remove": "삭제",
"contextmenu.remove.all": "전체 삭제",
"contextmenu.move": "이동",
"contextmenu.copy": "복사",
"contextmenu.edit": "편집",
"contextmenu.module.vertical.align": "모듈 세로 가운데 정렬",
"contextmenu.module.horizon.align": "모듈 가로 가운데 정렬",
"contextmenu.module.left.align": "모듈 왼쪽 정렬",
"contextmenu.module.right.align": "모듈 오른쪽 정렬",
"contextmenu.module.up.align": "모듈 위쪽 정렬",
"contextmenu.module.down.align": "모듈 아래쪽 정렬",
"contextmenu.module.remove": "모듈 일괄 삭제",
"contextmenu.module.move": "모듈 일괄 이동",
"contextmenu.module.copy": "모듈 일괄 복사",
"contextmenu.module.circuit.number.edit": "모듈 일괄 회로 번호 변경",
"modal.module.circuit.number.edit": "모듈 일괄 회로 번호 변경",
"modal.module.circuit.number.edit.info": "회로 번호를 입력해주세요.",
"modal.module.circuit.number": "회로 번호",
"common.message.no.data": "No data",
"common.message.no.dataDown": "No data to download",
"common.message.noData": "No data to display",
@ -415,6 +467,7 @@
"common.input.file": "파일 불러오기",
"common.input.file.load": "불러오기",
"common.require": "필수",
"common.ok": "확인",
"commons.west": "서",
"commons.east": "동",
"commons.south": "남",
@ -690,6 +743,7 @@
"shed": "한쪽흐름",
"apply": "적용",
"module": "모듈",
"legend": "범례",
"has.sleeve": "소매 있음",
"has.not.sleeve": "소매 없음",
"jerkinhead.width": "반절처 폭",

View File

@ -23,7 +23,7 @@
left: 0;
display: block;
width: 100%;
height: 46.8px;
min-width: 1280px;
padding-bottom: 0;
background-color: #383838;
transition: padding .17s ease-in-out;
@ -34,6 +34,7 @@
align-items: center;
padding: 0 40px 0 20px;
background-color: #2C2C2C;
height: 46.8px;
z-index: 999;
.canvas-menu-list{
display: flex;
@ -55,11 +56,11 @@
transition: all .17s ease-in-out;
.menu-icon{
display: block;
width: 16px;
height: 16px;
width: 14px;
height: 14px;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
background-size: contain;
margin-right: 10px;
&.con00{background-image: url(/static/images/canvas/menu_icon00.svg);}
&.con01{background-image: url(/static/images/canvas/menu_icon01.svg);}
@ -85,6 +86,7 @@
.select-box{
width: 124px;
margin-right: 5px;
height: 30px;
> div{
width: 100%;
}
@ -329,6 +331,7 @@
background-color: #1C1C1C;
border-top: 1px solid #000;
width: 100%;
min-width: 1280px;
transition: all .17s ease-in-out;
z-index: 99;
&.active{
@ -444,6 +447,7 @@
top: 46px;
left: 0;
width: 100%;
min-width: 1280px;
height: 46px;
border-bottom: 1px solid #000;
background: #2C2C2C;
@ -1305,3 +1309,108 @@
background-size: 15px 15px;
}
}
@media screen and (max-width: 1800px) {
.canvas-menu-wrap{
.canvas-menu-inner{
.canvas-menu-list{
.canvas-menu-item button{
.menu-icon{
margin-right: 5px;
}
}
.canvas-menu-item{
button{
padding: 15px 15px;
font-size: 11px;
}
}
}
}
.canvas-depth2-wrap{
.canvas-depth2-inner{
.canvas-depth2-list{
.canvas-depth2-item{
button{
font-size: 11px;
}
}
}
}
}
}
}
@media screen and (max-width: 1600px) {
.canvas-menu-wrap{
.canvas-menu-inner{
.canvas-menu-list{
.canvas-menu-item button{
.menu-icon{
display: none;
}
}
}
}
}
.canvas-content{
.canvas-frame{
height: calc(100vh - 129.5px);
}
&.active{
.canvas-frame{
height: calc(100vh - 179.5px);
}
}
}
}
@media screen and (max-width: 1500px) {
.canvas-menu-wrap{
.canvas-menu-inner{
.canvas-menu-list{
.canvas-menu-item{
button{
padding: 15px 10px;
font-size: 10px;
}
}
}
.canvas-side-btn-wrap{
.btn-from{
gap: 3px;
}
.vertical-horizontal{
margin: 0 3px;
min-width: 150px;
}
.select-box{
width: 100px;
margin-right: 3px;
}
.size-control{
width: 90px;
margin: 0 3px;
}
}
}
}
.sub-header{
.sub-header-inner{
.sub-header-title{
font-size: 15px;
}
.sub-header-title-wrap{
.title-item{
a{
.icon{
width: 20px;
height: 20px;
}
}
}
}
}
}
}

View File

@ -29,7 +29,7 @@ header{
top: 0;
left: 0;
width: 100%;
min-width: 1600px;
min-width: 1280px;
height: 46px;
background-color: #1C1C1C;
border-bottom: 1px solid #000;
@ -231,3 +231,21 @@ footer{
}
}
}
@media screen and (max-width: 1500px) {
header{
.header-inner{
.header-right{
nav{
.nav-list{
.nav-item{
button{
font-size: 13px;
}
}
}
}
}
}
}
}

View File

@ -595,8 +595,9 @@
overflow-x: hidden;
.center-page-inner{
width: 100%;
max-width: 1720px;
max-width: 1760px;
margin: 0 auto;
padding: 10px 20px;
.center-page-tit{
font-size: 18px;
font-weight: 600;

View File

@ -488,6 +488,7 @@ $alert-color: #101010;
color: #101010;
background-color: #fff;
border-radius: 2px;
cursor: pointer;
transition: all .15s ease-in-out;
.img-edit{
width: 16px;

View File

@ -346,6 +346,11 @@ button{
font-size: 13px;
color: #fff;
height: 100%;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
.select-item-wrap{
position: absolute;

View File

@ -4,7 +4,7 @@ ul, li {padding: 0; margin: 0; list-style: none; }
body, td { line-height: normal;font-style: normal; font-variant: normal; font-size: 12px; color: #6b6b6b; }
table { margin-bottom: 150px; border-collapse: collapse; border-spacing: 0; }
#g_header h1 { height: 60px; line-height: 60px; padding-left: 28px; margin-top: 0; color: #fff; background: #424242;font-size: 24px; font-family:'Pretendard', , Sans-Serif;}
#g_body { padding: 0 30px; }
#g_body { padding: 0 30px 1px; }
.guide_table { width: 100%;border-top:1px solid #424242;table-layout: auto;}
.guide_table thead th { background: #f1f1f1; text-align: center; padding:20px 3px;border:1px solid #dadada;border-top:1px solid #424242;font-size:15px;font-weight: 600; font-family:'Pretendard', , Sans-Serif;}
.guide_table tbody td { padding:12px 3px; vertical-align: middle; border: solid 1px #dadada;text-align:left;font-size:13px; font-family:'Pretendard', , Sans-Serif;}