diff --git a/packages/mindplot/src/components/Topic.ts b/packages/mindplot/src/components/Topic.ts index 68ddc45a..a0a921dd 100644 --- a/packages/mindplot/src/components/Topic.ts +++ b/packages/mindplot/src/components/Topic.ts @@ -1064,9 +1064,10 @@ abstract class Topic extends NodeGraph { workspace.append(this._outgoingLine); - const incomingLines = this.getIncomingLines(); - incomingLines.forEach((line) => line.redraw()); - + if (!this.areChildrenShrunken()) { + const incomingLines = this.getIncomingLines(); + incomingLines.forEach((line) => line.redraw()); + } result = true; } @@ -1152,7 +1153,7 @@ abstract class Topic extends NodeGraph { const bgColor = this.getBackgroundColor(); innerShape.setFill(bgColor); - if (redrawChildren || shapeChanged || connectionChanged) { + if ((redrawChildren || shapeChanged || connectionChanged) && !this.areChildrenShrunken()) { this.getChildren().forEach((t) => t.redraw(true)); } } diff --git a/packages/mindplot/src/components/lang/en.js b/packages/mindplot/src/components/lang/en.js index fb00ad92..7d3a9dd8 100644 --- a/packages/mindplot/src/components/lang/en.js +++ b/packages/mindplot/src/components/lang/en.js @@ -1,24 +1,24 @@ -const DE = { - LOADING: 'Laden ...', - SAVING: 'Speichern ...', - SAVE_COMPLETE: 'Speichern abgeschlossen', - ZOOM_IN_ERROR: 'Vergrößerung zu hoch.', - ZOOM_ERROR: 'Es kann nicht weiter vergrößert bzw. verkleinert werden.', - ONLY_ONE_TOPIC_MUST_BE_SELECTED: 'Thema konnte nicht angelegt werden. Bitte wähle nur ein Thema aus.', - ONE_TOPIC_MUST_BE_SELECTED: 'Thema konnte nicht angelegt werden. Es muss ein Thema ausgewählt werden.', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE: 'Kinderknoten können nicht eingefaltet werden. Es muss ein Thema ausgewäht werden.', - SAVE_COULD_NOT_BE_COMPLETED: 'Sichern wurde nicht abgeschlossen. Versuche es später nocheinmal.', - UNEXPECTED_ERROR_LOADING: 'Es tut uns leid, ein unerwarteter Fehler ist aufgetreten.\nVersuche, den Editor neu zu laden. Falls das Problem erneut auftritt, kontaktiere uns bitte unter support@wisemapping.com.', - MAIN_TOPIC: 'Hauptthema', - SUB_TOPIC: 'Unterthema', - ISOLATED_TOPIC: 'Isoliertes Thema', - CENTRAL_TOPIC: 'Zentrales Thema', - CLIPBOARD_IS_EMPTY: 'Es gibt nichts zu kopieren. Die Zwischenablage ist leer.', - CENTRAL_TOPIC_CAN_NOT_BE_DELETED: 'Das zentrale Thema kann nicht gelöscht werden.', - RELATIONSHIP_COULD_NOT_BE_CREATED: 'Die Beziehung konnte nicht angelegt werden. Es muss erst ein Vater-Thema ausgewählt werden, um die Beziehung herzustellen.', - SESSION_EXPIRED: 'Deine Sitzung ist abgelaufen, bitte melde dich erneut an.', - CENTRAL_TOPIC_CONNECTION_STYLE_CAN_NOT_BE_CHANGED: 'Der Verbindungsstil kann für das zentrale Thema nicht geändert werden.', - CENTRAL_TOPIC_STYLE_CAN_NOT_BE_CHANGED: 'Das zentrale Thema kann nicht in den Linienstil geändert werden.', +const EN = { + LOADING: 'Loading ..', + SAVING: 'Saving ...', + SAVE_COMPLETE: 'Save completed', + ZOOM_IN_ERROR: 'Zoom too high.', + ZOOM_ERROR: 'No more zoom can be applied.', + ONLY_ONE_TOPIC_MUST_BE_SELECTED: 'Could not create a topic. Only one topic must be selected.', + ONE_TOPIC_MUST_BE_SELECTED: 'Could not create a topic. One topic must be selected.', + ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE: 'Children can not be collapsed. One topic must be selected.', + SAVE_COULD_NOT_BE_COMPLETED: 'Save could not be completed, please try again latter.', + MAIN_TOPIC: 'Main Topic', + SUB_TOPIC: 'Sub Topic', + ISOLATED_TOPIC: 'Isolated Topic', + CENTRAL_TOPIC: 'Central Topic', + ENTITIES_COULD_NOT_BE_DELETED: 'Could not delete topic or relation. At least one map entity must be selected.', + CLIPBOARD_IS_EMPTY: 'Nothing to copy. Clipboard is empty.', + CENTRAL_TOPIC_CAN_NOT_BE_DELETED: 'Central topic can not be deleted.', + RELATIONSHIP_COULD_NOT_BE_CREATED: 'Relationship could not be created. A parent relationship topic must be selected first.', + SESSION_EXPIRED: 'Your session has expired, please log-in again.', + CENTRAL_TOPIC_CONNECTION_STYLE_CAN_NOT_BE_CHANGED: 'Connection style can not be changed for central topic.', + CENTRAL_TOPIC_STYLE_CAN_NOT_BE_CHANGED: 'Central topic can not be changed to line style.', }; -export default DE; +export default EN; diff --git a/packages/mindplot/src/components/layout/Node.ts b/packages/mindplot/src/components/layout/Node.ts index 44e3cf7b..62ee720a 100644 --- a/packages/mindplot/src/components/layout/Node.ts +++ b/packages/mindplot/src/components/layout/Node.ts @@ -15,11 +15,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { $assert, $defined } from '@wisemapping/core-js'; +import { $assert } from '@wisemapping/core-js'; import PositionType from '../PositionType'; import SizeType from '../SizeType'; import ChildrenSorterStrategy from './ChildrenSorterStrategy'; +type NodeValue = number | SizeType | PositionType | boolean; +type MapValue = { + hasChanged: boolean; + value: NodeValue | undefined; + oldValue: NodeValue | undefined; +}; +type NodeKey = 'order' | 'position' | 'size' | 'freeDisplacement' | 'shrink'; + class Node { private _id: number; @@ -28,7 +36,7 @@ class Node { private _sorter: ChildrenSorterStrategy; - private _properties; + private _properties: Map; // eslint-disable-next-line no-use-before-define _children!: Node[]; @@ -41,7 +49,7 @@ class Node { $assert(typeof id === 'number' && Number.isFinite(id), 'id can not be null'); this._id = id; this._sorter = sorter; - this._properties = {}; + this._properties = new Map(); this.setSize(size); this.setPosition(position); @@ -50,27 +58,23 @@ class Node { this._heightChanged = false; } - /** */ getId(): number { return this._id; } - /** */ - hasFreeDisplacementChanged() { + hasFreeDisplacementChanged(): boolean { return this.isPropertyChanged('freeDisplacement'); } - /** */ - setShrunken(value: boolean) { + setShrunken(value: boolean): void { this.setProperty('shrink', value); } - /** */ - areChildrenShrunken() { - return this.getProperty('shrink'); + areChildrenShrunken(): boolean { + return Boolean(this.getProperty('shrink')); } - setOrder(order: number) { + setOrder(order: number): void { $assert( typeof order === 'number' && Number.isFinite(order), `Order can not be null. Value:${order}`, @@ -81,25 +85,22 @@ class Node { } } - /** */ - resetPositionState() { - const prop = this._properties.position; + resetPositionState(): void { + const prop = this._properties.get('position'); if (prop) { prop.hasChanged = false; } } - /** */ - resetOrderState() { - const prop = this._properties.order; + resetOrderState(): void { + const prop = this._properties.get('order'); if (prop) { prop.hasChanged = false; } } - /** */ - resetFreeState() { - const prop = this._properties.freeDisplacement; + resetFreeState(): void { + const prop = this._properties.get('freeDisplacement'); if (prop) { prop.hasChanged = false; } @@ -109,12 +110,10 @@ class Node { return this.getProperty('order') as number; } - /** */ - hasOrderChanged() { - return this.isPropertyChanged('order'); + hasOrderChanged(): boolean { + return Boolean(this.isPropertyChanged('order')); } - /** */ hasPositionChanged() { return this.isPropertyChanged('position'); } @@ -127,7 +126,6 @@ class Node { return this.getProperty('position') as PositionType; } - /** */ setSize(size: SizeType): void { const currentSize = this.getSize(); if ( @@ -140,7 +138,6 @@ class Node { } } - /** */ getSize(): SizeType { return this.getProperty('size') as SizeType; } @@ -155,7 +152,6 @@ class Node { this.setProperty('freeDisplacement', { ...newDisplacement }); } - /** */ getFreeDisplacement(): PositionType { const freeDisplacement = this.getProperty('freeDisplacement') as PositionType; return freeDisplacement || { x: 0, y: 0 }; @@ -173,13 +169,13 @@ class Node { } } - setProperty(key: string, value) { - let prop = this._properties[key]; + private setProperty(key: NodeKey, value: NodeValue): void { + let prop = this._properties.get(key); if (!prop) { prop = { hasChanged: false, - value: null, - oldValue: null, + value: undefined, + oldValue: undefined, }; } @@ -189,21 +185,19 @@ class Node { prop.value = value; prop.hasChanged = true; } - this._properties[key] = prop; + this._properties.set(key, prop); } - private getProperty(key: string): null | number | PositionType | SizeType { - const prop = this._properties[key]; - return $defined(prop) ? prop.value : null; + private getProperty(key: NodeKey): NodeValue | undefined { + return this._properties.get(key)?.value; } - isPropertyChanged(key: string) { - const prop = this._properties[key]; + isPropertyChanged(key: NodeKey): boolean { + const prop = this._properties.get(key); return prop ? prop.hasChanged : false; } - /** */ - getSorter() { + getSorter(): ChildrenSorterStrategy { return this._sorter; }