ngx-vflow 1.16.3 → 2.0.0
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.
- package/README.md +35 -69
- package/fesm2022/ngx-vflow-testing.mjs +77 -67
- package/fesm2022/ngx-vflow-testing.mjs.map +1 -1
- package/fesm2022/ngx-vflow.mjs +926 -559
- package/fesm2022/ngx-vflow.mjs.map +1 -1
- package/lib/vflow/components/custom-node-base/custom-node-base.component.d.ts +1 -1
- package/lib/vflow/components/vflow/vflow.component.d.ts +18 -9
- package/lib/vflow/directives/auto-pan.directive.d.ts +16 -0
- package/lib/vflow/directives/changes-controller.directive.d.ts +13 -87
- package/lib/vflow/directives/connection-controller.directive.d.ts +8 -10
- package/lib/vflow/directives/space-point-context.directive.d.ts +2 -1
- package/lib/vflow/interfaces/component-node-event.interface.d.ts +1 -2
- package/lib/vflow/interfaces/connection-events.interface.d.ts +66 -0
- package/lib/vflow/interfaces/connection-settings.interface.d.ts +7 -1
- package/lib/vflow/interfaces/connection.interface.d.ts +0 -5
- package/lib/vflow/interfaces/curve-factory.interface.d.ts +2 -2
- package/lib/vflow/interfaces/edge-label.interface.d.ts +0 -4
- package/lib/vflow/interfaces/edge.interface.d.ts +36 -8
- package/lib/vflow/interfaces/node.interface.d.ts +44 -63
- package/lib/vflow/interfaces/selection-strategy.interface.d.ts +16 -0
- package/lib/vflow/interfaces/template-context.interface.d.ts +8 -3
- package/lib/vflow/models/connection.model.d.ts +1 -1
- package/lib/vflow/models/edge.model.d.ts +20 -23
- package/lib/vflow/models/handle.model.d.ts +1 -1
- package/lib/vflow/models/node.model.d.ts +4 -7
- package/lib/vflow/public-components/custom-node/custom-node.component.d.ts +1 -1
- package/lib/vflow/public-components/custom-template-edge/custom-template-edge.component.d.ts +2 -1
- package/lib/vflow/public-components/minimap/minimap.component.d.ts +1 -1
- package/lib/vflow/services/draggable.service.d.ts +3 -0
- package/lib/vflow/services/flow-entities.service.d.ts +2 -2
- package/lib/vflow/services/flow-settings.service.d.ts +3 -0
- package/lib/vflow/services/flow-status.service.d.ts +35 -7
- package/lib/vflow/services/selection.service.d.ts +4 -1
- package/lib/vflow/strategies/default-selection.strategy.d.ts +6 -0
- package/lib/vflow/strategies/manual-selection.strategy.d.ts +5 -0
- package/lib/vflow/types/selection-mode.type.d.ts +1 -0
- package/lib/vflow/types/unwrap-signal.type.d.ts +4 -0
- package/lib/vflow/utils/adjust-direction.d.ts +2 -6
- package/lib/vflow/utils/identity-checker/reference-identity-checker.d.ts +2 -2
- package/lib/vflow/utils/is-vflow-component.d.ts +0 -2
- package/lib/vflow/utils/signals/to-lazy-signal.d.ts +4 -4
- package/package.json +3 -7
- package/public-api.d.ts +3 -2
- package/testing/component-mocks/vflow-mock.component.d.ts +8 -6
- package/testing/directive-mocks/connection-controller-mock.directive.d.ts +8 -6
- package/esm2022/lib/vflow/components/alignment-helper/alignment-helper.component.mjs +0 -103
- package/esm2022/lib/vflow/components/background/background.component.mjs +0 -121
- package/esm2022/lib/vflow/components/connection/connection.component.mjs +0 -157
- package/esm2022/lib/vflow/components/custom-node-base/custom-node-base.component.mjs +0 -57
- package/esm2022/lib/vflow/components/default-node/default-node.component.mjs +0 -16
- package/esm2022/lib/vflow/components/defs/defs.component.mjs +0 -16
- package/esm2022/lib/vflow/components/edge/edge.component.mjs +0 -54
- package/esm2022/lib/vflow/components/edge-label/edge-label.component.mjs +0 -76
- package/esm2022/lib/vflow/components/node/node.component.mjs +0 -107
- package/esm2022/lib/vflow/components/preview-flow/draw-node.mjs +0 -100
- package/esm2022/lib/vflow/components/preview-flow/preview-flow.component.mjs +0 -62
- package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +0 -437
- package/esm2022/lib/vflow/constants/magic-number-to-fix-glitch-in-chrome.constant.mjs +0 -4
- package/esm2022/lib/vflow/decorators/microtask.decorator.mjs +0 -11
- package/esm2022/lib/vflow/directives/changes-controller.directive.mjs +0 -165
- package/esm2022/lib/vflow/directives/connection-controller.directive.mjs +0 -145
- package/esm2022/lib/vflow/directives/drag-handle.directive.mjs +0 -28
- package/esm2022/lib/vflow/directives/flow-size-controller.directive.mjs +0 -40
- package/esm2022/lib/vflow/directives/handle-size-controller.directive.mjs +0 -41
- package/esm2022/lib/vflow/directives/map-context.directive.mjs +0 -116
- package/esm2022/lib/vflow/directives/node-handles-controller.directive.mjs +0 -33
- package/esm2022/lib/vflow/directives/node-resize-controller.directive.mjs +0 -37
- package/esm2022/lib/vflow/directives/pointer.directive.mjs +0 -84
- package/esm2022/lib/vflow/directives/reference.directive.mjs +0 -17
- package/esm2022/lib/vflow/directives/root-pointer.directive.mjs +0 -58
- package/esm2022/lib/vflow/directives/root-svg-context.directive.mjs +0 -35
- package/esm2022/lib/vflow/directives/selectable.directive.mjs +0 -48
- package/esm2022/lib/vflow/directives/space-point-context.directive.mjs +0 -42
- package/esm2022/lib/vflow/directives/template.directive.mjs +0 -119
- package/esm2022/lib/vflow/interfaces/alignment-helper-settings.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/box.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/component-node-event.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/connection-settings.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/connection.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/connection.internal.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/contextable.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/curve-factory.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/edge-label.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/edge.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/fit-view-options.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/flow-entity.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/intersecting-nodes-options.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/marker.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/node-preview.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/node.interface.mjs +0 -53
- package/esm2022/lib/vflow/interfaces/optimization.interface.mjs +0 -7
- package/esm2022/lib/vflow/interfaces/point.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/rect.mjs +0 -10
- package/esm2022/lib/vflow/interfaces/template-context.interface.mjs +0 -2
- package/esm2022/lib/vflow/interfaces/viewport.interface.mjs +0 -2
- package/esm2022/lib/vflow/math/edge-path/bezier-path.mjs +0 -66
- package/esm2022/lib/vflow/math/edge-path/smooth-step-path.mjs +0 -226
- package/esm2022/lib/vflow/math/edge-path/straigh-path.mjs +0 -12
- package/esm2022/lib/vflow/math/point-on-line-by-ratio.mjs +0 -12
- package/esm2022/lib/vflow/models/connection.model.mjs +0 -31
- package/esm2022/lib/vflow/models/edge-label.model.mjs +0 -8
- package/esm2022/lib/vflow/models/edge.model.mjs +0 -208
- package/esm2022/lib/vflow/models/handle.model.mjs +0 -98
- package/esm2022/lib/vflow/models/minimap.model.mjs +0 -7
- package/esm2022/lib/vflow/models/node.model.mjs +0 -181
- package/esm2022/lib/vflow/models/toolbar.model.mjs +0 -36
- package/esm2022/lib/vflow/public-components/custom-dynamic-node/custom-dynamic-node.component.mjs +0 -25
- package/esm2022/lib/vflow/public-components/custom-node/custom-node.component.mjs +0 -24
- package/esm2022/lib/vflow/public-components/custom-template-edge/custom-template-edge.component.mjs +0 -29
- package/esm2022/lib/vflow/public-components/handle/handle.component.mjs +0 -53
- package/esm2022/lib/vflow/public-components/minimap/minimap.component.mjs +0 -108
- package/esm2022/lib/vflow/public-components/node-toolbar/node-toolbar.component.mjs +0 -73
- package/esm2022/lib/vflow/public-components/resizable/resizable.component.mjs +0 -272
- package/esm2022/lib/vflow/services/component-event-bus.service.mjs +0 -18
- package/esm2022/lib/vflow/services/draggable.service.mjs +0 -124
- package/esm2022/lib/vflow/services/edge-changes.service.mjs +0 -43
- package/esm2022/lib/vflow/services/edge-rendering.service.mjs +0 -40
- package/esm2022/lib/vflow/services/flow-entities.service.mjs +0 -56
- package/esm2022/lib/vflow/services/flow-rendering.service.mjs +0 -41
- package/esm2022/lib/vflow/services/flow-settings.service.mjs +0 -33
- package/esm2022/lib/vflow/services/flow-status.service.mjs +0 -49
- package/esm2022/lib/vflow/services/handle.service.mjs +0 -30
- package/esm2022/lib/vflow/services/keyboard.service.mjs +0 -47
- package/esm2022/lib/vflow/services/node-accessor.service.mjs +0 -16
- package/esm2022/lib/vflow/services/node-changes.service.mjs +0 -41
- package/esm2022/lib/vflow/services/node-rendering.service.mjs +0 -66
- package/esm2022/lib/vflow/services/overlays.service.mjs +0 -35
- package/esm2022/lib/vflow/services/preview-flow-render-strategy.service.mjs +0 -21
- package/esm2022/lib/vflow/services/selection.service.mjs +0 -54
- package/esm2022/lib/vflow/services/viewport.service.mjs +0 -64
- package/esm2022/lib/vflow/types/background.type.mjs +0 -2
- package/esm2022/lib/vflow/types/connection-mode.type.mjs +0 -2
- package/esm2022/lib/vflow/types/edge-change.type.mjs +0 -2
- package/esm2022/lib/vflow/types/handle-type.type.mjs +0 -2
- package/esm2022/lib/vflow/types/keyboard-action.type.mjs +0 -2
- package/esm2022/lib/vflow/types/node-change.type.mjs +0 -2
- package/esm2022/lib/vflow/types/position.type.mjs +0 -2
- package/esm2022/lib/vflow/types/viewport-change-type.type.mjs +0 -2
- package/esm2022/lib/vflow/utils/add-nodes-to-edges.mjs +0 -11
- package/esm2022/lib/vflow/utils/adjust-direction.mjs +0 -30
- package/esm2022/lib/vflow/utils/align-number.mjs +0 -4
- package/esm2022/lib/vflow/utils/assert-injector.mjs +0 -27
- package/esm2022/lib/vflow/utils/event.mjs +0 -4
- package/esm2022/lib/vflow/utils/get-os.mjs +0 -24
- package/esm2022/lib/vflow/utils/get-overlapping-area.mjs +0 -6
- package/esm2022/lib/vflow/utils/get-space-points.mjs +0 -25
- package/esm2022/lib/vflow/utils/hash.mjs +0 -7
- package/esm2022/lib/vflow/utils/id.mjs +0 -5
- package/esm2022/lib/vflow/utils/identity-checker/reference-identity-checker.mjs +0 -28
- package/esm2022/lib/vflow/utils/is-callable.mjs +0 -10
- package/esm2022/lib/vflow/utils/is-defined.mjs +0 -4
- package/esm2022/lib/vflow/utils/is-group-node.mjs +0 -4
- package/esm2022/lib/vflow/utils/is-vflow-component.mjs +0 -9
- package/esm2022/lib/vflow/utils/nodes.mjs +0 -60
- package/esm2022/lib/vflow/utils/resizable.mjs +0 -11
- package/esm2022/lib/vflow/utils/round.mjs +0 -2
- package/esm2022/lib/vflow/utils/signals/extended-computed.mjs +0 -15
- package/esm2022/lib/vflow/utils/signals/to-lazy-signal.mjs +0 -35
- package/esm2022/lib/vflow/utils/to-unified-node.mjs +0 -24
- package/esm2022/lib/vflow/utils/transform-background.mjs +0 -4
- package/esm2022/lib/vflow/utils/viewport.mjs +0 -51
- package/esm2022/lib/vflow/vflow.mjs +0 -29
- package/esm2022/ngx-vflow.mjs +0 -5
- package/esm2022/public-api.mjs +0 -55
- package/esm2022/testing/component-mocks/custom-template-edge-mock.component.mjs +0 -16
- package/esm2022/testing/component-mocks/handle-mock.component.mjs +0 -26
- package/esm2022/testing/component-mocks/minimap-mock.component.mjs +0 -24
- package/esm2022/testing/component-mocks/node-toolbar-mock.component.mjs +0 -23
- package/esm2022/testing/component-mocks/resizable-mock.component.mjs +0 -27
- package/esm2022/testing/component-mocks/vflow-mock.component.mjs +0 -299
- package/esm2022/testing/directive-mocks/connection-controller-mock.directive.mjs +0 -29
- package/esm2022/testing/directive-mocks/drag-handle-mock.directive.mjs +0 -11
- package/esm2022/testing/directive-mocks/selectable-mock.directive.mjs +0 -14
- package/esm2022/testing/directive-mocks/template-mock.directive.mjs +0 -101
- package/esm2022/testing/ngx-vflow-testing.mjs +0 -5
- package/esm2022/testing/provide-custom-node-mocks.mjs +0 -60
- package/esm2022/testing/public-api.mjs +0 -13
- package/esm2022/testing/types.mjs +0 -2
- package/esm2022/testing/vflow-mocks.mjs +0 -28
- package/lib/vflow/public-components/custom-dynamic-node/custom-dynamic-node.component.d.ts +0 -13
- package/lib/vflow/utils/to-unified-node.d.ts +0 -2
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { Directive, ElementRef, NgZone, effect, inject, signal, untracked } from '@angular/core';
|
|
2
|
-
import { select } from 'd3-selection';
|
|
3
|
-
import { zoom, zoomIdentity } from 'd3-zoom';
|
|
4
|
-
import { ViewportService } from '../services/viewport.service';
|
|
5
|
-
import { isDefined } from '../utils/is-defined';
|
|
6
|
-
import { RootSvgReferenceDirective } from './reference.directive';
|
|
7
|
-
import { SelectionService } from '../services/selection.service';
|
|
8
|
-
import { FlowSettingsService } from '../services/flow-settings.service';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class MapContextDirective {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.rootSvg = inject(RootSvgReferenceDirective).element;
|
|
13
|
-
this.host = inject(ElementRef).nativeElement;
|
|
14
|
-
this.selectionService = inject(SelectionService);
|
|
15
|
-
this.viewportService = inject(ViewportService);
|
|
16
|
-
this.flowSettingsService = inject(FlowSettingsService);
|
|
17
|
-
this.zone = inject(NgZone);
|
|
18
|
-
this.rootSvgSelection = select(this.rootSvg);
|
|
19
|
-
this.transform = signal('');
|
|
20
|
-
this.viewportForSelection = {};
|
|
21
|
-
// under the hood this effect triggers handleZoom, so error throws without this flag
|
|
22
|
-
this.manualViewportChangeEffect = effect(() => {
|
|
23
|
-
const viewport = this.viewportService.writableViewport();
|
|
24
|
-
const state = viewport.state;
|
|
25
|
-
if (viewport.changeType === 'initial') {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
// If only zoom provided
|
|
29
|
-
if (isDefined(state.zoom) && !isDefined(state.x) && !isDefined(state.y)) {
|
|
30
|
-
this.rootSvgSelection.transition().duration(viewport.duration).call(this.zoomBehavior.scaleTo, state.zoom);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
// If only pan provided
|
|
34
|
-
if (isDefined(state.x) && isDefined(state.y) && !isDefined(state.zoom)) {
|
|
35
|
-
// remain same zoom value
|
|
36
|
-
const zoom = untracked(this.viewportService.readableViewport).zoom;
|
|
37
|
-
this.rootSvgSelection
|
|
38
|
-
.transition()
|
|
39
|
-
.duration(viewport.duration)
|
|
40
|
-
.call(this.zoomBehavior.transform, zoomIdentity.translate(state.x, state.y).scale(zoom));
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
// If whole viewort state provided
|
|
44
|
-
if (isDefined(state.x) && isDefined(state.y) && isDefined(state.zoom)) {
|
|
45
|
-
this.rootSvgSelection
|
|
46
|
-
.transition()
|
|
47
|
-
.duration(viewport.duration)
|
|
48
|
-
.call(this.zoomBehavior.transform, zoomIdentity.translate(state.x, state.y).scale(state.zoom));
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
}, { allowSignalWrites: true });
|
|
52
|
-
this.handleZoom = ({ transform }) => {
|
|
53
|
-
// update public signal for user to read
|
|
54
|
-
this.viewportService.readableViewport.set(mapTransformToViewportState(transform));
|
|
55
|
-
this.transform.set(transform.toString());
|
|
56
|
-
};
|
|
57
|
-
this.handleZoomStart = ({ transform }) => {
|
|
58
|
-
this.viewportForSelection = {
|
|
59
|
-
start: mapTransformToViewportState(transform),
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
this.handleZoomEnd = ({ transform, sourceEvent }) => {
|
|
63
|
-
this.zone.run(() => {
|
|
64
|
-
this.viewportForSelection = {
|
|
65
|
-
...this.viewportForSelection,
|
|
66
|
-
end: mapTransformToViewportState(transform),
|
|
67
|
-
target: evTarget(sourceEvent),
|
|
68
|
-
};
|
|
69
|
-
this.viewportService.triggerViewportChangeEvent('end');
|
|
70
|
-
// TODO: maybe use triggerViewportChangeEvent instead of this method?
|
|
71
|
-
this.selectionService.setViewport(this.viewportForSelection);
|
|
72
|
-
});
|
|
73
|
-
};
|
|
74
|
-
this.filterCondition = (event) => {
|
|
75
|
-
if (event.type === 'mousedown' || event.type === 'touchstart') {
|
|
76
|
-
return event.target.closest('.vflow-node') === null;
|
|
77
|
-
}
|
|
78
|
-
return true;
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
ngOnInit() {
|
|
82
|
-
this.zone.runOutsideAngular(() => {
|
|
83
|
-
this.zoomBehavior = zoom()
|
|
84
|
-
.scaleExtent([this.flowSettingsService.minZoom(), this.flowSettingsService.maxZoom()])
|
|
85
|
-
.filter(this.filterCondition)
|
|
86
|
-
.on('start', this.handleZoomStart)
|
|
87
|
-
.on('zoom', this.handleZoom)
|
|
88
|
-
.on('end', this.handleZoomEnd);
|
|
89
|
-
this.rootSvgSelection.call(this.zoomBehavior).on('dblclick.zoom', null);
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
93
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: MapContextDirective, isStandalone: true, selector: "g[mapContext]", host: { properties: { "attr.transform": "transform()" } }, ngImport: i0 }); }
|
|
94
|
-
}
|
|
95
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MapContextDirective, decorators: [{
|
|
96
|
-
type: Directive,
|
|
97
|
-
args: [{
|
|
98
|
-
standalone: true,
|
|
99
|
-
selector: 'g[mapContext]',
|
|
100
|
-
host: {
|
|
101
|
-
'[attr.transform]': 'transform()',
|
|
102
|
-
},
|
|
103
|
-
}]
|
|
104
|
-
}] });
|
|
105
|
-
const mapTransformToViewportState = (transform) => ({
|
|
106
|
-
zoom: transform.k,
|
|
107
|
-
x: transform.x,
|
|
108
|
-
y: transform.y,
|
|
109
|
-
});
|
|
110
|
-
const evTarget = (anyEvent) => {
|
|
111
|
-
if (anyEvent instanceof Event && anyEvent.target instanceof Element) {
|
|
112
|
-
return anyEvent.target;
|
|
113
|
-
}
|
|
114
|
-
return undefined;
|
|
115
|
-
};
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWNvbnRleHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2RpcmVjdGl2ZXMvbWFwLWNvbnRleHQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQTRDLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXdCLE1BQU0sK0JBQStCLENBQUM7QUFDdkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBU3hFLE1BQU0sT0FBTyxtQkFBbUI7SUFQaEM7UUFRWSxZQUFPLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3BELFNBQUksR0FBRyxNQUFNLENBQTBCLFVBQVUsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNqRSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxQyx3QkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNsRCxTQUFJLEdBQUcsTUFBTSxDQUFDLE1B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ZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgTmdab25lLCBPbkluaXQsIGVmZmVjdCwgaW5qZWN0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCB7IEQzWm9vbUV2ZW50LCBab29tQmVoYXZpb3IsIFpvb21UcmFuc2Zvcm0sIHpvb20sIHpvb21JZGVudGl0eSB9IGZyb20gJ2QzLXpvb20nO1xuaW1wb3J0IHsgVmlld3BvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmlld3BvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBpc0RlZmluZWQgfSBmcm9tICcuLi91dGlscy9pcy1kZWZpbmVkJztcbmltcG9ydCB7IFJvb3RTdmdSZWZlcmVuY2VEaXJlY3RpdmUgfSBmcm9tICcuL3JlZmVyZW5jZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVmlld3BvcnRTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvdmlld3BvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UsIFZpZXdwb3J0Rm9yU2VsZWN0aW9uIH0gZnJvbSAnLi4vc2VydmljZXMvc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmxvd1NldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Zsb3ctc2V0dGluZ3Muc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2dbbWFwQ29udGV4dF0nLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLnRyYW5zZm9ybV0nOiAndHJhbnNmb3JtKCknLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBNYXBDb250ZXh0RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJvdGVjdGVkIHJvb3RTdmcgPSBpbmplY3QoUm9vdFN2Z1JlZmVyZW5jZURpcmVjdGl2ZSkuZWxlbWVudDtcbiAgcHJvdGVjdGVkIGhvc3QgPSBpbmplY3Q8RWxlbWVudFJlZjxTVkdHRWxlbWVudD4+KEVsZW1lbnRSZWYpLm5hdGl2ZUVsZW1lbnQ7XG4gIHByb3RlY3RlZCBzZWxlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KFNlbGVjdGlvblNlcnZpY2UpO1xuICBwcm90ZWN0ZWQgdmlld3BvcnRTZXJ2aWNlID0gaW5qZWN0KFZpZXdwb3J0U2VydmljZSk7XG4gIHByb3RlY3RlZCBmbG93U2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KEZsb3dTZXR0aW5nc1NlcnZpY2UpO1xuICBwcm90ZWN0ZWQgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIHByb3RlY3RlZCByb290U3ZnU2VsZWN0aW9uID0gc2VsZWN0KHRoaXMucm9vdFN2Zyk7XG5cbiAgcHJvdGVjdGVkIHRyYW5zZm9ybSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcblxuICBwcm90ZWN0ZWQgdmlld3BvcnRGb3JTZWxlY3Rpb246IFBhcnRpYWw8Vmlld3BvcnRGb3JTZWxlY3Rpb24+ID0ge307XG5cbiAgLy8gdW5kZXIgdGhlIGhvb2QgdGhpcyBlZmZlY3QgdHJpZ2dlcnMgaGFuZGxlWm9vbSwgc28gZXJyb3IgdGhyb3dzIHdpdGhvdXQgdGhpcyBmbGFnXG4gIHByb3RlY3RlZCBtYW51YWxWaWV3cG9ydENoYW5nZUVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnRTZXJ2aWNlLndyaXRhYmxlVmlld3BvcnQoKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gdmlld3BvcnQuc3RhdGU7XG5cbiAgICAgIGlmICh2aWV3cG9ydC5jaGFuZ2VUeXBlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBvbmx5IHpvb20gcHJvdmlkZWRcbiAgICAgIGlmIChpc0RlZmluZWQoc3RhdGUuem9vbSkgJiYgIWlzRGVmaW5lZChzdGF0ZS54KSAmJiAhaXNEZWZpbmVkKHN0YXRlLnkpKSB7XG4gICAgICAgIHRoaXMucm9vdFN2Z1NlbGVjdGlvbi50cmFuc2l0aW9uKCkuZHVyYXRpb24odmlld3BvcnQuZHVyYXRpb24pLmNhbGwodGhpcy56b29tQmVoYXZpb3Iuc2NhbGVUbywgc3RhdGUuem9vbSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBvbmx5IHBhbiBwcm92aWRlZFxuICAgICAgaWYgKGlzRGVmaW5lZChzdGF0ZS54KSAmJiBpc0RlZmluZWQoc3RhdGUueSkgJiYgIWlzRGVmaW5lZChzdGF0ZS56b29tKSkge1xuICAgICAgICAvLyByZW1haW4gc2FtZSB6b29tIHZhbHVlXG4gICAgICAgIGNvbnN0IHpvb20gPSB1bnRyYWNrZWQodGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCkuem9vbTtcblxuICAgICAgICB0aGlzLnJvb3RTdmdTZWxlY3Rpb25cbiAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgLmR1cmF0aW9uKHZpZXdwb3J0LmR1cmF0aW9uKVxuICAgICAgICAgIC5jYWxsKHRoaXMuem9vbUJlaGF2aW9yLnRyYW5zZm9ybSwgem9vbUlkZW50aXR5LnRyYW5zbGF0ZShzdGF0ZS54LCBzdGF0ZS55KS5zY2FsZSh6b29tKSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB3aG9sZSB2aWV3b3J0IHN0YXRlIHByb3ZpZGVkXG4gICAgICBpZiAoaXNEZWZpbmVkKHN0YXRlLngpICYmIGlzRGVmaW5lZChzdGF0ZS55KSAmJiBpc0RlZmluZWQoc3RhdGUuem9vbSkpIHtcbiAgICAgICAgdGhpcy5yb290U3ZnU2VsZWN0aW9uXG4gICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgIC5kdXJhdGlvbih2aWV3cG9ydC5kdXJhdGlvbilcbiAgICAgICAgICAuY2FsbCh0aGlzLnpvb21CZWhhdmlvci50cmFuc2Zvcm0sIHpvb21JZGVudGl0eS50cmFuc2xhdGUoc3RhdGUueCwgc3RhdGUueSkuc2NhbGUoc3RhdGUuem9vbSkpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgKTtcblxuICBwcm90ZWN0ZWQgem9vbUJlaGF2aW9yITogWm9vbUJlaGF2aW9yPFNWR1NWR0VsZW1lbnQsIHVua25vd24+O1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy56b29tQmVoYXZpb3IgPSB6b29tPFNWR1NWR0VsZW1lbnQsIHVua25vd24+KClcbiAgICAgICAgLnNjYWxlRXh0ZW50KFt0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UubWluWm9vbSgpLCB0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UubWF4Wm9vbSgpXSlcbiAgICAgICAgLmZpbHRlcih0aGlzLmZpbHRlckNvbmRpdGlvbilcbiAgICAgICAgLm9uKCdzdGFydCcsIHRoaXMuaGFuZGxlWm9vbVN0YXJ0KVxuICAgICAgICAub24oJ3pvb20nLCB0aGlzLmhhbmRsZVpvb20pXG4gICAgICAgIC5vbignZW5kJywgdGhpcy5oYW5kbGVab29tRW5kKTtcblxuICAgICAgdGhpcy5yb290U3ZnU2VsZWN0aW9uLmNhbGwodGhpcy56b29tQmVoYXZpb3IpLm9uKCdkYmxjbGljay56b29tJywgbnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVpvb20gPSAoeyB0cmFuc2Zvcm0gfTogWm9vbUV2ZW50KSA9PiB7XG4gICAgLy8gdXBkYXRlIHB1YmxpYyBzaWduYWwgZm9yIHVzZXIgdG8gcmVhZFxuICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQuc2V0KG1hcFRyYW5zZm9ybVRvVmlld3BvcnRTdGF0ZSh0cmFuc2Zvcm0pKTtcblxuICAgIHRoaXMudHJhbnNmb3JtLnNldCh0cmFuc2Zvcm0udG9TdHJpbmcoKSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVab29tU3RhcnQgPSAoeyB0cmFuc2Zvcm0gfTogWm9vbUV2ZW50KSA9PiB7XG4gICAgdGhpcy52aWV3cG9ydEZvclNlbGVjdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBtYXBUcmFuc2Zvcm1Ub1ZpZXdwb3J0U3RhdGUodHJhbnNmb3JtKSxcbiAgICB9O1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlWm9vbUVuZCA9ICh7IHRyYW5zZm9ybSwgc291cmNlRXZlbnQgfTogWm9vbUV2ZW50KSA9PiB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnZpZXdwb3J0Rm9yU2VsZWN0aW9uID0ge1xuICAgICAgICAuLi50aGlzLnZpZXdwb3J0Rm9yU2VsZWN0aW9uLFxuICAgICAgICBlbmQ6IG1hcFRyYW5zZm9ybVRvVmlld3BvcnRTdGF0ZSh0cmFuc2Zvcm0pLFxuICAgICAgICB0YXJnZXQ6IGV2VGFyZ2V0KHNvdXJjZUV2ZW50KSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLnRyaWdnZXJWaWV3cG9ydENoYW5nZUV2ZW50KCdlbmQnKTtcblxuICAgICAgLy8gVE9ETzogbWF5YmUgdXNlIHRyaWdnZXJWaWV3cG9ydENoYW5nZUV2ZW50IGluc3RlYWQgb2YgdGhpcyBtZXRob2Q/XG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2V0Vmlld3BvcnQodGhpcy52aWV3cG9ydEZvclNlbGVjdGlvbiBhcyBWaWV3cG9ydEZvclNlbGVjdGlvbik7XG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBmaWx0ZXJDb25kaXRpb24gPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgcmV0dXJuIChldmVudC50YXJnZXQgYXMgRWxlbWVudCkuY2xvc2VzdCgnLnZmbG93LW5vZGUnKSA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuY29uc3QgbWFwVHJhbnNmb3JtVG9WaWV3cG9ydFN0YXRlID0gKHRyYW5zZm9ybTogWm9vbVRyYW5zZm9ybSk6IFZpZXdwb3J0U3RhdGUgPT4gKHtcbiAgem9vbTogdHJhbnNmb3JtLmssXG4gIHg6IHRyYW5zZm9ybS54LFxuICB5OiB0cmFuc2Zvcm0ueSxcbn0pO1xuXG5jb25zdCBldlRhcmdldCA9IChhbnlFdmVudDogYW55KTogRWxlbWVudCB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChhbnlFdmVudCBpbnN0YW5jZW9mIEV2ZW50ICYmIGFueUV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICByZXR1cm4gYW55RXZlbnQudGFyZ2V0O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmRlY2xhcmUgbW9kdWxlICdkMy1zZWxlY3Rpb24nIHtcbiAgaW50ZXJmYWNlIFNlbGVjdGlvbjxHRWxlbWVudCBleHRlbmRzIEJhc2VUeXBlLCBEYXR1bSwgUEVsZW1lbnQgZXh0ZW5kcyBCYXNlVHlwZSwgUERhdHVtPiB7XG4gICAgdHJhbnNpdGlvbigpOiBTZWxlY3Rpb248R0VsZW1lbnQsIERhdHVtLCBQRWxlbWVudCwgUERhdHVtPjtcbiAgICBkdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKTogU2VsZWN0aW9uPEdFbGVtZW50LCBEYXR1bSwgUEVsZW1lbnQsIFBEYXR1bT47XG4gIH1cbn1cblxudHlwZSBab29tRXZlbnQgPSBEM1pvb21FdmVudDxTVkdTVkdFbGVtZW50LCB1bmtub3duPjtcbiJdfQ==
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { DestroyRef, Directive, ElementRef, inject, NgZone } from '@angular/core';
|
|
2
|
-
import { NodeAccessorService } from '../services/node-accessor.service';
|
|
3
|
-
import { map, switchMap, tap } from 'rxjs';
|
|
4
|
-
import { resizable } from '../utils/resizable';
|
|
5
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class NodeHandlesControllerDirective {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.nodeAccessor = inject(NodeAccessorService);
|
|
10
|
-
this.zone = inject(NgZone);
|
|
11
|
-
this.destroyRef = inject(DestroyRef);
|
|
12
|
-
this.hostElementRef = inject(ElementRef);
|
|
13
|
-
}
|
|
14
|
-
ngOnInit() {
|
|
15
|
-
const model = this.nodeAccessor.model();
|
|
16
|
-
model.handles$
|
|
17
|
-
.pipe(switchMap((handles) => resizable([...handles.map((h) => h.hostReference), this.hostElementRef.nativeElement], this.zone).pipe(map(() => handles))), tap((handles) => {
|
|
18
|
-
// TODO (performance) inspect how to avoid calls of this when flow initially rendered
|
|
19
|
-
handles.forEach((h) => h.updateHost());
|
|
20
|
-
}), takeUntilDestroyed(this.destroyRef))
|
|
21
|
-
.subscribe();
|
|
22
|
-
}
|
|
23
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeHandlesControllerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
24
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: NodeHandlesControllerDirective, isStandalone: true, selector: "[nodeHandlesController]", ngImport: i0 }); }
|
|
25
|
-
}
|
|
26
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeHandlesControllerDirective, decorators: [{
|
|
27
|
-
type: Directive,
|
|
28
|
-
args: [{
|
|
29
|
-
selector: '[nodeHandlesController]',
|
|
30
|
-
standalone: true,
|
|
31
|
-
}]
|
|
32
|
-
}] });
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1oYW5kbGVzLWNvbnRyb2xsZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2RpcmVjdGl2ZXMvbm9kZS1oYW5kbGVzLWNvbnRyb2xsZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBTWhFLE1BQU0sT0FBTyw4QkFBOEI7SUFKM0M7UUFLVSxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNDLFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxtQkFBYyxHQUFHLE1BQU0sQ0FBc0IsVUFBVSxDQUFDLENBQUM7S0FvQmxFO0lBbEJRLFFBQVE7UUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRyxDQUFDO1FBRXpDLEtBQUssQ0FBQyxRQUFRO2FBQ1gsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ3BCLFNBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWMsQ0FBQyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDckcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUNuQixDQUNGLEVBQ0QsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDZCxxRkFBcUY7WUFDckYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLEVBQ0Ysa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUNwQzthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7K0dBdkJVLDhCQUE4QjttR0FBOUIsOEJBQThCOzs0RkFBOUIsOEJBQThCO2tCQUoxQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgaW5qZWN0LCBOZ1pvbmUsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm9kZUFjY2Vzc29yU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25vZGUtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyByZXNpemFibGUgfSBmcm9tICcuLi91dGlscy9yZXNpemFibGUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbm9kZUhhbmRsZXNDb250cm9sbGVyXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVIYW5kbGVzQ29udHJvbGxlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgbm9kZUFjY2Vzc29yID0gaW5qZWN0KE5vZGVBY2Nlc3NvclNlcnZpY2UpO1xuICBwcml2YXRlIHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIGhvc3RFbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8RWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubm9kZUFjY2Vzc29yLm1vZGVsKCkhO1xuXG4gICAgbW9kZWwuaGFuZGxlcyRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGhhbmRsZXMpID0+XG4gICAgICAgICAgcmVzaXphYmxlKFsuLi5oYW5kbGVzLm1hcCgoaCkgPT4gaC5ob3N0UmVmZXJlbmNlISksIHRoaXMuaG9zdEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudF0sIHRoaXMuem9uZSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoKSA9PiBoYW5kbGVzKSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgICB0YXAoKGhhbmRsZXMpID0+IHtcbiAgICAgICAgICAvLyBUT0RPIChwZXJmb3JtYW5jZSkgaW5zcGVjdCBob3cgdG8gYXZvaWQgY2FsbHMgb2YgdGhpcyB3aGVuIGZsb3cgaW5pdGlhbGx5IHJlbmRlcmVkXG4gICAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoKSA9PiBoLnVwZGF0ZUhvc3QoKSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { DestroyRef, Directive, ElementRef, inject, NgZone } from '@angular/core';
|
|
2
|
-
import { resizable } from '../utils/resizable';
|
|
3
|
-
import { NodeAccessorService } from '../services/node-accessor.service';
|
|
4
|
-
import { filter, merge, startWith, tap } from 'rxjs';
|
|
5
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
/**
|
|
8
|
-
* Only suitable for HTML nodes
|
|
9
|
-
*/
|
|
10
|
-
export class NodeResizeControllerDirective {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.nodeAccessor = inject(NodeAccessorService);
|
|
13
|
-
this.zone = inject(NgZone);
|
|
14
|
-
this.destroyRef = inject(DestroyRef);
|
|
15
|
-
this.hostElementRef = inject(ElementRef);
|
|
16
|
-
}
|
|
17
|
-
ngOnInit() {
|
|
18
|
-
const model = this.nodeAccessor.model();
|
|
19
|
-
const host = this.hostElementRef.nativeElement;
|
|
20
|
-
merge(resizable([host], this.zone))
|
|
21
|
-
.pipe(startWith(null), filter(() => !model.resizing()), tap(() => {
|
|
22
|
-
model.width.set(host.clientWidth);
|
|
23
|
-
model.height.set(host.clientHeight);
|
|
24
|
-
}), takeUntilDestroyed(this.destroyRef))
|
|
25
|
-
.subscribe();
|
|
26
|
-
}
|
|
27
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeResizeControllerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
28
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: NodeResizeControllerDirective, isStandalone: true, selector: "[nodeResizeController]", ngImport: i0 }); }
|
|
29
|
-
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeResizeControllerDirective, decorators: [{
|
|
31
|
-
type: Directive,
|
|
32
|
-
args: [{
|
|
33
|
-
selector: '[nodeResizeController]',
|
|
34
|
-
standalone: true,
|
|
35
|
-
}]
|
|
36
|
-
}] });
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1yZXNpemUtY29udHJvbGxlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvZGlyZWN0aXZlcy9ub2RlLXJlc2l6ZS1jb250cm9sbGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFFaEU7O0dBRUc7QUFLSCxNQUFNLE9BQU8sNkJBQTZCO0lBSjFDO1FBS1UsaUJBQVksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzQyxTQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsbUJBQWMsR0FBRyxNQUFNLENBQXNCLFVBQVUsQ0FBQyxDQUFDO0tBbUJsRTtJQWpCUSxRQUFRO1FBQ2IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUcsQ0FBQztRQUV6QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUUvQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hDLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQ2YsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQy9CLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxFQUNGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDcEM7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDOytHQXRCVSw2QkFBNkI7bUdBQTdCLDZCQUE2Qjs7NEZBQTdCLDZCQUE2QjtrQkFKekMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIGluamVjdCwgTmdab25lLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHJlc2l6YWJsZSB9IGZyb20gJy4uL3V0aWxzL3Jlc2l6YWJsZSc7XG5pbXBvcnQgeyBOb2RlQWNjZXNzb3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbm9kZS1hY2Nlc3Nvci5zZXJ2aWNlJztcbmltcG9ydCB7IGZpbHRlciwgbWVyZ2UsIHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbi8qKlxuICogT25seSBzdWl0YWJsZSBmb3IgSFRNTCBub2Rlc1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbm9kZVJlc2l6ZUNvbnRyb2xsZXJdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZVJlc2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIG5vZGVBY2Nlc3NvciA9IGluamVjdChOb2RlQWNjZXNzb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBob3N0RWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm5vZGVBY2Nlc3Nvci5tb2RlbCgpITtcblxuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmhvc3RFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBtZXJnZShyZXNpemFibGUoW2hvc3RdLCB0aGlzLnpvbmUpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgZmlsdGVyKCgpID0+ICFtb2RlbC5yZXNpemluZygpKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICBtb2RlbC53aWR0aC5zZXQoaG9zdC5jbGllbnRXaWR0aCk7XG4gICAgICAgICAgbW9kZWwuaGVpZ2h0LnNldChob3N0LmNsaWVudEhlaWdodCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { Directive, ElementRef, HostListener, inject, output } from '@angular/core';
|
|
2
|
-
import { filter, tap } from 'rxjs';
|
|
3
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { RootPointerDirective } from './root-pointer.directive';
|
|
5
|
-
import { isTouchEvent } from '../utils/event';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class PointerDirective {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.hostElement = inject(ElementRef).nativeElement;
|
|
10
|
-
this.pointerMovementDirective = inject(RootPointerDirective);
|
|
11
|
-
this.pointerOver = output();
|
|
12
|
-
this.pointerOut = output();
|
|
13
|
-
/**
|
|
14
|
-
* @todo the Angular may somehow ignore the event.
|
|
15
|
-
* reproduced here: https://www.ngx-vflow.org/workshops/layout/vizdom-layout
|
|
16
|
-
*/
|
|
17
|
-
this.pointerStart = output();
|
|
18
|
-
this.pointerEnd = output();
|
|
19
|
-
this.wasPointerOver = false;
|
|
20
|
-
// TODO check if i could avoid global touch end
|
|
21
|
-
this.touchEnd = this.pointerMovementDirective.touchEnd$
|
|
22
|
-
.pipe(filter(({ target }) => target === this.hostElement), tap(({ originalEvent }) => this.pointerEnd.emit(originalEvent)), takeUntilDestroyed())
|
|
23
|
-
.subscribe();
|
|
24
|
-
this.touchOverOut = this.pointerMovementDirective.touchMovement$
|
|
25
|
-
.pipe(tap(({ target, originalEvent }) => {
|
|
26
|
-
this.handleTouchOverAndOut(target, originalEvent);
|
|
27
|
-
}), takeUntilDestroyed())
|
|
28
|
-
.subscribe();
|
|
29
|
-
}
|
|
30
|
-
onPointerStart(event) {
|
|
31
|
-
this.pointerStart.emit(event);
|
|
32
|
-
if (isTouchEvent(event)) {
|
|
33
|
-
this.pointerMovementDirective.setInitialTouch(event);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
onPointerEnd(event) {
|
|
37
|
-
this.pointerEnd.emit(event);
|
|
38
|
-
}
|
|
39
|
-
onMouseOver(event) {
|
|
40
|
-
this.pointerOver.emit(event);
|
|
41
|
-
}
|
|
42
|
-
onMouseOut(event) {
|
|
43
|
-
this.pointerOut.emit(event);
|
|
44
|
-
}
|
|
45
|
-
// TODO: dirty imperative implementation
|
|
46
|
-
handleTouchOverAndOut(target, event) {
|
|
47
|
-
if (target === this.hostElement) {
|
|
48
|
-
this.pointerOver.emit(event);
|
|
49
|
-
this.wasPointerOver = true;
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
// should not emit before pointerOver
|
|
53
|
-
if (this.wasPointerOver) {
|
|
54
|
-
this.pointerOut.emit(event);
|
|
55
|
-
}
|
|
56
|
-
this.wasPointerOver = false;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PointerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
60
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: PointerDirective, isStandalone: true, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: { pointerOver: "pointerOver", pointerOut: "pointerOut", pointerStart: "pointerStart", pointerEnd: "pointerEnd" }, host: { listeners: { "mousedown": "onPointerStart($event)", "touchstart": "onPointerStart($event)", "mouseup": "onPointerEnd($event)", "mouseover": "onMouseOver($event)", "mouseout": "onMouseOut($event)" } }, ngImport: i0 }); }
|
|
61
|
-
}
|
|
62
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PointerDirective, decorators: [{
|
|
63
|
-
type: Directive,
|
|
64
|
-
args: [{
|
|
65
|
-
standalone: true,
|
|
66
|
-
selector: '[pointerStart], [pointerEnd], [pointerOver], [pointerOut]',
|
|
67
|
-
}]
|
|
68
|
-
}], propDecorators: { onPointerStart: [{
|
|
69
|
-
type: HostListener,
|
|
70
|
-
args: ['mousedown', ['$event']]
|
|
71
|
-
}, {
|
|
72
|
-
type: HostListener,
|
|
73
|
-
args: ['touchstart', ['$event']]
|
|
74
|
-
}], onPointerEnd: [{
|
|
75
|
-
type: HostListener,
|
|
76
|
-
args: ['mouseup', ['$event']]
|
|
77
|
-
}], onMouseOver: [{
|
|
78
|
-
type: HostListener,
|
|
79
|
-
args: ['mouseover', ['$event']]
|
|
80
|
-
}], onMouseOut: [{
|
|
81
|
-
type: HostListener,
|
|
82
|
-
args: ['mouseout', ['$event']]
|
|
83
|
-
}] } });
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvZGlyZWN0aXZlcy9wb2ludGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBTTlDLE1BQU0sT0FBTyxnQkFBZ0I7SUFKN0I7UUFLWSxnQkFBVyxHQUFHLE1BQU0sQ0FBc0IsVUFBVSxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQ3BFLDZCQUF3QixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRS9DLGdCQUFXLEdBQUcsTUFBTSxFQUFTLENBQUM7UUFFOUIsZUFBVSxHQUFHLE1BQU0sRUFBUyxDQUFDO1FBRWhEOzs7V0FHRztRQUNnQixpQkFBWSxHQUFHLE1BQU0sRUFBUyxDQUFDO1FBRS9CLGVBQVUsR0FBRyxNQUFNLEVBQVMsQ0FBQztRQTJCeEMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFL0IsK0NBQStDO1FBQ3JDLGFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUzthQUN6RCxJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDbkQsR0FBRyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDL0Qsa0JBQWtCLEVBQUUsQ0FDckI7YUFDQSxTQUFTLEVBQUUsQ0FBQztRQUVMLGlCQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGNBQWM7YUFDbEUsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsRUFDRixrQkFBa0IsRUFBRSxDQUNyQjthQUNBLFNBQVMsRUFBRSxDQUFDO0tBZ0JoQjtJQXpEVyxjQUFjLENBQUMsS0FBWTtRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5QixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFHUyxZQUFZLENBQUMsS0FBWTtRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBR1MsV0FBVyxDQUFDLEtBQVk7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUdTLFVBQVUsQ0FBQyxLQUFZO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFzQkQsd0NBQXdDO0lBQ2hDLHFCQUFxQixDQUFDLE1BQXNCLEVBQUUsS0FBaUI7UUFDckUsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ04scUNBQXFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7K0dBMUVVLGdCQUFnQjttR0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUo1QixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsMkRBQTJEO2lCQUN0RTs4QkFtQlcsY0FBYztzQkFGdkIsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUNwQyxZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVNUIsWUFBWTtzQkFEckIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTXpCLFdBQVc7c0JBRHBCLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU0zQixVQUFVO3NCQURuQixZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBpbmplY3QsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFJvb3RQb2ludGVyRGlyZWN0aXZlIH0gZnJvbSAnLi9yb290LXBvaW50ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IGlzVG91Y2hFdmVudCB9IGZyb20gJy4uL3V0aWxzL2V2ZW50JztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW3BvaW50ZXJTdGFydF0sIFtwb2ludGVyRW5kXSwgW3BvaW50ZXJPdmVyXSwgW3BvaW50ZXJPdXRdJyxcbn0pXG5leHBvcnQgY2xhc3MgUG9pbnRlckRpcmVjdGl2ZSB7XG4gIHByb3RlY3RlZCBob3N0RWxlbWVudCA9IGluamVjdDxFbGVtZW50UmVmPEVsZW1lbnQ+PihFbGVtZW50UmVmKS5uYXRpdmVFbGVtZW50O1xuICBwcm90ZWN0ZWQgcG9pbnRlck1vdmVtZW50RGlyZWN0aXZlID0gaW5qZWN0KFJvb3RQb2ludGVyRGlyZWN0aXZlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9pbnRlck92ZXIgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvaW50ZXJPdXQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEB0b2RvIHRoZSBBbmd1bGFyIG1heSBzb21laG93IGlnbm9yZSB0aGUgZXZlbnQuXG4gICAqIHJlcHJvZHVjZWQgaGVyZTogaHR0cHM6Ly93d3cubmd4LXZmbG93Lm9yZy93b3Jrc2hvcHMvbGF5b3V0L3ZpemRvbS1sYXlvdXRcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwb2ludGVyU3RhcnQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvaW50ZXJFbmQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHByb3RlY3RlZCBvblBvaW50ZXJTdGFydChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnBvaW50ZXJTdGFydC5lbWl0KGV2ZW50KTtcblxuICAgIGlmIChpc1RvdWNoRXZlbnQoZXZlbnQpKSB7XG4gICAgICB0aGlzLnBvaW50ZXJNb3ZlbWVudERpcmVjdGl2ZS5zZXRJbml0aWFsVG91Y2goZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnLCBbJyRldmVudCddKVxuICBwcm90ZWN0ZWQgb25Qb2ludGVyRW5kKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMucG9pbnRlckVuZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlb3ZlcicsIFsnJGV2ZW50J10pXG4gIHByb3RlY3RlZCBvbk1vdXNlT3ZlcihldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnBvaW50ZXJPdmVyLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VvdXQnLCBbJyRldmVudCddKVxuICBwcm90ZWN0ZWQgb25Nb3VzZU91dChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnBvaW50ZXJPdXQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHdhc1BvaW50ZXJPdmVyID0gZmFsc2U7XG5cbiAgLy8gVE9ETyBjaGVjayBpZiBpIGNvdWxkIGF2b2lkIGdsb2JhbCB0b3VjaCBlbmRcbiAgcHJvdGVjdGVkIHRvdWNoRW5kID0gdGhpcy5wb2ludGVyTW92ZW1lbnREaXJlY3RpdmUudG91Y2hFbmQkXG4gICAgLnBpcGUoXG4gICAgICBmaWx0ZXIoKHsgdGFyZ2V0IH0pID0+IHRhcmdldCA9PT0gdGhpcy5ob3N0RWxlbWVudCksXG4gICAgICB0YXAoKHsgb3JpZ2luYWxFdmVudCB9KSA9PiB0aGlzLnBvaW50ZXJFbmQuZW1pdChvcmlnaW5hbEV2ZW50KSksXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICApXG4gICAgLnN1YnNjcmliZSgpO1xuXG4gIHByb3RlY3RlZCB0b3VjaE92ZXJPdXQgPSB0aGlzLnBvaW50ZXJNb3ZlbWVudERpcmVjdGl2ZS50b3VjaE1vdmVtZW50JFxuICAgIC5waXBlKFxuICAgICAgdGFwKCh7IHRhcmdldCwgb3JpZ2luYWxFdmVudCB9KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hPdmVyQW5kT3V0KHRhcmdldCwgb3JpZ2luYWxFdmVudCk7XG4gICAgICB9KSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgIClcbiAgICAuc3Vic2NyaWJlKCk7XG5cbiAgLy8gVE9ETzogZGlydHkgaW1wZXJhdGl2ZSBpbXBsZW1lbnRhdGlvblxuICBwcml2YXRlIGhhbmRsZVRvdWNoT3ZlckFuZE91dCh0YXJnZXQ6IEVsZW1lbnQgfCBudWxsLCBldmVudDogVG91Y2hFdmVudCkge1xuICAgIGlmICh0YXJnZXQgPT09IHRoaXMuaG9zdEVsZW1lbnQpIHtcbiAgICAgIHRoaXMucG9pbnRlck92ZXIuZW1pdChldmVudCk7XG4gICAgICB0aGlzLndhc1BvaW50ZXJPdmVyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2hvdWxkIG5vdCBlbWl0IGJlZm9yZSBwb2ludGVyT3ZlclxuICAgICAgaWYgKHRoaXMud2FzUG9pbnRlck92ZXIpIHtcbiAgICAgICAgdGhpcy5wb2ludGVyT3V0LmVtaXQoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLndhc1BvaW50ZXJPdmVyID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Directive, ElementRef, inject } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class RootSvgReferenceDirective {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.element = inject(ElementRef).nativeElement;
|
|
6
|
-
}
|
|
7
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RootSvgReferenceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
8
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: RootSvgReferenceDirective, isStandalone: true, selector: "svg[rootSvgRef]", ngImport: i0 }); }
|
|
9
|
-
}
|
|
10
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RootSvgReferenceDirective, decorators: [{
|
|
11
|
-
type: Directive,
|
|
12
|
-
args: [{
|
|
13
|
-
standalone: true,
|
|
14
|
-
selector: 'svg[rootSvgRef]',
|
|
15
|
-
}]
|
|
16
|
-
}] });
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9kaXJlY3RpdmVzL3JlZmVyZW5jZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU05RCxNQUFNLE9BQU8seUJBQXlCO0lBSnRDO1FBS2tCLFlBQU8sR0FBRyxNQUFNLENBQTRCLFVBQVUsQ0FBQyxDQUFDLGFBQWEsQ0FBQztLQUN2RjsrR0FGWSx5QkFBeUI7bUdBQXpCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFKckMsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGlCQUFpQjtpQkFDNUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdzdmdbcm9vdFN2Z1JlZl0nLFxufSlcbmV4cG9ydCBjbGFzcyBSb290U3ZnUmVmZXJlbmNlRGlyZWN0aXZlIHtcbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQgPSBpbmplY3Q8RWxlbWVudFJlZjxTVkdTVkdFbGVtZW50Pj4oRWxlbWVudFJlZikubmF0aXZlRWxlbWVudDtcbn1cbiJdfQ==
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { Directive, ElementRef, inject } from '@angular/core';
|
|
2
|
-
import { Subject, animationFrameScheduler, fromEvent, map, merge, observeOn, share, tap } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class RootPointerDirective {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.host = inject(ElementRef).nativeElement;
|
|
7
|
-
this.initialTouch$ = new Subject();
|
|
8
|
-
this.prevTouchEvent = null;
|
|
9
|
-
// TODO: do not emit if mouse not down
|
|
10
|
-
this.mouseMovement$ = fromEvent(this.host, 'mousemove').pipe(map((event) => ({
|
|
11
|
-
x: event.clientX,
|
|
12
|
-
y: event.clientY,
|
|
13
|
-
movementX: event.movementX,
|
|
14
|
-
movementY: event.movementY,
|
|
15
|
-
target: event.target,
|
|
16
|
-
originalEvent: event,
|
|
17
|
-
})), observeOn(animationFrameScheduler), share());
|
|
18
|
-
this.touchMovement$ = merge(this.initialTouch$, fromEvent(this.host, 'touchmove')).pipe(tap((event) => event.preventDefault()), map((originalEvent) => {
|
|
19
|
-
const x = originalEvent.touches[0]?.clientX ?? 0;
|
|
20
|
-
const y = originalEvent.touches[0]?.clientY ?? 0;
|
|
21
|
-
const movementX = this.prevTouchEvent ? originalEvent.touches[0].pageX - this.prevTouchEvent.touches[0].pageX : 0;
|
|
22
|
-
const movementY = this.prevTouchEvent ? originalEvent.touches[0].pageY - this.prevTouchEvent.touches[0].pageY : 0;
|
|
23
|
-
const target = document.elementFromPoint(x, y);
|
|
24
|
-
return { x, y, movementX, movementY, target, originalEvent };
|
|
25
|
-
}), tap((event) => (this.prevTouchEvent = event.originalEvent)), observeOn(animationFrameScheduler), share());
|
|
26
|
-
this.pointerMovement$ = merge(this.mouseMovement$, this.touchMovement$);
|
|
27
|
-
this.touchEnd$ = fromEvent(this.host, 'touchend').pipe(map((originalEvent) => {
|
|
28
|
-
const x = originalEvent.changedTouches[0]?.clientX ?? 0;
|
|
29
|
-
const y = originalEvent.changedTouches[0]?.clientY ?? 0;
|
|
30
|
-
const target = document.elementFromPoint(x, y);
|
|
31
|
-
return { x, y, target, originalEvent };
|
|
32
|
-
}), tap(() => (this.prevTouchEvent = null)), share());
|
|
33
|
-
this.mouseUp$ = fromEvent(this.host, 'mouseup').pipe(map((originalEvent) => {
|
|
34
|
-
const x = originalEvent.clientX;
|
|
35
|
-
const y = originalEvent.clientY;
|
|
36
|
-
const target = originalEvent.target;
|
|
37
|
-
return { x, y, target, originalEvent };
|
|
38
|
-
}), share());
|
|
39
|
-
this.documentPointerEnd$ = merge(fromEvent(document, 'mouseup'), fromEvent(document, 'touchend')).pipe(share());
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* We should know when user started a touch in order to not
|
|
43
|
-
* show old touch position when connection creation is started
|
|
44
|
-
*/
|
|
45
|
-
setInitialTouch(event) {
|
|
46
|
-
this.initialTouch$.next(event);
|
|
47
|
-
}
|
|
48
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RootPointerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
49
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: RootPointerDirective, isStandalone: true, selector: "svg[rootPointer]", ngImport: i0 }); }
|
|
50
|
-
}
|
|
51
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RootPointerDirective, decorators: [{
|
|
52
|
-
type: Directive,
|
|
53
|
-
args: [{
|
|
54
|
-
standalone: true,
|
|
55
|
-
selector: 'svg[rootPointer]',
|
|
56
|
-
}]
|
|
57
|
-
}] });
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdC1wb2ludGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9kaXJlY3RpdmVzL3Jvb3QtcG9pbnRlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBYyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBZ0JsSCxNQUFNLE9BQU8sb0JBQW9CO0lBSmpDO1FBS1UsU0FBSSxHQUFHLE1BQU0sQ0FBNEIsVUFBVSxDQUFDLENBQUMsYUFBYSxDQUFDO1FBRW5FLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUUxQyxtQkFBYyxHQUFzQixJQUFJLENBQUM7UUFFakQsc0NBQXNDO1FBQy9CLG1CQUFjLEdBQUcsU0FBUyxDQUFhLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUN4RSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDZCxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDaEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ2hCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUF3QjtZQUN0QyxhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUMsRUFDSCxTQUFTLENBQUMsdUJBQXVCLENBQUMsRUFDbEMsS0FBSyxFQUFFLENBQ29CLENBQUM7UUFFdkIsbUJBQWMsR0FB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QUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxFQUNGLEtBQUssRUFBRSxDQUNvQixDQUFDO1FBRXZCLHdCQUFtQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQVNuSDtJQVBDOzs7T0FHRztJQUNJLGVBQWUsQ0FBQyxLQUFpQjtRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDOytHQXZFVSxvQkFBb0I7bUdBQXBCLG9CQUFvQjs7NEZBQXBCLG9CQUFvQjtrQkFKaEMsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGtCQUFrQjtpQkFDN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIGZyb21FdmVudCwgbWFwLCBtZXJnZSwgb2JzZXJ2ZU9uLCBzaGFyZSwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcG9pbnQuaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBQb2ludGVyRXZlbnQge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgbW92ZW1lbnRYOiBudW1iZXI7XG4gIG1vdmVtZW50WTogbnVtYmVyO1xuICB0YXJnZXQ6IEVsZW1lbnQgfCBudWxsO1xuICBvcmlnaW5hbEV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudDtcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnc3ZnW3Jvb3RQb2ludGVyXScsXG59KVxuZXhwb3J0IGNsYXNzIFJvb3RQb2ludGVyRGlyZWN0aXZlIHtcbiAgcHJpdmF0ZSBob3N0ID0gaW5qZWN0PEVsZW1lbnRSZWY8U1ZHU1ZHRWxlbWVudD4+KEVsZW1lbnRSZWYpLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBpbml0aWFsVG91Y2gkID0gbmV3IFN1YmplY3Q8VG91Y2hFdmVudD4oKTtcblxuICBwcml2YXRlIHByZXZUb3VjaEV2ZW50OiBUb3VjaEV2ZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVE9ETzogZG8gbm90IGVtaXQgaWYgbW91c2Ugbm90IGRvd25cbiAgcHVibGljIG1vdXNlTW92ZW1lbnQkID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuaG9zdCwgJ21vdXNlbW92ZScpLnBpcGUoXG4gICAgbWFwKChldmVudCkgPT4gKHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgICAgbW92ZW1lbnRYOiBldmVudC5tb3ZlbWVudFgsXG4gICAgICBtb3ZlbWVudFk6IGV2ZW50Lm1vdmVtZW50WSxcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQgfCBudWxsLFxuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgfSkpLFxuICAgIG9ic2VydmVPbihhbmltYXRpb25GcmFtZVNjaGVkdWxlciksXG4gICAgc2hhcmUoKSxcbiAgKSBzYXRpc2ZpZXMgT2JzZXJ2YWJsZTxQb2ludD47XG5cbiAgcHVibGljIHRvdWNoTW92ZW1lbnQkID0gbWVyZ2UodGhpcy5pbml0aWFsVG91Y2gkLCBmcm9tRXZlbnQ8VG91Y2hFdmVudD4odGhpcy5ob3N0LCAndG91Y2htb3ZlJykpLnBpcGUoXG4gICAgdGFwKChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSksXG4gICAgbWFwKChvcmlnaW5hbEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB4ID0gb3JpZ2luYWxFdmVudC50b3VjaGVzWzBdPy5jbGllbnRYID8/IDA7XG4gICAgICBjb25zdCB5ID0gb3JpZ2luYWxFdmVudC50b3VjaGVzWzBdPy5jbGllbnRZID8/IDA7XG4gICAgICBjb25zdCBtb3ZlbWVudFggPSB0aGlzLnByZXZUb3VjaEV2ZW50ID8gb3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gdGhpcy5wcmV2VG91Y2hFdmVudC50b3VjaGVzWzBdLnBhZ2VYIDogMDtcbiAgICAgIGNvbnN0IG1vdmVtZW50WSA9IHRoaXMucHJldlRvdWNoRXZlbnQgPyBvcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0ucGFnZVkgLSB0aGlzLnByZXZUb3VjaEV2ZW50LnRvdWNoZXNbMF0ucGFnZVkgOiAwO1xuXG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuXG4gICAgICByZXR1cm4geyB4LCB5LCBtb3ZlbWVudFgsIG1vdmVtZW50WSwgdGFyZ2V0LCBvcmlnaW5hbEV2ZW50IH07XG4gICAgfSksXG4gICAgdGFwKChldmVudCkgPT4gKHRoaXMucHJldlRvdWNoRXZlbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50KSksXG4gICAgb2JzZXJ2ZU9uKGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKSxcbiAgICBzaGFyZSgpLFxuICApIHNhdGlzZmllcyBPYnNlcnZhYmxlPFBvaW50PjtcblxuICBwdWJsaWMgcG9pbnRlck1vdmVtZW50JDogT2JzZXJ2YWJsZTxQb2ludGVyRXZlbnQ+ID0gbWVyZ2UodGhpcy5tb3VzZU1vdmVtZW50JCwgdGhpcy50b3VjaE1vdmVtZW50JCk7XG5cbiAgcHVibGljIHRvdWNoRW5kJCA9IGZyb21FdmVudDxUb3VjaEV2ZW50Pih0aGlzLmhvc3QsICd0b3VjaGVuZCcpLnBpcGUoXG4gICAgbWFwKChvcmlnaW5hbEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB4ID0gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXT8uY2xpZW50WCA/PyAwO1xuICAgICAgY29uc3QgeSA9IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0/LmNsaWVudFkgPz8gMDtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG5cbiAgICAgIHJldHVybiB7IHgsIHksIHRhcmdldCwgb3JpZ2luYWxFdmVudCB9O1xuICAgIH0pLFxuICAgIHRhcCgoKSA9PiAodGhpcy5wcmV2VG91Y2hFdmVudCA9IG51bGwpKSxcbiAgICBzaGFyZSgpLFxuICApIHNhdGlzZmllcyBPYnNlcnZhYmxlPFBvaW50PjtcblxuICBwdWJsaWMgbW91c2VVcCQgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5ob3N0LCAnbW91c2V1cCcpLnBpcGUoXG4gICAgbWFwKChvcmlnaW5hbEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB4ID0gb3JpZ2luYWxFdmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgeSA9IG9yaWdpbmFsRXZlbnQuY2xpZW50WTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IG9yaWdpbmFsRXZlbnQudGFyZ2V0O1xuXG4gICAgICByZXR1cm4geyB4LCB5LCB0YXJnZXQsIG9yaWdpbmFsRXZlbnQgfTtcbiAgICB9KSxcbiAgICBzaGFyZSgpLFxuICApIHNhdGlzZmllcyBPYnNlcnZhYmxlPFBvaW50PjtcblxuICBwdWJsaWMgZG9jdW1lbnRQb2ludGVyRW5kJCA9IG1lcmdlKGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKSwgZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2hlbmQnKSkucGlwZShzaGFyZSgpKTtcblxuICAvKipcbiAgICogV2Ugc2hvdWxkIGtub3cgd2hlbiB1c2VyIHN0YXJ0ZWQgYSB0b3VjaCBpbiBvcmRlciB0byBub3RcbiAgICogc2hvdyBvbGQgdG91Y2ggcG9zaXRpb24gd2hlbiBjb25uZWN0aW9uIGNyZWF0aW9uIGlzIHN0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBzZXRJbml0aWFsVG91Y2goZXZlbnQ6IFRvdWNoRXZlbnQpIHtcbiAgICB0aGlzLmluaXRpYWxUb3VjaCQubmV4dChldmVudCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Directive, HostListener, inject } from '@angular/core';
|
|
2
|
-
import { FlowStatusService } from '../services/flow-status.service';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
// TODO: too general purpose nane
|
|
5
|
-
export class RootSvgContextDirective {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.flowStatusService = inject(FlowStatusService);
|
|
8
|
-
}
|
|
9
|
-
// TODO: check for multiple instances on page
|
|
10
|
-
resetConnection() {
|
|
11
|
-
const status = this.flowStatusService.status();
|
|
12
|
-
if (status.state === 'connection-start' || status.state === 'reconnection-start') {
|
|
13
|
-
this.flowStatusService.setIdleStatus();
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RootSvgContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
17
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: RootSvgContextDirective, isStandalone: true, selector: "svg[rootSvgContext]", host: { listeners: { "document:mouseup": "resetConnection()", "document:touchend": "resetConnection()", "contextmenu": "resetConnection()" } }, ngImport: i0 }); }
|
|
18
|
-
}
|
|
19
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RootSvgContextDirective, decorators: [{
|
|
20
|
-
type: Directive,
|
|
21
|
-
args: [{
|
|
22
|
-
standalone: true,
|
|
23
|
-
selector: 'svg[rootSvgContext]',
|
|
24
|
-
}]
|
|
25
|
-
}], propDecorators: { resetConnection: [{
|
|
26
|
-
type: HostListener,
|
|
27
|
-
args: ['document:mouseup']
|
|
28
|
-
}, {
|
|
29
|
-
type: HostListener,
|
|
30
|
-
args: ['document:touchend']
|
|
31
|
-
}, {
|
|
32
|
-
type: HostListener,
|
|
33
|
-
args: ['contextmenu']
|
|
34
|
-
}] } });
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdC1zdmctY29udGV4dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvZGlyZWN0aXZlcy9yb290LXN2Zy1jb250ZXh0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBRXBFLGlDQUFpQztBQUtqQyxNQUFNLE9BQU8sdUJBQXVCO0lBSnBDO1FBS1Usc0JBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FhdkQ7SUFYQyw2Q0FBNkM7SUFJbkMsZUFBZTtRQUN2QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFL0MsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLGtCQUFrQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztZQUNqRixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7K0dBYlUsdUJBQXVCO21HQUF2Qix1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBSm5DLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxxQkFBcUI7aUJBQ2hDOzhCQVFXLGVBQWU7c0JBSHhCLFlBQVk7dUJBQUMsa0JBQWtCOztzQkFDL0IsWUFBWTt1QkFBQyxtQkFBbUI7O3NCQUNoQyxZQUFZO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbG93U3RhdHVzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Zsb3ctc3RhdHVzLnNlcnZpY2UnO1xuXG4vLyBUT0RPOiB0b28gZ2VuZXJhbCBwdXJwb3NlIG5hbmVcbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ3N2Z1tyb290U3ZnQ29udGV4dF0nLFxufSlcbmV4cG9ydCBjbGFzcyBSb290U3ZnQ29udGV4dERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgZmxvd1N0YXR1c1NlcnZpY2UgPSBpbmplY3QoRmxvd1N0YXR1c1NlcnZpY2UpO1xuXG4gIC8vIFRPRE86IGNoZWNrIGZvciBtdWx0aXBsZSBpbnN0YW5jZXMgb24gcGFnZVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJylcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dG91Y2hlbmQnKVxuICBASG9zdExpc3RlbmVyKCdjb250ZXh0bWVudScpXG4gIHByb3RlY3RlZCByZXNldENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5mbG93U3RhdHVzU2VydmljZS5zdGF0dXMoKTtcblxuICAgIGlmIChzdGF0dXMuc3RhdGUgPT09ICdjb25uZWN0aW9uLXN0YXJ0JyB8fCBzdGF0dXMuc3RhdGUgPT09ICdyZWNvbm5lY3Rpb24tc3RhcnQnKSB7XG4gICAgICB0aGlzLmZsb3dTdGF0dXNTZXJ2aWNlLnNldElkbGVTdGF0dXMoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Directive, ElementRef, inject } from '@angular/core';
|
|
2
|
-
import { SelectionService } from '../services/selection.service';
|
|
3
|
-
import { EdgeComponent } from '../components/edge/edge.component';
|
|
4
|
-
import { NodeComponent } from '../components/node/node.component';
|
|
5
|
-
import { FlowSettingsService } from '../services/flow-settings.service';
|
|
6
|
-
import { fromEvent, tap } from 'rxjs';
|
|
7
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
export class SelectableDirective {
|
|
10
|
-
constructor() {
|
|
11
|
-
this.flowSettingsService = inject(FlowSettingsService);
|
|
12
|
-
this.selectionService = inject(SelectionService);
|
|
13
|
-
this.parentEdge = inject(EdgeComponent, { optional: true });
|
|
14
|
-
this.parentNode = inject(NodeComponent, { optional: true });
|
|
15
|
-
this.host = inject(ElementRef);
|
|
16
|
-
this.selectOnEvent = this.getEvent$()
|
|
17
|
-
.pipe(tap(() => this.select()), takeUntilDestroyed())
|
|
18
|
-
.subscribe();
|
|
19
|
-
}
|
|
20
|
-
select() {
|
|
21
|
-
const entity = this.entity();
|
|
22
|
-
if (entity && this.flowSettingsService.entitiesSelectable()) {
|
|
23
|
-
this.selectionService.select(entity);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
entity() {
|
|
27
|
-
if (this.parentNode) {
|
|
28
|
-
return this.parentNode.model();
|
|
29
|
-
}
|
|
30
|
-
else if (this.parentEdge) {
|
|
31
|
-
return this.parentEdge.model();
|
|
32
|
-
}
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
getEvent$() {
|
|
36
|
-
return fromEvent(this.host.nativeElement, 'click');
|
|
37
|
-
}
|
|
38
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
39
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SelectableDirective, isStandalone: true, selector: "[selectable]", ngImport: i0 }); }
|
|
40
|
-
}
|
|
41
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectableDirective, decorators: [{
|
|
42
|
-
type: Directive,
|
|
43
|
-
args: [{
|
|
44
|
-
standalone: true,
|
|
45
|
-
selector: '[selectable]',
|
|
46
|
-
}]
|
|
47
|
-
}] });
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0YWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvZGlyZWN0aXZlcy9zZWxlY3RhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFNaEUsTUFBTSxPQUFPLG1CQUFtQjtJQUpoQztRQUtVLHdCQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVDLGVBQVUsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV2RCxTQUFJLEdBQUcsTUFBTSxDQUFzQixVQUFVLENBQUMsQ0FBQztRQUU3QyxrQkFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7YUFDdkMsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFDeEIsa0JBQWtCLEVBQUUsQ0FDckI7YUFDQSxTQUFTLEVBQUUsQ0FBQztLQXNCaEI7SUFwQlMsTUFBTTtRQUNaLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNO1FBQ1osSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDOytHQWxDVSxtQkFBbUI7bUdBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFKL0IsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGNBQWM7aUJBQ3pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBFZGdlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9lZGdlL2VkZ2UuY29tcG9uZW50JztcblxuaW1wb3J0IHsgRmxvd0VudGl0eSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZmxvdy1lbnRpdHkuaW50ZXJmYWNlJztcbmltcG9ydCB7IE5vZGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL25vZGUvbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmxvd1NldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Zsb3ctc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbc2VsZWN0YWJsZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RhYmxlRGlyZWN0aXZlIHtcbiAgcHJpdmF0ZSBmbG93U2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KEZsb3dTZXR0aW5nc1NlcnZpY2UpO1xuICBwcml2YXRlIHNlbGVjdGlvblNlcnZpY2UgPSBpbmplY3QoU2VsZWN0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcGFyZW50RWRnZSA9IGluamVjdChFZGdlQ29tcG9uZW50LCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHBhcmVudE5vZGUgPSBpbmplY3QoTm9kZUNvbXBvbmVudCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBwcml2YXRlIGhvc3QgPSBpbmplY3Q8RWxlbWVudFJlZjxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG5cbiAgcHJvdGVjdGVkIHNlbGVjdE9uRXZlbnQgPSB0aGlzLmdldEV2ZW50JCgpXG4gICAgLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zZWxlY3QoKSksXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICApXG4gICAgLnN1YnNjcmliZSgpO1xuXG4gIHByaXZhdGUgc2VsZWN0KCkge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5KCk7XG4gICAgaWYgKGVudGl0eSAmJiB0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuZW50aXRpZXNTZWxlY3RhYmxlKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3QoZW50aXR5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVudGl0eSgpOiBGbG93RW50aXR5IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5tb2RlbCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnRFZGdlKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnRFZGdlLm1vZGVsKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50JCgpIHtcbiAgICByZXR1cm4gZnJvbUV2ZW50KHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCAnY2xpY2snKTtcbiAgfVxufVxuIl19
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { Directive, ElementRef, computed, inject } from '@angular/core';
|
|
2
|
-
import { RootSvgReferenceDirective } from './reference.directive';
|
|
3
|
-
import { RootPointerDirective } from './root-pointer.directive';
|
|
4
|
-
import { toSignal } from '@angular/core/rxjs-interop';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class SpacePointContextDirective {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.pointerMovementDirective = inject(RootPointerDirective);
|
|
9
|
-
this.rootSvg = inject(RootSvgReferenceDirective).element;
|
|
10
|
-
this.host = inject(ElementRef).nativeElement;
|
|
11
|
-
/**
|
|
12
|
-
* Signal with current mouse position in svg space
|
|
13
|
-
*/
|
|
14
|
-
this.svgCurrentSpacePoint = computed(() => {
|
|
15
|
-
const movement = this.pointerMovement();
|
|
16
|
-
if (!movement) {
|
|
17
|
-
return { x: 0, y: 0 };
|
|
18
|
-
}
|
|
19
|
-
return this.documentPointToFlowPoint({
|
|
20
|
-
x: movement.x,
|
|
21
|
-
y: movement.y,
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
this.pointerMovement = toSignal(this.pointerMovementDirective.pointerMovement$);
|
|
25
|
-
}
|
|
26
|
-
documentPointToFlowPoint(documentPoint) {
|
|
27
|
-
const point = this.rootSvg.createSVGPoint();
|
|
28
|
-
point.x = documentPoint.x;
|
|
29
|
-
point.y = documentPoint.y;
|
|
30
|
-
return point.matrixTransform(this.host.getScreenCTM().inverse());
|
|
31
|
-
}
|
|
32
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpacePointContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
33
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SpacePointContextDirective, isStandalone: true, selector: "g[spacePointContext]", ngImport: i0 }); }
|
|
34
|
-
}
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpacePointContextDirective, decorators: [{
|
|
36
|
-
type: Directive,
|
|
37
|
-
args: [{
|
|
38
|
-
standalone: true,
|
|
39
|
-
selector: 'g[spacePointContext]',
|
|
40
|
-
}]
|
|
41
|
-
}] });
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhY2UtcG9pbnQtY29udGV4dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvZGlyZWN0aXZlcy9zcGFjZS1wb2ludC1jb250ZXh0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFNdEQsTUFBTSxPQUFPLDBCQUEwQjtJQUp2QztRQUtVLDZCQUF3QixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hELFlBQU8sR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDcEQsU0FBSSxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUMsYUFBYSxDQUFDO1FBRXpFOztXQUVHO1FBQ0kseUJBQW9CLEdBQWtCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBRXhDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDeEIsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO2dCQUNuQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSSxvQkFBZSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQVNuRjtJQVBRLHdCQUF3QixDQUFDLGFBQW9CO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDNUMsS0FBSyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUUxQixPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7K0dBN0JVLDBCQUEwQjttR0FBMUIsMEJBQTBCOzs0RkFBMUIsMEJBQTBCO2tCQUp0QyxTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsc0JBQXNCO2lCQUNqQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgU2lnbmFsLCBjb21wdXRlZCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb290U3ZnUmVmZXJlbmNlRGlyZWN0aXZlIH0gZnJvbSAnLi9yZWZlcmVuY2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wb2ludC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUm9vdFBvaW50ZXJEaXJlY3RpdmUgfSBmcm9tICcuL3Jvb3QtcG9pbnRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2dbc3BhY2VQb2ludENvbnRleHRdJyxcbn0pXG5leHBvcnQgY2xhc3MgU3BhY2VQb2ludENvbnRleHREaXJlY3RpdmUge1xuICBwcml2YXRlIHBvaW50ZXJNb3ZlbWVudERpcmVjdGl2ZSA9IGluamVjdChSb290UG9pbnRlckRpcmVjdGl2ZSk7XG4gIHByaXZhdGUgcm9vdFN2ZyA9IGluamVjdChSb290U3ZnUmVmZXJlbmNlRGlyZWN0aXZlKS5lbGVtZW50O1xuICBwcml2YXRlIGhvc3QgPSBpbmplY3Q8RWxlbWVudFJlZjxTVkdHRWxlbWVudD4+KEVsZW1lbnRSZWYpLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFNpZ25hbCB3aXRoIGN1cnJlbnQgbW91c2UgcG9zaXRpb24gaW4gc3ZnIHNwYWNlXG4gICAqL1xuICBwdWJsaWMgc3ZnQ3VycmVudFNwYWNlUG9pbnQ6IFNpZ25hbDxQb2ludD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbW92ZW1lbnQgPSB0aGlzLnBvaW50ZXJNb3ZlbWVudCgpO1xuXG4gICAgaWYgKCFtb3ZlbWVudCkge1xuICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRvY3VtZW50UG9pbnRUb0Zsb3dQb2ludCh7XG4gICAgICB4OiBtb3ZlbWVudC54LFxuICAgICAgeTogbW92ZW1lbnQueSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcHVibGljIHBvaW50ZXJNb3ZlbWVudCA9IHRvU2lnbmFsKHRoaXMucG9pbnRlck1vdmVtZW50RGlyZWN0aXZlLnBvaW50ZXJNb3ZlbWVudCQpO1xuXG4gIHB1YmxpYyBkb2N1bWVudFBvaW50VG9GbG93UG9pbnQoZG9jdW1lbnRQb2ludDogUG9pbnQpIHtcbiAgICBjb25zdCBwb2ludCA9IHRoaXMucm9vdFN2Zy5jcmVhdGVTVkdQb2ludCgpO1xuICAgIHBvaW50LnggPSBkb2N1bWVudFBvaW50Lng7XG4gICAgcG9pbnQueSA9IGRvY3VtZW50UG9pbnQueTtcblxuICAgIHJldHVybiBwb2ludC5tYXRyaXhUcmFuc2Zvcm0odGhpcy5ob3N0LmdldFNjcmVlbkNUTSgpIS5pbnZlcnNlKCkpO1xuICB9XG59XG4iXX0=
|