{ "version": 3, "sources": ["libs/email-ui/email-library/src/email-library-editor.component.ts", "libs/email-ui/email-library/src/email-library-editor.component.html", "libs/email-ui/email-library/src/email-library-list/preview-dialog/preview-dialog.component.ts", "libs/email-ui/email-library/src/email-library-list/preview-dialog/preview-dialog.component.html", "libs/email-ui/email-library/src/email-library-list/card/card.component.ts", "libs/email-ui/email-library/src/email-library-list/card/card.component.html", "libs/email-ui/email-library/src/email-library-list/paginated-searcher.service.ts", "libs/email-ui/email-library/dependencies.ts", "libs/email-ui/email-library/src/email-library-list/email-cards/email-cards.component.ts", "libs/email-ui/email-library/src/email-library-list/email-cards/email-cards.component.html", "libs/email-ui/email-library/src/email-library-list/list.component.ts", "libs/email-ui/email-library/src/email-library-list/list.component.html", "libs/email-ui/email-library/src/email-library.module.ts", "libs/email-ui/email-library/src/email-library-list/page/page.component.ts", "libs/email-ui/email-library/src/email-library-list/page/page.component.html"], "sourcesContent": ["import { Component, Inject, Input, OnInit, Optional } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { EnvironmentService } from '@galaxy/core';\nimport { AccountGroupApiService } from '@vendasta/account-group';\nimport { AppNamespace, OwnerType } from '@vendasta/email-builder';\nimport { SnackbarService } from '@vendasta/galaxy/snackbar-service';\nimport { EMPTY, Observable, catchError, of } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n AdvancedSections,\n DYNAMIC_COMPONENT_DATA_TOKEN,\n EMAIL_FOOTER_TOKEN,\n EMAIL_TOP_LOGO_TOKEN,\n EmailContentData,\n EmailPreviewHydrationData,\n HasUnsavedChangesGuard,\n PLACEHOLDER_LOGO_URL_TOKEN,\n TEMPLATE_HYDRATION_DATA_TOKEN,\n} from '../../email-builder';\nimport { VariableMenuItem } from '../../email-builder/src/components/dynamic-component-selector';\nimport {\n Footer,\n TopLogo,\n} from '../../email-builder/src/components/email-advanced-settings/email-advanced-settings.component';\nimport { EmailBuilderDataService } from '../../email-builder/src/services/email-builder-data.service';\nimport { EMAIL_LIBRARY_BASE_URL_TOKEN, PAGE_ROUTES } from './shared';\n\nexport interface BackUrlData {\n previousPageUrl: string;\n previousPageTitle: string;\n}\n\nconst templateIdPrefix = 'TEMPLATE-';\n\n@Component({\n selector: 'email-library-editor',\n templateUrl: './email-library-editor.component.html',\n styleUrls: ['./email-library-editor.component.scss'],\n standalone: false,\n})\nexport class EmailLibraryEditorComponent implements OnInit {\n @Input()\n ownerID: string;\n @Input()\n ownerType: OwnerType;\n @Input() // Template ID: to create a new template, pass either null or \"\".\n templateID = '';\n @Input()\n backUrlData: BackUrlData = { previousPageUrl: '', previousPageTitle: '' };\n\n isNew = true;\n\n templateData$: Observable = EMPTY;\n htmlRendering = false;\n private dataForSaving: EmailContentData;\n private rawHtmlForSaving: string;\n\n public previewHydrationData$: Observable;\n\n readonly advancedSections: AdvancedSections = {\n topLogo: true,\n pageSetup: true,\n footer: true,\n colors: true,\n };\n\n constructor(\n private readonly dataService: EmailBuilderDataService,\n private readonly environmentService: EnvironmentService,\n private readonly accountGroups: AccountGroupApiService,\n private readonly router: Router,\n private readonly changesGuard: HasUnsavedChangesGuard,\n private readonly snackbarService: SnackbarService,\n @Inject(EMAIL_LIBRARY_BASE_URL_TOKEN) private readonly baseUrl$: Observable,\n @Inject(PLACEHOLDER_LOGO_URL_TOKEN) @Optional() readonly placeholderLogo$: Observable,\n @Inject(EMAIL_FOOTER_TOKEN) @Optional() readonly footer: Footer,\n @Inject(EMAIL_TOP_LOGO_TOKEN) @Optional() readonly defaultTopLogo: TopLogo,\n @Inject(DYNAMIC_COMPONENT_DATA_TOKEN) readonly dynamicComponents: VariableMenuItem[],\n @Inject(TEMPLATE_HYDRATION_DATA_TOKEN)\n readonly initialPreviewHydrationData$: Observable,\n ) {}\n\n ngOnInit(): void {\n this.previewHydrationData$ = this.initialPreviewHydrationData$;\n const initialContent: EmailContentData = {\n subjectLine: '',\n previewText: '',\n id: this.templateID,\n emailSetup: {\n pageSetup: {\n collapsed: true,\n },\n topLogo: {\n showLogo: 'show',\n collapsed: true,\n },\n colors: {\n collapsed: true,\n },\n footer: {\n collapsed: true,\n },\n },\n emailContentBlocks: [],\n };\n this.isNew = this.templateID === '';\n if (this.isNew) {\n this.templateID = templateIdPrefix + uuidv4();\n if (this.footer) {\n initialContent.emailSetup.footer = this.footer;\n }\n if (this.defaultTopLogo?.defaultSourceUrl && initialContent.emailSetup.topLogo.showLogo === 'show') {\n initialContent.emailSetup.topLogo = { ...this.defaultTopLogo, ...initialContent.emailSetup.topLogo };\n }\n this.templateData$ = of(initialContent);\n } else {\n this.templateData$ = this.dataService\n .loadTemplate$(this.ownerType, this.ownerID, AppNamespace.EMAIL_LIBRARY, this.templateID)\n .pipe(\n map((template) => {\n if (this.footer) {\n template.emailSetup.footer = this.footer;\n }\n return template;\n }),\n );\n }\n }\n\n setHtmlRendering($event: boolean): void {\n this.htmlRendering = $event;\n }\n\n stageDataForSaving($event: EmailContentData): void {\n this.changesGuard.markAsUnsaved();\n this.dataForSaving = $event;\n }\n\n stageRawHtmlForSaving($event: string): void {\n this.rawHtmlForSaving = $event;\n }\n\n saveAndClose(): void {\n if (this.dataForSaving) {\n const saveResult = this.isNew ? this.sendCreateRequest() : this.sendUpdateRequest();\n saveResult\n .pipe(\n catchError((err) => {\n this.snackbarService.openErrorSnack('EMAIL_BUILDER.SAVING.GENERIC_ERROR');\n throw new Error(err);\n }),\n )\n .subscribe((saveSuccessful) => {\n if (saveSuccessful) {\n this.changesGuard.markAsSaved();\n this.closePage();\n return;\n }\n });\n } else {\n this.closePage();\n }\n }\n\n closePage(): void {\n if (this.changesGuard.canNavigateAway) {\n if (this.isNew && this.dataForSaving) {\n this.baseUrl$.pipe(take(1)).subscribe((baseUrl) => {\n const userAddedTemplate = {\n title: this.dataForSaving?.name,\n created: new Date(),\n editorUrl: baseUrl + PAGE_ROUTES.ROOT.TEMPLATE_SUBROUTES.EDIT(this.templateID),\n templateId: this.templateID,\n templateJson: '',\n templateSubject: this.dataForSaving?.subjectLine,\n templateHtml: this.rawHtmlForSaving,\n updated: new Date(),\n };\n this.router.navigateByUrl(this.backUrlData.previousPageUrl, {\n state: {\n template: userAddedTemplate,\n },\n });\n });\n } else {\n this.router.navigateByUrl(this.backUrlData.previousPageUrl);\n }\n } else {\n const dialog = this.changesGuard.showUnsavedChangesDialog();\n dialog.afterClosed().subscribe((result) => {\n if (result?.navigateAwayAndDiscard) {\n this.router.navigateByUrl(this.backUrlData.previousPageUrl);\n }\n });\n }\n }\n\n private sendUpdateRequest(): Observable {\n return this.dataService.updateExistingTemplate$(\n this.ownerType,\n this.ownerID,\n AppNamespace.EMAIL_LIBRARY,\n this.templateID,\n this.dataForSaving,\n this.rawHtmlForSaving,\n );\n }\n\n private sendCreateRequest(): Observable {\n return this.dataService.createNewTemplate$(\n this.ownerType,\n this.ownerID,\n AppNamespace.EMAIL_LIBRARY,\n this.templateID,\n this.dataForSaving,\n this.rawHtmlForSaving,\n );\n }\n}\n", "\n \n \n \n \n \n \n {{ 'EMAIL_LIBRARY.EDITOR.TITLE' | translate }}\n \n \n\n \n \n \n\n \n \n \n \n \n {{ 'EMAIL_LIBRARY.EDITOR.TITLE' | translate }}\n \n \n\n

{{ 'EMAIL_LIBRARY.EDITOR.ERROR_LOADING_TEMPLATE' | translate }}

\n
\n
\n\n \n \n \n \n \n {{ 'EMAIL_LIBRARY.EDITOR.TITLE' | translate }}\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n
\n
\n", "import { CommonModule } from '@angular/common';\nimport { Component, Inject, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { finalize, switchMap } from 'rxjs/operators';\nimport {\n EMAIL_FOOTER_TOKEN,\n EmailContentData,\n EmailPreviewHydrationData,\n PreviewRenderingService,\n} from './../../../../email-builder';\nimport { EmailEditorPreviewModule } from './../../../../email-editor-preview';\nimport { DefaultCardAction, Template } from './../card/card.component';\nimport { Footer } from '../../../../email-builder/src/components/email-advanced-settings/email-advanced-settings.component';\n\ninterface PreviewData {\n primaryAction: DefaultCardAction;\n template: Template;\n userId: string;\n ownerId: string;\n partnerId: string;\n}\n\nconst actionTranslationMap = {\n duplicate: 'COMMON.ACTION_LABELS.DUPLICATE',\n edit: 'COMMON.ACTION_LABELS.EDIT',\n use: 'COMMON.ACTION_LABELS.ADD_EMAIL',\n};\n\n@Component({\n selector: 'email-preview-dialog.component',\n imports: [TranslateModule, MatDialogModule, MatButtonModule, EmailEditorPreviewModule, CommonModule],\n providers: [],\n templateUrl: 'preview-dialog.component.html',\n styleUrls: ['preview-dialog.component.scss'],\n})\nexport class PreviewDialogComponent implements OnInit, OnDestroy {\n primaryActionText: string;\n isRendering = false;\n renderedHtml$: Observable;\n hydrationData: EmailPreviewHydrationData;\n subscriptions: Subscription[] = [];\n constructor(\n @Inject(MAT_DIALOG_DATA) public previewData: PreviewData,\n @Inject(EMAIL_FOOTER_TOKEN) @Optional() readonly footer: Footer,\n public dialogRef: MatDialogRef,\n private translate: TranslateService,\n private emailPreviewService: PreviewRenderingService,\n ) {\n this.hydrationData = {\n business: {\n accountGroupId: this.previewData.ownerId,\n name: '',\n hasSnapshot: false,\n hasSalesperson: false,\n },\n userID: this.previewData.userId,\n partnerID: this.previewData.partnerId,\n marketID: undefined,\n contactID: 'Contact',\n };\n this.primaryActionText = this.translate.instant(actionTranslationMap[this.previewData.primaryAction]);\n }\n\n ngOnInit(): void {\n this.emailPreviewService.setPreviewHydrationParams(this.hydrationData);\n this.renderEmailContent();\n }\n\n cancel(): void {\n this.dialogRef.close(false);\n }\n\n closeWithAction(): void {\n this.dialogRef.close(true);\n }\n\n renderEmailContent(): void {\n this.isRendering = true;\n const templateJson = JSON.parse(this.previewData.template.templateJson) as EmailContentData;\n if (this.footer) {\n templateJson.emailSetup.footer = this.footer;\n }\n this.renderedHtml$ = this.emailPreviewService.renderContentHTML(templateJson).pipe(\n switchMap((renderedHTML) => {\n return this.emailPreviewService.hydrateTemplate(templateJson, renderedHTML);\n }),\n finalize(() => {\n this.isRendering = false;\n }),\n );\n }\n ngOnDestroy(): void {\n this.subscriptions.forEach((subscription) => subscription.unsubscribe());\n }\n}\n", "

\n {{ this.previewData.template.title }}\n

\n\n \n\n\n \n \n\n", "import { Component, Input, Output, EventEmitter, Inject } from '@angular/core';\nimport { TemplateReferenceInterface } from '@vendasta/email-builder/lib/_internal';\nimport { AppNamespace } from '@vendasta/email-builder';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { PreviewDialogComponent } from './../preview-dialog/preview-dialog.component';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { OwnerType } from '@vendasta/email-builder';\nimport { take, switchMap } from 'rxjs/operators';\nimport { SENDER_ID_TOKEN } from '../../../../email-activity/src/dependencies';\n\nexport interface Template {\n title: string;\n created: Date;\n editorUrl: string;\n templateId: string;\n previewUrl?: string;\n updated?: Date;\n templateJson: string;\n templateHtml?: string;\n templateSubject: string;\n}\n\nexport function asReference(template: Template): TemplateReferenceInterface {\n return {\n appNamespace: AppNamespace.EMAIL_LIBRARY,\n templateId: template.templateId,\n } as TemplateReferenceInterface;\n}\n\nexport enum DefaultCardAction {\n EDIT = 'edit',\n DUPLICATE = 'duplicate',\n USE = 'use',\n}\n\n@Component({\n selector: 'email-card',\n templateUrl: './card.component.html',\n styleUrls: ['./card.component.scss'],\n standalone: false,\n})\nexport class CardComponent {\n dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n };\n senderId: string;\n subscriptions: Subscription[] = [];\n @Input() email: Template = null;\n @Input() readOnly: boolean;\n @Input() defaultAction: DefaultCardAction;\n @Input() userId: string;\n @Input() ownerType: OwnerType;\n @Output() duplicateRequested: EventEmitter