ngx-vflow 1.16.4 → 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,108 +0,0 @@
|
|
|
1
|
-
import { Component, computed, inject, Injector, signal, input, viewChild, ChangeDetectionStrategy, } from '@angular/core';
|
|
2
|
-
import { FlowEntitiesService } from '../../services/flow-entities.service';
|
|
3
|
-
import { MinimapModel } from '../../models/minimap.model';
|
|
4
|
-
import { FlowSettingsService } from '../../services/flow-settings.service';
|
|
5
|
-
import { getViewportForBounds } from '../../utils/viewport';
|
|
6
|
-
import { getNodesBounds } from '../../utils/nodes';
|
|
7
|
-
import { ViewportService } from '../../services/viewport.service';
|
|
8
|
-
import { DefaultNodeComponent } from '../../components/default-node/default-node.component';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class MiniMapComponent {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.entitiesService = inject(FlowEntitiesService);
|
|
13
|
-
this.flowSettingsService = inject(FlowSettingsService);
|
|
14
|
-
this.viewportService = inject(ViewportService);
|
|
15
|
-
this.injector = inject(Injector);
|
|
16
|
-
/**
|
|
17
|
-
* The color outside the viewport (invisible area)
|
|
18
|
-
*/
|
|
19
|
-
this.maskColor = input(`rgba(215, 215, 215, 0.6)`);
|
|
20
|
-
/**
|
|
21
|
-
* The minimap stroke color
|
|
22
|
-
*/
|
|
23
|
-
this.strokeColor = input(`rgb(200, 200, 200)`);
|
|
24
|
-
/**
|
|
25
|
-
* The corner of the flow where to render a mini-map
|
|
26
|
-
*/
|
|
27
|
-
this.position = input('bottom-right');
|
|
28
|
-
/**
|
|
29
|
-
* Make a minimap bigger on hover
|
|
30
|
-
*/
|
|
31
|
-
this.scaleOnHover = input(false);
|
|
32
|
-
this.minimap = viewChild.required('minimap');
|
|
33
|
-
this.minimapOffset = 10;
|
|
34
|
-
this.minimapScale = computed(() => {
|
|
35
|
-
if (this.scaleOnHover()) {
|
|
36
|
-
return this.hovered() ? 0.4 : 0.2;
|
|
37
|
-
}
|
|
38
|
-
return 0.2;
|
|
39
|
-
});
|
|
40
|
-
this.viewportColor = computed(() => {
|
|
41
|
-
const bg = this.flowSettingsService.background();
|
|
42
|
-
if (bg.type === 'dots' || bg.type === 'solid') {
|
|
43
|
-
return bg.color ?? '#fff';
|
|
44
|
-
}
|
|
45
|
-
return '#fff';
|
|
46
|
-
});
|
|
47
|
-
this.hovered = signal(false);
|
|
48
|
-
this.minimapPoint = computed(() => {
|
|
49
|
-
switch (this.position()) {
|
|
50
|
-
case 'top-left':
|
|
51
|
-
return { x: this.minimapOffset, y: this.minimapOffset };
|
|
52
|
-
case 'top-right':
|
|
53
|
-
return {
|
|
54
|
-
x: this.flowSettingsService.computedFlowWidth() - this.minimapWidth() - this.minimapOffset,
|
|
55
|
-
y: this.minimapOffset,
|
|
56
|
-
};
|
|
57
|
-
case 'bottom-left':
|
|
58
|
-
return {
|
|
59
|
-
x: this.minimapOffset,
|
|
60
|
-
y: this.flowSettingsService.computedFlowHeight() - this.minimapHeight() - this.minimapOffset,
|
|
61
|
-
};
|
|
62
|
-
case 'bottom-right':
|
|
63
|
-
return {
|
|
64
|
-
x: this.flowSettingsService.computedFlowWidth() - this.minimapWidth() - this.minimapOffset,
|
|
65
|
-
y: this.flowSettingsService.computedFlowHeight() - this.minimapHeight() - this.minimapOffset,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
this.minimapWidth = computed(() => this.flowSettingsService.computedFlowWidth() * this.minimapScale());
|
|
70
|
-
this.minimapHeight = computed(() => this.flowSettingsService.computedFlowHeight() * this.minimapScale());
|
|
71
|
-
this.viewportTransform = computed(() => {
|
|
72
|
-
const viewport = this.viewportService.readableViewport();
|
|
73
|
-
let scale = 1 / viewport.zoom;
|
|
74
|
-
let x = -(viewport.x * this.minimapScale()) * scale;
|
|
75
|
-
x /= this.minimapScale();
|
|
76
|
-
let y = -(viewport.y * this.minimapScale()) * scale;
|
|
77
|
-
y /= this.minimapScale();
|
|
78
|
-
scale /= this.minimapScale();
|
|
79
|
-
return `translate(${x}, ${y}) scale(${scale})`;
|
|
80
|
-
});
|
|
81
|
-
this.boundsViewport = computed(() => {
|
|
82
|
-
const nodes = this.entitiesService.nodes();
|
|
83
|
-
return getViewportForBounds(getNodesBounds(nodes), this.flowSettingsService.computedFlowWidth(), this.flowSettingsService.computedFlowHeight(), -Infinity, 1.5, 0);
|
|
84
|
-
});
|
|
85
|
-
this.minimapTransform = computed(() => {
|
|
86
|
-
const vport = this.boundsViewport();
|
|
87
|
-
const x = vport.x * this.minimapScale();
|
|
88
|
-
const y = vport.y * this.minimapScale();
|
|
89
|
-
const scale = vport.zoom * this.minimapScale();
|
|
90
|
-
return `translate(${x} ${y}) scale(${scale})`;
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
ngOnInit() {
|
|
94
|
-
const model = new MinimapModel();
|
|
95
|
-
model.template.set(this.minimap());
|
|
96
|
-
this.entitiesService.minimap.set(model);
|
|
97
|
-
}
|
|
98
|
-
trackNodes(idx, { rawNode }) {
|
|
99
|
-
return rawNode;
|
|
100
|
-
}
|
|
101
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MiniMapComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
102
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MiniMapComponent, isStandalone: true, selector: "mini-map", inputs: { maskColor: { classPropertyName: "maskColor", publicName: "maskColor", isSignal: true, isRequired: false, transformFunction: null }, strokeColor: { classPropertyName: "strokeColor", publicName: "strokeColor", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, scaleOnHover: { classPropertyName: "scaleOnHover", publicName: "scaleOnHover", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "minimap", first: true, predicate: ["minimap"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #minimap>\n <svg:rect\n fill=\"none\"\n [attr.x]=\"minimapPoint().x\"\n [attr.y]=\"minimapPoint().y\"\n [attr.width]=\"minimapWidth()\"\n [attr.height]=\"minimapHeight()\"\n [attr.stroke]=\"strokeColor()\" />\n\n <svg:svg\n [attr.x]=\"minimapPoint().x\"\n [attr.y]=\"minimapPoint().y\"\n [attr.width]=\"minimapWidth()\"\n [attr.height]=\"minimapHeight()\"\n (mouseover)=\"hovered.set(true)\"\n (mouseleave)=\"hovered.set(false)\">\n <svg:rect [attr.width]=\"minimapWidth()\" [attr.height]=\"minimapHeight()\" [attr.fill]=\"maskColor()\" />\n\n <svg:g [attr.transform]=\"minimapTransform()\">\n <svg:rect\n [attr.fill]=\"viewportColor()\"\n [attr.transform]=\"viewportTransform()\"\n [attr.width]=\"minimapWidth()\"\n [attr.height]=\"minimapHeight()\" />\n\n @for (model of entitiesService.nodes(); track trackNodes($index, model)) {\n <ng-container>\n @if (model.rawNode.type === 'default' || model.rawNode.type === 'html-template' || model.isComponentType) {\n <svg:foreignObject\n [attr.transform]=\"model.pointTransform()\"\n [attr.width]=\"model.size().width\"\n [attr.height]=\"model.size().height\">\n <default-node\n [selected]=\"model.selected()\"\n [style.width.px]=\"model.size().width\"\n [style.height.px]=\"model.size().height\"\n [style.max-width.px]=\"model.size().width\"\n [style.max-height.px]=\"model.size().height\">\n <div [outerHTML]=\"model.text()\"></div>\n </default-node>\n </svg:foreignObject>\n }\n @if (model.rawNode.type === 'default-group' || model.rawNode.type === 'template-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [attr.transform]=\"model.pointTransform()\"\n [class.default-group-node_selected]=\"model.selected()\"\n [attr.width]=\"model.size().width\"\n [attr.height]=\"model.size().height\"\n [style.stroke]=\"model.color()\"\n [style.fill]=\"model.color()\" />\n }\n </ng-container>\n }\n </svg:g>\n </svg:svg>\n</ng-template>\n", styles: [".default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}\n"], dependencies: [{ kind: "component", type: DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
103
|
-
}
|
|
104
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MiniMapComponent, decorators: [{
|
|
105
|
-
type: Component,
|
|
106
|
-
args: [{ standalone: true, selector: 'mini-map', imports: [DefaultNodeComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #minimap>\n <svg:rect\n fill=\"none\"\n [attr.x]=\"minimapPoint().x\"\n [attr.y]=\"minimapPoint().y\"\n [attr.width]=\"minimapWidth()\"\n [attr.height]=\"minimapHeight()\"\n [attr.stroke]=\"strokeColor()\" />\n\n <svg:svg\n [attr.x]=\"minimapPoint().x\"\n [attr.y]=\"minimapPoint().y\"\n [attr.width]=\"minimapWidth()\"\n [attr.height]=\"minimapHeight()\"\n (mouseover)=\"hovered.set(true)\"\n (mouseleave)=\"hovered.set(false)\">\n <svg:rect [attr.width]=\"minimapWidth()\" [attr.height]=\"minimapHeight()\" [attr.fill]=\"maskColor()\" />\n\n <svg:g [attr.transform]=\"minimapTransform()\">\n <svg:rect\n [attr.fill]=\"viewportColor()\"\n [attr.transform]=\"viewportTransform()\"\n [attr.width]=\"minimapWidth()\"\n [attr.height]=\"minimapHeight()\" />\n\n @for (model of entitiesService.nodes(); track trackNodes($index, model)) {\n <ng-container>\n @if (model.rawNode.type === 'default' || model.rawNode.type === 'html-template' || model.isComponentType) {\n <svg:foreignObject\n [attr.transform]=\"model.pointTransform()\"\n [attr.width]=\"model.size().width\"\n [attr.height]=\"model.size().height\">\n <default-node\n [selected]=\"model.selected()\"\n [style.width.px]=\"model.size().width\"\n [style.height.px]=\"model.size().height\"\n [style.max-width.px]=\"model.size().width\"\n [style.max-height.px]=\"model.size().height\">\n <div [outerHTML]=\"model.text()\"></div>\n </default-node>\n </svg:foreignObject>\n }\n @if (model.rawNode.type === 'default-group' || model.rawNode.type === 'template-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [attr.transform]=\"model.pointTransform()\"\n [class.default-group-node_selected]=\"model.selected()\"\n [attr.width]=\"model.size().width\"\n [attr.height]=\"model.size().height\"\n [style.stroke]=\"model.color()\"\n [style.fill]=\"model.color()\" />\n }\n </ng-container>\n }\n </svg:g>\n </svg:svg>\n</ng-template>\n", styles: [".default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}\n"] }]
|
|
107
|
-
}] });
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvcHVibGljLWNvbXBvbmVudHMvbWluaW1hcC9taW5pbWFwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9taW5pbWFwL21pbmltYXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFFBQVEsRUFFUixNQUFNLEVBRU4sS0FBSyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsR0FDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7O0FBWTVGLE1BQU0sT0FBTyxnQkFBZ0I7SUFSN0I7UUFTWSxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzlDLHdCQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzFDLGFB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QUMsY0FBYyxFQUFFLENBQUM7WUFFcEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFL0MsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxHQUFHLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7S0FZSjtJQVZRLFFBQVE7UUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRVMsVUFBVSxDQUFDLEdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBYTtRQUN0RCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOytHQTFIVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQixndUJDL0I3Qiw0ekVBMkRBLGtLRC9CWSxvQkFBb0I7OzRGQUduQixnQkFBZ0I7a0JBUjVCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLFVBQVUsV0FHWCxDQUFDLG9CQUFvQixDQUFDLG1CQUNkLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIEluamVjdG9yLFxuICBPbkluaXQsXG4gIHNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIGlucHV0LFxuICB2aWV3Q2hpbGQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZsb3dFbnRpdGllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LWVudGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWluaW1hcE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21pbmltYXAubW9kZWwnO1xuaW1wb3J0IHsgTm9kZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25vZGUubW9kZWwnO1xuaW1wb3J0IHsgRmxvd1NldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zsb3ctc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBnZXRWaWV3cG9ydEZvckJvdW5kcyB9IGZyb20gJy4uLy4uL3V0aWxzL3ZpZXdwb3J0JztcbmltcG9ydCB7IGdldE5vZGVzQm91bmRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvbm9kZXMnO1xuaW1wb3J0IHsgVmlld3BvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmlld3BvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBEZWZhdWx0Tm9kZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZGVmYXVsdC1ub2RlL2RlZmF1bHQtbm9kZS5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBNaW5pTWFwUG9zaXRpb24gPSAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ21pbmktbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21pbmltYXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtgLi9taW5pbWFwLmNvbXBvbmVudC5zY3NzYF0sXG4gIGltcG9ydHM6IFtEZWZhdWx0Tm9kZUNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNaW5pTWFwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJvdGVjdGVkIGVudGl0aWVzU2VydmljZSA9IGluamVjdChGbG93RW50aXRpZXNTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIGZsb3dTZXR0aW5nc1NlcnZpY2UgPSBpbmplY3QoRmxvd1NldHRpbmdzU2VydmljZSk7XG4gIHByb3RlY3RlZCB2aWV3cG9ydFNlcnZpY2UgPSBpbmplY3QoVmlld3BvcnRTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG91dHNpZGUgdGhlIHZpZXdwb3J0IChpbnZpc2libGUgYXJlYSlcbiAgICovXG4gIHB1YmxpYyBtYXNrQ29sb3IgPSBpbnB1dChgcmdiYSgyMTUsIDIxNSwgMjE1LCAwLjYpYCk7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbWFwIHN0cm9rZSBjb2xvclxuICAgKi9cbiAgcHVibGljIHN0cm9rZUNvbG9yID0gaW5wdXQoYHJnYigyMDAsIDIwMCwgMjAwKWApO1xuXG4gIC8qKlxuICAgKiBUaGUgY29ybmVyIG9mIHRoZSBmbG93IHdoZXJlIHRvIHJlbmRlciBhIG1pbmktbWFwXG4gICAqL1xuICBwdWJsaWMgcG9zaXRpb24gPSBpbnB1dDxNaW5pTWFwUG9zaXRpb24+KCdib3R0b20tcmlnaHQnKTtcblxuICAvKipcbiAgICogTWFrZSBhIG1pbmltYXAgYmlnZ2VyIG9uIGhvdmVyXG4gICAqL1xuICBwdWJsaWMgc2NhbGVPbkhvdmVyID0gaW5wdXQoZmFsc2UpO1xuXG4gIHByaXZhdGUgbWluaW1hcCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxUZW1wbGF0ZVJlZjx1bmtub3duPj4oJ21pbmltYXAnKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1pbmltYXBPZmZzZXQgPSAxMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1pbmltYXBTY2FsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAodGhpcy5zY2FsZU9uSG92ZXIoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaG92ZXJlZCgpID8gMC40IDogMC4yO1xuICAgIH1cblxuICAgIHJldHVybiAwLjI7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCB2aWV3cG9ydENvbG9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJnID0gdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmJhY2tncm91bmQoKTtcblxuICAgIGlmIChiZy50eXBlID09PSAnZG90cycgfHwgYmcudHlwZSA9PT0gJ3NvbGlkJykge1xuICAgICAgcmV0dXJuIGJnLmNvbG9yID8/ICcjZmZmJztcbiAgICB9XG5cbiAgICByZXR1cm4gJyNmZmYnO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgaG92ZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJvdGVjdGVkIG1pbmltYXBQb2ludCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMucG9zaXRpb24oKSkge1xuICAgICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICByZXR1cm4geyB4OiB0aGlzLm1pbmltYXBPZmZzZXQsIHk6IHRoaXMubWluaW1hcE9mZnNldCB9O1xuICAgICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuY29tcHV0ZWRGbG93V2lkdGgoKSAtIHRoaXMubWluaW1hcFdpZHRoKCkgLSB0aGlzLm1pbmltYXBPZmZzZXQsXG4gICAgICAgICAgeTogdGhpcy5taW5pbWFwT2Zmc2V0LFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHRoaXMubWluaW1hcE9mZnNldCxcbiAgICAgICAgICB5OiB0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuY29tcHV0ZWRGbG93SGVpZ2h0KCkgLSB0aGlzLm1pbmltYXBIZWlnaHQoKSAtIHRoaXMubWluaW1hcE9mZnNldCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmNvbXB1dGVkRmxvd1dpZHRoKCkgLSB0aGlzLm1pbmltYXBXaWR0aCgpIC0gdGhpcy5taW5pbWFwT2Zmc2V0LFxuICAgICAgICAgIHk6IHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5jb21wdXRlZEZsb3dIZWlnaHQoKSAtIHRoaXMubWluaW1hcEhlaWdodCgpIC0gdGhpcy5taW5pbWFwT2Zmc2V0LFxuICAgICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvdGVjdGVkIG1pbmltYXBXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5jb21wdXRlZEZsb3dXaWR0aCgpICogdGhpcy5taW5pbWFwU2NhbGUoKSk7XG4gIHByb3RlY3RlZCBtaW5pbWFwSGVpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmNvbXB1dGVkRmxvd0hlaWdodCgpICogdGhpcy5taW5pbWFwU2NhbGUoKSk7XG5cbiAgcHJvdGVjdGVkIHZpZXdwb3J0VHJhbnNmb3JtID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpO1xuICAgIGxldCBzY2FsZSA9IDEgLyB2aWV3cG9ydC56b29tO1xuXG4gICAgbGV0IHggPSAtKHZpZXdwb3J0LnggKiB0aGlzLm1pbmltYXBTY2FsZSgpKSAqIHNjYWxlO1xuICAgIHggLz0gdGhpcy5taW5pbWFwU2NhbGUoKTtcblxuICAgIGxldCB5ID0gLSh2aWV3cG9ydC55ICogdGhpcy5taW5pbWFwU2NhbGUoKSkgKiBzY2FsZTtcbiAgICB5IC89IHRoaXMubWluaW1hcFNjYWxlKCk7XG5cbiAgICBzY2FsZSAvPSB0aGlzLm1pbmltYXBTY2FsZSgpO1xuXG4gICAgcmV0dXJuIGB0cmFuc2xhdGUoJHt4fSwgJHt5fSkgc2NhbGUoJHtzY2FsZX0pYDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIGJvdW5kc1ZpZXdwb3J0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5lbnRpdGllc1NlcnZpY2Uubm9kZXMoKTtcblxuICAgIHJldHVybiBnZXRWaWV3cG9ydEZvckJvdW5kcyhcbiAgICAgIGdldE5vZGVzQm91bmRzKG5vZGVzKSxcbiAgICAgIHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5jb21wdXRlZEZsb3dXaWR0aCgpLFxuICAgICAgdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmNvbXB1dGVkRmxvd0hlaWdodCgpLFxuICAgICAgLUluZmluaXR5LFxuICAgICAgMS41LFxuICAgICAgMCxcbiAgICApO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgbWluaW1hcFRyYW5zZm9ybSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2cG9ydCA9IHRoaXMuYm91bmRzVmlld3BvcnQoKTtcblxuICAgIGNvbnN0IHggPSB2cG9ydC54ICogdGhpcy5taW5pbWFwU2NhbGUoKTtcbiAgICBjb25zdCB5ID0gdnBvcnQueSAqIHRoaXMubWluaW1hcFNjYWxlKCk7XG4gICAgY29uc3Qgc2NhbGUgPSB2cG9ydC56b29tICogdGhpcy5taW5pbWFwU2NhbGUoKTtcblxuICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eH0gJHt5fSkgc2NhbGUoJHtzY2FsZX0pYDtcbiAgfSk7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGVsID0gbmV3IE1pbmltYXBNb2RlbCgpO1xuICAgIG1vZGVsLnRlbXBsYXRlLnNldCh0aGlzLm1pbmltYXAoKSk7XG5cbiAgICB0aGlzLmVudGl0aWVzU2VydmljZS5taW5pbWFwLnNldChtb2RlbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tOb2RlcyhpZHg6IG51bWJlciwgeyByYXdOb2RlIH06IE5vZGVNb2RlbCkge1xuICAgIHJldHVybiByYXdOb2RlO1xuICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI21pbmltYXA+XG4gIDxzdmc6cmVjdFxuICAgIGZpbGw9XCJub25lXCJcbiAgICBbYXR0ci54XT1cIm1pbmltYXBQb2ludCgpLnhcIlxuICAgIFthdHRyLnldPVwibWluaW1hcFBvaW50KCkueVwiXG4gICAgW2F0dHIud2lkdGhdPVwibWluaW1hcFdpZHRoKClcIlxuICAgIFthdHRyLmhlaWdodF09XCJtaW5pbWFwSGVpZ2h0KClcIlxuICAgIFthdHRyLnN0cm9rZV09XCJzdHJva2VDb2xvcigpXCIgLz5cblxuICA8c3ZnOnN2Z1xuICAgIFthdHRyLnhdPVwibWluaW1hcFBvaW50KCkueFwiXG4gICAgW2F0dHIueV09XCJtaW5pbWFwUG9pbnQoKS55XCJcbiAgICBbYXR0ci53aWR0aF09XCJtaW5pbWFwV2lkdGgoKVwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cIm1pbmltYXBIZWlnaHQoKVwiXG4gICAgKG1vdXNlb3Zlcik9XCJob3ZlcmVkLnNldCh0cnVlKVwiXG4gICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZC5zZXQoZmFsc2UpXCI+XG4gICAgPHN2ZzpyZWN0IFthdHRyLndpZHRoXT1cIm1pbmltYXBXaWR0aCgpXCIgW2F0dHIuaGVpZ2h0XT1cIm1pbmltYXBIZWlnaHQoKVwiIFthdHRyLmZpbGxdPVwibWFza0NvbG9yKClcIiAvPlxuXG4gICAgPHN2ZzpnIFthdHRyLnRyYW5zZm9ybV09XCJtaW5pbWFwVHJhbnNmb3JtKClcIj5cbiAgICAgIDxzdmc6cmVjdFxuICAgICAgICBbYXR0ci5maWxsXT1cInZpZXdwb3J0Q29sb3IoKVwiXG4gICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJ2aWV3cG9ydFRyYW5zZm9ybSgpXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwibWluaW1hcFdpZHRoKClcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwibWluaW1hcEhlaWdodCgpXCIgLz5cblxuICAgICAgQGZvciAobW9kZWwgb2YgZW50aXRpZXNTZXJ2aWNlLm5vZGVzKCk7IHRyYWNrIHRyYWNrTm9kZXMoJGluZGV4LCBtb2RlbCkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICBAaWYgKG1vZGVsLnJhd05vZGUudHlwZSA9PT0gJ2RlZmF1bHQnIHx8IG1vZGVsLnJhd05vZGUudHlwZSA9PT0gJ2h0bWwtdGVtcGxhdGUnIHx8IG1vZGVsLmlzQ29tcG9uZW50VHlwZSkge1xuICAgICAgICAgICAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgICAgICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJtb2RlbC5wb2ludFRyYW5zZm9ybSgpXCJcbiAgICAgICAgICAgICAgW2F0dHIud2lkdGhdPVwibW9kZWwuc2l6ZSgpLndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cIm1vZGVsLnNpemUoKS5oZWlnaHRcIj5cbiAgICAgICAgICAgICAgPGRlZmF1bHQtbm9kZVxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJtb2RlbC5zZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwibW9kZWwuc2l6ZSgpLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIm1vZGVsLnNpemUoKS5oZWlnaHRcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwibW9kZWwuc2l6ZSgpLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWF4LWhlaWdodC5weF09XCJtb2RlbC5zaXplKCkuaGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbb3V0ZXJIVE1MXT1cIm1vZGVsLnRleHQoKVwiPjwvZGl2PlxuICAgICAgICAgICAgICA8L2RlZmF1bHQtbm9kZT5cbiAgICAgICAgICAgIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAobW9kZWwucmF3Tm9kZS50eXBlID09PSAnZGVmYXVsdC1ncm91cCcgfHwgbW9kZWwucmF3Tm9kZS50eXBlID09PSAndGVtcGxhdGUtZ3JvdXAnKSB7XG4gICAgICAgICAgICA8c3ZnOnJlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJkZWZhdWx0LWdyb3VwLW5vZGVcIlxuICAgICAgICAgICAgICByeD1cIjVcIlxuICAgICAgICAgICAgICByeT1cIjVcIlxuICAgICAgICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwibW9kZWwucG9pbnRUcmFuc2Zvcm0oKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kZWZhdWx0LWdyb3VwLW5vZGVfc2VsZWN0ZWRdPVwibW9kZWwuc2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cIm1vZGVsLnNpemUoKS53aWR0aFwiXG4gICAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCJtb2RlbC5zaXplKCkuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgW3N0eWxlLnN0cm9rZV09XCJtb2RlbC5jb2xvcigpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmZpbGxdPVwibW9kZWwuY29sb3IoKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIH1cbiAgICA8L3N2ZzpnPlxuICA8L3N2Zzpzdmc+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, ElementRef, inject, input, viewChild, effect, forwardRef, NgZone, DestroyRef, } from '@angular/core';
|
|
2
|
-
import { Directive } from '@angular/core';
|
|
3
|
-
import { ToolbarModel } from '../../models/toolbar.model';
|
|
4
|
-
import { OverlaysService } from '../../services/overlays.service';
|
|
5
|
-
import { NodeAccessorService } from '../../services/node-accessor.service';
|
|
6
|
-
import { resizable } from '../../utils/resizable';
|
|
7
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
-
import { tap } from 'rxjs';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class NodeToolbarComponent {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.overlaysService = inject(OverlaysService);
|
|
13
|
-
this.nodeService = inject(NodeAccessorService);
|
|
14
|
-
this.position = input('top');
|
|
15
|
-
this.toolbarContentTemplate = viewChild.required('toolbar');
|
|
16
|
-
this.model = new ToolbarModel(this.nodeService.model());
|
|
17
|
-
effect(() => this.model.position.set(this.position()), { allowSignalWrites: true });
|
|
18
|
-
}
|
|
19
|
-
ngOnInit() {
|
|
20
|
-
this.model.template.set(this.toolbarContentTemplate());
|
|
21
|
-
this.overlaysService.addToolbar(this.model);
|
|
22
|
-
}
|
|
23
|
-
ngOnDestroy() {
|
|
24
|
-
this.overlaysService.removeToolbar(this.model);
|
|
25
|
-
}
|
|
26
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
27
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: NodeToolbarComponent, isStandalone: true, selector: "node-toolbar", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "toolbarContentTemplate", first: true, predicate: ["toolbar"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
28
|
-
<ng-template #toolbar>
|
|
29
|
-
<div class="wrapper" nodeToolbarWrapper [model]="model">
|
|
30
|
-
<ng-content />
|
|
31
|
-
</div>
|
|
32
|
-
</ng-template>
|
|
33
|
-
`, isInline: true, styles: [".wrapper{width:max-content}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(() => NodeToolbarWrapperDirective), selector: "[nodeToolbarWrapper]", inputs: ["model"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
34
|
-
}
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeToolbarComponent, decorators: [{
|
|
36
|
-
type: Component,
|
|
37
|
-
args: [{ standalone: true, selector: 'node-toolbar', template: `
|
|
38
|
-
<ng-template #toolbar>
|
|
39
|
-
<div class="wrapper" nodeToolbarWrapper [model]="model">
|
|
40
|
-
<ng-content />
|
|
41
|
-
</div>
|
|
42
|
-
</ng-template>
|
|
43
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, imports: [forwardRef(() => NodeToolbarWrapperDirective)], styles: [".wrapper{width:max-content}\n"] }]
|
|
44
|
-
}], ctorParameters: () => [] });
|
|
45
|
-
export class NodeToolbarWrapperDirective {
|
|
46
|
-
constructor() {
|
|
47
|
-
this.element = inject(ElementRef);
|
|
48
|
-
this.zone = inject(NgZone);
|
|
49
|
-
this.destroyRef = inject(DestroyRef);
|
|
50
|
-
this.model = input.required();
|
|
51
|
-
}
|
|
52
|
-
ngOnInit() {
|
|
53
|
-
resizable([this.element.nativeElement], this.zone)
|
|
54
|
-
.pipe(tap(() => this.setSize()), takeUntilDestroyed(this.destroyRef))
|
|
55
|
-
.subscribe();
|
|
56
|
-
}
|
|
57
|
-
setSize() {
|
|
58
|
-
this.model().size.set({
|
|
59
|
-
width: this.element.nativeElement.clientWidth,
|
|
60
|
-
height: this.element.nativeElement.clientHeight,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeToolbarWrapperDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
64
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.12", type: NodeToolbarWrapperDirective, isStandalone: true, selector: "[nodeToolbarWrapper]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
|
|
65
|
-
}
|
|
66
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeToolbarWrapperDirective, decorators: [{
|
|
67
|
-
type: Directive,
|
|
68
|
-
args: [{
|
|
69
|
-
selector: '[nodeToolbarWrapper]',
|
|
70
|
-
standalone: true,
|
|
71
|
-
}]
|
|
72
|
-
}] });
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9ub2RlLXRvb2xiYXIvbm9kZS10b29sYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUlOLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFzQjNCLE1BQU0sT0FBTyxvQkFBb0I7SUFVL0I7UUFUUSxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxQyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRTNDLGFBQVEsR0FBRyxLQUFLLENBQVcsS0FBSyxDQUFDLENBQUM7UUFFL0IsMkJBQXNCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBdUIsU0FBUyxDQUFDLENBQUM7UUFFN0UsVUFBSyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFHLENBQUMsQ0FBQztRQUc1RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQzsrR0F0QlUsb0JBQW9CO21HQUFwQixvQkFBb0Isd1ZBakJyQjs7Ozs7O0dBTVQsMkhBd0NVLDJCQUEyQjs7NEZBN0IzQixvQkFBb0I7a0JBcEJoQyxTQUFTO2lDQUNJLElBQUksWUFDTixjQUFjLFlBQ2Q7Ozs7OztHQU1ULG1CQVFnQix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7O0FBK0IxRCxNQUFNLE9BQU8sMkJBQTJCO0lBSnhDO1FBS1UsWUFBTyxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFDN0MsU0FBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFDLFVBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFnQixDQUFDO0tBaUIvQztJQWZRLFFBQVE7UUFDYixTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDL0MsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFDekIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUNwQzthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTyxPQUFPO1FBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDcEIsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVc7WUFDN0MsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVk7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FyQlUsMkJBQTJCO21HQUEzQiwyQkFBMkI7OzRGQUEzQiwyQkFBMkI7a0JBSnZDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIGlucHV0LFxuICB2aWV3Q2hpbGQsXG4gIGVmZmVjdCxcbiAgZm9yd2FyZFJlZixcbiAgTmdab25lLFxuICBEZXN0cm95UmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUG9zaXRpb24gfSBmcm9tICcuLi8uLi90eXBlcy9wb3NpdGlvbi50eXBlJztcbmltcG9ydCB7IFRvb2xiYXJNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy90b29sYmFyLm1vZGVsJztcbmltcG9ydCB7IE92ZXJsYXlzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXlzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUFjY2Vzc29yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyByZXNpemFibGUgfSBmcm9tICcuLi8uLi91dGlscy9yZXNpemFibGUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25vZGUtdG9vbGJhcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFyPlxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIiBub2RlVG9vbGJhcldyYXBwZXIgW21vZGVsXT1cIm1vZGVsXCI+XG4gICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAud3JhcHBlciB7XG4gICAgICAgIHdpZHRoOiBtYXgtY29udGVudDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW2ZvcndhcmRSZWYoKCkgPT4gTm9kZVRvb2xiYXJXcmFwcGVyRGlyZWN0aXZlKV0sXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVUb29sYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIG92ZXJsYXlzU2VydmljZSA9IGluamVjdChPdmVybGF5c1NlcnZpY2UpO1xuICBwcml2YXRlIG5vZGVTZXJ2aWNlID0gaW5qZWN0KE5vZGVBY2Nlc3NvclNlcnZpY2UpO1xuXG4gIHB1YmxpYyBwb3NpdGlvbiA9IGlucHV0PFBvc2l0aW9uPigndG9wJyk7XG5cbiAgcHJvdGVjdGVkIHRvb2xiYXJDb250ZW50VGVtcGxhdGUgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8VGVtcGxhdGVSZWY8dW5rbm93bj4+KCd0b29sYmFyJyk7XG5cbiAgcHJvdGVjdGVkIG1vZGVsID0gbmV3IFRvb2xiYXJNb2RlbCh0aGlzLm5vZGVTZXJ2aWNlLm1vZGVsKCkhKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4gdGhpcy5tb2RlbC5wb3NpdGlvbi5zZXQodGhpcy5wb3NpdGlvbigpKSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsLnRlbXBsYXRlLnNldCh0aGlzLnRvb2xiYXJDb250ZW50VGVtcGxhdGUoKSk7XG5cbiAgICB0aGlzLm92ZXJsYXlzU2VydmljZS5hZGRUb29sYmFyKHRoaXMubW9kZWwpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub3ZlcmxheXNTZXJ2aWNlLnJlbW92ZVRvb2xiYXIodGhpcy5tb2RlbCk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25vZGVUb29sYmFyV3JhcHBlcl0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlVG9vbGJhcldyYXBwZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGVsZW1lbnQgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHB1YmxpYyBtb2RlbCA9IGlucHV0LnJlcXVpcmVkPFRvb2xiYXJNb2RlbD4oKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgcmVzaXphYmxlKFt0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudF0sIHRoaXMuem9uZSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5zZXRTaXplKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2l6ZSgpIHtcbiAgICB0aGlzLm1vZGVsKCkuc2l6ZS5zZXQoe1xuICAgICAgd2lkdGg6IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { Component, computed, ElementRef, inject, input, viewChild, effect, ChangeDetectionStrategy, } from '@angular/core';
|
|
3
|
-
import { RootPointerDirective } from '../../directives/root-pointer.directive';
|
|
4
|
-
import { filter, tap } from 'rxjs';
|
|
5
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
-
import { ViewportService } from '../../services/viewport.service';
|
|
7
|
-
import { round } from '../../utils/round';
|
|
8
|
-
import { Microtask } from '../../decorators/microtask.decorator';
|
|
9
|
-
import { getNodesBounds } from '../../utils/nodes';
|
|
10
|
-
import { NodeAccessorService } from '../../services/node-accessor.service';
|
|
11
|
-
import { SpacePointContextDirective } from '../../directives/space-point-context.directive';
|
|
12
|
-
import { PointerDirective } from '../../directives/pointer.directive';
|
|
13
|
-
import { FlowSettingsService } from '../../services/flow-settings.service';
|
|
14
|
-
import { align } from '../../utils/align-number';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
export class ResizableComponent {
|
|
17
|
-
get model() {
|
|
18
|
-
return this.nodeAccessor.model();
|
|
19
|
-
}
|
|
20
|
-
constructor() {
|
|
21
|
-
this.nodeAccessor = inject(NodeAccessorService);
|
|
22
|
-
this.rootPointer = inject(RootPointerDirective);
|
|
23
|
-
this.viewportService = inject(ViewportService);
|
|
24
|
-
this.spacePointContext = inject(SpacePointContextDirective);
|
|
25
|
-
this.settingsService = inject(FlowSettingsService);
|
|
26
|
-
this.hostRef = inject(ElementRef);
|
|
27
|
-
this.resizable = input();
|
|
28
|
-
this.resizerColor = input('#2e414c');
|
|
29
|
-
this.gap = input(1.5);
|
|
30
|
-
this.resizer = viewChild.required('resizer');
|
|
31
|
-
this.lineGap = 3;
|
|
32
|
-
this.handleSize = 6;
|
|
33
|
-
this.resizeSide = null;
|
|
34
|
-
this.zoom = computed(() => this.viewportService.readableViewport().zoom ?? 0);
|
|
35
|
-
this.minWidth = 0;
|
|
36
|
-
this.minHeight = 0;
|
|
37
|
-
this.maxWidth = Infinity;
|
|
38
|
-
this.maxHeight = Infinity;
|
|
39
|
-
// TODO: allow reszie beside the flow
|
|
40
|
-
this.resizeOnGlobalMouseMove = this.rootPointer.pointerMovement$
|
|
41
|
-
.pipe(filter(() => this.resizeSide !== null), filter((event) => event.movementX !== 0 || event.movementY !== 0), tap((event) => this.resize(event)), takeUntilDestroyed())
|
|
42
|
-
.subscribe();
|
|
43
|
-
this.endResizeOnGlobalMouseUp = this.rootPointer.documentPointerEnd$
|
|
44
|
-
.pipe(tap(() => this.endResize()), takeUntilDestroyed())
|
|
45
|
-
.subscribe();
|
|
46
|
-
effect(() => {
|
|
47
|
-
const resizable = this.resizable();
|
|
48
|
-
if (typeof resizable === 'boolean') {
|
|
49
|
-
this.model.resizable.set(resizable);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
this.model.resizable.set(true);
|
|
53
|
-
}
|
|
54
|
-
}, { allowSignalWrites: true });
|
|
55
|
-
}
|
|
56
|
-
ngOnInit() {
|
|
57
|
-
this.model.controlledByResizer.set(true);
|
|
58
|
-
this.model.resizerTemplate.set(this.resizer());
|
|
59
|
-
}
|
|
60
|
-
ngOnDestroy() {
|
|
61
|
-
this.model.controlledByResizer.set(false);
|
|
62
|
-
}
|
|
63
|
-
ngAfterViewInit() {
|
|
64
|
-
this.minWidth = +getComputedStyle(this.hostRef.nativeElement).minWidth.replace('px', '') || 0;
|
|
65
|
-
this.minHeight = +getComputedStyle(this.hostRef.nativeElement).minHeight.replace('px', '') || 0;
|
|
66
|
-
this.maxWidth = +getComputedStyle(this.hostRef.nativeElement).maxWidth.replace('px', '') || Infinity;
|
|
67
|
-
this.maxHeight = +getComputedStyle(this.hostRef.nativeElement).maxHeight.replace('px', '') || Infinity;
|
|
68
|
-
}
|
|
69
|
-
startResize(side, event) {
|
|
70
|
-
event.stopPropagation();
|
|
71
|
-
this.resizeSide = side;
|
|
72
|
-
this.model.resizing.set(true);
|
|
73
|
-
}
|
|
74
|
-
resize(event) {
|
|
75
|
-
if (!this.resizeSide)
|
|
76
|
-
return;
|
|
77
|
-
const offset = calcOffset(event.movementX, event.movementY, this.zoom());
|
|
78
|
-
const resized = this.applyResize(this.resizeSide, this.model, offset, this.getDistanceToEdge(event));
|
|
79
|
-
const { x, y, width, height } = constrainRect(resized, this.model, this.resizeSide, this.minWidth, this.minHeight, this.maxWidth, this.maxHeight);
|
|
80
|
-
this.model.setPoint({ x, y });
|
|
81
|
-
this.model.width.set(width);
|
|
82
|
-
this.model.height.set(height);
|
|
83
|
-
}
|
|
84
|
-
endResize() {
|
|
85
|
-
this.resizeSide = null;
|
|
86
|
-
this.model.resizing.set(false);
|
|
87
|
-
}
|
|
88
|
-
getDistanceToEdge(event) {
|
|
89
|
-
const flowPoint = this.spacePointContext.documentPointToFlowPoint({ x: event.x, y: event.y });
|
|
90
|
-
const { x, y } = this.model.globalPoint();
|
|
91
|
-
return {
|
|
92
|
-
left: flowPoint.x - x,
|
|
93
|
-
right: flowPoint.x - (x + this.model.width()),
|
|
94
|
-
top: flowPoint.y - y,
|
|
95
|
-
bottom: flowPoint.y - (y + this.model.height()),
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
applyResize(side, model, offset, distanceToEdge) {
|
|
99
|
-
const { x, y } = model.point();
|
|
100
|
-
const width = model.width();
|
|
101
|
-
const height = model.height();
|
|
102
|
-
const [snapX, snapY] = this.settingsService.snapGrid();
|
|
103
|
-
switch (side) {
|
|
104
|
-
case 'left': {
|
|
105
|
-
const movementX = offset.x + distanceToEdge.left;
|
|
106
|
-
const newX = align(x + movementX, snapX);
|
|
107
|
-
const deltaX = newX - x;
|
|
108
|
-
return {
|
|
109
|
-
x: newX,
|
|
110
|
-
y,
|
|
111
|
-
width: width - deltaX,
|
|
112
|
-
height,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
case 'right': {
|
|
116
|
-
const movementX = offset.x + distanceToEdge.right;
|
|
117
|
-
const newWidth = align(width + movementX, snapX);
|
|
118
|
-
return {
|
|
119
|
-
x,
|
|
120
|
-
y,
|
|
121
|
-
width: newWidth,
|
|
122
|
-
height,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
case 'top': {
|
|
126
|
-
const movementY = offset.y + distanceToEdge.top;
|
|
127
|
-
const newY = align(y + movementY, snapY);
|
|
128
|
-
const deltaY = newY - y;
|
|
129
|
-
return {
|
|
130
|
-
x,
|
|
131
|
-
y: newY,
|
|
132
|
-
width,
|
|
133
|
-
height: height - deltaY,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
case 'bottom': {
|
|
137
|
-
const movementY = offset.y + distanceToEdge.bottom;
|
|
138
|
-
const newHeight = align(height + movementY, snapY);
|
|
139
|
-
return {
|
|
140
|
-
x,
|
|
141
|
-
y,
|
|
142
|
-
width,
|
|
143
|
-
height: newHeight,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
case 'top-left': {
|
|
147
|
-
const movementX = offset.x + distanceToEdge.left;
|
|
148
|
-
const movementY = offset.y + distanceToEdge.top;
|
|
149
|
-
const newX = align(x + movementX, snapX);
|
|
150
|
-
const newY = align(y + movementY, snapY);
|
|
151
|
-
const deltaX = newX - x;
|
|
152
|
-
const deltaY = newY - y;
|
|
153
|
-
return {
|
|
154
|
-
x: newX,
|
|
155
|
-
y: newY,
|
|
156
|
-
width: width - deltaX,
|
|
157
|
-
height: height - deltaY,
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
case 'top-right': {
|
|
161
|
-
const movementX = offset.x + distanceToEdge.right;
|
|
162
|
-
const movementY = offset.y + distanceToEdge.top;
|
|
163
|
-
const newY = align(y + movementY, snapY);
|
|
164
|
-
const deltaY = newY - y;
|
|
165
|
-
return {
|
|
166
|
-
x,
|
|
167
|
-
y: newY,
|
|
168
|
-
width: align(width + movementX, snapX),
|
|
169
|
-
height: height - deltaY,
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
case 'bottom-left': {
|
|
173
|
-
const movementX = offset.x + distanceToEdge.left;
|
|
174
|
-
const movementY = offset.y + distanceToEdge.bottom;
|
|
175
|
-
const newX = align(x + movementX, snapX);
|
|
176
|
-
const deltaX = newX - x;
|
|
177
|
-
return {
|
|
178
|
-
x: newX,
|
|
179
|
-
y,
|
|
180
|
-
width: width - deltaX,
|
|
181
|
-
height: align(height + movementY, snapY),
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
case 'bottom-right': {
|
|
185
|
-
const movementX = offset.x + distanceToEdge.right;
|
|
186
|
-
const movementY = offset.y + distanceToEdge.bottom;
|
|
187
|
-
return {
|
|
188
|
-
x,
|
|
189
|
-
y,
|
|
190
|
-
width: align(width + movementX, snapX),
|
|
191
|
-
height: align(height + movementY, snapY),
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResizableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
197
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: ResizableComponent, isStandalone: true, selector: "[resizable]", inputs: { resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, resizerColor: { classPropertyName: "resizerColor", publicName: "resizerColor", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "resizer", first: true, predicate: ["resizer"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #resizer>\n <svg:g>\n <!-- top line -->\n <svg:line\n class=\"top\"\n stroke-width=\"2\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"-gap()\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"-gap()\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('top', $event)\" />\n <!-- Left line -->\n <svg:line\n class=\"left\"\n stroke-width=\"2\"\n [attr.x1]=\"-gap()\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"-gap()\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('left', $event)\" />\n <!-- Bottom line -->\n <svg:line\n class=\"bottom\"\n stroke-width=\"2\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"model.size().height + gap()\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"model.size().height + gap()\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom', $event)\" />\n <!-- Right line -->\n <svg:line\n class=\"right\"\n stroke-width=\"2\"\n [attr.x1]=\"model.size().width + gap()\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"model.size().width + gap()\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('right', $event)\" />\n\n <!-- Top Left -->\n <svg:rect\n class=\"top-left\"\n [attr.x]=\"-(handleSize / 2) - gap()\"\n [attr.y]=\"-(handleSize / 2) - gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('top-left', $event)\" />\n\n <!-- Top right -->\n <svg:rect\n class=\"top-right\"\n [attr.x]=\"model.size().width - handleSize / 2 + gap()\"\n [attr.y]=\"-(handleSize / 2) - gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('top-right', $event)\" />\n\n <!-- Bottom left -->\n <svg:rect\n class=\"bottom-left\"\n [attr.x]=\"-(handleSize / 2) - gap()\"\n [attr.y]=\"model.size().height - handleSize / 2 + gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom-left', $event)\" />\n\n <!-- Bottom right -->\n <svg:rect\n class=\"bottom-right\"\n [attr.x]=\"model.size().width - handleSize / 2 + gap()\"\n [attr.y]=\"model.size().height - handleSize / 2 + gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom-right', $event)\" />\n </svg:g>\n</ng-template>\n\n<ng-content />\n", styles: [".top{cursor:n-resize}.left{cursor:w-resize}.right{cursor:e-resize}.bottom{cursor:s-resize}.top-left{cursor:nw-resize}.top-right{cursor:ne-resize}.bottom-left{cursor:sw-resize}.bottom-right{cursor:se-resize}\n"], dependencies: [{ kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
198
|
-
}
|
|
199
|
-
__decorate([
|
|
200
|
-
Microtask
|
|
201
|
-
], ResizableComponent.prototype, "ngAfterViewInit", null);
|
|
202
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResizableComponent, decorators: [{
|
|
203
|
-
type: Component,
|
|
204
|
-
args: [{ standalone: true, selector: '[resizable]', imports: [PointerDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #resizer>\n <svg:g>\n <!-- top line -->\n <svg:line\n class=\"top\"\n stroke-width=\"2\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"-gap()\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"-gap()\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('top', $event)\" />\n <!-- Left line -->\n <svg:line\n class=\"left\"\n stroke-width=\"2\"\n [attr.x1]=\"-gap()\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"-gap()\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('left', $event)\" />\n <!-- Bottom line -->\n <svg:line\n class=\"bottom\"\n stroke-width=\"2\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"model.size().height + gap()\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"model.size().height + gap()\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom', $event)\" />\n <!-- Right line -->\n <svg:line\n class=\"right\"\n stroke-width=\"2\"\n [attr.x1]=\"model.size().width + gap()\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"model.size().width + gap()\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('right', $event)\" />\n\n <!-- Top Left -->\n <svg:rect\n class=\"top-left\"\n [attr.x]=\"-(handleSize / 2) - gap()\"\n [attr.y]=\"-(handleSize / 2) - gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('top-left', $event)\" />\n\n <!-- Top right -->\n <svg:rect\n class=\"top-right\"\n [attr.x]=\"model.size().width - handleSize / 2 + gap()\"\n [attr.y]=\"-(handleSize / 2) - gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('top-right', $event)\" />\n\n <!-- Bottom left -->\n <svg:rect\n class=\"bottom-left\"\n [attr.x]=\"-(handleSize / 2) - gap()\"\n [attr.y]=\"model.size().height - handleSize / 2 + gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom-left', $event)\" />\n\n <!-- Bottom right -->\n <svg:rect\n class=\"bottom-right\"\n [attr.x]=\"model.size().width - handleSize / 2 + gap()\"\n [attr.y]=\"model.size().height - handleSize / 2 + gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom-right', $event)\" />\n </svg:g>\n</ng-template>\n\n<ng-content />\n", styles: [".top{cursor:n-resize}.left{cursor:w-resize}.right{cursor:e-resize}.bottom{cursor:s-resize}.top-left{cursor:nw-resize}.top-right{cursor:ne-resize}.bottom-left{cursor:sw-resize}.bottom-right{cursor:se-resize}\n"] }]
|
|
205
|
-
}], ctorParameters: () => [], propDecorators: { ngAfterViewInit: [] } });
|
|
206
|
-
function calcOffset(movementX, movementY, zoom) {
|
|
207
|
-
return {
|
|
208
|
-
x: round(movementX / zoom),
|
|
209
|
-
y: round(movementY / zoom),
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
function constrainRect(rect, model, side, minWidth, minHeight, maxWidth, maxHeight) {
|
|
213
|
-
let { x, y, width, height } = rect;
|
|
214
|
-
// 1. Prevent negative dimensions
|
|
215
|
-
width = Math.max(width, 0);
|
|
216
|
-
height = Math.max(height, 0);
|
|
217
|
-
// 2. Apply minimum size constraints
|
|
218
|
-
width = Math.max(minWidth, width);
|
|
219
|
-
height = Math.max(minHeight, height);
|
|
220
|
-
width = Math.min(maxWidth, width);
|
|
221
|
-
height = Math.min(maxHeight, height);
|
|
222
|
-
// Apply left/top constraints based on minimum size
|
|
223
|
-
x = Math.min(x, model.point().x + model.width() - minWidth);
|
|
224
|
-
y = Math.min(y, model.point().y + model.height() - minHeight);
|
|
225
|
-
x = Math.max(x, model.point().x + model.width() - maxWidth);
|
|
226
|
-
y = Math.max(y, model.point().y + model.height() - maxHeight);
|
|
227
|
-
const parent = model.parent();
|
|
228
|
-
// 3. Apply maximum size constraints based on parent size (if exists)
|
|
229
|
-
if (parent) {
|
|
230
|
-
const parentWidth = parent.width();
|
|
231
|
-
const parentHeight = parent.height();
|
|
232
|
-
const modelX = model.point().x;
|
|
233
|
-
const modelY = model.point().y;
|
|
234
|
-
x = Math.max(x, 0);
|
|
235
|
-
y = Math.max(y, 0);
|
|
236
|
-
// Stop resizing when hitting left or top boundary
|
|
237
|
-
if (side.includes('left') && x === 0) {
|
|
238
|
-
width = Math.min(width, modelX + model.width());
|
|
239
|
-
}
|
|
240
|
-
if (side.includes('top') && y === 0) {
|
|
241
|
-
height = Math.min(height, modelY + model.height());
|
|
242
|
-
}
|
|
243
|
-
// Allow right/bottom resizing without being blocked
|
|
244
|
-
width = Math.min(width, parentWidth - x);
|
|
245
|
-
height = Math.min(height, parentHeight - y);
|
|
246
|
-
}
|
|
247
|
-
const bounds = getNodesBounds(model.children());
|
|
248
|
-
// 4. Apply child node constraints (if children exist)
|
|
249
|
-
if (bounds) {
|
|
250
|
-
if (side.includes('left')) {
|
|
251
|
-
x = Math.min(x, model.point().x + model.width() - (bounds.x + bounds.width));
|
|
252
|
-
width = Math.max(width, bounds.x + bounds.width);
|
|
253
|
-
}
|
|
254
|
-
if (side.includes('right')) {
|
|
255
|
-
width = Math.max(width, bounds.x + bounds.width);
|
|
256
|
-
}
|
|
257
|
-
if (side.includes('bottom')) {
|
|
258
|
-
height = Math.max(height, bounds.y + bounds.height);
|
|
259
|
-
}
|
|
260
|
-
if (side.includes('top')) {
|
|
261
|
-
y = Math.min(y, model.point().y + model.height() - (bounds.y + bounds.height));
|
|
262
|
-
height = Math.max(height, bounds.y + bounds.height);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
return {
|
|
266
|
-
x,
|
|
267
|
-
y,
|
|
268
|
-
width,
|
|
269
|
-
height,
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUdOLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLHVCQUF1QixHQUV4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFJM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDNUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1C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UUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0UsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLENBQUM7UUFDRCxDQUFDO1FBQ0QsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgT25Jbml0LFxuICBUZW1wbGF0ZVJlZixcbiAgaW5wdXQsXG4gIHZpZXdDaGlsZCxcbiAgZWZmZWN0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvb3RQb2ludGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9yb290LXBvaW50ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IGZpbHRlciwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBWaWV3cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvcm91bmQnO1xuaW1wb3J0IHsgTWljcm90YXNrIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9taWNyb3Rhc2suZGVjb3JhdG9yJztcbmltcG9ydCB7IGdldE5vZGVzQm91bmRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvbm9kZXMnO1xuaW1wb3J0IHsgTm9kZUFjY2Vzc29yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBSZWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZWN0JztcbmltcG9ydCB7IFBvaW50ZXJFdmVudCB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcm9vdC1wb2ludGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc3BhY2UtcG9pbnQtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9pbnRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmxvd1NldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zsb3ctc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcG9pbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGFsaWduIH0gZnJvbSAnLi4vLi4vdXRpbHMvYWxpZ24tbnVtYmVyJztcblxudHlwZSBTaWRlID0gJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICd0b3AtbGVmdCcgfCAnYm90dG9tLXJpZ2h0JyB8ICdib3R0b20tbGVmdCc7XG5cbmludGVyZmFjZSBEaXN0YW5jZVRvRWRnZSB7XG4gIGxlZnQ6IG51bWJlcjtcbiAgcmlnaHQ6IG51bWJlcjtcbiAgdG9wOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbcmVzaXphYmxlXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXNpemFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXNpemFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW1BvaW50ZXJEaXJlY3RpdmVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUmVzaXphYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIG5vZGVBY2Nlc3NvciA9IGluamVjdChOb2RlQWNjZXNzb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByb290UG9pbnRlciA9IGluamVjdChSb290UG9pbnRlckRpcmVjdGl2ZSk7XG4gIHByaXZhdGUgdmlld3BvcnRTZXJ2aWNlID0gaW5qZWN0KFZpZXdwb3J0U2VydmljZSk7XG4gIHByaXZhdGUgc3BhY2VQb2ludENvbnRleHQgPSBpbmplY3QoU3BhY2VQb2ludENvbnRleHREaXJlY3RpdmUpO1xuICBwcml2YXRlIHNldHRpbmdzU2VydmljZSA9IGluamVjdChGbG93U2V0dGluZ3NTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBob3N0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8RWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuXG4gIHB1YmxpYyByZXNpemFibGUgPSBpbnB1dDxib29sZWFuIHwgJyc+KCk7XG5cbiAgcHVibGljIHJlc2l6ZXJDb2xvciA9IGlucHV0KCcjMmU0MTRjJyk7XG5cbiAgcHVibGljIGdhcCA9IGlucHV0KDEuNSk7XG5cbiAgcHJpdmF0ZSByZXNpemVyID0gdmlld0NoaWxkLnJlcXVpcmVkPFRlbXBsYXRlUmVmPHVua25vd24+PigncmVzaXplcicpO1xuXG4gIHByb3RlY3RlZCBnZXQgbW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZUFjY2Vzc29yLm1vZGVsKCkhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxpbmVHYXAgPSAzO1xuICBwcm90ZWN0ZWQgaGFuZGxlU2l6ZSA9IDY7XG5cbiAgcHJpdmF0ZSByZXNpemVTaWRlOiBTaWRlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSB6b29tID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnpvb20gPz8gMCk7XG5cbiAgcHJpdmF0ZSBtaW5XaWR0aCA9IDA7XG4gIHByaXZhdGUgbWluSGVpZ2h0ID0gMDtcbiAgcHJpdmF0ZSBtYXhXaWR0aCA9IEluZmluaXR5O1xuICBwcml2YXRlIG1heEhlaWdodCA9IEluZmluaXR5O1xuXG4gIC8vIFRPRE86IGFsbG93IHJlc3ppZSBiZXNpZGUgdGhlIGZsb3dcbiAgcHJvdGVjdGVkIHJlc2l6ZU9uR2xvYmFsTW91c2VNb3ZlID0gdGhpcy5yb290UG9pbnRlci5wb2ludGVyTW92ZW1lbnQkXG4gICAgLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5yZXNpemVTaWRlICE9PSBudWxsKSxcbiAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50Lm1vdmVtZW50WCAhPT0gMCB8fCBldmVudC5tb3ZlbWVudFkgIT09IDApLFxuICAgICAgdGFwKChldmVudCkgPT4gdGhpcy5yZXNpemUoZXZlbnQpKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgIClcbiAgICAuc3Vic2NyaWJlKCk7XG5cbiAgcHJvdGVjdGVkIGVuZFJlc2l6ZU9uR2xvYmFsTW91c2VVcCA9IHRoaXMucm9vdFBvaW50ZXIuZG9jdW1lbnRQb2ludGVyRW5kJFxuICAgIC5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuZW5kUmVzaXplKCkpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6YWJsZSA9IHRoaXMucmVzaXphYmxlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXNpemFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRoaXMubW9kZWwucmVzaXphYmxlLnNldChyZXNpemFibGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubW9kZWwucmVzaXphYmxlLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwuY29udHJvbGxlZEJ5UmVzaXplci5zZXQodHJ1ZSk7XG4gICAgdGhpcy5tb2RlbC5yZXNpemVyVGVtcGxhdGUuc2V0KHRoaXMucmVzaXplcigpKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsLmNvbnRyb2xsZWRCeVJlc2l6ZXIuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIEBNaWNyb3Rhc2tcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLm1pbldpZHRoID0gK2dldENvbXB1dGVkU3R5bGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpLm1pbldpZHRoLnJlcGxhY2UoJ3B4JywgJycpIHx8IDA7XG4gICAgdGhpcy5taW5IZWlnaHQgPSArZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCkubWluSGVpZ2h0LnJlcGxhY2UoJ3B4JywgJycpIHx8IDA7XG4gICAgdGhpcy5tYXhXaWR0aCA9ICtnZXRDb21wdXRlZFN0eWxlKHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50KS5tYXhXaWR0aC5yZXBsYWNlKCdweCcsICcnKSB8fCBJbmZpbml0eTtcbiAgICB0aGlzLm1heEhlaWdodCA9ICtnZXRDb21wdXRlZFN0eWxlKHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50KS5tYXhIZWlnaHQucmVwbGFjZSgncHgnLCAnJykgfHwgSW5maW5pdHk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRSZXNpemUoc2lkZTogU2lkZSwgZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNpemVTaWRlID0gc2lkZTtcbiAgICB0aGlzLm1vZGVsLnJlc2l6aW5nLnNldCh0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNpemUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemVTaWRlKSByZXR1cm47XG5cbiAgICBjb25zdCBvZmZzZXQgPSBjYWxjT2Zmc2V0KGV2ZW50Lm1vdmVtZW50WCwgZXZlbnQubW92ZW1lbnRZLCB0aGlzLnpvb20oKSk7XG5cbiAgICBjb25zdCByZXNpemVkID0gdGhpcy5hcHBseVJlc2l6ZSh0aGlzLnJlc2l6ZVNpZGUsIHRoaXMubW9kZWwsIG9mZnNldCwgdGhpcy5nZXREaXN0YW5jZVRvRWRnZShldmVudCkpO1xuXG4gICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb25zdHJhaW5SZWN0KFxuICAgICAgcmVzaXplZCxcbiAgICAgIHRoaXMubW9kZWwsXG4gICAgICB0aGlzLnJlc2l6ZVNpZGUsXG4gICAgICB0aGlzLm1pbldpZHRoLFxuICAgICAgdGhpcy5taW5IZWlnaHQsXG4gICAgICB0aGlzLm1heFdpZHRoLFxuICAgICAgdGhpcy5tYXhIZWlnaHQsXG4gICAgKTtcblxuICAgIHRoaXMubW9kZWwuc2V0UG9pbnQoeyB4LCB5IH0pO1xuICAgIHRoaXMubW9kZWwud2lkdGguc2V0KHdpZHRoKTtcbiAgICB0aGlzLm1vZGVsLmhlaWdodC5zZXQoaGVpZ2h0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbmRSZXNpemUoKSB7XG4gICAgdGhpcy5yZXNpemVTaWRlID0gbnVsbDtcbiAgICB0aGlzLm1vZGVsLnJlc2l6aW5nLnNldChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERpc3RhbmNlVG9FZGdlKGV2ZW50OiBQb2ludGVyRXZlbnQpOiBEaXN0YW5jZVRvRWRnZSB7XG4gICAgY29uc3QgZmxvd1BvaW50ID0gdGhpcy5zcGFjZVBvaW50Q29udGV4dC5kb2N1bWVudFBvaW50VG9GbG93UG9pbnQoeyB4OiBldmVudC54LCB5OiBldmVudC55IH0pO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5tb2RlbC5nbG9iYWxQb2ludCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGZsb3dQb2ludC54IC0geCxcbiAgICAgIHJpZ2h0OiBmbG93UG9pbnQueCAtICh4ICsgdGhpcy5tb2RlbC53aWR0aCgpKSxcbiAgICAgIHRvcDogZmxvd1BvaW50LnkgLSB5LFxuICAgICAgYm90dG9tOiBmbG93UG9pbnQueSAtICh5ICsgdGhpcy5tb2RlbC5oZWlnaHQoKSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlSZXNpemUoc2lkZTogU2lkZSwgbW9kZWw6IE5vZGVNb2RlbCwgb2Zmc2V0OiBQb2ludCwgZGlzdGFuY2VUb0VkZ2U6IERpc3RhbmNlVG9FZGdlKTogUmVjdCB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSBtb2RlbC5wb2ludCgpO1xuICAgIGNvbnN0IHdpZHRoID0gbW9kZWwud2lkdGgoKTtcbiAgICBjb25zdCBoZWlnaHQgPSBtb2RlbC5oZWlnaHQoKTtcbiAgICBjb25zdCBbc25hcFgsIHNuYXBZXSA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNuYXBHcmlkKCk7XG5cbiAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgIGNhc2UgJ2xlZnQnOiB7XG4gICAgICAgIGNvbnN0IG1vdmVtZW50WCA9IG9mZnNldC54ICsgZGlzdGFuY2VUb0VkZ2UubGVmdDtcbiAgICAgICAgY29uc3QgbmV3WCA9IGFsaWduKHggKyBtb3ZlbWVudFgsIHNuYXBYKTtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gbmV3WCAtIHg7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiBuZXdYLFxuICAgICAgICAgIHksXG4gICAgICAgICAgd2lkdGg6IHdpZHRoIC0gZGVsdGFYLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JpZ2h0Jzoge1xuICAgICAgICBjb25zdCBtb3ZlbWVudFggPSBvZmZzZXQueCArIGRpc3RhbmNlVG9FZGdlLnJpZ2h0O1xuICAgICAgICBjb25zdCBuZXdXaWR0aCA9IGFsaWduKHdpZHRoICsgbW92ZW1lbnRYLCBzbmFwWCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHksXG4gICAgICAgICAgd2lkdGg6IG5ld1dpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RvcCc6IHtcbiAgICAgICAgY29uc3QgbW92ZW1lbnRZID0gb2Zmc2V0LnkgKyBkaXN0YW5jZVRvRWRnZS50b3A7XG4gICAgICAgIGNvbnN0IG5ld1kgPSBhbGlnbih5ICsgbW92ZW1lbnRZLCBzbmFwWSk7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IG5ld1kgLSB5O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeCxcbiAgICAgICAgICB5OiBuZXdZLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0IC0gZGVsdGFZLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnYm90dG9tJzoge1xuICAgICAgICBjb25zdCBtb3ZlbWVudFkgPSBvZmZzZXQueSArIGRpc3RhbmNlVG9FZGdlLmJvdHRvbTtcbiAgICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gYWxpZ24oaGVpZ2h0ICsgbW92ZW1lbnRZLCBzbmFwWSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHksXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICd0b3AtbGVmdCc6IHtcbiAgICAgICAgY29uc3QgbW92ZW1lbnRYID0gb2Zmc2V0LnggKyBkaXN0YW5jZVRvRWRnZS5sZWZ0O1xuICAgICAgICBjb25zdCBtb3ZlbWVudFkgPSBvZmZzZXQueSArIGRpc3RhbmNlVG9FZGdlLnRvcDtcbiAgICAgICAgY29uc3QgbmV3WCA9IGFsaWduKHggKyBtb3ZlbWVudFgsIHNuYXBYKTtcbiAgICAgICAgY29uc3QgbmV3WSA9IGFsaWduKHkgKyBtb3ZlbWVudFksIHNuYXBZKTtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gbmV3WCAtIHg7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IG5ld1kgLSB5O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogbmV3WCxcbiAgICAgICAgICB5OiBuZXdZLFxuICAgICAgICAgIHdpZHRoOiB3aWR0aCAtIGRlbHRhWCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGRlbHRhWSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RvcC1yaWdodCc6IHtcbiAgICAgICAgY29uc3QgbW92ZW1lbnRYID0gb2Zmc2V0LnggKyBkaXN0YW5jZVRvRWRnZS5yaWdodDtcbiAgICAgICAgY29uc3QgbW92ZW1lbnRZID0gb2Zmc2V0LnkgKyBkaXN0YW5jZVRvRWRnZS50b3A7XG4gICAgICAgIGNvbnN0IG5ld1kgPSBhbGlnbih5ICsgbW92ZW1lbnRZLCBzbmFwWSk7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IG5ld1kgLSB5O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeCxcbiAgICAgICAgICB5OiBuZXdZLFxuICAgICAgICAgIHdpZHRoOiBhbGlnbih3aWR0aCArIG1vdmVtZW50WCwgc25hcFgpLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0IC0gZGVsdGFZLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOiB7XG4gICAgICAgIGNvbnN0IG1vdmVtZW50WCA9IG9mZnNldC54ICsgZGlzdGFuY2VUb0VkZ2UubGVmdDtcbiAgICAgICAgY29uc3QgbW92ZW1lbnRZID0gb2Zmc2V0LnkgKyBkaXN0YW5jZVRvRWRnZS5ib3R0b207XG4gICAgICAgIGNvbnN0IG5ld1ggPSBhbGlnbih4ICsgbW92ZW1lbnRYLCBzbmFwWCk7XG4gICAgICAgIGNvbnN0IGRlbHRhWCA9IG5ld1ggLSB4O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogbmV3WCxcbiAgICAgICAgICB5LFxuICAgICAgICAgIHdpZHRoOiB3aWR0aCAtIGRlbHRhWCxcbiAgICAgICAgICBoZWlnaHQ6IGFsaWduKGhlaWdodCArIG1vdmVtZW50WSwgc25hcFkpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0Jzoge1xuICAgICAgICBjb25zdCBtb3ZlbWVudFggPSBvZmZzZXQueCArIGRpc3RhbmNlVG9FZGdlLnJpZ2h0O1xuICAgICAgICBjb25zdCBtb3ZlbWVudFkgPSBvZmZzZXQueSArIGRpc3RhbmNlVG9FZGdlLmJvdHRvbTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeSxcbiAgICAgICAgICB3aWR0aDogYWxpZ24od2lkdGggKyBtb3ZlbWVudFgsIHNuYXBYKSxcbiAgICAgICAgICBoZWlnaHQ6IGFsaWduKGhlaWdodCArIG1vdmVtZW50WSwgc25hcFkpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjT2Zmc2V0KG1vdmVtZW50WDogbnVtYmVyLCBtb3ZlbWVudFk6IG51bWJlciwgem9vbTogbnVtYmVyKTogUG9pbnQge1xuICByZXR1cm4ge1xuICAgIHg6IHJvdW5kKG1vdmVtZW50WCAvIHpvb20pLFxuICAgIHk6IHJvdW5kKG1vdmVtZW50WSAvIHpvb20pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb25zdHJhaW5SZWN0KFxuICByZWN0OiBSZWN0LFxuICBtb2RlbDogTm9kZU1vZGVsLFxuICBzaWRlOiBTaWRlLFxuICBtaW5XaWR0aDogbnVtYmVyLFxuICBtaW5IZWlnaHQ6IG51bWJlcixcbiAgbWF4V2lkdGg6IG51bWJlcixcbiAgbWF4SGVpZ2h0OiBudW1iZXIsXG4pIHtcbiAgbGV0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcmVjdDtcblxuICAvLyAxLiBQcmV2ZW50IG5lZ2F0aXZlIGRpbWVuc2lvbnNcbiAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgMCk7XG4gIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgMCk7XG5cbiAgLy8gMi4gQXBwbHkgbWluaW11bSBzaXplIGNvbnN0cmFpbnRzXG4gIHdpZHRoID0gTWF0aC5tYXgobWluV2lkdGgsIHdpZHRoKTtcbiAgaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBoZWlnaHQpO1xuICB3aWR0aCA9IE1hdGgubWluKG1heFdpZHRoLCB3aWR0aCk7XG4gIGhlaWdodCA9IE1hdGgubWluKG1heEhlaWdodCwgaGVpZ2h0KTtcblxuICAvLyBBcHBseSBsZWZ0L3RvcCBjb25zdHJhaW50cyBiYXNlZCBvbiBtaW5pbXVtIHNpemVcbiAgeCA9IE1hdGgubWluKHgsIG1vZGVsLnBvaW50KCkueCArIG1vZGVsLndpZHRoKCkgLSBtaW5XaWR0aCk7XG4gIHkgPSBNYXRoLm1pbih5LCBtb2RlbC5wb2ludCgpLnkgKyBtb2RlbC5oZWlnaHQoKSAtIG1pbkhlaWdodCk7XG4gIHggPSBNYXRoLm1heCh4LCBtb2RlbC5wb2ludCgpLnggKyBtb2RlbC53aWR0aCgpIC0gbWF4V2lkdGgpO1xuICB5ID0gTWF0aC5tYXgoeSwgbW9kZWwucG9pbnQoKS55ICsgbW9kZWwuaGVpZ2h0KCkgLSBtYXhIZWlnaHQpO1xuXG4gIGNvbnN0IHBhcmVudCA9IG1vZGVsLnBhcmVudCgpO1xuICAvLyAzLiBBcHBseSBtYXhpbXVtIHNpemUgY29uc3RyYWludHMgYmFzZWQgb24gcGFyZW50IHNpemUgKGlmIGV4aXN0cylcbiAgaWYgKHBhcmVudCkge1xuICAgIGNvbnN0IHBhcmVudFdpZHRoID0gcGFyZW50LndpZHRoKCk7XG4gICAgY29uc3QgcGFyZW50SGVpZ2h0ID0gcGFyZW50LmhlaWdodCgpO1xuICAgIGNvbnN0IG1vZGVsWCA9IG1vZGVsLnBvaW50KCkueDtcbiAgICBjb25zdCBtb2RlbFkgPSBtb2RlbC5wb2ludCgpLnk7XG5cbiAgICB4ID0gTWF0aC5tYXgoeCwgMCk7XG4gICAgeSA9IE1hdGgubWF4KHksIDApO1xuXG4gICAgLy8gU3RvcCByZXNpemluZyB3aGVuIGhpdHRpbmcgbGVmdCBvciB0b3AgYm91bmRhcnlcbiAgICBpZiAoc2lkZS5pbmNsdWRlcygnbGVmdCcpICYmIHggPT09IDApIHtcbiAgICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIG1vZGVsWCArIG1vZGVsLndpZHRoKCkpO1xuICAgIH1cbiAgICBpZiAoc2lkZS5pbmNsdWRlcygndG9wJykgJiYgeSA9PT0gMCkge1xuICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBtb2RlbFkgKyBtb2RlbC5oZWlnaHQoKSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgcmlnaHQvYm90dG9tIHJlc2l6aW5nIHdpdGhvdXQgYmVpbmcgYmxvY2tlZFxuICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIHBhcmVudFdpZHRoIC0geCk7XG4gICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBwYXJlbnRIZWlnaHQgLSB5KTtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kcyA9IGdldE5vZGVzQm91bmRzKG1vZGVsLmNoaWxkcmVuKCkpO1xuICAvLyA0LiBBcHBseSBjaGlsZCBub2RlIGNvbnN0cmFpbnRzIChpZiBjaGlsZHJlbiBleGlzdClcbiAgaWYgKGJvdW5kcykge1xuICAgIGlmIChzaWRlLmluY2x1ZGVzKCdsZWZ0JykpIHtcbiAgICAgIHggPSBNYXRoLm1pbih4LCBtb2RlbC5wb2ludCgpLnggKyBtb2RlbC53aWR0aCgpIC0gKGJvdW5kcy54ICsgYm91bmRzLndpZHRoKSk7XG4gICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBib3VuZHMueCArIGJvdW5kcy53aWR0aCk7XG4gICAgfVxuXG4gICAgaWYgKHNpZGUuaW5jbHVkZXMoJ3JpZ2h0JykpIHtcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZS5pbmNsdWRlcygnYm90dG9tJykpIHtcbiAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZS5pbmNsdWRlcygndG9wJykpIHtcbiAgICAgIHkgPSBNYXRoLm1pbih5LCBtb2RlbC5wb2ludCgpLnkgKyBtb2RlbC5oZWlnaHQoKSAtIChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpKTtcbiAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH07XG59XG4iLCI8bmctdGVtcGxhdGUgI3Jlc2l6ZXI+XG4gIDxzdmc6Zz5cbiAgICA8IS0tIHRvcCBsaW5lIC0tPlxuICAgIDxzdmc6bGluZVxuICAgICAgY2xhc3M9XCJ0b3BcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICBbYXR0ci54MV09XCJsaW5lR2FwXCJcbiAgICAgIFthdHRyLnkxXT1cIi1nYXAoKVwiXG4gICAgICBbYXR0ci54Ml09XCJtb2RlbC5zaXplKCkud2lkdGggLSBsaW5lR2FwXCJcbiAgICAgIFthdHRyLnkyXT1cIi1nYXAoKVwiXG4gICAgICBbYXR0ci5zdHJva2VdPVwicmVzaXplckNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgndG9wJywgJGV2ZW50KVwiIC8+XG4gICAgPCEtLSBMZWZ0IGxpbmUgLS0+XG4gICAgPHN2ZzpsaW5lXG4gICAgICBjbGFzcz1cImxlZnRcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICBbYXR0ci54MV09XCItZ2FwKClcIlxuICAgICAgW2F0dHIueTFdPVwibGluZUdhcFwiXG4gICAgICBbYXR0ci54Ml09XCItZ2FwKClcIlxuICAgICAgW2F0dHIueTJdPVwibW9kZWwuc2l6ZSgpLmhlaWdodCAtIGxpbmVHYXBcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cInJlc2l6ZXJDb2xvcigpXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ2xlZnQnLCAkZXZlbnQpXCIgLz5cbiAgICA8IS0tIEJvdHRvbSBsaW5lIC0tPlxuICAgIDxzdmc6bGluZVxuICAgICAgY2xhc3M9XCJib3R0b21cIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICBbYXR0ci54MV09XCJsaW5lR2FwXCJcbiAgICAgIFthdHRyLnkxXT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgKyBnYXAoKVwiXG4gICAgICBbYXR0ci54Ml09XCJtb2RlbC5zaXplKCkud2lkdGggLSBsaW5lR2FwXCJcbiAgICAgIFthdHRyLnkyXT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgKyBnYXAoKVwiXG4gICAgICBbYXR0ci5zdHJva2VdPVwicmVzaXplckNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgnYm90dG9tJywgJGV2ZW50KVwiIC8+XG4gICAgPCEtLSBSaWdodCBsaW5lIC0tPlxuICAgIDxzdmc6bGluZVxuICAgICAgY2xhc3M9XCJyaWdodFwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgIFthdHRyLngxXT1cIm1vZGVsLnNpemUoKS53aWR0aCArIGdhcCgpXCJcbiAgICAgIFthdHRyLnkxXT1cImxpbmVHYXBcIlxuICAgICAgW2F0dHIueDJdPVwibW9kZWwuc2l6ZSgpLndpZHRoICsgZ2FwKClcIlxuICAgICAgW2F0dHIueTJdPVwibW9kZWwuc2l6ZSgpLmhlaWdodCAtIGxpbmVHYXBcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cInJlc2l6ZXJDb2xvcigpXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ3JpZ2h0JywgJGV2ZW50KVwiIC8+XG5cbiAgICA8IS0tIFRvcCBMZWZ0IC0tPlxuICAgIDxzdmc6cmVjdFxuICAgICAgY2xhc3M9XCJ0b3AtbGVmdFwiXG4gICAgICBbYXR0ci54XT1cIi0oaGFuZGxlU2l6ZSAvIDIpIC0gZ2FwKClcIlxuICAgICAgW2F0dHIueV09XCItKGhhbmRsZVNpemUgLyAyKSAtIGdhcCgpXCJcbiAgICAgIFthdHRyLndpZHRoXT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuZmlsbF09XCJyZXNpemVyQ29sb3IoKVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCd0b3AtbGVmdCcsICRldmVudClcIiAvPlxuXG4gICAgPCEtLSBUb3AgcmlnaHQgLS0+XG4gICAgPHN2ZzpyZWN0XG4gICAgICBjbGFzcz1cInRvcC1yaWdodFwiXG4gICAgICBbYXR0ci54XT1cIm1vZGVsLnNpemUoKS53aWR0aCAtIGhhbmRsZVNpemUgLyAyICsgZ2FwKClcIlxuICAgICAgW2F0dHIueV09XCItKGhhbmRsZVNpemUgLyAyKSAtIGdhcCgpXCJcbiAgICAgIFthdHRyLndpZHRoXT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuZmlsbF09XCJyZXNpemVyQ29sb3IoKVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCd0b3AtcmlnaHQnLCAkZXZlbnQpXCIgLz5cblxuICAgIDwhLS0gQm90dG9tIGxlZnQgLS0+XG4gICAgPHN2ZzpyZWN0XG4gICAgICBjbGFzcz1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIFthdHRyLnhdPVwiLShoYW5kbGVTaXplIC8gMikgLSBnYXAoKVwiXG4gICAgICBbYXR0ci55XT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgLSBoYW5kbGVTaXplIC8gMiArIGdhcCgpXCJcbiAgICAgIFthdHRyLndpZHRoXT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuZmlsbF09XCJyZXNpemVyQ29sb3IoKVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdib3R0b20tbGVmdCcsICRldmVudClcIiAvPlxuXG4gICAgPCEtLSBCb3R0b20gcmlnaHQgLS0+XG4gICAgPHN2ZzpyZWN0XG4gICAgICBjbGFzcz1cImJvdHRvbS1yaWdodFwiXG4gICAgICBbYXR0ci54XT1cIm1vZGVsLnNpemUoKS53aWR0aCAtIGhhbmRsZVNpemUgLyAyICsgZ2FwKClcIlxuICAgICAgW2F0dHIueV09XCJtb2RlbC5zaXplKCkuaGVpZ2h0IC0gaGFuZGxlU2l6ZSAvIDIgKyBnYXAoKVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmZpbGxdPVwicmVzaXplckNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgnYm90dG9tLXJpZ2h0JywgJGV2ZW50KVwiIC8+XG4gIDwvc3ZnOmc+XG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGVudCAvPlxuIl19
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { Subject } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class ComponentEventBusService {
|
|
5
|
-
constructor() {
|
|
6
|
-
this._event$ = new Subject();
|
|
7
|
-
this.event$ = this._event$.asObservable();
|
|
8
|
-
}
|
|
9
|
-
pushEvent(event) {
|
|
10
|
-
this._event$.next(event);
|
|
11
|
-
}
|
|
12
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComponentEventBusService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
13
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComponentEventBusService }); }
|
|
14
|
-
}
|
|
15
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComponentEventBusService, decorators: [{
|
|
16
|
-
type: Injectable
|
|
17
|
-
}] });
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWV2ZW50LWJ1cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L3NlcnZpY2VzL2NvbXBvbmVudC1ldmVudC1idXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBSS9CLE1BQU0sT0FBTyx3QkFBd0I7SUFEckM7UUFFVSxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFFaEQsV0FBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7S0FLN0M7SUFIUSxTQUFTLENBQUMsS0FBNEI7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQzsrR0FQVSx3QkFBd0I7bUhBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFueUNvbXBvbmVudE5vZGVFdmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29tcG9uZW50LW5vZGUtZXZlbnQuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEV2ZW50QnVzU2VydmljZSB7XG4gIHByaXZhdGUgX2V2ZW50JCA9IG5ldyBTdWJqZWN0PEFueUNvbXBvbmVudE5vZGVFdmVudD4oKTtcblxuICBwdWJsaWMgZXZlbnQkID0gdGhpcy5fZXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHB1YmxpYyBwdXNoRXZlbnQoZXZlbnQ6IEFueUNvbXBvbmVudE5vZGVFdmVudCkge1xuICAgIHRoaXMuX2V2ZW50JC5uZXh0KGV2ZW50KTtcbiAgfVxufVxuIl19
|