Visual Console Refactor: improved the item removal cleaning
Former-commit-id: af89361c3973f1321a6bfff9d3b19aabf80498db
This commit is contained in:
parent
a82143d72b
commit
035a819f3f
|
@ -5,7 +5,12 @@ import {
|
||||||
parseIntOr,
|
parseIntOr,
|
||||||
notEmptyStringOr
|
notEmptyStringOr
|
||||||
} from "./lib";
|
} from "./lib";
|
||||||
import Item, { ItemType, ItemProps, ItemClickEvent } from "./Item";
|
import Item, {
|
||||||
|
ItemType,
|
||||||
|
ItemProps,
|
||||||
|
ItemClickEvent,
|
||||||
|
ItemRemoveEvent
|
||||||
|
} from "./Item";
|
||||||
import StaticGraph, { staticGraphPropsDecoder } from "./items/StaticGraph";
|
import StaticGraph, { staticGraphPropsDecoder } from "./items/StaticGraph";
|
||||||
import Icon, { iconPropsDecoder } from "./items/Icon";
|
import Icon, { iconPropsDecoder } from "./items/Icon";
|
||||||
import ColorCloud, { colorCloudPropsDecoder } from "./items/ColorCloud";
|
import ColorCloud, { colorCloudPropsDecoder } from "./items/ColorCloud";
|
||||||
|
@ -194,6 +199,26 @@ export default class VisualConsole {
|
||||||
// List of references to clean the event listeners.
|
// List of references to clean the event listeners.
|
||||||
private readonly disposables: Disposable[] = [];
|
private readonly disposables: Disposable[] = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* React to a click on an element.
|
||||||
|
* @param e Event object.
|
||||||
|
*/
|
||||||
|
private handleElementClick: (e: ItemClickEvent<ItemProps>) => void = e => {
|
||||||
|
this.clickEventManager.emit(e);
|
||||||
|
// console.log(`Clicked element #${e.data.id}`, e);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear some element references.
|
||||||
|
* @param e Event object.
|
||||||
|
*/
|
||||||
|
private handleElementRemove: (e: ItemRemoveEvent<ItemProps>) => void = e => {
|
||||||
|
// Remove the element from the list and its relations.
|
||||||
|
this.elementIds = this.elementIds.filter(id => id !== e.data.id);
|
||||||
|
delete this.elementsById[e.data.id];
|
||||||
|
this.clearRelations(e.data.id);
|
||||||
|
};
|
||||||
|
|
||||||
public constructor(
|
public constructor(
|
||||||
container: HTMLElement,
|
container: HTMLElement,
|
||||||
props: UnknownObject,
|
props: UnknownObject,
|
||||||
|
@ -230,13 +255,8 @@ export default class VisualConsole {
|
||||||
this.elementsById[itemInstance.props.id] = itemInstance;
|
this.elementsById[itemInstance.props.id] = itemInstance;
|
||||||
this.elementIds.push(itemInstance.props.id);
|
this.elementIds.push(itemInstance.props.id);
|
||||||
// Item event handlers.
|
// Item event handlers.
|
||||||
itemInstance.onClick(e => {
|
itemInstance.onClick(this.handleElementClick);
|
||||||
this.clickEventManager.emit(e);
|
itemInstance.onRemove(this.handleElementRemove);
|
||||||
// console.log(`Clicked element #${e.data.id}`, e);
|
|
||||||
});
|
|
||||||
itemInstance.onRemove(e => {
|
|
||||||
// TODO: Remove the element from the list and its relations.
|
|
||||||
});
|
|
||||||
// Add the item to the DOM.
|
// Add the item to the DOM.
|
||||||
this.containerRef.append(itemInstance.elementRef);
|
this.containerRef.append(itemInstance.elementRef);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -290,13 +310,8 @@ export default class VisualConsole {
|
||||||
// Add the item to the list.
|
// Add the item to the list.
|
||||||
this.elementsById[itemInstance.props.id] = itemInstance;
|
this.elementsById[itemInstance.props.id] = itemInstance;
|
||||||
// Item event handlers.
|
// Item event handlers.
|
||||||
itemInstance.onClick(e => {
|
itemInstance.onClick(this.handleElementClick);
|
||||||
this.clickEventManager.emit(e);
|
itemInstance.onRemove(this.handleElementRemove);
|
||||||
// console.log(`Clicked element #${e.data.id}`, e);
|
|
||||||
});
|
|
||||||
itemInstance.onRemove(e => {
|
|
||||||
// TODO: Remove the element from the list and its relations.
|
|
||||||
});
|
|
||||||
// Add the item to the DOM.
|
// Add the item to the DOM.
|
||||||
this.containerRef.append(itemInstance.elementRef);
|
this.containerRef.append(itemInstance.elementRef);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -310,11 +325,11 @@ export default class VisualConsole {
|
||||||
console.log("Error updating an element:", error.message);
|
console.log("Error updating an element:", error.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Re-build relations.
|
|
||||||
this.buildRelations();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Re-build relations.
|
||||||
|
this.buildRelations();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -412,7 +427,8 @@ export default class VisualConsole {
|
||||||
this.elements.forEach(e => e.remove()); // Arrow function.
|
this.elements.forEach(e => e.remove()); // Arrow function.
|
||||||
this.elementsById = {};
|
this.elementsById = {};
|
||||||
this.elementIds = [];
|
this.elementIds = [];
|
||||||
// TODO: Clear relations.
|
// Clear relations.
|
||||||
|
this.clearRelations();
|
||||||
// Clean container.
|
// Clean container.
|
||||||
this.containerRef.innerHTML = "";
|
this.containerRef.innerHTML = "";
|
||||||
}
|
}
|
||||||
|
@ -421,7 +437,9 @@ export default class VisualConsole {
|
||||||
* Create line elements which connect the elements with their parents.
|
* Create line elements which connect the elements with their parents.
|
||||||
*/
|
*/
|
||||||
private buildRelations(): void {
|
private buildRelations(): void {
|
||||||
// TODO: Clear relations.
|
// Clear relations.
|
||||||
|
this.clearRelations();
|
||||||
|
// Add relations.
|
||||||
this.elements.forEach(item => {
|
this.elements.forEach(item => {
|
||||||
if (item.props.parentId !== null) {
|
if (item.props.parentId !== null) {
|
||||||
const parent = this.elementsById[item.props.parentId];
|
const parent = this.elementsById[item.props.parentId];
|
||||||
|
@ -431,6 +449,30 @@ export default class VisualConsole {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param itemId Optional identifier of a parent or child item.
|
||||||
|
* Remove the line elements which connect the elements with their parents.
|
||||||
|
*/
|
||||||
|
private clearRelations(itemId?: number): void {
|
||||||
|
if (itemId != null) {
|
||||||
|
for (let key in this.relations) {
|
||||||
|
const ids = key.split("|");
|
||||||
|
const parentId = Number.parseInt(ids[0]);
|
||||||
|
const childId = Number.parseInt(ids[1]);
|
||||||
|
|
||||||
|
if (itemId === parentId || itemId === childId) {
|
||||||
|
this.relations[key].remove();
|
||||||
|
delete this.relations[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (let key in this.relations) {
|
||||||
|
this.relations[key].remove();
|
||||||
|
delete this.relations[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the line element which represent the relation between items.
|
* Retrieve the line element which represent the relation between items.
|
||||||
* @param parentId Identifier of the parent item.
|
* @param parentId Identifier of the parent item.
|
||||||
|
|
Loading…
Reference in New Issue