@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.
Files changed (104) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
  3. package/esm2022/lib/ate-editor.provider.mjs +38 -0
  4. package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
  5. package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +133 -0
  6. package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
  7. package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +226 -0
  8. package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
  9. package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +121 -0
  10. package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +266 -0
  11. package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +294 -0
  12. package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +122 -0
  13. package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
  14. package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +953 -0
  15. package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +329 -0
  16. package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
  17. package/esm2022/lib/components/ui/ate-button.component.mjs +90 -0
  18. package/esm2022/lib/components/ui/ate-separator.component.mjs +31 -0
  19. package/esm2022/lib/config/ate-editor.config.mjs +76 -0
  20. package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
  21. package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
  22. package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
  23. package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
  24. package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +270 -0
  25. package/esm2022/lib/extensions/ate-table.extension.mjs +29 -0
  26. package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
  27. package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
  28. package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
  29. package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
  30. package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
  31. package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
  32. package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
  33. package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
  34. package/esm2022/lib/models/ate-bubble-menu.model.mjs +49 -0
  35. package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
  36. package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
  37. package/esm2022/lib/models/ate-image.model.mjs +2 -0
  38. package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
  39. package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
  40. package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
  41. package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
  42. package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
  43. package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
  44. package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
  45. package/esm2022/lib/services/ate-color-picker.service.mjs +193 -0
  46. package/esm2022/lib/services/ate-editor-commands.service.mjs +465 -0
  47. package/esm2022/lib/services/ate-i18n.service.mjs +410 -0
  48. package/esm2022/lib/services/ate-image.service.mjs +368 -0
  49. package/esm2022/lib/services/ate-link.service.mjs +97 -0
  50. package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
  51. package/esm2022/public-api.mjs +93 -0
  52. package/fesm2022/flogeez-angular-tiptap-editor.mjs +313 -346
  53. package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
  54. package/index.d.ts +3 -1673
  55. package/lib/ate-editor.provider.d.ts +21 -0
  56. package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
  57. package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
  58. package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
  59. package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +52 -0
  60. package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
  61. package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +12 -0
  62. package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +24 -0
  63. package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
  64. package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
  65. package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
  66. package/lib/components/editor/angular-tiptap-editor.component.d.ts +235 -0
  67. package/lib/components/slash-commands/ate-slash-commands.component.d.ts +43 -0
  68. package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
  69. package/lib/components/ui/ate-button.component.d.ts +25 -0
  70. package/lib/components/ui/ate-separator.component.d.ts +7 -0
  71. package/lib/config/ate-editor.config.d.ts +7 -0
  72. package/lib/config/ate-global-config.token.d.ts +6 -0
  73. package/lib/config/ate-slash-commands.config.d.ts +41 -0
  74. package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
  75. package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
  76. package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
  77. package/lib/extensions/ate-table.extension.d.ts +2 -0
  78. package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
  79. package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
  80. package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
  81. package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
  82. package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
  83. package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
  84. package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
  85. package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
  86. package/lib/models/ate-bubble-menu.model.d.ts +33 -0
  87. package/lib/models/ate-editor-config.model.d.ts +100 -0
  88. package/lib/models/ate-editor-state.model.d.ts +109 -0
  89. package/lib/models/ate-image.model.d.ts +104 -0
  90. package/lib/models/ate-toolbar.model.d.ts +18 -0
  91. package/lib/node-view/ate-angular-node-view.d.ts +115 -0
  92. package/lib/node-view/ate-injector.registry.d.ts +3 -0
  93. package/lib/node-view/ate-node-view.factory.d.ts +10 -0
  94. package/lib/node-view/ate-node-view.models.d.ts +138 -0
  95. package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
  96. package/lib/node-view/ate-register-angular-component.d.ts +35 -0
  97. package/lib/services/ate-color-picker.service.d.ts +65 -0
  98. package/lib/services/ate-editor-commands.service.d.ts +72 -0
  99. package/lib/services/ate-i18n.service.d.ts +394 -0
  100. package/lib/services/ate-image.service.d.ts +71 -0
  101. package/lib/services/ate-link.service.d.ts +42 -0
  102. package/lib/utils/ate-color.utils.d.ts +12 -0
  103. package/package.json +3 -1
  104. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWNlbGwtYnViYmxlLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvY29tcG9uZW50cy9idWJibGUtbWVudXMvdGFibGUvYXRlLWNlbGwtYnViYmxlLW1lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUE2QmpFLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxpQkFBaUI7SUF6QmpFOztRQTBCRSxTQUFTO1FBQ1QsV0FBTSxHQUFHLEtBQUssQ0FBMEIsRUFBRSxDQUFDLENBQUM7UUFFNUMsVUFBVTtRQUNELFNBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBa0Z4QztJQWhGVSxVQUFVO1FBQ2pCLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFakUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUM5RSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLFVBQVUsSUFBSSxTQUFTLENBQUM7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bnQsIGlucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyB0eXBlIEVkaXRvciB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IEF0ZUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi91aS9hdGUtYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQXRlQmFzZUJ1YmJsZU1lbnUgfSBmcm9tIFwiLi4vYmFzZS9hdGUtYmFzZS1idWJibGUtbWVudVwiO1xuXG5pbXBvcnQgeyBBdGVDZWxsQnViYmxlTWVudUNvbmZpZyB9IGZyb20gXCIuLi8uLi8uLi9tb2RlbHMvYXRlLWJ1YmJsZS1tZW51Lm1vZGVsXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhdGUtY2VsbC1idWJibGUtbWVudVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQXRlQnV0dG9uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2ICNtZW51UmVmIGNsYXNzPVwiYnViYmxlLW1lbnVcIiAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+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