From dea4d2b8047f369322d09652ad9eea34a68b0d5b Mon Sep 17 00:00:00 2001 From: nguyentrungthat <80239428+nguentrungthat@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:55:04 +0700 Subject: [PATCH] Update FE --- .../app/controllers/scenarios_controller.ts | 9 +- .../app/controllers/stations_controller.ts | 46 +- BACKEND/app/services/line_connection.ts | 39 +- BACKEND/app/ultils/helper.ts | 4 + .../1761185635441_create_lines_table.ts | 2 +- .../1761185646058_create_scenarios_table.ts | 1 - BACKEND/providers/socket_io_provider.ts | 7 +- FRONTEND/index.html | 2 +- FRONTEND/package-lock.json | 26 +- FRONTEND/package.json | 2 + FRONTEND/public/icon-ATC-removebg.png | Bin 0 -> 86897 bytes FRONTEND/src/App.tsx | 111 ++- FRONTEND/src/components/ButtonAction.tsx | 44 +- FRONTEND/src/components/CardLine.tsx | 2 +- FRONTEND/src/components/Component.module.css | 4 + FRONTEND/src/components/DialogConfirm.tsx | 71 ++ FRONTEND/src/components/DrawerScenario.tsx | 344 +++++++++ FRONTEND/src/components/FormAddEdit.tsx | 663 ++++++++++++++++++ .../components/Scenario/Scenario.module.css | 83 +++ .../src/components/Scenario/TableRows.tsx | 137 ++++ FRONTEND/src/untils/constanst.ts | 250 +++---- FRONTEND/src/untils/helper.ts | 4 + FRONTEND/src/untils/types.ts | 21 +- 23 files changed, 1698 insertions(+), 174 deletions(-) create mode 100644 FRONTEND/public/icon-ATC-removebg.png create mode 100644 FRONTEND/src/components/DialogConfirm.tsx create mode 100644 FRONTEND/src/components/DrawerScenario.tsx create mode 100644 FRONTEND/src/components/FormAddEdit.tsx create mode 100644 FRONTEND/src/components/Scenario/Scenario.module.css create mode 100644 FRONTEND/src/components/Scenario/TableRows.tsx create mode 100644 FRONTEND/src/untils/helper.ts diff --git a/BACKEND/app/controllers/scenarios_controller.ts b/BACKEND/app/controllers/scenarios_controller.ts index d09913f..624adb0 100644 --- a/BACKEND/app/controllers/scenarios_controller.ts +++ b/BACKEND/app/controllers/scenarios_controller.ts @@ -91,9 +91,10 @@ export default class ScenariosController { */ async update({ request, response, auth }: HttpContext) { try { - const scenarioId = request.param('id') - const payload = await request.all() - const scenario = await Scenario.findOrFail(scenarioId) + const scenarioId = request.body().id + const payload = request.body() + const scenario = await Scenario.find(scenarioId) + if (!scenario) return response.status(404).json({ message: 'Scenario not found' }) payload.body = JSON.stringify(payload.body) scenario.merge(payload) await scenario.save() @@ -113,7 +114,7 @@ export default class ScenariosController { */ async delete({ request, response }: HttpContext) { try { - const scenarioId = request.param('id') + const scenarioId = request.body().id const scenario = await Scenario.findOrFail(scenarioId) if (!scenario) { diff --git a/BACKEND/app/controllers/stations_controller.ts b/BACKEND/app/controllers/stations_controller.ts index 6e0ae07..e0a7ec2 100644 --- a/BACKEND/app/controllers/stations_controller.ts +++ b/BACKEND/app/controllers/stations_controller.ts @@ -1,5 +1,6 @@ import type { HttpContext } from '@adonisjs/core/http' import Station from '#models/station' +import Line from '#models/line' export default class StationsController { public async index({}: HttpContext) { @@ -8,6 +9,8 @@ export default class StationsController { public async store({ request, response }: HttpContext) { let payload = request.only(Array.from(Station.$columnsDefinitions.keys())) + let lines: Line[] = request.body().lines || [] + try { const stationName = await Station.findBy('name', payload.name) if (stationName) return response.status(400).json({ message: 'Station name exist!' }) @@ -16,10 +19,33 @@ export default class StationsController { if (stationIP) return response.status(400).json({ message: 'Ip of station is exist!' }) const station = await Station.create(payload) + + const newLines: Line[] = [] + if (lines && Array.isArray(lines)) { + lines.forEach(async (line) => { + if (line.id) { + const value = await Line.find(line.id) + if (value) { + Object.assign(value, line) + await value.save() + newLines.push(value) + } else { + const value1 = await Line.create({ ...line, stationId: station.id }) + newLines.push(value1) + } + } else { + const value2 = await Line.create({ ...line, stationId: station.id }) + newLines.push(value2) + } + }) + } + + const resStation = await Station.query().where('id', station.id).preload('lines') + return response.created({ status: true, message: 'Station created successfully', - data: station, + data: resStation.map((el) => ({ ...el.$original, lines: newLines })), }) } catch (error) { return response.badRequest({ error: error, message: 'Station create failed', status: false }) @@ -36,6 +62,8 @@ export default class StationsController { (f) => f !== 'created_at' && f !== 'updated_at' ) ) + let lines: Line[] = request.body().lines || [] + try { const station = await Station.find(request.body().id) @@ -48,7 +76,21 @@ export default class StationsController { await station.save() - return response.ok({ status: true, message: 'Station update successfully', data: station }) + if (lines && Array.isArray(lines)) { + lines.forEach(async (line) => { + if (line.id) { + const value = await Line.find(line.id) + if (value) { + Object.assign(value, line) + await value.save() + } else await Line.create({ ...line, stationId: station.id }) + } else await Line.create({ ...line, stationId: station.id }) + }) + } + + const resStation = await Station.query().where('id', station.id).preload('lines') + + return response.ok({ status: true, message: 'Station update successfully', data: resStation }) } catch (error) { return response.badRequest({ error: error, message: 'Station update failed', status: false }) } diff --git a/BACKEND/app/services/line_connection.ts b/BACKEND/app/services/line_connection.ts index aaba016..c910e7e 100644 --- a/BACKEND/app/services/line_connection.ts +++ b/BACKEND/app/services/line_connection.ts @@ -1,5 +1,5 @@ import net from 'node:net' -import { cleanData } from '../ultils/helper.js' +import { cleanData, sleep } from '../ultils/helper.js' import Scenario from '#models/scenario' interface LineConfig { @@ -59,7 +59,7 @@ export default class LineConnection { this.client.on('data', (data) => { if (this.connecting) return let message = data.toString() - this.outputBuffer += message + if (this.isRunningScript) this.outputBuffer += message // let output = cleanData(message) // console.log(`📨 [${this.config.port}] ${message}`) // Handle netOutput with backspace support @@ -109,7 +109,7 @@ export default class LineConnection { console.log(`⏳ Connection timeout line ${lineNumber}`) this.client.destroy() - reject(new Error('Connection timeout')) + // reject(new Error('Connection timeout')) }) }) } @@ -138,10 +138,14 @@ export default class LineConnection { async runScript(script: Scenario) { if (!this.client || this.client.destroyed) { - throw new Error('Not connected') + console.log('Not connected') + this.isRunningScript = false + this.outputBuffer = '' + return } if (this.isRunningScript) { - throw new Error('Script already running') + console.log('Script already running') + return } this.isRunningScript = true @@ -152,10 +156,10 @@ export default class LineConnection { const timeoutTimer = setTimeout(() => { this.isRunningScript = false this.outputBuffer = '' - reject(new Error('Script timeout')) + // reject(new Error('Script timeout')) }, script.timeout || 300000) - const runStep = (index: number) => { + const runStep = async (index: number) => { if (index >= steps.length) { clearTimeout(timeoutTimer) this.isRunningScript = false @@ -166,11 +170,9 @@ export default class LineConnection { const step = steps[index] let repeatCount = Number(step.repeat) || 1 - const sendCommand = () => { if (repeatCount <= 0) { // Done → next step - this.client.off('data', onOutput) stepIndex++ return runStep(stepIndex) } @@ -183,24 +185,19 @@ export default class LineConnection { setTimeout(() => sendCommand(), Number(step?.delay) || 500) } - // Lắng nghe output cho expect - const onOutput = (data: string) => { - const output = data.toString() - this.outputBuffer += output - - if (output.includes(step.expect)) { - this.client.off('data', onOutput) - setTimeout(() => sendCommand(), Number(step?.delay) || 500) - } - } - // Nếu expect rỗng → gửi ngay if (!step?.expect || step?.expect.trim() === '') { setTimeout(() => sendCommand(), Number(step?.delay) || 500) return } - this.client.on('data', onOutput) + while (this.outputBuffer) { + await sleep(200) + if (this.outputBuffer.includes(step.expect)) { + this.outputBuffer = '' + setTimeout(() => sendCommand(), Number(step?.delay) || 500) + } + } } runStep(stepIndex) diff --git a/BACKEND/app/ultils/helper.ts b/BACKEND/app/ultils/helper.ts index c5ddc46..2cdb42d 100644 --- a/BACKEND/app/ultils/helper.ts +++ b/BACKEND/app/ultils/helper.ts @@ -12,3 +12,7 @@ export const cleanData = (data: string) => { .replace(/[^\x20-\x7E\r\n]/g, '') // Remove non-printable characters // .replace(/\r\n/g, '\n') } + +export function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} diff --git a/BACKEND/database/migrations/1761185635441_create_lines_table.ts b/BACKEND/database/migrations/1761185635441_create_lines_table.ts index 58998c4..481e161 100644 --- a/BACKEND/database/migrations/1761185635441_create_lines_table.ts +++ b/BACKEND/database/migrations/1761185635441_create_lines_table.ts @@ -11,7 +11,7 @@ export default class extends BaseSchema { table.integer('line_clear') table.integer('outlet') table.integer('station_id').unsigned().references('id').inTable('stations') - table.string('apc_name').notNullable() + table.string('apc_name') table.timestamps() }) } diff --git a/BACKEND/database/migrations/1761185646058_create_scenarios_table.ts b/BACKEND/database/migrations/1761185646058_create_scenarios_table.ts index 2c3e2af..c957bb5 100644 --- a/BACKEND/database/migrations/1761185646058_create_scenarios_table.ts +++ b/BACKEND/database/migrations/1761185646058_create_scenarios_table.ts @@ -7,7 +7,6 @@ export default class extends BaseSchema { this.schema.createTable(this.tableName, (table) => { table.increments('id') table.string('title').notNullable() - table.string('name').notNullable() table.text('body').notNullable() table.integer('timeout').notNullable() table.boolean('isReboot').defaultTo(false) diff --git a/BACKEND/providers/socket_io_provider.ts b/BACKEND/providers/socket_io_provider.ts index 4061e23..7919d41 100644 --- a/BACKEND/providers/socket_io_provider.ts +++ b/BACKEND/providers/socket_io_provider.ts @@ -50,6 +50,7 @@ export class WebSocketIo { intervalMap: { [key: string]: NodeJS.Timeout } = {} stationMap: Map = new Map() lineMap: Map = new Map() // key = lineId + lineConnecting: number[] = [] // key = lineId constructor(protected app: ApplicationService) {} @@ -94,15 +95,19 @@ export class WebSocketIo { for (const lineId of lineIds) { const line = this.lineMap.get(lineId) if (line) { + this.lineConnecting.filter((el) => el !== lineId) this.setTimeoutConnect(lineId, line) line.writeCommand(command) } else { + if (this.lineConnecting.includes(lineId)) continue const linesData = await Line.findBy('id', lineId) const stationData = await Station.findBy('id', stationId) if (linesData && stationData) { + this.lineConnecting.push(lineId) await this.connectLine(io, [linesData], stationData) const lineReconnect = this.lineMap.get(lineId) if (lineReconnect) { + this.lineConnecting.filter((el) => el !== lineId) this.setTimeoutConnect(lineId, lineReconnect) lineReconnect.writeCommand(command) } @@ -131,7 +136,7 @@ export class WebSocketIo { line.runScript(scenario) } else { const linesData = await Line.findBy('id', lineId) - const stationData = await Station.findBy('id', data.stationId) + const stationData = await Station.findBy('id', data.station_id) if (linesData && stationData) { await this.connectLine(io, [linesData], stationData) const lineReconnect = this.lineMap.get(lineId) diff --git a/FRONTEND/index.html b/FRONTEND/index.html index a65cfb7..924cbf9 100644 --- a/FRONTEND/index.html +++ b/FRONTEND/index.html @@ -2,7 +2,7 @@ - + Automation Test diff --git a/FRONTEND/package-lock.json b/FRONTEND/package-lock.json index 92c0a2c..141d0c1 100644 --- a/FRONTEND/package-lock.json +++ b/FRONTEND/package-lock.json @@ -10,6 +10,8 @@ "dependencies": { "@mantine/core": "^8.3.5", "@mantine/dates": "^8.3.5", + "@mantine/form": "^8.3.5", + "@mantine/hooks": "^8.3.5", "@mantine/notifications": "^8.3.5", "@tabler/icons-react": "^3.35.0", "@xterm/addon-fit": "^0.10.0", @@ -1114,12 +1116,24 @@ "react-dom": "^18.x || ^19.x" } }, + "node_modules/@mantine/form": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/@mantine/form/-/form-8.3.5.tgz", + "integrity": "sha512-i9UFiHtO1dlrJXZkquyt+71YcNNxPPSkIcJCRp7k0Tif7bPqWK2xijPDEXzqvA53YvMvEMoqaQCEQLVmH7Esdg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "klona": "^2.0.6" + }, + "peerDependencies": { + "react": "^18.x || ^19.x" + } + }, "node_modules/@mantine/hooks": { "version": "8.3.5", "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.5.tgz", "integrity": "sha512-0Wf08eWLKi3WkKlxnV1W5vfuN6wcvAV2VbhQlOy0R9nrWorGTtonQF6qqBE3PnJFYF1/ZE+HkYZQ/Dr7DmYSMQ==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "^18.x || ^19.x" } @@ -2631,7 +2645,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -3115,6 +3128,15 @@ "json-buffer": "3.0.1" } }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", diff --git a/FRONTEND/package.json b/FRONTEND/package.json index da42df5..fc6e012 100644 --- a/FRONTEND/package.json +++ b/FRONTEND/package.json @@ -12,6 +12,8 @@ "dependencies": { "@mantine/core": "^8.3.5", "@mantine/dates": "^8.3.5", + "@mantine/form": "^8.3.5", + "@mantine/hooks": "^8.3.5", "@mantine/notifications": "^8.3.5", "@tabler/icons-react": "^3.35.0", "@xterm/addon-fit": "^0.10.0", diff --git a/FRONTEND/public/icon-ATC-removebg.png b/FRONTEND/public/icon-ATC-removebg.png new file mode 100644 index 0000000000000000000000000000000000000000..4407f36c99194fc4a553f4816e8012541880eb80 GIT binary patch literal 86897 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 Qz=n>t4D`^*I)o$ce*)Ui3IG5A literal 0 HcmV?d00001 diff --git a/FRONTEND/src/App.tsx b/FRONTEND/src/App.tsx index c1b9f2a..f02baa0 100644 --- a/FRONTEND/src/App.tsx +++ b/FRONTEND/src/App.tsx @@ -4,7 +4,7 @@ import "@mantine/notifications/styles.css"; import "./App.css"; import classes from "./App.module.css"; -import { useEffect, useState } from "react"; +import { Suspense, useEffect, useState } from "react"; import { Tabs, Text, @@ -16,20 +16,24 @@ import { ScrollArea, Button, ActionIcon, + LoadingOverlay, } from "@mantine/core"; -import type { LineConfig, TLine, TStation } from "./untils/types"; +import type { IScenario, LineConfig, TLine, TStation } from "./untils/types"; import axios from "axios"; import CardLine from "./components/CardLine"; import { IconEdit, IconSettingsPlus } from "@tabler/icons-react"; import { SocketProvider, useSocket } from "./context/SocketContext"; -import { ButtonDPELP } from "./components/ButtonAction"; +import { ButtonDPELP, ButtonScenario } from "./components/ButtonAction"; +import StationSetting from "./components/FormAddEdit"; +import DrawerScenario from "./components/DrawerScenario"; +import { Notifications } from "@mantine/notifications"; const apiUrl = import.meta.env.VITE_BACKEND_URL; /** * Main Component */ -export function App() { +function App() { document.title = "Automation Test"; const { socket } = useSocket(); const [stations, setStations] = useState([]); @@ -45,6 +49,10 @@ export function App() { }; const [showBottomShadow, setShowBottomShadow] = useState(false); const [isDisable, setIsDisable] = useState(false); + const [isOpenAddStation, setIsOpenAddStation] = useState(false); + const [isEditStation, setIsEditStation] = useState(false); + const [stationEdit, setStationEdit] = useState(); + const [scenarios, setScenarios] = useState([]); // function get list station const getStation = async () => { @@ -62,8 +70,23 @@ export function App() { } }; + // function get list station + const getScenarios = async () => { + try { + const response = await axios.get(apiUrl + "api/scenarios"); + if (response.data.status) { + if (Array.isArray(response.data.data.data)) { + setScenarios(response.data.data.data); + } + } + } catch (error) { + console.log("Error get station", error); + } + }; + useEffect(() => { getStation(); + getScenarios(); }, []); useEffect(() => { @@ -121,7 +144,6 @@ export function App() { return ( - {/* Tabs (Top Bar) */} setActiveTab(id?.toString() || "0")} @@ -146,14 +168,35 @@ export function App() { className={classes.indicator} /> - - - - {Number(activeTab) && ( - + {Number(activeTab) ? ( + { + setStationEdit( + stations.find((el) => el.id === Number(activeTab)) + ); + setIsOpenAddStation(true); + setIsEditStation(true); + }} + > + ) : ( + "" )} + { + setIsOpenAddStation(true); + setIsEditStation(false); + setStationEdit(undefined); + }} + > + + @@ -249,6 +292,11 @@ export function App() { > Connect +
+ + {scenarios.map((el) => ( + { + setSelectedLines([]); + setIsDisable(true); + setTimeout(() => { + setIsDisable(false); + }, 10000); + }} + scenario={el} + /> + ))} ))}
+ + { + setIsOpenAddStation(false); + setIsEditStation(false); + setStationEdit(undefined); + }} + isEdit={isEditStation} + setStations={setStations} + setActiveTab={() => + setActiveTab(stations.length ? stations[0]?.id.toString() : "0") + } + />
); } @@ -275,7 +353,18 @@ export default function Main() { return ( - + + } + > + + + ); diff --git a/FRONTEND/src/components/ButtonAction.tsx b/FRONTEND/src/components/ButtonAction.tsx index 880372c..fe5778a 100644 --- a/FRONTEND/src/components/ButtonAction.tsx +++ b/FRONTEND/src/components/ButtonAction.tsx @@ -1,6 +1,7 @@ import type { Socket } from "socket.io-client"; -import type { TLine } from "../untils/types"; +import type { IScenario, TLine } from "../untils/types"; import { Button } from "@mantine/core"; +import classes from "./Component.module.css"; export const ButtonDPELP = ({ socket, @@ -18,7 +19,7 @@ export const ButtonDPELP = ({ disabled={isDisable} miw={"100px"} // radius="lg" - h={"24px"} + h={"28px"} mr={"5px"} variant="filled" color="#00a164" @@ -130,3 +131,42 @@ export const ButtonDPELP = ({ ); }; + +export const ButtonScenario = ({ + socket, + isDisable, + onClick, + selectedLines, + scenario, +}: { + socket: Socket | null; + isDisable: boolean; + onClick: () => void; + selectedLines: TLine[]; + scenario: IScenario; +}) => { + return ( + + ); +}; diff --git a/FRONTEND/src/components/CardLine.tsx b/FRONTEND/src/components/CardLine.tsx index 140cc0e..36171bd 100644 --- a/FRONTEND/src/components/CardLine.tsx +++ b/FRONTEND/src/components/CardLine.tsx @@ -49,7 +49,7 @@ const CardLine = ({ >
- Line {line.lineNumber} - {line.port}{" "} + Line: {line.lineNumber || line.line_number} - {line.port}{" "} {line.status === "connected" && ( )} diff --git a/FRONTEND/src/components/Component.module.css b/FRONTEND/src/components/Component.module.css index 7a0bb91..697553b 100644 --- a/FRONTEND/src/components/Component.module.css +++ b/FRONTEND/src/components/Component.module.css @@ -13,4 +13,8 @@ gap: 4px; margin-top: 4px; height: 20px; +} + +.buttonScenario :global(.mantine-Button-label) { + white-space: normal !important; } \ No newline at end of file diff --git a/FRONTEND/src/components/DialogConfirm.tsx b/FRONTEND/src/components/DialogConfirm.tsx new file mode 100644 index 0000000..3565434 --- /dev/null +++ b/FRONTEND/src/components/DialogConfirm.tsx @@ -0,0 +1,71 @@ +import { Box, Button, Group, Modal, Text } from "@mantine/core"; +import { useState } from "react"; +const DialogConfirm = ({ + opened, + close, + message, + handle, +}: { + opened: boolean; + close: () => void; + message: string; + handle: () => void; + centered?: boolean; + bottom?: boolean; +}) => { + const [disableBtn, setDisableBtn] = useState(false); + return ( + + + + {message} + + + + + + + + + + ); +}; + +export default DialogConfirm; diff --git a/FRONTEND/src/components/DrawerScenario.tsx b/FRONTEND/src/components/DrawerScenario.tsx new file mode 100644 index 0000000..1b98930 --- /dev/null +++ b/FRONTEND/src/components/DrawerScenario.tsx @@ -0,0 +1,344 @@ +import { useDisclosure } from "@mantine/hooks"; +import { + Drawer, + ActionIcon, + Box, + ScrollArea, + Table, + Grid, + TextInput, + Button, +} from "@mantine/core"; +import { IconSettingsPlus } from "@tabler/icons-react"; +import TableRows from "./Scenario/TableRows"; +import { useEffect, useState } from "react"; +import { useForm } from "@mantine/form"; +import DialogConfirm from "./DialogConfirm"; +import type { IBodyScenario, IScenario } from "../untils/types"; +import classes from "./Component.module.css"; +import axios from "axios"; +import { notifications } from "@mantine/notifications"; +const apiUrl = import.meta.env.VITE_BACKEND_URL; + +function DrawerScenario({ + scenarios, + setScenarios, +}: { + scenarios: IScenario[]; + setScenarios: (value: React.SetStateAction) => void; +}) { + const [opened, { open, close }] = useDisclosure(false); + const [isEdit, setIsEdit] = useState(false); + const [openConfirm, setOpenConfirm] = useState(false); + const [isSubmit, setIsSubmit] = useState(false); + const [dataScenario, setDataScenario] = useState(); + + const form = useForm({ + initialValues: { + title: "", + body: [ + { + expect: "", + send: "", + delay: "0", + repeat: "1", + note: "", + }, + ] as IBodyScenario[], + timeout: "30000", + is_reboot: false, + }, + validate: { + title: (value) => { + if (!value) return "Title is required"; + if (value.length > 100) return "The title cannot exceed 100 characters"; + return null; + }, + body: (value) => { + if (value.length === 0) return "The body is required"; + return null; + }, + timeout: (value) => { + if (!value) return "Title is required"; + return null; + }, + }, + }); + + const addRowUnder = (index: number) => { + const newBody = [...form.values.body]; + newBody.splice(index + 1, 0, { + expect: "", + send: "", + delay: "0", + repeat: "1", + note: "", + }); + form.setFieldValue("body", newBody); + }; + + const deleteRow = (index: number) => { + const newBody = [...form.values.body]; + newBody.splice(index, 1); + form.setFieldValue("body", newBody); + }; + + const handleSave = async () => { + setIsSubmit(true); + try { + const body = form.values.body.map((el: IBodyScenario) => ({ + ...el, + delay: Number(el.delay), + repeat: Number(el.repeat), + })); + + const payload = { + ...form.values, + body: body, + timeout: Number(form.values.timeout), + }; + const url = isEdit ? "api/scenarios/update" : "api/scenarios/create"; + const res = await axios.post( + apiUrl + url, + isEdit ? { ...payload, id: dataScenario?.id } : payload + ); + if (res.data.status === true) { + const scenario = res.data.data; + setScenarios((pre) => + isEdit + ? pre.map((el) => + el.id === scenario.id ? { ...el, ...scenario } : el + ) + : [...pre, scenario] + ); + notifications.show({ + title: "Success", + message: res.data.message, + color: "green", + }); + return; + } + } catch (error) { + console.log(error); + } finally { + setIsSubmit(false); + } + }; + + const handleDelete = async () => { + try { + const response = await axios.post(apiUrl + "api/scenarios/delete", { + id: dataScenario?.id, + }); + if (response.data.status) { + setScenarios((pre) => pre.filter((el) => el.id !== dataScenario?.id)); + notifications.show({ + title: "Success", + message: response.data.message, + color: "green", + }); + } + } catch (error) { + console.log(error); + notifications.show({ + title: "Error", + message: "Error delete scenario", + color: "red", + }); + } + }; + + useEffect(() => { + if (!opened) { + setIsEdit(false); + setIsSubmit(false); + setDataScenario(undefined); + form.reset(); + } + }, [opened]); + + return ( + <> + + + + {scenarios.map((scenario) => ( + + ))} + + + + + + + form.setFieldValue("title", e.target.value) + } + required + /> + + + + form.setFieldValue("timeout", e.target.value) + } + required + /> + + +
+ {isEdit && ( + + )} + +
+
+
+
+
+ + + + + + # + + {/* Expect */} + Expect + + Send + Delay(ms) + Repeat + + + + + {form.values.body.map( + (element: IBodyScenario, i: number) => ( + + ) + )} + +
+
+
+
+
+
+ + { + open(); + }} + > + + + + { + setOpenConfirm(false); + }} + message={"Are you sure delete this station?"} + handle={() => { + setOpenConfirm(false); + handleDelete(); + close(); + }} + centered={true} + /> + + ); +} + +export default DrawerScenario; diff --git a/FRONTEND/src/components/FormAddEdit.tsx b/FRONTEND/src/components/FormAddEdit.tsx new file mode 100644 index 0000000..808db9b --- /dev/null +++ b/FRONTEND/src/components/FormAddEdit.tsx @@ -0,0 +1,663 @@ +import { + ActionIcon, + Box, + Button, + Flex, + Group, + Modal, + NumberInput, + PasswordInput, + Select, + Table, + TextInput, +} from "@mantine/core"; +import { useForm } from "@mantine/form"; +import { useEffect, useState } from "react"; +import type { TLine, TStation } from "../untils/types"; +import DialogConfirm from "./DialogConfirm"; +import axios from "axios"; +import { notifications } from "@mantine/notifications"; +import { IconInputX } from "@tabler/icons-react"; + +const apiUrl = import.meta.env.VITE_BACKEND_URL; + +const lineInit = { + port: 0, + lineNumber: 0, + lineClear: 0, + station_id: 0, + apc_name: "", +}; + +const StationSetting = ({ + isOpen, + isEdit, + onClose, + dataStation, + setStations, + setActiveTab, +}: { + isOpen: boolean; + isEdit: boolean; + onClose: () => void; + dataStation?: TStation; + setStations: (value: React.SetStateAction) => void; + setActiveTab: () => void; +}) => { + const [lines, setLines] = useState([lineInit]); + const [openConfirm, setOpenConfirm] = useState(false); + + const ipRegex = + /(\b25[0-5]|\b2[0-4][0-9]|\b1[0-9]{2}|\b[1-9]?[0-9])\.(\b25[0-5]|\b2[0-4][0-9]|\b1[0-9]{2}|\b[1-9]?[0-9])\.(\b25[0-5]|\b2[0-4][0-9]|\b1[0-9]{2}|\b[1-9]?[0-9])\.(\b25[0-5]|\b2[0-4][0-9]|\b1[0-9]{2}|\b[1-9]?[0-9])\b/g; + const form = useForm({ + initialValues: dataStation, + validate: (values: TStation) => ({ + ip: !ipRegex.test(values.ip) ? "IP address invalid" : null, + }), + }); + + useEffect(() => { + if (dataStation) { + form.setFieldValue("name", dataStation.name); + form.setFieldValue("ip", dataStation.ip); + form.setFieldValue("port", dataStation.port); + form.setFieldValue("netmask", dataStation.netmask); + form.setFieldValue("network", dataStation.network); + form.setFieldValue("gateway", dataStation.gateway); + form.setFieldValue("tftp_ip", dataStation.tftp_ip); + form.setFieldValue("apc_1_ip", dataStation.apc_1_ip); + form.setFieldValue("apc_1_port", dataStation.apc_1_port); + form.setFieldValue("apc_1_username", dataStation.apc_1_username); + form.setFieldValue("apc_1_password", dataStation.apc_1_password); + form.setFieldValue("apc_2_ip", dataStation.apc_2_ip); + form.setFieldValue("apc_2_port", dataStation.apc_2_port); + form.setFieldValue("apc_2_username", dataStation.apc_2_username); + form.setFieldValue("apc_2_password", dataStation.apc_2_password); + form.setFieldValue("switch_control_ip", dataStation.switch_control_ip); + form.setFieldValue( + "switch_control_port", + dataStation.switch_control_port + ); + form.setFieldValue( + "switch_control_username", + dataStation.switch_control_username + ); + form.setFieldValue( + "switch_control_password", + dataStation.switch_control_password + ); + + const dataLine = dataStation.lines.map((value) => ({ + id: value.id, + lineNumber: value.line_number || 0, + port: value.port, + lineClear: value.line_clear || 0, + apc_name: value.apc_name, + outlet: value.outlet, + station_id: value.station_id, + })); + setLines(dataLine); + } + }, [dataStation]); + + useEffect(() => { + if (lines.length > 0) { + const lastLine = lines[lines.length - 1]; + if (lastLine?.lineNumber || lastLine?.port) + setLines((pre) => [...pre, lineInit]); + } + }, [lines]); + + useEffect(() => { + if (!isOpen) { + setLines([lineInit]); + setOpenConfirm(false); + form.reset(); + } + }, [isOpen]); + + const renderLinesTable = () => { + const rows = lines?.map((row: TLine, index: number) => { + return ( + + + + setLines((pre) => + pre.map((value, i) => + i === index ? { ...value, lineNumber: Number(e!) } : value + ) + ) + } + /> + + + + setLines((pre) => + pre.map((value, i) => + i === index ? { ...value, port: Number(e!) } : value + ) + ) + } + /> + + + + setLines((pre) => + pre.map((value, i) => + i === index ? { ...value, lineClear: Number(e!) } : value + ) + ) + } + /> + + +