@flusys/ng-email 1.1.0-beta → 1.1.1-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{flusys-ng-email-email-config-list.component-CJhSPkCZ.mjs → flusys-ng-email-email-config-list.component-DxRpA8ht.mjs} +5 -5
- package/fesm2022/flusys-ng-email-email-config-list.component-DxRpA8ht.mjs.map +1 -0
- package/fesm2022/{flusys-ng-email-template-form.component-DjzG_lG1.mjs → flusys-ng-email-template-form.component-wM4L0S0b.mjs} +9 -9
- package/fesm2022/flusys-ng-email-template-form.component-wM4L0S0b.mjs.map +1 -0
- package/fesm2022/{flusys-ng-email-template-list.component-CGJxfZMT.mjs → flusys-ng-email-template-list.component-BLhlPM6H.mjs} +5 -5
- package/fesm2022/flusys-ng-email-template-list.component-BLhlPM6H.mjs.map +1 -0
- package/fesm2022/flusys-ng-email.mjs +8 -8
- package/fesm2022/flusys-ng-email.mjs.map +1 -1
- package/package.json +3 -3
- package/fesm2022/flusys-ng-email-email-config-list.component-CJhSPkCZ.mjs.map +0 -1
- package/fesm2022/flusys-ng-email-template-form.component-DjzG_lG1.mjs.map +0 -1
- package/fesm2022/flusys-ng-email-template-list.component-CGJxfZMT.mjs.map +0 -1
|
@@ -190,7 +190,7 @@ class EmailConfigListComponent {
|
|
|
190
190
|
<div>
|
|
191
191
|
<h3 class="text-xl font-semibold">Email Configurations</h3>
|
|
192
192
|
@if (showCompanyInfo()) {
|
|
193
|
-
<p class="text-sm text-
|
|
193
|
+
<p class="text-sm text-muted-color mt-1">
|
|
194
194
|
Company: {{ currentCompanyName() }}
|
|
195
195
|
</p>
|
|
196
196
|
}
|
|
@@ -314,7 +314,7 @@ class EmailConfigListComponent {
|
|
|
314
314
|
placeholder="recipient@example.com"
|
|
315
315
|
type="email"
|
|
316
316
|
/>
|
|
317
|
-
<small class="text-
|
|
317
|
+
<small class="text-muted-color mt-1 block">
|
|
318
318
|
A test email will be sent to this address
|
|
319
319
|
</small>
|
|
320
320
|
</div>
|
|
@@ -353,7 +353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
353
353
|
<div>
|
|
354
354
|
<h3 class="text-xl font-semibold">Email Configurations</h3>
|
|
355
355
|
@if (showCompanyInfo()) {
|
|
356
|
-
<p class="text-sm text-
|
|
356
|
+
<p class="text-sm text-muted-color mt-1">
|
|
357
357
|
Company: {{ currentCompanyName() }}
|
|
358
358
|
</p>
|
|
359
359
|
}
|
|
@@ -477,7 +477,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
477
477
|
placeholder="recipient@example.com"
|
|
478
478
|
type="email"
|
|
479
479
|
/>
|
|
480
|
-
<small class="text-
|
|
480
|
+
<small class="text-muted-color mt-1 block">
|
|
481
481
|
A test email will be sent to this address
|
|
482
482
|
</small>
|
|
483
483
|
</div>
|
|
@@ -505,4 +505,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
505
505
|
}] });
|
|
506
506
|
|
|
507
507
|
export { EmailConfigListComponent };
|
|
508
|
-
//# sourceMappingURL=flusys-ng-email-email-config-list.component-
|
|
508
|
+
//# sourceMappingURL=flusys-ng-email-email-config-list.component-DxRpA8ht.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-email-email-config-list.component-DxRpA8ht.mjs","sources":["../../../projects/ng-email/pages/config/email-config-list.component.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, inject, signal, OnInit, computed } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { EmailConfigApiService } from '../../services/email-config-api.service';\nimport { IEmailConfig } from '../../interfaces/email-config.interface';\nimport { EmailProviderEnum } from '../../enums/email-provider.enum';\n\n/**\n * Email configuration list component\n */\n@Component({\n selector: 'lib-email-config-list',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormsModule],\n providers: [ConfirmationService, MessageService],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">Email Configurations</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"New Configuration\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\"\n />\n </div>\n\n <p-table\n [value]=\"configs()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Provider</th>\n <th>From Email</th>\n <th>Status</th>\n <th>Created</th>\n <th style=\"width: 150px\">Actions</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-config>\n <tr>\n <td>\n <i [class]=\"getProviderIcon(config.provider)\" class=\"mr-2\"></i>\n {{ config.name }}\n </td>\n <td>\n <p-tag\n [value]=\"getProviderLabel(config.provider)\"\n [severity]=\"getProviderSeverity(config.provider)\"\n />\n </td>\n <td>{{ config.fromEmail || '-' }}</td>\n <td>\n <p-tag\n [value]=\"config.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"config.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td>{{ config.createdAt | date: 'short' }}</td>\n <td>\n <p-button\n icon=\"pi pi-send\"\n [text]=\"true\"\n size=\"small\"\n pTooltip=\"Test\"\n (onClick)=\"onTest(config)\"\n />\n <p-button\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(config.id)\"\n />\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onDelete(config)\"\n />\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-4\">\n No email configurations found. Add a provider to start sending emails.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n <!-- Test Email Dialog -->\n <p-dialog\n header=\"Test Email Configuration\"\n [(visible)]=\"showTestDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '400px' }\"\n >\n <div class=\"grid gap-4\">\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Configuration</label>\n <input\n pInputText\n [value]=\"selectedConfig()?.name || ''\"\n class=\"w-full\"\n [disabled]=\"true\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Provider</label>\n <p-tag\n [value]=\"getProviderLabel(selectedConfig()?.provider || '')\"\n [severity]=\"getProviderSeverity(selectedConfig()?.provider || '')\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Recipient Email *</label>\n <input\n pInputText\n [(ngModel)]=\"testRecipient\"\n class=\"w-full\"\n placeholder=\"recipient@example.com\"\n type=\"email\"\n />\n <small class=\"text-muted-color mt-1 block\">\n A test email will be sent to this address\n </small>\n </div>\n </div>\n\n <ng-template #footer>\n <p-button\n label=\"Cancel\"\n [text]=\"true\"\n (onClick)=\"showTestDialog = false\"\n />\n <p-button\n label=\"Send Test\"\n icon=\"pi pi-send\"\n [loading]=\"isSendingTest()\"\n (onClick)=\"sendTestEmail()\"\n />\n </ng-template>\n </p-dialog>\n\n <p-confirmDialog />\n <p-toast />\n `,\n})\nexport class EmailConfigListComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly configService = inject(EmailConfigApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly configs = signal<IEmailConfig[]>([]);\n readonly totalRecords = signal(0);\n readonly pageSize = signal(10);\n readonly currentPage = signal(1);\n\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n // Test dialog state\n showTestDialog = false;\n readonly selectedConfig = signal<IEmailConfig | null>(null);\n readonly isSendingTest = signal(false);\n testRecipient = '';\n\n ngOnInit(): void {\n this.loadConfigs();\n }\n\n onCreate(): void {\n this.router.navigate(['/email/configs/new']);\n }\n\n onEdit(configId: string): void {\n this.router.navigate(['/email/configs', configId]);\n }\n\n async loadConfigs(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.getAll('', {\n pagination: {\n currentPage: this.currentPage() - 1,\n pageSize: this.pageSize(),\n },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.configs.set(response.data ?? []);\n this.totalRecords.set(response.meta?.total ?? 0);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onPageChange(event: any): void {\n this.currentPage.set(event.first / event.rows + 1);\n this.pageSize.set(event.rows);\n this.loadConfigs();\n }\n\n getProviderIcon(provider: EmailProviderEnum): string {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'pi pi-server';\n case EmailProviderEnum.SENDGRID:\n return 'pi pi-cloud';\n case EmailProviderEnum.MAILGUN:\n return 'pi pi-cloud';\n default:\n return 'pi pi-envelope';\n }\n }\n\n getProviderLabel(provider: EmailProviderEnum | string): string {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'SMTP';\n case EmailProviderEnum.SENDGRID:\n return 'SendGrid';\n case EmailProviderEnum.MAILGUN:\n return 'Mailgun';\n default:\n return provider || '';\n }\n }\n\n getProviderSeverity(\n provider: EmailProviderEnum | string,\n ): 'success' | 'secondary' | 'info' | 'warn' | 'danger' | 'contrast' {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'info';\n case EmailProviderEnum.SENDGRID:\n return 'success';\n case EmailProviderEnum.MAILGUN:\n return 'warn';\n default:\n return 'secondary';\n }\n }\n\n onTest(config: IEmailConfig): void {\n this.selectedConfig.set(config);\n this.testRecipient = '';\n this.showTestDialog = true;\n }\n\n async sendTestEmail(): Promise<void> {\n const config = this.selectedConfig();\n if (!config || !this.testRecipient) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Validation',\n detail: 'Please enter a recipient email address.',\n });\n return;\n }\n\n this.isSendingTest.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.sendTest(config.id, this.testRecipient),\n );\n\n if (response.data?.success) {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Test email sent successfully! Message ID: ${response.data.messageId}`,\n });\n this.showTestDialog = false;\n } else {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: response.data?.error || 'Failed to send test email.',\n });\n }\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to send test email.',\n });\n } finally {\n this.isSendingTest.set(false);\n }\n }\n\n onDelete(config: IEmailConfig): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${config.name}\"?`,\n header: 'Delete Configuration',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.configService.deleteAsync({ id: config.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Configuration deleted successfully.',\n });\n this.loadConfigs();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to delete configuration.',\n });\n }\n },\n });\n }\n}\n"],"names":["i6","i7","i8","i9","i10"],"mappings":"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"}
|
|
@@ -241,7 +241,7 @@ class TemplateFormComponent {
|
|
|
241
241
|
class="w-full"
|
|
242
242
|
[placeholder]="'e.g., Welcome to ' + '{{' + 'appName' + '}}' + '!'"
|
|
243
243
|
/>
|
|
244
|
-
<small class="text-
|
|
244
|
+
<small class="text-muted-color">Use {{ '{{variableName}}' }} for dynamic content</small>
|
|
245
245
|
</div>
|
|
246
246
|
|
|
247
247
|
<div class="field">
|
|
@@ -303,7 +303,7 @@ class TemplateFormComponent {
|
|
|
303
303
|
rows="20"
|
|
304
304
|
placeholder="Enter plain text content for email clients that don't support HTML"
|
|
305
305
|
></textarea>
|
|
306
|
-
<small class="text-
|
|
306
|
+
<small class="text-muted-color mt-1 block">
|
|
307
307
|
<i class="pi pi-info-circle mr-1"></i>
|
|
308
308
|
Plain text version sent to email clients without HTML support
|
|
309
309
|
</small>
|
|
@@ -318,7 +318,7 @@ class TemplateFormComponent {
|
|
|
318
318
|
<p-tag value="Live Preview" severity="info" />
|
|
319
319
|
</div>
|
|
320
320
|
<div
|
|
321
|
-
class="border rounded bg-
|
|
321
|
+
class="border rounded bg-surface-0 min-h-[400px] overflow-auto"
|
|
322
322
|
style="max-height: 500px;"
|
|
323
323
|
>
|
|
324
324
|
@if (formModel.htmlContent) {
|
|
@@ -328,7 +328,7 @@ class TemplateFormComponent {
|
|
|
328
328
|
sandbox="allow-same-origin"
|
|
329
329
|
></iframe>
|
|
330
330
|
} @else {
|
|
331
|
-
<div class="flex items-center justify-center h-full min-h-[400px] text-
|
|
331
|
+
<div class="flex items-center justify-center h-full min-h-[400px] text-muted-color">
|
|
332
332
|
<div class="text-center">
|
|
333
333
|
<i class="pi pi-eye text-4xl mb-2"></i>
|
|
334
334
|
<p>Enter HTML content to see preview</p>
|
|
@@ -420,7 +420,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
420
420
|
class="w-full"
|
|
421
421
|
[placeholder]="'e.g., Welcome to ' + '{{' + 'appName' + '}}' + '!'"
|
|
422
422
|
/>
|
|
423
|
-
<small class="text-
|
|
423
|
+
<small class="text-muted-color">Use {{ '{{variableName}}' }} for dynamic content</small>
|
|
424
424
|
</div>
|
|
425
425
|
|
|
426
426
|
<div class="field">
|
|
@@ -482,7 +482,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
482
482
|
rows="20"
|
|
483
483
|
placeholder="Enter plain text content for email clients that don't support HTML"
|
|
484
484
|
></textarea>
|
|
485
|
-
<small class="text-
|
|
485
|
+
<small class="text-muted-color mt-1 block">
|
|
486
486
|
<i class="pi pi-info-circle mr-1"></i>
|
|
487
487
|
Plain text version sent to email clients without HTML support
|
|
488
488
|
</small>
|
|
@@ -497,7 +497,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
497
497
|
<p-tag value="Live Preview" severity="info" />
|
|
498
498
|
</div>
|
|
499
499
|
<div
|
|
500
|
-
class="border rounded bg-
|
|
500
|
+
class="border rounded bg-surface-0 min-h-[400px] overflow-auto"
|
|
501
501
|
style="max-height: 500px;"
|
|
502
502
|
>
|
|
503
503
|
@if (formModel.htmlContent) {
|
|
@@ -507,7 +507,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
507
507
|
sandbox="allow-same-origin"
|
|
508
508
|
></iframe>
|
|
509
509
|
} @else {
|
|
510
|
-
<div class="flex items-center justify-center h-full min-h-[400px] text-
|
|
510
|
+
<div class="flex items-center justify-center h-full min-h-[400px] text-muted-color">
|
|
511
511
|
<div class="text-center">
|
|
512
512
|
<i class="pi pi-eye text-4xl mb-2"></i>
|
|
513
513
|
<p>Enter HTML content to see preview</p>
|
|
@@ -526,4 +526,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
526
526
|
}] });
|
|
527
527
|
|
|
528
528
|
export { TemplateFormComponent };
|
|
529
|
-
//# sourceMappingURL=flusys-ng-email-template-form.component-
|
|
529
|
+
//# sourceMappingURL=flusys-ng-email-template-form.component-wM4L0S0b.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-email-template-form.component-wM4L0S0b.mjs","sources":["../../../projects/ng-email/pages/template/template-form.component.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n inject,\n signal,\n computed,\n OnInit,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { MessageService } from 'primeng/api';\nimport { PrimeModule } from '@flusys/ng-shared';\nimport { EmailTemplateApiService } from '../../services/email-template-api.service';\nimport { EmailBuilderStateService } from '../../services/email-builder-state.service';\nimport { IEmailTemplate } from '../../interfaces/email-template.interface';\nimport { createEmailSchema } from '../../interfaces/email-schema.interface';\n\n/**\n * Email template form component (create/edit)\n */\n@Component({\n selector: 'lib-template-form',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n RouterLink,\n FormsModule,\n PrimeModule,\n ],\n providers: [MessageService, EmailBuilderStateService],\n template: `\n <div class=\"template-form\">\n <!-- Header -->\n <div class=\"flex justify-between items-center mb-4\">\n <div class=\"flex items-center gap-2\">\n <p-button\n icon=\"pi pi-arrow-left\"\n [text]=\"true\"\n routerLink=\"../\"\n />\n <h2 class=\"text-xl font-semibold\">\n {{ isEditMode() ? 'Edit Template' : 'New Template' }}\n </h2>\n </div>\n <div class=\"flex gap-2\">\n <p-button\n label=\"Cancel\"\n [text]=\"true\"\n routerLink=\"../\"\n />\n <p-button\n label=\"Save\"\n icon=\"pi pi-save\"\n [loading]=\"isLoading()\"\n (onClick)=\"onSave()\"\n />\n </div>\n </div>\n\n <!-- Form Fields -->\n <div class=\"card mb-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field\">\n <label for=\"name\" class=\"block font-medium mb-2\">Template Name *</label>\n <input\n pInputText\n id=\"name\"\n [(ngModel)]=\"formModel.name\"\n class=\"w-full\"\n placeholder=\"e.g., Welcome Email\"\n />\n </div>\n\n <div class=\"field\">\n <label for=\"slug\" class=\"block font-medium mb-2\">Slug *</label>\n <input\n pInputText\n id=\"slug\"\n [(ngModel)]=\"formModel.slug\"\n class=\"w-full\"\n placeholder=\"e.g., welcome-email\"\n />\n </div>\n\n <div class=\"field md:col-span-2\">\n <label for=\"subject\" class=\"block font-medium mb-2\">Subject *</label>\n <input\n pInputText\n id=\"subject\"\n [(ngModel)]=\"formModel.subject\"\n class=\"w-full\"\n [placeholder]=\"'e.g., Welcome to ' + '{{' + 'appName' + '}}' + '!'\"\n />\n <small class=\"text-muted-color\">Use {{ '{{variableName}}' }} for dynamic content</small>\n </div>\n\n <div class=\"field\">\n <label for=\"description\" class=\"block font-medium mb-2\">Description</label>\n <input\n pInputText\n id=\"description\"\n [(ngModel)]=\"formModel.description\"\n class=\"w-full\"\n placeholder=\"Brief description of the template\"\n />\n </div>\n\n <div class=\"field flex items-center gap-2\">\n <p-toggleswitch [(ngModel)]=\"formModel.isActive\" />\n <label>Active</label>\n </div>\n </div>\n </div>\n\n <!-- Content Editor & Preview -->\n <div class=\"grid grid-cols-1 gap-4\" [class.lg:grid-cols-2]=\"editorMode() === 'html'\">\n <!-- Editor Panel -->\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-3\">\n <h3 class=\"font-semibold\">Content</h3>\n <div class=\"flex gap-1\">\n <p-button\n label=\"HTML\"\n [outlined]=\"editorMode() !== 'html'\"\n [severity]=\"editorMode() === 'html' ? 'primary' : 'secondary'\"\n size=\"small\"\n (onClick)=\"setEditorMode('html')\"\n />\n <p-button\n label=\"Plain Text\"\n [outlined]=\"editorMode() !== 'text'\"\n [severity]=\"editorMode() === 'text' ? 'primary' : 'secondary'\"\n size=\"small\"\n (onClick)=\"setEditorMode('text')\"\n />\n </div>\n </div>\n\n @if (editorMode() === 'html') {\n <textarea\n pTextarea\n [(ngModel)]=\"formModel.htmlContent\"\n class=\"w-full font-mono text-sm\"\n rows=\"20\"\n placeholder=\"<html>...</html>\"\n (ngModelChange)=\"onContentChange()\"\n ></textarea>\n } @else {\n <textarea\n pTextarea\n [(ngModel)]=\"formModel.textContent\"\n class=\"w-full font-mono text-sm\"\n rows=\"20\"\n placeholder=\"Enter plain text content for email clients that don't support HTML\"\n ></textarea>\n <small class=\"text-muted-color mt-1 block\">\n <i class=\"pi pi-info-circle mr-1\"></i>\n Plain text version sent to email clients without HTML support\n </small>\n }\n </div>\n\n <!-- Preview Panel (HTML mode only) -->\n @if (editorMode() === 'html') {\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-3\">\n <h3 class=\"font-semibold\">Preview</h3>\n <p-tag value=\"Live Preview\" severity=\"info\" />\n </div>\n <div\n class=\"border rounded bg-surface-0 min-h-[400px] overflow-auto\"\n style=\"max-height: 500px;\"\n >\n @if (formModel.htmlContent) {\n <iframe\n [srcdoc]=\"getPreviewHtml()\"\n class=\"w-full h-full min-h-[400px] border-0\"\n sandbox=\"allow-same-origin\"\n ></iframe>\n } @else {\n <div class=\"flex items-center justify-center h-full min-h-[400px] text-muted-color\">\n <div class=\"text-center\">\n <i class=\"pi pi-eye text-4xl mb-2\"></i>\n <p>Enter HTML content to see preview</p>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <p-toast />\n `,\n})\nexport class TemplateFormComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly templateService = inject(EmailTemplateApiService);\n private readonly messageService = inject(MessageService);\n readonly state = inject(EmailBuilderStateService);\n\n readonly isLoading = signal(false);\n readonly existingTemplate = signal<IEmailTemplate | null>(null);\n readonly isEditMode = computed(() => !!this.existingTemplate());\n readonly editorMode = signal<'html' | 'text'>('html');\n\n formModel = {\n id: '',\n name: '',\n slug: '',\n description: '',\n subject: '',\n htmlContent: '',\n textContent: '',\n isActive: true,\n isHtml: true,\n };\n\n ngOnInit(): void {\n const id = this.route.snapshot.paramMap.get('id');\n if (id) {\n this.loadTemplate(id);\n }\n }\n\n async loadTemplate(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.templateService.findByIdAsync(id);\n if (response.success && response.data) {\n const template = response.data;\n this.existingTemplate.set(template);\n this.formModel = {\n id: template.id,\n name: template.name,\n slug: template.slug,\n description: template.description || '',\n subject: template.subject,\n htmlContent: template.htmlContent,\n textContent: template.textContent || '',\n isActive: template.isActive,\n isHtml: template.isHtml ?? true,\n };\n // Set editor mode based on saved template type\n this.editorMode.set(template.isHtml ? 'html' : 'text');\n this.state.loadSchema(template.schema);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n setEditorMode(mode: 'html' | 'text'): void {\n const currentMode = this.editorMode();\n\n // Sync content when switching modes\n if (currentMode === 'text' && mode === 'html') {\n // Switching from text to html - convert text to basic HTML if htmlContent is empty\n if (!this.formModel.htmlContent && this.formModel.textContent) {\n this.formModel.htmlContent = this.textToHtml(this.formModel.textContent);\n }\n } else if (currentMode === 'html' && mode === 'text') {\n // Switching from html to text - generate text from HTML if textContent is empty\n if (!this.formModel.textContent && this.formModel.htmlContent) {\n this.formModel.textContent = this.htmlToPlainText(this.formModel.htmlContent);\n }\n }\n\n this.editorMode.set(mode);\n this.formModel.isHtml = mode === 'html';\n }\n\n /** Convert plain text to basic HTML */\n private textToHtml(text: string): string {\n if (!text) return '';\n // Convert line breaks to paragraphs\n return text\n .split(/\\n\\n+/)\n .map((p) => `<p>${p.replace(/\\n/g, '<br>')}</p>`)\n .join('\\n');\n }\n\n onContentChange(): void {\n // Trigger change detection for preview\n }\n\n /** Convert HTML to plain text */\n private htmlToPlainText(html: string): string {\n if (!html) return '';\n // Create a temporary element to parse HTML\n const temp = document.createElement('div');\n temp.innerHTML = html;\n // Get text content and clean up whitespace\n return (temp.textContent || temp.innerText || '')\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n /** Get HTML for preview iframe */\n getPreviewHtml(): string {\n const baseStyles = `\n <style>\n body { font-family: Arial, sans-serif; margin: 16px; }\n img { max-width: 100%; height: auto; }\n </style>\n `;\n return baseStyles + (this.formModel.htmlContent || '');\n }\n\n async onSave(): Promise<void> {\n if (!this.formModel.name || !this.formModel.slug || !this.formModel.subject) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Validation',\n detail: 'Please fill in all required fields.',\n });\n return;\n }\n\n this.isLoading.set(true);\n try {\n const schema = this.state.schema();\n // Use user-provided plain text, or auto-generate from HTML if empty\n const textContent = this.formModel.textContent || this.htmlToPlainText(this.formModel.htmlContent);\n\n const data = {\n name: this.formModel.name,\n slug: this.formModel.slug,\n description: this.formModel.description || undefined,\n subject: this.formModel.subject,\n schema: {\n ...schema,\n name: this.formModel.name,\n subject: this.formModel.subject,\n },\n htmlContent: this.formModel.htmlContent || '<p>Email content</p>',\n textContent: textContent || undefined,\n isActive: this.formModel.isActive,\n isHtml: this.formModel.isHtml,\n };\n\n if (this.isEditMode()) {\n await this.templateService.updateAsync({ id: this.formModel.id, ...data });\n } else {\n await this.templateService.insertAsync(data as any);\n }\n\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Template ${this.isEditMode() ? 'updated' : 'created'} successfully.`,\n });\n\n this.router.navigate(['../'], { relativeTo: this.route });\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to save template.',\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n}\n"],"names":["i3","i4","i5","i6"],"mappings":"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"}
|
|
@@ -215,7 +215,7 @@ class TemplateListComponent {
|
|
|
215
215
|
<div>
|
|
216
216
|
<h3 class="text-xl font-semibold">Email Templates</h3>
|
|
217
217
|
@if (showCompanyInfo()) {
|
|
218
|
-
<p class="text-sm text-
|
|
218
|
+
<p class="text-sm text-muted-color mt-1">
|
|
219
219
|
Company: {{ currentCompanyName() }}
|
|
220
220
|
</p>
|
|
221
221
|
}
|
|
@@ -256,7 +256,7 @@ class TemplateListComponent {
|
|
|
256
256
|
{{ template.name }}
|
|
257
257
|
</td>
|
|
258
258
|
<td>
|
|
259
|
-
<code class="text-sm bg-
|
|
259
|
+
<code class="text-sm bg-surface-100 px-2 py-1 rounded">{{ template.slug }}</code>
|
|
260
260
|
</td>
|
|
261
261
|
<td>{{ template.subject }}</td>
|
|
262
262
|
<td>
|
|
@@ -409,7 +409,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
409
409
|
<div>
|
|
410
410
|
<h3 class="text-xl font-semibold">Email Templates</h3>
|
|
411
411
|
@if (showCompanyInfo()) {
|
|
412
|
-
<p class="text-sm text-
|
|
412
|
+
<p class="text-sm text-muted-color mt-1">
|
|
413
413
|
Company: {{ currentCompanyName() }}
|
|
414
414
|
</p>
|
|
415
415
|
}
|
|
@@ -450,7 +450,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
450
450
|
{{ template.name }}
|
|
451
451
|
</td>
|
|
452
452
|
<td>
|
|
453
|
-
<code class="text-sm bg-
|
|
453
|
+
<code class="text-sm bg-surface-100 px-2 py-1 rounded">{{ template.slug }}</code>
|
|
454
454
|
</td>
|
|
455
455
|
<td>{{ template.subject }}</td>
|
|
456
456
|
<td>
|
|
@@ -592,4 +592,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
592
592
|
}] });
|
|
593
593
|
|
|
594
594
|
export { TemplateListComponent };
|
|
595
|
-
//# sourceMappingURL=flusys-ng-email-template-list.component-
|
|
595
|
+
//# sourceMappingURL=flusys-ng-email-template-list.component-BLhlPM6H.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-email-template-list.component-BLhlPM6H.mjs","sources":["../../../projects/ng-email/pages/template/template-list.component.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, inject, signal, OnInit, computed } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { EmailTemplateApiService } from '../../services/email-template-api.service';\nimport { EmailConfigApiService } from '../../services/email-config-api.service';\nimport { EmailSendService } from '../../services/email-send.service';\nimport { IEmailTemplate } from '../../interfaces/email-template.interface';\nimport { IEmailConfig } from '../../interfaces/email-config.interface';\n\n/**\n * Email template list component\n */\n@Component({\n selector: 'lib-template-list',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormsModule],\n providers: [ConfirmationService, MessageService],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">Email Templates</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"New Template\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\"\n />\n </div>\n\n <p-table\n [value]=\"templates()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Slug</th>\n <th>Subject</th>\n <th>Type</th>\n <th>Status</th>\n <th>Created</th>\n <th style=\"width: 150px\">Actions</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-template>\n <tr>\n <td>\n <i class=\"pi pi-envelope mr-2\"></i>\n {{ template.name }}\n </td>\n <td>\n <code class=\"text-sm bg-surface-100 px-2 py-1 rounded\">{{ template.slug }}</code>\n </td>\n <td>{{ template.subject }}</td>\n <td>\n <p-tag\n [value]=\"template.isHtml ? 'HTML' : 'Text'\"\n [severity]=\"template.isHtml ? 'info' : 'secondary'\"\n />\n </td>\n <td>\n <p-tag\n [value]=\"template.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"template.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td>{{ template.createdAt | date: 'short' }}</td>\n <td>\n <p-button\n icon=\"pi pi-send\"\n [text]=\"true\"\n size=\"small\"\n pTooltip=\"Test Send\"\n (onClick)=\"onTestSend(template)\"\n />\n <p-button\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(template.id)\"\n />\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onDelete(template)\"\n />\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"7\" class=\"text-center py-4\">\n No email templates found. Create your first template to get started.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n <!-- Test Send Dialog -->\n <p-dialog\n header=\"Test Send Email\"\n [(visible)]=\"showTestDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '500px', maxHeight: '80vh' }\"\n >\n <div class=\"grid gap-4\">\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Template</label>\n <input\n pInputText\n [value]=\"selectedTemplate()?.name || ''\"\n class=\"w-full\"\n [disabled]=\"true\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Email Configuration *</label>\n <p-select\n [(ngModel)]=\"testSendModel.configId\"\n [options]=\"configOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select configuration\"\n class=\"w-full\"\n [loading]=\"isLoadingConfigs()\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Recipient Email *</label>\n <input\n pInputText\n [(ngModel)]=\"testSendModel.recipient\"\n class=\"w-full\"\n placeholder=\"recipient@example.com\"\n />\n </div>\n\n <!-- Dynamic Variables -->\n @if (templateVariables().length > 0) {\n <div class=\"border-t pt-4 mt-2\">\n <h4 class=\"font-medium mb-3 flex items-center gap-2\">\n <i class=\"pi pi-code\"></i>\n Template Variables\n </h4>\n <div class=\"grid gap-3\">\n @for (variable of templateVariables(); track variable) {\n <div class=\"field\">\n <label class=\"block text-sm font-medium mb-1\">\n <code class=\"text-primary\">{{ '{{' + variable + '}}' }}</code>\n </label>\n <input\n pInputText\n [ngModel]=\"variableValues[variable] || ''\"\n (ngModelChange)=\"variableValues[variable] = $event\"\n class=\"w-full\"\n [placeholder]=\"'Enter value for ' + variable\"\n />\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template #footer>\n <p-button\n label=\"Cancel\"\n [text]=\"true\"\n (onClick)=\"showTestDialog = false\"\n />\n <p-button\n label=\"Send Test\"\n icon=\"pi pi-send\"\n [loading]=\"isSendingTest()\"\n (onClick)=\"sendTestEmail()\"\n />\n </ng-template>\n </p-dialog>\n\n <p-confirmDialog />\n <p-toast />\n `,\n})\nexport class TemplateListComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly templateService = inject(EmailTemplateApiService);\n private readonly configService = inject(EmailConfigApiService);\n private readonly emailSendService = inject(EmailSendService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly templates = signal<IEmailTemplate[]>([]);\n readonly totalRecords = signal(0);\n readonly pageSize = signal(10);\n readonly currentPage = signal(1);\n\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n // Test send dialog\n showTestDialog = false;\n readonly selectedTemplate = signal<IEmailTemplate | null>(null);\n readonly configs = signal<IEmailConfig[]>([]);\n readonly isLoadingConfigs = signal(false);\n readonly isSendingTest = signal(false);\n\n // Form-bound properties (ngModel requires plain properties)\n testSendModel = { configId: '', recipient: '' };\n variableValues: Record<string, string> = {};\n\n readonly configOptions = computed(() =>\n this.configs().map((c) => ({\n label: `${c.name} (${c.provider})`,\n value: c.id,\n })),\n );\n\n /** Extract variables from template content */\n readonly templateVariables = computed(() => {\n const template = this.selectedTemplate();\n if (!template) return [];\n\n // Combine all content sources to extract variables\n const content = [\n template.subject,\n template.htmlContent,\n template.textContent || '',\n ].join(' ');\n\n // Find all {{variableName}} patterns\n const matches = content.matchAll(/\\{\\{(\\w+)\\}\\}/g);\n const variables = new Set<string>();\n\n for (const match of matches) {\n variables.add(match[1]);\n }\n\n return Array.from(variables).sort();\n });\n\n ngOnInit(): void {\n this.loadTemplates();\n }\n\n onCreate(): void {\n this.router.navigate(['/email/templates/new']);\n }\n\n onEdit(templateId: string): void {\n this.router.navigate(['/email/templates', templateId]);\n }\n\n async loadTemplates(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.templateService.getAll('', {\n pagination: {\n currentPage: this.currentPage() - 1,\n pageSize: this.pageSize(),\n },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.templates.set(response.data ?? []);\n this.totalRecords.set(response.meta?.total ?? 0);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onPageChange(event: any): void {\n this.currentPage.set(event.first / event.rows + 1);\n this.pageSize.set(event.rows);\n this.loadTemplates();\n }\n\n async onTestSend(template: IEmailTemplate): Promise<void> {\n this.selectedTemplate.set(template);\n this.testSendModel = { configId: '', recipient: '' };\n this.variableValues = {}; // Reset variable values\n this.showTestDialog = true;\n await this.loadConfigs();\n }\n\n async loadConfigs(): Promise<void> {\n this.isLoadingConfigs.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.getAll('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: { isActive: true },\n select: [],\n sort: {},\n }),\n );\n if (response.success) {\n this.configs.set(response.data ?? []);\n }\n } finally {\n this.isLoadingConfigs.set(false);\n }\n }\n\n async sendTestEmail(): Promise<void> {\n const template = this.selectedTemplate();\n if (!template || !this.testSendModel.configId || !this.testSendModel.recipient) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Validation',\n detail: 'Please select a configuration and enter recipient email.',\n });\n return;\n }\n\n this.isSendingTest.set(true);\n try {\n // Build variables object (only include non-empty values)\n const variables: Record<string, string> = {};\n for (const [key, value] of Object.entries(this.variableValues)) {\n if (value) {\n variables[key] = value;\n }\n }\n\n const response = await firstValueFrom(\n this.emailSendService.sendTemplate({\n templateId: template.id,\n to: this.testSendModel.recipient,\n emailConfigId: this.testSendModel.configId,\n variables: Object.keys(variables).length > 0 ? variables : undefined,\n }),\n );\n\n if (response.data?.success) {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Test email sent! Message ID: ${response.data.messageId}`,\n });\n this.showTestDialog = false;\n } else {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: response.data?.error || 'Failed to send test email.',\n });\n }\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to send test email.',\n });\n } finally {\n this.isSendingTest.set(false);\n }\n }\n\n onDelete(template: IEmailTemplate): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${template.name}\"?`,\n header: 'Delete Template',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.templateService.deleteAsync({ id: template.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Template deleted successfully.',\n });\n this.loadTemplates();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to delete template.',\n });\n }\n },\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -451,15 +451,15 @@ const EMAIL_ROUTES = [
|
|
|
451
451
|
children: [
|
|
452
452
|
{
|
|
453
453
|
path: '',
|
|
454
|
-
loadComponent: () => import('./flusys-ng-email-template-list.component-
|
|
454
|
+
loadComponent: () => import('./flusys-ng-email-template-list.component-BLhlPM6H.mjs').then((m) => m.TemplateListComponent),
|
|
455
455
|
},
|
|
456
456
|
{
|
|
457
457
|
path: 'new',
|
|
458
|
-
loadComponent: () => import('./flusys-ng-email-template-form.component-
|
|
458
|
+
loadComponent: () => import('./flusys-ng-email-template-form.component-wM4L0S0b.mjs').then((m) => m.TemplateFormComponent),
|
|
459
459
|
},
|
|
460
460
|
{
|
|
461
461
|
path: ':id',
|
|
462
|
-
loadComponent: () => import('./flusys-ng-email-template-form.component-
|
|
462
|
+
loadComponent: () => import('./flusys-ng-email-template-form.component-wM4L0S0b.mjs').then((m) => m.TemplateFormComponent),
|
|
463
463
|
},
|
|
464
464
|
],
|
|
465
465
|
},
|
|
@@ -469,7 +469,7 @@ const EMAIL_ROUTES = [
|
|
|
469
469
|
children: [
|
|
470
470
|
{
|
|
471
471
|
path: '',
|
|
472
|
-
loadComponent: () => import('./flusys-ng-email-email-config-list.component-
|
|
472
|
+
loadComponent: () => import('./flusys-ng-email-email-config-list.component-DxRpA8ht.mjs').then((m) => m.EmailConfigListComponent),
|
|
473
473
|
},
|
|
474
474
|
{
|
|
475
475
|
path: 'new',
|
|
@@ -504,10 +504,10 @@ class EmailContainerComponent {
|
|
|
504
504
|
<div class="email-page p-4">
|
|
505
505
|
<div class="email-header mb-4">
|
|
506
506
|
<h1 class="text-2xl font-bold m-0">Email</h1>
|
|
507
|
-
<p class="text-
|
|
507
|
+
<p class="text-muted-color mt-1">Manage email templates and provider configurations</p>
|
|
508
508
|
</div>
|
|
509
509
|
|
|
510
|
-
<div class="email-tabs flex gap-1 mb-4 border-b border-
|
|
510
|
+
<div class="email-tabs flex gap-1 mb-4 border-b border-surface-200">
|
|
511
511
|
@for (tab of tabs; track tab.id) {
|
|
512
512
|
<a
|
|
513
513
|
[routerLink]="tab.route"
|
|
@@ -531,10 +531,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
531
531
|
<div class="email-page p-4">
|
|
532
532
|
<div class="email-header mb-4">
|
|
533
533
|
<h1 class="text-2xl font-bold m-0">Email</h1>
|
|
534
|
-
<p class="text-
|
|
534
|
+
<p class="text-muted-color mt-1">Manage email templates and provider configurations</p>
|
|
535
535
|
</div>
|
|
536
536
|
|
|
537
|
-
<div class="email-tabs flex gap-1 mb-4 border-b border-
|
|
537
|
+
<div class="email-tabs flex gap-1 mb-4 border-b border-surface-200">
|
|
538
538
|
@for (tab of tabs; track tab.id) {
|
|
539
539
|
<a
|
|
540
540
|
[routerLink]="tab.route"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-email.mjs","sources":["../../../projects/ng-email/enums/email-provider.enum.ts","../../../projects/ng-email/enums/email-block-type.enum.ts","../../../projects/ng-email/interfaces/email-schema.interface.ts","../../../projects/ng-email/services/email-config-api.service.ts","../../../projects/ng-email/services/email-template-api.service.ts","../../../projects/ng-email/services/email-send.service.ts","../../../projects/ng-email/services/email-builder-state.service.ts","../../../projects/ng-email/routes/email.routes.ts","../../../projects/ng-email/pages/email-container/email-container.component.ts","../../../projects/ng-email/public-api.ts","../../../projects/ng-email/flusys-ng-email.ts"],"sourcesContent":["/**\n * Supported email provider types\n */\nexport enum EmailProviderEnum {\n SMTP = 'smtp',\n SENDGRID = 'sendgrid',\n MAILGUN = 'mailgun',\n}\n","/**\n * Email content block types\n */\nexport enum EmailBlockType {\n TEXT = 'text',\n IMAGE = 'image',\n BUTTON = 'button',\n DIVIDER = 'divider',\n HTML = 'html',\n}\n","import { EmailBlockType } from '../enums/email-block-type.enum';\n\n/**\n * Email template variable definition\n */\nexport interface IEmailTemplateVariable {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date';\n required?: boolean;\n defaultValue?: string;\n description?: string;\n}\n\n/**\n * Email section style\n */\nexport interface IEmailSectionStyle {\n backgroundColor?: string;\n padding?: string;\n maxWidth?: string;\n}\n\n/**\n * Email block style\n */\nexport interface IEmailBlockStyle {\n textAlign?: 'left' | 'center' | 'right';\n padding?: string;\n margin?: string;\n backgroundColor?: string;\n}\n\n/**\n * Text block content\n */\nexport interface ITextBlockContent {\n text: string;\n html?: string;\n}\n\n/**\n * Image block content\n */\nexport interface IImageBlockContent {\n src: string;\n alt?: string;\n link?: string;\n width?: string;\n height?: string;\n}\n\n/**\n * Button block content\n */\nexport interface IButtonBlockContent {\n text: string;\n link: string;\n backgroundColor?: string;\n textColor?: string;\n borderRadius?: string;\n}\n\n/**\n * Divider block content\n */\nexport interface IDividerBlockContent {\n height?: string;\n color?: string;\n style?: 'solid' | 'dashed' | 'dotted';\n}\n\n/**\n * HTML block content\n */\nexport interface IHtmlBlockContent {\n html: string;\n}\n\n/**\n * Email content block\n */\nexport interface IEmailBlock {\n id: string;\n type: EmailBlockType;\n order: number;\n content: ITextBlockContent | IImageBlockContent | IButtonBlockContent | IDividerBlockContent | IHtmlBlockContent;\n style?: IEmailBlockStyle;\n}\n\n/**\n * Email section (header, body, footer)\n */\nexport interface IEmailSection {\n id: string;\n type: 'header' | 'body' | 'footer';\n name: string;\n blocks: IEmailBlock[];\n order: number;\n style?: IEmailSectionStyle;\n}\n\n/**\n * Email schema settings\n */\nexport interface IEmailSettings {\n maxWidth?: string;\n backgroundColor?: string;\n fontFamily?: string;\n baseTextColor?: string;\n}\n\n/**\n * Full email schema structure\n */\nexport interface IEmailSchema {\n id: string;\n version: string;\n name: string;\n subject: string;\n preheader?: string;\n sections: IEmailSection[];\n variables?: IEmailTemplateVariable[];\n settings?: IEmailSettings;\n}\n\n/**\n * Default email settings\n */\nexport const DEFAULT_EMAIL_SETTINGS: IEmailSettings = {\n maxWidth: '600px',\n backgroundColor: '#f5f5f5',\n fontFamily: 'Arial, sans-serif',\n baseTextColor: '#333333',\n};\n\n/**\n * Create a new email schema\n */\nexport function createEmailSchema(partial: Partial<IEmailSchema> = {}): IEmailSchema {\n return {\n id: crypto.randomUUID(),\n version: '1.0.0',\n name: partial.name || 'Untitled Template',\n subject: partial.subject || '',\n sections: partial.sections || [\n { id: crypto.randomUUID(), type: 'header', name: 'Header', blocks: [], order: 0 },\n { id: crypto.randomUUID(), type: 'body', name: 'Body', blocks: [], order: 1 },\n { id: crypto.randomUUID(), type: 'footer', name: 'Footer', blocks: [], order: 2 },\n ],\n settings: { ...DEFAULT_EMAIL_SETTINGS, ...partial.settings },\n variables: partial.variables || [],\n ...partial,\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { IEmailConfig, IUpdateEmailConfigDto } from '../interfaces/email-config.interface';\nimport { Observable } from 'rxjs';\nimport { ITestSendResult } from '../interfaces/email-send.interface';\n\n/**\n * Email Config API Service\n * Handles email configuration CRUD operations\n * Endpoint: POST /email/email-config/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailConfigApiService extends ApiResourceService<\n IUpdateEmailConfigDto,\n IEmailConfig\n> {\n private readonly apiBaseUrl: string;\n\n constructor() {\n const http = inject(HttpClient);\n super('email/email-config', http);\n this.apiBaseUrl = inject(APP_CONFIG).apiBaseUrl;\n }\n\n /**\n * Send test email to verify configuration\n */\n sendTest(configId: string, recipient: string): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.apiBaseUrl}/email/send/test`,\n { emailConfigId: configId, recipient },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { IEmailTemplate, IUpdateEmailTemplateDto } from '../interfaces/email-template.interface';\nimport { Observable } from 'rxjs';\n\n/**\n * Email Template API Service\n * Handles email template CRUD operations\n * Endpoint: POST /email/email-template/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailTemplateApiService extends ApiResourceService<\n IUpdateEmailTemplateDto,\n IEmailTemplate\n> {\n constructor() {\n const http = inject(HttpClient);\n super('email/email-template', http);\n }\n\n /**\n * Get template by slug (POST-only RPC pattern)\n */\n getBySlug(slug: string): Observable<ISingleResponse<IEmailTemplate | null>> {\n return this.http.post<ISingleResponse<IEmailTemplate | null>>(\n `${this.baseUrl}/get-by-slug`,\n { slug },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ISendEmailDto,\n ISendTemplateEmailDto,\n ITestSendDto,\n ITestSendResult,\n} from '../interfaces/email-send.interface';\n\n/**\n * Email Send Service\n * Handles sending emails directly or using templates\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailSendService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(APP_CONFIG).apiBaseUrl;\n\n /**\n * Send email directly (without template)\n */\n sendDirect(dto: ISendEmailDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/direct`,\n dto,\n );\n }\n\n /**\n * Send email using template\n */\n sendTemplate(dto: ISendTemplateEmailDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/template`,\n dto,\n );\n }\n\n /**\n * Send test email (for testing configuration)\n */\n sendTest(dto: ITestSendDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/test`,\n { emailConfigId: dto.configId, recipient: dto.recipient },\n );\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport {\n IEmailSchema,\n IEmailSection,\n IEmailBlock,\n IEmailSettings,\n createEmailSchema,\n DEFAULT_EMAIL_SETTINGS,\n} from '../interfaces/email-schema.interface';\nimport { EmailBlockType } from '../enums/email-block-type.enum';\n\n/**\n * Manages the email builder UI state including schema, selection, and UI toggles.\n * Should be provided at the EmailBuilder component level (not root).\n */\n@Injectable()\nexport class EmailBuilderStateService {\n // Schema state\n private readonly _schema = signal<IEmailSchema>(createEmailSchema());\n private readonly _isDirty = signal(false);\n\n // Selection state\n private readonly _selectedSectionId = signal<string | null>(null);\n private readonly _selectedBlockId = signal<string | null>(null);\n\n // View mode\n private readonly _viewMode = signal<'visual' | 'html'>('visual');\n\n // Public readonly signals\n readonly schema = this._schema.asReadonly();\n readonly isDirty = this._isDirty.asReadonly();\n readonly selectedSectionId = this._selectedSectionId.asReadonly();\n readonly selectedBlockId = this._selectedBlockId.asReadonly();\n readonly viewMode = this._viewMode.asReadonly();\n\n // Computed signals\n readonly sections = computed(() => this._schema().sections);\n readonly templateName = computed(() => this._schema().name);\n readonly subject = computed(() => this._schema().subject);\n readonly settings = computed(() => this._schema().settings ?? DEFAULT_EMAIL_SETTINGS);\n readonly variables = computed(() => this._schema().variables ?? []);\n\n readonly headerSection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'header') ?? null;\n });\n\n readonly bodySection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'body') ?? null;\n });\n\n readonly footerSection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'footer') ?? null;\n });\n\n readonly selectedSection = computed((): IEmailSection | null => {\n const sectionId = this._selectedSectionId();\n if (!sectionId) return null;\n return this.sections().find((s) => s.id === sectionId) ?? null;\n });\n\n readonly selectedBlock = computed((): IEmailBlock | null => {\n const blockId = this._selectedBlockId();\n if (!blockId) return null;\n for (const section of this.sections()) {\n const block = section.blocks.find((b) => b.id === blockId);\n if (block) return block;\n }\n return null;\n });\n\n readonly allBlocks = computed((): IEmailBlock[] => {\n return this.sections().flatMap((s) => s.blocks);\n });\n\n // =========================================\n // Schema Operations\n // =========================================\n\n /**\n * Load an existing schema into the builder\n */\n loadSchema(schema: IEmailSchema): void {\n const cloned = structuredClone(schema);\n this._schema.set(cloned);\n this._isDirty.set(false);\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Create a new empty schema\n */\n createNewSchema(name: string = 'Untitled Template'): void {\n this._schema.set(createEmailSchema({ name }));\n this._isDirty.set(true);\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Update template metadata\n */\n updateSchemaMeta(\n updates: Partial<Pick<IEmailSchema, 'name' | 'subject' | 'preheader' | 'settings' | 'variables'>>,\n ): void {\n this._schema.update((schema) => ({\n ...schema,\n ...updates,\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Mark schema as saved (clears dirty flag)\n */\n markAsSaved(): void {\n this._isDirty.set(false);\n }\n\n /**\n * Set view mode (visual or html)\n */\n setViewMode(mode: 'visual' | 'html'): void {\n this._viewMode.set(mode);\n }\n\n // =========================================\n // Section Operations\n // =========================================\n\n /**\n * Update section properties\n */\n updateSection(sectionId: string, updates: Partial<IEmailSection>): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) =>\n s.id === sectionId ? { ...s, ...updates } : s,\n ),\n }));\n this._isDirty.set(true);\n }\n\n // =========================================\n // Block Operations\n // =========================================\n\n /**\n * Add a new block to a section\n */\n addBlock(\n sectionId: string,\n blockType: EmailBlockType,\n block?: Partial<IEmailBlock>,\n ): string | null {\n const newBlock: IEmailBlock = {\n id: crypto.randomUUID(),\n type: blockType,\n order: 0,\n content: this.getDefaultContent(blockType),\n ...block,\n };\n\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = [...s.blocks, newBlock];\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n\n this._isDirty.set(true);\n return newBlock.id;\n }\n\n /**\n * Update block properties\n */\n updateBlock(sectionId: string, blockId: string, updates: Partial<IEmailBlock>): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n return {\n ...s,\n blocks: s.blocks.map((b) => (b.id === blockId ? { ...b, ...updates } : b)),\n };\n }),\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Delete a block from a section\n */\n deleteBlock(sectionId: string, blockId: string): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = s.blocks.filter((b) => b.id !== blockId);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n this._isDirty.set(true);\n\n // Clear selection if deleted block was selected\n if (this._selectedBlockId() === blockId) {\n this._selectedBlockId.set(null);\n }\n }\n\n /**\n * Reorder blocks within a section\n */\n reorderBlocks(sectionId: string, fromIndex: number, toIndex: number): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = [...s.blocks];\n const [removed] = blocks.splice(fromIndex, 1);\n blocks.splice(toIndex, 0, removed);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Duplicate a block\n */\n duplicateBlock(sectionId: string, blockId: string): string | null {\n const section = this.sections().find((s) => s.id === sectionId);\n const block = section?.blocks.find((b) => b.id === blockId);\n if (!block) return null;\n\n const newBlock: IEmailBlock = {\n ...structuredClone(block),\n id: crypto.randomUUID(),\n };\n\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blockIndex = s.blocks.findIndex((b) => b.id === blockId);\n const blocks = [...s.blocks];\n blocks.splice(blockIndex + 1, 0, newBlock);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n\n this._isDirty.set(true);\n return newBlock.id;\n }\n\n // =========================================\n // Selection Operations\n // =========================================\n\n /**\n * Select a section\n */\n selectSection(sectionId: string | null): void {\n this._selectedSectionId.set(sectionId);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Select a block\n */\n selectBlock(blockId: string | null): void {\n if (blockId) {\n // Find the section containing this block\n for (const section of this.sections()) {\n if (section.blocks.some((b) => b.id === blockId)) {\n this._selectedSectionId.set(section.id);\n break;\n }\n }\n }\n this._selectedBlockId.set(blockId);\n }\n\n /**\n * Clear all selection\n */\n clearSelection(): void {\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n // =========================================\n // Helper Methods\n // =========================================\n\n /**\n * Get default content for a block type\n */\n private getDefaultContent(type: EmailBlockType): Record<string, any> {\n switch (type) {\n case EmailBlockType.TEXT:\n return { text: 'Enter your text here...', html: '<p>Enter your text here...</p>' };\n case EmailBlockType.IMAGE:\n return { src: '', alt: 'Image' };\n case EmailBlockType.BUTTON:\n return {\n text: 'Click Here',\n link: 'https://',\n backgroundColor: '#007bff',\n textColor: '#ffffff',\n borderRadius: '4px',\n };\n case EmailBlockType.DIVIDER:\n return { height: '1px', color: '#cccccc', style: 'solid' };\n case EmailBlockType.HTML:\n return { html: '<!-- Custom HTML -->' };\n default:\n return {};\n }\n }\n}\n","import { Routes } from '@angular/router';\n\n/**\n * Email module routes\n */\nexport const EMAIL_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/email-container/email-container.component').then(\n (m) => m.EmailContainerComponent,\n ),\n children: [\n // Templates\n {\n path: 'templates',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/template/template-list.component').then(\n (m) => m.TemplateListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/template/template-form.component').then(\n (m) => m.TemplateFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/template/template-form.component').then(\n (m) => m.TemplateFormComponent,\n ),\n },\n ],\n },\n // Configs\n {\n path: 'configs',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/config/email-config-list.component').then(\n (m) => m.EmailConfigListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/config/email-config-form.component').then(\n (m) => m.EmailConfigFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/config/email-config-form.component').then(\n (m) => m.EmailConfigFormComponent,\n ),\n },\n ],\n },\n // Default redirect\n {\n path: '',\n redirectTo: 'templates',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n}\n\n/**\n * Email container component with tab navigation\n */\n@Component({\n selector: 'lib-email-container',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n template: `\n <div class=\"email-page p-4\">\n <div class=\"email-header mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">Email</h1>\n <p class=\"text-gray-500 mt-1\">Manage email templates and provider configurations</p>\n </div>\n\n <div class=\"email-tabs flex gap-1 mb-4 border-b border-gray-200\">\n @for (tab of tabs; track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"active\"\n class=\"tab-link flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <div class=\"email-content\">\n <router-outlet />\n </div>\n </div>\n `,\n styles: [\n `\n .tab-link {\n color: var(--text-color-secondary, #6b7280);\n text-decoration: none;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n }\n .tab-link.active {\n color: var(--primary-color, #3b82f6);\n border-bottom-color: var(--primary-color, #3b82f6);\n background-color: var(--surface-ground, #f9fafb);\n }\n .tab-link:hover:not(.active) {\n background-color: var(--surface-hover, #f3f4f6);\n }\n `,\n ],\n})\nexport class EmailContainerComponent {\n readonly tabs: ITab[] = [\n { id: 'templates', label: 'Templates', icon: 'pi pi-file', route: 'templates' },\n { id: 'configs', label: 'Configurations', icon: 'pi pi-cog', route: 'configs' },\n ];\n}\n","// =============================================================================\n// @flusys/ng-email - Email Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport { EmailConfigApiService } from './services/email-config-api.service';\nexport { EmailTemplateApiService } from './services/email-template-api.service';\nexport { EmailSendService } from './services/email-send.service';\nexport { EmailBuilderStateService } from './services/email-builder-state.service';\n\n// Routes\nexport { EMAIL_ROUTES } from './routes/email.routes';\n\n// Components\nexport { EmailContainerComponent } from './pages/email-container/email-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AAAA;;AAEG;IACS;AAAZ,CAAA,UAAY,iBAAiB,EAAA;AAC3B,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,iBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,iBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,GAAA,EAAA,CAAA,CAAA;;ACH7B;;AAEG;IACS;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EANW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;;AC0H1B;;AAEG;AACI,MAAM,sBAAsB,GAAmB;AACpD,IAAA,QAAQ,EAAE,OAAO;AACjB,IAAA,eAAe,EAAE,SAAS;AAC1B,IAAA,UAAU,EAAE,mBAAmB;AAC/B,IAAA,aAAa,EAAE,SAAS;;AAG1B;;AAEG;AACG,SAAU,iBAAiB,CAAC,OAAA,GAAiC,EAAE,EAAA;IACnE,OAAO;AACL,QAAA,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;AACvB,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,mBAAmB;AACzC,QAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;AAC9B,QAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI;YAC5B,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;YACjF,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;YAC7E,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;AAClF,SAAA;QACD,QAAQ,EAAE,EAAE,GAAG,sBAAsB,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;AAC5D,QAAA,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;AAClC,QAAA,GAAG,OAAO;KACX;AACH;;ACjJA;;;;AAIG;AAIG,MAAO,qBAAsB,SAAQ,kBAG1C,CAAA;AACkB,IAAA,UAAU;AAE3B,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU;IACjD;AAEA;;AAEG;IACH,QAAQ,CAAC,QAAgB,EAAE,SAAiB,EAAA;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,UAAU,kBAAkB,EACpC,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,CACvC;IACH;uGApBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;2FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACTD;;;;AAIG;AAIG,MAAO,uBAAwB,SAAQ,kBAG5C,CAAA;AACC,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC;IACrC;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,IAAY,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,cAAc,EAC7B,EAAE,IAAI,EAAE,CACT;IACH;uGAjBW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACDD;;;AAGG;MAIU,gBAAgB,CAAA;AACV,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU;AAExD;;AAEG;AACH,IAAA,UAAU,CAAC,GAAkB,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,kBAAA,CAAoB,EACnC,GAAG,CACJ;IACH;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,GAA0B,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,oBAAA,CAAsB,EACrC,GAAG,CACJ;IACH;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,GAAiB,EAAA;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,gBAAA,CAAkB,EACjC,EAAE,aAAa,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAC1D;IACH;uGAhCW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACPD;;;AAGG;MAEU,wBAAwB,CAAA;;AAElB,IAAA,OAAO,GAAG,MAAM,CAAe,iBAAiB,EAAE,mDAAC;AACnD,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,oDAAC;;AAGxB,IAAA,kBAAkB,GAAG,MAAM,CAAgB,IAAI,8DAAC;AAChD,IAAA,gBAAgB,GAAG,MAAM,CAAgB,IAAI,4DAAC;;AAG9C,IAAA,SAAS,GAAG,MAAM,CAAoB,QAAQ,qDAAC;;AAGvD,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAClC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AACpC,IAAA,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;AACxD,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACpD,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;;AAGtC,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,oDAAC;AAClD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,wDAAC;AAClD,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,mDAAC;AAChD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,IAAI,sBAAsB,oDAAC;AAC5E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,IAAI,EAAE,qDAAC;AAE1D,IAAA,aAAa,GAAG,QAAQ,CAAC,MAA2B;QAC3D,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI;AACjE,IAAA,CAAC,yDAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAA2B;QACzD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI;AAC/D,IAAA,CAAC,uDAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAA2B;QAC3D,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI;AACjE,IAAA,CAAC,yDAAC;AAEO,IAAA,eAAe,GAAG,QAAQ,CAAC,MAA2B;AAC7D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAC3C,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;QAC3B,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI;AAChE,IAAA,CAAC,2DAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAyB;AACzD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACrC,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;AAC1D,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,KAAK;QACzB;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,yDAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAoB;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AACjD,IAAA,CAAC,qDAAC;;;;AAMF;;AAEG;AACH,IAAA,UAAU,CAAC,MAAoB,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;AACtC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEA;;AAEG;IACH,eAAe,CAAC,OAAe,mBAAmB,EAAA;AAChD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEA;;AAEG;AACH,IAAA,gBAAgB,CACd,OAAiG,EAAA;QAEjG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;AACT,YAAA,GAAG,OAAO;AACX,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEA;;AAEG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,IAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;;;;AAMA;;AAEG;IACH,aAAa,CAAC,SAAiB,EAAE,OAA+B,EAAA;QAC9D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;AACT,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAC9B,CAAC,CAAC,EAAE,KAAK,SAAS,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,CAC9C;AACF,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;;;;AAMA;;AAEG;AACH,IAAA,QAAQ,CACN,SAAiB,EACjB,SAAyB,EACzB,KAA4B,EAAA;AAE5B,QAAA,MAAM,QAAQ,GAAgB;AAC5B,YAAA,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;AACvB,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAC1C,YAAA,GAAG,KAAK;SACT;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;gBAChC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC;;AAEtC,gBAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACvC,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;AACzB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,OAAO,QAAQ,CAAC,EAAE;IACpB;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,SAAiB,EAAE,OAAe,EAAE,OAA6B,EAAA;QAC3E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;gBAChC,OAAO;AACL,oBAAA,GAAG,CAAC;AACJ,oBAAA,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;iBAC3E;AACH,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEA;;AAEG;IACH,WAAW,CAAC,SAAiB,EAAE,OAAe,EAAA;QAC5C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;AAChC,gBAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;;AAEvD,gBAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACvC,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;AACzB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGvB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,OAAO,EAAE;AACvC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC;IACF;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe,EAAA;QACjE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;gBAChC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAC5B,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC;;AAElC,gBAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACvC,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;AACzB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEA;;AAEG;IACH,cAAc,CAAC,SAAiB,EAAE,OAAe,EAAA;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AAC/D,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;AAC3D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAEvB,QAAA,MAAM,QAAQ,GAAgB;YAC5B,GAAG,eAAe,CAAC,KAAK,CAAC;AACzB,YAAA,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;SACxB;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AAC/B,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAClC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,CAAC;AAChC,gBAAA,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;gBAC9D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;;AAE1C,gBAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACvC,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;AACzB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,OAAO,QAAQ,CAAC,EAAE;IACpB;;;;AAMA;;AAEG;AACH,IAAA,aAAa,CAAC,SAAwB,EAAA;AACpC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,EAAE;;YAEX,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACrC,gBAAA,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;oBAChD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvC;gBACF;YACF;QACF;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;IACpC;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;;;;AAMA;;AAEG;AACK,IAAA,iBAAiB,CAAC,IAAoB,EAAA;QAC5C,QAAQ,IAAI;YACV,KAAK,cAAc,CAAC,IAAI;gBACtB,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,gCAAgC,EAAE;YACpF,KAAK,cAAc,CAAC,KAAK;gBACvB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;YAClC,KAAK,cAAc,CAAC,MAAM;gBACxB,OAAO;AACL,oBAAA,IAAI,EAAE,YAAY;AAClB,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,eAAe,EAAE,SAAS;AAC1B,oBAAA,SAAS,EAAE,SAAS;AACpB,oBAAA,YAAY,EAAE,KAAK;iBACpB;YACH,KAAK,cAAc,CAAC,OAAO;AACzB,gBAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;YAC5D,KAAK,cAAc,CAAC,IAAI;AACtB,gBAAA,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;AACzC,YAAA;AACE,gBAAA,OAAO,EAAE;;IAEf;uGA1TW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAxB,wBAAwB,EAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC;;;ACbD;;AAEG;AACI,MAAM,YAAY,GAAW;AAClC,IAAA;AACE,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,aAAa,EAAE,MACb,wEAA4D,CAAC,IAAI,CAC/D,CAAC,CAAC,KAAK,CAAC,CAAC,uBAAuB,CACjC;AACH,QAAA,QAAQ,EAAE;;AAER,YAAA;AACE,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,aAAa,EAAE,MACb,OAAO,wDAA2C,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAC/B;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,wDAA2C,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAC/B;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,wDAA2C,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAC/B;AACJ,qBAAA;AACF,iBAAA;AACF,aAAA;;AAED,YAAA;AACE,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,aAAa,EAAE,MACb,OAAO,4DAA6C,CAAC,CAAC,IAAI,CACxD,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,4DAA6C,CAAC,CAAC,IAAI,CACxD,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,4DAA6C,CAAC,CAAC,IAAI,CACxD,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACF,iBAAA;AACF,aAAA;;AAED,YAAA;AACE,gBAAA,IAAI,EAAE,EAAE;AACR,gBAAA,UAAU,EAAE,WAAW;AACvB,gBAAA,SAAS,EAAE,MAAM;AAClB,aAAA;AACF,SAAA;AACF,KAAA;;;AC/DH;;AAEG;MAiDU,uBAAuB,CAAA;AACzB,IAAA,IAAI,GAAW;AACtB,QAAA,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE;AAC/E,QAAA,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;KAChF;uGAJU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3CxB;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAxBS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,oOAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FA4CvD,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAhDnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cACnB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAA,QAAA,EACzD;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wWAAA,CAAA,EAAA;;;;;;;;AC1CH;AACA;AACA;AAEA;;ACJA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"flusys-ng-email.mjs","sources":["../../../projects/ng-email/enums/email-provider.enum.ts","../../../projects/ng-email/enums/email-block-type.enum.ts","../../../projects/ng-email/interfaces/email-schema.interface.ts","../../../projects/ng-email/services/email-config-api.service.ts","../../../projects/ng-email/services/email-template-api.service.ts","../../../projects/ng-email/services/email-send.service.ts","../../../projects/ng-email/services/email-builder-state.service.ts","../../../projects/ng-email/routes/email.routes.ts","../../../projects/ng-email/pages/email-container/email-container.component.ts","../../../projects/ng-email/public-api.ts","../../../projects/ng-email/flusys-ng-email.ts"],"sourcesContent":["/**\n * Supported email provider types\n */\nexport enum EmailProviderEnum {\n SMTP = 'smtp',\n SENDGRID = 'sendgrid',\n MAILGUN = 'mailgun',\n}\n","/**\n * Email content block types\n */\nexport enum EmailBlockType {\n TEXT = 'text',\n IMAGE = 'image',\n BUTTON = 'button',\n DIVIDER = 'divider',\n HTML = 'html',\n}\n","import { EmailBlockType } from '../enums/email-block-type.enum';\n\n/**\n * Email template variable definition\n */\nexport interface IEmailTemplateVariable {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date';\n required?: boolean;\n defaultValue?: string;\n description?: string;\n}\n\n/**\n * Email section style\n */\nexport interface IEmailSectionStyle {\n backgroundColor?: string;\n padding?: string;\n maxWidth?: string;\n}\n\n/**\n * Email block style\n */\nexport interface IEmailBlockStyle {\n textAlign?: 'left' | 'center' | 'right';\n padding?: string;\n margin?: string;\n backgroundColor?: string;\n}\n\n/**\n * Text block content\n */\nexport interface ITextBlockContent {\n text: string;\n html?: string;\n}\n\n/**\n * Image block content\n */\nexport interface IImageBlockContent {\n src: string;\n alt?: string;\n link?: string;\n width?: string;\n height?: string;\n}\n\n/**\n * Button block content\n */\nexport interface IButtonBlockContent {\n text: string;\n link: string;\n backgroundColor?: string;\n textColor?: string;\n borderRadius?: string;\n}\n\n/**\n * Divider block content\n */\nexport interface IDividerBlockContent {\n height?: string;\n color?: string;\n style?: 'solid' | 'dashed' | 'dotted';\n}\n\n/**\n * HTML block content\n */\nexport interface IHtmlBlockContent {\n html: string;\n}\n\n/**\n * Email content block\n */\nexport interface IEmailBlock {\n id: string;\n type: EmailBlockType;\n order: number;\n content: ITextBlockContent | IImageBlockContent | IButtonBlockContent | IDividerBlockContent | IHtmlBlockContent;\n style?: IEmailBlockStyle;\n}\n\n/**\n * Email section (header, body, footer)\n */\nexport interface IEmailSection {\n id: string;\n type: 'header' | 'body' | 'footer';\n name: string;\n blocks: IEmailBlock[];\n order: number;\n style?: IEmailSectionStyle;\n}\n\n/**\n * Email schema settings\n */\nexport interface IEmailSettings {\n maxWidth?: string;\n backgroundColor?: string;\n fontFamily?: string;\n baseTextColor?: string;\n}\n\n/**\n * Full email schema structure\n */\nexport interface IEmailSchema {\n id: string;\n version: string;\n name: string;\n subject: string;\n preheader?: string;\n sections: IEmailSection[];\n variables?: IEmailTemplateVariable[];\n settings?: IEmailSettings;\n}\n\n/**\n * Default email settings\n */\nexport const DEFAULT_EMAIL_SETTINGS: IEmailSettings = {\n maxWidth: '600px',\n backgroundColor: '#f5f5f5',\n fontFamily: 'Arial, sans-serif',\n baseTextColor: '#333333',\n};\n\n/**\n * Create a new email schema\n */\nexport function createEmailSchema(partial: Partial<IEmailSchema> = {}): IEmailSchema {\n return {\n id: crypto.randomUUID(),\n version: '1.0.0',\n name: partial.name || 'Untitled Template',\n subject: partial.subject || '',\n sections: partial.sections || [\n { id: crypto.randomUUID(), type: 'header', name: 'Header', blocks: [], order: 0 },\n { id: crypto.randomUUID(), type: 'body', name: 'Body', blocks: [], order: 1 },\n { id: crypto.randomUUID(), type: 'footer', name: 'Footer', blocks: [], order: 2 },\n ],\n settings: { ...DEFAULT_EMAIL_SETTINGS, ...partial.settings },\n variables: partial.variables || [],\n ...partial,\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { IEmailConfig, IUpdateEmailConfigDto } from '../interfaces/email-config.interface';\nimport { Observable } from 'rxjs';\nimport { ITestSendResult } from '../interfaces/email-send.interface';\n\n/**\n * Email Config API Service\n * Handles email configuration CRUD operations\n * Endpoint: POST /email/email-config/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailConfigApiService extends ApiResourceService<\n IUpdateEmailConfigDto,\n IEmailConfig\n> {\n private readonly apiBaseUrl: string;\n\n constructor() {\n const http = inject(HttpClient);\n super('email/email-config', http);\n this.apiBaseUrl = inject(APP_CONFIG).apiBaseUrl;\n }\n\n /**\n * Send test email to verify configuration\n */\n sendTest(configId: string, recipient: string): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.apiBaseUrl}/email/send/test`,\n { emailConfigId: configId, recipient },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { IEmailTemplate, IUpdateEmailTemplateDto } from '../interfaces/email-template.interface';\nimport { Observable } from 'rxjs';\n\n/**\n * Email Template API Service\n * Handles email template CRUD operations\n * Endpoint: POST /email/email-template/*\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailTemplateApiService extends ApiResourceService<\n IUpdateEmailTemplateDto,\n IEmailTemplate\n> {\n constructor() {\n const http = inject(HttpClient);\n super('email/email-template', http);\n }\n\n /**\n * Get template by slug (POST-only RPC pattern)\n */\n getBySlug(slug: string): Observable<ISingleResponse<IEmailTemplate | null>> {\n return this.http.post<ISingleResponse<IEmailTemplate | null>>(\n `${this.baseUrl}/get-by-slug`,\n { slug },\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ISendEmailDto,\n ISendTemplateEmailDto,\n ITestSendDto,\n ITestSendResult,\n} from '../interfaces/email-send.interface';\n\n/**\n * Email Send Service\n * Handles sending emails directly or using templates\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EmailSendService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(APP_CONFIG).apiBaseUrl;\n\n /**\n * Send email directly (without template)\n */\n sendDirect(dto: ISendEmailDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/direct`,\n dto,\n );\n }\n\n /**\n * Send email using template\n */\n sendTemplate(dto: ISendTemplateEmailDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/template`,\n dto,\n );\n }\n\n /**\n * Send test email (for testing configuration)\n */\n sendTest(dto: ITestSendDto): Observable<ISingleResponse<ITestSendResult>> {\n return this.http.post<ISingleResponse<ITestSendResult>>(\n `${this.baseUrl}/email/send/test`,\n { emailConfigId: dto.configId, recipient: dto.recipient },\n );\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport {\n IEmailSchema,\n IEmailSection,\n IEmailBlock,\n IEmailSettings,\n createEmailSchema,\n DEFAULT_EMAIL_SETTINGS,\n} from '../interfaces/email-schema.interface';\nimport { EmailBlockType } from '../enums/email-block-type.enum';\n\n/**\n * Manages the email builder UI state including schema, selection, and UI toggles.\n * Should be provided at the EmailBuilder component level (not root).\n */\n@Injectable()\nexport class EmailBuilderStateService {\n // Schema state\n private readonly _schema = signal<IEmailSchema>(createEmailSchema());\n private readonly _isDirty = signal(false);\n\n // Selection state\n private readonly _selectedSectionId = signal<string | null>(null);\n private readonly _selectedBlockId = signal<string | null>(null);\n\n // View mode\n private readonly _viewMode = signal<'visual' | 'html'>('visual');\n\n // Public readonly signals\n readonly schema = this._schema.asReadonly();\n readonly isDirty = this._isDirty.asReadonly();\n readonly selectedSectionId = this._selectedSectionId.asReadonly();\n readonly selectedBlockId = this._selectedBlockId.asReadonly();\n readonly viewMode = this._viewMode.asReadonly();\n\n // Computed signals\n readonly sections = computed(() => this._schema().sections);\n readonly templateName = computed(() => this._schema().name);\n readonly subject = computed(() => this._schema().subject);\n readonly settings = computed(() => this._schema().settings ?? DEFAULT_EMAIL_SETTINGS);\n readonly variables = computed(() => this._schema().variables ?? []);\n\n readonly headerSection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'header') ?? null;\n });\n\n readonly bodySection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'body') ?? null;\n });\n\n readonly footerSection = computed((): IEmailSection | null => {\n return this.sections().find((s) => s.type === 'footer') ?? null;\n });\n\n readonly selectedSection = computed((): IEmailSection | null => {\n const sectionId = this._selectedSectionId();\n if (!sectionId) return null;\n return this.sections().find((s) => s.id === sectionId) ?? null;\n });\n\n readonly selectedBlock = computed((): IEmailBlock | null => {\n const blockId = this._selectedBlockId();\n if (!blockId) return null;\n for (const section of this.sections()) {\n const block = section.blocks.find((b) => b.id === blockId);\n if (block) return block;\n }\n return null;\n });\n\n readonly allBlocks = computed((): IEmailBlock[] => {\n return this.sections().flatMap((s) => s.blocks);\n });\n\n // =========================================\n // Schema Operations\n // =========================================\n\n /**\n * Load an existing schema into the builder\n */\n loadSchema(schema: IEmailSchema): void {\n const cloned = structuredClone(schema);\n this._schema.set(cloned);\n this._isDirty.set(false);\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Create a new empty schema\n */\n createNewSchema(name: string = 'Untitled Template'): void {\n this._schema.set(createEmailSchema({ name }));\n this._isDirty.set(true);\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Update template metadata\n */\n updateSchemaMeta(\n updates: Partial<Pick<IEmailSchema, 'name' | 'subject' | 'preheader' | 'settings' | 'variables'>>,\n ): void {\n this._schema.update((schema) => ({\n ...schema,\n ...updates,\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Mark schema as saved (clears dirty flag)\n */\n markAsSaved(): void {\n this._isDirty.set(false);\n }\n\n /**\n * Set view mode (visual or html)\n */\n setViewMode(mode: 'visual' | 'html'): void {\n this._viewMode.set(mode);\n }\n\n // =========================================\n // Section Operations\n // =========================================\n\n /**\n * Update section properties\n */\n updateSection(sectionId: string, updates: Partial<IEmailSection>): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) =>\n s.id === sectionId ? { ...s, ...updates } : s,\n ),\n }));\n this._isDirty.set(true);\n }\n\n // =========================================\n // Block Operations\n // =========================================\n\n /**\n * Add a new block to a section\n */\n addBlock(\n sectionId: string,\n blockType: EmailBlockType,\n block?: Partial<IEmailBlock>,\n ): string | null {\n const newBlock: IEmailBlock = {\n id: crypto.randomUUID(),\n type: blockType,\n order: 0,\n content: this.getDefaultContent(blockType),\n ...block,\n };\n\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = [...s.blocks, newBlock];\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n\n this._isDirty.set(true);\n return newBlock.id;\n }\n\n /**\n * Update block properties\n */\n updateBlock(sectionId: string, blockId: string, updates: Partial<IEmailBlock>): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n return {\n ...s,\n blocks: s.blocks.map((b) => (b.id === blockId ? { ...b, ...updates } : b)),\n };\n }),\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Delete a block from a section\n */\n deleteBlock(sectionId: string, blockId: string): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = s.blocks.filter((b) => b.id !== blockId);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n this._isDirty.set(true);\n\n // Clear selection if deleted block was selected\n if (this._selectedBlockId() === blockId) {\n this._selectedBlockId.set(null);\n }\n }\n\n /**\n * Reorder blocks within a section\n */\n reorderBlocks(sectionId: string, fromIndex: number, toIndex: number): void {\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blocks = [...s.blocks];\n const [removed] = blocks.splice(fromIndex, 1);\n blocks.splice(toIndex, 0, removed);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n this._isDirty.set(true);\n }\n\n /**\n * Duplicate a block\n */\n duplicateBlock(sectionId: string, blockId: string): string | null {\n const section = this.sections().find((s) => s.id === sectionId);\n const block = section?.blocks.find((b) => b.id === blockId);\n if (!block) return null;\n\n const newBlock: IEmailBlock = {\n ...structuredClone(block),\n id: crypto.randomUUID(),\n };\n\n this._schema.update((schema) => ({\n ...schema,\n sections: schema.sections.map((s) => {\n if (s.id !== sectionId) return s;\n const blockIndex = s.blocks.findIndex((b) => b.id === blockId);\n const blocks = [...s.blocks];\n blocks.splice(blockIndex + 1, 0, newBlock);\n // Update order\n blocks.forEach((b, i) => (b.order = i));\n return { ...s, blocks };\n }),\n }));\n\n this._isDirty.set(true);\n return newBlock.id;\n }\n\n // =========================================\n // Selection Operations\n // =========================================\n\n /**\n * Select a section\n */\n selectSection(sectionId: string | null): void {\n this._selectedSectionId.set(sectionId);\n this._selectedBlockId.set(null);\n }\n\n /**\n * Select a block\n */\n selectBlock(blockId: string | null): void {\n if (blockId) {\n // Find the section containing this block\n for (const section of this.sections()) {\n if (section.blocks.some((b) => b.id === blockId)) {\n this._selectedSectionId.set(section.id);\n break;\n }\n }\n }\n this._selectedBlockId.set(blockId);\n }\n\n /**\n * Clear all selection\n */\n clearSelection(): void {\n this._selectedSectionId.set(null);\n this._selectedBlockId.set(null);\n }\n\n // =========================================\n // Helper Methods\n // =========================================\n\n /**\n * Get default content for a block type\n */\n private getDefaultContent(type: EmailBlockType): Record<string, any> {\n switch (type) {\n case EmailBlockType.TEXT:\n return { text: 'Enter your text here...', html: '<p>Enter your text here...</p>' };\n case EmailBlockType.IMAGE:\n return { src: '', alt: 'Image' };\n case EmailBlockType.BUTTON:\n return {\n text: 'Click Here',\n link: 'https://',\n backgroundColor: '#007bff',\n textColor: '#ffffff',\n borderRadius: '4px',\n };\n case EmailBlockType.DIVIDER:\n return { height: '1px', color: '#cccccc', style: 'solid' };\n case EmailBlockType.HTML:\n return { html: '<!-- Custom HTML -->' };\n default:\n return {};\n }\n }\n}\n","import { Routes } from '@angular/router';\n\n/**\n * Email module routes\n */\nexport const EMAIL_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/email-container/email-container.component').then(\n (m) => m.EmailContainerComponent,\n ),\n children: [\n // Templates\n {\n path: 'templates',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/template/template-list.component').then(\n (m) => m.TemplateListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/template/template-form.component').then(\n (m) => m.TemplateFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/template/template-form.component').then(\n (m) => m.TemplateFormComponent,\n ),\n },\n ],\n },\n // Configs\n {\n path: 'configs',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/config/email-config-list.component').then(\n (m) => m.EmailConfigListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/config/email-config-form.component').then(\n (m) => m.EmailConfigFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/config/email-config-form.component').then(\n (m) => m.EmailConfigFormComponent,\n ),\n },\n ],\n },\n // Default redirect\n {\n path: '',\n redirectTo: 'templates',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n}\n\n/**\n * Email container component with tab navigation\n */\n@Component({\n selector: 'lib-email-container',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n template: `\n <div class=\"email-page p-4\">\n <div class=\"email-header mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">Email</h1>\n <p class=\"text-muted-color mt-1\">Manage email templates and provider configurations</p>\n </div>\n\n <div class=\"email-tabs flex gap-1 mb-4 border-b border-surface-200\">\n @for (tab of tabs; track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"active\"\n class=\"tab-link flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <div class=\"email-content\">\n <router-outlet />\n </div>\n </div>\n `,\n styles: [\n `\n .tab-link {\n color: var(--text-color-secondary, #6b7280);\n text-decoration: none;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n }\n .tab-link.active {\n color: var(--primary-color, #3b82f6);\n border-bottom-color: var(--primary-color, #3b82f6);\n background-color: var(--surface-ground, #f9fafb);\n }\n .tab-link:hover:not(.active) {\n background-color: var(--surface-hover, #f3f4f6);\n }\n `,\n ],\n})\nexport class EmailContainerComponent {\n readonly tabs: ITab[] = [\n { id: 'templates', label: 'Templates', icon: 'pi pi-file', route: 'templates' },\n { id: 'configs', label: 'Configurations', icon: 'pi pi-cog', route: 'configs' },\n ];\n}\n","// =============================================================================\n// @flusys/ng-email - Email Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport { EmailConfigApiService } from './services/email-config-api.service';\nexport { EmailTemplateApiService } from './services/email-template-api.service';\nexport { EmailSendService } from './services/email-send.service';\nexport { EmailBuilderStateService } from './services/email-builder-state.service';\n\n// Routes\nexport { EMAIL_ROUTES } from './routes/email.routes';\n\n// Components\nexport { EmailContainerComponent } from './pages/email-container/email-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flusys/ng-email",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1-beta",
|
|
4
4
|
"description": "Email management module for FLUSYS Angular applications",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"peerDependencies": {
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"@angular/core": "^21.0.0",
|
|
9
9
|
"@angular/forms": "^21.0.0",
|
|
10
10
|
"@angular/router": "^21.0.0",
|
|
11
|
-
"@flusys/ng-core": "^1.1.
|
|
12
|
-
"@flusys/ng-shared": "^1.1.
|
|
11
|
+
"@flusys/ng-core": "^1.1.1-beta",
|
|
12
|
+
"@flusys/ng-shared": "^1.1.1-beta",
|
|
13
13
|
"@primeuix/themes": "^1.0.0",
|
|
14
14
|
"primeicons": "^7.0.0",
|
|
15
15
|
"primeng": "^21.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-email-email-config-list.component-CJhSPkCZ.mjs","sources":["../../../projects/ng-email/pages/config/email-config-list.component.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, inject, signal, OnInit, computed } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { EmailConfigApiService } from '../../services/email-config-api.service';\nimport { IEmailConfig } from '../../interfaces/email-config.interface';\nimport { EmailProviderEnum } from '../../enums/email-provider.enum';\n\n/**\n * Email configuration list component\n */\n@Component({\n selector: 'lib-email-config-list',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormsModule],\n providers: [ConfirmationService, MessageService],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">Email Configurations</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"New Configuration\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\"\n />\n </div>\n\n <p-table\n [value]=\"configs()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Provider</th>\n <th>From Email</th>\n <th>Status</th>\n <th>Created</th>\n <th style=\"width: 150px\">Actions</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-config>\n <tr>\n <td>\n <i [class]=\"getProviderIcon(config.provider)\" class=\"mr-2\"></i>\n {{ config.name }}\n </td>\n <td>\n <p-tag\n [value]=\"getProviderLabel(config.provider)\"\n [severity]=\"getProviderSeverity(config.provider)\"\n />\n </td>\n <td>{{ config.fromEmail || '-' }}</td>\n <td>\n <p-tag\n [value]=\"config.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"config.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td>{{ config.createdAt | date: 'short' }}</td>\n <td>\n <p-button\n icon=\"pi pi-send\"\n [text]=\"true\"\n size=\"small\"\n pTooltip=\"Test\"\n (onClick)=\"onTest(config)\"\n />\n <p-button\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(config.id)\"\n />\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onDelete(config)\"\n />\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-4\">\n No email configurations found. Add a provider to start sending emails.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n <!-- Test Email Dialog -->\n <p-dialog\n header=\"Test Email Configuration\"\n [(visible)]=\"showTestDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '400px' }\"\n >\n <div class=\"grid gap-4\">\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Configuration</label>\n <input\n pInputText\n [value]=\"selectedConfig()?.name || ''\"\n class=\"w-full\"\n [disabled]=\"true\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Provider</label>\n <p-tag\n [value]=\"getProviderLabel(selectedConfig()?.provider || '')\"\n [severity]=\"getProviderSeverity(selectedConfig()?.provider || '')\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Recipient Email *</label>\n <input\n pInputText\n [(ngModel)]=\"testRecipient\"\n class=\"w-full\"\n placeholder=\"recipient@example.com\"\n type=\"email\"\n />\n <small class=\"text-gray-500 mt-1 block\">\n A test email will be sent to this address\n </small>\n </div>\n </div>\n\n <ng-template #footer>\n <p-button\n label=\"Cancel\"\n [text]=\"true\"\n (onClick)=\"showTestDialog = false\"\n />\n <p-button\n label=\"Send Test\"\n icon=\"pi pi-send\"\n [loading]=\"isSendingTest()\"\n (onClick)=\"sendTestEmail()\"\n />\n </ng-template>\n </p-dialog>\n\n <p-confirmDialog />\n <p-toast />\n `,\n})\nexport class EmailConfigListComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly configService = inject(EmailConfigApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly configs = signal<IEmailConfig[]>([]);\n readonly totalRecords = signal(0);\n readonly pageSize = signal(10);\n readonly currentPage = signal(1);\n\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n // Test dialog state\n showTestDialog = false;\n readonly selectedConfig = signal<IEmailConfig | null>(null);\n readonly isSendingTest = signal(false);\n testRecipient = '';\n\n ngOnInit(): void {\n this.loadConfigs();\n }\n\n onCreate(): void {\n this.router.navigate(['/email/configs/new']);\n }\n\n onEdit(configId: string): void {\n this.router.navigate(['/email/configs', configId]);\n }\n\n async loadConfigs(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.getAll('', {\n pagination: {\n currentPage: this.currentPage() - 1,\n pageSize: this.pageSize(),\n },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.configs.set(response.data ?? []);\n this.totalRecords.set(response.meta?.total ?? 0);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onPageChange(event: any): void {\n this.currentPage.set(event.first / event.rows + 1);\n this.pageSize.set(event.rows);\n this.loadConfigs();\n }\n\n getProviderIcon(provider: EmailProviderEnum): string {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'pi pi-server';\n case EmailProviderEnum.SENDGRID:\n return 'pi pi-cloud';\n case EmailProviderEnum.MAILGUN:\n return 'pi pi-cloud';\n default:\n return 'pi pi-envelope';\n }\n }\n\n getProviderLabel(provider: EmailProviderEnum | string): string {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'SMTP';\n case EmailProviderEnum.SENDGRID:\n return 'SendGrid';\n case EmailProviderEnum.MAILGUN:\n return 'Mailgun';\n default:\n return provider || '';\n }\n }\n\n getProviderSeverity(\n provider: EmailProviderEnum | string,\n ): 'success' | 'secondary' | 'info' | 'warn' | 'danger' | 'contrast' {\n switch (provider) {\n case EmailProviderEnum.SMTP:\n return 'info';\n case EmailProviderEnum.SENDGRID:\n return 'success';\n case EmailProviderEnum.MAILGUN:\n return 'warn';\n default:\n return 'secondary';\n }\n }\n\n onTest(config: IEmailConfig): void {\n this.selectedConfig.set(config);\n this.testRecipient = '';\n this.showTestDialog = true;\n }\n\n async sendTestEmail(): Promise<void> {\n const config = this.selectedConfig();\n if (!config || !this.testRecipient) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Validation',\n detail: 'Please enter a recipient email address.',\n });\n return;\n }\n\n this.isSendingTest.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.sendTest(config.id, this.testRecipient),\n );\n\n if (response.data?.success) {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Test email sent successfully! Message ID: ${response.data.messageId}`,\n });\n this.showTestDialog = false;\n } else {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: response.data?.error || 'Failed to send test email.',\n });\n }\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to send test email.',\n });\n } finally {\n this.isSendingTest.set(false);\n }\n }\n\n onDelete(config: IEmailConfig): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${config.name}\"?`,\n header: 'Delete Configuration',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.configService.deleteAsync({ id: config.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Configuration deleted successfully.',\n });\n this.loadConfigs();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to delete configuration.',\n });\n }\n },\n });\n }\n}\n"],"names":["i6","i7","i8","i9","i10"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAYA;;AAEG;MAkKU,wBAAwB,CAAA;AAClB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC7C,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;AAC9B,IAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAElD,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACzB,IAAA,OAAO,GAAG,MAAM,CAAiB,EAAE,mDAAC;AACpC,IAAA,YAAY,GAAG,MAAM,CAAC,CAAC,wDAAC;AACxB,IAAA,QAAQ,GAAG,MAAM,CAAC,EAAE,oDAAC;AACrB,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,uDAAC;AAEvB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACrE,IAAA,kBAAkB,GAAG,QAAQ,CACpC,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,EAAE,IAAI,IAAI,gBAAgB,8DACzE;;IAGD,cAAc,GAAG,KAAK;AACb,IAAA,cAAc,GAAG,MAAM,CAAsB,IAAI,0DAAC;AAClD,IAAA,aAAa,GAAG,MAAM,CAAC,KAAK,yDAAC;IACtC,aAAa,GAAG,EAAE;IAElB,QAAQ,GAAA;QACN,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC9C;AAEA,IAAA,MAAM,CAAC,QAAgB,EAAA;QACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IACpD;AAEA,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE;AAC5B,gBAAA,UAAU,EAAE;AACV,oBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;AACnC,oBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,iBAAA;AACD,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,IAAI,EAAE,EAAE;AACT,aAAA,CAAC,CACH;AAED,YAAA,IAAI,QAAQ,CAAC,OAAO,EAAE;gBACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;AACrC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;YAClD;QACF;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA,IAAA,eAAe,CAAC,QAA2B,EAAA;QACzC,QAAQ,QAAQ;YACd,KAAK,iBAAiB,CAAC,IAAI;AACzB,gBAAA,OAAO,cAAc;YACvB,KAAK,iBAAiB,CAAC,QAAQ;AAC7B,gBAAA,OAAO,aAAa;YACtB,KAAK,iBAAiB,CAAC,OAAO;AAC5B,gBAAA,OAAO,aAAa;AACtB,YAAA;AACE,gBAAA,OAAO,gBAAgB;;IAE7B;AAEA,IAAA,gBAAgB,CAAC,QAAoC,EAAA;QACnD,QAAQ,QAAQ;YACd,KAAK,iBAAiB,CAAC,IAAI;AACzB,gBAAA,OAAO,MAAM;YACf,KAAK,iBAAiB,CAAC,QAAQ;AAC7B,gBAAA,OAAO,UAAU;YACnB,KAAK,iBAAiB,CAAC,OAAO;AAC5B,gBAAA,OAAO,SAAS;AAClB,YAAA;gBACE,OAAO,QAAQ,IAAI,EAAE;;IAE3B;AAEA,IAAA,mBAAmB,CACjB,QAAoC,EAAA;QAEpC,QAAQ,QAAQ;YACd,KAAK,iBAAiB,CAAC,IAAI;AACzB,gBAAA,OAAO,MAAM;YACf,KAAK,iBAAiB,CAAC,QAAQ;AAC7B,gBAAA,OAAO,SAAS;YAClB,KAAK,iBAAiB,CAAC,OAAO;AAC5B,gBAAA,OAAO,MAAM;AACf,YAAA;AACE,gBAAA,OAAO,WAAW;;IAExB;AAEA,IAAA,MAAM,CAAC,MAAoB,EAAA;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;IAC5B;AAEA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;QACpC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AAClC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,MAAM;AAChB,gBAAA,OAAO,EAAE,YAAY;AACrB,gBAAA,MAAM,EAAE,yCAAyC;AAClD,aAAA,CAAC;YACF;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAC3D;AAED,YAAA,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE;AAC1B,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,OAAO,EAAE,SAAS;AAClB,oBAAA,MAAM,EAAE,CAAA,0CAAA,EAA6C,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAA,CAAE;AAC/E,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK;YAC7B;iBAAO;AACL,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,oBAAA,QAAQ,EAAE,OAAO;AACjB,oBAAA,OAAO,EAAE,OAAO;AAChB,oBAAA,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,4BAA4B;AAC7D,iBAAA,CAAC;YACJ;QACF;QAAE,OAAO,KAAU,EAAE;AACnB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,MAAM,EAAE,KAAK,EAAE,OAAO,IAAI,4BAA4B;AACvD,aAAA,CAAC;QACJ;gBAAU;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;AAEA,IAAA,QAAQ,CAAC,MAAoB,EAAA;AAC3B,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAC/B,YAAA,OAAO,EAAE,CAAA,iCAAA,EAAoC,MAAM,CAAC,IAAI,CAAA,EAAA,CAAI;AAC5D,YAAA,MAAM,EAAE,sBAAsB;AAC9B,YAAA,IAAI,EAAE,4BAA4B;AAClC,YAAA,sBAAsB,EAAE,iBAAiB;YACzC,MAAM,EAAE,YAAW;AACjB,gBAAA,IAAI;AACF,oBAAA,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACvE,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,SAAS;AACnB,wBAAA,OAAO,EAAE,SAAS;AAClB,wBAAA,MAAM,EAAE,qCAAqC;AAC9C,qBAAA,CAAC;oBACF,IAAI,CAAC,WAAW,EAAE;gBACpB;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,MAAM,EAAE,iCAAiC;AAC1C,qBAAA,CAAC;gBACJ;YACF,CAAC;AACF,SAAA,CAAC;IACJ;uGApLW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,oEA5JxB,CAAC,mBAAmB,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EACtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyJT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA3JS,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,KAAA,EAAA,UAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,aAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,eAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,4BAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FA6JtC,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAjKpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC;AAClD,oBAAA,SAAS,EAAE,CAAC,mBAAmB,EAAE,cAAc,CAAC;AAChD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyJT,EAAA,CAAA;AACF,iBAAA;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-email-template-form.component-DjzG_lG1.mjs","sources":["../../../projects/ng-email/pages/template/template-form.component.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n inject,\n signal,\n computed,\n OnInit,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { MessageService } from 'primeng/api';\nimport { PrimeModule } from '@flusys/ng-shared';\nimport { EmailTemplateApiService } from '../../services/email-template-api.service';\nimport { EmailBuilderStateService } from '../../services/email-builder-state.service';\nimport { IEmailTemplate } from '../../interfaces/email-template.interface';\nimport { createEmailSchema } from '../../interfaces/email-schema.interface';\n\n/**\n * Email template form component (create/edit)\n */\n@Component({\n selector: 'lib-template-form',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n RouterLink,\n FormsModule,\n PrimeModule,\n ],\n providers: [MessageService, EmailBuilderStateService],\n template: `\n <div class=\"template-form\">\n <!-- Header -->\n <div class=\"flex justify-between items-center mb-4\">\n <div class=\"flex items-center gap-2\">\n <p-button\n icon=\"pi pi-arrow-left\"\n [text]=\"true\"\n routerLink=\"../\"\n />\n <h2 class=\"text-xl font-semibold\">\n {{ isEditMode() ? 'Edit Template' : 'New Template' }}\n </h2>\n </div>\n <div class=\"flex gap-2\">\n <p-button\n label=\"Cancel\"\n [text]=\"true\"\n routerLink=\"../\"\n />\n <p-button\n label=\"Save\"\n icon=\"pi pi-save\"\n [loading]=\"isLoading()\"\n (onClick)=\"onSave()\"\n />\n </div>\n </div>\n\n <!-- Form Fields -->\n <div class=\"card mb-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field\">\n <label for=\"name\" class=\"block font-medium mb-2\">Template Name *</label>\n <input\n pInputText\n id=\"name\"\n [(ngModel)]=\"formModel.name\"\n class=\"w-full\"\n placeholder=\"e.g., Welcome Email\"\n />\n </div>\n\n <div class=\"field\">\n <label for=\"slug\" class=\"block font-medium mb-2\">Slug *</label>\n <input\n pInputText\n id=\"slug\"\n [(ngModel)]=\"formModel.slug\"\n class=\"w-full\"\n placeholder=\"e.g., welcome-email\"\n />\n </div>\n\n <div class=\"field md:col-span-2\">\n <label for=\"subject\" class=\"block font-medium mb-2\">Subject *</label>\n <input\n pInputText\n id=\"subject\"\n [(ngModel)]=\"formModel.subject\"\n class=\"w-full\"\n [placeholder]=\"'e.g., Welcome to ' + '{{' + 'appName' + '}}' + '!'\"\n />\n <small class=\"text-gray-500\">Use {{ '{{variableName}}' }} for dynamic content</small>\n </div>\n\n <div class=\"field\">\n <label for=\"description\" class=\"block font-medium mb-2\">Description</label>\n <input\n pInputText\n id=\"description\"\n [(ngModel)]=\"formModel.description\"\n class=\"w-full\"\n placeholder=\"Brief description of the template\"\n />\n </div>\n\n <div class=\"field flex items-center gap-2\">\n <p-toggleswitch [(ngModel)]=\"formModel.isActive\" />\n <label>Active</label>\n </div>\n </div>\n </div>\n\n <!-- Content Editor & Preview -->\n <div class=\"grid grid-cols-1 gap-4\" [class.lg:grid-cols-2]=\"editorMode() === 'html'\">\n <!-- Editor Panel -->\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-3\">\n <h3 class=\"font-semibold\">Content</h3>\n <div class=\"flex gap-1\">\n <p-button\n label=\"HTML\"\n [outlined]=\"editorMode() !== 'html'\"\n [severity]=\"editorMode() === 'html' ? 'primary' : 'secondary'\"\n size=\"small\"\n (onClick)=\"setEditorMode('html')\"\n />\n <p-button\n label=\"Plain Text\"\n [outlined]=\"editorMode() !== 'text'\"\n [severity]=\"editorMode() === 'text' ? 'primary' : 'secondary'\"\n size=\"small\"\n (onClick)=\"setEditorMode('text')\"\n />\n </div>\n </div>\n\n @if (editorMode() === 'html') {\n <textarea\n pTextarea\n [(ngModel)]=\"formModel.htmlContent\"\n class=\"w-full font-mono text-sm\"\n rows=\"20\"\n placeholder=\"<html>...</html>\"\n (ngModelChange)=\"onContentChange()\"\n ></textarea>\n } @else {\n <textarea\n pTextarea\n [(ngModel)]=\"formModel.textContent\"\n class=\"w-full font-mono text-sm\"\n rows=\"20\"\n placeholder=\"Enter plain text content for email clients that don't support HTML\"\n ></textarea>\n <small class=\"text-gray-500 mt-1 block\">\n <i class=\"pi pi-info-circle mr-1\"></i>\n Plain text version sent to email clients without HTML support\n </small>\n }\n </div>\n\n <!-- Preview Panel (HTML mode only) -->\n @if (editorMode() === 'html') {\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-3\">\n <h3 class=\"font-semibold\">Preview</h3>\n <p-tag value=\"Live Preview\" severity=\"info\" />\n </div>\n <div\n class=\"border rounded bg-white min-h-[400px] overflow-auto\"\n style=\"max-height: 500px;\"\n >\n @if (formModel.htmlContent) {\n <iframe\n [srcdoc]=\"getPreviewHtml()\"\n class=\"w-full h-full min-h-[400px] border-0\"\n sandbox=\"allow-same-origin\"\n ></iframe>\n } @else {\n <div class=\"flex items-center justify-center h-full min-h-[400px] text-gray-400\">\n <div class=\"text-center\">\n <i class=\"pi pi-eye text-4xl mb-2\"></i>\n <p>Enter HTML content to see preview</p>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <p-toast />\n `,\n})\nexport class TemplateFormComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly templateService = inject(EmailTemplateApiService);\n private readonly messageService = inject(MessageService);\n readonly state = inject(EmailBuilderStateService);\n\n readonly isLoading = signal(false);\n readonly existingTemplate = signal<IEmailTemplate | null>(null);\n readonly isEditMode = computed(() => !!this.existingTemplate());\n readonly editorMode = signal<'html' | 'text'>('html');\n\n formModel = {\n id: '',\n name: '',\n slug: '',\n description: '',\n subject: '',\n htmlContent: '',\n textContent: '',\n isActive: true,\n isHtml: true,\n };\n\n ngOnInit(): void {\n const id = this.route.snapshot.paramMap.get('id');\n if (id) {\n this.loadTemplate(id);\n }\n }\n\n async loadTemplate(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.templateService.findByIdAsync(id);\n if (response.success && response.data) {\n const template = response.data;\n this.existingTemplate.set(template);\n this.formModel = {\n id: template.id,\n name: template.name,\n slug: template.slug,\n description: template.description || '',\n subject: template.subject,\n htmlContent: template.htmlContent,\n textContent: template.textContent || '',\n isActive: template.isActive,\n isHtml: template.isHtml ?? true,\n };\n // Set editor mode based on saved template type\n this.editorMode.set(template.isHtml ? 'html' : 'text');\n this.state.loadSchema(template.schema);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n setEditorMode(mode: 'html' | 'text'): void {\n const currentMode = this.editorMode();\n\n // Sync content when switching modes\n if (currentMode === 'text' && mode === 'html') {\n // Switching from text to html - convert text to basic HTML if htmlContent is empty\n if (!this.formModel.htmlContent && this.formModel.textContent) {\n this.formModel.htmlContent = this.textToHtml(this.formModel.textContent);\n }\n } else if (currentMode === 'html' && mode === 'text') {\n // Switching from html to text - generate text from HTML if textContent is empty\n if (!this.formModel.textContent && this.formModel.htmlContent) {\n this.formModel.textContent = this.htmlToPlainText(this.formModel.htmlContent);\n }\n }\n\n this.editorMode.set(mode);\n this.formModel.isHtml = mode === 'html';\n }\n\n /** Convert plain text to basic HTML */\n private textToHtml(text: string): string {\n if (!text) return '';\n // Convert line breaks to paragraphs\n return text\n .split(/\\n\\n+/)\n .map((p) => `<p>${p.replace(/\\n/g, '<br>')}</p>`)\n .join('\\n');\n }\n\n onContentChange(): void {\n // Trigger change detection for preview\n }\n\n /** Convert HTML to plain text */\n private htmlToPlainText(html: string): string {\n if (!html) return '';\n // Create a temporary element to parse HTML\n const temp = document.createElement('div');\n temp.innerHTML = html;\n // Get text content and clean up whitespace\n return (temp.textContent || temp.innerText || '')\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n /** Get HTML for preview iframe */\n getPreviewHtml(): string {\n const baseStyles = `\n <style>\n body { font-family: Arial, sans-serif; margin: 16px; }\n img { max-width: 100%; height: auto; }\n </style>\n `;\n return baseStyles + (this.formModel.htmlContent || '');\n }\n\n async onSave(): Promise<void> {\n if (!this.formModel.name || !this.formModel.slug || !this.formModel.subject) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Validation',\n detail: 'Please fill in all required fields.',\n });\n return;\n }\n\n this.isLoading.set(true);\n try {\n const schema = this.state.schema();\n // Use user-provided plain text, or auto-generate from HTML if empty\n const textContent = this.formModel.textContent || this.htmlToPlainText(this.formModel.htmlContent);\n\n const data = {\n name: this.formModel.name,\n slug: this.formModel.slug,\n description: this.formModel.description || undefined,\n subject: this.formModel.subject,\n schema: {\n ...schema,\n name: this.formModel.name,\n subject: this.formModel.subject,\n },\n htmlContent: this.formModel.htmlContent || '<p>Email content</p>',\n textContent: textContent || undefined,\n isActive: this.formModel.isActive,\n isHtml: this.formModel.isHtml,\n };\n\n if (this.isEditMode()) {\n await this.templateService.updateAsync({ id: this.formModel.id, ...data });\n } else {\n await this.templateService.insertAsync(data as any);\n }\n\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Template ${this.isEditMode() ? 'updated' : 'created'} successfully.`,\n });\n\n this.router.navigate(['../'], { relativeTo: this.route });\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to save template.',\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n}\n"],"names":["i3","i4","i5","i6"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-email-template-list.component-CGJxfZMT.mjs","sources":["../../../projects/ng-email/pages/template/template-list.component.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, inject, signal, OnInit, computed } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { EmailTemplateApiService } from '../../services/email-template-api.service';\nimport { EmailConfigApiService } from '../../services/email-config-api.service';\nimport { EmailSendService } from '../../services/email-send.service';\nimport { IEmailTemplate } from '../../interfaces/email-template.interface';\nimport { IEmailConfig } from '../../interfaces/email-config.interface';\n\n/**\n * Email template list component\n */\n@Component({\n selector: 'lib-template-list',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormsModule],\n providers: [ConfirmationService, MessageService],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">Email Templates</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"New Template\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\"\n />\n </div>\n\n <p-table\n [value]=\"templates()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Slug</th>\n <th>Subject</th>\n <th>Type</th>\n <th>Status</th>\n <th>Created</th>\n <th style=\"width: 150px\">Actions</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-template>\n <tr>\n <td>\n <i class=\"pi pi-envelope mr-2\"></i>\n {{ template.name }}\n </td>\n <td>\n <code class=\"text-sm bg-gray-100 px-2 py-1 rounded\">{{ template.slug }}</code>\n </td>\n <td>{{ template.subject }}</td>\n <td>\n <p-tag\n [value]=\"template.isHtml ? 'HTML' : 'Text'\"\n [severity]=\"template.isHtml ? 'info' : 'secondary'\"\n />\n </td>\n <td>\n <p-tag\n [value]=\"template.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"template.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td>{{ template.createdAt | date: 'short' }}</td>\n <td>\n <p-button\n icon=\"pi pi-send\"\n [text]=\"true\"\n size=\"small\"\n pTooltip=\"Test Send\"\n (onClick)=\"onTestSend(template)\"\n />\n <p-button\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(template.id)\"\n />\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onDelete(template)\"\n />\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"7\" class=\"text-center py-4\">\n No email templates found. Create your first template to get started.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n <!-- Test Send Dialog -->\n <p-dialog\n header=\"Test Send Email\"\n [(visible)]=\"showTestDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '500px', maxHeight: '80vh' }\"\n >\n <div class=\"grid gap-4\">\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Template</label>\n <input\n pInputText\n [value]=\"selectedTemplate()?.name || ''\"\n class=\"w-full\"\n [disabled]=\"true\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Email Configuration *</label>\n <p-select\n [(ngModel)]=\"testSendModel.configId\"\n [options]=\"configOptions()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n placeholder=\"Select configuration\"\n class=\"w-full\"\n [loading]=\"isLoadingConfigs()\"\n />\n </div>\n\n <div class=\"field\">\n <label class=\"block font-medium mb-2\">Recipient Email *</label>\n <input\n pInputText\n [(ngModel)]=\"testSendModel.recipient\"\n class=\"w-full\"\n placeholder=\"recipient@example.com\"\n />\n </div>\n\n <!-- Dynamic Variables -->\n @if (templateVariables().length > 0) {\n <div class=\"border-t pt-4 mt-2\">\n <h4 class=\"font-medium mb-3 flex items-center gap-2\">\n <i class=\"pi pi-code\"></i>\n Template Variables\n </h4>\n <div class=\"grid gap-3\">\n @for (variable of templateVariables(); track variable) {\n <div class=\"field\">\n <label class=\"block text-sm font-medium mb-1\">\n <code class=\"text-primary\">{{ '{{' + variable + '}}' }}</code>\n </label>\n <input\n pInputText\n [ngModel]=\"variableValues[variable] || ''\"\n (ngModelChange)=\"variableValues[variable] = $event\"\n class=\"w-full\"\n [placeholder]=\"'Enter value for ' + variable\"\n />\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template #footer>\n <p-button\n label=\"Cancel\"\n [text]=\"true\"\n (onClick)=\"showTestDialog = false\"\n />\n <p-button\n label=\"Send Test\"\n icon=\"pi pi-send\"\n [loading]=\"isSendingTest()\"\n (onClick)=\"sendTestEmail()\"\n />\n </ng-template>\n </p-dialog>\n\n <p-confirmDialog />\n <p-toast />\n `,\n})\nexport class TemplateListComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly templateService = inject(EmailTemplateApiService);\n private readonly configService = inject(EmailConfigApiService);\n private readonly emailSendService = inject(EmailSendService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly templates = signal<IEmailTemplate[]>([]);\n readonly totalRecords = signal(0);\n readonly pageSize = signal(10);\n readonly currentPage = signal(1);\n\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n // Test send dialog\n showTestDialog = false;\n readonly selectedTemplate = signal<IEmailTemplate | null>(null);\n readonly configs = signal<IEmailConfig[]>([]);\n readonly isLoadingConfigs = signal(false);\n readonly isSendingTest = signal(false);\n\n // Form-bound properties (ngModel requires plain properties)\n testSendModel = { configId: '', recipient: '' };\n variableValues: Record<string, string> = {};\n\n readonly configOptions = computed(() =>\n this.configs().map((c) => ({\n label: `${c.name} (${c.provider})`,\n value: c.id,\n })),\n );\n\n /** Extract variables from template content */\n readonly templateVariables = computed(() => {\n const template = this.selectedTemplate();\n if (!template) return [];\n\n // Combine all content sources to extract variables\n const content = [\n template.subject,\n template.htmlContent,\n template.textContent || '',\n ].join(' ');\n\n // Find all {{variableName}} patterns\n const matches = content.matchAll(/\\{\\{(\\w+)\\}\\}/g);\n const variables = new Set<string>();\n\n for (const match of matches) {\n variables.add(match[1]);\n }\n\n return Array.from(variables).sort();\n });\n\n ngOnInit(): void {\n this.loadTemplates();\n }\n\n onCreate(): void {\n this.router.navigate(['/email/templates/new']);\n }\n\n onEdit(templateId: string): void {\n this.router.navigate(['/email/templates', templateId]);\n }\n\n async loadTemplates(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.templateService.getAll('', {\n pagination: {\n currentPage: this.currentPage() - 1,\n pageSize: this.pageSize(),\n },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.templates.set(response.data ?? []);\n this.totalRecords.set(response.meta?.total ?? 0);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onPageChange(event: any): void {\n this.currentPage.set(event.first / event.rows + 1);\n this.pageSize.set(event.rows);\n this.loadTemplates();\n }\n\n async onTestSend(template: IEmailTemplate): Promise<void> {\n this.selectedTemplate.set(template);\n this.testSendModel = { configId: '', recipient: '' };\n this.variableValues = {}; // Reset variable values\n this.showTestDialog = true;\n await this.loadConfigs();\n }\n\n async loadConfigs(): Promise<void> {\n this.isLoadingConfigs.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.getAll('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: { isActive: true },\n select: [],\n sort: {},\n }),\n );\n if (response.success) {\n this.configs.set(response.data ?? []);\n }\n } finally {\n this.isLoadingConfigs.set(false);\n }\n }\n\n async sendTestEmail(): Promise<void> {\n const template = this.selectedTemplate();\n if (!template || !this.testSendModel.configId || !this.testSendModel.recipient) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Validation',\n detail: 'Please select a configuration and enter recipient email.',\n });\n return;\n }\n\n this.isSendingTest.set(true);\n try {\n // Build variables object (only include non-empty values)\n const variables: Record<string, string> = {};\n for (const [key, value] of Object.entries(this.variableValues)) {\n if (value) {\n variables[key] = value;\n }\n }\n\n const response = await firstValueFrom(\n this.emailSendService.sendTemplate({\n templateId: template.id,\n to: this.testSendModel.recipient,\n emailConfigId: this.testSendModel.configId,\n variables: Object.keys(variables).length > 0 ? variables : undefined,\n }),\n );\n\n if (response.data?.success) {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Test email sent! Message ID: ${response.data.messageId}`,\n });\n this.showTestDialog = false;\n } else {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: response.data?.error || 'Failed to send test email.',\n });\n }\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to send test email.',\n });\n } finally {\n this.isSendingTest.set(false);\n }\n }\n\n onDelete(template: IEmailTemplate): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${template.name}\"?`,\n header: 'Delete Template',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.templateService.deleteAsync({ id: template.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Template deleted successfully.',\n });\n this.loadTemplates();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to delete template.',\n });\n }\n },\n });\n }\n}\n"],"names":[],"mappings":"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"}
|