From 7f3f6a489a4d47545d2ebec0ce7e6522770fc772 Mon Sep 17 00:00:00 2001 From: Eric Nguyen Date: Thu, 25 Aug 2022 13:28:32 +0000 Subject: [PATCH] Merged PR 167: Add Flex and fix bugs (read desc) Note: The branch name does not fit the new features. - Implement Flex with simplex - Enable rigid body by default (removed IsRigidBody property) <=== possibly a bad idea - Sort children in add and update properties - Implement MaxWidth - Add more docs Fixes : - .env.production url - Symbols: not blocking the linked container when the parent is moving --- .env.production | 2 +- .gitattributes | 3 + README.md | 1 + ...17-WG-11328-SYME-VERNUCCI-DET BF ind A.pdf | 3 + ...17-WG-11328-SYME-VERNUCCI-DET BF ind B.pdf | 3 + docs/Eric BF/03_SYME KLINE cde BV.pdf | 3 + .../04_ARC KL_K1485985-ARC-K1485985.pdf | 3 + docs/Eric BF/05_DT_K1485985.pdf | 3 + docs/Eric BF/06_ Photo IMG_1406.jpg | 3 + ...37 - BANDE FILANTE PLAN 01 à 07 -IND B.dwg | 3 + ...37 - BANDE FILANTE PLAN 01 à 07 -IND B.pdf | 3 + docs/Eric BF/image0000001.jpg | 3 + docs/assets/yule-log-cake.jpg | Bin 187625 -> 131 bytes public/Interfaces.d.ts | 2 +- .../ContainerProperties/ContainerForm.tsx | 105 ++++++-- .../ContainerProperties.test.tsx | 5 +- .../ContainerProperties.tsx | 3 +- .../Editor/Actions/ContainerOperations.ts | 159 ++++++++--- .../Editor/Behaviors/AnchorBehaviors.ts | 2 +- src/Components/Editor/Behaviors/Behaviors.ts | 7 +- .../Editor/Behaviors/FlexBehaviors.ts | 144 ++++++++++ .../Editor/Behaviors/RigidBodyBehaviors.ts | 6 +- .../Editor/Behaviors/SymbolBehaviors.ts | 3 + src/Components/Editor/Editor.tsx | 38 +-- .../ElementsSidebar/ElementsSidebar.test.tsx | 40 ++- .../ElementsSidebar/ElementsSidebar.tsx | 92 ++++--- .../ElementsSidebar/MouseEventHandlers.ts | 94 ------- src/Components/SVG/Elements/Container.tsx | 44 ++-- src/Components/SVG/Elements/Selector.tsx | 13 +- src/Components/UI/UI.tsx | 9 +- src/Enums/AddMethod.ts | 4 +- src/Enums/PropertyType.ts | 22 ++ src/Events/EditorEvents.ts | 35 ++- src/Interfaces/IAvailableContainer.ts | 4 + src/Interfaces/IContainerProperties.ts | 18 +- src/Interfaces/IMargin.ts | 6 + src/utils/default.ts | 20 +- src/utils/itertools.ts | 53 +++- src/utils/saveload.ts | 51 ++-- src/utils/simplex.ts | 246 ++++++++++++++++++ src/utils/svg.ts | 76 ++++++ test-server/http.js | 38 ++- test-server/node-http.js | 208 ++++----------- 43 files changed, 1127 insertions(+), 453 deletions(-) create mode 100644 docs/Eric BF/01_141017-WG-11328-SYME-VERNUCCI-DET BF ind A.pdf create mode 100644 docs/Eric BF/02_141017-WG-11328-SYME-VERNUCCI-DET BF ind B.pdf create mode 100644 docs/Eric BF/03_SYME KLINE cde BV.pdf create mode 100644 docs/Eric BF/04_ARC KL_K1485985-ARC-K1485985.pdf create mode 100644 docs/Eric BF/05_DT_K1485985.pdf create mode 100644 docs/Eric BF/06_ Photo IMG_1406.jpg create mode 100644 docs/Eric BF/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.dwg create mode 100644 docs/Eric BF/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.pdf create mode 100644 docs/Eric BF/image0000001.jpg create mode 100644 src/Components/Editor/Behaviors/FlexBehaviors.ts create mode 100644 src/Enums/PropertyType.ts create mode 100644 src/Interfaces/IMargin.ts create mode 100644 src/utils/simplex.ts diff --git a/.env.production b/.env.production index 28d2829..b2c8524 100644 --- a/.env.production +++ b/.env.production @@ -1,2 +1,2 @@ -VITE_API_URL=https://localhost/SmartMenuiserieTemplate \ No newline at end of file +VITE_API_URL=https://localhost/SmartMenuiserieTemplate/Service.svc/GetSVGLayoutConfiguration \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index 2def8a6..7118888 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,4 @@ *.drawio filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.dwg filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md index 895f9b3..a3d003d 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Requierements : - NodeJS - npm - pnpm (optional but recommanded unless you prefer having a huge `node_modules` directory) +- Chrome > 98 # Developping diff --git a/docs/Eric BF/01_141017-WG-11328-SYME-VERNUCCI-DET BF ind A.pdf b/docs/Eric BF/01_141017-WG-11328-SYME-VERNUCCI-DET BF ind A.pdf new file mode 100644 index 0000000..9b78c58 --- /dev/null +++ b/docs/Eric BF/01_141017-WG-11328-SYME-VERNUCCI-DET BF ind A.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4d97d35d32b6201f0795bbc2b61b475222b23f93652e69f45b1f66d8165d257 +size 765789 diff --git a/docs/Eric BF/02_141017-WG-11328-SYME-VERNUCCI-DET BF ind B.pdf b/docs/Eric BF/02_141017-WG-11328-SYME-VERNUCCI-DET BF ind B.pdf new file mode 100644 index 0000000..c208e81 --- /dev/null +++ b/docs/Eric BF/02_141017-WG-11328-SYME-VERNUCCI-DET BF ind B.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5af9380fda7a9c9b416ce6e58a21fbd6737b3ed9be06b59f94991903ac667d3a +size 771067 diff --git a/docs/Eric BF/03_SYME KLINE cde BV.pdf b/docs/Eric BF/03_SYME KLINE cde BV.pdf new file mode 100644 index 0000000..3ffaf14 --- /dev/null +++ b/docs/Eric BF/03_SYME KLINE cde BV.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a4ca2dbff7444a802297e5d2a46930cca8b9a4ed801cb2315b37fe8ef54bf10 +size 2230676 diff --git a/docs/Eric BF/04_ARC KL_K1485985-ARC-K1485985.pdf b/docs/Eric BF/04_ARC KL_K1485985-ARC-K1485985.pdf new file mode 100644 index 0000000..f737334 --- /dev/null +++ b/docs/Eric BF/04_ARC KL_K1485985-ARC-K1485985.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b064e88d02dfcb1c74ea776b3ca9b3c70595caaba05b76c7d3bc7fbdd609b92 +size 970682 diff --git a/docs/Eric BF/05_DT_K1485985.pdf b/docs/Eric BF/05_DT_K1485985.pdf new file mode 100644 index 0000000..b209be1 --- /dev/null +++ b/docs/Eric BF/05_DT_K1485985.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85c0158092cec03ca86c826671e3cb44899e218ac268ac84919fbc69ae65fb55 +size 2577327 diff --git a/docs/Eric BF/06_ Photo IMG_1406.jpg b/docs/Eric BF/06_ Photo IMG_1406.jpg new file mode 100644 index 0000000..203c6f3 --- /dev/null +++ b/docs/Eric BF/06_ Photo IMG_1406.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50ee7ef27161cac6159573fee35ea664048f0bb01756d47cc65b5d378bcd5a56 +size 2283743 diff --git a/docs/Eric BF/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.dwg b/docs/Eric BF/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.dwg new file mode 100644 index 0000000..3b9ea9e --- /dev/null +++ b/docs/Eric BF/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.dwg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85252dac3e88159e970795d4037f9d6c7bc818914a3097ccacb682025b3f44db +size 1721581 diff --git a/docs/Eric BF/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.pdf b/docs/Eric BF/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.pdf new file mode 100644 index 0000000..21804a3 --- /dev/null +++ b/docs/Eric BF/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88612b0e6d958e4869169eeadbfe69a0a55b84f7e8696429fcc6e27c6a33cab7 +size 2225972 diff --git a/docs/Eric BF/image0000001.jpg b/docs/Eric BF/image0000001.jpg new file mode 100644 index 0000000..c078714 --- /dev/null +++ b/docs/Eric BF/image0000001.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7eeafb479c2c5fa1ac6a2acadc9bee27285ca43cedd029ed43b2da5b6a35dd9 +size 207799 diff --git a/docs/assets/yule-log-cake.jpg b/docs/assets/yule-log-cake.jpg index d0dd3b875e5d8f2e978b7655faac244cacec4e7d..79d2165c2b0a1708e3b53f35f9808fd5af960959 100644 GIT binary patch literal 131 zcmWN?K@!3s3;@7;U%>|~kWvW!4UizrsB{eW;OliSd+}TPc&Rq$DTmhgK5vgI>;Lx2 zYZ*^1Cl`I$Wpq-~672ri9M;MS3}uQLl8ccFIyOW#2MPeDL>tkh9MGAvd32$AW+IE^ NX_5YAWifczmmfOMC~^P* literal 187625 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
-
- Elements -
-
+
+
Elements
+
- { Row } + {Row}
- { - setIsContextMenuOpen(false); - props.DeleteContainer(onClickContainerId); - }} /> + { + setIsContextMenuOpen(false); + props.DeleteContainer(onClickContainerId); + }} + /> void -): void { - event.preventDefault(); - const type = event.dataTransfer.getData('type'); - const target: HTMLButtonElement = event.target as HTMLButtonElement; - removeBorderClasses(target); - - const targetContainer: IContainerModel | undefined = findContainerById( - mainContainer, - target.id - ); - - if (targetContainer === undefined) { - throw new Error('[handleOnDrop] Tried to drop onto a unknown container!'); - } - - if (targetContainer === mainContainer) { - // if the container is the root, only add type as child - addContainer( - targetContainer.children.length, - type, - targetContainer.properties.id); - return; - } - - if (targetContainer.parent === null || - targetContainer.parent === undefined) { - throw new Error('[handleDrop] Tried to drop into a child container without a parent!'); - } - - const rect = target.getBoundingClientRect(); - const y = event.clientY - rect.top; // y position within the element. - - // locate the hitboxes - if (y < 12) { - const index = targetContainer.parent.children.indexOf(targetContainer); - addContainer( - index, - type, - targetContainer.parent.properties.id - ); - } else if (y < 24) { - addContainer( - targetContainer.children.length, - type, - targetContainer.properties.id); - } else { - const index = targetContainer.parent.children.indexOf(targetContainer); - addContainer( - index + 1, - type, - targetContainer.parent.properties.id - ); - } -} diff --git a/src/Components/SVG/Elements/Container.tsx b/src/Components/SVG/Elements/Container.tsx index a939d9a..b13630d 100644 --- a/src/Components/SVG/Elements/Container.tsx +++ b/src/Components/SVG/Elements/Container.tsx @@ -18,10 +18,17 @@ interface IContainerProps { */ export const Container: React.FC = (props: IContainerProps) => { const containersElements = props.model.children.map(child => ); - const xText = props.model.properties.width / 2; - const yText = props.model.properties.height / 2; - const transform = `translate(${props.model.properties.x}, ${props.model.properties.y})`; + const width: number = props.model.properties.width; + const height: number = props.model.properties.height; + + const x = props.model.properties.x; + const y = props.model.properties.y; + + const xText = width / 2; + const yText = height / 2; + + const transform = `translate(${x}, ${y})`; // g style const defaultStyle: React.CSSProperties = { @@ -39,8 +46,8 @@ export const Container: React.FC = (props: IContainerProps) => const svg = (props.model.properties.customSVG != null) ? CreateReactCustomSVG(props.model.properties.customSVG, props.model.properties) : ( ); @@ -49,10 +56,10 @@ export const Container: React.FC = (props: IContainerProps) => const dimensionMargin = DIMENSION_MARGIN * depth; const id = `dim-${props.model.properties.id}`; const xStart: number = 0; - const xEnd = props.model.properties.width; - const y = -dimensionMargin; + const xEnd = width; + const yDim = -dimensionMargin; const strokeWidth = 1; - const text = (props.model.properties.width ?? 0).toString(); + const text = (width ?? 0).toString(); let dimensionChildren: JSX.Element | null = null; if (props.model.children.length > 1 && SHOW_CHILDREN_DIMENSIONS) { @@ -80,35 +87,34 @@ export const Container: React.FC = (props: IContainerProps) => transform={transform} key={`container-${props.model.properties.id}`} > - { SHOW_PARENT_DIMENSION + {SHOW_PARENT_DIMENSION ? : null } - { dimensionChildren } - { svg } - { SHOW_TEXT + {dimensionChildren} + {svg} + {SHOW_TEXT ? {props.model.properties.displayedText} - : null } - { containersElements } + : null} + {containersElements} ); }; -function GetChildrenDimensionProps(props: IContainerProps, dimensionMargin: number): -{ childrenId: string, xChildrenStart: number, xChildrenEnd: number, yChildren: number, textChildren: string } { +function GetChildrenDimensionProps(props: IContainerProps, dimensionMargin: number): { childrenId: string, xChildrenStart: number, xChildrenEnd: number, yChildren: number, textChildren: string } { const childrenId = `dim-children-${props.model.properties.id}`; const lastChild = props.model.children[props.model.children.length - 1]; @@ -146,7 +152,7 @@ function CreateReactCustomSVG(customSVG: string, props: IContainerProperties): R function transform(node: HTMLElement, children: Node[], props: IContainerProperties): React.ReactNode { const supportedTags = ['line', 'path', 'rect']; if (supportedTags.includes(node.tagName.toLowerCase())) { - const attributes: {[att: string]: string | object | null} = {}; + const attributes: { [att: string]: string | object | null } = {}; node.getAttributeNames().forEach(attName => { const attributeValue = node.getAttribute(attName); if (attributeValue === null) { diff --git a/src/Components/SVG/Elements/Selector.tsx b/src/Components/SVG/Elements/Selector.tsx index 3c5c12f..3ced2e7 100644 --- a/src/Components/SVG/Elements/Selector.tsx +++ b/src/Components/SVG/Elements/Selector.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { IContainerModel } from '../../../Interfaces/IContainerModel'; import { getAbsolutePosition } from '../../../utils/itertools'; +import { RemoveMargin } from '../../../utils/svg'; interface ISelectorProps { selected?: IContainerModel @@ -14,11 +15,19 @@ export const Selector: React.FC = (props) => { ); } - const [x, y] = getAbsolutePosition(props.selected); - const [width, height] = [ + let [x, y] = getAbsolutePosition(props.selected); + let [width, height] = [ props.selected.properties.width, props.selected.properties.height ]; + + ({ x, y, width, height } = RemoveMargin(x, y, width, height, + props.selected.properties.margin.left, + props.selected.properties.margin.bottom, + props.selected.properties.margin.top, + props.selected.properties.margin.right + )); + const style: React.CSSProperties = { stroke: '#3B82F6', // tw blue-500 strokeWidth: 4, diff --git a/src/Components/UI/UI.tsx b/src/Components/UI/UI.tsx index 0763c26..c491467 100644 --- a/src/Components/UI/UI.tsx +++ b/src/Components/UI/UI.tsx @@ -11,6 +11,7 @@ import { Bar } from '../Bar/Bar'; import { IAvailableSymbol } from '../../Interfaces/IAvailableSymbol'; import { Symbols } from '../Symbols/Symbols'; import { SymbolsSidebar } from '../SymbolsSidebar/SymbolsSidebar'; +import { PropertyType } from '../../Enums/PropertyType'; interface IUIProps { SelectedContainer: IContainerModel | undefined @@ -21,9 +22,8 @@ interface IUIProps { AvailableSymbols: IAvailableSymbol[] SelectContainer: (containerId: string) => void DeleteContainer: (containerId: string) => void - OnPropertyChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void - AddContainerToSelectedContainer: (type: string) => void - AddContainer: (index: number, type: string, parentId: string) => void + OnPropertyChange: (key: string, value: string | number | boolean, type?: PropertyType) => void + AddContainer: (type: string) => void AddSymbol: (type: string) => void OnSymbolPropertyChange: (key: string, value: string | number | boolean) => void SelectSymbol: (symbolId: string) => void @@ -75,7 +75,7 @@ export const UI: React.FunctionComponent = (props: IUIProps) => { = (props: IUIProps) => { OnPropertyChange={props.OnPropertyChange} SelectContainer={props.SelectContainer} DeleteContainer={props.DeleteContainer} - AddContainer={props.AddContainer} /> { + // faire comme la callback de fetch + +} const getEditorState = (editorState: IEditorState): void => { const customEvent = new CustomEvent('getEditorState', { detail: editorState }); @@ -13,14 +23,35 @@ const getCurrentHistoryState = (editorState: IEditorState): void => { document.dispatchEvent(customEvent); }; +const appendNewState = ( + editorState: IEditorState, + setHistory: Dispatch>, + setHistoryCurrentStep: Dispatch>, + eventInitDict?: CustomEventInit +): void => { + const state: IHistoryState = JSON.parse(eventInitDict?.detail.state); + ReviveState(state); + const history = getCurrentHistory(editorState.history, editorState.historyCurrentStep); + + history.push(state); + setHistory(history); + setHistoryCurrentStep(history.length - 1); +}; + export interface IEditorEvent { name: string - func: (editorState: IEditorState) => void + func: ( + editorState: IEditorState, + setHistory: Dispatch>, + setHistoryCurrentStep: Dispatch>, + eventInitDict?: CustomEventInit + ) => void } const events: IEditorEvent[] = [ { name: 'getEditorState', func: getEditorState }, - { name: 'getCurrentHistoryState', func: getCurrentHistoryState } + { name: 'getCurrentHistoryState', func: getCurrentHistoryState }, + { name: 'appendNewState', func: appendNewState } ]; export default events; diff --git a/src/Interfaces/IAvailableContainer.ts b/src/Interfaces/IAvailableContainer.ts index 67ad2af..ff61db0 100644 --- a/src/Interfaces/IAvailableContainer.ts +++ b/src/Interfaces/IAvailableContainer.ts @@ -1,6 +1,7 @@ import React from 'react'; import { AddMethod } from '../Enums/AddMethod'; import { XPositionReference } from '../Enums/XPositionReference'; +import { IMargin } from './IMargin'; /** Model of available container used in application configuration */ export interface IAvailableContainer { @@ -10,6 +11,9 @@ export interface IAvailableContainer { Width?: number Height?: number MinWidth?: number + MaxWidth?: number + Margin?: IMargin + IsFlex?: boolean AddMethod?: AddMethod XPositionReference?: XPositionReference CustomSVG?: string diff --git a/src/Interfaces/IContainerProperties.ts b/src/Interfaces/IContainerProperties.ts index 1166bad..2eaa5fd 100644 --- a/src/Interfaces/IContainerProperties.ts +++ b/src/Interfaces/IContainerProperties.ts @@ -1,5 +1,6 @@ import * as React from 'react'; import { XPositionReference } from '../Enums/XPositionReference'; +import { IMargin } from './IMargin'; /** * Properties of a container @@ -8,6 +9,9 @@ export default interface IContainerProperties { /** id of the container */ id: string + /** type matching the configuration on construction */ + type: string + /** id of the parent container (null when there is no parent) */ parentId: string @@ -23,6 +27,9 @@ export default interface IContainerProperties { /** vertical offset */ y: number + /** margin */ + margin: IMargin + /** * Minimum width (min=1) * Allows the container to set isRigidBody to false when it gets squeezed @@ -30,18 +37,23 @@ export default interface IContainerProperties { */ minWidth: number + /** + * Maximum width + */ + maxWidth: number + /** width */ width: number /** height */ height: number - /** true if rigid, false otherwise */ - isRigidBody: boolean - /** true if anchor, false otherwise */ isAnchor: boolean + /** true if flex, false otherwise */ + isFlex: boolean + /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ XPositionReference: XPositionReference diff --git a/src/Interfaces/IMargin.ts b/src/Interfaces/IMargin.ts new file mode 100644 index 0000000..55c6d7a --- /dev/null +++ b/src/Interfaces/IMargin.ts @@ -0,0 +1,6 @@ +export interface IMargin { + left?: number + bottom?: number + top?: number + right?: number +} diff --git a/src/utils/default.ts b/src/utils/default.ts index a15bd36..975b9a6 100644 --- a/src/utils/default.ts +++ b/src/utils/default.ts @@ -68,7 +68,7 @@ export const DEFAULT_CONFIG: IConfiguration = { AvailableContainers: [ { Type: 'Container', - Width: 75, + MaxWidth: 200, Height: 100, Style: { fillOpacity: 0, @@ -79,7 +79,7 @@ export const DEFAULT_CONFIG: IConfiguration = { AvailableSymbols: [], MainContainer: { Type: 'Container', - Width: 2000, + Width: 800, Height: 100, Style: { fillOpacity: 0, @@ -93,16 +93,19 @@ export const DEFAULT_CONFIG: IConfiguration = { */ export const DEFAULT_MAINCONTAINER_PROPS: IContainerProperties = { id: 'main', + type: 'container', parentId: '', linkedSymbolId: '', displayedText: 'main', x: 0, y: 0, + margin: {}, minWidth: 1, + maxWidth: Number.MAX_SAFE_INTEGER, width: Number(DEFAULT_CONFIG.MainContainer.Width), height: Number(DEFAULT_CONFIG.MainContainer.Height), - isRigidBody: false, isAnchor: false, + isFlex: false, XPositionReference: XPositionReference.Left, style: { stroke: 'black', @@ -126,20 +129,25 @@ export const GetDefaultContainerProps = ( parent: IContainerModel, x: number, y: number, + width: number, + height: number, containerConfig: IAvailableContainer ): IContainerProperties => ({ id: `${type}-${typeCount}`, + type, parentId: parent.properties.id, linkedSymbolId: '', displayedText: `${type}-${typeCount}`, x, y, - width: containerConfig.Width ?? containerConfig.MinWidth ?? parent.properties.width, - height: containerConfig.Height ?? parent.properties.height, - isRigidBody: false, // set this to true to replicate Florian's project + margin: containerConfig.Margin ?? {}, + width, + height, isAnchor: false, + isFlex: containerConfig.IsFlex ?? containerConfig.Width === undefined, XPositionReference: containerConfig.XPositionReference ?? XPositionReference.Left, minWidth: containerConfig.MinWidth ?? 1, + maxWidth: containerConfig.MaxWidth ?? Number.MAX_SAFE_INTEGER, customSVG: containerConfig.CustomSVG, style: structuredClone(containerConfig.Style), userData: structuredClone(containerConfig.UserData) diff --git a/src/utils/itertools.ts b/src/utils/itertools.ts index e52e034..faf1da9 100644 --- a/src/utils/itertools.ts +++ b/src/utils/itertools.ts @@ -14,7 +14,7 @@ export function * MakeIterator(root: IContainerModel): Generator= 0; i--) { const child = container.children[i]; if (visited.has(child)) { - return; + continue; } visited.add(child); queue.push(child); @@ -71,9 +71,20 @@ export function getDepth(parent: IContainerModel): number { * @returns The absolute position of the container */ export function getAbsolutePosition(container: IContainerModel): [number, number] { - let x = container.properties.x; - let y = container.properties.y; - let current = container.parent; + const x = container.properties.x; + const y = container.properties.y; + return cancelParentTransform(container.parent, x, y); +} + +/** + * Cancel the hierarchic transformations to the given x, y + * @param parent Parent of the container to remove its transform + * @param x value to be restored + * @param y value to be restored + * @returns x and y such that the transformations of the parent are cancelled + */ +export function cancelParentTransform(parent: IContainerModel | null, x: number, y: number): [number, number] { + let current = parent; while (current != null) { x += current.properties.x; y += current.properties.y; @@ -82,6 +93,23 @@ export function getAbsolutePosition(container: IContainerModel): [number, number return [x, y]; } +/** + * Cancel the hierarchic transformations to the given x, y + * @param parent Parent of the container to remove its transform + * @param x value to be restored + * @param y value to be restored + * @returns x and y such that the transformations of the parent are cancelled + */ +export function applyParentTransform(parent: IContainerModel | null, x: number, y: number): [number, number] { + let current = parent; + while (current != null) { + x -= current.properties.x; + y -= current.properties.y; + current = current.parent; + } + return [x, y]; +} + export function findContainerById(root: IContainerModel, id: string): IContainerModel | undefined { const it = MakeIterator(root); for (const container of it) { @@ -91,3 +119,20 @@ export function findContainerById(root: IContainerModel, id: string): IContainer } return undefined; } + +export interface IPair { + cur: T + next: T +} + +export function * pairwise(arr: T[]): Generator, void, unknown> { + for (let i = 0; i < arr.length - 1; i++) { + yield { cur: arr[i], next: arr[i + 1] }; + } +} + +export function * reversePairwise(arr: T[]): Generator, void, unknown> { + for (let i = arr.length - 1; i > 0; i--) { + yield { cur: arr[i], next: arr[i - 1] }; + } +} diff --git a/src/utils/saveload.ts b/src/utils/saveload.ts index fcfd022..8c84f19 100644 --- a/src/utils/saveload.ts +++ b/src/utils/saveload.ts @@ -1,5 +1,6 @@ import { findContainerById, MakeIterator } from './itertools'; import { IEditorState } from '../Interfaces/IEditorState'; +import { IHistoryState } from '../Interfaces/IHistoryState'; /** * Revive the Editor state @@ -14,31 +15,37 @@ export function Revive(editorState: IEditorState): void { // restore the parents and the selected container for (const state of history) { - if (state.MainContainer === null || state.MainContainer === undefined) { - continue; - } - - state.Symbols = new Map(state.Symbols); - for (const symbol of state.Symbols.values()) { - symbol.linkedContainers = new Set(symbol.linkedContainers); - } - - const it = MakeIterator(state.MainContainer); - for (const container of it) { - const parentId = container.properties.parentId; - if (parentId === null) { - container.parent = null; - continue; - } - const parent = findContainerById(state.MainContainer, parentId); - if (parent === undefined) { - continue; - } - container.parent = parent; - } + ReviveState(state); } } +export const ReviveState = ( + state: IHistoryState +): void => { + if (state.MainContainer === null || state.MainContainer === undefined) { + return; + } + + state.Symbols = new Map(state.Symbols); + for (const symbol of state.Symbols.values()) { + symbol.linkedContainers = new Set(symbol.linkedContainers); + } + + const it = MakeIterator(state.MainContainer); + for (const container of it) { + const parentId = container.properties.parentId; + if (parentId === null) { + container.parent = null; + continue; + } + const parent = findContainerById(state.MainContainer, parentId); + if (parent === undefined) { + continue; + } + container.parent = parent; + } +}; + export const getCircularReplacer = (): (key: any, value: object | Map | null) => object | null | undefined => { return (key: any, value: object | null) => { if (key === 'parent') { diff --git a/src/utils/simplex.ts b/src/utils/simplex.ts new file mode 100644 index 0000000..60e9724 --- /dev/null +++ b/src/utils/simplex.ts @@ -0,0 +1,246 @@ +/** + * @module {Simplex} Apply the simplex algorithm + * https://www.imse.iastate.edu/files/2015/08/Explanation-of-Simplex-Method.docx + */ + +/** + * Apply the simplex algorithms to the minimum widths + * + * Note: Some optimizations were made to improve performance in order to solve + * with max(minWidths). In point of fact most coefficient are equal to 1 or -1. + * + * Let the following format be the linear problem : + * x >= b are the minimum widths constraint + * sum(x) <= b is the maximum width constraint + * s are slack variables + * @param minWidths + * @param requiredMaxWidth + * @returns + */ +export function Simplex(minWidths: number[], requiredMaxWidth: number): number[] { + /// 1) standardized the equations + // add the min widths constraints + const maximumConstraints = minWidths.map(minWidth => minWidth * -1); + + // add the max width constraint + maximumConstraints.push(requiredMaxWidth); + + /// 2) Create the initial matrix + // get row length (nVariables + nConstraints + 1 (z) + 1 (b)) + const nVariables = minWidths.length; + const nConstraints = maximumConstraints.length; + const rowlength = nVariables + nConstraints + 2; + const matrix = GetInitialMatrix(maximumConstraints, rowlength, nVariables); + + /// Apply the algorithm + const finalMatrix = ApplyMainLoop(matrix, rowlength); + + // 5) read the solutions + const solutions: number[] = GetSolutions(nVariables + nConstraints + 1, finalMatrix); + return solutions; +} + +const MAX_TRIES = 10; + +/** + * Specific to min widths algorithm + * Get the initial matrix from the maximum constraints + * and the number of variables + * @param maximumConstraints + * @param rowlength + * @param nVariables + * @returns + */ +function GetInitialMatrix( + maximumConstraints: number[], + rowlength: number, + nVariables: number +): number[][] { + const nConstraints = maximumConstraints.length; + const matrix = maximumConstraints.map((maximumConstraint, index) => { + const row: number[] = Array(rowlength).fill(0); + + // insert the variable coefficient a of a*x + if (index <= nConstraints - 2) { + // insert the the variable coefficient of the minimum widths constraints (negative identity matrix) + row[index] = -1; + } else { + // insert the the variable coefficient of the maximum width constraint + row.fill(1, 0, nVariables); + } + + // insert the slack variable coefficient b of b*s (identity matrix) + row[index + nVariables] = 1; + + // insert the constraint coefficient (b) + row[rowlength - 1] = maximumConstraint; + return row; + }); + + // add objective function in the last row + const row: number[] = Array(rowlength).fill(0); + + // insert z coefficient + row[rowlength - 2] = 1; + + // insert variable coefficients + row.fill(-1, 0, nVariables); + matrix.push(row); + return matrix; +} + +function getAllIndexes(arr: number[], val: number): number[] { + const indexes = []; let i = -1; + while ((i = arr.indexOf(val, i + 1)) !== -1) { + indexes.push(i); + } + return indexes; +} + +/** + * Apply the main loop of the simplex algorithm and return the final matrix: + * - While the last row of the matrix has negative values : + * - 1) find the column with the smallest negative coefficient in the last row + * - 2) in that column, find the pivot by selecting the row with the smallest ratio + * such as ratio = constraint of last column / coefficient of the selected row of the selected column + * - 3) create the new matrix such as: + * - 4) the selected column must have 1 in the pivot and zeroes in the other rows + * - 5) in the selected rows other columns (other than the selected column) + * must be divided by that pivot: coef / pivot + * - 6) for the others cells, apply the pivot: new value = (-coefficient in the old col) * (coefficient in the new row) + old value + * - 7) if in the new matrix there are still negative values in the last row, + * redo the algorithm with the new matrix as the base matrix + * - 8) otherwise returns the basic variable such as + * a basic variable is defined by a single 1 and only zeroes in its column + * other variables are equal to zeroes + * @param oldMatrix + * @param rowlength + * @returns + */ +function ApplyMainLoop(oldMatrix: number[][], rowlength: number): number[][] { + let matrix = oldMatrix; + let tries = MAX_TRIES; + const indexesTried: Record = {}; + while (matrix[matrix.length - 1].some((v: number) => v < 0) && tries > 0) { + // 1) find the index with smallest coefficient (O(n)+) + const lastRow = matrix[matrix.length - 1]; + const min = Math.min(...lastRow); + const indexes = getAllIndexes(lastRow, min); + // to avoid infinite loop try to select the least used selected index + const pivotColIndex = getLeastUsedIndex(indexes, indexesTried); + // record the usage of index by incrementing + indexesTried[pivotColIndex] = indexesTried[pivotColIndex] !== undefined ? indexesTried[pivotColIndex] + 1 : 1; + + // 2) find the smallest non negative non null ratio bi/xij (O(m)) + const ratios = []; + for (let i = 0; i <= matrix.length - 2; i++) { + const coefficient = matrix[i][pivotColIndex]; + const constraint = matrix[i][rowlength - 1]; + if (coefficient === 0) { + ratios.push(Infinity); + continue; + } + const ratio = constraint / coefficient; + if (ratio < 0) { + ratios.push(Infinity); + continue; + } + ratios.push(ratio); + } + const minRatio = Math.min(...ratios); + const pivotRowIndex = ratios.indexOf(minRatio); // i + + /// Init the new matrix + const newMatrix = structuredClone(matrix); + const pivot = matrix[pivotRowIndex][pivotColIndex]; + + // 3) apply on the pivot row the inverse of the pivot + const newPivotRow = newMatrix[pivotRowIndex]; + newPivotRow.forEach((coef, colIndex) => { + newPivotRow[colIndex] = coef / pivot; + }); + + // 4) update all values + newMatrix.forEach((row, rowIndex) => { + if (rowIndex === pivotRowIndex) { + return; + } + + row.forEach((coef, colIndex) => { + if (colIndex === pivotColIndex) { + // set zeroes on pivot col + row[colIndex] = 0; + return; + } + + // update value = old value + ((-old coef of pivot column) * (new coef of pivot row)) + row[colIndex] = coef + (-matrix[rowIndex][pivotColIndex] * newMatrix[pivotRowIndex][colIndex]); + }); + }); + + matrix = newMatrix; + tries--; + } + + if (tries === 0) { + throw new Error('[Flex]Simplexe: Could not find a solution'); + } + + return matrix; +} + +/** + * Get the solutions from the final matrix + * + * @param {number} nCols Number of solutions that you want to obtain + * @param {number[][]} finalMatrix Final matrix after the algorithm is applied + * @return {*} {number[]} A list of solutions of the final matrix + */ +function GetSolutions(nCols: number, finalMatrix: number[][]): number[] { + const solutions: number[] = Array(nCols).fill(0); + for (let i = 0; i < nCols; i++) { + const counts: Record = {}; + const col: number[] = []; + for (let j = 0; j < finalMatrix.length; j++) { + const row = finalMatrix[j]; + counts[row[i]] = counts[row[i]] !== undefined ? counts[row[i]] + 1 : 1; + col.push(row[i]); + } + + // a basic variable has a single 1 and only zeroes in the column + const nRows = finalMatrix.length; + const isBasic = counts[1] === 1 && counts[0] === (nRows - 1); + if (isBasic) { + const oneIndex = col.indexOf(1); + const row = finalMatrix[oneIndex]; + solutions[i] = row[row.length - 1]; + } else { + solutions[i] = 0; + } + } + return solutions; +} + +/** + * Returns the least used index from the indexesTried + * @param indexes Indexes of all occurences + * @param indexesTried Record of indexes. Count the number of times the index was used. + * @returns The least used index + */ +function getLeastUsedIndex(indexes: number[], indexesTried: Record): number { + let minUsed = Infinity; + let minIndex = -1; + for (const index of indexes) { + const occ = indexesTried[index]; + if (occ === undefined) { + minIndex = index; + break; + } + + if (occ < minUsed) { + minIndex = index; + minUsed = occ; + } + } + return minIndex; +} diff --git a/src/utils/svg.ts b/src/utils/svg.ts index 0248df8..32aa0e6 100644 --- a/src/utils/svg.ts +++ b/src/utils/svg.ts @@ -1,5 +1,15 @@ import { XPositionReference } from '../Enums/XPositionReference'; +// TODO: Big refactoring +/** + * TODO: + * All of these methods should have been + * inside ContainerModel class + * But because of serialization, the methods are lost. + * Rather than adding more functions to this class, + * it is better to fix serialization with the reviver. + */ + export function transformX(x: number, width: number, xPositionReference = XPositionReference.Left): number { let transformedX = x; if (xPositionReference === XPositionReference.Center) { @@ -19,3 +29,69 @@ export function restoreX(x: number, width: number, xPositionReference = XPositio } return transformedX; } + +export function ApplyMargin( + x: number, + y: number, + width: number, + height: number, + left?: number, + bottom?: number, + top?: number, + right?: number +): { x: number, y: number, width: number, height: number } { + left = left ?? 0; + right = right ?? 0; + bottom = bottom ?? 0; + top = top ?? 0; + x = ApplyXMargin(x, left); + y += top; + width = ApplyWidthMargin(width, left, right); + height -= (bottom + top); + return { x, y, width, height }; +} + +export function RemoveMargin( + x: number, + y: number, + width: number, + height: number, + left?: number, + bottom?: number, + top?: number, + right?: number +): { x: number, y: number, width: number, height: number } { + bottom = bottom ?? 0; + top = top ?? 0; + x = RemoveXMargin(x, left); + y -= top; + width = RemoveWidthMargin(width, left, right); + height += (bottom + top); + return { x, y, width, height }; +} + +export function ApplyXMargin(x: number, left?: number): number { + left = left ?? 0; + x += left; + return x; +} + +export function RemoveXMargin(x: number, left?: number): number { + left = left ?? 0; + x -= left; + return x; +} + +export function ApplyWidthMargin(width: number, left?: number, right?: number): number { + left = left ?? 0; + right = right ?? 0; + width -= (left + right); + return width; +} + +export function RemoveWidthMargin(width: number, left?: number, right?: number): number { + left = left ?? 0; + right = right ?? 0; + width += (left + right); + return width; +} diff --git a/test-server/http.js b/test-server/http.js index 167ff2d..acd975d 100644 --- a/test-server/http.js +++ b/test-server/http.js @@ -53,7 +53,7 @@ const GetSVGLayoutConfiguration = () => { AvailableContainers: [ { Type: 'Chassis', - Width: 500, + MaxWidth: 500, MinWidth: 200, DefaultChildType: 'Trou', Style: { @@ -65,10 +65,14 @@ const GetSVGLayoutConfiguration = () => { }, { Type: 'Trou', - DefaultX: 10, - DefaultY: 10, - Width: 480, - Height: 180, + DefaultX: 0, + DefaultY: 0, + Margin: { + left: 10, + bottom: 10, + top: 10, + right: 10, + }, DefaultChildType: 'Remplissage', Style: { fillOpacity: 1, @@ -108,6 +112,28 @@ const GetSVGLayoutConfiguration = () => { stroke: '#713f12', fill: '#713f12', } + }, + { + Type: '200', + MaxWidth: 500, + MinWidth: 200, + Style: { + fillOpacity: 1, + strokeWidth: 2, + stroke: 'blue', + fill: 'blue', + } + }, + { + Type: '400', + MaxWidth: 500, + MinWidth: 400, + Style: { + fillOpacity: 1, + strokeWidth: 2, + stroke: 'red', + fill: 'red', + } } ], AvailableSymbols: [ @@ -138,7 +164,7 @@ const GetSVGLayoutConfiguration = () => { ], MainContainer: { Height: 200, - Width: 1000 + Width: 800 } }; }; diff --git a/test-server/node-http.js b/test-server/node-http.js index e6c0d74..f2d3594 100644 --- a/test-server/node-http.js +++ b/test-server/node-http.js @@ -53,182 +53,62 @@ 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, + MinWidth: 200, + DefaultChildType: 'Trou', Style: { - fillOpacity: 0, - borderWidth: 2, - stroke: 'red' + fillOpacity: 1, + strokeWidth: 2, + stroke: 'red', + fill: '#d3c9b7', } }, { - 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', - TypeChildContainerDefault: 'Remplissage', - Width: 0, - XPositionReference: 0 + DefaultX: 10, + DefaultY: 10, + Width: 480, + Height: 180, + DefaultChildType: 'Remplissage', + Style: { + fillOpacity: 1, + strokeWidth: 2, + stroke: 'green', + fill: 'white' + } }, { - 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', - TypeChildContainerDefault: null, - Width: 50, - XPositionReference: 1 - }, - { - BodyColor: '#FFA3D1', - BorderColor: '#FF6DE6', - BorderWidth: 0, - ContainerActions: null, - ContainerDimensionning: { - DimensionningStyle: 0, - ShowDimensionning: false, - ShowLabel: false + CustomSVG: ` + + + + + ` + , + Style: { + fillOpacity: 1, + strokeWidth: 1, + fill: '#bfdbfe' }, - 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' + UserData: { + styleLine: { + transform: "scaleY(0.5) translateY(100%)", + transformBox: "fill-box" } - ], - 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 + } + }, + { + Type: 'Montant', + Width: 10, + XPositionReference: 1, + Style: { + fillOpacity: 0, + strokeWidth: 2, + stroke: '#713f12', + fill: '#713f12', + } } ], AvailableSymbols: [

wxczK_0N(SNW4*2k5d)YKwY4{(v~QrBdPGJ} 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 - onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void + onChange: (key: string, value: string | number | boolean, type?: PropertyType) => void } const getCSSInputs = ( properties: IContainerProperties, - onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void + onChange: (key: string, value: string | number | boolean, type: PropertyType) => void ): JSX.Element[] => { const groupInput: JSX.Element[] = []; for (const key in properties.style) { @@ -28,7 +29,7 @@ const getCSSInputs = ( inputClassName='' type='string' value={(properties.style as any)[key]} - onChange={(event) => onChange(key, event.target.value, true)} + onChange={(event) => onChange(key, event.target.value, PropertyType.STYLE)} />); } return groupInput; @@ -52,7 +53,16 @@ const ContainerForm: React.FunctionComponent = (props) => { labelClassName='' inputClassName='' type='string' - value={props.properties.parentId?.toString()} + value={props.properties.parentId} + isDisabled={true} + /> + = (props) => { inputClassName='' type='number' isDisabled={props.properties.linkedSymbolId !== ''} - value={transformX(props.properties.x, props.properties.width, props.properties.XPositionReference).toString()} - onChange={(event) => props.onChange('x', restoreX(Number(event.target.value), props.properties.width, props.properties.XPositionReference))} + value={transformX(RemoveXMargin(props.properties.x, props.properties.margin.left), props.properties.width, props.properties.XPositionReference).toString()} + onChange={(event) => props.onChange( + 'x', + ApplyXMargin( + restoreX( + Number(event.target.value), + props.properties.width, + props.properties.XPositionReference + ), + props.properties.margin.left + ) + )} /> = (props) => { labelClassName='' inputClassName='' type='number' - value={props.properties.y.toString()} - onChange={(event) => props.onChange('y', Number(event.target.value))} + value={(props.properties.y - (props.properties.margin?.top ?? 0)).toString()} + onChange={(event) => props.onChange('y', Number(event.target.value) + (props.properties.margin?.top ?? 0))} /> = (props) => { value={props.properties.minWidth.toString()} onChange={(event) => props.onChange('minWidth', Number(event.target.value))} /> + props.onChange('maxWidth', Number(event.target.value))} + /> = (props) => { inputClassName='' type='number' min={props.properties.minWidth} - value={props.properties.width.toString()} - onChange={(event) => props.onChange('width', Number(event.target.value))} + value={(RemoveWidthMargin(props.properties.width, props.properties.margin.left, props.properties.margin.right)).toString()} + onChange={(event) => props.onChange('width', ApplyWidthMargin(Number(event.target.value), props.properties.margin.left, props.properties.margin.right))} + isDisabled={props.properties.isFlex} /> = (props) => { inputClassName='' type='number' min={0} - value={props.properties.height.toString()} - onChange={(event) => props.onChange('height', Number(event.target.value))} + value={(props.properties.height + (props.properties.margin?.top ?? 0) + (props.properties.margin?.bottom ?? 0)).toString()} + onChange={(event) => props.onChange('height', Number(event.target.value) - (props.properties.margin?.top ?? 0) - (props.properties.margin?.bottom ?? 0))} /> props.onChange('left', Number(event.target.value), PropertyType.MARGIN)} + /> + props.onChange('bottom', Number(event.target.value), PropertyType.MARGIN)} + /> + props.onChange('top', Number(event.target.value), PropertyType.MARGIN)} + /> + props.onChange('right', Number(event.target.value), PropertyType.MARGIN)} + /> + props.onChange('isRigidBody', event.target.checked)} + checked={props.properties.isFlex} + onChange={(event) => props.onChange('isFlex', event.target.checked)} /> { it('Some properties, change values with dynamic input', () => { const prop: IContainerProperties = { id: 'stuff', + type: 'type', parentId: 'parentId', linkedSymbolId: '', displayedText: 'stuff', @@ -30,8 +31,10 @@ describe.concurrent('Properties', () => { width: 1, height: 1, minWidth: 1, + maxWidth: Infinity, + margin: {}, XPositionReference: XPositionReference.Left, - isRigidBody: false, + isFlex: false, isAnchor: false }; diff --git a/src/Components/ContainerProperties/ContainerProperties.tsx b/src/Components/ContainerProperties/ContainerProperties.tsx index 357c900..83eaac9 100644 --- a/src/Components/ContainerProperties/ContainerProperties.tsx +++ b/src/Components/ContainerProperties/ContainerProperties.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { PropertyType } from '../../Enums/PropertyType'; import IContainerProperties from '../../Interfaces/IContainerProperties'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; import ContainerForm from './ContainerForm'; @@ -6,7 +7,7 @@ import ContainerForm from './ContainerForm'; interface IPropertiesProps { properties?: IContainerProperties symbols: Map - onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void + onChange: (key: string, value: string | number | boolean, type?: PropertyType) => void } export const Properties: React.FC = (props: IPropertiesProps) => { diff --git a/src/Components/Editor/Actions/ContainerOperations.ts b/src/Components/Editor/Actions/ContainerOperations.ts index a98fe53..a77a01f 100644 --- a/src/Components/Editor/Actions/ContainerOperations.ts +++ b/src/Components/Editor/Actions/ContainerOperations.ts @@ -10,6 +10,9 @@ import { GetDefaultContainerProps, DEFAULTCHILDTYPE_ALLOW_CYCLIC, DEFAULTCHILDTY import { ApplyBehaviors } from '../Behaviors/Behaviors'; import { ISymbolModel } from '../../../Interfaces/ISymbolModel'; import Swal from 'sweetalert2'; +import { ApplyMargin, transformX } from '../../../utils/svg'; +import { Flex } from '../Behaviors/FlexBehaviors'; +import { PropertyType } from '../../../Enums/PropertyType'; /** * Select a container @@ -87,6 +90,8 @@ export function DeleteContainer( throw new Error('[DeleteContainer] Could not find container among parent\'s children'); } + Flex(container); + // Select the previous container // or select the one above const SelectedContainerId = GetSelectedContainerOnDelete( @@ -147,7 +152,7 @@ export function AddContainerToSelectedContainer( setHistoryCurrentStep: Dispatch> ): void { if (selected === null || - selected === undefined) { + selected === undefined) { return; } @@ -213,9 +218,17 @@ export function AddContainer( if (parentClone === null || parentClone === undefined) { throw new Error('[AddContainer] Container model was not found among children of the main container!'); } + const left: number = containerConfig.Margin?.left ?? 0; + const bottom: number = containerConfig.Margin?.bottom ?? 0; + const top: number = containerConfig.Margin?.top ?? 0; + const right: number = containerConfig.Margin?.right ?? 0; let x = containerConfig.DefaultX ?? 0; - const y = containerConfig.DefaultY ?? 0; + let y = containerConfig.DefaultY ?? 0; + let width = containerConfig.Width ?? containerConfig.MaxWidth ?? containerConfig.MinWidth ?? parentClone.properties.width; + let height = containerConfig.Height ?? parentClone.properties.height; + + ({ x, y, width, height } = ApplyMargin(x, y, width, height, left, bottom, top, right)); x = ApplyAddMethod(index, containerConfig, parentClone, x); @@ -225,6 +238,8 @@ export function AddContainer( parentClone, x, y, + width, + height, containerConfig ); @@ -238,17 +253,15 @@ export function AddContainer( } ); - ApplyBehaviors(newContainer, current.Symbols); - - // And push it the the parent children - if (index === parentClone.children.length) { - parentClone.children.push(newContainer); - } else { - parentClone.children.splice(index, 0, newContainer); - } + parentClone.children.push(newContainer); + UpdateParentChildrenList(parentClone); InitializeDefaultChild(configuration, containerConfig, newContainer, newCounters); + ApplyBehaviors(newContainer, current.Symbols); + + ApplyBehaviorsOnSiblings(newContainer, current.Symbols); + // Update the state history.push({ LastAction: `Add ${newContainer.properties.id} in ${parentClone.properties.id}`, @@ -262,6 +275,16 @@ export function AddContainer( setHistoryCurrentStep(history.length - 1); } +function UpdateParentChildrenList(parentClone: IContainerModel | null): void { + if (parentClone === null) { + return; + } + parentClone.children.sort( + (a, b) => transformX(a.properties.x, a.properties.width, a.properties.XPositionReference) - + transformX(b.properties.x, b.properties.width, b.properties.XPositionReference) + ); +} + function InitializeDefaultChild( configuration: IConfiguration, containerConfig: IAvailableContainer, @@ -286,8 +309,17 @@ function InitializeDefaultChild( } seen.add(currentConfig.Type); - const x = currentConfig.DefaultX ?? 0; - const y = currentConfig.DefaultY ?? 0; + + const left: number = currentConfig.Margin?.left ?? 0; + const bottom: number = currentConfig.Margin?.bottom ?? 0; + const top: number = currentConfig.Margin?.top ?? 0; + const right: number = currentConfig.Margin?.right ?? 0; + let x = currentConfig.DefaultX ?? 0; + let y = currentConfig.DefaultY ?? 0; + let width = currentConfig.Width ?? currentConfig.MaxWidth ?? currentConfig.MinWidth ?? parent.properties.width; + let height = currentConfig.Height ?? parent.properties.height; + + ({ x, y, width, height } = ApplyMargin(x, y, width, height, left, bottom, top, right)); UpdateCounters(newCounters, currentConfig.Type); const count = newCounters[currentConfig.Type]; @@ -297,6 +329,8 @@ function InitializeDefaultChild( parent, x, y, + width, + height, currentConfig ); @@ -353,7 +387,7 @@ function ApplyAddMethod(index: number, containerConfig: IAvailableContainer, par export function OnPropertyChange( key: string, value: string | number | boolean, - isStyle: boolean = false, + type: PropertyType = PropertyType.SIMPLE, selected: IContainerModel | undefined, fullHistory: IHistoryState[], historyCurrentStep: number, @@ -364,7 +398,7 @@ export function OnPropertyChange( const current = history[history.length - 1]; if (selected === null || - selected === undefined) { + selected === undefined) { throw new Error('[OnPropertyChange] Property was changed before selecting a Container'); } @@ -375,22 +409,7 @@ export function OnPropertyChange( throw new Error('[OnPropertyChange] Container model was not found among children of the main container!'); } - const oldSymbolId = container.properties.linkedSymbolId; - - if (isStyle) { - (container.properties.style as any)[key] = value; - } else { - (container.properties as any)[key] = value; - } - - LinkSymbol( - container.properties.id, - oldSymbolId, - container.properties.linkedSymbolId, - current.Symbols - ); - - ApplyBehaviors(container, current.Symbols); + SetContainer(container, key, value, type, current.Symbols); history.push({ LastAction: `Change ${key} of ${container.properties.id}`, @@ -404,6 +423,79 @@ export function OnPropertyChange( setHistoryCurrentStep(history.length - 1); } +/** + * Set the container with properties and behaviors (mutate) + * @param container Container to update + * @param key Key of the property to update + * @param value Value of the property to update + * @param type Type of the property to update + * @param symbols Current list of symbols + */ +function SetContainer( + container: ContainerModel, + key: string, value: string | number | boolean, + type: PropertyType, + symbols: Map +): void { + // get the old symbol to detect unlink + const oldSymbolId = container.properties.linkedSymbolId; + + // update the property + AssignProperty(container, key, value, type); + + // link the symbol if it exists + LinkSymbol( + container.properties.id, + oldSymbolId, + container.properties.linkedSymbolId, + symbols + ); + + // Apply special behaviors: rigid, flex, symbol, anchor + ApplyBehaviors(container, symbols); + + // Apply special behaviors on siblings + ApplyBehaviorsOnSiblings(container, symbols); + + // sort the children list by their position + UpdateParentChildrenList(container.parent); +} + +function AssignProperty(container: ContainerModel, key: string, value: string | number | boolean, type: PropertyType): void { + switch (type) { + case PropertyType.STYLE: + (container.properties.style as any)[key] = value; + break; + case PropertyType.MARGIN: + SetMargin(); + break; + default: + (container.properties as any)[key] = value; + } + + function SetMargin(): void { + const oldMarginValue: number = (container.properties.margin as any)[key]; + const diff = Number(value) - oldMarginValue; + switch (key) { + case 'left': + container.properties.x += diff; + container.properties.width -= diff; + break; + case 'right': + container.properties.width -= diff; + break; + case 'bottom': + container.properties.height -= diff; + break; + case 'top': + container.properties.y += diff; + container.properties.height -= diff; + break; + } + (container.properties.margin as any)[key] = value; + } +} + function LinkSymbol( containerId: string, oldSymbolId: string, @@ -422,3 +514,10 @@ function LinkSymbol( newSymbol.linkedContainers.add(containerId); } +function ApplyBehaviorsOnSiblings(newContainer: ContainerModel, Symbols: Map): void { + if (newContainer.parent === null || newContainer.parent === undefined) { + return; + } + + newContainer.parent.children.filter(container => newContainer !== container).forEach(container => ApplyBehaviors(container, Symbols)); +} diff --git a/src/Components/Editor/Behaviors/AnchorBehaviors.ts b/src/Components/Editor/Behaviors/AnchorBehaviors.ts index 58f50d2..a08c43e 100644 --- a/src/Components/Editor/Behaviors/AnchorBehaviors.ts +++ b/src/Components/Editor/Behaviors/AnchorBehaviors.ts @@ -28,7 +28,7 @@ export function ApplyAnchor(container: IContainerModel): IContainerModel { } const rigidBodies = container.parent.children.filter( - child => child.properties.isRigidBody && !child.properties.isAnchor + child => !child.properties.isAnchor ); const overlappingContainers = getOverlappingContainers(container, rigidBodies); diff --git a/src/Components/Editor/Behaviors/Behaviors.ts b/src/Components/Editor/Behaviors/Behaviors.ts index eb9e348..eb0c660 100644 --- a/src/Components/Editor/Behaviors/Behaviors.ts +++ b/src/Components/Editor/Behaviors/Behaviors.ts @@ -2,6 +2,7 @@ import { IContainerModel } from '../../../Interfaces/IContainerModel'; import { ISymbolModel } from '../../../Interfaces/ISymbolModel'; import { APPLY_BEHAVIORS_ON_CHILDREN } from '../../../utils/default'; import { ApplyAnchor } from './AnchorBehaviors'; +import { Flex } from './FlexBehaviors'; import { ApplyRigidBody } from './RigidBodyBehaviors'; import { ApplySymbol } from './SymbolBehaviors'; @@ -16,10 +17,12 @@ export function ApplyBehaviors(container: IContainerModel, symbols: Map container.properties.x; + if (!isOverlapping) { + return container; + } + + // find hole + let lastContainer: IContainerModel | null = null; + let space: number = 0; + + while (space.toFixed(2) < container.properties.width.toFixed(2)) { + // FIXME: possible infinite loop due to floating point + // FIXME: A fix was applied using toFixed(2). + // FIXME: A coverture check must be done to ensure that all scenarios are covered + + const it = reversePairwise(container.parent.children.filter(child => child !== container)); + + for (const { cur, next } of it) { + const hasSpaceBetween = next.properties.x + next.properties.width < cur.properties.x; + if (hasSpaceBetween) { + lastContainer = cur; + space = cur.properties.x - (next.properties.x + next.properties.width); + break; + } + } + + if (lastContainer === null) { + // no space between + break; + } + + const indexLastContainer = container.parent.children.indexOf(lastContainer); + for (let i = indexLastContainer; i <= container.parent.children.length - 2; i++) { + const sibling = container.parent.children[i]; + sibling.properties.x -= space; + } + } + + const hasNoSpaceBetween = lastContainer === null; + if (hasNoSpaceBetween) { + // test gap between the left of the parent and the first container + space = container.parent.children[0].properties.x; + if (space > 0) { + for (let i = 0; i <= container.parent.children.length - 2; i++) { + const sibling = container.parent.children[i]; + sibling.properties.x -= space; + } + return container; + } + } + + Flex(container); + return container; +} + +/** + * Flex the container and its siblings (mutate) + * @param container Container to flex + * @returns Flexed container + */ +export function Flex(container: IContainerModel): void { + if (container.parent === null || container.parent === undefined) { + return; + } + const flexibleContainers = container.parent.children + .filter(sibling => sibling.properties.isFlex); + + const minWidths = flexibleContainers + .map(sibling => sibling.properties.minWidth); + + const fixedWidth = container.parent.children + .filter(sibling => !sibling.properties.isFlex) + .map(sibling => sibling.properties.width) + .reduce((partialSum, a) => partialSum + a, 0); + + const requiredMaxWidth = container.parent.properties.width - fixedWidth; + + const minimumPossibleWidth = minWidths.reduce((partialSum, a) => partialSum + a, 0); + if (minimumPossibleWidth > requiredMaxWidth) { + Swal.fire({ + icon: 'error', + title: 'Cannot fit!', + text: 'Cannot fit at all even when squeezing all flex containers to the minimum.' + }); + return; + } + + const maxMinWidths = Math.max(...minWidths); + if (maxMinWidths * minWidths.length < requiredMaxWidth) { + const wantedWidth = requiredMaxWidth / minWidths.length; + // it fits, flex with maxMinWidths and fixed width + let right = 0; + for (const sibling of container.parent.children) { + if (!sibling.properties.isFlex) { + sibling.properties.x = right; + right += sibling.properties.width; + continue; + } + sibling.properties.x = ApplyXMargin(right, sibling.properties.margin.left); + sibling.properties.width = ApplyWidthMargin(wantedWidth, sibling.properties.margin.left, sibling.properties.margin.right); + right += wantedWidth; + } + + return; + } + + // does not fit + + /// SIMPLEX /// + const solutions: number[] = Simplex(minWidths, requiredMaxWidth); + + // apply the solutions + for (let i = 0; i < flexibleContainers.length; i++) { + flexibleContainers[i].properties.width = ApplyWidthMargin(solutions[i], flexibleContainers[i].properties.margin.left, flexibleContainers[i].properties.margin.right) + } + + // move the containers + let right = 0; + for (const sibling of container.parent.children) { + sibling.properties.x = ApplyXMargin(right, sibling.properties.margin.left); + right += sibling.properties.width; + } +} diff --git a/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts b/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts index f6bcf65..5edf66c 100644 --- a/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts +++ b/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts @@ -9,6 +9,7 @@ import Swal from 'sweetalert2'; import { IContainerModel } from '../../../Interfaces/IContainerModel'; import { ISizePointer } from '../../../Interfaces/ISizePointer'; +import { PushContainers } from './FlexBehaviors'; /** * "Transform the container into a rigid body" @@ -23,6 +24,7 @@ export function ApplyRigidBody( container: IContainerModel ): IContainerModel { container = constraintBodyInsideParent(container); + container = PushContainers(container); container = constraintBodyInsideUnallocatedWidth(container); return container; } @@ -183,7 +185,6 @@ export function constraintBodyInsideUnallocatedWidth( showConfirmButton: false, timer: 5000 }); - container.properties.isRigidBody = false; return container; } @@ -238,8 +239,7 @@ function getAvailableWidths( // Ignore the exception // And we will also only uses containers that also are rigid or are anchors - if (child === exception || - (!child.properties.isRigidBody && !child.properties.isAnchor)) { + if (child === exception) { continue; } const childX = child.properties.x; diff --git a/src/Components/Editor/Behaviors/SymbolBehaviors.ts b/src/Components/Editor/Behaviors/SymbolBehaviors.ts index 2997e01..915c473 100644 --- a/src/Components/Editor/Behaviors/SymbolBehaviors.ts +++ b/src/Components/Editor/Behaviors/SymbolBehaviors.ts @@ -1,9 +1,12 @@ import { IContainerModel } from '../../../Interfaces/IContainerModel'; import { ISymbolModel } from '../../../Interfaces/ISymbolModel'; +import { applyParentTransform } from '../../../utils/itertools'; import { restoreX, transformX } from '../../../utils/svg'; export function ApplySymbol(container: IContainerModel, symbol: ISymbolModel): IContainerModel { container.properties.x = transformX(symbol.x, symbol.width, symbol.config.XPositionReference); container.properties.x = restoreX(container.properties.x, container.properties.width, container.properties.XPositionReference); + const [x] = applyParentTransform(container.parent, container.properties.x, 0); + container.properties.x = x; return container; } diff --git a/src/Components/Editor/Editor.tsx b/src/Components/Editor/Editor.tsx index 86db810..4a718eb 100644 --- a/src/Components/Editor/Editor.tsx +++ b/src/Components/Editor/Editor.tsx @@ -4,7 +4,7 @@ import { IConfiguration } from '../../Interfaces/IConfiguration'; import { SVG } from '../SVG/SVG'; import { IHistoryState } from '../../Interfaces/IHistoryState'; import { UI } from '../UI/UI'; -import { SelectContainer, DeleteContainer, AddContainerToSelectedContainer, AddContainer, OnPropertyChange } from './Actions/ContainerOperations'; +import { SelectContainer, DeleteContainer, AddContainerToSelectedContainer, OnPropertyChange } from './Actions/ContainerOperations'; import { SaveEditorAsJSON, SaveEditorAsSVG } from './Actions/Save'; import { onKeyDown } from './Actions/Shortcuts'; import EditorEvents from '../../Events/EditorEvents'; @@ -60,7 +60,9 @@ function useWindowEvents( history: IHistoryState[], historyCurrentStep: number, configuration: IConfiguration, - editorRef: React.RefObject + editorRef: React.RefObject, + setHistory: Dispatch>, + setHistoryCurrentStep: Dispatch> ): void { useEffect(() => { const events = EditorEvents; @@ -72,7 +74,12 @@ function useWindowEvents( const funcs = new Map void>(); for (const event of events) { - const func = (): void => event.func(editorState); + const func = (eventInitDict?: CustomEventInit): void => event.func( + editorState, + setHistory, + setHistoryCurrentStep, + eventInitDict + ); editorRef.current?.addEventListener(event.name, func); funcs.set(event.name, func); } @@ -94,7 +101,14 @@ const Editor: React.FunctionComponent = (props) => { const editorRef = useRef(null); useShortcuts(history, historyCurrentStep, setHistoryCurrentStep); - useWindowEvents(history, historyCurrentStep, props.configuration, editorRef); + useWindowEvents( + history, + historyCurrentStep, + props.configuration, + editorRef, + setHistory, + setHistoryCurrentStep + ); const configuration = props.configuration; const current = getCurrentHistoryState(history, historyCurrentStep); @@ -122,15 +136,15 @@ const Editor: React.FunctionComponent = (props) => { setHistory, setHistoryCurrentStep )} - OnPropertyChange={(key, value, isStyle) => OnPropertyChange( - key, value, isStyle, + OnPropertyChange={(key, value, type) => OnPropertyChange( + key, value, type, selected, history, historyCurrentStep, setHistory, setHistoryCurrentStep )} - AddContainerToSelectedContainer={(type) => AddContainerToSelectedContainer( + AddContainer={(type) => AddContainerToSelectedContainer( type, selected, configuration, @@ -139,16 +153,6 @@ const Editor: React.FunctionComponent = (props) => { setHistory, setHistoryCurrentStep )} - AddContainer={(index, type, parentId) => AddContainer( - index, - type, - parentId, - configuration, - history, - historyCurrentStep, - setHistory, - setHistoryCurrentStep - )} AddSymbol={(type) => AddSymbol( type, configuration, diff --git a/src/Components/ElementsSidebar/ElementsSidebar.test.tsx b/src/Components/ElementsSidebar/ElementsSidebar.test.tsx index e6bcde6..d02e25b 100644 --- a/src/Components/ElementsSidebar/ElementsSidebar.test.tsx +++ b/src/Components/ElementsSidebar/ElementsSidebar.test.tsx @@ -22,9 +22,12 @@ describe.concurrent('Elements sidebar', () => { y: 0, width: 2000, height: 100, + margin: {}, minWidth: 1, + type: 'type', + maxWidth: Infinity, + isFlex: false, XPositionReference: XPositionReference.Left, - isRigidBody: false, isAnchor: false }, userData: {} @@ -35,7 +38,6 @@ describe.concurrent('Elements sidebar', () => { OnPropertyChange={() => {}} SelectContainer={() => {}} DeleteContainer={() => {}} - AddContainer={() => {}} />); expect(screen.getByText(/Elements/i)); @@ -56,8 +58,11 @@ describe.concurrent('Elements sidebar', () => { y: 0, width: 2000, height: 100, + margin: {}, minWidth: 1, - isRigidBody: false, + isFlex: false, + maxWidth: Infinity, + type: 'type', isAnchor: false, XPositionReference: XPositionReference.Left }, @@ -73,7 +78,6 @@ describe.concurrent('Elements sidebar', () => { OnPropertyChange={() => {}} SelectContainer={() => {}} DeleteContainer={() => {}} - AddContainer={() => {}} />); expect(screen.getByText(/Elements/i)); @@ -119,7 +123,10 @@ describe.concurrent('Elements sidebar', () => { width: 2000, height: 100, XPositionReference: XPositionReference.Left, - isRigidBody: false, + margin: {}, + isFlex: false, + maxWidth: Infinity, + type: 'type', isAnchor: false }, userData: {} @@ -139,7 +146,10 @@ describe.concurrent('Elements sidebar', () => { minWidth: 1, width: 0, height: 0, - isRigidBody: false, + margin: {}, + isFlex: false, + maxWidth: Infinity, + type: 'type', isAnchor: false, XPositionReference: XPositionReference.Left }, @@ -158,11 +168,14 @@ describe.concurrent('Elements sidebar', () => { displayedText: 'child-2', x: 0, y: 0, + margin: {}, minWidth: 1, width: 0, height: 0, XPositionReference: XPositionReference.Left, - isRigidBody: false, + isFlex: false, + maxWidth: Infinity, + type: 'type', isAnchor: false }, userData: {} @@ -178,7 +191,6 @@ describe.concurrent('Elements sidebar', () => { OnPropertyChange={() => {}} SelectContainer={() => {}} DeleteContainer={() => {}} - AddContainer={() => {}} />); expect(screen.getByText(/Elements/i)); @@ -204,7 +216,10 @@ describe.concurrent('Elements sidebar', () => { width: 2000, height: 100, XPositionReference: XPositionReference.Left, - isRigidBody: false, + margin: {}, + isFlex: false, + maxWidth: Infinity, + type: 'type', isAnchor: false }, userData: {} @@ -224,7 +239,10 @@ describe.concurrent('Elements sidebar', () => { width: 0, height: 0, XPositionReference: XPositionReference.Left, - isRigidBody: false, + margin: {}, + isFlex: false, + maxWidth: Infinity, + type: 'type', isAnchor: false }, userData: {} @@ -245,7 +263,6 @@ describe.concurrent('Elements sidebar', () => { OnPropertyChange={() => {}} SelectContainer={selectContainer} DeleteContainer={() => {}} - AddContainer={() => {}} />); expect(screen.getByText(/Elements/i)); @@ -269,7 +286,6 @@ describe.concurrent('Elements sidebar', () => { OnPropertyChange={() => {}} SelectContainer={selectContainer} DeleteContainer={() => {}} - AddContainer={() => {}} />); expect((propertyId as HTMLInputElement).value === 'main').toBeFalsy(); diff --git a/src/Components/ElementsSidebar/ElementsSidebar.tsx b/src/Components/ElementsSidebar/ElementsSidebar.tsx index 2c15fde..7245a15 100644 --- a/src/Components/ElementsSidebar/ElementsSidebar.tsx +++ b/src/Components/ElementsSidebar/ElementsSidebar.tsx @@ -5,10 +5,10 @@ import { IContainerModel } from '../../Interfaces/IContainerModel'; import { getDepth, MakeIterator } from '../../utils/itertools'; import { Menu } from '../Menu/Menu'; import { MenuItem } from '../Menu/MenuItem'; -import { handleDragLeave, handleDragOver, handleLeftClick, handleOnDrop, handleRightClick, useMouseEvents } from './MouseEventHandlers'; +import { useMouseEvents } from './MouseEventHandlers'; import { IPoint } from '../../Interfaces/IPoint'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { Dispatch, RefObject, SetStateAction } from 'react'; +import { PropertyType } from '../../Enums/PropertyType'; interface IElementsSidebarProps { MainContainer: IContainerModel @@ -16,16 +16,23 @@ interface IElementsSidebarProps { isOpen: boolean isHistoryOpen: boolean SelectedContainer: IContainerModel | undefined - OnPropertyChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void + OnPropertyChange: ( + key: string, + value: string | number | boolean, + type?: PropertyType + ) => void SelectContainer: (containerId: string) => void DeleteContainer: (containerid: string) => void - AddContainer: (index: number, type: string, parent: string) => void } -export const ElementsSidebar: React.FC = (props: IElementsSidebarProps): JSX.Element => { +export const ElementsSidebar: React.FC = ( + props: IElementsSidebarProps +): JSX.Element => { // States - const [isContextMenuOpen, setIsContextMenuOpen] = React.useState(false); - const [onClickContainerId, setOnClickContainerId] = React.useState(''); + const [isContextMenuOpen, setIsContextMenuOpen] = + React.useState(false); + const [onClickContainerId, setOnClickContainerId] = + React.useState(''); const [contextMenuPosition, setContextMenuPosition] = React.useState({ x: 0, y: 0 @@ -45,71 +52,78 @@ export const ElementsSidebar: React.FC = (props: IElement // Render let isOpenClasses = '-right-64'; if (props.isOpen) { - isOpenClasses = props.isHistoryOpen - ? 'right-64' - : 'right-0'; + isOpenClasses = props.isHistoryOpen ? 'right-64' : 'right-0'; } const it = MakeIterator(props.MainContainer); const containers = [...it]; - const Row = ({ index, style }: {index: number, style: React.CSSProperties}): JSX.Element => { + const Row = ({ + index, + style + }: { + index: number + style: React.CSSProperties + }): JSX.Element => { const container = containers[index]; const depth: number = getDepth(container); const key = container.properties.id.toString(); - const text = container.properties.displayedText === key - ? `${'|\t'.repeat(depth)} ${key}` - : `${'|\t'.repeat(depth)} ${container.properties.displayedText} (${key})`; - const selectedClass: string = props.SelectedContainer !== undefined && - props.SelectedContainer !== null && - props.SelectedContainer.properties.id === container.properties.id - ? 'border-l-4 bg-slate-400/60 hover:bg-slate-400' - : 'bg-slate-300/60 hover:bg-slate-300'; + const text = + container.properties.displayedText === key + ? `${'|\t'.repeat(depth)} ${key}` + : `${'|\t'.repeat(depth)} ${ + container.properties.displayedText + } (${key})`; + const selectedClass: string = + props.SelectedContainer !== undefined && + props.SelectedContainer !== null && + props.SelectedContainer.properties.id === container.properties.id + ? 'border-l-4 bg-slate-400/60 hover:bg-slate-400' + : 'bg-slate-300/60 hover:bg-slate-300'; return ( ); }; return ( -