- onClickNav(0)}>
- onClickNav(1)}>
- onClickNav(2)}>
- onClickNav(3)}>
- onClickNav(4)}>
- onClickNav(5)}>
- onClickNav(6)}>
-
-
-
-
-
-
- 垂直水平モード
-
-
-
-
-
-
-
-
-
-
-
-
- 100%
-
-
-
-
-
-
-
+ {menuNumber !== 6 && menuNumber !== 5 && (
+ <>
+
+
+
+
+
+
+ {getMessage('plan.mode.vertical.horizontal')}
+
+
+
+
+
+
+
+
+
+
+
+
+ 100%
+
+
+
+
+
+
+
+ >
+ )}
+
+ {menuNumber === 5 && (
+ <>
+
+
+
+
+
+
+ >
+ )}
+ {menuNumber === 6 && (
+ <>
+
+
+
+
+ >
+ )}
-
- {menuNumber === 0 &&
}
- {menuNumber === 1 &&
}
+
{menuNumber === 2 && }
{menuNumber === 3 && }
{menuNumber === 4 && }
- {menuNumber === 5 && }
- {menuNumber === 6 && }
)
diff --git a/src/components/floor-plan/FloorPlan.jsx b/src/components/floor-plan/FloorPlan.jsx
index fecffea7..e7fe4225 100644
--- a/src/components/floor-plan/FloorPlan.jsx
+++ b/src/components/floor-plan/FloorPlan.jsx
@@ -1,9 +1,10 @@
'use client'
import CanvasMenu from '@/components/floor-plan/CanvasMenu'
-import CanvasLayout from '@/components/floor-plan/CanvasLayout'
import SettingModal01 from '@/components/floor-plan/modal/settoing01/SettingModal01'
import { useState } from 'react'
+import CanvasLayout from '@/components/floor-plan/CanvasLayout'
+import '@/styles/contents.scss'
export default function FloorPlan() {
const [modalOpen, setModalOpen] = useState('option')
diff --git a/src/components/floor-plan/MenuDepth01.jsx b/src/components/floor-plan/MenuDepth01.jsx
index 90ba4e60..ce4bd6a4 100644
--- a/src/components/floor-plan/MenuDepth01.jsx
+++ b/src/components/floor-plan/MenuDepth01.jsx
@@ -1,8 +1,10 @@
'use client'
import { ToggleonMouse } from '@/components/header/Header'
+import { useMessage } from '@/hooks/useMessage'
export default function MenuDepth01() {
+ const { getMessage } = useMessage()
return (
@@ -30,7 +32,7 @@ export default function MenuDepth01() {
- ToggleonMouse(e, 'add', 'ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'ul')}>
-
+
- ToggleonMouse(e, 'add', 'ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'ul')}>
diff --git a/src/components/floor-plan/modal/settoing01/FirstOption.jsx b/src/components/floor-plan/modal/settoing01/FirstOption.jsx
index e91f81ab..cddab6c0 100644
--- a/src/components/floor-plan/modal/settoing01/FirstOption.jsx
+++ b/src/components/floor-plan/modal/settoing01/FirstOption.jsx
@@ -1,9 +1,11 @@
import { useRecoilState } from 'recoil'
import { settingModalFirstOptionsState } from '@/store/settingAtom'
+import { useMessage } from '@/hooks/useMessage'
export default function FirstOption() {
const [settingsModalOptions, setSettingModalOptions] = useRecoilState(settingModalFirstOptionsState)
const { option1, option2 } = settingsModalOptions
+ const { getMessage } = useMessage()
const onClickOption = (option) => {
option.selected = !option.selected
@@ -13,23 +15,23 @@ export default function FirstOption() {
return (
<>
-
※図面に表示する項目をクリックすると適用されます。
+
{getMessage('modal.canvas.setting.first.option.info')}
{settingsModalOptions?.option1?.map((item) => (
))}
-
画面表示
+
{getMessage('modal.canvas.setting.first.option.display')}
{settingsModalOptions?.option2?.map((item) => (
))}
diff --git a/src/components/floor-plan/modal/settoing01/SettingModal01.jsx b/src/components/floor-plan/modal/settoing01/SettingModal01.jsx
index 5a79c795..6c9969d2 100644
--- a/src/components/floor-plan/modal/settoing01/SettingModal01.jsx
+++ b/src/components/floor-plan/modal/settoing01/SettingModal01.jsx
@@ -4,6 +4,7 @@ import { useState } from 'react'
import FirstOption from './FirstOption'
import WithDraggable from '@/components/common/draggable/withDraggable'
import SecondOption from '@/components/floor-plan/modal/settoing01/SecondOption'
+import { useMessage } from '@/hooks/useMessage'
export default function SettingModal01({ modalOpen, setModalOpen }) {
const [buttonAct, setButtonAct] = useState(1)
@@ -15,12 +16,13 @@ export default function SettingModal01({ modalOpen, setModalOpen }) {
setClose(false)
}, 180)
}
+ const { getMessage } = useMessage()
return (
-
Canvas設定
+
{getMessage('modal.canvas.setting')}
@@ -28,11 +30,11 @@ export default function SettingModal01({ modalOpen, setModalOpen }) {
{buttonAct === 1 &&
}
diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx
index 028ef6ed..f81a0ca7 100644
--- a/src/components/header/Header.jsx
+++ b/src/components/header/Header.jsx
@@ -2,6 +2,7 @@
import Link from 'next/link'
import QSelectBox from '@/components/common/select/QSelectBox'
import { usePathname } from 'next/navigation'
+import { useMessage } from '@/hooks/useMessage'
export const ToggleonMouse = (e, act, target) => {
const listWrap = e.target.closest(target)
@@ -19,6 +20,7 @@ export const ToggleonMouse = (e, act, target) => {
}
export default function Header() {
+ const { getMessage } = useMessage()
const pathName = usePathname()
if (pathName.includes('login') || pathName.includes('join')) {
return null
@@ -39,28 +41,28 @@ export default function Header() {
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'nav > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')}
>
-
ホームへ
+
{getMessage('header.menus.home')}
- ToggleonMouse(e, 'add', 'nav > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')}
>
-
+
- ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
- 新規物件登録
+ {getMessage('header.menus.management.stuff')}
- ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
- モノ/図面管理
+ {getMessage('header.menus.management.plan')}
@@ -69,28 +71,28 @@ export default function Header() {
onMouseEnter={(e) => ToggleonMouse(e, 'add', 'nav > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')}
>
-
+
- ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
- お知らせ
+ {getMessage('header.menus.community.notice')}
- ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
- FAQ
+ {getMessage('header.menus.community.faq')}
- ToggleonMouse(e, 'add', 'li > ul')}
onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')}
>
- 素材のダウンロード
+ {getMessage('header.menus.community.archive')}
@@ -102,13 +104,13 @@ export default function Header() {
-
+
-
+
diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx
index f8467027..cf427814 100644
--- a/src/components/management/Stuff.jsx
+++ b/src/components/management/Stuff.jsx
@@ -8,7 +8,7 @@ import { useMessage } from '@/hooks/useMessage'
import StuffQGrid from './StuffQGrid'
import { useRecoilValue } from 'recoil'
import { stuffSearchState } from '@/store/stuffAtom'
-import { queryStringFormatter } from '@/util/common-utils'
+import { queryStringFormatter, isEmptyArray } from '@/util/common-utils'
import dayjs from 'dayjs'
import isLeapYear from 'dayjs/plugin/isLeapYear' // 윤년 판단 플러그인
dayjs.extend(isLeapYear)
@@ -288,13 +288,13 @@ export default function Stuff() {
// let size
// let pageCount
- const apiUrl = `/api/object/v1.0/object?saleStoreId=201TES01&${queryStringFormatter(params)}`
+ const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(params)}`
await get({
url: apiUrl,
}).then((res) => {
- if (res.length > 0) {
- console.log('API결과:::::::', res)
+ if (!isEmptyArray(res)) {
+ console.log('화면진입API결과::', res)
setGridProps({ ...gridProps, gridData: res, count: res.length })
setGridCount(res.length)
}
@@ -308,11 +308,13 @@ export default function Stuff() {
if (stuffSearchParams?.code === 'E') {
console.log('조회 눌럿을때 ::::::::::::::', stuffSearchParams)
async function fetchData() {
- const apiUrl = `/api/object/v1.0/object?saleStoreId=201TES01&${queryStringFormatter(stuffSearchParams)}`
+ const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(stuffSearchParams)}`
await get({ url: apiUrl }).then((res) => {
console.log('API결과:::::::', res)
- setGridProps({ ...gridProps, gridData: res, count: res.length })
- setGridCount(res.length)
+ if (!isEmptyArray(res)) {
+ setGridProps({ ...gridProps, gridData: res, count: res.length })
+ setGridCount(res.length)
+ }
})
}
fetchData()
diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx
index ed15d729..0c0692c7 100644
--- a/src/components/management/StuffDetail.jsx
+++ b/src/components/management/StuffDetail.jsx
@@ -5,7 +5,7 @@ import { useRouter, useSearchParams } from 'next/navigation'
import { Input, RadioGroup, Radio, Button, Autocomplete, AutocompleteItem, Select, SelectItem, Checkbox, Textarea, button } from '@nextui-org/react'
import Link from 'next/link'
import { get } from '@/lib/Axios'
-import { queryStringFormatter } from '@/util/common-utils'
+import { queryStringFormatter, isEmptyArray } from '@/util/common-utils'
import dayjs from 'dayjs'
import { useForm } from 'react-hook-form'
export default function StuffDetail() {
@@ -29,10 +29,10 @@ export default function StuffDetail() {
windSpeed: '', //기준풍속
snowCover: '', //수직적설량
coldAreaChk: false, //한랭지대책시행
- surfaceType: '', //면조도구분(Ⅲ・Ⅳ / Ⅱ)
+ surfaceType: 'Ⅲ・Ⅳ', //면조도구분(Ⅲ・Ⅳ / Ⅱ)
saltAreaChk: false, //염해지역용아이템사용
installHeight: '', //설치높이
- powerConTerms: '', //계약조건
+ powerConTerms: '0', //계약조건(잉여 / 전량)
remark: '', //메모
tempFlag: 'T', //임시저장(1) 저장(0)
}
@@ -42,6 +42,9 @@ export default function StuffDetail() {
const form = { register, setValue, getValues, handleSubmit, resetField, control, watch }
+ const [prefCodeList, setPrefCodeList] = useState([]) //도도부현 코트 리스트
+ const [prefValue, setPrefValue] = useState('')
+
const [receiveUser, setReceiveUser] = useState('') //담당자
const [name2, setName2] = useState('') //물건명
const [name3, setName3] = useState('') //물건명후리가나
@@ -74,18 +77,21 @@ export default function StuffDetail() {
const [detailData, setDetailData] = useState({})
useEffect(() => {
+ get({ url: '/api/object/prefecture/list' }).then((res) => {
+ if (!isEmptyArray(res)) {
+ console.log('도도부현API 결과:::', res)
+ setPrefCodeList(res)
+ }
+ })
// console.log('상세화면진입:::::::::', searchParams.get('objectNo'))
- console.log('물건번호::::', objectNo)
+ // console.log('물건번호::::', objectNo)
if (objectNo) {
- // console.log('상세::', objectNo)
setEditMode('EDIT')
if (objectNo.substring(0, 1) === 'R') {
setIsFormValid(true)
}
- //일단 플랜번호 무조건 1로
- //API 호출
- get({ url: `/api/object/v1.0/object/${objectNo}/1` }).then((res) => {
+ get({ url: `/api/object/${objectNo}/detail` }).then((res) => {
if (res != null) {
// console.log('res:::::::', res)
setDetailData(res)
@@ -101,9 +107,7 @@ export default function StuffDetail() {
// 우편번호 숫자만 체크
const _zipNo = watch('zipNo')
useEffect(() => {
- console.log('실시간이니:::::', _zipNo)
if (_zipNo !== '' && _zipNo.length === 7 && !_zipNo.match(/\D/g)) {
- console.log('벨리통과했군')
setButtonValid(true)
} else {
setButtonValid(false)
@@ -167,26 +171,29 @@ export default function StuffDetail() {
setIsFormValid(Object.keys(errors).length === 0)
}
- // 우편번호 API
+ // 주소검색 API
const onSearchPostNumber = () => {
const params = {
zipcode: _zipNo,
}
get({ url: `https://zipcloud.ibsnet.co.jp/api/search?${queryStringFormatter(params)}` }).then((res) => {
- console.log('우편API RES::::::::', res)
//7830060
if (res.status === 200) {
- if (res.results?.length > 0) {
- // setAddress1(res.results[0].address1)
- // setAddress2(res.results[0].address2)
- // setAddress3(res.results[0].address3)
- // setPrefCode(res.results[0].prefcode)
- // prefId: '', //도도부현
+ console.log('res.results::', res.results)
+ if (res.results != null) {
+ console.log('res.results::', res.results)
+ // prefId: '', //도도부현
// address: '', //주소
+ console.log('prefcode::', res.results[0].prefcode)
+ console.log('address::', res.results[0].address2 + res.results[0].address3)
+ setPrefValue(res.results[0].prefcode)
form.setValue('prefId', res.results[0].prefcode)
form.setValue('address', res.results[0].address2 + res.results[0].address3)
} else {
alert('등록된 우편번호에서 주소를 찾을 수 없습니다. 다시 입력해주세요.')
+ form.setValue('prefId', '')
+ form.setValue('address', '')
+ setPrefValue('')
}
} else {
alert(res.message)
@@ -218,11 +225,18 @@ export default function StuffDetail() {
const _dispCompanyName = watch('dispCompanyName')
const _objectStatusId = watch('objectStatusId')
const _objectNameOmit = watch('objectNameOmit')
- const _zipno = watch('zipno')
+ const _zipNo = watch('zipNo')
+ const _prefId = watch('prefId')
+ const _address = watch('address')
+ const _coldAreaChk = watch('coldAreaChk')
console.log(_dispCompanyName)
console.log(_objectStatusId)
console.log(_objectNameOmit)
- console.log(_zipno)
+ console.log(_zipNo)
+ console.log(_prefId)
+ console.log('prefValue::', prefValue)
+ console.log(_address)
+ console.log('_coldAreaChk::', _coldAreaChk)
}
//필수값 안넣었을때
@@ -285,11 +299,87 @@ export default function StuffDetail() {
+
+
+
+
+
+
+
+
+ {' '}
+ cm
+ {
+ form.setValue('coldAreaChk', e)
+ }}
+ {...form.register('coldAreaChk')}
+ >
+ 한랭지대책시행
+
+
+
+
+
+
+
+
+ {
+ form.setValue('saltAreaChk', e)
+ }}
+ >
+ 염해지역용아이템사용
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
)) ||
상세:::::::::::
}
diff --git a/src/hooks/useEvent.js b/src/hooks/useEvent.js
new file mode 100644
index 00000000..2f32d044
--- /dev/null
+++ b/src/hooks/useEvent.js
@@ -0,0 +1,85 @@
+import { useEffect, useRef } from 'react'
+import { useRecoilValue } from 'recoil'
+import { canvasState, stepState } from '@/store/canvasAtom'
+
+export function useEvent() {
+ const canvas = useRecoilValue(canvasState)
+ const step = useRecoilValue(stepState)
+ const keyboardEventListeners = useRef([])
+
+ useEffect(() => {
+ if (!canvas) {
+ return
+ }
+ Object.keys(canvas.__eventListeners).forEach((key) => {
+ if (key.indexOf('mouse') > -1) {
+ canvas.off(key)
+ }
+ })
+ removeAllKeyboardEventListeners()
+ addEvent(step)
+ }, [step])
+
+ const addEvent = (step) => {
+ //default Event 추가
+ canvas?.on('mouse:move', defaultMouseMoveEvent)
+ addKeyboardEventListener('keydown', document, defaultKeyboardEvent)
+
+ if (step === 1) {
+ canvas?.on('mouse:down', (e) => {
+ canvas?.add(new fabric.Rect({ width: 100, height: 100, fill: 'red', left: e.pointer.x, top: e.pointer.y }))
+ })
+ addKeyboardEventListener('keydown', document, (e) => {
+ if (e.key === 'Escape') {
+ console.log(1111)
+ }
+ })
+ } else if (step === 2) {
+ canvas?.on('mouse:down', (e) => {
+ canvas?.add(new fabric.Circle({ radius: 50, fill: 'blue', left: e.pointer.x, top: e.pointer.y }))
+ })
+ addKeyboardEventListener('keydown', document, (e) => {
+ if (e.key === 'Escape') {
+ console.log(2222)
+ }
+ })
+ } else {
+ canvas?.on('mouse:down', (e) => {
+ canvas?.add(new fabric.Triangle({ width: 100, height: 100, fill: 'green', left: e.pointer.x, top: e.pointer.y }))
+ })
+ addKeyboardEventListener('keydown', document, (e) => {
+ if (e.key === 'Escape') {
+ console.log(333)
+ }
+ })
+ }
+ }
+
+ const defaultMouseMoveEvent = (e) => {
+ console.log('defaultMouseMoveEvent')
+ }
+
+ const defaultKeyboardEvent = (e) => {
+ if (e.key === 'Escape') {
+ console.log('defaultKeyboardEvent')
+ }
+ }
+
+ /**
+ * document 키보드 이벤트 임의로 직접 등록한 이벤트의 경우 remove가 안되기 때문에 이 함수를 통해서만 등록해야 함.
+ * @param eventType
+ * @param element
+ * @param handler
+ */
+ function addKeyboardEventListener(eventType, element, handler) {
+ element.addEventListener(eventType, handler)
+ keyboardEventListeners.current.push({ eventType, element, handler })
+ }
+
+ function removeAllKeyboardEventListeners() {
+ keyboardEventListeners.current.forEach(({ eventType, element, handler }) => {
+ element.removeEventListener(eventType, handler)
+ })
+ keyboardEventListeners.current.length = 0 // 배열 초기화
+ }
+}
diff --git a/src/hooks/useMessage.js b/src/hooks/useMessage.js
index bc2f7eef..f336f0b7 100644
--- a/src/hooks/useMessage.js
+++ b/src/hooks/useMessage.js
@@ -1,25 +1,27 @@
import { useRecoilValue } from 'recoil'
-import { globalLocaleState } from '@/store/localeAtom'
+import { appMessageStore } from '@/store/localeAtom'
-import KO from '@/locales/ko.json'
-import JA from '@/locales/ja.json'
+// import KO from '@/locales/ko.json'
+// import JA from '@/locales/ja.json'
const SESSION_STORAGE_MESSAGE_KEY = 'QCAST_MESSAGE_STORAGE'
export const useMessage = () => {
- const globalLocale = useRecoilValue(globalLocaleState)
+ // const globalLocale = useRecoilValue(globalLocaleState)
+ const appMessageState = useRecoilValue(appMessageStore)
const getMessage = (key, args = []) => {
- if (sessionStorage.getItem(SESSION_STORAGE_MESSAGE_KEY) === null) {
- if (globalLocale === 'ko') {
- setSessionMessage(JSON.stringify(KO))
- } else {
- setSessionMessage(JSON.stringify(JA))
- }
- }
+ // if (sessionStorage.getItem(SESSION_STORAGE_MESSAGE_KEY) === null) {
+ // if (globalLocale === 'ko') {
+ // setSessionMessage(JSON.stringify(KO))
+ // } else {
+ // setSessionMessage(JSON.stringify(JA))
+ // }
+ // }
- const sessionMessage = getSessionMessage()
- const message = sessionMessage[key] || key
+ // const sessionMessage = getSessionMessage()
+ // const message = sessionMessage[key] || key
+ const message = appMessageState[key] || key
return args.reduce((acc, arg, i) => {
return acc.replaceAll(`{${i}}`, arg)
diff --git a/src/locales/ja.json b/src/locales/ja.json
index 75f49389..50172c83 100644
--- a/src/locales/ja.json
+++ b/src/locales/ja.json
@@ -1,5 +1,70 @@
{
"hi": "こんにちは",
+ "welcome": "환영합니다. {0}님",
+ "header.menus.home": "ホームへv",
+ "header.menus.management": "物品及び図面管理",
+ "header.menus.management.stuff": "新規物件登録",
+ "header.menus.management.plan": "モノ/図面管理",
+ "header.menus.community": "コミュニティ",
+ "header.menus.community.notice": "お知らせ",
+ "header.menus.community.faq": "FAQ",
+ "header.menus.community.archive": "素材のダウンロード",
+ "header.logout": "ログアウト",
+ "header.go": "移動",
+ "header.online.warranty.system": "オンライン保証シ",
+ "header.stem": "ステム",
+ "plan.menu.plan.drawing": "도면작성",
+ "plan.menu.placement.surface.initial.setting": "配置面 初期設定",
+ "plan.menu.root.cover": "지붕덮개",
+ "plan.menu.root.cover.outline.drawing": "외벽선 그리기",
+ "modal.cover.outline.drawing": "외벽선 그리기",
+ "modal.cover.outline": "외벽선",
+ "modal.cover.outline.right.angle": "직각",
+ "modal.cover.outline2": "이구배",
+ "modal.cover.outline.angle": "각도",
+ "modal.cover.outline.diagonal": "대각선",
+ "modal.cover.outline.setting": "설정",
+ "modal.cover.outline.length": "길이",
+ "modal.cover.outline.arrow": "방향(화살표)",
+ "modal.cover.outline.fix": "외벽선 확정",
+ "plan.menu.root.cover.roof.setting": "屋根形状設定",
+ "plan.menu.root.cover.roof.edit": "지붕형상 편집",
+ "plan.menu.root.cover.sub.line": "補助線を描",
+ "plan.menu.placement.surface": "配置面",
+ "plan.menu.placement.surface.drawing": "배치면 그리기",
+ "plan.menu.placement.surface.surface": "면형상 배치",
+ "plan.menu.placement.surface.object": "오브젝트 배치",
+ "plan.menu.module.circuit.setting": "モジュール回路構成",
+ "plan.menu.module.circuit.setting.default": "기본 설정",
+ "plan.menu.module.circuit.setting.circuit.trestle.setting": "회로 및 가대 설정",
+ "plan.menu.estimate": "見積",
+ "plan.menu.estimate.roof.alloc": "屋根面の割り当て",
+ "plan.menu.estimate.save": "保存",
+ "plan.menu.estimate.reset": "初期化",
+ "plan.menu.estimate.copy": "コピー",
+ "plan.menu.simulation": "発展シミュレーション",
+ "plan.menu.simulation.excel": "Excel",
+ "plan.menu.simulation.pdf": "PDF",
+ "plan.mode.vertical.horizontal": "垂直水平モード",
+ "modal.canvas.setting": "Canvas設定",
+ "modal.canvas.setting.display": "ディスプレイ設定",
+ "modal.canvas.setting.font.plan": " フォントと図面サイズの設定",
+ "modal.canvas.setting.first.option.info": "※図面に表示する項目をクリックすると適用されます。",
+ "modal.canvas.setting.first.option.alloc": "할당표시",
+ "modal.canvas.setting.first.option.outline": "외벽선표시",
+ "modal.canvas.setting.first.option.plan": "도면표시",
+ "modal.canvas.setting.first.option.roof.line": "지붕선표시",
+ "modal.canvas.setting.first.option.grid": "그리드표시",
+ "modal.canvas.setting.first.option.circuit.num": "회로 번호 표시",
+ "modal.canvas.setting.first.option.word": "문자 표시",
+ "modal.canvas.setting.first.option.trestle": "가대 표시",
+ "modal.canvas.setting.first.option.flow": "흐름방향 표시",
+ "modal.canvas.setting.first.option.total": "집계표 표시",
+ "modal.canvas.setting.first.option.corridor.dimension": "복도치수 표시",
+ "modal.canvas.setting.first.option.display": "画面表示",
+ "modal.canvas.setting.first.option.border": "ボーダーのみ",
+ "modal.canvas.setting.first.option.line": "ラインハッチ",
+ "modal.canvas.setting.first.option.all": "All painted",
"common.message.no.data": "No data",
"common.message.no.dataDown": "ダウンロードするデータがありません",
"common.message.noData": "表示するデータがありません",
@@ -87,18 +152,14 @@
"common.message.writeToConfirm": "作成解除を実行しますか?",
"common.message.password.init.success": "パスワード [{0}] に初期化されました。",
"common.message.no.edit.save": "この文書は変更できません。",
-
"common.require": "필수",
-
"site.name": "Q.CAST III",
"site.sub_name": "태양광 발전 시스템 도면관리 사이트",
-
"login": "로그인",
- "login.init_password.btn": "비밀번호 초기화",
+ "login.init_password.btn": "비밀번호 초기화 ja",
"login.init_password.title": "비밀번호 초기화",
"login.init_password.sub_title": "비밀번호를 초기화할 아이디와 이메일 주소를 입력해 주세요.",
"login.init_password.complete_message": "비밀번호가 초기화 되었습니다. 초기화된 비밀번호는 아이디와 같습니다.",
-
"join.title": "Q.CAST3 로그인ID 발행 신청",
"join.sub1.title": "판매대리점 정보",
"join.sub1.comment": "※ 등록되는 리셀러의 회사 이름을 입력하십시오. (2차점은 「○○판매주식회사(2차점:××설비주식회사)」로 기입해 주세요.)",
@@ -140,7 +201,6 @@
"join.complete.contents": "※ 신청한 ID가 승인되면, 담당자 정보에 입력한 이메일 주소로 로그인 관련 안내 메일이 전송됩니다.",
"join.complete.email_comment": "담당자 이메일 주소",
"join.complete.email": "test@naver.com",
-
"stuff.gridHeader.lastEditDatetime": "갱신일시",
"stuff.gridHeader.objectNo": "물건번호",
"stuff.gridHeader.planTotCnt": "플랜 수",
diff --git a/src/locales/ko.json b/src/locales/ko.json
index 75ef871f..f519d872 100644
--- a/src/locales/ko.json
+++ b/src/locales/ko.json
@@ -1,5 +1,70 @@
{
"hi": "안녕하세요",
+ "welcome": "환영합니다. {0}님",
+ "header.menus.home": "Home",
+ "header.menus.management": "물건 및 도면 관리",
+ "header.menus.management.stuff": "신규 물건 등록",
+ "header.menus.management.plan": "사물/도면 관리",
+ "header.menus.community": "커뮤니티",
+ "header.menus.community.notice": "공지",
+ "header.menus.community.faq": "FAQ",
+ "header.menus.community.archive": "자료 다운로드",
+ "header.logout": "로그아웃",
+ "header.go": "이동",
+ "header.online.warranty.system": "온라인 보증 시스템",
+ "header.stem": "Stem",
+ "plan.menu.plan.drawing": "도면작성",
+ "plan.menu.placement.surface.initial.setting": "배치면 초기 설정",
+ "plan.menu.root.cover": "지붕덮개",
+ "plan.menu.root.cover.outline.drawing": "외벽선 그리기",
+ "modal.cover.outline.drawing": "외벽선 그리기",
+ "modal.cover.outline": "외벽선",
+ "modal.cover.outline.right.angle": "직각",
+ "modal.cover.outline2": "이구배",
+ "modal.cover.outline.angle": "각도",
+ "modal.cover.outline.diagonal": "대각선",
+ "modal.cover.outline.setting": "설정",
+ "modal.cover.outline.length": "길이",
+ "modal.cover.outline.arrow": "방향(화살표)",
+ "modal.cover.outline.fix": "외벽선 확정",
+ "plan.menu.root.cover.roof.setting": "지붕형상 설정",
+ "plan.menu.root.cover.roof.edit": "지붕형상 편집",
+ "plan.menu.root.cover.sub.line": "보조선 그리기",
+ "plan.menu.placement.surface": "배치면",
+ "plan.menu.placement.surface.drawing": "배치면 그리기",
+ "plan.menu.placement.surface.surface": "면형상 배치",
+ "plan.menu.placement.surface.object": "오브젝트 배치",
+ "plan.menu.module.circuit.setting": "모듈,회로 구성",
+ "plan.menu.module.circuit.setting.default": "기본 설정",
+ "plan.menu.module.circuit.setting.circuit.trestle.setting": "회로 및 가대 설정",
+ "plan.menu.estimate": "견적서",
+ "plan.menu.estimate.roof.alloc": "지붕면 할당",
+ "plan.menu.estimate.save": "저장",
+ "plan.menu.estimate.reset": "초기화",
+ "plan.menu.estimate.copy": "복사",
+ "plan.menu.simulation": "발전 시뮬레이션",
+ "plan.menu.simulation.excel": "Excel",
+ "plan.menu.simulation.pdf": "PDF",
+ "plan.mode.vertical.horizontal": "수직 수평 모드",
+ "modal.canvas.setting": "Canvas 설정",
+ "modal.canvas.setting.display": "디스플레이 설정",
+ "modal.canvas.setting.font.plan": "글꼴 및 도면 크기 설정",
+ "modal.canvas.setting.first.option.info": "※도면에 표시하는 항목을 클릭하면 적용됩니다.",
+ "modal.canvas.setting.first.option.alloc": "할당표시",
+ "modal.canvas.setting.first.option.outline": "외벽선표시",
+ "modal.canvas.setting.first.option.plan": "도면표시",
+ "modal.canvas.setting.first.option.roof.line": "지붕선표시",
+ "modal.canvas.setting.first.option.grid": "그리드표시",
+ "modal.canvas.setting.first.option.circuit.num": "회로 번호 표시",
+ "modal.canvas.setting.first.option.word": "문자 표시",
+ "modal.canvas.setting.first.option.trestle": "가대 표시",
+ "modal.canvas.setting.first.option.flow": "흐름방향 표시",
+ "modal.canvas.setting.first.option.total": "집계표 표시",
+ "modal.canvas.setting.first.option.corridor.dimension": "복도치수 표시",
+ "modal.canvas.setting.first.option.display": "화면 표시",
+ "modal.canvas.setting.first.option.border": "테두리만",
+ "modal.canvas.setting.first.option.line": "라인해치",
+ "modal.canvas.setting.first.option.all": "All painted",
"common.message.no.data": "No data",
"common.message.no.dataDown": "No data to download",
"common.message.noData": "No data to display",
@@ -87,18 +152,14 @@
"common.message.writeToConfirm": "작성 해제를 실행하시겠습니까?",
"common.message.password.init.success": "비밀번호 [{0}]로 초기화 되었습니다.",
"common.message.no.edit.save": "This document cannot be changed.",
-
"common.require": "필수",
-
"site.name": "Q.CAST III",
"site.sub_name": "태양광 발전 시스템 도면관리 사이트",
-
"login": "로그인",
"login.init_password.btn": "비밀번호 초기화",
"login.init_password.title": "비밀번호 초기화",
"login.init_password.sub_title": "비밀번호를 초기화할 아이디와 이메일 주소를 입력해 주세요.",
"login.init_password.complete_message": "비밀번호가 초기화 되었습니다. 초기화된 비밀번호는 아이디와 같습니다.",
-
"join.title": "Q.CAST3 로그인ID 발행 신청",
"join.sub1.title": "판매대리점 정보",
"join.sub1.comment": "※ 등록되는 리셀러의 회사 이름을 입력하십시오. (2차점은 「○○판매주식회사(2차점:××설비주식회사)」로 기입해 주세요.)",
@@ -140,7 +201,6 @@
"join.complete.contents": "※ 신청한 ID가 승인되면, 담당자 정보에 입력한 이메일 주소로 로그인 관련 안내 메일이 전송됩니다.",
"join.complete.email_comment": "담당자 이메일 주소",
"join.complete.email": "test@naver.com",
-
"stuff.gridHeader.lastEditDatetime": "갱신일시",
"stuff.gridHeader.objectNo": "물건번호",
"stuff.gridHeader.planTotCnt": "플랜 수",
diff --git a/src/store/canvasAtom.js b/src/store/canvasAtom.js
index 44f29df5..4f274620 100644
--- a/src/store/canvasAtom.js
+++ b/src/store/canvasAtom.js
@@ -29,8 +29,8 @@ export const fontSizeState = atom({
export const canvasSizeState = atom({
key: 'canvasSize',
default: {
- vertical: 1500,
- horizontal: 1500,
+ vertical: 1000,
+ horizontal: 1600,
},
})
@@ -179,3 +179,8 @@ export const objectPlacementModeState = atom({
key: 'objectPlacementMode',
default: { width: 0, height: 0, areaBoundary: false, inputType: 'free', batchType: 'opening' },
})
+
+export const stepState = atom({
+ key: 'step',
+ default: 0,
+})
diff --git a/src/store/localeAtom.js b/src/store/localeAtom.js
index d82bcf7b..0f20fa87 100644
--- a/src/store/localeAtom.js
+++ b/src/store/localeAtom.js
@@ -1,6 +1,11 @@
import { atom } from 'recoil'
-export const globalLocaleState = atom({
+export const globalLocaleStore = atom({
key: 'globalLocaleState',
default: 'ko',
})
+
+export const appMessageStore = atom({
+ key: 'appMessageState',
+ default: {},
+})
diff --git a/src/store/settingAtom.js b/src/store/settingAtom.js
index 0ab99ea1..3f91f509 100644
--- a/src/store/settingAtom.js
+++ b/src/store/settingAtom.js
@@ -4,22 +4,22 @@ export const settingModalFirstOptionsState = atom({
key: 'settingModalFirstOptions',
default: {
option1: [
- { id: 1, name: '割り当て表示', selected: false },
- { id: 2, name: '実寸表示', selected: false },
- { id: 3, name: '図面表示', selected: false },
- { id: 4, name: '寸法表示なし', selected: false },
- { id: 5, name: 'グリッド表示', selected: false },
- { id: 6, name: '架台表示', selected: false },
- { id: 7, name: '文字表示', selected: false },
- { id: 8, name: '座標表示', selected: false },
- { id: 9, name: '流れ方向表示', selected: false },
- { id: 10, name: '図面切替表示', selected: false },
- { id: 11, name: 'ü廊下寸法表示', selected: false },
+ { id: 1, name: 'modal.canvas.setting.first.option.alloc', selected: false },
+ { id: 2, name: 'modal.canvas.setting.first.option.outline', selected: false },
+ { id: 3, name: 'modal.canvas.setting.first.option.plan', selected: false },
+ { id: 4, name: 'modal.canvas.setting.first.option.roof.line', selected: false },
+ { id: 5, name: 'modal.canvas.setting.first.option.grid', selected: false },
+ { id: 6, name: 'modal.canvas.setting.first.option.circuit.num', selected: false },
+ { id: 7, name: 'modal.canvas.setting.first.option.word', selected: false },
+ { id: 8, name: 'modal.canvas.setting.first.option.trestle', selected: false },
+ { id: 9, name: 'modal.canvas.setting.first.option.flow', selected: false },
+ { id: 10, name: 'modal.canvas.setting.first.option.total', selected: false },
+ { id: 11, name: 'modal.canvas.setting.first.option.corridor.dimension', selected: false },
],
option2: [
- { id: 1, name: 'ボーダーのみ', selected: false },
- { id: 2, name: 'ラインハッチ', selected: false },
- { id: 3, name: 'All painted', selected: false },
+ { id: 1, name: 'modal.canvas.setting.first.option.border', selected: false },
+ { id: 2, name: 'modal.canvas.setting.first.option.line', selected: false },
+ { id: 3, name: 'modal.canvas.setting.first.option.all', selected: false },
],
},
dangerouslyAllowMutability: true,
diff --git a/src/styles/_contents.scss b/src/styles/_contents.scss
index b9dbe68e..216df145 100644
--- a/src/styles/_contents.scss
+++ b/src/styles/_contents.scss
@@ -131,7 +131,7 @@
transition: all .17s ease-in-out;
&.btn01 {
- background-image: url(../../public/static/images/canvas/side_icon01.svg);
+ background-image: url(../../public/static/images/canvas/side_icon03.svg);
}
&.btn02 {
@@ -139,7 +139,7 @@
}
&.btn03 {
- background-image: url(../../public/static/images/canvas/side_icon03.svg);
+ background-image: url(../../public/static/images/canvas/side_icon01.svg);
}
&.btn04 {
@@ -176,6 +176,39 @@
}
}
+ .ico-btn-from {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+
+ button {
+ .ico {
+ display: block;
+ width: 14px;
+ height: 14px;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+
+ &.ico01 {
+ background-image: url(../../public/static/images/canvas/ico-flx01.svg);
+ }
+
+ &.ico02 {
+ background-image: url(../../public/static/images/canvas/ico-flx02.svg);
+ }
+
+ &.ico03 {
+ background-image: url(../../public/static/images/canvas/ico-flx03.svg);
+ }
+
+ &.ico04 {
+ background-image: url(../../public/static/images/canvas/ico-flx04.svg);
+ }
+ }
+ }
+ }
+
.vertical-horizontal {
display: flex;
min-width: 170px;
@@ -200,6 +233,13 @@
font-weight: 400;
color: #fff;
padding: 0 7.5px;
+ transition: all .17s ease-in-out;
+ }
+
+ &.on {
+ button {
+ background-color: #1083E3;
+ }
}
}
diff --git a/src/styles/_reset.scss b/src/styles/_reset.scss
index 7dc13a69..30289000 100644
--- a/src/styles/_reset.scss
+++ b/src/styles/_reset.scss
@@ -149,7 +149,7 @@ button {
// button
.btn-frame {
display: inline-block;
- padding: 0 10px;
+ padding: 0 9px;
height: 34px;
line-height: 34px;
border-radius: 2px;
@@ -201,6 +201,7 @@ button {
}
}
+ &:hover,
&.act {
background-color: #1083E3;
border: 1px solid #1083E3;
@@ -212,6 +213,20 @@ button {
display: block;
width: 100%;
}
+
+ &.ico-flx {
+ display: flex;
+ align-items: center;
+
+ .ico {
+ margin-right: 10px;
+ }
+
+ &:hover,
+ &.act {
+ font-weight: 400;
+ }
+ }
}
// select
@@ -293,6 +308,16 @@ button {
}
// input
+.form-input {
+ label {
+ display: block;
+ color: #aaa;
+ font-size: 12px;
+ font-weight: 500;
+ margin-bottom: 10px;
+ }
+}
+
input[type=text] {
&.input-origin {
display: inline-block;
@@ -305,9 +330,15 @@ input[type=text] {
font-weight: 500;
font-family: 'Pretendard', sans-serif;
padding: 0 10px;
+ letter-spacing: 0px;
&::placeholder {
font-size: 12px;
+ letter-spacing: 0px;
+ }
+
+ &.block {
+ width: 100%;
}
}
}
@@ -428,4 +459,24 @@ input[type=text] {
}
}
}
+
+ &.dark {
+ text-align: center;
+ background-color: #272727;
+ border: 1px solid #484848;
+
+ span {
+ color: #Fff;
+
+ &:after {
+ background: url(../../public/static/images/canvas/arr_btn_ico_white.svg) no-repeat center;
+ }
+ }
+
+ &:hover,
+ &.act {
+ background-color: #1083E3;
+ border: 1px solid #1083E3;
+ }
+ }
}
\ No newline at end of file
diff --git a/src/styles/common.scss b/src/styles/common.scss
index 8152784c..b9a87417 100644
--- a/src/styles/common.scss
+++ b/src/styles/common.scss
@@ -1,2 +1,3 @@
@import 'fonts.scss';
-@import 'reset.scss';
\ No newline at end of file
+@import 'reset.scss';
+@import '_layout.scss';
diff --git a/src/styles/contents.scss b/src/styles/contents.scss
new file mode 100644
index 00000000..90dfa532
--- /dev/null
+++ b/src/styles/contents.scss
@@ -0,0 +1,2 @@
+@import '_contents.scss';
+@import '_modal.scss';
\ No newline at end of file
diff --git a/src/util/common-utils.js b/src/util/common-utils.js
index 04f3dccf..1b7cd166 100644
--- a/src/util/common-utils.js
+++ b/src/util/common-utils.js
@@ -10,6 +10,14 @@ export const isObjectNotEmpty = (obj) => {
return Object.keys(obj).length > 0
}
+export const isNotEmptyArray = (array) => {
+ return Array.isArray(array) && array.length
+}
+
+export const isEmptyArray = (array) => {
+ return !isNotEmptyArray(array)
+}
+
/**
* ex) const params = {page:10, searchDvsnCd: 20}
* @param {*} params
diff --git a/yarn.lock b/yarn.lock
index 62434324..d77f654f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5515,11 +5515,6 @@ react-dom@^18:
loose-envify "^1.1.0"
scheduler "^0.23.2"
-react-hook-form@^7.53.0:
- version "7.53.0"
- resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.53.0.tgz#3cf70951bf41fa95207b34486203ebefbd3a05ab"
- integrity sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==
-
react-draggable@^4.4.6:
version "4.4.6"
resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.6.tgz#63343ee945770881ca1256a5b6fa5c9f5983fe1e"
@@ -5528,6 +5523,11 @@ react-draggable@^4.4.6:
clsx "^1.1.1"
prop-types "^15.8.1"
+react-hook-form@^7.53.0:
+ version "7.53.0"
+ resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.53.0.tgz#3cf70951bf41fa95207b34486203ebefbd3a05ab"
+ integrity sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==
+
react-icons@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.3.0.tgz#ccad07a30aebd40a89f8cfa7d82e466019203f1c"