Merged PR 181: Add warning to elements sidebar + remove swals from behaviors
- Add warning to elements sidebar - Remove obnoxious swals from behaviors
This commit is contained in:
parent
6a3ddea763
commit
6441cd11e8
9 changed files with 62 additions and 43 deletions
|
@ -36,6 +36,7 @@ describe.concurrent('Properties', () => {
|
||||||
xPositionReference: XPositionReference.Left,
|
xPositionReference: XPositionReference.Left,
|
||||||
isFlex: false,
|
isFlex: false,
|
||||||
isAnchor: false,
|
isAnchor: false,
|
||||||
|
warning: '',
|
||||||
showChildrenDimensions: true, // TODO: put the dimension at the top (see pdf)
|
showChildrenDimensions: true, // TODO: put the dimension at the top (see pdf)
|
||||||
showSelfDimensions: true, // TODO: put the dimension at the bottom (see pdf)
|
showSelfDimensions: true, // TODO: put the dimension at the bottom (see pdf)
|
||||||
isDimensionBorrower: true, // second dimensions from the bottom
|
isDimensionBorrower: true, // second dimensions from the bottom
|
||||||
|
|
|
@ -549,15 +549,14 @@ function SetContainer(
|
||||||
container.properties.linkedSymbolId,
|
container.properties.linkedSymbolId,
|
||||||
symbols
|
symbols
|
||||||
);
|
);
|
||||||
|
// sort the children list by their position
|
||||||
|
UpdateParentChildrenList(container.parent);
|
||||||
|
|
||||||
// Apply special behaviors: rigid, flex, symbol, anchor
|
// Apply special behaviors: rigid, flex, symbol, anchor
|
||||||
ApplyBehaviors(container, symbols);
|
ApplyBehaviors(container, symbols);
|
||||||
|
|
||||||
// Apply special behaviors on siblings
|
// Apply special behaviors on siblings
|
||||||
ApplyBehaviorsOnSiblingsChildren(container, symbols);
|
ApplyBehaviorsOnSiblingsChildren(container, symbols);
|
||||||
|
|
||||||
// sort the children list by their position
|
|
||||||
UpdateParentChildrenList(container.parent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { IContainerModel } from '../../../Interfaces/IContainerModel';
|
import { IContainerModel } from '../../../Interfaces/IContainerModel';
|
||||||
import { ISymbolModel } from '../../../Interfaces/ISymbolModel';
|
import { ISymbolModel } from '../../../Interfaces/ISymbolModel';
|
||||||
import { APPLY_BEHAVIORS_ON_CHILDREN, ENABLE_RIGID, ENABLE_SWAP } from '../../../utils/default';
|
import { APPLY_BEHAVIORS_ON_CHILDREN, ENABLE_RIGID, ENABLE_SWAP } from '../../../utils/default';
|
||||||
import { ApplyAnchor } from './AnchorBehaviors';
|
import { ApplyAnchor, GetOverlappingContainers } from './AnchorBehaviors';
|
||||||
import { Flex } from './FlexBehaviors';
|
import { Flex } from './FlexBehaviors';
|
||||||
import { ApplyRigidBody } from './RigidBodyBehaviors';
|
import { ApplyRigidBody } from './RigidBodyBehaviors';
|
||||||
import { ApplySwap } from './SwapBehaviors';
|
import { ApplySwap } from './SwapBehaviors';
|
||||||
|
@ -14,6 +14,7 @@ import { ApplySymbol } from './SymbolBehaviors';
|
||||||
* @returns Updated container
|
* @returns Updated container
|
||||||
*/
|
*/
|
||||||
export function ApplyBehaviors(container: IContainerModel, symbols: Map<string, ISymbolModel>): IContainerModel {
|
export function ApplyBehaviors(container: IContainerModel, symbols: Map<string, ISymbolModel>): IContainerModel {
|
||||||
|
try {
|
||||||
const symbol = symbols.get(container.properties.linkedSymbolId);
|
const symbol = symbols.get(container.properties.linkedSymbolId);
|
||||||
if (container.properties.linkedSymbolId !== '' && symbol !== undefined) {
|
if (container.properties.linkedSymbolId !== '' && symbol !== undefined) {
|
||||||
ApplySymbol(container, symbol);
|
ApplySymbol(container, symbol);
|
||||||
|
@ -39,6 +40,16 @@ export function ApplyBehaviors(container: IContainerModel, symbols: Map<string,
|
||||||
ApplyBehaviors(child, symbols);
|
ApplyBehaviors(child, symbols);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
let message = '';
|
||||||
|
if (typeof e === 'string') {
|
||||||
|
message = e;
|
||||||
|
} else if (e instanceof Error) {
|
||||||
|
message = e.message;
|
||||||
|
}
|
||||||
|
container.properties.warning = message;
|
||||||
|
throw new Error(message);
|
||||||
|
}
|
||||||
|
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
@ -56,6 +67,14 @@ export function ApplyBehaviorsOnSiblingsChildren(newContainer: IContainerModel,
|
||||||
|
|
||||||
newContainer.parent.children
|
newContainer.parent.children
|
||||||
.forEach((container: IContainerModel) => {
|
.forEach((container: IContainerModel) => {
|
||||||
|
if (container.parent != null) {
|
||||||
|
const overlappingContainers = GetOverlappingContainers(container, container.parent.children);
|
||||||
|
if (overlappingContainers.length > 0) {
|
||||||
|
container.properties.warning = `There are overlapping containers: ${overlappingContainers.map(c => c.properties.id).join(' ')}`;
|
||||||
|
} else {
|
||||||
|
container.properties.warning = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
if (container === newContainer) {
|
if (container === newContainer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import Swal from 'sweetalert2';
|
|
||||||
import { IContainerModel } from '../../../Interfaces/IContainerModel';
|
import { IContainerModel } from '../../../Interfaces/IContainerModel';
|
||||||
import { Simplex } from '../../../utils/simplex';
|
import { Simplex } from '../../../utils/simplex';
|
||||||
import { ApplyWidthMargin, ApplyXMargin } from '../../../utils/svg';
|
import { ApplyWidthMargin, ApplyXMargin } from '../../../utils/svg';
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
* If the contraints fails, an error message will be returned
|
* If the contraints fails, an error message will be returned
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import Swal from 'sweetalert2';
|
|
||||||
import { IContainerModel } from '../../../Interfaces/IContainerModel';
|
import { IContainerModel } from '../../../Interfaces/IContainerModel';
|
||||||
import { ISizePointer } from '../../../Interfaces/ISizePointer';
|
import { ISizePointer } from '../../../Interfaces/ISizePointer';
|
||||||
import { ENABLE_HARD_RIGID } from '../../../utils/default';
|
import { ENABLE_HARD_RIGID } from '../../../utils/default';
|
||||||
|
@ -132,11 +131,6 @@ export function ConstraintBodyInsideUnallocatedWidth(
|
||||||
|
|
||||||
// Check if there is still some space
|
// Check if there is still some space
|
||||||
if (availableWidths.length === 0) {
|
if (availableWidths.length === 0) {
|
||||||
Swal.fire({
|
|
||||||
icon: 'error',
|
|
||||||
title: 'Not enough space!',
|
|
||||||
text: 'Try to free the parent a little bit!'
|
|
||||||
});
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'No available space found on the parent container. Try to free the parent a bit.'
|
'No available space found on the parent container. Try to free the parent a bit.'
|
||||||
);
|
);
|
||||||
|
@ -180,14 +174,6 @@ export function ConstraintBodyInsideUnallocatedWidth(
|
||||||
|
|
||||||
if (availableWidth === undefined) {
|
if (availableWidth === undefined) {
|
||||||
console.debug(`Container ${container.properties.id} cannot fit in any space due to its minimum width being to large.`);
|
console.debug(`Container ${container.properties.id} cannot fit in any space due to its minimum width being to large.`);
|
||||||
// Swal.fire({
|
|
||||||
// position: 'top-end',
|
|
||||||
// title: `Container ${container.properties.id} cannot fit!`,
|
|
||||||
// text: 'Its rigid body property is now disabled. Change its the minimum width or free the parent container.',
|
|
||||||
// timerProgressBar: true,
|
|
||||||
// showConfirmButton: false,
|
|
||||||
// timer: 5000
|
|
||||||
// });
|
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,7 @@ describe.concurrent('Elements sidebar', () => {
|
||||||
maxWidth: Infinity,
|
maxWidth: Infinity,
|
||||||
type: 'type',
|
type: 'type',
|
||||||
isAnchor: false,
|
isAnchor: false,
|
||||||
|
warning: '',
|
||||||
showChildrenDimensions: true,
|
showChildrenDimensions: true,
|
||||||
showSelfDimensions: true,
|
showSelfDimensions: true,
|
||||||
isDimensionBorrower: true,
|
isDimensionBorrower: true,
|
||||||
|
@ -133,6 +134,7 @@ describe.concurrent('Elements sidebar', () => {
|
||||||
isFlex: false,
|
isFlex: false,
|
||||||
maxWidth: Infinity,
|
maxWidth: Infinity,
|
||||||
type: 'type',
|
type: 'type',
|
||||||
|
warning: '',
|
||||||
showChildrenDimensions: true,
|
showChildrenDimensions: true,
|
||||||
showSelfDimensions: true,
|
showSelfDimensions: true,
|
||||||
isDimensionBorrower: true,
|
isDimensionBorrower: true,
|
||||||
|
@ -183,6 +185,7 @@ describe.concurrent('Elements sidebar', () => {
|
||||||
minWidth: 1,
|
minWidth: 1,
|
||||||
width: 0,
|
width: 0,
|
||||||
height: 0,
|
height: 0,
|
||||||
|
warning: '',
|
||||||
xPositionReference: XPositionReference.Left,
|
xPositionReference: XPositionReference.Left,
|
||||||
margin: {},
|
margin: {},
|
||||||
isFlex: false,
|
isFlex: false,
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { IContainerModel } from '../../Interfaces/IContainerModel';
|
||||||
import { FindContainerById, GetDepth, MakeIterator } from '../../utils/itertools';
|
import { FindContainerById, GetDepth, MakeIterator } from '../../utils/itertools';
|
||||||
import { ISymbolModel } from '../../Interfaces/ISymbolModel';
|
import { ISymbolModel } from '../../Interfaces/ISymbolModel';
|
||||||
import { PropertyType } from '../../Enums/PropertyType';
|
import { PropertyType } from '../../Enums/PropertyType';
|
||||||
|
import { ExclamationIcon } from '@heroicons/react/outline';
|
||||||
|
|
||||||
interface IElementsSidebarProps {
|
interface IElementsSidebarProps {
|
||||||
mainContainer: IContainerModel
|
mainContainer: IContainerModel
|
||||||
|
@ -146,16 +147,20 @@ export function ElementsSidebar(props: IElementsSidebarProps): JSX.Element {
|
||||||
return (
|
return (
|
||||||
<button type="button"
|
<button type="button"
|
||||||
className={`w-full border-blue-500 elements-sidebar-row whitespace-pre
|
className={`w-full border-blue-500 elements-sidebar-row whitespace-pre
|
||||||
text-left text-sm font-medium transition-all ${container.properties.type} ${selectedClass}`}
|
text-left text-sm font-medium transition-all inline-flex ${container.properties.type} ${selectedClass}`}
|
||||||
id={key}
|
id={key}
|
||||||
key={key}
|
key={key}
|
||||||
style={style}
|
style={style}
|
||||||
|
title={container.properties.warning}
|
||||||
onClick={() => props.selectContainer(container.properties.id)}
|
onClick={() => props.selectContainer(container.properties.id)}
|
||||||
onDrop={(event) => HandleOnDrop(event, props.mainContainer, props.addContainer)}
|
onDrop={(event) => HandleOnDrop(event, props.mainContainer, props.addContainer)}
|
||||||
onDragOver={(event) => HandleDragOver(event, props.mainContainer)}
|
onDragOver={(event) => HandleDragOver(event, props.mainContainer)}
|
||||||
onDragLeave={(event) => HandleDragLeave(event)}
|
onDragLeave={(event) => HandleDragLeave(event)}
|
||||||
>
|
>
|
||||||
{text}
|
{text}
|
||||||
|
{container.properties.warning.length > 0 &&
|
||||||
|
<ExclamationIcon></ExclamationIcon>
|
||||||
|
}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,11 @@ export interface IContainerProperties {
|
||||||
*/
|
*/
|
||||||
isDimensionBorrower: boolean
|
isDimensionBorrower: boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warnings of a container
|
||||||
|
*/
|
||||||
|
warning: string
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* (optional)
|
* (optional)
|
||||||
* Replace a <rect> by a customized "SVG". It is not really an svg but it at least allows
|
* Replace a <rect> by a customized "SVG". It is not really an svg but it at least allows
|
||||||
|
|
|
@ -129,6 +129,7 @@ export const DEFAULT_MAINCONTAINER_PROPS: IContainerProperties = {
|
||||||
showSelfDimensions: true, // TODO: put the dimension at the bottom (see pdf)
|
showSelfDimensions: true, // TODO: put the dimension at the bottom (see pdf)
|
||||||
isDimensionBorrower: true, // second dimensions from the bottom
|
isDimensionBorrower: true, // second dimensions from the bottom
|
||||||
markPositionToDimensionBorrower: false,
|
markPositionToDimensionBorrower: false,
|
||||||
|
warning: '',
|
||||||
style: {
|
style: {
|
||||||
stroke: 'black',
|
stroke: 'black',
|
||||||
fillOpacity: 0
|
fillOpacity: 0
|
||||||
|
@ -173,6 +174,7 @@ export function GetDefaultContainerProps(type: string,
|
||||||
showSelfDimensions: containerConfig.ShowSelfDimensions ?? false,
|
showSelfDimensions: containerConfig.ShowSelfDimensions ?? false,
|
||||||
markPositionToDimensionBorrower: containerConfig.MarkPositionToDimensionBorrower ?? false,
|
markPositionToDimensionBorrower: containerConfig.MarkPositionToDimensionBorrower ?? false,
|
||||||
isDimensionBorrower: containerConfig.IsDimensionBorrower ?? false,
|
isDimensionBorrower: containerConfig.IsDimensionBorrower ?? false,
|
||||||
|
warning: '',
|
||||||
customSVG: containerConfig.CustomSVG,
|
customSVG: containerConfig.CustomSVG,
|
||||||
style: structuredClone(containerConfig.Style),
|
style: structuredClone(containerConfig.Style),
|
||||||
userData: structuredClone(containerConfig.UserData)
|
userData: structuredClone(containerConfig.UserData)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue