@masterteam/notification 0.0.9 → 0.0.11

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.
@@ -1,2 +1,2 @@
1
- /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-slate-500:oklch(55.4% .046 257.417);--spacing:.25rem;--font-weight-medium:500;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.static{position:static}.mb-2{margin-bottom:calc(var(--spacing)*2)}.flex{display:flex}.grid{display:grid}.h-12{height:calc(var(--spacing)*12)}.\!w-\[25rem\]{width:25rem!important}.w-1\/2{width:50%}.w-12{width:calc(var(--spacing)*12)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-surface{border-color:var(--p-content-border-color)}.bg-surface-50{background-color:var(--p-surface-50)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-4{padding-top:calc(var(--spacing)*4)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-slate-500{color:var(--color-slate-500)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-surface-100:hover{background-color:var(--p-surface-100)}}}@layer keyframes{@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0),var(--p-enter-translate-y,0),0)scale3d(var(--p-enter-scale,1),var(--p-enter-scale,1),var(--p-enter-scale,1))rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0),var(--p-leave-translate-y,0),0)scale3d(var(--p-leave-scale,1),var(--p-leave-scale,1),var(--p-leave-scale,1))rotate(var(--p-leave-rotate,0))}}@keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes fadeout{0%{opacity:1}to{opacity:0}}@keyframes infinite-scroll{0%{transform:translate(0)}to{transform:translate(-100%)}}@keyframes scalein{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:scaleY(.8)}to{opacity:1;transform:scaleY(1)}}@keyframes slidedown{0%{max-height:0}to{max-height:auto}}@keyframes slideup{0%{max-height:1000px}to{max-height:0}}@keyframes fadeinleft{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translate(-100%)}to{opacity:1;transform:translate(0%)}}@keyframes fadeoutleft{0%{opacity:1;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translate(0%)}to{opacity:0;transform:translate(-100%)}}@keyframes fadeinright{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translate(100%)}to{opacity:1;transform:translate(0%)}}@keyframes fadeoutright{0%{opacity:1;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translate(0%)}to{opacity:0;transform:translate(100%)}}@keyframes fadeinup{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translateY(-100%)}to{opacity:1;transform:translateY(0%)}}@keyframes fadeoutup{0%{opacity:1;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translateY(0%)}to{opacity:0;transform:translateY(-100%)}}@keyframes fadeindown{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translateY(100%)}to{opacity:1;transform:translateY(0%)}}@keyframes fadeoutdown{0%{opacity:1;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translateY(0%)}to{opacity:0;transform:translateY(100%)}}@keyframes width{0%{width:0}to{width:100%}}@keyframes flip{0%{transform:perspective(2000px)rotateX(-100deg)}to{transform:perspective(2000px)rotateX(0)}}@keyframes flipleft{0%{opacity:0;transform:perspective(2000px)rotateY(-100deg)}to{opacity:1;transform:perspective(2000px)rotateY(0)}}@keyframes flipright{0%{opacity:0;transform:perspective(2000px)rotateY(100deg)}to{opacity:1;transform:perspective(2000px)rotateY(0)}}@keyframes flipup{0%{opacity:0;transform:perspective(2000px)rotateX(-100deg)}to{opacity:1;transform:perspective(2000px)rotateX(0)}}@keyframes zoomin{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomindown{0%{opacity:0;transform:scale3d(.1,.1,.1)translateY(-1000px)}60%{opacity:1;transform:scale3d(.475,.475,.475)translateY(60px)}}@keyframes zoominleft{0%{opacity:0;transform:scale3d(.1,.1,.1)translate(-1000px)}60%{opacity:1;transform:scale3d(.475,.475,.475)translate(10px)}}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
1
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-slate-500:oklch(55.4% .046 257.417);--spacing:.25rem;--font-weight-medium:500;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.static{position:static}.start{inset-inline-start:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.flex{display:flex}.grid{display:grid}.h-12{height:calc(var(--spacing) * 12)}.\!w-\[25rem\]{width:25rem!important}.w-1\/2{width:50%}.w-12{width:calc(var(--spacing) * 12)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-surface{border-color:var(--p-content-border-color)}.bg-surface-50{background-color:var(--p-surface-50)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-4{padding-top:calc(var(--spacing) * 4)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-slate-500{color:var(--color-slate-500)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-surface-100:hover{background-color:var(--p-surface-100)}}}@layer keyframes{@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes fadeout{0%{opacity:1}to{opacity:0}}@keyframes infinite-scroll{0%{transform:translate(0)}to{transform:translate(-100%)}}@keyframes scalein{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:scaleY(.8)}to{opacity:1;transform:scaleY(1)}}@keyframes slidedown{0%{max-height:0}to{max-height:auto}}@keyframes slideup{0%{max-height:1000px}to{max-height:0}}@keyframes fadeinleft{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translate(-100%)}to{opacity:1;transform:translate(0%)}}@keyframes fadeoutleft{0%{opacity:1;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translate(0%)}to{opacity:0;transform:translate(-100%)}}@keyframes fadeinright{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translate(100%)}to{opacity:1;transform:translate(0%)}}@keyframes fadeoutright{0%{opacity:1;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translate(0%)}to{opacity:0;transform:translate(100%)}}@keyframes fadeinup{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translateY(-100%)}to{opacity:1;transform:translateY(0%)}}@keyframes fadeoutup{0%{opacity:1;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translateY(0%)}to{opacity:0;transform:translateY(-100%)}}@keyframes fadeindown{0%{opacity:0;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translateY(100%)}to{opacity:1;transform:translateY(0%)}}@keyframes fadeoutdown{0%{opacity:1;transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1);transform:translateY(0%)}to{opacity:0;transform:translateY(100%)}}@keyframes width{0%{width:0}to{width:100%}}@keyframes flip{0%{transform:perspective(2000px)rotateX(-100deg)}to{transform:perspective(2000px)rotateX(0)}}@keyframes flipleft{0%{opacity:0;transform:perspective(2000px)rotateY(-100deg)}to{opacity:1;transform:perspective(2000px)rotateY(0)}}@keyframes flipright{0%{opacity:0;transform:perspective(2000px)rotateY(100deg)}to{opacity:1;transform:perspective(2000px)rotateY(0)}}@keyframes flipup{0%{opacity:0;transform:perspective(2000px)rotateX(-100deg)}to{opacity:1;transform:perspective(2000px)rotateX(0)}}@keyframes zoomin{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomindown{0%{opacity:0;transform:scale3d(.1,.1,.1)translateY(-1000px)}60%{opacity:1;transform:scale3d(.475,.475,.475)translateY(60px)}}@keyframes zoominleft{0%{opacity:0;transform:scale3d(.1,.1,.1)translate(-1000px)}60%{opacity:1;transform:scale3d(.475,.475,.475)translate(10px)}}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
@@ -68,8 +68,8 @@ const CHANNEL_CONFIGS = [
68
68
  {
69
69
  key: 'email',
70
70
  labelKey: 'notification.channel.email',
71
- supportsBilingual: true,
72
- bilingualOptional: true,
71
+ supportsBilingual: false,
72
+ bilingualOptional: false,
73
73
  useRichEditor: true,
74
74
  templateKey: 'emailTemplate',
75
75
  translatableKey: 'emailContentTranslatable',
@@ -259,6 +259,7 @@ const DEFAULT_STATE = {
259
259
  templates: [], // Flattened templates
260
260
  actions: [],
261
261
  receivers: [],
262
+ receiverGroups: [],
262
263
  propertyGroups: [],
263
264
  // Selection state
264
265
  selectedEventName: null,
@@ -284,6 +285,9 @@ let NotificationState = class NotificationState extends CrudStateBase {
284
285
  static getReceivers(state) {
285
286
  return state.receivers;
286
287
  }
288
+ static getReceiverGroups(state) {
289
+ return state.receiverGroups;
290
+ }
287
291
  static getPropertyGroups(state) {
288
292
  return state.propertyGroups;
289
293
  }
@@ -318,6 +322,17 @@ let NotificationState = class NotificationState extends CrudStateBase {
318
322
  const assignedIds = new Set(templateReceivers.map((r) => r.identifier));
319
323
  return receivers.filter((r) => !assignedIds.has(String(r.id)));
320
324
  }
325
+ static getAvailableReceiverGroups(receiverGroups, selectedTemplate) {
326
+ if (!selectedTemplate)
327
+ return receiverGroups;
328
+ const assignedIds = new Set((selectedTemplate.receivers ?? []).map((r) => r.identifier));
329
+ return receiverGroups
330
+ .map((group) => ({
331
+ ...group,
332
+ items: group.items.filter((item) => !assignedIds.has(String(item.id))),
333
+ }))
334
+ .filter((group) => group.items.length > 0);
335
+ }
321
336
  // Helper Methods
322
337
  /** API returns events with nested templates - we flatten for state */
323
338
  flattenEventsResponse(eventsWithTemplates) {
@@ -330,24 +345,42 @@ let NotificationState = class NotificationState extends CrudStateBase {
330
345
  }
331
346
  return { events, templates };
332
347
  }
333
- flattenReceivers(groups) {
334
- const result = [];
335
- for (const group of groups) {
336
- for (const item of group.items) {
337
- if ('subGroupName' in item) {
338
- // Handle subgroups (role-based receivers)
339
- const subGroup = item;
340
- result.push(...subGroup.items.map((r) => ({
341
- ...r,
342
- name: `${subGroup.subGroupName} - ${r.name}`,
343
- })));
344
- }
345
- else {
346
- result.push(item);
347
- }
348
- }
348
+ normalizeReceiverGroups(groups) {
349
+ return groups
350
+ .map((group) => ({
351
+ groupName: group.groupName,
352
+ items: this.flattenReceiverItems(group.items),
353
+ }))
354
+ .filter((group) => group.items.length > 0);
355
+ }
356
+ flattenReceiverItems(items, parentLabel) {
357
+ if (!Array.isArray(items)) {
358
+ return [];
349
359
  }
350
- return result;
360
+ return items.flatMap((item) => {
361
+ const subGroupItems = item.items;
362
+ if (Array.isArray(subGroupItems)) {
363
+ const subGroupName = item.subGroupName;
364
+ const nextLabel = subGroupName
365
+ ? parentLabel
366
+ ? `${parentLabel} - ${subGroupName}`
367
+ : subGroupName
368
+ : parentLabel;
369
+ return this.flattenReceiverItems(subGroupItems, nextLabel);
370
+ }
371
+ const receiver = item;
372
+ if (receiver.id == null || !receiver.name) {
373
+ return [];
374
+ }
375
+ return [
376
+ {
377
+ ...receiver,
378
+ name: parentLabel
379
+ ? `${parentLabel} - ${receiver.name}`
380
+ : receiver.name,
381
+ },
382
+ ];
383
+ });
351
384
  }
352
385
  // Module Configuration
353
386
  setModuleInfo(ctx, action) {
@@ -397,9 +430,13 @@ let NotificationState = class NotificationState extends CrudStateBase {
397
430
  ctx,
398
431
  key: NotificationActionKey.GetReceivers,
399
432
  request$: req$,
400
- onSuccess: (response) => ({
401
- receivers: this.flattenReceivers(response.data ?? []),
402
- }),
433
+ onSuccess: (response) => {
434
+ const receiverGroups = this.normalizeReceiverGroups(response.data ?? []);
435
+ return {
436
+ receiverGroups,
437
+ receivers: receiverGroups.flatMap((group) => group.items),
438
+ };
439
+ },
403
440
  });
404
441
  }
405
442
  getProperties(ctx, action) {
@@ -429,9 +466,13 @@ let NotificationState = class NotificationState extends CrudStateBase {
429
466
  ctx,
430
467
  key: NotificationActionKey.GetReceivers,
431
468
  request$: req$,
432
- onSuccess: (response) => ({
433
- receivers: this.flattenReceivers(response.data ?? []),
434
- }),
469
+ onSuccess: (response) => {
470
+ const receiverGroups = this.normalizeReceiverGroups(response.data ?? []);
471
+ return {
472
+ receiverGroups,
473
+ receivers: receiverGroups.flatMap((group) => group.items),
474
+ };
475
+ },
435
476
  });
436
477
  }
437
478
  getActionProperties(ctx, action) {
@@ -631,6 +672,9 @@ __decorate([
631
672
  __decorate([
632
673
  Selector()
633
674
  ], NotificationState, "getReceivers", null);
675
+ __decorate([
676
+ Selector()
677
+ ], NotificationState, "getReceiverGroups", null);
634
678
  __decorate([
635
679
  Selector()
636
680
  ], NotificationState, "getPropertyGroups", null);
@@ -670,6 +714,12 @@ __decorate([
670
714
  NotificationState.getSelectedTemplate,
671
715
  ])
672
716
  ], NotificationState, "getAvailableReceivers", null);
717
+ __decorate([
718
+ Selector([
719
+ NotificationState.getReceiverGroups,
720
+ NotificationState.getSelectedTemplate,
721
+ ])
722
+ ], NotificationState, "getAvailableReceiverGroups", null);
673
723
  NotificationState = __decorate([
674
724
  State({
675
725
  name: 'notification',
@@ -688,6 +738,7 @@ class NotificationFacade {
688
738
  events = select(NotificationState.getEvents);
689
739
  templates = select(NotificationState.getEventTemplates);
690
740
  receivers = select(NotificationState.getReceivers);
741
+ receiverGroups = select(NotificationState.getReceiverGroups);
691
742
  propertyGroups = select(NotificationState.getPropertyGroups);
692
743
  // Selection selectors
693
744
  selectedEventName = select(NotificationState.getSelectedEventName);
@@ -695,6 +746,7 @@ class NotificationFacade {
695
746
  selectedEvent = select(NotificationState.getSelectedEvent);
696
747
  selectedTemplate = select(NotificationState.getSelectedTemplate);
697
748
  availableReceivers = select(NotificationState.getAvailableReceivers);
749
+ availableReceiverGroups = select(NotificationState.getAvailableReceiverGroups);
698
750
  // ============================================================================
699
751
  // Loading/Error Slices - Memoized by NGXS
700
752
  // ============================================================================
@@ -802,6 +854,7 @@ class NotificationTemplate {
802
854
  selectedEvent = this.facade.selectedEvent;
803
855
  selectedTemplate = this.facade.selectedTemplate;
804
856
  availableReceivers = this.facade.availableReceivers;
857
+ availableReceiverGroups = this.facade.availableReceiverGroups;
805
858
  // ============================================================================
806
859
  // Loading States from Facade
807
860
  // ============================================================================
@@ -1039,7 +1092,7 @@ class NotificationTemplate {
1039
1092
  return payload;
1040
1093
  }
1041
1094
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NotificationTemplate, deps: [], target: i0.ɵɵFactoryTarget.Component });
1042
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: NotificationTemplate, isStandalone: true, selector: "mt-notification-template", ngImport: i0, template: "<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\r\n <div class=\"w-1/2\">\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Tabs Skeleton -->\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex gap-2\">\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <p-skeleton width=\"8rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"events()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'eventName'\"\r\n [label]=\"'notification.events' | transloco\"\r\n [placeholder]=\"'notification.selectEvent' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n (onChange)=\"onEventChange($event)\"\r\n />\r\n </div>\r\n @if (events().length === 0) {\r\n <!-- Empty State -->\r\n <mt-card>\r\n <div\r\n class=\"flex flex-col items-center justify-center py-12 text-slate-500\"\r\n >\r\n <mt-icon icon=\"alert.alert-circle\" class=\"mb-2 h-12 w-12\" />\r\n <p>{{ \"notification.noEventsFound\" | transloco }}</p>\r\n </div>\r\n </mt-card>\r\n } @else if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\r\n <mt-tabs\r\n [active]=\"selectedTemplateId()\"\r\n [options]=\"templateTabs()\"\r\n (activeChange)=\"onTemplateTabChange($event)\"\r\n />\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'notification.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\r\n <!-- Template Content -->\r\n @if (selectedTemplate(); as template) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Name -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-text-field\r\n formControlName=\"name\"\r\n [label]=\"'notification.name' | transloco\"\r\n [placeholder]=\"'notification.enterName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n <!-- Channel & Properties Picker Row -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n formControlName=\"channel\"\r\n [options]=\"channelOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [label]=\"'notification.channel.label' | transloco\"\r\n [placeholder]=\"'notification.selectChannel' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n [disabled]=\"true\"\r\n />\r\n <mt-select-field\r\n [options]=\"propertyGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'properties'\"\r\n [label]=\"'notification.propertiesList' | transloco\"\r\n [placeholder]=\"'notification.selectProperty' | transloco\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingProperties()\"\r\n [formControl]=\"propertyPickerControl\"\r\n (onChange)=\"onAddProperty($event)\"\r\n />\r\n </div>\r\n <!-- Channel Content Editors -->\r\n @for (ch of channelConfigs; track ch.key) {\r\n @if (form.controls[\"channel\"].value === ch.key) {\r\n <!-- Bilingual Content Fields -->\r\n @if (isBilingual(ch) && ch.translatableKey) {\r\n <ng-container [formGroupName]=\"ch.translatableKey\">\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n dir=\"ltr\"\r\n />\r\n <mt-editor-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n dir=\"rtl\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"ltr\"\r\n />\r\n <mt-textarea-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"rtl\"\r\n />\r\n }\r\n </ng-container>\r\n } @else if (ch.templateKey) {\r\n <!-- Non-Bilingual Content Field -->\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n [rows]=\"'6'\"\r\n />\r\n }\r\n }\r\n <!-- Bilingual Toggle -->\r\n @if (ch.bilingualOptional) {\r\n <mt-toggle-field\r\n [formControlName]=\"ch.key + 'Bilingual'\"\r\n [label]=\"'notification.bilingual' | transloco\"\r\n />\r\n }\r\n }\r\n }\r\n <!-- Receivers -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n [loading]=\"isReceiverDeleting(receiver.id)\"\r\n (onClick)=\"onDeleteReceiver(receiver)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <!-- Actions -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n @if (!template.isSystem) {\r\n <mt-button\r\n [label]=\"'notification.delete' | transloco\"\r\n severity=\"danger\"\r\n [loading]=\"isDeletingTemplate()\"\r\n [disabled]=\"isUpdatingTemplate()\"\r\n (onClick)=\"onDeleteTemplate()\"\r\n />\r\n }\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [loading]=\"isUpdatingTemplate()\"\r\n [disabled]=\"isDeletingTemplate() || isFormInvalid()\"\r\n (onClick)=\"onSaveTemplate()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: SelectField, selector: "mt-select-field", inputs: ["field", "label", "placeholder", "hasPlaceholderPrefix", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "clearAfterSelect", "required", "group", "size", "optionGroupLabel", "optionGroupChildren", "loading"], outputs: ["onChange"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: TextareaField, selector: "mt-textarea-field", inputs: ["field", "label", "placeholder", "class", "readonly", "noErrorStyle", "pInputs", "rows", "required"] }, { kind: "component", type: EditorField, selector: "mt-editor-field", inputs: ["label", "placeholder", "readonly", "theme", "height", "dir", "modules", "required"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1095
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: NotificationTemplate, isStandalone: true, selector: "mt-notification-template", ngImport: i0, template: "<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\r\n <div class=\"w-1/2\">\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Tabs Skeleton -->\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex gap-2\">\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <p-skeleton width=\"8rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"events()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'eventName'\"\r\n [label]=\"'notification.events' | transloco\"\r\n [placeholder]=\"'notification.selectEvent' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n (onChange)=\"onEventChange($event)\"\r\n />\r\n </div>\r\n @if (events().length === 0) {\r\n <!-- Empty State -->\r\n <mt-card>\r\n <div\r\n class=\"flex flex-col items-center justify-center py-12 text-slate-500\"\r\n >\r\n <mt-icon icon=\"alert.alert-circle\" class=\"mb-2 h-12 w-12\" />\r\n <p>{{ \"notification.noEventsFound\" | transloco }}</p>\r\n </div>\r\n </mt-card>\r\n } @else if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\r\n <mt-tabs\r\n [active]=\"selectedTemplateId()\"\r\n [options]=\"templateTabs()\"\r\n (activeChange)=\"onTemplateTabChange($event)\"\r\n />\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'notification.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\r\n <!-- Template Content -->\r\n @if (selectedTemplate(); as template) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Name -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-text-field\r\n formControlName=\"name\"\r\n [label]=\"'notification.name' | transloco\"\r\n [placeholder]=\"'notification.enterName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n <!-- Channel & Properties Picker Row -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n formControlName=\"channel\"\r\n [options]=\"channelOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [label]=\"'notification.channel.label' | transloco\"\r\n [placeholder]=\"'notification.selectChannel' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n [disabled]=\"true\"\r\n />\r\n <mt-select-field\r\n [options]=\"propertyGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'properties'\"\r\n [label]=\"'notification.propertiesList' | transloco\"\r\n [placeholder]=\"'notification.selectProperty' | transloco\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingProperties()\"\r\n [formControl]=\"propertyPickerControl\"\r\n (onChange)=\"onAddProperty($event)\"\r\n />\r\n </div>\r\n <!-- Channel Content Editors -->\r\n @for (ch of channelConfigs; track ch.key) {\r\n @if (form.controls[\"channel\"].value === ch.key) {\r\n <!-- Bilingual Content Fields -->\r\n @if (isBilingual(ch) && ch.translatableKey) {\r\n <ng-container [formGroupName]=\"ch.translatableKey\">\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n dir=\"ltr\"\r\n />\r\n <mt-editor-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n dir=\"rtl\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"ltr\"\r\n />\r\n <mt-textarea-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"rtl\"\r\n />\r\n }\r\n </ng-container>\r\n } @else if (ch.templateKey) {\r\n <!-- Non-Bilingual Content Field -->\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n [rows]=\"'6'\"\r\n />\r\n }\r\n }\r\n <!-- Bilingual Toggle -->\r\n @if (ch.bilingualOptional) {\r\n <mt-toggle-field\r\n [formControlName]=\"ch.key + 'Bilingual'\"\r\n [label]=\"'notification.bilingual' | transloco\"\r\n />\r\n }\r\n }\r\n }\r\n <!-- Receivers -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceiverGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'items'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n [loading]=\"isReceiverDeleting(receiver.id)\"\r\n (onClick)=\"onDeleteReceiver(receiver)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <!-- Actions -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n @if (!template.isSystem) {\r\n <mt-button\r\n [label]=\"'notification.delete' | transloco\"\r\n severity=\"danger\"\r\n [loading]=\"isDeletingTemplate()\"\r\n [disabled]=\"isUpdatingTemplate()\"\r\n (onClick)=\"onDeleteTemplate()\"\r\n />\r\n }\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [loading]=\"isUpdatingTemplate()\"\r\n [disabled]=\"isDeletingTemplate() || isFormInvalid()\"\r\n (onClick)=\"onSaveTemplate()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: SelectField, selector: "mt-select-field", inputs: ["field", "label", "placeholder", "hasPlaceholderPrefix", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "clearAfterSelect", "required", "group", "size", "optionGroupLabel", "optionGroupChildren", "loading", "optionIcon", "optionIconColor", "optionIconShape", "optionAvatarShape", "optionGroupIcon", "optionGroupIconColor", "optionGroupIconShape", "optionGroupAvatarShape"], outputs: ["onChange"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: TextareaField, selector: "mt-textarea-field", inputs: ["field", "label", "placeholder", "class", "readonly", "noErrorStyle", "pInputs", "rows", "required"] }, { kind: "component", type: EditorField, selector: "mt-editor-field", inputs: ["label", "placeholder", "readonly", "theme", "height", "dir", "modules", "required"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1043
1096
  }
1044
1097
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NotificationTemplate, decorators: [{
1045
1098
  type: Component,
@@ -1058,7 +1111,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
1058
1111
  Icon,
1059
1112
  Skeleton,
1060
1113
  Avatar,
1061
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\r\n <div class=\"w-1/2\">\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Tabs Skeleton -->\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex gap-2\">\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <p-skeleton width=\"8rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"events()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'eventName'\"\r\n [label]=\"'notification.events' | transloco\"\r\n [placeholder]=\"'notification.selectEvent' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n (onChange)=\"onEventChange($event)\"\r\n />\r\n </div>\r\n @if (events().length === 0) {\r\n <!-- Empty State -->\r\n <mt-card>\r\n <div\r\n class=\"flex flex-col items-center justify-center py-12 text-slate-500\"\r\n >\r\n <mt-icon icon=\"alert.alert-circle\" class=\"mb-2 h-12 w-12\" />\r\n <p>{{ \"notification.noEventsFound\" | transloco }}</p>\r\n </div>\r\n </mt-card>\r\n } @else if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\r\n <mt-tabs\r\n [active]=\"selectedTemplateId()\"\r\n [options]=\"templateTabs()\"\r\n (activeChange)=\"onTemplateTabChange($event)\"\r\n />\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'notification.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\r\n <!-- Template Content -->\r\n @if (selectedTemplate(); as template) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Name -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-text-field\r\n formControlName=\"name\"\r\n [label]=\"'notification.name' | transloco\"\r\n [placeholder]=\"'notification.enterName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n <!-- Channel & Properties Picker Row -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n formControlName=\"channel\"\r\n [options]=\"channelOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [label]=\"'notification.channel.label' | transloco\"\r\n [placeholder]=\"'notification.selectChannel' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n [disabled]=\"true\"\r\n />\r\n <mt-select-field\r\n [options]=\"propertyGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'properties'\"\r\n [label]=\"'notification.propertiesList' | transloco\"\r\n [placeholder]=\"'notification.selectProperty' | transloco\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingProperties()\"\r\n [formControl]=\"propertyPickerControl\"\r\n (onChange)=\"onAddProperty($event)\"\r\n />\r\n </div>\r\n <!-- Channel Content Editors -->\r\n @for (ch of channelConfigs; track ch.key) {\r\n @if (form.controls[\"channel\"].value === ch.key) {\r\n <!-- Bilingual Content Fields -->\r\n @if (isBilingual(ch) && ch.translatableKey) {\r\n <ng-container [formGroupName]=\"ch.translatableKey\">\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n dir=\"ltr\"\r\n />\r\n <mt-editor-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n dir=\"rtl\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"ltr\"\r\n />\r\n <mt-textarea-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"rtl\"\r\n />\r\n }\r\n </ng-container>\r\n } @else if (ch.templateKey) {\r\n <!-- Non-Bilingual Content Field -->\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n [rows]=\"'6'\"\r\n />\r\n }\r\n }\r\n <!-- Bilingual Toggle -->\r\n @if (ch.bilingualOptional) {\r\n <mt-toggle-field\r\n [formControlName]=\"ch.key + 'Bilingual'\"\r\n [label]=\"'notification.bilingual' | transloco\"\r\n />\r\n }\r\n }\r\n }\r\n <!-- Receivers -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n [loading]=\"isReceiverDeleting(receiver.id)\"\r\n (onClick)=\"onDeleteReceiver(receiver)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <!-- Actions -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n @if (!template.isSystem) {\r\n <mt-button\r\n [label]=\"'notification.delete' | transloco\"\r\n severity=\"danger\"\r\n [loading]=\"isDeletingTemplate()\"\r\n [disabled]=\"isUpdatingTemplate()\"\r\n (onClick)=\"onDeleteTemplate()\"\r\n />\r\n }\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [loading]=\"isUpdatingTemplate()\"\r\n [disabled]=\"isDeletingTemplate() || isFormInvalid()\"\r\n (onClick)=\"onSaveTemplate()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
1114
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\r\n <div class=\"w-1/2\">\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Tabs Skeleton -->\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex gap-2\">\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <p-skeleton width=\"8rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"events()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'eventName'\"\r\n [label]=\"'notification.events' | transloco\"\r\n [placeholder]=\"'notification.selectEvent' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n (onChange)=\"onEventChange($event)\"\r\n />\r\n </div>\r\n @if (events().length === 0) {\r\n <!-- Empty State -->\r\n <mt-card>\r\n <div\r\n class=\"flex flex-col items-center justify-center py-12 text-slate-500\"\r\n >\r\n <mt-icon icon=\"alert.alert-circle\" class=\"mb-2 h-12 w-12\" />\r\n <p>{{ \"notification.noEventsFound\" | transloco }}</p>\r\n </div>\r\n </mt-card>\r\n } @else if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\r\n <mt-tabs\r\n [active]=\"selectedTemplateId()\"\r\n [options]=\"templateTabs()\"\r\n (activeChange)=\"onTemplateTabChange($event)\"\r\n />\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'notification.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\r\n <!-- Template Content -->\r\n @if (selectedTemplate(); as template) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Name -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-text-field\r\n formControlName=\"name\"\r\n [label]=\"'notification.name' | transloco\"\r\n [placeholder]=\"'notification.enterName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n <!-- Channel & Properties Picker Row -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n formControlName=\"channel\"\r\n [options]=\"channelOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [label]=\"'notification.channel.label' | transloco\"\r\n [placeholder]=\"'notification.selectChannel' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n [disabled]=\"true\"\r\n />\r\n <mt-select-field\r\n [options]=\"propertyGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'properties'\"\r\n [label]=\"'notification.propertiesList' | transloco\"\r\n [placeholder]=\"'notification.selectProperty' | transloco\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingProperties()\"\r\n [formControl]=\"propertyPickerControl\"\r\n (onChange)=\"onAddProperty($event)\"\r\n />\r\n </div>\r\n <!-- Channel Content Editors -->\r\n @for (ch of channelConfigs; track ch.key) {\r\n @if (form.controls[\"channel\"].value === ch.key) {\r\n <!-- Bilingual Content Fields -->\r\n @if (isBilingual(ch) && ch.translatableKey) {\r\n <ng-container [formGroupName]=\"ch.translatableKey\">\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n dir=\"ltr\"\r\n />\r\n <mt-editor-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n dir=\"rtl\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"ltr\"\r\n />\r\n <mt-textarea-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"rtl\"\r\n />\r\n }\r\n </ng-container>\r\n } @else if (ch.templateKey) {\r\n <!-- Non-Bilingual Content Field -->\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n [rows]=\"'6'\"\r\n />\r\n }\r\n }\r\n <!-- Bilingual Toggle -->\r\n @if (ch.bilingualOptional) {\r\n <mt-toggle-field\r\n [formControlName]=\"ch.key + 'Bilingual'\"\r\n [label]=\"'notification.bilingual' | transloco\"\r\n />\r\n }\r\n }\r\n }\r\n <!-- Receivers -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceiverGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'items'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n [loading]=\"isReceiverDeleting(receiver.id)\"\r\n (onClick)=\"onDeleteReceiver(receiver)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <!-- Actions -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n @if (!template.isSystem) {\r\n <mt-button\r\n [label]=\"'notification.delete' | transloco\"\r\n severity=\"danger\"\r\n [loading]=\"isDeletingTemplate()\"\r\n [disabled]=\"isUpdatingTemplate()\"\r\n (onClick)=\"onDeleteTemplate()\"\r\n />\r\n }\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [loading]=\"isUpdatingTemplate()\"\r\n [disabled]=\"isDeletingTemplate() || isFormInvalid()\"\r\n (onClick)=\"onSaveTemplate()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
1062
1115
  }], ctorParameters: () => [] });
1063
1116
 
1064
1117
  const APP_STATES = [NotificationState];
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-notification.mjs","sources":["../../../../packages/masterteam/notification/src/lib/add-template-dialog/add-template-dialog.ts","../../../../packages/masterteam/notification/src/lib/add-template-dialog/add-template-dialog.html","../../../../packages/masterteam/notification/src/store/notification/notification.model.ts","../../../../packages/masterteam/notification/src/store/notification/notification.actions.ts","../../../../packages/masterteam/notification/src/store/notification/notification.state.ts","../../../../packages/masterteam/notification/src/store/notification/notification.facade.ts","../../../../packages/masterteam/notification/src/lib/notification-template/notification-template.ts","../../../../packages/masterteam/notification/src/lib/notification-template/notification-template.html","../../../../packages/masterteam/notification/src/store/app.state.ts","../../../../packages/masterteam/notification/src/masterteam-notification.ts"],"sourcesContent":["import { Component, inject, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Button } from '@masterteam/components/button';\r\n\r\n@Component({\r\n selector: 'mt-add-template-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n TranslocoModule,\r\n TextField,\r\n Button,\r\n ],\r\n templateUrl: './add-template-dialog.html',\r\n})\r\nexport class AddTemplateDialog {\r\n readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n\r\n data = input<any>(null);\r\n\r\n templateNameControl = new FormControl<string>('', [Validators.required]);\r\n\r\n onSave(): void {\r\n if (this.templateNameControl.valid) {\r\n this.ref.close({ name: this.templateNameControl.value?.trim() });\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close();\r\n }\r\n}\r\n","<div [class]=\"modalService.contentClass\" class=\"p-4\">\r\n <mt-text-field\r\n [formControl]=\"templateNameControl\"\r\n [label]=\"'notification.templateName' | transloco\"\r\n [placeholder]=\"'notification.enterTemplateName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'notification.cancel' | transloco\"\r\n severity=\"secondary\"\r\n (onClick)=\"onCancel()\"\r\n />\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [disabled]=\"!templateNameControl.valid\"\r\n (onClick)=\"onSave()\"\r\n />\r\n</div>\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\n\r\n// ============================================================================\r\n// Action Keys Enum\r\n// ============================================================================\r\nexport enum NotificationActionKey {\r\n GetEvents = 'getEvents',\r\n GetReceivers = 'getReceivers',\r\n GetProperties = 'getProperties',\r\n AddReceivers = 'addReceivers',\r\n DeleteReceiver = 'deleteReceiver',\r\n AddTemplate = 'addTemplate',\r\n UpdateTemplate = 'updateTemplate',\r\n DeleteTemplate = 'deleteTemplate',\r\n}\r\n\r\n// ============================================================================\r\n// Channel Types\r\n// ============================================================================\r\nexport type NotificationChannel = 'email' | 'sms' | 'app';\r\n\r\nexport interface ChannelConfig {\r\n key: NotificationChannel;\r\n labelKey: string;\r\n /** Whether this channel supports bilingual content */\r\n supportsBilingual: boolean;\r\n /** Whether bilingual is optional (true = show toggle) */\r\n bilingualOptional: boolean;\r\n /** Whether this channel uses rich text editor (false = textarea) */\r\n useRichEditor: boolean;\r\n /** Payload key for non-bilingual template (string value) */\r\n templateKey?: string;\r\n /** Payload key for bilingual template (object with en/ar) */\r\n translatableKey?: string;\r\n}\r\n\r\nexport const CHANNEL_CONFIGS: ChannelConfig[] = [\r\n {\r\n key: 'email',\r\n labelKey: 'notification.channel.email',\r\n supportsBilingual: true,\r\n bilingualOptional: true,\r\n useRichEditor: true,\r\n templateKey: 'emailTemplate',\r\n translatableKey: 'emailContentTranslatable',\r\n },\r\n {\r\n key: 'sms',\r\n labelKey: 'notification.channel.sms',\r\n supportsBilingual: false,\r\n bilingualOptional: false,\r\n useRichEditor: false,\r\n templateKey: 'SmsTemplate',\r\n },\r\n {\r\n key: 'app',\r\n labelKey: 'notification.channel.app',\r\n supportsBilingual: true,\r\n bilingualOptional: false,\r\n useRichEditor: true,\r\n translatableKey: 'appTemplate',\r\n },\r\n];\r\n\r\n/** Helper to get channel config by key */\r\nexport function getChannelConfig(key: NotificationChannel): ChannelConfig {\r\n return CHANNEL_CONFIGS.find((c) => c.key === key) ?? CHANNEL_CONFIGS[0];\r\n}\r\n\r\n/** Build form control name for a channel field */\r\nexport function getFormControlName(\r\n ch: ChannelConfig,\r\n type: 'single' | 'en' | 'ar',\r\n): string | null {\r\n if (type === 'single') return ch.templateKey ?? null;\r\n if (!ch.translatableKey) return null;\r\n return type === 'en'\r\n ? `${ch.translatableKey}.en`\r\n : `${ch.translatableKey}.ar`;\r\n}\r\n\r\n// ============================================================================\r\n// Translatable Content\r\n// ============================================================================\r\nexport interface TranslatableContent {\r\n en: string;\r\n ar: string;\r\n}\r\n\r\n// ============================================================================\r\n// Receiver Types\r\n// ============================================================================\r\nexport interface ReceiverItem {\r\n id: string | number;\r\n identifier: string;\r\n name: string;\r\n type: string;\r\n isSystem?: boolean;\r\n}\r\n\r\nexport interface ReceiverGroup {\r\n groupName: string;\r\n items: ReceiverItem[] | ReceiverSubGroup[];\r\n}\r\n\r\nexport interface ReceiverSubGroup {\r\n subGroupName: string;\r\n items: ReceiverItem[];\r\n}\r\n\r\n// ============================================================================\r\n// Property Types\r\n// ============================================================================\r\nexport interface NotificationProperty {\r\n key: string;\r\n name: string;\r\n groupName?: string;\r\n}\r\n\r\nexport interface PropertyGroup {\r\n groupName: string;\r\n properties: NotificationProperty[];\r\n}\r\n\r\n// ============================================================================\r\n// Template Types\r\n// ============================================================================\r\nexport interface NotificationTemplateItem {\r\n id: string | number;\r\n eventId: string | number; // Link to parent event\r\n name: string;\r\n isSystem: boolean;\r\n channel: NotificationChannel;\r\n receivers: ReceiverItem[];\r\n emailTemplate: string;\r\n emailContentTranslatable: TranslatableContent;\r\n smsTemplate: string;\r\n appTemplate: TranslatableContent;\r\n}\r\n\r\n// ============================================================================\r\n// Event Types\r\n// ============================================================================\r\nexport interface NotificationEvent {\r\n id: string | number;\r\n eventName: string;\r\n name: string;\r\n}\r\n\r\n// ============================================================================\r\n// Action Types (Workflow)\r\n// ============================================================================\r\nexport interface NotificationAction {\r\n id: string | number;\r\n name: string;\r\n type: string;\r\n}\r\n\r\nexport interface ActionGroup {\r\n activity: string;\r\n items: NotificationAction[];\r\n}\r\n\r\n// ============================================================================\r\n// Payloads\r\n// ============================================================================\r\nexport interface ReceiverPayloadItem {\r\n id: string | number;\r\n type: string;\r\n}\r\n\r\nexport interface AddReceiversPayload {\r\n receivers: ReceiverPayloadItem[];\r\n}\r\n\r\nexport interface AddTemplatePayload {\r\n name: string;\r\n channel: NotificationChannel;\r\n}\r\n\r\nexport interface UpdateTemplatePayload {\r\n name: string;\r\n [key: string]: string | TranslatableContent | undefined;\r\n}\r\n\r\n// ============================================================================\r\n// State Model\r\n// ============================================================================\r\nexport interface NotificationStateModel extends LoadingStateShape<NotificationActionKey> {\r\n // Module configuration\r\n moduleType: string | null;\r\n moduleId: string | number | null;\r\n parentModuleType: string | null;\r\n parentModuleId: string | number | null;\r\n parentPath: string;\r\n\r\n // Action mode (for workflow)\r\n isActionMode: boolean;\r\n selectedActionId: string | number | null;\r\n\r\n // Data collections\r\n events: NotificationEvent[];\r\n templates: NotificationTemplateItem[]; // Flattened templates\r\n actions: NotificationAction[];\r\n receivers: ReceiverItem[];\r\n propertyGroups: PropertyGroup[];\r\n\r\n // Selection state\r\n selectedEventName: string | null;\r\n selectedTemplateId: string | number | null;\r\n}\r\n","import type {\r\n AddReceiversPayload,\r\n AddTemplatePayload,\r\n UpdateTemplatePayload,\r\n} from './notification.model';\r\n\r\n// ============================================================================\r\n// Module Configuration\r\n// ============================================================================\r\nexport class SetModuleInfo {\r\n static readonly type = '[Notification] Set Module Info';\r\n constructor(\r\n public moduleType: string,\r\n public moduleId: string | number,\r\n public parentModuleType?: string,\r\n public parentModuleId?: string | number,\r\n public parentPath?: string,\r\n ) {}\r\n}\r\n\r\n// ============================================================================\r\n// Data Loading Actions\r\n// ============================================================================\r\nexport class GetEvents {\r\n static readonly type = '[Notification] Get Events';\r\n}\r\n\r\nexport class GetReceivers {\r\n static readonly type = '[Notification] Get Receivers';\r\n}\r\n\r\nexport class GetProperties {\r\n static readonly type = '[Notification] Get Properties';\r\n constructor(public isMultiLang?: boolean) {}\r\n}\r\n\r\n// ============================================================================\r\n// Action Mode (Workflow)\r\n// ============================================================================\r\nexport class SetActionMode {\r\n static readonly type = '[Notification] Set Action Mode';\r\n constructor(public actionId: string | number | null) {}\r\n}\r\n\r\nexport class GetActionReceivers {\r\n static readonly type = '[Notification] Get Action Receivers';\r\n constructor(public actionId: string | number) {}\r\n}\r\n\r\nexport class GetActionProperties {\r\n static readonly type = '[Notification] Get Action Properties';\r\n constructor(\r\n public actionId: string | number,\r\n public isMultiLang?: boolean,\r\n ) {}\r\n}\r\n\r\n// ============================================================================\r\n// Selection Actions\r\n// ============================================================================\r\nexport class SelectEvent {\r\n static readonly type = '[Notification] Select Event';\r\n constructor(public eventName: string) {}\r\n}\r\n\r\nexport class SelectTemplate {\r\n static readonly type = '[Notification] Select Template';\r\n constructor(public templateId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Receiver CRUD\r\n// ============================================================================\r\nexport class AddReceivers {\r\n static readonly type = '[Notification] Add Receivers';\r\n constructor(\r\n public templateId: string | number,\r\n public payload: AddReceiversPayload,\r\n ) {}\r\n}\r\n\r\nexport class DeleteReceiver {\r\n static readonly type = '[Notification] Delete Receiver';\r\n constructor(public receiverId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Template CRUD\r\n// ============================================================================\r\nexport class AddTemplate {\r\n static readonly type = '[Notification] Add Template';\r\n constructor(\r\n public eventId: string | number,\r\n public payload: AddTemplatePayload,\r\n ) {}\r\n}\r\n\r\nexport class UpdateTemplate {\r\n static readonly type = '[Notification] Update Template';\r\n constructor(\r\n public templateId: string | number,\r\n public payload: UpdateTemplatePayload,\r\n ) {}\r\n}\r\n\r\nexport class DeleteTemplate {\r\n static readonly type = '[Notification] Delete Template';\r\n constructor(public templateId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Reset State\r\n// ============================================================================\r\nexport class ResetNotificationState {\r\n static readonly type = '[Notification] Reset State';\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport {\r\n CrudStateBase,\r\n handleApiRequest,\r\n Response,\r\n} from '@masterteam/components';\r\n\r\nimport {\r\n NotificationActionKey,\r\n NotificationStateModel,\r\n NotificationEvent,\r\n NotificationTemplateItem,\r\n ReceiverItem,\r\n ReceiverGroup,\r\n ReceiverSubGroup,\r\n PropertyGroup,\r\n} from './notification.model';\r\nimport {\r\n AddReceivers,\r\n AddTemplate,\r\n DeleteReceiver,\r\n DeleteTemplate,\r\n GetActionProperties,\r\n GetActionReceivers,\r\n GetEvents,\r\n GetProperties,\r\n GetReceivers,\r\n ResetNotificationState,\r\n SelectEvent,\r\n SelectTemplate,\r\n SetActionMode,\r\n SetModuleInfo,\r\n UpdateTemplate,\r\n} from './notification.actions';\r\n\r\n// Default State\r\n\r\nconst DEFAULT_STATE: NotificationStateModel = {\r\n // Module configuration\r\n moduleType: null,\r\n moduleId: null,\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n\r\n // Action mode\r\n isActionMode: false,\r\n selectedActionId: null,\r\n\r\n // Data collections\r\n events: [],\r\n templates: [], // Flattened templates\r\n actions: [],\r\n receivers: [],\r\n propertyGroups: [],\r\n\r\n // Selection state\r\n selectedEventName: null,\r\n selectedTemplateId: null,\r\n\r\n // Loading state (from LoadingStateShape)\r\n loadingActive: [],\r\n errors: {},\r\n};\r\n\r\n// State Definition\r\n\r\n@State<NotificationStateModel>({\r\n name: 'notification',\r\n defaults: DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class NotificationState extends CrudStateBase<\r\n NotificationTemplateItem,\r\n NotificationStateModel,\r\n NotificationActionKey\r\n> {\r\n private readonly http = inject(HttpClient);\r\n private readonly baseUrl = 'notifications';\r\n\r\n // Selectors - Individual selectors for fine-grained reactivity\r\n @Selector()\r\n static getState(state: NotificationStateModel): NotificationStateModel {\r\n return state;\r\n }\r\n\r\n @Selector()\r\n static getEvents(state: NotificationStateModel): NotificationEvent[] {\r\n return state.events;\r\n }\r\n\r\n @Selector()\r\n static getTemplates(\r\n state: NotificationStateModel,\r\n ): NotificationTemplateItem[] {\r\n return state.templates;\r\n }\r\n\r\n @Selector()\r\n static getReceivers(state: NotificationStateModel): ReceiverItem[] {\r\n return state.receivers;\r\n }\r\n\r\n @Selector()\r\n static getPropertyGroups(state: NotificationStateModel): PropertyGroup[] {\r\n return state.propertyGroups;\r\n }\r\n\r\n @Selector()\r\n static getSelectedEventName(state: NotificationStateModel): string | null {\r\n return state.selectedEventName;\r\n }\r\n\r\n @Selector()\r\n static getSelectedTemplateId(\r\n state: NotificationStateModel,\r\n ): string | number | null {\r\n return state.selectedTemplateId;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: NotificationStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: NotificationStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // Derived selectors\r\n @Selector([\r\n NotificationState.getEvents,\r\n NotificationState.getSelectedEventName,\r\n ])\r\n static getSelectedEvent(\r\n events: NotificationEvent[],\r\n selectedEventName: string | null,\r\n ): NotificationEvent | null {\r\n return events.find((e) => e.eventName === selectedEventName) ?? null;\r\n }\r\n\r\n @Selector([\r\n NotificationState.getTemplates,\r\n NotificationState.getSelectedEvent,\r\n ])\r\n static getEventTemplates(\r\n templates: NotificationTemplateItem[],\r\n selectedEvent: NotificationEvent | null,\r\n ): NotificationTemplateItem[] {\r\n if (!selectedEvent) return [];\r\n return templates.filter((t) => t.eventId === selectedEvent.id);\r\n }\r\n\r\n @Selector([\r\n NotificationState.getTemplates,\r\n NotificationState.getSelectedTemplateId,\r\n ])\r\n static getSelectedTemplate(\r\n templates: NotificationTemplateItem[],\r\n selectedTemplateId: string | number | null,\r\n ): NotificationTemplateItem | null {\r\n return templates.find((t) => t.id === selectedTemplateId) ?? null;\r\n }\r\n\r\n @Selector([\r\n NotificationState.getReceivers,\r\n NotificationState.getSelectedTemplate,\r\n ])\r\n static getAvailableReceivers(\r\n receivers: ReceiverItem[],\r\n selectedTemplate: NotificationTemplateItem | null,\r\n ): ReceiverItem[] {\r\n if (!selectedTemplate) return receivers;\r\n const templateReceivers = selectedTemplate.receivers ?? [];\r\n const assignedIds = new Set(templateReceivers.map((r) => r.identifier));\r\n return receivers.filter((r) => !assignedIds.has(String(r.id)));\r\n }\r\n\r\n // Helper Methods\r\n\r\n /** API returns events with nested templates - we flatten for state */\r\n private flattenEventsResponse(\r\n eventsWithTemplates: Array<\r\n NotificationEvent & { templates: NotificationTemplateItem[] }\r\n >,\r\n ): { events: NotificationEvent[]; templates: NotificationTemplateItem[] } {\r\n const events: NotificationEvent[] = [];\r\n const templates: NotificationTemplateItem[] = [];\r\n\r\n for (const event of eventsWithTemplates) {\r\n const { templates: eventTemplates, ...eventData } = event;\r\n events.push(eventData);\r\n templates.push(\r\n ...eventTemplates.map((t) => ({ ...t, eventId: event.id })),\r\n );\r\n }\r\n\r\n return { events, templates };\r\n }\r\n\r\n private flattenReceivers(groups: ReceiverGroup[]): ReceiverItem[] {\r\n const result: ReceiverItem[] = [];\r\n for (const group of groups) {\r\n for (const item of group.items) {\r\n if ('subGroupName' in item) {\r\n // Handle subgroups (role-based receivers)\r\n const subGroup = item as ReceiverSubGroup;\r\n result.push(\r\n ...subGroup.items.map((r) => ({\r\n ...r,\r\n name: `${subGroup.subGroupName} - ${r.name}`,\r\n })),\r\n );\r\n } else {\r\n result.push(item as ReceiverItem);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // Module Configuration\r\n\r\n @Action(SetModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SetModuleInfo,\r\n ) {\r\n let parentPath = '';\r\n if (action.parentModuleType && action.parentModuleId) {\r\n parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;\r\n } else if (action.parentPath) {\r\n parentPath = action.parentPath;\r\n }\r\n\r\n ctx.patchState({\r\n moduleType: action.moduleType,\r\n moduleId: action.moduleId,\r\n parentModuleType: action.parentModuleType ?? null,\r\n parentModuleId: action.parentModuleId ?? null,\r\n parentPath,\r\n isActionMode: action.moduleType === 'workflow',\r\n });\r\n }\r\n\r\n @Action(ResetNotificationState)\r\n resetState(ctx: StateContext<NotificationStateModel>) {\r\n ctx.setState(DEFAULT_STATE);\r\n }\r\n\r\n // Data Loading Actions (Normal Mode)\r\n\r\n @Action(GetEvents)\r\n getEvents(ctx: StateContext<NotificationStateModel>) {\r\n const { moduleType, moduleId, parentPath } = ctx.getState();\r\n // API returns events with nested templates\r\n type EventWithTemplates = NotificationEvent & {\r\n templates: NotificationTemplateItem[];\r\n };\r\n const req$ = this.http.get<Response<EventWithTemplates[]>>(\r\n `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/events`,\r\n );\r\n\r\n return this.load(ctx, {\r\n key: NotificationActionKey.GetEvents,\r\n request$: req$,\r\n updateState: (_state, data) => {\r\n const { events, templates } = this.flattenEventsResponse(data ?? []);\r\n const firstTemplate = templates[0];\r\n const firstEvent = events.find((e) => e.id === firstTemplate?.eventId);\r\n return {\r\n events,\r\n templates,\r\n selectedEventName: firstEvent?.eventName ?? null,\r\n selectedTemplateId: firstTemplate?.id ?? null,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(GetReceivers)\r\n getReceivers(ctx: StateContext<NotificationStateModel>) {\r\n const { parentPath, moduleType, moduleId } = ctx.getState();\r\n const req$ = this.http.get<Response<ReceiverGroup[]>>(\r\n `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/receivers`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetReceivers,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n receivers: this.flattenReceivers(response.data ?? []),\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetProperties)\r\n getProperties(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetProperties,\r\n ) {\r\n const { moduleType, moduleId, parentPath } = ctx.getState();\r\n const url = action.isMultiLang\r\n ? `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties?IsMultiLanguageEnabled=true`\r\n : `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties`;\r\n\r\n const req$ = this.http.get<Response<PropertyGroup[]>>(url);\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n propertyGroups: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n // Action Mode (Workflow)\r\n\r\n @Action(SetActionMode)\r\n setActionMode(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SetActionMode,\r\n ) {\r\n ctx.patchState({\r\n selectedActionId: action.actionId,\r\n });\r\n }\r\n\r\n @Action(GetActionReceivers)\r\n getActionReceivers(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetActionReceivers,\r\n ) {\r\n const req$ = this.http.get<Response<ReceiverGroup[]>>(\r\n `${this.baseUrl}/action/${action.actionId}/receivers`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetReceivers,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n receivers: this.flattenReceivers(response.data ?? []),\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetActionProperties)\r\n getActionProperties(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetActionProperties,\r\n ) {\r\n const url = action.isMultiLang\r\n ? `${this.baseUrl}/action/${action.actionId}/properties?IsMultiLanguageEnabled=true`\r\n : `${this.baseUrl}/action/${action.actionId}/properties`;\r\n\r\n const req$ = this.http.get<Response<PropertyGroup[]>>(url);\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n propertyGroups: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n // Selection Actions\r\n\r\n @Action(SelectEvent)\r\n selectEvent(ctx: StateContext<NotificationStateModel>, action: SelectEvent) {\r\n const state = ctx.getState();\r\n const event = state.events.find((e) => e.eventName === action.eventName);\r\n const eventTemplates = state.templates.filter(\r\n (t) => t.eventId === event?.id,\r\n );\r\n ctx.patchState({\r\n selectedEventName: action.eventName,\r\n selectedTemplateId: eventTemplates[0]?.id ?? null,\r\n });\r\n }\r\n\r\n @Action(SelectTemplate)\r\n selectTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SelectTemplate,\r\n ) {\r\n ctx.patchState({ selectedTemplateId: action.templateId });\r\n }\r\n\r\n // Receiver CRUD\r\n @Action(AddReceivers)\r\n addReceivers(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: AddReceivers,\r\n ) {\r\n const req$ = this.http.post<Response<ReceiverItem[]>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n action.payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.AddReceivers,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const newReceivers = response.data ?? [];\r\n const templates = this.adapter.updateOne(\r\n state.templates,\r\n action.templateId,\r\n {\r\n receivers: [\r\n ...(state.templates.find((t) => t.id === action.templateId)\r\n ?.receivers ?? []),\r\n ...newReceivers,\r\n ],\r\n },\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteReceiver)\r\n deleteReceiver(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: DeleteReceiver,\r\n ) {\r\n const state = ctx.getState();\r\n const template = this.getSelectedTemplate(state);\r\n\r\n if (!template) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.delete<Response<void>>(\r\n `${this.baseUrl}/receivers/${action.receiverId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.DeleteReceiver,\r\n request$: req$,\r\n onSuccess: (_, currentState) => {\r\n const templates = this.adapter.updateOne(\r\n currentState.templates,\r\n template.id,\r\n {\r\n receivers: template.receivers.filter(\r\n (r) => r.id !== action.receiverId,\r\n ),\r\n },\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n // Template CRUD\r\n @Action(AddTemplate)\r\n addTemplate(ctx: StateContext<NotificationStateModel>, action: AddTemplate) {\r\n const req$ = this.http.post<Response<NotificationTemplateItem>>(\r\n `${this.baseUrl}/events/${action.eventId}`,\r\n action.payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.AddTemplate,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const newTemplate = response.data;\r\n if (!newTemplate) return {};\r\n\r\n return {\r\n templates: this.adapter.addOne(state.templates, {\r\n ...newTemplate,\r\n eventId: action.eventId,\r\n }),\r\n selectedTemplateId: newTemplate.id,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(UpdateTemplate)\r\n updateTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: UpdateTemplate,\r\n ) {\r\n const req$ = this.http.put<Response<NotificationTemplateItem>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n action.payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.UpdateTemplate,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const updatedTemplate = response.data;\r\n if (!updatedTemplate) return {};\r\n\r\n // Preserve existing fields that API may not return or shouldn't change\r\n const existingTemplate = state.templates.find(\r\n (t) => t.id === action.templateId,\r\n );\r\n\r\n if (!existingTemplate) return {};\r\n\r\n // Only update name and content fields, preserve channel/eventId/receivers\r\n const templates = this.adapter.upsertOne(\r\n state.templates,\r\n {\r\n ...existingTemplate,\r\n name: updatedTemplate.name,\r\n emailTemplate: updatedTemplate.emailTemplate,\r\n emailContentTranslatable: updatedTemplate.emailContentTranslatable,\r\n smsTemplate: updatedTemplate.smsTemplate,\r\n appTemplate: updatedTemplate.appTemplate,\r\n },\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteTemplate)\r\n deleteTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: DeleteTemplate,\r\n ) {\r\n const req$ = this.http.delete<Response<void>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.DeleteTemplate,\r\n request$: req$,\r\n onSuccess: (_, state) => {\r\n const templates = this.adapter.removeOne(\r\n state.templates,\r\n action.templateId,\r\n 'id',\r\n );\r\n\r\n // Select first template of current event after deletion\r\n const currentEvent = state.events.find(\r\n (e) => e.eventName === state.selectedEventName,\r\n );\r\n const eventTemplates = templates.filter(\r\n (t) => t.eventId === currentEvent?.id,\r\n );\r\n const systemTemplate = eventTemplates.find((t) => t.isSystem);\r\n\r\n return {\r\n templates,\r\n selectedTemplateId:\r\n systemTemplate?.id ?? eventTemplates[0]?.id ?? null,\r\n };\r\n },\r\n });\r\n }\r\n\r\n // Private Helpers\r\n private getSelectedTemplate(\r\n state: NotificationStateModel,\r\n ): NotificationTemplateItem | null {\r\n return (\r\n state.templates.find((t) => t.id === state.selectedTemplateId) ?? null\r\n );\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\n\r\nimport {\r\n NotificationActionKey,\r\n AddReceiversPayload,\r\n AddTemplatePayload,\r\n UpdateTemplatePayload,\r\n} from './notification.model';\r\nimport {\r\n AddReceivers,\r\n AddTemplate,\r\n DeleteReceiver,\r\n DeleteTemplate,\r\n GetActionProperties,\r\n GetActionReceivers,\r\n GetEvents,\r\n GetProperties,\r\n GetReceivers,\r\n ResetNotificationState,\r\n SelectEvent,\r\n SelectTemplate,\r\n SetActionMode,\r\n SetModuleInfo,\r\n UpdateTemplate,\r\n} from './notification.actions';\r\nimport { NotificationState } from './notification.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NotificationFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly events = select(NotificationState.getEvents);\r\n readonly templates = select(NotificationState.getEventTemplates);\r\n readonly receivers = select(NotificationState.getReceivers);\r\n readonly propertyGroups = select(NotificationState.getPropertyGroups);\r\n\r\n // Selection selectors\r\n readonly selectedEventName = select(NotificationState.getSelectedEventName);\r\n readonly selectedTemplateId = select(NotificationState.getSelectedTemplateId);\r\n readonly selectedEvent = select(NotificationState.getSelectedEvent);\r\n readonly selectedTemplate = select(NotificationState.getSelectedTemplate);\r\n readonly availableReceivers = select(NotificationState.getAvailableReceivers);\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(NotificationState.getLoadingActive);\r\n private readonly errors = select(NotificationState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingEvents = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetEvents),\r\n );\r\n readonly isLoadingReceivers = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetReceivers),\r\n );\r\n readonly isLoadingProperties = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetProperties),\r\n );\r\n readonly isAddingReceivers = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.AddReceivers),\r\n );\r\n readonly isDeletingReceiver = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.DeleteReceiver),\r\n );\r\n readonly isAddingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.AddTemplate),\r\n );\r\n readonly isUpdatingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.UpdateTemplate),\r\n );\r\n readonly isDeletingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.DeleteTemplate),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly eventsError = computed(\r\n () => this.errors()[NotificationActionKey.GetEvents] ?? null,\r\n );\r\n readonly receiversError = computed(\r\n () => this.errors()[NotificationActionKey.GetReceivers] ?? null,\r\n );\r\n readonly propertiesError = computed(\r\n () => this.errors()[NotificationActionKey.GetProperties] ?? null,\r\n );\r\n\r\n // Action Dispatchers - Configuration\r\n setModuleInfo(\r\n moduleType: string,\r\n moduleId: string | number,\r\n parentModuleType?: string,\r\n parentModuleId?: string | number,\r\n parentPath?: string,\r\n ) {\r\n return this.store.dispatch(\r\n new SetModuleInfo(\r\n moduleType,\r\n moduleId,\r\n parentModuleType,\r\n parentModuleId,\r\n parentPath,\r\n ),\r\n );\r\n }\r\n\r\n resetState() {\r\n return this.store.dispatch(new ResetNotificationState());\r\n }\r\n\r\n // Action Dispatchers - Data Loading\r\n loadEvents() {\r\n return this.store.dispatch(new GetEvents());\r\n }\r\n\r\n loadReceivers() {\r\n return this.store.dispatch(new GetReceivers());\r\n }\r\n\r\n loadProperties(isMultiLang?: boolean) {\r\n return this.store.dispatch(new GetProperties(isMultiLang));\r\n }\r\n\r\n // Action Dispatchers - Action Mode (Workflow)\r\n setActionMode(actionId: string | number | null) {\r\n return this.store.dispatch(new SetActionMode(actionId));\r\n }\r\n\r\n loadActionReceivers(actionId: string | number) {\r\n return this.store.dispatch(new GetActionReceivers(actionId));\r\n }\r\n\r\n loadActionProperties(actionId: string | number, isMultiLang?: boolean) {\r\n return this.store.dispatch(new GetActionProperties(actionId, isMultiLang));\r\n }\r\n\r\n // Action Dispatchers - Selection\r\n selectEvent(eventName: string) {\r\n return this.store.dispatch(new SelectEvent(eventName));\r\n }\r\n\r\n selectTemplate(templateId: string | number) {\r\n return this.store.dispatch(new SelectTemplate(templateId));\r\n }\r\n\r\n // Action Dispatchers - Receiver CRUD\r\n addReceivers(templateId: string | number, payload: AddReceiversPayload) {\r\n return this.store.dispatch(new AddReceivers(templateId, payload));\r\n }\r\n\r\n deleteReceiver(receiverId: string | number) {\r\n return this.store.dispatch(new DeleteReceiver(receiverId));\r\n }\r\n\r\n // Action Dispatchers - Template CRUD\r\n\r\n addTemplate(eventId: string | number, payload: AddTemplatePayload) {\r\n return this.store.dispatch(new AddTemplate(eventId, payload));\r\n }\r\n\r\n updateTemplate(templateId: string | number, payload: UpdateTemplatePayload) {\r\n return this.store.dispatch(new UpdateTemplate(templateId, payload));\r\n }\r\n\r\n deleteTemplate(templateId: string | number) {\r\n return this.store.dispatch(new DeleteTemplate(templateId));\r\n }\r\n\r\n /**\r\n * Load all data for normal mode (non-workflow)\r\n */\r\n loadAllData(isMultiLang = true) {\r\n this.loadEvents();\r\n this.loadReceivers();\r\n this.loadProperties(isMultiLang);\r\n }\r\n}\r\n","import { Avatar } from '@masterteam/components/avatar';\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n effect,\r\n untracked,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\r\n\r\n// Components\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { EditorField } from '@masterteam/components/editor-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Skeleton } from 'primeng/skeleton';\r\n\r\n// Dialog\r\nimport { AddTemplateDialog } from '../add-template-dialog/add-template-dialog';\r\n\r\n// Store\r\nimport {\r\n NotificationFacade,\r\n NotificationChannel,\r\n NotificationTemplateItem,\r\n ReceiverItem,\r\n UpdateTemplatePayload,\r\n CHANNEL_CONFIGS,\r\n ChannelConfig,\r\n getChannelConfig,\r\n} from '../../store/notification';\r\n\r\n@Component({\r\n selector: 'mt-notification-template',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n TranslocoModule,\r\n Card,\r\n Button,\r\n SelectField,\r\n TextField,\r\n TextareaField,\r\n EditorField,\r\n ToggleField,\r\n Tabs,\r\n Icon,\r\n Skeleton,\r\n Avatar,\r\n ],\r\n templateUrl: './notification-template.html',\r\n styleUrl: './notification-template.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NotificationTemplate {\r\n private readonly facade = inject(NotificationFacade);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly modalService = inject(ModalService);\r\n\r\n // ============================================================================\r\n // Data Signals from Facade\r\n // ============================================================================\r\n readonly events = this.facade.events;\r\n readonly templates = this.facade.templates;\r\n readonly receivers = this.facade.receivers;\r\n readonly propertyGroups = this.facade.propertyGroups;\r\n\r\n // Selection Signals\r\n readonly selectedEventName = this.facade.selectedEventName;\r\n readonly selectedTemplateId = this.facade.selectedTemplateId;\r\n readonly selectedEvent = this.facade.selectedEvent;\r\n readonly selectedTemplate = this.facade.selectedTemplate;\r\n readonly availableReceivers = this.facade.availableReceivers;\r\n\r\n // ============================================================================\r\n // Loading States from Facade\r\n // ============================================================================\r\n readonly isLoadingEvents = this.facade.isLoadingEvents;\r\n readonly isLoadingReceivers = this.facade.isLoadingReceivers;\r\n readonly isLoadingProperties = this.facade.isLoadingProperties;\r\n readonly isUpdatingTemplate = this.facade.isUpdatingTemplate;\r\n readonly isDeletingTemplate = this.facade.isDeletingTemplate;\r\n readonly isAddingTemplate = this.facade.isAddingTemplate;\r\n\r\n // ============================================================================\r\n // Error States from Facade\r\n // ============================================================================\r\n readonly eventsError = this.facade.eventsError;\r\n readonly propertiesError = this.facade.propertiesError;\r\n\r\n // ============================================================================\r\n // Local State\r\n // ============================================================================\r\n readonly deletingReceiverIds = signal<(string | number)[]>([]);\r\n\r\n // ============================================================================\r\n // Form - Dynamic controls based on CHANNEL_CONFIGS\r\n // ============================================================================\r\n readonly form = this.buildForm();\r\n readonly propertyPickerControl = new FormControl<string | null>(null);\r\n private buildForm(): FormGroup {\r\n const fc = (v = '') => new FormControl<string>(v, { nonNullable: true });\r\n const controls: Record<string, FormControl | FormGroup> = {\r\n event: new FormControl<string | null>(null),\r\n name: fc(),\r\n channel: new FormControl<NotificationChannel>('email', {\r\n nonNullable: true,\r\n }),\r\n };\r\n\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey) controls[ch.templateKey] = fc();\r\n if (ch.translatableKey) {\r\n // Nested FormGroup to match payload structure { en: '', ar: '' }\r\n controls[ch.translatableKey] = new FormGroup({\r\n en: fc(),\r\n ar: fc(),\r\n });\r\n }\r\n if (ch.bilingualOptional) {\r\n controls[`${ch.key}Bilingual`] = new FormControl<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n }\r\n }\r\n return new FormGroup(controls);\r\n }\r\n\r\n // ============================================================================\r\n // Computed\r\n // ============================================================================\r\n readonly channelConfigs = CHANNEL_CONFIGS;\r\n\r\n /** Check if channel should show bilingual fields - reads from form */\r\n isBilingual(ch: ChannelConfig): boolean {\r\n if (!ch.supportsBilingual) return false;\r\n if (!ch.bilingualOptional) return true; // forced bilingual (app)\r\n return this.form.controls[`${ch.key}Bilingual`]?.value ?? false;\r\n }\r\n\r\n readonly channelOptions = computed(() =>\r\n CHANNEL_CONFIGS.map((c) => ({\r\n ...c,\r\n name: this.transloco.translate(c.labelKey),\r\n })),\r\n );\r\n\r\n readonly templateTabs = computed(() =>\r\n this.templates().map((t) => ({\r\n label: t.name,\r\n value: t.id,\r\n isSystem: t.isSystem,\r\n })),\r\n );\r\n\r\n readonly isFormInvalid = computed(\r\n () => !this.form.controls['name'].value?.trim(),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const eventName = this.selectedEventName();\r\n if (eventName && this.form.controls['event'].value !== eventName) {\r\n this.form.controls['event'].setValue(eventName, { emitEvent: false });\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.selectedTemplateId(); // depend on selected template id\r\n const template = untracked(this.selectedTemplate);\r\n if (template) this.patchForm(template);\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Event Handlers\r\n // ============================================================================\r\n onEventChange(eventName: string): void {\r\n if (eventName) this.facade.selectEvent(eventName);\r\n }\r\n\r\n onTemplateTabChange(templateId: string): void {\r\n this.facade.selectTemplate(templateId);\r\n }\r\n\r\n // Channel is fixed per template - set on creation only\r\n\r\n onAddProperty(propertyKey: string): void {\r\n if (!propertyKey) return;\r\n\r\n const tag = `{{${propertyKey}}}`;\r\n const ch = getChannelConfig(this.form.controls['channel'].value);\r\n\r\n if (this.isBilingual(ch) && ch.translatableKey) {\r\n const group = this.form.get(ch.translatableKey) as FormGroup;\r\n if (group) {\r\n const enCtrl = group.get('en') as FormControl<string>;\r\n const arCtrl = group.get('ar') as FormControl<string>;\r\n enCtrl?.setValue(`${enCtrl.value ?? ''} ${tag}`);\r\n arCtrl?.setValue(`${arCtrl.value ?? ''} ${tag}`);\r\n }\r\n } else if (ch.templateKey) {\r\n this.appendToControl(ch.templateKey, tag);\r\n }\r\n\r\n setTimeout(() => {\r\n this.propertyPickerControl.reset();\r\n }, 0);\r\n }\r\n\r\n onAddReceiver(receiverId: string | number): void {\r\n const template = this.selectedTemplate();\r\n if (!receiverId || !template) return;\r\n const selectedReceiver = this.availableReceivers().find(\r\n (r) => r.id === receiverId,\r\n );\r\n if (!selectedReceiver) return;\r\n this.facade.addReceivers(template.id, { receivers: [selectedReceiver] });\r\n }\r\n\r\n onDeleteReceiver(receiver: ReceiverItem): void {\r\n this.confirmationService.confirmDelete({\r\n type: 'dialog',\r\n accept: () => {\r\n this.deletingReceiverIds.update((ids) => [...ids, receiver.id]);\r\n this.facade.deleteReceiver(receiver.id).subscribe({\r\n complete: () => {\r\n this.deletingReceiverIds.update((ids) =>\r\n ids.filter((id) => id !== receiver.id),\r\n );\r\n },\r\n error: () => {\r\n this.deletingReceiverIds.update((ids) =>\r\n ids.filter((id) => id !== receiver.id),\r\n );\r\n },\r\n });\r\n },\r\n });\r\n }\r\n\r\n isReceiverDeleting(receiverId: string | number): boolean {\r\n return this.deletingReceiverIds().includes(receiverId);\r\n }\r\n\r\n onSaveTemplate(): void {\r\n const template = this.selectedTemplate();\r\n if (!template || this.isFormInvalid()) {\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n // Build payload dynamically from all channel controls\r\n const payload = this.buildUpdatePayload(template);\r\n this.facade.updateTemplate(template.id, payload);\r\n }\r\n\r\n onDeleteTemplate(): void {\r\n const template = this.selectedTemplate();\r\n if (!template || template.isSystem) return;\r\n\r\n this.confirmationService.confirm({\r\n type: 'dialog',\r\n message: this.transloco.translate('notification.deleteTemplateMessage'),\r\n icon: 'general.trash-01',\r\n acceptButton: { severity: 'danger' },\r\n accept: () => this.facade.deleteTemplate(template.id),\r\n });\r\n }\r\n\r\n onAddTemplateClick(): void {\r\n const event = this.selectedEvent();\r\n if (!event) return;\r\n\r\n const ref = this.modalService.openModal(AddTemplateDialog, 'dialog', {\r\n header: this.transloco.translate('notification.addTemplate'),\r\n styleClass: '!w-[25rem]',\r\n });\r\n\r\n ref.onClose.subscribe((result: { name: string } | undefined) => {\r\n if (result?.name) {\r\n this.facade.addTemplate(event.id, {\r\n name: result.name,\r\n channel: this.form.controls['channel'].value,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Private Methods\r\n // ============================================================================\r\n private appendToControl(key: string, value: string): void {\r\n const ctrl = this.form.controls[key] as FormControl<string>;\r\n ctrl?.setValue(`${ctrl.value ?? ''} ${value}`);\r\n }\r\n\r\n private patchForm(template: NotificationTemplateItem): void {\r\n const channel = template.channel || 'email';\r\n\r\n this.form.patchValue({\r\n name: template.name,\r\n channel: channel,\r\n // Set email bilingual based on whether translatable content exists\r\n emailBilingual: !!template.emailContentTranslatable?.en,\r\n });\r\n\r\n // Patch all channel controls dynamically\r\n const t = template as unknown as Record<string, unknown>;\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey) {\r\n this.form\r\n .get(ch.templateKey)\r\n ?.setValue((t[ch.templateKey] as string) ?? '');\r\n }\r\n if (ch.translatableKey) {\r\n const trans =\r\n (t[ch.translatableKey] as { en?: string; ar?: string }) ?? {};\r\n this.form.get(ch.translatableKey)?.patchValue({\r\n en: trans.en ?? '',\r\n ar: trans.ar ?? '',\r\n });\r\n }\r\n }\r\n }\r\n\r\n private buildUpdatePayload(\r\n template: NotificationTemplateItem,\r\n ): UpdateTemplatePayload {\r\n const v = this.form.getRawValue();\r\n return {\r\n name: v['name'] || template.name,\r\n ...this.extractChannelPayload(v),\r\n };\r\n }\r\n\r\n private extractChannelPayload(\r\n formValue: Record<string, unknown>,\r\n ): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey && formValue[ch.templateKey] !== undefined) {\r\n payload[ch.templateKey] = formValue[ch.templateKey] || '';\r\n }\r\n if (ch.translatableKey && formValue[ch.translatableKey] !== undefined) {\r\n payload[ch.translatableKey] = formValue[ch.translatableKey];\r\n }\r\n }\r\n\r\n return payload;\r\n }\r\n}\r\n\r\nexport default NotificationTemplate;\r\n","<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\r\n <div class=\"w-1/2\">\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Tabs Skeleton -->\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex gap-2\">\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <p-skeleton width=\"8rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"events()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'eventName'\"\r\n [label]=\"'notification.events' | transloco\"\r\n [placeholder]=\"'notification.selectEvent' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n (onChange)=\"onEventChange($event)\"\r\n />\r\n </div>\r\n @if (events().length === 0) {\r\n <!-- Empty State -->\r\n <mt-card>\r\n <div\r\n class=\"flex flex-col items-center justify-center py-12 text-slate-500\"\r\n >\r\n <mt-icon icon=\"alert.alert-circle\" class=\"mb-2 h-12 w-12\" />\r\n <p>{{ \"notification.noEventsFound\" | transloco }}</p>\r\n </div>\r\n </mt-card>\r\n } @else if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\r\n <mt-tabs\r\n [active]=\"selectedTemplateId()\"\r\n [options]=\"templateTabs()\"\r\n (activeChange)=\"onTemplateTabChange($event)\"\r\n />\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'notification.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\r\n <!-- Template Content -->\r\n @if (selectedTemplate(); as template) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Name -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-text-field\r\n formControlName=\"name\"\r\n [label]=\"'notification.name' | transloco\"\r\n [placeholder]=\"'notification.enterName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n <!-- Channel & Properties Picker Row -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n formControlName=\"channel\"\r\n [options]=\"channelOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [label]=\"'notification.channel.label' | transloco\"\r\n [placeholder]=\"'notification.selectChannel' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n [disabled]=\"true\"\r\n />\r\n <mt-select-field\r\n [options]=\"propertyGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'properties'\"\r\n [label]=\"'notification.propertiesList' | transloco\"\r\n [placeholder]=\"'notification.selectProperty' | transloco\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingProperties()\"\r\n [formControl]=\"propertyPickerControl\"\r\n (onChange)=\"onAddProperty($event)\"\r\n />\r\n </div>\r\n <!-- Channel Content Editors -->\r\n @for (ch of channelConfigs; track ch.key) {\r\n @if (form.controls[\"channel\"].value === ch.key) {\r\n <!-- Bilingual Content Fields -->\r\n @if (isBilingual(ch) && ch.translatableKey) {\r\n <ng-container [formGroupName]=\"ch.translatableKey\">\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n dir=\"ltr\"\r\n />\r\n <mt-editor-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n dir=\"rtl\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"ltr\"\r\n />\r\n <mt-textarea-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"rtl\"\r\n />\r\n }\r\n </ng-container>\r\n } @else if (ch.templateKey) {\r\n <!-- Non-Bilingual Content Field -->\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n [rows]=\"'6'\"\r\n />\r\n }\r\n }\r\n <!-- Bilingual Toggle -->\r\n @if (ch.bilingualOptional) {\r\n <mt-toggle-field\r\n [formControlName]=\"ch.key + 'Bilingual'\"\r\n [label]=\"'notification.bilingual' | transloco\"\r\n />\r\n }\r\n }\r\n }\r\n <!-- Receivers -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n [loading]=\"isReceiverDeleting(receiver.id)\"\r\n (onClick)=\"onDeleteReceiver(receiver)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <!-- Actions -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n @if (!template.isSystem) {\r\n <mt-button\r\n [label]=\"'notification.delete' | transloco\"\r\n severity=\"danger\"\r\n [loading]=\"isDeletingTemplate()\"\r\n [disabled]=\"isUpdatingTemplate()\"\r\n (onClick)=\"onDeleteTemplate()\"\r\n />\r\n }\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [loading]=\"isUpdatingTemplate()\"\r\n [disabled]=\"isDeletingTemplate() || isFormInvalid()\"\r\n (onClick)=\"onSaveTemplate()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { NotificationState } from './notification/notification.state';\r\n\r\nexport const APP_STATES = [NotificationState];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-notification.mjs","sources":["../../../../packages/masterteam/notification/src/lib/add-template-dialog/add-template-dialog.ts","../../../../packages/masterteam/notification/src/lib/add-template-dialog/add-template-dialog.html","../../../../packages/masterteam/notification/src/store/notification/notification.model.ts","../../../../packages/masterteam/notification/src/store/notification/notification.actions.ts","../../../../packages/masterteam/notification/src/store/notification/notification.state.ts","../../../../packages/masterteam/notification/src/store/notification/notification.facade.ts","../../../../packages/masterteam/notification/src/lib/notification-template/notification-template.ts","../../../../packages/masterteam/notification/src/lib/notification-template/notification-template.html","../../../../packages/masterteam/notification/src/store/app.state.ts","../../../../packages/masterteam/notification/src/masterteam-notification.ts"],"sourcesContent":["import { Component, inject, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Button } from '@masterteam/components/button';\r\n\r\n@Component({\r\n selector: 'mt-add-template-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n TranslocoModule,\r\n TextField,\r\n Button,\r\n ],\r\n templateUrl: './add-template-dialog.html',\r\n})\r\nexport class AddTemplateDialog {\r\n readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n\r\n data = input<any>(null);\r\n\r\n templateNameControl = new FormControl<string>('', [Validators.required]);\r\n\r\n onSave(): void {\r\n if (this.templateNameControl.valid) {\r\n this.ref.close({ name: this.templateNameControl.value?.trim() });\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close();\r\n }\r\n}\r\n","<div [class]=\"modalService.contentClass\" class=\"p-4\">\r\n <mt-text-field\r\n [formControl]=\"templateNameControl\"\r\n [label]=\"'notification.templateName' | transloco\"\r\n [placeholder]=\"'notification.enterTemplateName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'notification.cancel' | transloco\"\r\n severity=\"secondary\"\r\n (onClick)=\"onCancel()\"\r\n />\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [disabled]=\"!templateNameControl.valid\"\r\n (onClick)=\"onSave()\"\r\n />\r\n</div>\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\n\r\n// ============================================================================\r\n// Action Keys Enum\r\n// ============================================================================\r\nexport enum NotificationActionKey {\r\n GetEvents = 'getEvents',\r\n GetReceivers = 'getReceivers',\r\n GetProperties = 'getProperties',\r\n AddReceivers = 'addReceivers',\r\n DeleteReceiver = 'deleteReceiver',\r\n AddTemplate = 'addTemplate',\r\n UpdateTemplate = 'updateTemplate',\r\n DeleteTemplate = 'deleteTemplate',\r\n}\r\n\r\n// ============================================================================\r\n// Channel Types\r\n// ============================================================================\r\nexport type NotificationChannel = 'email' | 'sms' | 'app';\r\n\r\nexport interface ChannelConfig {\r\n key: NotificationChannel;\r\n labelKey: string;\r\n /** Whether this channel supports bilingual content */\r\n supportsBilingual: boolean;\r\n /** Whether bilingual is optional (true = show toggle) */\r\n bilingualOptional: boolean;\r\n /** Whether this channel uses rich text editor (false = textarea) */\r\n useRichEditor: boolean;\r\n /** Payload key for non-bilingual template (string value) */\r\n templateKey?: string;\r\n /** Payload key for bilingual template (object with en/ar) */\r\n translatableKey?: string;\r\n}\r\n\r\nexport const CHANNEL_CONFIGS: ChannelConfig[] = [\r\n {\r\n key: 'email',\r\n labelKey: 'notification.channel.email',\r\n supportsBilingual: false,\r\n bilingualOptional: false,\r\n useRichEditor: true,\r\n templateKey: 'emailTemplate',\r\n translatableKey: 'emailContentTranslatable',\r\n },\r\n {\r\n key: 'sms',\r\n labelKey: 'notification.channel.sms',\r\n supportsBilingual: false,\r\n bilingualOptional: false,\r\n useRichEditor: false,\r\n templateKey: 'SmsTemplate',\r\n },\r\n {\r\n key: 'app',\r\n labelKey: 'notification.channel.app',\r\n supportsBilingual: true,\r\n bilingualOptional: false,\r\n useRichEditor: true,\r\n translatableKey: 'appTemplate',\r\n },\r\n];\r\n\r\n/** Helper to get channel config by key */\r\nexport function getChannelConfig(key: NotificationChannel): ChannelConfig {\r\n return CHANNEL_CONFIGS.find((c) => c.key === key) ?? CHANNEL_CONFIGS[0];\r\n}\r\n\r\n/** Build form control name for a channel field */\r\nexport function getFormControlName(\r\n ch: ChannelConfig,\r\n type: 'single' | 'en' | 'ar',\r\n): string | null {\r\n if (type === 'single') return ch.templateKey ?? null;\r\n if (!ch.translatableKey) return null;\r\n return type === 'en'\r\n ? `${ch.translatableKey}.en`\r\n : `${ch.translatableKey}.ar`;\r\n}\r\n\r\n// ============================================================================\r\n// Translatable Content\r\n// ============================================================================\r\nexport interface TranslatableContent {\r\n en: string;\r\n ar: string;\r\n}\r\n\r\n// ============================================================================\r\n// Receiver Types\r\n// ============================================================================\r\nexport interface ReceiverItem {\r\n id: string | number;\r\n identifier: string;\r\n name: string;\r\n type: string;\r\n isSystem?: boolean;\r\n}\r\n\r\nexport interface ReceiverGroup {\r\n groupName: string;\r\n items: ReceiverItem[] | ReceiverSubGroup[];\r\n}\r\n\r\nexport interface ReceiverSubGroup {\r\n subGroupName: string;\r\n items: ReceiverItem[];\r\n}\r\n\r\nexport interface ReceiverOptionGroup {\r\n groupName: string;\r\n items: ReceiverItem[];\r\n}\r\n\r\n// ============================================================================\r\n// Property Types\r\n// ============================================================================\r\nexport interface NotificationProperty {\r\n key: string;\r\n name: string;\r\n groupName?: string;\r\n}\r\n\r\nexport interface PropertyGroup {\r\n groupName: string;\r\n properties: NotificationProperty[];\r\n}\r\n\r\n// ============================================================================\r\n// Template Types\r\n// ============================================================================\r\nexport interface NotificationTemplateItem {\r\n id: string | number;\r\n eventId: string | number; // Link to parent event\r\n name: string;\r\n isSystem: boolean;\r\n channel: NotificationChannel;\r\n receivers: ReceiverItem[];\r\n emailTemplate: string;\r\n emailContentTranslatable: TranslatableContent;\r\n smsTemplate: string;\r\n appTemplate: TranslatableContent;\r\n}\r\n\r\n// ============================================================================\r\n// Event Types\r\n// ============================================================================\r\nexport interface NotificationEvent {\r\n id: string | number;\r\n eventName: string;\r\n name: string;\r\n}\r\n\r\n// ============================================================================\r\n// Action Types (Workflow)\r\n// ============================================================================\r\nexport interface NotificationAction {\r\n id: string | number;\r\n name: string;\r\n type: string;\r\n}\r\n\r\nexport interface ActionGroup {\r\n activity: string;\r\n items: NotificationAction[];\r\n}\r\n\r\n// ============================================================================\r\n// Payloads\r\n// ============================================================================\r\nexport interface ReceiverPayloadItem {\r\n id: string | number;\r\n type: string;\r\n}\r\n\r\nexport interface AddReceiversPayload {\r\n receivers: ReceiverPayloadItem[];\r\n}\r\n\r\nexport interface AddTemplatePayload {\r\n name: string;\r\n channel: NotificationChannel;\r\n}\r\n\r\nexport interface UpdateTemplatePayload {\r\n name: string;\r\n [key: string]: string | TranslatableContent | undefined;\r\n}\r\n\r\n// ============================================================================\r\n// State Model\r\n// ============================================================================\r\nexport interface NotificationStateModel extends LoadingStateShape<NotificationActionKey> {\r\n // Module configuration\r\n moduleType: string | null;\r\n moduleId: string | number | null;\r\n parentModuleType: string | null;\r\n parentModuleId: string | number | null;\r\n parentPath: string;\r\n\r\n // Action mode (for workflow)\r\n isActionMode: boolean;\r\n selectedActionId: string | number | null;\r\n\r\n // Data collections\r\n events: NotificationEvent[];\r\n templates: NotificationTemplateItem[]; // Flattened templates\r\n actions: NotificationAction[];\r\n receivers: ReceiverItem[];\r\n receiverGroups: ReceiverOptionGroup[];\r\n propertyGroups: PropertyGroup[];\r\n\r\n // Selection state\r\n selectedEventName: string | null;\r\n selectedTemplateId: string | number | null;\r\n}\r\n","import type {\r\n AddReceiversPayload,\r\n AddTemplatePayload,\r\n UpdateTemplatePayload,\r\n} from './notification.model';\r\n\r\n// ============================================================================\r\n// Module Configuration\r\n// ============================================================================\r\nexport class SetModuleInfo {\r\n static readonly type = '[Notification] Set Module Info';\r\n constructor(\r\n public moduleType: string,\r\n public moduleId: string | number,\r\n public parentModuleType?: string,\r\n public parentModuleId?: string | number,\r\n public parentPath?: string,\r\n ) {}\r\n}\r\n\r\n// ============================================================================\r\n// Data Loading Actions\r\n// ============================================================================\r\nexport class GetEvents {\r\n static readonly type = '[Notification] Get Events';\r\n}\r\n\r\nexport class GetReceivers {\r\n static readonly type = '[Notification] Get Receivers';\r\n}\r\n\r\nexport class GetProperties {\r\n static readonly type = '[Notification] Get Properties';\r\n constructor(public isMultiLang?: boolean) {}\r\n}\r\n\r\n// ============================================================================\r\n// Action Mode (Workflow)\r\n// ============================================================================\r\nexport class SetActionMode {\r\n static readonly type = '[Notification] Set Action Mode';\r\n constructor(public actionId: string | number | null) {}\r\n}\r\n\r\nexport class GetActionReceivers {\r\n static readonly type = '[Notification] Get Action Receivers';\r\n constructor(public actionId: string | number) {}\r\n}\r\n\r\nexport class GetActionProperties {\r\n static readonly type = '[Notification] Get Action Properties';\r\n constructor(\r\n public actionId: string | number,\r\n public isMultiLang?: boolean,\r\n ) {}\r\n}\r\n\r\n// ============================================================================\r\n// Selection Actions\r\n// ============================================================================\r\nexport class SelectEvent {\r\n static readonly type = '[Notification] Select Event';\r\n constructor(public eventName: string) {}\r\n}\r\n\r\nexport class SelectTemplate {\r\n static readonly type = '[Notification] Select Template';\r\n constructor(public templateId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Receiver CRUD\r\n// ============================================================================\r\nexport class AddReceivers {\r\n static readonly type = '[Notification] Add Receivers';\r\n constructor(\r\n public templateId: string | number,\r\n public payload: AddReceiversPayload,\r\n ) {}\r\n}\r\n\r\nexport class DeleteReceiver {\r\n static readonly type = '[Notification] Delete Receiver';\r\n constructor(public receiverId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Template CRUD\r\n// ============================================================================\r\nexport class AddTemplate {\r\n static readonly type = '[Notification] Add Template';\r\n constructor(\r\n public eventId: string | number,\r\n public payload: AddTemplatePayload,\r\n ) {}\r\n}\r\n\r\nexport class UpdateTemplate {\r\n static readonly type = '[Notification] Update Template';\r\n constructor(\r\n public templateId: string | number,\r\n public payload: UpdateTemplatePayload,\r\n ) {}\r\n}\r\n\r\nexport class DeleteTemplate {\r\n static readonly type = '[Notification] Delete Template';\r\n constructor(public templateId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Reset State\r\n// ============================================================================\r\nexport class ResetNotificationState {\r\n static readonly type = '[Notification] Reset State';\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport {\r\n CrudStateBase,\r\n handleApiRequest,\r\n Response,\r\n} from '@masterteam/components';\r\n\r\nimport {\r\n NotificationActionKey,\r\n NotificationStateModel,\r\n NotificationEvent,\r\n NotificationTemplateItem,\r\n ReceiverItem,\r\n ReceiverGroup,\r\n ReceiverOptionGroup,\r\n ReceiverSubGroup,\r\n PropertyGroup,\r\n} from './notification.model';\r\nimport {\r\n AddReceivers,\r\n AddTemplate,\r\n DeleteReceiver,\r\n DeleteTemplate,\r\n GetActionProperties,\r\n GetActionReceivers,\r\n GetEvents,\r\n GetProperties,\r\n GetReceivers,\r\n ResetNotificationState,\r\n SelectEvent,\r\n SelectTemplate,\r\n SetActionMode,\r\n SetModuleInfo,\r\n UpdateTemplate,\r\n} from './notification.actions';\r\n\r\n// Default State\r\n\r\nconst DEFAULT_STATE: NotificationStateModel = {\r\n // Module configuration\r\n moduleType: null,\r\n moduleId: null,\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n\r\n // Action mode\r\n isActionMode: false,\r\n selectedActionId: null,\r\n\r\n // Data collections\r\n events: [],\r\n templates: [], // Flattened templates\r\n actions: [],\r\n receivers: [],\r\n receiverGroups: [],\r\n propertyGroups: [],\r\n\r\n // Selection state\r\n selectedEventName: null,\r\n selectedTemplateId: null,\r\n\r\n // Loading state (from LoadingStateShape)\r\n loadingActive: [],\r\n errors: {},\r\n};\r\n\r\n// State Definition\r\n\r\n@State<NotificationStateModel>({\r\n name: 'notification',\r\n defaults: DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class NotificationState extends CrudStateBase<\r\n NotificationTemplateItem,\r\n NotificationStateModel,\r\n NotificationActionKey\r\n> {\r\n private readonly http = inject(HttpClient);\r\n private readonly baseUrl = 'notifications';\r\n\r\n // Selectors - Individual selectors for fine-grained reactivity\r\n @Selector()\r\n static getState(state: NotificationStateModel): NotificationStateModel {\r\n return state;\r\n }\r\n\r\n @Selector()\r\n static getEvents(state: NotificationStateModel): NotificationEvent[] {\r\n return state.events;\r\n }\r\n\r\n @Selector()\r\n static getTemplates(\r\n state: NotificationStateModel,\r\n ): NotificationTemplateItem[] {\r\n return state.templates;\r\n }\r\n\r\n @Selector()\r\n static getReceivers(state: NotificationStateModel): ReceiverItem[] {\r\n return state.receivers;\r\n }\r\n\r\n @Selector()\r\n static getReceiverGroups(\r\n state: NotificationStateModel,\r\n ): ReceiverOptionGroup[] {\r\n return state.receiverGroups;\r\n }\r\n\r\n @Selector()\r\n static getPropertyGroups(state: NotificationStateModel): PropertyGroup[] {\r\n return state.propertyGroups;\r\n }\r\n\r\n @Selector()\r\n static getSelectedEventName(state: NotificationStateModel): string | null {\r\n return state.selectedEventName;\r\n }\r\n\r\n @Selector()\r\n static getSelectedTemplateId(\r\n state: NotificationStateModel,\r\n ): string | number | null {\r\n return state.selectedTemplateId;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: NotificationStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: NotificationStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // Derived selectors\r\n @Selector([\r\n NotificationState.getEvents,\r\n NotificationState.getSelectedEventName,\r\n ])\r\n static getSelectedEvent(\r\n events: NotificationEvent[],\r\n selectedEventName: string | null,\r\n ): NotificationEvent | null {\r\n return events.find((e) => e.eventName === selectedEventName) ?? null;\r\n }\r\n\r\n @Selector([\r\n NotificationState.getTemplates,\r\n NotificationState.getSelectedEvent,\r\n ])\r\n static getEventTemplates(\r\n templates: NotificationTemplateItem[],\r\n selectedEvent: NotificationEvent | null,\r\n ): NotificationTemplateItem[] {\r\n if (!selectedEvent) return [];\r\n return templates.filter((t) => t.eventId === selectedEvent.id);\r\n }\r\n\r\n @Selector([\r\n NotificationState.getTemplates,\r\n NotificationState.getSelectedTemplateId,\r\n ])\r\n static getSelectedTemplate(\r\n templates: NotificationTemplateItem[],\r\n selectedTemplateId: string | number | null,\r\n ): NotificationTemplateItem | null {\r\n return templates.find((t) => t.id === selectedTemplateId) ?? null;\r\n }\r\n\r\n @Selector([\r\n NotificationState.getReceivers,\r\n NotificationState.getSelectedTemplate,\r\n ])\r\n static getAvailableReceivers(\r\n receivers: ReceiverItem[],\r\n selectedTemplate: NotificationTemplateItem | null,\r\n ): ReceiverItem[] {\r\n if (!selectedTemplate) return receivers;\r\n const templateReceivers = selectedTemplate.receivers ?? [];\r\n const assignedIds = new Set(templateReceivers.map((r) => r.identifier));\r\n return receivers.filter((r) => !assignedIds.has(String(r.id)));\r\n }\r\n\r\n @Selector([\r\n NotificationState.getReceiverGroups,\r\n NotificationState.getSelectedTemplate,\r\n ])\r\n static getAvailableReceiverGroups(\r\n receiverGroups: ReceiverOptionGroup[],\r\n selectedTemplate: NotificationTemplateItem | null,\r\n ): ReceiverOptionGroup[] {\r\n if (!selectedTemplate) return receiverGroups;\r\n\r\n const assignedIds = new Set(\r\n (selectedTemplate.receivers ?? []).map((r) => r.identifier),\r\n );\r\n\r\n return receiverGroups\r\n .map((group) => ({\r\n ...group,\r\n items: group.items.filter((item) => !assignedIds.has(String(item.id))),\r\n }))\r\n .filter((group) => group.items.length > 0);\r\n }\r\n\r\n // Helper Methods\r\n\r\n /** API returns events with nested templates - we flatten for state */\r\n private flattenEventsResponse(\r\n eventsWithTemplates: Array<\r\n NotificationEvent & { templates: NotificationTemplateItem[] }\r\n >,\r\n ): { events: NotificationEvent[]; templates: NotificationTemplateItem[] } {\r\n const events: NotificationEvent[] = [];\r\n const templates: NotificationTemplateItem[] = [];\r\n\r\n for (const event of eventsWithTemplates) {\r\n const { templates: eventTemplates, ...eventData } = event;\r\n events.push(eventData);\r\n templates.push(\r\n ...eventTemplates.map((t) => ({ ...t, eventId: event.id })),\r\n );\r\n }\r\n\r\n return { events, templates };\r\n }\r\n\r\n private normalizeReceiverGroups(\r\n groups: ReceiverGroup[],\r\n ): ReceiverOptionGroup[] {\r\n return groups\r\n .map((group) => ({\r\n groupName: group.groupName,\r\n items: this.flattenReceiverItems(group.items),\r\n }))\r\n .filter((group) => group.items.length > 0);\r\n }\r\n\r\n private flattenReceiverItems(\r\n items: Array<ReceiverItem | ReceiverSubGroup> | null | undefined,\r\n parentLabel?: string,\r\n ): ReceiverItem[] {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n\r\n return items.flatMap((item) => {\r\n const subGroupItems = (item as ReceiverSubGroup).items;\r\n if (Array.isArray(subGroupItems)) {\r\n const subGroupName = (item as ReceiverSubGroup).subGroupName;\r\n const nextLabel = subGroupName\r\n ? parentLabel\r\n ? `${parentLabel} - ${subGroupName}`\r\n : subGroupName\r\n : parentLabel;\r\n\r\n return this.flattenReceiverItems(subGroupItems, nextLabel);\r\n }\r\n\r\n const receiver = item as ReceiverItem;\r\n if (receiver.id == null || !receiver.name) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n ...receiver,\r\n name: parentLabel\r\n ? `${parentLabel} - ${receiver.name}`\r\n : receiver.name,\r\n },\r\n ];\r\n });\r\n }\r\n\r\n // Module Configuration\r\n\r\n @Action(SetModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SetModuleInfo,\r\n ) {\r\n let parentPath = '';\r\n if (action.parentModuleType && action.parentModuleId) {\r\n parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;\r\n } else if (action.parentPath) {\r\n parentPath = action.parentPath;\r\n }\r\n\r\n ctx.patchState({\r\n moduleType: action.moduleType,\r\n moduleId: action.moduleId,\r\n parentModuleType: action.parentModuleType ?? null,\r\n parentModuleId: action.parentModuleId ?? null,\r\n parentPath,\r\n isActionMode: action.moduleType === 'workflow',\r\n });\r\n }\r\n\r\n @Action(ResetNotificationState)\r\n resetState(ctx: StateContext<NotificationStateModel>) {\r\n ctx.setState(DEFAULT_STATE);\r\n }\r\n\r\n // Data Loading Actions (Normal Mode)\r\n\r\n @Action(GetEvents)\r\n getEvents(ctx: StateContext<NotificationStateModel>) {\r\n const { moduleType, moduleId, parentPath } = ctx.getState();\r\n // API returns events with nested templates\r\n type EventWithTemplates = NotificationEvent & {\r\n templates: NotificationTemplateItem[];\r\n };\r\n const req$ = this.http.get<Response<EventWithTemplates[]>>(\r\n `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/events`,\r\n );\r\n\r\n return this.load(ctx, {\r\n key: NotificationActionKey.GetEvents,\r\n request$: req$,\r\n updateState: (_state, data) => {\r\n const { events, templates } = this.flattenEventsResponse(data ?? []);\r\n const firstTemplate = templates[0];\r\n const firstEvent = events.find((e) => e.id === firstTemplate?.eventId);\r\n return {\r\n events,\r\n templates,\r\n selectedEventName: firstEvent?.eventName ?? null,\r\n selectedTemplateId: firstTemplate?.id ?? null,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(GetReceivers)\r\n getReceivers(ctx: StateContext<NotificationStateModel>) {\r\n const { parentPath, moduleType, moduleId } = ctx.getState();\r\n const req$ = this.http.get<Response<ReceiverGroup[]>>(\r\n `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/receivers`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetReceivers,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const receiverGroups = this.normalizeReceiverGroups(\r\n response.data ?? [],\r\n );\r\n return {\r\n receiverGroups,\r\n receivers: receiverGroups.flatMap((group) => group.items),\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(GetProperties)\r\n getProperties(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetProperties,\r\n ) {\r\n const { moduleType, moduleId, parentPath } = ctx.getState();\r\n const url = action.isMultiLang\r\n ? `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties?IsMultiLanguageEnabled=true`\r\n : `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties`;\r\n\r\n const req$ = this.http.get<Response<PropertyGroup[]>>(url);\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n propertyGroups: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n // Action Mode (Workflow)\r\n\r\n @Action(SetActionMode)\r\n setActionMode(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SetActionMode,\r\n ) {\r\n ctx.patchState({\r\n selectedActionId: action.actionId,\r\n });\r\n }\r\n\r\n @Action(GetActionReceivers)\r\n getActionReceivers(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetActionReceivers,\r\n ) {\r\n const req$ = this.http.get<Response<ReceiverGroup[]>>(\r\n `${this.baseUrl}/action/${action.actionId}/receivers`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetReceivers,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const receiverGroups = this.normalizeReceiverGroups(\r\n response.data ?? [],\r\n );\r\n return {\r\n receiverGroups,\r\n receivers: receiverGroups.flatMap((group) => group.items),\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(GetActionProperties)\r\n getActionProperties(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetActionProperties,\r\n ) {\r\n const url = action.isMultiLang\r\n ? `${this.baseUrl}/action/${action.actionId}/properties?IsMultiLanguageEnabled=true`\r\n : `${this.baseUrl}/action/${action.actionId}/properties`;\r\n\r\n const req$ = this.http.get<Response<PropertyGroup[]>>(url);\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n propertyGroups: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n // Selection Actions\r\n\r\n @Action(SelectEvent)\r\n selectEvent(ctx: StateContext<NotificationStateModel>, action: SelectEvent) {\r\n const state = ctx.getState();\r\n const event = state.events.find((e) => e.eventName === action.eventName);\r\n const eventTemplates = state.templates.filter(\r\n (t) => t.eventId === event?.id,\r\n );\r\n ctx.patchState({\r\n selectedEventName: action.eventName,\r\n selectedTemplateId: eventTemplates[0]?.id ?? null,\r\n });\r\n }\r\n\r\n @Action(SelectTemplate)\r\n selectTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SelectTemplate,\r\n ) {\r\n ctx.patchState({ selectedTemplateId: action.templateId });\r\n }\r\n\r\n // Receiver CRUD\r\n @Action(AddReceivers)\r\n addReceivers(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: AddReceivers,\r\n ) {\r\n const req$ = this.http.post<Response<ReceiverItem[]>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n action.payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.AddReceivers,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const newReceivers = response.data ?? [];\r\n const templates = this.adapter.updateOne(\r\n state.templates,\r\n action.templateId,\r\n {\r\n receivers: [\r\n ...(state.templates.find((t) => t.id === action.templateId)\r\n ?.receivers ?? []),\r\n ...newReceivers,\r\n ],\r\n },\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteReceiver)\r\n deleteReceiver(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: DeleteReceiver,\r\n ) {\r\n const state = ctx.getState();\r\n const template = this.getSelectedTemplate(state);\r\n\r\n if (!template) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.delete<Response<void>>(\r\n `${this.baseUrl}/receivers/${action.receiverId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.DeleteReceiver,\r\n request$: req$,\r\n onSuccess: (_, currentState) => {\r\n const templates = this.adapter.updateOne(\r\n currentState.templates,\r\n template.id,\r\n {\r\n receivers: template.receivers.filter(\r\n (r) => r.id !== action.receiverId,\r\n ),\r\n },\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n // Template CRUD\r\n @Action(AddTemplate)\r\n addTemplate(ctx: StateContext<NotificationStateModel>, action: AddTemplate) {\r\n const req$ = this.http.post<Response<NotificationTemplateItem>>(\r\n `${this.baseUrl}/events/${action.eventId}`,\r\n action.payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.AddTemplate,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const newTemplate = response.data;\r\n if (!newTemplate) return {};\r\n\r\n return {\r\n templates: this.adapter.addOne(state.templates, {\r\n ...newTemplate,\r\n eventId: action.eventId,\r\n }),\r\n selectedTemplateId: newTemplate.id,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(UpdateTemplate)\r\n updateTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: UpdateTemplate,\r\n ) {\r\n const req$ = this.http.put<Response<NotificationTemplateItem>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n action.payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.UpdateTemplate,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const updatedTemplate = response.data;\r\n if (!updatedTemplate) return {};\r\n\r\n // Preserve existing fields that API may not return or shouldn't change\r\n const existingTemplate = state.templates.find(\r\n (t) => t.id === action.templateId,\r\n );\r\n\r\n if (!existingTemplate) return {};\r\n\r\n // Only update name and content fields, preserve channel/eventId/receivers\r\n const templates = this.adapter.upsertOne(\r\n state.templates,\r\n {\r\n ...existingTemplate,\r\n name: updatedTemplate.name,\r\n emailTemplate: updatedTemplate.emailTemplate,\r\n emailContentTranslatable: updatedTemplate.emailContentTranslatable,\r\n smsTemplate: updatedTemplate.smsTemplate,\r\n appTemplate: updatedTemplate.appTemplate,\r\n },\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteTemplate)\r\n deleteTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: DeleteTemplate,\r\n ) {\r\n const req$ = this.http.delete<Response<void>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.DeleteTemplate,\r\n request$: req$,\r\n onSuccess: (_, state) => {\r\n const templates = this.adapter.removeOne(\r\n state.templates,\r\n action.templateId,\r\n 'id',\r\n );\r\n\r\n // Select first template of current event after deletion\r\n const currentEvent = state.events.find(\r\n (e) => e.eventName === state.selectedEventName,\r\n );\r\n const eventTemplates = templates.filter(\r\n (t) => t.eventId === currentEvent?.id,\r\n );\r\n const systemTemplate = eventTemplates.find((t) => t.isSystem);\r\n\r\n return {\r\n templates,\r\n selectedTemplateId:\r\n systemTemplate?.id ?? eventTemplates[0]?.id ?? null,\r\n };\r\n },\r\n });\r\n }\r\n\r\n // Private Helpers\r\n private getSelectedTemplate(\r\n state: NotificationStateModel,\r\n ): NotificationTemplateItem | null {\r\n return (\r\n state.templates.find((t) => t.id === state.selectedTemplateId) ?? null\r\n );\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\n\r\nimport {\r\n NotificationActionKey,\r\n AddReceiversPayload,\r\n AddTemplatePayload,\r\n UpdateTemplatePayload,\r\n} from './notification.model';\r\nimport {\r\n AddReceivers,\r\n AddTemplate,\r\n DeleteReceiver,\r\n DeleteTemplate,\r\n GetActionProperties,\r\n GetActionReceivers,\r\n GetEvents,\r\n GetProperties,\r\n GetReceivers,\r\n ResetNotificationState,\r\n SelectEvent,\r\n SelectTemplate,\r\n SetActionMode,\r\n SetModuleInfo,\r\n UpdateTemplate,\r\n} from './notification.actions';\r\nimport { NotificationState } from './notification.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NotificationFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly events = select(NotificationState.getEvents);\r\n readonly templates = select(NotificationState.getEventTemplates);\r\n readonly receivers = select(NotificationState.getReceivers);\r\n readonly receiverGroups = select(NotificationState.getReceiverGroups);\r\n readonly propertyGroups = select(NotificationState.getPropertyGroups);\r\n\r\n // Selection selectors\r\n readonly selectedEventName = select(NotificationState.getSelectedEventName);\r\n readonly selectedTemplateId = select(NotificationState.getSelectedTemplateId);\r\n readonly selectedEvent = select(NotificationState.getSelectedEvent);\r\n readonly selectedTemplate = select(NotificationState.getSelectedTemplate);\r\n readonly availableReceivers = select(NotificationState.getAvailableReceivers);\r\n readonly availableReceiverGroups = select(\r\n NotificationState.getAvailableReceiverGroups,\r\n );\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(NotificationState.getLoadingActive);\r\n private readonly errors = select(NotificationState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingEvents = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetEvents),\r\n );\r\n readonly isLoadingReceivers = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetReceivers),\r\n );\r\n readonly isLoadingProperties = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetProperties),\r\n );\r\n readonly isAddingReceivers = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.AddReceivers),\r\n );\r\n readonly isDeletingReceiver = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.DeleteReceiver),\r\n );\r\n readonly isAddingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.AddTemplate),\r\n );\r\n readonly isUpdatingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.UpdateTemplate),\r\n );\r\n readonly isDeletingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.DeleteTemplate),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly eventsError = computed(\r\n () => this.errors()[NotificationActionKey.GetEvents] ?? null,\r\n );\r\n readonly receiversError = computed(\r\n () => this.errors()[NotificationActionKey.GetReceivers] ?? null,\r\n );\r\n readonly propertiesError = computed(\r\n () => this.errors()[NotificationActionKey.GetProperties] ?? null,\r\n );\r\n\r\n // Action Dispatchers - Configuration\r\n setModuleInfo(\r\n moduleType: string,\r\n moduleId: string | number,\r\n parentModuleType?: string,\r\n parentModuleId?: string | number,\r\n parentPath?: string,\r\n ) {\r\n return this.store.dispatch(\r\n new SetModuleInfo(\r\n moduleType,\r\n moduleId,\r\n parentModuleType,\r\n parentModuleId,\r\n parentPath,\r\n ),\r\n );\r\n }\r\n\r\n resetState() {\r\n return this.store.dispatch(new ResetNotificationState());\r\n }\r\n\r\n // Action Dispatchers - Data Loading\r\n loadEvents() {\r\n return this.store.dispatch(new GetEvents());\r\n }\r\n\r\n loadReceivers() {\r\n return this.store.dispatch(new GetReceivers());\r\n }\r\n\r\n loadProperties(isMultiLang?: boolean) {\r\n return this.store.dispatch(new GetProperties(isMultiLang));\r\n }\r\n\r\n // Action Dispatchers - Action Mode (Workflow)\r\n setActionMode(actionId: string | number | null) {\r\n return this.store.dispatch(new SetActionMode(actionId));\r\n }\r\n\r\n loadActionReceivers(actionId: string | number) {\r\n return this.store.dispatch(new GetActionReceivers(actionId));\r\n }\r\n\r\n loadActionProperties(actionId: string | number, isMultiLang?: boolean) {\r\n return this.store.dispatch(new GetActionProperties(actionId, isMultiLang));\r\n }\r\n\r\n // Action Dispatchers - Selection\r\n selectEvent(eventName: string) {\r\n return this.store.dispatch(new SelectEvent(eventName));\r\n }\r\n\r\n selectTemplate(templateId: string | number) {\r\n return this.store.dispatch(new SelectTemplate(templateId));\r\n }\r\n\r\n // Action Dispatchers - Receiver CRUD\r\n addReceivers(templateId: string | number, payload: AddReceiversPayload) {\r\n return this.store.dispatch(new AddReceivers(templateId, payload));\r\n }\r\n\r\n deleteReceiver(receiverId: string | number) {\r\n return this.store.dispatch(new DeleteReceiver(receiverId));\r\n }\r\n\r\n // Action Dispatchers - Template CRUD\r\n\r\n addTemplate(eventId: string | number, payload: AddTemplatePayload) {\r\n return this.store.dispatch(new AddTemplate(eventId, payload));\r\n }\r\n\r\n updateTemplate(templateId: string | number, payload: UpdateTemplatePayload) {\r\n return this.store.dispatch(new UpdateTemplate(templateId, payload));\r\n }\r\n\r\n deleteTemplate(templateId: string | number) {\r\n return this.store.dispatch(new DeleteTemplate(templateId));\r\n }\r\n\r\n /**\r\n * Load all data for normal mode (non-workflow)\r\n */\r\n loadAllData(isMultiLang = true) {\r\n this.loadEvents();\r\n this.loadReceivers();\r\n this.loadProperties(isMultiLang);\r\n }\r\n}\r\n","import { Avatar } from '@masterteam/components/avatar';\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n effect,\r\n untracked,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\r\n\r\n// Components\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { EditorField } from '@masterteam/components/editor-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Skeleton } from 'primeng/skeleton';\r\n\r\n// Dialog\r\nimport { AddTemplateDialog } from '../add-template-dialog/add-template-dialog';\r\n\r\n// Store\r\nimport {\r\n NotificationFacade,\r\n NotificationChannel,\r\n NotificationTemplateItem,\r\n ReceiverItem,\r\n UpdateTemplatePayload,\r\n CHANNEL_CONFIGS,\r\n ChannelConfig,\r\n getChannelConfig,\r\n} from '../../store/notification';\r\n\r\n@Component({\r\n selector: 'mt-notification-template',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n TranslocoModule,\r\n Card,\r\n Button,\r\n SelectField,\r\n TextField,\r\n TextareaField,\r\n EditorField,\r\n ToggleField,\r\n Tabs,\r\n Icon,\r\n Skeleton,\r\n Avatar,\r\n ],\r\n templateUrl: './notification-template.html',\r\n styleUrl: './notification-template.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NotificationTemplate {\r\n private readonly facade = inject(NotificationFacade);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly modalService = inject(ModalService);\r\n\r\n // ============================================================================\r\n // Data Signals from Facade\r\n // ============================================================================\r\n readonly events = this.facade.events;\r\n readonly templates = this.facade.templates;\r\n readonly receivers = this.facade.receivers;\r\n readonly propertyGroups = this.facade.propertyGroups;\r\n\r\n // Selection Signals\r\n readonly selectedEventName = this.facade.selectedEventName;\r\n readonly selectedTemplateId = this.facade.selectedTemplateId;\r\n readonly selectedEvent = this.facade.selectedEvent;\r\n readonly selectedTemplate = this.facade.selectedTemplate;\r\n readonly availableReceivers = this.facade.availableReceivers;\r\n readonly availableReceiverGroups = this.facade.availableReceiverGroups;\r\n\r\n // ============================================================================\r\n // Loading States from Facade\r\n // ============================================================================\r\n readonly isLoadingEvents = this.facade.isLoadingEvents;\r\n readonly isLoadingReceivers = this.facade.isLoadingReceivers;\r\n readonly isLoadingProperties = this.facade.isLoadingProperties;\r\n readonly isUpdatingTemplate = this.facade.isUpdatingTemplate;\r\n readonly isDeletingTemplate = this.facade.isDeletingTemplate;\r\n readonly isAddingTemplate = this.facade.isAddingTemplate;\r\n\r\n // ============================================================================\r\n // Error States from Facade\r\n // ============================================================================\r\n readonly eventsError = this.facade.eventsError;\r\n readonly propertiesError = this.facade.propertiesError;\r\n\r\n // ============================================================================\r\n // Local State\r\n // ============================================================================\r\n readonly deletingReceiverIds = signal<(string | number)[]>([]);\r\n\r\n // ============================================================================\r\n // Form - Dynamic controls based on CHANNEL_CONFIGS\r\n // ============================================================================\r\n readonly form = this.buildForm();\r\n readonly propertyPickerControl = new FormControl<string | null>(null);\r\n private buildForm(): FormGroup {\r\n const fc = (v = '') => new FormControl<string>(v, { nonNullable: true });\r\n const controls: Record<string, FormControl | FormGroup> = {\r\n event: new FormControl<string | null>(null),\r\n name: fc(),\r\n channel: new FormControl<NotificationChannel>('email', {\r\n nonNullable: true,\r\n }),\r\n };\r\n\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey) controls[ch.templateKey] = fc();\r\n if (ch.translatableKey) {\r\n // Nested FormGroup to match payload structure { en: '', ar: '' }\r\n controls[ch.translatableKey] = new FormGroup({\r\n en: fc(),\r\n ar: fc(),\r\n });\r\n }\r\n if (ch.bilingualOptional) {\r\n controls[`${ch.key}Bilingual`] = new FormControl<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n }\r\n }\r\n return new FormGroup(controls);\r\n }\r\n\r\n // ============================================================================\r\n // Computed\r\n // ============================================================================\r\n readonly channelConfigs = CHANNEL_CONFIGS;\r\n\r\n /** Check if channel should show bilingual fields - reads from form */\r\n isBilingual(ch: ChannelConfig): boolean {\r\n if (!ch.supportsBilingual) return false;\r\n if (!ch.bilingualOptional) return true; // forced bilingual (app)\r\n return this.form.controls[`${ch.key}Bilingual`]?.value ?? false;\r\n }\r\n\r\n readonly channelOptions = computed(() =>\r\n CHANNEL_CONFIGS.map((c) => ({\r\n ...c,\r\n name: this.transloco.translate(c.labelKey),\r\n })),\r\n );\r\n\r\n readonly templateTabs = computed(() =>\r\n this.templates().map((t) => ({\r\n label: t.name,\r\n value: t.id,\r\n isSystem: t.isSystem,\r\n })),\r\n );\r\n\r\n readonly isFormInvalid = computed(\r\n () => !this.form.controls['name'].value?.trim(),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const eventName = this.selectedEventName();\r\n if (eventName && this.form.controls['event'].value !== eventName) {\r\n this.form.controls['event'].setValue(eventName, { emitEvent: false });\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.selectedTemplateId(); // depend on selected template id\r\n const template = untracked(this.selectedTemplate);\r\n if (template) this.patchForm(template);\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Event Handlers\r\n // ============================================================================\r\n onEventChange(eventName: string): void {\r\n if (eventName) this.facade.selectEvent(eventName);\r\n }\r\n\r\n onTemplateTabChange(templateId: string): void {\r\n this.facade.selectTemplate(templateId);\r\n }\r\n\r\n // Channel is fixed per template - set on creation only\r\n\r\n onAddProperty(propertyKey: string): void {\r\n if (!propertyKey) return;\r\n\r\n const tag = `{{${propertyKey}}}`;\r\n const ch = getChannelConfig(this.form.controls['channel'].value);\r\n\r\n if (this.isBilingual(ch) && ch.translatableKey) {\r\n const group = this.form.get(ch.translatableKey) as FormGroup;\r\n if (group) {\r\n const enCtrl = group.get('en') as FormControl<string>;\r\n const arCtrl = group.get('ar') as FormControl<string>;\r\n enCtrl?.setValue(`${enCtrl.value ?? ''} ${tag}`);\r\n arCtrl?.setValue(`${arCtrl.value ?? ''} ${tag}`);\r\n }\r\n } else if (ch.templateKey) {\r\n this.appendToControl(ch.templateKey, tag);\r\n }\r\n\r\n setTimeout(() => {\r\n this.propertyPickerControl.reset();\r\n }, 0);\r\n }\r\n\r\n onAddReceiver(receiverId: string | number): void {\r\n const template = this.selectedTemplate();\r\n if (!receiverId || !template) return;\r\n const selectedReceiver = this.availableReceivers().find(\r\n (r) => r.id === receiverId,\r\n );\r\n if (!selectedReceiver) return;\r\n this.facade.addReceivers(template.id, { receivers: [selectedReceiver] });\r\n }\r\n\r\n onDeleteReceiver(receiver: ReceiverItem): void {\r\n this.confirmationService.confirmDelete({\r\n type: 'dialog',\r\n accept: () => {\r\n this.deletingReceiverIds.update((ids) => [...ids, receiver.id]);\r\n this.facade.deleteReceiver(receiver.id).subscribe({\r\n complete: () => {\r\n this.deletingReceiverIds.update((ids) =>\r\n ids.filter((id) => id !== receiver.id),\r\n );\r\n },\r\n error: () => {\r\n this.deletingReceiverIds.update((ids) =>\r\n ids.filter((id) => id !== receiver.id),\r\n );\r\n },\r\n });\r\n },\r\n });\r\n }\r\n\r\n isReceiverDeleting(receiverId: string | number): boolean {\r\n return this.deletingReceiverIds().includes(receiverId);\r\n }\r\n\r\n onSaveTemplate(): void {\r\n const template = this.selectedTemplate();\r\n if (!template || this.isFormInvalid()) {\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n // Build payload dynamically from all channel controls\r\n const payload = this.buildUpdatePayload(template);\r\n this.facade.updateTemplate(template.id, payload);\r\n }\r\n\r\n onDeleteTemplate(): void {\r\n const template = this.selectedTemplate();\r\n if (!template || template.isSystem) return;\r\n\r\n this.confirmationService.confirm({\r\n type: 'dialog',\r\n message: this.transloco.translate('notification.deleteTemplateMessage'),\r\n icon: 'general.trash-01',\r\n acceptButton: { severity: 'danger' },\r\n accept: () => this.facade.deleteTemplate(template.id),\r\n });\r\n }\r\n\r\n onAddTemplateClick(): void {\r\n const event = this.selectedEvent();\r\n if (!event) return;\r\n\r\n const ref = this.modalService.openModal(AddTemplateDialog, 'dialog', {\r\n header: this.transloco.translate('notification.addTemplate'),\r\n styleClass: '!w-[25rem]',\r\n });\r\n\r\n ref.onClose.subscribe((result: { name: string } | undefined) => {\r\n if (result?.name) {\r\n this.facade.addTemplate(event.id, {\r\n name: result.name,\r\n channel: this.form.controls['channel'].value,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Private Methods\r\n // ============================================================================\r\n private appendToControl(key: string, value: string): void {\r\n const ctrl = this.form.controls[key] as FormControl<string>;\r\n ctrl?.setValue(`${ctrl.value ?? ''} ${value}`);\r\n }\r\n\r\n private patchForm(template: NotificationTemplateItem): void {\r\n const channel = template.channel || 'email';\r\n\r\n this.form.patchValue({\r\n name: template.name,\r\n channel: channel,\r\n // Set email bilingual based on whether translatable content exists\r\n emailBilingual: !!template.emailContentTranslatable?.en,\r\n });\r\n\r\n // Patch all channel controls dynamically\r\n const t = template as unknown as Record<string, unknown>;\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey) {\r\n this.form\r\n .get(ch.templateKey)\r\n ?.setValue((t[ch.templateKey] as string) ?? '');\r\n }\r\n if (ch.translatableKey) {\r\n const trans =\r\n (t[ch.translatableKey] as { en?: string; ar?: string }) ?? {};\r\n this.form.get(ch.translatableKey)?.patchValue({\r\n en: trans.en ?? '',\r\n ar: trans.ar ?? '',\r\n });\r\n }\r\n }\r\n }\r\n\r\n private buildUpdatePayload(\r\n template: NotificationTemplateItem,\r\n ): UpdateTemplatePayload {\r\n const v = this.form.getRawValue();\r\n return {\r\n name: v['name'] || template.name,\r\n ...this.extractChannelPayload(v),\r\n };\r\n }\r\n\r\n private extractChannelPayload(\r\n formValue: Record<string, unknown>,\r\n ): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey && formValue[ch.templateKey] !== undefined) {\r\n payload[ch.templateKey] = formValue[ch.templateKey] || '';\r\n }\r\n if (ch.translatableKey && formValue[ch.translatableKey] !== undefined) {\r\n payload[ch.translatableKey] = formValue[ch.translatableKey];\r\n }\r\n }\r\n\r\n return payload;\r\n }\r\n}\r\n\r\nexport default NotificationTemplate;\r\n","<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\r\n <div class=\"w-1/2\">\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Tabs Skeleton -->\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex gap-2\">\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <p-skeleton width=\"8rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"events()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'eventName'\"\r\n [label]=\"'notification.events' | transloco\"\r\n [placeholder]=\"'notification.selectEvent' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n (onChange)=\"onEventChange($event)\"\r\n />\r\n </div>\r\n @if (events().length === 0) {\r\n <!-- Empty State -->\r\n <mt-card>\r\n <div\r\n class=\"flex flex-col items-center justify-center py-12 text-slate-500\"\r\n >\r\n <mt-icon icon=\"alert.alert-circle\" class=\"mb-2 h-12 w-12\" />\r\n <p>{{ \"notification.noEventsFound\" | transloco }}</p>\r\n </div>\r\n </mt-card>\r\n } @else if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\r\n <mt-tabs\r\n [active]=\"selectedTemplateId()\"\r\n [options]=\"templateTabs()\"\r\n (activeChange)=\"onTemplateTabChange($event)\"\r\n />\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'notification.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\r\n <!-- Template Content -->\r\n @if (selectedTemplate(); as template) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Name -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-text-field\r\n formControlName=\"name\"\r\n [label]=\"'notification.name' | transloco\"\r\n [placeholder]=\"'notification.enterName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n <!-- Channel & Properties Picker Row -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n formControlName=\"channel\"\r\n [options]=\"channelOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [label]=\"'notification.channel.label' | transloco\"\r\n [placeholder]=\"'notification.selectChannel' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n [disabled]=\"true\"\r\n />\r\n <mt-select-field\r\n [options]=\"propertyGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'properties'\"\r\n [label]=\"'notification.propertiesList' | transloco\"\r\n [placeholder]=\"'notification.selectProperty' | transloco\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingProperties()\"\r\n [formControl]=\"propertyPickerControl\"\r\n (onChange)=\"onAddProperty($event)\"\r\n />\r\n </div>\r\n <!-- Channel Content Editors -->\r\n @for (ch of channelConfigs; track ch.key) {\r\n @if (form.controls[\"channel\"].value === ch.key) {\r\n <!-- Bilingual Content Fields -->\r\n @if (isBilingual(ch) && ch.translatableKey) {\r\n <ng-container [formGroupName]=\"ch.translatableKey\">\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n dir=\"ltr\"\r\n />\r\n <mt-editor-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n dir=\"rtl\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"ltr\"\r\n />\r\n <mt-textarea-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"rtl\"\r\n />\r\n }\r\n </ng-container>\r\n } @else if (ch.templateKey) {\r\n <!-- Non-Bilingual Content Field -->\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n [rows]=\"'6'\"\r\n />\r\n }\r\n }\r\n <!-- Bilingual Toggle -->\r\n @if (ch.bilingualOptional) {\r\n <mt-toggle-field\r\n [formControlName]=\"ch.key + 'Bilingual'\"\r\n [label]=\"'notification.bilingual' | transloco\"\r\n />\r\n }\r\n }\r\n }\r\n <!-- Receivers -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceiverGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'items'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n [loading]=\"isReceiverDeleting(receiver.id)\"\r\n (onClick)=\"onDeleteReceiver(receiver)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <!-- Actions -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n @if (!template.isSystem) {\r\n <mt-button\r\n [label]=\"'notification.delete' | transloco\"\r\n severity=\"danger\"\r\n [loading]=\"isDeletingTemplate()\"\r\n [disabled]=\"isUpdatingTemplate()\"\r\n (onClick)=\"onDeleteTemplate()\"\r\n />\r\n }\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [loading]=\"isUpdatingTemplate()\"\r\n [disabled]=\"isDeletingTemplate() || isFormInvalid()\"\r\n (onClick)=\"onSaveTemplate()\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { NotificationState } from './notification/notification.state';\r\n\r\nexport const APP_STATES = [NotificationState];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masterteam/notification",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "publishConfig": {
5
5
  "directory": "../../../dist/masterteam/notification",
6
6
  "linkDirectory": false,
@@ -19,9 +19,9 @@
19
19
  "tailwindcss": "^4.1.17",
20
20
  "tailwindcss-primeui": "^0.6.1",
21
21
  "@ngxs/store": "^20.1.0",
22
- "@masterteam/components": "^0.0.84",
23
- "@masterteam/forms": "^0.0.35",
24
- "@masterteam/icons": "^0.0.12"
22
+ "@masterteam/components": "^0.0.101",
23
+ "@masterteam/icons": "^0.0.13",
24
+ "@masterteam/forms": "^0.0.47"
25
25
  },
26
26
  "sideEffects": false,
27
27
  "exports": {
@@ -55,6 +55,10 @@ interface ReceiverSubGroup {
55
55
  subGroupName: string;
56
56
  items: ReceiverItem[];
57
57
  }
58
+ interface ReceiverOptionGroup {
59
+ groupName: string;
60
+ items: ReceiverItem[];
61
+ }
58
62
  interface NotificationProperty {
59
63
  key: string;
60
64
  name: string;
@@ -117,6 +121,7 @@ interface NotificationStateModel extends LoadingStateShape<NotificationActionKey
117
121
  templates: NotificationTemplateItem[];
118
122
  actions: NotificationAction[];
119
123
  receivers: ReceiverItem[];
124
+ receiverGroups: ReceiverOptionGroup[];
120
125
  propertyGroups: PropertyGroup[];
121
126
  selectedEventName: string | null;
122
127
  selectedTemplateId: string | number | null;
@@ -207,6 +212,7 @@ declare class NotificationState extends CrudStateBase<NotificationTemplateItem,
207
212
  static getEvents(state: NotificationStateModel): NotificationEvent[];
208
213
  static getTemplates(state: NotificationStateModel): NotificationTemplateItem[];
209
214
  static getReceivers(state: NotificationStateModel): ReceiverItem[];
215
+ static getReceiverGroups(state: NotificationStateModel): ReceiverOptionGroup[];
210
216
  static getPropertyGroups(state: NotificationStateModel): PropertyGroup[];
211
217
  static getSelectedEventName(state: NotificationStateModel): string | null;
212
218
  static getSelectedTemplateId(state: NotificationStateModel): string | number | null;
@@ -216,9 +222,11 @@ declare class NotificationState extends CrudStateBase<NotificationTemplateItem,
216
222
  static getEventTemplates(templates: NotificationTemplateItem[], selectedEvent: NotificationEvent | null): NotificationTemplateItem[];
217
223
  static getSelectedTemplate(templates: NotificationTemplateItem[], selectedTemplateId: string | number | null): NotificationTemplateItem | null;
218
224
  static getAvailableReceivers(receivers: ReceiverItem[], selectedTemplate: NotificationTemplateItem | null): ReceiverItem[];
225
+ static getAvailableReceiverGroups(receiverGroups: ReceiverOptionGroup[], selectedTemplate: NotificationTemplateItem | null): ReceiverOptionGroup[];
219
226
  /** API returns events with nested templates - we flatten for state */
220
227
  private flattenEventsResponse;
221
- private flattenReceivers;
228
+ private normalizeReceiverGroups;
229
+ private flattenReceiverItems;
222
230
  setModuleInfo(ctx: StateContext<NotificationStateModel>, action: SetModuleInfo): void;
223
231
  resetState(ctx: StateContext<NotificationStateModel>): void;
224
232
  getEvents(ctx: StateContext<NotificationStateModel>): rxjs.Observable<Response<(NotificationEvent & {
@@ -246,12 +254,14 @@ declare class NotificationFacade {
246
254
  readonly events: _angular_core.Signal<_masterteam_notification.NotificationEvent[]>;
247
255
  readonly templates: _angular_core.Signal<_masterteam_notification.NotificationTemplateItem[]>;
248
256
  readonly receivers: _angular_core.Signal<_masterteam_notification.ReceiverItem[]>;
257
+ readonly receiverGroups: _angular_core.Signal<_masterteam_notification.ReceiverOptionGroup[]>;
249
258
  readonly propertyGroups: _angular_core.Signal<_masterteam_notification.PropertyGroup[]>;
250
259
  readonly selectedEventName: _angular_core.Signal<string | null>;
251
260
  readonly selectedTemplateId: _angular_core.Signal<string | number | null>;
252
261
  readonly selectedEvent: _angular_core.Signal<_masterteam_notification.NotificationEvent | null>;
253
262
  readonly selectedTemplate: _angular_core.Signal<_masterteam_notification.NotificationTemplateItem | null>;
254
263
  readonly availableReceivers: _angular_core.Signal<_masterteam_notification.ReceiverItem[]>;
264
+ readonly availableReceiverGroups: _angular_core.Signal<_masterteam_notification.ReceiverOptionGroup[]>;
255
265
  private readonly loadingActive;
256
266
  private readonly errors;
257
267
  readonly isLoadingEvents: _angular_core.Signal<boolean>;
@@ -302,6 +312,7 @@ declare class NotificationTemplate {
302
312
  readonly selectedEvent: _angular_core.Signal<_masterteam_notification.NotificationEvent | null>;
303
313
  readonly selectedTemplate: _angular_core.Signal<NotificationTemplateItem | null>;
304
314
  readonly availableReceivers: _angular_core.Signal<ReceiverItem[]>;
315
+ readonly availableReceiverGroups: _angular_core.Signal<_masterteam_notification.ReceiverOptionGroup[]>;
305
316
  readonly isLoadingEvents: _angular_core.Signal<boolean>;
306
317
  readonly isLoadingReceivers: _angular_core.Signal<boolean>;
307
318
  readonly isLoadingProperties: _angular_core.Signal<boolean>;
@@ -365,4 +376,4 @@ declare class AddTemplateDialog {
365
376
  declare const APP_STATES: (typeof NotificationState)[];
366
377
 
367
378
  export { APP_STATES, AddReceivers, AddTemplate, AddTemplateDialog, CHANNEL_CONFIGS, DeleteReceiver, DeleteTemplate, GetActionProperties, GetActionReceivers, GetEvents, GetProperties, GetReceivers, NotificationActionKey, NotificationFacade, NotificationState, NotificationTemplate, ResetNotificationState, SelectEvent, SelectTemplate, SetActionMode, SetModuleInfo, UpdateTemplate, getChannelConfig, getFormControlName };
368
- export type { ActionGroup, AddReceiversPayload, AddTemplatePayload, ChannelConfig, NotificationAction, NotificationChannel, NotificationEvent, NotificationProperty, NotificationStateModel, NotificationTemplateItem, PropertyGroup, ReceiverGroup, ReceiverItem, ReceiverPayloadItem, ReceiverSubGroup, TranslatableContent, UpdateTemplatePayload };
379
+ export type { ActionGroup, AddReceiversPayload, AddTemplatePayload, ChannelConfig, NotificationAction, NotificationChannel, NotificationEvent, NotificationProperty, NotificationStateModel, NotificationTemplateItem, PropertyGroup, ReceiverGroup, ReceiverItem, ReceiverOptionGroup, ReceiverPayloadItem, ReceiverSubGroup, TranslatableContent, UpdateTemplatePayload };