@dotcms/angular 0.0.1-alpha.40 → 0.0.1-alpha.42

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 (78) hide show
  1. package/dotcms-angular.d.ts.map +1 -0
  2. package/esm2022/dotcms-angular.mjs +5 -0
  3. package/esm2022/index.mjs +5 -0
  4. package/esm2022/lib/components/dot-editable-text/dot-editable-text.component.mjs +225 -0
  5. package/esm2022/lib/components/dot-editable-text/utils.mjs +43 -0
  6. package/esm2022/lib/components/no-component/no-component.component.mjs +32 -0
  7. package/esm2022/lib/layout/column/column.component.mjs +45 -0
  8. package/esm2022/lib/layout/container/container.component.mjs +126 -0
  9. package/esm2022/lib/layout/contentlet/contentlet.component.mjs +120 -0
  10. package/esm2022/lib/layout/dotcms-layout/dotcms-layout.component.mjs +100 -0
  11. package/esm2022/lib/layout/row/row.component.mjs +29 -0
  12. package/esm2022/lib/models/dotcms.model.mjs +3 -0
  13. package/esm2022/lib/models/index.mjs +3 -0
  14. package/esm2022/lib/services/dotcms-context/page-context.service.mjs +75 -0
  15. package/esm2022/lib/utils/index.mjs +79 -0
  16. package/fesm2022/dotcms-angular.mjs +858 -0
  17. package/fesm2022/dotcms-angular.mjs.map +1 -0
  18. package/{src/index.ts → index.d.ts} +1 -0
  19. package/index.d.ts.map +1 -0
  20. package/lib/components/dot-editable-text/dot-editable-text.component.d.ts +129 -0
  21. package/lib/components/dot-editable-text/dot-editable-text.component.d.ts.map +1 -0
  22. package/lib/components/dot-editable-text/utils.d.ts +7 -0
  23. package/lib/components/dot-editable-text/utils.d.ts.map +1 -0
  24. package/lib/components/no-component/no-component.component.d.ts +22 -0
  25. package/lib/components/no-component/no-component.component.d.ts.map +1 -0
  26. package/lib/layout/column/column.component.d.ts +29 -0
  27. package/lib/layout/column/column.component.d.ts.map +1 -0
  28. package/lib/layout/container/container.component.d.ts +88 -0
  29. package/lib/layout/container/container.component.d.ts.map +1 -0
  30. package/{src/lib/layout/contentlet/contentlet.component.ts → lib/layout/contentlet/contentlet.component.d.ts} +17 -32
  31. package/lib/layout/contentlet/contentlet.component.d.ts.map +1 -0
  32. package/lib/layout/dotcms-layout/dotcms-layout.component.d.ts +67 -0
  33. package/lib/layout/dotcms-layout/dotcms-layout.component.d.ts.map +1 -0
  34. package/lib/layout/row/row.component.d.ts +20 -0
  35. package/lib/layout/row/row.component.d.ts.map +1 -0
  36. package/{src/lib/models/dotcms.model.ts → lib/models/dotcms.model.d.ts} +3 -21
  37. package/lib/models/dotcms.model.d.ts.map +1 -0
  38. package/{src/lib/models/index.ts → lib/models/index.d.ts} +1 -8
  39. package/lib/models/index.d.ts.map +1 -0
  40. package/{src/lib/services/dotcms-context/page-context.service.ts → lib/services/dotcms-context/page-context.service.d.ts} +12 -41
  41. package/lib/services/dotcms-context/page-context.service.d.ts.map +1 -0
  42. package/lib/utils/index.d.ts +63 -0
  43. package/lib/utils/index.d.ts.map +1 -0
  44. package/package.json +21 -4
  45. package/.eslintrc.json +0 -18
  46. package/jest.config.ts +0 -22
  47. package/ng-package.json +0 -7
  48. package/project.json +0 -33
  49. package/src/lib/components/dot-editable-text/dot-editable-text.component.css +0 -4
  50. package/src/lib/components/dot-editable-text/dot-editable-text.component.html +0 -8
  51. package/src/lib/components/dot-editable-text/dot-editable-text.component.spec.ts +0 -424
  52. package/src/lib/components/dot-editable-text/dot-editable-text.component.ts +0 -269
  53. package/src/lib/components/dot-editable-text/utils.ts +0 -51
  54. package/src/lib/components/no-component/no-component.component.css +0 -3
  55. package/src/lib/components/no-component/no-component.component.spec.ts +0 -24
  56. package/src/lib/components/no-component/no-component.component.ts +0 -31
  57. package/src/lib/layout/column/column.component.css +0 -99
  58. package/src/lib/layout/column/column.component.spec.ts +0 -33
  59. package/src/lib/layout/column/column.component.ts +0 -49
  60. package/src/lib/layout/container/container.component.css +0 -9
  61. package/src/lib/layout/container/container.component.html +0 -26
  62. package/src/lib/layout/container/container.component.spec.ts +0 -205
  63. package/src/lib/layout/container/container.component.ts +0 -140
  64. package/src/lib/layout/contentlet/contentlet.component.spec.ts +0 -22
  65. package/src/lib/layout/dotcms-layout/dotcms-layout.component.css +0 -3
  66. package/src/lib/layout/dotcms-layout/dotcms-layout.component.spec.ts +0 -195
  67. package/src/lib/layout/dotcms-layout/dotcms-layout.component.ts +0 -150
  68. package/src/lib/layout/row/row.component.css +0 -6
  69. package/src/lib/layout/row/row.component.spec.ts +0 -28
  70. package/src/lib/layout/row/row.component.ts +0 -32
  71. package/src/lib/services/dotcms-context/page-context.spec.ts +0 -80
  72. package/src/lib/utils/index.ts +0 -92
  73. package/src/lib/utils/testing.utils.ts +0 -1019
  74. package/src/test-setup.ts +0 -8
  75. package/tsconfig.json +0 -29
  76. package/tsconfig.lib.json +0 -12
  77. package/tsconfig.lib.prod.json +0 -9
  78. package/tsconfig.spec.json +0 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotcms-angular.d.ts","sourceRoot":"","sources":["../../../../libs/sdk/angular/src/dotcms-angular.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,cAAc,SAAS,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90Y21zLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9hbmd1bGFyL3NyYy9kb3RjbXMtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export * from './lib/components/dot-editable-text/dot-editable-text.component';
2
+ export * from './lib/layout/dotcms-layout/dotcms-layout.component';
3
+ export * from './lib/services/dotcms-context/page-context.service';
4
+ export * from './lib/models';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9hbmd1bGFyL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdFQUFnRSxDQUFDO0FBQy9FLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvZG90LWVkaXRhYmxlLXRleHQvZG90LWVkaXRhYmxlLXRleHQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xheW91dC9kb3RjbXMtbGF5b3V0L2RvdGNtcy1sYXlvdXQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2RvdGNtcy1jb250ZXh0L3BhZ2UtY29udGV4dC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscyc7XG4iXX0=
@@ -0,0 +1,225 @@
1
+ import { EditorComponent, TINYMCE_SCRIPT_SRC } from '@tinymce/tinymce-angular';
2
+ import { Component, ElementRef, HostListener, inject, Input, Renderer2, SecurityContext, ViewChild } from '@angular/core';
3
+ import { DomSanitizer } from '@angular/platform-browser';
4
+ import { CUSTOMER_ACTIONS, DotCmsClient, isInsideEditor, postMessageToEditor } from '@dotcms/client';
5
+ import { TINYMCE_CONFIG } from './utils';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Dot editable text component.
9
+ * This component is responsible to render a text field that can be edited inline.
10
+ *
11
+ * @export
12
+ * @class DotEditableTextComponent
13
+ * @implements {OnInit}
14
+ * @implements {OnChanges}
15
+ */
16
+ export class DotEditableTextComponent {
17
+ constructor() {
18
+ /**
19
+ * Represents the mode of the editor which can be `plain`, `minimal`, or `full`
20
+ *
21
+ * @type {DOT_EDITABLE_TEXT_MODE}
22
+ * @memberof DotEditableTextComponent
23
+ */
24
+ this.mode = 'plain';
25
+ /**
26
+ * Represents the format of the editor which can be `text` or `html`
27
+ *
28
+ * @type {DOT_EDITABLE_TEXT_FORMAT}
29
+ * @memberof DotEditableTextComponent
30
+ */
31
+ this.format = 'text';
32
+ /**
33
+ * Represents the field name of the `contentlet` that can be edited
34
+ *
35
+ * @memberof DotEditableTextComponent
36
+ */
37
+ this.fieldName = '';
38
+ /**
39
+ * Represents the content of the `contentlet` that can be edited
40
+ *
41
+ * @protected
42
+ * @memberof DotEditableTextComponent
43
+ */
44
+ this.content = '';
45
+ this.#sanitizer = inject(DomSanitizer);
46
+ this.#renderer = inject(Renderer2);
47
+ this.#elementRef = inject(ElementRef);
48
+ }
49
+ #sanitizer;
50
+ #renderer;
51
+ #elementRef;
52
+ /**
53
+ * The TinyMCE editor
54
+ *
55
+ * @readonly
56
+ * @memberof DotEditableTextComponent
57
+ */
58
+ get editor() {
59
+ return this.editorComponent?.editor;
60
+ }
61
+ /**
62
+ * Returns the number of pages the contentlet is on
63
+ *
64
+ * @readonly
65
+ * @memberof DotEditableTextComponent
66
+ */
67
+ get onNumberOfPages() {
68
+ return this.contentlet['onNumberOfPages'] || 1;
69
+ }
70
+ /**
71
+ * Handle copy contentlet inline editing success event
72
+ *
73
+ * @param {MessageEvent} { data }
74
+ * @return {*}
75
+ * @memberof DotEditableTextComponent
76
+ */
77
+ onMessage({ data }) {
78
+ const { name, payload } = data;
79
+ if (name !== 'COPY_CONTENTLET_INLINE_EDITING_SUCCESS') {
80
+ return;
81
+ }
82
+ const { oldInode, inode } = payload;
83
+ const currentInode = this.contentlet.inode;
84
+ if (currentInode === oldInode || currentInode === inode) {
85
+ this.editorComponent.editor.focus();
86
+ return;
87
+ }
88
+ }
89
+ ngOnInit() {
90
+ this.isInsideEditor = isInsideEditor();
91
+ if (!this.isInsideEditor) {
92
+ this.innerHTMLToElement();
93
+ return;
94
+ }
95
+ this.init = {
96
+ ...TINYMCE_CONFIG[this.mode],
97
+ base_url: `${DotCmsClient.dotcmsUrl}/ext/tinymcev7`
98
+ };
99
+ }
100
+ ngOnChanges() {
101
+ this.content = this.contentlet[this.fieldName] || '';
102
+ if (this.editor) {
103
+ this.editor.setContent(this.content, { format: this.format });
104
+ }
105
+ }
106
+ /**
107
+ * Handle mouse down event
108
+ *
109
+ * @param {EventObj<MouseEvent>} { event }
110
+ * @return {*}
111
+ * @memberof DotEditableTextComponent
112
+ */
113
+ onMouseDown({ event }) {
114
+ if (this.onNumberOfPages <= 1 || this.editorComponent.editor.hasFocus()) {
115
+ return;
116
+ }
117
+ const { inode, languageId: language } = this.contentlet;
118
+ event.stopPropagation();
119
+ event.preventDefault();
120
+ try {
121
+ postMessageToEditor({
122
+ action: CUSTOMER_ACTIONS.COPY_CONTENTLET_INLINE_EDITING,
123
+ payload: {
124
+ dataset: {
125
+ inode,
126
+ language,
127
+ fieldName: this.fieldName
128
+ }
129
+ }
130
+ });
131
+ }
132
+ catch (error) {
133
+ console.error('Failed to post message to editor:', error);
134
+ }
135
+ }
136
+ /**
137
+ * Handle focus out event
138
+ *
139
+ * @return {*}
140
+ * @memberof DotEditableTextComponent
141
+ */
142
+ onFocusOut() {
143
+ const content = this.editor.getContent({ format: this.format });
144
+ if (!this.editor.isDirty() || !this.didContentChange(content)) {
145
+ return;
146
+ }
147
+ const { inode, languageId: langId } = this.contentlet;
148
+ try {
149
+ postMessageToEditor({
150
+ action: CUSTOMER_ACTIONS.UPDATE_CONTENTLET_INLINE_EDITING,
151
+ payload: {
152
+ content,
153
+ dataset: {
154
+ inode,
155
+ langId,
156
+ fieldName: this.fieldName
157
+ }
158
+ }
159
+ });
160
+ }
161
+ catch (error) {
162
+ console.error('Failed to post message to editor:', error);
163
+ }
164
+ }
165
+ /**
166
+ * inner HTML to element
167
+ *
168
+ * @private
169
+ * @param {string} editedContent
170
+ * @return {*}
171
+ * @memberof DotEditableTextComponent
172
+ */
173
+ innerHTMLToElement() {
174
+ const element = this.#elementRef.nativeElement;
175
+ const safeHtml = this.#sanitizer.bypassSecurityTrustHtml(this.content);
176
+ const content = this.#sanitizer.sanitize(SecurityContext.HTML, safeHtml) || '';
177
+ this.#renderer.setProperty(element, 'innerHTML', content);
178
+ }
179
+ /**
180
+ * Check if the content has changed
181
+ *
182
+ * @private
183
+ * @param {string} editedContent
184
+ * @return {*}
185
+ * @memberof DotEditableTextComponent
186
+ */
187
+ didContentChange(editedContent) {
188
+ return this.content !== editedContent;
189
+ }
190
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: DotEditableTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
191
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: DotEditableTextComponent, isStandalone: true, selector: "dot-editable-text", inputs: { mode: "mode", format: "format", contentlet: "contentlet", fieldName: "fieldName" }, host: { listeners: { "window:message": "onMessage($event)" } }, providers: [
192
+ {
193
+ provide: TINYMCE_SCRIPT_SRC,
194
+ useFactory: () => {
195
+ return `${DotCmsClient.dotcmsUrl}/ext/tinymcev7/tinymce.min.js`;
196
+ }
197
+ }
198
+ ], viewQueries: [{ propertyName: "editorComponent", first: true, predicate: EditorComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (isInsideEditor) {\n <editor\n #tinyEditor\n [init]=\"init\"\n [initialValue]=\"content\"\n (onMouseDown)=\"onMouseDown($event)\"\n (onFocusOut)=\"onFocusOut()\" />\n}\n", styles: [":host ::ng-deep .mce-content-body:not(.mce-edit-focus):hover{outline:2px solid #006ce7;border-radius:4px}\n"], dependencies: [{ kind: "component", type: EditorComponent, selector: "editor", inputs: ["cloudChannel", "apiKey", "init", "id", "initialValue", "outputFormat", "inline", "tagName", "plugins", "toolbar", "modelEvents", "allowedEvents", "ignoreEvents", "disabled"] }] }); }
199
+ }
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: DotEditableTextComponent, decorators: [{
201
+ type: Component,
202
+ args: [{ selector: 'dot-editable-text', standalone: true, imports: [EditorComponent], providers: [
203
+ {
204
+ provide: TINYMCE_SCRIPT_SRC,
205
+ useFactory: () => {
206
+ return `${DotCmsClient.dotcmsUrl}/ext/tinymcev7/tinymce.min.js`;
207
+ }
208
+ }
209
+ ], template: "@if (isInsideEditor) {\n <editor\n #tinyEditor\n [init]=\"init\"\n [initialValue]=\"content\"\n (onMouseDown)=\"onMouseDown($event)\"\n (onFocusOut)=\"onFocusOut()\" />\n}\n", styles: [":host ::ng-deep .mce-content-body:not(.mce-edit-focus):hover{outline:2px solid #006ce7;border-radius:4px}\n"] }]
210
+ }], propDecorators: { editorComponent: [{
211
+ type: ViewChild,
212
+ args: [EditorComponent]
213
+ }], mode: [{
214
+ type: Input
215
+ }], format: [{
216
+ type: Input
217
+ }], contentlet: [{
218
+ type: Input
219
+ }], fieldName: [{
220
+ type: Input
221
+ }], onMessage: [{
222
+ type: HostListener,
223
+ args: ['window:message', ['$event']]
224
+ }] } });
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90LWVkaXRhYmxlLXRleHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvZG90LWVkaXRhYmxlLXRleHQvZG90LWVkaXRhYmxlLXRleHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvZG90LWVkaXRhYmxlLXRleHQvZG90LWVkaXRhYmxlLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRy9FLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixjQUFjLEVBQ2QsbUJBQW1CLEVBQ3RCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLGNBQWMsRUFBb0QsTUFBTSxTQUFTLENBQUM7O0FBSTNGOzs7Ozs7OztHQVFHO0FBZ0JILE1BQU0sT0FBTyx3QkFBd0I7SUFmckM7UUFrQkk7Ozs7O1dBS0c7UUFDTSxTQUFJLEdBQTJCLE9BQU8sQ0FBQztRQUNoRDs7Ozs7V0FLRztRQUNNLFdBQU0sR0FBNkIsTUFBTSxDQUFDO1FBUW5EOzs7O1dBSUc7UUFDTSxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXhCOzs7OztXQUtHO1FBQ08sWUFBTyxHQUFHLEVBQUUsQ0FBQztRQWtCZCxlQUFVLEdBQUcsTUFBTSxDQUFlLFlBQVksQ0FB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QyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxnQkFBZ0IsQ0FBQyxhQUFxQjtRQUMxQyxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssYUFBYSxDQUFDO0lBQzFDLENBQUM7OEdBdk5RLHdCQUF3QjtrR0FBeEIsd0JBQXdCLDhOQVR0QjtZQUNQO2dCQUNJLE9BQU8sRUFBRSxrQkFBa0I7Z0JBQzNCLFVBQVUsRUFBRSxHQUFHLEVBQUU7b0JBQ2IsT0FBTyxHQUFHLFlBQVksQ0FBQyxTQUFTLCtCQUErQixDQUFDO2dCQUNwRSxDQUFDO2FBQ0o7U0FDSiwyRUFHVSxlQUFlLHFFQ3JEOUIscU5BUUEscUtEa0NjLGVBQWU7OzJGQVVoQix3QkFBd0I7a0JBZnBDLFNBQVM7K0JBQ0ksbUJBQW1CLGNBQ2pCLElBQUksV0FHUCxDQUFDLGVBQWUsQ0FBQyxhQUNmO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFVBQVUsRUFBRSxHQUFHLEVBQUU7Z0NBQ2IsT0FBTyxHQUFHLFlBQVksQ0FBQyxTQUFTLCtCQUErQixDQUFDOzRCQUNwRSxDQUFDO3lCQUNKO3FCQUNKOzhCQUcyQixlQUFlO3NCQUExQyxTQUFTO3VCQUFDLGVBQWU7Z0JBUWpCLElBQUk7c0JBQVosS0FBSztnQkFPRyxNQUFNO3NCQUFkLEtBQUs7Z0JBT0csVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQTBETixTQUFTO3NCQURSLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFZGl0b3JDb21wb25lbnQsIFRJTllNQ0VfU0NSSVBUX1NSQyB9IGZyb20gJ0B0aW55bWNlL3RpbnltY2UtYW5ndWxhcic7XG5pbXBvcnQgeyBFdmVudE9iaiB9IGZyb20gJ0B0aW55bWNlL3RpbnltY2UtYW5ndWxhci9lZGl0b3IvRXZlbnRzJztcblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNlY3VyaXR5Q29udGV4dCxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuaW1wb3J0IHtcbiAgICBDVVNUT01FUl9BQ1RJT05TLFxuICAgIERvdENtc0NsaWVudCxcbiAgICBpc0luc2lkZUVkaXRvcixcbiAgICBwb3N0TWVzc2FnZVRvRWRpdG9yXG59IGZyb20gJ0Bkb3RjbXMvY2xpZW50JztcblxuaW1wb3J0IHsgVElOWU1DRV9DT05GSUcsIERPVF9FRElUQUJMRV9URVhUX0ZPUk1BVCwgRE9UX0VESVRBQkxFX1RFWFRfTU9ERSB9IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgeyBEb3RDTVNDb250ZW50bGV0IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuLyoqXG4gKiBEb3QgZWRpdGFibGUgdGV4dCBjb21wb25lbnQuXG4gKiBUaGlzIGNvbXBvbmVudCBpcyByZXNwb25zaWJsZSB0byByZW5kZXIgYSB0ZXh0IGZpZWxkIHRoYXQgY2FuIGJlIGVkaXRlZCBpbmxpbmUuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudFxuICogQGltcGxlbWVudHMge09uSW5pdH1cbiAqIEBpbXBsZW1lbnRzIHtPbkNoYW5nZXN9XG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZG90LWVkaXRhYmxlLXRleHQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RvdC1lZGl0YWJsZS10ZXh0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vZG90LWVkaXRhYmxlLXRleHQuY29tcG9uZW50LmNzcycsXG4gICAgaW1wb3J0czogW0VkaXRvckNvbXBvbmVudF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRJTllNQ0VfU0NSSVBUX1NSQyxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7RG90Q21zQ2xpZW50LmRvdGNtc1VybH0vZXh0L3RpbnltY2V2Ny90aW55bWNlLm1pbi5qc2A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBAVmlld0NoaWxkKEVkaXRvckNvbXBvbmVudCkgZWRpdG9yQ29tcG9uZW50ITogRWRpdG9yQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyB0aGUgbW9kZSBvZiB0aGUgZWRpdG9yIHdoaWNoIGNhbiBiZSBgcGxhaW5gLCBgbWluaW1hbGAsIG9yIGBmdWxsYFxuICAgICAqXG4gICAgICogQHR5cGUge0RPVF9FRElUQUJMRV9URVhUX01PREV9XG4gICAgICogQG1lbWJlcm9mIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIG1vZGU6IERPVF9FRElUQUJMRV9URVhUX01PREUgPSAncGxhaW4nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgdGhlIGZvcm1hdCBvZiB0aGUgZWRpdG9yIHdoaWNoIGNhbiBiZSBgdGV4dGAgb3IgYGh0bWxgXG4gICAgICpcbiAgICAgKiBAdHlwZSB7RE9UX0VESVRBQkxFX1RFWFRfRk9STUFUfVxuICAgICAqIEBtZW1iZXJvZiBEb3RFZGl0YWJsZVRleHRDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBmb3JtYXQ6IERPVF9FRElUQUJMRV9URVhUX0ZPUk1BVCA9ICd0ZXh0JztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIHRoZSBgY29udGVudGxldGAgdGhhdCBjYW4gYmUgaW5saW5lIGVkaXRlZFxuICAgICAqXG4gICAgICogQHR5cGUge0RvdENNU0NvbnRlbnRsZXR9XG4gICAgICogQG1lbWJlcm9mIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbnRlbnRsZXQhOiBEb3RDTVNDb250ZW50bGV0O1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgdGhlIGZpZWxkIG5hbWUgb2YgdGhlIGBjb250ZW50bGV0YCB0aGF0IGNhbiBiZSBlZGl0ZWRcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBEb3RFZGl0YWJsZVRleHRDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBmaWVsZE5hbWUgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgdGhlIGNvbnRlbnQgb2YgdGhlIGBjb250ZW50bGV0YCB0aGF0IGNhbiBiZSBlZGl0ZWRcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAbWVtYmVyb2YgRG90RWRpdGFibGVUZXh0Q29tcG9uZW50XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbnRlbnQgPSAnJztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBlZGl0b3JcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAdHlwZSB7RWRpdG9yQ29tcG9uZW50Wydpbml0J119XG4gICAgICogQG1lbWJlcm9mIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0ITogRWRpdG9yQ29tcG9uZW50Wydpbml0J107XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBpZiB0aGUgY29tcG9uZW50IGlzIGluc2lkZSB0aGUgZWRpdG9yXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0luc2lkZUVkaXRvciE6IGJvb2xlYW47XG5cbiAgICByZWFkb25seSAjc2FuaXRpemVyID0gaW5qZWN0PERvbVNhbml0aXplcj4oRG9tU2FuaXRpemVyKTtcbiAgICByZWFkb25seSAjcmVuZGVyZXIgPSBpbmplY3Q8UmVuZGVyZXIyPihSZW5kZXJlcjIpO1xuICAgIHJlYWRvbmx5ICNlbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY+KEVsZW1lbnRSZWYpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFRpbnlNQ0UgZWRpdG9yXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAbWVtYmVyb2YgRG90RWRpdGFibGVUZXh0Q29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGVkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yQ29tcG9uZW50Py5lZGl0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoZSBjb250ZW50bGV0IGlzIG9uXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAbWVtYmVyb2YgRG90RWRpdGFibGVUZXh0Q29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IG9uTnVtYmVyT2ZQYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudGxldFsnb25OdW1iZXJPZlBhZ2VzJ10gfHwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgY29weSBjb250ZW50bGV0IGlubGluZSBlZGl0aW5nIHN1Y2Nlc3MgZXZlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TWVzc2FnZUV2ZW50fSB7IGRhdGEgfVxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICogQG1lbWJlcm9mIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptZXNzYWdlJywgWyckZXZlbnQnXSlcbiAgICBvbk1lc3NhZ2UoeyBkYXRhIH06IE1lc3NhZ2VFdmVudCkge1xuICAgICAgICBjb25zdCB7IG5hbWUsIHBheWxvYWQgfSA9IGRhdGE7XG4gICAgICAgIGlmIChuYW1lICE9PSAnQ09QWV9DT05URU5UTEVUX0lOTElORV9FRElUSU5HX1NVQ0NFU1MnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG9sZElub2RlLCBpbm9kZSB9ID0gcGF5bG9hZDtcbiAgICAgICAgY29uc3QgY3VycmVudElub2RlID0gdGhpcy5jb250ZW50bGV0Lmlub2RlO1xuXG4gICAgICAgIGlmIChjdXJyZW50SW5vZGUgPT09IG9sZElub2RlIHx8IGN1cnJlbnRJbm9kZSA9PT0gaW5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yQ29tcG9uZW50LmVkaXRvci5mb2N1cygpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5pc0luc2lkZUVkaXRvciA9IGlzSW5zaWRlRWRpdG9yKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zaWRlRWRpdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVySFRNTFRvRWxlbWVudCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXQgPSB7XG4gICAgICAgICAgICAuLi5USU5ZTUNFX0NPTkZJR1t0aGlzLm1vZGVdLFxuICAgICAgICAgICAgYmFzZV91cmw6IGAke0RvdENtc0NsaWVudC5kb3RjbXNVcmx9L2V4dC90aW55bWNldjdgXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHRoaXMuY29udGVudGxldFt0aGlzLmZpZWxkTmFtZV0gfHwgJyc7XG4gICAgICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Q29udGVudCh0aGlzLmNvbnRlbnQsIHsgZm9ybWF0OiB0aGlzLmZvcm1hdCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBtb3VzZSBkb3duIGV2ZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0V2ZW50T2JqPE1vdXNlRXZlbnQ+fSB7IGV2ZW50IH1cbiAgICAgKiBAcmV0dXJuIHsqfVxuICAgICAqIEBtZW1iZXJvZiBEb3RFZGl0YWJsZVRleHRDb21wb25lbnRcbiAgICAgKi9cbiAgICBvbk1vdXNlRG93bih7IGV2ZW50IH06IEV2ZW50T2JqPE1vdXNlRXZlbnQ+KSB7XG4gICAgICAgIGlmICh0aGlzLm9uTnVtYmVyT2ZQYWdlcyA8PSAxIHx8IHRoaXMuZWRpdG9yQ29tcG9uZW50LmVkaXRvci5oYXNGb2N1cygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGlub2RlLCBsYW5ndWFnZUlkOiBsYW5ndWFnZSB9ID0gdGhpcy5jb250ZW50bGV0O1xuXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZVRvRWRpdG9yKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IENVU1RPTUVSX0FDVElPTlMuQ09QWV9DT05URU5UTEVUX0lOTElORV9FRElUSU5HLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBvc3QgbWVzc2FnZSB0byBlZGl0b3I6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBmb2N1cyBvdXQgZXZlbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICogQG1lbWJlcm9mIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudFxuICAgICAqL1xuICAgIG9uRm9jdXNPdXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmVkaXRvci5nZXRDb250ZW50KHsgZm9ybWF0OiB0aGlzLmZvcm1hdCB9KTtcblxuICAgICAgICBpZiAoIXRoaXMuZWRpdG9yLmlzRGlydHkoKSB8fCAhdGhpcy5kaWRDb250ZW50Q2hhbmdlKGNvbnRlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGlub2RlLCBsYW5ndWFnZUlkOiBsYW5nSWQgfSA9IHRoaXMuY29udGVudGxldDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcG9zdE1lc3NhZ2VUb0VkaXRvcih7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBDVVNUT01FUl9BQ1RJT05TLlVQREFURV9DT05URU5UTEVUX0lOTElORV9FRElUSU5HLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5nSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IHRoaXMuZmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwb3N0IG1lc3NhZ2UgdG8gZWRpdG9yOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGlubmVyIEhUTUwgdG8gZWxlbWVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZWRpdGVkQ29udGVudFxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICogQG1lbWJlcm9mIERvdEVkaXRhYmxlVGV4dENvbXBvbmVudFxuICAgICAqL1xuICAgIHByaXZhdGUgaW5uZXJIVE1MVG9FbGVtZW50KCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzYWZlSHRtbCA9IHRoaXMuI3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmNvbnRlbnQpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy4jc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBzYWZlSHRtbCkgfHwgJyc7XG5cbiAgICAgICAgdGhpcy4jcmVuZGVyZXIuc2V0UHJvcGVydHkoZWxlbWVudCwgJ2lubmVySFRNTCcsIGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBjb250ZW50IGhhcyBjaGFuZ2VkXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlZGl0ZWRDb250ZW50XG4gICAgICogQHJldHVybiB7Kn1cbiAgICAgKiBAbWVtYmVyb2YgRG90RWRpdGFibGVUZXh0Q29tcG9uZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBkaWRDb250ZW50Q2hhbmdlKGVkaXRlZENvbnRlbnQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50ICE9PSBlZGl0ZWRDb250ZW50O1xuICAgIH1cbn1cbiIsIkBpZiAoaXNJbnNpZGVFZGl0b3IpIHtcbiAgICA8ZWRpdG9yXG4gICAgICAgICN0aW55RWRpdG9yXG4gICAgICAgIFtpbml0XT1cImluaXRcIlxuICAgICAgICBbaW5pdGlhbFZhbHVlXT1cImNvbnRlbnRcIlxuICAgICAgICAob25Nb3VzZURvd24pPVwib25Nb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXQoKVwiIC8+XG59XG4iXX0=
@@ -0,0 +1,43 @@
1
+ const DEFAULT_TINYMCE_CONFIG = {
2
+ menubar: false,
3
+ inline: true,
4
+ valid_styles: {
5
+ '*': 'font-size,font-family,color,text-decoration,text-align'
6
+ },
7
+ powerpaste_word_import: 'clean',
8
+ powerpaste_html_import: 'clean',
9
+ suffix: '.min', // Suffix to use when loading resources
10
+ license_key: 'gpl'
11
+ };
12
+ export const TINYMCE_CONFIG = {
13
+ minimal: {
14
+ ...DEFAULT_TINYMCE_CONFIG,
15
+ plugins: 'link autolink',
16
+ toolbar: 'bold italic underline | link',
17
+ valid_elements: 'strong,em,span[style],a[href]'
18
+ },
19
+ full: {
20
+ ...DEFAULT_TINYMCE_CONFIG,
21
+ plugins: 'link lists autolink charmap',
22
+ style_formats: [
23
+ { title: 'Paragraph', format: 'p' },
24
+ { title: 'Header 1', format: 'h1' },
25
+ { title: 'Header 2', format: 'h2' },
26
+ { title: 'Header 3', format: 'h3' },
27
+ { title: 'Header 4', format: 'h4' },
28
+ { title: 'Header 5', format: 'h5' },
29
+ { title: 'Header 6', format: 'h6' },
30
+ { title: 'Pre', format: 'pre' },
31
+ { title: 'Code', format: 'code' }
32
+ ],
33
+ toolbar: [
34
+ 'styleselect undo redo | bold italic underline | forecolor backcolor | alignleft aligncenter alignright alignfull | numlist bullist outdent indent | hr charmap removeformat | link'
35
+ ]
36
+ },
37
+ plain: {
38
+ ...DEFAULT_TINYMCE_CONFIG,
39
+ plugins: '',
40
+ toolbar: ''
41
+ }
42
+ };
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9kb3QtZWRpdGFibGUtdGV4dC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxNQUFNLHNCQUFzQixHQUE0QjtJQUNwRCxPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxJQUFJO0lBQ1osWUFBWSxFQUFFO1FBQ1YsR0FBRyxFQUFFLHdEQUF3RDtLQUNoRTtJQUNELHNCQUFzQixFQUFFLE9BQU87SUFDL0Isc0JBQXNCLEVBQUUsT0FBTztJQUMvQixNQUFNLEVBQUUsTUFBTSxFQUFFLHVDQUF1QztJQUN2RCxXQUFXLEVBQUUsS0FBSztDQUNyQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUV2QjtJQUNBLE9BQU8sRUFBRTtRQUNMLEdBQUcsc0JBQXNCO1FBQ3pCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLE9BQU8sRUFBRSw4QkFBOEI7UUFDdkMsY0FBYyxFQUFFLCtCQUErQjtLQUNsRDtJQUNELElBQUksRUFBRTtRQUNGLEdBQUcsc0JBQXNCO1FBQ3pCLE9BQU8sRUFBRSw2QkFBNkI7UUFDdEMsYUFBYSxFQUFFO1lBQ1gsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDbkMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDbkMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDbkMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDbkMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDbkMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDbkMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDbkMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFDL0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7U0FDcEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxvTEFBb0w7U0FDdkw7S0FDSjtJQUNELEtBQUssRUFBRTtRQUNILEdBQUcsc0JBQXNCO1FBQ3pCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsT0FBTyxFQUFFLEVBQUU7S0FDZDtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFZGl0b3JDb21wb25lbnQgfSBmcm9tICdAdGlueW1jZS90aW55bWNlLWFuZ3VsYXInO1xuXG5leHBvcnQgdHlwZSBET1RfRURJVEFCTEVfVEVYVF9NT0RFID0gJ21pbmltYWwnIHwgJ2Z1bGwnIHwgJ3BsYWluJztcblxuZXhwb3J0IHR5cGUgRE9UX0VESVRBQkxFX1RFWFRfRk9STUFUID0gJ2h0bWwnIHwgJ3RleHQnO1xuXG5jb25zdCBERUZBVUxUX1RJTllNQ0VfQ09ORklHOiBFZGl0b3JDb21wb25lbnRbJ2luaXQnXSA9IHtcbiAgICBtZW51YmFyOiBmYWxzZSxcbiAgICBpbmxpbmU6IHRydWUsXG4gICAgdmFsaWRfc3R5bGVzOiB7XG4gICAgICAgICcqJzogJ2ZvbnQtc2l6ZSxmb250LWZhbWlseSxjb2xvcix0ZXh0LWRlY29yYXRpb24sdGV4dC1hbGlnbidcbiAgICB9LFxuICAgIHBvd2VycGFzdGVfd29yZF9pbXBvcnQ6ICdjbGVhbicsXG4gICAgcG93ZXJwYXN0ZV9odG1sX2ltcG9ydDogJ2NsZWFuJyxcbiAgICBzdWZmaXg6ICcubWluJywgLy8gU3VmZml4IHRvIHVzZSB3aGVuIGxvYWRpbmcgcmVzb3VyY2VzXG4gICAgbGljZW5zZV9rZXk6ICdncGwnXG59O1xuXG5leHBvcnQgY29uc3QgVElOWU1DRV9DT05GSUc6IHtcbiAgICBba2V5IGluIERPVF9FRElUQUJMRV9URVhUX01PREVdOiBFZGl0b3JDb21wb25lbnRbJ2luaXQnXTtcbn0gPSB7XG4gICAgbWluaW1hbDoge1xuICAgICAgICAuLi5ERUZBVUxUX1RJTllNQ0VfQ09ORklHLFxuICAgICAgICBwbHVnaW5zOiAnbGluayBhdXRvbGluaycsXG4gICAgICAgIHRvb2xiYXI6ICdib2xkIGl0YWxpYyB1bmRlcmxpbmUgfCBsaW5rJyxcbiAgICAgICAgdmFsaWRfZWxlbWVudHM6ICdzdHJvbmcsZW0sc3BhbltzdHlsZV0sYVtocmVmXSdcbiAgICB9LFxuICAgIGZ1bGw6IHtcbiAgICAgICAgLi4uREVGQVVMVF9USU5ZTUNFX0NPTkZJRyxcbiAgICAgICAgcGx1Z2luczogJ2xpbmsgbGlzdHMgYXV0b2xpbmsgY2hhcm1hcCcsXG4gICAgICAgIHN0eWxlX2Zvcm1hdHM6IFtcbiAgICAgICAgICAgIHsgdGl0bGU6ICdQYXJhZ3JhcGgnLCBmb3JtYXQ6ICdwJyB9LFxuICAgICAgICAgICAgeyB0aXRsZTogJ0hlYWRlciAxJywgZm9ybWF0OiAnaDEnIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiAnSGVhZGVyIDInLCBmb3JtYXQ6ICdoMicgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6ICdIZWFkZXIgMycsIGZvcm1hdDogJ2gzJyB9LFxuICAgICAgICAgICAgeyB0aXRsZTogJ0hlYWRlciA0JywgZm9ybWF0OiAnaDQnIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiAnSGVhZGVyIDUnLCBmb3JtYXQ6ICdoNScgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6ICdIZWFkZXIgNicsIGZvcm1hdDogJ2g2JyB9LFxuICAgICAgICAgICAgeyB0aXRsZTogJ1ByZScsIGZvcm1hdDogJ3ByZScgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6ICdDb2RlJywgZm9ybWF0OiAnY29kZScgfVxuICAgICAgICBdLFxuICAgICAgICB0b29sYmFyOiBbXG4gICAgICAgICAgICAnc3R5bGVzZWxlY3QgdW5kbyByZWRvIHwgYm9sZCBpdGFsaWMgdW5kZXJsaW5lIHwgZm9yZWNvbG9yIGJhY2tjb2xvciB8IGFsaWdubGVmdCBhbGlnbmNlbnRlciBhbGlnbnJpZ2h0IGFsaWduZnVsbCB8IG51bWxpc3QgYnVsbGlzdCBvdXRkZW50IGluZGVudCB8IGhyIGNoYXJtYXAgcmVtb3ZlZm9ybWF0IHwgbGluaydcbiAgICAgICAgXVxuICAgIH0sXG4gICAgcGxhaW46IHtcbiAgICAgICAgLi4uREVGQVVMVF9USU5ZTUNFX0NPTkZJRyxcbiAgICAgICAgcGx1Z2luczogJycsXG4gICAgICAgIHRvb2xiYXI6ICcnXG4gICAgfVxufTtcbiJdfQ==
@@ -0,0 +1,32 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * This component is responsible to display a message when there is no component for a contentlet.
5
+ *
6
+ * @export
7
+ * @class NoComponent
8
+ */
9
+ export class NoComponent {
10
+ constructor() {
11
+ /**
12
+ * The data-testid attribute used for identifying the component during testing.
13
+ */
14
+ this.testId = 'no-component';
15
+ }
16
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: NoComponent, isStandalone: true, selector: "dotcms-no-component", inputs: { contentlet: "contentlet" }, host: { properties: { "attr.data-testid": "this.testId" } }, ngImport: i0, template: `
18
+ No Component for {{ contentlet.contentType }}
19
+ `, isInline: true, styles: [":host{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NoComponent, decorators: [{
22
+ type: Component,
23
+ args: [{ selector: 'dotcms-no-component', standalone: true, template: `
24
+ No Component for {{ contentlet.contentType }}
25
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}\n"] }]
26
+ }], propDecorators: { contentlet: [{
27
+ type: Input
28
+ }], testId: [{
29
+ type: HostBinding,
30
+ args: ['attr.data-testid']
31
+ }] } });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tY29tcG9uZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2RrL2FuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL25vLWNvbXBvbmVudC9uby1jb21wb25lbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFJdkY7Ozs7O0dBS0c7QUFVSCxNQUFNLE9BQU8sV0FBVztJQVR4QjtRQWdCSTs7V0FFRztRQUM4QixXQUFNLEdBQUcsY0FBYyxDQUFDO0tBQzVEOzhHQVhZLFdBQVc7a0dBQVgsV0FBVyxrTEFOVjs7S0FFVDs7MkZBSVEsV0FBVztrQkFUdkIsU0FBUzsrQkFDSSxxQkFBcUIsY0FDbkIsSUFBSSxZQUNOOztLQUVULG1CQUVnQix1QkFBdUIsQ0FBQyxNQUFNOzhCQU90QyxVQUFVO3NCQUFsQixLQUFLO2dCQUsyQixNQUFNO3NCQUF0QyxXQUFXO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEb3RDTVNDb250ZW50bGV0IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCBpcyByZXNwb25zaWJsZSB0byBkaXNwbGF5IGEgbWVzc2FnZSB3aGVuIHRoZXJlIGlzIG5vIGNvbXBvbmVudCBmb3IgYSBjb250ZW50bGV0LlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBOb0NvbXBvbmVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2RvdGNtcy1uby1jb21wb25lbnQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgTm8gQ29tcG9uZW50IGZvciB7eyBjb250ZW50bGV0LmNvbnRlbnRUeXBlIH19XG4gICAgYCxcbiAgICBzdHlsZVVybDogJy4vbm8tY29tcG9uZW50LmNvbXBvbmVudC5jc3MnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE5vQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudGxldCBvYmplY3QgY29udGFpbmluZyBjb250ZW50IGRhdGEuXG4gICAgICogVGhlIGNvbXBvbmVudCBkaXNwbGF5cyBhIG1lc3NhZ2UgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGlzIGNvbnRlbnRsZXQuXG4gICAgICovXG4gICAgQElucHV0KCkgY29udGVudGxldCE6IERvdENNU0NvbnRlbnRsZXQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YS10ZXN0aWQgYXR0cmlidXRlIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBjb21wb25lbnQgZHVyaW5nIHRlc3RpbmcuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtdGVzdGlkJykgdGVzdElkID0gJ25vLWNvbXBvbmVudCc7XG59XG4iXX0=
@@ -0,0 +1,45 @@
1
+ import { ChangeDetectionStrategy, Component, HostBinding, Input } from '@angular/core';
2
+ import { getPositionStyleClasses } from '../../utils';
3
+ import { ContainerComponent } from '../container/container.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * This component is responsible to display a column with containers.
7
+ *
8
+ * @export
9
+ * @class ColumnComponent
10
+ * @implements {OnInit}
11
+ */
12
+ export class ColumnComponent {
13
+ constructor() {
14
+ /**
15
+ * The data-testid attribute used for identifying the component during testing.
16
+ *
17
+ * @memberof ColumnComponent
18
+ */
19
+ this.containerClasses = '';
20
+ }
21
+ ngOnInit() {
22
+ const { startClass, endClass } = getPositionStyleClasses(this.column.leftOffset, this.column.width + this.column.leftOffset);
23
+ this.containerClasses = `${startClass} ${endClass}`;
24
+ }
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: ColumnComponent, isStandalone: true, selector: "dotcms-column", inputs: { column: "column" }, host: { properties: { "class": "this.containerClasses" } }, ngImport: i0, template: `
27
+ @for (container of column.containers; track $index) {
28
+ <dotcms-container [container]="container" />
29
+ }
30
+ `, isInline: true, styles: [":host.col-start-1{grid-column-start:1}:host.col-start-2{grid-column-start:2}:host.col-start-3{grid-column-start:3}:host.col-start-4{grid-column-start:4}:host.col-start-5{grid-column-start:5}:host.col-start-6{grid-column-start:6}:host.col-start-7{grid-column-start:7}:host.col-start-8{grid-column-start:8}:host.col-start-9{grid-column-start:9}:host.col-start-10{grid-column-start:10}:host.col-start-11{grid-column-start:11}:host.col-start-12{grid-column-start:12}:host.col-end-1{grid-column-end:1}:host.col-end-2{grid-column-end:2}:host.col-end-3{grid-column-end:3}:host.col-end-4{grid-column-end:4}:host.col-end-5{grid-column-end:5}:host.col-end-6{grid-column-end:6}:host.col-end-7{grid-column-end:7}:host.col-end-8{grid-column-end:8}:host.col-end-9{grid-column-end:9}:host.col-end-10{grid-column-end:10}:host.col-end-11{grid-column-end:11}:host.col-end-12{grid-column-end:12}:host.col-end-13{grid-column-end:13}\n"], dependencies: [{ kind: "component", type: ContainerComponent, selector: "dotcms-container", inputs: ["container"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ColumnComponent, decorators: [{
33
+ type: Component,
34
+ args: [{ selector: 'dotcms-column', standalone: true, imports: [ContainerComponent], template: `
35
+ @for (container of column.containers; track $index) {
36
+ <dotcms-container [container]="container" />
37
+ }
38
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host.col-start-1{grid-column-start:1}:host.col-start-2{grid-column-start:2}:host.col-start-3{grid-column-start:3}:host.col-start-4{grid-column-start:4}:host.col-start-5{grid-column-start:5}:host.col-start-6{grid-column-start:6}:host.col-start-7{grid-column-start:7}:host.col-start-8{grid-column-start:8}:host.col-start-9{grid-column-start:9}:host.col-start-10{grid-column-start:10}:host.col-start-11{grid-column-start:11}:host.col-start-12{grid-column-start:12}:host.col-end-1{grid-column-end:1}:host.col-end-2{grid-column-end:2}:host.col-end-3{grid-column-end:3}:host.col-end-4{grid-column-end:4}:host.col-end-5{grid-column-end:5}:host.col-end-6{grid-column-end:6}:host.col-end-7{grid-column-end:7}:host.col-end-8{grid-column-end:8}:host.col-end-9{grid-column-end:9}:host.col-end-10{grid-column-end:10}:host.col-end-11{grid-column-end:11}:host.col-end-12{grid-column-end:12}:host.col-end-13{grid-column-end:13}\n"] }]
39
+ }], propDecorators: { column: [{
40
+ type: Input
41
+ }], containerClasses: [{
42
+ type: HostBinding,
43
+ args: ['class']
44
+ }] } });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2RrL2FuZ3VsYXIvc3JjL2xpYi9sYXlvdXQvY29sdW1uL2NvbHVtbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRy9GLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFFdEU7Ozs7OztHQU1HO0FBYUgsTUFBTSxPQUFPLGVBQWU7SUFaNUI7UUFxQkk7Ozs7V0FJRztRQUNtQixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7S0FTL0M7SUFQRyxRQUFRO1FBQ0osTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyx1QkFBdUIsQ0FDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUM3QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsVUFBVSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3hELENBQUM7OEdBdEJRLGVBQWU7a0dBQWYsZUFBZSxtS0FSZDs7OztLQUlULDQ5QkFMUyxrQkFBa0I7OzJGQVNuQixlQUFlO2tCQVozQixTQUFTOytCQUNJLGVBQWUsY0FDYixJQUFJLFdBQ1AsQ0FBQyxrQkFBa0IsQ0FBQyxZQUNuQjs7OztLQUlULG1CQUVnQix1QkFBdUIsQ0FBQyxNQUFNOzhCQVN0QyxNQUFNO3NCQUFkLEtBQUs7Z0JBT2dCLGdCQUFnQjtzQkFBckMsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRG90UGFnZUFzc2V0TGF5b3V0Q29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IGdldFBvc2l0aW9uU3R5bGVDbGFzc2VzIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29udGFpbmVyL2NvbnRhaW5lci5jb21wb25lbnQnO1xuXG4vKipcbiAqIFRoaXMgY29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIHRvIGRpc3BsYXkgYSBjb2x1bW4gd2l0aCBjb250YWluZXJzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBDb2x1bW5Db21wb25lbnRcbiAqIEBpbXBsZW1lbnRzIHtPbkluaXR9XG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZG90Y21zLWNvbHVtbicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29udGFpbmVyQ29tcG9uZW50XSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICBAZm9yIChjb250YWluZXIgb2YgY29sdW1uLmNvbnRhaW5lcnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPGRvdGNtcy1jb250YWluZXIgW2NvbnRhaW5lcl09XCJjb250YWluZXJcIiAvPlxuICAgICAgICB9XG4gICAgYCxcbiAgICBzdHlsZVVybDogJy4vY29sdW1uLmNvbXBvbmVudC5jc3MnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENvbHVtbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbHVtbiBvYmplY3QgY29udGFpbmluZyB0aGUgY29udGFpbmVycy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtEb3RQYWdlQXNzZXRMYXlvdXRDb2x1bW59XG4gICAgICogQG1lbWJlcm9mIENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbHVtbiE6IERvdFBhZ2VBc3NldExheW91dENvbHVtbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhLXRlc3RpZCBhdHRyaWJ1dGUgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGNvbXBvbmVudCBkdXJpbmcgdGVzdGluZy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY29udGFpbmVyQ2xhc3NlcyA9ICcnO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHsgc3RhcnRDbGFzcywgZW5kQ2xhc3MgfSA9IGdldFBvc2l0aW9uU3R5bGVDbGFzc2VzKFxuICAgICAgICAgICAgdGhpcy5jb2x1bW4ubGVmdE9mZnNldCxcbiAgICAgICAgICAgIHRoaXMuY29sdW1uLndpZHRoICsgdGhpcy5jb2x1bW4ubGVmdE9mZnNldFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckNsYXNzZXMgPSBgJHtzdGFydENsYXNzfSAke2VuZENsYXNzfWA7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,126 @@
1
+ import { AsyncPipe, NgComponentOutlet } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, HostBinding, Input, computed, inject, signal } from '@angular/core';
3
+ import { NoComponent } from '../../components/no-component/no-component.component';
4
+ import { PageContextService } from '../../services/dotcms-context/page-context.service';
5
+ import { getContainersData } from '../../utils';
6
+ import { ContentletComponent } from '../contentlet/contentlet.component';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * This component is responsible to display a container with contentlets.
10
+ *
11
+ * @export
12
+ * @class ContainerComponent
13
+ * @implements {OnChanges}
14
+ */
15
+ export class ContainerComponent {
16
+ constructor() {
17
+ this.pageContextService = inject(PageContextService);
18
+ this.NoComponent = NoComponent;
19
+ this.$isInsideEditor = signal(false);
20
+ this.$contentlets = signal([]);
21
+ this.$dotContainer = signal(null);
22
+ this.$dotContainerAsString = computed(() => JSON.stringify(this.$dotContainer()));
23
+ /**
24
+ * The accept types for the container component.
25
+ *
26
+ * @type {(string | null)}
27
+ * @memberof ContainerComponent
28
+ */
29
+ this.acceptTypes = null;
30
+ /**
31
+ * The identifier for the container component.
32
+ *
33
+ * @type {(string | null)}
34
+ * @memberof ContainerComponent
35
+ */
36
+ this.identifier = null;
37
+ /**
38
+ * The max contentlets for the container component.
39
+ *
40
+ * @type {(number | null)}
41
+ * @memberof ContainerComponent
42
+ */
43
+ this.maxContentlets = null;
44
+ /**
45
+ * The uuid for the container component.
46
+ *
47
+ * @type {(string | null)}
48
+ * @memberof ContainerComponent
49
+ */
50
+ this.uuid = null;
51
+ /**
52
+ * The class for the container component.
53
+ *
54
+ * @type {(string | null)}
55
+ * @memberof ContainerComponent
56
+ */
57
+ this.class = null;
58
+ /**
59
+ * The dot object for the container component.
60
+ *
61
+ * @type {(string | null)}
62
+ * @memberof ContainerComponent
63
+ */
64
+ this.dotObject = null;
65
+ /**
66
+ * The data-testid attribute used for identifying the component during testing.
67
+ *
68
+ * @memberof ContainerComponent
69
+ */
70
+ this.testId = 'dot-container';
71
+ }
72
+ ngOnChanges() {
73
+ const { pageAsset, components, isInsideEditor } = this.pageContextService.context;
74
+ const { acceptTypes, maxContentlets, variantId, path, contentlets } = getContainersData(pageAsset.containers, this.container);
75
+ const { identifier, uuid } = this.container;
76
+ this.componentsMap = components;
77
+ this.$isInsideEditor.set(isInsideEditor);
78
+ this.$contentlets.set(contentlets);
79
+ this.$dotContainer.set({
80
+ identifier: path ?? identifier,
81
+ acceptTypes,
82
+ maxContentlets,
83
+ variantId,
84
+ uuid
85
+ });
86
+ if (this.$isInsideEditor()) {
87
+ this.acceptTypes = acceptTypes;
88
+ this.identifier = identifier;
89
+ this.maxContentlets = maxContentlets;
90
+ this.uuid = uuid;
91
+ this.class = this.$contentlets().length ? null : 'empty-container';
92
+ this.dotObject = 'container';
93
+ }
94
+ }
95
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
96
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: ContainerComponent, isStandalone: true, selector: "dotcms-container", inputs: { container: "container" }, host: { properties: { "attr.data-dot-accept-types": "this.acceptTypes", "attr.data-dot-identifier": "this.identifier", "attr.data-max-contentlets": "this.maxContentlets", "attr.data-dot-uuid": "this.uuid", "class": "this.class", "attr.data-dot-object": "this.dotObject", "attr.data-testid": "this.testId" } }, usesOnChanges: true, ngImport: i0, template: "@if ($isInsideEditor()) {\n @if ($contentlets().length) {\n @for (contentlet of $contentlets(); track $index) {\n <dotcms-contentlet-wrapper\n [contentlet]=\"contentlet\"\n [container]=\"$dotContainerAsString()\">\n <ng-container\n *ngComponentOutlet=\"\n (componentsMap[contentlet.contentType] || componentsMap['CustomNoComponent']\n | async) || NoComponent;\n inputs: { contentlet }\n \" />\n </dotcms-contentlet-wrapper>\n }\n } @else {\n This container is empty.\n }\n} @else {\n @for (contentlet of $contentlets(); track $index) {\n <ng-container\n *ngComponentOutlet=\"\n componentsMap[contentlet.contentType] | async;\n inputs: { contentlet }\n \" />\n }\n}\n", styles: [":host.empty-container{width:100%;background-color:#ecf0fd;display:flex;justify-content:center;align-items:center;color:#030e32;height:10rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ContentletComponent, selector: "dotcms-contentlet-wrapper", inputs: ["contentlet", "container"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
97
+ }
98
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ContainerComponent, decorators: [{
99
+ type: Component,
100
+ args: [{ selector: 'dotcms-container', standalone: true, imports: [AsyncPipe, NgComponentOutlet, NoComponent, ContentletComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if ($isInsideEditor()) {\n @if ($contentlets().length) {\n @for (contentlet of $contentlets(); track $index) {\n <dotcms-contentlet-wrapper\n [contentlet]=\"contentlet\"\n [container]=\"$dotContainerAsString()\">\n <ng-container\n *ngComponentOutlet=\"\n (componentsMap[contentlet.contentType] || componentsMap['CustomNoComponent']\n | async) || NoComponent;\n inputs: { contentlet }\n \" />\n </dotcms-contentlet-wrapper>\n }\n } @else {\n This container is empty.\n }\n} @else {\n @for (contentlet of $contentlets(); track $index) {\n <ng-container\n *ngComponentOutlet=\"\n componentsMap[contentlet.contentType] | async;\n inputs: { contentlet }\n \" />\n }\n}\n", styles: [":host.empty-container{width:100%;background-color:#ecf0fd;display:flex;justify-content:center;align-items:center;color:#030e32;height:10rem}\n"] }]
101
+ }], propDecorators: { container: [{
102
+ type: Input,
103
+ args: [{ required: true }]
104
+ }], acceptTypes: [{
105
+ type: HostBinding,
106
+ args: ['attr.data-dot-accept-types']
107
+ }], identifier: [{
108
+ type: HostBinding,
109
+ args: ['attr.data-dot-identifier']
110
+ }], maxContentlets: [{
111
+ type: HostBinding,
112
+ args: ['attr.data-max-contentlets']
113
+ }], uuid: [{
114
+ type: HostBinding,
115
+ args: ['attr.data-dot-uuid']
116
+ }], class: [{
117
+ type: HostBinding,
118
+ args: ['class']
119
+ }], dotObject: [{
120
+ type: HostBinding,
121
+ args: ['attr.data-dot-object']
122
+ }], testId: [{
123
+ type: HostBinding,
124
+ args: ['attr.data-testid']
125
+ }] } });
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2RrL2FuZ3VsYXIvc3JjL2xpYi9sYXlvdXQvY29udGFpbmVyL2NvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9hbmd1bGFyL3NyYy9saWIvbGF5b3V0L2NvbnRhaW5lci9jb250YWluZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFdBQVcsRUFDWCxLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBR25GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFVekU7Ozs7OztHQU1HO0FBU0gsTUFBTSxPQUFPLGtCQUFrQjtJQVIvQjtRQWlCcUIsdUJBQWtCLEdBQXVCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2xFLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBR2xELGlCQUFZLEdBQUcsTUFBTSxDQUFxQixFQUFFLENBQUMsQ0FBQztRQUM5QyxrQkFBYSxHQUFHLE1BQU0sQ0FBc0IsSUFBSSxDQUFDLENBQUM7UUFDbEQsMEJBQXFCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxD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Y1BpcGUsIE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBjb21wdXRlZCxcbiAgICBpbmplY3QsXG4gICAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOb0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbm8tY29tcG9uZW50L25vLWNvbXBvbmVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0NvbXBvbmVudEVudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBEb3RDTVNDb250YWluZXIsIERvdENNU0NvbnRlbnRsZXQgfSBmcm9tICcuLi8uLi9tb2RlbHMvZG90Y21zLm1vZGVsJztcbmltcG9ydCB7IFBhZ2VDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RvdGNtcy1jb250ZXh0L3BhZ2UtY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldENvbnRhaW5lcnNEYXRhIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29udGVudGxldENvbXBvbmVudCB9IGZyb20gJy4uL2NvbnRlbnRsZXQvY29udGVudGxldC5jb21wb25lbnQnO1xuXG5pbnRlcmZhY2UgRG90Q29udGFpbmVyIHtcbiAgICBhY2NlcHRUeXBlczogc3RyaW5nO1xuICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICBtYXhDb250ZW50bGV0czogbnVtYmVyO1xuICAgIHV1aWQ6IHN0cmluZztcbiAgICB2YXJpYW50SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhpcyBjb21wb25lbnQgaXMgcmVzcG9uc2libGUgdG8gZGlzcGxheSBhIGNvbnRhaW5lciB3aXRoIGNvbnRlbnRsZXRzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBDb250YWluZXJDb21wb25lbnRcbiAqIEBpbXBsZW1lbnRzIHtPbkNoYW5nZXN9XG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZG90Y21zLWNvbnRhaW5lcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQXN5bmNQaXBlLCBOZ0NvbXBvbmVudE91dGxldCwgTm9Db21wb25lbnQsIENvbnRlbnRsZXRDb21wb25lbnRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9jb250YWluZXIuY29tcG9uZW50LmNzcycsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGFpbmVyIG9iamVjdCBjb250YWluaW5nIHRoZSBjb250ZW50bGV0cy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtEb3RDTVNDb250YWluZXJ9XG4gICAgICogQG1lbWJlcm9mIENvbnRhaW5lckNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGNvbnRhaW5lciE6IERvdENNU0NvbnRhaW5lcjtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZUNvbnRleHRTZXJ2aWNlOiBQYWdlQ29udGV4dFNlcnZpY2UgPSBpbmplY3QoUGFnZUNvbnRleHRTZXJ2aWNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgTm9Db21wb25lbnQgPSBOb0NvbXBvbmVudDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGlzSW5zaWRlRWRpdG9yID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIHByb3RlY3RlZCBjb21wb25lbnRzTWFwITogUmVjb3JkPHN0cmluZywgRHluYW1pY0NvbXBvbmVudEVudGl0eT47XG4gICAgcHJvdGVjdGVkICRjb250ZW50bGV0cyA9IHNpZ25hbDxEb3RDTVNDb250ZW50bGV0W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgJGRvdENvbnRhaW5lciA9IHNpZ25hbDxEb3RDb250YWluZXIgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgJGRvdENvbnRhaW5lckFzU3RyaW5nID0gY29tcHV0ZWQoKCkgPT4gSlNPTi5zdHJpbmdpZnkodGhpcy4kZG90Q29udGFpbmVyKCkpKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NlcHQgdHlwZXMgZm9yIHRoZSBjb250YWluZXIgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHR5cGUgeyhzdHJpbmcgfCBudWxsKX1cbiAgICAgKiBAbWVtYmVyb2YgQ29udGFpbmVyQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtZG90LWFjY2VwdC10eXBlcycpIGFjY2VwdFR5cGVzOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgY29udGFpbmVyIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAgICogQG1lbWJlcm9mIENvbnRhaW5lckNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWRvdC1pZGVudGlmaWVyJykgaWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBjb250ZW50bGV0cyBmb3IgdGhlIGNvbnRhaW5lciBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7KG51bWJlciB8IG51bGwpfVxuICAgICAqIEBtZW1iZXJvZiBDb250YWluZXJDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1tYXgtY29udGVudGxldHMnKSBtYXhDb250ZW50bGV0czogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHV1aWQgZm9yIHRoZSBjb250YWluZXIgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHR5cGUgeyhzdHJpbmcgfCBudWxsKX1cbiAgICAgKiBAbWVtYmVyb2YgQ29udGFpbmVyQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtZG90LXV1aWQnKSB1dWlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2xhc3MgZm9yIHRoZSBjb250YWluZXIgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHR5cGUgeyhzdHJpbmcgfCBudWxsKX1cbiAgICAgKiBAbWVtYmVyb2YgQ29udGFpbmVyQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNsYXNzOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZG90IG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7KHN0cmluZyB8IG51bGwpfVxuICAgICAqIEBtZW1iZXJvZiBDb250YWluZXJDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1kb3Qtb2JqZWN0JykgZG90T2JqZWN0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YS10ZXN0aWQgYXR0cmlidXRlIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBjb21wb25lbnQgZHVyaW5nIHRlc3RpbmcuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgQ29udGFpbmVyQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtdGVzdGlkJykgdGVzdElkID0gJ2RvdC1jb250YWluZXInO1xuXG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgcGFnZUFzc2V0LCBjb21wb25lbnRzLCBpc0luc2lkZUVkaXRvciB9ID0gdGhpcy5wYWdlQ29udGV4dFNlcnZpY2UuY29udGV4dDtcbiAgICAgICAgY29uc3QgeyBhY2NlcHRUeXBlcywgbWF4Q29udGVudGxldHMsIHZhcmlhbnRJZCwgcGF0aCwgY29udGVudGxldHMgfSA9IGdldENvbnRhaW5lcnNEYXRhKFxuICAgICAgICAgICAgcGFnZUFzc2V0LmNvbnRhaW5lcnMsXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lclxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7IGlkZW50aWZpZXIsIHV1aWQgfSA9IHRoaXMuY29udGFpbmVyO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c01hcCA9IGNvbXBvbmVudHM7XG5cbiAgICAgICAgdGhpcy4kaXNJbnNpZGVFZGl0b3Iuc2V0KGlzSW5zaWRlRWRpdG9yKTtcbiAgICAgICAgdGhpcy4kY29udGVudGxldHMuc2V0KGNvbnRlbnRsZXRzKTtcbiAgICAgICAgdGhpcy4kZG90Q29udGFpbmVyLnNldCh7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiBwYXRoID8/IGlkZW50aWZpZXIsXG4gICAgICAgICAgICBhY2NlcHRUeXBlcyxcbiAgICAgICAgICAgIG1heENvbnRlbnRsZXRzLFxuICAgICAgICAgICAgdmFyaWFudElkLFxuICAgICAgICAgICAgdXVpZFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy4kaXNJbnNpZGVFZGl0b3IoKSkge1xuICAgICAgICAgICAgdGhpcy5hY2NlcHRUeXBlcyA9IGFjY2VwdFR5cGVzO1xuICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICAgICAgICAgIHRoaXMubWF4Q29udGVudGxldHMgPSBtYXhDb250ZW50bGV0cztcbiAgICAgICAgICAgIHRoaXMudXVpZCA9IHV1aWQ7XG4gICAgICAgICAgICB0aGlzLmNsYXNzID0gdGhpcy4kY29udGVudGxldHMoKS5sZW5ndGggPyBudWxsIDogJ2VtcHR5LWNvbnRhaW5lcic7XG4gICAgICAgICAgICB0aGlzLmRvdE9iamVjdCA9ICdjb250YWluZXInO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmICgkaXNJbnNpZGVFZGl0b3IoKSkge1xuICAgIEBpZiAoJGNvbnRlbnRsZXRzKCkubGVuZ3RoKSB7XG4gICAgICAgIEBmb3IgKGNvbnRlbnRsZXQgb2YgJGNvbnRlbnRsZXRzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPGRvdGNtcy1jb250ZW50bGV0LXdyYXBwZXJcbiAgICAgICAgICAgICAgICBbY29udGVudGxldF09XCJjb250ZW50bGV0XCJcbiAgICAgICAgICAgICAgICBbY29udGFpbmVyXT1cIiRkb3RDb250YWluZXJBc1N0cmluZygpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdDb21wb25lbnRPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb21wb25lbnRzTWFwW2NvbnRlbnRsZXQuY29udGVudFR5cGVdIHx8IGNvbXBvbmVudHNNYXBbJ0N1c3RvbU5vQ29tcG9uZW50J11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jKSB8fCBOb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogeyBjb250ZW50bGV0IH1cbiAgICAgICAgICAgICAgICAgICAgXCIgLz5cbiAgICAgICAgICAgIDwvZG90Y21zLWNvbnRlbnRsZXQtd3JhcHBlcj5cbiAgICAgICAgfVxuICAgIH0gQGVsc2Uge1xuICAgICAgICBUaGlzIGNvbnRhaW5lciBpcyBlbXB0eS5cbiAgICB9XG59IEBlbHNlIHtcbiAgICBAZm9yIChjb250ZW50bGV0IG9mICRjb250ZW50bGV0cygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgY29tcG9uZW50c01hcFtjb250ZW50bGV0LmNvbnRlbnRUeXBlXSB8IGFzeW5jO1xuICAgICAgICAgICAgICAgIGlucHV0czogeyBjb250ZW50bGV0IH1cbiAgICAgICAgICAgIFwiIC8+XG4gICAgfVxufVxuIl19