@pobuca/email-builder 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +1 -0
  2. package/assets/icons/dribbble.png +0 -0
  3. package/assets/icons/facebook.png +0 -0
  4. package/assets/icons/github.png +0 -0
  5. package/assets/icons/instagram.png +0 -0
  6. package/assets/icons/linkedin.png +0 -0
  7. package/assets/icons/medium.png +0 -0
  8. package/assets/icons/pinterest.png +0 -0
  9. package/assets/icons/snapchat.png +0 -0
  10. package/assets/icons/soundcloud.png +0 -0
  11. package/assets/icons/tumblr.png +0 -0
  12. package/assets/icons/twitter.png +0 -0
  13. package/assets/icons/vimeo.png +0 -0
  14. package/assets/icons/web.png +0 -0
  15. package/assets/icons/xing.png +0 -0
  16. package/assets/icons/youtube.png +0 -0
  17. package/bundles/pobuca-email-builder.umd.js +4664 -0
  18. package/bundles/pobuca-email-builder.umd.js.map +1 -0
  19. package/bundles/pobuca-email-builder.umd.min.js +2 -0
  20. package/bundles/pobuca-email-builder.umd.min.js.map +1 -0
  21. package/esm2015/lib/classes/DefaultEmail.js +53 -0
  22. package/esm2015/lib/classes/Elements.js +229 -0
  23. package/esm2015/lib/classes/Structure.js +89 -0
  24. package/esm2015/lib/components/block/block.component.js +89 -0
  25. package/esm2015/lib/components/block-settings/block-settings.component.js +53 -0
  26. package/esm2015/lib/components/builder-container/builder-container.component.js +114 -0
  27. package/esm2015/lib/components/dialog.component.js +30 -0
  28. package/esm2015/lib/components/general-settings/general-settings.component.js +25 -0
  29. package/esm2015/lib/components/import-dialog/import-dialog.component.js +62 -0
  30. package/esm2015/lib/components/preview.component.js +89 -0
  31. package/esm2015/lib/components/structure/structure.component.js +163 -0
  32. package/esm2015/lib/components/structure-settings/structure-settings.component.js +31 -0
  33. package/esm2015/lib/components/template-list-dialog/template-list-dialog.component.js +45 -0
  34. package/esm2015/lib/directives/dynamic-component.directive.js +46 -0
  35. package/esm2015/lib/elements/abstract-block.js +23 -0
  36. package/esm2015/lib/elements/button/button.component.js +29 -0
  37. package/esm2015/lib/elements/divider/divider.component.js +30 -0
  38. package/esm2015/lib/elements/image/image.component.js +54 -0
  39. package/esm2015/lib/elements/social/social.component.js +42 -0
  40. package/esm2015/lib/elements/spacer/spacer.component.js +30 -0
  41. package/esm2015/lib/elements/text-element/text-element.component.js +80 -0
  42. package/esm2015/lib/groups/align.js +79 -0
  43. package/esm2015/lib/groups/back-repeat.js +55 -0
  44. package/esm2015/lib/groups/border.js +102 -0
  45. package/esm2015/lib/groups/color.js +139 -0
  46. package/esm2015/lib/groups/direction.js +63 -0
  47. package/esm2015/lib/groups/font-styles.js +112 -0
  48. package/esm2015/lib/groups/gaps.js +45 -0
  49. package/esm2015/lib/groups/line-height.js +68 -0
  50. package/esm2015/lib/groups/link.js +67 -0
  51. package/esm2015/lib/groups/margin.js +45 -0
  52. package/esm2015/lib/groups/padding.js +53 -0
  53. package/esm2015/lib/groups/upload-image.js +112 -0
  54. package/esm2015/lib/groups/width-height.js +94 -0
  55. package/esm2015/lib/interceptors/pb-interceptor.interceptor.js +51 -0
  56. package/esm2015/lib/interfaces/interfaces.js +13 -0
  57. package/esm2015/lib/pb-email-builder.component.js +246 -0
  58. package/esm2015/lib/pb-email-builder.module.js +291 -0
  59. package/esm2015/lib/pb-email-builder.service.js +134 -0
  60. package/esm2015/lib/pipes/slugify.pipe.js +39 -0
  61. package/esm2015/lib/services/internals/pb-email-object-store/pb-email-object-store.service.js +165 -0
  62. package/esm2015/lib/services/internals/user-interfaces/user-interface.service.js +122 -0
  63. package/esm2015/lib/services/pb-storage/FreeUsersStorage.class.js +11 -0
  64. package/esm2015/lib/services/pb-storage/index.js +7 -0
  65. package/esm2015/lib/services/pb-storage/pb-storage.service.js +79 -0
  66. package/esm2015/lib/services/user-image-uploader-service/free-users-image-uploader.service.js +26 -0
  67. package/esm2015/lib/services/user-image-uploader-service/index.js +8 -0
  68. package/esm2015/lib/services/user-image-uploader-service/paid-users-image-uploader.service.js +30 -0
  69. package/esm2015/lib/services/user-image-uploader-service/upload-bottom-sheet-dialog/upload-bottom-sheet-dialog.component.js +112 -0
  70. package/esm2015/lib/services/user-image-uploader-service/upload-image-gallery/upload-image-gallery.component.js +91 -0
  71. package/esm2015/lib/services/user-image-uploader-service/user-image-uploader.service.js +26 -0
  72. package/esm2015/lib/services/user-middleware-service/FreeUsersMiddleware.js +31 -0
  73. package/esm2015/lib/services/user-middleware-service/PaidUsersMiddleware.js +12 -0
  74. package/esm2015/lib/services/user-middleware-service/index.js +8 -0
  75. package/esm2015/lib/services/user-middleware-service/pb-middlewares.service.js +195 -0
  76. package/esm2015/lib/services/user-rest-api-service/free-users-rest-api.service.js +16 -0
  77. package/esm2015/lib/services/user-rest-api-service/index.js +7 -0
  78. package/esm2015/lib/services/user-rest-api-service/user-rest-api.service.js +116 -0
  79. package/esm2015/lib/tokens/private-tokens.js +17 -0
  80. package/esm2015/lib/tokens/tokens.js +159 -0
  81. package/esm2015/lib/utils.js +147 -0
  82. package/esm2015/pobuca-email-builder.js +43 -0
  83. package/esm2015/public_api.js +26 -0
  84. package/fesm2015/pobuca-email-builder.js +4335 -0
  85. package/fesm2015/pobuca-email-builder.js.map +1 -0
  86. package/lib/classes/DefaultEmail.d.ts +9 -0
  87. package/lib/classes/Elements.d.ts +62 -0
  88. package/lib/classes/Structure.d.ts +11 -0
  89. package/lib/components/block/block.component.d.ts +25 -0
  90. package/lib/components/block-settings/block-settings.component.d.ts +18 -0
  91. package/lib/components/builder-container/builder-container.component.d.ts +36 -0
  92. package/lib/components/dialog.component.d.ts +10 -0
  93. package/lib/components/general-settings/general-settings.component.d.ts +6 -0
  94. package/lib/components/import-dialog/import-dialog.component.d.ts +16 -0
  95. package/lib/components/preview.component.d.ts +18 -0
  96. package/lib/components/structure/structure.component.d.ts +43 -0
  97. package/lib/components/structure-settings/structure-settings.component.d.ts +9 -0
  98. package/lib/components/template-list-dialog/template-list-dialog.component.d.ts +15 -0
  99. package/lib/directives/dynamic-component.directive.d.ts +13 -0
  100. package/lib/elements/abstract-block.d.ts +8 -0
  101. package/lib/elements/button/button.component.d.ts +18 -0
  102. package/lib/elements/divider/divider.component.d.ts +10 -0
  103. package/lib/elements/image/image.component.d.ts +19 -0
  104. package/lib/elements/social/social.component.d.ts +21 -0
  105. package/lib/elements/spacer/spacer.component.d.ts +5 -0
  106. package/lib/elements/text-element/text-element.component.d.ts +52 -0
  107. package/lib/groups/align.d.ts +17 -0
  108. package/lib/groups/back-repeat.d.ts +8 -0
  109. package/lib/groups/border.d.ts +13 -0
  110. package/lib/groups/color.d.ts +26 -0
  111. package/lib/groups/direction.d.ts +13 -0
  112. package/lib/groups/font-styles.d.ts +17 -0
  113. package/lib/groups/gaps.d.ts +7 -0
  114. package/lib/groups/line-height.d.ts +12 -0
  115. package/lib/groups/link.d.ts +11 -0
  116. package/lib/groups/margin.d.ts +8 -0
  117. package/lib/groups/padding.d.ts +8 -0
  118. package/lib/groups/upload-image.d.ts +19 -0
  119. package/lib/groups/width-height.d.ts +19 -0
  120. package/lib/interceptors/pb-interceptor.interceptor.d.ts +10 -0
  121. package/lib/interfaces/interfaces.d.ts +422 -0
  122. package/lib/pb-email-builder.component.d.ts +67 -0
  123. package/lib/pb-email-builder.module.d.ts +51 -0
  124. package/lib/pb-email-builder.service.d.ts +83 -0
  125. package/lib/pipes/slugify.pipe.d.ts +9 -0
  126. package/lib/services/internals/pb-email-object-store/pb-email-object-store.service.d.ts +50 -0
  127. package/lib/services/internals/user-interfaces/user-interface.service.d.ts +46 -0
  128. package/lib/services/pb-storage/FreeUsersStorage.class.d.ts +6 -0
  129. package/lib/services/pb-storage/index.d.ts +2 -0
  130. package/lib/services/pb-storage/pb-storage.service.d.ts +54 -0
  131. package/lib/services/user-image-uploader-service/free-users-image-uploader.service.d.ts +12 -0
  132. package/lib/services/user-image-uploader-service/index.d.ts +3 -0
  133. package/lib/services/user-image-uploader-service/paid-users-image-uploader.service.d.ts +14 -0
  134. package/lib/services/user-image-uploader-service/upload-bottom-sheet-dialog/upload-bottom-sheet-dialog.component.d.ts +28 -0
  135. package/lib/services/user-image-uploader-service/upload-image-gallery/upload-image-gallery.component.d.ts +27 -0
  136. package/lib/services/user-image-uploader-service/user-image-uploader.service.d.ts +26 -0
  137. package/lib/services/user-middleware-service/FreeUsersMiddleware.d.ts +15 -0
  138. package/lib/services/user-middleware-service/PaidUsersMiddleware.d.ts +7 -0
  139. package/lib/services/user-middleware-service/index.d.ts +3 -0
  140. package/lib/services/user-middleware-service/pb-middlewares.service.d.ts +190 -0
  141. package/lib/services/user-rest-api-service/free-users-rest-api.service.d.ts +10 -0
  142. package/lib/services/user-rest-api-service/index.d.ts +2 -0
  143. package/lib/services/user-rest-api-service/user-rest-api.service.d.ts +82 -0
  144. package/lib/tokens/private-tokens.d.ts +5 -0
  145. package/lib/tokens/tokens.d.ts +70 -0
  146. package/lib/utils.d.ts +88 -0
  147. package/package.json +37 -0
  148. package/pobuca-email-builder.d.ts +42 -0
  149. package/pobuca-email-builder.metadata.json +1 -0
  150. package/public_api.d.ts +16 -0
@@ -0,0 +1,114 @@
1
+ /*
2
+ * Copyright (c) 2024 Pobuca.
3
+ * All rights reserved.
4
+ */
5
+ import { ChangeDetectionStrategy, Component, HostListener, Inject } from '@angular/core';
6
+ import { DomSanitizer } from '@angular/platform-browser';
7
+ import { catchError, exhaustMap, finalize, map, switchMap, take, tap } from 'rxjs/operators';
8
+ import { EMPTY, iif, throwError } from 'rxjs';
9
+ import { createBorder, createMargin, createPadding, createWidthHeight, deferOf } from '../../utils';
10
+ import { PBEmail } from '../../classes/DefaultEmail';
11
+ import { PbUserMiddlewaresService } from '../../services/user-middleware-service/pb-middlewares.service';
12
+ import { PbUserInterfaceService } from '../../services/internals/user-interfaces/user-interface.service';
13
+ import { PbEmailObjectStoreService } from '../../services/internals/pb-email-object-store/pb-email-object-store.service';
14
+ import { PbUserRestApiService } from '../../services/user-rest-api-service/user-rest-api.service';
15
+ import { PB_CONFIG } from '../../tokens/tokens';
16
+ import { PbStorageService } from '../../services/pb-storage/pb-storage.service';
17
+ // import { IpUserRestApiProvider } from '../providers';
18
+ export class BuilderContainerComponent {
19
+ constructor(userInterfaceService, emailObjectStore, userRestApi, pbStorage, pbMiddlewaresService, sanitizer, userConfig) {
20
+ var _a;
21
+ this.userInterfaceService = userInterfaceService;
22
+ this.emailObjectStore = emailObjectStore;
23
+ this.userRestApi = userRestApi;
24
+ this.pbStorage = pbStorage;
25
+ this.pbMiddlewaresService = pbMiddlewaresService;
26
+ this.sanitizer = sanitizer;
27
+ this.userConfig = userConfig;
28
+ this.showTemplateList = (_a = this.userConfig.templateListIfEmpty) !== null && _a !== void 0 ? _a : true;
29
+ this.getStructures$ = this.emailObjectStore.emailStructuresAsObservable$;
30
+ this.activeMatProgress$ = this.userInterfaceService.activeMatProgress$;
31
+ }
32
+ onHostClick() {
33
+ this.userInterfaceService.editGeneralSettings();
34
+ }
35
+ trackBy(structure) {
36
+ return structure.id;
37
+ }
38
+ disableStructureDrag$(structure) {
39
+ return this.pbMiddlewaresService.disableStructureDragWithinEmailBody(structure).pipe(take(1));
40
+ }
41
+ openTemplateDialog(ev) {
42
+ ev.stopImmediatePropagation();
43
+ this.userInterfaceService.activeMatProgress$.next(true);
44
+ const cachedTemplates = this.pbStorage.getCachedTemplateList();
45
+ return iif(() => cachedTemplates.length > 0, deferOf(cachedTemplates), this.userRestApi.getAllUserTemplates$.pipe(tap(list => this.pbStorage.cacheTemplateList(list))))
46
+ .pipe(
47
+ // map(() => []),
48
+ map(templates => {
49
+ return [...templates, { category: 'latest', templates: this.pbStorage.getLatestUsedTemplates() }];
50
+ }), finalize(() => this.userInterfaceService.activeMatProgress$.next(false)), exhaustMap(list => (list === null || list === void 0 ? void 0 : list.length) > 0 ? this.userInterfaceService.templatesListDialog$(list) : throwError(new Error('The template list is empty'))), switchMap(({ category, template }) => this.pbMiddlewaresService.chooseTemplate(category, template)), exhaustMap(({ category, template }) => this.userRestApi.getUserTemplateData$(category, template).pipe(tap(choosedTemplate => {
51
+ if (category !== 'latest') {
52
+ this.pbStorage.addTemplateToLatestUsed(choosedTemplate);
53
+ }
54
+ }))), catchError((error) => this.pbMiddlewaresService.catchError(error).pipe(switchMap(() => {
55
+ this.userInterfaceService.notify(error.message);
56
+ return EMPTY;
57
+ }))), take(1))
58
+ .subscribe((result) => {
59
+ if (result) {
60
+ this.emailObjectStore.setEmail(new PBEmail(result.templateData));
61
+ }
62
+ else {
63
+ this.userInterfaceService.notify('No template was chosen');
64
+ }
65
+ });
66
+ }
67
+ dropNewStructure(event) {
68
+ if (event.previousContainer === event.container) {
69
+ this.emailObjectStore.changeStructureOrder(event);
70
+ }
71
+ else {
72
+ this.pbMiddlewaresService
73
+ .addStructure(event)
74
+ .pipe(tap(newEvent => this.emailObjectStore.addStructure(newEvent)), take(1))
75
+ .subscribe();
76
+ }
77
+ }
78
+ getStructureStyles(structure) {
79
+ const { border, background, padding, margin, columnsWidth, fullWidth } = structure.options;
80
+ return Object.assign(Object.assign(Object.assign({
81
+ // direction,
82
+ width: fullWidth ? '100%' : `${this.emailObjectStore.Email.general.width.value}px`, backgroundRepeat: background.repeat, backgroundColor: background.color, backgroundSize: createWidthHeight(background.size), backgroundPosition: 'top center', gridTemplateColumns: columnsWidth.map(fr => `${fr}fr`).join(' ') }, createBorder(border)), createPadding(padding)), createMargin(margin));
83
+ }
84
+ getBackgroundImage(structure) {
85
+ const { background: { url } } = structure.options;
86
+ return this.sanitizer.bypassSecurityTrustStyle(url && `url(${url})`);
87
+ }
88
+ }
89
+ BuilderContainerComponent.decorators = [
90
+ { type: Component, args: [{
91
+ selector: 'pb-builder-container',
92
+ template: "<!--\n ~ Copyright (c) 2024 Pobuca.\n ~ All rights reserved.\n -->\n\n<ng-container *ngIf=\"getStructures$ | async as structures\">\n <div cdkDropList [cdkDropListData]=\"structures\"\n cdkDropListConnectedTo=\"structures-drop-list\" id=\"structures-drop-list\"\n (cdkDropListDropped)=\"dropNewStructure($event)\" fxFlex fxLayout=\"column\" fxLayoutAlign=\"start center\">\n <pb-structure cdkDrag\n *ngFor=\"let structure of structures; trackBy: trackBy; let index = index\" [id]=\"structure.id\"\n [index]=\"index\" [ngClass]=\"structure.type\" [structure]=\"structure\"\n [ngStyle]=\"getStructureStyles(structure)\"\n [style.backgroundImage]=\"getBackgroundImage(structure)\"\n [cdkDragDisabled]=\"disableStructureDrag$(structure) | async\">\n <button cdkDragHandle mat-icon-button class=\"move\" *ngIf=\"!(disableStructureDrag$(structure) | async)\"\n i18n-matTooltip=\"structure|Move Structure\" matTooltip=\"Move Structure\">\n <mat-icon i18n-aria-label=\"structure|Move Structure\" aria-label=\"Move structure\" inline>pan_tool</mat-icon>\n </button>\n </pb-structure>\n\n <div class=\"empty-email mat-typography\" *ngIf=\"!structures.length\">\n <ng-content></ng-content>\n <div class=\"default-empty-email\" *ngIf=\"showTemplateList\">\n <h1 i18n=\"templates|First header\">Choose template from list</h1>\n <p i18n=\"templates|Description\">Or create one from scratch by dragging structures and blocks here!</p>\n <button type=\"button\" color=\"primary\" [disabled]=\"activeMatProgress$ | async\"\n (click)=\"openTemplateDialog($event)\" mat-flat-button i18n=\"templates|Choose a template button\">\n Choose template\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n",
93
+ providers: [
94
+ // IpUserRestApiProvider
95
+ ],
96
+ changeDetection: ChangeDetectionStrategy.OnPush
97
+ // encapsulation: ViewEncapsulation.None
98
+ ,
99
+ styles: ["/*!\n * Copyright (c) 2024 Pobuca.\n * All rights reserved.\n */pb-structure>.cdk-drag-handle{position:absolute;cursor:move;border-radius:50% 50% 0 0;height:30px;width:30px;font-size:smaller;line-height:0;top:-30px;right:0;background-color:#ff4081;color:#fff;opacity:0}pb-structure.cdk-drag-preview>.cdk-drag-handle,pb-structure:hover>.cdk-drag-handle{opacity:.8}pb-structure.cdk-drag-preview>.cdk-drag-handle:hover,pb-structure:hover>.cdk-drag-handle:hover{opacity:1}pb-structure ::ng-deep .cdk-drag-placeholder{background-color:#3f51b5;opacity:.6;cursor:move;border-radius:0}pb-structure ::ng-deep .cdk-drag-placeholder ::ng-deep :not(mat-icon){display:none}pb-structure ::ng-deep .cdk-drag-placeholder ::ng-deep mat-icon{padding:5px;color:#fff}:host{background-color:#f2f2f2;overflow-x:hidden;overflow-y:auto;position:relative;height:100%}:host #structures-drop-list{height:-moz-fit-content;height:fit-content;max-width:100%;padding-bottom:3rem;will-change:box-shadow}:host #structures-drop-list .empty-email{display:flex;justify-content:center;align-items:center;flex-direction:column;flex:1 1 100%;margin-top:10%}:host #structures-drop-list .empty-email .default-empty-email{text-align:center}:host #structures-drop-list.cdk-drop-list-dragging .empty-email{display:none}"]
100
+ },] }
101
+ ];
102
+ BuilderContainerComponent.ctorParameters = () => [
103
+ { type: PbUserInterfaceService },
104
+ { type: PbEmailObjectStoreService },
105
+ { type: PbUserRestApiService },
106
+ { type: PbStorageService },
107
+ { type: PbUserMiddlewaresService },
108
+ { type: DomSanitizer },
109
+ { type: undefined, decorators: [{ type: Inject, args: [PB_CONFIG,] }] }
110
+ ];
111
+ BuilderContainerComponent.propDecorators = {
112
+ onHostClick: [{ type: HostListener, args: ['click',] }]
113
+ };
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGItZW1haWwtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvYnVpbGRlci1jb250YWluZXIvYnVpbGRlci1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RixPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLEVBQXNCLHdCQUF3QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDN0gsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFDekcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDekgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDbEcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhDQUE4QyxD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LENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQzs7O1lBeEhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsc0JBQXNCO2dCQUNoQyxrM0RBQWlEO2dCQUVqRCxTQUFTLEVBQUU7Z0JBQ1Qsd0JBQXdCO2lCQUN6QjtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0Msd0NBQXdDOzs7YUFDekM7OztZQWpCUSxzQkFBc0I7WUFDdEIseUJBQXlCO1lBQ3pCLG9CQUFvQjtZQUVwQixnQkFBZ0I7WUFMSSx3QkFBd0I7WUFQNUMsWUFBWTs0Q0FzQ2hCLE1BQU0sU0FBQyxTQUFTOzs7MEJBR2xCLFlBQVksU0FBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyNCBQb2J1Y2EuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICovXG5cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBleGhhdXN0TWFwLCBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVNUFRZLCBpaWYsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgY3JlYXRlQm9yZGVyLCBjcmVhdGVNYXJnaW4sIGNyZWF0ZVBhZGRpbmcsIGNyZWF0ZVdpZHRoSGVpZ2h0LCBkZWZlck9mIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgSUZvclJvb3RDb25mLCBJU3RydWN0dXJlLCBJVXNlclRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBCRW1haWwgfSBmcm9tICcuLi8uLi9jbGFzc2VzL0RlZmF1bHRFbWFpbCc7XG5pbXBvcnQgeyBJQWRkU3RydWN0dXJlRXZlbnQsIFBiVXNlck1pZGRsZXdhcmVzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXItbWlkZGxld2FyZS1zZXJ2aWNlL3BiLW1pZGRsZXdhcmVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGJVc2VySW50ZXJmYWNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ludGVybmFscy91c2VyLWludGVyZmFjZXMvdXNlci1pbnRlcmZhY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBQYkVtYWlsT2JqZWN0U3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW50ZXJuYWxzL3BiLWVtYWlsLW9iamVjdC1zdG9yZS9wYi1lbWFpbC1vYmplY3Qtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBQYlVzZXJSZXN0QXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXItcmVzdC1hcGktc2VydmljZS91c2VyLXJlc3QtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgUEJfQ09ORklHIH0gZnJvbSAnLi4vLi4vdG9rZW5zL3Rva2Vucyc7XG5pbXBvcnQgeyBQYlN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGItc3RvcmFnZS9wYi1zdG9yYWdlLnNlcnZpY2UnO1xuXG4vLyBpbXBvcnQgeyBJcFVzZXJSZXN0QXBpUHJvdmlkZXIgfSBmcm9tICcuLi9wcm92aWRlcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwYi1idWlsZGVyLWNvbnRhaW5lcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9idWlsZGVyLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2J1aWxkZXItY29udGFpbmVyLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gSXBVc2VyUmVzdEFwaVByb3ZpZGVyXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG4gIC8vIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgQnVpbGRlckNvbnRhaW5lckNvbXBvbmVudCB7XG4gIHNob3dUZW1wbGF0ZUxpc3QgPSB0aGlzLnVzZXJDb25maWcudGVtcGxhdGVMaXN0SWZFbXB0eSA/PyB0cnVlO1xuICBnZXRTdHJ1Y3R1cmVzJCA9IHRoaXMuZW1haWxPYmplY3RTdG9yZS5lbWFpbFN0cnVjdHVyZXNBc09ic2VydmFibGUkO1xuICBhY3RpdmVNYXRQcm9ncmVzcyQgPSB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLmFjdGl2ZU1hdFByb2dyZXNzJDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHVzZXJJbnRlcmZhY2VTZXJ2aWNlOiBQYlVzZXJJbnRlcmZhY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW1haWxPYmplY3RTdG9yZTogUGJFbWFpbE9iamVjdFN0b3JlU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJSZXN0QXBpOiBQYlVzZXJSZXN0QXBpU2VydmljZSxcbiAgICBwcml2YXRlIHBiU3RvcmFnZTogUGJTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHBiTWlkZGxld2FyZXNTZXJ2aWNlOiBQYlVzZXJNaWRkbGV3YXJlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBASW5qZWN0KFBCX0NPTkZJRykgcHJpdmF0ZSB1c2VyQ29uZmlnOiBJRm9yUm9vdENvbmZcbiAgKSB7fVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJykgb25Ib3N0Q2xpY2soKSB7XG4gICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5lZGl0R2VuZXJhbFNldHRpbmdzKCk7XG4gIH1cblxuICB0cmFja0J5KHN0cnVjdHVyZTogSVN0cnVjdHVyZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZS5pZDtcbiAgfVxuXG4gIGRpc2FibGVTdHJ1Y3R1cmVEcmFnJChzdHJ1Y3R1cmU6IElTdHJ1Y3R1cmUpIHtcbiAgICByZXR1cm4gdGhpcy5wYk1pZGRsZXdhcmVzU2VydmljZS5kaXNhYmxlU3RydWN0dXJlRHJhZ1dpdGhpbkVtYWlsQm9keShzdHJ1Y3R1cmUpLnBpcGUodGFrZSgxKSk7XG4gIH1cblxuICBvcGVuVGVtcGxhdGVEaWFsb2coZXY6IEV2ZW50KSB7XG4gICAgZXYuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5hY3RpdmVNYXRQcm9ncmVzcyQubmV4dCh0cnVlKTtcbiAgICBjb25zdCBjYWNoZWRUZW1wbGF0ZXMgPSB0aGlzLnBiU3RvcmFnZS5nZXRDYWNoZWRUZW1wbGF0ZUxpc3QoKTtcbiAgICByZXR1cm4gaWlmKFxuICAgICAgKCkgPT4gY2FjaGVkVGVtcGxhdGVzLmxlbmd0aCA+IDAsXG4gICAgICBkZWZlck9mKGNhY2hlZFRlbXBsYXRlcyksXG4gICAgICB0aGlzLnVzZXJSZXN0QXBpLmdldEFsbFVzZXJUZW1wbGF0ZXMkLnBpcGUodGFwKGxpc3QgPT4gdGhpcy5wYlN0b3JhZ2UuY2FjaGVUZW1wbGF0ZUxpc3QobGlzdCkpKVxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBtYXAoKCkgPT4gW10pLFxuICAgICAgICBtYXAodGVtcGxhdGVzID0+IHtcbiAgICAgICAgICByZXR1cm4gWy4uLnRlbXBsYXRlcywgeyBjYXRlZ29yeTogJ2xhdGVzdCcsIHRlbXBsYXRlczogdGhpcy5wYlN0b3JhZ2UuZ2V0TGF0ZXN0VXNlZFRlbXBsYXRlcygpIH1dO1xuICAgICAgICB9KSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5hY3RpdmVNYXRQcm9ncmVzcyQubmV4dChmYWxzZSkpLFxuICAgICAgICBleGhhdXN0TWFwKGxpc3QgPT5cbiAgICAgICAgICBsaXN0Py5sZW5ndGggPiAwID8gdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS50ZW1wbGF0ZXNMaXN0RGlhbG9nJChsaXN0KSA6IHRocm93RXJyb3IobmV3IEVycm9yKCdUaGUgdGVtcGxhdGUgbGlzdCBpcyBlbXB0eScpKVxuICAgICAgICApLFxuICAgICAgICBzd2l0Y2hNYXAoKHsgY2F0ZWdvcnksIHRlbXBsYXRlIH0pID0+IHRoaXMucGJNaWRkbGV3YXJlc1NlcnZpY2UuY2hvb3NlVGVtcGxhdGUoY2F0ZWdvcnksIHRlbXBsYXRlKSksXG4gICAgICAgIGV4aGF1c3RNYXAoKHsgY2F0ZWdvcnksIHRlbXBsYXRlIH0pID0+XG4gICAgICAgICAgdGhpcy51c2VyUmVzdEFwaS5nZXRVc2VyVGVtcGxhdGVEYXRhJChjYXRlZ29yeSwgdGVtcGxhdGUpLnBpcGUoXG4gICAgICAgICAgICB0YXAoY2hvb3NlZFRlbXBsYXRlID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5ICE9PSAnbGF0ZXN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMucGJTdG9yYWdlLmFkZFRlbXBsYXRlVG9MYXRlc3RVc2VkKGNob29zZWRUZW1wbGF0ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogRXJyb3IgfCBIdHRwRXJyb3JSZXNwb25zZSkgPT5cbiAgICAgICAgICB0aGlzLnBiTWlkZGxld2FyZXNTZXJ2aWNlLmNhdGNoRXJyb3IoZXJyb3IpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLm5vdGlmeShlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogSVVzZXJUZW1wbGF0ZSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5lbWFpbE9iamVjdFN0b3JlLnNldEVtYWlsKG5ldyBQQkVtYWlsKHJlc3VsdC50ZW1wbGF0ZURhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLm5vdGlmeSgnTm8gdGVtcGxhdGUgd2FzIGNob3NlbicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGRyb3BOZXdTdHJ1Y3R1cmUoZXZlbnQ6IElBZGRTdHJ1Y3R1cmVFdmVudCkge1xuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuY2hhbmdlU3RydWN0dXJlT3JkZXIoZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBiTWlkZGxld2FyZXNTZXJ2aWNlXG4gICAgICAgIC5hZGRTdHJ1Y3R1cmUoZXZlbnQpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcChuZXdFdmVudCA9PiB0aGlzLmVtYWlsT2JqZWN0U3RvcmUuYWRkU3RydWN0dXJlKG5ld0V2ZW50KSksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRTdHJ1Y3R1cmVTdHlsZXMoc3RydWN0dXJlOiBJU3RydWN0dXJlKSB7XG4gICAgY29uc3QgeyBib3JkZXIsIGJhY2tncm91bmQsIHBhZGRpbmcsIG1hcmdpbiwgY29sdW1uc1dpZHRoLCBmdWxsV2lkdGggfSA9IHN0cnVjdHVyZS5vcHRpb25zO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGRpcmVjdGlvbixcbiAgICAgIHdpZHRoOiBmdWxsV2lkdGggPyAnMTAwJScgOiBgJHt0aGlzLmVtYWlsT2JqZWN0U3RvcmUuRW1haWwuZ2VuZXJhbC53aWR0aC52YWx1ZX1weGAsXG4gICAgICBiYWNrZ3JvdW5kUmVwZWF0OiBiYWNrZ3JvdW5kLnJlcGVhdCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZC5jb2xvcixcbiAgICAgIGJhY2tncm91bmRTaXplOiBjcmVhdGVXaWR0aEhlaWdodChiYWNrZ3JvdW5kLnNpemUpLFxuICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiAndG9wIGNlbnRlcicsXG4gICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiBjb2x1bW5zV2lkdGgubWFwKGZyID0+IGAke2ZyfWZyYCkuam9pbignICcpLFxuICAgICAgLi4uY3JlYXRlQm9yZGVyKGJvcmRlciksXG4gICAgICAuLi5jcmVhdGVQYWRkaW5nKHBhZGRpbmcpLFxuICAgICAgLi4uY3JlYXRlTWFyZ2luKG1hcmdpbilcbiAgICB9O1xuICB9XG5cbiAgZ2V0QmFja2dyb3VuZEltYWdlKHN0cnVjdHVyZTogSVN0cnVjdHVyZSk6IFNhZmVTdHlsZSB7XG4gICAgY29uc3Qge1xuICAgICAgYmFja2dyb3VuZDogeyB1cmwgfVxuICAgIH0gPSBzdHJ1Y3R1cmUub3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKHVybCAmJiBgdXJsKCR7dXJsfSlgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,30 @@
1
+ /*
2
+ * Copyright (c) 2024 Pobuca.
3
+ * All rights reserved.
4
+ */
5
+ import { Component, Inject } from '@angular/core';
6
+ import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
7
+ // @dynamic
8
+ export class ConfirmDialogComponent {
9
+ constructor(dialogRef, data) {
10
+ this.dialogRef = dialogRef;
11
+ this.data = data;
12
+ }
13
+ }
14
+ ConfirmDialogComponent.decorators = [
15
+ { type: Component, args: [{
16
+ selector: 'pb-confirm-dialog',
17
+ template: `
18
+ <h2 mat-dialog-title>Are you sure?</h2>
19
+ <mat-dialog-actions fxLayout fxLayoutAlign="space-between center" fxLayoutGap="1rem">
20
+ <button mat-stroked-button mat-dialog-close="0">No</button>
21
+ <button mat-stroked-button color="warn" mat-dialog-close="1">Yes</button>
22
+ </mat-dialog-actions>
23
+ `
24
+ },] }
25
+ ];
26
+ ConfirmDialogComponent.ctorParameters = () => [
27
+ { type: MatDialogRef },
28
+ { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }
29
+ ];
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BiLWVtYWlsLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2RpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RSxXQUFXO0FBV1gsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxZQUNTLFNBQStDLEVBQ3RCLElBQXlCO1FBRGxELGNBQVMsR0FBVCxTQUFTLENBQXNDO1FBQ3RCLFNBQUksR0FBSixJQUFJLENBQXFCO0lBQ3ZELENBQUM7OztZQWROLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUU7Ozs7OztHQU1UO2FBQ0Y7OztZQVpRLFlBQVk7NENBZ0JoQixNQUFNLFNBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgUG9idWNhLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG4vLyBAZHluYW1pY1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGItY29uZmlybS1kaWFsb2cnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPkFyZSB5b3Ugc3VyZT88L2gyPlxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgZnhMYXlvdXQgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCIgZnhMYXlvdXRHYXA9XCIxcmVtXCI+XG4gICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlPVwiMFwiPk5vPC9idXR0b24+XG4gICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiBtYXQtZGlhbG9nLWNsb3NlPVwiMVwiPlllczwvYnV0dG9uPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpcm1EaWFsb2dDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Q29uZmlybURpYWxvZ0NvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiB7IG1lc3NhZ2U6IHN0cmluZyB9XG4gICkgeyB9XG59XG4iXX0=
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Copyright (c) 2024 Pobuca.
3
+ * All rights reserved.
4
+ */
5
+ import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';
6
+ import { PbEmailObjectStoreService } from '../../services/internals/pb-email-object-store/pb-email-object-store.service';
7
+ export class GeneralSettingsComponent {
8
+ constructor(pbEmailObject) {
9
+ this.pbEmailObject = pbEmailObject;
10
+ this.generalOptions$ = this.pbEmailObject.generalEmailOptionsAsObservable$;
11
+ }
12
+ }
13
+ GeneralSettingsComponent.decorators = [
14
+ { type: Component, args: [{
15
+ selector: 'pb-general-settings',
16
+ template: "<!--\n ~ Copyright (c) 2024 Pobuca.\n ~ All rights reserved.\n -->\n\n<ng-container *ngIf=\"generalOptions$ | async as general\">\n <div class=\"mat-expansion-panel-body\" style=\"margin: 24px 0\">\n <mat-form-field appearance=\"outline\" style=\"width: 100%\">\n <mat-label i18n=\"General Settings|Email Name\">Email Name</mat-label>\n <input matInput [(ngModel)]=\"general.name\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"width: 100%\">\n <mat-label i18n=\"General Settings|Email Preview Text\">Preview Text</mat-label>\n <textarea matInput [(ngModel)]=\"general.previewText\"></textarea>\n <mat-hint i18n=\"General Settings|Email Preview Text Hint\">\n This text is displayed in the inbox of the recipient.\n </mat-hint>\n </mat-form-field>\n </div>\n\n <mat-accordion>\n <mat-expansion-panel>\n <mat-expansion-panel-header i18n=\"General Settings|Email Background\">\n Background\n </mat-expansion-panel-header>\n <ng-template matExpansionPanelContent>\n <pb-color [options]=\"general.background\" key=\"color\"></pb-color>\n <!-- <pb-image-upload [block]=\"structure.options.background\" key=\"url\" style=\"margin-bottom: 1em\"></pb-image-upload>\n <pb-back-repeat [disabled]=\"!structure.options.background.url\" [model]=\"structure.options.background\">\n </pb-back-repeat>\n <pb-width-height [model]=\"structure.options.background.size\" label=\"Background Size\"></pb-width-height> -->\n </ng-template>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header i18n=\"General Settings|Email Attributes\">\n Attributes\n </mat-expansion-panel-header>\n <ng-template matExpansionPanelContent>\n <pb-width-height [model]=\"general.width\" label=\"width\"></pb-width-height>\n <pb-direction [model]=\"general\"></pb-direction>\n </ng-template>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header i18n=\"General Settings|Email Padding\">\n Padding\n </mat-expansion-panel-header>\n <ng-template matExpansionPanelContent>\n <pb-padding [padding]=\"general.padding\"></pb-padding>\n </ng-template>\n </mat-expansion-panel>\n </mat-accordion>\n</ng-container>\n",
17
+ changeDetection: ChangeDetectionStrategy.OnPush,
18
+ encapsulation: ViewEncapsulation.None,
19
+ styles: [""]
20
+ },] }
21
+ ];
22
+ GeneralSettingsComponent.ctorParameters = () => [
23
+ { type: PbEmailObjectStoreService }
24
+ ];
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1zZXR0aW5ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYi1lbWFpbC1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9nZW5lcmFsLXNldHRpbmdzL2dlbmVyYWwtc2V0dGluZ3MuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFTekgsTUFBTSxPQUFPLHdCQUF3QjtJQUduQyxZQUFvQixhQUF3QztRQUF4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBMkI7UUFGNUQsb0JBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDO0lBRVAsQ0FBQzs7O1lBVmpFLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQiw4ekVBQWdEO2dCQUVoRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O2FBQ3RDOzs7WUFSUSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDI0IFBvYnVjYS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBiRW1haWxPYmplY3RTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbnRlcm5hbHMvcGItZW1haWwtb2JqZWN0LXN0b3JlL3BiLWVtYWlsLW9iamVjdC1zdG9yZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGItZ2VuZXJhbC1zZXR0aW5ncycsXG4gIHRlbXBsYXRlVXJsOiAnLi9nZW5lcmFsLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJhbC1zZXR0aW5ncy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyYWxTZXR0aW5nc0NvbXBvbmVudCB7XG4gIGdlbmVyYWxPcHRpb25zJCA9IHRoaXMucGJFbWFpbE9iamVjdC5nZW5lcmFsRW1haWxPcHRpb25zQXNPYnNlcnZhYmxlJDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBiRW1haWxPYmplY3Q6IFBiRW1haWxPYmplY3RTdG9yZVNlcnZpY2UpIHt9XG59XG4iXX0=
@@ -0,0 +1,62 @@
1
+ /*
2
+ * Copyright (c) 2024 Pobuca.
3
+ * All rights reserved.
4
+ */
5
+ import { Component, ViewChild, ElementRef } from '@angular/core';
6
+ import { MatBottomSheetRef } from '@angular/material/bottom-sheet';
7
+ import { take, catchError, switchMap } from 'rxjs/operators';
8
+ import { EMPTY } from 'rxjs';
9
+ import { PbUserMiddlewaresService } from '../../services/user-middleware-service/pb-middlewares.service';
10
+ export class ImportDialogComponent {
11
+ constructor(pbMiddlewares, bottomSheetRef) {
12
+ this.pbMiddlewares = pbMiddlewares;
13
+ this.bottomSheetRef = bottomSheetRef;
14
+ this.importing = false;
15
+ this.fileReader = new FileReader();
16
+ }
17
+ openBrowserModal(event) {
18
+ event.preventDefault();
19
+ this.uploadInput.nativeElement.click();
20
+ }
21
+ startImporting() {
22
+ this.importing = true;
23
+ this.pbMiddlewares
24
+ .importFile(this.uploadInput.nativeElement.files.item(0))
25
+ .pipe(take(1), catchError(error => this.pbMiddlewares.catchError(error).pipe(switchMap(() => {
26
+ this.bottomSheetRef.dismiss(error);
27
+ return EMPTY;
28
+ }))))
29
+ .subscribe(file => {
30
+ this.fileReader.readAsText(file, 'utf-8');
31
+ });
32
+ }
33
+ ngOnInit() {
34
+ this.fileReader.addEventListener('loadend', () => {
35
+ this.importing = false;
36
+ try {
37
+ const email = JSON.parse(this.fileReader.result);
38
+ this.bottomSheetRef.dismiss(email);
39
+ }
40
+ catch (error) {
41
+ this.bottomSheetRef.dismiss(null);
42
+ throw new Error(error);
43
+ }
44
+ });
45
+ }
46
+ ngOnDestroy() { }
47
+ }
48
+ ImportDialogComponent.decorators = [
49
+ { type: Component, args: [{
50
+ selector: 'pb-import-dialog',
51
+ template: "<!--\n ~ Copyright (c) 2024 Pobuca.\n ~ All rights reserved.\n -->\n\n<mat-nav-list>\n <mat-list-item (click)=\"openBrowserModal($event)\">\n <div *ngIf=\"!importing\">\n <span mat-line i18n=\"import|Import JSON file\">Import JSON file</span>\n </div>\n <ng-container *ngIf=\"importing\">\n <span mat-line i18n=\"import|Importing in progress\">Importing in progress ...</span>\n <!-- <span mat-line>{{ imageInfo }}</span> -->\n </ng-container>\n </mat-list-item>\n <mat-progress-bar *ngIf=\"importing\" mode=\"buffer\" value=\"100\"></mat-progress-bar>\n</mat-nav-list>\n<input type=\"file\" accept=\"application/json\" fxHide #uploadInput (change)=\"startImporting()\" />\n",
52
+ styles: ["/*!\n * Copyright (c) 2024 Pobuca.\n * All rights reserved.\n */"]
53
+ },] }
54
+ ];
55
+ ImportDialogComponent.ctorParameters = () => [
56
+ { type: PbUserMiddlewaresService },
57
+ { type: MatBottomSheetRef }
58
+ ];
59
+ ImportDialogComponent.propDecorators = {
60
+ uploadInput: [{ type: ViewChild, args: ['uploadInput', { read: ElementRef, static: true },] }]
61
+ };
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYi1lbWFpbC1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9pbXBvcnQtZGlhbG9nL2ltcG9ydC1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBUXpHLE1BQU0sT0FBTyxxQkFBcUI7SUFPaEMsWUFBb0IsYUFBdUMsRUFBVSxjQUFpRTtRQUFsSCxrQkFBYSxHQUFiLGFBQWEsQ0FBMEI7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUQ7UUFIL0gsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNqQixlQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUVtRyxDQUFDO0lBRTFJLGdCQUFnQixDQUFDLEtBQWlCO1FBQ2hDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxhQUFhO2FBQ2YsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEQsSUFBSSxDQUNILElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUN2QyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FDSCxDQUNGLENBQ0Y7YUFDQSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSTtnQkFDRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBZ0IsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNwQztZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxLQUFJLENBQUM7OztZQXJEakIsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLHV2QkFBNkM7O2FBRTlDOzs7WUFQUSx3QkFBd0I7WUFKeEIsaUJBQWlCOzs7MEJBYXZCLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDI0IFBvYnVjYS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRCb3R0b21TaGVldFJlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JvdHRvbS1zaGVldCc7XG5pbXBvcnQgeyB0YWtlLCBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFTVBUWSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBQYlVzZXJNaWRkbGV3YXJlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91c2VyLW1pZGRsZXdhcmUtc2VydmljZS9wYi1taWRkbGV3YXJlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFBCRW1haWwgfSBmcm9tICcuLi8uLi9jbGFzc2VzL0RlZmF1bHRFbWFpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BiLWltcG9ydC1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1wb3J0LWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ltcG9ydC1kaWFsb2cuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJbXBvcnREaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ3VwbG9hZElucHV0JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSB1cGxvYWRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwdWJsaWMgaW1wb3J0aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYk1pZGRsZXdhcmVzOiBQYlVzZXJNaWRkbGV3YXJlc1NlcnZpY2UsIHByaXZhdGUgYm90dG9tU2hlZXRSZWY6IE1hdEJvdHRvbVNoZWV0UmVmPEltcG9ydERpYWxvZ0NvbXBvbmVudCwgUEJFbWFpbD4pIHt9XG5cbiAgb3BlbkJyb3dzZXJNb2RhbChldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy51cGxvYWRJbnB1dC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gIH1cblxuICBzdGFydEltcG9ydGluZygpIHtcbiAgICB0aGlzLmltcG9ydGluZyA9IHRydWU7XG5cbiAgICB0aGlzLnBiTWlkZGxld2FyZXNcbiAgICAgIC5pbXBvcnRGaWxlKHRoaXMudXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudC5maWxlcy5pdGVtKDApKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT5cbiAgICAgICAgICB0aGlzLnBiTWlkZGxld2FyZXMuY2F0Y2hFcnJvcihlcnJvcikucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYm90dG9tU2hlZXRSZWYuZGlzbWlzcyhlcnJvcik7XG4gICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGZpbGUgPT4ge1xuICAgICAgICB0aGlzLmZpbGVSZWFkZXIucmVhZEFzVGV4dChmaWxlLCAndXRmLTgnKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5maWxlUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCAoKSA9PiB7XG4gICAgICB0aGlzLmltcG9ydGluZyA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW1haWwgPSBKU09OLnBhcnNlKHRoaXMuZmlsZVJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgdGhpcy5ib3R0b21TaGVldFJlZi5kaXNtaXNzKGVtYWlsKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuYm90dG9tU2hlZXRSZWYuZGlzbWlzcyhudWxsKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge31cbn1cbiJdfQ==
@@ -0,0 +1,89 @@
1
+ /*
2
+ * Copyright (c) 2024 Pobuca.
3
+ * All rights reserved.
4
+ */
5
+ import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
6
+ import { DomSanitizer } from '@angular/platform-browser';
7
+ import { take } from 'rxjs/operators';
8
+ import { PbUserMiddlewaresService } from '../services/user-middleware-service/pb-middlewares.service';
9
+ const devicesMap = new Map([
10
+ ['desktop', '1 1 100%'],
11
+ ['smartphone', '1 1 360px'],
12
+ ['tablet', '1 1 768px']
13
+ ]);
14
+ export class PreviewTemplateComponent {
15
+ constructor(middlewares, sanitizer) {
16
+ this.middlewares = middlewares;
17
+ this.sanitizer = sanitizer;
18
+ this.device = 'desktop';
19
+ }
20
+ changeDevice(button) {
21
+ return this.middlewares
22
+ .togglePreviewDevice(button)
23
+ .pipe(take(1))
24
+ .subscribe(device => {
25
+ this.device = device;
26
+ });
27
+ }
28
+ getFlexWidth() {
29
+ return devicesMap.get(this.device);
30
+ }
31
+ ngOnInit() {
32
+ this.src = URL.createObjectURL(new Blob([this.template], { type: 'text/html' }));
33
+ this.templateSrc = this.sanitizer.bypassSecurityTrustResourceUrl(this.src);
34
+ }
35
+ ngOnDestroy() {
36
+ if (this.src) {
37
+ URL.revokeObjectURL(this.src);
38
+ }
39
+ }
40
+ }
41
+ PreviewTemplateComponent.decorators = [
42
+ { type: Component, args: [{
43
+ selector: 'pb-preview-template',
44
+ template: `
45
+ <iframe [src]="templateSrc" [fxFlex]="getFlexWidth()"></iframe>
46
+ <mat-button-toggle-group value="desktop" (change)="changeDevice($event)" vertical>
47
+ <mat-button-toggle value="desktop" matTooltip="Desktop / 100%" matTooltipPosition="left">
48
+ <mat-icon>desktop_windows</mat-icon>
49
+ </mat-button-toggle>
50
+ <mat-button-toggle value="tablet" matTooltip="Tablet / 768px" matTooltipPosition="left">
51
+ <mat-icon>tablet</mat-icon>
52
+ </mat-button-toggle>
53
+ <mat-button-toggle value="smartphone" matTooltip="Smartphone / 360px" matTooltipPosition="left">
54
+ <mat-icon>smartphone</mat-icon>
55
+ </mat-button-toggle>
56
+ </mat-button-toggle-group>
57
+ `,
58
+ changeDetection: ChangeDetectionStrategy.OnPush,
59
+ styles: [`
60
+ iframe {
61
+ border: 0;
62
+ will-change: width;
63
+ transition: all 500ms ease-in-out;
64
+ }
65
+
66
+ /* iframe a[href] {
67
+ pointer-events: none;
68
+ } */
69
+
70
+ /* iframe.active {
71
+ opacity: 1;
72
+ } */
73
+
74
+ mat-button-toggle-group {
75
+ position: absolute;
76
+ right: 0;
77
+ background: white;
78
+ }
79
+ `]
80
+ },] }
81
+ ];
82
+ PreviewTemplateComponent.ctorParameters = () => [
83
+ { type: PbUserMiddlewaresService },
84
+ { type: DomSanitizer }
85
+ ];
86
+ PreviewTemplateComponent.propDecorators = {
87
+ template: [{ type: Input }]
88
+ };
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYi1lbWFpbC1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wcmV2aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSx1QkFBdUIsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUU3RixPQUFPLEVBQUUsWUFBWSxFQUFtQixNQUFNLDJCQUEyQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUl0RyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN6QixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUM7SUFDdkIsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDO0lBQzNCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztDQUN4QixDQUFDLENBQUM7QUEyQ0gsTUFBTSxPQUFPLHdCQUF3QjtJQU1uQyxZQUFvQixXQUFxQyxFQUFVLFNBQXVCO1FBQXRFLGdCQUFXLEdBQVgsV0FBVyxDQUEwQjtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFIbEYsV0FBTSxHQUFtQixTQUFTLENBQUM7SUFHa0QsQ0FBQztJQUU5RixZQUFZLENBQUMsTUFBNkI7UUFDeEMsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNwQixtQkFBbUIsQ0FBQyxNQUFNLENBQUM7YUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNaLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQzs7O1lBdkVGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7R0FhVDtnQkF3QkQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07eUJBdEI3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FvQkM7YUFHSjs7O1lBbERRLHdCQUF3QjtZQUh4QixZQUFZOzs7dUJBdURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyNCBQb2J1Y2EuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uVG9nZ2xlQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uLXRvZ2dsZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUGJVc2VyTWlkZGxld2FyZXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdXNlci1taWRkbGV3YXJlLXNlcnZpY2UvcGItbWlkZGxld2FyZXMuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIFRQcmV2aWV3RGV2aWNlID0gJ2Rlc2t0b3AnIHwgJ3NtYXJ0cGhvbmUnIHwgJ3RhYmxldCc7XG5cbmNvbnN0IGRldmljZXNNYXAgPSBuZXcgTWFwKFtcbiAgWydkZXNrdG9wJywgJzEgMSAxMDAlJ10sXG4gIFsnc21hcnRwaG9uZScsICcxIDEgMzYwcHgnXSxcbiAgWyd0YWJsZXQnLCAnMSAxIDc2OHB4J11cbl0pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwYi1wcmV2aWV3LXRlbXBsYXRlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aWZyYW1lIFtzcmNdPVwidGVtcGxhdGVTcmNcIiBbZnhGbGV4XT1cImdldEZsZXhXaWR0aCgpXCI+PC9pZnJhbWU+XG4gICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIHZhbHVlPVwiZGVza3RvcFwiIChjaGFuZ2UpPVwiY2hhbmdlRGV2aWNlKCRldmVudClcIiB2ZXJ0aWNhbD5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cImRlc2t0b3BcIiBtYXRUb29sdGlwPVwiRGVza3RvcCAvIDEwMCVcIiBtYXRUb29sdGlwUG9zaXRpb249XCJsZWZ0XCI+XG4gICAgICAgIDxtYXQtaWNvbj5kZXNrdG9wX3dpbmRvd3M8L21hdC1pY29uPlxuICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cInRhYmxldFwiIG1hdFRvb2x0aXA9XCJUYWJsZXQgLyA3NjhweFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIj5cbiAgICAgICAgPG1hdC1pY29uPnRhYmxldDwvbWF0LWljb24+XG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwic21hcnRwaG9uZVwiIG1hdFRvb2x0aXA9XCJTbWFydHBob25lIC8gMzYwcHhcIiBtYXRUb29sdGlwUG9zaXRpb249XCJsZWZ0XCI+XG4gICAgICAgIDxtYXQtaWNvbj5zbWFydHBob25lPC9tYXQtaWNvbj5cbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgaWZyYW1lIHtcbiAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICB3aWxsLWNoYW5nZTogd2lkdGg7XG4gICAgICAgIHRyYW5zaXRpb246IGFsbCA1MDBtcyBlYXNlLWluLW91dDtcbiAgICAgIH1cblxuICAgICAgLyogaWZyYW1lIGFbaHJlZl0ge1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH0gKi9cblxuICAgICAgLyogaWZyYW1lLmFjdGl2ZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9ICovXG5cbiAgICAgIG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICB9XG4gICAgYFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQcmV2aWV3VGVtcGxhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHRlbXBsYXRlOiBzdHJpbmc7XG4gIHByaXZhdGUgc3JjOiBzdHJpbmc7XG4gIHByaXZhdGUgZGV2aWNlOiBUUHJldmlld0RldmljZSA9ICdkZXNrdG9wJztcbiAgdGVtcGxhdGVTcmM6IFNhZmVSZXNvdXJjZVVybDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1pZGRsZXdhcmVzOiBQYlVzZXJNaWRkbGV3YXJlc1NlcnZpY2UsIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG5cbiAgY2hhbmdlRGV2aWNlKGJ1dHRvbjogTWF0QnV0dG9uVG9nZ2xlQ2hhbmdlKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZXNcbiAgICAgIC50b2dnbGVQcmV2aWV3RGV2aWNlKGJ1dHRvbilcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKGRldmljZSA9PiB7XG4gICAgICAgIHRoaXMuZGV2aWNlID0gZGV2aWNlO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRGbGV4V2lkdGgoKSB7XG4gICAgcmV0dXJuIGRldmljZXNNYXAuZ2V0KHRoaXMuZGV2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdGhpcy50ZW1wbGF0ZV0sIHsgdHlwZTogJ3RleHQvaHRtbCcgfSkpO1xuICAgIHRoaXMudGVtcGxhdGVTcmMgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodGhpcy5zcmMpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3JjKSB7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc3JjKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,163 @@
1
+ /*
2
+ * Copyright (c) 2024 Pobuca.
3
+ * All rights reserved.
4
+ */
5
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, HostListener, Input, ViewEncapsulation } from '@angular/core';
6
+ import { exhaustMap, filter, map, take, takeUntil } from 'rxjs/operators';
7
+ import { Subject } from 'rxjs';
8
+ import { defaultColumnsOptions, Structure } from '../../classes/Structure';
9
+ import { createBorder } from '../../utils';
10
+ import { PbUserMiddlewaresService } from '../../services/user-middleware-service/pb-middlewares.service';
11
+ import { PbUserInterfaceService } from '../../services/internals/user-interfaces/user-interface.service';
12
+ import { PbEmailObjectStoreService } from '../../services/internals/pb-email-object-store/pb-email-object-store.service';
13
+ export class StructureComponent {
14
+ constructor(userInterfaceService, emailObjectStore, chRef, pbMiddlewaresService) {
15
+ this.userInterfaceService = userInterfaceService;
16
+ this.emailObjectStore = emailObjectStore;
17
+ this.chRef = chRef;
18
+ this.pbMiddlewaresService = pbMiddlewaresService;
19
+ this.structure = new Structure();
20
+ this.cdkDropListConnectedTo$ = this.userInterfaceService.cdkDropListConnectedTo$;
21
+ this.validate = function ({ rectangle }) {
22
+ const colFr = +(rectangle.width / this.fr).toFixed(2);
23
+ return colFr > 1 && colFr <= 10 - this.structure.columns;
24
+ }.bind(this);
25
+ // sectionWidth$ = this.userInterfaceService.currentEditingStructure$.pipe(
26
+ // withLatestFrom(this.emailObjectStore.emailBodyWidth$),
27
+ // map(([{ options }, width]) => {
28
+ // return options.fullWidth ? '100%' : width;
29
+ // })
30
+ // );
31
+ this.componentIsDestroyed$ = new Subject();
32
+ }
33
+ get isStructureActive() {
34
+ return this.isActive;
35
+ }
36
+ // @HostBinding('style.width') get sectionWidth(): string | number {
37
+ // console.log(this.emailObjectStore.Email.general.width.value);
38
+ // return this.structure.options.fullWidth ? '100%' : this.emailObjectStore.Email.general.width.value;
39
+ // }
40
+ // Don't close right panel on structure click
41
+ onHostClick(event) {
42
+ event.stopImmediatePropagation();
43
+ this.editStructure();
44
+ }
45
+ removeStructure(event) {
46
+ event.stopPropagation();
47
+ this.pbMiddlewaresService
48
+ .removeStructure(this.index, this.structure)
49
+ .pipe(exhaustMap(() => this.userInterfaceService.confirmDialog$()), filter(removeAllowed => removeAllowed), take(1))
50
+ .subscribe(() => {
51
+ this.emailObjectStore.removeStructure(this.index);
52
+ this.userInterfaceService.resetElements();
53
+ });
54
+ }
55
+ duplicateStructure(event) {
56
+ event.stopPropagation();
57
+ this.pbMiddlewaresService
58
+ .duplicateStructure(this.index, this.structure)
59
+ .pipe(map(() => this.emailObjectStore.duplicateStructure(this.index)), take(1))
60
+ .subscribe(newStructure => {
61
+ this.editStructure(newStructure);
62
+ });
63
+ }
64
+ dropNewBlock(event, column) {
65
+ if (event.previousContainer === event.container) {
66
+ this.emailObjectStore.addBlock(event, column);
67
+ }
68
+ else {
69
+ this.pbMiddlewaresService
70
+ .addBlock(event, column)
71
+ .pipe(map(newData => this.emailObjectStore.addBlock(newData.event, newData.column)))
72
+ .subscribe(() => {
73
+ // this.userInterfaceService.editBlock(newBlock);
74
+ this.chRef.markForCheck();
75
+ });
76
+ }
77
+ }
78
+ disableBlockDrag$(block) {
79
+ return this.pbMiddlewaresService.disableBlockDragWithinEmailBody(block).pipe(take(1));
80
+ }
81
+ editStructure(structure = this.structure) {
82
+ this.pbMiddlewaresService
83
+ .editStructure(structure)
84
+ .pipe(take(1))
85
+ .subscribe(strctr => {
86
+ this.userInterfaceService.editStructure(strctr);
87
+ });
88
+ }
89
+ getResizeEdges(columnKey) {
90
+ return {
91
+ right: columnKey + 1 !== this.structure.columns,
92
+ left: columnKey !== 0
93
+ };
94
+ }
95
+ createColumnId(columnKey) {
96
+ return `column-droplist-${columnKey}-${this.index}`;
97
+ }
98
+ getColumnStyles(columnKey) {
99
+ const { options: { gaps = [4, 4], columns = [] } } = this.structure;
100
+ const column = columns[columnKey] || defaultColumnsOptions;
101
+ let verticalAlign = 'center';
102
+ if (column.verticalAlign === 'bottom') {
103
+ verticalAlign = 'flex-end';
104
+ }
105
+ else if (column.verticalAlign === 'top') {
106
+ verticalAlign = 'flex-start';
107
+ }
108
+ return Object.assign({ padding: gaps.map(gap => `${gap}px`).join(' '), backgroundColor: column.background.color, placeSelf: `${verticalAlign} stretch` }, createBorder(column.border)
109
+ // ...createBackground(column.background)
110
+ );
111
+ }
112
+ onResizeEnd({ rectangle }, key) {
113
+ this.structure.options.columnsWidth[key] = +(rectangle.width / this.fr).toFixed(2);
114
+ }
115
+ ngDoCheck() {
116
+ if (this.isActive || this.userInterfaceService.currentStructureContainsActiveBlock(this.structure)) {
117
+ this.chRef.markForCheck();
118
+ }
119
+ }
120
+ ngOnInit() {
121
+ // Add columns options in case of old template
122
+ const { columns, columnsWidth } = this.structure.options;
123
+ if (!columns || !columnsWidth) {
124
+ const { type, elements, options } = this.structure;
125
+ this.editStructure(new Structure(type, elements, options));
126
+ }
127
+ const width = this.emailObjectStore.Email.general.width.value;
128
+ const [, horizontalGap] = this.structure.options.gaps;
129
+ this.fr = (width - horizontalGap * this.structure.columns) / 10;
130
+ this.userInterfaceService.currentEditingStructure$
131
+ .pipe(map(currentEditingStructure => currentEditingStructure === this.structure), takeUntil(this.componentIsDestroyed$))
132
+ .subscribe(isActive => {
133
+ this.isActive = isActive;
134
+ });
135
+ }
136
+ ngOnDestroy() {
137
+ this.componentIsDestroyed$.next('');
138
+ this.componentIsDestroyed$.complete();
139
+ }
140
+ }
141
+ StructureComponent.decorators = [
142
+ { type: Component, args: [{
143
+ selector: 'pb-structure',
144
+ template: "<!--\n ~ Copyright (c) 2024 Pobuca.\n ~ All rights reserved.\n -->\n\n<div class=\"column\" *ngFor=\"let column of structure.elements; let index = index\" cdkDropList mwlResizable\n [enableGhostResize]=\"false\" [resizeSnapGrid]=\"{ left: fr, right: fr }\" [resizeEdges]=\"getResizeEdges(index)\"\n [validateResize]=\"validate\" (resizing)=\"onResizeEnd($event, index)\"\n (cdkDropListDropped)=\"dropNewBlock($event, column)\" [class.empty]=\"!column.length\" [ngStyle]=\"getColumnStyles(index)\"\n [cdkDropListConnectedTo]=\"cdkDropListConnectedTo$ | async\" [cdkDropListData]=\"column\" [id]=\"createColumnId(index)\">\n\n <div *ngIf=\"!column.length\" class=\"empty-block\" i18n=\"structure|Inside empty block\">DnD blocks</div>\n\n <pb-block *ngFor=\"let block of column; let index = index\" cdkDrag [cdkDragData]=\"block\" [block]=\"block\"\n [index]=\"index\" [column]=\"column\" [cdkDragDisabled]=\"disableBlockDrag$(block) | async\">\n <button mat-icon-button class=\"move\" cdkDragHandle i18n-matTooltip=\"block|Change Block order\"\n matTooltip=\"Change Block order\" *ngIf=\"!(disableBlockDrag$(block) | async)\">\n <mat-icon i18n-aria-label=\"block|Move block\" aria-label=\"Move block\" inline>pan_tool</mat-icon>\n </button>\n </pb-block>\n</div>\n\n<ng-content select=\".move\"></ng-content>\n<div class=\"tools\" fxLayoutGap=\"0.25rem\">\n <button mat-icon-button class=\"edit\" color=\"primary\" i18n-matTooltip=\"structure|Change structure settings\"\n matTooltip=\"Change structure settings\">\n <mat-icon i18n-aria-label=\"structure|Edit structure\" aria-label=\"Edit structure\" inline>edit</mat-icon>\n </button>\n <button mat-icon-button (click)=\"duplicateStructure($event)\" i18n-matTooltip=\"structure|Duplicate structure\"\n matTooltip=\"Duplicate structure\">\n <mat-icon i18n-aria-label=\"structure|Duplicate structure\" aria-label=\"Duplicate structure\" inline>file_copy\n </mat-icon>\n </button>\n <button mat-icon-button color=\"warn\" (click)=\"removeStructure($event)\" i18n-matTooltip=\"structure|Delete structure\"\n matTooltip=\"Delete structure\">\n <mat-icon i18n-aria-label=\"structure|Remove Structure\" aria-label=\"Remove Structure\" inline>delete_forever\n </mat-icon>\n </button>\n</div>\n",
145
+ changeDetection: ChangeDetectionStrategy.OnPush,
146
+ encapsulation: ViewEncapsulation.Emulated,
147
+ exportAs: 'structure',
148
+ styles: ["/*!\n * Copyright (c) 2024 Pobuca.\n * All rights reserved.\n */pb-block>.cdk-drag-handle{position:absolute;top:-30px;right:0;cursor:move;background-color:rgba(63,81,181,.5);color:#fff;border-radius:50% 50% 0 0;opacity:0;height:30px;width:30px;font-size:smaller}pb-block>.cdk-drag-handle mat-icon{margin-top:-8px}pb-block>.cdk-drag-handle:hover{background-color:#3f51b5}pb-block.cdk-drag-preview .cdk-drag-handle,pb-block:hover .cdk-drag-handle{opacity:1}:host{display:grid;border:1px solid #ccc;position:relative;grid-template-columns:1fr}:host>.tools{direction:ltr;position:absolute;opacity:0;left:0;bottom:-25px;color:#ff4081}:host>.tools button{background-color:#fff;border-radius:0 0 3px 3px;height:25px;width:25px;line-height:0}:host.active,:host.cdk-drag-placeholder,:host.cdk-drag-preview,:host:hover{box-shadow:0 0 1px 2px #ff4081;z-index:1}:host:hover>.tools{opacity:1}:host:hover>.tools button{background-color:#ff4081;color:#fff}:host.active>.tools>.edit{display:none}:host.cols_2{grid-template-columns:repeat(2,6fr)}:host.cols_3{grid-template-columns:repeat(3,4fr)}:host.cols_4{grid-template-columns:repeat(4,3fr)}:host.cols_12{grid-template-columns:7fr 5fr}:host.cols_21{grid-template-columns:5fr 7fr}:host .cdk-drop-list-dragging,:host .cdk-drop-list-receiving{height:100%}:host>.column{box-sizing:border-box}:host>.column.empty{height:60px}:host>.column.empty .empty-block{background-color:rgba(101,99,99,.21);height:100%;display:flex;justify-content:center;place-items:center;flex-direction:column;color:rgba(101,99,99,.3);font-size:small}:host>.column.empty.cdk-drop-list-dragging .empty-block{display:none}:host>.column.empty>.cdk-drag-placeholder{min-height:60px!important}"]
149
+ },] }
150
+ ];
151
+ StructureComponent.ctorParameters = () => [
152
+ { type: PbUserInterfaceService },
153
+ { type: PbEmailObjectStoreService },
154
+ { type: ChangeDetectorRef },
155
+ { type: PbUserMiddlewaresService }
156
+ ];
157
+ StructureComponent.propDecorators = {
158
+ structure: [{ type: Input }],
159
+ index: [{ type: Input }],
160
+ isStructureActive: [{ type: HostBinding, args: ['class.active',] }],
161
+ onHostClick: [{ type: HostListener, args: ['click', ['$event'],] }]
162
+ };
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BiLWVtYWlsLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3N0cnVjdHVyZS9zdHJ1Y3R1cmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFBa0Isd0JBQXdCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUN6SCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUN6RyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQVV6SCxNQUFNLE9BQU8sa0JBQWtCO0lBa0I3QixZQUNVLG9CQUE0QyxFQUM1QyxnQkFBMkMsRUFDM0MsS0FBd0IsRUFDeEIsb0JBQThDO1FBSDlDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBd0I7UUFDNUMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEyQjtRQUMzQyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQTBCO1FBckIvQyxjQUFTLEdBQUcsSUFBSSxTQUFT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dUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLFFBQVE7Z0JBQ3pDLFFBQVEsRUFBRSxXQUFXOzthQUN0Qjs7O1lBVlEsc0JBQXNCO1lBQ3RCLHlCQUF5QjtZQW5CaEMsaUJBQWlCO1lBaUJNLHdCQUF3Qjs7O3dCQWE5QyxLQUFLO29CQUNMLEtBQUs7Z0NBdUJMLFdBQVcsU0FBQyxjQUFjOzBCQVUxQixZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyNCBQb2J1Y2EuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICovXG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEb0NoZWNrLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVzaXplRXZlbnQgfSBmcm9tICdhbmd1bGFyLXJlc2l6YWJsZS1lbGVtZW50JztcbmltcG9ydCB7IGV4aGF1c3RNYXAsIGZpbHRlciwgbWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGRlZmF1bHRDb2x1bW5zT3B0aW9ucywgU3RydWN0dXJlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9TdHJ1Y3R1cmUnO1xuaW1wb3J0IHsgVEJsb2NrcyB9IGZyb20gJy4uLy4uL2NsYXNzZXMvRWxlbWVudHMnO1xuaW1wb3J0IHsgY3JlYXRlQm9yZGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgSUFkZEJsb2NrRXZlbnQsIFBiVXNlck1pZGRsZXdhcmVzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXItbWlkZGxld2FyZS1zZXJ2aWNlL3BiLW1pZGRsZXdhcmVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGJVc2VySW50ZXJmYWNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ludGVybmFscy91c2VyLWludGVyZmFjZXMvdXNlci1pbnRlcmZhY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBQYkVtYWlsT2JqZWN0U3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW50ZXJuYWxzL3BiLWVtYWlsLW9iamVjdC1zdG9yZS9wYi1lbWFpbC1vYmplY3Qtc3RvcmUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BiLXN0cnVjdHVyZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdHJ1Y3R1cmUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHJ1Y3R1cmUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBleHBvcnRBczogJ3N0cnVjdHVyZSdcbn0pXG5leHBvcnQgY2xhc3MgU3RydWN0dXJlQ29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjaywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBzdHJ1Y3R1cmUgPSBuZXcgU3RydWN0dXJlKCk7XG4gIEBJbnB1dCgpIGluZGV4OiBudW1iZXI7XG4gIHB1YmxpYyBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgcHVibGljIGNka0Ryb3BMaXN0Q29ubmVjdGVkVG8kID0gdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5jZGtEcm9wTGlzdENvbm5lY3RlZFRvJDtcbiAgcHVibGljIGZyOiBudW1iZXI7XG4gIHB1YmxpYyB2YWxpZGF0ZSA9IGZ1bmN0aW9uICh7IHJlY3RhbmdsZSB9OiBSZXNpemVFdmVudCkge1xuICAgIGNvbnN0IGNvbEZyID0gKyhyZWN0YW5nbGUud2lkdGggLyB0aGlzLmZyKS50b0ZpeGVkKDIpO1xuICAgIHJldHVybiBjb2xGciA+IDEgJiYgY29sRnIgPD0gMTAgLSB0aGlzLnN0cnVjdHVyZS5jb2x1bW5zO1xuICB9LmJpbmQodGhpcyk7XG4gIC8vIHNlY3Rpb25XaWR0aCQgPSB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLmN1cnJlbnRFZGl0aW5nU3RydWN0dXJlJC5waXBlKFxuICAvLyAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuZW1haWxPYmplY3RTdG9yZS5lbWFpbEJvZHlXaWR0aCQpLFxuICAvLyAgIG1hcCgoW3sgb3B0aW9ucyB9LCB3aWR0aF0pID0+IHtcbiAgLy8gICAgIHJldHVybiBvcHRpb25zLmZ1bGxXaWR0aCA/ICcxMDAlJyA6IHdpZHRoO1xuICAvLyAgIH0pXG4gIC8vICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50SXNEZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHVzZXJJbnRlcmZhY2VTZXJ2aWNlOiBQYlVzZXJJbnRlcmZhY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW1haWxPYmplY3RTdG9yZTogUGJFbWFpbE9iamVjdFN0b3JlU2VydmljZSxcbiAgICBwcml2YXRlIGNoUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHBiTWlkZGxld2FyZXNTZXJ2aWNlOiBQYlVzZXJNaWRkbGV3YXJlc1NlcnZpY2VcbiAgKSB7fVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYWN0aXZlJykgZ2V0IGlzU3RydWN0dXJlQWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLmlzQWN0aXZlO1xuICB9XG5cbiAgLy8gQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpIGdldCBzZWN0aW9uV2lkdGgoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgLy8gICBjb25zb2xlLmxvZyh0aGlzLmVtYWlsT2JqZWN0U3RvcmUuRW1haWwuZ2VuZXJhbC53aWR0aC52YWx1ZSk7XG4gIC8vICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlLm9wdGlvbnMuZnVsbFdpZHRoID8gJzEwMCUnIDogdGhpcy5lbWFpbE9iamVjdFN0b3JlLkVtYWlsLmdlbmVyYWwud2lkdGgudmFsdWU7XG4gIC8vIH1cblxuICAvLyBEb24ndCBjbG9zZSByaWdodCBwYW5lbCBvbiBzdHJ1Y3R1cmUgY2xpY2tcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKSBvbkhvc3RDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZWRpdFN0cnVjdHVyZSgpO1xuICB9XG5cbiAgcmVtb3ZlU3RydWN0dXJlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucGJNaWRkbGV3YXJlc1NlcnZpY2VcbiAgICAgIC5yZW1vdmVTdHJ1Y3R1cmUodGhpcy5pbmRleCwgdGhpcy5zdHJ1Y3R1cmUpXG4gICAgICAucGlwZShcbiAgICAgICAgZXhoYXVzdE1hcCgoKSA9PiB0aGlzLnVzZXJJbnRlcmZhY2VTZXJ2aWNlLmNvbmZpcm1EaWFsb2ckKCkpLFxuICAgICAgICBmaWx0ZXIocmVtb3ZlQWxsb3dlZCA9PiByZW1vdmVBbGxvd2VkKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZW1haWxPYmplY3RTdG9yZS5yZW1vdmVTdHJ1Y3R1cmUodGhpcy5pbmRleCk7XG4gICAgICAgIHRoaXMudXNlckludGVyZmFjZVNlcnZpY2UucmVzZXRFbGVtZW50cygpO1xuICAgICAgfSk7XG4gIH1cblxuICBkdXBsaWNhdGVTdHJ1Y3R1cmUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5wYk1pZGRsZXdhcmVzU2VydmljZVxuICAgICAgLmR1cGxpY2F0ZVN0cnVjdHVyZSh0aGlzLmluZGV4LCB0aGlzLnN0cnVjdHVyZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5lbWFpbE9iamVjdFN0b3JlLmR1cGxpY2F0ZVN0cnVjdHVyZSh0aGlzLmluZGV4KSksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUobmV3U3RydWN0dXJlID0+IHtcbiAgICAgICAgdGhpcy5lZGl0U3RydWN0dXJlKG5ld1N0cnVjdHVyZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGRyb3BOZXdCbG9jayhldmVudDogSUFkZEJsb2NrRXZlbnQsIGNvbHVtbjogVEJsb2Nrc1tdKSB7XG4gICAgaWYgKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyID09PSBldmVudC5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuZW1haWxPYmplY3RTdG9yZS5hZGRCbG9jayhldmVudCwgY29sdW1uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYk1pZGRsZXdhcmVzU2VydmljZVxuICAgICAgICAuYWRkQmxvY2soZXZlbnQsIGNvbHVtbilcbiAgICAgICAgLnBpcGUobWFwKG5ld0RhdGEgPT4gdGhpcy5lbWFpbE9iamVjdFN0b3JlLmFkZEJsb2NrKG5ld0RhdGEuZXZlbnQsIG5ld0RhdGEuY29sdW1uKSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIC8vIHRoaXMudXNlckludGVyZmFjZVNlcnZpY2UuZWRpdEJsb2NrKG5ld0Jsb2NrKTtcbiAgICAgICAgICB0aGlzLmNoUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkaXNhYmxlQmxvY2tEcmFnJChibG9jazogVEJsb2Nrcykge1xuICAgIHJldHVybiB0aGlzLnBiTWlkZGxld2FyZXNTZXJ2aWNlLmRpc2FibGVCbG9ja0RyYWdXaXRoaW5FbWFpbEJvZHkoYmxvY2spLnBpcGUodGFrZSgxKSk7XG4gIH1cblxuICBlZGl0U3RydWN0dXJlKHN0cnVjdHVyZSA9IHRoaXMuc3RydWN0dXJlKSB7XG4gICAgdGhpcy5wYk1pZGRsZXdhcmVzU2VydmljZVxuICAgICAgLmVkaXRTdHJ1Y3R1cmUoc3RydWN0dXJlKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoc3RyY3RyID0+IHtcbiAgICAgICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5lZGl0U3RydWN0dXJlKHN0cmN0cik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFJlc2l6ZUVkZ2VzKGNvbHVtbktleTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJpZ2h0OiBjb2x1bW5LZXkgKyAxICE9PSB0aGlzLnN0cnVjdHVyZS5jb2x1bW5zLFxuICAgICAgbGVmdDogY29sdW1uS2V5ICE9PSAwXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZUNvbHVtbklkKGNvbHVtbktleTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGBjb2x1bW4tZHJvcGxpc3QtJHtjb2x1bW5LZXl9LSR7dGhpcy5pbmRleH1gO1xuICB9XG5cbiAgZ2V0Q29sdW1uU3R5bGVzKGNvbHVtbktleTogbnVtYmVyKSB7XG4gICAgY29uc3Qge1xuICAgICAgb3B0aW9uczogeyBnYXBzID0gWzQsIDRdLCBjb2x1bW5zID0gW10gfVxuICAgIH0gPSB0aGlzLnN0cnVjdHVyZTtcbiAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zW2NvbHVtbktleV0gfHwgZGVmYXVsdENvbHVtbnNPcHRpb25zO1xuXG4gICAgbGV0IHZlcnRpY2FsQWxpZ24gPSAnY2VudGVyJztcbiAgICBpZiAoY29sdW1uLnZlcnRpY2FsQWxpZ24gPT09ICdib3R0b20nKSB7XG4gICAgICB2ZXJ0aWNhbEFsaWduID0gJ2ZsZXgtZW5kJztcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi52ZXJ0aWNhbEFsaWduID09PSAndG9wJykge1xuICAgICAgdmVydGljYWxBbGlnbiA9ICdmbGV4LXN0YXJ0JztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFkZGluZzogZ2Fwcy5tYXAoZ2FwID0+IGAke2dhcH1weGApLmpvaW4oJyAnKSxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogY29sdW1uLmJhY2tncm91bmQuY29sb3IsXG4gICAgICBwbGFjZVNlbGY6IGAke3ZlcnRpY2FsQWxpZ259IHN0cmV0Y2hgLFxuICAgICAgLi4uY3JlYXRlQm9yZGVyKGNvbHVtbi5ib3JkZXIpXG4gICAgICAvLyAuLi5jcmVhdGVCYWNrZ3JvdW5kKGNvbHVtbi5iYWNrZ3JvdW5kKVxuICAgIH07XG4gIH1cblxuICBvblJlc2l6ZUVuZCh7IHJlY3RhbmdsZSB9OiBSZXNpemVFdmVudCwga2V5OiBudW1iZXIpIHtcbiAgICB0aGlzLnN0cnVjdHVyZS5vcHRpb25zLmNvbHVtbnNXaWR0aFtrZXldID0gKyhyZWN0YW5nbGUud2lkdGggLyB0aGlzLmZyKS50b0ZpeGVkKDIpO1xuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICh0aGlzLmlzQWN0aXZlIHx8IHRoaXMudXNlckludGVyZmFjZVNlcnZpY2UuY3VycmVudFN0cnVjdHVyZUNvbnRhaW5zQWN0aXZlQmxvY2sodGhpcy5zdHJ1Y3R1cmUpKSB7XG4gICAgICB0aGlzLmNoUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIEFkZCBjb2x1bW5zIG9wdGlvbnMgaW4gY2FzZSBvZiBvbGQgdGVtcGxhdGVcbiAgICBjb25zdCB7IGNvbHVtbnMsIGNvbHVtbnNXaWR0aCB9ID0gdGhpcy5zdHJ1Y3R1cmUub3B0aW9ucztcbiAgICBpZiAoIWNvbHVtbnMgfHwgIWNvbHVtbnNXaWR0aCkge1xuICAgICAgY29uc3QgeyB0eXBlLCBlbGVtZW50cywgb3B0aW9ucyB9ID0gdGhpcy5zdHJ1Y3R1cmU7XG4gICAgICB0aGlzLmVkaXRTdHJ1Y3R1cmUobmV3IFN0cnVjdHVyZSh0eXBlLCBlbGVtZW50cywgb3B0aW9ucykpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5lbWFpbE9iamVjdFN0b3JlLkVtYWlsLmdlbmVyYWwud2lkdGgudmFsdWU7XG4gICAgY29uc3QgWywgaG9yaXpvbnRhbEdhcF0gPSB0aGlzLnN0cnVjdHVyZS5vcHRpb25zLmdhcHM7XG4gICAgdGhpcy5mciA9ICh3aWR0aCAtIGhvcml6b250YWxHYXAgKiB0aGlzLnN0cnVjdHVyZS5jb2x1bW5zKSAvIDEwO1xuXG4gICAgdGhpcy51c2VySW50ZXJmYWNlU2VydmljZS5jdXJyZW50RWRpdGluZ1N0cnVjdHVyZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoY3VycmVudEVkaXRpbmdTdHJ1Y3R1cmUgPT4gY3VycmVudEVkaXRpbmdTdHJ1Y3R1cmUgPT09IHRoaXMuc3RydWN0dXJlKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuY29tcG9uZW50SXNEZXN0cm95ZWQkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShpc0FjdGl2ZSA9PiB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBpc0FjdGl2ZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jb21wb25lbnRJc0Rlc3Ryb3llZCQubmV4dCgnJyk7XG4gICAgdGhpcy5jb21wb25lbnRJc0Rlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19