@flogeez/angular-tiptap-editor 2.4.0 → 2.4.1
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/CHANGELOG.md +9 -0
- package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
- package/esm2022/lib/ate-editor.provider.mjs +38 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +133 -0
- package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
- package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +226 -0
- package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
- package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +121 -0
- package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +266 -0
- package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +294 -0
- package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +122 -0
- package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +953 -0
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +329 -0
- package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
- package/esm2022/lib/components/ui/ate-button.component.mjs +90 -0
- package/esm2022/lib/components/ui/ate-separator.component.mjs +31 -0
- package/esm2022/lib/config/ate-editor.config.mjs +76 -0
- package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
- package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
- package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
- package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
- package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +270 -0
- package/esm2022/lib/extensions/ate-table.extension.mjs +29 -0
- package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
- package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
- package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
- package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
- package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
- package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
- package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
- package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
- package/esm2022/lib/models/ate-bubble-menu.model.mjs +49 -0
- package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
- package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
- package/esm2022/lib/models/ate-image.model.mjs +2 -0
- package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
- package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
- package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
- package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
- package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
- package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
- package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
- package/esm2022/lib/services/ate-color-picker.service.mjs +193 -0
- package/esm2022/lib/services/ate-editor-commands.service.mjs +465 -0
- package/esm2022/lib/services/ate-i18n.service.mjs +410 -0
- package/esm2022/lib/services/ate-image.service.mjs +368 -0
- package/esm2022/lib/services/ate-link.service.mjs +97 -0
- package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
- package/esm2022/public-api.mjs +93 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +313 -346
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/index.d.ts +3 -1673
- package/lib/ate-editor.provider.d.ts +21 -0
- package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
- package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
- package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
- package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +52 -0
- package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
- package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +12 -0
- package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +24 -0
- package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
- package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
- package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
- package/lib/components/editor/angular-tiptap-editor.component.d.ts +235 -0
- package/lib/components/slash-commands/ate-slash-commands.component.d.ts +43 -0
- package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
- package/lib/components/ui/ate-button.component.d.ts +25 -0
- package/lib/components/ui/ate-separator.component.d.ts +7 -0
- package/lib/config/ate-editor.config.d.ts +7 -0
- package/lib/config/ate-global-config.token.d.ts +6 -0
- package/lib/config/ate-slash-commands.config.d.ts +41 -0
- package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
- package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
- package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
- package/lib/extensions/ate-table.extension.d.ts +2 -0
- package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
- package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
- package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
- package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
- package/lib/models/ate-bubble-menu.model.d.ts +33 -0
- package/lib/models/ate-editor-config.model.d.ts +100 -0
- package/lib/models/ate-editor-state.model.d.ts +109 -0
- package/lib/models/ate-image.model.d.ts +104 -0
- package/lib/models/ate-toolbar.model.d.ts +18 -0
- package/lib/node-view/ate-angular-node-view.d.ts +115 -0
- package/lib/node-view/ate-injector.registry.d.ts +3 -0
- package/lib/node-view/ate-node-view.factory.d.ts +10 -0
- package/lib/node-view/ate-node-view.models.d.ts +138 -0
- package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
- package/lib/node-view/ate-register-angular-component.d.ts +35 -0
- package/lib/services/ate-color-picker.service.d.ts +65 -0
- package/lib/services/ate-editor-commands.service.d.ts +72 -0
- package/lib/services/ate-i18n.service.d.ts +394 -0
- package/lib/services/ate-image.service.d.ts +71 -0
- package/lib/services/ate-link.service.d.ts +42 -0
- package/lib/utils/ate-color.utils.d.ts +12 -0
- package/package.json +3 -1
- package/public-api.d.ts +112 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Component, input, ChangeDetectionStrategy } from "@angular/core";
|
|
2
|
+
import { CommonModule } from "@angular/common";
|
|
3
|
+
import { AteButtonComponent } from "../../ui/ate-button.component";
|
|
4
|
+
import { AteBaseBubbleMenu } from "../base/ate-base-bubble-menu";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class AteCellBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
// Inputs
|
|
10
|
+
this.config = input({});
|
|
11
|
+
// Signals
|
|
12
|
+
this.i18n = () => this.i18nService;
|
|
13
|
+
}
|
|
14
|
+
shouldShow() {
|
|
15
|
+
const { selection, nodes, isEditable, isFocused } = this.state();
|
|
16
|
+
if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
// Only show cell bubble menu for CellSelection
|
|
20
|
+
return selection.type === "cell" && nodes.isTableCell && isEditable && isFocused;
|
|
21
|
+
}
|
|
22
|
+
getSelectionRect() {
|
|
23
|
+
const ed = this.editor();
|
|
24
|
+
if (!ed) {
|
|
25
|
+
return new DOMRect(0, 0, 0, 0);
|
|
26
|
+
}
|
|
27
|
+
// CellSelection
|
|
28
|
+
const selection = ed.state.selection;
|
|
29
|
+
// 1. Multiple cells selected
|
|
30
|
+
if (selection.$anchorCell && selection.$headCell) {
|
|
31
|
+
const cells = [];
|
|
32
|
+
// Try to find all selected cell nodes
|
|
33
|
+
ed.view.dom.querySelectorAll(".selectedCell").forEach(el => {
|
|
34
|
+
if (el instanceof HTMLElement) {
|
|
35
|
+
cells.push(el);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
if (cells.length > 0) {
|
|
39
|
+
let top = Infinity, bottom = -Infinity, left = Infinity, right = -Infinity;
|
|
40
|
+
cells.forEach(cell => {
|
|
41
|
+
const r = cell.getBoundingClientRect();
|
|
42
|
+
top = Math.min(top, r.top);
|
|
43
|
+
bottom = Math.max(bottom, r.bottom);
|
|
44
|
+
left = Math.min(left, r.left);
|
|
45
|
+
right = Math.max(right, r.right);
|
|
46
|
+
});
|
|
47
|
+
return new DOMRect(left, top, right - left, bottom - top);
|
|
48
|
+
}
|
|
49
|
+
// Fallback to anchor/head if no .selectedCell (rare)
|
|
50
|
+
const anchor = ed.view.nodeDOM(selection.$anchorCell.pos);
|
|
51
|
+
const head = ed.view.nodeDOM(selection.$headCell.pos);
|
|
52
|
+
if (anchor && head) {
|
|
53
|
+
const anchorRect = anchor.getBoundingClientRect();
|
|
54
|
+
const headRect = head.getBoundingClientRect();
|
|
55
|
+
const top = Math.min(anchorRect.top, headRect.top);
|
|
56
|
+
const bottom = Math.max(anchorRect.bottom, headRect.bottom);
|
|
57
|
+
const left = Math.min(anchorRect.left, headRect.left);
|
|
58
|
+
const right = Math.max(anchorRect.right, headRect.right);
|
|
59
|
+
return new DOMRect(left, top, right - left, bottom - top);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// 2. Ultimate fallback via ProseMirror class
|
|
63
|
+
const singleCell = ed.view.dom.querySelector(".selectedCell");
|
|
64
|
+
if (singleCell) {
|
|
65
|
+
return singleCell.getBoundingClientRect();
|
|
66
|
+
}
|
|
67
|
+
return new DOMRect(-9999, -9999, 0, 0);
|
|
68
|
+
}
|
|
69
|
+
executeCommand(editor, command, ...args) {
|
|
70
|
+
this.editorCommands.execute(editor, command, ...args);
|
|
71
|
+
}
|
|
72
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteCellBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
73
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteCellBubbleMenuComponent, isStandalone: true, selector: "ate-cell-bubble-menu", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
74
|
+
<div #menuRef class="bubble-menu" (mousedown)="$event.preventDefault()">
|
|
75
|
+
<!-- Cell specific actions -->
|
|
76
|
+
@if (config().mergeCells !== false && !state().selection.isSingleCell) {
|
|
77
|
+
<ate-button
|
|
78
|
+
icon="cell_merge"
|
|
79
|
+
[title]="i18n().table().mergeCells"
|
|
80
|
+
[disabled]="!state().can.mergeCells"
|
|
81
|
+
(buttonClick)="onCommand('mergeCells', $event)"></ate-button>
|
|
82
|
+
}
|
|
83
|
+
@if (config().splitCell !== false && state().selection.isSingleCell) {
|
|
84
|
+
<ate-button
|
|
85
|
+
icon="split_scene"
|
|
86
|
+
[title]="i18n().table().splitCell"
|
|
87
|
+
[disabled]="!state().can.splitCell"
|
|
88
|
+
(buttonClick)="onCommand('splitCell', $event)"></ate-button>
|
|
89
|
+
}
|
|
90
|
+
</div>
|
|
91
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
92
|
+
}
|
|
93
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteCellBubbleMenuComponent, decorators: [{
|
|
94
|
+
type: Component,
|
|
95
|
+
args: [{
|
|
96
|
+
selector: "ate-cell-bubble-menu",
|
|
97
|
+
standalone: true,
|
|
98
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
99
|
+
imports: [CommonModule, AteButtonComponent],
|
|
100
|
+
template: `
|
|
101
|
+
<div #menuRef class="bubble-menu" (mousedown)="$event.preventDefault()">
|
|
102
|
+
<!-- Cell specific actions -->
|
|
103
|
+
@if (config().mergeCells !== false && !state().selection.isSingleCell) {
|
|
104
|
+
<ate-button
|
|
105
|
+
icon="cell_merge"
|
|
106
|
+
[title]="i18n().table().mergeCells"
|
|
107
|
+
[disabled]="!state().can.mergeCells"
|
|
108
|
+
(buttonClick)="onCommand('mergeCells', $event)"></ate-button>
|
|
109
|
+
}
|
|
110
|
+
@if (config().splitCell !== false && state().selection.isSingleCell) {
|
|
111
|
+
<ate-button
|
|
112
|
+
icon="split_scene"
|
|
113
|
+
[title]="i18n().table().splitCell"
|
|
114
|
+
[disabled]="!state().can.splitCell"
|
|
115
|
+
(buttonClick)="onCommand('splitCell', $event)"></ate-button>
|
|
116
|
+
}
|
|
117
|
+
</div>
|
|
118
|
+
`,
|
|
119
|
+
}]
|
|
120
|
+
}] });
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWNlbGwtYnViYmxlLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvY29tcG9uZW50cy9idWJibGUtbWVudXMvdGFibGUvYXRlLWNlbGwtYnViYmxlLW1lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUE2QmpFLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxpQkFBaUI7SUF6QmpFOztRQTBCRSxTQUFTO1FBQ1QsV0FBTSxHQUFHLEtBQUssQ0FBMEIsRUFBRSxDQUFDLENBQUM7UUFFNUMsVUFBVTtRQUNELFNBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBa0Z4QztJQWhGVSxVQUFVO1FBQ2pCLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFakUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUM5RSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLFVBQVUsSUFBSSxTQUFTLENBQUM7SUFDbkYsQ0FBQztJQUVRLGdCQUFnQjtRQUN2QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsZ0JBQWdCO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FHMUIsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixJQUFJLFNBQVMsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sS0FBSyxHQUFrQixFQUFFLENBQUM7WUFFaEMsc0NBQXNDO1lBQ3RDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDekQsSUFBSSxFQUFFLFlBQVksV0FBVyxFQUFFLENBQUM7b0JBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2pCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxHQUFHLEdBQUcsUUFBUSxFQUNoQixNQUFNLEdBQUcsQ0FBQyxRQUFRLEVBQ2xCLElBQUksR0FBRyxRQUFRLEVBQ2YsS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUVwQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNuQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDdkMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDM0IsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUIsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFFRCxxREFBcUQ7WUFDckQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQWdCLENBQUM7WUFDekUsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQWdCLENBQUM7WUFFckUsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFFOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFekQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsT0FBTyxVQUFVLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVrQixjQUFjLENBQUMsTUFBYyxFQUFFLE9BQWUsRUFBRSxHQUFHLElBQWU7UUFDbkYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUM7K0dBdEZVLDBCQUEwQjttR0FBMUIsMEJBQTBCLDhPQXBCM0I7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCVCwyREFuQlMsWUFBWSwrQkFBRSxrQkFBa0I7OzRGQXFCL0IsMEJBQTBCO2tCQXpCdEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQztvQkFDM0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQlQ7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyB0eXBlIEVkaXRvciB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IEF0ZUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi91aS9hdGUtYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQXRlQmFzZUJ1YmJsZU1lbnUgfSBmcm9tIFwiLi4vYmFzZS9hdGUtYmFzZS1idWJibGUtbWVudVwiO1xuXG5pbXBvcnQgeyBBdGVDZWxsQnViYmxlTWVudUNvbmZpZyB9IGZyb20gXCIuLi8uLi8uLi9tb2RlbHMvYXRlLWJ1YmJsZS1tZW51Lm1vZGVsXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhdGUtY2VsbC1idWJibGUtbWVudVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQXRlQnV0dG9uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2ICNtZW51UmVmIGNsYXNzPVwiYnViYmxlLW1lbnVcIiAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICA8IS0tIENlbGwgc3BlY2lmaWMgYWN0aW9ucyAtLT5cbiAgICAgIEBpZiAoY29uZmlnKCkubWVyZ2VDZWxscyAhPT0gZmFsc2UgJiYgIXN0YXRlKCkuc2VsZWN0aW9uLmlzU2luZ2xlQ2VsbCkge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJjZWxsX21lcmdlXCJcbiAgICAgICAgICBbdGl0bGVdPVwiaTE4bigpLnRhYmxlKCkubWVyZ2VDZWxsc1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi5tZXJnZUNlbGxzXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdtZXJnZUNlbGxzJywgJGV2ZW50KVwiPjwvYXRlLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuc3BsaXRDZWxsICE9PSBmYWxzZSAmJiBzdGF0ZSgpLnNlbGVjdGlvbi5pc1NpbmdsZUNlbGwpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwic3BsaXRfc2NlbmVcIlxuICAgICAgICAgIFt0aXRsZV09XCJpMThuKCkudGFibGUoKS5zcGxpdENlbGxcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4uc3BsaXRDZWxsXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdzcGxpdENlbGwnLCAkZXZlbnQpXCI+PC9hdGUtYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBBdGVDZWxsQnViYmxlTWVudUNvbXBvbmVudCBleHRlbmRzIEF0ZUJhc2VCdWJibGVNZW51IHtcbiAgLy8gSW5wdXRzXG4gIGNvbmZpZyA9IGlucHV0PEF0ZUNlbGxCdWJibGVNZW51Q29uZmlnPih7fSk7XG5cbiAgLy8gU2lnbmFsc1xuICByZWFkb25seSBpMThuID0gKCkgPT4gdGhpcy5pMThuU2VydmljZTtcblxuICBvdmVycmlkZSBzaG91bGRTaG93KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uLCBub2RlcywgaXNFZGl0YWJsZSwgaXNGb2N1c2VkIH0gPSB0aGlzLnN0YXRlKCk7XG5cbiAgICBpZiAodGhpcy5lZGl0b3JDb21tYW5kcy5saW5rRWRpdE1vZGUoKSB8fCB0aGlzLmVkaXRvckNvbW1hbmRzLmNvbG9yRWRpdE1vZGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgc2hvdyBjZWxsIGJ1YmJsZSBtZW51IGZvciBDZWxsU2VsZWN0aW9uXG4gICAgcmV0dXJuIHNlbGVjdGlvbi50eXBlID09PSBcImNlbGxcIiAmJiBub2Rlcy5pc1RhYmxlQ2VsbCAmJiBpc0VkaXRhYmxlICYmIGlzRm9jdXNlZDtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFNlbGVjdGlvblJlY3QoKTogRE9NUmVjdCB7XG4gICAgY29uc3QgZWQgPSB0aGlzLmVkaXRvcigpO1xuICAgIGlmICghZWQpIHtcbiAgICAgIHJldHVybiBuZXcgRE9NUmVjdCgwLCAwLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvLyBDZWxsU2VsZWN0aW9uXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZWQuc3RhdGUuc2VsZWN0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgJGFuY2hvckNlbGw/OiB7IHBvczogbnVtYmVyIH07XG4gICAgICAkaGVhZENlbGw/OiB7IHBvczogbnVtYmVyIH07XG4gICAgfTtcblxuICAgIC8vIDEuIE11bHRpcGxlIGNlbGxzIHNlbGVjdGVkXG4gICAgaWYgKHNlbGVjdGlvbi4kYW5jaG9yQ2VsbCAmJiBzZWxlY3Rpb24uJGhlYWRDZWxsKSB7XG4gICAgICBjb25zdCBjZWxsczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgICAvLyBUcnkgdG8gZmluZCBhbGwgc2VsZWN0ZWQgY2VsbCBub2Rlc1xuICAgICAgZWQudmlldy5kb20ucXVlcnlTZWxlY3RvckFsbChcIi5zZWxlY3RlZENlbGxcIikuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgY2VsbHMucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY2VsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgdG9wID0gSW5maW5pdHksXG4gICAgICAgICAgYm90dG9tID0gLUluZmluaXR5LFxuICAgICAgICAgIGxlZnQgPSBJbmZpbml0eSxcbiAgICAgICAgICByaWdodCA9IC1JbmZpbml0eTtcblxuICAgICAgICBjZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBjZWxsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHRvcCA9IE1hdGgubWluKHRvcCwgci50b3ApO1xuICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGJvdHRvbSwgci5ib3R0b20pO1xuICAgICAgICAgIGxlZnQgPSBNYXRoLm1pbihsZWZ0LCByLmxlZnQpO1xuICAgICAgICAgIHJpZ2h0ID0gTWF0aC5tYXgocmlnaHQsIHIucmlnaHQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IERPTVJlY3QobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZhbGxiYWNrIHRvIGFuY2hvci9oZWFkIGlmIG5vIC5zZWxlY3RlZENlbGwgKHJhcmUpXG4gICAgICBjb25zdCBhbmNob3IgPSBlZC52aWV3Lm5vZGVET00oc2VsZWN0aW9uLiRhbmNob3JDZWxsLnBvcykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBoZWFkID0gZWQudmlldy5ub2RlRE9NKHNlbGVjdGlvbi4kaGVhZENlbGwucG9zKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKGFuY2hvciAmJiBoZWFkKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGhlYWRSZWN0ID0gaGVhZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLm1pbihhbmNob3JSZWN0LnRvcCwgaGVhZFJlY3QudG9wKTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gTWF0aC5tYXgoYW5jaG9yUmVjdC5ib3R0b20sIGhlYWRSZWN0LmJvdHRvbSk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1pbihhbmNob3JSZWN0LmxlZnQsIGhlYWRSZWN0LmxlZnQpO1xuICAgICAgICBjb25zdCByaWdodCA9IE1hdGgubWF4KGFuY2hvclJlY3QucmlnaHQsIGhlYWRSZWN0LnJpZ2h0KTtcblxuICAgICAgICByZXR1cm4gbmV3IERPTVJlY3QobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gVWx0aW1hdGUgZmFsbGJhY2sgdmlhIFByb3NlTWlycm9yIGNsYXNzXG4gICAgY29uc3Qgc2luZ2xlQ2VsbCA9IGVkLnZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXCIuc2VsZWN0ZWRDZWxsXCIpO1xuICAgIGlmIChzaW5nbGVDZWxsKSB7XG4gICAgICByZXR1cm4gc2luZ2xlQ2VsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERPTVJlY3QoLTk5OTksIC05OTk5LCAwLCAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleGVjdXRlQ29tbWFuZChlZGl0b3I6IEVkaXRvciwgY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvckNvbW1hbmRzLmV4ZWN1dGUoZWRpdG9yLCBjb21tYW5kLCAuLi5hcmdzKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { Component, input, ChangeDetectionStrategy } from "@angular/core";
|
|
2
|
+
import { CommonModule } from "@angular/common";
|
|
3
|
+
import { AteButtonComponent } from "../../ui/ate-button.component";
|
|
4
|
+
import { AteSeparatorComponent } from "../../ui/ate-separator.component";
|
|
5
|
+
import { AteBaseBubbleMenu } from "../base/ate-base-bubble-menu";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class AteTableBubbleMenuComponent extends AteBaseBubbleMenu {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
// Alias for template
|
|
11
|
+
this.t = this.i18nService.table;
|
|
12
|
+
this.config = input({
|
|
13
|
+
addRowBefore: true,
|
|
14
|
+
addRowAfter: true,
|
|
15
|
+
deleteRow: true,
|
|
16
|
+
addColumnBefore: true,
|
|
17
|
+
addColumnAfter: true,
|
|
18
|
+
deleteColumn: true,
|
|
19
|
+
deleteTable: true,
|
|
20
|
+
toggleHeaderRow: true,
|
|
21
|
+
toggleHeaderColumn: true,
|
|
22
|
+
separator: true,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
shouldShow() {
|
|
26
|
+
const { selection, nodes, isEditable, isFocused } = this.state();
|
|
27
|
+
if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
// Only show table bubble menu if:
|
|
31
|
+
// 1. We are inside a table (nodes.isTable)
|
|
32
|
+
// 2. Editor is editable and focused
|
|
33
|
+
// 3. Selection is EMPTY (cursor) OR the Table node itself is selected
|
|
34
|
+
// 4. It's NOT a CellSelection (cell bubble menu takes priority)
|
|
35
|
+
return (nodes.isTable &&
|
|
36
|
+
isEditable &&
|
|
37
|
+
isFocused &&
|
|
38
|
+
(selection.empty || nodes.isTableNodeSelected) &&
|
|
39
|
+
selection.type !== "cell");
|
|
40
|
+
}
|
|
41
|
+
getSelectionRect() {
|
|
42
|
+
const ed = this.editor();
|
|
43
|
+
if (!ed) {
|
|
44
|
+
return new DOMRect(0, 0, 0, 0);
|
|
45
|
+
}
|
|
46
|
+
const { from } = ed.state.selection;
|
|
47
|
+
try {
|
|
48
|
+
// 1. Direct ProseMirror approach: get DOM node at position
|
|
49
|
+
const dom = ed.view.domAtPos(from).node;
|
|
50
|
+
// Find closest table element
|
|
51
|
+
const tableElement = dom instanceof HTMLElement ? dom.closest("table") : dom.parentElement?.closest("table");
|
|
52
|
+
if (tableElement) {
|
|
53
|
+
return tableElement.getBoundingClientRect();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (_e) {
|
|
57
|
+
// Fallback
|
|
58
|
+
}
|
|
59
|
+
// 2. Fallback via coordinates
|
|
60
|
+
const coords = ed.view.coordsAtPos(from);
|
|
61
|
+
if (coords) {
|
|
62
|
+
// Search for table element at these coordinates
|
|
63
|
+
const element = document.elementFromPoint(coords.left, coords.top);
|
|
64
|
+
const table = element?.closest("table");
|
|
65
|
+
if (table) {
|
|
66
|
+
return table.getBoundingClientRect();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// 3. Ultimate fallback if selection is ambiguous
|
|
70
|
+
const activeTable = ed.view.dom.querySelector("table.selected, table:has(.selected), table:has(.selected-cell), table:has(.selected-node)");
|
|
71
|
+
if (activeTable) {
|
|
72
|
+
return activeTable.getBoundingClientRect();
|
|
73
|
+
}
|
|
74
|
+
return new DOMRect(-9999, -9999, 0, 0);
|
|
75
|
+
}
|
|
76
|
+
executeCommand(editor, command, ...args) {
|
|
77
|
+
this.editorCommands.execute(editor, command, ...args);
|
|
78
|
+
}
|
|
79
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteTableBubbleMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
80
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteTableBubbleMenuComponent, isStandalone: true, selector: "ate-table-bubble-menu", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
81
|
+
<div #menuRef class="bubble-menu" (mousedown)="$event.preventDefault()">
|
|
82
|
+
<!-- Row actions -->
|
|
83
|
+
@if (config().addRowBefore !== false) {
|
|
84
|
+
<ate-button
|
|
85
|
+
icon="add_row_above"
|
|
86
|
+
[title]="t().addRowBefore"
|
|
87
|
+
[disabled]="!state().can.addRowBefore"
|
|
88
|
+
(buttonClick)="onCommand('addRowBefore', $event)"></ate-button>
|
|
89
|
+
}
|
|
90
|
+
@if (config().addRowAfter !== false) {
|
|
91
|
+
<ate-button
|
|
92
|
+
icon="add_row_below"
|
|
93
|
+
[title]="t().addRowAfter"
|
|
94
|
+
[disabled]="!state().can.addRowAfter"
|
|
95
|
+
(buttonClick)="onCommand('addRowAfter', $event)"></ate-button>
|
|
96
|
+
}
|
|
97
|
+
@if (config().deleteRow !== false) {
|
|
98
|
+
<ate-button
|
|
99
|
+
icon="delete"
|
|
100
|
+
[title]="t().deleteRow"
|
|
101
|
+
variant="danger"
|
|
102
|
+
[disabled]="!state().can.deleteRow"
|
|
103
|
+
(buttonClick)="onCommand('deleteRow', $event)"></ate-button>
|
|
104
|
+
}
|
|
105
|
+
@if (config().separator !== false) {
|
|
106
|
+
<ate-separator />
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
<!-- Column actions -->
|
|
110
|
+
@if (config().addColumnBefore !== false) {
|
|
111
|
+
<ate-button
|
|
112
|
+
icon="add_column_left"
|
|
113
|
+
[title]="t().addColumnBefore"
|
|
114
|
+
[disabled]="!state().can.addColumnBefore"
|
|
115
|
+
(buttonClick)="onCommand('addColumnBefore', $event)"></ate-button>
|
|
116
|
+
}
|
|
117
|
+
@if (config().addColumnAfter !== false) {
|
|
118
|
+
<ate-button
|
|
119
|
+
icon="add_column_right"
|
|
120
|
+
[title]="t().addColumnAfter"
|
|
121
|
+
[disabled]="!state().can.addColumnAfter"
|
|
122
|
+
(buttonClick)="onCommand('addColumnAfter', $event)"></ate-button>
|
|
123
|
+
}
|
|
124
|
+
@if (config().deleteColumn !== false) {
|
|
125
|
+
<ate-button
|
|
126
|
+
icon="delete"
|
|
127
|
+
[title]="t().deleteColumn"
|
|
128
|
+
variant="danger"
|
|
129
|
+
[disabled]="!state().can.deleteColumn"
|
|
130
|
+
(buttonClick)="onCommand('deleteColumn', $event)"></ate-button>
|
|
131
|
+
}
|
|
132
|
+
@if (config().separator !== false) {
|
|
133
|
+
<ate-separator />
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
<!-- Cell actions -->
|
|
137
|
+
@if (config().toggleHeaderRow !== false) {
|
|
138
|
+
<ate-button
|
|
139
|
+
icon="toolbar"
|
|
140
|
+
[title]="t().toggleHeaderRow"
|
|
141
|
+
[active]="state().nodes.isTableHeaderRow"
|
|
142
|
+
[disabled]="!state().can.toggleHeaderRow"
|
|
143
|
+
(buttonClick)="onCommand('toggleHeaderRow', $event)"></ate-button>
|
|
144
|
+
}
|
|
145
|
+
@if (config().toggleHeaderColumn !== false) {
|
|
146
|
+
<ate-button
|
|
147
|
+
icon="dock_to_right"
|
|
148
|
+
[title]="t().toggleHeaderColumn"
|
|
149
|
+
[active]="state().nodes.isTableHeaderColumn"
|
|
150
|
+
[disabled]="!state().can.toggleHeaderColumn"
|
|
151
|
+
(buttonClick)="onCommand('toggleHeaderColumn', $event)"></ate-button>
|
|
152
|
+
}
|
|
153
|
+
@if (config().separator !== false && config().deleteTable !== false) {
|
|
154
|
+
<ate-separator />
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
<!-- Table actions -->
|
|
158
|
+
@if (config().deleteTable !== false) {
|
|
159
|
+
<ate-button
|
|
160
|
+
icon="delete_forever"
|
|
161
|
+
[title]="t().deleteTable"
|
|
162
|
+
variant="danger"
|
|
163
|
+
[disabled]="!state().can.deleteTable"
|
|
164
|
+
(buttonClick)="onCommand('deleteTable', $event)"></ate-button>
|
|
165
|
+
}
|
|
166
|
+
</div>
|
|
167
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "component", type: AteSeparatorComponent, selector: "ate-separator", inputs: ["orientation", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
168
|
+
}
|
|
169
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteTableBubbleMenuComponent, decorators: [{
|
|
170
|
+
type: Component,
|
|
171
|
+
args: [{
|
|
172
|
+
selector: "ate-table-bubble-menu",
|
|
173
|
+
standalone: true,
|
|
174
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
175
|
+
imports: [CommonModule, AteButtonComponent, AteSeparatorComponent],
|
|
176
|
+
template: `
|
|
177
|
+
<div #menuRef class="bubble-menu" (mousedown)="$event.preventDefault()">
|
|
178
|
+
<!-- Row actions -->
|
|
179
|
+
@if (config().addRowBefore !== false) {
|
|
180
|
+
<ate-button
|
|
181
|
+
icon="add_row_above"
|
|
182
|
+
[title]="t().addRowBefore"
|
|
183
|
+
[disabled]="!state().can.addRowBefore"
|
|
184
|
+
(buttonClick)="onCommand('addRowBefore', $event)"></ate-button>
|
|
185
|
+
}
|
|
186
|
+
@if (config().addRowAfter !== false) {
|
|
187
|
+
<ate-button
|
|
188
|
+
icon="add_row_below"
|
|
189
|
+
[title]="t().addRowAfter"
|
|
190
|
+
[disabled]="!state().can.addRowAfter"
|
|
191
|
+
(buttonClick)="onCommand('addRowAfter', $event)"></ate-button>
|
|
192
|
+
}
|
|
193
|
+
@if (config().deleteRow !== false) {
|
|
194
|
+
<ate-button
|
|
195
|
+
icon="delete"
|
|
196
|
+
[title]="t().deleteRow"
|
|
197
|
+
variant="danger"
|
|
198
|
+
[disabled]="!state().can.deleteRow"
|
|
199
|
+
(buttonClick)="onCommand('deleteRow', $event)"></ate-button>
|
|
200
|
+
}
|
|
201
|
+
@if (config().separator !== false) {
|
|
202
|
+
<ate-separator />
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
<!-- Column actions -->
|
|
206
|
+
@if (config().addColumnBefore !== false) {
|
|
207
|
+
<ate-button
|
|
208
|
+
icon="add_column_left"
|
|
209
|
+
[title]="t().addColumnBefore"
|
|
210
|
+
[disabled]="!state().can.addColumnBefore"
|
|
211
|
+
(buttonClick)="onCommand('addColumnBefore', $event)"></ate-button>
|
|
212
|
+
}
|
|
213
|
+
@if (config().addColumnAfter !== false) {
|
|
214
|
+
<ate-button
|
|
215
|
+
icon="add_column_right"
|
|
216
|
+
[title]="t().addColumnAfter"
|
|
217
|
+
[disabled]="!state().can.addColumnAfter"
|
|
218
|
+
(buttonClick)="onCommand('addColumnAfter', $event)"></ate-button>
|
|
219
|
+
}
|
|
220
|
+
@if (config().deleteColumn !== false) {
|
|
221
|
+
<ate-button
|
|
222
|
+
icon="delete"
|
|
223
|
+
[title]="t().deleteColumn"
|
|
224
|
+
variant="danger"
|
|
225
|
+
[disabled]="!state().can.deleteColumn"
|
|
226
|
+
(buttonClick)="onCommand('deleteColumn', $event)"></ate-button>
|
|
227
|
+
}
|
|
228
|
+
@if (config().separator !== false) {
|
|
229
|
+
<ate-separator />
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
<!-- Cell actions -->
|
|
233
|
+
@if (config().toggleHeaderRow !== false) {
|
|
234
|
+
<ate-button
|
|
235
|
+
icon="toolbar"
|
|
236
|
+
[title]="t().toggleHeaderRow"
|
|
237
|
+
[active]="state().nodes.isTableHeaderRow"
|
|
238
|
+
[disabled]="!state().can.toggleHeaderRow"
|
|
239
|
+
(buttonClick)="onCommand('toggleHeaderRow', $event)"></ate-button>
|
|
240
|
+
}
|
|
241
|
+
@if (config().toggleHeaderColumn !== false) {
|
|
242
|
+
<ate-button
|
|
243
|
+
icon="dock_to_right"
|
|
244
|
+
[title]="t().toggleHeaderColumn"
|
|
245
|
+
[active]="state().nodes.isTableHeaderColumn"
|
|
246
|
+
[disabled]="!state().can.toggleHeaderColumn"
|
|
247
|
+
(buttonClick)="onCommand('toggleHeaderColumn', $event)"></ate-button>
|
|
248
|
+
}
|
|
249
|
+
@if (config().separator !== false && config().deleteTable !== false) {
|
|
250
|
+
<ate-separator />
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
<!-- Table actions -->
|
|
254
|
+
@if (config().deleteTable !== false) {
|
|
255
|
+
<ate-button
|
|
256
|
+
icon="delete_forever"
|
|
257
|
+
[title]="t().deleteTable"
|
|
258
|
+
variant="danger"
|
|
259
|
+
[disabled]="!state().can.deleteTable"
|
|
260
|
+
(buttonClick)="onCommand('deleteTable', $event)"></ate-button>
|
|
261
|
+
}
|
|
262
|
+
</div>
|
|
263
|
+
`,
|
|
264
|
+
}]
|
|
265
|
+
}] });
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLXRhYmxlLWJ1YmJsZS1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdGlwdGFwLWVkaXRvci9zcmMvbGliL2NvbXBvbmVudHMvYnViYmxlLW1lbnVzL3RhYmxlL2F0ZS10YWJsZS1idWJibGUtbWVudS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQWtHakUsTUFBTSxPQUFPLDJCQUE0QixTQUFRLGlCQUFpQjtJQTlGbEU7O1FBK0ZFLHFCQUFxQjtRQUNaLE1BQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUVwQyxXQUFNLEdBQUcsS0FBSyxDQUEyQjtZQUN2QyxZQUFZLEVBQUUsSUFBSTtZQUNsQixXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO0tBdUVKO0lBckVVLFVBQVU7UUFDakIsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMs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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RlQsMkRBeEZTLFlBQVksK0JBQUUsa0JBQWtCLDZMQUFFLHFCQUFxQjs7NEZBMEZ0RCwyQkFBMkI7a0JBOUZ2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDO29CQUNsRSxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVGVDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IHR5cGUgRWRpdG9yIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuaW1wb3J0IHsgQXRlQnV0dG9uQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL3VpL2F0ZS1idXR0b24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBdGVTZXBhcmF0b3JDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vdWkvYXRlLXNlcGFyYXRvci5jb21wb25lbnRcIjtcbmltcG9ydCB7IEF0ZUJhc2VCdWJibGVNZW51IH0gZnJvbSBcIi4uL2Jhc2UvYXRlLWJhc2UtYnViYmxlLW1lbnVcIjtcblxuaW1wb3J0IHsgQXRlVGFibGVCdWJibGVNZW51Q29uZmlnIH0gZnJvbSBcIi4uLy4uLy4uL21vZGVscy9hdGUtYnViYmxlLW1lbnUubW9kZWxcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImF0ZS10YWJsZS1idWJibGUtbWVudVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQXRlQnV0dG9uQ29tcG9uZW50LCBBdGVTZXBhcmF0b3JDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgI21lbnVSZWYgY2xhc3M9XCJidWJibGUtbWVudVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgIDwhLS0gUm93IGFjdGlvbnMgLS0+XG4gICAgICBAaWYgKGNvbmZpZygpLmFkZFJvd0JlZm9yZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwiYWRkX3Jvd19hYm92ZVwiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5hZGRSb3dCZWZvcmVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4uYWRkUm93QmVmb3JlXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdhZGRSb3dCZWZvcmUnLCAkZXZlbnQpXCI+PC9hdGUtYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5hZGRSb3dBZnRlciAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwiYWRkX3Jvd19iZWxvd1wiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5hZGRSb3dBZnRlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi5hZGRSb3dBZnRlclwiXG4gICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cIm9uQ29tbWFuZCgnYWRkUm93QWZ0ZXInLCAkZXZlbnQpXCI+PC9hdGUtYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5kZWxldGVSb3cgIT09IGZhbHNlKSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImRlbGV0ZVwiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5kZWxldGVSb3dcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4uZGVsZXRlUm93XCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdkZWxldGVSb3cnLCAkZXZlbnQpXCI+PC9hdGUtYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5zZXBhcmF0b3IgIT09IGZhbHNlKSB7XG4gICAgICAgIDxhdGUtc2VwYXJhdG9yIC8+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gQ29sdW1uIGFjdGlvbnMgLS0+XG4gICAgICBAaWYgKGNvbmZpZygpLmFkZENvbHVtbkJlZm9yZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwiYWRkX2NvbHVtbl9sZWZ0XCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmFkZENvbHVtbkJlZm9yZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi5hZGRDb2x1bW5CZWZvcmVcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ2FkZENvbHVtbkJlZm9yZScsICRldmVudClcIj48L2F0ZS1idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLmFkZENvbHVtbkFmdGVyICE9PSBmYWxzZSkge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJhZGRfY29sdW1uX3JpZ2h0XCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmFkZENvbHVtbkFmdGVyXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLmFkZENvbHVtbkFmdGVyXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdhZGRDb2x1bW5BZnRlcicsICRldmVudClcIj48L2F0ZS1idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLmRlbGV0ZUNvbHVtbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwiZGVsZXRlXCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmRlbGV0ZUNvbHVtblwiXG4gICAgICAgICAgdmFyaWFudD1cImRhbmdlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi5kZWxldGVDb2x1bW5cIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ2RlbGV0ZUNvbHVtbicsICRldmVudClcIj48L2F0ZS1idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLnNlcGFyYXRvciAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGF0ZS1zZXBhcmF0b3IgLz5cbiAgICAgIH1cblxuICAgICAgPCEtLSBDZWxsIGFjdGlvbnMgLS0+XG4gICAgICBAaWYgKGNvbmZpZygpLnRvZ2dsZUhlYWRlclJvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwidG9vbGJhclwiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS50b2dnbGVIZWFkZXJSb3dcIlxuICAgICAgICAgIFthY3RpdmVdPVwic3RhdGUoKS5ub2Rlcy5pc1RhYmxlSGVhZGVyUm93XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLnRvZ2dsZUhlYWRlclJvd1wiXG4gICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cIm9uQ29tbWFuZCgndG9nZ2xlSGVhZGVyUm93JywgJGV2ZW50KVwiPjwvYXRlLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkudG9nZ2xlSGVhZGVyQ29sdW1uICE9PSBmYWxzZSkge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJkb2NrX3RvX3JpZ2h0XCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLnRvZ2dsZUhlYWRlckNvbHVtblwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm5vZGVzLmlzVGFibGVIZWFkZXJDb2x1bW5cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4udG9nZ2xlSGVhZGVyQ29sdW1uXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCd0b2dnbGVIZWFkZXJDb2x1bW4nLCAkZXZlbnQpXCI+PC9hdGUtYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5zZXBhcmF0b3IgIT09IGZhbHNlICYmIGNvbmZpZygpLmRlbGV0ZVRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICA8YXRlLXNlcGFyYXRvciAvPlxuICAgICAgfVxuXG4gICAgICA8IS0tIFRhYmxlIGFjdGlvbnMgLS0+XG4gICAgICBAaWYgKGNvbmZpZygpLmRlbGV0ZVRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJkZWxldGVfZm9yZXZlclwiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5kZWxldGVUYWJsZVwiXG4gICAgICAgICAgdmFyaWFudD1cImRhbmdlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi5kZWxldGVUYWJsZVwiXG4gICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cIm9uQ29tbWFuZCgnZGVsZXRlVGFibGUnLCAkZXZlbnQpXCI+PC9hdGUtYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBBdGVUYWJsZUJ1YmJsZU1lbnVDb21wb25lbnQgZXh0ZW5kcyBBdGVCYXNlQnViYmxlTWVudSB7XG4gIC8vIEFsaWFzIGZvciB0ZW1wbGF0ZVxuICByZWFkb25seSB0ID0gdGhpcy5pMThuU2VydmljZS50YWJsZTtcblxuICBjb25maWcgPSBpbnB1dDxBdGVUYWJsZUJ1YmJsZU1lbnVDb25maWc+KHtcbiAgICBhZGRSb3dCZWZvcmU6IHRydWUsXG4gICAgYWRkUm93QWZ0ZXI6IHRydWUsXG4gICAgZGVsZXRlUm93OiB0cnVlLFxuICAgIGFkZENvbHVtbkJlZm9yZTogdHJ1ZSxcbiAgICBhZGRDb2x1bW5BZnRlcjogdHJ1ZSxcbiAgICBkZWxldGVDb2x1bW46IHRydWUsXG4gICAgZGVsZXRlVGFibGU6IHRydWUsXG4gICAgdG9nZ2xlSGVhZGVyUm93OiB0cnVlLFxuICAgIHRvZ2dsZUhlYWRlckNvbHVtbjogdHJ1ZSxcbiAgICBzZXBhcmF0b3I6IHRydWUsXG4gIH0pO1xuXG4gIG92ZXJyaWRlIHNob3VsZFNob3coKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb24sIG5vZGVzLCBpc0VkaXRhYmxlLCBpc0ZvY3VzZWQgfSA9IHRoaXMuc3RhdGUoKTtcblxuICAgIGlmICh0aGlzLmVkaXRvckNvbW1hbmRzLmxpbmtFZGl0TW9kZSgpIHx8IHRoaXMuZWRpdG9yQ29tbWFuZHMuY29sb3JFZGl0TW9kZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT25seSBzaG93IHRhYmxlIGJ1YmJsZSBtZW51IGlmOlxuICAgIC8vIDEuIFdlIGFyZSBpbnNpZGUgYSB0YWJsZSAobm9kZXMuaXNUYWJsZSlcbiAgICAvLyAyLiBFZGl0b3IgaXMgZWRpdGFibGUgYW5kIGZvY3VzZWRcbiAgICAvLyAzLiBTZWxlY3Rpb24gaXMgRU1QVFkgKGN1cnNvcikgT1IgdGhlIFRhYmxlIG5vZGUgaXRzZWxmIGlzIHNlbGVjdGVkXG4gICAgLy8gNC4gSXQncyBOT1QgYSBDZWxsU2VsZWN0aW9uIChjZWxsIGJ1YmJsZSBtZW51IHRha2VzIHByaW9yaXR5KVxuICAgIHJldHVybiAoXG4gICAgICBub2Rlcy5pc1RhYmxlICYmXG4gICAgICBpc0VkaXRhYmxlICYmXG4gICAgICBpc0ZvY3VzZWQgJiZcbiAgICAgIChzZWxlY3Rpb24uZW1wdHkgfHwgbm9kZXMuaXNUYWJsZU5vZGVTZWxlY3RlZCkgJiZcbiAgICAgIHNlbGVjdGlvbi50eXBlICE9PSBcImNlbGxcIlxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBnZXRTZWxlY3Rpb25SZWN0KCk6IERPTVJlY3Qge1xuICAgIGNvbnN0IGVkID0gdGhpcy5lZGl0b3IoKTtcbiAgICBpZiAoIWVkKSB7XG4gICAgICByZXR1cm4gbmV3IERPTVJlY3QoMCwgMCwgMCwgMCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBmcm9tIH0gPSBlZC5zdGF0ZS5zZWxlY3Rpb247XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gRGlyZWN0IFByb3NlTWlycm9yIGFwcHJvYWNoOiBnZXQgRE9NIG5vZGUgYXQgcG9zaXRpb25cbiAgICAgIGNvbnN0IGRvbSA9IGVkLnZpZXcuZG9tQXRQb3MoZnJvbSkubm9kZTtcblxuICAgICAgLy8gRmluZCBjbG9zZXN0IHRhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9XG4gICAgICAgIGRvbSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZG9tLmNsb3Nlc3QoXCJ0YWJsZVwiKSA6IGRvbS5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KFwidGFibGVcIik7XG5cbiAgICAgIGlmICh0YWJsZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfZSkge1xuICAgICAgLy8gRmFsbGJhY2tcbiAgICB9XG5cbiAgICAvLyAyLiBGYWxsYmFjayB2aWEgY29vcmRpbmF0ZXNcbiAgICBjb25zdCBjb29yZHMgPSBlZC52aWV3LmNvb3Jkc0F0UG9zKGZyb20pO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgdGFibGUgZWxlbWVudCBhdCB0aGVzZSBjb29yZGluYXRlc1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoY29vcmRzLmxlZnQsIGNvb3Jkcy50b3ApO1xuICAgICAgY29uc3QgdGFibGUgPSBlbGVtZW50Py5jbG9zZXN0KFwidGFibGVcIik7XG4gICAgICBpZiAodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIFVsdGltYXRlIGZhbGxiYWNrIGlmIHNlbGVjdGlvbiBpcyBhbWJpZ3VvdXNcbiAgICBjb25zdCBhY3RpdmVUYWJsZSA9IGVkLnZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcInRhYmxlLnNlbGVjdGVkLCB0YWJsZTpoYXMoLnNlbGVjdGVkKSwgdGFibGU6aGFzKC5zZWxlY3RlZC1jZWxsKSwgdGFibGU6aGFzKC5zZWxlY3RlZC1ub2RlKVwiXG4gICAgKTtcbiAgICBpZiAoYWN0aXZlVGFibGUpIHtcbiAgICAgIHJldHVybiBhY3RpdmVUYWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERPTVJlY3QoLTk5OTksIC05OTk5LCAwLCAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleGVjdXRlQ29tbWFuZChlZGl0b3I6IEVkaXRvciwgY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvckNvbW1hbmRzLmV4ZWN1dGUoZWRpdG9yLCBjb21tYW5kLCAuLi5hcmdzKTtcbiAgfVxufVxuIl19
|