@acorex-platform/module-content-management-client 0.0.30 → 0.0.32
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/acorex-platform-module-content-management-client-contracts.mjs +44 -14
- package/fesm2022/acorex-platform-module-content-management-client-contracts.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-CApNVTfc.mjs → acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-BkSjAXjQ.mjs} +6 -6
- package/fesm2022/acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-BkSjAXjQ.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-content-management-client.mjs +26 -3
- package/fesm2022/acorex-platform-module-content-management-client.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-platform-module-content-management-client-contracts.d.ts +27 -19
- package/types/acorex-platform-module-content-management-client.d.ts +8 -2
- package/fesm2022/acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-CApNVTfc.mjs.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveMultiLanguageString } from '@acorex-platform/framework-shared/core';
|
|
2
|
+
import { createTextTemplateEngine, collectPathRootsFromSource } from '@acorex-platform/framework-shared/text-template';
|
|
2
3
|
|
|
3
4
|
const AXPContentManagementMenuKeys = {
|
|
4
5
|
Root: 'content-management:menu',
|
|
@@ -374,18 +375,42 @@ const AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH = 5;
|
|
|
374
375
|
//#endregion
|
|
375
376
|
|
|
376
377
|
//#region ----- Placeholder replacement -----
|
|
377
|
-
const
|
|
378
|
+
const previewEngine = createTextTemplateEngine();
|
|
378
379
|
/**
|
|
379
|
-
* Collects unique
|
|
380
|
+
* Collects unique root paths from template source (`{{ employee.name }}`, `{{#table users as user}}`).
|
|
380
381
|
*/
|
|
381
382
|
function collectTextTemplatePlaceholderNames(text) {
|
|
382
|
-
return
|
|
383
|
+
return collectPathRootsFromSource(text ?? '');
|
|
384
|
+
}
|
|
385
|
+
function previewContext(data, slotContent = '') {
|
|
386
|
+
const locale = 'en-US';
|
|
387
|
+
return {
|
|
388
|
+
channel: 'email',
|
|
389
|
+
locale,
|
|
390
|
+
data,
|
|
391
|
+
regional: {
|
|
392
|
+
locale,
|
|
393
|
+
shortDate: defaultShortDatePatternForLocale(locale),
|
|
394
|
+
shortTime: defaultShortTimePatternForLocale(locale),
|
|
395
|
+
timeZone: 'UTC',
|
|
396
|
+
calendar: resolveTextTemplateCalendar(locale),
|
|
397
|
+
},
|
|
398
|
+
tokenMeta: {},
|
|
399
|
+
slotContent,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Interpolates `{{ path | pipe }}` using typed `data` (and optional `[content]`).
|
|
404
|
+
* Does not parse block tags (`{{#table}}`, …) — use {@link renderTextTemplateSource} for bodies.
|
|
405
|
+
*/
|
|
406
|
+
function replaceTextTemplatePlaceholders(text, data = {}) {
|
|
407
|
+
return previewEngine.interpolate(text ?? '', previewContext(data));
|
|
383
408
|
}
|
|
384
409
|
/**
|
|
385
|
-
*
|
|
410
|
+
* Parses source to blocks and renders for the email channel (local preview / compose fallback).
|
|
386
411
|
*/
|
|
387
|
-
function
|
|
388
|
-
return
|
|
412
|
+
function renderTextTemplateSource(source, data = {}, slotContent = '') {
|
|
413
|
+
return previewEngine.render(source ?? '', previewContext(data, slotContent));
|
|
389
414
|
}
|
|
390
415
|
/**
|
|
391
416
|
* Resolves a template channel field (plain string or per-locale map) for the active locale.
|
|
@@ -419,16 +444,15 @@ function replaceTextTemplateContentSlot(masterBody, content) {
|
|
|
419
444
|
}
|
|
420
445
|
/**
|
|
421
446
|
* Composes a body chain: leaf first, then parents toward root.
|
|
422
|
-
*
|
|
447
|
+
* Injects `[content]` only — callers interpolate or {@link renderTextTemplateSource} afterward.
|
|
423
448
|
*/
|
|
424
|
-
function composeTextTemplateBodyChain(bodiesLeafToRoot
|
|
449
|
+
function composeTextTemplateBodyChain(bodiesLeafToRoot) {
|
|
425
450
|
if (!bodiesLeafToRoot.length) {
|
|
426
451
|
return '';
|
|
427
452
|
}
|
|
428
|
-
let body =
|
|
453
|
+
let body = bodiesLeafToRoot[0] ?? '';
|
|
429
454
|
for (let i = 1; i < bodiesLeafToRoot.length; i++) {
|
|
430
|
-
|
|
431
|
-
body = replaceTextTemplateContentSlot(parentMerged, body);
|
|
455
|
+
body = replaceTextTemplateContentSlot(bodiesLeafToRoot[i] ?? '', body);
|
|
432
456
|
}
|
|
433
457
|
return body;
|
|
434
458
|
}
|
|
@@ -562,14 +586,20 @@ const AXM_TEXT_TEMPLATE_IDS = {
|
|
|
562
586
|
ticketResolved: 'c7100006-0001-4111-b111-060606060606',
|
|
563
587
|
employeeHappyBirthday: 'c7100007-0001-4111-b111-070707070707',
|
|
564
588
|
employeeJoiningCompany: 'c7100008-0001-4111-b111-080808080808',
|
|
565
|
-
/**
|
|
589
|
+
/** Combined document expiration digest (expired + near) — daily notifier (email + in-app). */
|
|
566
590
|
documentExpired: 'c7100009-0001-4111-b111-090909090909',
|
|
567
|
-
/**
|
|
591
|
+
/** Legacy near-expiry template id; same digest body as documentExpired. */
|
|
568
592
|
documentNearExpiry: 'c710000a-0001-4111-b111-0a0a0a0a0a0a',
|
|
569
593
|
/** Company print master — header, border, footer around `[content]`. */
|
|
570
594
|
printCompanyMaster: 'c710000b-0001-4111-b111-0b0b0b0b0b0b',
|
|
571
595
|
/** Default questionnaire print child (title, date, `{{sessionBody}}`). */
|
|
572
596
|
questionnairePrint: 'c710000c-0001-4111-b111-0c0c0c0c0c0c',
|
|
597
|
+
/** Daily list of employees with a birthday today — emailed to account holders. */
|
|
598
|
+
employeeBirthdayDigest: 'c710000d-0001-4111-b111-0d0d0d0d0d0d',
|
|
599
|
+
/** Daily list of employees whose hire date is today — emailed to account holders. */
|
|
600
|
+
employeeJoiningDigest: 'c710000e-0001-4111-b111-0e0e0e0e0e0e',
|
|
601
|
+
/** List of tenants with no login in the last 30 days. */
|
|
602
|
+
tenantLoginDigest: 'c710000f-0001-4111-b111-0f0f0f0f0f0f',
|
|
573
603
|
};
|
|
574
604
|
//#endregion
|
|
575
605
|
|
|
@@ -579,5 +609,5 @@ const AXM_TEXT_TEMPLATE_IDS = {
|
|
|
579
609
|
* Generated bundle index. Do not edit.
|
|
580
610
|
*/
|
|
581
611
|
|
|
582
|
-
export { AXMPermissionsKeys, AXM_TEXT_TEMPLATE_CONTENT_SLOT, AXM_TEXT_TEMPLATE_IDS, AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, AXM_TEXT_TEMPLATE_PRINT_CHANNEL, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, AXM_TEXT_TEMPLATE_TENANT_MASTER_NAMESPACE, AXPContentDocumentsPermissionKeys, AXPContentManagementMenuKeys, RootConfig, collectTextTemplatePlaceholderNames, composeTextTemplateBodyChain, defaultShortDatePatternForLocale, defaultShortTimePatternForLocale, formatTextTemplateDate, formatTextTemplateMergeValues, formatTextTemplateNumber, parseTextTemplateDateValue, replaceTextTemplateContentSlot, replaceTextTemplatePlaceholders, resolveTextTemplateCalendar, resolveTextTemplateLocalizedString, textTemplateContainsContentSlot, validateTextTemplateContentSlots, validateTextTemplateParentChain };
|
|
612
|
+
export { AXMPermissionsKeys, AXM_TEXT_TEMPLATE_CONTENT_SLOT, AXM_TEXT_TEMPLATE_IDS, AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, AXM_TEXT_TEMPLATE_PRINT_CHANNEL, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, AXM_TEXT_TEMPLATE_TENANT_MASTER_NAMESPACE, AXPContentDocumentsPermissionKeys, AXPContentManagementMenuKeys, RootConfig, collectTextTemplatePlaceholderNames, composeTextTemplateBodyChain, defaultShortDatePatternForLocale, defaultShortTimePatternForLocale, formatTextTemplateDate, formatTextTemplateMergeValues, formatTextTemplateNumber, parseTextTemplateDateValue, renderTextTemplateSource, replaceTextTemplateContentSlot, replaceTextTemplatePlaceholders, resolveTextTemplateCalendar, resolveTextTemplateLocalizedString, textTemplateContainsContentSlot, validateTextTemplateContentSlots, validateTextTemplateParentChain };
|
|
583
613
|
//# sourceMappingURL=acorex-platform-module-content-management-client-contracts.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-content-management-client-contracts.mjs","sources":["../../../../libs/modules/content-management/contracts/src/menu.keys.ts","../../../../libs/modules/content-management/contracts/src/permission.keys.ts","../../../../libs/modules/content-management/contracts/src/root-config.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template-locale-format.util.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template.types.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template-placeholder.util.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template-render.types.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template.ids.ts","../../../../libs/modules/content-management/contracts/src/index.ts","../../../../libs/modules/content-management/contracts/src/acorex-platform-module-content-management-client-contracts.ts"],"sourcesContent":["export const AXPContentManagementMenuKeys = {\n Root: 'content-management:menu',\n HelpRoot: 'app:help',\n Promotions: 'content-management:menu:promotions',\n TextTemplates: 'content-management:menu:text-templates',\n Glossary: 'content-management:menu:glossary',\n HelpCenter: 'app:help:center',\n Tutorials: 'app:help:tutorials',\n About: 'app:about',\n} as const;\n\n","/**\n * Content & Documents capabilities used by this module.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPContentDocumentsPermissionKeys = {\n Access: 'ContentDocuments:Permission:Access',\n MaintainDocuments: 'ContentDocuments:Permission:MaintainDocuments',\n MaintainContent: 'ContentDocuments:Permission:MaintainContent',\n MaintainFormTemplates: 'ContentDocuments:Permission:MaintainFormTemplates',\n Setup: 'ContentDocuments:Permission:Setup',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPContentDocumentsPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n */\nexport const AXMPermissionsKeys = {\n ContentManagement: {\n Management: AXPContentDocumentsPermissionKeys.MaintainContent,\n Promotion: {\n Management: AXPContentDocumentsPermissionKeys.MaintainContent,\n View: AXPContentDocumentsPermissionKeys.MaintainContent,\n Edit: AXPContentDocumentsPermissionKeys.MaintainContent,\n Delete: AXPContentDocumentsPermissionKeys.MaintainContent,\n Create: AXPContentDocumentsPermissionKeys.MaintainContent,\n },\n TextTemplate: {\n Management: AXPContentDocumentsPermissionKeys.MaintainContent,\n View: AXPContentDocumentsPermissionKeys.MaintainContent,\n Edit: AXPContentDocumentsPermissionKeys.MaintainContent,\n Delete: AXPContentDocumentsPermissionKeys.MaintainContent,\n Create: AXPContentDocumentsPermissionKeys.MaintainContent,\n },\n },\n} as const;\n","const config = {\n i18n: 'content-management',\n};\nexport const RootConfig = {\n config,\n module: {\n module: 'ContentManagement',\n name: 'ContentManagement',\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-file-invoice',\n },\n entities: {\n promotion: {\n name: 'Promotion',\n title: `@${config.i18n}:promotions.entities.promotion.title`,\n titlePlural: `@${config.i18n}:promotions.entities.promotion.plural`,\n icon: 'fa-light fa-megaphone',\n },\n glossary: {\n name: 'Glossary', \n title: `@${config.i18n}:glossaries.entities.glossary.title`,\n titlePlural: `@${config.i18n}:glossaries.entities.glossary.plural`,\n icon: 'fa-light fa-file',\n },\n textTemplate: {\n name: 'TextTemplate',\n title: `@${config.i18n}:templates.entities.text-template.title`,\n titlePlural: `@${config.i18n}:templates.entities.text-template.plural`,\n icon: 'fa-light fa-envelope',\n },\n },\n} as const;\n","//#region ----- Types -----\n\nexport type AXMTextTemplateTokenFormatMeta = {\n dataType?: string;\n format?: string;\n};\n\n/** Calendar system for date tokens (`solar-hijri` = Jalali / Persian). */\nexport type AXMTextTemplateCalendarSystem = 'gregory' | 'solar-hijri';\n\nexport type AXMTextTemplateRegionalFormatContext = {\n locale: string;\n shortDate: string;\n shortTime: string;\n timeZone: string;\n /** When omitted, inferred from locale (`fa-*` → solar-hijri). */\n calendar?: AXMTextTemplateCalendarSystem | string;\n};\n\n//#endregion\n\n//#region ----- Locale defaults -----\n\n/**\n * Default short-date pattern when settings do not provide ShortDate.\n * Aligns with locale-management profiles (en-US / en-AU / en-NZ / fa-IR).\n */\nexport function defaultShortDatePatternForLocale(locale: string): string {\n const code = normalizeLocale(locale);\n if (code === 'en-us') {\n return 'MM/DD/YYYY';\n }\n if (code.startsWith('fa')) {\n return 'YYYY/MM/DD';\n }\n // en-AU, en-NZ, en-GB, and most other locales\n return 'DD/MM/YYYY';\n}\n\nexport function defaultShortTimePatternForLocale(_locale: string): string {\n return 'HH:mm';\n}\n\n/**\n * Resolves calendar: settings value, else `solar-hijri` for `fa-*`, else Gregorian.\n */\nexport function resolveTextTemplateCalendar(\n locale: string,\n calendarSetting?: string | null,\n): AXMTextTemplateCalendarSystem {\n const setting = (calendarSetting ?? '').trim().toLowerCase();\n if (\n setting === 'solar-hijri' ||\n setting === 'jalali' ||\n setting === 'persian' ||\n setting === 'hijri-shamsi'\n ) {\n return 'solar-hijri';\n }\n if (setting === 'gregory' || setting === 'gregorian') {\n return 'gregory';\n }\n return normalizeLocale(locale).startsWith('fa') ? 'solar-hijri' : 'gregory';\n}\n\n//#endregion\n\n//#region ----- Date / number formatting (Nest-safe) -----\n\n/**\n * Parses ISO / `YYYY-MM-DD` / Date-like merge values into a Date.\n * Date-only keys are treated as UTC midnight to avoid off-by-one shifts.\n */\nexport function parseTextTemplateDateValue(value: unknown): Date | null {\n if (value == null || value === '') {\n return null;\n }\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) {\n const date = new Date(`${trimmed}T00:00:00.000Z`);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n const date = new Date(trimmed);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Formats a date with regional patterns (`DD/MM/YYYY`, `D MMMM YYYY`, `HH:mm`, …)\n * using the active locale for month names, digits, and calendar (Jalali for fa-IR).\n */\nexport function formatTextTemplateDate(\n value: unknown,\n pattern: string,\n timeZone = 'UTC',\n locale = 'en-US',\n calendar?: AXMTextTemplateCalendarSystem | string,\n): string {\n const date = parseTextTemplateDateValue(value);\n if (!date) {\n return value == null ? '' : String(value);\n }\n\n const resolvedLocale = locale?.trim() || 'en-US';\n const resolvedCalendar = resolveTextTemplateCalendar(resolvedLocale, calendar);\n const intlCalendar = resolvedCalendar === 'solar-hijri' ? 'persian' : 'gregory';\n const parts = getZonedCalendarParts(date, timeZone || 'UTC', resolvedLocale, intlCalendar);\n const monthLong = getLocalizedMonthName(date, resolvedLocale, intlCalendar, timeZone || 'UTC', 'long');\n const monthShort = getLocalizedMonthName(date, resolvedLocale, intlCalendar, timeZone || 'UTC', 'short');\n\n let out = pattern?.trim() || defaultShortDatePatternForLocale(resolvedLocale);\n // Longer tokens first.\n out = out.replace(/YYYY/g, formatLocaleInteger(parts.year, resolvedLocale, 4));\n out = out.replace(/MMMM/g, monthLong);\n out = out.replace(/MMM/g, monthShort);\n out = out.replace(/MM/g, formatLocaleInteger(parts.month, resolvedLocale, 2));\n out = out.replace(/\\bM\\b/g, formatLocaleInteger(parts.month, resolvedLocale, 0));\n out = out.replace(/DD/g, formatLocaleInteger(parts.day, resolvedLocale, 2));\n out = out.replace(/\\bD\\b/g, formatLocaleInteger(parts.day, resolvedLocale, 0));\n out = out.replace(/HH/g, formatLocaleInteger(parts.hour, resolvedLocale, 2));\n out = out.replace(/mm/g, formatLocaleInteger(parts.minute, resolvedLocale, 2));\n out = out.replace(/ss/g, formatLocaleInteger(parts.second, resolvedLocale, 2));\n return out;\n}\n\nexport function formatTextTemplateNumber(\n value: unknown,\n locale: string,\n options: { style?: 'decimal' | 'integer' | 'currency' | 'percent'; currency?: string } = {},\n): string {\n const num = coerceNumber(value);\n if (num == null) {\n return value == null ? '' : String(value);\n }\n const resolvedLocale = locale?.trim() || 'en-US';\n const style = options.style ?? 'decimal';\n try {\n if (style === 'integer') {\n return new Intl.NumberFormat(resolvedLocale, {\n maximumFractionDigits: 0,\n }).format(num);\n }\n if (style === 'percent') {\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(num);\n }\n if (style === 'currency') {\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'currency',\n currency: options.currency?.trim() || defaultCurrencyForLocale(resolvedLocale),\n }).format(num);\n }\n return new Intl.NumberFormat(resolvedLocale, {\n maximumFractionDigits: 6,\n }).format(num);\n } catch {\n return String(num);\n }\n}\n\n/**\n * Formats merge values using PlatformManagement.Token `dataType` / `format` metadata.\n * Unknown tokens and non-typed strings are left unchanged.\n */\nexport function formatTextTemplateMergeValues(\n merge: Record<string, string>,\n metaByName: Record<string, AXMTextTemplateTokenFormatMeta>,\n regional: AXMTextTemplateRegionalFormatContext,\n): Record<string, string> {\n const out: Record<string, string> = { ...merge };\n const locale = regional.locale?.trim() || 'en-US';\n const shortDate =\n regional.shortDate?.trim() || defaultShortDatePatternForLocale(locale);\n const shortTime =\n regional.shortTime?.trim() || defaultShortTimePatternForLocale(locale);\n const timeZone = regional.timeZone?.trim() || 'UTC';\n const calendar = resolveTextTemplateCalendar(locale, regional.calendar);\n\n for (const [name, raw] of Object.entries(merge)) {\n const meta = metaByName[name];\n if (!meta) {\n continue;\n }\n const dataType = (meta.dataType ?? 'String').trim();\n const format = (meta.format ?? 'None').trim();\n\n if (dataType === 'DateTime') {\n const pattern = `${shortDate} ${shortTime}`.trim();\n const dateOnly = looksLikeDateOnly(raw);\n out[name] = formatTextTemplateDate(\n raw,\n dateOnly ? shortDate : pattern,\n timeZone,\n locale,\n calendar,\n );\n continue;\n }\n\n if (dataType === 'Integer') {\n out[name] = formatTextTemplateNumber(raw, locale, { style: 'integer' });\n continue;\n }\n\n if (dataType === 'Decimal' || format === 'Currency' || format === 'Percent') {\n const style =\n format === 'Currency' ? 'currency' : format === 'Percent' ? 'percent' : 'decimal';\n out[name] = formatTextTemplateNumber(raw, locale, { style });\n }\n }\n\n return out;\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizeLocale(locale: string): string {\n return (locale ?? 'en-US').trim().toLowerCase() || 'en-us';\n}\n\nfunction defaultCurrencyForLocale(locale: string): string {\n const code = normalizeLocale(locale);\n if (code === 'en-au') return 'AUD';\n if (code === 'en-nz') return 'NZD';\n if (code.startsWith('fa') || code === 'en-ir') return 'IRR';\n if (code === 'en-gb') return 'GBP';\n return 'USD';\n}\n\nfunction coerceNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const num = Number(value.trim());\n return Number.isFinite(num) ? num : null;\n }\n return null;\n}\n\nfunction looksLikeDateOnly(value: string): boolean {\n const trimmed = value.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) {\n return true;\n }\n return /^\\d{4}-\\d{2}-\\d{2}T00:00:00(?:\\.0+)?Z$/i.test(trimmed);\n}\n\nfunction formatLocaleInteger(value: number, locale: string, minDigits: number): string {\n const abs = Math.trunc(Math.abs(value));\n const padded = minDigits > 0 ? String(abs).padStart(minDigits, '0') : String(abs);\n try {\n // Format digit-by-digit so padding zeros stay and locale digits apply (fa-IR → ۰۱۲…).\n return padded\n .split('')\n .map((ch) => new Intl.NumberFormat(locale, { useGrouping: false }).format(Number(ch)))\n .join('');\n } catch {\n return padded;\n }\n}\n\nfunction getLocalizedMonthName(\n date: Date,\n locale: string,\n calendar: 'persian' | 'gregory',\n timeZone: string,\n width: 'long' | 'short',\n): string {\n try {\n return new Intl.DateTimeFormat(locale, {\n timeZone,\n calendar,\n month: width,\n }).format(date);\n } catch {\n try {\n return new Intl.DateTimeFormat('en-US', {\n timeZone,\n calendar: 'gregory',\n month: width,\n }).format(date);\n } catch {\n return String(date.getUTCMonth() + 1);\n }\n }\n}\n\nfunction getZonedCalendarParts(\n date: Date,\n timeZone: string,\n locale: string,\n calendar: 'persian' | 'gregory',\n): { year: number; month: number; day: number; hour: number; minute: number; second: number } {\n try {\n const formatter = new Intl.DateTimeFormat(locale, {\n timeZone: timeZone || 'UTC',\n calendar,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n // Keep part extraction numeric-stable; display digits are localized later.\n numberingSystem: 'latn',\n });\n const parts = formatter.formatToParts(date);\n const read = (type: Intl.DateTimeFormatPartTypes): number => {\n const value = parts.find((part) => part.type === type)?.value;\n return value ? Number(value) : 0;\n };\n let hour = read('hour');\n // Some engines emit 24:00 for midnight.\n if (hour === 24) {\n hour = 0;\n }\n return {\n year: read('year'),\n month: read('month'),\n day: read('day'),\n hour,\n minute: read('minute'),\n second: read('second'),\n };\n } catch {\n return {\n year: date.getUTCFullYear(),\n month: date.getUTCMonth() + 1,\n day: date.getUTCDate(),\n hour: date.getUTCHours(),\n minute: date.getUTCMinutes(),\n second: date.getUTCSeconds(),\n };\n }\n}\n\n//#endregion\n","import { AXPCategoryListItem, AXPMultiLanguageString, type AXPPlatformScopeKey } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\n//#region ----- Types -----\n\n/** Stored value: { email: { subject?, body }, sms: { body }, ... } */\nexport interface AXMTextTemplateChannelsValue {\n [channelName: string]: {\n subject?: AXPMultiLanguageString;\n body: AXPMultiLanguageString;\n };\n}\n\nexport type AXMTextTemplateChannelEditorType = 'plain' | 'rich';\n\nexport interface AXMTextTemplateChannelConfigureSettings {\n /** Settings definition section name (e.g. `smtp-settings`). */\n section: string;\n /** Optional parent group when section names are not unique. */\n group?: string;\n scope: AXPPlatformScopeKey;\n}\n\nexport interface AXMTextTemplateChannelDefinition {\n name: string;\n title: string;\n type: AXMTextTemplateChannelEditorType;\n hasSubject?: boolean;\n communicationChannelKey?: string;\n requiredSettingKeys?: string[];\n configureSettings?: AXMTextTemplateChannelConfigureSettings;\n notConfiguredMessageKey?: string;\n}\n\nexport interface AXMTextTemplateChannelDefinitionProvider {\n getChannels(): AXMTextTemplateChannelDefinition[];\n}\n\n/** Template kind: content (leaf message) or master (layout shell with `[content]`). */\nexport const AXM_TEXT_TEMPLATE_KIND = {\n Content: 'content',\n Master: 'master',\n} as const;\n\nexport type AXMTextTemplateKind = (typeof AXM_TEXT_TEMPLATE_KIND)[keyof typeof AXM_TEXT_TEMPLATE_KIND];\n\n/** Print / PDF channel key on `channels` (rich body, no subject). */\nexport const AXM_TEXT_TEMPLATE_PRINT_CHANNEL = 'print' as const;\n\n/** Reserved body slot for child template body injection (not a `{{token}}` variable). */\nexport const AXM_TEXT_TEMPLATE_CONTENT_SLOT = '[content]' as const;\n\n/** Max `parentId` chain length (leaf → … → root), including the leaf. */\nexport const AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH = 5;\n\nexport interface AXMTextTemplateEntityModel extends AXPEntityModel<string> {\n title?: AXPMultiLanguageString;\n /** `content` (default) or `master` layout template. */\n kind?: AXMTextTemplateKind;\n /** Optional parent master template id (multi-level nesting supported). */\n parentId?: string | null;\n /** Join snapshot for `parentId` lookup. */\n parent?: { id?: string; title?: AXPMultiLanguageString | string } | null;\n channels?: AXMTextTemplateChannelsValue;\n categoryIds?: string[];\n categories?: AXPCategoryListItem[];\n}\n\n//#endregion\n","import type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { resolveMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport {\n AXM_TEXT_TEMPLATE_CONTENT_SLOT,\n AXM_TEXT_TEMPLATE_KIND,\n AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH,\n type AXMTextTemplateChannelsValue,\n type AXMTextTemplateKind,\n} from './text-template.types';\n\n//#region ----- Placeholder replacement -----\n\nconst TEXT_TEMPLATE_PLACEHOLDER_PATTERN = /\\{\\{([\\w-]+)\\}\\}/g;\n\n/**\n * Collects unique placeholder token names from text (`{{name}}`).\n */\nexport function collectTextTemplatePlaceholderNames(text: string): string[] {\n return [...new Set((text.match(TEXT_TEMPLATE_PLACEHOLDER_PATTERN) ?? []).map((m) => m.slice(2, -2)))];\n}\n\n/**\n * Replaces `{{token}}` when `merge[token]` is defined; otherwise leaves the token unchanged.\n */\nexport function replaceTextTemplatePlaceholders(text: string, merge: Record<string, string>): string {\n return text.replace(TEXT_TEMPLATE_PLACEHOLDER_PATTERN, (full, name: string) =>\n Object.prototype.hasOwnProperty.call(merge, name) ? merge[name]! : full,\n );\n}\n\n/**\n * Resolves a template channel field (plain string or per-locale map) for the active locale.\n */\nexport function resolveTextTemplateLocalizedString(\n value: AXPMultiLanguageString | string | undefined | null,\n locale: string,\n): string {\n if (value == null || value === '') {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n return resolveMultiLanguageString(value, locale);\n}\n\n/**\n * Returns true when `text` contains the reserved `[content]` slot.\n */\nexport function textTemplateContainsContentSlot(text: string | null | undefined): boolean {\n if (text == null || text === '') {\n return false;\n }\n return text.includes(AXM_TEXT_TEMPLATE_CONTENT_SLOT);\n}\n\n/**\n * Injects child body into every `[content]` occurrence in a master body.\n */\nexport function replaceTextTemplateContentSlot(masterBody: string, content: string): string {\n if (!masterBody.includes(AXM_TEXT_TEMPLATE_CONTENT_SLOT)) {\n return masterBody;\n }\n return masterBody.split(AXM_TEXT_TEMPLATE_CONTENT_SLOT).join(content);\n}\n\n/**\n * Composes a body chain: leaf first, then parents toward root.\n * Each level applies `{{token}}` merge; parents receive the child body via `[content]`.\n */\nexport function composeTextTemplateBodyChain(bodiesLeafToRoot: string[], merge: Record<string, string>): string {\n if (!bodiesLeafToRoot.length) {\n return '';\n }\n let body = replaceTextTemplatePlaceholders(bodiesLeafToRoot[0] ?? '', merge);\n for (let i = 1; i < bodiesLeafToRoot.length; i++) {\n const parentMerged = replaceTextTemplatePlaceholders(bodiesLeafToRoot[i] ?? '', merge);\n body = replaceTextTemplateContentSlot(parentMerged, body);\n }\n return body;\n}\n\n//#endregion\n\n//#region ----- Validation helpers -----\n\nfunction collectLocalizedBodyStrings(body: AXPMultiLanguageString | string | undefined | null): string[] {\n if (body == null || body === '') {\n return [];\n }\n if (typeof body === 'string') {\n return body.trim() ? [body] : [];\n }\n return Object.values(body).filter((v): v is string => typeof v === 'string' && v.trim().length > 0);\n}\n\n/**\n * Master templates: every non-empty channel body locale must include `[content]`.\n * Content templates: no channel body may include `[content]`.\n */\nexport function validateTextTemplateContentSlots(input: {\n kind: AXMTextTemplateKind | string | undefined | null;\n channels: AXMTextTemplateChannelsValue | undefined | null;\n}): { ok: true } | { ok: false; error: string } {\n const kind = (input.kind ?? AXM_TEXT_TEMPLATE_KIND.Content) as string;\n const channels = input.channels ?? {};\n const channelEntries = Object.entries(channels);\n\n if (kind === AXM_TEXT_TEMPLATE_KIND.Master) {\n if (!channelEntries.length) {\n return { ok: false, error: 'Master templates must define at least one channel with a [content] slot.' };\n }\n for (const [channelName, channel] of channelEntries) {\n const bodies = collectLocalizedBodyStrings(channel?.body);\n if (!bodies.length) {\n return {\n ok: false,\n error: `Master template channel \"${channelName}\" must include a body with the [content] slot.`,\n };\n }\n for (const body of bodies) {\n if (!textTemplateContainsContentSlot(body)) {\n return {\n ok: false,\n error: `Master template channel \"${channelName}\" body must include the [content] slot.`,\n };\n }\n }\n }\n return { ok: true };\n }\n\n for (const [channelName, channel] of channelEntries) {\n for (const body of collectLocalizedBodyStrings(channel?.body)) {\n if (textTemplateContainsContentSlot(body)) {\n return {\n ok: false,\n error: `Content template channel \"${channelName}\" must not include the reserved [content] slot.`,\n };\n }\n }\n }\n return { ok: true };\n}\n\nexport interface AXMTextTemplateParentChainNode {\n id: string;\n kind?: string | null;\n parentId?: string | null;\n}\n\n/**\n * Validates parent reference and walks the parent chain for kind, cycles, and max depth.\n * `loadParent` should return the next parent row (or null when missing).\n */\nexport async function validateTextTemplateParentChain(input: {\n id?: string | null;\n parentId?: string | null;\n maxDepth?: number;\n loadParent: (id: string) => Promise<AXMTextTemplateParentChainNode | null>;\n}): Promise<{ ok: true } | { ok: false; error: string }> {\n const parentId = input.parentId?.trim() || null;\n if (!parentId) {\n return { ok: true };\n }\n\n const selfId = input.id?.trim() || null;\n if (selfId && parentId === selfId) {\n return { ok: false, error: 'A text template cannot be its own parent.' };\n }\n\n const maxDepth = input.maxDepth ?? AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH;\n const visited = new Set<string>();\n if (selfId) {\n visited.add(selfId);\n }\n\n let currentId: string | null = parentId;\n let depth = 1;\n\n while (currentId) {\n if (visited.has(currentId)) {\n return { ok: false, error: 'Text template parent chain contains a cycle.' };\n }\n if (depth > maxDepth) {\n return {\n ok: false,\n error: `Text template parent chain exceeds the maximum depth of ${maxDepth}.`,\n };\n }\n\n visited.add(currentId);\n const parent = await input.loadParent(currentId);\n if (!parent) {\n return { ok: false, error: `Parent text template not found (id: ${currentId}).` };\n }\n if ((parent.kind ?? AXM_TEXT_TEMPLATE_KIND.Content) !== AXM_TEXT_TEMPLATE_KIND.Master) {\n return { ok: false, error: 'Parent text template must be a master template.' };\n }\n\n currentId = parent.parentId?.trim() || null;\n depth += 1;\n }\n\n return { ok: true };\n}\n\n//#endregion\n","import type { AXMTextTemplateChannelsValue } from './text-template.types';\n\n//#region ----- Text template render contracts -----\n\n/** Server + client command key for rendering a text template channel. */\nexport const AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY = 'ContentManagement:TextTemplate:Render' as const;\n\n/**\n * Request to render a persisted text template channel with merge values.\n * Walks optional `parentId` masters and injects child body into `[content]`.\n */\nexport interface AXMTextTemplateRenderRequest {\n textTemplateId: string;\n /**\n * When set, `textTemplateId` may be a canonical seed id; the render engine\n * remaps it with tenantMasterId(`content`, tenantId, id) for the tenant copy.\n * Also used for settings cascade (tenant Language / ShortDate / …).\n */\n tenantId?: string;\n /**\n * Optional recipient / actor user id. When set, User Language and regional\n * patterns are preferred over tenant/platform settings.\n */\n userId?: string;\n /** Channel key on `channels`, e.g. `email`, `sms`. Defaults to `email`. */\n channel?: string;\n /**\n * Explicit locale override for MLS subject/body and number formatting.\n * When omitted, resolved from settings: User Language → Tenant Language →\n * Platform Language → `en-US`.\n */\n locale?: string;\n /**\n * Event/domain values merged into `{{name}}` placeholders (e.g. `employeeName`, `documentTitle`).\n * Prefer raw ISO dates and numeric strings — the render engine formats typed tokens\n * (`DateTime`, `Integer`, `Decimal`, Currency/Percent) using regional settings.\n * Context tokens used by shared masters (`companyName`, `companyEmail`, …) are filled by the\n * render engine via PlatformManagement.Tokens when missing — do not re-supply them per caller.\n */\n merge?: Record<string, string>;\n}\n\n/**\n * Rendered subject/body for one channel after placeholder replacement and parent composition.\n */\nexport interface AXMTextTemplateRenderResult {\n textTemplateId: string;\n channel: string;\n subject?: string;\n body: string;\n}\n\n//#endregion\n\n//#region ----- Text template draft preview contracts -----\n\n/** Server command key for previewing unsaved draft text template content. */\nexport const AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY = 'ContentManagement:TextTemplate:Preview' as const;\n\n/**\n * Request to preview draft channel content with optional parent masters.\n * Uses the same composition / Context token fill as render, then fills Event samples.\n */\nexport interface AXMTextTemplatePreviewRequest {\n /** Draft channel map from the editor (not persisted). */\n channels: AXMTextTemplateChannelsValue;\n /** Optional persisted master parent id to walk for `[content]` shells. */\n parentId?: string | null;\n /** Template kind from the host form (`content` | `master`). Informational. */\n kind?: string;\n /** Channel key on `channels`, e.g. `email`, `sms`. Defaults to `email`. */\n channel?: string;\n /**\n * Locale for MLS fields and number formatting. Defaults to active UI language on the client,\n * or `en-US` when omitted on the server.\n */\n locale?: string;\n /** Optional merge overrides (applied before Context resolve and Event samples). */\n merge?: Record<string, string>;\n}\n\n/**\n * Preview subject/body for one channel after placeholder replacement and parent composition.\n */\nexport interface AXMTextTemplatePreviewResult {\n channel: string;\n subject?: string;\n body: string;\n}\n\n//#endregion\n","//#region ----- Seeded text template ids -----\n\n/**\n * Namespace for {@link tenantMasterId} when cloning text templates per tenant\n * (`packs` SetupTenant → `content-management.common-setup`).\n */\nexport const AXM_TEXT_TEMPLATE_TENANT_MASTER_NAMESPACE = 'content' as const;\n\n/**\n * Canonical ContentManagement.TextTemplate ids used as SetupTenant clone keys\n * and runtime lookups (resolve via tenantMasterId + tenantId).\n * Keep aligned with packs `text-template.mock.ids.ts`.\n *\n * Prefix `c71000` — same as `mockStableUuid('c71000', seq)`.\n */\nexport const AXM_TEXT_TEMPLATE_IDS = {\n emailCompanyMaster: 'c7100001-0001-4111-b111-010101010101',\n passwordReset: 'c7100002-0001-4111-b111-020202020202',\n emailVerification: 'c7100003-0001-4111-b111-030303030303',\n passwordChanged: 'c7100004-0001-4111-b111-040404040404',\n ticketReceived: 'c7100005-0001-4111-b111-050505050505',\n ticketResolved: 'c7100006-0001-4111-b111-060606060606',\n employeeHappyBirthday: 'c7100007-0001-4111-b111-070707070707',\n employeeJoiningCompany: 'c7100008-0001-4111-b111-080808080808',\n /** Document expired — daily notifier (email + in-app). */\n documentExpired: 'c7100009-0001-4111-b111-090909090909',\n /** Document near expiry — daily notifier (email + in-app). */\n documentNearExpiry: 'c710000a-0001-4111-b111-0a0a0a0a0a0a',\n /** Company print master — header, border, footer around `[content]`. */\n printCompanyMaster: 'c710000b-0001-4111-b111-0b0b0b0b0b0b',\n /** Default questionnaire print child (title, date, `{{sessionBody}}`). */\n questionnairePrint: 'c710000c-0001-4111-b111-0c0c0c0c0c0c',\n} as const;\n\n//#endregion\n","//#region ---- Contracts barrel ----\n\nexport * from './menu.keys';\nexport * from './permission.keys';\n\nexport * from './root-config';\n\n//#endregion\n\nexport * from './entities';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-content-management-client-contracts.mjs","sources":["../../../../libs/modules/content-management/contracts/src/menu.keys.ts","../../../../libs/modules/content-management/contracts/src/permission.keys.ts","../../../../libs/modules/content-management/contracts/src/root-config.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template-locale-format.util.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template.types.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template-placeholder.util.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template-render.types.ts","../../../../libs/modules/content-management/contracts/src/entities/text-template/text-template.ids.ts","../../../../libs/modules/content-management/contracts/src/index.ts","../../../../libs/modules/content-management/contracts/src/acorex-platform-module-content-management-client-contracts.ts"],"sourcesContent":["export const AXPContentManagementMenuKeys = {\n Root: 'content-management:menu',\n HelpRoot: 'app:help',\n Promotions: 'content-management:menu:promotions',\n TextTemplates: 'content-management:menu:text-templates',\n Glossary: 'content-management:menu:glossary',\n HelpCenter: 'app:help:center',\n Tutorials: 'app:help:tutorials',\n About: 'app:about',\n} as const;\n\n","/**\n * Content & Documents capabilities used by this module.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPContentDocumentsPermissionKeys = {\n Access: 'ContentDocuments:Permission:Access',\n MaintainDocuments: 'ContentDocuments:Permission:MaintainDocuments',\n MaintainContent: 'ContentDocuments:Permission:MaintainContent',\n MaintainFormTemplates: 'ContentDocuments:Permission:MaintainFormTemplates',\n Setup: 'ContentDocuments:Permission:Setup',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPContentDocumentsPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n */\nexport const AXMPermissionsKeys = {\n ContentManagement: {\n Management: AXPContentDocumentsPermissionKeys.MaintainContent,\n Promotion: {\n Management: AXPContentDocumentsPermissionKeys.MaintainContent,\n View: AXPContentDocumentsPermissionKeys.MaintainContent,\n Edit: AXPContentDocumentsPermissionKeys.MaintainContent,\n Delete: AXPContentDocumentsPermissionKeys.MaintainContent,\n Create: AXPContentDocumentsPermissionKeys.MaintainContent,\n },\n TextTemplate: {\n Management: AXPContentDocumentsPermissionKeys.MaintainContent,\n View: AXPContentDocumentsPermissionKeys.MaintainContent,\n Edit: AXPContentDocumentsPermissionKeys.MaintainContent,\n Delete: AXPContentDocumentsPermissionKeys.MaintainContent,\n Create: AXPContentDocumentsPermissionKeys.MaintainContent,\n },\n },\n} as const;\n","const config = {\n i18n: 'content-management',\n};\nexport const RootConfig = {\n config,\n module: {\n module: 'ContentManagement',\n name: 'ContentManagement',\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-file-invoice',\n },\n entities: {\n promotion: {\n name: 'Promotion',\n title: `@${config.i18n}:promotions.entities.promotion.title`,\n titlePlural: `@${config.i18n}:promotions.entities.promotion.plural`,\n icon: 'fa-light fa-megaphone',\n },\n glossary: {\n name: 'Glossary', \n title: `@${config.i18n}:glossaries.entities.glossary.title`,\n titlePlural: `@${config.i18n}:glossaries.entities.glossary.plural`,\n icon: 'fa-light fa-file',\n },\n textTemplate: {\n name: 'TextTemplate',\n title: `@${config.i18n}:templates.entities.text-template.title`,\n titlePlural: `@${config.i18n}:templates.entities.text-template.plural`,\n icon: 'fa-light fa-envelope',\n },\n },\n} as const;\n","//#region ----- Types -----\n\nexport type AXMTextTemplateTokenFormatMeta = {\n dataType?: string;\n format?: string;\n};\n\n/** Calendar system for date tokens (`solar-hijri` = Jalali / Persian). */\nexport type AXMTextTemplateCalendarSystem = 'gregory' | 'solar-hijri';\n\nexport type AXMTextTemplateRegionalFormatContext = {\n locale: string;\n shortDate: string;\n shortTime: string;\n timeZone: string;\n /** When omitted, inferred from locale (`fa-*` → solar-hijri). */\n calendar?: AXMTextTemplateCalendarSystem | string;\n};\n\n//#endregion\n\n//#region ----- Locale defaults -----\n\n/**\n * Default short-date pattern when settings do not provide ShortDate.\n * Aligns with locale-management profiles (en-US / en-AU / en-NZ / fa-IR).\n */\nexport function defaultShortDatePatternForLocale(locale: string): string {\n const code = normalizeLocale(locale);\n if (code === 'en-us') {\n return 'MM/DD/YYYY';\n }\n if (code.startsWith('fa')) {\n return 'YYYY/MM/DD';\n }\n // en-AU, en-NZ, en-GB, and most other locales\n return 'DD/MM/YYYY';\n}\n\nexport function defaultShortTimePatternForLocale(_locale: string): string {\n return 'HH:mm';\n}\n\n/**\n * Resolves calendar: settings value, else `solar-hijri` for `fa-*`, else Gregorian.\n */\nexport function resolveTextTemplateCalendar(\n locale: string,\n calendarSetting?: string | null,\n): AXMTextTemplateCalendarSystem {\n const setting = (calendarSetting ?? '').trim().toLowerCase();\n if (\n setting === 'solar-hijri' ||\n setting === 'jalali' ||\n setting === 'persian' ||\n setting === 'hijri-shamsi'\n ) {\n return 'solar-hijri';\n }\n if (setting === 'gregory' || setting === 'gregorian') {\n return 'gregory';\n }\n return normalizeLocale(locale).startsWith('fa') ? 'solar-hijri' : 'gregory';\n}\n\n//#endregion\n\n//#region ----- Date / number formatting (Nest-safe) -----\n\n/**\n * Parses ISO / `YYYY-MM-DD` / Date-like merge values into a Date.\n * Date-only keys are treated as UTC midnight to avoid off-by-one shifts.\n */\nexport function parseTextTemplateDateValue(value: unknown): Date | null {\n if (value == null || value === '') {\n return null;\n }\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) {\n const date = new Date(`${trimmed}T00:00:00.000Z`);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n const date = new Date(trimmed);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Formats a date with regional patterns (`DD/MM/YYYY`, `D MMMM YYYY`, `HH:mm`, …)\n * using the active locale for month names, digits, and calendar (Jalali for fa-IR).\n */\nexport function formatTextTemplateDate(\n value: unknown,\n pattern: string,\n timeZone = 'UTC',\n locale = 'en-US',\n calendar?: AXMTextTemplateCalendarSystem | string,\n): string {\n const date = parseTextTemplateDateValue(value);\n if (!date) {\n return value == null ? '' : String(value);\n }\n\n const resolvedLocale = locale?.trim() || 'en-US';\n const resolvedCalendar = resolveTextTemplateCalendar(resolvedLocale, calendar);\n const intlCalendar = resolvedCalendar === 'solar-hijri' ? 'persian' : 'gregory';\n const parts = getZonedCalendarParts(date, timeZone || 'UTC', resolvedLocale, intlCalendar);\n const monthLong = getLocalizedMonthName(date, resolvedLocale, intlCalendar, timeZone || 'UTC', 'long');\n const monthShort = getLocalizedMonthName(date, resolvedLocale, intlCalendar, timeZone || 'UTC', 'short');\n\n let out = pattern?.trim() || defaultShortDatePatternForLocale(resolvedLocale);\n // Longer tokens first.\n out = out.replace(/YYYY/g, formatLocaleInteger(parts.year, resolvedLocale, 4));\n out = out.replace(/MMMM/g, monthLong);\n out = out.replace(/MMM/g, monthShort);\n out = out.replace(/MM/g, formatLocaleInteger(parts.month, resolvedLocale, 2));\n out = out.replace(/\\bM\\b/g, formatLocaleInteger(parts.month, resolvedLocale, 0));\n out = out.replace(/DD/g, formatLocaleInteger(parts.day, resolvedLocale, 2));\n out = out.replace(/\\bD\\b/g, formatLocaleInteger(parts.day, resolvedLocale, 0));\n out = out.replace(/HH/g, formatLocaleInteger(parts.hour, resolvedLocale, 2));\n out = out.replace(/mm/g, formatLocaleInteger(parts.minute, resolvedLocale, 2));\n out = out.replace(/ss/g, formatLocaleInteger(parts.second, resolvedLocale, 2));\n return out;\n}\n\nexport function formatTextTemplateNumber(\n value: unknown,\n locale: string,\n options: { style?: 'decimal' | 'integer' | 'currency' | 'percent'; currency?: string } = {},\n): string {\n const num = coerceNumber(value);\n if (num == null) {\n return value == null ? '' : String(value);\n }\n const resolvedLocale = locale?.trim() || 'en-US';\n const style = options.style ?? 'decimal';\n try {\n if (style === 'integer') {\n return new Intl.NumberFormat(resolvedLocale, {\n maximumFractionDigits: 0,\n }).format(num);\n }\n if (style === 'percent') {\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(num);\n }\n if (style === 'currency') {\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'currency',\n currency: options.currency?.trim() || defaultCurrencyForLocale(resolvedLocale),\n }).format(num);\n }\n return new Intl.NumberFormat(resolvedLocale, {\n maximumFractionDigits: 6,\n }).format(num);\n } catch {\n return String(num);\n }\n}\n\n/**\n * Formats merge values using PlatformManagement.Token `dataType` / `format` metadata.\n * Unknown tokens and non-typed strings are left unchanged.\n */\nexport function formatTextTemplateMergeValues(\n merge: Record<string, string>,\n metaByName: Record<string, AXMTextTemplateTokenFormatMeta>,\n regional: AXMTextTemplateRegionalFormatContext,\n): Record<string, string> {\n const out: Record<string, string> = { ...merge };\n const locale = regional.locale?.trim() || 'en-US';\n const shortDate =\n regional.shortDate?.trim() || defaultShortDatePatternForLocale(locale);\n const shortTime =\n regional.shortTime?.trim() || defaultShortTimePatternForLocale(locale);\n const timeZone = regional.timeZone?.trim() || 'UTC';\n const calendar = resolveTextTemplateCalendar(locale, regional.calendar);\n\n for (const [name, raw] of Object.entries(merge)) {\n const meta = metaByName[name];\n if (!meta) {\n continue;\n }\n const dataType = (meta.dataType ?? 'String').trim();\n const format = (meta.format ?? 'None').trim();\n\n if (dataType === 'DateTime') {\n const pattern = `${shortDate} ${shortTime}`.trim();\n const dateOnly = looksLikeDateOnly(raw);\n out[name] = formatTextTemplateDate(\n raw,\n dateOnly ? shortDate : pattern,\n timeZone,\n locale,\n calendar,\n );\n continue;\n }\n\n if (dataType === 'Integer') {\n out[name] = formatTextTemplateNumber(raw, locale, { style: 'integer' });\n continue;\n }\n\n if (dataType === 'Decimal' || format === 'Currency' || format === 'Percent') {\n const style =\n format === 'Currency' ? 'currency' : format === 'Percent' ? 'percent' : 'decimal';\n out[name] = formatTextTemplateNumber(raw, locale, { style });\n }\n }\n\n return out;\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizeLocale(locale: string): string {\n return (locale ?? 'en-US').trim().toLowerCase() || 'en-us';\n}\n\nfunction defaultCurrencyForLocale(locale: string): string {\n const code = normalizeLocale(locale);\n if (code === 'en-au') return 'AUD';\n if (code === 'en-nz') return 'NZD';\n if (code.startsWith('fa') || code === 'en-ir') return 'IRR';\n if (code === 'en-gb') return 'GBP';\n return 'USD';\n}\n\nfunction coerceNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const num = Number(value.trim());\n return Number.isFinite(num) ? num : null;\n }\n return null;\n}\n\nfunction looksLikeDateOnly(value: string): boolean {\n const trimmed = value.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) {\n return true;\n }\n return /^\\d{4}-\\d{2}-\\d{2}T00:00:00(?:\\.0+)?Z$/i.test(trimmed);\n}\n\nfunction formatLocaleInteger(value: number, locale: string, minDigits: number): string {\n const abs = Math.trunc(Math.abs(value));\n const padded = minDigits > 0 ? String(abs).padStart(minDigits, '0') : String(abs);\n try {\n // Format digit-by-digit so padding zeros stay and locale digits apply (fa-IR → ۰۱۲…).\n return padded\n .split('')\n .map((ch) => new Intl.NumberFormat(locale, { useGrouping: false }).format(Number(ch)))\n .join('');\n } catch {\n return padded;\n }\n}\n\nfunction getLocalizedMonthName(\n date: Date,\n locale: string,\n calendar: 'persian' | 'gregory',\n timeZone: string,\n width: 'long' | 'short',\n): string {\n try {\n return new Intl.DateTimeFormat(locale, {\n timeZone,\n calendar,\n month: width,\n }).format(date);\n } catch {\n try {\n return new Intl.DateTimeFormat('en-US', {\n timeZone,\n calendar: 'gregory',\n month: width,\n }).format(date);\n } catch {\n return String(date.getUTCMonth() + 1);\n }\n }\n}\n\nfunction getZonedCalendarParts(\n date: Date,\n timeZone: string,\n locale: string,\n calendar: 'persian' | 'gregory',\n): { year: number; month: number; day: number; hour: number; minute: number; second: number } {\n try {\n const formatter = new Intl.DateTimeFormat(locale, {\n timeZone: timeZone || 'UTC',\n calendar,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n // Keep part extraction numeric-stable; display digits are localized later.\n numberingSystem: 'latn',\n });\n const parts = formatter.formatToParts(date);\n const read = (type: Intl.DateTimeFormatPartTypes): number => {\n const value = parts.find((part) => part.type === type)?.value;\n return value ? Number(value) : 0;\n };\n let hour = read('hour');\n // Some engines emit 24:00 for midnight.\n if (hour === 24) {\n hour = 0;\n }\n return {\n year: read('year'),\n month: read('month'),\n day: read('day'),\n hour,\n minute: read('minute'),\n second: read('second'),\n };\n } catch {\n return {\n year: date.getUTCFullYear(),\n month: date.getUTCMonth() + 1,\n day: date.getUTCDate(),\n hour: date.getUTCHours(),\n minute: date.getUTCMinutes(),\n second: date.getUTCSeconds(),\n };\n }\n}\n\n//#endregion\n","import { AXPCategoryListItem, AXPMultiLanguageString, type AXPPlatformScopeKey } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\n//#region ----- Types -----\n\n/** Stored value: { email: { subject?, body }, sms: { body }, ... } */\nexport interface AXMTextTemplateChannelsValue {\n [channelName: string]: {\n subject?: AXPMultiLanguageString;\n body: AXPMultiLanguageString;\n };\n}\n\nexport type AXMTextTemplateChannelEditorType = 'plain' | 'rich';\n\nexport interface AXMTextTemplateChannelConfigureSettings {\n /** Settings definition section name (e.g. `smtp-settings`). */\n section: string;\n /** Optional parent group when section names are not unique. */\n group?: string;\n scope: AXPPlatformScopeKey;\n}\n\nexport interface AXMTextTemplateChannelDefinition {\n name: string;\n title: string;\n type: AXMTextTemplateChannelEditorType;\n hasSubject?: boolean;\n communicationChannelKey?: string;\n requiredSettingKeys?: string[];\n configureSettings?: AXMTextTemplateChannelConfigureSettings;\n notConfiguredMessageKey?: string;\n}\n\nexport interface AXMTextTemplateChannelDefinitionProvider {\n getChannels(): AXMTextTemplateChannelDefinition[];\n}\n\n/** Template kind: content (leaf message) or master (layout shell with `[content]`). */\nexport const AXM_TEXT_TEMPLATE_KIND = {\n Content: 'content',\n Master: 'master',\n} as const;\n\nexport type AXMTextTemplateKind = (typeof AXM_TEXT_TEMPLATE_KIND)[keyof typeof AXM_TEXT_TEMPLATE_KIND];\n\n/** Print / PDF channel key on `channels` (rich body, no subject). */\nexport const AXM_TEXT_TEMPLATE_PRINT_CHANNEL = 'print' as const;\n\n/** Reserved body slot for child template body injection (not a `{{token}}` variable). */\nexport const AXM_TEXT_TEMPLATE_CONTENT_SLOT = '[content]' as const;\n\n/** Max `parentId` chain length (leaf → … → root), including the leaf. */\nexport const AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH = 5;\n\nexport interface AXMTextTemplateEntityModel extends AXPEntityModel<string> {\n title?: AXPMultiLanguageString;\n /** `content` (default) or `master` layout template. */\n kind?: AXMTextTemplateKind;\n /** Optional parent master template id (multi-level nesting supported). */\n parentId?: string | null;\n /** Join snapshot for `parentId` lookup. */\n parent?: { id?: string; title?: AXPMultiLanguageString | string } | null;\n channels?: AXMTextTemplateChannelsValue;\n categoryIds?: string[];\n categories?: AXPCategoryListItem[];\n}\n\n//#endregion\n","import type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { resolveMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport {\n collectPathRootsFromSource,\n createTextTemplateEngine,\n} from '@acorex-platform/framework-shared/text-template';\nimport {\n defaultShortDatePatternForLocale,\n defaultShortTimePatternForLocale,\n resolveTextTemplateCalendar,\n} from './text-template-locale-format.util';\nimport {\n AXM_TEXT_TEMPLATE_CONTENT_SLOT,\n AXM_TEXT_TEMPLATE_KIND,\n AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH,\n type AXMTextTemplateChannelsValue,\n type AXMTextTemplateKind,\n} from './text-template.types';\n\n//#region ----- Placeholder replacement -----\n\nconst previewEngine = createTextTemplateEngine();\n\n/**\n * Collects unique root paths from template source (`{{ employee.name }}`, `{{#table users as user}}`).\n */\nexport function collectTextTemplatePlaceholderNames(text: string): string[] {\n return collectPathRootsFromSource(text ?? '');\n}\n\nfunction previewContext(data: Record<string, unknown>, slotContent = '') {\n const locale = 'en-US';\n return {\n channel: 'email',\n locale,\n data,\n regional: {\n locale,\n shortDate: defaultShortDatePatternForLocale(locale),\n shortTime: defaultShortTimePatternForLocale(locale),\n timeZone: 'UTC',\n calendar: resolveTextTemplateCalendar(locale),\n },\n tokenMeta: {},\n slotContent,\n };\n}\n\n/**\n * Interpolates `{{ path | pipe }}` using typed `data` (and optional `[content]`).\n * Does not parse block tags (`{{#table}}`, …) — use {@link renderTextTemplateSource} for bodies.\n */\nexport function replaceTextTemplatePlaceholders(\n text: string,\n data: Record<string, unknown> = {},\n): string {\n return previewEngine.interpolate(text ?? '', previewContext(data));\n}\n\n/**\n * Parses source to blocks and renders for the email channel (local preview / compose fallback).\n */\nexport function renderTextTemplateSource(\n source: string,\n data: Record<string, unknown> = {},\n slotContent = '',\n): string {\n return previewEngine.render(source ?? '', previewContext(data, slotContent));\n}\n\n/**\n * Resolves a template channel field (plain string or per-locale map) for the active locale.\n */\nexport function resolveTextTemplateLocalizedString(\n value: AXPMultiLanguageString | string | undefined | null,\n locale: string,\n): string {\n if (value == null || value === '') {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n return resolveMultiLanguageString(value, locale);\n}\n\n/**\n * Returns true when `text` contains the reserved `[content]` slot.\n */\nexport function textTemplateContainsContentSlot(text: string | null | undefined): boolean {\n if (text == null || text === '') {\n return false;\n }\n return text.includes(AXM_TEXT_TEMPLATE_CONTENT_SLOT);\n}\n\n/**\n * Injects child body into every `[content]` occurrence in a master body.\n */\nexport function replaceTextTemplateContentSlot(masterBody: string, content: string): string {\n if (!masterBody.includes(AXM_TEXT_TEMPLATE_CONTENT_SLOT)) {\n return masterBody;\n }\n return masterBody.split(AXM_TEXT_TEMPLATE_CONTENT_SLOT).join(content);\n}\n\n/**\n * Composes a body chain: leaf first, then parents toward root.\n * Injects `[content]` only — callers interpolate or {@link renderTextTemplateSource} afterward.\n */\nexport function composeTextTemplateBodyChain(bodiesLeafToRoot: string[]): string {\n if (!bodiesLeafToRoot.length) {\n return '';\n }\n let body = bodiesLeafToRoot[0] ?? '';\n for (let i = 1; i < bodiesLeafToRoot.length; i++) {\n body = replaceTextTemplateContentSlot(bodiesLeafToRoot[i] ?? '', body);\n }\n return body;\n}\n\n//#endregion\n\n//#region ----- Validation helpers -----\n\nfunction collectLocalizedBodyStrings(body: AXPMultiLanguageString | string | undefined | null): string[] {\n if (body == null || body === '') {\n return [];\n }\n if (typeof body === 'string') {\n return body.trim() ? [body] : [];\n }\n return Object.values(body).filter((v): v is string => typeof v === 'string' && v.trim().length > 0);\n}\n\n/**\n * Master templates: every non-empty channel body locale must include `[content]`.\n * Content templates: no channel body may include `[content]`.\n */\nexport function validateTextTemplateContentSlots(input: {\n kind: AXMTextTemplateKind | string | undefined | null;\n channels: AXMTextTemplateChannelsValue | undefined | null;\n}): { ok: true } | { ok: false; error: string } {\n const kind = (input.kind ?? AXM_TEXT_TEMPLATE_KIND.Content) as string;\n const channels = input.channels ?? {};\n const channelEntries = Object.entries(channels);\n\n if (kind === AXM_TEXT_TEMPLATE_KIND.Master) {\n if (!channelEntries.length) {\n return { ok: false, error: 'Master templates must define at least one channel with a [content] slot.' };\n }\n for (const [channelName, channel] of channelEntries) {\n const bodies = collectLocalizedBodyStrings(channel?.body);\n if (!bodies.length) {\n return {\n ok: false,\n error: `Master template channel \"${channelName}\" must include a body with the [content] slot.`,\n };\n }\n for (const body of bodies) {\n if (!textTemplateContainsContentSlot(body)) {\n return {\n ok: false,\n error: `Master template channel \"${channelName}\" body must include the [content] slot.`,\n };\n }\n }\n }\n return { ok: true };\n }\n\n for (const [channelName, channel] of channelEntries) {\n for (const body of collectLocalizedBodyStrings(channel?.body)) {\n if (textTemplateContainsContentSlot(body)) {\n return {\n ok: false,\n error: `Content template channel \"${channelName}\" must not include the reserved [content] slot.`,\n };\n }\n }\n }\n return { ok: true };\n}\n\nexport interface AXMTextTemplateParentChainNode {\n id: string;\n kind?: string | null;\n parentId?: string | null;\n}\n\n/**\n * Validates parent reference and walks the parent chain for kind, cycles, and max depth.\n * `loadParent` should return the next parent row (or null when missing).\n */\nexport async function validateTextTemplateParentChain(input: {\n id?: string | null;\n parentId?: string | null;\n maxDepth?: number;\n loadParent: (id: string) => Promise<AXMTextTemplateParentChainNode | null>;\n}): Promise<{ ok: true } | { ok: false; error: string }> {\n const parentId = input.parentId?.trim() || null;\n if (!parentId) {\n return { ok: true };\n }\n\n const selfId = input.id?.trim() || null;\n if (selfId && parentId === selfId) {\n return { ok: false, error: 'A text template cannot be its own parent.' };\n }\n\n const maxDepth = input.maxDepth ?? AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH;\n const visited = new Set<string>();\n if (selfId) {\n visited.add(selfId);\n }\n\n let currentId: string | null = parentId;\n let depth = 1;\n\n while (currentId) {\n if (visited.has(currentId)) {\n return { ok: false, error: 'Text template parent chain contains a cycle.' };\n }\n if (depth > maxDepth) {\n return {\n ok: false,\n error: `Text template parent chain exceeds the maximum depth of ${maxDepth}.`,\n };\n }\n\n visited.add(currentId);\n const parent = await input.loadParent(currentId);\n if (!parent) {\n return { ok: false, error: `Parent text template not found (id: ${currentId}).` };\n }\n if ((parent.kind ?? AXM_TEXT_TEMPLATE_KIND.Content) !== AXM_TEXT_TEMPLATE_KIND.Master) {\n return { ok: false, error: 'Parent text template must be a master template.' };\n }\n\n currentId = parent.parentId?.trim() || null;\n depth += 1;\n }\n\n return { ok: true };\n}\n\n//#endregion\n","import type { AXMTextTemplateChannelsValue } from './text-template.types';\n\n//#region ----- Text template render contracts -----\n\n/** Server + client command key for rendering a text template channel. */\nexport const AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY = 'ContentManagement:TextTemplate:Render' as const;\n\n/**\n * Request to render a persisted text template channel with typed domain/event data.\n * Walks optional `parentId` masters and injects child body into `[content]`.\n */\nexport interface AXMTextTemplateRenderRequest {\n textTemplateId: string;\n /**\n * When set, `textTemplateId` may be a canonical seed id; the render engine\n * remaps it with tenantMasterId(`content`, tenantId, id) for the tenant copy.\n * Also used for settings cascade (tenant Language / ShortDate / …).\n */\n tenantId?: string;\n /**\n * Optional recipient / actor user id. When set, User Language and regional\n * patterns are preferred over tenant/platform settings.\n */\n userId?: string;\n /** Channel key on `channels`, e.g. `email`, `sms`. Defaults to `email`. */\n channel?: string;\n /**\n * Explicit locale override for MLS subject/body and number formatting.\n * When omitted, resolved from settings: User Language → Tenant Language →\n * Platform Language → `en-US`.\n */\n locale?: string;\n /**\n * Event tokens and domain graphs (`users`, `workOrders`, …).\n * Context/Computed tokens (`companyName`, …) are filled from PlatformManagement.Tokens.\n */\n data?: Record<string, unknown>;\n}\n\n/**\n * Rendered subject/body for one channel after engine render and parent composition.\n */\nexport interface AXMTextTemplateRenderResult {\n textTemplateId: string;\n channel: string;\n subject?: string;\n body: string;\n}\n\n//#endregion\n\n//#region ----- Text template draft preview contracts -----\n\n/** Server command key for previewing unsaved draft text template content. */\nexport const AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY = 'ContentManagement:TextTemplate:Preview' as const;\n\n/**\n * Request to preview draft channel content with optional parent masters.\n * Uses the same composition / Context token fill as render, then fills Event samples.\n */\nexport interface AXMTextTemplatePreviewRequest {\n /** Draft channel map from the editor (not persisted). */\n channels: AXMTextTemplateChannelsValue;\n /** Optional persisted master parent id to walk for `[content]` shells. */\n parentId?: string | null;\n /** Template kind from the host form (`content` | `master`). Informational. */\n kind?: string;\n /** Channel key on `channels`, e.g. `email`, `sms`. Defaults to `email`. */\n channel?: string;\n /**\n * Locale for MLS fields and number formatting. Defaults to active UI language on the client,\n * or `en-US` when omitted on the server.\n */\n locale?: string;\n /** Optional data overrides (applied before Context resolve and Event samples). */\n data?: Record<string, unknown>;\n}\n\n/**\n * Preview subject/body for one channel after engine render and parent composition.\n */\nexport interface AXMTextTemplatePreviewResult {\n channel: string;\n subject?: string;\n body: string;\n}\n\n//#endregion\n","//#region ----- Seeded text template ids -----\n\n/**\n * Namespace for {@link tenantMasterId} when cloning text templates per tenant\n * (`packs` SetupTenant → `content-management.common-setup`).\n */\nexport const AXM_TEXT_TEMPLATE_TENANT_MASTER_NAMESPACE = 'content' as const;\n\n/**\n * Canonical ContentManagement.TextTemplate ids used as SetupTenant clone keys\n * and runtime lookups (resolve via tenantMasterId + tenantId).\n * Keep aligned with packs `text-template.mock.ids.ts`.\n *\n * Prefix `c71000` — same as `mockStableUuid('c71000', seq)`.\n */\nexport const AXM_TEXT_TEMPLATE_IDS = {\n emailCompanyMaster: 'c7100001-0001-4111-b111-010101010101',\n passwordReset: 'c7100002-0001-4111-b111-020202020202',\n emailVerification: 'c7100003-0001-4111-b111-030303030303',\n passwordChanged: 'c7100004-0001-4111-b111-040404040404',\n ticketReceived: 'c7100005-0001-4111-b111-050505050505',\n ticketResolved: 'c7100006-0001-4111-b111-060606060606',\n employeeHappyBirthday: 'c7100007-0001-4111-b111-070707070707',\n employeeJoiningCompany: 'c7100008-0001-4111-b111-080808080808',\n /** Combined document expiration digest (expired + near) — daily notifier (email + in-app). */\n documentExpired: 'c7100009-0001-4111-b111-090909090909',\n /** Legacy near-expiry template id; same digest body as documentExpired. */\n documentNearExpiry: 'c710000a-0001-4111-b111-0a0a0a0a0a0a',\n /** Company print master — header, border, footer around `[content]`. */\n printCompanyMaster: 'c710000b-0001-4111-b111-0b0b0b0b0b0b',\n /** Default questionnaire print child (title, date, `{{sessionBody}}`). */\n questionnairePrint: 'c710000c-0001-4111-b111-0c0c0c0c0c0c',\n /** Daily list of employees with a birthday today — emailed to account holders. */\n employeeBirthdayDigest: 'c710000d-0001-4111-b111-0d0d0d0d0d0d',\n /** Daily list of employees whose hire date is today — emailed to account holders. */\n employeeJoiningDigest: 'c710000e-0001-4111-b111-0e0e0e0e0e0e',\n /** List of tenants with no login in the last 30 days. */\n tenantLoginDigest: 'c710000f-0001-4111-b111-0f0f0f0f0f0f',\n} as const;\n\n//#endregion\n","//#region ---- Contracts barrel ----\n\nexport * from './menu.keys';\nexport * from './permission.keys';\n\nexport * from './root-config';\n\n//#endregion\n\nexport * from './entities';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ import { DomSanitizer } from '@angular/platform-browser';
|
|
|
29
29
|
import * as i2 from '@angular/forms';
|
|
30
30
|
import { FormsModule } from '@angular/forms';
|
|
31
31
|
import { runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';
|
|
32
|
-
import { AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_CONTENT_SLOT, resolveTextTemplateLocalizedString, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, collectTextTemplatePlaceholderNames, RootConfig, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, composeTextTemplateBodyChain, replaceTextTemplatePlaceholders } from '@acorex-platform/module-content-management-client/contracts';
|
|
32
|
+
import { AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_CONTENT_SLOT, resolveTextTemplateLocalizedString, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, collectTextTemplatePlaceholderNames, RootConfig, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, composeTextTemplateBodyChain, replaceTextTemplatePlaceholders, renderTextTemplateSource } from '@acorex-platform/module-content-management-client/contracts';
|
|
33
33
|
import { AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER } from './acorex-platform-module-content-management-client.mjs';
|
|
34
34
|
|
|
35
35
|
class AXMTemplateContentEditorWidgetEditComponent extends AXPValueWidgetComponent {
|
|
@@ -602,7 +602,7 @@ class AXMTemplateContentEditorWidgetEditComponent extends AXPValueWidgetComponen
|
|
|
602
602
|
for (const channelName of Object.keys(value)) {
|
|
603
603
|
const leafBody = this.getChannelBody(channelName);
|
|
604
604
|
const parents = parentBodiesByChannel[channelName] ?? [];
|
|
605
|
-
next[channelName] = composeTextTemplateBodyChain([leafBody, ...parents]
|
|
605
|
+
next[channelName] = composeTextTemplateBodyChain([leafBody, ...parents]);
|
|
606
606
|
}
|
|
607
607
|
this.composedPreviewBodies.set(next);
|
|
608
608
|
await this.resolvePreviewVariables();
|
|
@@ -616,7 +616,7 @@ class AXMTemplateContentEditorWidgetEditComponent extends AXPValueWidgetComponen
|
|
|
616
616
|
return v?.sampleValue ?? `{{${varName}}}`;
|
|
617
617
|
}
|
|
618
618
|
/**
|
|
619
|
-
* Merge map for
|
|
619
|
+
* Merge map for interpolating `{{ path }}` in `text`.
|
|
620
620
|
* When `escapeMergeValuesForHtml` is true, substitution values are escaped for safe `innerHTML` fragments.
|
|
621
621
|
*/
|
|
622
622
|
previewMergeFor(text, escapeMergeValuesForHtml) {
|
|
@@ -659,8 +659,8 @@ class AXMTemplateContentEditorWidgetEditComponent extends AXPValueWidgetComponen
|
|
|
659
659
|
}
|
|
660
660
|
const composed = this.composedPreviewBodies()[channelName];
|
|
661
661
|
const body = composed ?? this.getChannelBody(channelName);
|
|
662
|
-
// Local fallback: do not escape
|
|
663
|
-
const merged =
|
|
662
|
+
// Local fallback: do not escape data for rich HTML (logo mark / styled shells).
|
|
663
|
+
const merged = renderTextTemplateSource(body, this.previewMergeFor(body, ch?.type !== 'rich'));
|
|
664
664
|
if (ch?.type === 'rich') {
|
|
665
665
|
return this.sanitizer.bypassSecurityTrustHtml(merged);
|
|
666
666
|
}
|
|
@@ -691,4 +691,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
691
691
|
}], ctorParameters: () => [], propDecorators: { wysiwygRef: [{ type: i0.ViewChild, args: ['wysiwygRef', { isSignal: true }] }], bodyTextareaRef: [{ type: i0.ViewChild, args: ['bodyTextarea', { ...{ read: (ElementRef) }, isSignal: true }] }] } });
|
|
692
692
|
|
|
693
693
|
export { AXMTemplateContentEditorWidgetEditComponent };
|
|
694
|
-
//# sourceMappingURL=acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-
|
|
694
|
+
//# sourceMappingURL=acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-BkSjAXjQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-BkSjAXjQ.mjs","sources":["../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/template-content-editor-widget-edit.component.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/template-content-editor-widget-edit.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXTabsModule } from '@acorex/components/tabs';\nimport { AXTextAreaModule } from '@acorex/components/text-area';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n AXWysiwygContainerComponent,\n AXWysiwygModule,\n} from '@acorex/components/wysiwyg';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport { AXPSettingsService, AXPTokenDefinitionService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPValueWidgetComponent } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';\nimport { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n effect,\n inject,\n OnInit,\n signal,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXPPlatformScope, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport {\n AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY,\n RootConfig,\n type AXMTextTemplatePreviewRequest,\n type AXMTextTemplatePreviewResult,\n} from '@acorex-platform/module-content-management-client/contracts';\nimport { AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER } from './channel-definition.provider';\nimport {\n AXMTextTemplateChannelDefinition,\n AXMTextTemplateChannelsValue,\n} from './channel-definition.types';\nimport {\n AXM_TEXT_TEMPLATE_CONTENT_SLOT,\n AXM_TEXT_TEMPLATE_KIND,\n AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH,\n collectTextTemplatePlaceholderNames,\n composeTextTemplateBodyChain,\n renderTextTemplateSource,\n replaceTextTemplatePlaceholders,\n resolveTextTemplateLocalizedString,\n type AXMTextTemplateEntityModel,\n} from './text-template-placeholder.util';\n\n/** Variable definition from PlatformManagement.Tokens for template preview and Insert variable */\ninterface TemplateVariable {\n name: string;\n title: string;\n sampleValue?: string;\n kind?: string;\n dataType?: string;\n}\n\n@Component({\n selector: 'axm-template-content-editor-widget-edit',\n templateUrl: './template-content-editor-widget-edit.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXDecoratorModule,\n FormsModule,\n AXFormModule,\n AXTabsModule,\n AXTextAreaModule,\n AXTextBoxModule,\n AXWysiwygModule,\n AXValidationModule,\n AXTranslationModule,\n AXButtonModule,\n AXDropdownModule,\n ],\n})\nexport class AXMTemplateContentEditorWidgetEditComponent\n extends AXPValueWidgetComponent<AXMTextTemplateChannelsValue | null>\n implements OnInit, AfterViewInit\n{\n /** Stored cursor/selection state before Insert Variable dropdown opens */\n private storedCursor: {\n channelName: string;\n isPlain: boolean;\n selectionStart?: number;\n selectionEnd?: number;\n range?: Range;\n } | null = null;\n private readonly channelProviders = inject(AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER, {\n optional: true,\n });\n private readonly settingsService = inject(AXPSettingsService);\n private readonly translationService = inject(AXTranslationService);\n private readonly entityService = inject(AXPEntityService);\n private readonly tokenDefinitionService = inject(AXPTokenDefinitionService, { optional: true });\n private readonly commandExecutor = inject(AXPCommandExecutor);\n private readonly toastService = inject(AXToastService);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly destroyRef = inject(DestroyRef);\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n\n /** Dedupes in-flight preview loads when effect re-runs. */\n private previewRequestSeq = 0;\n\n protected wysiwygRef = viewChild<AXWysiwygContainerComponent>('wysiwygRef');\n protected bodyTextareaRef = viewChild('bodyTextarea', { read: ElementRef<HTMLElement> });\n\n protected availableChannels = signal<AXMTextTemplateChannelDefinition[]>([]);\n protected channelConfigured = signal<Record<string, boolean>>({});\n protected availableVariables = signal<TemplateVariable[]>([]);\n protected activeTabIndex = signal<number>(0);\n protected viewMode = signal<'edit' | 'preview'>('edit');\n\n /** Resolved values for local preview fallback: expression/token evaluation, then sampleValue */\n protected resolvedPreviewValues = signal<Record<string, string>>({});\n\n /** Parent-chain bodies (leaf → root) for the active locale, keyed by channel (local fallback). */\n protected composedPreviewBodies = signal<Record<string, string>>({});\n\n /** Server Preview results keyed by channel (preferred over local compose). */\n protected serverPreviewByChannel = signal<\n Record<string, { subject?: string; body: string }>\n >({});\n\n protected activeChannel = computed(() => {\n const idx = this.activeTabIndex();\n const chs = this.availableChannels();\n return chs[idx] ?? null;\n });\n\n /** True when the host entity form has Kind = Master. */\n protected isMasterKind = computed(() => {\n this.contextService.changeEvent();\n const kind = this.contextService.getValue('kind');\n return kind === AXM_TEXT_TEMPLATE_KIND.Master;\n });\n\n protected otherChannelsWithContent = (currentName: string) =>\n this.availableChannels().filter(\n (c) => c.name !== currentName && (this.getChannelBody(c.name) || (c.hasSubject && this.getChannelSubject(c.name)))\n );\n\n /** Returns icon class for a variable/token based on kind and dataType */\n protected getVariableIcon(v: TemplateVariable): string {\n const kindMap: Record<string, string> = {\n Static: 'fa-light fa-database',\n Context: 'fa-light fa-layer-group',\n Event: 'fa-light fa-bolt',\n Computed: 'fa-light fa-calculator',\n Secret: 'fa-light fa-key',\n };\n const dataTypeMap: Record<string, string> = {\n String: 'fa-light fa-font',\n Integer: 'fa-light fa-hashtag',\n Boolean: 'fa-light fa-toggle-on',\n Decimal: 'fa-light fa-calculator',\n DateTime: 'fa-light fa-clock',\n Json: 'fa-light fa-braces',\n };\n const byKind = v.kind && kindMap[v.kind];\n if (byKind) return byKind;\n const byDataType = v.dataType && dataTypeMap[v.dataType];\n if (byDataType) return byDataType;\n return 'fa-light fa-code';\n }\n\n /** Returns icon class for a channel based on name and type */\n protected getChannelIcon(ch: AXMTextTemplateChannelDefinition): string {\n const nameMap: Record<string, string> = {\n email: 'fa-light fa-envelope',\n sms: 'fa-light fa-comment-sms',\n whatsapp: 'fa-brands fa-whatsapp',\n push: 'fa-light fa-bell',\n telegram: 'fa-brands fa-telegram',\n 'in-app': 'fa-light fa-inbox',\n };\n const byName = nameMap[ch.name?.toLowerCase() ?? ''];\n if (byName) return byName;\n return ch.type === 'rich' ? 'fa-light fa-file-lines' : 'fa-light fa-align-left';\n }\n\n private getTemplateLocale(): string {\n return this.translationService.getActiveLang() ?? 'en-US';\n }\n\n /**\n * Builds a mutable locale map from a stored channel field (string legacy or ML object).\n */\n private normalizeChannelFieldToMl(\n existing: AXPMultiLanguageString | string | undefined,\n ): Record<string, string> {\n if (existing == null || existing === '') {\n return {};\n }\n if (typeof existing === 'string') {\n const s = existing;\n return { 'en-US': s, 'fa-IR': s };\n }\n return { ...(existing as Record<string, string>) };\n }\n\n constructor() {\n super();\n effect(() => {\n this.viewMode();\n this.activeTabIndex();\n this.getValue();\n this.contextService.changeEvent();\n if (this.viewMode() === 'preview') {\n void this.loadServerPreview();\n } else {\n this.previewRequestSeq += 1;\n this.resolvedPreviewValues.set({});\n this.composedPreviewBodies.set({});\n this.serverPreviewByChannel.set({});\n }\n });\n\n this.settingsService.onChanged.subscribe(() => {\n void this.refreshChannelConfiguration();\n });\n }\n\n protected isChannelConfigured(name: string): boolean {\n return this.channelConfigured()[name] ?? true;\n }\n\n protected async openChannelConfigure(channel: AXMTextTemplateChannelDefinition): Promise<void> {\n const configure = channel.configureSettings;\n if (!configure) {\n return;\n }\n\n const saved = await this.settingsService.showSectionPopup({\n scope: configure.scope,\n section: configure.section,\n group: configure.group,\n });\n if (saved) {\n await this.refreshChannelConfiguration();\n }\n }\n\n private async refreshChannelConfiguration(): Promise<void> {\n const channels = this.availableChannels();\n const next: Record<string, boolean> = {};\n for (const channel of channels) {\n next[channel.name] = await this.isChannelConfiguredInternal(channel);\n }\n this.channelConfigured.set(next);\n }\n\n private async isChannelConfiguredInternal(channel: AXMTextTemplateChannelDefinition): Promise<boolean> {\n const requiredKeys = channel.requiredSettingKeys ?? [];\n if (!requiredKeys.length) {\n return true;\n }\n const scopeKey = channel.configureSettings?.scope ?? 'T';\n const scoped = this.settingsService.scope(scopeKey as AXPPlatformScope);\n for (const key of requiredKeys) {\n const value = await scoped.get(key);\n if (!this.hasNonEmptySettingValue(value)) {\n return false;\n }\n }\n return true;\n }\n\n private hasNonEmptySettingValue(value: unknown): boolean {\n if (value == null) {\n return false;\n }\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n if (typeof value === 'number') {\n return Number.isFinite(value);\n }\n if (typeof value === 'boolean') {\n return true;\n }\n if (typeof value === 'object' && 'value' in value) {\n return this.hasNonEmptySettingValue((value as { value?: unknown }).value);\n }\n return String(value).trim().length > 0;\n }\n\n ngAfterViewInit(): void {\n const el = this.hostRef.nativeElement;\n const handleMousedown = (e: MouseEvent) => {\n const target = e.target as Node;\n if (!target || !el.contains(target)) return;\n const trigger = (target as Element).closest?.('[data-insert-var-trigger]');\n if (!trigger) return;\n this.captureCursorBeforeInsert();\n };\n el.addEventListener('mousedown', handleMousedown, { capture: true });\n this.destroyRef.onDestroy(() =>\n el.removeEventListener('mousedown', handleMousedown, { capture: true })\n );\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n const rawCh = this.channelProviders;\n const chProviders = rawCh == null ? [] : Array.isArray(rawCh) ? rawCh : [rawCh];\n const allChannels: AXMTextTemplateChannelDefinition[] = [];\n for (const p of chProviders) {\n if (p?.getChannels) allChannels.push(...p.getChannels());\n }\n this.availableChannels.set(\n Array.from(new Map(allChannels.map((c) => [c.name, c])).values())\n );\n await this.refreshChannelConfiguration();\n\n try {\n const tokensAccessor = this.entityService.withEntity('PlatformManagement', 'Tokens').data();\n const result = await tokensAccessor.query({ skip: 0, take: 500 });\n const items = (result.items ?? []) as Array<{\n name?: string;\n title?: string;\n sampleValue?: string;\n kind?: string;\n dataType?: string;\n }>;\n const vars: TemplateVariable[] = items\n .map((t) => ({\n name: String(t.name ?? ''),\n title: String(t.title ?? t.name ?? ''),\n sampleValue: t.sampleValue != null ? String(t.sampleValue) : undefined,\n kind: t.kind,\n dataType: t.dataType,\n }))\n .filter((v) => v.name);\n this.availableVariables.set(Array.from(new Map(vars.map((v) => [v.name, v])).values()));\n } catch {\n this.availableVariables.set([]);\n }\n\n const value = this.getValue();\n if (value && typeof value === 'object' && Object.keys(value).length > 0) {\n const names = Object.keys(value);\n const chs = this.availableChannels();\n const idx = chs.findIndex((c) => names.includes(c.name));\n if (idx >= 0) this.activeTabIndex.set(idx);\n }\n }\n\n /** Capture cursor/selection before dropdown opens (runs in mousedown capture phase) */\n private captureCursorBeforeInsert(): void {\n const ch = this.activeChannel();\n if (!ch) return;\n this.storedCursor = null;\n const active = document.activeElement as HTMLElement | null;\n if (!active) return;\n if (ch.type === 'plain') {\n const textarea = this.getTextareaElement(active);\n if (textarea) {\n this.storedCursor = {\n channelName: ch.name,\n isPlain: true,\n selectionStart: textarea.selectionStart,\n selectionEnd: textarea.selectionEnd,\n };\n }\n } else {\n const editable = this.getContentEditableElement(active);\n if (editable) {\n const sel = document.getSelection();\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0).cloneRange();\n this.storedCursor = {\n channelName: ch.name,\n isPlain: false,\n range,\n };\n }\n }\n }\n }\n\n private getTextareaElement(el: HTMLElement): HTMLTextAreaElement | null {\n if (el instanceof HTMLTextAreaElement) return el;\n return el.querySelector?.('textarea') ?? null;\n }\n\n private getContentEditableElement(el: HTMLElement): HTMLElement | null {\n if (el.isContentEditable) return el;\n return el.closest?.('[contenteditable=\"true\"]') ?? null;\n }\n\n protected insertVariable(channelName: string, varName: string): void {\n this.insertToken(channelName, `{{${varName}}}`);\n }\n\n protected insertContentSlot(channelName: string): void {\n this.insertToken(channelName, AXM_TEXT_TEMPLATE_CONTENT_SLOT);\n }\n\n private insertToken(channelName: string, token: string): void {\n const current = this.getChannelBody(channelName);\n const stored = this.storedCursor;\n this.storedCursor = null;\n\n if (stored && stored.channelName === channelName) {\n if (stored.isPlain) {\n const start = stored.selectionStart ?? current.length;\n const end = stored.selectionEnd ?? start;\n const before = current.slice(0, start);\n const after = current.slice(end);\n const newBody = before + token + after;\n this.setChannelBody(channelName, newBody);\n const newCursor = start + token.length;\n queueMicrotask(() => this.restoreTextareaCursor(newCursor));\n } else if (stored.range) {\n try {\n const startNode = stored.range.startContainer;\n const elem = startNode.nodeType === Node.TEXT_NODE\n ? (startNode as Text).parentElement\n : (startNode as Element);\n const editable = elem?.closest?.('[contenteditable=\"true\"]') as HTMLElement | null;\n const wysiwyg = this.wysiwygRef();\n const target = editable ?? wysiwyg?.getHostElement()?.querySelector?.('[contenteditable=\"true\"]');\n if (target) {\n (target as HTMLElement).focus();\n const sel = document.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(stored.range);\n document.execCommand('insertText', false, token);\n }\n } else {\n this.setChannelBody(channelName, current + token);\n }\n } catch {\n this.setChannelBody(channelName, current + token);\n }\n }\n } else {\n this.setChannelBody(channelName, current + token);\n }\n }\n\n private restoreTextareaCursor(position: number): void {\n const ref = this.bodyTextareaRef();\n const el = ref?.nativeElement;\n const textarea = el?.querySelector?.('textarea') ?? (el instanceof HTMLTextAreaElement ? el : null);\n if (textarea) {\n textarea.focus();\n textarea.setSelectionRange(position, position);\n }\n }\n\n protected copyFromChannel(targetName: string, sourceName: string): void {\n const ch = this.availableChannels().find((c) => c.name === sourceName);\n if (!ch) return;\n const hasSubject = ch.hasSubject;\n if (hasSubject) {\n this.setChannelSubject(targetName, this.getChannelSubject(sourceName));\n }\n this.setChannelBody(targetName, this.getChannelBody(sourceName));\n }\n\n protected getChannelSubject(name: string): string {\n const v = this.getValue()?.[name];\n const raw =\n v && typeof v === 'object' && 'subject' in v ? (v as { subject?: AXPMultiLanguageString }).subject : undefined;\n return resolveTextTemplateLocalizedString(raw, this.getTemplateLocale());\n }\n\n protected setChannelSubject(name: string, value: string): void {\n const current = this.getValue() || {};\n const ch = current[name] || { body: '' };\n const locale = this.getTemplateLocale();\n const ml = this.normalizeChannelFieldToMl(ch.subject);\n ml[locale] = value ?? '';\n this.setValue({ ...current, [name]: { ...ch, subject: ml } });\n }\n\n protected getChannelBody(name: string): string {\n const v = this.getValue()?.[name];\n const raw =\n v && typeof v === 'object' && 'body' in v ? (v as { body?: AXPMultiLanguageString }).body : undefined;\n return resolveTextTemplateLocalizedString(raw, this.getTemplateLocale());\n }\n\n protected handleWysiwygChange(name: string, e: AXValueChangedEvent<string>): void {\n const val =\n typeof e === 'object' && e !== null && 'value' in e\n ? (e as { value: string }).value\n : String(e ?? '');\n this.setChannelBody(name, val);\n }\n\n protected setChannelBody(name: string, value: string): void {\n const current = this.getValue() || {};\n const ch = current[name] || { body: '' };\n const hasSubject =\n this.availableChannels().find((c) => c.name === name)?.hasSubject ?? false;\n const locale = this.getTemplateLocale();\n const ml = this.normalizeChannelFieldToMl(ch.body);\n ml[locale] = value ?? '';\n if (hasSubject) {\n this.setValue({ ...current, [name]: { ...ch, body: ml } });\n } else {\n this.setValue({ ...current, [name]: { body: ml } });\n }\n }\n\n /**\n * Prefer server draft Preview (Context tokens + Event samples + parent composition).\n * Falls back to local compose when the command fails.\n */\n private async loadServerPreview(): Promise<void> {\n const requestSeq = ++this.previewRequestSeq;\n const value = this.getValue();\n const channel = this.activeChannel()?.name?.trim() || '';\n if (!value || typeof value !== 'object' || !channel) {\n this.serverPreviewByChannel.set({});\n this.composedPreviewBodies.set({});\n return;\n }\n\n const locale = this.getTemplateLocale();\n const parentIdRaw = this.contextService.getValue('parentId');\n const parentId = typeof parentIdRaw === 'string' ? parentIdRaw.trim() : '';\n const kindRaw = this.contextService.getValue('kind');\n const kind = typeof kindRaw === 'string' ? kindRaw.trim() : undefined;\n\n const request: AXMTextTemplatePreviewRequest = {\n channels: value,\n channel,\n locale,\n ...(parentId ? { parentId } : {}),\n ...(kind ? { kind } : {}),\n };\n\n try {\n const result = await this.commandExecutor.execute<\n AXMTextTemplatePreviewRequest,\n AXMTextTemplatePreviewResult\n >(AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, request);\n\n if (requestSeq !== this.previewRequestSeq) {\n return;\n }\n\n const preview = runtimeCommandPayloadData(result);\n if (preview?.body != null) {\n this.serverPreviewByChannel.update((prev) => ({\n ...prev,\n [channel]: {\n ...(preview.subject != null ? { subject: preview.subject } : {}),\n body: preview.body,\n },\n }));\n return;\n }\n\n const message =\n typeof result?.message?.text === 'string' && result.message.text.trim()\n ? result.message.text.trim()\n : undefined;\n await this.fallbackToLocalPreview(channel, message);\n } catch (error) {\n if (requestSeq !== this.previewRequestSeq) {\n return;\n }\n const message = error instanceof Error ? error.message : undefined;\n await this.fallbackToLocalPreview(channel, message);\n }\n }\n\n private async fallbackToLocalPreview(channel: string, errorMessage?: string): Promise<void> {\n const title = await this.translationService.translateAsync(\n '@content-management:templates.messages.preview-failed.title',\n );\n const content = await this.translationService.translateAsync(\n '@content-management:templates.messages.preview-failed.content',\n );\n this.toastService.show({\n color: 'warning',\n title,\n content: errorMessage ? `${content} ${errorMessage}` : content,\n closeButton: true,\n timeOut: 5000,\n });\n\n this.serverPreviewByChannel.update((prev) => {\n const next = { ...prev };\n delete next[channel];\n return next;\n });\n await this.resolveComposedPreviewBodies();\n }\n\n /** Resolve variable values for local preview fallback */\n private async resolvePreviewVariables(): Promise<void> {\n const value = this.getValue();\n if (!value || typeof value !== 'object') return;\n const locale = this.getTemplateLocale();\n const parts: string[] = [];\n for (const v of Object.values(value)) {\n if (v != null && typeof v === 'object' && 'body' in v) {\n const o = v as { subject?: AXPMultiLanguageString; body?: AXPMultiLanguageString };\n parts.push(resolveTextTemplateLocalizedString(o.subject, locale));\n parts.push(resolveTextTemplateLocalizedString(o.body, locale));\n }\n }\n for (const body of Object.values(this.composedPreviewBodies())) {\n parts.push(body);\n }\n const allText = parts.join('');\n const varNames = collectTextTemplatePlaceholderNames(allText);\n if (varNames.length === 0) return;\n const vars = this.availableVariables();\n const resolved: Record<string, string> = {};\n const svc = this.tokenDefinitionService;\n for (const name of varNames) {\n try {\n if (svc) {\n const val = await svc.getValue(name);\n resolved[name] = val != null ? String(val) : '';\n }\n } catch {\n /* use fallback */\n }\n if (!(name in resolved) || !resolved[name]) {\n const v = vars.find((x) => x.name === name);\n if (v?.sampleValue != null) {\n resolved[name] = v.sampleValue;\n } else if (!(name in resolved)) {\n resolved[name] = '';\n }\n }\n }\n this.resolvedPreviewValues.update((prev) => ({ ...prev, ...resolved }));\n }\n\n /**\n * Local fallback: loads optional parent masters and stores leaf→root body chains per channel.\n */\n private async resolveComposedPreviewBodies(): Promise<void> {\n const value = this.getValue();\n if (!value || typeof value !== 'object') {\n this.composedPreviewBodies.set({});\n return;\n }\n\n const parentIdRaw = this.contextService.getValue('parentId');\n const parentId = typeof parentIdRaw === 'string' ? parentIdRaw.trim() : '';\n const locale = this.getTemplateLocale();\n const next: Record<string, string> = {};\n\n if (!parentId) {\n for (const channelName of Object.keys(value)) {\n next[channelName] = this.getChannelBody(channelName);\n }\n this.composedPreviewBodies.set(next);\n await this.resolvePreviewVariables();\n return;\n }\n\n const parentBodiesByChannel: Record<string, string[]> = {};\n try {\n const accessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.textTemplate.name)\n .data<\n string,\n AXMTextTemplateEntityModel,\n AXMTextTemplateEntityModel,\n AXMTextTemplateEntityModel,\n AXMTextTemplateEntityModel\n >();\n\n const visited = new Set<string>();\n const selfIdRaw = this.contextService.getValue('id');\n const selfId = typeof selfIdRaw === 'string' ? selfIdRaw.trim() : '';\n if (selfId) {\n visited.add(selfId);\n }\n\n let currentId: string | null = parentId;\n let depth = 1;\n while (currentId && depth <= AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH) {\n if (visited.has(currentId)) {\n break;\n }\n visited.add(currentId);\n const parent = await accessor.byKey(currentId);\n if (!parent?.channels) {\n break;\n }\n for (const [channelName, channelDef] of Object.entries(parent.channels)) {\n const body = resolveTextTemplateLocalizedString(channelDef?.body, locale);\n if (!body) continue;\n (parentBodiesByChannel[channelName] ??= []).push(body);\n }\n currentId = parent.parentId?.trim() || null;\n depth += 1;\n }\n } catch {\n /* keep leaf-only preview */\n }\n\n for (const channelName of Object.keys(value)) {\n const leafBody = this.getChannelBody(channelName);\n const parents = parentBodiesByChannel[channelName] ?? [];\n next[channelName] = composeTextTemplateBodyChain([leafBody, ...parents]);\n }\n this.composedPreviewBodies.set(next);\n await this.resolvePreviewVariables();\n }\n\n /** Get preview value for variable: expression/token first, then sampleValue */\n private getPreviewValue(varName: string): string {\n const resolved = this.resolvedPreviewValues()[varName];\n if (resolved !== undefined && resolved !== '') return resolved;\n const v = this.availableVariables().find((x) => x.name === varName);\n return v?.sampleValue ?? `{{${varName}}}`;\n }\n\n /**\n * Merge map for interpolating `{{ path }}` in `text`.\n * When `escapeMergeValuesForHtml` is true, substitution values are escaped for safe `innerHTML` fragments.\n */\n private previewMergeFor(text: string, escapeMergeValuesForHtml: boolean): Record<string, string> {\n const out: Record<string, string> = {};\n for (const name of collectTextTemplatePlaceholderNames(text)) {\n let v = this.getPreviewValue(name);\n if (escapeMergeValuesForHtml) {\n v = v.replace(/</g, '<').replace(/>/g, '>');\n }\n out[name] = v;\n }\n return out;\n }\n\n protected previewSubject(channelName: string): string {\n const server = this.serverPreviewByChannel()[channelName];\n if (server?.subject != null) {\n return server.subject;\n }\n return this.previewText(this.getChannelSubject(channelName));\n }\n\n protected previewText(text: string): string {\n return replaceTextTemplatePlaceholders(text, this.previewMergeFor(text, false));\n }\n\n /**\n * Email/rich preview must bypass Angular's default innerHTML sanitizer;\n * otherwise inline `style` (colors, gradients, header bar) is stripped and\n * the preview diverges from the real sent email.\n */\n protected previewBodyHtml(channelName: string): SafeHtml | string {\n const ch = this.availableChannels().find((c) => c.name === channelName);\n const server = this.serverPreviewByChannel()[channelName];\n if (server?.body != null) {\n if (ch?.type === 'rich') {\n return this.sanitizer.bypassSecurityTrustHtml(server.body);\n }\n return server.body\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\\n/g, '<br/>');\n }\n\n const composed = this.composedPreviewBodies()[channelName];\n const body = composed ?? this.getChannelBody(channelName);\n // Local fallback: do not escape data for rich HTML (logo mark / styled shells).\n const merged = renderTextTemplateSource(\n body,\n this.previewMergeFor(body, ch?.type !== 'rich'),\n );\n if (ch?.type === 'rich') {\n return this.sanitizer.bypassSecurityTrustHtml(merged);\n }\n return merged\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\\n/g, '<br/>');\n }\n}\n","<!-- Template Content Editor: Channel tabs and content per channel -->\n<div class=\"flex flex-col gap-4 w-full\">\n <!-- Channel tabs navigation -->\n <div class=\"flex items-center gap-2 flex-wrap\">\n <ax-tabs\n [look]=\"'with-line'\"\n (onActiveTabChanged)=\"activeTabIndex.set($event.index)\"\n class=\"flex-1 min-w-0\"\n >\n @for (ch of availableChannels(); track ch.name; let i = $index) {\n <ax-tab-item\n [text]=\"(ch.title | translate | async) ?? ch.name\"\n [key]=\"i.toString()\"\n [active]=\"activeTabIndex() === i\"\n ></ax-tab-item>\n }\n </ax-tabs>\n </div>\n\n @if (activeChannel(); as ch) {\n <!-- Channel content area: Edit mode or Preview mode -->\n <div class=\"mb-4 p-4\">\n @if (!isChannelConfigured(ch.name) && ch.notConfiguredMessageKey) {\n <div\n class=\"mb-4 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 p-3 rounded border border-amber-300 bg-amber-50 dark:border-amber-700 dark:bg-amber-950/30\"\n >\n <p class=\"text-sm text-amber-900 dark:text-amber-100\">\n {{ ch.notConfiguredMessageKey | translate | async }}\n </p>\n @if (ch.configureSettings) {\n <ax-button\n [text]=\"\n '@content-management:templates.actions.configure-channel'\n | translate\n | async\n \"\n look=\"outline\"\n color=\"primary\"\n size=\"sm\"\n (onClick)=\"openChannelConfigure(ch)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-gear\"></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </div>\n }\n\n @if (viewMode() === 'edit') {\n <!-- Edit mode: Subject field (for channels that support it, e.g. Email) -->\n @if (ch.hasSubject) {\n <div class=\"mb-3\">\n <label class=\"block text-sm mb-1\">\n {{\n '@content-management:templates.entities.text-template.fields.subject.title'\n | translate\n | async\n }}\n </label>\n <ax-text-box\n [ngModel]=\"getChannelSubject(ch.name)\"\n (ngModelChange)=\"setChannelSubject(ch.name, $event)\"\n [placeholder]=\"\n ('@content-management:templates.entities.text-template.fields.subject.placeholder'\n | translate\n | async)!\n \"\n ></ax-text-box>\n </div>\n }\n\n <!-- Edit mode: Body field (plain text or rich WYSIWYG) -->\n <div>\n <label class=\"block text-sm mb-1\">\n {{\n '@content-management:templates.entities.text-template.fields.body.title'\n | translate\n | async\n }}\n </label>\n @if (ch.type === 'plain') {\n <ax-text-area\n #bodyTextarea\n [ngModel]=\"getChannelBody(ch.name)\"\n (ngModelChange)=\"setChannelBody(ch.name, $event)\"\n [rows]=\"8\"\n [placeholder]=\"\n ('@content-management:templates.entities.text-template.fields.body-placeholder.plain'\n | translate\n | async)!\n \"\n ></ax-text-area>\n } @else {\n <ax-wysiwyg-container\n #wysiwygRef\n [placeHolder]=\"\n ('@content-management:templates.entities.text-template.fields.body-placeholder.rich'\n | translate\n | async)!\n \"\n [ngModel]=\"getChannelBody(ch.name)\"\n (onValueChanged)=\"handleWysiwygChange(ch.name, $event)\"\n [look]=\"'solid'\"\n >\n <ax-wysiwyg-view [style.min-height.px]=\"200\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-prefix>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n </ax-prefix>\n </ax-wysiwyg-toolbar>\n </ax-wysiwyg-container>\n }\n </div>\n } @else {\n <!-- Preview mode: Rendered content with variable placeholders replaced by sample values -->\n <div class=\"space-y-2\">\n @if (ch.hasSubject && previewSubject(ch.name)) {\n <div>\n <span class=\"text-xs text-gray-500\"\n >{{\n '@content-management:templates.entities.text-template.fields.subject.title'\n | translate\n | async\n }}:\n </span>\n <span class=\"text-sm\">{{ previewSubject(ch.name) }}</span>\n </div>\n }\n <!-- ----- Rich email keeps inline styles; plain channels use pre-wrap ----- -->\n <div\n class=\"text-sm p-3 bg-gray-100 dark:bg-gray-900 rounded border overflow-auto\"\n [class.whitespace-pre-wrap]=\"ch.type !== 'rich'\"\n [innerHTML]=\"previewBodyHtml(ch.name)\"\n ></div>\n </div>\n }\n </div>\n\n <!-- Footer: Action buttons (left) + Edit/Preview toggle (right) in single row -->\n <div\n class=\"flex flex-nowrap items-center justify-between gap-3 pt-3 mt-1 border-t border-gray-200 dark:border-gray-700\"\n >\n <div class=\"flex flex-nowrap items-center gap-2 min-w-0\">\n @if (viewMode() === 'edit') {\n <!-- ----- Insert variable dropdown from platform tokens ----- -->\n <div data-insert-var-trigger>\n <ax-button\n [text]=\"\n '@content-management:templates.actions.insert-variable'\n | translate\n | async\n \"\n look=\"twotone\"\n color=\"default\"\n size=\"sm\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-code\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (v of availableVariables(); track v.name) {\n <ax-button-item\n look=\"blank\"\n color=\"default\"\n [text]=\"(v.title || v.name) + ' ({{' + v.name + '}})'\"\n (onClick)=\"insertVariable(ch.name, v.name)\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"getVariableIcon(v)\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-chevron-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n </div>\n <!--->\n <!-- ----- Insert reserved [content] slot for master templates ----- -->\n @if (isMasterKind()) {\n <div data-insert-var-trigger>\n <ax-button\n [text]=\"\n '@content-management:templates.actions.insert-content-slot'\n | translate\n | async\n \"\n look=\"twotone\"\n color=\"default\"\n size=\"sm\"\n (onClick)=\"insertContentSlot(ch.name)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-layer-group\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n }\n <!--->\n <!-- ----- Copy subject/body from another channel ----- -->\n @if (otherChannelsWithContent(ch.name).length > 0) {\n <ax-button\n [text]=\"\n '@content-management:templates.actions.copy-from'\n | translate\n | async\n \"\n look=\"twotone\"\n color=\"default\"\n size=\"sm\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-copy\"></ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-chevron-down\"></ax-icon>\n </ax-suffix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (\n src of otherChannelsWithContent(ch.name);\n track src.name\n ) {\n <ax-button-item\n look=\"blank\"\n color=\"default\"\n [text]=\"(src.title | translate | async) ?? src.name\"\n (onClick)=\"copyFromChannel(ch.name, src.name)\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"getChannelIcon(src)\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n }\n </div>\n <div>\n <ax-tabs [look]=\"'default'\">\n <ax-tab-item\n [text]=\"\n ('@content-management:templates.actions.edit'\n | translate\n | async) ?? 'Edit'\n \"\n [active]=\"viewMode() === 'edit'\"\n (onClick)=\"viewMode.set('edit')\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-pen\" class=\"text-current\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n <ax-tab-item\n [text]=\"\n ('@content-management:templates.actions.preview'\n | translate\n | async) ?? 'Preview'\n \"\n [active]=\"viewMode() === 'preview'\"\n (onClick)=\"viewMode.set('preview')\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-eye\" class=\"text-current\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n </ax-tabs>\n </div>\n </div>\n }\n</div>\n"],"names":["i9","i10"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwFM,MAAO,2CACX,SAAQ,uBAA4D,CAAA;;AAkE1D,IAAA,eAAe,CAAC,CAAmB,EAAA;AAC3C,QAAA,MAAM,OAAO,GAA2B;AACtC,YAAA,MAAM,EAAE,sBAAsB;AAC9B,YAAA,OAAO,EAAE,yBAAyB;AAClC,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,QAAQ,EAAE,wBAAwB;AAClC,YAAA,MAAM,EAAE,iBAAiB;SAC1B;AACD,QAAA,MAAM,WAAW,GAA2B;AAC1C,YAAA,MAAM,EAAE,kBAAkB;AAC1B,YAAA,OAAO,EAAE,qBAAqB;AAC9B,YAAA,OAAO,EAAE,uBAAuB;AAChC,YAAA,OAAO,EAAE,wBAAwB;AACjC,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,IAAI,EAAE,oBAAoB;SAC3B;AACD,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,MAAM;AACzB,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxD,QAAA,IAAI,UAAU;AAAE,YAAA,OAAO,UAAU;AACjC,QAAA,OAAO,kBAAkB;IAC3B;;AAGU,IAAA,cAAc,CAAC,EAAoC,EAAA;AAC3D,QAAA,MAAM,OAAO,GAA2B;AACtC,YAAA,KAAK,EAAE,sBAAsB;AAC7B,YAAA,GAAG,EAAE,yBAAyB;AAC9B,YAAA,QAAQ,EAAE,uBAAuB;AACjC,YAAA,IAAI,EAAE,kBAAkB;AACxB,YAAA,QAAQ,EAAE,uBAAuB;AACjC,YAAA,QAAQ,EAAE,mBAAmB;SAC9B;AACD,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACpD,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,MAAM;AACzB,QAAA,OAAO,EAAE,CAAC,IAAI,KAAK,MAAM,GAAG,wBAAwB,GAAG,wBAAwB;IACjF;IAEQ,iBAAiB,GAAA;QACvB,OAAO,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,IAAI,OAAO;IAC3D;AAEA;;AAEG;AACK,IAAA,yBAAyB,CAC/B,QAAqD,EAAA;QAErD,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE,EAAE;AACvC,YAAA,OAAO,EAAE;QACX;AACA,QAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;YAChC,MAAM,CAAC,GAAG,QAAQ;YAClB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QACnC;AACA,QAAA,OAAO,EAAE,GAAI,QAAmC,EAAE;IACpD;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;;QAzHD,IAAA,CAAA,YAAY,GAMT,IAAI;AACE,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,6CAA6C,EAAE;AACxF,YAAA,QAAQ,EAAE,IAAI;AACf,SAAA,CAAC;AACe,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC5C,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACjD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACxC,IAAA,CAAA,sBAAsB,GAAG,MAAM,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9E,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC5C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,EAAC,UAAuB,EAAC;;QAGlD,IAAA,CAAA,iBAAiB,GAAG,CAAC;QAEnB,IAAA,CAAA,UAAU,GAAG,SAAS,CAA8B,YAAY;uFAAC;QACjE,IAAA,CAAA,eAAe,GAAG,SAAS,CAAC,cAAc,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,IAAI,GAAE,UAAuB,CAAA,EAAA,CAAG;QAE9E,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAqC,EAAE;8FAAC;QAClE,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAA0B,EAAE;8FAAC;QACvD,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAqB,EAAE;+FAAC;QACnD,IAAA,CAAA,cAAc,GAAG,MAAM,CAAS,CAAC;2FAAC;QAClC,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAqB,MAAM;qFAAC;;QAG7C,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAyB,EAAE;kGAAC;;QAG1D,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAyB,EAAE;kGAAC;;QAG1D,IAAA,CAAA,sBAAsB,GAAG,MAAM,CAEvC,EAAE;mGAAC;AAEK,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACtC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE;AACjC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACpC,YAAA,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;QACzB,CAAC;0FAAC;;AAGQ,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACrC,YAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;AACjD,YAAA,OAAO,IAAI,KAAK,sBAAsB,CAAC,MAAM;QAC/C,CAAC;yFAAC;QAEQ,IAAA,CAAA,wBAAwB,GAAG,CAAC,WAAmB,KACvD,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAC7B,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,WAAW,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACnH;QA+DD,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;AACjC,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,SAAS,EAAE;AACjC,gBAAA,KAAK,IAAI,CAAC,iBAAiB,EAAE;YAC/B;iBAAO;AACL,gBAAA,IAAI,CAAC,iBAAiB,IAAI,CAAC;AAC3B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,gBAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,MAAK;AAC5C,YAAA,KAAK,IAAI,CAAC,2BAA2B,EAAE;AACzC,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,mBAAmB,CAAC,IAAY,EAAA;QACxC,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI;IAC/C;IAEU,MAAM,oBAAoB,CAAC,OAAyC,EAAA;AAC5E,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB;QAC3C,IAAI,CAAC,SAAS,EAAE;YACd;QACF;QAEA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC;YACxD,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,KAAK,EAAE,SAAS,CAAC,KAAK;AACvB,SAAA,CAAC;QACF,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,IAAI,CAAC,2BAA2B,EAAE;QAC1C;IACF;AAEQ,IAAA,MAAM,2BAA2B,GAAA;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACzC,MAAM,IAAI,GAA4B,EAAE;AACxC,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC;QACtE;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;IAEQ,MAAM,2BAA2B,CAAC,OAAyC,EAAA;AACjF,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,IAAI,EAAE;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACxB,YAAA,OAAO,IAAI;QACb;QACA,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,EAAE,KAAK,IAAI,GAAG;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAA4B,CAAC;AACvE,QAAA,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE;YAC9B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE;AACxC,gBAAA,OAAO,KAAK;YACd;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,uBAAuB,CAAC,KAAc,EAAA;AAC5C,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAChC;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC/B;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;AAC9B,YAAA,OAAO,IAAI;QACb;QACA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,EAAE;YACjD,OAAO,IAAI,CAAC,uBAAuB,CAAE,KAA6B,CAAC,KAAK,CAAC;QAC3E;QACA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;IACxC;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AACrC,QAAA,MAAM,eAAe,GAAG,CAAC,CAAa,KAAI;AACxC,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAc;YAC/B,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE;YACrC,MAAM,OAAO,GAAI,MAAkB,CAAC,OAAO,GAAG,2BAA2B,CAAC;AAC1E,YAAA,IAAI,CAAC,OAAO;gBAAE;YACd,IAAI,CAAC,yBAAyB,EAAE;AAClC,QAAA,CAAC;AACD,QAAA,EAAE,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MACxB,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACxE;IACH;AAES,IAAA,MAAM,QAAQ,GAAA;QACrB,KAAK,CAAC,QAAQ,EAAE;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB;AACnC,QAAA,MAAM,WAAW,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;QAC/E,MAAM,WAAW,GAAuC,EAAE;AAC1D,QAAA,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE;YAC3B,IAAI,CAAC,EAAE,WAAW;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CACxB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAClE;AACD,QAAA,MAAM,IAAI,CAAC,2BAA2B,EAAE;AAExC,QAAA,IAAI;AACF,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE;AAC3F,YAAA,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACjE,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAM/B;YACF,MAAM,IAAI,GAAuB;AAC9B,iBAAA,GAAG,CAAC,CAAC,CAAC,MAAM;gBACX,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAC1B,gBAAA,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACtC,gBAAA,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,SAAS;gBACtE,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACrB,aAAA,CAAC;iBACD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE;YACpC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,GAAG,IAAI,CAAC;AAAE,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;QAC5C;IACF;;IAGQ,yBAAyB,GAAA;AAC/B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;AAC/B,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAmC;AAC3D,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAChD,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,YAAY,GAAG;oBAClB,WAAW,EAAE,EAAE,CAAC,IAAI;AACpB,oBAAA,OAAO,EAAE,IAAI;oBACb,cAAc,EAAE,QAAQ,CAAC,cAAc;oBACvC,YAAY,EAAE,QAAQ,CAAC,YAAY;iBACpC;YACH;QACF;aAAO;YACL,MAAM,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC;YACvD,IAAI,QAAQ,EAAE;AACZ,gBAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE;gBACnC,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE;oBAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE;oBAC5C,IAAI,CAAC,YAAY,GAAG;wBAClB,WAAW,EAAE,EAAE,CAAC,IAAI;AACpB,wBAAA,OAAO,EAAE,KAAK;wBACd,KAAK;qBACN;gBACH;YACF;QACF;IACF;AAEQ,IAAA,kBAAkB,CAAC,EAAe,EAAA;QACxC,IAAI,EAAE,YAAY,mBAAmB;AAAE,YAAA,OAAO,EAAE;QAChD,OAAO,EAAE,CAAC,aAAa,GAAG,UAAU,CAAC,IAAI,IAAI;IAC/C;AAEQ,IAAA,yBAAyB,CAAC,EAAe,EAAA;QAC/C,IAAI,EAAE,CAAC,iBAAiB;AAAE,YAAA,OAAO,EAAE;QACnC,OAAO,EAAE,CAAC,OAAO,GAAG,0BAA0B,CAAC,IAAI,IAAI;IACzD;IAEU,cAAc,CAAC,WAAmB,EAAE,OAAe,EAAA;QAC3D,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAA,EAAA,EAAK,OAAO,CAAA,EAAA,CAAI,CAAC;IACjD;AAEU,IAAA,iBAAiB,CAAC,WAAmB,EAAA;AAC7C,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,8BAA8B,CAAC;IAC/D;IAEQ,WAAW,CAAC,WAAmB,EAAE,KAAa,EAAA;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;AAChD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY;AAChC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAExB,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE;AAChD,YAAA,IAAI,MAAM,CAAC,OAAO,EAAE;gBAClB,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM;AACrD,gBAAA,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,IAAI,KAAK;gBACxC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;gBACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AAChC,gBAAA,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK;AACtC,gBAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC;AACzC,gBAAA,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM;gBACtC,cAAc,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAC7D;AAAO,iBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AACvB,gBAAA,IAAI;AACF,oBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc;oBAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC;0BACpC,SAAkB,CAAC;0BACnB,SAAqB;oBAC1B,MAAM,QAAQ,GAAG,IAAI,EAAE,OAAO,GAAG,0BAA0B,CAAuB;AAClF,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,oBAAA,MAAM,MAAM,GAAG,QAAQ,IAAI,OAAO,EAAE,cAAc,EAAE,EAAE,aAAa,GAAG,0BAA0B,CAAC;oBACjG,IAAI,MAAM,EAAE;wBACT,MAAsB,CAAC,KAAK,EAAE;AAC/B,wBAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE;wBACnC,IAAI,GAAG,EAAE;4BACP,GAAG,CAAC,eAAe,EAAE;AACrB,4BAAA,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;4BAC1B,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC;wBAClD;oBACF;yBAAO;wBACL,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,GAAG,KAAK,CAAC;oBACnD;gBACF;AAAE,gBAAA,MAAM;oBACN,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,GAAG,KAAK,CAAC;gBACnD;YACF;QACF;aAAO;YACL,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,GAAG,KAAK,CAAC;QACnD;IACF;AAEQ,IAAA,qBAAqB,CAAC,QAAgB,EAAA;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE;AAClC,QAAA,MAAM,EAAE,GAAG,GAAG,EAAE,aAAa;QAC7B,MAAM,QAAQ,GAAG,EAAE,EAAE,aAAa,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;QACnG,IAAI,QAAQ,EAAE;YACZ,QAAQ,CAAC,KAAK,EAAE;AAChB,YAAA,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAChD;IACF;IAEU,eAAe,CAAC,UAAkB,EAAE,UAAkB,EAAA;QAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AACtE,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU;QAChC,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACxE;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAClE;AAEU,IAAA,iBAAiB,CAAC,IAAY,EAAA;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;QACjC,MAAM,GAAG,GACP,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,SAAS,IAAI,CAAC,GAAI,CAA0C,CAAC,OAAO,GAAG,SAAS;QAChH,OAAO,kCAAkC,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1E;IAEU,iBAAiB,CAAC,IAAY,EAAE,KAAa,EAAA;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE;AACrC,QAAA,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;AACxC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,OAAO,CAAC;AACrD,QAAA,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE;QACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;IAC/D;AAEU,IAAA,cAAc,CAAC,IAAY,EAAA;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;QACjC,MAAM,GAAG,GACP,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,GAAI,CAAuC,CAAC,IAAI,GAAG,SAAS;QACvG,OAAO,kCAAkC,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1E;IAEU,mBAAmB,CAAC,IAAY,EAAE,CAA8B,EAAA;AACxE,QAAA,MAAM,GAAG,GACP,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,IAAI;cAC7C,CAAuB,CAAC;AAC3B,cAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC;IAChC;IAEU,cAAc,CAAC,IAAY,EAAE,KAAa,EAAA;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE;AACrC,QAAA,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACxC,MAAM,UAAU,GACd,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,UAAU,IAAI,KAAK;AAC5E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,IAAI,CAAC;AAClD,QAAA,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE;QACxB,IAAI,UAAU,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5D;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;QACrD;IACF;AAEA;;;AAGG;AACK,IAAA,MAAM,iBAAiB,GAAA;AAC7B,QAAA,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC,iBAAiB;AAC3C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,EAAE;AACnD,YAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;AACnC,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC;AAC5D,QAAA,MAAM,QAAQ,GAAG,OAAO,WAAW,KAAK,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;AACpD,QAAA,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,SAAS;AAErE,QAAA,MAAM,OAAO,GAAkC;AAC7C,YAAA,QAAQ,EAAE,KAAK;YACf,OAAO;YACP,MAAM;AACN,YAAA,IAAI,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACjC,YAAA,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;SAC1B;AAED,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAG/C,qCAAqC,EAAE,OAAO,CAAC;AAEjD,YAAA,IAAI,UAAU,KAAK,IAAI,CAAC,iBAAiB,EAAE;gBACzC;YACF;AAEA,YAAA,MAAM,OAAO,GAAG,yBAAyB,CAAC,MAAM,CAAC;AACjD,YAAA,IAAI,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE;gBACzB,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AAC5C,oBAAA,GAAG,IAAI;oBACP,CAAC,OAAO,GAAG;wBACT,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;wBAChE,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,qBAAA;AACF,iBAAA,CAAC,CAAC;gBACH;YACF;AAEA,YAAA,MAAM,OAAO,GACX,OAAO,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;kBACjE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;kBACxB,SAAS;YACf,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC;QACrD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,UAAU,KAAK,IAAI,CAAC,iBAAiB,EAAE;gBACzC;YACF;AACA,YAAA,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,SAAS;YAClE,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC;QACrD;IACF;AAEQ,IAAA,MAAM,sBAAsB,CAAC,OAAe,EAAE,YAAqB,EAAA;QACzE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,CACxD,6DAA6D,CAC9D;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAC1D,+DAA+D,CAChE;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,KAAK,EAAE,SAAS;YAChB,KAAK;AACL,YAAA,OAAO,EAAE,YAAY,GAAG,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,GAAG,OAAO;AAC9D,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;QAEF,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC1C,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE;AACxB,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC;AACpB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,IAAI,CAAC,4BAA4B,EAAE;IAC3C;;AAGQ,IAAA,MAAM,uBAAuB,GAAA;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE;AACzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACvC,MAAM,KAAK,GAAa,EAAE;QAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,EAAE;gBACrD,MAAM,CAAC,GAAG,CAAwE;AAClF,gBAAA,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACjE,gBAAA,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChE;QACF;AACA,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,EAAE;AAC9D,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB;QACA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AAC9B,QAAA,MAAM,QAAQ,GAAG,mCAAmC,CAAC,OAAO,CAAC;AAC7D,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE;QACtC,MAAM,QAAQ,GAA2B,EAAE;AAC3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,sBAAsB;AACvC,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC3B,YAAA,IAAI;gBACF,IAAI,GAAG,EAAE;oBACP,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;AACpC,oBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACjD;YACF;AAAE,YAAA,MAAM;;YAER;AACA,YAAA,IAAI,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC1C,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;AAC3C,gBAAA,IAAI,CAAC,EAAE,WAAW,IAAI,IAAI,EAAE;AAC1B,oBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW;gBAChC;AAAO,qBAAA,IAAI,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE;AAC9B,oBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;gBACrB;YACF;QACF;QACA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IACzE;AAEA;;AAEG;AACK,IAAA,MAAM,4BAA4B,GAAA;AACxC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC;QACF;QAEA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC;AAC5D,QAAA,MAAM,QAAQ,GAAG,OAAO,WAAW,KAAK,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE;AAC1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACvC,MAAM,IAAI,GAA2B,EAAE;QAEvC,IAAI,CAAC,QAAQ,EAAE;YACb,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YACtD;AACA,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;AACpC,YAAA,MAAM,IAAI,CAAC,uBAAuB,EAAE;YACpC;QACF;QAEA,MAAM,qBAAqB,GAA6B,EAAE;AAC1D,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AACnB,iBAAA,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI;AACxE,iBAAA,IAAI,EAMF;AAEL,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;AACpD,YAAA,MAAM,MAAM,GAAG,OAAO,SAAS,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE;YACpE,IAAI,MAAM,EAAE;AACV,gBAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YACrB;YAEA,IAAI,SAAS,GAAkB,QAAQ;YACvC,IAAI,KAAK,GAAG,CAAC;AACb,YAAA,OAAO,SAAS,IAAI,KAAK,IAAI,kCAAkC,EAAE;AAC/D,gBAAA,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;oBAC1B;gBACF;AACA,gBAAA,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;AAC9C,gBAAA,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;oBACrB;gBACF;AACA,gBAAA,KAAK,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACvE,MAAM,IAAI,GAAG,kCAAkC,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC;AACzE,oBAAA,IAAI,CAAC,IAAI;wBAAE;AACX,oBAAA,CAAC,qBAAqB,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;gBACxD;gBACA,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI;gBAC3C,KAAK,IAAI,CAAC;YACZ;QACF;AAAE,QAAA,MAAM;;QAER;QAEA,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YACjD,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,CAAC,IAAI,EAAE;AACxD,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,4BAA4B,CAAC,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,CAAC;QAC1E;AACA,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;AACpC,QAAA,MAAM,IAAI,CAAC,uBAAuB,EAAE;IACtC;;AAGQ,IAAA,eAAe,CAAC,OAAe,EAAA;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC;AACtD,QAAA,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;AAAE,YAAA,OAAO,QAAQ;QAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AACnE,QAAA,OAAO,CAAC,EAAE,WAAW,IAAI,CAAA,EAAA,EAAK,OAAO,IAAI;IAC3C;AAEA;;;AAGG;IACK,eAAe,CAAC,IAAY,EAAE,wBAAiC,EAAA;QACrE,MAAM,GAAG,GAA2B,EAAE;QACtC,KAAK,MAAM,IAAI,IAAI,mCAAmC,CAAC,IAAI,CAAC,EAAE;YAC5D,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAClC,IAAI,wBAAwB,EAAE;AAC5B,gBAAA,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;YACnD;AACA,YAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;QACf;AACA,QAAA,OAAO,GAAG;IACZ;AAEU,IAAA,cAAc,CAAC,WAAmB,EAAA;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,WAAW,CAAC;AACzD,QAAA,IAAI,MAAM,EAAE,OAAO,IAAI,IAAI,EAAE;YAC3B,OAAO,MAAM,CAAC,OAAO;QACvB;QACA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9D;AAEU,IAAA,WAAW,CAAC,IAAY,EAAA;AAChC,QAAA,OAAO,+BAA+B,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjF;AAEA;;;;AAIG;AACO,IAAA,eAAe,CAAC,WAAmB,EAAA;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,WAAW,CAAC;AACzD,QAAA,IAAI,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE;AACxB,YAAA,IAAI,EAAE,EAAE,IAAI,KAAK,MAAM,EAAE;gBACvB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC;YAC5D;YACA,OAAO,MAAM,CAAC;AACX,iBAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,iBAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,iBAAA,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;QAC5B;QAEA,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,WAAW,CAAC;QAC1D,MAAM,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;;AAEzD,QAAA,MAAM,MAAM,GAAG,wBAAwB,CACrC,IAAI,EACJ,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK,MAAM,CAAC,CAChD;AACD,QAAA,IAAI,EAAE,EAAE,IAAI,KAAK,MAAM,EAAE;YACvB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC;QACvD;AACA,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,aAAA,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;IAC5B;8GAlsBW,2CAA2C,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA3C,2CAA2C,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EA6BQ,UAAU,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrH1E,uxUAuRA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7MI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,WAAW,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,EACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,cAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,WAAA,EAAA,SAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGP,2CAA2C,EAAA,UAAA,EAAA,CAAA;kBAnBvD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yCAAyC,EAAA,eAAA,EAElC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,YAAY;wBACZ,iBAAiB;wBACjB,WAAW;wBACX,YAAY;wBACZ,YAAY;wBACZ,gBAAgB;wBAChB,eAAe;wBACf,eAAe;wBACf,kBAAkB;wBAClB,mBAAmB;wBACnB,cAAc;wBACd,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,uxUAAA,EAAA;kGA8B6D,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACpC,cAAc,EAAA,EAAA,GAAE,EAAE,IAAI,GAAE,UAAuB,CAAA,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;;;"}
|
|
@@ -3,11 +3,12 @@ import { InjectionToken, Injectable, inject, signal, ChangeDetectionStrategy, Co
|
|
|
3
3
|
import * as i1 from '@acorex-platform/framework-client/core';
|
|
4
4
|
import { AXPComponentSlotModule, AXP_MODULE_MANIFEST_PROVIDER, provideLazyProvider } from '@acorex-platform/framework-client/core';
|
|
5
5
|
import { RootConfig, AXM_TEXT_TEMPLATE_PRINT_CHANNEL, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, AXPContentDocumentsPermissionKeys, AXPContentManagementMenuKeys } from '@acorex-platform/module-content-management-client/contracts';
|
|
6
|
-
export { AXM_TEXT_TEMPLATE_CONTENT_SLOT, AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, collectTextTemplatePlaceholderNames, composeTextTemplateBodyChain, replaceTextTemplateContentSlot, replaceTextTemplatePlaceholders, resolveTextTemplateLocalizedString, textTemplateContainsContentSlot, validateTextTemplateContentSlots, validateTextTemplateParentChain } from '@acorex-platform/module-content-management-client/contracts';
|
|
6
|
+
export { AXM_TEXT_TEMPLATE_CONTENT_SLOT, AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, collectTextTemplatePlaceholderNames, composeTextTemplateBodyChain, renderTextTemplateSource, replaceTextTemplateContentSlot, replaceTextTemplatePlaceholders, resolveTextTemplateLocalizedString, textTemplateContainsContentSlot, validateTextTemplateContentSlots, validateTextTemplateParentChain } from '@acorex-platform/module-content-management-client/contracts';
|
|
7
7
|
import { AXPFileStorageService, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXPSearchCommandProvider, createEntityCommandOptions } from '@acorex-platform/framework-client/common';
|
|
8
8
|
import { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';
|
|
9
9
|
import { AXP_WIDGETS_EDITOR_CATEGORY, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';
|
|
10
10
|
import { AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY } from '@acorex-platform/framework-client/layout/widgets';
|
|
11
|
+
import { createBuiltinBlockRegistry, createBuiltinPipeRegistry, createTextTemplateEngine } from '@acorex-platform/framework-shared/text-template';
|
|
11
12
|
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
12
13
|
import { AXSafePipe } from '@acorex/core/pipes';
|
|
13
14
|
import { AXPCommonMenuKeys } from '@acorex-platform/module-common-client/contracts';
|
|
@@ -76,7 +77,7 @@ const AXMTemplateContentEditorWidget = {
|
|
|
76
77
|
component: () => import('./acorex-platform-module-content-management-client-template-content-editor-widget-view.component-CfupUZTI.mjs').then((c) => c.AXMTemplateContentEditorWidgetViewComponent),
|
|
77
78
|
},
|
|
78
79
|
edit: {
|
|
79
|
-
component: () => import('./acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-
|
|
80
|
+
component: () => import('./acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-BkSjAXjQ.mjs').then((c) => c.AXMTemplateContentEditorWidgetEditComponent),
|
|
80
81
|
},
|
|
81
82
|
},
|
|
82
83
|
};
|
|
@@ -96,6 +97,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
96
97
|
type: Injectable
|
|
97
98
|
}] });
|
|
98
99
|
|
|
100
|
+
//#region ----- Angular tokens -----
|
|
101
|
+
const AXC_TEXT_TEMPLATE_BLOCK_REGISTRY = new InjectionToken('AXC_TEXT_TEMPLATE_BLOCK_REGISTRY', { factory: createBuiltinBlockRegistry });
|
|
102
|
+
const AXC_TEXT_TEMPLATE_PIPE_REGISTRY = new InjectionToken('AXC_TEXT_TEMPLATE_PIPE_REGISTRY', { factory: createBuiltinPipeRegistry });
|
|
103
|
+
const AXC_TEXT_TEMPLATE_ENGINE = new InjectionToken('AXC_TEXT_TEMPLATE_ENGINE', {
|
|
104
|
+
factory: () => createTextTemplateEngine({
|
|
105
|
+
blocks: inject(AXC_TEXT_TEMPLATE_BLOCK_REGISTRY),
|
|
106
|
+
pipes: inject(AXC_TEXT_TEMPLATE_PIPE_REGISTRY),
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
const textTemplateEngineProviders = [
|
|
110
|
+
{ provide: AXC_TEXT_TEMPLATE_BLOCK_REGISTRY, useFactory: createBuiltinBlockRegistry },
|
|
111
|
+
{ provide: AXC_TEXT_TEMPLATE_PIPE_REGISTRY, useFactory: createBuiltinPipeRegistry },
|
|
112
|
+
{
|
|
113
|
+
provide: AXC_TEXT_TEMPLATE_ENGINE,
|
|
114
|
+
useFactory: (blocks, pipes) => createTextTemplateEngine({ blocks, pipes }),
|
|
115
|
+
deps: [AXC_TEXT_TEMPLATE_BLOCK_REGISTRY, AXC_TEXT_TEMPLATE_PIPE_REGISTRY],
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
//#endregion
|
|
119
|
+
|
|
99
120
|
class AXMPromotionSlotComponent {
|
|
100
121
|
constructor() {
|
|
101
122
|
this.entityService = inject(AXPEntityService);
|
|
@@ -156,6 +177,7 @@ class AXMContentManagementModule {
|
|
|
156
177
|
multi: true,
|
|
157
178
|
},
|
|
158
179
|
printTextTemplateChannelProvider,
|
|
180
|
+
...textTemplateEngineProviders,
|
|
159
181
|
], imports: [AXPWidgetCoreModule,
|
|
160
182
|
AXPComponentSlotModule.forChild({
|
|
161
183
|
'side-menu-footer': [
|
|
@@ -224,6 +246,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
224
246
|
multi: true,
|
|
225
247
|
},
|
|
226
248
|
printTextTemplateChannelProvider,
|
|
249
|
+
...textTemplateEngineProviders,
|
|
227
250
|
],
|
|
228
251
|
}]
|
|
229
252
|
}] });
|
|
@@ -411,5 +434,5 @@ var setting_provider = /*#__PURE__*/Object.freeze({
|
|
|
411
434
|
* Generated bundle index. Do not edit.
|
|
412
435
|
*/
|
|
413
436
|
|
|
414
|
-
export { AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY$1 as AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY, AXMContentManagementModule, AXMMenuProvider, AXMPromotionSlotComponent, AXMSearchCommandProvider, AXMSettingProvider, AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER };
|
|
437
|
+
export { AXC_TEXT_TEMPLATE_BLOCK_REGISTRY, AXC_TEXT_TEMPLATE_ENGINE, AXC_TEXT_TEMPLATE_PIPE_REGISTRY, AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY$1 as AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY, AXMContentManagementModule, AXMMenuProvider, AXMPromotionSlotComponent, AXMSearchCommandProvider, AXMSettingProvider, AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER };
|
|
415
438
|
//# sourceMappingURL=acorex-platform-module-content-management-client.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-content-management-client.mjs","sources":["../../../../libs/modules/content-management/client/src/lib/manifest.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/channel-definition.provider.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/print-text-template-channel-definition.provider.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/template-content-editor-widget.config.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/text-template-placeholder.util.ts","../../../../libs/modules/content-management/client/src/lib/widget-definition.provider.ts","../../../../libs/modules/content-management/client/src/lib/features/promotion/components/promotion-slot/promotion-slot.component.ts","../../../../libs/modules/content-management/client/src/lib/features/promotion/components/promotion-slot/promotion-slot.component.html","../../../../libs/modules/content-management/client/src/lib/content-management.module.ts","../../../../libs/modules/content-management/client/src/lib/text-template-render.command.key.ts","../../../../libs/modules/content-management/client/src/lib/features/text-template-render/text-template-render.types.ts","../../../../libs/modules/content-management/client/src/lib/menu.provider.ts","../../../../libs/modules/content-management/client/src/lib/search-command.provider.ts","../../../../libs/modules/content-management/client/src/lib/setting.provider.ts","../../../../libs/modules/content-management/client/src/acorex-platform-module-content-management-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-client/core';\nimport { RootConfig } from '@acorex-platform/module-content-management-client/contracts';\n\n//#endregion\n\n//#region ---- Manifest Definition ----\n\n/**\n * Content Management Module Manifest.\n * Defines module metadata, features, and provider references.\n */\nexport const ContentManagementManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n\n type: 'domain',\n domain: 'content-documents',\n // Module dependencies (optional)\n};\n\n//#endregion\n\n","import { InjectionToken } from '@angular/core';\nimport type { AXMTextTemplateChannelDefinitionProvider } from '@acorex-platform/module-content-management-client/contracts';\n\n//#region ---- Token ----\n\n/** Multi-provider token – all providers are merged for available channels */\nexport const AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER = new InjectionToken<\n AXMTextTemplateChannelDefinitionProvider\n>('AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER');\n\n//#endregion\n","import { Injectable } from '@angular/core';\nimport {\n AXM_TEXT_TEMPLATE_PRINT_CHANNEL,\n RootConfig,\n type AXMTextTemplateChannelDefinition,\n type AXMTextTemplateChannelDefinitionProvider,\n} from '@acorex-platform/module-content-management-client/contracts';\nimport { AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER } from './channel-definition.provider';\n\nconst I18N = `@${RootConfig.config.i18n}:templates.channels`;\n\n//#region ---- Print text template channel ----\n\n@Injectable()\nexport class AXMPrintTextTemplateChannelDefinitionProvider\n implements AXMTextTemplateChannelDefinitionProvider\n{\n getChannels(): AXMTextTemplateChannelDefinition[] {\n return [\n {\n name: AXM_TEXT_TEMPLATE_PRINT_CHANNEL,\n title: `${I18N}.print`,\n type: 'rich',\n hasSubject: false,\n },\n ];\n }\n}\n\n//#endregion\n\nexport const printTextTemplateChannelProvider = {\n provide: AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER,\n useClass: AXMPrintTextTemplateChannelDefinitionProvider,\n multi: true,\n};\n","import { AXPWidgetConfig } from '@acorex-platform/framework-shared/widget-core';\nimport { AXP_WIDGETS_EDITOR_CATEGORY } from '@acorex-platform/framework-client/layout/widget-core';\nimport {\n AXP_DATA_PATH_PROPERTY,\n AXP_DISABLED_PROPERTY,\n} from '@acorex-platform/framework-client/layout/widgets';\n\nexport const AXMTemplateContentEditorWidget: AXPWidgetConfig = {\n name: 'template-content-editor',\n title: 'Template Content',\n icon: 'fa-light fa-envelope',\n description: 'Multi-channel template editor with tabs (Email, SMS, WhatsApp, etc.)',\n categories: AXP_WIDGETS_EDITOR_CATEGORY,\n type: 'editor',\n defaultFilterWidgetName: 'string-filter',\n properties: [AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],\n components: {\n view: {\n component: () =>\n import('./template-content-editor-widget-view.component').then(\n (c) => c.AXMTemplateContentEditorWidgetViewComponent\n ),\n },\n edit: {\n component: () =>\n import('./template-content-editor-widget-edit.component').then(\n (c) => c.AXMTemplateContentEditorWidgetEditComponent\n ),\n },\n },\n};\n","/** Re-export shared text-template placeholder / compose helpers from contracts. */\nexport {\n AXM_TEXT_TEMPLATE_CONTENT_SLOT,\n AXM_TEXT_TEMPLATE_KIND,\n AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH,\n collectTextTemplatePlaceholderNames,\n composeTextTemplateBodyChain,\n replaceTextTemplateContentSlot,\n replaceTextTemplatePlaceholders,\n resolveTextTemplateLocalizedString,\n textTemplateContainsContentSlot,\n validateTextTemplateContentSlots,\n validateTextTemplateParentChain,\n type AXMTextTemplateEntityModel,\n type AXMTextTemplateKind,\n type AXMTextTemplateParentChainNode,\n} from '@acorex-platform/module-content-management-client/contracts';\n","//#region ---- Imports ----\n\nimport { AXPWidgetDefinitionProvider } from '@acorex-platform/framework-client/layout/widget-core';\nimport { Injectable } from '@angular/core';\nimport { AXMTemplateContentEditorWidget } from './features/template-content-editor';\n\n//#endregion\n\n//#region ---- Content Management Widgets Provider ----\n\n@Injectable()\nexport class AXMContentManagementWidgetsProvider implements AXPWidgetDefinitionProvider {\n getWidgets() {\n return [AXMTemplateContentEditorWidget];\n }\n}\n\n//#endregion\n","import { RootConfig } from '@acorex-platform/module-content-management-client/contracts';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXSafePipe } from '@acorex/core/pipes';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport { Component, inject, OnInit, signal, WritableSignal, ChangeDetectionStrategy } from '@angular/core';\nimport { AXMPromotionEntityModel } from '@acorex-platform/module-content-management-client/contracts';\n@Component({\n selector: 'acorex-platform-promotion-slot',\n imports: [AXSafePipe],\n changeDetection: ChangeDetectionStrategy.Eager,\n templateUrl: './promotion-slot.component.html',\n})\nexport class AXMPromotionSlotComponent implements OnInit {\n private readonly entityService = inject(AXPEntityService);\n location: string;\n\n notificationChannelService = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.promotion.name).data<any, any>();\n\n listData: WritableSignal<AXMPromotionEntityModel[]> = signal([]);\n\n private fileStorage = inject(AXPFileStorageService);\n\n async ngOnInit(): Promise<void> {\n const channels = await this.notificationChannelService.query({\n skip: 0,\n take: 10000,\n // filter: {\n // field: 'type',\n // operator: { type: 'equal' },\n // value: 'promotion',\n // },\n });\n\n const filteredItems = channels.items.filter((x) => x.placement?.name == this.location);\n\n const mappedItems = await Promise.all(\n filteredItems.map(async (item) => {\n if (item.imageId != null) {\n const image = await this.fileStorage.getInfo(item.imageId);\n\n return {\n ...item,\n image: image,\n };\n } else {\n return item;\n }\n })\n );\n\n this.listData.set(mappedItems);\n }\n} ","@for (item of listData(); track item.id) { @if (item.contentType?.name == 'media') {\n<img [src]=\"item.image?.url ?? ''\" class=\"w-full p-3 border {{\n item.shape?.name == 'circle' ? 'rounded-full' : 'rounded-none'\n }}\" />\n} @if(item.contentType?.name == 'text'){\n<div class=\"m-1 px-6 p-4 border bg-primary rounded-lg\">\n <h1 class=\"text-base/6\" [innerHTML]=\"item.body | safe : 'html'\"></h1>\n</div>\n\n} } ","import { NgModule } from '@angular/core';\nimport { AXPComponentSlotModule } from '@acorex-platform/framework-client/core';\nimport { AXP_MODULE_MANIFEST_PROVIDER, provideLazyProvider } from '@acorex-platform/framework-client/core';\nimport { ContentManagementManifest } from './manifest';\nimport { AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER } from '@acorex-platform/framework-client/common';\nimport { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';\nimport { AXP_WIDGET_DEFINITION_PROVIDER, AXPWidgetCoreModule } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AXMContentManagementWidgetsProvider } from './widget-definition.provider';\nimport { printTextTemplateChannelProvider } from './features/template-content-editor/print-text-template-channel-definition.provider';\n\n// Import promotion-related components\nimport { AXMPromotionSlotComponent } from './features/promotion/components/promotion-slot/promotion-slot.component';\n\n@NgModule({\n imports: [\n AXPWidgetCoreModule,\n AXPComponentSlotModule.forChild({\n 'side-menu-footer': [\n {\n name: 'side-menu-footer-promotion',\n component: AXMPromotionSlotComponent,\n options: {\n location: 'side-menu-footer',\n },\n },\n ],\n 'side-menu-header': [\n {\n name: 'side-menu-header-promotion',\n component: AXMPromotionSlotComponent,\n priority: 2,\n options: {\n location: 'side-menu-header',\n },\n },\n ],\n }),\n ],\n exports: [],\n declarations: [],\n providers: [\n {\n provide: AXP_MODULE_MANIFEST_PROVIDER,\n useValue: ContentManagementManifest,\n multi: true,\n },\n provideLazyProvider(\n AXP_PERMISSION_DEFINITION_PROVIDER,\n () => import('./permission-definition.provider').then((m) => m.AXMPermissionDefinitionProvider),\n ),\n provideLazyProvider(AXP_MENU_PROVIDER, () => import('./menu.provider').then((m) => m.AXMMenuProvider)),\n \n provideLazyProvider(\n AXP_SETTING_DEFINITION_PROVIDER,\n () => import('./setting.provider').then((m) => m.AXMSettingProvider),\n ),\n provideLazyProvider(\n AXP_SEARCH_PROVIDER,\n () => import('./search-command.provider').then((m) => m.AXMSearchCommandProvider),\n ),\n {\n provide: AXP_WIDGET_DEFINITION_PROVIDER,\n useClass: AXMContentManagementWidgetsProvider,\n multi: true,\n },\n printTextTemplateChannelProvider,\n ],\n})\nexport class AXMContentManagementModule {}\n","import { AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY } from '@acorex-platform/module-content-management-client/contracts';\n\n/** Registry / remote key for Nest `ContentManagement:TextTemplate:Render`. */\nexport const AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY = AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY;\n","import {\n AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY,\n AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY,\n type AXMTextTemplatePreviewRequest,\n type AXMTextTemplatePreviewResult,\n type AXMTextTemplateRenderRequest,\n type AXMTextTemplateRenderResult,\n} from '@acorex-platform/module-content-management-client/contracts';\n\n//#region ----- Types -----\n\n/** @deprecated Prefer {@link AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY}. */\nexport const AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY = AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY;\n\n/** @deprecated Prefer {@link AXMTextTemplateRenderRequest}. */\nexport type AXPTextTemplateRenderRequest = AXMTextTemplateRenderRequest;\n\n/** @deprecated Prefer {@link AXMTextTemplateRenderResult}. */\nexport type AXPTextTemplateRenderResult = AXMTextTemplateRenderResult;\n\nexport {\n AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY,\n AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY,\n type AXMTextTemplatePreviewRequest,\n type AXMTextTemplatePreviewResult,\n type AXMTextTemplateRenderRequest,\n type AXMTextTemplateRenderResult,\n};\n\n//#endregion\n","import { AXPCommonMenuKeys } from '@acorex-platform/module-common-client/contracts';\nimport { AXPMenuProvider, AXPMenuProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { Injectable, inject } from '@angular/core';\nimport { RootConfig } from '@acorex-platform/module-content-management-client/contracts';\nimport { AXPContentDocumentsPermissionKeys } from '@acorex-platform/module-content-management-client/contracts';\nimport { AXPContentManagementMenuKeys } from '@acorex-platform/module-content-management-client/contracts';\n\n@Injectable()\nexport class AXMMenuProvider implements AXPMenuProvider {\n private entityService = inject(AXPEntityService);\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const scope = RootConfig.config.i18n;\n const module = RootConfig.module;\n\n //#region ---- Administration > Content (Promotions, Page Builder) ----\n\n const contentMenu = context.find(AXPCommonMenuKeys.Content);\n if (!contentMenu.exists) {\n context.find(AXPCommonMenuKeys.Administration).addItems([\n {\n name: AXPCommonMenuKeys.Content,\n priority: 10,\n text: '@general:menus.content.title',\n icon: 'fa-light fa-paint-brush',\n type: 'menu',\n children: [],\n },\n ]);\n }\n\n context.find(AXPCommonMenuKeys.Content).addItems([\n {\n name: AXPContentManagementMenuKeys.Promotions,\n text: RootConfig.entities.promotion.titlePlural,\n path: this.entityService.createPath(module.name, RootConfig.entities.promotion.name),\n icon: RootConfig.entities.promotion.icon,\n priority: 1,\n policy: {\n features: [module.name],\n permissions: [AXPContentDocumentsPermissionKeys.MaintainContent],\n },\n },\n ]);\n\n // Text Template under Configuration > Data and Content\n context.find(AXPCommonMenuKeys.DataAndContent).addItems([\n {\n name: AXPContentManagementMenuKeys.TextTemplates,\n text: RootConfig.entities.textTemplate.title,\n path: this.entityService.createPath(module.name, RootConfig.entities.textTemplate.name),\n icon: RootConfig.entities.textTemplate.icon,\n priority: 2,\n policy: {\n features: [module.name],\n permissions: [AXPContentDocumentsPermissionKeys.MaintainContent],\n },\n },\n ]);\n\n //#endregion\n\n //#region ---- Help Menu Extensions ----\n\n context.addItems([\n {\n name: AXPContentManagementMenuKeys.HelpRoot,\n priority: 900000,\n text: `@${scope}:help-center.menus.help.title`,\n icon: 'fa-light fa-circle-question',\n },\n ]);\n\n const helpMenu = context.find(AXPContentManagementMenuKeys.HelpRoot);\n\n if (helpMenu.exists) {\n helpMenu.addItems([\n {\n name: AXPContentManagementMenuKeys.HelpCenter,\n text: `@${scope}:help-center.menus.help-center.title`,\n icon: 'fa-light fa-book-open',\n priority: 900001,\n },\n {\n name: AXPContentManagementMenuKeys.Tutorials,\n text: `@${scope}:help-center.menus.tutorials.title`,\n icon: 'fa-light fa-clapperboard-play',\n priority: 900002,\n },\n {\n name: AXPContentManagementMenuKeys.About,\n text: `@${scope}:help-center.menus.about.title`,\n icon: 'fa-light fa-circle-info',\n priority: 900011,\n },\n ]);\n }\n\n //#endregion\n }\n}\n","import { AXPSearchCommandProvider, AXPSearchResult, createEntityCommandOptions } from '@acorex-platform/framework-client/common';\nimport { RootConfig } from '@acorex-platform/module-content-management-client/contracts';\n\nexport class AXMSearchCommandProvider extends AXPSearchCommandProvider {\n commands: AXPSearchResult[] = [\n {\n id: 'create-promotion',\n group: 'command',\n title: RootConfig.entities.promotion.title,\n icon: RootConfig.entities.promotion.icon,\n description: RootConfig.entities.promotion.titlePlural,\n command: {\n name: 'Entity:Create',\n options: createEntityCommandOptions(\n `${RootConfig.module.name}.${RootConfig.entities.promotion.name}`,\n {\n name: RootConfig.entities.promotion.name,\n module: RootConfig.module.name,\n title: RootConfig.entities.promotion.title,\n }\n ),\n },\n },\n {\n id: 'create-text-template',\n group: 'command',\n title: `@content-management:templates.search.create-text-template.title`,\n icon: RootConfig.entities.textTemplate.icon,\n description: `@content-management:templates.search.create-text-template.description`,\n command: {\n name: 'Entity:Create',\n options: createEntityCommandOptions(\n `${RootConfig.module.name}.${RootConfig.entities.textTemplate.name}`,\n {\n name: RootConfig.entities.textTemplate.name,\n module: RootConfig.module.name,\n title: RootConfig.entities.textTemplate.title,\n }\n ),\n },\n },\n ];\n}\n","import { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\n\nexport class AXMSettingProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n // context\n // // Add Form Template Group\n // .addGroup('form-template', 'Form Template', 'Settings related to form templates.', RootConfig.module.icon)\n // // Start Interface Section\n // .addSection('interface', 'UI Interface', 'Customize the user interface for forms.')\n // .addSetting({\n // key: 'history-panel',\n // title: 'Show History Panel',\n // scope: 'U',\n // isInherited: true,\n // defaultValue: false,\n // widget: {\n // type: AXPWidgetsCatalog.toggle,\n // },\n // description: 'Enable or disable the history panel for forms.',\n // validationRules: [\n // {\n // rule: 'required',\n // },\n // ],\n // })\n // .endSection()\n // .endGroup();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-content-management-client.mjs","sources":["../../../../libs/modules/content-management/client/src/lib/manifest.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/channel-definition.provider.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/print-text-template-channel-definition.provider.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/template-content-editor-widget.config.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/text-template-placeholder.util.ts","../../../../libs/modules/content-management/client/src/lib/widget-definition.provider.ts","../../../../libs/modules/content-management/client/src/lib/text-template-engine.tokens.ts","../../../../libs/modules/content-management/client/src/lib/features/promotion/components/promotion-slot/promotion-slot.component.ts","../../../../libs/modules/content-management/client/src/lib/features/promotion/components/promotion-slot/promotion-slot.component.html","../../../../libs/modules/content-management/client/src/lib/content-management.module.ts","../../../../libs/modules/content-management/client/src/lib/text-template-render.command.key.ts","../../../../libs/modules/content-management/client/src/lib/features/text-template-render/text-template-render.types.ts","../../../../libs/modules/content-management/client/src/lib/menu.provider.ts","../../../../libs/modules/content-management/client/src/lib/search-command.provider.ts","../../../../libs/modules/content-management/client/src/lib/setting.provider.ts","../../../../libs/modules/content-management/client/src/acorex-platform-module-content-management-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-client/core';\nimport { RootConfig } from '@acorex-platform/module-content-management-client/contracts';\n\n//#endregion\n\n//#region ---- Manifest Definition ----\n\n/**\n * Content Management Module Manifest.\n * Defines module metadata, features, and provider references.\n */\nexport const ContentManagementManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n\n type: 'domain',\n domain: 'content-documents',\n // Module dependencies (optional)\n};\n\n//#endregion\n\n","import { InjectionToken } from '@angular/core';\nimport type { AXMTextTemplateChannelDefinitionProvider } from '@acorex-platform/module-content-management-client/contracts';\n\n//#region ---- Token ----\n\n/** Multi-provider token – all providers are merged for available channels */\nexport const AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER = new InjectionToken<\n AXMTextTemplateChannelDefinitionProvider\n>('AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER');\n\n//#endregion\n","import { Injectable } from '@angular/core';\nimport {\n AXM_TEXT_TEMPLATE_PRINT_CHANNEL,\n RootConfig,\n type AXMTextTemplateChannelDefinition,\n type AXMTextTemplateChannelDefinitionProvider,\n} from '@acorex-platform/module-content-management-client/contracts';\nimport { AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER } from './channel-definition.provider';\n\nconst I18N = `@${RootConfig.config.i18n}:templates.channels`;\n\n//#region ---- Print text template channel ----\n\n@Injectable()\nexport class AXMPrintTextTemplateChannelDefinitionProvider\n implements AXMTextTemplateChannelDefinitionProvider\n{\n getChannels(): AXMTextTemplateChannelDefinition[] {\n return [\n {\n name: AXM_TEXT_TEMPLATE_PRINT_CHANNEL,\n title: `${I18N}.print`,\n type: 'rich',\n hasSubject: false,\n },\n ];\n }\n}\n\n//#endregion\n\nexport const printTextTemplateChannelProvider = {\n provide: AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER,\n useClass: AXMPrintTextTemplateChannelDefinitionProvider,\n multi: true,\n};\n","import { AXPWidgetConfig } from '@acorex-platform/framework-shared/widget-core';\nimport { AXP_WIDGETS_EDITOR_CATEGORY } from '@acorex-platform/framework-client/layout/widget-core';\nimport {\n AXP_DATA_PATH_PROPERTY,\n AXP_DISABLED_PROPERTY,\n} from '@acorex-platform/framework-client/layout/widgets';\n\nexport const AXMTemplateContentEditorWidget: AXPWidgetConfig = {\n name: 'template-content-editor',\n title: 'Template Content',\n icon: 'fa-light fa-envelope',\n description: 'Multi-channel template editor with tabs (Email, SMS, WhatsApp, etc.)',\n categories: AXP_WIDGETS_EDITOR_CATEGORY,\n type: 'editor',\n defaultFilterWidgetName: 'string-filter',\n properties: [AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],\n components: {\n view: {\n component: () =>\n import('./template-content-editor-widget-view.component').then(\n (c) => c.AXMTemplateContentEditorWidgetViewComponent\n ),\n },\n edit: {\n component: () =>\n import('./template-content-editor-widget-edit.component').then(\n (c) => c.AXMTemplateContentEditorWidgetEditComponent\n ),\n },\n },\n};\n","/** Re-export shared text-template placeholder / compose helpers from contracts. */\nexport {\n AXM_TEXT_TEMPLATE_CONTENT_SLOT,\n AXM_TEXT_TEMPLATE_KIND,\n AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH,\n collectTextTemplatePlaceholderNames,\n composeTextTemplateBodyChain,\n renderTextTemplateSource,\n replaceTextTemplateContentSlot,\n replaceTextTemplatePlaceholders,\n resolveTextTemplateLocalizedString,\n textTemplateContainsContentSlot,\n validateTextTemplateContentSlots,\n validateTextTemplateParentChain,\n type AXMTextTemplateEntityModel,\n type AXMTextTemplateKind,\n type AXMTextTemplateParentChainNode,\n} from '@acorex-platform/module-content-management-client/contracts';\n","//#region ---- Imports ----\n\nimport { AXPWidgetDefinitionProvider } from '@acorex-platform/framework-client/layout/widget-core';\nimport { Injectable } from '@angular/core';\nimport { AXMTemplateContentEditorWidget } from './features/template-content-editor';\n\n//#endregion\n\n//#region ---- Content Management Widgets Provider ----\n\n@Injectable()\nexport class AXMContentManagementWidgetsProvider implements AXPWidgetDefinitionProvider {\n getWidgets() {\n return [AXMTemplateContentEditorWidget];\n }\n}\n\n//#endregion\n","import { InjectionToken, inject } from '@angular/core';\nimport {\n createBuiltinBlockRegistry,\n createBuiltinPipeRegistry,\n createTextTemplateEngine,\n type ContentBlockDefinition,\n type ContentPipe,\n type TextTemplateEngine,\n} from '@acorex-platform/framework-shared/text-template';\nimport type { AXPRegistry } from '@acorex-platform/framework-shared/core';\n\n//#region ----- Angular tokens -----\n\nexport const AXC_TEXT_TEMPLATE_BLOCK_REGISTRY = new InjectionToken<AXPRegistry<ContentBlockDefinition>>(\n 'AXC_TEXT_TEMPLATE_BLOCK_REGISTRY',\n { factory: createBuiltinBlockRegistry },\n);\n\nexport const AXC_TEXT_TEMPLATE_PIPE_REGISTRY = new InjectionToken<AXPRegistry<ContentPipe>>(\n 'AXC_TEXT_TEMPLATE_PIPE_REGISTRY',\n { factory: createBuiltinPipeRegistry },\n);\n\nexport const AXC_TEXT_TEMPLATE_ENGINE = new InjectionToken<TextTemplateEngine>(\n 'AXC_TEXT_TEMPLATE_ENGINE',\n {\n factory: () =>\n createTextTemplateEngine({\n blocks: inject(AXC_TEXT_TEMPLATE_BLOCK_REGISTRY),\n pipes: inject(AXC_TEXT_TEMPLATE_PIPE_REGISTRY),\n }),\n },\n);\n\nexport const textTemplateEngineProviders = [\n { provide: AXC_TEXT_TEMPLATE_BLOCK_REGISTRY, useFactory: createBuiltinBlockRegistry },\n { provide: AXC_TEXT_TEMPLATE_PIPE_REGISTRY, useFactory: createBuiltinPipeRegistry },\n {\n provide: AXC_TEXT_TEMPLATE_ENGINE,\n useFactory: (\n blocks: AXPRegistry<ContentBlockDefinition>,\n pipes: AXPRegistry<ContentPipe>,\n ) => createTextTemplateEngine({ blocks, pipes }),\n deps: [AXC_TEXT_TEMPLATE_BLOCK_REGISTRY, AXC_TEXT_TEMPLATE_PIPE_REGISTRY],\n },\n];\n\n//#endregion\n","import { RootConfig } from '@acorex-platform/module-content-management-client/contracts';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXSafePipe } from '@acorex/core/pipes';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport { Component, inject, OnInit, signal, WritableSignal, ChangeDetectionStrategy } from '@angular/core';\nimport { AXMPromotionEntityModel } from '@acorex-platform/module-content-management-client/contracts';\n@Component({\n selector: 'acorex-platform-promotion-slot',\n imports: [AXSafePipe],\n changeDetection: ChangeDetectionStrategy.Eager,\n templateUrl: './promotion-slot.component.html',\n})\nexport class AXMPromotionSlotComponent implements OnInit {\n private readonly entityService = inject(AXPEntityService);\n location: string;\n\n notificationChannelService = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.promotion.name).data<any, any>();\n\n listData: WritableSignal<AXMPromotionEntityModel[]> = signal([]);\n\n private fileStorage = inject(AXPFileStorageService);\n\n async ngOnInit(): Promise<void> {\n const channels = await this.notificationChannelService.query({\n skip: 0,\n take: 10000,\n // filter: {\n // field: 'type',\n // operator: { type: 'equal' },\n // value: 'promotion',\n // },\n });\n\n const filteredItems = channels.items.filter((x) => x.placement?.name == this.location);\n\n const mappedItems = await Promise.all(\n filteredItems.map(async (item) => {\n if (item.imageId != null) {\n const image = await this.fileStorage.getInfo(item.imageId);\n\n return {\n ...item,\n image: image,\n };\n } else {\n return item;\n }\n })\n );\n\n this.listData.set(mappedItems);\n }\n} ","@for (item of listData(); track item.id) { @if (item.contentType?.name == 'media') {\n<img [src]=\"item.image?.url ?? ''\" class=\"w-full p-3 border {{\n item.shape?.name == 'circle' ? 'rounded-full' : 'rounded-none'\n }}\" />\n} @if(item.contentType?.name == 'text'){\n<div class=\"m-1 px-6 p-4 border bg-primary rounded-lg\">\n <h1 class=\"text-base/6\" [innerHTML]=\"item.body | safe : 'html'\"></h1>\n</div>\n\n} } ","import { NgModule } from '@angular/core';\nimport { AXPComponentSlotModule } from '@acorex-platform/framework-client/core';\nimport { AXP_MODULE_MANIFEST_PROVIDER, provideLazyProvider } from '@acorex-platform/framework-client/core';\nimport { ContentManagementManifest } from './manifest';\nimport { AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER } from '@acorex-platform/framework-client/common';\nimport { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';\nimport { AXP_WIDGET_DEFINITION_PROVIDER, AXPWidgetCoreModule } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AXMContentManagementWidgetsProvider } from './widget-definition.provider';\nimport { printTextTemplateChannelProvider } from './features/template-content-editor/print-text-template-channel-definition.provider';\nimport { textTemplateEngineProviders } from './text-template-engine.tokens';\n\n// Import promotion-related components\nimport { AXMPromotionSlotComponent } from './features/promotion/components/promotion-slot/promotion-slot.component';\n\n@NgModule({\n imports: [\n AXPWidgetCoreModule,\n AXPComponentSlotModule.forChild({\n 'side-menu-footer': [\n {\n name: 'side-menu-footer-promotion',\n component: AXMPromotionSlotComponent,\n options: {\n location: 'side-menu-footer',\n },\n },\n ],\n 'side-menu-header': [\n {\n name: 'side-menu-header-promotion',\n component: AXMPromotionSlotComponent,\n priority: 2,\n options: {\n location: 'side-menu-header',\n },\n },\n ],\n }),\n ],\n exports: [],\n declarations: [],\n providers: [\n {\n provide: AXP_MODULE_MANIFEST_PROVIDER,\n useValue: ContentManagementManifest,\n multi: true,\n },\n provideLazyProvider(\n AXP_PERMISSION_DEFINITION_PROVIDER,\n () => import('./permission-definition.provider').then((m) => m.AXMPermissionDefinitionProvider),\n ),\n provideLazyProvider(AXP_MENU_PROVIDER, () => import('./menu.provider').then((m) => m.AXMMenuProvider)),\n \n provideLazyProvider(\n AXP_SETTING_DEFINITION_PROVIDER,\n () => import('./setting.provider').then((m) => m.AXMSettingProvider),\n ),\n provideLazyProvider(\n AXP_SEARCH_PROVIDER,\n () => import('./search-command.provider').then((m) => m.AXMSearchCommandProvider),\n ),\n {\n provide: AXP_WIDGET_DEFINITION_PROVIDER,\n useClass: AXMContentManagementWidgetsProvider,\n multi: true,\n },\n printTextTemplateChannelProvider,\n ...textTemplateEngineProviders,\n ],\n})\nexport class AXMContentManagementModule {}\n","import { AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY } from '@acorex-platform/module-content-management-client/contracts';\n\n/** Registry / remote key for Nest `ContentManagement:TextTemplate:Render`. */\nexport const AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY = AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY;\n","import {\n AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY,\n AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY,\n type AXMTextTemplatePreviewRequest,\n type AXMTextTemplatePreviewResult,\n type AXMTextTemplateRenderRequest,\n type AXMTextTemplateRenderResult,\n} from '@acorex-platform/module-content-management-client/contracts';\n\n//#region ----- Types -----\n\n/** @deprecated Prefer {@link AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY}. */\nexport const AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY = AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY;\n\n/** @deprecated Prefer {@link AXMTextTemplateRenderRequest}. */\nexport type AXPTextTemplateRenderRequest = AXMTextTemplateRenderRequest;\n\n/** @deprecated Prefer {@link AXMTextTemplateRenderResult}. */\nexport type AXPTextTemplateRenderResult = AXMTextTemplateRenderResult;\n\nexport {\n AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY,\n AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY,\n type AXMTextTemplatePreviewRequest,\n type AXMTextTemplatePreviewResult,\n type AXMTextTemplateRenderRequest,\n type AXMTextTemplateRenderResult,\n};\n\n//#endregion\n","import { AXPCommonMenuKeys } from '@acorex-platform/module-common-client/contracts';\nimport { AXPMenuProvider, AXPMenuProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { Injectable, inject } from '@angular/core';\nimport { RootConfig } from '@acorex-platform/module-content-management-client/contracts';\nimport { AXPContentDocumentsPermissionKeys } from '@acorex-platform/module-content-management-client/contracts';\nimport { AXPContentManagementMenuKeys } from '@acorex-platform/module-content-management-client/contracts';\n\n@Injectable()\nexport class AXMMenuProvider implements AXPMenuProvider {\n private entityService = inject(AXPEntityService);\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const scope = RootConfig.config.i18n;\n const module = RootConfig.module;\n\n //#region ---- Administration > Content (Promotions, Page Builder) ----\n\n const contentMenu = context.find(AXPCommonMenuKeys.Content);\n if (!contentMenu.exists) {\n context.find(AXPCommonMenuKeys.Administration).addItems([\n {\n name: AXPCommonMenuKeys.Content,\n priority: 10,\n text: '@general:menus.content.title',\n icon: 'fa-light fa-paint-brush',\n type: 'menu',\n children: [],\n },\n ]);\n }\n\n context.find(AXPCommonMenuKeys.Content).addItems([\n {\n name: AXPContentManagementMenuKeys.Promotions,\n text: RootConfig.entities.promotion.titlePlural,\n path: this.entityService.createPath(module.name, RootConfig.entities.promotion.name),\n icon: RootConfig.entities.promotion.icon,\n priority: 1,\n policy: {\n features: [module.name],\n permissions: [AXPContentDocumentsPermissionKeys.MaintainContent],\n },\n },\n ]);\n\n // Text Template under Configuration > Data and Content\n context.find(AXPCommonMenuKeys.DataAndContent).addItems([\n {\n name: AXPContentManagementMenuKeys.TextTemplates,\n text: RootConfig.entities.textTemplate.title,\n path: this.entityService.createPath(module.name, RootConfig.entities.textTemplate.name),\n icon: RootConfig.entities.textTemplate.icon,\n priority: 2,\n policy: {\n features: [module.name],\n permissions: [AXPContentDocumentsPermissionKeys.MaintainContent],\n },\n },\n ]);\n\n //#endregion\n\n //#region ---- Help Menu Extensions ----\n\n context.addItems([\n {\n name: AXPContentManagementMenuKeys.HelpRoot,\n priority: 900000,\n text: `@${scope}:help-center.menus.help.title`,\n icon: 'fa-light fa-circle-question',\n },\n ]);\n\n const helpMenu = context.find(AXPContentManagementMenuKeys.HelpRoot);\n\n if (helpMenu.exists) {\n helpMenu.addItems([\n {\n name: AXPContentManagementMenuKeys.HelpCenter,\n text: `@${scope}:help-center.menus.help-center.title`,\n icon: 'fa-light fa-book-open',\n priority: 900001,\n },\n {\n name: AXPContentManagementMenuKeys.Tutorials,\n text: `@${scope}:help-center.menus.tutorials.title`,\n icon: 'fa-light fa-clapperboard-play',\n priority: 900002,\n },\n {\n name: AXPContentManagementMenuKeys.About,\n text: `@${scope}:help-center.menus.about.title`,\n icon: 'fa-light fa-circle-info',\n priority: 900011,\n },\n ]);\n }\n\n //#endregion\n }\n}\n","import { AXPSearchCommandProvider, AXPSearchResult, createEntityCommandOptions } from '@acorex-platform/framework-client/common';\nimport { RootConfig } from '@acorex-platform/module-content-management-client/contracts';\n\nexport class AXMSearchCommandProvider extends AXPSearchCommandProvider {\n commands: AXPSearchResult[] = [\n {\n id: 'create-promotion',\n group: 'command',\n title: RootConfig.entities.promotion.title,\n icon: RootConfig.entities.promotion.icon,\n description: RootConfig.entities.promotion.titlePlural,\n command: {\n name: 'Entity:Create',\n options: createEntityCommandOptions(\n `${RootConfig.module.name}.${RootConfig.entities.promotion.name}`,\n {\n name: RootConfig.entities.promotion.name,\n module: RootConfig.module.name,\n title: RootConfig.entities.promotion.title,\n }\n ),\n },\n },\n {\n id: 'create-text-template',\n group: 'command',\n title: `@content-management:templates.search.create-text-template.title`,\n icon: RootConfig.entities.textTemplate.icon,\n description: `@content-management:templates.search.create-text-template.description`,\n command: {\n name: 'Entity:Create',\n options: createEntityCommandOptions(\n `${RootConfig.module.name}.${RootConfig.entities.textTemplate.name}`,\n {\n name: RootConfig.entities.textTemplate.name,\n module: RootConfig.module.name,\n title: RootConfig.entities.textTemplate.title,\n }\n ),\n },\n },\n ];\n}\n","import { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\n\nexport class AXMSettingProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n // context\n // // Add Form Template Group\n // .addGroup('form-template', 'Form Template', 'Settings related to form templates.', RootConfig.module.icon)\n // // Start Interface Section\n // .addSection('interface', 'UI Interface', 'Customize the user interface for forms.')\n // .addSetting({\n // key: 'history-panel',\n // title: 'Show History Panel',\n // scope: 'U',\n // isInherited: true,\n // defaultValue: false,\n // widget: {\n // type: AXPWidgetsCatalog.toggle,\n // },\n // description: 'Enable or disable the history panel for forms.',\n // validationRules: [\n // {\n // rule: 'required',\n // },\n // ],\n // })\n // .endSection()\n // .endGroup();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -195,13 +195,18 @@ interface AXMTextTemplateEntityModel extends AXPEntityModel<string> {
|
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
/**
|
|
198
|
-
* Collects unique
|
|
198
|
+
* Collects unique root paths from template source (`{{ employee.name }}`, `{{#table users as user}}`).
|
|
199
199
|
*/
|
|
200
200
|
declare function collectTextTemplatePlaceholderNames(text: string): string[];
|
|
201
201
|
/**
|
|
202
|
-
*
|
|
202
|
+
* Interpolates `{{ path | pipe }}` using typed `data` (and optional `[content]`).
|
|
203
|
+
* Does not parse block tags (`{{#table}}`, …) — use {@link renderTextTemplateSource} for bodies.
|
|
203
204
|
*/
|
|
204
|
-
declare function replaceTextTemplatePlaceholders(text: string,
|
|
205
|
+
declare function replaceTextTemplatePlaceholders(text: string, data?: Record<string, unknown>): string;
|
|
206
|
+
/**
|
|
207
|
+
* Parses source to blocks and renders for the email channel (local preview / compose fallback).
|
|
208
|
+
*/
|
|
209
|
+
declare function renderTextTemplateSource(source: string, data?: Record<string, unknown>, slotContent?: string): string;
|
|
205
210
|
/**
|
|
206
211
|
* Resolves a template channel field (plain string or per-locale map) for the active locale.
|
|
207
212
|
*/
|
|
@@ -216,9 +221,9 @@ declare function textTemplateContainsContentSlot(text: string | null | undefined
|
|
|
216
221
|
declare function replaceTextTemplateContentSlot(masterBody: string, content: string): string;
|
|
217
222
|
/**
|
|
218
223
|
* Composes a body chain: leaf first, then parents toward root.
|
|
219
|
-
*
|
|
224
|
+
* Injects `[content]` only — callers interpolate or {@link renderTextTemplateSource} afterward.
|
|
220
225
|
*/
|
|
221
|
-
declare function composeTextTemplateBodyChain(bodiesLeafToRoot: string[]
|
|
226
|
+
declare function composeTextTemplateBodyChain(bodiesLeafToRoot: string[]): string;
|
|
222
227
|
/**
|
|
223
228
|
* Master templates: every non-empty channel body locale must include `[content]`.
|
|
224
229
|
* Content templates: no channel body may include `[content]`.
|
|
@@ -256,7 +261,7 @@ declare function validateTextTemplateParentChain(input: {
|
|
|
256
261
|
/** Server + client command key for rendering a text template channel. */
|
|
257
262
|
declare const AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY: "ContentManagement:TextTemplate:Render";
|
|
258
263
|
/**
|
|
259
|
-
* Request to render a persisted text template channel with
|
|
264
|
+
* Request to render a persisted text template channel with typed domain/event data.
|
|
260
265
|
* Walks optional `parentId` masters and injects child body into `[content]`.
|
|
261
266
|
*/
|
|
262
267
|
interface AXMTextTemplateRenderRequest {
|
|
@@ -281,16 +286,13 @@ interface AXMTextTemplateRenderRequest {
|
|
|
281
286
|
*/
|
|
282
287
|
locale?: string;
|
|
283
288
|
/**
|
|
284
|
-
* Event
|
|
285
|
-
*
|
|
286
|
-
* (`DateTime`, `Integer`, `Decimal`, Currency/Percent) using regional settings.
|
|
287
|
-
* Context tokens used by shared masters (`companyName`, `companyEmail`, …) are filled by the
|
|
288
|
-
* render engine via PlatformManagement.Tokens when missing — do not re-supply them per caller.
|
|
289
|
+
* Event tokens and domain graphs (`users`, `workOrders`, …).
|
|
290
|
+
* Context/Computed tokens (`companyName`, …) are filled from PlatformManagement.Tokens.
|
|
289
291
|
*/
|
|
290
|
-
|
|
292
|
+
data?: Record<string, unknown>;
|
|
291
293
|
}
|
|
292
294
|
/**
|
|
293
|
-
* Rendered subject/body for one channel after
|
|
295
|
+
* Rendered subject/body for one channel after engine render and parent composition.
|
|
294
296
|
*/
|
|
295
297
|
interface AXMTextTemplateRenderResult {
|
|
296
298
|
textTemplateId: string;
|
|
@@ -318,11 +320,11 @@ interface AXMTextTemplatePreviewRequest {
|
|
|
318
320
|
* or `en-US` when omitted on the server.
|
|
319
321
|
*/
|
|
320
322
|
locale?: string;
|
|
321
|
-
/** Optional
|
|
322
|
-
|
|
323
|
+
/** Optional data overrides (applied before Context resolve and Event samples). */
|
|
324
|
+
data?: Record<string, unknown>;
|
|
323
325
|
}
|
|
324
326
|
/**
|
|
325
|
-
* Preview subject/body for one channel after
|
|
327
|
+
* Preview subject/body for one channel after engine render and parent composition.
|
|
326
328
|
*/
|
|
327
329
|
interface AXMTextTemplatePreviewResult {
|
|
328
330
|
channel: string;
|
|
@@ -351,15 +353,21 @@ declare const AXM_TEXT_TEMPLATE_IDS: {
|
|
|
351
353
|
readonly ticketResolved: "c7100006-0001-4111-b111-060606060606";
|
|
352
354
|
readonly employeeHappyBirthday: "c7100007-0001-4111-b111-070707070707";
|
|
353
355
|
readonly employeeJoiningCompany: "c7100008-0001-4111-b111-080808080808";
|
|
354
|
-
/**
|
|
356
|
+
/** Combined document expiration digest (expired + near) — daily notifier (email + in-app). */
|
|
355
357
|
readonly documentExpired: "c7100009-0001-4111-b111-090909090909";
|
|
356
|
-
/**
|
|
358
|
+
/** Legacy near-expiry template id; same digest body as documentExpired. */
|
|
357
359
|
readonly documentNearExpiry: "c710000a-0001-4111-b111-0a0a0a0a0a0a";
|
|
358
360
|
/** Company print master — header, border, footer around `[content]`. */
|
|
359
361
|
readonly printCompanyMaster: "c710000b-0001-4111-b111-0b0b0b0b0b0b";
|
|
360
362
|
/** Default questionnaire print child (title, date, `{{sessionBody}}`). */
|
|
361
363
|
readonly questionnairePrint: "c710000c-0001-4111-b111-0c0c0c0c0c0c";
|
|
364
|
+
/** Daily list of employees with a birthday today — emailed to account holders. */
|
|
365
|
+
readonly employeeBirthdayDigest: "c710000d-0001-4111-b111-0d0d0d0d0d0d";
|
|
366
|
+
/** Daily list of employees whose hire date is today — emailed to account holders. */
|
|
367
|
+
readonly employeeJoiningDigest: "c710000e-0001-4111-b111-0e0e0e0e0e0e";
|
|
368
|
+
/** List of tenants with no login in the last 30 days. */
|
|
369
|
+
readonly tenantLoginDigest: "c710000f-0001-4111-b111-0f0f0f0f0f0f";
|
|
362
370
|
};
|
|
363
371
|
|
|
364
|
-
export { AXMPermissionsKeys, AXM_TEXT_TEMPLATE_CONTENT_SLOT, AXM_TEXT_TEMPLATE_IDS, AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, AXM_TEXT_TEMPLATE_PRINT_CHANNEL, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, AXM_TEXT_TEMPLATE_TENANT_MASTER_NAMESPACE, AXPContentDocumentsPermissionKeys, AXPContentManagementMenuKeys, RootConfig, collectTextTemplatePlaceholderNames, composeTextTemplateBodyChain, defaultShortDatePatternForLocale, defaultShortTimePatternForLocale, formatTextTemplateDate, formatTextTemplateMergeValues, formatTextTemplateNumber, parseTextTemplateDateValue, replaceTextTemplateContentSlot, replaceTextTemplatePlaceholders, resolveTextTemplateCalendar, resolveTextTemplateLocalizedString, textTemplateContainsContentSlot, validateTextTemplateContentSlots, validateTextTemplateParentChain };
|
|
372
|
+
export { AXMPermissionsKeys, AXM_TEXT_TEMPLATE_CONTENT_SLOT, AXM_TEXT_TEMPLATE_IDS, AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, AXM_TEXT_TEMPLATE_PRINT_CHANNEL, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, AXM_TEXT_TEMPLATE_TENANT_MASTER_NAMESPACE, AXPContentDocumentsPermissionKeys, AXPContentManagementMenuKeys, RootConfig, collectTextTemplatePlaceholderNames, composeTextTemplateBodyChain, defaultShortDatePatternForLocale, defaultShortTimePatternForLocale, formatTextTemplateDate, formatTextTemplateMergeValues, formatTextTemplateNumber, parseTextTemplateDateValue, renderTextTemplateSource, replaceTextTemplateContentSlot, replaceTextTemplatePlaceholders, resolveTextTemplateCalendar, resolveTextTemplateLocalizedString, textTemplateContainsContentSlot, validateTextTemplateContentSlots, validateTextTemplateParentChain };
|
|
365
373
|
export type { AXMPromotionEntityModel, AXMSelectModel, AXMTextTemplateCalendarSystem, AXMTextTemplateChannelConfigureSettings, AXMTextTemplateChannelDefinition, AXMTextTemplateChannelDefinitionProvider, AXMTextTemplateChannelEditorType, AXMTextTemplateChannelsValue, AXMTextTemplateEntityModel, AXMTextTemplateKind, AXMTextTemplateParentChainNode, AXMTextTemplatePreviewRequest, AXMTextTemplatePreviewResult, AXMTextTemplateRegionalFormatContext, AXMTextTemplateRenderRequest, AXMTextTemplateRenderResult, AXMTextTemplateTokenFormatMeta };
|
|
@@ -3,9 +3,11 @@ import { OnInit, WritableSignal, InjectionToken } from '@angular/core';
|
|
|
3
3
|
import * as i1 from '@acorex-platform/framework-client/layout/widget-core';
|
|
4
4
|
import * as i2 from '@acorex-platform/framework-client/core';
|
|
5
5
|
import { AXMPromotionEntityModel, AXMTextTemplateChannelDefinitionProvider } from '@acorex-platform/module-content-management-client/contracts';
|
|
6
|
-
export { AXMTextTemplateEntityModel, AXMTextTemplateKind, AXMTextTemplateParentChainNode, AXM_TEXT_TEMPLATE_CONTENT_SLOT, AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, collectTextTemplatePlaceholderNames, composeTextTemplateBodyChain, replaceTextTemplateContentSlot, replaceTextTemplatePlaceholders, resolveTextTemplateLocalizedString, textTemplateContainsContentSlot, validateTextTemplateContentSlots, validateTextTemplateParentChain } from '@acorex-platform/module-content-management-client/contracts';
|
|
6
|
+
export { AXMTextTemplateEntityModel, AXMTextTemplateKind, AXMTextTemplateParentChainNode, AXM_TEXT_TEMPLATE_CONTENT_SLOT, AXM_TEXT_TEMPLATE_KIND, AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH, AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, collectTextTemplatePlaceholderNames, composeTextTemplateBodyChain, renderTextTemplateSource, replaceTextTemplateContentSlot, replaceTextTemplatePlaceholders, resolveTextTemplateLocalizedString, textTemplateContainsContentSlot, validateTextTemplateContentSlots, validateTextTemplateParentChain } from '@acorex-platform/module-content-management-client/contracts';
|
|
7
7
|
import { AXPMenuProvider, AXPMenuProviderContext, AXPSearchCommandProvider, AXPSearchResult, AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';
|
|
8
8
|
import * as _acorex_platform_framework_client_layout_entity from '@acorex-platform/framework-client/layout/entity';
|
|
9
|
+
import { ContentBlockDefinition, TextTemplateEngine, ContentPipe } from '@acorex-platform/framework-shared/text-template';
|
|
10
|
+
import { AXPRegistry } from '@acorex-platform/framework-shared/core';
|
|
9
11
|
|
|
10
12
|
declare class AXMContentManagementModule {
|
|
11
13
|
static ɵfac: i0.ɵɵFactoryDeclaration<AXMContentManagementModule, never>;
|
|
@@ -45,4 +47,8 @@ declare class AXMPromotionSlotComponent implements OnInit {
|
|
|
45
47
|
/** Multi-provider token – all providers are merged for available channels */
|
|
46
48
|
declare const AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER: InjectionToken<AXMTextTemplateChannelDefinitionProvider>;
|
|
47
49
|
|
|
48
|
-
|
|
50
|
+
declare const AXC_TEXT_TEMPLATE_BLOCK_REGISTRY: InjectionToken<AXPRegistry<ContentBlockDefinition>>;
|
|
51
|
+
declare const AXC_TEXT_TEMPLATE_PIPE_REGISTRY: InjectionToken<AXPRegistry<ContentPipe>>;
|
|
52
|
+
declare const AXC_TEXT_TEMPLATE_ENGINE: InjectionToken<TextTemplateEngine>;
|
|
53
|
+
|
|
54
|
+
export { AXC_TEXT_TEMPLATE_BLOCK_REGISTRY, AXC_TEXT_TEMPLATE_ENGINE, AXC_TEXT_TEMPLATE_PIPE_REGISTRY, AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY, AXMContentManagementModule, AXMMenuProvider, AXMPromotionSlotComponent, AXMSearchCommandProvider, AXMSettingProvider, AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-content-management-client-template-content-editor-widget-edit.component-CApNVTfc.mjs","sources":["../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/template-content-editor-widget-edit.component.ts","../../../../libs/modules/content-management/client/src/lib/features/template-content-editor/template-content-editor-widget-edit.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXTabsModule } from '@acorex/components/tabs';\nimport { AXTextAreaModule } from '@acorex/components/text-area';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n AXWysiwygContainerComponent,\n AXWysiwygModule,\n} from '@acorex/components/wysiwyg';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport { AXPSettingsService, AXPTokenDefinitionService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPValueWidgetComponent } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';\nimport { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n effect,\n inject,\n OnInit,\n signal,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, type SafeHtml } from '@angular/platform-browser';\nimport { FormsModule } from '@angular/forms';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXPPlatformScope, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport {\n AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY,\n RootConfig,\n type AXMTextTemplatePreviewRequest,\n type AXMTextTemplatePreviewResult,\n} from '@acorex-platform/module-content-management-client/contracts';\nimport { AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER } from './channel-definition.provider';\nimport {\n AXMTextTemplateChannelDefinition,\n AXMTextTemplateChannelsValue,\n} from './channel-definition.types';\nimport {\n AXM_TEXT_TEMPLATE_CONTENT_SLOT,\n AXM_TEXT_TEMPLATE_KIND,\n AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH,\n collectTextTemplatePlaceholderNames,\n composeTextTemplateBodyChain,\n replaceTextTemplatePlaceholders,\n resolveTextTemplateLocalizedString,\n type AXMTextTemplateEntityModel,\n} from './text-template-placeholder.util';\n\n/** Variable definition from PlatformManagement.Tokens for template preview and Insert variable */\ninterface TemplateVariable {\n name: string;\n title: string;\n sampleValue?: string;\n kind?: string;\n dataType?: string;\n}\n\n@Component({\n selector: 'axm-template-content-editor-widget-edit',\n templateUrl: './template-content-editor-widget-edit.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXDecoratorModule,\n FormsModule,\n AXFormModule,\n AXTabsModule,\n AXTextAreaModule,\n AXTextBoxModule,\n AXWysiwygModule,\n AXValidationModule,\n AXTranslationModule,\n AXButtonModule,\n AXDropdownModule,\n ],\n})\nexport class AXMTemplateContentEditorWidgetEditComponent\n extends AXPValueWidgetComponent<AXMTextTemplateChannelsValue | null>\n implements OnInit, AfterViewInit\n{\n /** Stored cursor/selection state before Insert Variable dropdown opens */\n private storedCursor: {\n channelName: string;\n isPlain: boolean;\n selectionStart?: number;\n selectionEnd?: number;\n range?: Range;\n } | null = null;\n private readonly channelProviders = inject(AXP_TEXT_TEMPLATE_CHANNEL_DEFINITION_PROVIDER, {\n optional: true,\n });\n private readonly settingsService = inject(AXPSettingsService);\n private readonly translationService = inject(AXTranslationService);\n private readonly entityService = inject(AXPEntityService);\n private readonly tokenDefinitionService = inject(AXPTokenDefinitionService, { optional: true });\n private readonly commandExecutor = inject(AXPCommandExecutor);\n private readonly toastService = inject(AXToastService);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly destroyRef = inject(DestroyRef);\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n\n /** Dedupes in-flight preview loads when effect re-runs. */\n private previewRequestSeq = 0;\n\n protected wysiwygRef = viewChild<AXWysiwygContainerComponent>('wysiwygRef');\n protected bodyTextareaRef = viewChild('bodyTextarea', { read: ElementRef<HTMLElement> });\n\n protected availableChannels = signal<AXMTextTemplateChannelDefinition[]>([]);\n protected channelConfigured = signal<Record<string, boolean>>({});\n protected availableVariables = signal<TemplateVariable[]>([]);\n protected activeTabIndex = signal<number>(0);\n protected viewMode = signal<'edit' | 'preview'>('edit');\n\n /** Resolved values for local preview fallback: expression/token evaluation, then sampleValue */\n protected resolvedPreviewValues = signal<Record<string, string>>({});\n\n /** Parent-chain bodies (leaf → root) for the active locale, keyed by channel (local fallback). */\n protected composedPreviewBodies = signal<Record<string, string>>({});\n\n /** Server Preview results keyed by channel (preferred over local compose). */\n protected serverPreviewByChannel = signal<\n Record<string, { subject?: string; body: string }>\n >({});\n\n protected activeChannel = computed(() => {\n const idx = this.activeTabIndex();\n const chs = this.availableChannels();\n return chs[idx] ?? null;\n });\n\n /** True when the host entity form has Kind = Master. */\n protected isMasterKind = computed(() => {\n this.contextService.changeEvent();\n const kind = this.contextService.getValue('kind');\n return kind === AXM_TEXT_TEMPLATE_KIND.Master;\n });\n\n protected otherChannelsWithContent = (currentName: string) =>\n this.availableChannels().filter(\n (c) => c.name !== currentName && (this.getChannelBody(c.name) || (c.hasSubject && this.getChannelSubject(c.name)))\n );\n\n /** Returns icon class for a variable/token based on kind and dataType */\n protected getVariableIcon(v: TemplateVariable): string {\n const kindMap: Record<string, string> = {\n Static: 'fa-light fa-database',\n Context: 'fa-light fa-layer-group',\n Event: 'fa-light fa-bolt',\n Computed: 'fa-light fa-calculator',\n Secret: 'fa-light fa-key',\n };\n const dataTypeMap: Record<string, string> = {\n String: 'fa-light fa-font',\n Integer: 'fa-light fa-hashtag',\n Boolean: 'fa-light fa-toggle-on',\n Decimal: 'fa-light fa-calculator',\n DateTime: 'fa-light fa-clock',\n Json: 'fa-light fa-braces',\n };\n const byKind = v.kind && kindMap[v.kind];\n if (byKind) return byKind;\n const byDataType = v.dataType && dataTypeMap[v.dataType];\n if (byDataType) return byDataType;\n return 'fa-light fa-code';\n }\n\n /** Returns icon class for a channel based on name and type */\n protected getChannelIcon(ch: AXMTextTemplateChannelDefinition): string {\n const nameMap: Record<string, string> = {\n email: 'fa-light fa-envelope',\n sms: 'fa-light fa-comment-sms',\n whatsapp: 'fa-brands fa-whatsapp',\n push: 'fa-light fa-bell',\n telegram: 'fa-brands fa-telegram',\n 'in-app': 'fa-light fa-inbox',\n };\n const byName = nameMap[ch.name?.toLowerCase() ?? ''];\n if (byName) return byName;\n return ch.type === 'rich' ? 'fa-light fa-file-lines' : 'fa-light fa-align-left';\n }\n\n private getTemplateLocale(): string {\n return this.translationService.getActiveLang() ?? 'en-US';\n }\n\n /**\n * Builds a mutable locale map from a stored channel field (string legacy or ML object).\n */\n private normalizeChannelFieldToMl(\n existing: AXPMultiLanguageString | string | undefined,\n ): Record<string, string> {\n if (existing == null || existing === '') {\n return {};\n }\n if (typeof existing === 'string') {\n const s = existing;\n return { 'en-US': s, 'fa-IR': s };\n }\n return { ...(existing as Record<string, string>) };\n }\n\n constructor() {\n super();\n effect(() => {\n this.viewMode();\n this.activeTabIndex();\n this.getValue();\n this.contextService.changeEvent();\n if (this.viewMode() === 'preview') {\n void this.loadServerPreview();\n } else {\n this.previewRequestSeq += 1;\n this.resolvedPreviewValues.set({});\n this.composedPreviewBodies.set({});\n this.serverPreviewByChannel.set({});\n }\n });\n\n this.settingsService.onChanged.subscribe(() => {\n void this.refreshChannelConfiguration();\n });\n }\n\n protected isChannelConfigured(name: string): boolean {\n return this.channelConfigured()[name] ?? true;\n }\n\n protected async openChannelConfigure(channel: AXMTextTemplateChannelDefinition): Promise<void> {\n const configure = channel.configureSettings;\n if (!configure) {\n return;\n }\n\n const saved = await this.settingsService.showSectionPopup({\n scope: configure.scope,\n section: configure.section,\n group: configure.group,\n });\n if (saved) {\n await this.refreshChannelConfiguration();\n }\n }\n\n private async refreshChannelConfiguration(): Promise<void> {\n const channels = this.availableChannels();\n const next: Record<string, boolean> = {};\n for (const channel of channels) {\n next[channel.name] = await this.isChannelConfiguredInternal(channel);\n }\n this.channelConfigured.set(next);\n }\n\n private async isChannelConfiguredInternal(channel: AXMTextTemplateChannelDefinition): Promise<boolean> {\n const requiredKeys = channel.requiredSettingKeys ?? [];\n if (!requiredKeys.length) {\n return true;\n }\n const scopeKey = channel.configureSettings?.scope ?? 'T';\n const scoped = this.settingsService.scope(scopeKey as AXPPlatformScope);\n for (const key of requiredKeys) {\n const value = await scoped.get(key);\n if (!this.hasNonEmptySettingValue(value)) {\n return false;\n }\n }\n return true;\n }\n\n private hasNonEmptySettingValue(value: unknown): boolean {\n if (value == null) {\n return false;\n }\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n if (typeof value === 'number') {\n return Number.isFinite(value);\n }\n if (typeof value === 'boolean') {\n return true;\n }\n if (typeof value === 'object' && 'value' in value) {\n return this.hasNonEmptySettingValue((value as { value?: unknown }).value);\n }\n return String(value).trim().length > 0;\n }\n\n ngAfterViewInit(): void {\n const el = this.hostRef.nativeElement;\n const handleMousedown = (e: MouseEvent) => {\n const target = e.target as Node;\n if (!target || !el.contains(target)) return;\n const trigger = (target as Element).closest?.('[data-insert-var-trigger]');\n if (!trigger) return;\n this.captureCursorBeforeInsert();\n };\n el.addEventListener('mousedown', handleMousedown, { capture: true });\n this.destroyRef.onDestroy(() =>\n el.removeEventListener('mousedown', handleMousedown, { capture: true })\n );\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n const rawCh = this.channelProviders;\n const chProviders = rawCh == null ? [] : Array.isArray(rawCh) ? rawCh : [rawCh];\n const allChannels: AXMTextTemplateChannelDefinition[] = [];\n for (const p of chProviders) {\n if (p?.getChannels) allChannels.push(...p.getChannels());\n }\n this.availableChannels.set(\n Array.from(new Map(allChannels.map((c) => [c.name, c])).values())\n );\n await this.refreshChannelConfiguration();\n\n try {\n const tokensAccessor = this.entityService.withEntity('PlatformManagement', 'Tokens').data();\n const result = await tokensAccessor.query({ skip: 0, take: 500 });\n const items = (result.items ?? []) as Array<{\n name?: string;\n title?: string;\n sampleValue?: string;\n kind?: string;\n dataType?: string;\n }>;\n const vars: TemplateVariable[] = items\n .map((t) => ({\n name: String(t.name ?? ''),\n title: String(t.title ?? t.name ?? ''),\n sampleValue: t.sampleValue != null ? String(t.sampleValue) : undefined,\n kind: t.kind,\n dataType: t.dataType,\n }))\n .filter((v) => v.name);\n this.availableVariables.set(Array.from(new Map(vars.map((v) => [v.name, v])).values()));\n } catch {\n this.availableVariables.set([]);\n }\n\n const value = this.getValue();\n if (value && typeof value === 'object' && Object.keys(value).length > 0) {\n const names = Object.keys(value);\n const chs = this.availableChannels();\n const idx = chs.findIndex((c) => names.includes(c.name));\n if (idx >= 0) this.activeTabIndex.set(idx);\n }\n }\n\n /** Capture cursor/selection before dropdown opens (runs in mousedown capture phase) */\n private captureCursorBeforeInsert(): void {\n const ch = this.activeChannel();\n if (!ch) return;\n this.storedCursor = null;\n const active = document.activeElement as HTMLElement | null;\n if (!active) return;\n if (ch.type === 'plain') {\n const textarea = this.getTextareaElement(active);\n if (textarea) {\n this.storedCursor = {\n channelName: ch.name,\n isPlain: true,\n selectionStart: textarea.selectionStart,\n selectionEnd: textarea.selectionEnd,\n };\n }\n } else {\n const editable = this.getContentEditableElement(active);\n if (editable) {\n const sel = document.getSelection();\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0).cloneRange();\n this.storedCursor = {\n channelName: ch.name,\n isPlain: false,\n range,\n };\n }\n }\n }\n }\n\n private getTextareaElement(el: HTMLElement): HTMLTextAreaElement | null {\n if (el instanceof HTMLTextAreaElement) return el;\n return el.querySelector?.('textarea') ?? null;\n }\n\n private getContentEditableElement(el: HTMLElement): HTMLElement | null {\n if (el.isContentEditable) return el;\n return el.closest?.('[contenteditable=\"true\"]') ?? null;\n }\n\n protected insertVariable(channelName: string, varName: string): void {\n this.insertToken(channelName, `{{${varName}}}`);\n }\n\n protected insertContentSlot(channelName: string): void {\n this.insertToken(channelName, AXM_TEXT_TEMPLATE_CONTENT_SLOT);\n }\n\n private insertToken(channelName: string, token: string): void {\n const current = this.getChannelBody(channelName);\n const stored = this.storedCursor;\n this.storedCursor = null;\n\n if (stored && stored.channelName === channelName) {\n if (stored.isPlain) {\n const start = stored.selectionStart ?? current.length;\n const end = stored.selectionEnd ?? start;\n const before = current.slice(0, start);\n const after = current.slice(end);\n const newBody = before + token + after;\n this.setChannelBody(channelName, newBody);\n const newCursor = start + token.length;\n queueMicrotask(() => this.restoreTextareaCursor(newCursor));\n } else if (stored.range) {\n try {\n const startNode = stored.range.startContainer;\n const elem = startNode.nodeType === Node.TEXT_NODE\n ? (startNode as Text).parentElement\n : (startNode as Element);\n const editable = elem?.closest?.('[contenteditable=\"true\"]') as HTMLElement | null;\n const wysiwyg = this.wysiwygRef();\n const target = editable ?? wysiwyg?.getHostElement()?.querySelector?.('[contenteditable=\"true\"]');\n if (target) {\n (target as HTMLElement).focus();\n const sel = document.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(stored.range);\n document.execCommand('insertText', false, token);\n }\n } else {\n this.setChannelBody(channelName, current + token);\n }\n } catch {\n this.setChannelBody(channelName, current + token);\n }\n }\n } else {\n this.setChannelBody(channelName, current + token);\n }\n }\n\n private restoreTextareaCursor(position: number): void {\n const ref = this.bodyTextareaRef();\n const el = ref?.nativeElement;\n const textarea = el?.querySelector?.('textarea') ?? (el instanceof HTMLTextAreaElement ? el : null);\n if (textarea) {\n textarea.focus();\n textarea.setSelectionRange(position, position);\n }\n }\n\n protected copyFromChannel(targetName: string, sourceName: string): void {\n const ch = this.availableChannels().find((c) => c.name === sourceName);\n if (!ch) return;\n const hasSubject = ch.hasSubject;\n if (hasSubject) {\n this.setChannelSubject(targetName, this.getChannelSubject(sourceName));\n }\n this.setChannelBody(targetName, this.getChannelBody(sourceName));\n }\n\n protected getChannelSubject(name: string): string {\n const v = this.getValue()?.[name];\n const raw =\n v && typeof v === 'object' && 'subject' in v ? (v as { subject?: AXPMultiLanguageString }).subject : undefined;\n return resolveTextTemplateLocalizedString(raw, this.getTemplateLocale());\n }\n\n protected setChannelSubject(name: string, value: string): void {\n const current = this.getValue() || {};\n const ch = current[name] || { body: '' };\n const locale = this.getTemplateLocale();\n const ml = this.normalizeChannelFieldToMl(ch.subject);\n ml[locale] = value ?? '';\n this.setValue({ ...current, [name]: { ...ch, subject: ml } });\n }\n\n protected getChannelBody(name: string): string {\n const v = this.getValue()?.[name];\n const raw =\n v && typeof v === 'object' && 'body' in v ? (v as { body?: AXPMultiLanguageString }).body : undefined;\n return resolveTextTemplateLocalizedString(raw, this.getTemplateLocale());\n }\n\n protected handleWysiwygChange(name: string, e: AXValueChangedEvent<string>): void {\n const val =\n typeof e === 'object' && e !== null && 'value' in e\n ? (e as { value: string }).value\n : String(e ?? '');\n this.setChannelBody(name, val);\n }\n\n protected setChannelBody(name: string, value: string): void {\n const current = this.getValue() || {};\n const ch = current[name] || { body: '' };\n const hasSubject =\n this.availableChannels().find((c) => c.name === name)?.hasSubject ?? false;\n const locale = this.getTemplateLocale();\n const ml = this.normalizeChannelFieldToMl(ch.body);\n ml[locale] = value ?? '';\n if (hasSubject) {\n this.setValue({ ...current, [name]: { ...ch, body: ml } });\n } else {\n this.setValue({ ...current, [name]: { body: ml } });\n }\n }\n\n /**\n * Prefer server draft Preview (Context tokens + Event samples + parent composition).\n * Falls back to local compose when the command fails.\n */\n private async loadServerPreview(): Promise<void> {\n const requestSeq = ++this.previewRequestSeq;\n const value = this.getValue();\n const channel = this.activeChannel()?.name?.trim() || '';\n if (!value || typeof value !== 'object' || !channel) {\n this.serverPreviewByChannel.set({});\n this.composedPreviewBodies.set({});\n return;\n }\n\n const locale = this.getTemplateLocale();\n const parentIdRaw = this.contextService.getValue('parentId');\n const parentId = typeof parentIdRaw === 'string' ? parentIdRaw.trim() : '';\n const kindRaw = this.contextService.getValue('kind');\n const kind = typeof kindRaw === 'string' ? kindRaw.trim() : undefined;\n\n const request: AXMTextTemplatePreviewRequest = {\n channels: value,\n channel,\n locale,\n ...(parentId ? { parentId } : {}),\n ...(kind ? { kind } : {}),\n };\n\n try {\n const result = await this.commandExecutor.execute<\n AXMTextTemplatePreviewRequest,\n AXMTextTemplatePreviewResult\n >(AXM_TEXT_TEMPLATE_PREVIEW_COMMAND_KEY, request);\n\n if (requestSeq !== this.previewRequestSeq) {\n return;\n }\n\n const preview = runtimeCommandPayloadData(result);\n if (preview?.body != null) {\n this.serverPreviewByChannel.update((prev) => ({\n ...prev,\n [channel]: {\n ...(preview.subject != null ? { subject: preview.subject } : {}),\n body: preview.body,\n },\n }));\n return;\n }\n\n const message =\n typeof result?.message?.text === 'string' && result.message.text.trim()\n ? result.message.text.trim()\n : undefined;\n await this.fallbackToLocalPreview(channel, message);\n } catch (error) {\n if (requestSeq !== this.previewRequestSeq) {\n return;\n }\n const message = error instanceof Error ? error.message : undefined;\n await this.fallbackToLocalPreview(channel, message);\n }\n }\n\n private async fallbackToLocalPreview(channel: string, errorMessage?: string): Promise<void> {\n const title = await this.translationService.translateAsync(\n '@content-management:templates.messages.preview-failed.title',\n );\n const content = await this.translationService.translateAsync(\n '@content-management:templates.messages.preview-failed.content',\n );\n this.toastService.show({\n color: 'warning',\n title,\n content: errorMessage ? `${content} ${errorMessage}` : content,\n closeButton: true,\n timeOut: 5000,\n });\n\n this.serverPreviewByChannel.update((prev) => {\n const next = { ...prev };\n delete next[channel];\n return next;\n });\n await this.resolveComposedPreviewBodies();\n }\n\n /** Resolve variable values for local preview fallback */\n private async resolvePreviewVariables(): Promise<void> {\n const value = this.getValue();\n if (!value || typeof value !== 'object') return;\n const locale = this.getTemplateLocale();\n const parts: string[] = [];\n for (const v of Object.values(value)) {\n if (v != null && typeof v === 'object' && 'body' in v) {\n const o = v as { subject?: AXPMultiLanguageString; body?: AXPMultiLanguageString };\n parts.push(resolveTextTemplateLocalizedString(o.subject, locale));\n parts.push(resolveTextTemplateLocalizedString(o.body, locale));\n }\n }\n for (const body of Object.values(this.composedPreviewBodies())) {\n parts.push(body);\n }\n const allText = parts.join('');\n const varNames = collectTextTemplatePlaceholderNames(allText);\n if (varNames.length === 0) return;\n const vars = this.availableVariables();\n const resolved: Record<string, string> = {};\n const svc = this.tokenDefinitionService;\n for (const name of varNames) {\n try {\n if (svc) {\n const val = await svc.getValue(name);\n resolved[name] = val != null ? String(val) : '';\n }\n } catch {\n /* use fallback */\n }\n if (!(name in resolved) || !resolved[name]) {\n const v = vars.find((x) => x.name === name);\n if (v?.sampleValue != null) {\n resolved[name] = v.sampleValue;\n } else if (!(name in resolved)) {\n resolved[name] = '';\n }\n }\n }\n this.resolvedPreviewValues.update((prev) => ({ ...prev, ...resolved }));\n }\n\n /**\n * Local fallback: loads optional parent masters and stores leaf→root body chains per channel.\n */\n private async resolveComposedPreviewBodies(): Promise<void> {\n const value = this.getValue();\n if (!value || typeof value !== 'object') {\n this.composedPreviewBodies.set({});\n return;\n }\n\n const parentIdRaw = this.contextService.getValue('parentId');\n const parentId = typeof parentIdRaw === 'string' ? parentIdRaw.trim() : '';\n const locale = this.getTemplateLocale();\n const next: Record<string, string> = {};\n\n if (!parentId) {\n for (const channelName of Object.keys(value)) {\n next[channelName] = this.getChannelBody(channelName);\n }\n this.composedPreviewBodies.set(next);\n await this.resolvePreviewVariables();\n return;\n }\n\n const parentBodiesByChannel: Record<string, string[]> = {};\n try {\n const accessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.textTemplate.name)\n .data<\n string,\n AXMTextTemplateEntityModel,\n AXMTextTemplateEntityModel,\n AXMTextTemplateEntityModel,\n AXMTextTemplateEntityModel\n >();\n\n const visited = new Set<string>();\n const selfIdRaw = this.contextService.getValue('id');\n const selfId = typeof selfIdRaw === 'string' ? selfIdRaw.trim() : '';\n if (selfId) {\n visited.add(selfId);\n }\n\n let currentId: string | null = parentId;\n let depth = 1;\n while (currentId && depth <= AXM_TEXT_TEMPLATE_MAX_PARENT_DEPTH) {\n if (visited.has(currentId)) {\n break;\n }\n visited.add(currentId);\n const parent = await accessor.byKey(currentId);\n if (!parent?.channels) {\n break;\n }\n for (const [channelName, channelDef] of Object.entries(parent.channels)) {\n const body = resolveTextTemplateLocalizedString(channelDef?.body, locale);\n if (!body) continue;\n (parentBodiesByChannel[channelName] ??= []).push(body);\n }\n currentId = parent.parentId?.trim() || null;\n depth += 1;\n }\n } catch {\n /* keep leaf-only preview */\n }\n\n for (const channelName of Object.keys(value)) {\n const leafBody = this.getChannelBody(channelName);\n const parents = parentBodiesByChannel[channelName] ?? [];\n next[channelName] = composeTextTemplateBodyChain([leafBody, ...parents], {});\n }\n this.composedPreviewBodies.set(next);\n await this.resolvePreviewVariables();\n }\n\n /** Get preview value for variable: expression/token first, then sampleValue */\n private getPreviewValue(varName: string): string {\n const resolved = this.resolvedPreviewValues()[varName];\n if (resolved !== undefined && resolved !== '') return resolved;\n const v = this.availableVariables().find((x) => x.name === varName);\n return v?.sampleValue ?? `{{${varName}}}`;\n }\n\n /**\n * Merge map for {@link replaceTextTemplatePlaceholders}: one entry per `{{name}}` in `text`.\n * When `escapeMergeValuesForHtml` is true, substitution values are escaped for safe `innerHTML` fragments.\n */\n private previewMergeFor(text: string, escapeMergeValuesForHtml: boolean): Record<string, string> {\n const out: Record<string, string> = {};\n for (const name of collectTextTemplatePlaceholderNames(text)) {\n let v = this.getPreviewValue(name);\n if (escapeMergeValuesForHtml) {\n v = v.replace(/</g, '<').replace(/>/g, '>');\n }\n out[name] = v;\n }\n return out;\n }\n\n protected previewSubject(channelName: string): string {\n const server = this.serverPreviewByChannel()[channelName];\n if (server?.subject != null) {\n return server.subject;\n }\n return this.previewText(this.getChannelSubject(channelName));\n }\n\n protected previewText(text: string): string {\n return replaceTextTemplatePlaceholders(text, this.previewMergeFor(text, false));\n }\n\n /**\n * Email/rich preview must bypass Angular's default innerHTML sanitizer;\n * otherwise inline `style` (colors, gradients, header bar) is stripped and\n * the preview diverges from the real sent email.\n */\n protected previewBodyHtml(channelName: string): SafeHtml | string {\n const ch = this.availableChannels().find((c) => c.name === channelName);\n const server = this.serverPreviewByChannel()[channelName];\n if (server?.body != null) {\n if (ch?.type === 'rich') {\n return this.sanitizer.bypassSecurityTrustHtml(server.body);\n }\n return server.body\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\\n/g, '<br/>');\n }\n\n const composed = this.composedPreviewBodies()[channelName];\n const body = composed ?? this.getChannelBody(channelName);\n // Local fallback: do not escape merge for rich HTML (logo mark / styled shells).\n const merged = replaceTextTemplatePlaceholders(\n body,\n this.previewMergeFor(body, ch?.type !== 'rich'),\n );\n if (ch?.type === 'rich') {\n return this.sanitizer.bypassSecurityTrustHtml(merged);\n }\n return merged\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\\n/g, '<br/>');\n }\n}\n","<!-- Template Content Editor: Channel tabs and content per channel -->\n<div class=\"flex flex-col gap-4 w-full\">\n <!-- Channel tabs navigation -->\n <div class=\"flex items-center gap-2 flex-wrap\">\n <ax-tabs\n [look]=\"'with-line'\"\n (onActiveTabChanged)=\"activeTabIndex.set($event.index)\"\n class=\"flex-1 min-w-0\"\n >\n @for (ch of availableChannels(); track ch.name; let i = $index) {\n <ax-tab-item\n [text]=\"(ch.title | translate | async) ?? ch.name\"\n [key]=\"i.toString()\"\n [active]=\"activeTabIndex() === i\"\n ></ax-tab-item>\n }\n </ax-tabs>\n </div>\n\n @if (activeChannel(); as ch) {\n <!-- Channel content area: Edit mode or Preview mode -->\n <div class=\"mb-4 p-4\">\n @if (!isChannelConfigured(ch.name) && ch.notConfiguredMessageKey) {\n <div\n class=\"mb-4 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 p-3 rounded border border-amber-300 bg-amber-50 dark:border-amber-700 dark:bg-amber-950/30\"\n >\n <p class=\"text-sm text-amber-900 dark:text-amber-100\">\n {{ ch.notConfiguredMessageKey | translate | async }}\n </p>\n @if (ch.configureSettings) {\n <ax-button\n [text]=\"\n '@content-management:templates.actions.configure-channel'\n | translate\n | async\n \"\n look=\"outline\"\n color=\"primary\"\n size=\"sm\"\n (onClick)=\"openChannelConfigure(ch)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-gear\"></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </div>\n }\n\n @if (viewMode() === 'edit') {\n <!-- Edit mode: Subject field (for channels that support it, e.g. Email) -->\n @if (ch.hasSubject) {\n <div class=\"mb-3\">\n <label class=\"block text-sm mb-1\">\n {{\n '@content-management:templates.entities.text-template.fields.subject.title'\n | translate\n | async\n }}\n </label>\n <ax-text-box\n [ngModel]=\"getChannelSubject(ch.name)\"\n (ngModelChange)=\"setChannelSubject(ch.name, $event)\"\n [placeholder]=\"\n ('@content-management:templates.entities.text-template.fields.subject.placeholder'\n | translate\n | async)!\n \"\n ></ax-text-box>\n </div>\n }\n\n <!-- Edit mode: Body field (plain text or rich WYSIWYG) -->\n <div>\n <label class=\"block text-sm mb-1\">\n {{\n '@content-management:templates.entities.text-template.fields.body.title'\n | translate\n | async\n }}\n </label>\n @if (ch.type === 'plain') {\n <ax-text-area\n #bodyTextarea\n [ngModel]=\"getChannelBody(ch.name)\"\n (ngModelChange)=\"setChannelBody(ch.name, $event)\"\n [rows]=\"8\"\n [placeholder]=\"\n ('@content-management:templates.entities.text-template.fields.body-placeholder.plain'\n | translate\n | async)!\n \"\n ></ax-text-area>\n } @else {\n <ax-wysiwyg-container\n #wysiwygRef\n [placeHolder]=\"\n ('@content-management:templates.entities.text-template.fields.body-placeholder.rich'\n | translate\n | async)!\n \"\n [ngModel]=\"getChannelBody(ch.name)\"\n (onValueChanged)=\"handleWysiwygChange(ch.name, $event)\"\n [look]=\"'solid'\"\n >\n <ax-wysiwyg-view [style.min-height.px]=\"200\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-prefix>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n </ax-prefix>\n </ax-wysiwyg-toolbar>\n </ax-wysiwyg-container>\n }\n </div>\n } @else {\n <!-- Preview mode: Rendered content with variable placeholders replaced by sample values -->\n <div class=\"space-y-2\">\n @if (ch.hasSubject && previewSubject(ch.name)) {\n <div>\n <span class=\"text-xs text-gray-500\"\n >{{\n '@content-management:templates.entities.text-template.fields.subject.title'\n | translate\n | async\n }}:\n </span>\n <span class=\"text-sm\">{{ previewSubject(ch.name) }}</span>\n </div>\n }\n <!-- ----- Rich email keeps inline styles; plain channels use pre-wrap ----- -->\n <div\n class=\"text-sm p-3 bg-gray-100 dark:bg-gray-900 rounded border overflow-auto\"\n [class.whitespace-pre-wrap]=\"ch.type !== 'rich'\"\n [innerHTML]=\"previewBodyHtml(ch.name)\"\n ></div>\n </div>\n }\n </div>\n\n <!-- Footer: Action buttons (left) + Edit/Preview toggle (right) in single row -->\n <div\n class=\"flex flex-nowrap items-center justify-between gap-3 pt-3 mt-1 border-t border-gray-200 dark:border-gray-700\"\n >\n <div class=\"flex flex-nowrap items-center gap-2 min-w-0\">\n @if (viewMode() === 'edit') {\n <!-- ----- Insert variable dropdown from platform tokens ----- -->\n <div data-insert-var-trigger>\n <ax-button\n [text]=\"\n '@content-management:templates.actions.insert-variable'\n | translate\n | async\n \"\n look=\"twotone\"\n color=\"default\"\n size=\"sm\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-code\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (v of availableVariables(); track v.name) {\n <ax-button-item\n look=\"blank\"\n color=\"default\"\n [text]=\"(v.title || v.name) + ' ({{' + v.name + '}})'\"\n (onClick)=\"insertVariable(ch.name, v.name)\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"getVariableIcon(v)\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-chevron-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n </div>\n <!--->\n <!-- ----- Insert reserved [content] slot for master templates ----- -->\n @if (isMasterKind()) {\n <div data-insert-var-trigger>\n <ax-button\n [text]=\"\n '@content-management:templates.actions.insert-content-slot'\n | translate\n | async\n \"\n look=\"twotone\"\n color=\"default\"\n size=\"sm\"\n (onClick)=\"insertContentSlot(ch.name)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-layer-group\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n }\n <!--->\n <!-- ----- Copy subject/body from another channel ----- -->\n @if (otherChannelsWithContent(ch.name).length > 0) {\n <ax-button\n [text]=\"\n '@content-management:templates.actions.copy-from'\n | translate\n | async\n \"\n look=\"twotone\"\n color=\"default\"\n size=\"sm\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-copy\"></ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-chevron-down\"></ax-icon>\n </ax-suffix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (\n src of otherChannelsWithContent(ch.name);\n track src.name\n ) {\n <ax-button-item\n look=\"blank\"\n color=\"default\"\n [text]=\"(src.title | translate | async) ?? src.name\"\n (onClick)=\"copyFromChannel(ch.name, src.name)\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"getChannelIcon(src)\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n }\n </div>\n <div>\n <ax-tabs [look]=\"'default'\">\n <ax-tab-item\n [text]=\"\n ('@content-management:templates.actions.edit'\n | translate\n | async) ?? 'Edit'\n \"\n [active]=\"viewMode() === 'edit'\"\n (onClick)=\"viewMode.set('edit')\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-pen\" class=\"text-current\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n <ax-tab-item\n [text]=\"\n ('@content-management:templates.actions.preview'\n | translate\n | async) ?? 'Preview'\n \"\n [active]=\"viewMode() === 'preview'\"\n (onClick)=\"viewMode.set('preview')\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-eye\" class=\"text-current\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n </ax-tabs>\n </div>\n </div>\n }\n</div>\n"],"names":["i9","i10"],"mappings":"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"}
|