Merge branch 'dev' of https://git.jetbrains.space/nalpari/q-cast-iii/qcast-front into dev
This commit is contained in:
commit
c5f5319aa5
@ -1,6 +1,6 @@
|
||||
NEXT_PUBLIC_TEST="테스트변수입니다. development"
|
||||
|
||||
NEXT_PUBLIC_API_SERVER_PATH="http://1.248.227.176:38080"
|
||||
NEXT_PUBLIC_API_SERVER_PATH="http://1.248.227.176:38080"
|
||||
# NEXT_PUBLIC_API_SERVER_PATH="http://localhost:8080"
|
||||
|
||||
DATABASE_URL="sqlserver://mssql.devgrr.kr:1433;database=qcast;user=qcast;password=Qwertqaz12345;trustServerCertificate=true"
|
||||
|
||||
23
qcast-front/.gitignore
vendored
23
qcast-front/.gitignore
vendored
@ -1,23 +0,0 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
@ -1,70 +0,0 @@
|
||||
# Getting Started with Create React App
|
||||
|
||||
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
|
||||
|
||||
## Available Scripts
|
||||
|
||||
In the project directory, you can run:
|
||||
|
||||
### `npm start`
|
||||
|
||||
Runs the app in the development mode.\
|
||||
Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
|
||||
|
||||
The page will reload when you make changes.\
|
||||
You may also see any lint errors in the console.
|
||||
|
||||
### `npm test`
|
||||
|
||||
Launches the test runner in the interactive watch mode.\
|
||||
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
|
||||
|
||||
### `npm run build`
|
||||
|
||||
Builds the app for production to the `build` folder.\
|
||||
It correctly bundles React in production mode and optimizes the build for the best performance.
|
||||
|
||||
The build is minified and the filenames include the hashes.\
|
||||
Your app is ready to be deployed!
|
||||
|
||||
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
|
||||
|
||||
### `npm run eject`
|
||||
|
||||
**Note: this is a one-way operation. Once you `eject`, you can't go back!**
|
||||
|
||||
If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
|
||||
|
||||
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
|
||||
|
||||
You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
|
||||
|
||||
## Learn More
|
||||
|
||||
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
|
||||
|
||||
To learn React, check out the [React documentation](https://reactjs.org/).
|
||||
|
||||
### Code Splitting
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
|
||||
|
||||
### Analyzing the Bundle Size
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
|
||||
|
||||
### Making a Progressive Web App
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
|
||||
|
||||
### Advanced Configuration
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
|
||||
|
||||
### Deployment
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
|
||||
|
||||
### `npm run build` fails to minify
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
|
||||
19777
qcast-front/package-lock.json
generated
19777
qcast-front/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,38 +0,0 @@
|
||||
{
|
||||
"name": "qcast-front",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@testing-library/jest-dom": "^5.17.0",
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-scripts": "5.0.1",
|
||||
"web-vitals": "^2.1.4"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,43 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<meta
|
||||
name="description"
|
||||
content="Web site created using create-react-app"
|
||||
/>
|
||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
||||
<!--
|
||||
manifest.json provides metadata used when your web app is installed on a
|
||||
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
|
||||
-->
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
||||
<!--
|
||||
Notice the use of %PUBLIC_URL% in the tags above.
|
||||
It will be replaced with the URL of the `public` folder during the build.
|
||||
Only files inside the `public` folder can be referenced from the HTML.
|
||||
|
||||
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
||||
work correctly both with client-side routing and a non-root public URL.
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<title>React App</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<!--
|
||||
This HTML file is a template.
|
||||
If you open it directly in the browser, you will see an empty page.
|
||||
|
||||
You can add webfonts, meta tags, or analytics to this file.
|
||||
The build step will place the bundled scripts into the <body> tag.
|
||||
|
||||
To begin the development, run `npm start` or `yarn start`.
|
||||
To create a production bundle, use `npm run build` or `yarn build`.
|
||||
-->
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.2 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 9.4 KiB |
@ -1,25 +0,0 @@
|
||||
{
|
||||
"short_name": "React App",
|
||||
"name": "Create React App Sample",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "64x64 32x32 24x24 16x16",
|
||||
"type": "image/x-icon"
|
||||
},
|
||||
{
|
||||
"src": "logo192.png",
|
||||
"type": "image/png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "logo512.png",
|
||||
"type": "image/png",
|
||||
"sizes": "512x512"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Disallow:
|
||||
@ -1,38 +0,0 @@
|
||||
.App {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.App-logo {
|
||||
height: 40vmin;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
.App-logo {
|
||||
animation: App-logo-spin infinite 20s linear;
|
||||
}
|
||||
}
|
||||
|
||||
.App-header {
|
||||
background-color: #282c34;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: calc(10px + 2vmin);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.App-link {
|
||||
color: #61dafb;
|
||||
}
|
||||
|
||||
@keyframes App-logo-spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@ -1,25 +0,0 @@
|
||||
import logo from './logo.svg';
|
||||
import './App.css';
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<div className="App">
|
||||
<header className="App-header">
|
||||
<img src={logo} className="App-logo" alt="logo" />
|
||||
<p>
|
||||
Edit <code>src/App.js</code> and save to reload.
|
||||
</p>
|
||||
<a
|
||||
className="App-link"
|
||||
href="https://reactjs.org"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Learn React
|
||||
</a>
|
||||
</header>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
@ -1,8 +0,0 @@
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import App from './App';
|
||||
|
||||
test('renders learn react link', () => {
|
||||
render(<App />);
|
||||
const linkElement = screen.getByText(/learn react/i);
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
});
|
||||
@ -1,13 +0,0 @@
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
||||
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
||||
sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
|
||||
monospace;
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import './index.css';
|
||||
import App from './App';
|
||||
import reportWebVitals from './reportWebVitals';
|
||||
|
||||
const root = ReactDOM.createRoot(document.getElementById('root'));
|
||||
root.render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>
|
||||
);
|
||||
|
||||
// If you want to start measuring performance in your app, pass a function
|
||||
// to log results (for example: reportWebVitals(console.log))
|
||||
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
|
||||
reportWebVitals();
|
||||
@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 2.6 KiB |
@ -1,13 +0,0 @@
|
||||
const reportWebVitals = onPerfEntry => {
|
||||
if (onPerfEntry && onPerfEntry instanceof Function) {
|
||||
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
|
||||
getCLS(onPerfEntry);
|
||||
getFID(onPerfEntry);
|
||||
getFCP(onPerfEntry);
|
||||
getLCP(onPerfEntry);
|
||||
getTTFB(onPerfEntry);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export default reportWebVitals;
|
||||
@ -1,5 +0,0 @@
|
||||
// jest-dom adds custom jest matchers for asserting on DOM nodes.
|
||||
// allows you to do things like:
|
||||
// expect(element).toHaveTextContent(/react/i)
|
||||
// learn more: https://github.com/testing-library/jest-dom
|
||||
import '@testing-library/jest-dom';
|
||||
@ -1,420 +1,197 @@
|
||||
'use client'
|
||||
|
||||
import React, { useEffect, useState } from 'react';
|
||||
//import { useMutation } from "react-query";
|
||||
import { Button } from '@nextui-org/react';
|
||||
|
||||
import { Button } from '@nextui-org/react'
|
||||
|
||||
import { get, post } from '@/lib/Axios'
|
||||
import { get, post } from '@/lib/Axios';
|
||||
|
||||
export default function Settings() {
|
||||
|
||||
const [objectNo, setObjectNo] = useState('test123240829010'); // object_no 입력 필드의 상태
|
||||
const [error, setError] = useState(null); // 에러 상태 관리
|
||||
const [objectNo, setObjectNo] = useState('test123240829010');
|
||||
const [error, setError] = useState(null);
|
||||
|
||||
//초기 상태 설정
|
||||
|
||||
const [selectedIndices1, setSelectedIndices1] = useState(['N','N','N','N','N','N','N','N','N','N','N']); //화면 표시1
|
||||
const [selectedIndices2, setSelectedIndices2] = useState(['N','N','N']); //화면 표시2
|
||||
const [selectedIndices3, setSelectedIndices3] = useState(0); //흡착 범위 설정 (default:극소)
|
||||
const [selectedIndices4, setSelectedIndices4] = useState([]); //그리드 설정
|
||||
// 상태를 하나의 객체로 관리
|
||||
const [settings, setSettings] = useState({
|
||||
display1: Array(11).fill('N'), // 화면 표시1
|
||||
display2: Array(3).fill('N'), // 화면 표시2
|
||||
rangeSetting: 0, // 흡착 범위 설정
|
||||
gridSettings: [] // 그리드 설정
|
||||
});
|
||||
|
||||
const [gridItems1, setGridItems1] = useState([
|
||||
'할당 표시',
|
||||
'도면 표시',
|
||||
'그리드 표시',
|
||||
'문자 표시',
|
||||
'흐름방향 표시',
|
||||
'복도치수 표시',
|
||||
'실제치수 표시',
|
||||
'치수 표시 없음',
|
||||
'가대 표시',
|
||||
'좌표 표시',
|
||||
'도면전환 표시']);
|
||||
const [gridItems2, setGridItems2] = useState(['테두리만', '라인해치', 'All Painted']);
|
||||
const [gridItems3, setGridItems3] = useState(['극소', '소', '중', '대']);
|
||||
const [gridItems4, setGridItems4] = useState(['임의 그리드', '실선 그리드', '점 그리드', '그리드 색 설정', '흡착점 추가']);
|
||||
const gridItems = {
|
||||
display1: [
|
||||
'할당 표시', '도면 표시', '그리드 표시', '문자 표시', '흐름방향 표시',
|
||||
'복도치수 표시', '실제치수 표시', '치수 표시 없음', '가대 표시',
|
||||
'좌표 표시', '도면전환 표시'
|
||||
],
|
||||
display2: ['테두리만', '라인해치', 'All Painted'],
|
||||
rangeSetting: ['극소', '소', '중', '대'],
|
||||
gridSettings: ['임의 그리드', '실선 그리드', '점 그리드', '그리드 색 설정', '흡착점 추가']
|
||||
};
|
||||
|
||||
// 클릭 시 상태 변경 함수
|
||||
//화면 표시1
|
||||
const handleClick1 = (index) => {
|
||||
setSelectedIndices1((prevSelectedIndices) => {
|
||||
if (prevSelectedIndices.includes(index)) {
|
||||
// 이미 선택된 경우, 선택 해제 (리스트에서 제거)
|
||||
return prevSelectedIndices.filter((i) => i !== index);
|
||||
} else {
|
||||
// 선택되지 않은 경우, 리스트에 추가
|
||||
return [...prevSelectedIndices, index];
|
||||
const handleToggle = (type, index) => {
|
||||
|
||||
setSettings((prevSettings) => {
|
||||
|
||||
// prevSettings[type]이 배열인지 확인하고, 그렇지 않은 경우 빈 배열로 초기화
|
||||
let updated = Array.isArray(prevSettings[type]) ? [...prevSettings[type]] : [];
|
||||
|
||||
if (type === 'rangeSetting') {
|
||||
return { ...prevSettings, [type]: index };
|
||||
}
|
||||
|
||||
updated[index] = updated[index] === 'N' ? 'Y' : 'N';
|
||||
return { ...prevSettings, [type]: updated };
|
||||
});
|
||||
};
|
||||
|
||||
//화면 표시2
|
||||
const handleClick2 = (index) => {
|
||||
setSelectedIndices2((prevSelectedIndices) => {
|
||||
if (prevSelectedIndices.includes(index)) {
|
||||
// 이미 선택된 경우, 선택 해제 (리스트에서 제거)
|
||||
return prevSelectedIndices.filter((i) => i !== index);
|
||||
} else {
|
||||
// 선택되지 않은 경우, 리스트에 추가
|
||||
return [...prevSelectedIndices, index];
|
||||
// Canvas Setting 조회 및 초기화
|
||||
const handleSelect = async () => {
|
||||
try {
|
||||
const res = await get({ url: `/api/canvas-management/canvas-settings/by-object/${objectNo}` });
|
||||
|
||||
// 데이터가 없는 경우
|
||||
if (!res || res.length === 0) {
|
||||
|
||||
console.warn('조회 결과가 없습니다.');
|
||||
// 기본값을 설정하거나 사용자에게 알림 표시
|
||||
setSettings({
|
||||
display1: Array(11).fill('N'), // 화면 표시1 기본값
|
||||
display2: Array(3).fill('N'), // 화면 표시2 기본값
|
||||
rangeSetting: 0, // 흡착 범위 설정 기본값
|
||||
gridSettings: [] // 그리드 설정 초기화
|
||||
});
|
||||
|
||||
alert('조회된 데이터가 없습니다. 기본 설정이 적용됩니다.');
|
||||
return; // 이후 코드 실행을 중단
|
||||
}
|
||||
});
|
||||
|
||||
const data = res.map((item) => ({
|
||||
display1: [
|
||||
item.assignDisplay, item.drawDisplay, item.gridDisplay, item.charDisplay, item.flowDisplay,
|
||||
item.hallwayDimenDisplay, item.actualDimenDisplay, item.noDimenDisplay, item.trestleDisplay,
|
||||
item.coordiDisplay, item.drawConverDisplay
|
||||
],
|
||||
display2: [item.onlyBorder, item.lineHatch, item.allPainted],
|
||||
rangeSetting: Number(item.adsorpRangeSetting)
|
||||
}));
|
||||
|
||||
setSettings({
|
||||
display1: data[0].display1,
|
||||
display2: data[0].display2,
|
||||
rangeSetting: data[0].rangeSetting,
|
||||
gridSettings: [] // 초기화
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Data fetching error:', error);
|
||||
}
|
||||
};
|
||||
|
||||
//흡착 범위 설정
|
||||
const handleClick3 = (index) => {
|
||||
setSelectedIndices3(index);
|
||||
};
|
||||
|
||||
//그리드 설정
|
||||
const handleClick4 = (index) => {
|
||||
setSelectedIndices4((prevSelectedIndices) => {
|
||||
if (prevSelectedIndices.includes(index)) {
|
||||
// 이미 선택된 경우, 선택 해제 (리스트에서 제거)
|
||||
return prevSelectedIndices.filter((i) => i !== index);
|
||||
} else {
|
||||
// 선택되지 않은 경우, 리스트에 추가
|
||||
return [...prevSelectedIndices, index];
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 제출 post
|
||||
// const postMutation = useMutation(
|
||||
// (formData) =>
|
||||
// axios.post("http://서버주소", formData, {
|
||||
// headers: {
|
||||
// "Content-Type": "multipart/form-data",
|
||||
// },
|
||||
// }),
|
||||
// {
|
||||
// onSuccess: () => {
|
||||
// alert("제출 완료 되었습니다.");
|
||||
// setShowModal(false);
|
||||
// },
|
||||
// onError: (error) => {
|
||||
// // 에러 처리
|
||||
// console.error("Error:", error);
|
||||
// },
|
||||
// },
|
||||
// );
|
||||
|
||||
|
||||
// Canvas Setting 저장
|
||||
const handleSubmit = async (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
if (objectNo) {
|
||||
handleSelect(objectNo);
|
||||
} else {
|
||||
if (!objectNo) {
|
||||
alert('object_no를 입력하세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
let tempCnt1 = [0,1,2,3,4,5,6,7,8,9,10]
|
||||
let display1 = ['N','N','N','N','N','N','N','N','N','N','N']
|
||||
|
||||
//화면 표시1 data
|
||||
for (let i = 0; i < tempCnt1.length; i++) {
|
||||
for (let j = 0; j < selectedIndices1.length; j++) {
|
||||
if (i == selectedIndices1[j]) {
|
||||
display1[i] = "Y"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let tempCnt2 = [0,1,2]
|
||||
let display2 = ['N','N','N']
|
||||
|
||||
//화면 표시2 data
|
||||
for (let i = 0; i < tempCnt2.length; i++) {
|
||||
for (let j = 0; j < selectedIndices2.length; j++) {
|
||||
if (i == selectedIndices2[j]) {
|
||||
display2[i] = "Y"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//흡착 범위 설정
|
||||
let rangeSetting = selectedIndices3
|
||||
|
||||
//견적서 번호 << objectNo 받아와야 함.
|
||||
//let objectNo = 'test123240829010'
|
||||
|
||||
// 유저가 올린 데이터를 데이터로 만들어주는 부분
|
||||
const patternData = {
|
||||
objectNo : objectNo,
|
||||
assignDisplay : display1[0],
|
||||
drawDisplay : display1[1],
|
||||
gridDisplay : display1[2],
|
||||
charDisplay : display1[3],
|
||||
flowDisplay : display1[4],
|
||||
hallwayDimenDisplay : display1[5],
|
||||
actualDimenDisplay : display1[6],
|
||||
noDimenDisplay : display1[7],
|
||||
trestleDisplay : display1[8],
|
||||
coordiDisplay : display1[9],
|
||||
drawConverDisplay : display1[10],
|
||||
onlyBorder : display2[0],
|
||||
lineHatch : display2[1],
|
||||
allPainted : display2[2],
|
||||
adsorpRangeSetting : rangeSetting,
|
||||
}
|
||||
//console.log("patternData : ", patternData)
|
||||
objectNo,
|
||||
assignDisplay: settings.display1[0],
|
||||
drawDisplay: settings.display1[1],
|
||||
gridDisplay: settings.display1[2],
|
||||
charDisplay: settings.display1[3],
|
||||
flowDisplay: settings.display1[4],
|
||||
hallwayDimenDisplay: settings.display1[5],
|
||||
actualDimenDisplay: settings.display1[6],
|
||||
noDimenDisplay: settings.display1[7],
|
||||
trestleDisplay: settings.display1[8],
|
||||
coordiDisplay: settings.display1[9],
|
||||
drawConverDisplay: settings.display1[10],
|
||||
onlyBorder: settings.display2[0],
|
||||
lineHatch: settings.display2[1],
|
||||
allPainted: settings.display2[2],
|
||||
adsorpRangeSetting: String(settings.rangeSetting)
|
||||
};
|
||||
|
||||
// Canvas Setting 등록
|
||||
await post({ url: `/api/canvas-management/canvas-settings`, data : patternData })
|
||||
await post({ url: `/api/canvas-management/canvas-settings`, data: patternData });
|
||||
|
||||
// 저장 후 재조회
|
||||
handleSelect();
|
||||
|
||||
};
|
||||
|
||||
// Canvas Setting 조회
|
||||
const handleSelect = async () => {
|
||||
//console.log("handleSelect objectNo : ", objectNo)
|
||||
|
||||
//화면 초기화 후 조회
|
||||
handleClick1(0)
|
||||
handleClick2(0)
|
||||
handleClick3(0)
|
||||
handleClick4(0)
|
||||
|
||||
try {
|
||||
get({ url: `/api/canvas-management/canvas-settings/by-object/${objectNo}` }).then((res) => {
|
||||
const arrangeData = res.map((item) => {
|
||||
|
||||
//console.log("item : ", item)
|
||||
|
||||
return {
|
||||
objectNo : item.objectNo,
|
||||
assignDisplay : item.assignDisplay,
|
||||
drawDisplay : item.drawDisplay,
|
||||
gridDisplay : item.gridDisplay,
|
||||
charDisplay : item.charDisplay,
|
||||
flowDisplay : item.flowDisplay,
|
||||
hallwayDimenDisplay : item.hallwayDimenDisplay,
|
||||
actualDimenDisplay : item.actualDimenDisplay,
|
||||
noDimenDisplay : item.noDimenDisplay,
|
||||
trestleDisplay : item.trestleDisplay,
|
||||
coordiDisplay : item.coordiDisplay,
|
||||
drawConverDisplay : item.drawConverDisplay,
|
||||
onlyBorder : item.onlyBorder,
|
||||
lineHatch : item.lineHatch,
|
||||
allPainted : item.allPainted,
|
||||
adsorpRangeSetting : item.adsorpRangeSetting,
|
||||
}
|
||||
})
|
||||
|
||||
// 가공된 데이터를 상태에 저장
|
||||
//setArrangeData(arrangeData);
|
||||
|
||||
let assignDisplay = ""
|
||||
let drawDisplay = ""
|
||||
let gridDisplay = ""
|
||||
let charDisplay = ""
|
||||
let flowDisplay = ""
|
||||
let hallwayDimenDisplay = ""
|
||||
let actualDimenDisplay = ""
|
||||
let noDimenDisplay = ""
|
||||
let trestleDisplay = ""
|
||||
let coordiDisplay = ""
|
||||
let drawConverDisplay = ""
|
||||
let display1 = []
|
||||
|
||||
{arrangeData.map((gridYn1) => (
|
||||
assignDisplay = gridYn1.assignDisplay,
|
||||
drawDisplay = gridYn1.drawDisplay,
|
||||
gridDisplay = gridYn1.gridDisplay,
|
||||
charDisplay = gridYn1.charDisplay,
|
||||
flowDisplay = gridYn1.flowDisplay,
|
||||
hallwayDimenDisplay = gridYn1.hallwayDimenDisplay,
|
||||
actualDimenDisplay = gridYn1.actualDimenDisplay,
|
||||
noDimenDisplay = gridYn1.noDimenDisplay,
|
||||
trestleDisplay = gridYn1.trestleDisplay,
|
||||
coordiDisplay = gridYn1.coordiDisplay,
|
||||
drawConverDisplay = gridYn1.drawConverDisplay
|
||||
))}
|
||||
|
||||
display1 = [assignDisplay, drawDisplay, gridDisplay, charDisplay, flowDisplay, hallwayDimenDisplay,
|
||||
actualDimenDisplay, noDimenDisplay, trestleDisplay, coordiDisplay, drawConverDisplay]
|
||||
|
||||
//console.log("display1 : ", display1)
|
||||
//console.log("gridItems1 : ", gridItems1)
|
||||
|
||||
//초기화
|
||||
//배열 전체 삭제
|
||||
selectedIndices1.splice(0,11)
|
||||
|
||||
//화면 표시1 data
|
||||
for (let i = 0; i < 11; i++) {
|
||||
display1.forEach((data, i) => {
|
||||
|
||||
if ('Y' == data) {
|
||||
selectedIndices1[i] = i
|
||||
}
|
||||
})
|
||||
}
|
||||
setSelectedIndices1(selectedIndices1)
|
||||
|
||||
let onlyBorder = ""
|
||||
let lineHatch = ""
|
||||
let allPainted = ""
|
||||
let display2 = []
|
||||
|
||||
{arrangeData.map((gridYn2) => (
|
||||
onlyBorder = gridYn2.onlyBorder,
|
||||
lineHatch = gridYn2.lineHatch,
|
||||
allPainted = gridYn2.allPainted
|
||||
))}
|
||||
|
||||
display2 = [onlyBorder, lineHatch, allPainted]
|
||||
|
||||
//console.log("display2 : ", display2)
|
||||
//console.log("gridItems2 : ", gridItems2)
|
||||
|
||||
//초기화
|
||||
//배열 전체 삭제
|
||||
selectedIndices2.splice(0,3)
|
||||
|
||||
//화면 표시2 data
|
||||
for (let i = 0; i < 3; i++) {
|
||||
display2.forEach((data, i) => {
|
||||
if ('Y' == data) {
|
||||
selectedIndices2[i] = i
|
||||
}
|
||||
})
|
||||
}
|
||||
setSelectedIndices2(selectedIndices2)
|
||||
|
||||
let adsorpRangeSetting = 0
|
||||
{arrangeData.map((gridItems3) => (
|
||||
adsorpRangeSetting = gridItems3.adsorpRangeSetting
|
||||
))}
|
||||
|
||||
//흡착 범위 설정 data
|
||||
setSelectedIndices3(Number(adsorpRangeSetting))
|
||||
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('Data fetching error:', error);
|
||||
} finally {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
// Canvas Setting 조회
|
||||
// 초기 조회
|
||||
useEffect(() => {
|
||||
|
||||
//console.log("useEffect objectNo : ", objectNo)
|
||||
|
||||
if (objectNo) {
|
||||
handleSelect(objectNo);
|
||||
} else {
|
||||
alert('object_no를 입력하세요.');
|
||||
}
|
||||
|
||||
}, [])
|
||||
}, []);
|
||||
|
||||
// Canvas Setting 조회 버튼 클릭
|
||||
const handleSelectButton = () => {
|
||||
|
||||
//console.log("handleSelectButton objectNo : ", objectNo)
|
||||
|
||||
if (objectNo) {
|
||||
handleSelect(objectNo);
|
||||
} else {
|
||||
alert('object_no를 입력하세요.');
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// 입력 필드가 변경될 때 상태 업데이트
|
||||
const handleInputChange = (event) => {
|
||||
setObjectNo(event.target.value);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="container mx-auto p-4 m-4 border">
|
||||
<div align="right">
|
||||
<input type="text" placeholder="Object No 입력" value={objectNo} onChange={handleInputChange}/>
|
||||
<Button onClick={handleSelectButton}>조회</Button>
|
||||
<input type="text" placeholder="Object No 입력" value={objectNo} onChange={(e) => setObjectNo(e.target.value)} />
|
||||
<Button onClick={handleSelect}>조회</Button>
|
||||
<Button onClick={handleSubmit}>저장</Button>
|
||||
</div>
|
||||
<div className="container mx-auto p-4 m-4 border">
|
||||
<h1>[디스플레이 설정]</h1>
|
||||
<h1>[디스플레이 설정]</h1>
|
||||
<h1>* 도면에 표시할 항목을 클릭하면 적용 됩니다.</h1>
|
||||
<div className="grid-container2">
|
||||
{gridItems1.map((item1, index) => (
|
||||
{gridItems.display1.map((item, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className={`grid-item ${
|
||||
selectedIndices1.includes(index) ? 'selected' : 'unselected'
|
||||
}`}
|
||||
onClick={() => handleClick1(index)}
|
||||
className={`grid-item ${settings.display1[index] === 'Y' ? 'selected' : 'unselected'}`}
|
||||
onClick={() => handleToggle('display1', index)}
|
||||
>
|
||||
{selectedIndices1.includes(index) ? 'Y' : 'N'} {item1}
|
||||
{settings.display1[index]} {item}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<br/>
|
||||
</div>
|
||||
<br />
|
||||
<h1>* 화면 표시</h1>
|
||||
<div className="grid-container3">
|
||||
{gridItems2.map((item2, index) => (
|
||||
{gridItems.display2.map((item, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className={`grid-item ${
|
||||
selectedIndices2.includes(index) ? 'selected' : 'unselected'
|
||||
}`}
|
||||
onClick={() => handleClick2(index)}
|
||||
className={`grid-item ${settings.display2[index] === 'Y' ? 'selected' : 'unselected'}`}
|
||||
onClick={() => handleToggle('display2', index)}
|
||||
>
|
||||
{selectedIndices2.includes(index) ? 'Y' : 'N'} {item2}
|
||||
{settings.display2[index]} {item}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<h1>[글꼴/도면크기 설정]</h1>
|
||||
<h1>* 글꼴 및 크기 변경</h1>
|
||||
<div className="grid-container2">
|
||||
<div className="grid-item">문자 글꼴 변경</div>
|
||||
<div className="grid-item">흐름방향 글꼴 변경</div>
|
||||
<div className="grid-item">치수 글꼴 변경</div>
|
||||
<div className="grid-item">회로번호 글꼴 변경</div>
|
||||
</div>
|
||||
<h1>[글꼴/도면크기 설정]</h1>
|
||||
<h1>* 흡착 범위 설정</h1>
|
||||
<div className="grid-container4">
|
||||
{gridItems3.map((item3, index) => (
|
||||
{gridItems.rangeSetting.map((item, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className={`grid-item ${selectedIndices3 === index ? 'selected' : 'unselected'}`}
|
||||
onClick={() => handleClick3(index)}
|
||||
className={`grid-item ${settings.rangeSetting === index ? 'selected' : 'unselected'}`}
|
||||
onClick={() => handleToggle('rangeSetting', index)}
|
||||
>
|
||||
{selectedIndices3 === index ? 'Y' : 'N'} {item3}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="grid-container3">
|
||||
<div className="grid-item">치수선 설정</div>
|
||||
<div className="grid-item">도면 크기 설정</div>
|
||||
<div className="grid-item">흡착점 ON</div>
|
||||
</div>
|
||||
|
||||
<h1>[그리드 설정]</h1>
|
||||
<div className="grid-container2 border">
|
||||
{gridItems4.map((item4, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className={`grid-item ${
|
||||
selectedIndices4.includes(index) ? 'selected' : 'unselected'
|
||||
}`}
|
||||
onClick={() => handleClick4(index)}
|
||||
>
|
||||
{selectedIndices4.includes(index) ? 'Y' : 'N'} {item4}
|
||||
{settings.rangeSetting === index ? 'Y' : 'N'} {item}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<h1>[그리드 설정]</h1>
|
||||
<div className="grid-container2 border">
|
||||
{gridItems.gridSettings.map((item, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className={`grid-item ${settings.gridSettings.includes(index) ? 'selected' : 'unselected'}`}
|
||||
onClick={() => handleToggle('gridSettings', index)}
|
||||
>
|
||||
{settings.gridSettings.includes(index) ? 'Y' : 'N'} {item}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user