diff --git a/README.md b/README.md index ef6d1ce..3f089ad 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,34 @@ Run `npm ci` Run `npm run dev` +## Testing the API + +This program fetch the data structure from others application, allowing it to assemble them later. + +### With NodeJS + +```bash +node run ./test-server/node-http.js +``` + +The web server will be running at `http://localhost:5000` + +Configure the file `.env.development` with the url + + +### With bun + +Install `bun` + +Inside `test-server` folder, run : + +```bash +bun run http.js +``` + +The web server will be running at `http://localhost:5000` + +Configure the file `.env.development` with the url # Deploy @@ -33,39 +61,3 @@ Run `npm run build` Run `npm ci` Run `npm test` - - -# API - -You can preload a state by setting the `state` URL parameter -with a url address to a `state.json` file. - -Example: `http://localhost:4000/?state=http://localhost:5000/state.json` - -# Testing the external API - -This program fetch the data structure from others applications, allowing it to assemble them later. - -## With NodeJS - -```bash -node run ./test-server/node-http.js -``` - -The web server will be running at `http://localhost:5000` - -Configure the file `.env.development` with the url - -## With bun.sh - -Install `bun` - -Inside `test-server` folder, run : - -```bash -bun run http.js -``` - -The web server will be running at `http://localhost:5000` - -Configure the file `.env.development` with the url \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 2b8c7fd..e6ea857 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import './App.scss'; import { MainMenu } from './Components/MainMenu/MainMenu'; -import { ContainerModel, findContainerById, IContainerModel, MakeIterator } from './Interfaces/ContainerModel'; +import { ContainerModel, findContainerById, IContainerModel, MakeIterator } from './Components/SVG/Elements/ContainerModel'; import Editor, { IEditorState } from './Editor'; import { AvailableContainer } from './Interfaces/AvailableContainer'; import { Configuration } from './Interfaces/Configuration'; @@ -40,22 +40,6 @@ export class App extends React.Component { }; } - componentDidMount() { - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - const state = urlParams.get('state'); - - if (state === null) { - return; - } - - fetch(state) - .then((response) => response.json()) - .then((data: IEditorState) => { - this.LoadState(data); - }); - } - public NewEditor() { // Fetch the configuration from the API fetchConfiguration().then((configuration: Configuration) => { @@ -102,22 +86,18 @@ export class App extends React.Component { const result = reader.result as string; const editorState: IEditorState = JSON.parse(result); - this.LoadState(editorState); + Revive(editorState); + + this.setState({ + configuration: editorState.configuration, + history: editorState.history, + historyCurrentStep: editorState.historyCurrentStep, + isLoaded: true + } as IAppState); }); reader.readAsText(file); } - private LoadState(editorState: IEditorState) { - Revive(editorState); - - this.setState({ - configuration: editorState.configuration, - history: editorState.history, - historyCurrentStep: editorState.historyCurrentStep, - isLoaded: true - } as IAppState); - } - public render() { if (this.state.isLoaded) { return ( diff --git a/src/Components/ElementsSidebar/ElementsSidebar.tsx b/src/Components/ElementsSidebar/ElementsSidebar.tsx index c4ea51a..4e599ef 100644 --- a/src/Components/ElementsSidebar/ElementsSidebar.tsx +++ b/src/Components/ElementsSidebar/ElementsSidebar.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { motion } from 'framer-motion'; import { Properties } from '../Properties/Properties'; -import { IContainerModel, getDepth, MakeIterator } from '../../Interfaces/ContainerModel'; +import { IContainerModel, getDepth, MakeIterator } from '../SVG/Elements/ContainerModel'; interface IElementsSidebarProps { MainContainer: IContainerModel | null, @@ -13,7 +13,7 @@ interface IElementsSidebarProps { selectContainer: (container: IContainerModel) => void } -export class ElementsSidebar extends React.PureComponent { +export class ElementsSidebar extends React.Component { public iterateChilds(handleContainer: (container: IContainerModel) => void): React.ReactNode { if (!this.props.MainContainer) { return null; @@ -53,7 +53,7 @@ export class ElementsSidebar extends React.PureComponent duration: 0.150 }} className={ - `w-full elements-sidebar-row whitespace-pre + `w-full elements-sidebar-row whitespace-pre text-left text-sm font-medium transition-all ${selectedClass}` } key={key} diff --git a/src/Components/FloatingButton/FloatingButton.tsx b/src/Components/FloatingButton/FloatingButton.tsx deleted file mode 100644 index 544c2bd..0000000 --- a/src/Components/FloatingButton/FloatingButton.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import * as React from 'react'; -import { MenuIcon, XIcon } from '@heroicons/react/outline'; - -interface IFloatingButtonProps { - children: React.ReactNode[] | React.ReactNode - className: string -} - -const toggleState = ( - isHidden: boolean, - setHidden: React.Dispatch> -) => { - setHidden(!isHidden); -}; - -const FloatingButton: React.FC = (props: IFloatingButtonProps) => { - const [isHidden, setHidden] = React.useState(true); - const buttonListClasses = isHidden ? 'invisible opacity-0' : 'visible opacity-100'; - const icon = isHidden - ? - : ; - - return ( -
-
- { props.children } -
- -
); -}; - -export default FloatingButton; diff --git a/src/Components/History/History.tsx b/src/Components/History/History.tsx index e77a8c7..750fcc7 100644 --- a/src/Components/History/History.tsx +++ b/src/Components/History/History.tsx @@ -9,7 +9,7 @@ interface IHistoryProps { jumpTo: (move: number) => void } -export class History extends React.PureComponent { +export class History extends React.Component { public render() { const isOpenClasses = this.props.isOpen ? 'right-0' : '-right-64'; @@ -33,7 +33,7 @@ export class History extends React.PureComponent { key={move} onClick={() => this.props.jumpTo(move)} className={ - `w-full elements-sidebar-row whitespace-pre + `w-full elements-sidebar-row whitespace-pre text-left text-sm font-medium transition-all ${selectedClass}` } > diff --git a/src/Components/Properties/Properties.tsx b/src/Components/Properties/Properties.tsx index 65cfefd..e75e86b 100644 --- a/src/Components/Properties/Properties.tsx +++ b/src/Components/Properties/Properties.tsx @@ -6,7 +6,20 @@ interface IPropertiesProps { onChange: (key: string, value: string) => void } -export class Properties extends React.PureComponent { +interface IPropertiesState { + hasUpdate: boolean +} + +export class Properties extends React.Component { + public state: IPropertiesState; + + constructor(props: IPropertiesProps) { + super(props); + this.state = { + hasUpdate: false + }; + } + public render() { if (this.props.properties === undefined) { return
; @@ -29,7 +42,7 @@ export class Properties extends React.PureComponent { groupInput: React.ReactNode[] ) => { const id = `property-${key}`; - const type = 'text'; + const type = isNaN(Number(value)) ? 'text' : 'number'; const isDisabled = key === 'id' || key === 'parentId'; // hardcoded groupInput.push(
diff --git a/src/Components/SVG/Elements/Container.tsx b/src/Components/SVG/Elements/Container.tsx index a352bcd..ab8d92c 100644 --- a/src/Components/SVG/Elements/Container.tsx +++ b/src/Components/SVG/Elements/Container.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { getDepth, IContainerModel } from '../../../Interfaces/ContainerModel'; +import { getDepth, IContainerModel } from './ContainerModel'; import { Dimension } from './Dimension'; export interface IContainerProps { @@ -8,16 +8,15 @@ export interface IContainerProps { const GAP = 50; -export class Container extends React.PureComponent { +export class Container extends React.Component { /** * Render the container * @returns Render the container */ public render(): React.ReactNode { - const containersElements = this.props.model.children.map(child => ); + const containersElements = this.props.model.children.map(child => new Container({ model: child } as IContainerProps).render()); const xText = Number(this.props.model.properties.width) / 2; const yText = Number(this.props.model.properties.height) / 2; - const transform = `translate(${Number(this.props.model.properties.x)}, ${Number(this.props.model.properties.y)})`; // g style const defaultStyle = { @@ -47,7 +46,7 @@ export class Container extends React.PureComponent { return ( { +export class Dimension extends React.Component { public render() { const style = { stroke: 'black' diff --git a/src/Components/SVG/Elements/DimensionLayer.tsx b/src/Components/SVG/Elements/DimensionLayer.tsx index 3a3dee8..610177b 100644 --- a/src/Components/SVG/Elements/DimensionLayer.tsx +++ b/src/Components/SVG/Elements/DimensionLayer.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { ContainerModel, getDepth, MakeIterator } from '../../../Interfaces/ContainerModel'; +import { ContainerModel, getDepth, MakeIterator } from './ContainerModel'; import { Dimension } from './Dimension'; interface IDimensionLayerProps { @@ -22,16 +22,15 @@ const getDimensionsNodes = (root: ContainerModel): React.ReactNode[] => { const y = -(GAP * (getDepth(container) + 1)); const strokeWidth = 1; const text = width.toString(); - dimensions.push( - - ); + const dimension = new Dimension({ + id, + xStart, + xEnd, + y, + strokeWidth, + text + }); + dimensions.push(dimension.render()); } return dimensions; }; diff --git a/src/Components/SVG/Elements/Selector.tsx b/src/Components/SVG/Elements/Selector.tsx index de6d9a3..6fc1b9b 100644 --- a/src/Components/SVG/Elements/Selector.tsx +++ b/src/Components/SVG/Elements/Selector.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { IContainerModel, getAbsolutePosition } from '../../../Interfaces/ContainerModel'; +import { IContainerModel, getAbsolutePosition } from './ContainerModel'; interface ISelectorProps { selected: IContainerModel | null diff --git a/src/Components/SVG/SVG.tsx b/src/Components/SVG/SVG.tsx index bf8704b..9583571 100644 --- a/src/Components/SVG/SVG.tsx +++ b/src/Components/SVG/SVG.tsx @@ -1,75 +1,90 @@ import * as React from 'react'; import { ReactSVGPanZoom, Tool, Value, TOOL_PAN } from 'react-svg-pan-zoom'; import { Container } from './Elements/Container'; -import { ContainerModel } from '../../Interfaces/ContainerModel'; +import { ContainerModel } from './Elements/ContainerModel'; import { Selector } from './Elements/Selector'; interface ISVGProps { - width: number, - height: number, children: ContainerModel | ContainerModel[] | null, selected: ContainerModel | null } interface ISVGState { + viewBox: number[], value: Value, tool: Tool } -export class SVG extends React.PureComponent { +export class SVG extends React.Component { public state: ISVGState; - public static ID = 'svg'; + public svg: React.RefObject; constructor(props: ISVGProps) { super(props); this.state = { + viewBox: [ + 0, + 0, + window.innerWidth, + window.innerHeight + ], value: { viewerWidth: window.innerWidth, viewerHeight: window.innerHeight } as Value, tool: TOOL_PAN }; + this.svg = React.createRef(); + } + + resizeViewBox() { + this.setState({ + viewBox: [ + 0, + 0, + window.innerWidth, + window.innerHeight + ] + }); + } + + componentDidMount() { + window.addEventListener('resize', this.resizeViewBox.bind(this)); + } + + componentWillUnmount() { + window.removeEventListener('resize', this.resizeViewBox.bind(this)); } render() { const xmlns = ''; const properties = { - width: this.props.width, - height: this.props.height, + viewBox: this.state.viewBox.join(' '), xmlns }; let children: React.ReactNode | React.ReactNode[] = []; if (Array.isArray(this.props.children)) { - children = this.props.children.map(child => ); + children = this.props.children.map(child => new Container({ model: child }).render()); } else if (this.props.children !== null) { - children = ; + children = new Container({ model: this.props.children }).render(); } return ( -
- this.setState({ value })} - tool={this.state.tool} onChangeTool={tool => this.setState({ tool })} - miniatureProps={{ - position: 'left', - background: '#616264', - width: window.innerWidth - 12, - height: 120 - }} - > - - { children } - - - -
- + this.setState({ value })} + tool={this.state.tool} onChangeTool={tool => this.setState({ tool })} + > + + { children } + + + ); }; } diff --git a/src/Components/Sidebar/Sidebar.tsx b/src/Components/Sidebar/Sidebar.tsx index dd34812..af08ce9 100644 --- a/src/Components/Sidebar/Sidebar.tsx +++ b/src/Components/Sidebar/Sidebar.tsx @@ -8,7 +8,7 @@ interface ISidebarProps { buttonOnClick: (type: string) => void; } -export default class Sidebar extends React.PureComponent { +export default class Sidebar extends React.Component { public render() { const listElements = this.props.componentOptions.map(componentOption => - + { current.MainContainer } - - - - - +
); } diff --git a/src/index.scss b/src/index.scss index ad410c8..c7e0d50 100644 --- a/src/index.scss +++ b/src/index.scss @@ -10,12 +10,9 @@ @apply pl-6 pr-6 pt-2 pb-2 w-full } .close-button { - @apply transition-all w-full h-auto p-4 flex + @apply transition-all w-full h-auto p-4 flex } .mainmenu-btn { @apply transition-all bg-blue-100 hover:bg-blue-200 text-blue-700 text-lg font-semibold p-8 rounded-lg } - .floating-btn { - @apply h-full w-full text-white align-middle items-center justify-center - } } \ No newline at end of file diff --git a/src/tests/resources/state.json b/src/tests/resources/state.json deleted file mode 100644 index 2152cd1..0000000 --- a/src/tests/resources/state.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "isSidebarOpen": true, - "isElementsSidebarOpen": false, - "isHistoryOpen": false, - "configuration": { - "AvailableContainers": [ - { - "Type": "Chassis", - "Width": 500, - "Style": { - "fillOpacity": 0, - "borderWidth": 2, - "stroke": "red" - } - }, - { - "Type": "Trou", - "Width": 300, - "Style": { - "fillOpacity": 0, - "borderWidth": 2, - "stroke": "green" - } - }, - { - "Type": "Montant", - "Width": 100, - "Style": { - "fillOpacity": 0, - "borderWidth": 2, - "stroke": "blue", - "transform": "translateX(-50%)", - "transformOrigin": "center", - "transformBox": "fill-box" - } - } - ], - "AvailableSymbols": [ - { - "Height": 0, - "Image": { - "Base64Image": null, - "Name": null, - "Svg": null, - "Url": "https://www.manutan.fr/img/S/GRP/ST/AIG3930272.jpg" - }, - "Name": "Poteau structure", - "Width": 0, - "XPositionReference": 1 - }, - { - "Height": 0, - "Image": { - "Base64Image": null, - "Name": null, - "Svg": null, - "Url": "https://e7.pngegg.com/pngimages/647/127/png-clipart-svg-working-group-information-world-wide-web-internet-structure.png" - }, - "Name": "Joint de structure", - "Width": 0, - "XPositionReference": 0 - } - ], - "MainContainer": { - "Height": 200, - "Width": 1000 - } - }, - "history": [ - { - "MainContainer": { - "children": [], - "properties": { - "id": "main", - "parentId": "null", - "x": 0, - "y": 0, - "width": 1000, - "height": 200, - "fillOpacity": 0, - "stroke": "black" - }, - "userData": {} - }, - "TypeCounters": {} - }, - { - "MainContainer": { - "children": [ - { - "children": [], - "properties": { - "id": "Chassis-0", - "parentId": "main", - "x": 0, - "y": 0, - "width": 500, - "height": 200, - "fillOpacity": 0, - "borderWidth": 2, - "stroke": "red" - }, - "userData": { - "type": "Chassis" - } - } - ], - "properties": { - "id": "main", - "parentId": "null", - "x": 0, - "y": 0, - "width": 1000, - "height": 200, - "fillOpacity": 0, - "stroke": "black" - }, - "userData": {} - }, - "TypeCounters": { - "Chassis": 0 - }, - "SelectedContainerId": "main" - }, - { - "MainContainer": { - "children": [ - { - "children": [], - "properties": { - "id": "Chassis-0", - "parentId": "main", - "x": 0, - "y": 0, - "width": 500, - "height": 200, - "fillOpacity": 0, - "borderWidth": 2, - "stroke": "red" - }, - "userData": { - "type": "Chassis" - } - }, - { - "children": [], - "properties": { - "id": "Chassis-1", - "parentId": "main", - "x": 500, - "y": 0, - "width": 500, - "height": 200, - "fillOpacity": 0, - "borderWidth": 2, - "stroke": "red" - }, - "userData": { - "type": "Chassis" - } - } - ], - "properties": { - "id": "main", - "parentId": "null", - "x": 0, - "y": 0, - "width": 1000, - "height": 200, - "fillOpacity": 0, - "stroke": "black" - }, - "userData": {} - }, - "TypeCounters": { - "Chassis": 1 - }, - "SelectedContainerId": "main" - } - ], - "historyCurrentStep": 2 -} \ No newline at end of file diff --git a/test-server/http.js b/test-server/http.js index c4f3238..043229c 100644 --- a/test-server/http.js +++ b/test-server/http.js @@ -3,31 +3,22 @@ import { serve } from 'bun'; serve({ port: 5000, - async fetch(request) { + fetch(request) { console.log(`${request.method}: ${request.url}`); if (request.method === 'POST') { const url = new URL(request.url); let json; if (url.pathname === '/GetSVGLayoutConfiguration') { - json = GetSVGLayoutConfiguration(); - } else if (url.pathname === '/ApplicationState') { - const bodyParsed = await request.json(); - console.log(bodyParsed); - switch (bodyParsed.Action) { - case 'FillHoleWithChassis': - json = FillHoleWithChassis(bodyParsed); - break; - case 'SplitRemplissage': - json = SplitRemplissage(bodyParsed); - break; - default: - break; - } + json = JSON.stringify(GetSVGLayoutConfiguration()); + } else if (url.pathname === '/FillHoleWithChassis') { + json = JSON.stringify(FillHoleWithChassis(request)); + } else if (url.pathname === '/SplitRemplissage') { + json = JSON.stringify(SplitRemplissage(request)); } else { // TODO: Return 404 rather than this - json = GetSVGLayoutConfiguration(); + json = JSON.stringify(GetSVGLayoutConfiguration()); } - return new Response(JSON.stringify(json), { + return new Response(json, { status: 200, headers: { 'Content-Type': 'application/json', @@ -52,8 +43,23 @@ const GetSVGLayoutConfiguration = () => { return { AvailableContainers: [ { + BodyColor: null, + BorderColor: '#ff0000', + BorderWidth: 48, + ContainerActions: null, + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 3000, + MinHeight: 0, + MinWidth: 500, Type: 'Chassis', + TypeChildContainerDefault: 'Trou', Width: 500, + XPositionReference: 0, Style: { fillOpacity: 0, borderWidth: 2, @@ -61,25 +67,158 @@ const GetSVGLayoutConfiguration = () => { } }, { + BodyColor: null, + BorderColor: '#FFFFFF', + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, Type: 'Trou', - Width: 300, - Style: { - fillOpacity: 0, - borderWidth: 2, - stroke: 'green' - } + TypeChildContainerDefault: 'Remplissage', + Width: 0, + XPositionReference: 0 }, { + BodyColor: '#99C8FF', + BorderColor: '#00FF00', + BorderWidth: 0, + ContainerActions: [ + { + Action: 'SplitRemplissage', + AddingBehavior: 0, + CustomLogo: { + Base64Image: null, + Name: null, + Svg: null, + Url: '' + }, + Description: 'Diviser le remplissage en insérant un montant', + Id: null, + Label: 'Diviser le remplissage' + } + ], + ContainerDimensionning: { + DimensionningStyle: 1, + ShowDimensionning: false, + ShowLabel: false + }, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Remplissage', + TypeChildContainerDefault: null, + Width: 0, + XPositionReference: 0 + }, + { + BodyColor: '#FFA947', + BorderColor: '#FFA947', + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, Type: 'Montant', - Width: 100, - Style: { - fillOpacity: 0, - borderWidth: 2, - stroke: 'blue', - transform: 'translateX(-50%)', - transformOrigin: 'center', - transformBox: 'fill-box' - } + TypeChildContainerDefault: null, + Width: 50, + XPositionReference: 1 + }, + { + BodyColor: '#FFA3D1', + BorderColor: '#FF6DE6', + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: { + DimensionningStyle: 0, + ShowDimensionning: false, + ShowLabel: false + }, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Ouverture', + TypeChildContainerDefault: null, + Width: 0, + XPositionReference: 0 + }, + { + BodyColor: '#000000', + BorderColor: null, + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: { + DimensionningStyle: 0, + ShowDimensionning: false, + ShowLabel: false + }, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Dilatation', + TypeChildContainerDefault: null, + Width: 8, + XPositionReference: 0 + }, + { + BodyColor: '#dee2e4', + BorderColor: '#54616c', + BorderWidth: 0, + ContainerActions: [ + { + Action: 'FillHoleWithChassis', + AddingBehavior: 1, + CustomLogo: { + Base64Image: null, + Name: null, + Svg: null, + Url: '' + }, + Description: 'Remplir le trou avec des châssis', + Id: null, + Label: 'Calepiner' + } + ], + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: '', + TypeChildContainerDefault: null, + Width: 0, + XPositionReference: 0 } ], AvailableSymbols: [ @@ -109,26 +248,41 @@ const GetSVGLayoutConfiguration = () => { } ], MainContainer: { + BodyColor: null, + BorderColor: '#FFFFFF', + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: null, + DefaultChildrenContainers: null, Height: 200, - Width: 1000 + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Trou', + TypeChildContainerDefault: null, + Width: 1000, + XPositionReference: 0 } }; }; const FillHoleWithChassis = (request) => { const maxWidthChassis = 3000; - const nbChassis = Math.ceil(request.ContainerAction.Width / maxWidthChassis); + const nbChassis = Math.ceil(request.ContainerActions.Width / maxWidthChassis); const lstModels = []; for (let i = 0; i <= nbChassis; i++) { if (i === 1 && request.ContainerAction.ExistOnBefore) { - lstModels.push({ Type: 'Dilatation' }); + lstModels.Add({ Type: 'Dilatation' }); } - lstModels.push({ Type: 'Chassis' }); + lstModels.Add({ Type: 'Chassis' }); if (i < nbChassis) { - lstModels.push({ Type: 'Dilatation' }); + lstModels.Add({ Type: 'Dilatation' }); } if (i === nbChassis && request.ContainerAction.ExistOnAfter) { - lstModels.push({ Type: 'Dilatation' }); + lstModels.Add({ Type: 'Dilatation' }); } } return { diff --git a/test-server/node-http.js b/test-server/node-http.js index e6c0d74..b78fe50 100644 --- a/test-server/node-http.js +++ b/test-server/node-http.js @@ -2,39 +2,27 @@ import http from 'http'; const host = 'localhost'; const port = 5000; -const requestListener = async(request, response) => { - response.setHeader('Access-Control-Allow-Origin', '*'); - response.setHeader('Access-Control-Allow-Headers', '*'); - response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS'); +const requestListener = function(request, response) { if (request.method === 'POST') { + response.setHeader('Access-Control-Allow-Origin', '*'); response.setHeader('Content-Type', 'application/json'); const url = request.url; let json; - if (url === '/ApplicationState') { - const buffers = []; - for await (const chunk of request) { - buffers.push(chunk); - } - const data = Buffer.concat(buffers).toString(); - const bodyParsed = JSON.parse(data); - console.log(bodyParsed); - switch (bodyParsed.Action) { - case 'FillHoleWithChassis': - json = FillHoleWithChassis(bodyParsed); - break; - case 'SplitRemplissage': - json = SplitRemplissage(bodyParsed); - break; - default: - break; - } + if (url === '/GetSVGLayoutConfiguration') { + json = GetSVGLayoutConfiguration(); + } else if (url === '/FillHoleWithChassis') { + json = FillHoleWithChassis(request); + } else if (url === '/SplitRemplissage') { + json = SplitRemplissage(request); } else { - // TODO: Return 404 rather than this + // TODO: Return 404 rather than this json = GetSVGLayoutConfiguration(); } response.writeHead(200); return response.end(JSON.stringify(json)); } else if (request.method === 'OPTIONS') { + response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS'); + response.setHeader('Access-Control-Allow-Headers', '*'); response.writeHead(200); return response.end(); } @@ -281,18 +269,18 @@ const GetSVGLayoutConfiguration = () => { const FillHoleWithChassis = (request) => { const maxWidthChassis = 3000; - const nbChassis = Math.ceil(request.ContainerAction.Width / maxWidthChassis); + const nbChassis = Math.ceil(request.ContainerActions.Width / maxWidthChassis); const lstModels = []; for (let i = 0; i <= nbChassis; i++) { if (i === 1 && request.ContainerAction.ExistOnBefore) { - lstModels.push({ Type: 'Dilatation' }); + lstModels.Add({ Type: 'Dilatation' }); } - lstModels.push({ Type: 'Chassis' }); + lstModels.Add({ Type: 'Chassis' }); if (i < nbChassis) { - lstModels.push({ Type: 'Dilatation' }); + lstModels.Add({ Type: 'Dilatation' }); } if (i === nbChassis && request.ContainerAction.ExistOnAfter) { - lstModels.push({ Type: 'Dilatation' }); + lstModels.Add({ Type: 'Dilatation' }); } } return {