diff --git a/public/static/images/canvas/additional-edit01.svg b/public/static/images/canvas/additional-edit01.svg new file mode 100644 index 00000000..2e8ce52c --- /dev/null +++ b/public/static/images/canvas/additional-edit01.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional-edit02.svg b/public/static/images/canvas/additional-edit02.svg new file mode 100644 index 00000000..5d3a03cd --- /dev/null +++ b/public/static/images/canvas/additional-edit02.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_bundle-del01.svg b/public/static/images/canvas/additional_bundle-del01.svg new file mode 100644 index 00000000..29ad58c0 --- /dev/null +++ b/public/static/images/canvas/additional_bundle-del01.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_bundle-del02.svg b/public/static/images/canvas/additional_bundle-del02.svg new file mode 100644 index 00000000..797adf82 --- /dev/null +++ b/public/static/images/canvas/additional_bundle-del02.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_bundle-del03.svg b/public/static/images/canvas/additional_bundle-del03.svg new file mode 100644 index 00000000..082cae56 --- /dev/null +++ b/public/static/images/canvas/additional_bundle-del03.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_bundle-del04.svg b/public/static/images/canvas/additional_bundle-del04.svg new file mode 100644 index 00000000..4f28a719 --- /dev/null +++ b/public/static/images/canvas/additional_bundle-del04.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_bundle-edit01.svg b/public/static/images/canvas/additional_bundle-edit01.svg new file mode 100644 index 00000000..38c3846c --- /dev/null +++ b/public/static/images/canvas/additional_bundle-edit01.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_bundle-edit02.svg b/public/static/images/canvas/additional_bundle-edit02.svg new file mode 100644 index 00000000..8b2c9f7b --- /dev/null +++ b/public/static/images/canvas/additional_bundle-edit02.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_del01.svg b/public/static/images/canvas/additional_del01.svg new file mode 100644 index 00000000..17e8cea0 --- /dev/null +++ b/public/static/images/canvas/additional_del01.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_del02.svg b/public/static/images/canvas/additional_del02.svg new file mode 100644 index 00000000..575dae2b --- /dev/null +++ b/public/static/images/canvas/additional_del02.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_del03.svg b/public/static/images/canvas/additional_del03.svg new file mode 100644 index 00000000..2d071afd --- /dev/null +++ b/public/static/images/canvas/additional_del03.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/additional_del04.svg b/public/static/images/canvas/additional_del04.svg new file mode 100644 index 00000000..b5dc6431 --- /dev/null +++ b/public/static/images/canvas/additional_del04.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab01.svg b/public/static/images/canvas/shape/180deg/plane_tab01.svg new file mode 100644 index 00000000..84c22986 --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab02.svg b/public/static/images/canvas/shape/180deg/plane_tab02.svg new file mode 100644 index 00000000..21cf9082 --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab03.svg b/public/static/images/canvas/shape/180deg/plane_tab03.svg new file mode 100644 index 00000000..46d3b5b2 --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab03.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab04.svg b/public/static/images/canvas/shape/180deg/plane_tab04.svg new file mode 100644 index 00000000..4b4ceafa --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab04.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab05.svg b/public/static/images/canvas/shape/180deg/plane_tab05.svg new file mode 100644 index 00000000..40d9d32b --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab06.svg b/public/static/images/canvas/shape/180deg/plane_tab06.svg new file mode 100644 index 00000000..8c3e8f6e --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab06.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab07.svg b/public/static/images/canvas/shape/180deg/plane_tab07.svg new file mode 100644 index 00000000..aef6908b --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab07.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab08.svg b/public/static/images/canvas/shape/180deg/plane_tab08.svg new file mode 100644 index 00000000..6d4b6949 --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab08.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab09.svg b/public/static/images/canvas/shape/180deg/plane_tab09.svg new file mode 100644 index 00000000..c135a87b --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab09.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab10.svg b/public/static/images/canvas/shape/180deg/plane_tab10.svg new file mode 100644 index 00000000..6a9ede6f --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab10.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab11.svg b/public/static/images/canvas/shape/180deg/plane_tab11.svg new file mode 100644 index 00000000..a84d6796 --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab12.svg b/public/static/images/canvas/shape/180deg/plane_tab12.svg new file mode 100644 index 00000000..15e01d3a --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab13.svg b/public/static/images/canvas/shape/180deg/plane_tab13.svg new file mode 100644 index 00000000..48d8f87e --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab14.svg b/public/static/images/canvas/shape/180deg/plane_tab14.svg new file mode 100644 index 00000000..e94c8459 --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab14.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab15.svg b/public/static/images/canvas/shape/180deg/plane_tab15.svg new file mode 100644 index 00000000..cc6f56f2 --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab15.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab16.svg b/public/static/images/canvas/shape/180deg/plane_tab16.svg new file mode 100644 index 00000000..42d6ad2e --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab16.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab17.svg b/public/static/images/canvas/shape/180deg/plane_tab17.svg new file mode 100644 index 00000000..741f65d4 --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab17.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/180deg/plane_tab18.svg b/public/static/images/canvas/shape/180deg/plane_tab18.svg new file mode 100644 index 00000000..c59192ca --- /dev/null +++ b/public/static/images/canvas/shape/180deg/plane_tab18.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab01.svg b/public/static/images/canvas/shape/270deg/plane_tab01.svg new file mode 100644 index 00000000..22b32884 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab02.svg b/public/static/images/canvas/shape/270deg/plane_tab02.svg new file mode 100644 index 00000000..105cf6f1 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab03.svg b/public/static/images/canvas/shape/270deg/plane_tab03.svg new file mode 100644 index 00000000..9f10a097 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab03.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab04.svg b/public/static/images/canvas/shape/270deg/plane_tab04.svg new file mode 100644 index 00000000..46d682bc --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab04.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab05.svg b/public/static/images/canvas/shape/270deg/plane_tab05.svg new file mode 100644 index 00000000..90be1d79 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab06.svg b/public/static/images/canvas/shape/270deg/plane_tab06.svg new file mode 100644 index 00000000..4ac8ec72 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab06.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab07.svg b/public/static/images/canvas/shape/270deg/plane_tab07.svg new file mode 100644 index 00000000..61ea3380 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab07.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab08.svg b/public/static/images/canvas/shape/270deg/plane_tab08.svg new file mode 100644 index 00000000..0d70143a --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab08.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab09.svg b/public/static/images/canvas/shape/270deg/plane_tab09.svg new file mode 100644 index 00000000..11af80b9 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab09.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab10.svg b/public/static/images/canvas/shape/270deg/plane_tab10.svg new file mode 100644 index 00000000..5b182179 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab10.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab11.svg b/public/static/images/canvas/shape/270deg/plane_tab11.svg new file mode 100644 index 00000000..b8f70b55 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab12.svg b/public/static/images/canvas/shape/270deg/plane_tab12.svg new file mode 100644 index 00000000..2a9d4ea6 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab13.svg b/public/static/images/canvas/shape/270deg/plane_tab13.svg new file mode 100644 index 00000000..3200c6cc --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab14.svg b/public/static/images/canvas/shape/270deg/plane_tab14.svg new file mode 100644 index 00000000..82fa8d99 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab14.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab15.svg b/public/static/images/canvas/shape/270deg/plane_tab15.svg new file mode 100644 index 00000000..eb47001c --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab15.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab16.svg b/public/static/images/canvas/shape/270deg/plane_tab16.svg new file mode 100644 index 00000000..ff7b570d --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab16.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab17.svg b/public/static/images/canvas/shape/270deg/plane_tab17.svg new file mode 100644 index 00000000..0ce3740a --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab17.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/270deg/plane_tab18.svg b/public/static/images/canvas/shape/270deg/plane_tab18.svg new file mode 100644 index 00000000..b0cbc443 --- /dev/null +++ b/public/static/images/canvas/shape/270deg/plane_tab18.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab01.svg b/public/static/images/canvas/shape/90deg/plane_tab01.svg new file mode 100644 index 00000000..46476194 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab02.svg b/public/static/images/canvas/shape/90deg/plane_tab02.svg new file mode 100644 index 00000000..74d5a79c --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab03.svg b/public/static/images/canvas/shape/90deg/plane_tab03.svg new file mode 100644 index 00000000..8a1cf359 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab03.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab04.svg b/public/static/images/canvas/shape/90deg/plane_tab04.svg new file mode 100644 index 00000000..b06f007f --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab04.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab05.svg b/public/static/images/canvas/shape/90deg/plane_tab05.svg new file mode 100644 index 00000000..8f5be183 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab06.svg b/public/static/images/canvas/shape/90deg/plane_tab06.svg new file mode 100644 index 00000000..d269faab --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab06.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab07.svg b/public/static/images/canvas/shape/90deg/plane_tab07.svg new file mode 100644 index 00000000..998629bd --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab07.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab08.svg b/public/static/images/canvas/shape/90deg/plane_tab08.svg new file mode 100644 index 00000000..390997c4 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab08.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab09.svg b/public/static/images/canvas/shape/90deg/plane_tab09.svg new file mode 100644 index 00000000..bd4c9e53 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab09.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab10.svg b/public/static/images/canvas/shape/90deg/plane_tab10.svg new file mode 100644 index 00000000..40417b53 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab10.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab11.svg b/public/static/images/canvas/shape/90deg/plane_tab11.svg new file mode 100644 index 00000000..8bb5290a --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab12.svg b/public/static/images/canvas/shape/90deg/plane_tab12.svg new file mode 100644 index 00000000..bece8e29 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab13.svg b/public/static/images/canvas/shape/90deg/plane_tab13.svg new file mode 100644 index 00000000..bcb4307e --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab14.svg b/public/static/images/canvas/shape/90deg/plane_tab14.svg new file mode 100644 index 00000000..8d79bf02 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab14.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab15.svg b/public/static/images/canvas/shape/90deg/plane_tab15.svg new file mode 100644 index 00000000..4beac542 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab15.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab16.svg b/public/static/images/canvas/shape/90deg/plane_tab16.svg new file mode 100644 index 00000000..ed0456df --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab16.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab17.svg b/public/static/images/canvas/shape/90deg/plane_tab17.svg new file mode 100644 index 00000000..3fdb6160 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab17.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/90deg/plane_tab18.svg b/public/static/images/canvas/shape/90deg/plane_tab18.svg new file mode 100644 index 00000000..2072da99 --- /dev/null +++ b/public/static/images/canvas/shape/90deg/plane_tab18.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab01.svg b/public/static/images/canvas/shape/normal/plane_tab01.svg new file mode 100644 index 00000000..121b7025 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab02.svg b/public/static/images/canvas/shape/normal/plane_tab02.svg new file mode 100644 index 00000000..61891248 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab03.svg b/public/static/images/canvas/shape/normal/plane_tab03.svg new file mode 100644 index 00000000..295e0d89 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab03.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab04.svg b/public/static/images/canvas/shape/normal/plane_tab04.svg new file mode 100644 index 00000000..894bb55c --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab04.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab05.svg b/public/static/images/canvas/shape/normal/plane_tab05.svg new file mode 100644 index 00000000..63b3c201 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab06.svg b/public/static/images/canvas/shape/normal/plane_tab06.svg new file mode 100644 index 00000000..1bad98a0 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab06.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab07.svg b/public/static/images/canvas/shape/normal/plane_tab07.svg new file mode 100644 index 00000000..a358f766 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab07.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab08.svg b/public/static/images/canvas/shape/normal/plane_tab08.svg new file mode 100644 index 00000000..22a72ab6 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab08.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab09.svg b/public/static/images/canvas/shape/normal/plane_tab09.svg new file mode 100644 index 00000000..756c3bfa --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab09.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab10.svg b/public/static/images/canvas/shape/normal/plane_tab10.svg new file mode 100644 index 00000000..fe4073ea --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab10.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab11.svg b/public/static/images/canvas/shape/normal/plane_tab11.svg new file mode 100644 index 00000000..0ac2cf59 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab12.svg b/public/static/images/canvas/shape/normal/plane_tab12.svg new file mode 100644 index 00000000..a68e7a39 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab13.svg b/public/static/images/canvas/shape/normal/plane_tab13.svg new file mode 100644 index 00000000..027e91e8 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab14.svg b/public/static/images/canvas/shape/normal/plane_tab14.svg new file mode 100644 index 00000000..7a3cef86 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab14.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab15.svg b/public/static/images/canvas/shape/normal/plane_tab15.svg new file mode 100644 index 00000000..c0c1b0bb --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab15.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab16.svg b/public/static/images/canvas/shape/normal/plane_tab16.svg new file mode 100644 index 00000000..c66484e3 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab16.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab17.svg b/public/static/images/canvas/shape/normal/plane_tab17.svg new file mode 100644 index 00000000..ae8ddd0f --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab17.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/normal/plane_tab18.svg b/public/static/images/canvas/shape/normal/plane_tab18.svg new file mode 100644 index 00000000..12bd0ad3 --- /dev/null +++ b/public/static/images/canvas/shape/normal/plane_tab18.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab01.svg b/public/static/images/canvas/shape/re_180deg/plane_tab01.svg new file mode 100644 index 00000000..aab78f30 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab02.svg b/public/static/images/canvas/shape/re_180deg/plane_tab02.svg new file mode 100644 index 00000000..53390298 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab03.svg b/public/static/images/canvas/shape/re_180deg/plane_tab03.svg new file mode 100644 index 00000000..1e054827 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab03.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab04.svg b/public/static/images/canvas/shape/re_180deg/plane_tab04.svg new file mode 100644 index 00000000..1144da35 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab04.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab05.svg b/public/static/images/canvas/shape/re_180deg/plane_tab05.svg new file mode 100644 index 00000000..14546582 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab06.svg b/public/static/images/canvas/shape/re_180deg/plane_tab06.svg new file mode 100644 index 00000000..0eb57a1f --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab06.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab07.svg b/public/static/images/canvas/shape/re_180deg/plane_tab07.svg new file mode 100644 index 00000000..978ec35a --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab07.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab08.svg b/public/static/images/canvas/shape/re_180deg/plane_tab08.svg new file mode 100644 index 00000000..1de4559c --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab08.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab09.svg b/public/static/images/canvas/shape/re_180deg/plane_tab09.svg new file mode 100644 index 00000000..1f985b96 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab09.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab10.svg b/public/static/images/canvas/shape/re_180deg/plane_tab10.svg new file mode 100644 index 00000000..b8c9f9f4 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab10.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab11.svg b/public/static/images/canvas/shape/re_180deg/plane_tab11.svg new file mode 100644 index 00000000..353359a2 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab12.svg b/public/static/images/canvas/shape/re_180deg/plane_tab12.svg new file mode 100644 index 00000000..50e211f2 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab13.svg b/public/static/images/canvas/shape/re_180deg/plane_tab13.svg new file mode 100644 index 00000000..de614d35 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab14.svg b/public/static/images/canvas/shape/re_180deg/plane_tab14.svg new file mode 100644 index 00000000..902506e5 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab14.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab15.svg b/public/static/images/canvas/shape/re_180deg/plane_tab15.svg new file mode 100644 index 00000000..81839b00 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab15.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab16.svg b/public/static/images/canvas/shape/re_180deg/plane_tab16.svg new file mode 100644 index 00000000..df7fe001 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab16.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab17.svg b/public/static/images/canvas/shape/re_180deg/plane_tab17.svg new file mode 100644 index 00000000..a684fd04 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab17.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_180deg/plane_tab18.svg b/public/static/images/canvas/shape/re_180deg/plane_tab18.svg new file mode 100644 index 00000000..a3259150 --- /dev/null +++ b/public/static/images/canvas/shape/re_180deg/plane_tab18.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab01.svg b/public/static/images/canvas/shape/re_270deg/plane_tab01.svg new file mode 100644 index 00000000..c225ea23 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab02.svg b/public/static/images/canvas/shape/re_270deg/plane_tab02.svg new file mode 100644 index 00000000..01b79908 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab03.svg b/public/static/images/canvas/shape/re_270deg/plane_tab03.svg new file mode 100644 index 00000000..dc0c23e7 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab03.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab04.svg b/public/static/images/canvas/shape/re_270deg/plane_tab04.svg new file mode 100644 index 00000000..5f61b284 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab04.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab05.svg b/public/static/images/canvas/shape/re_270deg/plane_tab05.svg new file mode 100644 index 00000000..d02eb0fb --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab06.svg b/public/static/images/canvas/shape/re_270deg/plane_tab06.svg new file mode 100644 index 00000000..d1ddabf5 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab06.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab07.svg b/public/static/images/canvas/shape/re_270deg/plane_tab07.svg new file mode 100644 index 00000000..bf213a02 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab07.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab08.svg b/public/static/images/canvas/shape/re_270deg/plane_tab08.svg new file mode 100644 index 00000000..cd9858e8 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab08.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab09.svg b/public/static/images/canvas/shape/re_270deg/plane_tab09.svg new file mode 100644 index 00000000..f82ee8cc --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab09.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab10.svg b/public/static/images/canvas/shape/re_270deg/plane_tab10.svg new file mode 100644 index 00000000..64444c46 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab10.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab11.svg b/public/static/images/canvas/shape/re_270deg/plane_tab11.svg new file mode 100644 index 00000000..bbd8fb3a --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab12.svg b/public/static/images/canvas/shape/re_270deg/plane_tab12.svg new file mode 100644 index 00000000..77321b0c --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab13.svg b/public/static/images/canvas/shape/re_270deg/plane_tab13.svg new file mode 100644 index 00000000..9e0fd3bb --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab14.svg b/public/static/images/canvas/shape/re_270deg/plane_tab14.svg new file mode 100644 index 00000000..921db3d0 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab14.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab15.svg b/public/static/images/canvas/shape/re_270deg/plane_tab15.svg new file mode 100644 index 00000000..caaad067 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab15.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab16.svg b/public/static/images/canvas/shape/re_270deg/plane_tab16.svg new file mode 100644 index 00000000..4fb31cf5 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab16.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab17.svg b/public/static/images/canvas/shape/re_270deg/plane_tab17.svg new file mode 100644 index 00000000..56465c10 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab17.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_270deg/plane_tab18.svg b/public/static/images/canvas/shape/re_270deg/plane_tab18.svg new file mode 100644 index 00000000..83868560 --- /dev/null +++ b/public/static/images/canvas/shape/re_270deg/plane_tab18.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab01.svg b/public/static/images/canvas/shape/re_90deg/plane_tab01.svg new file mode 100644 index 00000000..36c1d46b --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab02.svg b/public/static/images/canvas/shape/re_90deg/plane_tab02.svg new file mode 100644 index 00000000..74d5a79c --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab03.svg b/public/static/images/canvas/shape/re_90deg/plane_tab03.svg new file mode 100644 index 00000000..7db0ea6e --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab03.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab04.svg b/public/static/images/canvas/shape/re_90deg/plane_tab04.svg new file mode 100644 index 00000000..19194f44 --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab04.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab05.svg b/public/static/images/canvas/shape/re_90deg/plane_tab05.svg new file mode 100644 index 00000000..787b4dd2 --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab06.svg b/public/static/images/canvas/shape/re_90deg/plane_tab06.svg new file mode 100644 index 00000000..311178db --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab06.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab07.svg b/public/static/images/canvas/shape/re_90deg/plane_tab07.svg new file mode 100644 index 00000000..91d6dc11 --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab07.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab08.svg b/public/static/images/canvas/shape/re_90deg/plane_tab08.svg new file mode 100644 index 00000000..05cebb84 --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab08.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab09.svg b/public/static/images/canvas/shape/re_90deg/plane_tab09.svg new file mode 100644 index 00000000..917eb40e --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab09.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab10.svg b/public/static/images/canvas/shape/re_90deg/plane_tab10.svg new file mode 100644 index 00000000..964f6b05 --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab10.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab11.svg b/public/static/images/canvas/shape/re_90deg/plane_tab11.svg new file mode 100644 index 00000000..0e8112eb --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab12.svg b/public/static/images/canvas/shape/re_90deg/plane_tab12.svg new file mode 100644 index 00000000..6481f3fe --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab13.svg b/public/static/images/canvas/shape/re_90deg/plane_tab13.svg new file mode 100644 index 00000000..6c7a85fb --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab14.svg b/public/static/images/canvas/shape/re_90deg/plane_tab14.svg new file mode 100644 index 00000000..32f8d9a9 --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab14.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab15.svg b/public/static/images/canvas/shape/re_90deg/plane_tab15.svg new file mode 100644 index 00000000..07217d6c --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab15.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab16.svg b/public/static/images/canvas/shape/re_90deg/plane_tab16.svg new file mode 100644 index 00000000..b9c7230b --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab16.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab17.svg b/public/static/images/canvas/shape/re_90deg/plane_tab17.svg new file mode 100644 index 00000000..f36070a0 --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab17.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_90deg/plane_tab18.svg b/public/static/images/canvas/shape/re_90deg/plane_tab18.svg new file mode 100644 index 00000000..33bc4549 --- /dev/null +++ b/public/static/images/canvas/shape/re_90deg/plane_tab18.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab01.svg b/public/static/images/canvas/shape/re_normal/plane_tab01.svg new file mode 100644 index 00000000..8fc73ac0 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab01.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab02.svg b/public/static/images/canvas/shape/re_normal/plane_tab02.svg new file mode 100644 index 00000000..61891248 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab03.svg b/public/static/images/canvas/shape/re_normal/plane_tab03.svg new file mode 100644 index 00000000..c6a52c40 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab03.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab04.svg b/public/static/images/canvas/shape/re_normal/plane_tab04.svg new file mode 100644 index 00000000..71f194d0 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab04.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab05.svg b/public/static/images/canvas/shape/re_normal/plane_tab05.svg new file mode 100644 index 00000000..8abc166e --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab05.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab06.svg b/public/static/images/canvas/shape/re_normal/plane_tab06.svg new file mode 100644 index 00000000..6aca72a5 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab06.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab07.svg b/public/static/images/canvas/shape/re_normal/plane_tab07.svg new file mode 100644 index 00000000..577ae1b1 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab07.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab08.svg b/public/static/images/canvas/shape/re_normal/plane_tab08.svg new file mode 100644 index 00000000..d9f3f324 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab08.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab09.svg b/public/static/images/canvas/shape/re_normal/plane_tab09.svg new file mode 100644 index 00000000..94f2ea1c --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab09.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab10.svg b/public/static/images/canvas/shape/re_normal/plane_tab10.svg new file mode 100644 index 00000000..0b051e22 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab10.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab11.svg b/public/static/images/canvas/shape/re_normal/plane_tab11.svg new file mode 100644 index 00000000..64b6796d --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab12.svg b/public/static/images/canvas/shape/re_normal/plane_tab12.svg new file mode 100644 index 00000000..8885243b --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab12.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab13.svg b/public/static/images/canvas/shape/re_normal/plane_tab13.svg new file mode 100644 index 00000000..3537d722 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab13.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab14.svg b/public/static/images/canvas/shape/re_normal/plane_tab14.svg new file mode 100644 index 00000000..440f09d1 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab14.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab15.svg b/public/static/images/canvas/shape/re_normal/plane_tab15.svg new file mode 100644 index 00000000..ff005996 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab15.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab16.svg b/public/static/images/canvas/shape/re_normal/plane_tab16.svg new file mode 100644 index 00000000..4ac68a72 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab16.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab17.svg b/public/static/images/canvas/shape/re_normal/plane_tab17.svg new file mode 100644 index 00000000..81b89809 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab17.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/images/canvas/shape/re_normal/plane_tab18.svg b/public/static/images/canvas/shape/re_normal/plane_tab18.svg new file mode 100644 index 00000000..34d44490 --- /dev/null +++ b/public/static/images/canvas/shape/re_normal/plane_tab18.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/static/images/main/login_email.svg b/public/static/images/main/login_email.svg new file mode 100644 index 00000000..1ea1a274 --- /dev/null +++ b/public/static/images/main/login_email.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/static/images/sub/address_search.svg b/public/static/images/sub/address_search.svg new file mode 100644 index 00000000..4c0e2d1e --- /dev/null +++ b/public/static/images/sub/address_search.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/static/images/sub/attachment_ico.svg b/public/static/images/sub/attachment_ico.svg new file mode 100644 index 00000000..7e622a4e --- /dev/null +++ b/public/static/images/sub/attachment_ico.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/static/images/sub/click_check_ico.svg b/public/static/images/sub/click_check_ico.svg new file mode 100644 index 00000000..4fc2dae1 --- /dev/null +++ b/public/static/images/sub/click_check_ico.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/static/images/sub/information_help.svg b/public/static/images/sub/information_help.svg new file mode 100644 index 00000000..9eb16941 --- /dev/null +++ b/public/static/images/sub/information_help.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/static/images/sub/minus_btn.svg b/public/static/images/sub/minus_btn.svg new file mode 100644 index 00000000..e31ddaf9 --- /dev/null +++ b/public/static/images/sub/minus_btn.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/static/images/sub/plus_btn.svg b/public/static/images/sub/plus_btn.svg new file mode 100644 index 00000000..7f17a1f1 --- /dev/null +++ b/public/static/images/sub/plus_btn.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/app/layout.js b/src/app/layout.js index 6c04bbec..f7aafcd0 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -75,7 +75,7 @@ export default async function RootLayout({ children }) { {children} )} - + {/* */} diff --git a/src/common/common.js b/src/common/common.js index f9ca6fff..ae96db06 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -17,6 +17,7 @@ export const MENU = { SLOPE_SETTING: 'slopeSetting', // 경사 설정 BATCH_DRAWING: 'batchDrawing', // 배치면 그리기 SURFACE_SHAPE_BATCH: 'surfaceShapeBatch', // 면형상 배치 + SURFACE_SHAPE_BATCH_TEMP: 'surfaceShapeBatchTemp', // 면형상 배치 임시 OBJECT_BATCH: 'objectBatch', // 오브젝트 배치 ALL_REMOVE: 'allRemove', // 전체 삭제 DEFAULT: 'batchCanvasDefault', // default diff --git a/src/components/Main.jsx b/src/components/Main.jsx index 4546f32d..69c90071 100644 --- a/src/components/Main.jsx +++ b/src/components/Main.jsx @@ -1,9 +1,169 @@ '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 ( <> -

Main page

+ {(sessionState?.pwdInitYn !== 'N' && ( + <> +
+
+
+
+
+ {getMessage('main.storeId')}/ {getMessage('main.storeName')} +
+
+ +
+ {saleStoreId} / {saleStoreName} +
+
+
+
+
+ + +
+
+ + +
+
+
+ { + setSearchTxt(e.target.value) + }} + /> + +
+
+ +
+ + )) || ( + <> + + + )} ) } diff --git a/src/components/Playground.jsx b/src/components/Playground.jsx index dbae066f..5d54c858 100644 --- a/src/components/Playground.jsx +++ b/src/components/Playground.jsx @@ -11,14 +11,15 @@ import { useMessage } from '@/hooks/useMessage' import { convertDwgToPng } from '@/lib/cadAction' import { cadFileNameState, googleMapFileNameState, useCadFileState, useGoogleMapFileState } from '@/store/canvasAtom' -import QSelect from '@/components/ui/QSelect' import { Button } from '@nextui-org/react' import ColorPicker from './common/color-picker/ColorPicker' import { useSwal } from '@/hooks/useSwal' import styles from './playground.module.css' import Image from 'next/image' + import QInput from './common/input/Qinput' +import QSelect from './common/select/QSelect' export default function Playground() { const [useCadFile, setUseCadFile] = useRecoilState(useCadFileState) @@ -39,6 +40,7 @@ export default function Playground() { const [textInput, setTextInput] = useState('') const [radioInput, setRadioInput] = useState('') const [checkboxInput, setCheckboxInput] = useState([]) + const [selectedValue, setSelectedValue] = useState('') useEffect(() => { console.log('textInput:', textInput) }, [textInput]) @@ -48,6 +50,9 @@ export default function Playground() { useEffect(() => { console.log('checkboxInput:', checkboxInput) }, [checkboxInput]) + useEffect(() => { + console.log('selectedValue:', selectedValue) + }, [selectedValue]) const handleUsers = async () => { // const users = await get('/api/user/find-all') @@ -129,11 +134,28 @@ export default function Playground() { <>
이 영역은 테스트입니다.
-
- - +
+ + + +
+ +
+
- +
+ + + +
{testVar}
diff --git a/src/components/auth/Join.jsx b/src/components/auth/Join.jsx index 03fc8ecb..ae100e68 100644 --- a/src/components/auth/Join.jsx +++ b/src/components/auth/Join.jsx @@ -1,11 +1,12 @@ 'use client' -import { post } from '@/lib/Axios' +import { useAxios } from '@/hooks/useAxios' import { redirect } from 'next/navigation' import { useMessage } from '@/hooks/useMessage' export default function Join() { const { getMessage } = useMessage() + const { post } = useAxios() const joinProcess = async (formData) => { const param = { diff --git a/src/components/auth/NewLogin.jsx b/src/components/auth/NewLogin.jsx index 5b5bc83a..61c02abf 100644 --- a/src/components/auth/NewLogin.jsx +++ b/src/components/auth/NewLogin.jsx @@ -89,7 +89,7 @@ export default function NewLogin() { telNo: '336610', fax: null, email: 't10t@naver.com', - pwdInitYn: 'N', + pwdInitYn: 'Y', }) setSessionState({ @@ -105,7 +105,7 @@ export default function NewLogin() { telNo: '336610', fax: null, email: 't10t@naver.com', - pwdInitYn: 'N', + pwdInitYn: 'Y', }) // redirect('/') diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index 9654c514..a86e40af 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -1,5 +1,6 @@ 'use client' -import { Children, useEffect, useState } from 'react' +import { useEffect, useState } from 'react' +import '@/styles/contents.scss' export default function QContextMenu(props) { const { contextRef, canvasProps } = props @@ -7,7 +8,7 @@ export default function QContextMenu(props) { // const children = useRecoilValue(modalContent) const [contextMenu, setContextMenu] = useState({ visible: false, x: 0, y: 0 }) - const activeObject = canvasProps.getActiveObject() //액티브된 객체를 가져옴 + const activeObject = canvasProps?.getActiveObject() //액티브된 객체를 가져옴 let contextType = '' @@ -24,24 +25,25 @@ export default function QContextMenu(props) { if (!contextRef.current) return const handleContextMenu = (e) => { - e.preventDefault() //기존 contextmenu 막고 + // e.preventDefault() //기존 contextmenu 막고 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) => { - e.preventDefault() + // e.preventDefault() setContextMenu({ ...contextMenu, visible: false }) } const handleOutsideClick = (e) => { - e.preventDefault() + // e.preventDefault() if (contextMenu.visible && !ref.current.contains(e.target)) { setContextMenu({ ...contextMenu, visible: false }) } } - canvasProps.upperCanvasEl.addEventListener('contextmenu', handleContextMenu) + canvasProps?.upperCanvasEl.addEventListener('contextmenu', handleContextMenu) document.addEventListener('click', handleClick) document.addEventListener('click', handleOutsideClick) @@ -57,7 +59,7 @@ export default function QContextMenu(props) { lockMovementY: false, // Y 축 이동 잠금 }) - canvasProps.on('object:modified', function (e) { + canvasProps?.on('object:modified', function (e) { activeObject.set({ lockMovementX: true, // X 축 이동 잠금 lockMovementY: true, // Y 축 이동 잠금 @@ -89,19 +91,19 @@ export default function QContextMenu(props) { return ( <> {contextMenu.visible && ( -
-
    -
  • handleObjectMove()}> - 이동 -
  • -
  • handleObjectDelete()}> - 삭제 -
  • -
  • handleObjectCopy()}> - 복사 -
  • - {props.children} -
+
+ {/*
    */} + {/*
  • handleObjectMove()}>*/} + {/* 이동*/} + {/*
  • */} + {/*
  • handleObjectDelete()}>*/} + {/* 삭제*/} + {/*
  • */} + {/*
  • handleObjectCopy()}>*/} + {/* 복사*/} + {/*
  • */} + {/*
*/} + {props.children}
)} diff --git a/src/components/common/input/QInput.jsx b/src/components/common/input/QInput.jsx index 484d9859..39b8be08 100644 --- a/src/components/common/input/QInput.jsx +++ b/src/components/common/input/QInput.jsx @@ -1,6 +1,8 @@ 'use client' -export default function QInput({ type, readOnly = false, options, value, onChange }) { +import { useCallback } from 'react' + +export default function QInput({ type, readOnly = false, options = [], value, onChange }) { // options = options || [ // { // id: 'one', @@ -19,42 +21,48 @@ export default function QInput({ type, readOnly = false, options, value, onChang // }, // ] - const handleChange = (e, optionValue) => { - if (type === 'radio') { + const handleChange = useCallback( + (e, optionValue) => { + if (type === 'radio') { + onChange(e.target.value) + } else { + const newValue = value.includes(optionValue) ? value.filter((v) => v !== optionValue) : [...value, optionValue] + onChange(newValue) + } + }, + [type, value, onChange], + ) + + const handleTextChange = useCallback( + (e) => { onChange(e.target.value) - } else { - const newValue = value.includes(optionValue) ? value.filter((v) => v !== optionValue) : [...value, optionValue] - onChange(newValue) - } - } + }, + [onChange], + ) return ( -
-
-
- {type === 'text' ? ( -
- onChange(e.target.value)} /> -
- ) : type === 'radio' || type === 'checkbox' ? ( -
- {options?.map((option) => ( -
- handleChange(e, option.value)} - /> - -
- ))} -
- ) : null} + <> + {type === 'text' ? ( +
+
-
-
+ ) : type === 'radio' || type === 'checkbox' ? ( +
+ {options?.map((option) => ( +
+ handleChange(e, option.value)} + /> + +
+ ))} +
+ ) : null} + ) } diff --git a/src/components/common/select/QSelect.jsx b/src/components/common/select/QSelect.jsx new file mode 100644 index 00000000..acf0ac6b --- /dev/null +++ b/src/components/common/select/QSelect.jsx @@ -0,0 +1,34 @@ +'use client' + +import { useCallback } from 'react' + +export default function QSelect({ placeholder, options, disabled = false, dark = false, value, onChange }) { + // const options = [ + // { id: 's01', value: 'cat', name: '고양이' }, + // { id: 's02', value: 'dog', name: '개' }, + // { id: 's03', value: 'lion', name: '사자' }, + // { id: 's04', value: 'tiger', name: '호랑이' }, + // ] + + const handleChange = useCallback( + (e) => { + onChange(e.target.value) + }, + [onChange], + ) + + return ( + + ) +} diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index 9c8c9d38..3b823460 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -1,13 +1,19 @@ 'use client' -import { useEffect, useRef } from 'react' +import { useEffect, useRef, useState } from 'react' import { useCanvas } from '@/hooks/useCanvas' 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 }) { const canvasRef = useRef(null) const { canvas } = useCanvas('canvas') + const currentMenu = useRecoilValue(currentMenuState) + const [contextMenu, setContextMenu] = useState([[]]) useEvent() const loadCanvas = () => { @@ -25,9 +31,142 @@ export default function CanvasFrame({ plan }) { loadCanvas() }, [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 (
+ + {contextMenu.map((menus, index) => ( +
    + {menus.map((menu) => ( +
  • {menu.name}
  • + ))} +
+ ))} +
) } diff --git a/src/components/floor-plan/CanvasLayout.jsx b/src/components/floor-plan/CanvasLayout.jsx index 98f5f36d..7a3e9323 100644 --- a/src/components/floor-plan/CanvasLayout.jsx +++ b/src/components/floor-plan/CanvasLayout.jsx @@ -7,15 +7,15 @@ import { useMessage } from '@/hooks/useMessage' import { useSwal } from '@/hooks/useSwal' import { usePlan } from '@/hooks/usePlan' import { globalLocaleStore } from '@/store/localeAtom' -import { currentCanvasPlanState, initCanvasPlansState } from '@/store/canvasAtom' +import { currentCanvasPlanState, initCanvasPlansState, plansState } from '@/store/canvasAtom' import { sessionStore } from '@/store/commonAtom' export default function CanvasLayout() { const [objectNo, setObjectNo] = useState('test123240822001') // 이후 삭제 필요 - const [plans, setPlans] = useState([]) const [planNum, setPlanNum] = useState(0) const [currentCanvasPlan, setCurrentCanvasPlan] = useRecoilState(currentCanvasPlanState) const [initCanvasPlans, setInitCanvasPlans] = useRecoilState(initCanvasPlansState) + const [plans, setPlans] = useRecoilState(plansState) const globalLocaleState = useRecoilValue(globalLocaleStore) const sessionState = useRecoilValue(sessionStore) @@ -32,40 +32,25 @@ export default function CanvasLayout() { html: getMessage('common.message.confirm.save') + `
${currentCanvasPlan.name}`, type: 'confirm', confirmFn: async () => { - saveCanvas(sessionState.userId) - /** - * TODO: 신규 canvas plan 저장 시 id, name 등 데이터 동기화 필요 (40~51Line) - */ - initCanvasPlans.map((initPlan) => { - if ('isNew' in initPlan) { - // console.log('================ isNew initPlan: ', initPlan) - setPlans((plans) => - plans.map((plan) => { - initPlan.isNew === plan.id - ? { ...plan, id: initPlan.id, name: initPlan.name, canvasStatus: initPlan.canvasStatus, isCurrent: plan.id === newCurrentId } - : { ...plan, isCurrent: plan.id === newCurrentId } - }), - ) - } - }) + await saveCanvas(sessionState.userId) + updateCurrentPlan(newCurrentId) }, denyFn: () => { - setPlans((plans) => - plans.map((plan) => { - return { ...plan, isCurrent: plan.id === newCurrentId } - }), - ) + updateCurrentPlan(newCurrentId) }, }) } else { - setPlans((plans) => - plans.map((plan) => { - return { ...plan, isCurrent: plan.id === newCurrentId } - }), - ) + updateCurrentPlan(newCurrentId) } } } + const updateCurrentPlan = (newCurrentId) => { + setPlans((plans) => + plans.map((plan) => { + return { ...plan, isCurrent: plan.id === newCurrentId } + }), + ) + } useEffect(() => { setCurrentCanvasPlan(plans.find((plan) => plan.isCurrent) || null) }, [plans]) @@ -86,7 +71,7 @@ export default function CanvasLayout() { // console.error('[DELETE] canvas-statuses res error :::::::: %o', error) }) } else { - setPlans(plans.filter((plan) => plan.id !== id)) + setPlans((plans) => plans.filter((plan) => plan.id !== id)) swalFire({ text: getMessage('common.message.delete') }) } diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 485b536e..d8b7510c 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -37,13 +37,16 @@ export default function CanvasMenu(props) { setShowOutlineModal, setShowPlaceShapeModal, setShowSlopeSettingModal, + setShowPlacementSurfaceSettingModal, setShowPlaceShapeDrawingModal, setShowRoofShapeSettingModal, setShowObjectSettingModal, setShowRoofShapePassivitySettingModal, setShowAuxiliaryModal, setShowEavesGableEditModal, + setShowMovementModal, setShowWallLineOffsetSettingModal, + setShowRoofAllocationSettingModal, } = props const [menuNumber, setMenuNumber] = useState(null) @@ -92,9 +95,12 @@ export default function CanvasMenu(props) { setShowRoofShapePassivitySettingModal, setShowAuxiliaryModal, setShowEavesGableEditModal, + setShowMovementModal, setShowSlopeSettingModal, + setShowPlacementSurfaceSettingModal, setShowPlaceShapeDrawingModal, setShowWallLineOffsetSettingModal, + setShowRoofAllocationSettingModal, setShowObjectSettingModal, type, } @@ -123,6 +129,7 @@ export default function CanvasMenu(props) { setShowOutlineModal(false) setShowCanvasSettingModal(false) setShowEavesGableEditModal(false) + setShowMovementModal(false) setShowPlaceShapeModal(true) } diff --git a/src/components/floor-plan/FloorPlan.jsx b/src/components/floor-plan/FloorPlan.jsx index 070a8db7..2902fcf0 100644 --- a/src/components/floor-plan/FloorPlan.jsx +++ b/src/components/floor-plan/FloorPlan.jsx @@ -22,6 +22,10 @@ import AuxiliaryDrawing from '@/components/floor-plan/modal/auxiliary/AuxiliaryD import EavesGableEdit from '@/components/floor-plan/modal/eavesGable/EavesGableEdit' import WallLineOffsetSetting from '@/components/floor-plan/modal/wallLineOffset/WallLineOffsetSetting' import ObjectSetting from '@/components/floor-plan/modal/object/ObjectSetting' +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() { const [showCanvasSettingModal, setShowCanvasSettingModal] = useState(false) @@ -32,10 +36,13 @@ export default function FloorPlan() { const [showRoofShapePassivitySettingModal, setShowRoofShapePassivitySettingModal] = useState(false) const [showAuxiliaryModal, setShowAuxiliaryModal] = useState(false) const [showSlopeSettingModal, setShowSlopeSettingModal] = useState(false) + const [showPlacementSurfaceSettingModal, setShowPlacementSurfaceSettingModal] = useState(false) const [showPlaceShapeDrawingModal, setShowPlaceShapeDrawingModal] = useState(false) const [showObjectSettingModal, setShowObjectSettingModal] = useState(false) const [showEavesGableEditModal, setShowEavesGableEditModal] = useState(false) + const [showMovementModal, setShowMovementModal] = useState(false) const [showWallLineOffsetSettingModal, setShowWallLineOffsetSettingModal] = useState(false) + const [showRoofAllocationSettingModal, setShowRoofAllocationSettingModal] = useState(false) const globalLocaleState = useRecoilValue(globalLocaleStore) const { get } = useAxios(globalLocaleState) @@ -64,13 +71,16 @@ export default function FloorPlan() { setShowOutlineModal, setShowPlaceShapeModal, setShowSlopeSettingModal, + setShowPlacementSurfaceSettingModal, setShowPlaceShapeDrawingModal, setShowRoofShapeSettingModal, setShowObjectSettingModal, setShowRoofShapePassivitySettingModal, setShowAuxiliaryModal, setShowEavesGableEditModal, + setShowMovementModal, setShowWallLineOffsetSettingModal, + setShowRoofAllocationSettingModal, } useEffect(() => { @@ -129,15 +139,21 @@ export default function FloorPlan() { {showDotLineGridModal && } {showColorPickerModal && } {showPropertiesSettingModal && } + {showPlaceShapeModal && } {showRoofShapeSettingModal && } + {showRoofShapePassivitySettingModal && ( + + )} {showAuxiliaryModal && } {showSlopeSettingModal && } {showPlaceShapeDrawingModal && } {showEavesGableEditModal && } - {/**/} + {showMovementModal && } + {showRoofAllocationSettingModal && } {showWallLineOffsetSettingModal && } {showObjectSettingModal && } + {showPlacementSurfaceSettingModal && }
diff --git a/src/components/floor-plan/MenuDepth01.jsx b/src/components/floor-plan/MenuDepth01.jsx index 64ba320d..8cb10b38 100644 --- a/src/components/floor-plan/MenuDepth01.jsx +++ b/src/components/floor-plan/MenuDepth01.jsx @@ -15,9 +15,12 @@ export default function MenuDepth01(props) { setShowRoofShapePassivitySettingModal, setShowAuxiliaryModal, setShowEavesGableEditModal, + setShowMovementModal, setShowSlopeSettingModal, + setShowPlacementSurfaceSettingModal, setShowPlaceShapeDrawingModal, setShowWallLineOffsetSettingModal, + setShowRoofAllocationSettingModal, setShowObjectSettingModal, } = props const { getMessage } = useMessage() @@ -27,21 +30,32 @@ export default function MenuDepth01(props) { setActiveMenu(menu) setShowOutlineModal(menu === MENU.ROOF_COVERING.EXTERIOR_WALL_LINE) setCurrentMenu(menu) - + setShowPlaceShapeModal(false) if (type === 'outline') { - setShowPlaceShapeModal(false) setShowOutlineModal(id === 0) setShowRoofShapeSettingModal(id === 1) setShowRoofShapePassivitySettingModal(id === 2) setShowAuxiliaryModal(id === 3) setShowEavesGableEditModal(id === 4) + setShowMovementModal(id === 5) setShowWallLineOffsetSettingModal(id === 6) + setShowRoofAllocationSettingModal(id === 7) setShowPlaceShapeDrawingModal(false) } if (type === 'surface') { + setShowOutlineModal(false) + setShowRoofShapeSettingModal(false) + setShowRoofShapePassivitySettingModal(false) + setShowAuxiliaryModal(false) + setShowEavesGableEditModal(false) + setShowMovementModal(false) + setShowWallLineOffsetSettingModal(false) + setShowRoofAllocationSettingModal(false) + setShowSlopeSettingModal(id === 0) setShowPlaceShapeDrawingModal(id === 1) + setShowPlacementSurfaceSettingModal(id === 2) setShowObjectSettingModal(id === 3) } } diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryDrawing.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryDrawing.jsx index d2aa2c9f..1732f3f7 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliaryDrawing.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliaryDrawing.jsx @@ -1,6 +1,6 @@ import { useState } from 'react' import { useMessage } from '@/hooks/useMessage' -import WithDraggable from '@/components/common/draggable/withDraggable' +import WithDraggable from '@/components/common/draggable/WithDraggable' import RightAngle from '@/components/floor-plan/modal/lineTypes/RightAngle' import DoublePitch from '@/components/floor-plan/modal/lineTypes/DoublePitch' import Angle from '@/components/floor-plan/modal/lineTypes/Angle' diff --git a/src/components/floor-plan/modal/eavesGable/EavesGableEdit.jsx b/src/components/floor-plan/modal/eavesGable/EavesGableEdit.jsx index 8a8da385..1267fe98 100644 --- a/src/components/floor-plan/modal/eavesGable/EavesGableEdit.jsx +++ b/src/components/floor-plan/modal/eavesGable/EavesGableEdit.jsx @@ -1,5 +1,5 @@ import { useMessage } from '@/hooks/useMessage' -import WithDraggable from '@/components/common/draggable/withDraggable' +import WithDraggable from '@/components/common/draggable/WithDraggable' import { useState } from 'react' import Eaves from '@/components/floor-plan/modal/eavesGable/type/Eaves' import Gable from '@/components/floor-plan/modal/eavesGable/type/Gable' diff --git a/src/components/floor-plan/modal/movement/Movement.jsx b/src/components/floor-plan/modal/movement/MovementSetting.jsx similarity index 53% rename from src/components/floor-plan/modal/movement/Movement.jsx rename to src/components/floor-plan/modal/movement/MovementSetting.jsx index a8a7cde4..569249d6 100644 --- a/src/components/floor-plan/modal/movement/Movement.jsx +++ b/src/components/floor-plan/modal/movement/MovementSetting.jsx @@ -1,21 +1,25 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' 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 [buttonAct, setButtonAct] = useState(1) const buttonMenu = [ - { id: 1, name: '銅線の移動軒' }, - { id: 2, name: '型上げ・降り' }, + { id: 1, name: getMessage('modal.movement.flow.line.move') }, + { id: 2, name: getMessage('modal.movement.flow.line.updown') }, ] return (
-

軒・ケラバ変更

- +

{getMessage('plan.menu.roof.cover.movement.shape.updown')}

+
@@ -26,12 +30,12 @@ export default function Movement({}) { ))}
-
設定
- {/*{buttonAct === 1 && }*/} - {/*{buttonAct === 2 && }*/} +
{getMessage('setting')}
+ {buttonAct === 1 && } + {buttonAct === 2 && }
- +
diff --git a/src/components/floor-plan/modal/movement/type/FlowLine.jsx b/src/components/floor-plan/modal/movement/type/FlowLine.jsx new file mode 100644 index 00000000..d1bf8023 --- /dev/null +++ b/src/components/floor-plan/modal/movement/type/FlowLine.jsx @@ -0,0 +1,46 @@ +import { useMessage } from '@/hooks/useMessage' + +export default function FlowLine({}) { + const { getMessage } = useMessage() + + return ( + <> +
+
{getMessage('modal.movement.flow.line.info')}
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+
+ +
+ mm +
+
+
+
+
+ + ) +} diff --git a/src/components/floor-plan/modal/movement/type/Updown.jsx b/src/components/floor-plan/modal/movement/type/Updown.jsx new file mode 100644 index 00000000..2650ca4a --- /dev/null +++ b/src/components/floor-plan/modal/movement/type/Updown.jsx @@ -0,0 +1,46 @@ +import { useMessage } from '@/hooks/useMessage' + +export default function Updown({}) { + const { getMessage } = useMessage() + + return ( + <> +
+
{getMessage('modal.movement.flow.line.updown.info')}
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+
+ +
+ mm +
+
+
+
+
+ + ) +} diff --git a/src/components/floor-plan/modal/placementSurface/PlacementSurface.jsx b/src/components/floor-plan/modal/placementSurface/PlacementSurface.jsx new file mode 100644 index 00000000..d6d08675 --- /dev/null +++ b/src/components/floor-plan/modal/placementSurface/PlacementSurface.jsx @@ -0,0 +1,106 @@ +import Image from 'next/image' +import { useMessage } from '@/hooks/useMessage' +import { forwardRef, useState } from 'react' + +const PlacementSurface = forwardRef((props, refs) => { + const { getMessage } = useMessage() + const { id, lines, info, rotate, xInversion, yInversion } = props + let { length1, length2, length3, length4, length5, lengthetc, azimuth } = refs + + const [azimuthDirection, setAzimuthDirection] = useState(azimuth.current) + + const num = ['①', '②', '③', '④', '⑤'] + const getImageUrl = () => { + if (xInversion && !yInversion) { + return `/static/images/canvas/shape/re_${(rotate - 2) % 4 !== 0 ? Math.abs((rotate - 2) % 4) * 90 + 'deg' : 'normal'}/plane_tab${id < 10 ? '0' + id : id}.svg` + } + + if (!xInversion && yInversion) { + return `/static/images/canvas/shape/re_${rotate % 4 !== 0 ? Math.abs(rotate % 4) * 90 + 'deg' : 'normal'}/plane_tab${id < 10 ? '0' + id : id}.svg` + } + + if (xInversion && yInversion) { + return `/static/images/canvas/shape/${(rotate + 2) % 4 !== 0 ? Math.abs((rotate + 2) % 4) * 90 + 'deg' : 'normal'}/plane_tab${id < 10 ? '0' + id : id}.svg` + } + + if (rotate < 0) { + return `/static/images/canvas/shape/${rotate !== 0 ? Math.abs((rotate + 4) * 90) + 'deg' : 'normal'}/plane_tab${id < 10 ? '0' + id : id}.svg` + } + + return `/static/images/canvas/shape/${rotate !== 0 ? Math.abs(rotate * 90) + 'deg' : 'normal'}/plane_tab${id < 10 ? '0' + id : id}.svg` + } + + const azimuthButton = (direction, e) => { + setAzimuthDirection(direction) + azimuth.current = direction + } + + return ( + <> +
+
+

{getMessage('setting')}

+
+
+ react +
+
+
+ {lines?.map((line, index) => ( +
+
+ {line.isDiagonal ? getMessage('modal.placement.surface.setting.diagonal.length') : num[index]} +
+
+
+
+ +
+ mm +
+
+
+ ))} +
+
+
+
+
+

{getMessage('setting')}

+
+
+ {getMessage('commons.north')} + {getMessage('commons.east')} + {getMessage('commons.south')} + {getMessage('commons.west')} + + + + +
+
+
+
+ {info &&
{info}
} + + ) +}) + +export default PlacementSurface diff --git a/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx b/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx new file mode 100644 index 00000000..d2c3022a --- /dev/null +++ b/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx @@ -0,0 +1,273 @@ +import { useMessage } from '@/hooks/useMessage' +import WithDraggable from '@/components/common/draggable/WithDraggable' +import { useEffect, useState, useRef } from 'react' +import Image from 'next/image' +import PlacementSurface from '@/components/floor-plan/modal/placementSurface/PlacementSurface' +import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' + +export default function PlacementSurfaceSetting({ setShowPlacementSurfaceSettingModal }) { + const { getMessage } = useMessage() + + const [selectedType, setSelectedType] = useState() + const [rotate, setRotate] = useState(0) + const [xInversion, setXInversion] = useState(false) + const [yInversion, setYInversion] = useState(false) + + const { applySurfaceShape } = useSurfaceShapeBatch() + + const surfaceRefs = { + length1: useRef(null), + length2: useRef(null), + length3: useRef(null), + length4: useRef(null), + length5: useRef(null), + lengthetc: useRef(null), + azimuth: useRef('down'), + } + + /* type + * a: line 2 + * b: line 2 + diagonal 1 + * c: line 3 + * d: line 4 + * e: line 5 + * */ + const types = [ + { + id: 1, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { + isDiagonal: true, + value: 0, + }, + ], + info: getMessage('modal.placement.surface.setting.info'), + }, + { + id: 2, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 3, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 4, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 5, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 6, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + lineAmount: 3, + }, + { + id: 7, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 8, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 9, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 10, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 11, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 12, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 13, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 14, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 15, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 16, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 17, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + { + id: 18, + lines: [ + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + { isDiagonal: false, value: 0 }, + ], + }, + ] + const placementSurfaceProps = { + ...selectedType, + rotate, + xInversion, + yInversion, + } + + const getInversionState = () => { + return `${getScale()} ${getRotate()}` + } + + const getScale = () => { + return `scale(${yInversion ? -1 : 1}, ${xInversion ? -1 : 1})` + } + + const getRotate = () => { + return `rotate(${90 * rotate}deg)` + } + + const applySurfaces = () => { + surfaceRefs.xInversion = xInversion //좌우반전 + surfaceRefs.yInversion = yInversion //상하반전 + surfaceRefs.rotate = rotate * 90 //앵글 + applySurfaceShape(surfaceRefs, selectedType, setShowPlacementSurfaceSettingModal) + } + + useEffect(() => { + setSelectedType(types[0]) + }, []) + + return ( + +
+
+

{getMessage('plan.menu.placement.surface.arrangement')}

+ +
+
+
+ {types.map((type) => ( + + ))} +
+
+ + + +
+ +
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/roofAllocation/RoofAllocationSetting.jsx b/src/components/floor-plan/modal/roofAllocation/RoofAllocationSetting.jsx new file mode 100644 index 00000000..d42f7fb2 --- /dev/null +++ b/src/components/floor-plan/modal/roofAllocation/RoofAllocationSetting.jsx @@ -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 ( + +
+
+

{getMessage('plan.menu.estimate.roof.alloc')}

+ +
+
+
{getMessage('modal.roof.alloc.info')}
+
+ {getMessage('modal.roof.alloc.select.roof.material')} +
+ setSelectedRoofMaterial(e)} /> +
+ +
+
+ {values.map((value, index) => ( +
+
+ + +
+
+
+
+
+ +
+ {index === 0 && 基本屋根材} + {index !== 0 && } +
+
+
+ {value.type === 'A' ? ( + <> +
+ W +
+ +
+
+
+ L +
+ +
+
+
+ {getMessage('modal.placement.initial.setting.rafter')} +
+ +
+
+ + ) : value.type === 'B' ? ( + <> +
+ {getMessage('hajebichi')} +
+ +
+
+
+ {getMessage('modal.placement.initial.setting.rafter')} +
+ +
+
+ + ) : value.type === 'C' ? ( + <> +
+ {getMessage('hajebichi')} +
+ +
+
+ + ) : value.type === 'D' ? ( + <> +
+ L +
+ +
+
+
+ {getMessage('modal.placement.initial.setting.rafter')} +
+ +
+
+ + ) : ( + '' + )} +
+
+
+ + +
+
+
+
+ ))} +
+
+ +
+
+
+
+ ) +} diff --git a/src/components/floor-plan/modal/roofShape/RoofShapePassivitySetting.jsx b/src/components/floor-plan/modal/roofShape/RoofShapePassivitySetting.jsx index ccab2321..ebdc6bb9 100644 --- a/src/components/floor-plan/modal/roofShape/RoofShapePassivitySetting.jsx +++ b/src/components/floor-plan/modal/roofShape/RoofShapePassivitySetting.jsx @@ -25,7 +25,7 @@ export default function RoofShapePassivitySetting({ setShowRoofShapePassivitySet
{buttons.map((button) => ( - ))} diff --git a/src/components/floor-plan/modal/roofShape/passivity/Eaves.jsx b/src/components/floor-plan/modal/roofShape/passivity/Eaves.jsx index 963cfa63..22e15a34 100644 --- a/src/components/floor-plan/modal/roofShape/passivity/Eaves.jsx +++ b/src/components/floor-plan/modal/roofShape/passivity/Eaves.jsx @@ -22,24 +22,6 @@ export default function Eaves() {
mm
-
- - {getMessage('gable.offset')} - -
- -
- mm -
-
- - {getMessage('shed.width')} - -
- -
- mm -
) } diff --git a/src/components/main/ChangePasswordPop.jsx b/src/components/main/ChangePasswordPop.jsx new file mode 100644 index 00000000..45685c26 --- /dev/null +++ b/src/components/main/ChangePasswordPop.jsx @@ -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 ( +
+
+
+
+

{getMessage('main.popup.login.popupTitle')}

+
+
+
+
+
+
+
+
+
+ {getMessage('main.popup.login.newPassword1')} + * +
+
{getMessage('main.popup.login.placeholder')}
+
+
+
+
+ +
+
+
+
+
+
+
+ {getMessage('main.popup.login.newPassword2')} + * +
+
{getMessage('main.popup.login.placeholder')}
+
+
+
+
+ +
+
+
+
+
+
+ {getMessage('main.popup.login.guide1')} + {getMessage('main.popup.login.guide2')} +
+
+
+ + +
+
+
+
+
+ ) +} diff --git a/src/components/main/MainContents.jsx b/src/components/main/MainContents.jsx new file mode 100644 index 00000000..ba9a8d77 --- /dev/null +++ b/src/components/main/MainContents.jsx @@ -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 ( +
+
+ +
    + {objectList?.length > 0 ? ( + <> + {objectList.map((row) => { + return ( +
  • { + 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()}`) + } + }} + > +
    + {dayjs(row.lastEditDatetime).format('YYYY.MM.DD HH:mm:ss')} + {row.objectNo} + {row.objectName} + {row.saleStoreName} +
    +
  • + ) + })} + + ) : ( + <> +
  • +
    최근 갱신 물건이 없습니다
    +
  • + + )} +
+
+ +
+ {recentNoticeList.length > 0 ? ( + <> +
{dayjs(recentNoticeList[0]?.regDt).format('YYYY.MM.DD')}
+
{recentNoticeList[0]?.title}
+
{recentNoticeList[0]?.contents}
+ + ) : null} +
+
+
+
+ +
    + {recentFaqList.length > 0 ? ( + <> + {recentFaqList.map((row) => { + return ( +
  • +
    +
    FAQ {row.noticeNo}
    +
    {row.title}
    +
    {dayjs(row.regDt).format('YYYY.MM.DD')}
    +
    +
  • + ) + })} + + ) : null} +
+
+ +
+ + +
+
+ +
    +
  • +
    + react +
    +
    {businessCharger}
    +
  • +
  • +
    + react +
    +
    {businessChargerMail}
    +
  • +
+
+
+
+ ) +} diff --git a/src/components/main/ProductItem.jsx b/src/components/main/ProductItem.jsx new file mode 100644 index 00000000..928bc269 --- /dev/null +++ b/src/components/main/ProductItem.jsx @@ -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 ( +
+
+

+ + {name} +

+ {num !== 4 && num !== 5 && ( + + )} +
+
{children}
+
+ ) +} diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 4e899bb8..02f44561 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -278,6 +278,54 @@ export default function Stuff() { // 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({ + 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({ url: apiUrl, }).then((res) => { @@ -294,10 +342,10 @@ export default function Stuff() { useEffect(() => { if (stuffSearchParams?.code === 'E') { + //console.log('조회누름::::::::', stuffSearchParams) stuffSearchParams.startRow = (curPage - 1) * defaultSize + 1 stuffSearchParams.endRow = curPage * defaultSize stuffSearchParams.schSortType = defaultSortType - // console.log('조회누름::::::::', stuffSearchParams) async function fetchData() { // console.log('조회누름 세션정보:::::::::::::', sessionState) // const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(stuffSearchParams)}` @@ -378,6 +426,7 @@ export default function Stuff() { setAppMessageState(JA) } }, [globalLocaleState]) + return ( <> {/* 퍼블시작 */} diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 97de5079..21b84dd8 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -182,7 +182,7 @@ export default function StuffSearchCondition() { type="text" className="input-light" placeholder="물건번호 입력" - value={stuffSearch?.code === 'E' ? stuffSearch.schObjectNo : objectNo} + value={stuffSearch?.code === 'E' || stuffSearch?.code === 'M' ? stuffSearch.schObjectNo : objectNo} onChange={(e) => { setObjectNo(e.target.value) setStuffSearch({ ...stuffSearch, code: 'S', schObjectNo: e.target.value }) @@ -255,9 +255,6 @@ export default function StuffSearchCondition() { 판매대리점 선택 - {/*
- -
*/} {schSelSaleStoreList?.length > 0 && ( - {animals.map((animal) => ( - {animal.label} - ))} - -
-
test
- - ) -} diff --git a/src/hooks/roofcover/useEavesGableEdit.js b/src/hooks/roofcover/useEavesGableEdit.js index 49943c04..d2c69303 100644 --- a/src/hooks/roofcover/useEavesGableEdit.js +++ b/src/hooks/roofcover/useEavesGableEdit.js @@ -45,6 +45,7 @@ export function useEavesGableEdit() { addCanvasMouseEventListener('mouse:down', mouseDownEvent) return () => { + canvas.discardActiveObject() wallLines.forEach((wallLine) => { convertLinesToPolygon(wallLine) }) diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js new file mode 100644 index 00000000..b52781b6 --- /dev/null +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -0,0 +1,631 @@ +'use client' + +import { useEffect, useRef, useState } from 'react' +import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' +import { canvasState } from '@/store/canvasAtom' +import { MENU } from '@/common/common' +import { getIntersectionPoint } from '@/util/canvas-util' +import { degreesToRadians } from '@turf/turf' +import { QPolygon } from '@/components/fabric/QPolygon' +import { fabric } from 'fabric' +import { useSwal } from '@/hooks/useSwal' +import { useMessage } from '@/hooks/useMessage' + +export function useSurfaceShapeBatch() { + const { getMessage } = useMessage() + + const canvas = useRecoilValue(canvasState) + const { swalFire } = useSwal() + + const applySurfaceShape = (surfaceRefs, selectedType, setShowPlacementSurfaceSettingModal) => { + let length1, length2, length3, length4, length5 + const surfaceId = selectedType?.id + const azimuth = surfaceRefs.azimuth.current + + if (surfaceId === 1) { + length1 = surfaceRefs.length1.current.value + length2 = surfaceRefs.length2.current.value + length3 = surfaceRefs.lengthetc.current.value //대각선 + } else if ([2, 4].includes(surfaceId)) { + length1 = surfaceRefs.length1.current.value + length2 = surfaceRefs.length2.current.value + } else if ([3, 5, 6, 15, 18].includes(surfaceId)) { + length1 = surfaceRefs.length1.current.value + length2 = surfaceRefs.length2.current.value + length3 = surfaceRefs.length3.current.value + } else if ([8, 12, 13, 16, 17].includes(surfaceId)) { + length1 = surfaceRefs.length1.current.value + length2 = surfaceRefs.length2.current.value + length3 = surfaceRefs.length3.current.value + length4 = surfaceRefs.length4.current.value + } else if ([7, 9, 10, 11, 14].includes(surfaceId)) { + length1 = surfaceRefs.length1.current.value + length2 = surfaceRefs.length2.current.value + length3 = surfaceRefs.length3.current.value + length4 = surfaceRefs.length4.current.value + length5 = surfaceRefs.length5.current.value + } + + length1 = parseInt(length1 === undefined ? 0 : length1 / 10) + length2 = parseInt(length2 === undefined ? 0 : length2 / 10) + length3 = parseInt(length3 === undefined ? 0 : length3 / 10) + length4 = parseInt(length4 === undefined ? 0 : length4 / 10) + length5 = parseInt(length5 === undefined ? 0 : length5 / 10) + + let isDrawing = true + let obj = null + let points = [] + if (checkSurfaceShape(surfaceId, { length1, length2, length3, length4, length5 })) { + setShowPlacementSurfaceSettingModal(false) + canvas?.on('mouse:move', (e) => { + if (!isDrawing) { + return + } + const pointer = canvas?.getPointer(e.e) + canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === MENU.BATCH_CANVAS.SURFACE_SHAPE_BATCH_TEMP)) + points = getSurfaceShape(surfaceId, pointer, { length1, length2, length3, length4, length5 }) + + const options = { + fill: 'transparent', + stroke: 'black', + strokeWidth: 1, + strokeDasharray: [10, 4], + fontSize: 12, + selectable: true, + lockMovementX: true, // X 축 이동 잠금 + lockMovementY: true, // Y 축 이동 잠금 + lockRotation: true, // 회전 잠금 + lockScalingX: true, // X 축 크기 조정 잠금 + lockScalingY: true, // Y 축 크기 조정 잠금 + name: MENU.BATCH_CANVAS.SURFACE_SHAPE_BATCH_TEMP, + flipX: surfaceRefs.yInversion, + flipY: surfaceRefs.xInversion, + angle: surfaceRefs.rotate, + originX: 'center', + originY: 'center', + } + + obj = new QPolygon(points, options) + obj.setCoords() //좌표 변경 적용 + + canvas?.add(obj) + + //각도 추가 + let originAngle = 0 //기본 남쪽 + let direction = 'south' + if (azimuth === 'left') { + //서 + originAngle = 90 + direction = 'west' + } else if (azimuth === 'right') { + //동 + originAngle = 270 + direction = 'east' + } else if (azimuth === 'up') { + //북 + originAngle = 180 + direction = 'north' + } + + obj.set({ direction: direction }) + obj.set({ originAngle: originAngle }) + + // setCurrentPattern(obj) + canvas?.renderAll() + }) + + canvas?.on('mouse:down', (e) => { + isDrawing = false + obj.set('name', MENU.BATCH_CANVAS.SURFACE_SHAPE_BATCH) + canvas?.off('mouse:down') + canvas.off('mouse:move') + setSurfaceShapePattern(obj) + setShowPlacementSurfaceSettingModal(true) + }) + } + } + + //면형상 입력 validate + const checkSurfaceShape = (surfaceId, lengths) => { + const { length1, length2, length3, length4, length5 } = lengths + let check = true + + if (surfaceId === 1) { + if (length1 === 0) { + swalFire({ text: getMessage('surface.shape.validate.size'), icon: 'error' }) + check = false + } + if (length2 === 0) { + if (length3 === 0) { + swalFire({ text: getMessage('surface.shape.validate.size'), icon: 'error' }) + check = false + } + } + } else if ([2, 4].includes(surfaceId)) { + if (length1 === 0 || length2 === 0) { + swalFire({ text: getMessage('surface.shape.validate.size'), icon: 'error' }) + check = false + } + } else if ([3, 5, 6, 15, 18].includes(surfaceId)) { + if (length1 === 0 || length2 === 0 || length3 === 0) { + swalFire({ text: getMessage('surface.shape.validate.size'), icon: 'error' }) + check = false + } + if (surfaceId === 3 && length3 > length1) { + swalFire({ text: getMessage('surface.shape.validate.size.1to3'), icon: 'error' }) + check = false + } + + if (surfaceId === 5 || surfaceId === 15) { + if (length3 >= length2) { + swalFire({ text: getMessage('surface.shape.validate.size.2to3'), icon: 'error' }) + check = false + } + } + if (surfaceId === 18) { + if (length1 >= length2) { + swalFire({ text: getMessage('surface.shape.validate.size.1to2'), icon: 'error' }) + check = false + } + if (length4 >= length3) { + swalFire({ text: getMessage('surface.shape.validate.size.3to4'), icon: 'error' }) + check = false + } + } + } else if ([8, 12, 13, 16, 17].includes(surfaceId)) { + if (length1 === 0 || length2 === 0 || length3 === 0 || length4 === 0) { + swalFire({ text: getMessage('surface.shape.validate.size'), icon: 'error' }) + check = false + } + + if (surfaceId === 8) { + if (length2 >= length1) { + swalFire({ text: getMessage('surface.shape.validate.size.1to2'), icon: 'error' }) + check = false + } + if (length4 >= length3) { + swalFire({ text: getMessage('surface.shape.validate.size.3to4'), icon: 'error' }) + check = false + } + } + + if (surfaceId === 12 || surfaceId === 13 || surfaceId === 16 || surfaceId === 17) { + if (length2 >= length1) { + swalFire({ text: getMessage('surface.shape.validate.size.1to2'), icon: 'error' }) + check = false + } + + if (length4 >= length3) { + swalFire({ text: getMessage('surface.shape.validate.size.1to2'), icon: 'error' }) + check = false + } + } + } else if ([7, 9, 10, 11, 14].includes(surfaceId)) { + if (length1 === 0 || length2 === 0 || length3 === 0 || length4 === 0 || length5 === 0) { + swalFire({ text: getMessage('surface.shape.validate.size'), icon: 'error' }) + check = false + } + if (surfaceId === 9 || surfaceId === 10 || surfaceId === 11) { + if (length2 + length3 >= length1) { + swalFire({ text: getMessage('surface.shape.validate.size.1to23'), icon: 'error' }) + check = false + } + if (length5 >= length4) { + swalFire({ text: getMessage('surface.shape.validate.size.4to5'), icon: 'error' }) + check = false + } + } + + if (surfaceId === 14) { + if (length2 + length3 >= length1) { + swalFire({ text: getMessage('surface.shape.validate.size.1to23'), icon: 'error' }) + check = false + } + if (length5 >= length4) { + swalFire({ text: getMessage('surface.shape.validate.size.4to5'), icon: 'error' }) + check = false + } + } + } + return check + } + + //면형상 가져오기 + const getSurfaceShape = (surfaceId, pointer, lengths) => { + let points = [] + const { length1, length2, length3, length4, length5 } = lengths + + switch (surfaceId) { + case 1: { + let newLength2 = length2 + + if (length3 !== 0) { + newLength2 = Math.sqrt(length3 ** 2 - (length1 / 2) ** 2) + } + + points = [ + { x: pointer.x, y: pointer.y - parseInt(newLength2) / 2 }, + { x: pointer.x - parseInt(length1) / 2, y: pointer.y + parseInt(newLength2) / 2 }, + { x: pointer.x + parseInt(length1) / 2, y: pointer.y + parseInt(newLength2) / 2 }, + ] + + break + } + case 2: { + points = [ + { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, + { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, + { x: pointer.x + length1 / 2, y: pointer.y - length2 / 2 }, + { x: pointer.x - length1 / 2, y: pointer.y - length2 / 2 }, + ] + + break + } + case 3: { + points = [ + { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, + { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, + { x: pointer.x + length3 / 2, y: pointer.y - length2 / 2 }, + { x: pointer.x - length3 / 2, y: pointer.y - length2 / 2 }, + ] + + break + } + case 4: { + points = [ + { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, + { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, + { x: pointer.x + length1 / 2, y: pointer.y - length2 / 2 }, + ] + + break + } + case 5: { + points = [ + { x: pointer.x - length1 / 2, y: pointer.y - length3 / 2 }, + { x: pointer.x - length1 / 2, y: pointer.y + length3 / 2 }, + { x: pointer.x + length1 / 2, y: pointer.y + length3 / 2 }, + { x: pointer.x + length1 / 2, y: pointer.y + length3 / 2 - length2 }, + ] + + break + } + case 6: { + const angleInRadians = Math.asin(length2 / length3) + points = [ + { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, + { x: pointer.x - length1 / 2 + length3 * Math.cos(angleInRadians), y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians) }, + { x: pointer.x + length1 / 2 + length3 * Math.cos(angleInRadians), y: pointer.y + length2 / 2 - length3 * Math.sin(angleInRadians) }, + { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, + ] + + break + } + case 7: { + points = [ + { x: pointer.x - (length1 + length2 + length3) / 2, y: pointer.y - (length4 + length5) / 2 }, + { x: pointer.x - (length1 + length2 + length3) / 2, y: pointer.y + (length4 + length5) / 2 }, + { x: pointer.x - (length1 + length2 + length3) / 2 + length1, y: pointer.y + (length4 + length5) / 2 }, + { x: pointer.x - (length1 + length2 + length3) / 2 + length1, y: pointer.y + (length4 + length5) / 2 - length5 }, + { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, y: pointer.y + (length4 + length5) / 2 - length5 }, + { x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2, y: pointer.y + (length4 + length5) / 2 - length5 + length5 }, + { + x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2 + length3, + y: pointer.y + (length4 + length5) / 2 - length5 + length5, + }, + { + x: pointer.x - (length1 + length2 + length3) / 2 + length1 + length2 + length3, + y: pointer.y + (length4 + length5) / 2 - length5 + length5 - (length4 + length5), + }, + ] + + break + } + case 8: { + points = [ + { x: pointer.x - length1 / 2, y: pointer.y + length4 / 2 }, + { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, + { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length3 }, + { x: pointer.x - length1 / 2 + length1 - (length1 - length2), y: pointer.y + length4 / 2 - length3 }, + { x: pointer.x - length1 / 2 + length1 - (length1 - length2), y: pointer.y + length4 / 2 - length3 + (length3 - length4) }, + { x: pointer.x - length1 / 2 + length1 - (length1 - length2) - length2, y: pointer.y + length4 / 2 - length3 + (length3 - length4) }, + ] + + break + } + case 9: { + points = [ + { x: pointer.x - length1 / 2, y: pointer.y + length4 / 2 }, + { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, + { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 }, + { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 }, + { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 + (length4 - length5) }, + { x: pointer.x - length1 / 2 + length1 - length3 - length2, y: pointer.y + length4 / 2 - length4 + (length4 - length5) }, + ] + break + } + case 10: { + points = [ + { x: pointer.x + length1 / 2, y: pointer.y + length4 / 2 }, + { x: pointer.x + length1 / 2 - length1, y: pointer.y + length4 / 2 }, + { x: pointer.x + length1 / 2 - length1, y: pointer.y + length4 / 2 - length5 }, + { x: pointer.x + length1 / 2 - length1 + length2, y: pointer.y + length4 / 2 - length5 }, + { x: pointer.x + length1 / 2 - length1 + length2, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + { x: pointer.x + length1 / 2 - length1 + length2 + length3, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + ] + break + } + case 11: { + points = [ + { x: pointer.x - length1 / 2, y: pointer.y + length4 / 2 }, + { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 }, + { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length5 }, + { x: pointer.x - length1 / 2 + length1 - length2, y: pointer.y + length4 / 2 - length5 }, + { x: pointer.x - length1 / 2 + length1 - length2, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + { x: pointer.x - length1 / 2 + length1 - length2 - length3, y: pointer.y + length4 / 2 - length5 - (length4 - length5) }, + ] + break + } + case 12: { + const leftHypotenuse = Math.sqrt(((length1 - length2) / 2) ** 2 + length3 ** 2) + const rightHypotenuse = (length4 / length3) * leftHypotenuse + + const leftAngle = Math.acos((length1 - length2) / 2 / leftHypotenuse) + + points = [ + { x: pointer.x - length1 / 2 + leftHypotenuse * Math.cos(leftAngle), y: pointer.y + length3 / 2 - leftHypotenuse * Math.sin(leftAngle) }, + { x: pointer.x - length1 / 2, y: pointer.y + length3 / 2 }, + { x: pointer.x + length1 / 2, y: pointer.y + length3 / 2 }, + { + x: pointer.x + length1 / 2 - rightHypotenuse * Math.cos(leftAngle), + y: pointer.y + length3 / 2 - rightHypotenuse * Math.sin(leftAngle), + }, + { + x: pointer.x + length1 / 2 - rightHypotenuse * Math.cos(leftAngle) - length2, + y: pointer.y + length3 / 2 - rightHypotenuse * Math.sin(leftAngle), + }, + ] + + break + } + case 13: { + const pointsArray = [ + { x: 0, y: 0 }, + { x: 0, y: 0 }, + { x: 0, y: 0 }, + { x: 0, y: 0 }, + { x: 0, y: 0 }, + ] + + const tmpPolygon = new QPolygon( + [ + { x: 0, y: length3 }, + { x: length1 - length2, y: length3 }, + { x: (length1 - length2) / 2, y: length3 - length3 }, + ], + { + fill: 'transparent', + stroke: 'black', //black + strokeWidth: 2, + selectable: true, + fontSize: 0, + }, + ) + + const coord = getIntersectionPoint(tmpPolygon.lines[1].startPoint, tmpPolygon.lines[2].startPoint, length3 - length4) + const scale = (length1 - length2) / coord.x + + tmpPolygon.set({ scaleX: scale }) + + pointsArray[0].x = 0 + pointsArray[0].y = length3 //바닥면부터 시작하게 + pointsArray[1].x = pointsArray[0].x + length1 + pointsArray[1].y = pointsArray[0].y + pointsArray[2].x = pointsArray[1].x + pointsArray[2].y = pointsArray[1].y - length4 + pointsArray[3].x = pointsArray[2].x - length2 + pointsArray[3].y = pointsArray[2].y + pointsArray[4].x = tmpPolygon.getCurrentPoints()[2].x + pointsArray[4].y = tmpPolygon.getCurrentPoints()[2].y + + points = [ + { + x: pointer.x - length1 / 2, + y: pointer.y + length4 / 2, + }, + { + x: pointer.x + length1 / 2, + y: pointer.y + length4 / 2, + }, + { + x: pointer.x + length1 / 2, + y: pointer.y - length4 / 2, + }, + { + x: pointer.x - (length2 - length1 / 2), + y: pointer.y - length4 / 2, + }, + { + x: pointer.x - length1 / 2 + pointsArray[4].x, + y: pointer.y - length3 + length4 / 2, + }, + ] + + break + } + case 14: { + points = [ + { x: pointer.x - length1 / 2 + length2, y: pointer.y + length4 / 2 }, + { x: pointer.x - length1 / 2, y: pointer.y + length4 / 2 }, + { x: pointer.x - length1 / 2, y: pointer.y + length4 / 2 - length4 }, + { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 }, + { x: pointer.x - length1 / 2 + length1, y: pointer.y + length4 / 2 - length4 + length4 }, + { x: pointer.x - length1 / 2 + length1 - length3, y: pointer.y + length4 / 2 - length4 + length4 }, + { x: pointer.x - length1 / 2 + length2 + (length1 - length2 - length3) / 2, y: pointer.y + length4 / 2 - length4 + length5 }, + ] + break + } + + case 15: { + points = [ + { x: pointer.x - length1 / 2, y: pointer.y + length2 - length2 / 2 }, + { x: pointer.x - length1 / 2, y: pointer.y + length2 - length2 / 2 - length3 }, + { x: pointer.x, y: pointer.y + length2 - length2 / 2 - length3 - (length2 - length3) }, + { x: pointer.x + length1 / 2, y: pointer.y + length2 - length2 / 2 - length3 }, + { x: pointer.x + length1 / 2, y: pointer.y + length2 - length2 / 2 - length3 + length3 }, + ] + break + } + + case 16: { + points = [ + { + x: pointer.x - length1 / 2, + y: pointer.y + length3 / 2, + }, + { + x: pointer.x - length1 / 2 + (length1 - length2) / 2, + y: pointer.y + length3 / 2 - (length3 - length4), + }, + { + x: pointer.x - length1 / 2 + (length1 - length2) / 2, + y: pointer.y + length3 / 2 - (length3 - length4) - length4, + }, + { + x: pointer.x - length1 / 2 + (length1 - length2) / 2 + length2, + y: pointer.y + length3 / 2 - (length3 - length4) - length4, + }, + { + x: pointer.x - length1 / 2 + (length1 - length2) / 2 + length2, + y: pointer.y + length3 / 2 - (length3 - length4) - length4 + length4, + }, + { + x: pointer.x - length1 / 2 + length1, + y: pointer.y + length3 / 2, + }, + ] + break + } + case 17: { + const angle = (Math.asin(length3 / length4) * 180) / Math.PI // 높이와 빗변으로 먼저 각도구하기 + + const topL = (length1 - length2) / 2 / Math.cos((angle * Math.PI) / 180) // 꺽이는부분 윗쪽 길이 + + points = [ + { + x: pointer.x - length1 / 2 + length1, + y: pointer.y + length3 / 2, + }, + { + x: pointer.x - length1 / 2, + y: pointer.y + length3 / 2, + }, + { + x: pointer.x - length1 / 2 + length4 * Math.cos(angle), + y: pointer.y + length3 / 2 - length4 * Math.sin(degreesToRadians(angle)), + }, + { + x: pointer.x - length1 / 2 + length4 * Math.cos(degreesToRadians(angle)) + length2, + y: pointer.y + length3 / 2 - length4 * Math.sin(degreesToRadians(angle)), + }, + { + x: pointer.x - length1 / 2 + length4 * Math.cos(degreesToRadians(angle)) + length2 + topL * Math.cos(degreesToRadians(angle)), + y: pointer.y + length3 / 2 - length4 * Math.sin(degreesToRadians(angle)) + topL * Math.sin(degreesToRadians(angle)), + }, + ] + break + } + + case 18: { + const a = Math.sqrt(length3 * length3 - length2 * length2) // 입력된 밑변과 높이 + + const sinA = a / length3 + const angleInRadians = Math.asin(sinA) + const angleInDegrees = angleInRadians * (180 / Math.PI) + const b = a - length1 / 2 + + const c = b / Math.tan(angleInRadians) + const d = Math.sqrt(b * b + c * c) + const newAngleInRadians = (90 - angleInDegrees) * (Math.PI / 180) + points = [ + { x: pointer.x - (length1 + b) / 2, y: pointer.y + length2 / 2 }, + { x: pointer.x + length1 / 2 - b / 2, y: pointer.y + length2 / 2 }, + { + x: pointer.x + length1 / 2 - b / 2 + d * Math.cos(newAngleInRadians), + y: pointer.y + length2 / 2 - d * Math.sin(newAngleInRadians), + }, + { + x: pointer.x - (length1 + b) / 2 + length3 * Math.cos(newAngleInRadians), + y: pointer.y + length2 / 2 - length3 * Math.sin(newAngleInRadians), + }, + ] + break + } + } + + return points + } + + //면형상 선택 클릭시 지붕 패턴 입히기 + const setSurfaceShapePattern = (polygon) => { + const ratio = window.devicePixelRatio || 1 + + let width = 265 / 10 + let height = 150 / 10 + let roofStyle = 2 + const inputPatternSize = { width: width, height: height } //임시 사이즈 + const patternSize = { ...inputPatternSize } // 입력된 값을 뒤집기 위해 + + if (polygon.direction === 'east' || polygon.direction === 'west') { + //세로형이면 width height를 바꿈 + ;[patternSize.width, patternSize.height] = [inputPatternSize.height, patternSize.width] + } + + // 패턴 소스를 위한 임시 캔버스 생성 + const patternSourceCanvas = document.createElement('canvas') + patternSourceCanvas.width = polygon.width * ratio + patternSourceCanvas.height = polygon.height * ratio + const ctx = patternSourceCanvas.getContext('2d') + const offset = roofStyle === 1 ? 0 : patternSize.width / 2 + + const rows = Math.floor(patternSourceCanvas.height / patternSize.height) + const cols = Math.floor(patternSourceCanvas.width / patternSize.width) + + ctx.strokeStyle = 'green' + ctx.lineWidth = 0.4 + + for (let row = 0; row <= rows; row++) { + const y = row * patternSize.height + + ctx.beginPath() + ctx.moveTo(0, y) // 선 시작점 + ctx.lineTo(patternSourceCanvas.width, y) // 선 끝점 + ctx.stroke() + + for (let col = 0; col <= cols; col++) { + const x = col * patternSize.width + (row % 2 === 0 ? 0 : offset) + const yStart = row * patternSize.height + const yEnd = yStart + patternSize.height + + ctx.beginPath() + ctx.moveTo(x, yStart) // 선 시작점 + ctx.lineTo(x, yEnd) // 선 끝점 + ctx.stroke() + } + } + + // 패턴 생성 + const pattern = new fabric.Pattern({ + source: patternSourceCanvas, + repeat: 'repeat', + }) + + polygon.set('fill', null) + polygon.set('fill', pattern) + canvas?.renderAll() + } + + return { + applySurfaceShape, + } +} diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index e861f9f8..c7f6620e 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -1,5 +1,5 @@ import { useRecoilState } from 'recoil' -import { canvasState, currentCanvasPlanState, initCanvasPlansState } from '@/store/canvasAtom' +import { canvasState, currentCanvasPlanState, initCanvasPlansState, plansState } from '@/store/canvasAtom' import { useAxios } from '@/hooks/useAxios' import { useMessage } from '@/hooks/useMessage' import { useSwal } from '@/hooks/useSwal' @@ -8,6 +8,7 @@ export function usePlan() { const [canvas, setCanvas] = useRecoilState(canvasState) const [currentCanvasPlan, setCurrentCanvasPlan] = useRecoilState(currentCanvasPlanState) const [initCanvasPlans, setInitCanvasPlans] = useRecoilState(initCanvasPlansState) + const [plans, setPlans] = useRecoilState(plansState) const { swalFire } = useSwal() const { getMessage } = useMessage() const { get, promisePost, promisePut, promiseDel } = useAxios() @@ -77,11 +78,12 @@ export function usePlan() { removeMouseLines() const canvasStr = addCanvas() const canvasStatus = dbToCanvasFormat(canvasToDbFormat(canvasStr)) - if (JSON.parse(canvasStr).objects.length === 0 && currentCanvasPlan.canvasStatus === undefined) { - // 빈 캔버스 + const initPlanData = initCanvasPlans.find((plan) => plan.id === currentCanvasPlan.id) + if (JSON.parse(canvasStr).objects.length === 0 && initPlanData === undefined) { + // 저장 안 된 빈 캔버스 return false - } else if (canvasStatus === currentCanvasPlan.canvasStatus) { - // 변경사항 없는 캔버스 + } else if (initPlanData && canvasStatus === initPlanData.canvasStatus) { + // 저장 되어있고 변경사항 없는 캔버스 return false } else { return true @@ -121,13 +123,16 @@ export function usePlan() { canvasStatus: canvasToDbFormat(canvasStatus), } - await promisePut({ url: '/api/canvas-management/canvas-statuses', data: planData }) + return await promisePut({ url: '/api/canvas-management/canvas-statuses', data: planData }) .then((res) => { swalFire({ text: getMessage('common.message.save') }) // console.log('[PUT] canvas-statuses res :::::::: %o', res) setInitCanvasPlans((initCanvasPlans) => initCanvasPlans.map((plan) => (plan.id === currentCanvasPlan.id ? { ...plan, canvasStatus: canvasStatus } : plan)), ) + setPlans((plans) => + plans.map((plan) => (plan.id === currentCanvasPlan.id ? { ...plan, canvasStatus: canvasStatus } : plan)), + ) }) .catch((error) => { swalFire({ text: error.message, icon: 'error' }) @@ -142,14 +147,34 @@ export function usePlan() { canvasStatus: canvasToDbFormat(canvasStatus), } - await promisePost({ url: '/api/canvas-management/canvas-statuses', data: planData }) + return await promisePost({ url: '/api/canvas-management/canvas-statuses', data: planData }) .then((res) => { swalFire({ text: getMessage('common.message.save') }) - setInitCanvasPlans([ - ...initCanvasPlans, - { id: res.data, name: currentCanvasPlan.objectNo + '-' + res.data, userId: userId, canvasStatus: canvasStatus, isNew: currentCanvasPlan.id }, - ]) // console.log('[POST] canvas-statuses response :::::::: %o', res) + setInitCanvasPlans((initCanvasPlans) => [ + ...initCanvasPlans, + { + id: res.data, + name: currentCanvasPlan.objectNo + '-' + res.data, + userId: userId, + canvasStatus: canvasStatus, + isNew: currentCanvasPlan.id, + }, + ]) + setPlans((plans) => + plans.map((plan) => + plan.id === currentCanvasPlan.id + ? { + ...plan, + id: res.data, + name: currentCanvasPlan.objectNo + '-' + res.data, + userId: userId, + canvasStatus: canvasStatus, + isNew: currentCanvasPlan.id, + } + : plan, + ), + ) }) .catch((error) => { swalFire({ text: error.message, icon: 'error' }) diff --git a/src/locales/ja.json b/src/locales/ja.json index 479c52b2..5a73c850 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -40,9 +40,20 @@ "plan.menu.roof.cover.outline.drawing": "外壁線を描", "plan.menu.roof.cover.roof.shape.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.roof.surface.alloc": "지붕면 할당", "modal.cover.outline.drawing": "外壁線を描", "modal.cover.outline": "外壁線", "modal.cover.outline.right.angle": "直角", @@ -73,6 +84,11 @@ "plan.menu.module.circuit.setting.plan.orientation": "図面方位の適用", "plan.menu.estimate": "見積", "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.reset": "初期化", "plan.menu.estimate.copy": "コピー", @@ -109,6 +125,7 @@ "modal.grid.copy.length": "長さ", "modal.grid.copy.save": "保存", "modal.common.save": "保存", + "modal.common.add": "追加", "modal.canvas.setting.font.plan.edit": "フォントとサイズの変更", "modal.canvas.setting.font.plan.edit.word": "文字フォントの変更", "modal.canvas.setting.font.plan.edit.flow": "フロー方向フォントの変更", @@ -168,6 +185,8 @@ "modal.object.setting.offset.depth": "出幅 (深さ)", "modal.object.setting.offset.width": "出幅 (幅)", "modal.object.setting.direction.select": "方向の選択", + "modal.placement.surface.setting.info": "ⓘ ①の長さ入力後に対角線の長さを入力すると、②の長さを自動計算します。", + "modal.placement.surface.setting.diagonal.length": "斜めの長さ", "setting": "設定", "common.message.no.data": "No data", "common.message.no.dataDown": "ダウンロードするデータがありません", @@ -351,5 +370,31 @@ "shed.width": "片流幅", "windage": "漂流", "windage.width": "漂流の出幅", - "write": "作成" + "write": "作成", + "main.storeId": "販売店ID", + "main.storeName": "販売店名", + "main.objectNo": "物件番号", + "main.faq": "FAQ", + "main.content.objectList": "最近の更新物件一覧", + "main.content.notice": "お知らせ", + "main.content.download1": "操作マニュアル", + "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.1to2": "①길이는 ②보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.1to3": "①길이는 ③보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.1to23": "①길이는 ②+③보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.2to3": "②길이는 ③보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.3to4": "③길이는 ④보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.4to5": "④길이는 ⑤보다 큰 값을 넣어주세요." } diff --git a/src/locales/ko.json b/src/locales/ko.json index 0599fb74..6744b294 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -42,6 +42,14 @@ "plan.menu.roof.cover.roof.shape.passivity.setting": "지붕형상 수동 설정", "plan.menu.roof.cover.eaves.kerava.edit": "처마·케라바 변경", "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.roof.surface.alloc": "지붕면 할당", "plan.menu.roof.cover.roof.shape.edit": "지붕형상 편집", @@ -79,6 +87,11 @@ "plan.menu.module.circuit.setting.plan.orientation": "도면 방위 적용", "plan.menu.estimate": "견적서", "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.reset": "초기화", "plan.menu.estimate.copy": "복사", @@ -115,6 +128,7 @@ "modal.grid.copy.length": "길이", "modal.grid.copy.save": "저장", "modal.common.save": "저장", + "modal.common.add": "추가", "modal.canvas.setting.font.plan.edit": "글꼴 및 크기 변경", "modal.canvas.setting.font.plan.edit.word": "문자 글꼴 변경", "modal.canvas.setting.font.plan.edit.flow": "흐름 방향 글꼴 변경", @@ -174,6 +188,8 @@ "modal.object.setting.offset.depth": "출폭(깊이)", "modal.object.setting.offset.width": "출폭(폭)", "modal.object.setting.direction.select": "방향 선택", + "modal.placement.surface.setting.info": "ⓘ ①의 길이 입력 후 대각선 길이를 입력하면 ②의 길이를 자동 계산합니다.", + "modal.placement.surface.setting.diagonal.length": "대각선 길이", "setting": "설정", "common.message.no.data": "No data", "common.message.no.dataDown": "No data to download", @@ -357,5 +373,31 @@ "shed.width": "한쪽흐름 폭", "windage": "편류", "windage.width": "편류의 출폭", - "write": "작성" + "write": "작성", + "main.storeId": "판매점 ID", + "main.storeName": "판매점명", + "main.objectNo": "물건번호", + "main.faq": "FAQ", + "main.content.objectList": "최근 갱신 물건목록", + "main.content.notice": "공지사항", + "main.content.download1": "조작메뉴얼", + "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.1to2": "①길이는 ②보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.1to3": "①길이는 ③보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.1to23": "①길이는 ②+③보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.2to3": "②길이는 ③보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.3to4": "③길이는 ④보다 큰 값을 넣어주세요.", + "surface.shape.validate.size.4to5": "④길이는 ⑤보다 큰 값을 넣어주세요." } diff --git a/src/store/canvasAtom.js b/src/store/canvasAtom.js index 9fb440c6..c622283b 100644 --- a/src/store/canvasAtom.js +++ b/src/store/canvasAtom.js @@ -264,6 +264,12 @@ export const currentCanvasPlanState = atom({ default: {}, }) +// 전체 canvas plan +export const plansState = atom({ + key: 'plan', + default: [], +}) + export const tempGridModeState = atom({ key: 'tempGridModeState', default: false, diff --git a/src/styles/_canvasside.scss b/src/styles/_canvasside.scss new file mode 100644 index 00000000..66bba83d --- /dev/null +++ b/src/styles/_canvasside.scss @@ -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; + } + } + } +} \ No newline at end of file diff --git a/src/styles/_contents.scss b/src/styles/_contents.scss index 034955f5..dc02fc85 100644 --- a/src/styles/_contents.scss +++ b/src/styles/_contents.scss @@ -542,6 +542,32 @@ color: #101010; font-weight: 600; margin-right: 14px; + &.product{ + margin-right: 10px; + } + } + .product_tit{ + position: relative; + font-size: 15px; + font-weight: 600; + color: #1083E3; + padding-left: 10px; + &::before{ + content: ''; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + width: 1px; + height: 11px; + background-color: #D9D9D9; + } + } + .option{ + padding-left: 5px; + font-size: 13px; + color: #101010; + font-weight: 400; } .info-wrap{ display: flex; @@ -589,17 +615,27 @@ .important{ color: #f00; } - .sub-table-footer{ + .sub-center-footer{ display: flex; align-items: center; justify-content: center; margin-top: 20px; } + .sub-right-footer{ + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: 20px; + } .pagination-wrap{ margin-top: 24px; } } +.infomation-wrap{ + margin-bottom: 30px; +} + .infomation-box-wrap{ display: flex; align-items: center; @@ -634,6 +670,13 @@ display: flex; align-items: center; margin-bottom: 10px; + &.one{ + .estimate-box{ + &:last-child{ + min-width: unset; + } + } + } .estimate-box{ flex: 1 ; display: flex; @@ -658,6 +701,16 @@ color: #344356; margin-left: 14px; font-weight: 400; + &.blue{ + font-size: 16px; + font-weight: 700; + color: #1083E3; + } + &.red{ + font-size: 16px; + font-weight: 700; + color: #D72A2A; + } } } &:last-child{ @@ -714,6 +767,159 @@ } } +.special-note-check-wrap{ + display: grid; + grid-template-columns: repeat(5, 1fr); + border: 1px solid #ECF0F4; + border-radius: 3px; + margin-bottom: 30px; + .special-note-check-item{ + padding: 14px 10px; + border-right: 1px solid #ECF0F4; + border-top: 1px solid #ECF0F4; + &:nth-child(5n){ + border-right: none; + } + &:nth-child(-n+5){ + border-top: none; + } + &.act{ + background-color: #F7F9FA; + } + } +} + +.calculation-estimate{ + border: 1px solid #ECF0F4; + border-radius: 3px; + padding: 24px; + max-height: 350px; + overflow-y: auto; + margin-bottom: 30px; + dl{ + margin-bottom: 35px; + &:last-child{ + margin-bottom: 0; + } + dt{ + font-size: 13px; + font-weight: 600; + color: #1083E3; + margin-bottom: 15px; + } + dd{ + font-size: 12px; + font-weight: 400; + color: #45576F; + margin-bottom: 5px; + } + } + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + &::-webkit-scrollbar-thumb { + background-color: #d9dee2; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } +} +.esimate-wrap{ + margin-bottom: 20px; +} + +.estimate-product-option{ + display: flex; + align-items: center; + margin-bottom: 15px; + .product-price-wrap{ + display: flex; + align-items: center; + .product-price-tit{ + font-size: 13px; + font-weight: 400; + color: #45576F; + margin-right: 10px; + } + .select-wrap{ + width: 110px; + } + } + .product-edit-wrap{ + display: flex; + align-items: center; + margin-left: auto; + .product-edit-explane{ + display: flex; + align-items: center; + margin-right: 15px; + .attachment-required{ + position: relative; + display: flex; + align-items: center; + font-size: 12px; + font-weight: 400; + color: #45576F; + padding-right: 10px; + .ico{ + width: 23px; + height: 23px; + margin-right: 5px; + background: url(../../public/static/images/sub/attachment_ico.svg)no-repeat center; + background-size: cover; + } + &::before{ + content: ''; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + width: 1px; + height: 12px; + background-color: #D9D9D9; + } + } + .click-check{ + display: flex; + align-items: center; + font-size: 12px; + font-weight: 400; + color: #F16A6A ; + padding-left: 10px; + .ico{ + width: 14px; + height: 14px; + margin-right: 5px; + background: url(../../public/static/images/sub/click_check_ico.svg)no-repeat center; + background-size: cover; + } + } + } + .product-edit-btn{ + display: flex; + align-items: center; + button{ + display: flex; + align-items: center; + span{ + width: 13px; + height: 13px; + margin-right: 5px; + background-size: cover; + &.plus{ + background: url(../../public/static/images/sub/plus_btn.svg)no-repeat center; + } + &.minus{ + background: url(../../public/static/images/sub/minus_btn.svg)no-repeat center; + } + } + } + } + } + +} + // 발전시물레이션 .chart-wrap{ display: flex; @@ -844,83 +1050,44 @@ } } -// 패널 배치 집계 - -.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; - } - } +// 물건상세 +.information-help-wrap{ + display: flex; + padding: 24px; + background-color: #F4F4F4; + border-radius: 4px; + margin-bottom: 15px; + .information-help-tit-wrap{ + position: relative; + display: flex; + align-items: center; + padding-right: 40px; + border-right: 1px solid #E0E0E3; + .help-tit-icon{ + width: 40px; + height: 40px; + border-radius: 50%; + margin-right: 10px; + background: #fff url(../../public/static/images/sub/information_help.svg)no-repeat center; + background-size: 20px 20px; + } + .help-tit{ + font-size: 13px; + font-weight: 600; + color: #45576F; } } - &.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{ + .information-help-guide{ + padding-left: 40px; + span{ display: block; + font-size: 12px; + font-weight: 400; + color: #45576F; + margin-bottom: 7px; + &:last-child{ + margin-bottom: 0; + } } } } \ No newline at end of file diff --git a/src/styles/_grid-detail.scss b/src/styles/_grid-detail.scss index a673236a..4cf9d3b2 100644 --- a/src/styles/_grid-detail.scss +++ b/src/styles/_grid-detail.scss @@ -36,6 +36,9 @@ &:nth-child(2n){ background-color: #F7F9FA; } + &.important_row{ + background-color: #e7e7e7; + } } .ag-cell{ font-size: 13px; diff --git a/src/styles/_main.scss b/src/styles/_main.scss index 334a0485..37170a8b 100644 --- a/src/styles/_main.scss +++ b/src/styles/_main.scss @@ -394,6 +394,9 @@ font-weight: 600; margin-bottom: 5px; } + &.pw-reset{ + font-size: 13px; + } } .login-input-wrap{ margin-top: 30px; @@ -412,8 +415,10 @@ background-color: transparent; font-size: 13px; font-weight: 400; - color: #D1D7E0; + color: #6c819c; &::placeholder{ + font-size: 13px; + font-weight: 400; color: #D1D7E0; } } @@ -442,6 +447,17 @@ background-size: 17px 17px; } } + &.email{ + &::before{ + background: url(../../public/static/images/main/login_email.svg)no-repeat center; + width: 12px; + height: 9px; + } + .id-delete{ + background-image: url(../../public/static/images/main/id_delete.svg); + background-size: 17px 17px; + } + } &.password{ margin-bottom: 20px; &::before{ @@ -456,27 +472,35 @@ } } } + .login-btn{ + display: block; + width: 100%; + height: 45px; + background-color: #5C6773; + color: #fff; + font-size: 15px; + font-weight: 600; + border-radius: 4px; + transition: background .15s ease-in-out; + &:hover{ + background-color: #717e8d; + } + &.light{ + background-color: #fff; + border: 1px solid #5C6773; + color: #5C6773; + } + } .login-btn-box{ margin-bottom: 20px; - .login-btn{ - display: block; - width: 100%; - height: 45px; - background-color: #5C6773; - color: #fff; - font-size: 15px; - font-weight: 600; - border-radius: 4px; - transition: background .15s ease-in-out; - &:hover{ - background-color: #717e8d; - } - } + } + .pwreset-btn-box{ + display: flex; } .reset-password{ width: 100%; text-align: center; - a{ + button{ position: relative; font-size: 13px; color: #364864; @@ -554,4 +578,75 @@ top: -2px; left: 1px; } +} + +// 회원가입 +.center-page-wrap{ + display: flex; + flex-direction: column; + justify-content: center; + width: 100%; + min-height: 100vh; + background-color: #F4F4F7; + overflow-x: hidden; + .center-page-inner{ + width: 100%; + max-width: 1720px; + margin: 0 auto; + .center-page-tit{ + font-size: 18px; + font-weight: 600; + color: #101010; + margin-bottom: 24px; + } + .sub-table-box{ + &.signup{ + margin-bottom: 20px; + } + } + .sign-up-btn-wrap{ + display: flex; + justify-content: flex-end; + } + &.complete{ + max-width: 1000px; + } + } + +} + +// 회원가입 완료 +.complete-box-wrap{ + padding: 72px 80px; + .complete-tit{ + font-size: 18px; + font-weight: 600; + color: #101010; + margin-bottom: 17px; + } + .complete-txt{ + font-size: 13px; + font-weight: 400; + color: #101010; + margin-bottom: 27px; + } + .complete-email-wrap{ + padding: 36px 30px; + border-radius: 2px; + background: #F4F4F7; + margin-bottom: 20px; + .email-info{ + font-size: 13px; + font-weight: 400; + color: #000; + span{ + color: #204AF4; + font-weight: 500; + } + } + } + .complete-btn{ + display: flex; + justify-content: flex-end; + } } \ No newline at end of file diff --git a/src/styles/_modal.scss b/src/styles/_modal.scss index 705550d5..d70732b8 100644 --- a/src/styles/_modal.scss +++ b/src/styles/_modal.scss @@ -26,6 +26,18 @@ $alert-color: #101010; } } +.normal-font { + font-size: 12px; + font-weight: 400; + color: #fff; +} + +.bold-font { + font-size: 12px; + font-weight: 500; + color: #fff; +} + .modal-pop-wrap { position: fixed; width: 100%; @@ -281,6 +293,10 @@ $alert-color: #101010; align-items: center; gap: 15px; padding-bottom: 15px; + + &.border { + border-bottom: 1px solid #424242; + } } .grid-option-wrap { @@ -977,18 +993,14 @@ $alert-color: #101010; transition: all .15s ease-in-out; .shape-box { + display: flex; + justify-content: center; + align-items: center; position: relative; width: 100%; height: 100%; background-color: #313131; border-radius: 2px; - - img { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } } &.act, @@ -1642,6 +1654,37 @@ $alert-color: #101010; .module-table-flex-wrap { display: flex; gap: 10px; + + .outline-form { + flex: 1; + } +} + +.module-box-tab { + display: flex; + + .module-btn { + flex: 1; + border-top: 1px solid #505050; + border-bottom: 1px solid #505050; + border-right: 1px solid #505050; + background-color: #454545; + color: #fff; + height: 30px; + font-size: 12px; + font-weight: 400; + transition: all .15s ease-in-out; + + &:first-child { + border-left: 1px solid #505050; + } + + &.act { + border-color: #fff; + background-color: #fff; + color: #101010; + } + } } .module-table-box { @@ -1649,7 +1692,7 @@ $alert-color: #101010; background-color: #3D3D3D; border-radius: 2px; - .module-table-inneer { + .module-table-inner { padding: 10px; .outline-form { @@ -1657,5 +1700,269 @@ $alert-color: #101010; width: auto; } } + + .module-table-tit { + padding: 10px 0; + font-size: 12px; + color: #fff; + border-bottom: 1px solid #4D4D4D; + } + + .eaves-keraba-table { + width: 100%; + margin-top: 15px; + + .eaves-keraba-th { + width: 72px; + } + + .eaves-keraba-th, + .eaves-keraba-td { + padding-bottom: 5px; + } + } + + .self-table-tit { + font-size: 12px; + font-weight: 500; + color: #fff; + padding-bottom: 15px; + } + } + + .warning-guide { + padding: 20px; + + .warning { + color: #FFCACA; + max-height: 55px; + overflow-y: auto; + padding-right: 30px; + + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: #D9D9D9; + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } + } + } +} + +.module-self-table { + display: table; + border-top: 1px solid #4D4D4D; + border-collapse: collapse; + width: 100%; + + .self-table-item { + display: table-row; + + .self-item-td, + .self-item-th { + display: table-cell; + vertical-align: middle; + border-bottom: 1px solid #4D4D4D; + } + + .self-item-th { + width: 60px; + font-size: 12px; + font-weight: 500; + color: #fff; + } + + .self-item-td { + font-size: 12px; + font-weight: 400; + color: #fff; + padding: 15px 20px; + } + } +} + +.self-table-flx { + display: flex; + align-items: center; + margin-top: 15px; + + button { + margin-left: auto; + } +} + +.hexagonal-wrap { + .hexagonal-item { + padding: 15px 0; + border-bottom: 1px solid #4D4D4D; + + &:first-child { + padding-top: 0; + } + + &:last-child { + padding-bottom: 0; + border: none; + } + + .hexagonal-flx-auto { + display: flex; + justify-content: space-between; + } + + .hexagonal-flx { + display: flex; + align-items: center; + + button { + margin-left: auto; + } + } + } +} + +// 회로 및 가대설정 +.circuit-check-inner { + padding: 5px 0; +} + +.x-scroll-table { + overflow-x: auto; + padding-bottom: 5px; + + .roof-module-table { + min-width: 1200px; + } + + &::-webkit-scrollbar { + height: 4px; + background-color: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: #D9D9D9; + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } +} + +.circuit-right-wrap { + display: flex; + justify-content: flex-end; +} + +.circuit-data-form { + display: flex; + flex-direction: column; + gap: 5px; + min-height: 60px; + padding: 12px; + border: 1px solid rgba(255, 255, 255, 0.20); +} + +.circuit-table-tit { + color: #fff; + font-size: 12px; + font-weight: 600; + padding: 11px 10px; + background-color: #474747; + border: 1px solid #505050; + border-bottom: none; +} + +.circuit-overflow { + max-height: 560px; + overflow-y: auto; + margin-bottom: 15px; + + &::-webkit-scrollbar { + width: 4px; + background-color: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: #D9D9D9; + } + + &::-webkit-scrollbar-track { + background-color: transparent; + } +} + +.circuit-table-flx-wrap { + display: flex; + gap: 10px; + margin-bottom: 10px; + + .circuit-table-flx-box { + flex: 1; + display: flex; + flex-direction: column; + + .bottom-wrap { + margin-top: auto; + } + + .roof-module-table { + table { + table-layout: fixed; + } + } + } +} + +.circuit-count-input { + display: flex; + align-items: center; + gap: 10px; +} + +// 모듈부가기능 +.additional-radio-wrap { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 15px 0; + margin-bottom: 24px; +} + +.additional-wrap { + padding: 24px 0; + border-top: 1px solid #424242; +} + +.additional-color-wrap { + display: flex; + align-items: center; + padding: 5px 0; + gap: 15px; + + .additional-color-box { + display: flex; + align-items: center; + gap: 8px; + + .additional-color { + display: block; + width: 16px; + height: 16px; + + &.pink { + border: 2px solid #EA10AC; + background-color: #16417D; + } + + &.white { + border: 2px solid #FFF; + background-color: #001027; + } + } } } \ No newline at end of file diff --git a/src/styles/_reset.scss b/src/styles/_reset.scss index 7804b800..b575113b 100644 --- a/src/styles/_reset.scss +++ b/src/styles/_reset.scss @@ -215,6 +215,53 @@ button{ font-weight: 500; } } + &.roof{ + height: 30px; + padding: 0 10px; + line-height: 28px; + font-family: 'Noto Sans JP', sans-serif; + background-color: transparent; + border: 1px solid #484848; + color: #fff; + &.blue{ + background-color: #414E6C; + border: 1px solid #414E6C; + &:hover{ + background-color: #414E6C; + border: 1px solid #414E6C; + } + } + &.white{ + background-color: #fff; + border: 1px solid #fff; + color: #101010; + &:hover{ + background-color: #fff; + border: 1px solid #fff; + color: #101010; + } + } + &:hover{ + font-weight: 400; + background-color: transparent; + border: 1px solid #484848; + color: #fff; + } + } + &.self{ + height: 30px; + padding: 0 10px; + line-height: 28px; + font-family: 'Noto Sans JP', sans-serif; + background-color: transparent; + border: 1px solid #676767; + color: #AAAAAA; + &:hover{ + background-color: #272727; + border-color: #676767; + font-weight: 400; + } + } &:hover, &.act{ background-color: #1083E3; @@ -242,7 +289,7 @@ button{ .btn-origin{ display: inline-block; height: 30px; - padding: 0 14px; + padding: 0 10px; border-radius: 2px; background-color: #101010; color: #fff; @@ -252,7 +299,7 @@ button{ &.navy{ background-color: #304961; &:hover{ - background-color: #1083E3; + background-color: #233546; } } &.grey{ @@ -653,6 +700,7 @@ input[type=text]{ // check-box .d-check-box{ label{ + &.red{color: #FFCACA;} &::before{ cursor: pointer; content: ""; @@ -664,7 +712,7 @@ input[type=text]{ left: 0; margin-left: -12px; border: 1px solid #D6D6D7; - background-color: transparent; + background-color: #fff; transition: border 0.15s ease-in-out, color 0.15s ease-in-out; } &:after{ @@ -695,9 +743,28 @@ input[type=text]{ -ms-transform: translate(7.75px,4.5px) rotate(45deg); } &.pop{ + label{ + &:before{ + background-color: transparent; + } + } input[type=checkbox]:checked + label::after{ border-color: #fff; } + &.no-text{ + label{ + padding-left: 0; + } + } + } + &.sel{ + input[type=checkbox]:checked + label{ + color: #D7C863; + } + input[type=checkbox]:checked + label::before, + input[type=checkbox]:checked + label::after{ + border-color: #D7C863; + } } } diff --git a/src/styles/_submodal.scss b/src/styles/_submodal.scss new file mode 100644 index 00000000..34d0e9ce --- /dev/null +++ b/src/styles/_submodal.scss @@ -0,0 +1,199 @@ +.modal-popup{ + position: fixed; + top: 0; + left: 0; + width:100%; + height:100%; + overflow-x: hidden; + overflow-y: auto; + background:rgba(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; + } +} \ No newline at end of file diff --git a/src/styles/_table.scss b/src/styles/_table.scss index a87bfc5b..5aa068d0 100644 --- a/src/styles/_table.scss +++ b/src/styles/_table.scss @@ -14,6 +14,10 @@ table{ } } +.flx-box{ + @include flexbox; +} + .common-table{ table{ table-layout: fixed; @@ -85,6 +89,7 @@ table{ color: #697C8F; font-weight: normal; margin-left: 15px; + margin-bottom: 0; } span{ font-size: 13px; @@ -97,11 +102,10 @@ table{ } } } - .flx-box{ - @include flexbox; - } + } .tooltips{ + position: relative; display: block; width: 14px; height: 14px; @@ -109,6 +113,10 @@ table{ background: url(../../public/static/images/sub/tooltips.svg)no-repeat center; background-size: cover; cursor: pointer; + span{ + position: absolute; + white-space: nowrap; + } } } @@ -182,8 +190,9 @@ table{ thead{ th{ height: 40px; - padding: 0 10px; + padding: 0px 10px; font-size: 12px; + line-height: 1.1; color: #fff; font-weight: 500; border: 1px solid #505050; @@ -191,14 +200,82 @@ table{ 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; + text-overflow: ellipsis; + 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; + } + } + } + } + } + &.overflow-y{ + table{ + table-layout: fixed; + border-collapse: collapse; + thead{ + display: table; + table-layout: fixed; + width: 100%; + border-collapse: collapse; + } + tbody{ + display: block; + max-height: 81px; + overflow-y: auto; + tr{ + display: table; + table-layout: fixed; + width: 100%; + border-collapse: collapse; + margin-top: -1px; + } + &::-webkit-scrollbar { + width: 2px; + background-color: rgba(255, 255, 255, 0.05); + } + &::-webkit-scrollbar-thumb { + background-color: #C1CCD7; + } + &::-webkit-scrollbar-track { + background-color: rgba(255, 255, 255, 0.05); + } } } } diff --git a/src/styles/contents.scss b/src/styles/contents.scss index 3e82124a..613c0644 100644 --- a/src/styles/contents.scss +++ b/src/styles/contents.scss @@ -1,3 +1,5 @@ @import '_contents.scss'; @import '_modal.scss'; -@import '_table.scss'; \ No newline at end of file +@import '_submodal.scss'; +@import '_table.scss'; +@import '_canvasside.scss'; \ No newline at end of file