From 58ef28fe89ee4efe13ff9fc55ffb90a48a9458ef Mon Sep 17 00:00:00 2001 From: Siklos Date: Thu, 18 Aug 2022 17:10:28 +0200 Subject: [PATCH 01/13] Remove selector from svg export + fix svg format --- src/Components/Editor/Save.ts | 42 ++++++++++++++++++++++++++++++----- src/Components/SVG/SVG.tsx | 2 +- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/Components/Editor/Save.ts b/src/Components/Editor/Save.ts index 0dc783b..0b355b7 100644 --- a/src/Components/Editor/Save.ts +++ b/src/Components/Editor/Save.ts @@ -38,14 +38,44 @@ export function SaveEditorAsJSON( export function SaveEditorAsSVG(): void { const svgWrapper = document.getElementById(ID) as HTMLElement; - const svg = svgWrapper.querySelector('svg') as SVGSVGElement; - const preface = '\r\n'; - const svgBlob = new Blob([preface, svg.outerHTML], { type: 'image/svg+xml;charset=utf-8' }); - const svgUrl = URL.createObjectURL(svgBlob); - createDownloadNode('state.svg', svgUrl); + let svg = svgWrapper.querySelector('svg') as SVGSVGElement; + + if (svg === undefined) { + throw new Error('[SaveEditorAsSVG] Missing element'); + } + + // Recover svg from SVG Viewer + svg = svg.cloneNode(true) as SVGSVGElement; + svg.removeAttribute('height'); + svg.removeAttribute('width'); + const mainSvg = svg.children[1].children; + svg.replaceChildren(...mainSvg); + + // remove the selector + const group = svg.children[svg.children.length - 1]; + group.removeChild(group.children[group.children.length - 1]); + + // get svg source. + const serializer = new XMLSerializer(); + let source = serializer.serializeToString(svg); + + // add name spaces. + if (source.match(/^]+xmlns="http\:\/\/www\.w3\.org\/2000\/svg"/) == null) { + source = source.replace(/^]+"http\:\/\/www\.w3\.org\/1999\/xlink"/) == null) { + source = source.replace(/^ = (props: ISVGProps) => { > { children } - { SHOW_DIMENSIONS_PER_DEPTH ? : null } + {/* leave this at the end so it can be removed during the svg export */} From b19180d126e1c456fe4a9b4f89d7b7d39d8ef9ef Mon Sep 17 00:00:00 2001 From: Siklos Date: Fri, 19 Aug 2022 13:36:47 +0200 Subject: [PATCH 02/13] Added behaviors documentation --- docs/Behaviors.md | 368 ++++++++++++++++++++++++++++++++++ docs/assets/yule-log-cake.jpg | Bin 0 -> 187625 bytes 2 files changed, 368 insertions(+) create mode 100644 docs/Behaviors.md create mode 100644 docs/assets/yule-log-cake.jpg diff --git a/docs/Behaviors.md b/docs/Behaviors.md new file mode 100644 index 0000000..125b5a9 --- /dev/null +++ b/docs/Behaviors.md @@ -0,0 +1,368 @@ +# Container behaviors + +This document is about the special and unique behaviors that a container can have. + +Each behavior is documented into a section with 3 subsections : +- Rules +- Applications +- Code reference and algorithms + + +# Default behavior + +The default behavior is the floating panel. It can move and resize itself but not its siblings. + + +## Rules + +The default behavior does not have any particular rules that applies to itself. + +However it does have a common rule for any behavior that applies to its children. + +Which is to apply the specials behaviors of its children (rigid or anchor). + + +## Applications + +The default behavior is important to have a good user experience when adding object. + +The golden rule is to never oppose the user which is why we don't want to applies rigid body by default +as it can block the addition of container. +Allowing freedom of movement can help for better precision if not the same as the rigid property. + +An example would be trying to overlap an element in order to use it as a layer. + +## Code references and algorithms + +In the module `PropertiesOperations.ts` in the following functions: +- `OnPropertyChange()` +- `OnPropertiesSubmit()` + +and in `ContainerOperation.ts` in `AddContainer()`, + +it uses the `ApplyBehaviors` function of the `Behaviors.ts` module to apply the specials behaviors of its children. + + + +# Rigid body behavior + +The rigid body behavior is a special behavior +that allows a container to be restricted into a space. + + +## Rules + +The main rules are : +- The rigid container must be kept inside its parent container +- The rigid container must be inside an unallocated space of its parent. Meaning, that it cannot overlap with another sibling. + + +## Applications + +This behavior has many applications to it. Mainly about recalculations. + +You may want to resize/move quickly and be certain that it does not overflow its parent. + +You may want to resize its parent and makes its resize its children. + +You may want siblings to interact with each other. + + +## Code references and algorithms + +Its algorithm can be a little complicated due to the numerous uses cases. + + +### First rule + +Lets start with the first rule : *The rigid container must be kept inside its parent container* + +Inside the `RigidBodyBehaviors.ts`, see `constraintBodyInsideParent()` and `constraintBodyInsideSpace()`. + +As you can see `constraintBodyInsideParent()` is just a wrapper for `constraintBodyInsideSpace()`, so lets just study the last function. + +This is a simple problem of two rectangle. + +In order to restrict the child to its parent, +we need to know firstly, if the children is not bigger than its parent. + +If it is, we just need to set the child at the beginning and makes it takes the full size of its parent. + +If it is not, we need to check if the children is out of bound (outside its parent). And if it is out of bound, we need to move it back inside. + +To check if it bigger than its parent we just need to compare their sizes : `childWidth > parentWidth` and vertically `childHeight > parentHeight`. + +If false we need to check out of bound, check for x (and y): `child.x < parent.x` for the left side or `child.x + child.width > parent.x + parent.width` for the right side. We don't want the overlap either which is why we uses `child.width`. + +The condition is also equivalent to `child.x > parent.x + parent.width - child.width` which could makes more sense as the required space must be smaller because of the child size. + + +In my algorithm, I decided to put them near the edge where they went out of bound : + +``` +left oob: child.x = parent.x +right oob: child.x = parent.x + parent.width - child.width +``` + +Pseudo-code : + +```c +constraintBodyInsideSpace(child, parent) { + if (child is bigger than parent) { + if (child is larger) { + set child x and width; + } + + if (child is taller) { + set child y and height; + } + } else { + if (child is to the left of parent) { + set child x at the left side of parent + } + + if (child is to the right of parent) { + set child x at the right side of parent + } + + if (child is higher than parent) { + set child y at the top of parent + } + + if (child is lower than parent) { + set child y at the bottom of parent + } + } +} +``` + + +### Second rule + +The second rule is the most important and complicated as it must interact with its siblings. + +*The rigid container must be inside an unallocated space of its parent. Meaning, that it cannot overlap with another sibling.* + +Let's first define what is a *space* : a *space* is the width of a container. Which consequently means that the rule only applies on the horizontal view. To simply the matter that also means that we only need to work on one dimension. + +To solve this problem, like the parent, we could use collision detection between its siblings. However this could be very slow as the worst case scenario is a cartesian product: O(n2). Because for each container we need to search for other container that collide with use. When it collide we need to move it and search again. + +Remember, this rule is applied every time you change a property of container, this is *lag*. We cannot afford to inefficient loops. + +Let us use a "system of space" that has "containers" that cannot "overlap". + +Memory. + +Memory, RAM, Hard drive space, handles their space through a system of adresses and chunks of spaces (words, bytes...). In our case we don't have chunk of spaces but floating numbers (which can be a pain the work with because of the edge cases). + +This system is particularly useful as it remember the space used after every iteration of allocation, meaning that we can know exactly when there is no more space inside parent and when a container must resized itself in order to fit inside. + +Alright let us start the algorithm. See `constraintBodyInsideUnallocatedWidth()`, `getAvailableWidths()` and `getAvailableWidthsTwoLines()` in `RigidBodyBehaviors.ts` for implementation reference. + +We have initially the whole space available: let `space` be this available space in the parent. + +`space` is a pointer, thus at the beginning it has `0` to its pointer address and `parent.width` as it space. + +To simplify the algorithm when adding a container, let us compare it to eating a bûche de Noël (yule log). + +![buche](./assets/yule-log-cake.jpg) + +Like eating the cake, we need to cut it and take a part. + +There is 5 possible way to cut it : +- Not eating the cake (maybe we prefer to eat a different cake/part) +- Eating the whole cake +- Cutting the cake at the left side +- Cutting the cake at the right right +- Cutting the cake in the middle + +Not cutting the cake means returning the whole cake as is. + +Eating the whole cake is to not returns anything. + +Cutting at the left or the right side means leave 1 part. + +Cutting the middle means leaving two part. + +After cutting the cake, *while* there is still some left, we can continue the operation. (it is a *for* loop in the code though for syntax reasons) + +However after serving for the siblings we *may* notice that there is no more left for us. We get angry, we *throw* a tantrum. + +```c +// if you did not understood the joke +if (there no more cake) { + throw tantrum +} +``` + +Wait, there is actually cake! + +But it is left in multiple parts, we will just takes the *closest* one that *fits* our hunger. + +If there is one that fits our hunger let's take it! + +Yet! There is cake but none fits our hunger. But we do have a *minimum* acceptance, let us be humble, we will still take the small bit. By the way, taking multiple part would look bad for us. Nonetheless, if my *minimum* acceptance were to be higher than what is left, I would *throw* a *warning* for next time. + + +Alright lets translate this in pseudo-code. + +Let us start with getting the available spaces : + +```c# +getAvailableSpaces(parent, me) { + spaces = [{ x: 0, size: parent.width }] + + let i = 0 + while (spaces.length > 0 and i < parent.length) { + let sibling = parent.children[i]; + + if (sibling is me or is neither rigid nor is anchor) { + i++; + continue; + } + + let spacesLeft be an array + + foreach(space in spaces) { + spacesLeftOfSpace = allocate(sibling, space); + spacesLeft.concat(spacesLeftOfSpace) + } + + spaces = spacesLeft + i++ + } + + return spaces; +} +``` + +To allocate: + +```c# +allocate(sibling, space) { + if (sibling is not overlapping the space) { + return [space] + } + + if (sibling overlap the space entirely) { + return [] + } + + if (sibling overlap at the left side) { + return [{ + x: right side of sibling + size: right side of space - right side of sibling // "cut the left part" + }] + } + + if (sibling overlap at the right side) { + return [{ + x: left side of space + size: leftSide of sibling - leftSide of space + }] + } + + // if (sibling overlap in the middle) + return [ + { + x: left side of space + size: left side of sibling - left side of space + }, + { + x: right side of sibling + size: right side of space - right side of sibling + } + ] +} +``` + +Finally the top part: + +```c# +constraintBodyInsideUnallocatedWidth(parent, container) { + spaces = getAvailableSpaces(parent, container) + if (there is no more spaces) { + throw error + } + + spaces = sort spaces by closest from the middle of container + + spaceFound = spaces.find(space that fit container.space) + + if (no spaceFound) { + + spaceFound = spaces.find(space that fit container.minimumSpace) + + if (no spaceFound) { + show warning + return container + } + + set container x and width to make it fit + return container; + } + + constraintBodyInsideSpace(container, spaceFound) +} +``` + +This algorithm is great but, some problems remains: +- Finding the closest takes O(nlogn) with n being the number of spaces. This is usually not bad since the objective of the rigid body is to **fill** space. But it still does have a very bad worst case. +- There is 2 searches for space, same problem but the previous sort helps to make it faster for the best cases + + + +# Anchor behavior + +The anchor behavior allows a container to gain priority over its siblings. + + +## Rules + +It has the following rules: + - The container cannot be moved by other rigid siblings container + - The container cannot be resized by any other siblings container + - The container cannot overlap any other siblings rigid container : + - overlapping containers are shifted to the nearest available space/width + - or resized when there is no available space left other than theirs + - or lose their rigid body properties when there is absolutely no available space left (not even theirs) + + +## Applications + +Gaining priority can helps makes sure that a rigid object won't move no matter what and will absolutly move no matter what is under it. + + +## Code references and algorithms + +While there is a more rules applied to this behavior, most of them are just conditions. + +These three rules: + - The container cannot be moved by other rigid siblings container + - The container cannot be resized by any other siblings container + - It cannot overlap any other siblings rigid container + +Can be translate into a single one: "The container is an allocated space so any container is in contact will move or be resized" + +Meaning that applying the rigid body properties of the sibling will also apply this rule. The difference with the default behavior and the anchor behavior is that the anchor container will be taken into account during the calculation of available space. + +You can think of the default container as a floating panel and the anchor container as a wall. You can go under the floating panel but cannot go over the wall. + +To optimize the algorithm, we just need to find the overlapping siblings since the anchor is not applied to those who are not in collision. + +Pseudo-code : + +```c# +ImposePosition(container) { + let rigidBodies be the rigid siblings that are not anchor + let overlappingRigidBodies be the overlapping rigid siblings of rigidBodies + + foreach(overlappingRigidBody of overlappingRigidBodies) { + constraintBodyInsideUnallocatedWidth(overlappingRigidBody) + } +} +``` + +Also, modify `getAvailableSpaces()` so it takes into account anchor containers. + +That's it. \ No newline at end of file diff --git a/docs/assets/yule-log-cake.jpg b/docs/assets/yule-log-cake.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0dd3b875e5d8f2e978b7655faac244cacec4e7d GIT binary patch literal 187625 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

wxczK_0N(SNW4*2k5d)YKwY4{(v~QrBdPGJ} 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 { }; const getCircularReplacer = () => { - const seen = new WeakSet(); return (key, value) => { if (key === 'parent') { return; } - if (key === 'SelectedContainer') { - return; + if (key === 'Symbols') { + return Array.from(value.entries()); } - if (typeof value === 'object' && value !== null) { - if (seen.has(value)) { - return; - } - seen.add(value); + if (key === 'linkedContainers') { + return Array.from(value); } + return value; }; }; diff --git a/src/Components/App/App.tsx b/src/Components/App/App.tsx index c85d322..1041814 100644 --- a/src/Components/App/App.tsx +++ b/src/Components/App/App.tsx @@ -26,9 +26,10 @@ export const App: React.FunctionComponent = (props) => { history: [{ LastAction: '', MainContainer: defaultMainContainer, - SelectedContainer: defaultMainContainer, SelectedContainerId: defaultMainContainer.properties.id, - TypeCounters: {} + TypeCounters: {}, + Symbols: new Map(), + SelectedSymbolId: '' }], historyCurrentStep: 0 }); diff --git a/src/Components/App/MenuActions.ts b/src/Components/App/MenuActions.ts index 601e4c7..4c0c8aa 100644 --- a/src/Components/App/MenuActions.ts +++ b/src/Components/App/MenuActions.ts @@ -4,7 +4,6 @@ import { ContainerModel } from '../../Interfaces/IContainerModel'; import { fetchConfiguration } from '../API/api'; import { IEditorState } from '../../Interfaces/IEditorState'; import { LoadState } from './Load'; -import { XPositionReference } from '../../Enums/XPositionReference'; import { DEFAULT_MAINCONTAINER_PROPS } from '../../utils/default'; export function NewEditor( @@ -26,6 +25,7 @@ export function NewEditor( // Save the configuration and the new MainContainer // and default the selected container to it + // TODO: Put this in default.ts const editorState: IEditorState = { configuration, history: @@ -33,9 +33,10 @@ export function NewEditor( { LastAction: '', MainContainer, - SelectedContainer: MainContainer, SelectedContainerId: MainContainer.properties.id, - TypeCounters: {} + TypeCounters: {}, + Symbols: new Map(), + SelectedSymbolId: '' } ], historyCurrentStep: 0 diff --git a/src/Components/Bar/Bar.tsx b/src/Components/Bar/Bar.tsx index 77cb259..22c617a 100644 --- a/src/Components/Bar/Bar.tsx +++ b/src/Components/Bar/Bar.tsx @@ -1,13 +1,14 @@ -import { ClockIcon, CubeIcon, MapIcon } from '@heroicons/react/outline'; +import { ClockIcon, CubeIcon, LinkIcon, MapIcon } from '@heroicons/react/outline'; import * as React from 'react'; import { BarIcon } from './BarIcon'; interface IBarProps { isSidebarOpen: boolean + isSymbolsOpen: boolean isElementsSidebarOpen: boolean isHistoryOpen: boolean ToggleSidebar: () => void - ToggleElementsSidebar: () => void + ToggleSymbols: () => void ToggleTimeline: () => void } @@ -23,10 +24,10 @@ export const Bar: React.FC = (props) => { props.ToggleElementsSidebar()}> - + isActive={props.isSymbolsOpen} + title='Symbols' + onClick={() => props.ToggleSymbols()}> + ): IContainerModel { if (container.properties.isAnchor) { - ImposePosition(container); + ApplyAnchor(container); } if (container.properties.isRigidBody) { - RecalculatePhysics(container); + ApplyRigidBody(container); + } + + const symbol = symbols.get(container.properties.linkedSymbolId); + if (container.properties.linkedSymbolId !== '' && symbol !== undefined) { + ApplySymbol(container, symbol); + } + + if (APPLY_BEHAVIORS_ON_CHILDREN) { + // Apply DFS by recursion + for (const child of container.children) { + ApplyBehaviors(child, symbols); + } } return container; diff --git a/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts b/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts index f0a734c..f6bcf65 100644 --- a/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts +++ b/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts @@ -19,7 +19,7 @@ import { ISizePointer } from '../../../Interfaces/ISizePointer'; * @param container Container to apply its rigid body properties * @returns A rigid body container */ -export function RecalculatePhysics( +export function ApplyRigidBody( container: IContainerModel ): IContainerModel { container = constraintBodyInsideParent(container); @@ -231,14 +231,15 @@ function getAvailableWidths( const width = container.properties.width; let unallocatedSpaces: ISizePointer[] = [{ x, width }]; - // We will only uses containers that also are rigid or are anchors - const solidBodies = container.children.filter( - (child) => child.properties.isRigidBody || child.properties.isAnchor - ); + for (const child of container.children) { + if (unallocatedSpaces.length < 1) { + return unallocatedSpaces; + } - for (const child of solidBodies) { // Ignore the exception - if (child === exception) { + // And we will also only uses containers that also are rigid or are anchors + if (child === exception || + (!child.properties.isRigidBody && !child.properties.isAnchor)) { continue; } const childX = child.properties.x; diff --git a/src/Components/Editor/Behaviors/SymbolBehaviors.ts b/src/Components/Editor/Behaviors/SymbolBehaviors.ts new file mode 100644 index 0000000..2997e01 --- /dev/null +++ b/src/Components/Editor/Behaviors/SymbolBehaviors.ts @@ -0,0 +1,9 @@ +import { IContainerModel } from '../../../Interfaces/IContainerModel'; +import { ISymbolModel } from '../../../Interfaces/ISymbolModel'; +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); + return container; +} diff --git a/src/Components/Editor/ContainerOperations.ts b/src/Components/Editor/ContainerOperations.ts index 8c327e8..018c39d 100644 --- a/src/Components/Editor/ContainerOperations.ts +++ b/src/Components/Editor/ContainerOperations.ts @@ -2,19 +2,20 @@ import { Dispatch, SetStateAction } from 'react'; import { IHistoryState } from '../../Interfaces/IHistoryState'; import { IConfiguration } from '../../Interfaces/IConfiguration'; import { ContainerModel, IContainerModel } from '../../Interfaces/IContainerModel'; -import { findContainerById } from '../../utils/itertools'; -import { getCurrentHistory } from './Editor'; +import { findContainerById, MakeIterator } from '../../utils/itertools'; +import { getCurrentHistory, UpdateCounters } from './Editor'; import { AddMethod } from '../../Enums/AddMethod'; import { IAvailableContainer } from '../../Interfaces/IAvailableContainer'; import { GetDefaultContainerProps, DEFAULTCHILDTYPE_ALLOW_CYCLIC, DEFAULTCHILDTYPE_MAX_DEPTH } from '../../utils/default'; import { ApplyBehaviors } from './Behaviors/Behaviors'; +import { ISymbolModel } from '../../Interfaces/ISymbolModel'; /** * Select a container * @param container Selected container */ export function SelectContainer( - container: ContainerModel, + containerId: string, fullHistory: IHistoryState[], historyCurrentStep: number, setHistory: Dispatch>, @@ -23,19 +24,13 @@ export function SelectContainer( const history = getCurrentHistory(fullHistory, historyCurrentStep); const current = history[history.length - 1]; - const mainContainerClone = structuredClone(current.MainContainer); - const selectedContainer = findContainerById(mainContainerClone, container.properties.id); - - if (selectedContainer === undefined) { - throw new Error('[SelectContainer] Cannot find container among children of main container!'); - } - history.push({ - LastAction: `Select ${selectedContainer.properties.id}`, - MainContainer: mainContainerClone, - SelectedContainer: selectedContainer, - SelectedContainerId: selectedContainer.properties.id, - TypeCounters: Object.assign({}, current.TypeCounters) + LastAction: `Select ${containerId}`, + MainContainer: structuredClone(current.MainContainer), + SelectedContainerId: containerId, + TypeCounters: Object.assign({}, current.TypeCounters), + Symbols: structuredClone(current.Symbols), + SelectedSymbolId: current.SelectedSymbolId }); setHistory(history); setHistoryCurrentStep(history.length - 1); @@ -76,6 +71,8 @@ export function DeleteContainer( if (container === null || container === undefined) { throw new Error('[DeleteContainer] Container model was not found among children of the main container!'); } + const newSymbols = structuredClone(current.Symbols) + UnlinkSymbol(newSymbols, container); const index = container.parent.children.indexOf(container); if (index > -1) { @@ -94,14 +91,26 @@ export function DeleteContainer( history.push({ LastAction: `Delete ${containerId}`, MainContainer: mainContainerClone, - SelectedContainer, SelectedContainerId, - TypeCounters: Object.assign({}, current.TypeCounters) + TypeCounters: Object.assign({}, current.TypeCounters), + Symbols: newSymbols, + SelectedSymbolId: current.SelectedSymbolId }); setHistory(history); setHistoryCurrentStep(history.length - 1); } +function UnlinkSymbol(symbols: Map, container: IContainerModel): void { + const it = MakeIterator(container); + for (const child of it) { + const symbol = symbols.get(child.properties.linkedSymbolId); + if (symbol === undefined) { + continue; + } + symbol.linkedContainers.delete(child.properties.id); + } +} + /** * Add a new container to a selected container * @param type The type of container @@ -114,21 +123,19 @@ export function DeleteContainer( */ export function AddContainerToSelectedContainer( type: string, + selected: IContainerModel | undefined, configuration: IConfiguration, fullHistory: IHistoryState[], historyCurrentStep: number, setHistory: Dispatch>, setHistoryCurrentStep: Dispatch> ): void { - const history = getCurrentHistory(fullHistory, historyCurrentStep); - const current = history[history.length - 1]; - - if (current.SelectedContainer === null || - current.SelectedContainer === undefined) { + if (selected === null || + selected === undefined) { return; } - const parent = current.SelectedContainer; + const parent = selected; AddContainer( parent.children.length, type, @@ -166,11 +173,6 @@ export function AddContainer( const history = getCurrentHistory(fullHistory, historyCurrentStep); const current = history[history.length - 1]; - if (current.MainContainer === null || - current.MainContainer === undefined) { - return; - } - // Get the preset properties from the API const containerConfig = configuration.AvailableContainers .find(option => option.Type === type); @@ -220,7 +222,7 @@ export function AddContainer( } ); - ApplyBehaviors(newContainer); + ApplyBehaviors(newContainer, current.Symbols); // And push it the the parent children if (index === parentClone.children.length) { @@ -235,23 +237,15 @@ export function AddContainer( history.push({ LastAction: `Add ${newContainer.properties.id} in ${parentClone.properties.id}`, MainContainer: clone, - SelectedContainer: parentClone, SelectedContainerId: parentClone.properties.id, - TypeCounters: newCounters + TypeCounters: newCounters, + Symbols: structuredClone(current.Symbols), + SelectedSymbolId: current.SelectedSymbolId }); setHistory(history); setHistoryCurrentStep(history.length - 1); } -function UpdateCounters(counters: Record, type: string): void { - if (counters[type] === null || - counters[type] === undefined) { - counters[type] = 0; - } else { - counters[type]++; - } -} - function InitializeDefaultChild( configuration: IConfiguration, containerConfig: IAvailableContainer, diff --git a/src/Components/Editor/Editor.tsx b/src/Components/Editor/Editor.tsx index 75bf90c..f7df902 100644 --- a/src/Components/Editor/Editor.tsx +++ b/src/Components/Editor/Editor.tsx @@ -11,6 +11,8 @@ import { OnPropertyChange, OnPropertiesSubmit } from './PropertiesOperations'; import EditorEvents from '../../Events/EditorEvents'; import { IEditorState } from '../../Interfaces/IEditorState'; import { MAX_HISTORY } from '../../utils/default'; +import { AddSymbol, OnPropertyChange as OnSymbolPropertyChange, DeleteSymbol, SelectSymbol } from './SymbolOperations'; +import { findContainerById } from '../../utils/itertools'; interface IEditorProps { configuration: IConfiguration @@ -18,6 +20,15 @@ interface IEditorProps { historyCurrentStep: number } +export function UpdateCounters(counters: Record, type: string): void { + if (counters[type] === null || + counters[type] === undefined) { + counters[type] = 0; + } else { + counters[type]++; + } +} + export const getCurrentHistory = (history: IHistoryState[], historyCurrentStep: number): IHistoryState[] => history.slice( Math.max(0, history.length - MAX_HISTORY), // change this to 0 for unlimited (not recommanded because of overflow) @@ -70,13 +81,16 @@ const Editor: React.FunctionComponent = (props) => { const configuration = props.configuration; const current = getCurrentHistoryState(history, historyCurrentStep); + const selected = findContainerById(current.MainContainer, current.SelectedContainerId); return (

SelectContainer( container, history, @@ -93,6 +107,7 @@ const Editor: React.FunctionComponent = (props) => { )} OnPropertyChange={(key, value, isStyle) => OnPropertyChange( key, value, isStyle, + selected, history, historyCurrentStep, setHistory, @@ -100,6 +115,7 @@ const Editor: React.FunctionComponent = (props) => { )} OnPropertiesSubmit={(event) => OnPropertiesSubmit( event, + selected, history, historyCurrentStep, setHistory, @@ -107,6 +123,7 @@ const Editor: React.FunctionComponent = (props) => { )} AddContainerToSelectedContainer={(type) => AddContainerToSelectedContainer( type, + selected, configuration, history, historyCurrentStep, @@ -123,6 +140,35 @@ const Editor: React.FunctionComponent = (props) => { setHistory, setHistoryCurrentStep )} + AddSymbol={(type) => AddSymbol( + type, + configuration, + history, + historyCurrentStep, + setHistory, + setHistoryCurrentStep + )} + OnSymbolPropertyChange={(key, value) => OnSymbolPropertyChange( + key, value, + history, + historyCurrentStep, + setHistory, + setHistoryCurrentStep + )} + SelectSymbol={(symbolId) => SelectSymbol( + symbolId, + history, + historyCurrentStep, + setHistory, + setHistoryCurrentStep + )} + DeleteSymbol={(symbolId) => DeleteSymbol( + symbolId, + history, + historyCurrentStep, + setHistory, + setHistoryCurrentStep + )} SaveEditorAsJSON={() => SaveEditorAsJSON( history, historyCurrentStep, @@ -134,7 +180,8 @@ const Editor: React.FunctionComponent = (props) => { { current.MainContainer } diff --git a/src/Components/Editor/PropertiesOperations.ts b/src/Components/Editor/PropertiesOperations.ts index 70984da..d939213 100644 --- a/src/Components/Editor/PropertiesOperations.ts +++ b/src/Components/Editor/PropertiesOperations.ts @@ -3,8 +3,9 @@ import { IContainerModel, ContainerModel } from '../../Interfaces/IContainerMode import { IHistoryState } from '../../Interfaces/IHistoryState'; import { findContainerById } from '../../utils/itertools'; import { getCurrentHistory } from './Editor'; -import { restoreX } from '../SVG/Elements/Container'; import { ApplyBehaviors } from './Behaviors/Behaviors'; +import { restoreX } from '../../utils/svg'; +import { ISymbolModel } from '../../Interfaces/ISymbolModel'; /** * Handled the property change event in the properties form @@ -16,6 +17,7 @@ export function OnPropertyChange( key: string, value: string | number | boolean, isStyle: boolean = false, + selected: IContainerModel | undefined, fullHistory: IHistoryState[], historyCurrentStep: number, setHistory: Dispatch>, @@ -24,37 +26,66 @@ export function OnPropertyChange( const history = getCurrentHistory(fullHistory, historyCurrentStep); const current = history[history.length - 1]; - if (current.SelectedContainer === null || - current.SelectedContainer === undefined) { + if (selected === null || + selected === undefined) { throw new Error('[OnPropertyChange] Property was changed before selecting a Container'); } const mainContainerClone: IContainerModel = structuredClone(current.MainContainer); - const container: ContainerModel | undefined = findContainerById(mainContainerClone, current.SelectedContainer.properties.id); + const container: ContainerModel | undefined = findContainerById(mainContainerClone, selected.properties.id); if (container === null || container === undefined) { 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; } - ApplyBehaviors(container); + LinkSymbol( + container.properties.id, + oldSymbolId, + container.properties.linkedSymbolId, + current.Symbols + ); + + ApplyBehaviors(container, current.Symbols); history.push({ LastAction: `Change ${key} of ${container.properties.id}`, MainContainer: mainContainerClone, - SelectedContainer: container, SelectedContainerId: container.properties.id, - TypeCounters: Object.assign({}, current.TypeCounters) + TypeCounters: Object.assign({}, current.TypeCounters), + Symbols: structuredClone(current.Symbols), + SelectedSymbolId: current.SelectedSymbolId }); setHistory(history); setHistoryCurrentStep(history.length - 1); } +function LinkSymbol( + containerId: string, + oldSymbolId: string, + newSymbolId: string, + symbols: Map +): void { + const oldSymbol = symbols.get(oldSymbolId); + const newSymbol = symbols.get(newSymbolId); + + if (newSymbol === undefined) { + if (oldSymbol !== undefined) { + oldSymbol.linkedContainers.delete(containerId); + } + return; + } + + newSymbol.linkedContainers.add(containerId); +} + /** * Handled the property change event in the properties form * @param key Property name @@ -63,6 +94,7 @@ export function OnPropertyChange( */ export function OnPropertiesSubmit( event: React.SyntheticEvent, + selected: IContainerModel | undefined, fullHistory: IHistoryState[], historyCurrentStep: number, setHistory: Dispatch>, @@ -72,13 +104,13 @@ export function OnPropertiesSubmit( const history = getCurrentHistory(fullHistory, historyCurrentStep); const current = history[history.length - 1]; - if (current.SelectedContainer === null || - current.SelectedContainer === undefined) { + if (selected === null || + selected === undefined) { throw new Error('[OnPropertyChange] Property was changed before selecting a Container'); } const mainContainerClone: IContainerModel = structuredClone(current.MainContainer); - const container: ContainerModel | undefined = findContainerById(mainContainerClone, current.SelectedContainer.properties.id); + const container: ContainerModel | undefined = findContainerById(mainContainerClone, selected.properties.id); if (container === null || container === undefined) { throw new Error('[OnPropertyChange] Container model was not found among children of the main container!'); @@ -110,14 +142,15 @@ export function OnPropertiesSubmit( } // Apply the behaviors - ApplyBehaviors(container); + ApplyBehaviors(container, current.Symbols); history.push({ LastAction: `Change properties of ${container.properties.id}`, MainContainer: mainContainerClone, - SelectedContainer: container, SelectedContainerId: container.properties.id, - TypeCounters: Object.assign({}, current.TypeCounters) + TypeCounters: Object.assign({}, current.TypeCounters), + Symbols: structuredClone(current.Symbols), + SelectedSymbolId: current.SelectedSymbolId }); setHistory(history); setHistoryCurrentStep(history.length - 1); @@ -187,3 +220,4 @@ const submitRadioButtons = ( (container.properties as any)[property] = radiobutton.value; }; + diff --git a/src/Components/Editor/SymbolOperations.ts b/src/Components/Editor/SymbolOperations.ts new file mode 100644 index 0000000..01844ab --- /dev/null +++ b/src/Components/Editor/SymbolOperations.ts @@ -0,0 +1,180 @@ +import { Dispatch, SetStateAction } from 'react'; +import { IConfiguration } from '../../Interfaces/IConfiguration'; +import { IContainerModel } from '../../Interfaces/IContainerModel'; +import { IHistoryState } from '../../Interfaces/IHistoryState'; +import { ISymbolModel } from '../../Interfaces/ISymbolModel'; +import { DEFAULT_SYMBOL_HEIGHT, DEFAULT_SYMBOL_WIDTH } from '../../utils/default'; +import { findContainerById } from '../../utils/itertools'; +import { restoreX } from '../../utils/svg'; +import { ApplyBehaviors } from './Behaviors/Behaviors'; +import { getCurrentHistory, UpdateCounters } from './Editor'; + +export function AddSymbol( + name: string, + configuration: IConfiguration, + fullHistory: IHistoryState[], + historyCurrentStep: number, + setHistory: Dispatch>, + setHistoryCurrentStep: Dispatch> +): void { + const history = getCurrentHistory(fullHistory, historyCurrentStep); + const current = history[history.length - 1]; + + const symbolConfig = configuration.AvailableSymbols + .find(option => option.Name === name); + + if (symbolConfig === undefined) { + throw new Error('[AddSymbol] Symbol could not be found in the config'); + } + const type = `symbol-${name}`; + const newCounters = structuredClone(current.TypeCounters); + UpdateCounters(newCounters, type); + + const newSymbols = structuredClone(current.Symbols); + // TODO: Put this in default.ts as GetDefaultConfig + const newSymbol: ISymbolModel = { + id: `${name}-${newCounters[type]}`, + type: name, + config: structuredClone(symbolConfig), + x: 0, + width: symbolConfig.Width ?? DEFAULT_SYMBOL_WIDTH, + height: symbolConfig.Height ?? DEFAULT_SYMBOL_HEIGHT, + linkedContainers: new Set() + }; + newSymbol.x = restoreX(newSymbol.x, newSymbol.width, newSymbol.config.XPositionReference); + + newSymbols.set(newSymbol.id, newSymbol); + + history.push({ + LastAction: `Add ${name}`, + MainContainer: structuredClone(current.MainContainer), + SelectedContainerId: current.SelectedContainerId, + TypeCounters: newCounters, + Symbols: newSymbols, + SelectedSymbolId: newSymbol.id + }); + setHistory(history); + setHistoryCurrentStep(history.length - 1); +} + +export function SelectSymbol( + symbolId: string, + fullHistory: IHistoryState[], + historyCurrentStep: number, + setHistory: Dispatch>, + setHistoryCurrentStep: Dispatch> +): void { + const history = getCurrentHistory(fullHistory, historyCurrentStep); + const current = history[history.length - 1]; + + history.push({ + LastAction: `Select ${symbolId}`, + MainContainer: structuredClone(current.MainContainer), + SelectedContainerId: current.SelectedContainerId, + TypeCounters: structuredClone(current.TypeCounters), + Symbols: structuredClone(current.Symbols), + SelectedSymbolId: symbolId + }); + setHistory(history); + setHistoryCurrentStep(history.length - 1); +} + +export function DeleteSymbol( + symbolId: string, + fullHistory: IHistoryState[], + historyCurrentStep: number, + setHistory: Dispatch>, + setHistoryCurrentStep: Dispatch> +): void { + const history = getCurrentHistory(fullHistory, historyCurrentStep); + const current = history[history.length - 1]; + + const newSymbols = structuredClone(current.Symbols); + const symbol = newSymbols.get(symbolId); + + if (symbol === undefined) { + throw new Error(`[DeleteSymbol] Could not find symbol in the current state!: ${symbolId}`); + } + + const newMainContainer = structuredClone(current.MainContainer); + + UnlinkContainers(symbol, newMainContainer); + + newSymbols.delete(symbolId); + + history.push({ + LastAction: `Select ${symbolId}`, + MainContainer: newMainContainer, + SelectedContainerId: current.SelectedContainerId, + TypeCounters: structuredClone(current.TypeCounters), + Symbols: newSymbols, + SelectedSymbolId: symbolId + }); + setHistory(history); + setHistoryCurrentStep(history.length - 1); +} + +function UnlinkContainers(symbol: ISymbolModel, newMainContainer: IContainerModel) { + symbol.linkedContainers.forEach((containerId) => { + const container = findContainerById(newMainContainer, containerId); + + if (container === undefined) { + return; + } + + container.properties.linkedSymbolId = ''; + }); +} + +/** + * Handled the property change event in the properties form + * @param key Property name + * @param value New value of the property + * @returns void + */ +export function OnPropertyChange( + key: string, + value: string | number | boolean, + fullHistory: IHistoryState[], + historyCurrentStep: number, + setHistory: Dispatch>, + setHistoryCurrentStep: Dispatch> +): void { + const history = getCurrentHistory(fullHistory, historyCurrentStep); + const current = history[history.length - 1]; + + if (current.SelectedSymbolId === '') { + throw new Error('[OnSymbolPropertyChange] Property was changed before selecting a symbol'); + } + + const newSymbols: Map = structuredClone(current.Symbols); + const symbol = newSymbols.get(current.SelectedSymbolId); + + if (symbol === null || symbol === undefined) { + throw new Error('[OnSymbolPropertyChange] Symbol model was not found in state!'); + } + + (symbol as any)[key] = value; + + const newMainContainer = structuredClone(current.MainContainer); + symbol.linkedContainers.forEach((containerId) => { + const container = findContainerById(newMainContainer, containerId); + + if (container === undefined) { + return; + } + + ApplyBehaviors(container, newSymbols); + }); + + history.push({ + LastAction: `Change ${key} of ${symbol.id}`, + MainContainer: newMainContainer, + SelectedContainerId: current.SelectedContainerId, + TypeCounters: Object.assign({}, current.TypeCounters), + Symbols: newSymbols, + SelectedSymbolId: symbol.id + }); + setHistory(history); + setHistoryCurrentStep(history.length - 1); +} diff --git a/src/Components/ElementsSidebar/ElementsSidebar.test.tsx b/src/Components/ElementsSidebar/ElementsSidebar.test.tsx index 4f3b042..8badea7 100644 --- a/src/Components/ElementsSidebar/ElementsSidebar.test.tsx +++ b/src/Components/ElementsSidebar/ElementsSidebar.test.tsx @@ -4,16 +4,19 @@ import { fireEvent, render, screen } from '../../utils/test-utils'; import { ElementsSidebar } from './ElementsSidebar'; import { IContainerModel } from '../../Interfaces/IContainerModel'; import { XPositionReference } from '../../Enums/XPositionReference'; +import { findContainerById } from '../../utils/itertools'; describe.concurrent('Elements sidebar', () => { it('With a MainContainer', () => { render( { }} isOpen={true} isHistoryOpen={false} - SelectedContainer={null} + SelectedContainer={undefined} OnPropertyChange={() => {}} OnPropertiesSubmit={() => {}} SelectContainer={() => {}} @@ -42,12 +45,13 @@ describe.concurrent('Elements sidebar', () => { }); it('With a selected MainContainer', () => { - const MainContainer = { + const MainContainer: IContainerModel = { children: [], parent: null, properties: { id: 'main', parentId: '', + linkedSymbolId: '', displayedText: 'main', x: 0, y: 0, @@ -62,6 +66,7 @@ describe.concurrent('Elements sidebar', () => { }; const { container } = render( { it('With multiple containers', () => { const children: IContainerModel[] = []; - const MainContainer = { + const MainContainer: IContainerModel = { children, parent: null, properties: { id: 'main', parentId: '', + linkedSymbolId: '', displayedText: 'main', x: 0, y: 0, @@ -128,6 +134,7 @@ describe.concurrent('Elements sidebar', () => { properties: { id: 'child-1', parentId: 'main', + linkedSymbolId: '', displayedText: 'child-1', x: 0, y: 0, @@ -149,6 +156,7 @@ describe.concurrent('Elements sidebar', () => { properties: { id: 'child-2', parentId: 'main', + linkedSymbolId: '', displayedText: 'child-2', x: 0, y: 0, @@ -164,6 +172,7 @@ describe.concurrent('Elements sidebar', () => { ); render( { properties: { id: 'main', parentId: '', + linkedSymbolId: '', displayedText: 'main', x: 0, y: 0, @@ -209,6 +219,7 @@ describe.concurrent('Elements sidebar', () => { properties: { id: 'child-1', parentId: 'main', + linkedSymbolId: '', displayedText: 'child-1', x: 0, y: 0, @@ -223,12 +234,13 @@ describe.concurrent('Elements sidebar', () => { }; children.push(child1Model); - let SelectedContainer = MainContainer; - const selectContainer = vi.fn((container: IContainerModel) => { - SelectedContainer = container; + let SelectedContainer: IContainerModel | undefined = MainContainer; + const selectContainer = vi.fn((containerId: string) => { + SelectedContainer = findContainerById(MainContainer, containerId); }); const { container, rerender } = render( { fireEvent.click(child1); rerender( isOpen: boolean isHistoryOpen: boolean - SelectedContainer: IContainerModel | null + SelectedContainer: IContainerModel | undefined OnPropertyChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void OnPropertiesSubmit: (event: React.FormEvent) => void - SelectContainer: (container: IContainerModel) => void + SelectContainer: (containerId: string) => void DeleteContainer: (containerid: string) => void AddContainer: (index: number, type: string, parent: string) => void } @@ -104,7 +106,7 @@ export const ElementsSidebar: React.FC = (props: IElement onDrop={(event) => handleOnDrop(event, props.MainContainer, props.AddContainer)} onDragOver={(event) => handleDragOver(event, props.MainContainer)} onDragLeave={(event) => handleDragLeave(event)} - onClick={() => props.SelectContainer(container)} + onClick={() => props.SelectContainer(container.properties.id)} > { text } @@ -140,6 +142,7 @@ export const ElementsSidebar: React.FC = (props: IElement diff --git a/src/Components/Properties/DynamicForm.tsx b/src/Components/Properties/DynamicForm.tsx index a34b5bf..be59200 100644 --- a/src/Components/Properties/DynamicForm.tsx +++ b/src/Components/Properties/DynamicForm.tsx @@ -1,18 +1,21 @@ import { MenuAlt2Icon, MenuAlt3Icon, MenuIcon } from '@heroicons/react/outline'; import * as React from 'react'; import { XPositionReference } from '../../Enums/XPositionReference'; -import IProperties from '../../Interfaces/IProperties'; +import IContainerProperties from '../../Interfaces/IContainerProperties'; +import { ISymbolModel } from '../../Interfaces/ISymbolModel'; +import { restoreX, transformX } from '../../utils/svg'; import { InputGroup } from '../InputGroup/InputGroup'; import { RadioGroupButtons } from '../RadioGroupButtons/RadioGroupButtons'; -import { restoreX, transformX } from '../SVG/Elements/Container'; +import { Select } from '../Select/Select'; interface IDynamicFormProps { - properties: IProperties + properties: IContainerProperties + symbols: Map onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void } const getCSSInputs = ( - properties: IProperties, + properties: IContainerProperties, onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void ): JSX.Element[] => { const groupInput: JSX.Element[] = []; @@ -67,6 +70,7 @@ const DynamicForm: React.FunctionComponent = (props) => { labelClassName='' 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))} /> @@ -160,9 +164,22 @@ const DynamicForm: React.FunctionComponent = (props) => { ]} onChange={(event) => props.onChange('XPositionReference', Number(event.target.value))} /> + + { options } + + + ); +}; diff --git a/src/Components/SymbolProperties/DynamicForm.tsx b/src/Components/SymbolProperties/DynamicForm.tsx new file mode 100644 index 0000000..8e969b5 --- /dev/null +++ b/src/Components/SymbolProperties/DynamicForm.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import { ISymbolModel } from '../../Interfaces/ISymbolModel'; +import { restoreX, transformX } from '../../utils/svg'; +import { InputGroup } from '../InputGroup/InputGroup'; + +interface IDynamicFormProps { + symbol: ISymbolModel + symbols: Map + onChange: (key: string, value: string | number | boolean) => void +} +const DynamicForm: React.FunctionComponent = (props) => { + return ( +
+ + props.onChange('x', restoreX(Number(event.target.value), props.symbol.width, props.symbol.config.XPositionReference))} + /> + props.onChange('height', Number(event.target.value))} + /> + props.onChange('width', Number(event.target.value))} + /> +
+ ); +}; + +export default DynamicForm; diff --git a/src/Components/SymbolProperties/Form.tsx b/src/Components/SymbolProperties/Form.tsx new file mode 100644 index 0000000..a70c7dc --- /dev/null +++ b/src/Components/SymbolProperties/Form.tsx @@ -0,0 +1,17 @@ +import * as React from 'react'; +import { ISymbolModel } from '../../Interfaces/ISymbolModel'; +import DynamicForm from './DynamicForm'; + +interface IFormProps { + symbol: ISymbolModel + symbols: Map + onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void +} + +export const Form: React.FunctionComponent = (props) => { + return ; +}; diff --git a/src/Components/SymbolProperties/SymbolProperties.tsx b/src/Components/SymbolProperties/SymbolProperties.tsx new file mode 100644 index 0000000..b58e3cf --- /dev/null +++ b/src/Components/SymbolProperties/SymbolProperties.tsx @@ -0,0 +1,27 @@ +import React, { useState } from 'react'; +import IContainerProperties from '../../Interfaces/IContainerProperties'; +import { ISymbolModel } from '../../Interfaces/ISymbolModel'; +import { ToggleButton } from '../ToggleButton/ToggleButton'; +import { Form } from './Form'; + +interface ISymbolPropertiesProps { + symbol?: ISymbolModel + symbols: Map + onChange: (key: string, value: string | number | boolean) => void +} + +export const SymbolProperties: React.FC = (props: ISymbolPropertiesProps) => { + if (props.symbol === undefined) { + return
; + } + + return ( +
+
+
+ ); +}; diff --git a/src/Components/Symbols/Symbols.tsx b/src/Components/Symbols/Symbols.tsx new file mode 100644 index 0000000..a514a9d --- /dev/null +++ b/src/Components/Symbols/Symbols.tsx @@ -0,0 +1,68 @@ +import * as React from 'react'; +import { IAvailableSymbol } from '../../Interfaces/IAvailableSymbol'; +import { truncateString } from '../../utils/stringtools'; + +interface ISymbolsProps { + componentOptions: IAvailableSymbol[] + isOpen: boolean + buttonOnClick: (type: string) => void +} + +function handleDragStart(event: React.DragEvent): void { + event.dataTransfer.setData('type', (event.target as HTMLButtonElement).id); +} + +export const Symbols: React.FC = (props: ISymbolsProps) => { + const listElements = props.componentOptions.map(componentOption => { + if (componentOption.Image.Url !== undefined || componentOption.Image.Base64Image !== undefined) { + const url = componentOption.Image.Base64Image ?? componentOption.Image.Url; + return (); + } + + return (); + }); + + const isOpenClasses = props.isOpen ? 'left-16' : '-left-64'; + return ( +
+
+ Symbols +
+
+ {listElements} +
+
+ ); +}; diff --git a/src/Components/SymbolsSidebar/MouseEventHandlers.ts b/src/Components/SymbolsSidebar/MouseEventHandlers.ts new file mode 100644 index 0000000..8a8b5b6 --- /dev/null +++ b/src/Components/SymbolsSidebar/MouseEventHandlers.ts @@ -0,0 +1,34 @@ +import { IPoint } from '../../Interfaces/IPoint'; + +export function handleRightClick( + event: MouseEvent, + setIsContextMenuOpen: React.Dispatch>, + setOnClickSymbolId: React.Dispatch>, + setContextMenuPosition: React.Dispatch> +): void { + event.preventDefault(); + + if (!(event.target instanceof HTMLButtonElement)) { + setIsContextMenuOpen(false); + setOnClickSymbolId(''); + return; + } + + const contextMenuPosition: IPoint = { x: event.pageX, y: event.pageY }; + setIsContextMenuOpen(true); + setOnClickSymbolId(event.target.id); + setContextMenuPosition(contextMenuPosition); +} + +export function handleLeftClick( + isContextMenuOpen: boolean, + setIsContextMenuOpen: React.Dispatch>, + setOnClickContainerId: React.Dispatch> +): void { + if (!isContextMenuOpen) { + return; + } + + setIsContextMenuOpen(false); + setOnClickContainerId(''); +} diff --git a/src/Components/SymbolsSidebar/SymbolsSidebar.tsx b/src/Components/SymbolsSidebar/SymbolsSidebar.tsx new file mode 100644 index 0000000..2285f47 --- /dev/null +++ b/src/Components/SymbolsSidebar/SymbolsSidebar.tsx @@ -0,0 +1,137 @@ +import * as React from 'react'; +import { FixedSizeList as List } from 'react-window'; +import { Menu } from '../Menu/Menu'; +import { MenuItem } from '../Menu/MenuItem'; +import { handleLeftClick, handleRightClick } from './MouseEventHandlers'; +import { IPoint } from '../../Interfaces/IPoint'; +import { ISymbolModel } from '../../Interfaces/ISymbolModel'; +import { SymbolProperties } from '../SymbolProperties/SymbolProperties'; + +interface ISymbolsSidebarProps { + SelectedSymbolId: string + symbols: Map + isOpen: boolean + isHistoryOpen: boolean + OnPropertyChange: (key: string, value: string | number | boolean) => void + SelectSymbol: (symbolId: string) => void + DeleteSymbol: (containerid: string) => void +} + +export const SymbolsSidebar: React.FC = (props: ISymbolsSidebarProps): JSX.Element => { + // States + const [isContextMenuOpen, setIsContextMenuOpen] = React.useState(false); + const [onClickSymbolId, setOnClickSymbolId] = React.useState(''); + const [contextMenuPosition, setContextMenuPosition] = React.useState({ + x: 0, + y: 0 + }); + + const elementRef = React.useRef(null); + + // Event listeners + React.useEffect(() => { + const onContextMenu = (event: MouseEvent): void => handleRightClick( + event, + setIsContextMenuOpen, + setOnClickSymbolId, + setContextMenuPosition + ); + + const onLeftClick = (): void => handleLeftClick( + isContextMenuOpen, + setIsContextMenuOpen, + setOnClickSymbolId + ); + + elementRef.current?.addEventListener( + 'contextmenu', + onContextMenu + ); + + window.addEventListener( + 'click', + onLeftClick + ); + + return () => { + elementRef.current?.removeEventListener( + 'contextmenu', + onContextMenu + ); + + window.removeEventListener( + 'click', + onLeftClick + ); + }; + }); + + // Render + let isOpenClasses = '-right-64'; + if (props.isOpen) { + isOpenClasses = props.isHistoryOpen + ? 'right-64' + : 'right-0'; + } + + const containers = [...props.symbols.values()]; + const Row = ({ index, style }: {index: number, style: React.CSSProperties}): JSX.Element => { + const container = containers[index]; + const key = container.id.toString(); + const text = key; + const selectedClass: string = props.SelectedSymbolId !== '' && + props.SelectedSymbolId === container.id + ? 'border-l-4 bg-slate-400/60 hover:bg-slate-400' + : 'bg-slate-300/60 hover:bg-slate-300'; + + return ( + + ); + }; + + return ( +
+
+ Elements +
+
+ + { Row } + +
+ + { + setIsContextMenuOpen(false); + props.DeleteSymbol(onClickSymbolId); + }} /> + + +
+ ); +}; diff --git a/src/Components/UI/UI.tsx b/src/Components/UI/UI.tsx index c57daee..db27312 100644 --- a/src/Components/UI/UI.tsx +++ b/src/Components/UI/UI.tsx @@ -3,38 +3,55 @@ import { ElementsSidebar } from '../ElementsSidebar/ElementsSidebar'; import { Sidebar } from '../Sidebar/Sidebar'; import { History } from '../History/History'; import { IAvailableContainer } from '../../Interfaces/IAvailableContainer'; -import { ContainerModel } from '../../Interfaces/IContainerModel'; +import { IContainerModel } from '../../Interfaces/IContainerModel'; import { IHistoryState } from '../../Interfaces/IHistoryState'; import { PhotographIcon, UploadIcon } from '@heroicons/react/outline'; import { FloatingButton } from '../FloatingButton/FloatingButton'; import { Bar } from '../Bar/Bar'; +import { IAvailableSymbol } from '../../Interfaces/IAvailableSymbol'; +import { Symbols } from '../Symbols/Symbols'; +import { SymbolsSidebar } from '../SymbolsSidebar/SymbolsSidebar'; interface IUIProps { + SelectedContainer: IContainerModel | undefined current: IHistoryState history: IHistoryState[] historyCurrentStep: number AvailableContainers: IAvailableContainer[] - SelectContainer: (container: ContainerModel) => void + AvailableSymbols: IAvailableSymbol[] + SelectContainer: (containerId: string) => void DeleteContainer: (containerId: string) => void OnPropertyChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void OnPropertiesSubmit: (event: React.FormEvent) => void AddContainerToSelectedContainer: (type: string) => void AddContainer: (index: number, type: string, parentId: string) => void + AddSymbol: (type: string) => void + OnSymbolPropertyChange: (key: string, value: string | number | boolean) => void + SelectSymbol: (symbolId: string) => void + DeleteSymbol: (symbolId: string) => void SaveEditorAsJSON: () => void SaveEditorAsSVG: () => void LoadState: (move: number) => void } +function CloseOtherSidebars( + setIsSidebarOpen: React.Dispatch>, + setIsSymbolsOpen: React.Dispatch> +): void { + setIsSidebarOpen(false); + setIsSymbolsOpen(false); +} + export const UI: React.FunctionComponent = (props: IUIProps) => { const [isSidebarOpen, setIsSidebarOpen] = React.useState(true); - const [isElementsSidebarOpen, setIsElementsSidebarOpen] = React.useState(false); + const [isSymbolsOpen, setIsSymbolsOpen] = React.useState(false); const [isHistoryOpen, setIsHistoryOpen] = React.useState(false); let buttonRightOffsetClasses = 'right-12'; - if (isElementsSidebarOpen || isHistoryOpen) { + if (isSidebarOpen || isHistoryOpen) { buttonRightOffsetClasses = 'right-72'; } - if (isHistoryOpen && isElementsSidebarOpen) { + if (isHistoryOpen && isSidebarOpen) { buttonRightOffsetClasses = 'right-[544px]'; } @@ -42,22 +59,35 @@ export const UI: React.FunctionComponent = (props: IUIProps) => { <> setIsElementsSidebarOpen(!isElementsSidebarOpen)} - ToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)} + ToggleSidebar={() => { + CloseOtherSidebars(setIsSidebarOpen, setIsSymbolsOpen); + setIsSidebarOpen(!isSidebarOpen); + }} + ToggleSymbols={() => { + CloseOtherSidebars(setIsSidebarOpen, setIsSymbolsOpen); + setIsSymbolsOpen(!isSymbolsOpen); + }} ToggleTimeline={() => setIsHistoryOpen(!isHistoryOpen)} /> props.AddContainerToSelectedContainer(type)} + buttonOnClick={props.AddContainerToSelectedContainer} + /> + = (props: IUIProps) => { DeleteContainer={props.DeleteContainer} AddContainer={props.AddContainer} /> + } +/** + * Macro for creating the interface + * Do not add methods since they will be lost during serialization + */ export class ContainerModel implements IContainerModel { public children: IContainerModel[]; public parent: IContainerModel | null; - public properties: IProperties; + public properties: IContainerProperties; public userData: Record; constructor( parent: IContainerModel | null, - properties: IProperties, + properties: IContainerProperties, children: IContainerModel[] = [], userData = {}) { this.parent = parent; diff --git a/src/Interfaces/IProperties.ts b/src/Interfaces/IContainerProperties.ts similarity index 91% rename from src/Interfaces/IProperties.ts rename to src/Interfaces/IContainerProperties.ts index 205d93f..d5f7ae7 100644 --- a/src/Interfaces/IProperties.ts +++ b/src/Interfaces/IContainerProperties.ts @@ -4,13 +4,17 @@ import { XPositionReference } from '../Enums/XPositionReference'; /** * Properties of a container */ -export default interface IProperties { +export default interface IContainerProperties { /** id of the container */ id: string + // TODO: replace null by empty string /** id of the parent container (null when there is no parent) */ parentId: string | null + /** id of the linked symbol ('' when there is no parent) */ + linkedSymbolId: string + /** Text displayed in the container */ displayedText: string diff --git a/src/Interfaces/IHistoryState.ts b/src/Interfaces/IHistoryState.ts index fd46fbc..f906af3 100644 --- a/src/Interfaces/IHistoryState.ts +++ b/src/Interfaces/IHistoryState.ts @@ -1,9 +1,22 @@ import { IContainerModel } from './IContainerModel'; +import { ISymbolModel } from './ISymbolModel'; export interface IHistoryState { + /** Last editor action */ LastAction: string + + /** Reference to the main container */ MainContainer: IContainerModel - SelectedContainer: IContainerModel | null + + /** Id of the selected container */ SelectedContainerId: string + + /** Counter of type of container. Used for ids. */ TypeCounters: Record + + /** List of symbols */ + Symbols: Map + + /** Selected symbols id */ + SelectedSymbolId: string } diff --git a/src/Interfaces/IImage.ts b/src/Interfaces/IImage.ts index 7432440..d22c2e1 100644 --- a/src/Interfaces/IImage.ts +++ b/src/Interfaces/IImage.ts @@ -1,7 +1,20 @@ -/** Model of an image with multiple source */ +/** + * Model of an image with multiple source + * It must at least have one source. + * + * If Url/Base64Image and Svg are set, + * Url/Base64Image will be shown in the menu while SVG will be drawn + */ export interface IImage { + /** Name of the image */ Name: string - Url: string - Base64Image: string - Svg: string + + /** (optional) Url of the image */ + Url?: string + + /** (optional) base64 data of the image */ + Base64Image?: string + + /** (optional) SVG string */ + Svg?: string } diff --git a/src/Interfaces/ISymbolModel.ts b/src/Interfaces/ISymbolModel.ts new file mode 100644 index 0000000..a99966f --- /dev/null +++ b/src/Interfaces/ISymbolModel.ts @@ -0,0 +1,24 @@ +import { IAvailableSymbol } from './IAvailableSymbol'; + +export interface ISymbolModel { + /** Identifier */ + id: string + + /** Type */ + type: string + + /** Configuration of the symbol */ + config: IAvailableSymbol + + /** Horizontal offset */ + x: number + + /** Width */ + width: number + + /** Height */ + height: number + + /** List of linked container id */ + linkedContainers: Set +} diff --git a/src/index.scss b/src/index.scss index d9712f5..c7d716d 100644 --- a/src/index.scss +++ b/src/index.scss @@ -11,6 +11,10 @@ @apply transition-all px-2 py-6 text-sm rounded-lg bg-slate-300/60 hover:bg-slate-300 } + .sidebar-component-card { + @apply transition-all overflow-hidden text-sm rounded-lg bg-slate-300/60 hover:bg-slate-300 + } + .elements-sidebar-row { @apply pl-6 pr-6 pt-2 pb-2 w-full } diff --git a/src/utils/default.ts b/src/utils/default.ts index 6bb414b..f30323f 100644 --- a/src/utils/default.ts +++ b/src/utils/default.ts @@ -2,9 +2,9 @@ import { XPositionReference } from '../Enums/XPositionReference'; import { IAvailableContainer } from '../Interfaces/IAvailableContainer'; import { IConfiguration } from '../Interfaces/IConfiguration'; import { IContainerModel } from '../Interfaces/IContainerModel'; -import IProperties from '../Interfaces/IProperties'; +import IContainerProperties from '../Interfaces/IContainerProperties'; -/// CONTAINRE DEFAULTS /// +/// CONTAINER DEFAULTS /// export const SHOW_TEXT = true; export const DEFAULTCHILDTYPE_ALLOW_CYCLIC = false; @@ -18,10 +18,16 @@ export const SHOW_DIMENSIONS_PER_DEPTH = true; export const DIMENSION_MARGIN = 50; export const NOTCHES_LENGTH = 4; +/// SYMBOL DEFAULTS /// + +export const DEFAULT_SYMBOL_WIDTH = 32; +export const DEFAULT_SYMBOL_HEIGHT = 32; + /// EDITOR DEFAULTS /// export const ENABLE_SHORTCUTS = true; export const MAX_HISTORY = 200; +export const APPLY_BEHAVIORS_ON_CHILDREN = true; export const DEFAULT_CONFIG: IConfiguration = { AvailableContainers: [ @@ -47,9 +53,10 @@ export const DEFAULT_CONFIG: IConfiguration = { } }; -export const DEFAULT_MAINCONTAINER_PROPS: IProperties = { +export const DEFAULT_MAINCONTAINER_PROPS: IContainerProperties = { id: 'main', parentId: 'null', + linkedSymbolId: '', displayedText: 'main', x: 0, y: 0, @@ -72,9 +79,10 @@ export const GetDefaultContainerProps = ( x: number, y: number, containerConfig: IAvailableContainer -): IProperties => ({ +): IContainerProperties => ({ id: `${type}-${typeCount}`, parentId: parent.properties.id, + linkedSymbolId: '', displayedText: `${type}-${typeCount}`, x, y, @@ -83,7 +91,7 @@ export const GetDefaultContainerProps = ( isRigidBody: false, // set this to true to replicate Florian's project isAnchor: false, XPositionReference: containerConfig.XPositionReference ?? XPositionReference.Left, - minWidth: containerConfig.MinWidth ?? 0, + minWidth: containerConfig.MinWidth ?? 1, customSVG: containerConfig.CustomSVG, style: structuredClone(containerConfig.Style), userData: structuredClone(containerConfig.UserData) diff --git a/src/utils/saveload.ts b/src/utils/saveload.ts index 6867ea3..fcfd022 100644 --- a/src/utils/saveload.ts +++ b/src/utils/saveload.ts @@ -18,6 +18,11 @@ export function Revive(editorState: IEditorState): void { 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; @@ -31,24 +36,21 @@ export function Revive(editorState: IEditorState): void { } container.parent = parent; } - - const selected = findContainerById(state.MainContainer, state.SelectedContainerId); - if (selected === undefined) { - state.SelectedContainer = null; - continue; - } - state.SelectedContainer = selected; } } -export const getCircularReplacer = (): (key: any, value: object | null) => object | null | undefined => { +export const getCircularReplacer = (): (key: any, value: object | Map | null) => object | null | undefined => { return (key: any, value: object | null) => { if (key === 'parent') { return; } - if (key === 'SelectedContainer') { - return; + if (key === 'Symbols') { + return Array.from((value as Map).entries()); + } + + if (key === 'linkedContainers') { + return Array.from(value as Set); } return value; diff --git a/src/utils/stringtools.ts b/src/utils/stringtools.ts index 349e34a..2c858c0 100644 --- a/src/utils/stringtools.ts +++ b/src/utils/stringtools.ts @@ -4,3 +4,7 @@ export function truncateString(str: string, num: number): string { } return `${str.slice(0, num)}...`; } + +export function camelize(str: string): any { + return str.split('-').map((word, index) => index > 0 ? word.charAt(0).toUpperCase() + word.slice(1) : word).join(''); +} diff --git a/src/utils/svg.ts b/src/utils/svg.ts new file mode 100644 index 0000000..0248df8 --- /dev/null +++ b/src/utils/svg.ts @@ -0,0 +1,21 @@ +import { XPositionReference } from '../Enums/XPositionReference'; + +export function transformX(x: number, width: number, xPositionReference = XPositionReference.Left): number { + let transformedX = x; + if (xPositionReference === XPositionReference.Center) { + transformedX += width / 2; + } else if (xPositionReference === XPositionReference.Right) { + transformedX += width; + } + return transformedX; +} + +export function restoreX(x: number, width: number, xPositionReference = XPositionReference.Left): number { + let transformedX = x; + if (xPositionReference === XPositionReference.Center) { + transformedX -= width / 2; + } else if (xPositionReference === XPositionReference.Right) { + transformedX -= width; + } + return transformedX; +} diff --git a/test-server/http.js b/test-server/http.js index 8053660..167ff2d 100644 --- a/test-server/http.js +++ b/test-server/http.js @@ -112,7 +112,8 @@ const GetSVGLayoutConfiguration = () => { ], AvailableSymbols: [ { - Height: 0, + Width: 32, + Height: 32, Image: { Base64Image: null, Name: null, @@ -120,11 +121,11 @@ const GetSVGLayoutConfiguration = () => { Url: 'https://www.manutan.fr/img/S/GRP/ST/AIG3930272.jpg' }, Name: 'Poteau structure', - Width: 0, XPositionReference: 1 }, { - Height: 0, + Width: 32, + Height: 32, Image: { Base64Image: null, Name: null, @@ -132,7 +133,6 @@ const GetSVGLayoutConfiguration = () => { 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 } ], From 66ea3b1b648f205a4b3bf14c5f6e3961d75d90d3 Mon Sep 17 00:00:00 2001 From: Eric Nguyen Date: Mon, 22 Aug 2022 14:37:25 +0000 Subject: [PATCH 06/13] Merged PR 163: Remove the static form + rename some components for clarity The static form is hard to maintain so I am removing it + rename some components for clarity + moved some utils files --- docs/ComponentStructure.drawio | 4 +- src/Components/App/{ => Actions}/Load.ts | 4 +- .../App/{ => Actions}/MenuActions.ts | 10 +- src/Components/App/App.tsx | 4 +- .../ContainerForm.tsx} | 7 +- .../ContainerProperties.test.tsx} | 5 +- .../ContainerProperties.tsx} | 19 +- .../{ => Actions}/ContainerOperations.ts | 120 ++++++++-- src/Components/Editor/{ => Actions}/Save.ts | 10 +- .../Editor/{ => Actions}/Shortcuts.ts | 4 +- .../Editor/{ => Actions}/SymbolOperations.ts | 18 +- src/Components/Editor/Editor.tsx | 17 +- src/Components/Editor/PropertiesOperations.ts | 223 ------------------ .../ElementsSidebar/ElementsSidebar.test.tsx | 5 - .../ElementsSidebar/ElementsSidebar.tsx | 4 +- src/Components/Properties/Form.tsx | 27 --- src/Components/Properties/StaticForm.tsx | 159 ------------- src/Components/SymbolProperties/Form.tsx | 17 -- .../{DynamicForm.tsx => SymbolForm.tsx} | 6 +- .../SymbolProperties/SymbolProperties.tsx | 8 +- src/Components/UI/UI.tsx | 2 - 21 files changed, 150 insertions(+), 523 deletions(-) rename src/Components/App/{ => Actions}/Load.ts (72%) rename src/Components/App/{ => Actions}/MenuActions.ts (85%) rename src/Components/{Properties/DynamicForm.tsx => ContainerProperties/ContainerForm.tsx} (97%) rename src/Components/{Properties/Properties.test.tsx => ContainerProperties/ContainerProperties.test.tsx} (96%) rename src/Components/{Properties/Properties.tsx => ContainerProperties/ContainerProperties.tsx} (54%) rename src/Components/Editor/{ => Actions}/ContainerOperations.ts (73%) rename src/Components/Editor/{ => Actions}/Save.ts (90%) rename src/Components/Editor/{ => Actions}/Shortcuts.ts (84%) rename src/Components/Editor/{ => Actions}/SymbolOperations.ts (91%) delete mode 100644 src/Components/Editor/PropertiesOperations.ts delete mode 100644 src/Components/Properties/Form.tsx delete mode 100644 src/Components/Properties/StaticForm.tsx delete mode 100644 src/Components/SymbolProperties/Form.tsx rename src/Components/SymbolProperties/{DynamicForm.tsx => SymbolForm.tsx} (92%) diff --git a/docs/ComponentStructure.drawio b/docs/ComponentStructure.drawio index e4ee4af..547eb5c 100644 --- a/docs/ComponentStructure.drawio +++ b/docs/ComponentStructure.drawio @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8156818d0348ba0edefc52d6ed8fc84b65305c7eca275a37d3ff1733391bb1d -size 19858 +oid sha256:52c70be0c74420ab5f591a2edd380399f4c163816dd871f137ac762ac4d25b2e +size 24103 diff --git a/src/Components/App/Load.ts b/src/Components/App/Actions/Load.ts similarity index 72% rename from src/Components/App/Load.ts rename to src/Components/App/Actions/Load.ts index 909dfc9..3905b19 100644 --- a/src/Components/App/Load.ts +++ b/src/Components/App/Actions/Load.ts @@ -1,6 +1,6 @@ import { Dispatch, SetStateAction } from 'react'; -import { Revive } from '../../utils/saveload'; -import { IEditorState } from '../../Interfaces/IEditorState'; +import { IEditorState } from '../../../Interfaces/IEditorState'; +import { Revive } from '../../../utils/saveload'; export function LoadState( editorState: IEditorState, diff --git a/src/Components/App/MenuActions.ts b/src/Components/App/Actions/MenuActions.ts similarity index 85% rename from src/Components/App/MenuActions.ts rename to src/Components/App/Actions/MenuActions.ts index 4c0c8aa..46bb2e1 100644 --- a/src/Components/App/MenuActions.ts +++ b/src/Components/App/Actions/MenuActions.ts @@ -1,10 +1,10 @@ import { Dispatch, SetStateAction } from 'react'; -import { IConfiguration } from '../../Interfaces/IConfiguration'; -import { ContainerModel } from '../../Interfaces/IContainerModel'; -import { fetchConfiguration } from '../API/api'; -import { IEditorState } from '../../Interfaces/IEditorState'; +import { IConfiguration } from '../../../Interfaces/IConfiguration'; +import { ContainerModel } from '../../../Interfaces/IContainerModel'; +import { fetchConfiguration } from '../../API/api'; +import { IEditorState } from '../../../Interfaces/IEditorState'; import { LoadState } from './Load'; -import { DEFAULT_MAINCONTAINER_PROPS } from '../../utils/default'; +import { DEFAULT_MAINCONTAINER_PROPS } from '../../../utils/default'; export function NewEditor( setEditorState: Dispatch>, diff --git a/src/Components/App/App.tsx b/src/Components/App/App.tsx index 1041814..a77f8cb 100644 --- a/src/Components/App/App.tsx +++ b/src/Components/App/App.tsx @@ -4,8 +4,8 @@ import { MainMenu } from '../MainMenu/MainMenu'; import { ContainerModel } from '../../Interfaces/IContainerModel'; import Editor from '../Editor/Editor'; import { IEditorState } from '../../Interfaces/IEditorState'; -import { LoadState } from './Load'; -import { LoadEditor, NewEditor } from './MenuActions'; +import { LoadState } from './Actions/Load'; +import { LoadEditor, NewEditor } from './Actions/MenuActions'; import { DEFAULT_CONFIG, DEFAULT_MAINCONTAINER_PROPS } from '../../utils/default'; // App will never have props diff --git a/src/Components/Properties/DynamicForm.tsx b/src/Components/ContainerProperties/ContainerForm.tsx similarity index 97% rename from src/Components/Properties/DynamicForm.tsx rename to src/Components/ContainerProperties/ContainerForm.tsx index be59200..61a1a9f 100644 --- a/src/Components/Properties/DynamicForm.tsx +++ b/src/Components/ContainerProperties/ContainerForm.tsx @@ -8,7 +8,7 @@ import { InputGroup } from '../InputGroup/InputGroup'; import { RadioGroupButtons } from '../RadioGroupButtons/RadioGroupButtons'; import { Select } from '../Select/Select'; -interface IDynamicFormProps { +interface IContainerFormProps { properties: IContainerProperties symbols: Map onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void @@ -34,7 +34,7 @@ const getCSSInputs = ( return groupInput; }; -const DynamicForm: React.FunctionComponent = (props) => { +const ContainerForm: React.FunctionComponent = (props) => { return (
= (props) => { ); }; - -export default DynamicForm; +export default ContainerForm; diff --git a/src/Components/Properties/Properties.test.tsx b/src/Components/ContainerProperties/ContainerProperties.test.tsx similarity index 96% rename from src/Components/Properties/Properties.test.tsx rename to src/Components/ContainerProperties/ContainerProperties.test.tsx index 426f21a..f4835b1 100644 --- a/src/Components/Properties/Properties.test.tsx +++ b/src/Components/ContainerProperties/ContainerProperties.test.tsx @@ -3,14 +3,13 @@ import * as React from 'react'; import { expect, describe, it, vi } from 'vitest'; import { XPositionReference } from '../../Enums/XPositionReference'; import IContainerProperties from '../../Interfaces/IContainerProperties'; -import { Properties } from './Properties'; +import { Properties } from './ContainerProperties'; describe.concurrent('Properties', () => { it('No properties', () => { render( {}} - onSubmit={() => {}} symbols={new Map()} />); @@ -43,7 +42,6 @@ describe.concurrent('Properties', () => { const { container, rerender } = render( {}} symbols={new Map()} />); @@ -78,7 +76,6 @@ describe.concurrent('Properties', () => { rerender( {}} symbols={new Map()} />); diff --git a/src/Components/Properties/Properties.tsx b/src/Components/ContainerProperties/ContainerProperties.tsx similarity index 54% rename from src/Components/Properties/Properties.tsx rename to src/Components/ContainerProperties/ContainerProperties.tsx index a643535..357c900 100644 --- a/src/Components/Properties/Properties.tsx +++ b/src/Components/ContainerProperties/ContainerProperties.tsx @@ -1,38 +1,25 @@ -import React, { useState } from 'react'; +import React from 'react'; import IContainerProperties from '../../Interfaces/IContainerProperties'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { ToggleButton } from '../ToggleButton/ToggleButton'; -import { Form } from './Form'; +import ContainerForm from './ContainerForm'; interface IPropertiesProps { properties?: IContainerProperties symbols: Map onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void - onSubmit: (event: React.FormEvent) => void } export const Properties: React.FC = (props: IPropertiesProps) => { - const [isDynamicInput, setIsDynamicInput] = useState(true); - if (props.properties === undefined) { return
; } return (
- setIsDynamicInput(!isDynamicInput)} - /> -
); diff --git a/src/Components/Editor/ContainerOperations.ts b/src/Components/Editor/Actions/ContainerOperations.ts similarity index 73% rename from src/Components/Editor/ContainerOperations.ts rename to src/Components/Editor/Actions/ContainerOperations.ts index 018c39d..691a12d 100644 --- a/src/Components/Editor/ContainerOperations.ts +++ b/src/Components/Editor/Actions/ContainerOperations.ts @@ -1,14 +1,14 @@ import { Dispatch, SetStateAction } from 'react'; -import { IHistoryState } from '../../Interfaces/IHistoryState'; -import { IConfiguration } from '../../Interfaces/IConfiguration'; -import { ContainerModel, IContainerModel } from '../../Interfaces/IContainerModel'; -import { findContainerById, MakeIterator } from '../../utils/itertools'; -import { getCurrentHistory, UpdateCounters } from './Editor'; -import { AddMethod } from '../../Enums/AddMethod'; -import { IAvailableContainer } from '../../Interfaces/IAvailableContainer'; -import { GetDefaultContainerProps, DEFAULTCHILDTYPE_ALLOW_CYCLIC, DEFAULTCHILDTYPE_MAX_DEPTH } from '../../utils/default'; -import { ApplyBehaviors } from './Behaviors/Behaviors'; -import { ISymbolModel } from '../../Interfaces/ISymbolModel'; +import { IHistoryState } from '../../../Interfaces/IHistoryState'; +import { IConfiguration } from '../../../Interfaces/IConfiguration'; +import { ContainerModel, IContainerModel } from '../../../Interfaces/IContainerModel'; +import { findContainerById, MakeIterator } from '../../../utils/itertools'; +import { getCurrentHistory, UpdateCounters } from '../Editor'; +import { AddMethod } from '../../../Enums/AddMethod'; +import { IAvailableContainer } from '../../../Interfaces/IAvailableContainer'; +import { GetDefaultContainerProps, DEFAULTCHILDTYPE_ALLOW_CYCLIC, DEFAULTCHILDTYPE_MAX_DEPTH } from '../../../utils/default'; +import { ApplyBehaviors } from '../Behaviors/Behaviors'; +import { ISymbolModel } from '../../../Interfaces/ISymbolModel'; /** * Select a container @@ -71,7 +71,8 @@ export function DeleteContainer( if (container === null || container === undefined) { throw new Error('[DeleteContainer] Container model was not found among children of the main container!'); } - const newSymbols = structuredClone(current.Symbols) + + const newSymbols = structuredClone(current.Symbols); UnlinkSymbol(newSymbols, container); const index = container.parent.children.indexOf(container); @@ -83,10 +84,12 @@ export function DeleteContainer( // Select the previous container // or select the one above - const SelectedContainer = findContainerById(mainContainerClone, current.SelectedContainerId) ?? - container.parent.children.at(index - 1) ?? - container.parent; - const SelectedContainerId = SelectedContainer.properties.id; + const SelectedContainerId = GetSelectedContainerOnDelete( + mainContainerClone, + current.SelectedContainerId, + container.parent, + index + ); history.push({ LastAction: `Delete ${containerId}`, @@ -100,6 +103,14 @@ export function DeleteContainer( setHistoryCurrentStep(history.length - 1); } +function GetSelectedContainerOnDelete(mainContainerClone: IContainerModel, selectedContainerId: string, parent: IContainerModel, index: number): string { + const SelectedContainer = findContainerById(mainContainerClone, selectedContainerId) ?? + parent.children.at(index - 1) ?? + parent; + const SelectedContainerId = SelectedContainer.properties.id; + return SelectedContainerId; +} + function UnlinkSymbol(symbols: Map, container: IContainerModel): void { const it = MakeIterator(container); for (const child of it) { @@ -327,3 +338,82 @@ function ApplyAddMethod(index: number, containerConfig: IAvailableContainer, par } return x; } + +/** + * Handled the property change event in the properties form + * @param key Property name + * @param value New value of the property + * @returns void + */ +export function OnPropertyChange( + key: string, + value: string | number | boolean, + isStyle: boolean = false, + selected: IContainerModel | undefined, + fullHistory: IHistoryState[], + historyCurrentStep: number, + setHistory: Dispatch>, + setHistoryCurrentStep: Dispatch> +): void { + const history = getCurrentHistory(fullHistory, historyCurrentStep); + const current = history[history.length - 1]; + + if (selected === null || + selected === undefined) { + throw new Error('[OnPropertyChange] Property was changed before selecting a Container'); + } + + const mainContainerClone: IContainerModel = structuredClone(current.MainContainer); + const container: ContainerModel | undefined = findContainerById(mainContainerClone, selected.properties.id); + + if (container === null || container === undefined) { + 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); + + history.push({ + LastAction: `Change ${key} of ${container.properties.id}`, + MainContainer: mainContainerClone, + SelectedContainerId: container.properties.id, + TypeCounters: Object.assign({}, current.TypeCounters), + Symbols: structuredClone(current.Symbols), + SelectedSymbolId: current.SelectedSymbolId + }); + setHistory(history); + setHistoryCurrentStep(history.length - 1); +} + +function LinkSymbol( + containerId: string, + oldSymbolId: string, + newSymbolId: string, + symbols: Map +): void { + const oldSymbol = symbols.get(oldSymbolId); + const newSymbol = symbols.get(newSymbolId); + + if (newSymbol === undefined) { + if (oldSymbol !== undefined) { + oldSymbol.linkedContainers.delete(containerId); + } + return; + } + + newSymbol.linkedContainers.add(containerId); +} diff --git a/src/Components/Editor/Save.ts b/src/Components/Editor/Actions/Save.ts similarity index 90% rename from src/Components/Editor/Save.ts rename to src/Components/Editor/Actions/Save.ts index 0b355b7..101f95c 100644 --- a/src/Components/Editor/Save.ts +++ b/src/Components/Editor/Actions/Save.ts @@ -1,8 +1,8 @@ -import { IHistoryState } from '../../Interfaces/IHistoryState'; -import { IConfiguration } from '../../Interfaces/IConfiguration'; -import { getCircularReplacer } from '../../utils/saveload'; -import { ID } from '../SVG/SVG'; -import { IEditorState } from '../../Interfaces/IEditorState'; +import { IHistoryState } from '../../../Interfaces/IHistoryState'; +import { IConfiguration } from '../../../Interfaces/IConfiguration'; +import { getCircularReplacer } from '../../../utils/saveload'; +import { ID } from '../../SVG/SVG'; +import { IEditorState } from '../../../Interfaces/IEditorState'; export function SaveEditorAsJSON( history: IHistoryState[], diff --git a/src/Components/Editor/Shortcuts.ts b/src/Components/Editor/Actions/Shortcuts.ts similarity index 84% rename from src/Components/Editor/Shortcuts.ts rename to src/Components/Editor/Actions/Shortcuts.ts index f7d7b5b..12dd597 100644 --- a/src/Components/Editor/Shortcuts.ts +++ b/src/Components/Editor/Actions/Shortcuts.ts @@ -1,6 +1,6 @@ import { Dispatch, SetStateAction } from 'react'; -import { IHistoryState } from '../../Interfaces/IHistoryState'; -import { ENABLE_SHORTCUTS } from '../../utils/default'; +import { IHistoryState } from '../../../Interfaces/IHistoryState'; +import { ENABLE_SHORTCUTS } from '../../../utils/default'; export function onKeyDown( event: KeyboardEvent, diff --git a/src/Components/Editor/SymbolOperations.ts b/src/Components/Editor/Actions/SymbolOperations.ts similarity index 91% rename from src/Components/Editor/SymbolOperations.ts rename to src/Components/Editor/Actions/SymbolOperations.ts index 01844ab..aeb6119 100644 --- a/src/Components/Editor/SymbolOperations.ts +++ b/src/Components/Editor/Actions/SymbolOperations.ts @@ -1,13 +1,13 @@ import { Dispatch, SetStateAction } from 'react'; -import { IConfiguration } from '../../Interfaces/IConfiguration'; -import { IContainerModel } from '../../Interfaces/IContainerModel'; -import { IHistoryState } from '../../Interfaces/IHistoryState'; -import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { DEFAULT_SYMBOL_HEIGHT, DEFAULT_SYMBOL_WIDTH } from '../../utils/default'; -import { findContainerById } from '../../utils/itertools'; -import { restoreX } from '../../utils/svg'; -import { ApplyBehaviors } from './Behaviors/Behaviors'; -import { getCurrentHistory, UpdateCounters } from './Editor'; +import { IConfiguration } from '../../../Interfaces/IConfiguration'; +import { IContainerModel } from '../../../Interfaces/IContainerModel'; +import { IHistoryState } from '../../../Interfaces/IHistoryState'; +import { ISymbolModel } from '../../../Interfaces/ISymbolModel'; +import { DEFAULT_SYMBOL_HEIGHT, DEFAULT_SYMBOL_WIDTH } from '../../../utils/default'; +import { findContainerById } from '../../../utils/itertools'; +import { restoreX } from '../../../utils/svg'; +import { ApplyBehaviors } from '../Behaviors/Behaviors'; +import { getCurrentHistory, UpdateCounters } from '../Editor'; export function AddSymbol( name: string, diff --git a/src/Components/Editor/Editor.tsx b/src/Components/Editor/Editor.tsx index f7df902..aed34ab 100644 --- a/src/Components/Editor/Editor.tsx +++ b/src/Components/Editor/Editor.tsx @@ -4,14 +4,13 @@ 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 } from './ContainerOperations'; -import { SaveEditorAsJSON, SaveEditorAsSVG } from './Save'; -import { onKeyDown } from './Shortcuts'; -import { OnPropertyChange, OnPropertiesSubmit } from './PropertiesOperations'; +import { SelectContainer, DeleteContainer, AddContainerToSelectedContainer, AddContainer, OnPropertyChange } from './Actions/ContainerOperations'; +import { SaveEditorAsJSON, SaveEditorAsSVG } from './Actions/Save'; +import { onKeyDown } from './Actions/Shortcuts'; import EditorEvents from '../../Events/EditorEvents'; import { IEditorState } from '../../Interfaces/IEditorState'; import { MAX_HISTORY } from '../../utils/default'; -import { AddSymbol, OnPropertyChange as OnSymbolPropertyChange, DeleteSymbol, SelectSymbol } from './SymbolOperations'; +import { AddSymbol, OnPropertyChange as OnSymbolPropertyChange, DeleteSymbol, SelectSymbol } from './Actions/SymbolOperations'; import { findContainerById } from '../../utils/itertools'; interface IEditorProps { @@ -113,14 +112,6 @@ const Editor: React.FunctionComponent = (props) => { setHistory, setHistoryCurrentStep )} - OnPropertiesSubmit={(event) => OnPropertiesSubmit( - event, - selected, - history, - historyCurrentStep, - setHistory, - setHistoryCurrentStep - )} AddContainerToSelectedContainer={(type) => AddContainerToSelectedContainer( type, selected, diff --git a/src/Components/Editor/PropertiesOperations.ts b/src/Components/Editor/PropertiesOperations.ts deleted file mode 100644 index d939213..0000000 --- a/src/Components/Editor/PropertiesOperations.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { Dispatch, SetStateAction } from 'react'; -import { IContainerModel, ContainerModel } from '../../Interfaces/IContainerModel'; -import { IHistoryState } from '../../Interfaces/IHistoryState'; -import { findContainerById } from '../../utils/itertools'; -import { getCurrentHistory } from './Editor'; -import { ApplyBehaviors } from './Behaviors/Behaviors'; -import { restoreX } from '../../utils/svg'; -import { ISymbolModel } from '../../Interfaces/ISymbolModel'; - -/** - * Handled the property change event in the properties form - * @param key Property name - * @param value New value of the property - * @returns void - */ -export function OnPropertyChange( - key: string, - value: string | number | boolean, - isStyle: boolean = false, - selected: IContainerModel | undefined, - fullHistory: IHistoryState[], - historyCurrentStep: number, - setHistory: Dispatch>, - setHistoryCurrentStep: Dispatch> -): void { - const history = getCurrentHistory(fullHistory, historyCurrentStep); - const current = history[history.length - 1]; - - if (selected === null || - selected === undefined) { - throw new Error('[OnPropertyChange] Property was changed before selecting a Container'); - } - - const mainContainerClone: IContainerModel = structuredClone(current.MainContainer); - const container: ContainerModel | undefined = findContainerById(mainContainerClone, selected.properties.id); - - if (container === null || container === undefined) { - 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); - - history.push({ - LastAction: `Change ${key} of ${container.properties.id}`, - MainContainer: mainContainerClone, - SelectedContainerId: container.properties.id, - TypeCounters: Object.assign({}, current.TypeCounters), - Symbols: structuredClone(current.Symbols), - SelectedSymbolId: current.SelectedSymbolId - }); - setHistory(history); - setHistoryCurrentStep(history.length - 1); -} - -function LinkSymbol( - containerId: string, - oldSymbolId: string, - newSymbolId: string, - symbols: Map -): void { - const oldSymbol = symbols.get(oldSymbolId); - const newSymbol = symbols.get(newSymbolId); - - if (newSymbol === undefined) { - if (oldSymbol !== undefined) { - oldSymbol.linkedContainers.delete(containerId); - } - return; - } - - newSymbol.linkedContainers.add(containerId); -} - -/** - * Handled the property change event in the properties form - * @param key Property name - * @param properties Properties of the selected container - * @returns void - */ -export function OnPropertiesSubmit( - event: React.SyntheticEvent, - selected: IContainerModel | undefined, - fullHistory: IHistoryState[], - historyCurrentStep: number, - setHistory: Dispatch>, - setHistoryCurrentStep: Dispatch> -): void { - event.preventDefault(); - const history = getCurrentHistory(fullHistory, historyCurrentStep); - const current = history[history.length - 1]; - - if (selected === null || - selected === undefined) { - throw new Error('[OnPropertyChange] Property was changed before selecting a Container'); - } - - const mainContainerClone: IContainerModel = structuredClone(current.MainContainer); - const container: ContainerModel | undefined = findContainerById(mainContainerClone, selected.properties.id); - - if (container === null || container === undefined) { - throw new Error('[OnPropertyChange] Container model was not found among children of the main container!'); - } - - // Assign container properties - const form: HTMLFormElement = event.target as HTMLFormElement; - for (const property in container.properties) { - const input: HTMLInputElement | HTMLDivElement | null = form.querySelector(`#${property}`); - - if (input === null) { - continue; - } - - if (input instanceof HTMLInputElement) { - submitHTMLInput(input, container, property, form); - continue; - } - - if (input instanceof HTMLDivElement) { - submitRadioButtons(input, container, property); - continue; - } - } - - // Assign cssproperties - for (const styleProperty in container.properties.style) { - submitCSSForm(form, styleProperty, container); - } - - // Apply the behaviors - ApplyBehaviors(container, current.Symbols); - - history.push({ - LastAction: `Change properties of ${container.properties.id}`, - MainContainer: mainContainerClone, - SelectedContainerId: container.properties.id, - TypeCounters: Object.assign({}, current.TypeCounters), - Symbols: structuredClone(current.Symbols), - SelectedSymbolId: current.SelectedSymbolId - }); - setHistory(history); - setHistoryCurrentStep(history.length - 1); -} - -const submitHTMLInput = ( - input: HTMLInputElement, - container: IContainerModel, - property: string, - form: HTMLFormElement -): void => { - if (input.type !== 'number') { - (container.properties as any)[property] = input.value; - return; - } - - if (property === 'x') { - // Hardcoded fix for XPositionReference - const x = RestoreX(form, input); - (container.properties as any)[property] = x; - return; - } - - (container.properties as any)[property] = Number(input.value); -}; - -const submitCSSForm = (form: HTMLFormElement, styleProperty: string, container: ContainerModel): void => { - const input: HTMLInputElement | null = form.querySelector(`#${styleProperty}`); - if (input === null) { - return; - } - (container.properties.style as any)[styleProperty] = input.value; -}; - -const RestoreX = ( - form: HTMLFormElement, - input: HTMLInputElement -): number => { - const inputWidth: HTMLInputElement | null = form.querySelector('#width'); - const inputRadio: HTMLDivElement | null = form.querySelector('#XPositionReference'); - if (inputWidth === null || inputRadio === null) { - throw new Error('[OnPropertiesSubmit] Missing inputs for width or XPositionReference'); - } - - const radiobutton: HTMLInputElement | null = inputRadio.querySelector('input[name="XPositionReference"]:checked'); - if (radiobutton === null) { - throw new Error('[OnPropertiesSubmit] Missing inputs for XPositionReference'); - } - - return restoreX(Number(input.value), Number(inputWidth.value), Number(radiobutton.value)); -}; - -const submitRadioButtons = ( - div: HTMLDivElement, - container: IContainerModel, - property: string -): void => { - const radiobutton: HTMLInputElement | null = div.querySelector(`input[name="${property}"]:checked`); - if (radiobutton === null) { - return; - } - - if (radiobutton.type === 'radio') { - (container.properties as any)[property] = Number(radiobutton.value); - return; - } - - (container.properties as any)[property] = radiobutton.value; -}; - diff --git a/src/Components/ElementsSidebar/ElementsSidebar.test.tsx b/src/Components/ElementsSidebar/ElementsSidebar.test.tsx index 8badea7..c7d19b2 100644 --- a/src/Components/ElementsSidebar/ElementsSidebar.test.tsx +++ b/src/Components/ElementsSidebar/ElementsSidebar.test.tsx @@ -33,7 +33,6 @@ describe.concurrent('Elements sidebar', () => { isHistoryOpen={false} SelectedContainer={undefined} OnPropertyChange={() => {}} - OnPropertiesSubmit={() => {}} SelectContainer={() => {}} DeleteContainer={() => {}} AddContainer={() => {}} @@ -72,7 +71,6 @@ describe.concurrent('Elements sidebar', () => { isHistoryOpen={false} SelectedContainer={MainContainer} OnPropertyChange={() => {}} - OnPropertiesSubmit={() => {}} SelectContainer={() => {}} DeleteContainer={() => {}} AddContainer={() => {}} @@ -178,7 +176,6 @@ describe.concurrent('Elements sidebar', () => { isHistoryOpen={false} SelectedContainer={MainContainer} OnPropertyChange={() => {}} - OnPropertiesSubmit={() => {}} SelectContainer={() => {}} DeleteContainer={() => {}} AddContainer={() => {}} @@ -246,7 +243,6 @@ describe.concurrent('Elements sidebar', () => { isHistoryOpen={false} SelectedContainer={SelectedContainer} OnPropertyChange={() => {}} - OnPropertiesSubmit={() => {}} SelectContainer={selectContainer} DeleteContainer={() => {}} AddContainer={() => {}} @@ -271,7 +267,6 @@ describe.concurrent('Elements sidebar', () => { isHistoryOpen={false} SelectedContainer={SelectedContainer} OnPropertyChange={() => {}} - OnPropertiesSubmit={() => {}} SelectContainer={selectContainer} DeleteContainer={() => {}} AddContainer={() => {}} diff --git a/src/Components/ElementsSidebar/ElementsSidebar.tsx b/src/Components/ElementsSidebar/ElementsSidebar.tsx index 40da1f9..bade0d9 100644 --- a/src/Components/ElementsSidebar/ElementsSidebar.tsx +++ b/src/Components/ElementsSidebar/ElementsSidebar.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { FixedSizeList as List } from 'react-window'; -import { Properties } from '../Properties/Properties'; +import { Properties } from '../ContainerProperties/ContainerProperties'; import { IContainerModel } from '../../Interfaces/IContainerModel'; import { getDepth, MakeIterator } from '../../utils/itertools'; import { Menu } from '../Menu/Menu'; @@ -16,7 +16,6 @@ interface IElementsSidebarProps { isHistoryOpen: boolean SelectedContainer: IContainerModel | undefined OnPropertyChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void - OnPropertiesSubmit: (event: React.FormEvent) => void SelectContainer: (containerId: string) => void DeleteContainer: (containerid: string) => void AddContainer: (index: number, type: string, parent: string) => void @@ -144,7 +143,6 @@ export const ElementsSidebar: React.FC = (props: IElement properties={props.SelectedContainer?.properties} symbols={props.symbols} onChange={props.OnPropertyChange} - onSubmit={props.OnPropertiesSubmit} />
); diff --git a/src/Components/Properties/Form.tsx b/src/Components/Properties/Form.tsx deleted file mode 100644 index 34da049..0000000 --- a/src/Components/Properties/Form.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from 'react'; -import IContainerProperties from '../../Interfaces/IContainerProperties'; -import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import DynamicForm from './DynamicForm'; -import StaticForm from './StaticForm'; - -interface IFormProps { - properties: IContainerProperties - symbols: Map - isDynamicInput: boolean - onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void - onSubmit: (event: React.FormEvent) => void -} - -export const Form: React.FunctionComponent = (props) => { - if (props.isDynamicInput) { - return ; - } - return ; -}; diff --git a/src/Components/Properties/StaticForm.tsx b/src/Components/Properties/StaticForm.tsx deleted file mode 100644 index a2f7c89..0000000 --- a/src/Components/Properties/StaticForm.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { MenuAlt2Icon, MenuIcon, MenuAlt3Icon } from '@heroicons/react/outline'; -import * as React from 'react'; -import { XPositionReference } from '../../Enums/XPositionReference'; -import IContainerProperties from '../../Interfaces/IContainerProperties'; -import { transformX } from '../../utils/svg'; -import { InputGroup } from '../InputGroup/InputGroup'; -import { RadioGroupButtons } from '../RadioGroupButtons/RadioGroupButtons'; - -interface IStaticFormProps { - properties: IContainerProperties - onSubmit: (event: React.FormEvent) => void -} - -const getCSSInputs = (properties: IContainerProperties): JSX.Element[] => { - const groupInput: JSX.Element[] = []; - for (const key in properties.style) { - groupInput.push(); - } - return groupInput; -}; - -const StaticForm: React.FunctionComponent = (props) => { - return ( props.onSubmit(event)} - > - -
- - - - - - - - - - - - -
- ), - value: XPositionReference.Left.toString() - }, - { - text: ( -
- -
- ), - value: XPositionReference.Center.toString() - }, - { - text: ( -
- -
- ), - value: XPositionReference.Right.toString() - } - ]} - /> - { getCSSInputs(props.properties) } -
- ); -}; - -export default StaticForm; diff --git a/src/Components/SymbolProperties/Form.tsx b/src/Components/SymbolProperties/Form.tsx deleted file mode 100644 index a70c7dc..0000000 --- a/src/Components/SymbolProperties/Form.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from 'react'; -import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import DynamicForm from './DynamicForm'; - -interface IFormProps { - symbol: ISymbolModel - symbols: Map - onChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void -} - -export const Form: React.FunctionComponent = (props) => { - return ; -}; diff --git a/src/Components/SymbolProperties/DynamicForm.tsx b/src/Components/SymbolProperties/SymbolForm.tsx similarity index 92% rename from src/Components/SymbolProperties/DynamicForm.tsx rename to src/Components/SymbolProperties/SymbolForm.tsx index 8e969b5..01182d8 100644 --- a/src/Components/SymbolProperties/DynamicForm.tsx +++ b/src/Components/SymbolProperties/SymbolForm.tsx @@ -3,12 +3,12 @@ import { ISymbolModel } from '../../Interfaces/ISymbolModel'; import { restoreX, transformX } from '../../utils/svg'; import { InputGroup } from '../InputGroup/InputGroup'; -interface IDynamicFormProps { +interface ISymbolFormProps { symbol: ISymbolModel symbols: Map onChange: (key: string, value: string | number | boolean) => void } -const DynamicForm: React.FunctionComponent = (props) => { +const SymbolForm: React.FunctionComponent = (props) => { return (
= (props) => { ); }; -export default DynamicForm; +export default SymbolForm; diff --git a/src/Components/SymbolProperties/SymbolProperties.tsx b/src/Components/SymbolProperties/SymbolProperties.tsx index b58e3cf..5e65206 100644 --- a/src/Components/SymbolProperties/SymbolProperties.tsx +++ b/src/Components/SymbolProperties/SymbolProperties.tsx @@ -1,8 +1,6 @@ -import React, { useState } from 'react'; -import IContainerProperties from '../../Interfaces/IContainerProperties'; +import React from 'react'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { ToggleButton } from '../ToggleButton/ToggleButton'; -import { Form } from './Form'; +import SymbolForm from './SymbolForm'; interface ISymbolPropertiesProps { symbol?: ISymbolModel @@ -17,7 +15,7 @@ export const SymbolProperties: React.FC = (props: ISymbo return (
-
void DeleteContainer: (containerId: string) => void OnPropertyChange: (key: string, value: string | number | boolean, isStyle?: boolean) => void - OnPropertiesSubmit: (event: React.FormEvent) => void AddContainerToSelectedContainer: (type: string) => void AddContainer: (index: number, type: string, parentId: string) => void AddSymbol: (type: string) => void @@ -90,7 +89,6 @@ export const UI: React.FunctionComponent = (props: IUIProps) => { isOpen={isSidebarOpen} isHistoryOpen={isHistoryOpen} OnPropertyChange={props.OnPropertyChange} - OnPropertiesSubmit={props.OnPropertiesSubmit} SelectContainer={props.SelectContainer} DeleteContainer={props.DeleteContainer} AddContainer={props.AddContainer} From 29625dce282764eaef7a9a4c84e12467340e2b6b Mon Sep 17 00:00:00 2001 From: Eric Nguyen Date: Mon, 22 Aug 2022 15:03:46 +0000 Subject: [PATCH 07/13] Merged PR 164: Clear the leftover TODOs - Remove nullable type from container.properties.parentId - Add Swal when trying to delete main container - Moved default editor state to default.ts - Moved default symbol model to default.ts --- src/Components/App/Actions/MenuActions.ts | 33 +-------- .../Editor/Actions/ContainerOperations.ts | 7 +- .../Editor/Actions/SymbolOperations.ts | 15 +--- .../ElementsSidebar/ElementsSidebar.test.tsx | 2 +- src/Interfaces/IContainerProperties.ts | 3 +- src/utils/default.ts | 69 ++++++++++++++++++- 6 files changed, 81 insertions(+), 48 deletions(-) diff --git a/src/Components/App/Actions/MenuActions.ts b/src/Components/App/Actions/MenuActions.ts index 46bb2e1..4698e29 100644 --- a/src/Components/App/Actions/MenuActions.ts +++ b/src/Components/App/Actions/MenuActions.ts @@ -1,10 +1,9 @@ import { Dispatch, SetStateAction } from 'react'; import { IConfiguration } from '../../../Interfaces/IConfiguration'; -import { ContainerModel } from '../../../Interfaces/IContainerModel'; import { fetchConfiguration } from '../../API/api'; import { IEditorState } from '../../../Interfaces/IEditorState'; import { LoadState } from './Load'; -import { DEFAULT_MAINCONTAINER_PROPS } from '../../../utils/default'; +import { GetDefaultEditorState } from '../../../utils/default'; export function NewEditor( setEditorState: Dispatch>, @@ -13,38 +12,12 @@ export function NewEditor( // Fetch the configuration from the API fetchConfiguration() .then((configuration: IConfiguration) => { - // Set the main container from the given properties of the API - const MainContainer = new ContainerModel( - null, - { - ...DEFAULT_MAINCONTAINER_PROPS, - width: Number(configuration.MainContainer.Width), - height: Number(configuration.MainContainer.Height) - } - ); + // Set the editor from the given properties of the API + const editorState: IEditorState = GetDefaultEditorState(configuration); - // Save the configuration and the new MainContainer - // and default the selected container to it - // TODO: Put this in default.ts - const editorState: IEditorState = { - configuration, - history: - [ - { - LastAction: '', - MainContainer, - SelectedContainerId: MainContainer.properties.id, - TypeCounters: {}, - Symbols: new Map(), - SelectedSymbolId: '' - } - ], - historyCurrentStep: 0 - }; setEditorState(editorState); setLoaded(true); }, (error) => { - // TODO: Implement an alert component console.warn('[NewEditor] Could not fetch resource from API. Using default.', error); setLoaded(true); }); diff --git a/src/Components/Editor/Actions/ContainerOperations.ts b/src/Components/Editor/Actions/ContainerOperations.ts index 691a12d..a98fe53 100644 --- a/src/Components/Editor/Actions/ContainerOperations.ts +++ b/src/Components/Editor/Actions/ContainerOperations.ts @@ -9,6 +9,7 @@ import { IAvailableContainer } from '../../../Interfaces/IAvailableContainer'; import { GetDefaultContainerProps, DEFAULTCHILDTYPE_ALLOW_CYCLIC, DEFAULTCHILDTYPE_MAX_DEPTH } from '../../../utils/default'; import { ApplyBehaviors } from '../Behaviors/Behaviors'; import { ISymbolModel } from '../../../Interfaces/ISymbolModel'; +import Swal from 'sweetalert2'; /** * Select a container @@ -64,7 +65,11 @@ export function DeleteContainer( if (container === mainContainerClone || container.parent === undefined || container.parent === null) { - // TODO: Implement alert + Swal.fire({ + title: 'Oops...', + text: 'Deleting the main container is not allowed!', + icon: 'error' + }); throw new Error('[DeleteContainer] Tried to delete the main container! Deleting the main container is not allowed!'); } diff --git a/src/Components/Editor/Actions/SymbolOperations.ts b/src/Components/Editor/Actions/SymbolOperations.ts index aeb6119..aef67e0 100644 --- a/src/Components/Editor/Actions/SymbolOperations.ts +++ b/src/Components/Editor/Actions/SymbolOperations.ts @@ -3,7 +3,7 @@ import { IConfiguration } from '../../../Interfaces/IConfiguration'; import { IContainerModel } from '../../../Interfaces/IContainerModel'; import { IHistoryState } from '../../../Interfaces/IHistoryState'; import { ISymbolModel } from '../../../Interfaces/ISymbolModel'; -import { DEFAULT_SYMBOL_HEIGHT, DEFAULT_SYMBOL_WIDTH } from '../../../utils/default'; +import { GetDefaultSymbolModel } from '../../../utils/default'; import { findContainerById } from '../../../utils/itertools'; import { restoreX } from '../../../utils/svg'; import { ApplyBehaviors } from '../Behaviors/Behaviors'; @@ -31,16 +31,7 @@ export function AddSymbol( UpdateCounters(newCounters, type); const newSymbols = structuredClone(current.Symbols); - // TODO: Put this in default.ts as GetDefaultConfig - const newSymbol: ISymbolModel = { - id: `${name}-${newCounters[type]}`, - type: name, - config: structuredClone(symbolConfig), - x: 0, - width: symbolConfig.Width ?? DEFAULT_SYMBOL_WIDTH, - height: symbolConfig.Height ?? DEFAULT_SYMBOL_HEIGHT, - linkedContainers: new Set() - }; + const newSymbol: ISymbolModel = GetDefaultSymbolModel(name, newCounters, type, symbolConfig); newSymbol.x = restoreX(newSymbol.x, newSymbol.width, newSymbol.config.XPositionReference); newSymbols.set(newSymbol.id, newSymbol); @@ -114,7 +105,7 @@ export function DeleteSymbol( setHistoryCurrentStep(history.length - 1); } -function UnlinkContainers(symbol: ISymbolModel, newMainContainer: IContainerModel) { +function UnlinkContainers(symbol: ISymbolModel, newMainContainer: IContainerModel): void { symbol.linkedContainers.forEach((containerId) => { const container = findContainerById(newMainContainer, containerId); diff --git a/src/Components/ElementsSidebar/ElementsSidebar.test.tsx b/src/Components/ElementsSidebar/ElementsSidebar.test.tsx index c7d19b2..e6bcde6 100644 --- a/src/Components/ElementsSidebar/ElementsSidebar.test.tsx +++ b/src/Components/ElementsSidebar/ElementsSidebar.test.tsx @@ -15,7 +15,7 @@ describe.concurrent('Elements sidebar', () => { parent: null, properties: { id: 'main', - parentId: null, + parentId: '', linkedSymbolId: '', displayedText: 'main', x: 0, diff --git a/src/Interfaces/IContainerProperties.ts b/src/Interfaces/IContainerProperties.ts index d5f7ae7..1166bad 100644 --- a/src/Interfaces/IContainerProperties.ts +++ b/src/Interfaces/IContainerProperties.ts @@ -8,9 +8,8 @@ export default interface IContainerProperties { /** id of the container */ id: string - // TODO: replace null by empty string /** id of the parent container (null when there is no parent) */ - parentId: string | null + parentId: string /** id of the linked symbol ('' when there is no parent) */ linkedSymbolId: string diff --git a/src/utils/default.ts b/src/utils/default.ts index f30323f..a15bd36 100644 --- a/src/utils/default.ts +++ b/src/utils/default.ts @@ -1,8 +1,11 @@ import { XPositionReference } from '../Enums/XPositionReference'; import { IAvailableContainer } from '../Interfaces/IAvailableContainer'; +import { IAvailableSymbol } from '../Interfaces/IAvailableSymbol'; import { IConfiguration } from '../Interfaces/IConfiguration'; -import { IContainerModel } from '../Interfaces/IContainerModel'; +import { ContainerModel, IContainerModel } from '../Interfaces/IContainerModel'; import IContainerProperties from '../Interfaces/IContainerProperties'; +import { IEditorState } from '../Interfaces/IEditorState'; +import { ISymbolModel } from '../Interfaces/ISymbolModel'; /// CONTAINER DEFAULTS /// @@ -29,6 +32,38 @@ export const ENABLE_SHORTCUTS = true; export const MAX_HISTORY = 200; export const APPLY_BEHAVIORS_ON_CHILDREN = true; +/** + * Returns the default editor state given the configuration + */ +export const GetDefaultEditorState = (configuration: IConfiguration): IEditorState => { + const mainContainer = new ContainerModel( + null, + { + ...DEFAULT_MAINCONTAINER_PROPS, + width: Number(configuration.MainContainer.Width), + height: Number(configuration.MainContainer.Height) + } + ); + + return { + configuration, + history: [ + { + LastAction: '', + MainContainer: mainContainer, + SelectedContainerId: mainContainer.properties.id, + TypeCounters: {}, + Symbols: new Map(), + SelectedSymbolId: '' + } + ], + historyCurrentStep: 0 + }; +}; + +/** + * Default config when the API is not available + */ export const DEFAULT_CONFIG: IConfiguration = { AvailableContainers: [ { @@ -53,9 +88,12 @@ export const DEFAULT_CONFIG: IConfiguration = { } }; +/** + * Default Main container properties + */ export const DEFAULT_MAINCONTAINER_PROPS: IContainerProperties = { id: 'main', - parentId: 'null', + parentId: '', linkedSymbolId: '', displayedText: 'main', x: 0, @@ -72,6 +110,16 @@ export const DEFAULT_MAINCONTAINER_PROPS: IContainerProperties = { } }; +/** + * Returns the default properties of a newly created container + * @param type Type of the container + * @param typeCount index of the container + * @param parent Parent of the container + * @param x horizontal offset + * @param y vertical offset + * @param containerConfig default config of the container sent by the API + * @returns {IContainerProperties} Default properties of a newly created container + */ export const GetDefaultContainerProps = ( type: string, typeCount: number, @@ -96,3 +144,20 @@ export const GetDefaultContainerProps = ( style: structuredClone(containerConfig.Style), userData: structuredClone(containerConfig.UserData) }); + +export const GetDefaultSymbolModel = ( + name: string, + newCounters: Record, + type: string, + symbolConfig: IAvailableSymbol +): ISymbolModel => { + return { + id: `${name}-${newCounters[type]}`, + type: name, + config: structuredClone(symbolConfig), + x: 0, + width: symbolConfig.Width ?? DEFAULT_SYMBOL_WIDTH, + height: symbolConfig.Height ?? DEFAULT_SYMBOL_HEIGHT, + linkedContainers: new Set() + }; +}; From ec3fddec9d906db52d4b5030cfde410cb2e95001 Mon Sep 17 00:00:00 2001 From: Eric Nguyen Date: Mon, 22 Aug 2022 15:52:40 +0000 Subject: [PATCH 08/13] Merged PR 165: Move useEffects to named functions Move useEffects to named functions --- src/Components/Editor/Editor.tsx | 40 +++++++++++----- .../ElementsSidebar/ElementsSidebar.tsx | 46 ++++--------------- .../ElementsSidebar/MouseEventHandlers.ts | 46 +++++++++++++++++++ src/Components/SVG/SVG.tsx | 18 +++++--- .../SymbolsSidebar/MouseEventHandlers.ts | 46 +++++++++++++++++++ .../SymbolsSidebar/SymbolsSidebar.tsx | 45 ++++-------------- 6 files changed, 150 insertions(+), 91 deletions(-) diff --git a/src/Components/Editor/Editor.tsx b/src/Components/Editor/Editor.tsx index aed34ab..86db810 100644 --- a/src/Components/Editor/Editor.tsx +++ b/src/Components/Editor/Editor.tsx @@ -1,4 +1,4 @@ -import React, { useRef } from 'react'; +import React, { Dispatch, SetStateAction, useEffect, useRef } from 'react'; import './Editor.scss'; import { IConfiguration } from '../../Interfaces/IConfiguration'; import { SVG } from '../SVG/SVG'; @@ -36,12 +36,12 @@ export const getCurrentHistory = (history: IHistoryState[], historyCurrentStep: export const getCurrentHistoryState = (history: IHistoryState[], historyCurrentStep: number): IHistoryState => history[historyCurrentStep]; -const Editor: React.FunctionComponent = (props) => { - const [history, setHistory] = React.useState(structuredClone(props.history)); - const [historyCurrentStep, setHistoryCurrentStep] = React.useState(props.historyCurrentStep); - const editorRef = useRef(null); - - React.useEffect(() => { +function useShortcuts( + history: IHistoryState[], + historyCurrentStep: number, + setHistoryCurrentStep: Dispatch> +): void { + useEffect(() => { const onKeyUp = (event: KeyboardEvent): void => onKeyDown( event, history, @@ -50,12 +50,24 @@ const Editor: React.FunctionComponent = (props) => { ); window.addEventListener('keyup', onKeyUp); + return () => { + window.removeEventListener('keyup', onKeyUp); + }; + }); +} +function useWindowEvents( + history: IHistoryState[], + historyCurrentStep: number, + configuration: IConfiguration, + editorRef: React.RefObject +): void { + useEffect(() => { const events = EditorEvents; const editorState: IEditorState = { history, historyCurrentStep, - configuration: props.configuration + configuration }; const funcs = new Map void>(); @@ -64,10 +76,7 @@ const Editor: React.FunctionComponent = (props) => { editorRef.current?.addEventListener(event.name, func); funcs.set(event.name, func); } - return () => { - window.removeEventListener('keyup', onKeyUp); - for (const event of events) { const func = funcs.get(event.name); if (func === undefined) { @@ -77,6 +86,15 @@ const Editor: React.FunctionComponent = (props) => { } }; }); +} + +const Editor: React.FunctionComponent = (props) => { + const [history, setHistory] = React.useState(structuredClone(props.history)); + const [historyCurrentStep, setHistoryCurrentStep] = React.useState(props.historyCurrentStep); + const editorRef = useRef(null); + + useShortcuts(history, historyCurrentStep, setHistoryCurrentStep); + useWindowEvents(history, historyCurrentStep, props.configuration, editorRef); const configuration = props.configuration; const current = getCurrentHistoryState(history, historyCurrentStep); diff --git a/src/Components/ElementsSidebar/ElementsSidebar.tsx b/src/Components/ElementsSidebar/ElementsSidebar.tsx index bade0d9..2c15fde 100644 --- a/src/Components/ElementsSidebar/ElementsSidebar.tsx +++ b/src/Components/ElementsSidebar/ElementsSidebar.tsx @@ -5,9 +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 } from './MouseEventHandlers'; +import { handleDragLeave, handleDragOver, handleLeftClick, handleOnDrop, handleRightClick, useMouseEvents } from './MouseEventHandlers'; import { IPoint } from '../../Interfaces/IPoint'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; +import { Dispatch, RefObject, SetStateAction } from 'react'; interface IElementsSidebarProps { MainContainer: IContainerModel @@ -33,42 +34,13 @@ export const ElementsSidebar: React.FC = (props: IElement const elementRef = React.useRef(null); // Event listeners - React.useEffect(() => { - const onContextMenu = (event: MouseEvent): void => handleRightClick( - event, - setIsContextMenuOpen, - setOnClickContainerId, - setContextMenuPosition - ); - - const onLeftClick = (): void => handleLeftClick( - isContextMenuOpen, - setIsContextMenuOpen, - setOnClickContainerId - ); - - elementRef.current?.addEventListener( - 'contextmenu', - onContextMenu - ); - - window.addEventListener( - 'click', - onLeftClick - ); - - return () => { - elementRef.current?.removeEventListener( - 'contextmenu', - onContextMenu - ); - - window.removeEventListener( - 'click', - onLeftClick - ); - }; - }); + useMouseEvents( + isContextMenuOpen, + elementRef, + setIsContextMenuOpen, + setOnClickContainerId, + setContextMenuPosition + ); // Render let isOpenClasses = '-right-64'; diff --git a/src/Components/ElementsSidebar/MouseEventHandlers.ts b/src/Components/ElementsSidebar/MouseEventHandlers.ts index 5081033..a031802 100644 --- a/src/Components/ElementsSidebar/MouseEventHandlers.ts +++ b/src/Components/ElementsSidebar/MouseEventHandlers.ts @@ -1,7 +1,53 @@ +import React, { RefObject, Dispatch, SetStateAction, useEffect } from 'react'; import { IContainerModel } from '../../Interfaces/IContainerModel'; import { IPoint } from '../../Interfaces/IPoint'; import { findContainerById } from '../../utils/itertools'; +export function useMouseEvents( + isContextMenuOpen: boolean, + elementRef: RefObject, + setIsContextMenuOpen: Dispatch>, + setOnClickContainerId: Dispatch>, + setContextMenuPosition: Dispatch> +): void { + useEffect(() => { + const onContextMenu = (event: MouseEvent): void => handleRightClick( + event, + setIsContextMenuOpen, + setOnClickContainerId, + setContextMenuPosition + ); + + const onLeftClick = (): void => handleLeftClick( + isContextMenuOpen, + setIsContextMenuOpen, + setOnClickContainerId + ); + + elementRef.current?.addEventListener( + 'contextmenu', + onContextMenu + ); + + window.addEventListener( + 'click', + onLeftClick + ); + + return () => { + elementRef.current?.removeEventListener( + 'contextmenu', + onContextMenu + ); + + window.removeEventListener( + 'click', + onLeftClick + ); + }; + }); +} + export function handleRightClick( event: MouseEvent, setIsContextMenuOpen: React.Dispatch>, diff --git a/src/Components/SVG/SVG.tsx b/src/Components/SVG/SVG.tsx index 3b7c59b..d201bee 100644 --- a/src/Components/SVG/SVG.tsx +++ b/src/Components/SVG/SVG.tsx @@ -33,12 +33,9 @@ function resizeViewBox( }); } -export const SVG: React.FC = (props: ISVGProps) => { - const [viewer, setViewer] = React.useState({ - viewerWidth: window.innerWidth - BAR_WIDTH, - viewerHeight: window.innerHeight - }); - +function useSVGAutoResizer( + setViewer: React.Dispatch> +): void { React.useEffect(() => { const onResize = (): void => resizeViewBox(setViewer); window.addEventListener('resize', onResize); @@ -47,6 +44,15 @@ export const SVG: React.FC = (props: ISVGProps) => { window.removeEventListener('resize', onResize); }; }); +} + +export const SVG: React.FC = (props: ISVGProps) => { + const [viewer, setViewer] = React.useState({ + viewerWidth: window.innerWidth - BAR_WIDTH, + viewerHeight: window.innerHeight + }); + + useSVGAutoResizer(setViewer); const xmlns = ''; const properties = { diff --git a/src/Components/SymbolsSidebar/MouseEventHandlers.ts b/src/Components/SymbolsSidebar/MouseEventHandlers.ts index 8a8b5b6..e7cd5f0 100644 --- a/src/Components/SymbolsSidebar/MouseEventHandlers.ts +++ b/src/Components/SymbolsSidebar/MouseEventHandlers.ts @@ -1,5 +1,51 @@ +import { RefObject, Dispatch, SetStateAction, useEffect } from 'react'; import { IPoint } from '../../Interfaces/IPoint'; +export function useMouseEvents( + isContextMenuOpen: boolean, + elementRef: RefObject, + setIsContextMenuOpen: Dispatch>, + setOnClickSymbolId: Dispatch>, + setContextMenuPosition: Dispatch> +): void { + useEffect(() => { + const onContextMenu = (event: MouseEvent): void => handleRightClick( + event, + setIsContextMenuOpen, + setOnClickSymbolId, + setContextMenuPosition + ); + + const onLeftClick = (): void => handleLeftClick( + isContextMenuOpen, + setIsContextMenuOpen, + setOnClickSymbolId + ); + + elementRef.current?.addEventListener( + 'contextmenu', + onContextMenu + ); + + window.addEventListener( + 'click', + onLeftClick + ); + + return () => { + elementRef.current?.removeEventListener( + 'contextmenu', + onContextMenu + ); + + window.removeEventListener( + 'click', + onLeftClick + ); + }; + }); +} + export function handleRightClick( event: MouseEvent, setIsContextMenuOpen: React.Dispatch>, diff --git a/src/Components/SymbolsSidebar/SymbolsSidebar.tsx b/src/Components/SymbolsSidebar/SymbolsSidebar.tsx index 2285f47..9b8a1a5 100644 --- a/src/Components/SymbolsSidebar/SymbolsSidebar.tsx +++ b/src/Components/SymbolsSidebar/SymbolsSidebar.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { FixedSizeList as List } from 'react-window'; import { Menu } from '../Menu/Menu'; import { MenuItem } from '../Menu/MenuItem'; -import { handleLeftClick, handleRightClick } from './MouseEventHandlers'; +import { handleLeftClick, handleRightClick, useMouseEvents } from './MouseEventHandlers'; import { IPoint } from '../../Interfaces/IPoint'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; import { SymbolProperties } from '../SymbolProperties/SymbolProperties'; @@ -29,42 +29,13 @@ export const SymbolsSidebar: React.FC = (props: ISymbolsSi const elementRef = React.useRef(null); // Event listeners - React.useEffect(() => { - const onContextMenu = (event: MouseEvent): void => handleRightClick( - event, - setIsContextMenuOpen, - setOnClickSymbolId, - setContextMenuPosition - ); - - const onLeftClick = (): void => handleLeftClick( - isContextMenuOpen, - setIsContextMenuOpen, - setOnClickSymbolId - ); - - elementRef.current?.addEventListener( - 'contextmenu', - onContextMenu - ); - - window.addEventListener( - 'click', - onLeftClick - ); - - return () => { - elementRef.current?.removeEventListener( - 'contextmenu', - onContextMenu - ); - - window.removeEventListener( - 'click', - onLeftClick - ); - }; - }); + useMouseEvents( + isContextMenuOpen, + elementRef, + setIsContextMenuOpen, + setOnClickSymbolId, + setContextMenuPosition + ); // Render let isOpenClasses = '-right-64'; From 7f3f6a489a4d47545d2ebec0ce7e6522770fc772 Mon Sep 17 00:00:00 2001 From: Eric Nguyen Date: Thu, 25 Aug 2022 13:28:32 +0000 Subject: [PATCH 09/13] 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: [ From 444b96736af4fa7e4317cdd4d24cb6d76fa32f80 Mon Sep 17 00:00:00 2001 From: Eric Nguyen Date: Fri, 26 Aug 2022 09:13:51 +0000 Subject: [PATCH 10/13] Merged PR 168: Add SmartComponent source code + Restrict Events by giving a root at the first render + Added Render function to a namespace - Add smartcomponent source code to public/ - Restrict Events by giving a root at the first render + Added Render function to a namespace - Add attribute type="button" to all buttons --- .../smartcomponent/svg-layout-designer.html | 2 + public/smartcomponent/svg-layout-designer.ts | 67 +++++++++++++++++++ .../svg-layout-designer.xcomponent | 14 ++++ src/Components/App/App.tsx | 2 + src/Components/Bar/BarIcon.tsx | 2 +- src/Components/Editor/Editor.tsx | 4 ++ .../ElementsSidebar/ElementsSidebar.tsx | 2 +- .../FloatingButton/FloatingButton.tsx | 2 +- src/Components/History/History.tsx | 2 +- src/Components/MainMenu/MainMenu.tsx | 6 +- src/Components/Menu/MenuItem.tsx | 2 +- src/Components/Sidebar/Sidebar.tsx | 2 +- src/Components/Symbols/Symbols.tsx | 4 +- .../SymbolsSidebar/SymbolsSidebar.tsx | 2 +- src/Components/UI/UI.tsx | 4 +- src/Events/EditorEvents.ts | 18 +++-- src/main.tsx | 21 ++++-- 17 files changed, 132 insertions(+), 24 deletions(-) create mode 100644 public/smartcomponent/svg-layout-designer.html create mode 100644 public/smartcomponent/svg-layout-designer.ts create mode 100644 public/smartcomponent/svg-layout-designer.xcomponent diff --git a/public/smartcomponent/svg-layout-designer.html b/public/smartcomponent/svg-layout-designer.html new file mode 100644 index 0000000..bc310ed --- /dev/null +++ b/public/smartcomponent/svg-layout-designer.html @@ -0,0 +1,2 @@ +
+
diff --git a/public/smartcomponent/svg-layout-designer.ts b/public/smartcomponent/svg-layout-designer.ts new file mode 100644 index 0000000..218d304 --- /dev/null +++ b/public/smartcomponent/svg-layout-designer.ts @@ -0,0 +1,67 @@ +namespace SmartBusiness.Web.Components { + export class SVGLayoutDesigner extends Components.ComponentBase { + + public constructor(componentInfo: KnockoutComponentTypes.ComponentInfo, params: any) { + super(componentInfo, params); + // this.$component.id = SVGLayoutDesigner.generateUUID(); + setTimeout(() => (window as any).SVGLayoutDesigner.Render(this.$component[0])); + this.InitEventsListener(); + } + + + public static generateUUID() { // Public Domain/MIT + let d = new Date().getTime();//Timestamp + let d2 = ((typeof performance !== 'undefined') && performance.now && (performance.now()*1000)) || 0;//Time in microseconds since page-load or 0 if unsupported + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + let r = Math.random() * 16;//random number between 0 and 16 + if(d > 0){//Use timestamp until depleted + r = (d + r)%16 | 0; + d = Math.floor(d/16); + } else {//Use microseconds since page-load if supported + r = (d2 + r)%16 | 0; + d2 = Math.floor(d2/16); + } + return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); + } + + public GetEditorComponent() { + return this.$component[0].querySelector('.Editor'); + } + + public GetCurrentHistoryState() { + this.GetEditorComponent().dispatchEvent(new CustomEvent('getCurrentHistoryState')); + } + + public GetEditorState() { + this.GetEditorComponent().dispatchEvent(new CustomEvent('getEditorState')); + } + + public SetEditorState(editorState: IEditorState) { + this.GetEditorComponent().dispatchEvent(new CustomEvent('SetEditorState', { detail: editorState })); + } + + public AppendNewHistoryState(historyState: IHistoryState) { + this.GetEditorComponent().dispatchEvent(new CustomEvent('appendNewState', { detail: historyState })); + } + + public OHistoryState: KnockoutObservable; + + private InitEventsListener() { + this.$component[0].addEventListener('getCurrentHistoryState', (e: CustomEvent) => { + this.OHistoryState(e.detail); + console.log(this.OHistoryState()); + }); + this.$component[0].addEventListener('getEditorState', (e) => console.log((e as any).detail)); + } + } + + ko.components.register('svg-layout-designer', { + viewModel: { + createViewModel: function (params, componentInfo) { + return new SmartBusiness.Web.Components.SVGLayoutDesigner(componentInfo, params); + } + }, + template: { element: 'svg-layout-designer' } + }); +} \ No newline at end of file diff --git a/public/smartcomponent/svg-layout-designer.xcomponent b/public/smartcomponent/svg-layout-designer.xcomponent new file mode 100644 index 0000000..0bf7b1d --- /dev/null +++ b/public/smartcomponent/svg-layout-designer.xcomponent @@ -0,0 +1,14 @@ + + + false + 0A61000D-FC2D-4490-BB3E-0FAED2AF3FDC + + svg-layout-designer + + + viewModel + ViewModel + + + svg-layout-designer + diff --git a/src/Components/App/App.tsx b/src/Components/App/App.tsx index a77f8cb..6acaa8b 100644 --- a/src/Components/App/App.tsx +++ b/src/Components/App/App.tsx @@ -11,6 +11,7 @@ import { DEFAULT_CONFIG, DEFAULT_MAINCONTAINER_PROPS } from '../../utils/default // App will never have props // eslint-disable-next-line @typescript-eslint/no-empty-interface interface IAppProps { + root: Element | Document } export const App: React.FunctionComponent = (props) => { @@ -59,6 +60,7 @@ export const App: React.FunctionComponent = (props) => { return (
= (props) => { const isActiveClasses = props.isActive ? 'border-l-4 border-blue-500 bg-slate-200' : ''; return ( - - + +
); } diff --git a/src/Components/Menu/MenuItem.tsx b/src/Components/Menu/MenuItem.tsx index 9edc8ac..605c7c8 100644 --- a/src/Components/Menu/MenuItem.tsx +++ b/src/Components/Menu/MenuItem.tsx @@ -8,7 +8,7 @@ interface IMenuItemProps { export const MenuItem: React.FC = (props) => { return ( - diff --git a/src/Components/Sidebar/Sidebar.tsx b/src/Components/Sidebar/Sidebar.tsx index c39b235..bf0ac62 100644 --- a/src/Components/Sidebar/Sidebar.tsx +++ b/src/Components/Sidebar/Sidebar.tsx @@ -14,7 +14,7 @@ function handleDragStart(event: React.DragEvent): void { export const Sidebar: React.FC = (props: ISidebarProps) => { const listElements = props.componentOptions.map(componentOption => - ); } - return ( - ); -}; +} diff --git a/src/Components/ContainerProperties/ContainerForm.tsx b/src/Components/ContainerProperties/ContainerForm.tsx index 0feae02..711d3b2 100644 --- a/src/Components/ContainerProperties/ContainerForm.tsx +++ b/src/Components/ContainerProperties/ContainerForm.tsx @@ -2,9 +2,9 @@ import { MenuAlt2Icon, MenuAlt3Icon, MenuIcon } from '@heroicons/react/outline'; import * as React from 'react'; import { PropertyType } from '../../Enums/PropertyType'; import { XPositionReference } from '../../Enums/XPositionReference'; -import IContainerProperties from '../../Interfaces/IContainerProperties'; +import { IContainerProperties } from '../../Interfaces/IContainerProperties'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { ApplyWidthMargin, ApplyXMargin, RemoveWidthMargin, RemoveXMargin, restoreX, transformX } from '../../utils/svg'; +import { ApplyWidthMargin, ApplyXMargin, RemoveWidthMargin, RemoveXMargin, RestoreX, TransformX } from '../../utils/svg'; import { InputGroup } from '../InputGroup/InputGroup'; import { RadioGroupButtons } from '../RadioGroupButtons/RadioGroupButtons'; import { Select } from '../Select/Select'; @@ -15,10 +15,8 @@ interface IContainerFormProps { onChange: (key: string, value: string | number | boolean, type?: PropertyType) => void } -const getCSSInputs = ( - properties: IContainerProperties, - onChange: (key: string, value: string | number | boolean, type: PropertyType) => void -): JSX.Element[] => { +function GetCSSInputs(properties: IContainerProperties, + onChange: (key: string, value: string | number | boolean, type: PropertyType) => void): JSX.Element[] { const groupInput: JSX.Element[] = []; for (const key in properties.style) { groupInput.push( onChange(key, event.target.value, PropertyType.STYLE)} - />); + onChange={(event) => onChange(key, event.target.value, PropertyType.Style)} />); } return groupInput; -}; +} -const ContainerForm: React.FunctionComponent = (props) => { +export function ContainerForm(props: IContainerFormProps): JSX.Element { return (
= (props) => { inputClassName='' type='string' value={props.properties.id.toString()} - isDisabled={true} - /> + isDisabled={true} /> = (props) => { inputClassName='' type='string' value={props.properties.parentId} - isDisabled={true} - /> + isDisabled={true} /> = (props) => { inputClassName='' type='string' value={props.properties.type} - isDisabled={true} - /> + isDisabled={true} /> = (props) => { inputClassName='' type='string' value={props.properties.displayedText?.toString()} - onChange={(event) => props.onChange('displayedText', event.target.value)} - /> + onChange={(event) => props.onChange('displayedText', event.target.value)} /> = (props) => { inputClassName='' type='number' isDisabled={props.properties.linkedSymbolId !== ''} - value={transformX(RemoveXMargin(props.properties.x, props.properties.margin.left), props.properties.width, props.properties.XPositionReference).toString()} + value={TransformX(RemoveXMargin(props.properties.x, props.properties.margin.left), props.properties.width, props.properties.xPositionReference).toString()} onChange={(event) => props.onChange( 'x', ApplyXMargin( - restoreX( + RestoreX( Number(event.target.value), props.properties.width, - props.properties.XPositionReference + props.properties.xPositionReference ), props.properties.margin.left ) - )} - /> + )} /> = (props) => { inputClassName='' type='number' value={(props.properties.y - (props.properties.margin?.top ?? 0)).toString()} - onChange={(event) => props.onChange('y', Number(event.target.value) + (props.properties.margin?.top ?? 0))} - /> + onChange={(event) => props.onChange('y', Number(event.target.value) + (props.properties.margin?.top ?? 0))} /> = (props) => { type='number' min={1} value={props.properties.minWidth.toString()} - onChange={(event) => props.onChange('minWidth', Number(event.target.value))} - /> + onChange={(event) => props.onChange('minWidth', Number(event.target.value))} /> = (props) => { type='number' min={1} value={props.properties.maxWidth.toString()} - onChange={(event) => props.onChange('maxWidth', Number(event.target.value))} - /> + onChange={(event) => props.onChange('maxWidth', Number(event.target.value))} /> = (props) => { min={props.properties.minWidth} 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} - /> + isDisabled={props.properties.isFlex} /> = (props) => { type='number' min={0} 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))} - /> + onChange={(event) => props.onChange('height', Number(event.target.value) - (props.properties.margin?.top ?? 0) - (props.properties.margin?.bottom ?? 0))} /> = (props) => { type='number' min={0} value={(props.properties.margin.left ?? 0).toString()} - onChange={(event) => props.onChange('left', Number(event.target.value), PropertyType.MARGIN)} - /> + onChange={(event) => props.onChange('left', Number(event.target.value), PropertyType.Margin)} /> = (props) => { type='number' min={0} value={(props.properties.margin.bottom ?? 0).toString()} - onChange={(event) => props.onChange('bottom', Number(event.target.value), PropertyType.MARGIN)} - /> + onChange={(event) => props.onChange('bottom', Number(event.target.value), PropertyType.Margin)} /> = (props) => { type='number' min={0} value={(props.properties.margin.top ?? 0).toString()} - onChange={(event) => props.onChange('top', Number(event.target.value), PropertyType.MARGIN)} - /> + onChange={(event) => props.onChange('top', Number(event.target.value), PropertyType.Margin)} /> = (props) => { type='number' min={0} value={(props.properties.margin.right ?? 0).toString()} - onChange={(event) => props.onChange('right', Number(event.target.value), PropertyType.MARGIN)} - /> + onChange={(event) => props.onChange('right', Number(event.target.value), PropertyType.Margin)} /> = (props) => { inputClassName='' type='checkbox' checked={props.properties.isFlex} - onChange={(event) => props.onChange('isFlex', event.target.checked)} - /> + onChange={(event) => props.onChange('isFlex', event.target.checked)} /> = (props) => { inputClassName='' type='checkbox' checked={props.properties.isAnchor} - onChange={(event) => props.onChange('isAnchor', event.target.checked)} - /> + onChange={(event) => props.onChange('isAnchor', event.target.checked)} /> = (props) => { value: XPositionReference.Right.toString() } ]} - onChange={(event) => props.onChange('XPositionReference', Number(event.target.value))} - /> + onChange={(event) => props.onChange('xPositionReference', Number(event.target.value))} /> = (props) => defaultChecked={props.defaultChecked} onChange={props.onChange} min={props.min} - disabled={props.isDisabled} - /> + disabled={props.isDisabled} /> ; -}; +} diff --git a/src/Components/MainMenu/MainMenu.tsx b/src/Components/MainMenu/MainMenu.tsx index c9fc0f1..7744ee1 100644 --- a/src/Components/MainMenu/MainMenu.tsx +++ b/src/Components/MainMenu/MainMenu.tsx @@ -6,14 +6,14 @@ interface IMainMenuProps { } enum WindowState { - MAIN, - LOAD, + Main, + Load, } -export const MainMenu: React.FC = (props) => { - const [windowState, setWindowState] = React.useState(WindowState.MAIN); +export function MainMenu(props: IMainMenuProps): JSX.Element { + const [windowState, setWindowState] = React.useState(WindowState.Main); switch (windowState) { - case WindowState.LOAD: + case WindowState.Load: return (
@@ -37,7 +37,7 @@ export const MainMenu: React.FC = (props) => { - +
); } diff --git a/src/Components/Menu/Menu.tsx b/src/Components/Menu/Menu.tsx index fde491f..53a5d0b 100644 --- a/src/Components/Menu/Menu.tsx +++ b/src/Components/Menu/Menu.tsx @@ -8,7 +8,7 @@ interface IMenuProps { children: React.ReactNode[] | React.ReactNode } -export const Menu: React.FC = (props) => { +export function Menu(props: IMenuProps): JSX.Element { const visible = props.isOpen ? 'visible opacity-1' : 'invisible opacity-0'; return (
= (props) => { left: props.x, top: props.y }}> - { props.children } + {props.children}
); -}; +} diff --git a/src/Components/Menu/MenuItem.tsx b/src/Components/Menu/MenuItem.tsx index 605c7c8..062ff56 100644 --- a/src/Components/Menu/MenuItem.tsx +++ b/src/Components/Menu/MenuItem.tsx @@ -6,11 +6,11 @@ interface IMenuItemProps { onClick: () => void } -export const MenuItem: React.FC = (props) => { +export function MenuItem(props: IMenuItemProps): JSX.Element { return ( ); -}; +} diff --git a/src/Components/RadioGroupButtons/RadioGroupButtons.tsx b/src/Components/RadioGroupButtons/RadioGroupButtons.tsx index 8fb620b..3288779 100644 --- a/src/Components/RadioGroupButtons/RadioGroupButtons.tsx +++ b/src/Components/RadioGroupButtons/RadioGroupButtons.tsx @@ -11,7 +11,7 @@ interface IRadioGroupButtonsProps { onChange?: (event: React.ChangeEvent) => void } -export const RadioGroupButtons: React.FunctionComponent = (props) => { +export function RadioGroupButtons(props: IRadioGroupButtonsProps): JSX.Element { let inputGroups; if (props.value !== undefined) { // dynamic @@ -24,8 +24,7 @@ export const RadioGroupButtons: React.FunctionComponent className={`peer m-2 ${props.inputClassName}`} value={inputGroup.value} checked={props.value === inputGroup.value} - onChange={props.onChange} - /> + onChange={props.onChange} /> @@ -42,8 +41,7 @@ export const RadioGroupButtons: React.FunctionComponent name={props.name} className={`peer m-2 ${props.inputClassName}`} value={inputGroup.value} - defaultChecked={props.defaultValue === inputGroup.value} - /> + defaultChecked={props.defaultValue === inputGroup.value} /> @@ -59,8 +57,8 @@ export const RadioGroupButtons: React.FunctionComponent
- { inputGroups } + {inputGroups}
); -}; +} diff --git a/src/Components/SVG/Elements/Container.tsx b/src/Components/SVG/Elements/Container.tsx index b13630d..6a3ba01 100644 --- a/src/Components/SVG/Elements/Container.tsx +++ b/src/Components/SVG/Elements/Container.tsx @@ -2,11 +2,11 @@ import * as React from 'react'; import { Interweave, Node } from 'interweave'; import { IContainerModel } from '../../../Interfaces/IContainerModel'; import { DIMENSION_MARGIN, SHOW_CHILDREN_DIMENSIONS, SHOW_PARENT_DIMENSION, SHOW_TEXT } from '../../../utils/default'; -import { getDepth } from '../../../utils/itertools'; +import { GetDepth } from '../../../utils/itertools'; import { Dimension } from './Dimension'; -import IContainerProperties from '../../../Interfaces/IContainerProperties'; -import { transformX } from '../../../utils/svg'; -import { camelize } from '../../../utils/stringtools'; +import { IContainerProperties } from '../../../Interfaces/IContainerProperties'; +import { TransformX } from '../../../utils/svg'; +import { Camelize } from '../../../utils/stringtools'; interface IContainerProps { model: IContainerModel @@ -16,7 +16,7 @@ interface IContainerProps { * Render the container * @returns Render the container */ -export const Container: React.FC = (props: IContainerProps) => { +export function Container(props: IContainerProps): JSX.Element { const containersElements = props.model.children.map(child => ); const width: number = props.model.properties.width; @@ -52,7 +52,7 @@ export const Container: React.FC = (props: IContainerProps) => > ); // Dimension props - const depth = getDepth(props.model); + const depth = GetDepth(props.model); const dimensionMargin = DIMENSION_MARGIN * depth; const id = `dim-${props.model.properties.id}`; const xStart: number = 0; @@ -64,11 +64,7 @@ export const Container: React.FC = (props: IContainerProps) => let dimensionChildren: JSX.Element | null = null; if (props.model.children.length > 1 && SHOW_CHILDREN_DIMENSIONS) { const { - childrenId, - xChildrenStart, - xChildrenEnd, - yChildren, - textChildren + childrenId, xChildrenStart, xChildrenEnd, yChildren, textChildren } = GetChildrenDimensionProps(props, dimensionMargin); dimensionChildren = = (props: IContainerProps) => yStart={yChildren} yEnd={yChildren} strokeWidth={strokeWidth} - text={textChildren} - />; + text={textChildren} />; } return ( @@ -95,10 +90,8 @@ export const Container: React.FC = (props: IContainerProps) => yStart={yDim} yEnd={yDim} strokeWidth={strokeWidth} - text={text} - /> - : null - } + text={text} /> + : null} {dimensionChildren} {svg} {SHOW_TEXT @@ -112,23 +105,23 @@ export const Container: React.FC = (props: IContainerProps) => {containersElements} ); -}; +} 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]; - let xChildrenStart = transformX(lastChild.properties.x, lastChild.properties.width, lastChild.properties.XPositionReference); - let xChildrenEnd = transformX(lastChild.properties.x, lastChild.properties.width, lastChild.properties.XPositionReference); + let xChildrenStart = TransformX(lastChild.properties.x, lastChild.properties.width, lastChild.properties.xPositionReference); + let xChildrenEnd = TransformX(lastChild.properties.x, lastChild.properties.width, lastChild.properties.xPositionReference); // Find the min and max for (let i = props.model.children.length - 2; i >= 0; i--) { const child = props.model.children[i]; - const left = transformX(child.properties.x, child.properties.width, child.properties.XPositionReference); + const left = TransformX(child.properties.x, child.properties.width, child.properties.xPositionReference); if (left < xChildrenStart) { xChildrenStart = left; } - const right = transformX(child.properties.x, child.properties.width, child.properties.XPositionReference); + const right = TransformX(child.properties.x, child.properties.width, child.properties.xPositionReference); if (right > xChildrenEnd) { xChildrenEnd = right; } @@ -145,11 +138,11 @@ function CreateReactCustomSVG(customSVG: string, props: IContainerProperties): R disableLineBreaks={true} content={customSVG} allowElements={true} - transform={(node, children) => transform(node, children, props)} + transform={(node, children) => Transform(node, children, props)} />; } -function transform(node: HTMLElement, children: Node[], props: IContainerProperties): React.ReactNode { +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 } = {}; @@ -170,7 +163,7 @@ function transform(node: HTMLElement, children: Node[], props: IContainerPropert const prop = Object.entries(props.userData).find(([key]) => `{${key}}` === userDataKey); if (prop !== undefined) { - attributes[camelize(attName)] = prop[1]; + attributes[Camelize(attName)] = prop[1]; return; } } @@ -179,16 +172,16 @@ function transform(node: HTMLElement, children: Node[], props: IContainerPropert // support for object const stringObject = attributeValue.slice(1, -1); const object: JSON = JSON.parse(stringObject); - attributes[camelize(attName)] = object; + attributes[Camelize(attName)] = object; return; } const prop = Object.entries(props).find(([key]) => `{${key}}` === attributeValue); if (prop !== undefined) { - attributes[camelize(attName)] = prop[1]; + attributes[Camelize(attName)] = prop[1]; return; } - attributes[camelize(attName)] = attributeValue; + attributes[Camelize(attName)] = attributeValue; }); return React.createElement(node.tagName.toLowerCase(), attributes, children); } diff --git a/src/Components/SVG/Elements/DepthDimensionLayer.tsx b/src/Components/SVG/Elements/DepthDimensionLayer.tsx index cbf7eeb..652c04a 100644 --- a/src/Components/SVG/Elements/DepthDimensionLayer.tsx +++ b/src/Components/SVG/Elements/DepthDimensionLayer.tsx @@ -1,15 +1,15 @@ import * as React from 'react'; import { ContainerModel } from '../../../Interfaces/IContainerModel'; import { DIMENSION_MARGIN } from '../../../utils/default'; -import { getAbsolutePosition, MakeBFSIterator } from '../../../utils/itertools'; -import { transformX } from '../../../utils/svg'; +import { GetAbsolutePosition, MakeBFSIterator } from '../../../utils/itertools'; +import { TransformX } from '../../../utils/svg'; import { Dimension } from './Dimension'; interface IDimensionLayerProps { roots: ContainerModel | ContainerModel[] | null } -const getDimensionsNodes = (root: ContainerModel): React.ReactNode[] => { +function GetDimensionsNodes(root: ContainerModel): React.ReactNode[] { const it = MakeBFSIterator(root); const dimensions: React.ReactNode[] = []; let currentDepth = 0; @@ -25,8 +25,8 @@ const getDimensionsNodes = (root: ContainerModel): React.ReactNode[] => { max = -Infinity; } - const absoluteX = getAbsolutePosition(container)[0]; - const x = transformX(absoluteX, container.properties.width, container.properties.XPositionReference); + const absoluteX = GetAbsolutePosition(container)[0]; + const x = TransformX(absoluteX, container.properties.width, container.properties.xPositionReference); lastY = container.properties.y + container.properties.height; if (x < min) { min = x; @@ -40,28 +40,28 @@ const getDimensionsNodes = (root: ContainerModel): React.ReactNode[] => { AddNewDimension(currentDepth, min, max, lastY, dimensions); return dimensions; -}; +} /** * A layer containing all dimension * @param props * @returns */ -export const DepthDimensionLayer: React.FC = (props: IDimensionLayerProps) => { +export function DepthDimensionLayer(props: IDimensionLayerProps): JSX.Element { let dimensions: React.ReactNode[] = []; if (Array.isArray(props.roots)) { props.roots.forEach(child => { - dimensions.concat(getDimensionsNodes(child)); + dimensions.concat(GetDimensionsNodes(child)); }); } else if (props.roots !== null) { - dimensions = getDimensionsNodes(props.roots); + dimensions = GetDimensionsNodes(props.roots); } return ( - { dimensions } + {dimensions} ); -}; +} function AddNewDimension(currentDepth: number, min: number, max: number, lastY: number, dimensions: React.ReactNode[]): void { const id = `dim-depth-${currentDepth}`; diff --git a/src/Components/SVG/Elements/Dimension.tsx b/src/Components/SVG/Elements/Dimension.tsx index c5f6f86..cf8876c 100644 --- a/src/Components/SVG/Elements/Dimension.tsx +++ b/src/Components/SVG/Elements/Dimension.tsx @@ -20,9 +20,11 @@ interface IDimensionProps { * @param vx Transform vector * @returns Returns a new coordinate from the origin coordinate */ -const applyParametric = (x0: number, t: number, vx: number): number => x0 + t * vx; +function ApplyParametric(x0: number, t: number, vx: number): number { + return x0 + t * vx; +} -export const Dimension: React.FC = (props: IDimensionProps) => { +export function Dimension(props: IDimensionProps): JSX.Element { const style: React.CSSProperties = { stroke: 'black' }; @@ -39,15 +41,15 @@ export const Dimension: React.FC = (props: IDimensionProps) => const [perpVecX, perpVecY] = [unitY, -unitX]; // Use the parametric function to get the coordinates (x = x0 + t * v.x) - const startTopX = applyParametric(props.xStart, NOTCHES_LENGTH, perpVecX); - const startTopY = applyParametric(props.yStart, NOTCHES_LENGTH, perpVecY); - const startBottomX = applyParametric(props.xStart, -NOTCHES_LENGTH, perpVecX); - const startBottomY = applyParametric(props.yStart, -NOTCHES_LENGTH, perpVecY); + const startTopX = ApplyParametric(props.xStart, NOTCHES_LENGTH, perpVecX); + const startTopY = ApplyParametric(props.yStart, NOTCHES_LENGTH, perpVecY); + const startBottomX = ApplyParametric(props.xStart, -NOTCHES_LENGTH, perpVecX); + const startBottomY = ApplyParametric(props.yStart, -NOTCHES_LENGTH, perpVecY); - const endTopX = applyParametric(props.xEnd, NOTCHES_LENGTH, perpVecX); - const endTopY = applyParametric(props.yEnd, NOTCHES_LENGTH, perpVecY); - const endBottomX = applyParametric(props.xEnd, -NOTCHES_LENGTH, perpVecX); - const endBottomY = applyParametric(props.yEnd, -NOTCHES_LENGTH, perpVecY); + const endTopX = ApplyParametric(props.xEnd, NOTCHES_LENGTH, perpVecX); + const endTopY = ApplyParametric(props.yEnd, NOTCHES_LENGTH, perpVecY); + const endBottomX = ApplyParametric(props.xEnd, -NOTCHES_LENGTH, perpVecX); + const endBottomY = ApplyParametric(props.yEnd, -NOTCHES_LENGTH, perpVecY); return ( @@ -57,24 +59,21 @@ export const Dimension: React.FC = (props: IDimensionProps) => x2={startBottomX} y2={startBottomY} strokeWidth={props.strokeWidth} - style={style} - /> + style={style} /> + style={style} /> + style={style} /> = (props: IDimensionProps) => ); -}; +} diff --git a/src/Components/SVG/Elements/DimensionLayer.tsx b/src/Components/SVG/Elements/DimensionLayer.tsx index 23d719e..d6f2b82 100644 --- a/src/Components/SVG/Elements/DimensionLayer.tsx +++ b/src/Components/SVG/Elements/DimensionLayer.tsx @@ -1,20 +1,20 @@ import * as React from 'react'; import { ContainerModel } from '../../../Interfaces/IContainerModel'; import { DIMENSION_MARGIN } from '../../../utils/default'; -import { getAbsolutePosition, MakeBFSIterator } from '../../../utils/itertools'; +import { GetAbsolutePosition, MakeBFSIterator } from '../../../utils/itertools'; import { Dimension } from './Dimension'; interface IDimensionLayerProps { roots: ContainerModel | ContainerModel[] | null } -const getDimensionsNodes = (root: ContainerModel): React.ReactNode[] => { +function GetDimensionsNodes(root: ContainerModel): React.ReactNode[] { const it = MakeBFSIterator(root); const dimensions: React.ReactNode[] = []; for (const { container, depth } of it) { const width = container.properties.width; const id = `dim-${container.properties.id}`; - const xStart = getAbsolutePosition(container)[0]; + const xStart = GetAbsolutePosition(container)[0]; const xEnd = xStart + width; const y = (container.properties.y + container.properties.height) + (DIMENSION_MARGIN * (depth + 1)); const strokeWidth = 1; @@ -28,30 +28,29 @@ const getDimensionsNodes = (root: ContainerModel): React.ReactNode[] => { xEnd={xEnd} yEnd={y} strokeWidth={strokeWidth} - text={text} - /> + text={text} /> ); } return dimensions; -}; +} /** * A layer containing all dimension * @param props * @returns */ -export const DimensionLayer: React.FC = (props: IDimensionLayerProps) => { +export function DimensionLayer(props: IDimensionLayerProps): JSX.Element { let dimensions: React.ReactNode[] = []; if (Array.isArray(props.roots)) { props.roots.forEach(child => { - dimensions.concat(getDimensionsNodes(child)); + dimensions.concat(GetDimensionsNodes(child)); }); } else if (props.roots !== null) { - dimensions = getDimensionsNodes(props.roots); + dimensions = GetDimensionsNodes(props.roots); } return ( - { dimensions } + {dimensions} ); -}; +} diff --git a/src/Components/SVG/Elements/Selector/Selector.tsx b/src/Components/SVG/Elements/Selector/Selector.tsx index d8fbef5..0c2a491 100644 --- a/src/Components/SVG/Elements/Selector/Selector.tsx +++ b/src/Components/SVG/Elements/Selector/Selector.tsx @@ -2,14 +2,14 @@ import './Selector.scss'; import * as React from 'react'; import { IContainerModel } from '../../../../Interfaces/IContainerModel'; import { SHOW_SELECTOR_TEXT } from '../../../../utils/default'; -import { getAbsolutePosition } from '../../../../utils/itertools'; +import { GetAbsolutePosition } from '../../../../utils/itertools'; import { RemoveMargin } from '../../../../utils/svg'; interface ISelectorProps { selected?: IContainerModel } -export const Selector: React.FC = (props) => { +export function Selector(props: ISelectorProps): JSX.Element { if (props.selected === undefined || props.selected === null) { return ( @@ -17,7 +17,7 @@ export const Selector: React.FC = (props) => { ); } - let [x, y] = getAbsolutePosition(props.selected); + let [x, y] = GetAbsolutePosition(props.selected); let [width, height] = [ props.selected.properties.width, props.selected.properties.height @@ -34,7 +34,7 @@ export const Selector: React.FC = (props) => { const yText = y + height / 2; const style: React.CSSProperties = { - stroke: '#3B82F6', // tw blue-500 + stroke: '#3B82F6', strokeWidth: 4, fillOpacity: 0, transitionProperty: 'all', @@ -63,4 +63,4 @@ export const Selector: React.FC = (props) => { : null} ); -}; +} diff --git a/src/Components/SVG/Elements/Symbol.tsx b/src/Components/SVG/Elements/Symbol.tsx index 816526f..1d200cd 100644 --- a/src/Components/SVG/Elements/Symbol.tsx +++ b/src/Components/SVG/Elements/Symbol.tsx @@ -7,7 +7,7 @@ interface ISymbolProps { model: ISymbolModel } -export const Symbol: React.FC = (props) => { +export function Symbol(props: ISymbolProps): JSX.Element { const href = props.model.config.Image.Base64Image ?? props.model.config.Image.Url; const hasSVG = props.model.config.Image.Svg !== undefined && props.model.config.Image.Svg !== null; @@ -21,8 +21,7 @@ export const Symbol: React.FC = (props) => { noWrap={true} disableLineBreaks={true} content={props.model.config.Image.Svg} - allowElements={true} - /> + allowElements={true} /> ); } @@ -33,7 +32,6 @@ export const Symbol: React.FC = (props) => { x={props.model.x} y={-DIMENSION_MARGIN} height={props.model.height} - width={props.model.width} - /> + width={props.model.width} /> ); -}; +} diff --git a/src/Components/SVG/Elements/SymbolLayer.tsx b/src/Components/SVG/Elements/SymbolLayer.tsx index 0a18a31..cd9e47d 100644 --- a/src/Components/SVG/Elements/SymbolLayer.tsx +++ b/src/Components/SVG/Elements/SymbolLayer.tsx @@ -6,7 +6,7 @@ interface ISymbolLayerProps { symbols: Map } -export const SymbolLayer: React.FC = (props) => { +export function SymbolLayer(props: ISymbolLayerProps): JSX.Element { const symbols: JSX.Element[] = []; props.symbols.forEach((symbol) => { symbols.push( @@ -15,9 +15,7 @@ export const SymbolLayer: React.FC = (props) => { }); return ( - { - symbols - } + {symbols} ); -}; +} diff --git a/src/Components/SVG/SVG.tsx b/src/Components/SVG/SVG.tsx index d068ce9..e79827c 100644 --- a/src/Components/SVG/SVG.tsx +++ b/src/Components/SVG/SVG.tsx @@ -25,7 +25,7 @@ interface Viewer { export const ID = 'svg'; -function resizeViewBox( +function ResizeViewBox( setViewer: React.Dispatch> ): void { setViewer({ @@ -34,26 +34,28 @@ function resizeViewBox( }); } -function useSVGAutoResizer( +function UseSVGAutoResizer( setViewer: React.Dispatch> ): void { React.useEffect(() => { - const onResize = (): void => resizeViewBox(setViewer); - window.addEventListener('resize', onResize); + function OnResize(): void { + return ResizeViewBox(setViewer); + } + window.addEventListener('resize', OnResize); return () => { - window.removeEventListener('resize', onResize); + window.removeEventListener('resize', OnResize); }; }); } -export const SVG: React.FC = (props: ISVGProps) => { +export function SVG(props: ISVGProps): JSX.Element { const [viewer, setViewer] = React.useState({ viewerWidth: window.innerWidth - BAR_WIDTH, viewerHeight: window.innerHeight }); - useSVGAutoResizer(setViewer); + UseSVGAutoResizer(setViewer); const xmlns = ''; const properties = { @@ -64,9 +66,9 @@ export const SVG: React.FC = (props: ISVGProps) => { let children: React.ReactNode | React.ReactNode[] = []; if (Array.isArray(props.children)) { - children = props.children.map(child => ); + children = props.children.map(child => ); } else if (props.children !== null) { - children = ; + children = ; } return ( @@ -84,16 +86,14 @@ export const SVG: React.FC = (props: ISVGProps) => { }} > - { children } - { - SHOW_DIMENSIONS_PER_DEPTH - ? - : null - } + {children} + {SHOW_DIMENSIONS_PER_DEPTH + ? + : null} {/* leave this at the end so it can be removed during the svg export */}
); -}; +} diff --git a/src/Components/Select/Select.tsx b/src/Components/Select/Select.tsx index b2b499d..2a9f51b 100644 --- a/src/Components/Select/Select.tsx +++ b/src/Components/Select/Select.tsx @@ -19,7 +19,7 @@ const className = ` focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500 disabled:bg-slate-300 disabled:text-gray-500 disabled:border-slate-300 disabled:shadow-none`; -export const Select: React.FC = (props) => { +export function Select(props: ISelectProps): JSX.Element { const options = [( )]; @@ -40,7 +40,7 @@ export const Select: React.FC = (props) => { className={`mt-4 text-xs font-medium text-gray-800 ${props.labelClassName}`} htmlFor={props.inputKey} > - { props.labelText } + {props.labelText} ); -}; +} diff --git a/src/Components/Sidebar/Sidebar.test.tsx b/src/Components/Sidebar/Sidebar.test.tsx index 886496e..591796d 100644 --- a/src/Components/Sidebar/Sidebar.test.tsx +++ b/src/Components/Sidebar/Sidebar.test.tsx @@ -31,15 +31,17 @@ describe.concurrent('Sidebar', () => { }); it('With stuff', () => { - const Type = 'stuff'; + const type = 'stuff'; const handleButtonClick = vi.fn(); render( void } -function handleDragStart(event: React.DragEvent): void { +function HandleDragStart(event: React.DragEvent): void { event.dataTransfer.setData('type', (event.target as HTMLButtonElement).id); } -export const Sidebar: React.FC = (props: ISidebarProps) => { +export function Sidebar(props: ISidebarProps): JSX.Element { const listElements = props.componentOptions.map(componentOption => ); diff --git a/src/Components/SymbolProperties/SymbolForm.tsx b/src/Components/SymbolProperties/SymbolForm.tsx index 01182d8..31c8315 100644 --- a/src/Components/SymbolProperties/SymbolForm.tsx +++ b/src/Components/SymbolProperties/SymbolForm.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { restoreX, transformX } from '../../utils/svg'; +import { RestoreX, TransformX } from '../../utils/svg'; import { InputGroup } from '../InputGroup/InputGroup'; interface ISymbolFormProps { @@ -8,7 +8,8 @@ interface ISymbolFormProps { symbols: Map onChange: (key: string, value: string | number | boolean) => void } -const SymbolForm: React.FunctionComponent = (props) => { + +export function SymbolForm(props: ISymbolFormProps): JSX.Element { return (
= (props) => { inputClassName='' type='string' value={props.symbol.id.toString()} - isDisabled={true} - /> + isDisabled={true} /> props.onChange('x', restoreX(Number(event.target.value), props.symbol.width, props.symbol.config.XPositionReference))} - /> + value={TransformX(props.symbol.x, props.symbol.width, props.symbol.config.XPositionReference).toString()} + onChange={(event) => props.onChange('x', RestoreX(Number(event.target.value), props.symbol.width, props.symbol.config.XPositionReference))} /> = (props) => { type='number' min={0} value={props.symbol.height.toString()} - onChange={(event) => props.onChange('height', Number(event.target.value))} - /> + onChange={(event) => props.onChange('height', Number(event.target.value))} /> = (props) => { type='number' min={0} value={props.symbol.width.toString()} - onChange={(event) => props.onChange('width', Number(event.target.value))} - /> + onChange={(event) => props.onChange('width', Number(event.target.value))} />
); -}; - -export default SymbolForm; +} diff --git a/src/Components/SymbolProperties/SymbolProperties.tsx b/src/Components/SymbolProperties/SymbolProperties.tsx index 5e65206..1dff3e5 100644 --- a/src/Components/SymbolProperties/SymbolProperties.tsx +++ b/src/Components/SymbolProperties/SymbolProperties.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; -import SymbolForm from './SymbolForm'; +import { SymbolForm } from './SymbolForm'; interface ISymbolPropertiesProps { symbol?: ISymbolModel @@ -8,7 +8,7 @@ interface ISymbolPropertiesProps { onChange: (key: string, value: string | number | boolean) => void } -export const SymbolProperties: React.FC = (props: ISymbolPropertiesProps) => { +export function SymbolProperties(props: ISymbolPropertiesProps): JSX.Element { if (props.symbol === undefined) { return
; } @@ -18,8 +18,7 @@ export const SymbolProperties: React.FC = (props: ISymbo + onChange={props.onChange} />
); -}; +} diff --git a/src/Components/Symbols/Symbols.tsx b/src/Components/Symbols/Symbols.tsx index 6fdbc06..3188d88 100644 --- a/src/Components/Symbols/Symbols.tsx +++ b/src/Components/Symbols/Symbols.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { IAvailableSymbol } from '../../Interfaces/IAvailableSymbol'; -import { truncateString } from '../../utils/stringtools'; +import { TruncateString } from '../../utils/stringtools'; interface ISymbolsProps { componentOptions: IAvailableSymbol[] @@ -8,11 +8,11 @@ interface ISymbolsProps { buttonOnClick: (type: string) => void } -function handleDragStart(event: React.DragEvent): void { +function HandleDragStart(event: React.DragEvent): void { event.dataTransfer.setData('type', (event.target as HTMLButtonElement).id); } -export const Symbols: React.FC = (props: ISymbolsProps) => { +export function Symbols(props: ISymbolsProps): JSX.Element { const listElements = props.componentOptions.map(componentOption => { if (componentOption.Image.Url !== undefined || componentOption.Image.Base64Image !== undefined) { const url = componentOption.Image.Base64Image ?? componentOption.Image.Url; @@ -23,7 +23,7 @@ export const Symbols: React.FC = (props: ISymbolsProps) => { title={componentOption.Name} onClick={() => props.buttonOnClick(componentOption.Name)} draggable={true} - onDragStart={(event) => handleDragStart(event)} + onDragStart={(event) => HandleDragStart(event)} >
= (props: ISymbolsProps) => { />
- {truncateString(componentOption.Name, 5)} + {TruncateString(componentOption.Name, 5)}
); } @@ -44,10 +44,10 @@ export const Symbols: React.FC = (props: ISymbolsProps) => { title={componentOption.Name} onClick={() => props.buttonOnClick(componentOption.Name)} draggable={true} - onDragStart={(event) => handleDragStart(event)} + onDragStart={(event) => HandleDragStart(event)} > - {truncateString(componentOption.Name, 5)} + {TruncateString(componentOption.Name, 5)} ); }); diff --git a/src/Components/SymbolsSidebar/MouseEventHandlers.ts b/src/Components/SymbolsSidebar/MouseEventHandlers.ts index e7cd5f0..6021122 100644 --- a/src/Components/SymbolsSidebar/MouseEventHandlers.ts +++ b/src/Components/SymbolsSidebar/MouseEventHandlers.ts @@ -1,7 +1,7 @@ import { RefObject, Dispatch, SetStateAction, useEffect } from 'react'; import { IPoint } from '../../Interfaces/IPoint'; -export function useMouseEvents( +export function UseMouseEvents( isContextMenuOpen: boolean, elementRef: RefObject, setIsContextMenuOpen: Dispatch>, @@ -9,44 +9,48 @@ export function useMouseEvents( setContextMenuPosition: Dispatch> ): void { useEffect(() => { - const onContextMenu = (event: MouseEvent): void => handleRightClick( - event, - setIsContextMenuOpen, - setOnClickSymbolId, - setContextMenuPosition - ); + function OnContextMenu(event: MouseEvent): void { + return HandleRightClick( + event, + setIsContextMenuOpen, + setOnClickSymbolId, + setContextMenuPosition + ); + } - const onLeftClick = (): void => handleLeftClick( - isContextMenuOpen, - setIsContextMenuOpen, - setOnClickSymbolId - ); + function OnLeftClick(): void { + return HandleLeftClick( + isContextMenuOpen, + setIsContextMenuOpen, + setOnClickSymbolId + ); + } elementRef.current?.addEventListener( 'contextmenu', - onContextMenu + OnContextMenu ); window.addEventListener( 'click', - onLeftClick + OnLeftClick ); return () => { elementRef.current?.removeEventListener( 'contextmenu', - onContextMenu + OnContextMenu ); window.removeEventListener( 'click', - onLeftClick + OnLeftClick ); }; }); } -export function handleRightClick( +export function HandleRightClick( event: MouseEvent, setIsContextMenuOpen: React.Dispatch>, setOnClickSymbolId: React.Dispatch>, @@ -66,7 +70,7 @@ export function handleRightClick( setContextMenuPosition(contextMenuPosition); } -export function handleLeftClick( +export function HandleLeftClick( isContextMenuOpen: boolean, setIsContextMenuOpen: React.Dispatch>, setOnClickContainerId: React.Dispatch> diff --git a/src/Components/SymbolsSidebar/SymbolsSidebar.tsx b/src/Components/SymbolsSidebar/SymbolsSidebar.tsx index 2b020fc..01854d1 100644 --- a/src/Components/SymbolsSidebar/SymbolsSidebar.tsx +++ b/src/Components/SymbolsSidebar/SymbolsSidebar.tsx @@ -2,22 +2,22 @@ import * as React from 'react'; import { FixedSizeList as List } from 'react-window'; import { Menu } from '../Menu/Menu'; import { MenuItem } from '../Menu/MenuItem'; -import { handleLeftClick, handleRightClick, useMouseEvents } from './MouseEventHandlers'; +import { UseMouseEvents } from './MouseEventHandlers'; import { IPoint } from '../../Interfaces/IPoint'; import { ISymbolModel } from '../../Interfaces/ISymbolModel'; import { SymbolProperties } from '../SymbolProperties/SymbolProperties'; interface ISymbolsSidebarProps { - SelectedSymbolId: string + selectedSymbolId: string symbols: Map isOpen: boolean isHistoryOpen: boolean - OnPropertyChange: (key: string, value: string | number | boolean) => void - SelectSymbol: (symbolId: string) => void - DeleteSymbol: (containerid: string) => void + onPropertyChange: (key: string, value: string | number | boolean) => void + selectSymbol: (symbolId: string) => void + deleteSymbol: (containerid: string) => void } -export const SymbolsSidebar: React.FC = (props: ISymbolsSidebarProps): JSX.Element => { +export function SymbolsSidebar(props: ISymbolsSidebarProps): JSX.Element { // States const [isContextMenuOpen, setIsContextMenuOpen] = React.useState(false); const [onClickSymbolId, setOnClickSymbolId] = React.useState(''); @@ -29,7 +29,7 @@ export const SymbolsSidebar: React.FC = (props: ISymbolsSi const elementRef = React.useRef(null); // Event listeners - useMouseEvents( + UseMouseEvents( isContextMenuOpen, elementRef, setIsContextMenuOpen, @@ -46,35 +46,33 @@ export const SymbolsSidebar: React.FC = (props: ISymbolsSi } const containers = [...props.symbols.values()]; - const Row = ({ index, style }: {index: number, style: React.CSSProperties}): JSX.Element => { + function Row({ index, style }: { index: number, style: React.CSSProperties }): JSX.Element { const container = containers[index]; const key = container.id.toString(); const text = key; - const selectedClass: string = props.SelectedSymbolId !== '' && - props.SelectedSymbolId === container.id + const selectedClass: string = props.selectedSymbolId !== '' && + props.selectedSymbolId === container.id ? 'border-l-4 bg-slate-400/60 hover:bg-slate-400' : 'bg-slate-300/60 hover:bg-slate-300'; return ( ); - }; + } return (
- Elements + Elements
= (props: ISymbolsSi height={384} width={256} > - { Row } + {Row}
= (props: ISymbolsSi > { setIsContextMenuOpen(false); - props.DeleteSymbol(onClickSymbolId); - }} /> + props.deleteSymbol(onClickSymbolId); + } } /> + onChange={props.onPropertyChange} />
); -}; +} diff --git a/src/Components/ToggleButton/ToggleButton.tsx b/src/Components/ToggleButton/ToggleButton.tsx index 198bf99..37438ed 100644 --- a/src/Components/ToggleButton/ToggleButton.tsx +++ b/src/Components/ToggleButton/ToggleButton.tsx @@ -1,26 +1,26 @@ -import React, { FC } from 'react'; +import React from 'react'; import './ToggleButton.scss'; interface IToggleButtonProps { id: string text: string - type?: TOGGLE_TYPE + type?: ToggleType title: string checked: boolean onChange: React.ChangeEventHandler } -export enum TOGGLE_TYPE { - MATERIAL, +export enum ToggleType { + Material, IOS } -export const ToggleButton: FC = (props) => { +export function ToggleButton(props: IToggleButtonProps): JSX.Element { const id = `toggle-${props.id}`; - const type = props.type ?? TOGGLE_TYPE.MATERIAL; + const type = props.type ?? ToggleType.Material; let classLine = 'line w-10 h-4 bg-gray-400 rounded-full shadow-inner'; let classDot = 'dot absolute w-6 h-6 bg-white rounded-full shadow -left-1 -top-1 transition'; - if (type === TOGGLE_TYPE.IOS) { + if (type === ToggleType.IOS) { classLine = 'line block bg-gray-600 w-14 h-8 rounded-full'; classDot = 'dot absolute left-1 top-1 bg-white w-6 h-6 rounded-full transition'; } @@ -43,10 +43,10 @@ export const ToggleButton: FC = (props) => {
- { props.text } + {props.text}

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 ( -

); -}; +} diff --git a/src/Components/UI/UI.tsx b/src/Components/UI/UI.tsx index 3645096..198e0ed 100644 --- a/src/Components/UI/UI.tsx +++ b/src/Components/UI/UI.tsx @@ -14,23 +14,23 @@ import { SymbolsSidebar } from '../SymbolsSidebar/SymbolsSidebar'; import { PropertyType } from '../../Enums/PropertyType'; interface IUIProps { - SelectedContainer: IContainerModel | undefined + selectedContainer: IContainerModel | undefined current: IHistoryState history: IHistoryState[] historyCurrentStep: number - AvailableContainers: IAvailableContainer[] - AvailableSymbols: IAvailableSymbol[] - SelectContainer: (containerId: string) => void - DeleteContainer: (containerId: 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 - DeleteSymbol: (symbolId: string) => void - SaveEditorAsJSON: () => void - SaveEditorAsSVG: () => void - LoadState: (move: number) => void + availableContainers: IAvailableContainer[] + availableSymbols: IAvailableSymbol[] + selectContainer: (containerId: string) => void + deleteContainer: (containerId: 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 + deleteSymbol: (symbolId: string) => void + saveEditorAsJSON: () => void + saveEditorAsSVG: () => void + loadState: (move: number) => void } function CloseOtherSidebars( @@ -41,7 +41,7 @@ function CloseOtherSidebars( setIsSymbolsOpen(false); } -export const UI: React.FunctionComponent = (props: IUIProps) => { +export function UI(props: IUIProps): JSX.Element { const [isSidebarOpen, setIsSidebarOpen] = React.useState(true); const [isSymbolsOpen, setIsSymbolsOpen] = React.useState(false); const [isHistoryOpen, setIsHistoryOpen] = React.useState(false); @@ -61,71 +61,63 @@ export const UI: React.FunctionComponent = (props: IUIProps) => { isSymbolsOpen={isSymbolsOpen} isElementsSidebarOpen={isSidebarOpen} isHistoryOpen={isHistoryOpen} - ToggleSidebar={() => { + toggleSidebar={() => { CloseOtherSidebars(setIsSidebarOpen, setIsSymbolsOpen); setIsSidebarOpen(!isSidebarOpen); - }} - ToggleSymbols={() => { + } } + toggleSymbols={() => { CloseOtherSidebars(setIsSidebarOpen, setIsSymbolsOpen); setIsSymbolsOpen(!isSymbolsOpen); - }} - ToggleTimeline={() => setIsHistoryOpen(!isHistoryOpen)} - /> + } } + toggleTimeline={() => setIsHistoryOpen(!isHistoryOpen)} /> + buttonOnClick={props.addContainer} /> + buttonOnClick={props.addSymbol} /> + onPropertyChange={props.onPropertyChange} + selectContainer={props.selectContainer} + deleteContainer={props.deleteContainer} /> + onPropertyChange={props.onSymbolPropertyChange} + selectSymbol={props.selectSymbol} + deleteSymbol={props.deleteSymbol} /> + jumpTo={props.loadState} /> ); -}; - -export default UI; +} diff --git a/src/Enums/PropertyType.ts b/src/Enums/PropertyType.ts index 0e9dd0d..e8584e3 100644 --- a/src/Enums/PropertyType.ts +++ b/src/Enums/PropertyType.ts @@ -8,15 +8,15 @@ export enum PropertyType { /** * Simple property: is not inside any object: id, x, width... (default) */ - SIMPLE, + Simple, /** * Style property: is inside the style object: stroke, fillOpacity... */ - STYLE, + Style, /** * Margin property: is inside the margin property: left, bottom, top, right... */ - MARGIN, + Margin, } diff --git a/src/Events/EditorEvents.ts b/src/Events/EditorEvents.ts index ea1ee39..3cc8978 100644 --- a/src/Events/EditorEvents.ts +++ b/src/Events/EditorEvents.ts @@ -1,5 +1,5 @@ import { Dispatch, SetStateAction } from 'react'; -import { getCurrentHistory } from '../Components/Editor/Editor'; +import { GetCurrentHistory } from '../Components/Editor/Editor'; import { IConfiguration } from '../Interfaces/IConfiguration'; import { IEditorState } from '../Interfaces/IEditorState'; import { IHistoryState } from '../Interfaces/IHistoryState'; @@ -38,7 +38,7 @@ const appendNewState = ( ): void => { const state: IHistoryState = JSON.parse(eventInitDict?.detail.state); ReviveState(state); - const history = getCurrentHistory(editorState.history, editorState.historyCurrentStep); + const history = GetCurrentHistory(editorState.history, editorState.historyCurrentStep); history.push(state); setHistory(history); diff --git a/src/Interfaces/IAvailableContainer.ts b/src/Interfaces/IAvailableContainer.ts index ff61db0..b8a5a2b 100644 --- a/src/Interfaces/IAvailableContainer.ts +++ b/src/Interfaces/IAvailableContainer.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ import React from 'react'; import { AddMethod } from '../Enums/AddMethod'; import { XPositionReference } from '../Enums/XPositionReference'; diff --git a/src/Interfaces/IAvailableSymbol.ts b/src/Interfaces/IAvailableSymbol.ts index 02308d1..c6e6c1c 100644 --- a/src/Interfaces/IAvailableSymbol.ts +++ b/src/Interfaces/IAvailableSymbol.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ import { XPositionReference } from '../Enums/XPositionReference'; import { IImage } from './IImage'; diff --git a/src/Interfaces/IConfiguration.ts b/src/Interfaces/IConfiguration.ts index a37647d..c44f41c 100644 --- a/src/Interfaces/IConfiguration.ts +++ b/src/Interfaces/IConfiguration.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ import { IAvailableContainer } from './IAvailableContainer'; import { IAvailableSymbol } from './IAvailableSymbol'; diff --git a/src/Interfaces/IContainerModel.ts b/src/Interfaces/IContainerModel.ts index 6521f0a..5922ebe 100644 --- a/src/Interfaces/IContainerModel.ts +++ b/src/Interfaces/IContainerModel.ts @@ -1,4 +1,4 @@ -import IContainerProperties from './IContainerProperties'; +import { IContainerProperties } from './IContainerProperties'; export interface IContainerModel { children: IContainerModel[] diff --git a/src/Interfaces/IContainerProperties.ts b/src/Interfaces/IContainerProperties.ts index 2eaa5fd..379ec41 100644 --- a/src/Interfaces/IContainerProperties.ts +++ b/src/Interfaces/IContainerProperties.ts @@ -5,7 +5,7 @@ import { IMargin } from './IMargin'; /** * Properties of a container */ -export default interface IContainerProperties { +export interface IContainerProperties { /** id of the container */ id: string @@ -55,7 +55,7 @@ export default interface IContainerProperties { isFlex: boolean /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - XPositionReference: XPositionReference + xPositionReference: XPositionReference /** * (optional) diff --git a/src/Interfaces/IHistoryState.ts b/src/Interfaces/IHistoryState.ts index f906af3..c0d8214 100644 --- a/src/Interfaces/IHistoryState.ts +++ b/src/Interfaces/IHistoryState.ts @@ -3,20 +3,20 @@ import { ISymbolModel } from './ISymbolModel'; export interface IHistoryState { /** Last editor action */ - LastAction: string + lastAction: string /** Reference to the main container */ - MainContainer: IContainerModel + mainContainer: IContainerModel /** Id of the selected container */ - SelectedContainerId: string + selectedContainerId: string /** Counter of type of container. Used for ids. */ - TypeCounters: Record + typeCounters: Record /** List of symbols */ - Symbols: Map + symbols: Map /** Selected symbols id */ - SelectedSymbolId: string + selectedSymbolId: string } diff --git a/src/Interfaces/IImage.ts b/src/Interfaces/IImage.ts index d22c2e1..7a9e5c4 100644 --- a/src/Interfaces/IImage.ts +++ b/src/Interfaces/IImage.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ /** * Model of an image with multiple source * It must at least have one source. diff --git a/src/main.tsx b/src/main.tsx index 5c51e5c..264c622 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,7 +3,7 @@ import ReactDOM from 'react-dom/client'; import { App } from './Components/App/App'; import './index.scss'; -function render(root: Element | Document): void { +function RenderRoot(root: Element | Document): void { ReactDOM.createRoot(root.querySelector('#root') as HTMLDivElement).render( @@ -12,10 +12,9 @@ function render(root: Element | Document): void { } namespace SVGLayoutDesigner { - export const Render = render; + export const Render = RenderRoot; } - (window as any).SVGLayoutDesigner = SVGLayoutDesigner; -render(document); +RenderRoot(document); diff --git a/src/utils/default.ts b/src/utils/default.ts index 98db426..74f1512 100644 --- a/src/utils/default.ts +++ b/src/utils/default.ts @@ -3,7 +3,7 @@ import { IAvailableContainer } from '../Interfaces/IAvailableContainer'; import { IAvailableSymbol } from '../Interfaces/IAvailableSymbol'; import { IConfiguration } from '../Interfaces/IConfiguration'; import { ContainerModel, IContainerModel } from '../Interfaces/IContainerModel'; -import IContainerProperties from '../Interfaces/IContainerProperties'; +import { IContainerProperties } from '../Interfaces/IContainerProperties'; import { IEditorState } from '../Interfaces/IEditorState'; import { ISymbolModel } from '../Interfaces/ISymbolModel'; @@ -36,7 +36,7 @@ export const APPLY_BEHAVIORS_ON_CHILDREN = true; /** * Returns the default editor state given the configuration */ -export const GetDefaultEditorState = (configuration: IConfiguration): IEditorState => { +export function GetDefaultEditorState(configuration: IConfiguration): IEditorState { const mainContainer = new ContainerModel( null, { @@ -50,22 +50,23 @@ export const GetDefaultEditorState = (configuration: IConfiguration): IEditorSta configuration, history: [ { - LastAction: '', - MainContainer: mainContainer, - SelectedContainerId: mainContainer.properties.id, - TypeCounters: {}, - Symbols: new Map(), - SelectedSymbolId: '' + lastAction: '', + mainContainer: mainContainer, + selectedContainerId: mainContainer.properties.id, + typeCounters: {}, + symbols: new Map(), + selectedSymbolId: '' } ], historyCurrentStep: 0 }; -}; +} /** * Default config when the API is not available */ export const DEFAULT_CONFIG: IConfiguration = { + /* eslint-disable @typescript-eslint/naming-convention */ AvailableContainers: [ { Type: 'Container', @@ -87,6 +88,7 @@ export const DEFAULT_CONFIG: IConfiguration = { stroke: 'black' } } + /* eslint-enable */ }; /** @@ -107,7 +109,7 @@ export const DEFAULT_MAINCONTAINER_PROPS: IContainerProperties = { height: Number(DEFAULT_CONFIG.MainContainer.Height), isAnchor: false, isFlex: false, - XPositionReference: XPositionReference.Left, + xPositionReference: XPositionReference.Left, style: { stroke: 'black', fillOpacity: 0 @@ -124,42 +126,40 @@ export const DEFAULT_MAINCONTAINER_PROPS: IContainerProperties = { * @param containerConfig default config of the container sent by the API * @returns {IContainerProperties} Default properties of a newly created container */ -export const GetDefaultContainerProps = ( - type: string, +export function GetDefaultContainerProps(type: string, typeCount: number, 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, - 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) -}); + containerConfig: IAvailableContainer): IContainerProperties { + return ({ + id: `${type}-${typeCount}`, + type, + parentId: parent.properties.id, + linkedSymbolId: '', + displayedText: `${type}-${typeCount}`, + x, + y, + 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) + }); +} -export const GetDefaultSymbolModel = ( - name: string, +export function GetDefaultSymbolModel(name: string, newCounters: Record, type: string, - symbolConfig: IAvailableSymbol -): ISymbolModel => { + symbolConfig: IAvailableSymbol): ISymbolModel { return { id: `${name}-${newCounters[type]}`, type: name, @@ -169,4 +169,4 @@ export const GetDefaultSymbolModel = ( height: symbolConfig.Height ?? DEFAULT_SYMBOL_HEIGHT, linkedContainers: new Set() }; -}; +} diff --git a/src/utils/itertools.ts b/src/utils/itertools.ts index faf1da9..c4bb188 100644 --- a/src/utils/itertools.ts +++ b/src/utils/itertools.ts @@ -54,7 +54,7 @@ export function * MakeBFSIterator(root: IContainerModel): Generator { next: T } -export function * pairwise(arr: T[]): Generator, void, unknown> { +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> { +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 8c84f19..1fb76b6 100644 --- a/src/utils/saveload.ts +++ b/src/utils/saveload.ts @@ -1,4 +1,4 @@ -import { findContainerById, MakeIterator } from './itertools'; +import { FindContainerById, MakeIterator } from './itertools'; import { IEditorState } from '../Interfaces/IEditorState'; import { IHistoryState } from '../Interfaces/IHistoryState'; @@ -19,34 +19,32 @@ export function Revive(editorState: IEditorState): void { } } -export const ReviveState = ( - state: IHistoryState -): void => { - if (state.MainContainer === null || state.MainContainer === undefined) { +export function 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()) { + state.symbols = new Map(state.symbols); + for (const symbol of state.symbols.values()) { symbol.linkedContainers = new Set(symbol.linkedContainers); } - const it = MakeIterator(state.MainContainer); + 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); + 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 => { +export function GetCircularReplacer(): (key: any, value: object | Map | null) => object | null | undefined { return (key: any, value: object | null) => { if (key === 'parent') { return; @@ -62,4 +60,4 @@ export const getCircularReplacer = (): (key: any, value: object | Map): number { +function GetLeastUsedIndex(indexes: number[], indexesTried: Record): number { let minUsed = Infinity; let minIndex = -1; for (const index of indexes) { diff --git a/src/utils/stringtools.ts b/src/utils/stringtools.ts index 2c858c0..e8a460c 100644 --- a/src/utils/stringtools.ts +++ b/src/utils/stringtools.ts @@ -1,10 +1,10 @@ -export function truncateString(str: string, num: number): string { +export function TruncateString(str: string, num: number): string { if (str.length <= num) { return str; } return `${str.slice(0, num)}...`; } -export function camelize(str: string): any { +export function Camelize(str: string): any { return str.split('-').map((word, index) => index > 0 ? word.charAt(0).toUpperCase() + word.slice(1) : word).join(''); } diff --git a/src/utils/svg.ts b/src/utils/svg.ts index 32aa0e6..61f8291 100644 --- a/src/utils/svg.ts +++ b/src/utils/svg.ts @@ -10,7 +10,7 @@ import { XPositionReference } from '../Enums/XPositionReference'; * it is better to fix serialization with the reviver. */ -export function transformX(x: number, width: number, xPositionReference = XPositionReference.Left): number { +export function TransformX(x: number, width: number, xPositionReference = XPositionReference.Left): number { let transformedX = x; if (xPositionReference === XPositionReference.Center) { transformedX += width / 2; @@ -20,7 +20,7 @@ export function transformX(x: number, width: number, xPositionReference = XPosit return transformedX; } -export function restoreX(x: number, width: number, xPositionReference = XPositionReference.Left): number { +export function RestoreX(x: number, width: number, xPositionReference = XPositionReference.Left): number { let transformedX = x; if (xPositionReference === XPositionReference.Center) { transformedX -= width / 2; diff --git a/src/utils/test-utils.tsx b/src/utils/test-utils.tsx index 139850e..aec5ae7 100644 --- a/src/utils/test-utils.tsx +++ b/src/utils/test-utils.tsx @@ -7,14 +7,15 @@ afterEach(() => { cleanup(); }); -const customRender = (ui: React.ReactElement, options = {}): RenderResult => - render(ui, { +function CustomRender(ui: React.ReactElement, options = {}): RenderResult { + return render(ui, { // wrap provider(s) here if needed wrapper: ({ children }) => children, ...options }); +} export * from '@testing-library/react'; export { default as userEvent } from '@testing-library/user-event'; // override render export -export { customRender as render }; +export { CustomRender as render };

wxczK_0N(SNW4*2k5d)YKwY4{(v~QrBdPGJ} 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 Date: Fri, 19 Aug 2022 14:01:47 +0200 Subject: [PATCH 03/13] default: Change minwidth to 1 --- src/utils/default.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/default.ts b/src/utils/default.ts index 6bb414b..bc3cbc7 100644 --- a/src/utils/default.ts +++ b/src/utils/default.ts @@ -83,7 +83,7 @@ export const GetDefaultContainerProps = ( isRigidBody: false, // set this to true to replicate Florian's project isAnchor: false, XPositionReference: containerConfig.XPositionReference ?? XPositionReference.Left, - minWidth: containerConfig.MinWidth ?? 0, + minWidth: containerConfig.MinWidth ?? 1, customSVG: containerConfig.CustomSVG, style: structuredClone(containerConfig.Style), userData: structuredClone(containerConfig.UserData) From 022ad381631d34652aa0c7a14a46d98c84d6398b Mon Sep 17 00:00:00 2001 From: Siklos Date: Fri, 19 Aug 2022 14:08:38 +0200 Subject: [PATCH 04/13] Add option to apply behaviors to children --- src/Components/Editor/Behaviors/Behaviors.ts | 8 ++++++++ .../Editor/Behaviors/RigidBodyBehaviors.ts | 13 +++++++------ src/utils/default.ts | 3 ++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Components/Editor/Behaviors/Behaviors.ts b/src/Components/Editor/Behaviors/Behaviors.ts index 63018b4..2d96508 100644 --- a/src/Components/Editor/Behaviors/Behaviors.ts +++ b/src/Components/Editor/Behaviors/Behaviors.ts @@ -1,4 +1,5 @@ import { IContainerModel } from '../../../Interfaces/IContainerModel'; +import { APPLY_BEHAVIORS_ON_CHILDREN } from '../../../utils/default'; import { ImposePosition } from './AnchorBehaviors'; import { RecalculatePhysics } from './RigidBodyBehaviors'; @@ -17,5 +18,12 @@ export function ApplyBehaviors(container: IContainerModel): IContainerModel { RecalculatePhysics(container); } + if (APPLY_BEHAVIORS_ON_CHILDREN) { + // Apply DFS by recursion + for (const child of container.children) { + ApplyBehaviors(child); + } + } + return container; } diff --git a/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts b/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts index f0a734c..1ba10a0 100644 --- a/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts +++ b/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts @@ -231,14 +231,15 @@ function getAvailableWidths( const width = container.properties.width; let unallocatedSpaces: ISizePointer[] = [{ x, width }]; - // We will only uses containers that also are rigid or are anchors - const solidBodies = container.children.filter( - (child) => child.properties.isRigidBody || child.properties.isAnchor - ); + for (const child of container.children) { + if (unallocatedSpaces.length < 1) { + return unallocatedSpaces; + } - for (const child of solidBodies) { // Ignore the exception - if (child === exception) { + // And we will also only uses containers that also are rigid or are anchors + if (child === exception || + (!child.properties.isRigidBody && !child.properties.isAnchor)) { continue; } const childX = child.properties.x; diff --git a/src/utils/default.ts b/src/utils/default.ts index bc3cbc7..e2778be 100644 --- a/src/utils/default.ts +++ b/src/utils/default.ts @@ -4,7 +4,7 @@ import { IConfiguration } from '../Interfaces/IConfiguration'; import { IContainerModel } from '../Interfaces/IContainerModel'; import IProperties from '../Interfaces/IProperties'; -/// CONTAINRE DEFAULTS /// +/// CONTAINER DEFAULTS /// export const SHOW_TEXT = true; export const DEFAULTCHILDTYPE_ALLOW_CYCLIC = false; @@ -22,6 +22,7 @@ export const NOTCHES_LENGTH = 4; export const ENABLE_SHORTCUTS = true; export const MAX_HISTORY = 200; +export const APPLY_BEHAVIORS_ON_CHILDREN = true; export const DEFAULT_CONFIG: IConfiguration = { AvailableContainers: [ From 8b8d88f885152b36d750c6ea76cc1d857a9991a2 Mon Sep 17 00:00:00 2001 From: Eric Nguyen Date: Mon, 22 Aug 2022 13:58:32 +0000 Subject: [PATCH 05/13] Merged PR 162: Implement symbols and other stuff (see desc) Implement symbols - Add, Remove, Select Container - Form - Link with container - Symbol behavior application to container (move to x with xpositionreference) Important changes - Remove SelectedContainer from HistoryState, meaning that it will be slower for each load but will be faster for each operations* (SetHistory, SelectContainer, DeleteContainer, SymbolOperations) - ElementsSidebar now opens with isSidebarOpen meaning that both sidebar will open on toggle - Moved camelize, transformX, restoreX to different modules (stringtools.ts, svg.ts) --- azure-pipelines.yml | 8 +- docs/Behaviors.md | 368 ++++++++++++++++++ docs/assets/yule-log-cake.jpg | Bin 0 -> 187625 bytes public/workers/worker.js | 13 +- src/Components/App/App.tsx | 5 +- src/Components/App/MenuActions.ts | 7 +- src/Components/Bar/Bar.tsx | 13 +- .../Editor/Behaviors/AnchorBehaviors.ts | 2 +- src/Components/Editor/Behaviors/Behaviors.ts | 25 +- .../Editor/Behaviors/RigidBodyBehaviors.ts | 15 +- .../Editor/Behaviors/SymbolBehaviors.ts | 9 + src/Components/Editor/ContainerOperations.ts | 74 ++-- src/Components/Editor/Editor.tsx | 49 ++- src/Components/Editor/PropertiesOperations.ts | 60 ++- src/Components/Editor/SymbolOperations.ts | 180 +++++++++ .../ElementsSidebar/ElementsSidebar.test.tsx | 25 +- .../ElementsSidebar/ElementsSidebar.tsx | 9 +- src/Components/Properties/DynamicForm.tsx | 25 +- src/Components/Properties/Form.tsx | 7 +- src/Components/Properties/Properties.test.tsx | 8 +- src/Components/Properties/Properties.tsx | 7 +- src/Components/Properties/StaticForm.tsx | 8 +- src/Components/SVG/Elements/Container.tsx | 35 +- .../SVG/Elements/DepthDimensionLayer.tsx | 2 +- src/Components/SVG/Elements/Selector.tsx | 2 +- src/Components/SVG/Elements/Symbol.tsx | 39 ++ src/Components/SVG/Elements/SymbolLayer.tsx | 23 ++ src/Components/SVG/SVG.tsx | 7 +- src/Components/Select/Select.tsx | 55 +++ .../SymbolProperties/DynamicForm.tsx | 56 +++ src/Components/SymbolProperties/Form.tsx | 17 + .../SymbolProperties/SymbolProperties.tsx | 27 ++ src/Components/Symbols/Symbols.tsx | 68 ++++ .../SymbolsSidebar/MouseEventHandlers.ts | 34 ++ .../SymbolsSidebar/SymbolsSidebar.tsx | 137 +++++++ src/Components/UI/UI.tsx | 61 ++- src/Interfaces/IAvailableSymbol.ts | 6 +- src/Interfaces/IContainerModel.ts | 12 +- ...IProperties.ts => IContainerProperties.ts} | 6 +- src/Interfaces/IHistoryState.ts | 15 +- src/Interfaces/IImage.ts | 21 +- src/Interfaces/ISymbolModel.ts | 24 ++ src/index.scss | 4 + src/utils/default.ts | 18 +- src/utils/saveload.ts | 22 +- src/utils/stringtools.ts | 4 + src/utils/svg.ts | 21 + test-server/http.js | 8 +- 48 files changed, 1453 insertions(+), 188 deletions(-) create mode 100644 docs/Behaviors.md create mode 100644 docs/assets/yule-log-cake.jpg create mode 100644 src/Components/Editor/Behaviors/SymbolBehaviors.ts create mode 100644 src/Components/Editor/SymbolOperations.ts create mode 100644 src/Components/SVG/Elements/Symbol.tsx create mode 100644 src/Components/SVG/Elements/SymbolLayer.tsx create mode 100644 src/Components/Select/Select.tsx create mode 100644 src/Components/SymbolProperties/DynamicForm.tsx create mode 100644 src/Components/SymbolProperties/Form.tsx create mode 100644 src/Components/SymbolProperties/SymbolProperties.tsx create mode 100644 src/Components/Symbols/Symbols.tsx create mode 100644 src/Components/SymbolsSidebar/MouseEventHandlers.ts create mode 100644 src/Components/SymbolsSidebar/SymbolsSidebar.tsx rename src/Interfaces/{IProperties.ts => IContainerProperties.ts} (91%) create mode 100644 src/Interfaces/ISymbolModel.ts create mode 100644 src/utils/svg.ts diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5c52dac..365a3d3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -21,7 +21,7 @@ steps: path: $(pnpm_config_cache) displayName: Cache pnpm -- script: | +- bash: | curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7 pnpm config set store-dir $(pnpm_config_cache) displayName: "Setup pnpm" @@ -31,7 +31,8 @@ steps: versionSpec: '16.x' displayName: 'Install Node.js 16.x LTS' -- script: | +- bash: | + set -euo pipefail node --version node ./test-server/node-http.js & jobs @@ -46,7 +47,8 @@ steps: versionSpec: '>=18.7.0' displayName: 'Install Node.js Latest' -- script: | +- bash: | + set -euo pipefail node --version node ./test-server/node-http.js & jobs diff --git a/docs/Behaviors.md b/docs/Behaviors.md new file mode 100644 index 0000000..125b5a9 --- /dev/null +++ b/docs/Behaviors.md @@ -0,0 +1,368 @@ +# Container behaviors + +This document is about the special and unique behaviors that a container can have. + +Each behavior is documented into a section with 3 subsections : +- Rules +- Applications +- Code reference and algorithms + + +# Default behavior + +The default behavior is the floating panel. It can move and resize itself but not its siblings. + + +## Rules + +The default behavior does not have any particular rules that applies to itself. + +However it does have a common rule for any behavior that applies to its children. + +Which is to apply the specials behaviors of its children (rigid or anchor). + + +## Applications + +The default behavior is important to have a good user experience when adding object. + +The golden rule is to never oppose the user which is why we don't want to applies rigid body by default +as it can block the addition of container. +Allowing freedom of movement can help for better precision if not the same as the rigid property. + +An example would be trying to overlap an element in order to use it as a layer. + +## Code references and algorithms + +In the module `PropertiesOperations.ts` in the following functions: +- `OnPropertyChange()` +- `OnPropertiesSubmit()` + +and in `ContainerOperation.ts` in `AddContainer()`, + +it uses the `ApplyBehaviors` function of the `Behaviors.ts` module to apply the specials behaviors of its children. + + + +# Rigid body behavior + +The rigid body behavior is a special behavior +that allows a container to be restricted into a space. + + +## Rules + +The main rules are : +- The rigid container must be kept inside its parent container +- The rigid container must be inside an unallocated space of its parent. Meaning, that it cannot overlap with another sibling. + + +## Applications + +This behavior has many applications to it. Mainly about recalculations. + +You may want to resize/move quickly and be certain that it does not overflow its parent. + +You may want to resize its parent and makes its resize its children. + +You may want siblings to interact with each other. + + +## Code references and algorithms + +Its algorithm can be a little complicated due to the numerous uses cases. + + +### First rule + +Lets start with the first rule : *The rigid container must be kept inside its parent container* + +Inside the `RigidBodyBehaviors.ts`, see `constraintBodyInsideParent()` and `constraintBodyInsideSpace()`. + +As you can see `constraintBodyInsideParent()` is just a wrapper for `constraintBodyInsideSpace()`, so lets just study the last function. + +This is a simple problem of two rectangle. + +In order to restrict the child to its parent, +we need to know firstly, if the children is not bigger than its parent. + +If it is, we just need to set the child at the beginning and makes it takes the full size of its parent. + +If it is not, we need to check if the children is out of bound (outside its parent). And if it is out of bound, we need to move it back inside. + +To check if it bigger than its parent we just need to compare their sizes : `childWidth > parentWidth` and vertically `childHeight > parentHeight`. + +If false we need to check out of bound, check for x (and y): `child.x < parent.x` for the left side or `child.x + child.width > parent.x + parent.width` for the right side. We don't want the overlap either which is why we uses `child.width`. + +The condition is also equivalent to `child.x > parent.x + parent.width - child.width` which could makes more sense as the required space must be smaller because of the child size. + + +In my algorithm, I decided to put them near the edge where they went out of bound : + +``` +left oob: child.x = parent.x +right oob: child.x = parent.x + parent.width - child.width +``` + +Pseudo-code : + +```c +constraintBodyInsideSpace(child, parent) { + if (child is bigger than parent) { + if (child is larger) { + set child x and width; + } + + if (child is taller) { + set child y and height; + } + } else { + if (child is to the left of parent) { + set child x at the left side of parent + } + + if (child is to the right of parent) { + set child x at the right side of parent + } + + if (child is higher than parent) { + set child y at the top of parent + } + + if (child is lower than parent) { + set child y at the bottom of parent + } + } +} +``` + + +### Second rule + +The second rule is the most important and complicated as it must interact with its siblings. + +*The rigid container must be inside an unallocated space of its parent. Meaning, that it cannot overlap with another sibling.* + +Let's first define what is a *space* : a *space* is the width of a container. Which consequently means that the rule only applies on the horizontal view. To simply the matter that also means that we only need to work on one dimension. + +To solve this problem, like the parent, we could use collision detection between its siblings. However this could be very slow as the worst case scenario is a cartesian product: O(n2). Because for each container we need to search for other container that collide with use. When it collide we need to move it and search again. + +Remember, this rule is applied every time you change a property of container, this is *lag*. We cannot afford to inefficient loops. + +Let us use a "system of space" that has "containers" that cannot "overlap". + +Memory. + +Memory, RAM, Hard drive space, handles their space through a system of adresses and chunks of spaces (words, bytes...). In our case we don't have chunk of spaces but floating numbers (which can be a pain the work with because of the edge cases). + +This system is particularly useful as it remember the space used after every iteration of allocation, meaning that we can know exactly when there is no more space inside parent and when a container must resized itself in order to fit inside. + +Alright let us start the algorithm. See `constraintBodyInsideUnallocatedWidth()`, `getAvailableWidths()` and `getAvailableWidthsTwoLines()` in `RigidBodyBehaviors.ts` for implementation reference. + +We have initially the whole space available: let `space` be this available space in the parent. + +`space` is a pointer, thus at the beginning it has `0` to its pointer address and `parent.width` as it space. + +To simplify the algorithm when adding a container, let us compare it to eating a bûche de Noël (yule log). + +![buche](./assets/yule-log-cake.jpg) + +Like eating the cake, we need to cut it and take a part. + +There is 5 possible way to cut it : +- Not eating the cake (maybe we prefer to eat a different cake/part) +- Eating the whole cake +- Cutting the cake at the left side +- Cutting the cake at the right right +- Cutting the cake in the middle + +Not cutting the cake means returning the whole cake as is. + +Eating the whole cake is to not returns anything. + +Cutting at the left or the right side means leave 1 part. + +Cutting the middle means leaving two part. + +After cutting the cake, *while* there is still some left, we can continue the operation. (it is a *for* loop in the code though for syntax reasons) + +However after serving for the siblings we *may* notice that there is no more left for us. We get angry, we *throw* a tantrum. + +```c +// if you did not understood the joke +if (there no more cake) { + throw tantrum +} +``` + +Wait, there is actually cake! + +But it is left in multiple parts, we will just takes the *closest* one that *fits* our hunger. + +If there is one that fits our hunger let's take it! + +Yet! There is cake but none fits our hunger. But we do have a *minimum* acceptance, let us be humble, we will still take the small bit. By the way, taking multiple part would look bad for us. Nonetheless, if my *minimum* acceptance were to be higher than what is left, I would *throw* a *warning* for next time. + + +Alright lets translate this in pseudo-code. + +Let us start with getting the available spaces : + +```c# +getAvailableSpaces(parent, me) { + spaces = [{ x: 0, size: parent.width }] + + let i = 0 + while (spaces.length > 0 and i < parent.length) { + let sibling = parent.children[i]; + + if (sibling is me or is neither rigid nor is anchor) { + i++; + continue; + } + + let spacesLeft be an array + + foreach(space in spaces) { + spacesLeftOfSpace = allocate(sibling, space); + spacesLeft.concat(spacesLeftOfSpace) + } + + spaces = spacesLeft + i++ + } + + return spaces; +} +``` + +To allocate: + +```c# +allocate(sibling, space) { + if (sibling is not overlapping the space) { + return [space] + } + + if (sibling overlap the space entirely) { + return [] + } + + if (sibling overlap at the left side) { + return [{ + x: right side of sibling + size: right side of space - right side of sibling // "cut the left part" + }] + } + + if (sibling overlap at the right side) { + return [{ + x: left side of space + size: leftSide of sibling - leftSide of space + }] + } + + // if (sibling overlap in the middle) + return [ + { + x: left side of space + size: left side of sibling - left side of space + }, + { + x: right side of sibling + size: right side of space - right side of sibling + } + ] +} +``` + +Finally the top part: + +```c# +constraintBodyInsideUnallocatedWidth(parent, container) { + spaces = getAvailableSpaces(parent, container) + if (there is no more spaces) { + throw error + } + + spaces = sort spaces by closest from the middle of container + + spaceFound = spaces.find(space that fit container.space) + + if (no spaceFound) { + + spaceFound = spaces.find(space that fit container.minimumSpace) + + if (no spaceFound) { + show warning + return container + } + + set container x and width to make it fit + return container; + } + + constraintBodyInsideSpace(container, spaceFound) +} +``` + +This algorithm is great but, some problems remains: +- Finding the closest takes O(nlogn) with n being the number of spaces. This is usually not bad since the objective of the rigid body is to **fill** space. But it still does have a very bad worst case. +- There is 2 searches for space, same problem but the previous sort helps to make it faster for the best cases + + + +# Anchor behavior + +The anchor behavior allows a container to gain priority over its siblings. + + +## Rules + +It has the following rules: + - The container cannot be moved by other rigid siblings container + - The container cannot be resized by any other siblings container + - The container cannot overlap any other siblings rigid container : + - overlapping containers are shifted to the nearest available space/width + - or resized when there is no available space left other than theirs + - or lose their rigid body properties when there is absolutely no available space left (not even theirs) + + +## Applications + +Gaining priority can helps makes sure that a rigid object won't move no matter what and will absolutly move no matter what is under it. + + +## Code references and algorithms + +While there is a more rules applied to this behavior, most of them are just conditions. + +These three rules: + - The container cannot be moved by other rigid siblings container + - The container cannot be resized by any other siblings container + - It cannot overlap any other siblings rigid container + +Can be translate into a single one: "The container is an allocated space so any container is in contact will move or be resized" + +Meaning that applying the rigid body properties of the sibling will also apply this rule. The difference with the default behavior and the anchor behavior is that the anchor container will be taken into account during the calculation of available space. + +You can think of the default container as a floating panel and the anchor container as a wall. You can go under the floating panel but cannot go over the wall. + +To optimize the algorithm, we just need to find the overlapping siblings since the anchor is not applied to those who are not in collision. + +Pseudo-code : + +```c# +ImposePosition(container) { + let rigidBodies be the rigid siblings that are not anchor + let overlappingRigidBodies be the overlapping rigid siblings of rigidBodies + + foreach(overlappingRigidBody of overlappingRigidBodies) { + constraintBodyInsideUnallocatedWidth(overlappingRigidBody) + } +} +``` + +Also, modify `getAvailableSpaces()` so it takes into account anchor containers. + +That's it. \ No newline at end of file diff --git a/docs/assets/yule-log-cake.jpg b/docs/assets/yule-log-cake.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0dd3b875e5d8f2e978b7655faac244cacec4e7d GIT binary patch literal 187625 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