UNPKG

rete-angular-plugin

Version:

Rete.js Angular plugin ==== [![Made in Ukraine](https://img.shields.io/badge/made_in-ukraine-ffd700.svg?labelColor=0057b7)](https://stand-with-ukraine.pp.ua) [![Discord](https://img.shields.io/discord/1081223198055604244?color=%237289da&label=Discord)](ht

120 lines 16.1 kB
import { Scope } from 'rete'; import { createCustomElement } from '@angular/elements'; import { reflect } from './reflect'; function getRenderer() { const elements = new WeakMap(); return { get(element) { return elements.get(element); }, mount(element, key, component, injector, props) { // LIMITATION: If an element is remounted with the same identifier, the component cannot be replaced let CustomElement = customElements.get(key); if (!CustomElement) { CustomElement = createCustomElement(component, { injector }); customElements.define(key, CustomElement); } const ngElement = new CustomElement(injector); Object.keys(props).forEach(key => { ngElement[key] = props[key]; }); element.appendChild(ngElement); elements.set(element, { key, ngElement }); }, update({ ngElement }, props) { Object.keys(props).forEach(key => { ngElement.ngElementStrategy.setInputValue(key, reflect(props[key])); }); }, unmount(element) { const existing = elements.get(element); if (existing) { existing.ngElement.remove(); elements.delete(element); } } }; } /** * Angular plugin. Renders nodes, connections and other elements using React. * @priority 9 * @emits connectionpath * @listens render * @listens unmount */ export class AngularPlugin extends Scope { /** * @constructor * @param params Plugin properties * @param params.injector Angular's Injector instance */ constructor(params) { super('angular-render'); this.params = params; this.presets = []; this.owners = new WeakMap(); this.renderer = getRenderer(); this.addPipe(context => { if (!context || typeof context !== 'object' || !('type' in context)) return context; if (context.type === 'unmount') { this.unmount(context.data.element); } else if (context.type === 'render') { if ('filled' in context.data && context.data.filled) { return context; } if (this.mount(context.data.element, context)) { return Object.assign(Object.assign({}, context), { data: Object.assign(Object.assign({}, context.data), { filled: true }) }); } } return context; }); } setParent(scope) { super.setParent(scope); this.presets.forEach(preset => { if (preset.attach) preset.attach(this); }); } unmount(element) { this.owners.delete(element); this.renderer.unmount(element); } mount(element, context) { const existing = this.renderer.get(element); if (existing) { this.presets.forEach(preset => { if (this.owners.get(element) !== preset) return; const result = preset.update(context, this); if (result) { this.renderer.update(existing, result); } }); return true; } for (const preset of this.presets) { const result = preset.mount(context, this); if (!result) continue; const { key, component, props } = result; this.renderer.mount(element, key, component, this.params.injector, props); this.owners.set(element, preset); return true; } return; } /** * Adds a preset to the plugin. * @param preset Preset that can render nodes, connections and other elements. */ addPreset(preset) { const local = preset; if (local.attach) local.attach(this); this.presets.push(local); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25nMTIvc3JjL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFnQyxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVwQyxTQUFTLFdBQVc7SUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUE7SUFFakQsT0FBTztRQUNMLEdBQUcsQ0FBQyxPQUFPO1lBQ1QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzlCLENBQUM7UUFDRCxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUs7WUFDNUMsb0dBQW9HO1lBQ3BHLElBQUksYUFBYSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFM0MsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDbEIsYUFBYSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7Z0JBQzVELGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFBO2FBQzFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUF5QyxDQUFBO1lBRXJGLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzdCLENBQUMsQ0FBQyxDQUFBO1lBRUYsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUM5QixR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QU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZVNjaGVtZXMsIENhbkFzc2lnblNpZ25hbCwgU2NvcGUgfSBmcm9tICdyZXRlJ1xuaW1wb3J0IHsgY3JlYXRlQ3VzdG9tRWxlbWVudCB9IGZyb20gJ0Bhbmd1bGFyL2VsZW1lbnRzJztcblxuaW1wb3J0IHsgTmdFbGVtZW50LCBOb2RlUHJvcHMsIFBvc2l0aW9uLCBSZW5kZXJTaWduYWwgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgUmVuZGVyUHJlc2V0IH0gZnJvbSAnLi9wcmVzZXRzL3R5cGVzJztcbmltcG9ydCB7IHJlZmxlY3QgfSBmcm9tICcuL3JlZmxlY3QnO1xuXG50eXBlIEl0ZW0gPSB7IGtleTogc3RyaW5nLCBuZ0VsZW1lbnQ6IE5nRWxlbWVudCB9XG5cbnR5cGUgUmVuZGVyZXIgPSB7XG4gIGdldChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEl0ZW0gfCB1bmRlZmluZWRcbiAgbW91bnQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGtleTogc3RyaW5nLCBjb21wb25lbnQ6IGFueSwgaW5qZWN0b3I6IEluamVjdG9yLCBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkXG4gIHVwZGF0ZShpdGVtOiBJdGVtLCBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkXG4gIHVubW91bnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkXG59XG5mdW5jdGlvbiBnZXRSZW5kZXJlcigpOiBSZW5kZXJlciB7XG4gIGNvbnN0IGVsZW1lbnRzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIEl0ZW0+KClcblxuICByZXR1cm4ge1xuICAgIGdldChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudHMuZ2V0KGVsZW1lbnQpXG4gICAgfSxcbiAgICBtb3VudChlbGVtZW50LCBrZXksIGNvbXBvbmVudCwgaW5qZWN0b3IsIHByb3BzKSB7XG4gICAgICAvLyBMSU1JVEFUSU9OOiBJZiBhbiBlbGVtZW50IGlzIHJlbW91bnRlZCB3aXRoIHRoZSBzYW1lIGlkZW50aWZpZXIsIHRoZSBjb21wb25lbnQgY2Fubm90IGJlIHJlcGxhY2VkXG4gICAgICBsZXQgQ3VzdG9tRWxlbWVudCA9IGN1c3RvbUVsZW1lbnRzLmdldChrZXkpXG4gICAgICBcbiAgICAgIGlmICghQ3VzdG9tRWxlbWVudCkge1xuICAgICAgICBDdXN0b21FbGVtZW50ID0gY3JlYXRlQ3VzdG9tRWxlbWVudChjb21wb25lbnQsIHsgaW5qZWN0b3IgfSlcbiAgICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGtleSwgQ3VzdG9tRWxlbWVudClcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmdFbGVtZW50ID0gbmV3IEN1c3RvbUVsZW1lbnQoaW5qZWN0b3IpIGFzIE5vZGVQcm9wcyAmIE5nRWxlbWVudCAmIHR5cGVvZiBwcm9wc1xuXG4gICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBuZ0VsZW1lbnRba2V5XSA9IHByb3BzW2tleV1cbiAgICAgIH0pXG5cbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobmdFbGVtZW50KVxuICAgICAgZWxlbWVudHMuc2V0KGVsZW1lbnQsIHsga2V5LCBuZ0VsZW1lbnQgfSlcbiAgICB9LFxuICAgIHVwZGF0ZSh7IG5nRWxlbWVudCB9LCBwcm9wcykge1xuICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgbmdFbGVtZW50Lm5nRWxlbWVudFN0cmF0ZWd5LnNldElucHV0VmFsdWUoa2V5LCByZWZsZWN0KHByb3BzW2tleV0pKVxuICAgICAgfSlcbiAgICB9LFxuICAgIHVubW91bnQoZWxlbWVudCkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBlbGVtZW50cy5nZXQoZWxlbWVudClcblxuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIGV4aXN0aW5nLm5nRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBlbGVtZW50cy5kZWxldGUoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTaWduYWxzIHRoYXQgY2FuIGJlIGVtaXR0ZWQgYnkgdGhlIHBsdWdpblxuICogQHByaW9yaXR5IDEwXG4gKi9cbmV4cG9ydCB0eXBlIFByb2R1Y2VzPFNjaGVtZXMgZXh0ZW5kcyBCYXNlU2NoZW1lcz4gPVxuICB8IHsgdHlwZTogJ2Nvbm5lY3Rpb25wYXRoJywgZGF0YTogeyBwYXlsb2FkOiBTY2hlbWVzWydDb25uZWN0aW9uJ10sIHBhdGg/OiBzdHJpbmcsIHBvaW50czogUG9zaXRpb25bXSB9IH1cblxudHlwZSBSZXF1aXJlczxTY2hlbWVzIGV4dGVuZHMgQmFzZVNjaGVtZXM+ID1cbiAgfCBSZW5kZXJTaWduYWw8J25vZGUnLCB7IHBheWxvYWQ6IFNjaGVtZXNbJ05vZGUnXSB9PlxuICB8IFJlbmRlclNpZ25hbDwnY29ubmVjdGlvbicsIHsgcGF5bG9hZDogU2NoZW1lc1snQ29ubmVjdGlvbiddLCBzdGFydD86IFBvc2l0aW9uLCBlbmQ/OiBQb3NpdGlvbiB9PlxuICB8IHsgdHlwZTogJ3VubW91bnQnLCBkYXRhOiB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50IH0gfVxuXG4vKipcbiAqIEFuZ3VsYXIgcGx1Z2luLiBSZW5kZXJzIG5vZGVzLCBjb25uZWN0aW9ucyBhbmQgb3RoZXIgZWxlbWVudHMgdXNpbmcgUmVhY3QuXG4gKiBAcHJpb3JpdHkgOVxuICogQGVtaXRzIGNvbm5lY3Rpb25wYXRoXG4gKiBAbGlzdGVucyByZW5kZXJcbiAqIEBsaXN0ZW5zIHVubW91bnRcbiAqL1xuZXhwb3J0IGNsYXNzIEFuZ3VsYXJQbHVnaW48U2NoZW1lcyBleHRlbmRzIEJhc2VTY2hlbWVzLCBUID0gUmVxdWlyZXM8U2NoZW1lcz4+IGV4dGVuZHMgU2NvcGU8UHJvZHVjZXM8U2NoZW1lcz4sIFtSZXF1aXJlczxTY2hlbWVzPiB8IFRdPiB7XG4gIHByZXNldHM6IFJlbmRlclByZXNldDxTY2hlbWVzLCBUPltdID0gW11cbiAgcmVuZGVyZXI6IFJlbmRlcmVyXG4gIG93bmVycyA9IG5ldyBXZWFrTWFwPEhUTUxFbGVtZW50LCBSZW5kZXJQcmVzZXQ8U2NoZW1lcywgVD4+KClcblxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBwYXJhbXMgUGx1Z2luIHByb3BlcnRpZXNcbiAgICogQHBhcmFtIHBhcmFtcy5pbmplY3RvciBBbmd1bGFyJ3MgSW5qZWN0b3IgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFyYW1zOiB7IGluamVjdG9yOiBJbmplY3RvciB9KSB7XG4gICAgc3VwZXIoJ2FuZ3VsYXItcmVuZGVyJylcbiAgICB0aGlzLnJlbmRlcmVyID0gZ2V0UmVuZGVyZXIoKVxuXG4gICAgdGhpcy5hZGRQaXBlKGNvbnRleHQgPT4ge1xuICAgICAgaWYgKCFjb250ZXh0IHx8IHR5cGVvZiBjb250ZXh0ICE9PSAnb2JqZWN0JyB8fCAhKCd0eXBlJyBpbiBjb250ZXh0KSkgcmV0dXJuIGNvbnRleHRcbiAgICAgIGlmIChjb250ZXh0LnR5cGUgPT09ICd1bm1vdW50Jykge1xuICAgICAgICB0aGlzLnVubW91bnQoY29udGV4dC5kYXRhLmVsZW1lbnQpXG4gICAgICB9IGVsc2UgaWYgKGNvbnRleHQudHlwZSA9PT0gJ3JlbmRlcicpIHtcbiAgICAgICAgaWYgKCdmaWxsZWQnIGluIGNvbnRleHQuZGF0YSAmJiBjb250ZXh0LmRhdGEuZmlsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHRcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb3VudChjb250ZXh0LmRhdGEuZWxlbWVudCwgY29udGV4dCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgLi4uY29udGV4dC5kYXRhLFxuICAgICAgICAgICAgICBmaWxsZWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGFzIHR5cGVvZiBjb250ZXh0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZXh0XG4gICAgfSlcbiAgfVxuXG4gIHNldFBhcmVudChzY29wZTogU2NvcGU8UmVxdWlyZXM8U2NoZW1lcz4gfCBUPik6IHZvaWQge1xuICAgIHN1cGVyLnNldFBhcmVudChzY29wZSlcblxuICAgIHRoaXMucHJlc2V0cy5mb3JFYWNoKHByZXNldCA9PiB7XG4gICAgICBpZiAocHJlc2V0LmF0dGFjaCkgcHJlc2V0LmF0dGFjaCh0aGlzKVxuICAgIH0pXG4gIH1cblxuXG4gIHByaXZhdGUgdW5tb3VudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMub3duZXJzLmRlbGV0ZShlbGVtZW50KVxuICAgIHRoaXMucmVuZGVyZXIudW5tb3VudChlbGVtZW50KVxuICB9XG5cbiAgcHJpdmF0ZSBtb3VudChlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGV4dDogUmVxdWlyZXM8U2NoZW1lcz4pIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMucmVuZGVyZXIuZ2V0KGVsZW1lbnQpXG5cbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHRoaXMucHJlc2V0cy5mb3JFYWNoKHByZXNldCA9PiB7XG4gICAgICAgIGlmICh0aGlzLm93bmVycy5nZXQoZWxlbWVudCkgIT09IHByZXNldCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHByZXNldC51cGRhdGUoY29udGV4dCBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgeyB0eXBlOiAncmVuZGVyJyB9PiwgdGhpcylcblxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGUoZXhpc3RpbmcsIHJlc3VsdClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcmVzZXQgb2YgdGhpcy5wcmVzZXRzKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcmVzZXQubW91bnQoY29udGV4dCBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgeyB0eXBlOiAncmVuZGVyJyB9PiwgdGhpcylcblxuICAgICAgaWYgKCFyZXN1bHQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHsga2V5LCBjb21wb25lbnQsIHByb3BzIH0gPSByZXN1bHRcblxuICAgICAgdGhpcy5yZW5kZXJlci5tb3VudChlbGVtZW50LCBrZXksIGNvbXBvbmVudCwgdGhpcy5wYXJhbXMuaW5qZWN0b3IsIHByb3BzKVxuXG4gICAgICB0aGlzLm93bmVycy5zZXQoZWxlbWVudCwgcHJlc2V0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByZXNldCB0byB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gcHJlc2V0IFByZXNldCB0aGF0IGNhbiByZW5kZXIgbm9kZXMsIGNvbm5lY3Rpb25zIGFuZCBvdGhlciBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBhZGRQcmVzZXQ8Sz4ocHJlc2V0OiBSZW5kZXJQcmVzZXQ8U2NoZW1lcywgQ2FuQXNzaWduU2lnbmFsPFQsIEs+IGV4dGVuZHMgdHJ1ZSA/IEsgOiAnQ2Fubm90IGFwcGx5IHByZXNldC4gUHJvdmlkZWQgc2lnbmFscyBhcmUgbm90IGNvbXBhdGlibGUnPikge1xuICAgIGNvbnN0IGxvY2FsID0gcHJlc2V0IGFzIHVua25vd24gYXMgUmVuZGVyUHJlc2V0PFNjaGVtZXMsIFQ+XG5cbiAgICBpZiAobG9jYWwuYXR0YWNoKSBsb2NhbC5hdHRhY2godGhpcylcbiAgICB0aGlzLnByZXNldHMucHVzaChsb2NhbClcbiAgfVxufVxuIl19