diff --git a/README.md b/README.md index c4033664..3154862f 100644 --- a/README.md +++ b/README.md @@ -34,3 +34,5 @@ You can check out [the Next.js GitHub repository](https://github.com/vercel/next The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. + +deploy test diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 00000000..295b7871 --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,10 @@ +module.exports = { + apps: [ + { + name: 'qcast-front-production', + script: 'npm run start:dev', + instance: 2, + exec_mode: 'cluster', + }, + ], +} diff --git a/package.json b/package.json index a32ba7b9..d9c1af06 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start -p 5000", + "start:cluster1": "next start -p 5000", + "start:cluster2": "next start -p 5001", "start:dev": "next start -p 5010", "lint": "next lint", "serve": "node server.js" @@ -23,7 +24,7 @@ "js-cookie": "^3.0.5", "mathjs": "^13.0.2", "mssql": "^11.0.1", - "next": "14.2.21", + "next": "14.2.26", "next-international": "^1.2.4", "react": "^18", "react-chartjs-2": "^5.2.0", diff --git a/public/static/images/canvas/hide-check-arr.svg b/public/static/images/canvas/hide-check-arr.svg new file mode 100644 index 00000000..f2a16099 --- /dev/null +++ b/public/static/images/canvas/hide-check-arr.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/static/images/common/Logo.svg b/public/static/images/common/Logo.svg index fa04f4d3..01e85313 100644 --- a/public/static/images/common/Logo.svg +++ b/public/static/images/common/Logo.svg @@ -1,17 +1,17 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/src/app/layout.js b/src/app/layout.js index a77f926c..6186f5ed 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -21,8 +21,8 @@ import GlobalLoadingProvider from './GlobalLoadingProvider' * 서버 컴포넌트에 한해서 개별로 설정할 수 있음 */ export const metadata = { - title: 'HANASYS設計', - description: 'HANASYS設計', + title: 'HANASYS DESIGN', + description: 'HANASYS DESIGN', } /** diff --git a/src/common/common.js b/src/common/common.js index d82d43f0..abda5acd 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -203,6 +203,7 @@ export const SAVE_KEY = [ 'fontWeight', 'dormerAttributes', 'toFixed', + 'isSortedPoints', ] export const OBJECT_PROTOTYPE = [fabric.Line.prototype, fabric.Polygon.prototype, fabric.Triangle.prototype, fabric.Group.prototype] diff --git a/src/components/auth/AutoLogin.jsx b/src/components/auth/AutoLogin.jsx index d400f2c4..b3dcbb6e 100644 --- a/src/components/auth/AutoLogin.jsx +++ b/src/components/auth/AutoLogin.jsx @@ -2,26 +2,111 @@ import { useState } from 'react' import { useMessage } from '@/hooks/useMessage' +import { setSession, login } from '@/lib/authActions' +import { sessionStore } from '@/store/commonAtom' +import { useRecoilState } from 'recoil' +import { useAxios } from '@/hooks/useAxios' +import { globalLocaleStore } from '@/store/localeAtom' +import { useRouter } from 'next/navigation' + import GlobalSpinner from '@/components/common/spinner/GlobalSpinner' -export default function AutoLoginPage() { - const [isLoading, setIsLoading] = useState(true) +export default function AutoLoginPage({ autoLoginParam }) { + const router = useRouter() + + const [isLoading, setIsLoading] = useState(autoLoginParam === 'Y' ? false : true) + const [globalLocaleState, setGlbalLocaleState] = useRecoilState(globalLocaleStore) + + const { promisePost } = useAxios(globalLocaleState) const { getMessage } = useMessage() + const [userId, setUserId] = useState('') + const [sessionState, setSessionState] = useRecoilState(sessionStore) + + const [idFocus, setIdFocus] = useState(false) + + const loginProcess = async () => { + setIsLoading(true) + await promisePost({ url: '/api/login/v1.0/user', data: { loginId: userId } }).then((response) => { + setIsLoading(false) + if (response.data) { + const res = response.data + const result = { ...res, storeLvl: res.groupId === '60000' ? '1' : '2', pwdInitYn: 'Y' } + setSession(result) + setSessionState(result) + login() + } else { + alert(getMessage('login.fail')) + router.push('/login?autoLoginParam1=Y') + } + }) + } + return ( <> {isLoading && } -
-
- {getMessage('site.name')} - {getMessage('site.sub_name')} -
-
-
- {getMessage('login.auto.page.text')} + {autoLoginParam !== 'Y' ? ( + <> +
+
+ {getMessage('site.name')} + {getMessage('site.sub_name')} +
+
+
+ {getMessage('login.auto.page.text')} +
+
-
-
+ + ) : ( + <> +
+
{ + e.preventDefault() + loginProcess() + }} + className="space-y-6" + > +
+ {getMessage('site.name')} + {getMessage('site.sub_name')} +
+
+
+ { + setUserId(e.target.value) + }} + onFocus={() => setIdFocus(true)} + onBlur={() => setIdFocus(false)} + /> + +
+
+ +
+
+
+
+ + )} ) } diff --git a/src/components/auth/Login.jsx b/src/components/auth/Login.jsx index 85e342d4..7a6ba957 100644 --- a/src/components/auth/Login.jsx +++ b/src/components/auth/Login.jsx @@ -25,7 +25,9 @@ export default function Login() { useEffect(() => { if (autoLoginParam) { - autoLoginProcess(autoLoginParam) + if (autoLoginParam !== 'Y') { + autoLoginProcess(autoLoginParam) + } } // console.log('🚀 ~ checkSession ~ checkSession():', checkSession()) @@ -334,7 +336,7 @@ export default function Login() {
)} - {autoLoginParam && } + {autoLoginParam && }
COPYRIGHT©2024 Hanwha Japan All Rights Reserved.
diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index cd8b9e2b..eec45f41 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -6,29 +6,19 @@ import { contextMenuListState, contextMenuState } from '@/store/contextMenu' import { useTempGrid } from '@/hooks/useTempGrid' import { useContextMenu } from '@/hooks/useContextMenu' import { useEvent } from '@/hooks/useEvent' -import { canvasState } from '@/store/canvasAtom' +import { canvasState, currentObjectState } from '@/store/canvasAtom' export default function QContextMenu(props) { const canvas = useRecoilValue(canvasState) const { contextRef, canvasProps } = props const [contextMenu, setContextMenu] = useRecoilState(contextMenuState) const contextMenuList = useRecoilValue(contextMenuListState) - const activeObject = canvasProps?.getActiveObject() //액티브된 객체를 가져옴 + const currentObject = useRecoilValue(currentObjectState) const { tempGridMode, setTempGridMode } = useTempGrid() const { handleKeyup } = useContextMenu() const { addDocumentEventListener, removeDocumentEvent } = useEvent() // const { addDocumentEventListener, removeDocumentEvent } = useContext(EventContext) - let contextType = '' - - if (activeObject) { - if (activeObject.initOptions && activeObject.initOptions.name) { - //이건 바뀔 가능성이 있음 - if (activeObject.initOptions?.name?.indexOf('guide') > -1) { - contextType = 'surface' //면형상 - } - } - } const getYPosition = (e) => { const contextLength = contextMenuList.reduce((acc, cur, index) => { return acc + cur.length @@ -36,11 +26,13 @@ export default function QContextMenu(props) { return e?.clientY - (contextLength * 25 + contextMenuList.length * 2 * 17) } - useEffect(() => { - if (!contextRef.current) return + const handleContextMenu = (e) => { + // e.preventDefault() //기존 contextmenu 막고 + + if (currentObject) { + const isArray = currentObject.hasOwnProperty('arrayData') + if (isArray && currentObject.arrayData.length === 0) return - const handleContextMenu = (e) => { - e.preventDefault() //기존 contextmenu 막고 if (tempGridMode) return const position = { x: window.innerWidth / 2 < e.pageX ? e.pageX - 240 : e.pageX, @@ -48,21 +40,24 @@ export default function QContextMenu(props) { } setContextMenu({ visible: true, ...position, currentMousePos: canvasProps.getPointer(e) }) addDocumentEventListener('keyup', document, handleKeyup) - canvasProps?.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) //한번 노출 후 이벤트 삭제 } + } - const handleClick = (e) => { - // e.preventDefault() + const handleClick = (e) => { + // e.preventDefault() + setContextMenu({ ...contextMenu, visible: false }) + } + + const handleOutsideClick = (e) => { + // e.preventDefault() + if (contextMenu.visible) { setContextMenu({ ...contextMenu, visible: false }) + removeDocumentEvent('keyup') } + } - const handleOutsideClick = (e) => { - // e.preventDefault() - if (contextMenu.visible) { - setContextMenu({ ...contextMenu, visible: false }) - removeDocumentEvent('keyup') - } - } + useEffect(() => { + if (!contextRef.current) return canvasProps?.upperCanvasEl.addEventListener('contextmenu', handleContextMenu) document.addEventListener('click', handleClick) @@ -72,43 +67,9 @@ export default function QContextMenu(props) { removeDocumentEvent('keyup') document.removeEventListener('click', handleClick) document.removeEventListener('click', handleOutsideClick) + canvasProps?.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) //한번 노출 후 이벤트 삭제 } - }, [contextRef, contextMenuList]) - - const handleObjectMove = () => { - activeObject.set({ - lockMovementX: false, // X 축 이동 잠금 - lockMovementY: false, // Y 축 이동 잠금 - }) - - canvasProps?.on('object:modified', function (e) { - activeObject.set({ - lockMovementX: true, // X 축 이동 잠금 - lockMovementY: true, // Y 축 이동 잠금 - }) - }) - } - - const handleObjectDelete = () => { - if (confirm('삭제하실거?')) { - canvasProps.remove(activeObject) - } - } - - const handleObjectCopy = () => { - activeObject.clone((cloned) => { - cloned.set({ - left: activeObject.left + activeObject.width + 20, - initOptions: { ...activeObject.initOptions }, - lockMovementX: true, // X 축 이동 잠금 - lockMovementY: true, // Y 축 이동 잠금 - lockRotation: true, // 회전 잠금 - lockScalingX: true, // X 축 크기 조정 잠금 - lockScalingY: true, // Y 축 크기 조정 잠금 - }) - canvasProps?.add(cloned) - }) - } + }, [contextRef, contextMenuList, currentObject]) return ( <> diff --git a/src/components/common/select/QSelectBox.jsx b/src/components/common/select/QSelectBox.jsx index f1041da3..3e797071 100644 --- a/src/components/common/select/QSelectBox.jsx +++ b/src/components/common/select/QSelectBox.jsx @@ -39,7 +39,7 @@ export default function QSelectBox({ if (showKey !== '' && !value) { //value가 없으면 showKey가 있으면 우선 보여준다 // return options[0][showKey] - return title + return title !== '' ? title : getMessage('selectbox.title') } else if (showKey !== '' && value) { //value가 있으면 sourceKey와 targetKey를 비교하여 보여준다 @@ -87,7 +87,7 @@ export default function QSelectBox({