@dotglitch/ngx-common 1.1.39 → 1.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { AfterViewInit, OnChanges, OnDestroy, SimpleChanges, ViewContainerRef } from '@angular/core';
1
+ import { AfterViewInit, ApplicationRef, Injector, OnChanges, OnDestroy, SimpleChanges, Type, ViewContainerRef } from '@angular/core';
2
2
  import * as React from 'react';
3
3
  import { ThemeService } from '../../services/theme.service';
4
4
  import * as i0 from "@angular/core";
@@ -13,6 +13,24 @@ import * as i0 from "@angular/core";
13
13
  export declare class ReactMagicWrapperComponent implements OnChanges, OnDestroy, AfterViewInit {
14
14
  private ngContainer;
15
15
  private ngTheme;
16
+ /**
17
+ * Wrap an angular component inside of a React memo object.
18
+ * Will attempt to bind @Input and @Output properties if provided,
19
+ * and will bind the react arguments directly as @Input properties.
20
+ *
21
+ * @experimental
22
+ * @param componentClass Angular component
23
+ * @param envInjector An `EnvironmentInjector` instance to be used for the component
24
+ * @param injector An `ElementInjector` instance
25
+ * @param _inputs
26
+ * @param _outputs
27
+ * @returns
28
+ */
29
+ static WrapAngularComponent: (componentClass: Type<any>, appRef: Omit<ApplicationRef, '_runningTick'>, injector: Injector, _inputs?: {
30
+ [key: string]: any;
31
+ }, _outputs?: {
32
+ [key: string]: Function;
33
+ }, additionalChildren?: React.ReactNode[]) => React.NamedExoticComponent<object>;
16
34
  /**
17
35
  * The react component to be wrapped.
18
36
  * ! Must be overridden for this wrapper to work
@@ -1,6 +1,7 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, createComponent } from '@angular/core';
2
2
  import * as React from 'react';
3
3
  import { createRoot } from 'react-dom/client';
4
+ import { ulid } from 'ulidx';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "../../services/theme.service";
6
7
  /**
@@ -12,6 +13,65 @@ import * as i1 from "../../services/theme.service";
12
13
  * `override readonly ngReactComponent = ReactFlowWrappableComponent;`
13
14
  */
14
15
  export class ReactMagicWrapperComponent {
16
+ /**
17
+ * Wrap an angular component inside of a React memo object.
18
+ * Will attempt to bind @Input and @Output properties if provided,
19
+ * and will bind the react arguments directly as @Input properties.
20
+ *
21
+ * @experimental
22
+ * @param componentClass Angular component
23
+ * @param envInjector An `EnvironmentInjector` instance to be used for the component
24
+ * @param injector An `ElementInjector` instance
25
+ * @param _inputs
26
+ * @param _outputs
27
+ * @returns
28
+ */
29
+ static { this.WrapAngularComponent = (componentClass, appRef, injector, _inputs = {}, _outputs = {}, additionalChildren = []) => React.memo((args) => {
30
+ const id = ulid();
31
+ React.useEffect(() => {
32
+ const component = createComponent(componentClass, {
33
+ environmentInjector: appRef.injector,
34
+ elementInjector: injector,
35
+ hostElement: document.getElementById(id)
36
+ });
37
+ appRef.attachView(component.hostView);
38
+ // @ts-ignore
39
+ // component.hostView = hostView;
40
+ Object.assign(_inputs, args);
41
+ const { inputs, outputs } = componentClass['ɵcmp'];
42
+ // Returns a list of entries that need to be set
43
+ // This makes it so that unnecessary setters are not invoked.
44
+ const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
45
+ return component.instance[childKey] != _inputs[parentKey];
46
+ });
47
+ updated.forEach(([parentKey, childKey]) => {
48
+ if (_inputs.hasOwnProperty(parentKey))
49
+ component.instance[childKey] = _inputs[parentKey];
50
+ });
51
+ const outputSubscriptions = {};
52
+ // Get a list of unregistered outputs
53
+ const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
54
+ return !outputSubscriptions[parentKey];
55
+ });
56
+ // Reverse bind via subscription
57
+ newOutputs.forEach(([parentKey, childKey]) => {
58
+ if (_outputs.hasOwnProperty(parentKey)) {
59
+ const target = component.instance[childKey];
60
+ const outputs = _outputs;
61
+ const sub = target.subscribe(outputs[parentKey]); // Subscription
62
+ outputSubscriptions[parentKey] = sub;
63
+ }
64
+ });
65
+ // Wrap the destroy method to safely release the subscriptions
66
+ const originalDestroy = component.onDestroy?.bind(component);
67
+ component.onDestroy = (cb) => {
68
+ Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
69
+ originalDestroy?.(cb);
70
+ };
71
+ component.changeDetectorRef.detectChanges();
72
+ }, []);
73
+ return React.createElement('div', {}, React.createElement("div", { id }), ...additionalChildren);
74
+ }); }
15
75
  constructor(ngContainer, ngTheme) {
16
76
  this.ngContainer = ngContainer;
17
77
  this.ngTheme = ngTheme;
@@ -68,4 +128,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
68
128
  standalone: true
69
129
  }]
70
130
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i1.ThemeService }] });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtbWFnaWMtd3JhcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvcmVhY3QtbWFnaWMtd3JhcHBlci9yZWFjdC1tYWdpYy13cmFwcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBeUQsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGtCQUFrQixDQUFDOzs7QUFJcEQ7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTywwQkFBMEI7SUFpQm5DLFlBQ1ksV0FBNkIsRUFDN0IsT0FBcUI7UUFEckIsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLFlBQU8sR0FBUCxPQUFPLENBQWM7UUFUekIsb0JBQWUsR0FBRztZQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQztTQUNMLENBQUM7SUFNRixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXVCO1FBQy9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsT0FBTztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpFLHVDQUF1QztRQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkQsNENBQTRDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLDBDQUEwQztRQUMxQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFDLDJCQUEyQjtRQUMzQixvREFBb0Q7UUFDcEQsc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRixDQUFDOzhHQWpFUSwwQkFBMEI7a0dBQTFCLDBCQUEwQix3R0FIekIsRUFBRTs7MkZBR0gsMEJBQTBCO2tCQUx0QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFFBQVEsRUFBRSxFQUFFO29CQUNaLFVBQVUsRUFBRSxJQUFJO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVJvb3QsIFJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcblxuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGhlbWUuc2VydmljZSc7XG5cbi8qKlxuICogRXh0ZW5kIHRoaXMgY29tcG9uZW50IHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVcbiAqIGJpbmRpbmdzIHRvIGEgUmVhY3QgY29tcG9uZW50LlxuICpcbiAqICEgWW91IF9tdXN0XyBvdmVycmlkZSB0aGUgcHJvcGVydHkgYG5nUmVhY3RDb21wb25lbnRgXG4gKiBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGVycm9yc1xuICogYG92ZXJyaWRlIHJlYWRvbmx5IG5nUmVhY3RDb21wb25lbnQgPSBSZWFjdEZsb3dXcmFwcGFibGVDb21wb25lbnQ7YFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1yZWFjdC1tYWdpYy13cmFwcGVyJyxcbiAgICB0ZW1wbGF0ZTogYGAsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBSZWFjdE1hZ2ljV3JhcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFjdCBjb21wb25lbnQgdG8gYmUgd3JhcHBlZC5cbiAgICAgKiAhIE11c3QgYmUgb3ZlcnJpZGRlbiBmb3IgdGhpcyB3cmFwcGVyIHRvIHdvcmtcbiAgICAgKi9cbiAgICBuZ1JlYWN0Q29tcG9uZW50OiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudDxhbnk+IHwgUmVhY3QuQ29tcG9uZW50Q2xhc3M8YW55PiB8IHN0cmluZztcblxuICAgIHByaXZhdGUgX3Jvb3Q6IFJvb3Q7XG4gICAgcHVibGljIHRoZW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBuZ1N1YnNjcmlwdGlvbnMgPSBbXG4gICAgICAgIHRoaXMubmdUaGVtZS5zdWJzY3JpYmUodCA9PiB7XG4gICAgICAgICAgICB0aGlzLnRoZW1lID0gdDtcbiAgICAgICAgICAgIHRoaXMubmdPbkNoYW5nZXMoKTtcbiAgICAgICAgfSlcbiAgICBdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbmdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgbmdUaGVtZTogVGhlbWVTZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ1JlYWN0Q29tcG9uZW50KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3RNYWdpY1dyYXBwZXJDb21wb25lbnQgY2Fubm90IHN0YXJ0IHdpdGhvdXQgYSBwcm92aWRlZCBuZ1JlYWN0Q29tcG9uZW50IVwiKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzPzogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9yb290LnVubW91bnQoKTtcbiAgICAgICAgdGhpcy5uZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMubmdSZWFjdENvbXBvbmVudCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBjcmVhdGVSb290KHRoaXMubmdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpc3QgYWxsIGtleXMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgX2Agbm9yIGBuZ2BcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpLmZpbHRlcihrID0+ICEvXig/Ol98bmcpLy50ZXN0KGspKTtcblxuICAgICAgICAvLyBHZXQgYWxsIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgY29uc3QgcHJvcEtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFrLnN0YXJ0c1dpdGgoXCJvblwiKSk7XG4gICAgICAgIC8vIEdldCBhbGwgZXZlbnQgaGFuZGxlciBrZXlzIGZyb20gdGhlIGNsYXNzXG4gICAgICAgIGNvbnN0IGV2dEtleXMgPSBrZXlzLmZpbHRlcihrID0+IGsuc3RhcnRzV2l0aChcIm9uXCIpKTtcblxuICAgICAgICBjb25zdCBwcm9wcyA9IHt9O1xuICAgICAgICAvLyBQcm9qZWN0IGFsbCBrZXkgcHJvcGVydGllcyBvbnRvIGBwcm9wc2BcbiAgICAgICAgcHJvcEtleXMuZm9yRWFjaChrID0+IHByb3BzW2tdID0gdGhpc1trXSk7XG5cbiAgICAgICAgLy8gQmluZCBhbGwgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgIC8vICEgaW1wb3J0YW50IEFuZ3VsYXIgdXNlcyBFdmVudEVtaXR0ZXIsIFJlYWN0IHVzZXNcbiAgICAgICAgLy8gYSBkaWZmZXJlbnQgbWV0aG9kIG9mIGV2ZW50IGJpbmRpbmdcbiAgICAgICAgZXZ0S2V5cy5mb3JFYWNoKGsgPT4gcHJvcHNba10gPSAoLi4uYXJncykgPT4gdGhpc1trXS5uZXh0KGFyZ3MpKTtcblxuICAgICAgICB0aGlzLl9yb290LnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KHRoaXMubmdSZWFjdENvbXBvbmVudCwgeyBwcm9wczogcHJvcHMgYXMgYW55IH0pKTtcbiAgICB9XG59XG4iXX0=
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtbWFnaWMtd3JhcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvcmVhY3QtbWFnaWMtd3JhcHBlci9yZWFjdC1tYWdpYy13cmFwcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlDLFNBQVMsRUFBK0ksZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZPLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxrQkFBa0IsQ0FBQztBQUdwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDOzs7QUFHN0I7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTywwQkFBMEI7SUFFbkM7Ozs7Ozs7Ozs7OztPQVlHO2FBQ0kseUJBQW9CLEdBQUcsQ0FDMUIsY0FBeUIsRUFDekIsTUFBNEMsRUFDNUMsUUFBa0IsRUFDbEIsVUFBa0MsRUFBRSxFQUNwQyxXQUF3QyxFQUFFLEVBQzFDLHFCQUF3QyxFQUFFLEVBQzVDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFFckIsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDbEIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDakIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLGNBQWMsRUFBRTtnQkFDOUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3BDLGVBQWUsRUFBRSxRQUFRO2dCQUN6QixXQUFXLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7YUFDM0MsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsYUFBYTtZQUNi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Q0FBQyxDQUFDLENBQUM7UUFDdkQsNENBQTRDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLDBDQUEwQztRQUMxQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFDLDJCQUEyQjtRQUMzQixvREFBb0Q7UUFDcEQsc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRixDQUFDOzhHQXJKUSwwQkFBMEI7a0dBQTFCLDBCQUEwQix3R0FIekIsRUFBRTs7MkZBR0gsMEJBQTBCO2tCQUx0QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFFBQVEsRUFBRSxFQUFFO29CQUNaLFVBQVUsRUFBRSxJQUFJO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIEFwcGxpY2F0aW9uUmVmLCBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRW52aXJvbm1lbnRJbmplY3RvciwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFR5cGUsIFZpZXdDb250YWluZXJSZWYsIFZpZXdSZWYsIGNyZWF0ZUNvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCwgUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IHVsaWQgfSBmcm9tICd1bGlkeCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBFeHRlbmQgdGhpcyBjb21wb25lbnQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZVxuICogYmluZGluZ3MgdG8gYSBSZWFjdCBjb21wb25lbnQuXG4gKlxuICogISBZb3UgX211c3RfIG92ZXJyaWRlIHRoZSBwcm9wZXJ0eSBgbmdSZWFjdENvbXBvbmVudGBcbiAqIEZhaWx1cmUgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gZXJyb3JzXG4gKiBgb3ZlcnJpZGUgcmVhZG9ubHkgbmdSZWFjdENvbXBvbmVudCA9IFJlYWN0Rmxvd1dyYXBwYWJsZUNvbXBvbmVudDtgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXJlYWN0LW1hZ2ljLXdyYXBwZXInLFxuICAgIHRlbXBsYXRlOiBgYCxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFJlYWN0TWFnaWNXcmFwcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogV3JhcCBhbiBhbmd1bGFyIGNvbXBvbmVudCBpbnNpZGUgb2YgYSBSZWFjdCBtZW1vIG9iamVjdC5cbiAgICAgKiBXaWxsIGF0dGVtcHQgdG8gYmluZCBASW5wdXQgYW5kIEBPdXRwdXQgcHJvcGVydGllcyBpZiBwcm92aWRlZCxcbiAgICAgKiBhbmQgd2lsbCBiaW5kIHRoZSByZWFjdCBhcmd1bWVudHMgZGlyZWN0bHkgYXMgQElucHV0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogQHBhcmFtIGNvbXBvbmVudENsYXNzIEFuZ3VsYXIgY29tcG9uZW50XG4gICAgICogQHBhcmFtIGVudkluamVjdG9yICAgIEFuIGBFbnZpcm9ubWVudEluamVjdG9yYCBpbnN0YW5jZSB0byBiZSB1c2VkIGZvciB0aGUgY29tcG9uZW50XG4gICAgICogQHBhcmFtIGluamVjdG9yICAgICAgIEFuIGBFbGVtZW50SW5qZWN0b3JgIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF9pbnB1dHNcbiAgICAgKiBAcGFyYW0gX291dHB1dHNcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHN0YXRpYyBXcmFwQW5ndWxhckNvbXBvbmVudCA9IChcbiAgICAgICAgY29tcG9uZW50Q2xhc3M6IFR5cGU8YW55PixcbiAgICAgICAgYXBwUmVmOiBPbWl0PEFwcGxpY2F0aW9uUmVmLCAnX3J1bm5pbmdUaWNrJz4sXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgX2lucHV0czogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgICAgICBfb3V0cHV0czogeyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9ID0ge30sXG4gICAgICAgIGFkZGl0aW9uYWxDaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlW10gPSBbXVxuICAgICkgPT4gUmVhY3QubWVtbygoYXJncykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGlkID0gdWxpZCgpO1xuICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzLCB7XG4gICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogYXBwUmVmLmluamVjdG9yLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmplY3RvcjogaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgaG9zdEVsZW1lbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudC5ob3N0Vmlldyk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wb25lbnQuaG9zdFZpZXcgPSBob3N0VmlldztcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihfaW5wdXRzLCBhcmdzKTtcblxuICAgICAgICAgICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMgfSA9IGNvbXBvbmVudENsYXNzWyfJtWNtcCddO1xuXG4gICAgICAgICAgICAvLyBSZXR1cm5zIGEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgbmVlZCB0byBiZSBzZXRcbiAgICAgICAgICAgIC8vIFRoaXMgbWFrZXMgaXQgc28gdGhhdCB1bm5lY2Vzc2FyeSBzZXR0ZXJzIGFyZSBub3QgaW52b2tlZC5cbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZpbHRlcigoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pbnN0YW5jZVtjaGlsZEtleV0gIT0gX2lucHV0c1twYXJlbnRLZXldO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHVwZGF0ZWQuZm9yRWFjaCgoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKF9pbnB1dHMuaGFzT3duUHJvcGVydHkocGFyZW50S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lmluc3RhbmNlW2NoaWxkS2V5XSA9IF9pbnB1dHNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRTdWJzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IFN1YnNjcmlwdGlvbiB9ID0ge307XG4gICAgICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBvdXRwdXRzXG4gICAgICAgICAgICBjb25zdCBuZXdPdXRwdXRzID0gT2JqZWN0LmVudHJpZXMob3V0cHV0cykuZmlsdGVyKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIW91dHB1dFN1YnNjcmlwdGlvbnNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBSZXZlcnNlIGJpbmQgdmlhIHN1YnNjcmlwdGlvblxuICAgICAgICAgICAgbmV3T3V0cHV0cy5mb3JFYWNoKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoX291dHB1dHMuaGFzT3duUHJvcGVydHkocGFyZW50S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQ6IEV2ZW50RW1pdHRlcjx1bmtub3duPiA9IGNvbXBvbmVudC5pbnN0YW5jZVtjaGlsZEtleV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBfb3V0cHV0cztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWIgPSB0YXJnZXQuc3Vic2NyaWJlKG91dHB1dHNbcGFyZW50S2V5XSk7IC8vIFN1YnNjcmlwdGlvblxuXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFN1YnNjcmlwdGlvbnNbcGFyZW50S2V5XSA9IHN1YjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gV3JhcCB0aGUgZGVzdHJveSBtZXRob2QgdG8gc2FmZWx5IHJlbGVhc2UgdGhlIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5vbkRlc3Ryb3k/LmJpbmQoY29tcG9uZW50KTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vbkRlc3Ryb3kgPSAoY2IpID0+IHtcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKG91dHB1dFN1YnNjcmlwdGlvbnMpLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKGNiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29tcG9uZW50LmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgaWQgfSksXG4gICAgICAgICAgICAuLi5hZGRpdGlvbmFsQ2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFjdCBjb21wb25lbnQgdG8gYmUgd3JhcHBlZC5cbiAgICAgKiAhIE11c3QgYmUgb3ZlcnJpZGRlbiBmb3IgdGhpcyB3cmFwcGVyIHRvIHdvcmtcbiAgICAgKi9cbiAgICBuZ1JlYWN0Q29tcG9uZW50OiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudDxhbnk+IHwgUmVhY3QuQ29tcG9uZW50Q2xhc3M8YW55PiB8IHN0cmluZztcblxuICAgIHByaXZhdGUgX3Jvb3Q6IFJvb3Q7XG4gICAgcHVibGljIHRoZW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBuZ1N1YnNjcmlwdGlvbnMgPSBbXG4gICAgICAgIHRoaXMubmdUaGVtZS5zdWJzY3JpYmUodCA9PiB7XG4gICAgICAgICAgICB0aGlzLnRoZW1lID0gdDtcbiAgICAgICAgICAgIHRoaXMubmdPbkNoYW5nZXMoKTtcbiAgICAgICAgfSlcbiAgICBdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbmdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgbmdUaGVtZTogVGhlbWVTZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ1JlYWN0Q29tcG9uZW50KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3RNYWdpY1dyYXBwZXJDb21wb25lbnQgY2Fubm90IHN0YXJ0IHdpdGhvdXQgYSBwcm92aWRlZCBuZ1JlYWN0Q29tcG9uZW50IVwiKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzPzogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9yb290LnVubW91bnQoKTtcbiAgICAgICAgdGhpcy5uZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMubmdSZWFjdENvbXBvbmVudCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBjcmVhdGVSb290KHRoaXMubmdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpc3QgYWxsIGtleXMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgX2Agbm9yIGBuZ2BcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpLmZpbHRlcihrID0+ICEvXig/Ol98bmcpLy50ZXN0KGspKTtcblxuICAgICAgICAvLyBHZXQgYWxsIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgY29uc3QgcHJvcEtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFrLnN0YXJ0c1dpdGgoXCJvblwiKSk7XG4gICAgICAgIC8vIEdldCBhbGwgZXZlbnQgaGFuZGxlciBrZXlzIGZyb20gdGhlIGNsYXNzXG4gICAgICAgIGNvbnN0IGV2dEtleXMgPSBrZXlzLmZpbHRlcihrID0+IGsuc3RhcnRzV2l0aChcIm9uXCIpKTtcblxuICAgICAgICBjb25zdCBwcm9wcyA9IHt9O1xuICAgICAgICAvLyBQcm9qZWN0IGFsbCBrZXkgcHJvcGVydGllcyBvbnRvIGBwcm9wc2BcbiAgICAgICAgcHJvcEtleXMuZm9yRWFjaChrID0+IHByb3BzW2tdID0gdGhpc1trXSk7XG5cbiAgICAgICAgLy8gQmluZCBhbGwgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgIC8vICEgaW1wb3J0YW50IEFuZ3VsYXIgdXNlcyBFdmVudEVtaXR0ZXIsIFJlYWN0IHVzZXNcbiAgICAgICAgLy8gYSBkaWZmZXJlbnQgbWV0aG9kIG9mIGV2ZW50IGJpbmRpbmdcbiAgICAgICAgZXZ0S2V5cy5mb3JFYWNoKGsgPT4gcHJvcHNba10gPSAoLi4uYXJncykgPT4gdGhpc1trXS5uZXh0KGFyZ3MpKTtcblxuICAgICAgICB0aGlzLl9yb290LnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KHRoaXMubmdSZWFjdENvbXBvbmVudCwgeyBwcm9wczogcHJvcHMgYXMgYW55IH0pKTtcbiAgICB9XG59XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { TemplateRef, Component, Optional, Inject, Input, HostListener, Directive, InjectionToken, Pipe, Injectable, EventEmitter, isDevMode, ViewContainerRef, ViewChild, Output, NgModule, ViewEncapsulation, SecurityContext, ContentChild, ViewChildren } from '@angular/core';
2
+ import { TemplateRef, Component, Optional, Inject, Input, HostListener, Directive, InjectionToken, Pipe, Injectable, EventEmitter, isDevMode, ViewContainerRef, ViewChild, Output, NgModule, ViewEncapsulation, SecurityContext, ContentChild, ViewChildren, createComponent } from '@angular/core';
3
3
  import * as i1$1 from '@angular/material/dialog';
4
4
  import { MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
5
5
  import { NgTemplateOutlet, NgComponentOutlet, DOCUMENT, NgIf, NgForOf, DatePipe } from '@angular/common';
@@ -11597,6 +11597,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
11597
11597
  * `override readonly ngReactComponent = ReactFlowWrappableComponent;`
11598
11598
  */
11599
11599
  class ReactMagicWrapperComponent {
11600
+ /**
11601
+ * Wrap an angular component inside of a React memo object.
11602
+ * Will attempt to bind @Input and @Output properties if provided,
11603
+ * and will bind the react arguments directly as @Input properties.
11604
+ *
11605
+ * @experimental
11606
+ * @param componentClass Angular component
11607
+ * @param envInjector An `EnvironmentInjector` instance to be used for the component
11608
+ * @param injector An `ElementInjector` instance
11609
+ * @param _inputs
11610
+ * @param _outputs
11611
+ * @returns
11612
+ */
11613
+ static { this.WrapAngularComponent = (componentClass, appRef, injector, _inputs = {}, _outputs = {}, additionalChildren = []) => React.memo((args) => {
11614
+ const id = ulid();
11615
+ React.useEffect(() => {
11616
+ const component = createComponent(componentClass, {
11617
+ environmentInjector: appRef.injector,
11618
+ elementInjector: injector,
11619
+ hostElement: document.getElementById(id)
11620
+ });
11621
+ appRef.attachView(component.hostView);
11622
+ // @ts-ignore
11623
+ // component.hostView = hostView;
11624
+ Object.assign(_inputs, args);
11625
+ const { inputs, outputs } = componentClass['ɵcmp'];
11626
+ // Returns a list of entries that need to be set
11627
+ // This makes it so that unnecessary setters are not invoked.
11628
+ const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
11629
+ return component.instance[childKey] != _inputs[parentKey];
11630
+ });
11631
+ updated.forEach(([parentKey, childKey]) => {
11632
+ if (_inputs.hasOwnProperty(parentKey))
11633
+ component.instance[childKey] = _inputs[parentKey];
11634
+ });
11635
+ const outputSubscriptions = {};
11636
+ // Get a list of unregistered outputs
11637
+ const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
11638
+ return !outputSubscriptions[parentKey];
11639
+ });
11640
+ // Reverse bind via subscription
11641
+ newOutputs.forEach(([parentKey, childKey]) => {
11642
+ if (_outputs.hasOwnProperty(parentKey)) {
11643
+ const target = component.instance[childKey];
11644
+ const outputs = _outputs;
11645
+ const sub = target.subscribe(outputs[parentKey]); // Subscription
11646
+ outputSubscriptions[parentKey] = sub;
11647
+ }
11648
+ });
11649
+ // Wrap the destroy method to safely release the subscriptions
11650
+ const originalDestroy = component.onDestroy?.bind(component);
11651
+ component.onDestroy = (cb) => {
11652
+ Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
11653
+ originalDestroy?.(cb);
11654
+ };
11655
+ component.changeDetectorRef.detectChanges();
11656
+ }, []);
11657
+ return React.createElement('div', {}, React.createElement("div", { id }), ...additionalChildren);
11658
+ }); }
11600
11659
  constructor(ngContainer, ngTheme) {
11601
11660
  this.ngContainer = ngContainer;
11602
11661
  this.ngTheme = ngTheme;