@genesislcap/pbc-notify-ui 15.8.3 → 15.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +39 -0
  2. package/custom-elements-manifest.config.js +5 -0
  3. package/dist/custom-elements.json +1771 -321
  4. package/dist/dts/components/components.d.ts.map +1 -1
  5. package/dist/dts/components/foundation-inbox/inbox-base/inbox-base.d.ts +2 -0
  6. package/dist/dts/components/foundation-inbox/inbox-base/inbox-base.d.ts.map +1 -1
  7. package/dist/dts/components/foundation-inbox/inbox.styles.d.ts.map +1 -1
  8. package/dist/dts/components/foundation-inbox/inbox.template.d.ts.map +1 -1
  9. package/dist/dts/components/foundation-inbox/inbox.types.d.ts +4 -1
  10. package/dist/dts/components/foundation-inbox/inbox.types.d.ts.map +1 -1
  11. package/dist/dts/components/foundation-notification-dashboard/alert-sound-attachment.d.ts +86 -0
  12. package/dist/dts/components/foundation-notification-dashboard/alert-sound-attachment.d.ts.map +1 -0
  13. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.d.ts +39 -1
  14. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.d.ts.map +1 -1
  15. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.template.d.ts.map +1 -1
  16. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.types.d.ts +8 -0
  17. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.types.d.ts.map +1 -1
  18. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-management.d.ts.map +1 -1
  19. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.d.ts +41 -1
  20. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.d.ts.map +1 -1
  21. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.template.d.ts.map +1 -1
  22. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.d.ts +2 -1
  23. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.d.ts.map +1 -1
  24. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-management.d.ts.map +1 -1
  25. package/dist/dts/components/foundation-notification-dashboard/styles/dynamic-rule.styles.d.ts.map +1 -1
  26. package/dist/dts/components/foundation-sounds/foundation-sounds-panel.d.ts +73 -0
  27. package/dist/dts/components/foundation-sounds/foundation-sounds-panel.d.ts.map +1 -0
  28. package/dist/dts/components/foundation-sounds/foundation-sounds-panel.styles.d.ts +2 -0
  29. package/dist/dts/components/foundation-sounds/foundation-sounds-panel.styles.d.ts.map +1 -0
  30. package/dist/dts/components/foundation-sounds/foundation-sounds-panel.template.d.ts +3 -0
  31. package/dist/dts/components/foundation-sounds/foundation-sounds-panel.template.d.ts.map +1 -0
  32. package/dist/dts/components/foundation-sounds/foundation-sounds.d.ts +34 -0
  33. package/dist/dts/components/foundation-sounds/foundation-sounds.d.ts.map +1 -0
  34. package/dist/dts/components/foundation-sounds/foundation-sounds.styles.d.ts +3 -0
  35. package/dist/dts/components/foundation-sounds/foundation-sounds.styles.d.ts.map +1 -0
  36. package/dist/dts/index.d.ts +4 -0
  37. package/dist/dts/index.d.ts.map +1 -1
  38. package/dist/dts/react.d.ts +31 -11
  39. package/dist/dts/services/inbox.service.d.ts +6 -0
  40. package/dist/dts/services/inbox.service.d.ts.map +1 -1
  41. package/dist/dts/services/rule.service.d.ts +2 -1
  42. package/dist/dts/services/rule.service.d.ts.map +1 -1
  43. package/dist/dts/utils/alert-sound.d.ts +177 -0
  44. package/dist/dts/utils/alert-sound.d.ts.map +1 -0
  45. package/dist/dts/utils/alert-sound.test.d.ts +2 -0
  46. package/dist/dts/utils/alert-sound.test.d.ts.map +1 -0
  47. package/dist/esm/components/components.js +4 -0
  48. package/dist/esm/components/foundation-inbox/inbox-base/inbox-base.js +6 -0
  49. package/dist/esm/components/foundation-inbox/inbox.styles.js +15 -0
  50. package/dist/esm/components/foundation-inbox/inbox.template.js +16 -0
  51. package/dist/esm/components/foundation-inbox/inbox.types.js +1 -0
  52. package/dist/esm/components/foundation-notification-dashboard/alert-sound-attachment.js +218 -0
  53. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.js +17 -2
  54. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.template.js +3 -0
  55. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-management.js +5 -1
  56. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.js +23 -2
  57. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.template.js +3 -0
  58. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-management.js +8 -1
  59. package/dist/esm/components/foundation-notification-dashboard/styles/dynamic-rule.styles.js +31 -1
  60. package/dist/esm/components/foundation-sounds/foundation-sounds-panel.js +283 -0
  61. package/dist/esm/components/foundation-sounds/foundation-sounds-panel.styles.js +200 -0
  62. package/dist/esm/components/foundation-sounds/foundation-sounds-panel.template.js +179 -0
  63. package/dist/esm/components/foundation-sounds/foundation-sounds.js +206 -0
  64. package/dist/esm/components/foundation-sounds/foundation-sounds.styles.js +7 -0
  65. package/dist/esm/index.js +3 -0
  66. package/dist/esm/services/inbox.service.js +6 -2
  67. package/dist/esm/services/rule.service.js +35 -0
  68. package/dist/esm/utils/alert-sound.js +955 -0
  69. package/dist/esm/utils/alert-sound.test.js +25 -0
  70. package/dist/esm/utils/index.js +3 -0
  71. package/dist/pbc-notify-ui.api.json +2859 -332
  72. package/dist/pbc-notify-ui.d.ts +281 -3
  73. package/dist/react.cjs +19 -5
  74. package/dist/react.mjs +16 -4
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +23 -23
  77. package/src/components/components.ts +4 -0
  78. package/src/components/foundation-inbox/inbox-base/inbox-base.ts +7 -0
  79. package/src/components/foundation-inbox/inbox.styles.ts +15 -0
  80. package/src/components/foundation-inbox/inbox.template.ts +16 -0
  81. package/src/components/foundation-inbox/inbox.types.ts +3 -0
  82. package/src/components/foundation-notification-dashboard/alert-sound-attachment.ts +283 -0
  83. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.template.ts +3 -0
  84. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.ts +21 -2
  85. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.types.ts +9 -0
  86. package/src/components/foundation-notification-dashboard/components/rules/rule-management.ts +5 -1
  87. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.template.ts +3 -0
  88. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts +25 -2
  89. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts +2 -1
  90. package/src/components/foundation-notification-dashboard/components/templates/template-management.ts +8 -1
  91. package/src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts +31 -1
  92. package/src/components/foundation-sounds/foundation-sounds-panel.styles.ts +201 -0
  93. package/src/components/foundation-sounds/foundation-sounds-panel.template.ts +188 -0
  94. package/src/components/foundation-sounds/foundation-sounds-panel.ts +280 -0
  95. package/src/components/foundation-sounds/foundation-sounds.styles.ts +8 -0
  96. package/src/components/foundation-sounds/foundation-sounds.ts +222 -0
  97. package/src/index.ts +8 -0
  98. package/src/services/inbox.service.ts +12 -2
  99. package/src/services/rule.service.ts +37 -1
  100. package/src/utils/alert-sound.test.ts +32 -0
  101. package/src/utils/alert-sound.ts +1135 -0
  102. package/src/utils/index.ts +3 -0
@@ -37,6 +37,22 @@
37
37
  "package": "./components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter"
38
38
  }
39
39
  },
40
+ {
41
+ "kind": "js",
42
+ "name": "*",
43
+ "declaration": {
44
+ "name": "*",
45
+ "package": "./components/foundation-sounds/foundation-sounds"
46
+ }
47
+ },
48
+ {
49
+ "kind": "js",
50
+ "name": "*",
51
+ "declaration": {
52
+ "name": "*",
53
+ "package": "./components/foundation-sounds/foundation-sounds-panel"
54
+ }
55
+ },
40
56
  {
41
57
  "kind": "js",
42
58
  "name": "*",
@@ -45,6 +61,54 @@
45
61
  "package": "./components/foundation-notification-dashboard"
46
62
  }
47
63
  },
64
+ {
65
+ "kind": "js",
66
+ "name": "AlertSoundPlayer",
67
+ "declaration": {
68
+ "name": "AlertSoundPlayer",
69
+ "module": "./utils/alert-sound"
70
+ }
71
+ },
72
+ {
73
+ "kind": "js",
74
+ "name": "MAX_SOUND_RULES",
75
+ "declaration": {
76
+ "name": "MAX_SOUND_RULES",
77
+ "module": "./utils/alert-sound"
78
+ }
79
+ },
80
+ {
81
+ "kind": "js",
82
+ "name": "MAX_SOUND_FILE_BYTES",
83
+ "declaration": {
84
+ "name": "MAX_SOUND_FILE_BYTES",
85
+ "module": "./utils/alert-sound"
86
+ }
87
+ },
88
+ {
89
+ "kind": "js",
90
+ "name": "AlertSoundMatchMode",
91
+ "declaration": {
92
+ "name": "AlertSoundMatchMode",
93
+ "module": "./utils/alert-sound"
94
+ }
95
+ },
96
+ {
97
+ "kind": "js",
98
+ "name": "AlertSoundRuleView",
99
+ "declaration": {
100
+ "name": "AlertSoundRuleView",
101
+ "module": "./utils/alert-sound"
102
+ }
103
+ },
104
+ {
105
+ "kind": "js",
106
+ "name": "AlertSoundSelectableRule",
107
+ "declaration": {
108
+ "name": "AlertSoundSelectableRule",
109
+ "module": "./utils/alert-sound"
110
+ }
111
+ },
48
112
  {
49
113
  "kind": "js",
50
114
  "name": "Alert",
@@ -415,27 +479,6 @@
415
479
  }
416
480
  ]
417
481
  },
418
- {
419
- "kind": "javascript-module",
420
- "path": "src/styles/scrollbar.styles.ts",
421
- "declarations": [
422
- {
423
- "kind": "variable",
424
- "name": "scrollbarStyles",
425
- "default": "css`\n ::-webkit-scrollbar {\n width: calc((var(--base-height-multiplier) + var(--design-unit)) * 1px);\n }\n\n ::-webkit-scrollbar-track {\n background: var(--neutral-layer-1);\n }\n\n ::-webkit-scrollbar-thumb {\n background: var(--neutral-fill-rest);\n }\n`"
426
- }
427
- ],
428
- "exports": [
429
- {
430
- "kind": "js",
431
- "name": "scrollbarStyles",
432
- "declaration": {
433
- "name": "scrollbarStyles",
434
- "module": "src/styles/scrollbar.styles.ts"
435
- }
436
- }
437
- ]
438
- },
439
482
  {
440
483
  "kind": "javascript-module",
441
484
  "path": "src/utils/eventDetail.ts",
@@ -757,6 +800,27 @@
757
800
  }
758
801
  ]
759
802
  },
803
+ {
804
+ "kind": "javascript-module",
805
+ "path": "src/styles/scrollbar.styles.ts",
806
+ "declarations": [
807
+ {
808
+ "kind": "variable",
809
+ "name": "scrollbarStyles",
810
+ "default": "css`\n ::-webkit-scrollbar {\n width: calc((var(--base-height-multiplier) + var(--design-unit)) * 1px);\n }\n\n ::-webkit-scrollbar-track {\n background: var(--neutral-layer-1);\n }\n\n ::-webkit-scrollbar-thumb {\n background: var(--neutral-fill-rest);\n }\n`"
811
+ }
812
+ ],
813
+ "exports": [
814
+ {
815
+ "kind": "js",
816
+ "name": "scrollbarStyles",
817
+ "declaration": {
818
+ "name": "scrollbarStyles",
819
+ "module": "src/styles/scrollbar.styles.ts"
820
+ }
821
+ }
822
+ ]
823
+ },
760
824
  {
761
825
  "kind": "javascript-module",
762
826
  "path": "src/components/foundation-inbox/inbox.styles.ts",
@@ -779,7 +843,7 @@
779
843
  {
780
844
  "kind": "variable",
781
845
  "name": "subscribe",
782
- "default": "css`\n .subscribe-tab-panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n }\n\n .subscribe-tab-content {\n flex: 1;\n overflow: auto;\n }\n`"
846
+ "default": "css`\n .subscribe-tab-panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n }\n\n .subscribe-tab-content {\n flex: 1;\n overflow: auto;\n }\n\n .sounds-tab-panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n overflow: hidden;\n }\n\n .sounds-tab-panel foundation-sounds-panel {\n display: flex;\n flex: 1;\n min-height: 0;\n height: 100%;\n }\n`"
783
847
  },
784
848
  {
785
849
  "kind": "variable",
@@ -851,7 +915,7 @@
851
915
  {
852
916
  "kind": "variable",
853
917
  "name": "FoundationInboxTemplate",
854
- "default": "html<FoundationInbox>`\n <div class=\"inbox-content\">\n <rapid-tabs ${ref('tabs')} appearance=\"secondary\" activeid=${(x) => InboxTab.ALERTS_NEW}>\n <rapid-tab\n slot=\"alert-log-tab\"\n id=${InboxTab.ALERTS_NEW}\n @click=${(x) => x.inboxTabChanged(InboxTab.ALERTS_NEW)}\n appearance=\"secondary\"\n >\n Alerts\n </rapid-tab>\n <rapid-tab\n slot=\"alert-log-tab\"\n id=${InboxTab.ALERT_HISTORY}\n @click=${(x) => x.inboxTabChanged(InboxTab.ALERT_HISTORY)}\n appearance=\"secondary\"\n >\n Alert History\n </rapid-tab>\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleTemplateView),\n html`\n <rapid-tab\n slot=\"subscribe-tab\"\n id=${InboxTab.SUBSCRIBE}\n @click=${(x) => x.inboxTabChanged(InboxTab.SUBSCRIBE)}\n appearance=\"secondary\"\n >\n Subscribe\n </rapid-tab>\n `,\n )}\n\n <!-- Alerts -->\n ${(_) => alertsTab(InboxTab.ALERTS_NEW)} ${(_) => alertsTab(InboxTab.ALERT_HISTORY)}\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleTemplateView),\n html`\n <rapid-tab-panel\n slot=\"subscribe-tab\"\n class=\"subscribe-tab-panel\"\n id=${InboxTab.SUBSCRIBE}\n style=${(x) => (x.selectedTab === InboxTab.SUBSCRIBE ? '' : 'display: none;')}\n >\n <div class=\"search\">\n <rapid-text-field\n class=\"search-input\"\n @input=${(x, c) => {\n x.searchSubscribe = (c.event.target as HTMLInputElement).value;\n x.filterSearchSubscribe();\n }}\n placeholder=\"Search Templates...\"\n autocomplete=\"off\"\n ></rapid-text-field>\n </div>\n <div class=\"subscribe-tab-content\">\n ${repeat(\n (x) => x.templatesFilter,\n html<RuleTemplate, FoundationInbox>`\n <div\n class=\"template ${(x, c) =>\n c.parent.pendingSubscribeTemplateId === x.ID ? 'template-subscribing' : ''}\"\n id=${(x) => x.ID}\n >\n <div class=\"template-row\">\n <div class=\"template-details\">\n <div class=\"template-name\">${(x) => x.NAME}</div>\n <div class=\"template-description\">${(x) => x.DESCRIPTION}</div>\n </div>\n <rapid-switch\n class=\"template-subscribe-toggle\"\n :checked=${(x, c) => c.parent.isTemplateSubscribed(x)}\n @change=${(x, c) => c.parent.handleTemplateToggle(x, c.event as Event)}\n @click=${(_, c) => c.event.stopPropagation()}\n ></rapid-switch>\n </div>\n ${when(\n (x, c) =>\n c.parent.auth.currentUser?.hasPermission(\n NotifyPermission.NotificationRouteView,\n ),\n html<RuleTemplate, FoundationInbox>`\n <div class=\"channel-chip-row\">\n ${when(\n (x, c) => c.parent.isChannelAvailable(x, 'popup'),\n html<RuleTemplate, FoundationInbox>`\n <rapid-button\n class=\"channel-chip\"\n appearance=${(x, c) =>\n c.parent.isChannelEnabled(x, 'popup') ? 'selected' : ''}\n ?disabled=${(x, c) =>\n !c.parent.isTemplateSubscribed(x) ||\n c.parent.isChannelTogglePending(x, 'popup')}\n @click=${(x, c) => {\n c.event.stopPropagation();\n c.parent.toggleChannel(x, 'popup');\n }}\n >\n Pop-up\n </rapid-button>\n `,\n )}\n ${when(\n (x, c) => c.parent.isChannelAvailable(x, 'email'),\n html<RuleTemplate, FoundationInbox>`\n <rapid-button\n class=\"channel-chip\"\n appearance=${(x, c) =>\n c.parent.isChannelEnabled(x, 'email') ? 'selected' : ''}\n ?disabled=${(x, c) =>\n !c.parent.isTemplateSubscribed(x) ||\n c.parent.isChannelTogglePending(x, 'email')}\n @click=${(x, c) => {\n c.event.stopPropagation();\n c.parent.toggleChannel(x, 'email');\n }}\n >\n Email\n </rapid-button>\n `,\n )}\n </div>\n `,\n )}\n ${when(\n (x, c) => c.parent.pendingSubscribeTemplateId === x.ID,\n html`\n <inbox-subscription\n inline\n :template=${(x, c) => c.parent.ruleTemplateDetails}\n @templateSubscribed=${(x, c) =>\n c.parent.onTemplateSubscribed(eventDetail(c))}\n @subscribeCancelled=${(x, c) => c.parent.cancelPendingSubscribe()}\n ></inbox-subscription>\n `,\n )}\n </div>\n `,\n )}\n </div>\n </rapid-tab-panel>\n `,\n )}\n </rapid-tabs>\n </div>\n`",
918
+ "default": "html<FoundationInbox>`\n <div class=\"inbox-content\">\n <rapid-tabs ${ref('tabs')} appearance=\"secondary\" activeid=${(x) => InboxTab.ALERTS_NEW}>\n <rapid-tab\n slot=\"alert-log-tab\"\n id=${InboxTab.ALERTS_NEW}\n @click=${(x) => x.inboxTabChanged(InboxTab.ALERTS_NEW)}\n appearance=\"secondary\"\n >\n Alerts\n </rapid-tab>\n <rapid-tab\n slot=\"alert-log-tab\"\n id=${InboxTab.ALERT_HISTORY}\n @click=${(x) => x.inboxTabChanged(InboxTab.ALERT_HISTORY)}\n appearance=\"secondary\"\n >\n Alert History\n </rapid-tab>\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleTemplateView),\n html`\n <rapid-tab\n slot=\"subscribe-tab\"\n id=${InboxTab.SUBSCRIBE}\n @click=${(x) => x.inboxTabChanged(InboxTab.SUBSCRIBE)}\n appearance=\"secondary\"\n >\n Subscribe\n </rapid-tab>\n `,\n )}\n <rapid-tab\n slot=\"sounds-tab\"\n id=${InboxTab.SOUNDS}\n @click=${(x) => x.inboxTabChanged(InboxTab.SOUNDS)}\n appearance=\"secondary\"\n >\n Sounds\n </rapid-tab>\n\n <!-- Alerts -->\n ${(_) => alertsTab(InboxTab.ALERTS_NEW)} ${(_) => alertsTab(InboxTab.ALERT_HISTORY)}\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleTemplateView),\n html`\n <rapid-tab-panel\n slot=\"subscribe-tab\"\n class=\"subscribe-tab-panel\"\n id=${InboxTab.SUBSCRIBE}\n style=${(x) => (x.selectedTab === InboxTab.SUBSCRIBE ? '' : 'display: none;')}\n >\n <div class=\"search\">\n <rapid-text-field\n class=\"search-input\"\n @input=${(x, c) => {\n x.searchSubscribe = (c.event.target as HTMLInputElement).value;\n x.filterSearchSubscribe();\n }}\n placeholder=\"Search Templates...\"\n autocomplete=\"off\"\n ></rapid-text-field>\n </div>\n <div class=\"subscribe-tab-content\">\n ${repeat(\n (x) => x.templatesFilter,\n html<RuleTemplate, FoundationInbox>`\n <div\n class=\"template ${(x, c) =>\n c.parent.pendingSubscribeTemplateId === x.ID ? 'template-subscribing' : ''}\"\n id=${(x) => x.ID}\n >\n <div class=\"template-row\">\n <div class=\"template-details\">\n <div class=\"template-name\">${(x) => x.NAME}</div>\n <div class=\"template-description\">${(x) => x.DESCRIPTION}</div>\n </div>\n <rapid-switch\n class=\"template-subscribe-toggle\"\n :checked=${(x, c) => c.parent.isTemplateSubscribed(x)}\n @change=${(x, c) => c.parent.handleTemplateToggle(x, c.event as Event)}\n @click=${(_, c) => c.event.stopPropagation()}\n ></rapid-switch>\n </div>\n ${when(\n (x, c) =>\n c.parent.auth.currentUser?.hasPermission(\n NotifyPermission.NotificationRouteView,\n ),\n html<RuleTemplate, FoundationInbox>`\n <div class=\"channel-chip-row\">\n ${when(\n (x, c) => c.parent.isChannelAvailable(x, 'popup'),\n html<RuleTemplate, FoundationInbox>`\n <rapid-button\n class=\"channel-chip\"\n appearance=${(x, c) =>\n c.parent.isChannelEnabled(x, 'popup') ? 'selected' : ''}\n ?disabled=${(x, c) =>\n !c.parent.isTemplateSubscribed(x) ||\n c.parent.isChannelTogglePending(x, 'popup')}\n @click=${(x, c) => {\n c.event.stopPropagation();\n c.parent.toggleChannel(x, 'popup');\n }}\n >\n Pop-up\n </rapid-button>\n `,\n )}\n ${when(\n (x, c) => c.parent.isChannelAvailable(x, 'email'),\n html<RuleTemplate, FoundationInbox>`\n <rapid-button\n class=\"channel-chip\"\n appearance=${(x, c) =>\n c.parent.isChannelEnabled(x, 'email') ? 'selected' : ''}\n ?disabled=${(x, c) =>\n !c.parent.isTemplateSubscribed(x) ||\n c.parent.isChannelTogglePending(x, 'email')}\n @click=${(x, c) => {\n c.event.stopPropagation();\n c.parent.toggleChannel(x, 'email');\n }}\n >\n Email\n </rapid-button>\n `,\n )}\n </div>\n `,\n )}\n ${when(\n (x, c) => c.parent.pendingSubscribeTemplateId === x.ID,\n html`\n <inbox-subscription\n inline\n :template=${(x, c) => c.parent.ruleTemplateDetails}\n @templateSubscribed=${(x, c) =>\n c.parent.onTemplateSubscribed(eventDetail(c))}\n @subscribeCancelled=${(x, c) => c.parent.cancelPendingSubscribe()}\n ></inbox-subscription>\n `,\n )}\n </div>\n `,\n )}\n </div>\n </rapid-tab-panel>\n `,\n )}\n <rapid-tab-panel\n slot=\"sounds-tab\"\n class=\"sounds-tab-panel\"\n id=${InboxTab.SOUNDS}\n style=${(x) => (x.selectedTab === InboxTab.SOUNDS ? '' : 'display: none;')}\n >\n <foundation-sounds-panel ${ref('sounds')}></foundation-sounds-panel>\n </rapid-tab-panel>\n </rapid-tabs>\n </div>\n`",
855
919
  "privacy": "public"
856
920
  }
857
921
  ],
@@ -1375,6 +1439,18 @@
1375
1439
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1376
1440
  }
1377
1441
  },
1442
+ {
1443
+ "kind": "field",
1444
+ "name": "sounds",
1445
+ "type": {
1446
+ "text": "FoundationSoundsPanel"
1447
+ },
1448
+ "privacy": "public",
1449
+ "inheritedFrom": {
1450
+ "name": "FoundationInboxBase",
1451
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1452
+ }
1453
+ },
1378
1454
  {
1379
1455
  "kind": "field",
1380
1456
  "name": "alertSubscription",
@@ -1965,170 +2041,385 @@
1965
2041
  },
1966
2042
  {
1967
2043
  "kind": "javascript-module",
1968
- "path": "src/components/foundation-notification-dashboard/index.ts",
1969
- "declarations": [],
1970
- "exports": [
1971
- {
1972
- "kind": "js",
1973
- "name": "*",
1974
- "declaration": {
1975
- "name": "*",
1976
- "package": "./notification-dashboard"
1977
- }
1978
- }
1979
- ]
1980
- },
1981
- {
1982
- "kind": "javascript-module",
1983
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
2044
+ "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
1984
2045
  "declarations": [
1985
2046
  {
1986
2047
  "kind": "variable",
1987
- "name": "FoundationNotificationDashboardStyles",
1988
- "default": "css`\n .notification-dashboard,\n rapid-tabs,\n rapid-tab-panel {\n height: 100%;\n }\n\n .no-permissions {\n font-family: var(--body-font);\n color: var(--neutral-foreground-rest);\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n`",
2048
+ "name": "alertSoundAttachmentTemplate",
2049
+ "default": "html<AlertSoundAttachmentHost>`\n <div class=\"alert-sound\">\n <input\n ${ref('fileInput')}\n class=\"file-input\"\n type=\"file\"\n accept=\"audio/*\"\n @change=${(x, c) => x.onAlertSoundSelected(c.event)}\n />\n <label>Alert sound</label>\n <div class=\"alert-sound-row\">\n <span class=\"alert-sound-name\" title=${(x) => x.alertSoundFileName || ''}>\n ${(x) => x.alertSoundFileName || 'No sound attached'}\n </span>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.openAlertSoundPicker()}>\n ${(x) => (x.hasAlertSound ? 'Replace' : 'Attach')}\n </rapid-button>\n ${when(\n (x) => x.hasAlertSound,\n html<AlertSoundAttachmentHost>`\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.testAttachedAlertSound()}>\n Test\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.clearAttachedAlertSound()}>\n Clear\n </rapid-button>\n `,\n )}\n </div>\n </div>\n`",
2050
+ "description": "Shared Attach/Replace/Test/Clear UI for rule and template dialogs.",
1989
2051
  "privacy": "public"
1990
- }
1991
- ],
1992
- "exports": [
1993
- {
1994
- "kind": "js",
1995
- "name": "FoundationNotificationDashboardStyles",
1996
- "declaration": {
1997
- "name": "FoundationNotificationDashboardStyles",
1998
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
1999
- }
2000
- }
2001
- ]
2002
- },
2003
- {
2004
- "kind": "javascript-module",
2005
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
2006
- "declarations": [
2052
+ },
2007
2053
  {
2008
- "kind": "class",
2009
- "description": "",
2010
- "name": "NotificationDashboardTab",
2054
+ "kind": "mixin",
2055
+ "description": "Mixin: pick / test / clear / load server sound + apply fields to submit payload.\n\nSubclasses must provide ruleService, isAlertSoundEditMode,\nalertSoundEntityId, and alertSoundCacheSyncMode.",
2056
+ "name": "AlertSoundAttachmentMixin",
2011
2057
  "members": [
2012
2058
  {
2013
2059
  "kind": "field",
2014
- "name": "id",
2060
+ "name": "ruleService",
2015
2061
  "type": {
2016
- "text": "string"
2062
+ "text": "RuleService"
2017
2063
  }
2018
2064
  },
2019
2065
  {
2020
2066
  "kind": "field",
2021
- "name": "name",
2067
+ "name": "isAlertSoundEditMode",
2022
2068
  "type": {
2023
- "text": "string"
2024
- }
2069
+ "text": "boolean"
2070
+ },
2071
+ "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
2072
+ "readonly": true
2025
2073
  },
2026
2074
  {
2027
2075
  "kind": "field",
2028
- "name": "component",
2076
+ "name": "alertSoundEntityId",
2077
+ "type": {
2078
+ "text": "string | null"
2079
+ },
2080
+ "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
2081
+ "readonly": true
2082
+ },
2083
+ {
2084
+ "kind": "field",
2085
+ "name": "alertSoundCacheSyncMode",
2086
+ "type": {
2087
+ "text": "'entity' | 'all'"
2088
+ },
2089
+ "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
2090
+ "readonly": true
2091
+ },
2092
+ {
2093
+ "kind": "field",
2094
+ "name": "alertSoundFileName",
2029
2095
  "type": {
2030
2096
  "text": "string"
2031
- }
2097
+ },
2098
+ "default": "''",
2099
+ "description": "Display name of the attached / pending alert sound file."
2032
2100
  },
2033
2101
  {
2034
2102
  "kind": "field",
2035
- "name": "right",
2103
+ "name": "alertSoundMimeType",
2036
2104
  "type": {
2037
2105
  "text": "string"
2038
- }
2039
- }
2040
- ]
2041
- },
2042
- {
2043
- "kind": "variable",
2044
- "name": "NOTIFICATION_DASHBOARD_TABS",
2045
- "type": {
2046
- "text": "NotificationDashboardTab[]"
2047
- },
2048
- "default": "[\n {\n id: 'rules',\n name: 'Rules',\n component: 'rule-management',\n right: 'NotificationRuleView',\n },\n {\n id: 'templates',\n name: 'Templates',\n component: 'template-management',\n right: 'NotificationRuleTemplateView',\n },\n {\n id: 'routes',\n name: 'Routes',\n component: 'route-management',\n right: 'NotificationRouteView',\n },\n /* TODO: Not needed at the moment\n {\n id: 'notify-audit',\n name: 'Notify Audit',\n component: 'notify-audit-management',\n right: 'NotificationAuditView',\n },\n */\n]"
2049
- }
2050
- ],
2051
- "exports": [
2052
- {
2053
- "kind": "js",
2054
- "name": "NotificationDashboardTab",
2055
- "declaration": {
2056
- "name": "NotificationDashboardTab",
2057
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2058
- }
2059
- },
2060
- {
2061
- "kind": "js",
2062
- "name": "NOTIFICATION_DASHBOARD_TABS",
2063
- "declaration": {
2064
- "name": "NOTIFICATION_DASHBOARD_TABS",
2065
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2066
- }
2067
- }
2068
- ]
2069
- },
2070
- {
2071
- "kind": "javascript-module",
2072
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
2073
- "declarations": [
2074
- {
2075
- "kind": "variable",
2076
- "name": "FoundationNotificationDashboardTemplate",
2077
- "default": "html<FoundationNotificationDashboard>`\n <div class=\"notification-dashboard\">\n ${whenElse(\n (x) => x.hasPermissions,\n html`\n <rapid-tabs class=\"tabs\">\n <!-- Tabs -->\n ${repeat(\n (_) => NOTIFICATION_DASHBOARD_TABS,\n html<NotificationDashboardTab>`\n ${when(\n (x, c) => (c.parent.auth as Auth).currentUser.hasPermission(x.right),\n html<NotificationDashboardTab>`\n <rapid-tab slot=\"${(x) => x.id}-tab\">${(x) => x.name}</rapid-tab>\n `,\n )}\n `,\n )}\n\n <!-- Panels -->\n ${repeat(\n (_) => NOTIFICATION_DASHBOARD_TABS,\n html<NotificationDashboardTab>`\n ${when(\n (x, c) => (c.parent.auth as Auth).currentUser.hasPermission(x.right),\n html`\n ${\n /* HTML Render */\n (x) => html<NotificationDashboardTab>`\n <rapid-tab-panel slot=\"${x.id}-tab\"\n id=\"${x.id}-tab-panel\">\n <${x.component}></${x.component}>\n </rapid-tab-panel>\n `\n }\n `,\n )}\n `,\n )}\n </rapid-tabs>\n `,\n html`\n <div class=\"no-permissions\">\n <label>User has no permissions to view Notification Screens</label>\n </div>\n `,\n )}\n </div>\n`"
2078
- }
2079
- ],
2080
- "exports": [
2081
- {
2082
- "kind": "js",
2083
- "name": "FoundationNotificationDashboardTemplate",
2084
- "declaration": {
2085
- "name": "FoundationNotificationDashboardTemplate",
2086
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
2087
- }
2088
- }
2089
- ]
2090
- },
2091
- {
2092
- "kind": "javascript-module",
2093
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
2094
- "declarations": [
2095
- {
2096
- "kind": "class",
2097
- "description": "",
2098
- "name": "FoundationNotificationDashboard",
2099
- "members": [
2106
+ },
2107
+ "default": "''"
2108
+ },
2100
2109
  {
2101
2110
  "kind": "field",
2102
- "name": "auth",
2111
+ "name": "hasAlertSound",
2103
2112
  "type": {
2104
- "text": "Auth"
2113
+ "text": "boolean"
2114
+ },
2115
+ "default": "false",
2116
+ "description": "True when edit loaded an existing server sound (or user attached one)."
2117
+ },
2118
+ {
2119
+ "kind": "field",
2120
+ "name": "fileInput",
2121
+ "type": {
2122
+ "text": "HTMLInputElement"
2105
2123
  }
2106
2124
  },
2107
2125
  {
2108
2126
  "kind": "field",
2109
- "name": "ready",
2127
+ "name": "pendingAlertSoundData",
2128
+ "type": {
2129
+ "text": "string | null"
2130
+ },
2131
+ "default": "null"
2132
+ },
2133
+ {
2134
+ "kind": "field",
2135
+ "name": "alertSoundDirty",
2110
2136
  "type": {
2111
2137
  "text": "boolean"
2112
2138
  },
2113
- "default": "false"
2139
+ "default": "false",
2140
+ "description": "True when the user picked a new file this session (needs upload)."
2114
2141
  },
2115
2142
  {
2116
2143
  "kind": "field",
2117
- "name": "hasPermissions",
2144
+ "name": "clearAlertSound",
2118
2145
  "type": {
2119
2146
  "text": "boolean"
2120
2147
  },
2121
- "default": "true"
2122
- }
2123
- ],
2124
- "superclass": {
2125
- "name": "GenesisElement",
2126
- "package": "@genesislcap/web-core"
2127
- },
2128
- "tagName": "foundation-notification-dashboard",
2129
- "customElement": true
2130
- }
2131
- ],
2148
+ "default": "false"
2149
+ },
2150
+ {
2151
+ "kind": "field",
2152
+ "name": "testAudio",
2153
+ "type": {
2154
+ "text": "HTMLAudioElement | null"
2155
+ },
2156
+ "default": "null",
2157
+ "description": "In-progress Test playback; not private — mixin return type is exported."
2158
+ },
2159
+ {
2160
+ "kind": "method",
2161
+ "name": "loadExistingAlertSound",
2162
+ "parameters": [
2163
+ {
2164
+ "name": "dynamicRuleId",
2165
+ "type": {
2166
+ "text": "string"
2167
+ }
2168
+ }
2169
+ ]
2170
+ },
2171
+ {
2172
+ "kind": "method",
2173
+ "name": "openAlertSoundPicker"
2174
+ },
2175
+ {
2176
+ "kind": "method",
2177
+ "name": "onAlertSoundSelected",
2178
+ "parameters": [
2179
+ {
2180
+ "name": "event",
2181
+ "type": {
2182
+ "text": "Event"
2183
+ }
2184
+ }
2185
+ ]
2186
+ },
2187
+ {
2188
+ "kind": "method",
2189
+ "name": "clearAttachedAlertSound"
2190
+ },
2191
+ {
2192
+ "kind": "method",
2193
+ "name": "testAttachedAlertSound"
2194
+ },
2195
+ {
2196
+ "kind": "method",
2197
+ "name": "stopTestSound"
2198
+ },
2199
+ {
2200
+ "kind": "method",
2201
+ "name": "resetAlertSoundState"
2202
+ },
2203
+ {
2204
+ "kind": "method",
2205
+ "name": "applyAlertSoundToPayload",
2206
+ "return": {
2207
+ "type": {
2208
+ "text": "T"
2209
+ }
2210
+ },
2211
+ "parameters": [
2212
+ {
2213
+ "name": "target",
2214
+ "type": {
2215
+ "text": "T"
2216
+ }
2217
+ }
2218
+ ],
2219
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
2220
+ },
2221
+ {
2222
+ "kind": "method",
2223
+ "name": "syncAlertSoundCacheAfterSave",
2224
+ "description": "Keep AlertSoundPlayer's in-memory NOTIFY_ALERT_SOUND cache in sync with\nwhat we just saved — otherwise the next alert still plays the old file."
2225
+ }
2226
+ ],
2227
+ "parameters": [
2228
+ {
2229
+ "name": "Base",
2230
+ "type": {
2231
+ "text": "TBase"
2232
+ }
2233
+ }
2234
+ ],
2235
+ "privacy": "public"
2236
+ }
2237
+ ],
2238
+ "exports": [
2239
+ {
2240
+ "kind": "js",
2241
+ "name": "alertSoundAttachmentTemplate",
2242
+ "declaration": {
2243
+ "name": "alertSoundAttachmentTemplate",
2244
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2245
+ }
2246
+ },
2247
+ {
2248
+ "kind": "js",
2249
+ "name": "AlertSoundAttachmentMixin",
2250
+ "declaration": {
2251
+ "name": "AlertSoundAttachmentMixin",
2252
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2253
+ }
2254
+ }
2255
+ ]
2256
+ },
2257
+ {
2258
+ "kind": "javascript-module",
2259
+ "path": "src/components/foundation-notification-dashboard/index.ts",
2260
+ "declarations": [],
2261
+ "exports": [
2262
+ {
2263
+ "kind": "js",
2264
+ "name": "*",
2265
+ "declaration": {
2266
+ "name": "*",
2267
+ "package": "./notification-dashboard"
2268
+ }
2269
+ }
2270
+ ]
2271
+ },
2272
+ {
2273
+ "kind": "javascript-module",
2274
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
2275
+ "declarations": [
2276
+ {
2277
+ "kind": "variable",
2278
+ "name": "FoundationNotificationDashboardStyles",
2279
+ "default": "css`\n .notification-dashboard,\n rapid-tabs,\n rapid-tab-panel {\n height: 100%;\n }\n\n .no-permissions {\n font-family: var(--body-font);\n color: var(--neutral-foreground-rest);\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n`",
2280
+ "privacy": "public"
2281
+ }
2282
+ ],
2283
+ "exports": [
2284
+ {
2285
+ "kind": "js",
2286
+ "name": "FoundationNotificationDashboardStyles",
2287
+ "declaration": {
2288
+ "name": "FoundationNotificationDashboardStyles",
2289
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
2290
+ }
2291
+ }
2292
+ ]
2293
+ },
2294
+ {
2295
+ "kind": "javascript-module",
2296
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
2297
+ "declarations": [
2298
+ {
2299
+ "kind": "class",
2300
+ "description": "",
2301
+ "name": "NotificationDashboardTab",
2302
+ "members": [
2303
+ {
2304
+ "kind": "field",
2305
+ "name": "id",
2306
+ "type": {
2307
+ "text": "string"
2308
+ }
2309
+ },
2310
+ {
2311
+ "kind": "field",
2312
+ "name": "name",
2313
+ "type": {
2314
+ "text": "string"
2315
+ }
2316
+ },
2317
+ {
2318
+ "kind": "field",
2319
+ "name": "component",
2320
+ "type": {
2321
+ "text": "string"
2322
+ }
2323
+ },
2324
+ {
2325
+ "kind": "field",
2326
+ "name": "right",
2327
+ "type": {
2328
+ "text": "string"
2329
+ }
2330
+ }
2331
+ ]
2332
+ },
2333
+ {
2334
+ "kind": "variable",
2335
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2336
+ "type": {
2337
+ "text": "NotificationDashboardTab[]"
2338
+ },
2339
+ "default": "[\n {\n id: 'rules',\n name: 'Rules',\n component: 'rule-management',\n right: 'NotificationRuleView',\n },\n {\n id: 'templates',\n name: 'Templates',\n component: 'template-management',\n right: 'NotificationRuleTemplateView',\n },\n {\n id: 'routes',\n name: 'Routes',\n component: 'route-management',\n right: 'NotificationRouteView',\n },\n /* TODO: Not needed at the moment\n {\n id: 'notify-audit',\n name: 'Notify Audit',\n component: 'notify-audit-management',\n right: 'NotificationAuditView',\n },\n */\n]"
2340
+ }
2341
+ ],
2342
+ "exports": [
2343
+ {
2344
+ "kind": "js",
2345
+ "name": "NotificationDashboardTab",
2346
+ "declaration": {
2347
+ "name": "NotificationDashboardTab",
2348
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2349
+ }
2350
+ },
2351
+ {
2352
+ "kind": "js",
2353
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2354
+ "declaration": {
2355
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2356
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2357
+ }
2358
+ }
2359
+ ]
2360
+ },
2361
+ {
2362
+ "kind": "javascript-module",
2363
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
2364
+ "declarations": [
2365
+ {
2366
+ "kind": "variable",
2367
+ "name": "FoundationNotificationDashboardTemplate",
2368
+ "default": "html<FoundationNotificationDashboard>`\n <div class=\"notification-dashboard\">\n ${whenElse(\n (x) => x.hasPermissions,\n html`\n <rapid-tabs class=\"tabs\">\n <!-- Tabs -->\n ${repeat(\n (_) => NOTIFICATION_DASHBOARD_TABS,\n html<NotificationDashboardTab>`\n ${when(\n (x, c) => (c.parent.auth as Auth).currentUser.hasPermission(x.right),\n html<NotificationDashboardTab>`\n <rapid-tab slot=\"${(x) => x.id}-tab\">${(x) => x.name}</rapid-tab>\n `,\n )}\n `,\n )}\n\n <!-- Panels -->\n ${repeat(\n (_) => NOTIFICATION_DASHBOARD_TABS,\n html<NotificationDashboardTab>`\n ${when(\n (x, c) => (c.parent.auth as Auth).currentUser.hasPermission(x.right),\n html`\n ${\n /* HTML Render */\n (x) => html<NotificationDashboardTab>`\n <rapid-tab-panel slot=\"${x.id}-tab\"\n id=\"${x.id}-tab-panel\">\n <${x.component}></${x.component}>\n </rapid-tab-panel>\n `\n }\n `,\n )}\n `,\n )}\n </rapid-tabs>\n `,\n html`\n <div class=\"no-permissions\">\n <label>User has no permissions to view Notification Screens</label>\n </div>\n `,\n )}\n </div>\n`"
2369
+ }
2370
+ ],
2371
+ "exports": [
2372
+ {
2373
+ "kind": "js",
2374
+ "name": "FoundationNotificationDashboardTemplate",
2375
+ "declaration": {
2376
+ "name": "FoundationNotificationDashboardTemplate",
2377
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
2378
+ }
2379
+ }
2380
+ ]
2381
+ },
2382
+ {
2383
+ "kind": "javascript-module",
2384
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
2385
+ "declarations": [
2386
+ {
2387
+ "kind": "class",
2388
+ "description": "",
2389
+ "name": "FoundationNotificationDashboard",
2390
+ "members": [
2391
+ {
2392
+ "kind": "field",
2393
+ "name": "auth",
2394
+ "type": {
2395
+ "text": "Auth"
2396
+ }
2397
+ },
2398
+ {
2399
+ "kind": "field",
2400
+ "name": "ready",
2401
+ "type": {
2402
+ "text": "boolean"
2403
+ },
2404
+ "default": "false"
2405
+ },
2406
+ {
2407
+ "kind": "field",
2408
+ "name": "hasPermissions",
2409
+ "type": {
2410
+ "text": "boolean"
2411
+ },
2412
+ "default": "true"
2413
+ }
2414
+ ],
2415
+ "superclass": {
2416
+ "name": "GenesisElement",
2417
+ "package": "@genesislcap/web-core"
2418
+ },
2419
+ "tagName": "foundation-notification-dashboard",
2420
+ "customElement": true
2421
+ }
2422
+ ],
2132
2423
  "exports": [
2133
2424
  {
2134
2425
  "kind": "js",
@@ -2555,15 +2846,645 @@
2555
2846
  },
2556
2847
  {
2557
2848
  "kind": "javascript-module",
2558
- "path": "src/components/foundation-inbox/inbox-base/inbox-base.ts",
2849
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2559
2850
  "declarations": [
2560
2851
  {
2561
- "kind": "class",
2562
- "description": "",
2563
- "name": "FoundationInboxBase",
2564
- "members": [
2565
- {
2566
- "kind": "field",
2852
+ "kind": "variable",
2853
+ "name": "FoundationSoundsPanelStyles",
2854
+ "default": "css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n width: 100%;\n }\n\n .sounds-controls {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n gap: 12px;\n padding: calc(var(--design-unit) * 3px);\n box-sizing: border-box;\n }\n\n .sounds-help-disclosure {\n flex: 0 0 auto;\n }\n\n .sounds-help-toggle {\n margin-inline-start: calc(var(--design-unit) * 1px);\n }\n\n .sounds-help-toggle::before {\n content: '+';\n }\n\n .sounds-help-disclosure[expanded] .sounds-help-toggle::before {\n content: '−';\n }\n\n .sounds-help {\n margin: 0;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n text-align: left;\n }\n\n .volume-row {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: calc(var(--design-unit) * 2px);\n min-width: 0;\n }\n\n .volume-icon {\n flex: 0 0 auto;\n }\n\n .volume-label {\n flex: 0 0 auto;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .volume-slider {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .volume-percent {\n flex: 0 0 auto;\n min-width: 3ch;\n text-align: end;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .mute-all {\n flex: 0 0 auto;\n margin: 0;\n }\n\n .sound-rules-panel {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n }\n\n .sound-rules {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .sound-rule {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n\n /* Keep absolute listboxes from being clipped by the card itself. */\n overflow: visible;\n }\n\n .sound-rule-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-weight: 700;\n font-size: var(--type-ramp-minus-1-font-size);\n }\n\n .sound-rule-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .sound-rule-label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .pattern-input,\n .match-mode-select,\n .rule-select,\n .sound-file-input {\n width: 100%;\n }\n\n /*\n * Anchor the listbox to the select host and use position:fixed so it escapes\n * .sound-rules-panel overflow:auto (and the rule card). Each select sets a\n * unique --sounds-select-anchor / anchor-name via inline style.\n * !important beats FAST's internal absolute top/bottom for [open] selects.\n */\n .match-mode-select[open]::part(listbox),\n .rule-select[open]::part(listbox) {\n position: fixed !important;\n /* stylelint-disable-next-line property-no-unknown -- CSS anchor positioning */\n position-anchor: var(--sounds-select-anchor);\n inset: auto !important;\n top: anchor(bottom) !important;\n left: anchor(left) !important;\n right: anchor(right) !important;\n bottom: auto !important;\n width: auto !important;\n margin-top: calc(var(--design-unit) * 1px);\n z-index: 10000;\n max-height: min(240px, 40vh);\n overflow-x: hidden;\n overflow-y: auto;\n box-shadow: 0 4px 16px rgb(0 0 0 / 24%);\n }\n\n .match-mode-select[open][position='above']::part(listbox),\n .rule-select[open][position='above']::part(listbox) {\n top: auto !important;\n bottom: anchor(top) !important;\n margin-top: 0;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .sound-file-row {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .sound-file-row .sound-file-input {\n flex: 1;\n min-width: 0;\n }\n\n .choose-sound {\n cursor: pointer;\n }\n\n .sound-rules-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex: 0 0 auto;\n gap: 8px;\n }\n\n .rule-count {\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .file-input {\n display: none;\n }\n\n ${scrollbarStyles}\n`"
2855
+ }
2856
+ ],
2857
+ "exports": [
2858
+ {
2859
+ "kind": "js",
2860
+ "name": "FoundationSoundsPanelStyles",
2861
+ "declaration": {
2862
+ "name": "FoundationSoundsPanelStyles",
2863
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
2864
+ }
2865
+ }
2866
+ ]
2867
+ },
2868
+ {
2869
+ "kind": "javascript-module",
2870
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
2871
+ "declarations": [
2872
+ {
2873
+ "kind": "variable",
2874
+ "name": "FoundationSoundsPanelTemplate",
2875
+ "default": "html<FoundationSoundsPanel>`\n <div class=\"sounds-controls\" part=\"controls\">\n <input\n ${ref('fileInput')}\n class=\"file-input\"\n type=\"file\"\n accept=\"audio/*\"\n @change=${(x, c) => x.onFileSelected(c.event)}\n />\n <rapid-disclosure class=\"sounds-help-disclosure\" appearance=\"lightweight\">\n <span slot=\"title\">\n Sound Alerts Information\n <span class=\"sounds-help-toggle\" aria-hidden=\"true\"></span>\n </span>\n <p class=\"sounds-help\">\n Add up to ${(x) => x.maxRules} sounds.\n <br />\n Match text in MESSAGE or HEADER (a word or phrase), or a notification rule (including rules\n created when you subscribe to a template).\n <br />\n The first matching rule is played.\n </p>\n </rapid-disclosure>\n <div class=\"volume-row\">\n <rapid-icon\n class=\"volume-icon\"\n name=${(x) => (x.muted || x.volumePercent === 0 ? 'volume-xmark' : 'volume-high')}\n ></rapid-icon>\n <span class=\"volume-label\">Volume</span>\n <rapid-slider\n class=\"volume-slider\"\n min=\"0\"\n max=\"100\"\n step=\"1\"\n :value=${(x) => String(x.volumePercent)}\n @change=${(x, c) => x.onVolumeChange(c.event)}\n ></rapid-slider>\n <span class=\"volume-percent\">${(x) => `${x.volumePercent}%`}</span>\n <rapid-button\n class=\"mute-all\"\n appearance=\"lightweight\"\n title=${(x) => (x.muted ? 'Unmute alert sounds' : 'Mute all alert sounds')}\n @click=${(x) => x.toggleMute()}\n >\n ${(x) => (x.muted ? 'Unmute' : 'Mute all')}\n </rapid-button>\n </div>\n <div class=\"sound-rules-panel\">\n <div class=\"sound-rules\">\n ${repeat(\n (x) => x.rules,\n html<AlertSoundRuleView, FoundationSoundsPanel>`\n <div class=\"sound-rule\" data-rule-index=${(x) => x.index}>\n <div class=\"sound-rule-header\">\n <span>Rule ${(x) => x.index + 1}</span>\n <div class=\"sound-rule-actions\">\n <rapid-button\n class=\"mute-rule\"\n appearance=\"stealth\"\n title=${(x) => (x.muted ? 'Unmute this rule' : 'Mute this rule')}\n @click=${(x, c) => c.parent.toggleRuleMute(x.index)}\n >\n <rapid-icon\n name=${(x) => (x.muted ? 'volume-xmark' : 'volume-high')}\n ></rapid-icon>\n </rapid-button>\n <rapid-button\n class=\"remove-rule\"\n appearance=\"stealth\"\n title=${(_, c) => (c.parent.canRemoveRule ? 'Remove rule' : 'Reset rule')}\n @click=${(x, c) => c.parent.removeRule(x.index)}\n >\n <rapid-icon name=\"trash\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n <label class=\"sound-rule-label\">\n Match by\n <rapid-select\n class=\"match-mode-select\"\n style=${(x) =>\n `anchor-name: --sound-match-${x.index}; --sounds-select-anchor: --sound-match-${x.index}`}\n :value=${(x) => x.matchMode}\n @change=${(x, c) => c.parent.onMatchModeChange(x.index, c.event)}\n >\n <rapid-option value=\"message\">MESSAGE text</rapid-option>\n <rapid-option value=\"header\">HEADER text</rapid-option>\n <rapid-option value=\"rule\">Notification rule</rapid-option>\n </rapid-select>\n </label>\n <label\n class=\"sound-rule-label\"\n style=${(x) => (x.matchMode === 'rule' ? 'display: none;' : '')}\n >\n ${(x) => (x.matchMode === 'header' ? 'HEADER text' : 'MESSAGE text')}\n <rapid-text-field\n class=\"pattern-input\"\n placeholder=${(x) =>\n x.matchMode === 'header' ? 'e.g. Price alert' : 'e.g. limit breached'}\n :value=${(x) => x.pattern}\n @input=${(x, c) => c.parent.onPatternInput(x.index, c.event)}\n ></rapid-text-field>\n </label>\n <label\n class=\"sound-rule-label\"\n style=${(x) => (x.matchMode === 'rule' ? '' : 'display: none;')}\n >\n Notification rule\n <rapid-select\n class=\"rule-select\"\n style=${(x) =>\n `anchor-name: --sound-rule-${x.index}; --sounds-select-anchor: --sound-rule-${x.index}`}\n :value=${(x) => x.templateId ?? ''}\n @change=${(x, c) => c.parent.onRuleChange(x.index, c.event)}\n >\n <options-datasource\n value-field=\"id\"\n label-field=\"name\"\n option-element=\"rapid-option\"\n :data=${(_, c) => c.parent.ruleSelectOptions}\n ></options-datasource>\n </rapid-select>\n </label>\n <label class=\"sound-rule-label\">\n Sound file\n <div class=\"sound-file-row\">\n <rapid-text-field\n class=\"sound-file-input\"\n readonly\n placeholder=\"No sound selected\"\n :value=${(x) => x.fileName ?? ''}\n title=${(x) => x.fileName ?? 'No sound selected'}\n >\n <rapid-icon\n slot=\"end\"\n class=\"choose-sound\"\n name=\"folder-open\"\n title=\"Choose alert sound\"\n @click=${(x, c) => {\n c.event.stopPropagation();\n return c.parent.openFilePicker(x.index);\n }}\n ></rapid-icon>\n </rapid-text-field>\n <rapid-button\n class=\"test-sound\"\n appearance=\"stealth\"\n title=\"Test play this sound\"\n ?disabled=${(x) => !x.hasSound}\n @click=${(x, c) => c.parent.testSound(x.index)}\n >\n <rapid-icon name=\"play\"></rapid-icon>\n </rapid-button>\n <rapid-button\n class=\"clear-sound\"\n appearance=\"stealth\"\n title=\"Clear sound file\"\n ?disabled=${(x) => !x.hasSound}\n @click=${(x, c) => c.parent.clearSound(x.index)}\n >\n <rapid-icon name=\"times\"></rapid-icon>\n </rapid-button>\n </div>\n </label>\n </div>\n `,\n )}\n </div>\n </div>\n <div class=\"sound-rules-footer\">\n <rapid-button\n class=\"add-rule\"\n appearance=\"lightweight\"\n title=\"Add sound rule\"\n ?disabled=${(x) => !x.canAddRule}\n @click=${(x) => x.addRule()}\n >\n <rapid-icon name=\"plus\"></rapid-icon>\n Add rule\n </rapid-button>\n <span class=\"rule-count\">${(x) => `${x.rules.length} / ${x.maxRules}`}</span>\n </div>\n </div>\n`"
2876
+ }
2877
+ ],
2878
+ "exports": [
2879
+ {
2880
+ "kind": "js",
2881
+ "name": "FoundationSoundsPanelTemplate",
2882
+ "declaration": {
2883
+ "name": "FoundationSoundsPanelTemplate",
2884
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
2885
+ }
2886
+ }
2887
+ ]
2888
+ },
2889
+ {
2890
+ "kind": "javascript-module",
2891
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
2892
+ "declarations": [
2893
+ {
2894
+ "kind": "class",
2895
+ "description": "Configures alert sound rules in the inbox Sounds tab. Persists via the shared\nAlertSoundPlayer; playback is handled by layout-mounted\nFoundationSounds.",
2896
+ "name": "FoundationSoundsPanel",
2897
+ "members": [
2898
+ {
2899
+ "kind": "field",
2900
+ "name": "ruleService",
2901
+ "type": {
2902
+ "text": "RuleService"
2903
+ }
2904
+ },
2905
+ {
2906
+ "kind": "field",
2907
+ "name": "volumePercent",
2908
+ "type": {
2909
+ "text": "number"
2910
+ },
2911
+ "default": "100",
2912
+ "description": "Global playback volume 0–100. @internal"
2913
+ },
2914
+ {
2915
+ "kind": "field",
2916
+ "name": "selectableRules",
2917
+ "type": {
2918
+ "text": "AlertSoundSelectableRule[]"
2919
+ },
2920
+ "default": "[]",
2921
+ "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
2922
+ },
2923
+ {
2924
+ "kind": "field",
2925
+ "name": "fileInput",
2926
+ "type": {
2927
+ "text": "HTMLInputElement"
2928
+ }
2929
+ },
2930
+ {
2931
+ "kind": "field",
2932
+ "name": "pendingRuleIndex",
2933
+ "type": {
2934
+ "text": "number | null"
2935
+ },
2936
+ "privacy": "private",
2937
+ "default": "null"
2938
+ },
2939
+ {
2940
+ "kind": "field",
2941
+ "name": "player",
2942
+ "privacy": "private",
2943
+ "readonly": true
2944
+ },
2945
+ {
2946
+ "kind": "field",
2947
+ "name": "unsubscribePlayer",
2948
+ "type": {
2949
+ "text": "(() => void) | undefined"
2950
+ },
2951
+ "privacy": "private"
2952
+ },
2953
+ {
2954
+ "kind": "field",
2955
+ "name": "ignoreSelectChanges",
2956
+ "type": {
2957
+ "text": "boolean"
2958
+ },
2959
+ "privacy": "private",
2960
+ "default": "false",
2961
+ "description": "Suppresses select change events while options are rebuilt."
2962
+ },
2963
+ {
2964
+ "kind": "method",
2965
+ "name": "onMatchModeChange",
2966
+ "return": {
2967
+ "type": {
2968
+ "text": "boolean"
2969
+ }
2970
+ },
2971
+ "parameters": [
2972
+ {
2973
+ "name": "index",
2974
+ "type": {
2975
+ "text": "number"
2976
+ }
2977
+ },
2978
+ {
2979
+ "name": "event",
2980
+ "type": {
2981
+ "text": "Event"
2982
+ }
2983
+ }
2984
+ ]
2985
+ },
2986
+ {
2987
+ "kind": "method",
2988
+ "name": "onPatternInput",
2989
+ "return": {
2990
+ "type": {
2991
+ "text": "boolean"
2992
+ }
2993
+ },
2994
+ "parameters": [
2995
+ {
2996
+ "name": "index",
2997
+ "type": {
2998
+ "text": "number"
2999
+ }
3000
+ },
3001
+ {
3002
+ "name": "event",
3003
+ "type": {
3004
+ "text": "Event"
3005
+ }
3006
+ }
3007
+ ]
3008
+ },
3009
+ {
3010
+ "kind": "method",
3011
+ "name": "onRuleChange",
3012
+ "return": {
3013
+ "type": {
3014
+ "text": "boolean"
3015
+ }
3016
+ },
3017
+ "parameters": [
3018
+ {
3019
+ "name": "index",
3020
+ "type": {
3021
+ "text": "number"
3022
+ }
3023
+ },
3024
+ {
3025
+ "name": "event",
3026
+ "type": {
3027
+ "text": "Event"
3028
+ }
3029
+ }
3030
+ ]
3031
+ },
3032
+ {
3033
+ "kind": "method",
3034
+ "name": "openFilePicker",
3035
+ "return": {
3036
+ "type": {
3037
+ "text": "boolean"
3038
+ }
3039
+ },
3040
+ "parameters": [
3041
+ {
3042
+ "name": "index",
3043
+ "type": {
3044
+ "text": "number"
3045
+ }
3046
+ }
3047
+ ]
3048
+ },
3049
+ {
3050
+ "kind": "method",
3051
+ "name": "onFileSelected",
3052
+ "return": {
3053
+ "type": {
3054
+ "text": "boolean"
3055
+ }
3056
+ },
3057
+ "parameters": [
3058
+ {
3059
+ "name": "event",
3060
+ "type": {
3061
+ "text": "Event"
3062
+ }
3063
+ }
3064
+ ]
3065
+ },
3066
+ {
3067
+ "kind": "method",
3068
+ "name": "clearSound",
3069
+ "return": {
3070
+ "type": {
3071
+ "text": "boolean"
3072
+ }
3073
+ },
3074
+ "parameters": [
3075
+ {
3076
+ "name": "index",
3077
+ "type": {
3078
+ "text": "number"
3079
+ }
3080
+ }
3081
+ ]
3082
+ },
3083
+ {
3084
+ "kind": "method",
3085
+ "name": "testSound",
3086
+ "return": {
3087
+ "type": {
3088
+ "text": "boolean"
3089
+ }
3090
+ },
3091
+ "parameters": [
3092
+ {
3093
+ "name": "index",
3094
+ "type": {
3095
+ "text": "number"
3096
+ }
3097
+ }
3098
+ ]
3099
+ },
3100
+ {
3101
+ "kind": "method",
3102
+ "name": "toggleRuleMute",
3103
+ "return": {
3104
+ "type": {
3105
+ "text": "boolean"
3106
+ }
3107
+ },
3108
+ "parameters": [
3109
+ {
3110
+ "name": "index",
3111
+ "type": {
3112
+ "text": "number"
3113
+ }
3114
+ }
3115
+ ]
3116
+ },
3117
+ {
3118
+ "kind": "method",
3119
+ "name": "onVolumeChange",
3120
+ "return": {
3121
+ "type": {
3122
+ "text": "boolean"
3123
+ }
3124
+ },
3125
+ "parameters": [
3126
+ {
3127
+ "name": "event",
3128
+ "type": {
3129
+ "text": "Event"
3130
+ }
3131
+ }
3132
+ ]
3133
+ },
3134
+ {
3135
+ "kind": "method",
3136
+ "name": "toggleMute",
3137
+ "return": {
3138
+ "type": {
3139
+ "text": "boolean"
3140
+ }
3141
+ }
3142
+ },
3143
+ {
3144
+ "kind": "method",
3145
+ "name": "addRule",
3146
+ "return": {
3147
+ "type": {
3148
+ "text": "boolean"
3149
+ }
3150
+ }
3151
+ },
3152
+ {
3153
+ "kind": "method",
3154
+ "name": "removeRule",
3155
+ "return": {
3156
+ "type": {
3157
+ "text": "boolean"
3158
+ }
3159
+ },
3160
+ "parameters": [
3161
+ {
3162
+ "name": "index",
3163
+ "type": {
3164
+ "text": "number"
3165
+ }
3166
+ }
3167
+ ]
3168
+ },
3169
+ {
3170
+ "kind": "method",
3171
+ "name": "reloadRules",
3172
+ "return": {
3173
+ "type": {
3174
+ "text": "Promise<void>"
3175
+ }
3176
+ },
3177
+ "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
3178
+ },
3179
+ {
3180
+ "kind": "method",
3181
+ "name": "loadRules",
3182
+ "privacy": "private",
3183
+ "return": {
3184
+ "type": {
3185
+ "text": "Promise<void>"
3186
+ }
3187
+ }
3188
+ },
3189
+ {
3190
+ "kind": "method",
3191
+ "name": "settleRuleOptions",
3192
+ "privacy": "private",
3193
+ "return": {
3194
+ "type": {
3195
+ "text": "Promise<void>"
3196
+ }
3197
+ },
3198
+ "description": "Suppresses select `change` events only while options-datasource rebuilds\nthe DOM — not for the `getRules()` round trip itself, so a user picking a\nrule while a request is in flight isn't silently dropped."
3199
+ },
3200
+ {
3201
+ "kind": "method",
3202
+ "name": "applyRuleSelectValues",
3203
+ "privacy": "private",
3204
+ "return": {
3205
+ "type": {
3206
+ "text": "void"
3207
+ }
3208
+ },
3209
+ "description": "Re-applies persisted template ids onto `.rule-select` hosts after\noptions-datasource has rebuilt its options. We deliberately do *not* bind\n`:initialSelectedValue` to templateId: that path compares the option label\nagainst Select.value (the option id), always mismatches, clearData()'s the\nselect, and leaves the next pick stuck on \"Select a rule...\"."
3210
+ },
3211
+ {
3212
+ "kind": "method",
3213
+ "name": "mapRules",
3214
+ "privacy": "private",
3215
+ "return": {
3216
+ "type": {
3217
+ "text": "AlertSoundSelectableRule[]"
3218
+ }
3219
+ },
3220
+ "parameters": [
3221
+ {
3222
+ "name": "ruleList",
3223
+ "type": {
3224
+ "text": "NamedRuleRow[]"
3225
+ }
3226
+ }
3227
+ ]
3228
+ },
3229
+ {
3230
+ "kind": "method",
3231
+ "name": "ruleMatchId",
3232
+ "privacy": "private",
3233
+ "return": {
3234
+ "type": {
3235
+ "text": "string"
3236
+ }
3237
+ },
3238
+ "parameters": [
3239
+ {
3240
+ "name": "rule",
3241
+ "type": {
3242
+ "text": "NamedRuleRow | undefined"
3243
+ }
3244
+ }
3245
+ ]
3246
+ },
3247
+ {
3248
+ "kind": "method",
3249
+ "name": "syncSoundState",
3250
+ "privacy": "private"
3251
+ }
3252
+ ],
3253
+ "superclass": {
3254
+ "name": "GenesisElement",
3255
+ "package": "@genesislcap/web-core"
3256
+ },
3257
+ "tagName": "foundation-sounds-panel",
3258
+ "customElement": true
3259
+ }
3260
+ ],
3261
+ "exports": [
3262
+ {
3263
+ "kind": "js",
3264
+ "name": "FoundationSoundsPanel",
3265
+ "declaration": {
3266
+ "name": "FoundationSoundsPanel",
3267
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3268
+ }
3269
+ },
3270
+ {
3271
+ "kind": "custom-element-definition",
3272
+ "name": "foundation-sounds-panel",
3273
+ "declaration": {
3274
+ "name": "FoundationSoundsPanel",
3275
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3276
+ }
3277
+ }
3278
+ ]
3279
+ },
3280
+ {
3281
+ "kind": "javascript-module",
3282
+ "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
3283
+ "declarations": [
3284
+ {
3285
+ "kind": "variable",
3286
+ "name": "FoundationSoundsStyles",
3287
+ "default": "css`\n :host {\n display: none;\n }\n`",
3288
+ "description": "Headless layout listener — take no space in the layout chrome."
3289
+ }
3290
+ ],
3291
+ "exports": [
3292
+ {
3293
+ "kind": "js",
3294
+ "name": "FoundationSoundsStyles",
3295
+ "declaration": {
3296
+ "name": "FoundationSoundsStyles",
3297
+ "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
3298
+ }
3299
+ }
3300
+ ]
3301
+ },
3302
+ {
3303
+ "kind": "javascript-module",
3304
+ "path": "src/components/foundation-sounds/foundation-sounds.ts",
3305
+ "declarations": [
3306
+ {
3307
+ "kind": "class",
3308
+ "description": "Headless listener for inbox alert inserts. Plays configured sounds via the\nshared AlertSoundPlayer. Mount once in the app layout.\n\nConfigure rules in the inbox Sounds tab with FoundationSoundsPanel.",
3309
+ "name": "FoundationSounds",
3310
+ "members": [
3311
+ {
3312
+ "kind": "field",
3313
+ "name": "connect",
3314
+ "type": {
3315
+ "text": "Connect"
3316
+ }
3317
+ },
3318
+ {
3319
+ "kind": "field",
3320
+ "name": "inboxService",
3321
+ "type": {
3322
+ "text": "FoundationInboxService"
3323
+ }
3324
+ },
3325
+ {
3326
+ "kind": "field",
3327
+ "name": "ruleService",
3328
+ "type": {
3329
+ "text": "RuleService"
3330
+ }
3331
+ },
3332
+ {
3333
+ "kind": "field",
3334
+ "name": "soundEnabled",
3335
+ "type": {
3336
+ "text": "boolean"
3337
+ },
3338
+ "default": "true",
3339
+ "description": "When false, new audible alerts are tracked but do not play."
3340
+ },
3341
+ {
3342
+ "kind": "field",
3343
+ "name": "connectionSub",
3344
+ "type": {
3345
+ "text": "Subscription | undefined"
3346
+ },
3347
+ "privacy": "private"
3348
+ },
3349
+ {
3350
+ "kind": "field",
3351
+ "name": "player",
3352
+ "privacy": "private",
3353
+ "readonly": true
3354
+ },
3355
+ {
3356
+ "kind": "field",
3357
+ "name": "knownAlertIds",
3358
+ "privacy": "private",
3359
+ "default": "new Set<string>()"
3360
+ },
3361
+ {
3362
+ "kind": "field",
3363
+ "name": "serverSoundFetches",
3364
+ "privacy": "private",
3365
+ "readonly": true,
3366
+ "default": "new Map<string, Promise<boolean>>()",
3367
+ "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
3368
+ },
3369
+ {
3370
+ "kind": "method",
3371
+ "name": "subscribeToAlerts",
3372
+ "privacy": "private",
3373
+ "return": {
3374
+ "type": {
3375
+ "text": "void"
3376
+ }
3377
+ }
3378
+ },
3379
+ {
3380
+ "kind": "field",
3381
+ "name": "subscriptionHandler",
3382
+ "privacy": "private"
3383
+ },
3384
+ {
3385
+ "kind": "method",
3386
+ "name": "playForNewAlerts",
3387
+ "privacy": "private",
3388
+ "return": {
3389
+ "type": {
3390
+ "text": "Promise<void>"
3391
+ }
3392
+ },
3393
+ "parameters": [
3394
+ {
3395
+ "name": "rows",
3396
+ "type": {
3397
+ "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
3398
+ }
3399
+ }
3400
+ ]
3401
+ },
3402
+ {
3403
+ "kind": "method",
3404
+ "name": "tryPlayServerSound",
3405
+ "privacy": "private",
3406
+ "return": {
3407
+ "type": {
3408
+ "text": "Promise<boolean>"
3409
+ }
3410
+ },
3411
+ "parameters": [
3412
+ {
3413
+ "name": "dynamicRuleId",
3414
+ "type": {
3415
+ "text": "string"
3416
+ }
3417
+ }
3418
+ ]
3419
+ },
3420
+ {
3421
+ "kind": "method",
3422
+ "name": "fetchAndCacheServerSound",
3423
+ "privacy": "private",
3424
+ "return": {
3425
+ "type": {
3426
+ "text": "Promise<boolean>"
3427
+ }
3428
+ },
3429
+ "parameters": [
3430
+ {
3431
+ "name": "dynamicRuleId",
3432
+ "type": {
3433
+ "text": "string"
3434
+ }
3435
+ }
3436
+ ]
3437
+ }
3438
+ ],
3439
+ "attributes": [
3440
+ {
3441
+ "name": "sound-enabled",
3442
+ "type": {
3443
+ "text": "boolean"
3444
+ },
3445
+ "default": "true",
3446
+ "description": "When false, new audible alerts are tracked but do not play.",
3447
+ "fieldName": "soundEnabled"
3448
+ }
3449
+ ],
3450
+ "superclass": {
3451
+ "name": "GenesisElement",
3452
+ "package": "@genesislcap/web-core"
3453
+ },
3454
+ "tagName": "foundation-sounds",
3455
+ "customElement": true
3456
+ }
3457
+ ],
3458
+ "exports": [
3459
+ {
3460
+ "kind": "js",
3461
+ "name": "FoundationSounds",
3462
+ "declaration": {
3463
+ "name": "FoundationSounds",
3464
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
3465
+ }
3466
+ },
3467
+ {
3468
+ "kind": "custom-element-definition",
3469
+ "name": "foundation-sounds",
3470
+ "declaration": {
3471
+ "name": "FoundationSounds",
3472
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
3473
+ }
3474
+ }
3475
+ ]
3476
+ },
3477
+ {
3478
+ "kind": "javascript-module",
3479
+ "path": "src/components/foundation-inbox/inbox-base/inbox-base.ts",
3480
+ "declarations": [
3481
+ {
3482
+ "kind": "class",
3483
+ "description": "",
3484
+ "name": "FoundationInboxBase",
3485
+ "members": [
3486
+ {
3487
+ "kind": "field",
2567
3488
  "name": "auth",
2568
3489
  "type": {
2569
3490
  "text": "Auth"
@@ -2882,6 +3803,14 @@
2882
3803
  },
2883
3804
  "privacy": "public"
2884
3805
  },
3806
+ {
3807
+ "kind": "field",
3808
+ "name": "sounds",
3809
+ "type": {
3810
+ "text": "FoundationSoundsPanel"
3811
+ },
3812
+ "privacy": "public"
3813
+ },
2885
3814
  {
2886
3815
  "kind": "field",
2887
3816
  "name": "alertSubscription"
@@ -3346,7 +4275,7 @@
3346
4275
  {
3347
4276
  "kind": "variable",
3348
4277
  "name": "DynamicRuleDialogStyles",
3349
- "default": "css`\n ${scrollbarStyles}\n ${top}\n ${bottom}\n\n rapid-modal::part(dialog) {\n padding: 0;\n background: var(--neutral-layer-4);\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n }\n\n .dialog-content {\n display: flex;\n flex-direction: column;\n width: ${String(modalWidthPx)}px;\n max-height: 500px;\n overflow-y: scroll;\n gap: calc(var(--design-unit) * 3px);\n padding: calc(var(--design-unit) * 4px);\n }\n\n .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 3px);\n }\n\n .control {\n display: flex;\n flex-direction: column;\n width: 100%;\n gap: calc(var(--design-unit) * 2px);\n }\n\n .items {\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n display: flex;\n padding: calc(var(--design-unit) * 2px);\n flex-direction: column;\n }\n\n .item {\n gap: 0;\n flex-direction: column;\n margin-bottom: 0;\n }\n\n ${textField}\n ${select}\n\n rapid-button {\n margin: 0;\n }\n\n rapid-select {\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n\n .horizontal {\n flex-direction: row;\n }\n\n .destination {\n align-self: center;\n }\n\n .topic {\n min-width: revert-layer;\n }\n\n .expression-preview {\n width: 100%;\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .expression-preview::part(control) {\n font-family: var(--body-font, monospace);\n font-size: 12px;\n color: var(--neutral-foreground-hint);\n min-height: calc(var(--design-unit) * 12px);\n resize: vertical;\n }\n`"
4278
+ "default": "css`\n ${scrollbarStyles}\n ${top}\n ${bottom}\n\n rapid-modal::part(dialog) {\n padding: 0;\n background: var(--neutral-layer-4);\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n }\n\n .dialog-content {\n display: flex;\n flex-direction: column;\n width: ${String(modalWidthPx)}px;\n max-height: 600px;\n overflow-y: scroll;\n gap: calc(var(--design-unit) * 3px);\n padding: calc(var(--design-unit) * 4px);\n }\n\n .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 3px);\n }\n\n .control {\n display: flex;\n flex-direction: column;\n width: 100%;\n gap: calc(var(--design-unit) * 2px);\n }\n\n .items {\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n display: flex;\n padding: calc(var(--design-unit) * 2px);\n flex-direction: column;\n }\n\n .item {\n gap: 0;\n flex-direction: column;\n margin-bottom: 0;\n }\n\n ${textField}\n ${select}\n\n rapid-button {\n margin: 0;\n }\n\n rapid-select {\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n\n .horizontal {\n flex-direction: row;\n }\n\n .destination {\n align-self: center;\n }\n\n .topic {\n min-width: revert-layer;\n }\n\n .expression-preview {\n width: 100%;\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .expression-preview::part(control) {\n font-family: var(--body-font, monospace);\n font-size: 12px;\n color: var(--neutral-foreground-hint);\n min-height: calc(var(--design-unit) * 12px);\n resize: vertical;\n }\n\n .alert-sound {\n display: flex;\n flex-direction: column;\n gap: calc(var(--design-unit) * 2px);\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .alert-sound .file-input {\n display: none;\n }\n\n .alert-sound-row {\n display: flex;\n align-items: center;\n gap: calc(var(--design-unit) * 2px);\n flex-wrap: wrap;\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n padding: calc(var(--design-unit) * 2px);\n }\n\n .alert-sound-name {\n flex: 1;\n min-width: 120px;\n color: var(--neutral-foreground-hint);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n`"
3350
4279
  }
3351
4280
  ],
3352
4281
  "exports": [
@@ -4700,6 +5629,18 @@
4700
5629
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
4701
5630
  }
4702
5631
  },
5632
+ {
5633
+ "kind": "field",
5634
+ "name": "sounds",
5635
+ "type": {
5636
+ "text": "FoundationSoundsPanel"
5637
+ },
5638
+ "privacy": "public",
5639
+ "inheritedFrom": {
5640
+ "name": "FoundationInboxBase",
5641
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
5642
+ }
5643
+ },
4703
5644
  {
4704
5645
  "kind": "field",
4705
5646
  "name": "alertSubscription",
@@ -6130,7 +7071,7 @@
6130
7071
  {
6131
7072
  "kind": "variable",
6132
7073
  "name": "RuleDialogTemplate",
6133
- "default": "html<RuleDialog>`\n <rapid-modal ${ref('dialog')} class=\"dialog\" :onCloseCallback=${(x) => () => x.close()}>\n <div slot=\"top\" class=\"dialog-top\">${(x) => x.ruleDialogTitle}</div>\n\n <div class=\"dialog-content\">\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field\n :value=${sync((x) => x.name)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autofocus\n autocomplete=\"off\"\n required\n >\n Name\n </rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field\n :value=${sync((x) => x.description)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n required\n >\n Description\n </rapid-text-field>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <label>Resource</label>\n <rapid-select\n :value=${sync((x) => x.resource)}\n title=${(x) => x.resource}\n position=\"below\"\n >\n ${repeat(\n (x) => x.resources,\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Topic</label>\n <rapid-combobox\n autocomplete=\"both\"\n :value=${sync((x) => x.topic)}\n title=${(x) => x.topic}\n >\n ${repeat(\n (x) => x.topics,\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-combobox>\n </div>\n\n <div class=\"control\">\n <label>Severity</label>\n <rapid-select :value=${sync((x) => x.severity)}>\n <options-datasource\n value-field=\"value\"\n label-field=\"value\"\n option-element=\"rapid-option\"\n :data=${(_) => Object.values(Severity).map((value) => ({ value }))}\n ></options-datasource>\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Update Type</label>\n <rapid-multiselect\n :selectedOptions=${(x) => x.updateType}\n @selectionChange=${(x, c) => {\n x.updateType = (c.event as CustomEvent).detail;\n }}\n search=\"false\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${() => Object.values(UpdateType).map((value) => ({ value, label: value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field\n required\n :value=${sync((x) => x.header)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n >\n Header\n </rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field\n required\n :value=${sync((x) => x.message)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n >\n Message\n </rapid-text-field>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Condition(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.conditions,\n html<ConditionNode, RuleDialog>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <rule-condition-group\n :fields=${(x, c) => c.parent.fields}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></rule-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <rule-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></rule-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>\n + Group\n </rapid-button>\n </div>\n </div>\n <rapid-text-area\n class=\"expression-preview\"\n readonly\n :value=${(x) => x.rawExpressionPreview}\n >\n Compiled expression\n </rapid-text-area>\n </div>\n </div>\n\n <div slot=\"bottom\" class=\"dialog-bottom\">\n <rapid-button\n appearance=\"primary\"\n @click=${(x) => x.submit()}\n ?disabled=${(x) => x.submitDisabled}\n >\n Submit\n </rapid-button>\n </div>\n </rapid-modal>\n`"
7074
+ "default": "html<RuleDialog>`\n <rapid-modal ${ref('dialog')} class=\"dialog\" :onCloseCallback=${(x) => () => x.close()}>\n <div slot=\"top\" class=\"dialog-top\">${(x) => x.ruleDialogTitle}</div>\n\n <div class=\"dialog-content\">\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field\n :value=${sync((x) => x.name)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autofocus\n autocomplete=\"off\"\n required\n >\n Name\n </rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field\n :value=${sync((x) => x.description)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n required\n >\n Description\n </rapid-text-field>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <label>Resource</label>\n <rapid-select\n :value=${sync((x) => x.resource)}\n title=${(x) => x.resource}\n position=\"below\"\n >\n ${repeat(\n (x) => x.resources,\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Topic</label>\n <rapid-combobox\n autocomplete=\"both\"\n :value=${sync((x) => x.topic)}\n title=${(x) => x.topic}\n >\n ${repeat(\n (x) => x.topics,\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-combobox>\n </div>\n\n <div class=\"control\">\n <label>Severity</label>\n <rapid-select :value=${sync((x) => x.severity)}>\n <options-datasource\n value-field=\"value\"\n label-field=\"value\"\n option-element=\"rapid-option\"\n :data=${(_) => Object.values(Severity).map((value) => ({ value }))}\n ></options-datasource>\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Update Type</label>\n <rapid-multiselect\n :selectedOptions=${(x) => x.updateType}\n @selectionChange=${(x, c) => {\n x.updateType = (c.event as CustomEvent).detail;\n }}\n search=\"false\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${() => Object.values(UpdateType).map((value) => ({ value, label: value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field\n required\n :value=${sync((x) => x.header)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n >\n Header\n </rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field\n required\n :value=${sync((x) => x.message)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n >\n Message\n </rapid-text-field>\n </div>\n </div>\n\n ${alertSoundAttachmentTemplate}\n\n <div class=\"control\">\n <label>Condition(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.conditions,\n html<ConditionNode, RuleDialog>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <rule-condition-group\n :fields=${(x, c) => c.parent.fields}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></rule-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <rule-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></rule-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>\n + Group\n </rapid-button>\n </div>\n </div>\n <rapid-text-area\n class=\"expression-preview\"\n readonly\n :value=${(x) => x.rawExpressionPreview}\n >\n Compiled expression\n </rapid-text-area>\n </div>\n </div>\n\n <div slot=\"bottom\" class=\"dialog-bottom\">\n <rapid-button\n appearance=\"primary\"\n @click=${(x) => x.submit()}\n ?disabled=${(x) => x.submitDisabled}\n >\n Submit\n </rapid-button>\n </div>\n </rapid-modal>\n`"
6134
7075
  }
6135
7076
  ],
6136
7077
  "exports": [
@@ -6158,6 +7099,10 @@
6158
7099
  "name": "ruleService",
6159
7100
  "type": {
6160
7101
  "text": "RuleService"
7102
+ },
7103
+ "inheritedFrom": {
7104
+ "name": "AlertSoundAttachmentMixin",
7105
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
6161
7106
  }
6162
7107
  },
6163
7108
  {
@@ -6308,6 +7253,45 @@
6308
7253
  },
6309
7254
  "default": "[]"
6310
7255
  },
7256
+ {
7257
+ "kind": "field",
7258
+ "name": "isAlertSoundEditMode",
7259
+ "type": {
7260
+ "text": "boolean"
7261
+ },
7262
+ "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
7263
+ "readonly": true,
7264
+ "inheritedFrom": {
7265
+ "name": "AlertSoundAttachmentMixin",
7266
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7267
+ }
7268
+ },
7269
+ {
7270
+ "kind": "field",
7271
+ "name": "alertSoundEntityId",
7272
+ "type": {
7273
+ "text": "string | null"
7274
+ },
7275
+ "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
7276
+ "readonly": true,
7277
+ "inheritedFrom": {
7278
+ "name": "AlertSoundAttachmentMixin",
7279
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7280
+ }
7281
+ },
7282
+ {
7283
+ "kind": "field",
7284
+ "name": "alertSoundCacheSyncMode",
7285
+ "type": {
7286
+ "text": "'entity' | 'all'"
7287
+ },
7288
+ "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
7289
+ "readonly": true,
7290
+ "inheritedFrom": {
7291
+ "name": "AlertSoundAttachmentMixin",
7292
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7293
+ }
7294
+ },
6311
7295
  {
6312
7296
  "kind": "method",
6313
7297
  "name": "openDialog",
@@ -6357,75 +7341,277 @@
6357
7341
  },
6358
7342
  {
6359
7343
  "kind": "field",
6360
- "name": "ruleDialogTitle",
7344
+ "name": "ruleDialogTitle",
7345
+ "type": {
7346
+ "text": "string"
7347
+ },
7348
+ "readonly": true
7349
+ },
7350
+ {
7351
+ "kind": "method",
7352
+ "name": "submit"
7353
+ },
7354
+ {
7355
+ "kind": "method",
7356
+ "name": "createRuleObject",
7357
+ "privacy": "private",
7358
+ "return": {
7359
+ "type": {
7360
+ "text": "Rule"
7361
+ }
7362
+ }
7363
+ },
7364
+ {
7365
+ "kind": "method",
7366
+ "name": "validateResponse",
7367
+ "parameters": [
7368
+ {
7369
+ "name": "response"
7370
+ }
7371
+ ]
7372
+ },
7373
+ {
7374
+ "kind": "method",
7375
+ "name": "resourceChanged"
7376
+ },
7377
+ {
7378
+ "kind": "method",
7379
+ "name": "newCondition"
7380
+ },
7381
+ {
7382
+ "kind": "method",
7383
+ "name": "newGroup"
7384
+ },
7385
+ {
7386
+ "kind": "method",
7387
+ "name": "editCondition",
7388
+ "parameters": [
7389
+ {
7390
+ "name": "editedCondition",
7391
+ "type": {
7392
+ "text": "ConditionNode"
7393
+ }
7394
+ }
7395
+ ]
7396
+ },
7397
+ {
7398
+ "kind": "method",
7399
+ "name": "deleteCondition",
7400
+ "parameters": [
7401
+ {
7402
+ "name": "deletedCondition",
7403
+ "type": {
7404
+ "text": "ConditionNode"
7405
+ }
7406
+ }
7407
+ ]
7408
+ },
7409
+ {
7410
+ "kind": "method",
7411
+ "name": "validateRequiredFields",
7412
+ "privacy": "public"
7413
+ },
7414
+ {
7415
+ "kind": "field",
7416
+ "name": "alertSoundFileName",
7417
+ "type": {
7418
+ "text": "string"
7419
+ },
7420
+ "default": "''",
7421
+ "description": "Display name of the attached / pending alert sound file.",
7422
+ "inheritedFrom": {
7423
+ "name": "AlertSoundAttachmentMixin",
7424
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7425
+ }
7426
+ },
7427
+ {
7428
+ "kind": "field",
7429
+ "name": "alertSoundMimeType",
7430
+ "type": {
7431
+ "text": "string"
7432
+ },
7433
+ "default": "''",
7434
+ "inheritedFrom": {
7435
+ "name": "AlertSoundAttachmentMixin",
7436
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7437
+ }
7438
+ },
7439
+ {
7440
+ "kind": "field",
7441
+ "name": "hasAlertSound",
7442
+ "type": {
7443
+ "text": "boolean"
7444
+ },
7445
+ "default": "false",
7446
+ "description": "True when edit loaded an existing server sound (or user attached one).",
7447
+ "inheritedFrom": {
7448
+ "name": "AlertSoundAttachmentMixin",
7449
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7450
+ }
7451
+ },
7452
+ {
7453
+ "kind": "field",
7454
+ "name": "fileInput",
7455
+ "type": {
7456
+ "text": "HTMLInputElement"
7457
+ },
7458
+ "inheritedFrom": {
7459
+ "name": "AlertSoundAttachmentMixin",
7460
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7461
+ }
7462
+ },
7463
+ {
7464
+ "kind": "field",
7465
+ "name": "pendingAlertSoundData",
7466
+ "type": {
7467
+ "text": "string | null"
7468
+ },
7469
+ "default": "null",
7470
+ "inheritedFrom": {
7471
+ "name": "AlertSoundAttachmentMixin",
7472
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7473
+ }
7474
+ },
7475
+ {
7476
+ "kind": "field",
7477
+ "name": "alertSoundDirty",
7478
+ "type": {
7479
+ "text": "boolean"
7480
+ },
7481
+ "default": "false",
7482
+ "description": "True when the user picked a new file this session (needs upload).",
7483
+ "inheritedFrom": {
7484
+ "name": "AlertSoundAttachmentMixin",
7485
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7486
+ }
7487
+ },
7488
+ {
7489
+ "kind": "field",
7490
+ "name": "clearAlertSound",
7491
+ "type": {
7492
+ "text": "boolean"
7493
+ },
7494
+ "default": "false",
7495
+ "inheritedFrom": {
7496
+ "name": "AlertSoundAttachmentMixin",
7497
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7498
+ }
7499
+ },
7500
+ {
7501
+ "kind": "field",
7502
+ "name": "testAudio",
6361
7503
  "type": {
6362
- "text": "string"
7504
+ "text": "HTMLAudioElement | null"
6363
7505
  },
6364
- "readonly": true
7506
+ "default": "null",
7507
+ "description": "In-progress Test playback; not private — mixin return type is exported.",
7508
+ "inheritedFrom": {
7509
+ "name": "AlertSoundAttachmentMixin",
7510
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7511
+ }
6365
7512
  },
6366
7513
  {
6367
7514
  "kind": "method",
6368
- "name": "submit"
7515
+ "name": "loadExistingAlertSound",
7516
+ "parameters": [
7517
+ {
7518
+ "name": "dynamicRuleId",
7519
+ "type": {
7520
+ "text": "string"
7521
+ }
7522
+ }
7523
+ ],
7524
+ "inheritedFrom": {
7525
+ "name": "AlertSoundAttachmentMixin",
7526
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7527
+ }
6369
7528
  },
6370
7529
  {
6371
7530
  "kind": "method",
6372
- "name": "createRuleObject",
6373
- "privacy": "private",
6374
- "return": {
6375
- "type": {
6376
- "text": "Rule"
6377
- }
7531
+ "name": "openAlertSoundPicker",
7532
+ "inheritedFrom": {
7533
+ "name": "AlertSoundAttachmentMixin",
7534
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
6378
7535
  }
6379
7536
  },
6380
7537
  {
6381
7538
  "kind": "method",
6382
- "name": "validateResponse",
7539
+ "name": "onAlertSoundSelected",
6383
7540
  "parameters": [
6384
7541
  {
6385
- "name": "response"
7542
+ "name": "event",
7543
+ "type": {
7544
+ "text": "Event"
7545
+ }
6386
7546
  }
6387
- ]
7547
+ ],
7548
+ "inheritedFrom": {
7549
+ "name": "AlertSoundAttachmentMixin",
7550
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7551
+ }
6388
7552
  },
6389
7553
  {
6390
7554
  "kind": "method",
6391
- "name": "resourceChanged"
7555
+ "name": "clearAttachedAlertSound",
7556
+ "inheritedFrom": {
7557
+ "name": "AlertSoundAttachmentMixin",
7558
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7559
+ }
6392
7560
  },
6393
7561
  {
6394
7562
  "kind": "method",
6395
- "name": "newCondition"
7563
+ "name": "testAttachedAlertSound",
7564
+ "inheritedFrom": {
7565
+ "name": "AlertSoundAttachmentMixin",
7566
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7567
+ }
6396
7568
  },
6397
7569
  {
6398
7570
  "kind": "method",
6399
- "name": "newGroup"
7571
+ "name": "stopTestSound",
7572
+ "inheritedFrom": {
7573
+ "name": "AlertSoundAttachmentMixin",
7574
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7575
+ }
6400
7576
  },
6401
7577
  {
6402
7578
  "kind": "method",
6403
- "name": "editCondition",
6404
- "parameters": [
6405
- {
6406
- "name": "editedCondition",
6407
- "type": {
6408
- "text": "ConditionNode"
6409
- }
6410
- }
6411
- ]
7579
+ "name": "resetAlertSoundState",
7580
+ "inheritedFrom": {
7581
+ "name": "AlertSoundAttachmentMixin",
7582
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7583
+ }
6412
7584
  },
6413
7585
  {
6414
7586
  "kind": "method",
6415
- "name": "deleteCondition",
7587
+ "name": "applyAlertSoundToPayload",
7588
+ "return": {
7589
+ "type": {
7590
+ "text": "T"
7591
+ }
7592
+ },
6416
7593
  "parameters": [
6417
7594
  {
6418
- "name": "deletedCondition",
7595
+ "name": "target",
6419
7596
  "type": {
6420
- "text": "ConditionNode"
7597
+ "text": "T"
6421
7598
  }
6422
7599
  }
6423
- ]
7600
+ ],
7601
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object.",
7602
+ "inheritedFrom": {
7603
+ "name": "AlertSoundAttachmentMixin",
7604
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7605
+ }
6424
7606
  },
6425
7607
  {
6426
7608
  "kind": "method",
6427
- "name": "validateRequiredFields",
6428
- "privacy": "public"
7609
+ "name": "syncAlertSoundCacheAfterSave",
7610
+ "description": "Keep AlertSoundPlayer's in-memory NOTIFY_ALERT_SOUND cache in sync with\nwhat we just saved — otherwise the next alert still plays the old file.",
7611
+ "inheritedFrom": {
7612
+ "name": "AlertSoundAttachmentMixin",
7613
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7614
+ }
6429
7615
  }
6430
7616
  ],
6431
7617
  "events": [
@@ -6434,6 +7620,12 @@
6434
7620
  "name": "close"
6435
7621
  }
6436
7622
  ],
7623
+ "mixins": [
7624
+ {
7625
+ "name": "AlertSoundAttachmentMixin",
7626
+ "module": "/src/components/foundation-notification-dashboard/alert-sound-attachment"
7627
+ }
7628
+ ],
6437
7629
  "superclass": {
6438
7630
  "name": "GenesisElement",
6439
7631
  "package": "@genesislcap/web-core"
@@ -6492,7 +7684,7 @@
6492
7684
  {
6493
7685
  "kind": "variable",
6494
7686
  "name": "TemplateDialogTemplate",
6495
- "default": "html<TemplateDialog>`\n <rapid-modal ${ref('dialog')} class=\"dialog\" :onCloseCallback=${(x) => () => x.close()}>\n <div slot=\"top\" class=\"dialog-top\">${(x) => x.templateDialogTitle}</div>\n\n <div class=\"dialog-content\">\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.name)} autofocus>Name</rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.description)}>Description</rapid-text-field>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <label>Resource</label>\n <rapid-select :value=${sync((x) => x.resource)} position=\"below\">\n ${repeat(\n (x) => x.resources,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Topic</label>\n <rapid-select :value=${sync((x) => x.topic)}>\n ${repeat(\n (x) => x.topics,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Severity</label>\n <rapid-select :value=${sync((x) => x.severity)}>\n <options-datasource\n value-field=\"value\"\n label-field=\"value\"\n option-element=\"rapid-option\"\n :data=${(_) => Object.values(Severity).map((value) => ({ value }))}\n ></options-datasource>\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Update Type</label>\n <rapid-multiselect\n :selectedOptions=${(x) => x.updateType}\n @selectionChange=${(x, c) => {\n x.updateType = (c.event as CustomEvent).detail;\n }}\n search=\"false\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${() => Object.values(UpdateType).map((value) => ({ value, label: value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.header)}>Header</rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.message)}>Message</rapid-text-field>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Parameter(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.parameters,\n html`\n <parameter-builder\n :parameter=${(x) => x}\n @edit=${(x, c) => c.parent.editParameter(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteParameter(eventDetail(c))}\n ></parameter-builder>\n `,\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button @click=${(x) => x.newParameter()}>+ Parameter</rapid-button>\n </div>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Condition(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.conditions,\n html<ConditionNode, TemplateDialog>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <template-condition-group\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></template-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <template-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></template-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>\n + Group\n </rapid-button>\n </div>\n </div>\n <rapid-text-area\n class=\"expression-preview\"\n readonly\n :value=${(x) => x.rawExpressionPreview}\n >\n Compiled expression\n </rapid-text-area>\n </div>\n </div>\n\n <div slot=\"bottom\" class=\"dialog-bottom\">\n <rapid-button appearance=\"primary\" @click=${(x) => x.submit()}>Submit</rapid-button>\n </div>\n </rapid-modal>\n`"
7687
+ "default": "html<TemplateDialog>`\n <rapid-modal ${ref('dialog')} class=\"dialog\" :onCloseCallback=${(x) => () => x.close()}>\n <div slot=\"top\" class=\"dialog-top\">${(x) => x.templateDialogTitle}</div>\n\n <div class=\"dialog-content\">\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.name)} autofocus>Name</rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.description)}>Description</rapid-text-field>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <label>Resource</label>\n <rapid-select :value=${sync((x) => x.resource)} position=\"below\">\n ${repeat(\n (x) => x.resources,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Topic</label>\n <rapid-select :value=${sync((x) => x.topic)}>\n ${repeat(\n (x) => x.topics,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Severity</label>\n <rapid-select :value=${sync((x) => x.severity)}>\n <options-datasource\n value-field=\"value\"\n label-field=\"value\"\n option-element=\"rapid-option\"\n :data=${(_) => Object.values(Severity).map((value) => ({ value }))}\n ></options-datasource>\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Update Type</label>\n <rapid-multiselect\n :selectedOptions=${(x) => x.updateType}\n @selectionChange=${(x, c) => {\n x.updateType = (c.event as CustomEvent).detail;\n }}\n search=\"false\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${() => Object.values(UpdateType).map((value) => ({ value, label: value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.header)}>Header</rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.message)}>Message</rapid-text-field>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Parameter(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.parameters,\n html`\n <parameter-builder\n :parameter=${(x) => x}\n @edit=${(x, c) => c.parent.editParameter(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteParameter(eventDetail(c))}\n ></parameter-builder>\n `,\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button @click=${(x) => x.newParameter()}>+ Parameter</rapid-button>\n </div>\n </div>\n </div>\n\n ${alertSoundAttachmentTemplate}\n\n <div class=\"control\">\n <label>Condition(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.conditions,\n html<ConditionNode, TemplateDialog>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <template-condition-group\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></template-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <template-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></template-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>\n + Group\n </rapid-button>\n </div>\n </div>\n <rapid-text-area\n class=\"expression-preview\"\n readonly\n :value=${(x) => x.rawExpressionPreview}\n >\n Compiled expression\n </rapid-text-area>\n </div>\n </div>\n\n <div slot=\"bottom\" class=\"dialog-bottom\">\n <rapid-button appearance=\"primary\" @click=${(x) => x.submit()}>Submit</rapid-button>\n </div>\n </rapid-modal>\n`"
6496
7688
  }
6497
7689
  ],
6498
7690
  "exports": [
@@ -6536,6 +7728,17 @@
6536
7728
  "text": "NotifyService"
6537
7729
  }
6538
7730
  },
7731
+ {
7732
+ "kind": "field",
7733
+ "name": "ruleService",
7734
+ "type": {
7735
+ "text": "RuleService"
7736
+ },
7737
+ "inheritedFrom": {
7738
+ "name": "AlertSoundAttachmentMixin",
7739
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7740
+ }
7741
+ },
6539
7742
  {
6540
7743
  "kind": "field",
6541
7744
  "name": "dialog",
@@ -6677,6 +7880,45 @@
6677
7880
  "name": "requiredFields",
6678
7881
  "privacy": "private"
6679
7882
  },
7883
+ {
7884
+ "kind": "field",
7885
+ "name": "isAlertSoundEditMode",
7886
+ "type": {
7887
+ "text": "boolean"
7888
+ },
7889
+ "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
7890
+ "readonly": true,
7891
+ "inheritedFrom": {
7892
+ "name": "AlertSoundAttachmentMixin",
7893
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7894
+ }
7895
+ },
7896
+ {
7897
+ "kind": "field",
7898
+ "name": "alertSoundEntityId",
7899
+ "type": {
7900
+ "text": "string | null"
7901
+ },
7902
+ "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
7903
+ "readonly": true,
7904
+ "inheritedFrom": {
7905
+ "name": "AlertSoundAttachmentMixin",
7906
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7907
+ }
7908
+ },
7909
+ {
7910
+ "kind": "field",
7911
+ "name": "alertSoundCacheSyncMode",
7912
+ "type": {
7913
+ "text": "'entity' | 'all'"
7914
+ },
7915
+ "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
7916
+ "readonly": true,
7917
+ "inheritedFrom": {
7918
+ "name": "AlertSoundAttachmentMixin",
7919
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
7920
+ }
7921
+ },
6680
7922
  {
6681
7923
  "kind": "method",
6682
7924
  "name": "openDialog",
@@ -6827,211 +8069,269 @@
6827
8069
  },
6828
8070
  "privacy": "public",
6829
8071
  "readonly": true
6830
- }
6831
- ],
6832
- "events": [
8072
+ },
6833
8073
  {
6834
- "description": "Fired when the dialog should close",
6835
- "name": "close"
6836
- }
6837
- ],
6838
- "superclass": {
6839
- "name": "GenesisElement",
6840
- "package": "@genesislcap/web-core"
6841
- },
6842
- "tagName": "template-dialog",
6843
- "customElement": true
6844
- }
6845
- ],
6846
- "exports": [
6847
- {
6848
- "kind": "js",
6849
- "name": "TemplateDialog",
6850
- "declaration": {
6851
- "name": "TemplateDialog",
6852
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
6853
- }
6854
- },
6855
- {
6856
- "kind": "custom-element-definition",
6857
- "name": "template-dialog",
6858
- "declaration": {
6859
- "name": "TemplateDialog",
6860
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
6861
- }
6862
- }
6863
- ]
6864
- },
6865
- {
6866
- "kind": "javascript-module",
6867
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts",
6868
- "declarations": [
6869
- {
6870
- "kind": "variable",
6871
- "name": "TemplateDialogMode",
6872
- "type": {
6873
- "text": "{\n CREATE: 'create',\n EDIT: 'edit',\n}"
6874
- },
6875
- "default": "{\n CREATE: 'create',\n EDIT: 'edit',\n}"
6876
- }
6877
- ],
6878
- "exports": [
6879
- {
6880
- "kind": "js",
6881
- "name": "TemplateDialogMode",
6882
- "declaration": {
6883
- "name": "TemplateDialogMode",
6884
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts"
6885
- }
6886
- }
6887
- ]
6888
- },
6889
- {
6890
- "kind": "javascript-module",
6891
- "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts",
6892
- "declarations": [
6893
- {
6894
- "kind": "variable",
6895
- "name": "RuleConditionGroupTemplate",
6896
- "default": "html<RuleConditionGroup>`\n ${when(\n (x) => !x.isFirst,\n html`\n <div class=\"join-toggle-row\">\n <div class=\"join-toggle\">\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'AND'])}\"\n @click=${(x) => (x.joinOperator = 'AND')}\n >\n AND\n </span>\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'OR'])}\"\n @click=${(x) => (x.joinOperator = 'OR')}\n >\n OR\n </span>\n </div>\n </div>\n `,\n )}\n <div class=\"condition-group-row\">\n <div class=\"condition-group-box\">\n ${repeat(\n (x) => x.groupChildren,\n html<ConditionNode, RuleConditionGroup>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <rule-condition-group\n :fields=${(x, c) => c.parent.fields}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></rule-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <rule-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></rule-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>+ Group</rapid-button>\n <rapid-button appearance=\"icon\" class=\"delete-group\" @click=${(x) => x.deleteSelf()}>\n <rapid-icon variant=\"regular\" name=\"trash-alt\" size=\"lg\" part=\"icon\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n </div>\n`"
6897
- }
6898
- ],
6899
- "exports": [
6900
- {
6901
- "kind": "js",
6902
- "name": "RuleConditionGroupTemplate",
6903
- "declaration": {
6904
- "name": "RuleConditionGroupTemplate",
6905
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts"
6906
- }
6907
- }
6908
- ]
6909
- },
6910
- {
6911
- "kind": "javascript-module",
6912
- "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts",
6913
- "declarations": [
6914
- {
6915
- "kind": "class",
6916
- "description": "Parenthesized group of conditions/nested groups for notification rule\ncriteria, joined to the previous sibling via AND/OR like a single\ncondition row - but bracketing its own children off from the rest of the\nlist, so e.g. \"(A && B) || C\" can be expressed without the AND silently\nspanning more than intended.",
6917
- "name": "RuleConditionGroup",
6918
- "members": [
8074
+ "kind": "field",
8075
+ "name": "alertSoundFileName",
8076
+ "type": {
8077
+ "text": "string"
8078
+ },
8079
+ "default": "''",
8080
+ "description": "Display name of the attached / pending alert sound file.",
8081
+ "inheritedFrom": {
8082
+ "name": "AlertSoundAttachmentMixin",
8083
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8084
+ }
8085
+ },
6919
8086
  {
6920
8087
  "kind": "field",
6921
- "name": "node",
8088
+ "name": "alertSoundMimeType",
6922
8089
  "type": {
6923
- "text": "ConditionGroupEntity"
8090
+ "text": "string"
8091
+ },
8092
+ "default": "''",
8093
+ "inheritedFrom": {
8094
+ "name": "AlertSoundAttachmentMixin",
8095
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
6924
8096
  }
6925
8097
  },
6926
8098
  {
6927
8099
  "kind": "field",
6928
- "name": "fields",
8100
+ "name": "hasAlertSound",
6929
8101
  "type": {
6930
- "text": "Field[]"
8102
+ "text": "boolean"
6931
8103
  },
6932
- "default": "[]"
8104
+ "default": "false",
8105
+ "description": "True when edit loaded an existing server sound (or user attached one).",
8106
+ "inheritedFrom": {
8107
+ "name": "AlertSoundAttachmentMixin",
8108
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8109
+ }
6933
8110
  },
6934
8111
  {
6935
8112
  "kind": "field",
6936
- "name": "isFirst",
8113
+ "name": "fileInput",
8114
+ "type": {
8115
+ "text": "HTMLInputElement"
8116
+ },
8117
+ "inheritedFrom": {
8118
+ "name": "AlertSoundAttachmentMixin",
8119
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8120
+ }
8121
+ },
8122
+ {
8123
+ "kind": "field",
8124
+ "name": "pendingAlertSoundData",
8125
+ "type": {
8126
+ "text": "string | null"
8127
+ },
8128
+ "default": "null",
8129
+ "inheritedFrom": {
8130
+ "name": "AlertSoundAttachmentMixin",
8131
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8132
+ }
8133
+ },
8134
+ {
8135
+ "kind": "field",
8136
+ "name": "alertSoundDirty",
6937
8137
  "type": {
6938
8138
  "text": "boolean"
6939
8139
  },
6940
- "default": "false"
8140
+ "default": "false",
8141
+ "description": "True when the user picked a new file this session (needs upload).",
8142
+ "inheritedFrom": {
8143
+ "name": "AlertSoundAttachmentMixin",
8144
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8145
+ }
6941
8146
  },
6942
8147
  {
6943
8148
  "kind": "field",
6944
- "name": "joinOperator",
8149
+ "name": "clearAlertSound",
6945
8150
  "type": {
6946
- "text": "string"
8151
+ "text": "boolean"
8152
+ },
8153
+ "default": "false",
8154
+ "inheritedFrom": {
8155
+ "name": "AlertSoundAttachmentMixin",
8156
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8157
+ }
8158
+ },
8159
+ {
8160
+ "kind": "field",
8161
+ "name": "testAudio",
8162
+ "type": {
8163
+ "text": "HTMLAudioElement | null"
8164
+ },
8165
+ "default": "null",
8166
+ "description": "In-progress Test playback; not private — mixin return type is exported.",
8167
+ "inheritedFrom": {
8168
+ "name": "AlertSoundAttachmentMixin",
8169
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8170
+ }
8171
+ },
8172
+ {
8173
+ "kind": "method",
8174
+ "name": "loadExistingAlertSound",
8175
+ "parameters": [
8176
+ {
8177
+ "name": "dynamicRuleId",
8178
+ "type": {
8179
+ "text": "string"
8180
+ }
8181
+ }
8182
+ ],
8183
+ "inheritedFrom": {
8184
+ "name": "AlertSoundAttachmentMixin",
8185
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
6947
8186
  }
6948
8187
  },
6949
8188
  {
6950
- "kind": "field",
6951
- "name": "groupChildren",
6952
- "type": {
6953
- "text": "ConditionNode[]"
6954
- },
6955
- "default": "[]"
8189
+ "kind": "method",
8190
+ "name": "openAlertSoundPicker",
8191
+ "inheritedFrom": {
8192
+ "name": "AlertSoundAttachmentMixin",
8193
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8194
+ }
6956
8195
  },
6957
8196
  {
6958
8197
  "kind": "method",
6959
- "name": "nodeChanged"
8198
+ "name": "onAlertSoundSelected",
8199
+ "parameters": [
8200
+ {
8201
+ "name": "event",
8202
+ "type": {
8203
+ "text": "Event"
8204
+ }
8205
+ }
8206
+ ],
8207
+ "inheritedFrom": {
8208
+ "name": "AlertSoundAttachmentMixin",
8209
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8210
+ }
6960
8211
  },
6961
8212
  {
6962
8213
  "kind": "method",
6963
- "name": "joinOperatorChanged"
8214
+ "name": "clearAttachedAlertSound",
8215
+ "inheritedFrom": {
8216
+ "name": "AlertSoundAttachmentMixin",
8217
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8218
+ }
6964
8219
  },
6965
8220
  {
6966
8221
  "kind": "method",
6967
- "name": "newCondition"
8222
+ "name": "testAttachedAlertSound",
8223
+ "inheritedFrom": {
8224
+ "name": "AlertSoundAttachmentMixin",
8225
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8226
+ }
6968
8227
  },
6969
8228
  {
6970
8229
  "kind": "method",
6971
- "name": "newGroup"
8230
+ "name": "stopTestSound",
8231
+ "inheritedFrom": {
8232
+ "name": "AlertSoundAttachmentMixin",
8233
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8234
+ }
6972
8235
  },
6973
8236
  {
6974
8237
  "kind": "method",
6975
- "name": "editChild",
6976
- "parameters": [
6977
- {
6978
- "name": "_editedChild",
6979
- "type": {
6980
- "text": "ConditionNode"
6981
- }
6982
- }
6983
- ]
8238
+ "name": "resetAlertSoundState",
8239
+ "inheritedFrom": {
8240
+ "name": "AlertSoundAttachmentMixin",
8241
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8242
+ }
6984
8243
  },
6985
8244
  {
6986
8245
  "kind": "method",
6987
- "name": "deleteChild",
8246
+ "name": "applyAlertSoundToPayload",
8247
+ "return": {
8248
+ "type": {
8249
+ "text": "T"
8250
+ }
8251
+ },
6988
8252
  "parameters": [
6989
8253
  {
6990
- "name": "deletedChild",
8254
+ "name": "target",
6991
8255
  "type": {
6992
- "text": "ConditionNode"
8256
+ "text": "T"
6993
8257
  }
6994
8258
  }
6995
- ]
8259
+ ],
8260
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object.",
8261
+ "inheritedFrom": {
8262
+ "name": "AlertSoundAttachmentMixin",
8263
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8264
+ }
6996
8265
  },
6997
8266
  {
6998
8267
  "kind": "method",
6999
- "name": "deleteSelf"
8268
+ "name": "syncAlertSoundCacheAfterSave",
8269
+ "description": "Keep AlertSoundPlayer's in-memory NOTIFY_ALERT_SOUND cache in sync with\nwhat we just saved — otherwise the next alert still plays the old file.",
8270
+ "inheritedFrom": {
8271
+ "name": "AlertSoundAttachmentMixin",
8272
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
8273
+ }
7000
8274
  }
7001
8275
  ],
7002
8276
  "events": [
7003
8277
  {
7004
- "description": "Fired when this whole group should be removed",
7005
- "name": "delete"
7006
- },
8278
+ "description": "Fired when the dialog should close",
8279
+ "name": "close"
8280
+ }
8281
+ ],
8282
+ "mixins": [
7007
8283
  {
7008
- "description": "Fired when anything inside this group changes",
7009
- "name": "edit"
8284
+ "name": "AlertSoundAttachmentMixin",
8285
+ "module": "/src/components/foundation-notification-dashboard/alert-sound-attachment"
7010
8286
  }
7011
8287
  ],
7012
8288
  "superclass": {
7013
8289
  "name": "GenesisElement",
7014
8290
  "package": "@genesislcap/web-core"
7015
8291
  },
7016
- "tagName": "rule-condition-group",
8292
+ "tagName": "template-dialog",
7017
8293
  "customElement": true
7018
8294
  }
7019
8295
  ],
7020
8296
  "exports": [
7021
8297
  {
7022
8298
  "kind": "js",
7023
- "name": "RuleConditionGroup",
8299
+ "name": "TemplateDialog",
7024
8300
  "declaration": {
7025
- "name": "RuleConditionGroup",
7026
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
8301
+ "name": "TemplateDialog",
8302
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
7027
8303
  }
7028
8304
  },
7029
8305
  {
7030
8306
  "kind": "custom-element-definition",
7031
- "name": "rule-condition-group",
8307
+ "name": "template-dialog",
7032
8308
  "declaration": {
7033
- "name": "RuleConditionGroup",
7034
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
8309
+ "name": "TemplateDialog",
8310
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
8311
+ }
8312
+ }
8313
+ ]
8314
+ },
8315
+ {
8316
+ "kind": "javascript-module",
8317
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts",
8318
+ "declarations": [
8319
+ {
8320
+ "kind": "variable",
8321
+ "name": "TemplateDialogMode",
8322
+ "type": {
8323
+ "text": "{\n CREATE: 'create',\n EDIT: 'edit',\n}"
8324
+ },
8325
+ "default": "{\n CREATE: 'create',\n EDIT: 'edit',\n}"
8326
+ }
8327
+ ],
8328
+ "exports": [
8329
+ {
8330
+ "kind": "js",
8331
+ "name": "TemplateDialogMode",
8332
+ "declaration": {
8333
+ "name": "TemplateDialogMode",
8334
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts"
7035
8335
  }
7036
8336
  }
7037
8337
  ]
@@ -7320,6 +8620,156 @@
7320
8620
  "declarations": [],
7321
8621
  "exports": []
7322
8622
  },
8623
+ {
8624
+ "kind": "javascript-module",
8625
+ "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts",
8626
+ "declarations": [
8627
+ {
8628
+ "kind": "variable",
8629
+ "name": "RuleConditionGroupTemplate",
8630
+ "default": "html<RuleConditionGroup>`\n ${when(\n (x) => !x.isFirst,\n html`\n <div class=\"join-toggle-row\">\n <div class=\"join-toggle\">\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'AND'])}\"\n @click=${(x) => (x.joinOperator = 'AND')}\n >\n AND\n </span>\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'OR'])}\"\n @click=${(x) => (x.joinOperator = 'OR')}\n >\n OR\n </span>\n </div>\n </div>\n `,\n )}\n <div class=\"condition-group-row\">\n <div class=\"condition-group-box\">\n ${repeat(\n (x) => x.groupChildren,\n html<ConditionNode, RuleConditionGroup>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <rule-condition-group\n :fields=${(x, c) => c.parent.fields}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></rule-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <rule-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></rule-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>+ Group</rapid-button>\n <rapid-button appearance=\"icon\" class=\"delete-group\" @click=${(x) => x.deleteSelf()}>\n <rapid-icon variant=\"regular\" name=\"trash-alt\" size=\"lg\" part=\"icon\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n </div>\n`"
8631
+ }
8632
+ ],
8633
+ "exports": [
8634
+ {
8635
+ "kind": "js",
8636
+ "name": "RuleConditionGroupTemplate",
8637
+ "declaration": {
8638
+ "name": "RuleConditionGroupTemplate",
8639
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts"
8640
+ }
8641
+ }
8642
+ ]
8643
+ },
8644
+ {
8645
+ "kind": "javascript-module",
8646
+ "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts",
8647
+ "declarations": [
8648
+ {
8649
+ "kind": "class",
8650
+ "description": "Parenthesized group of conditions/nested groups for notification rule\ncriteria, joined to the previous sibling via AND/OR like a single\ncondition row - but bracketing its own children off from the rest of the\nlist, so e.g. \"(A && B) || C\" can be expressed without the AND silently\nspanning more than intended.",
8651
+ "name": "RuleConditionGroup",
8652
+ "members": [
8653
+ {
8654
+ "kind": "field",
8655
+ "name": "node",
8656
+ "type": {
8657
+ "text": "ConditionGroupEntity"
8658
+ }
8659
+ },
8660
+ {
8661
+ "kind": "field",
8662
+ "name": "fields",
8663
+ "type": {
8664
+ "text": "Field[]"
8665
+ },
8666
+ "default": "[]"
8667
+ },
8668
+ {
8669
+ "kind": "field",
8670
+ "name": "isFirst",
8671
+ "type": {
8672
+ "text": "boolean"
8673
+ },
8674
+ "default": "false"
8675
+ },
8676
+ {
8677
+ "kind": "field",
8678
+ "name": "joinOperator",
8679
+ "type": {
8680
+ "text": "string"
8681
+ }
8682
+ },
8683
+ {
8684
+ "kind": "field",
8685
+ "name": "groupChildren",
8686
+ "type": {
8687
+ "text": "ConditionNode[]"
8688
+ },
8689
+ "default": "[]"
8690
+ },
8691
+ {
8692
+ "kind": "method",
8693
+ "name": "nodeChanged"
8694
+ },
8695
+ {
8696
+ "kind": "method",
8697
+ "name": "joinOperatorChanged"
8698
+ },
8699
+ {
8700
+ "kind": "method",
8701
+ "name": "newCondition"
8702
+ },
8703
+ {
8704
+ "kind": "method",
8705
+ "name": "newGroup"
8706
+ },
8707
+ {
8708
+ "kind": "method",
8709
+ "name": "editChild",
8710
+ "parameters": [
8711
+ {
8712
+ "name": "_editedChild",
8713
+ "type": {
8714
+ "text": "ConditionNode"
8715
+ }
8716
+ }
8717
+ ]
8718
+ },
8719
+ {
8720
+ "kind": "method",
8721
+ "name": "deleteChild",
8722
+ "parameters": [
8723
+ {
8724
+ "name": "deletedChild",
8725
+ "type": {
8726
+ "text": "ConditionNode"
8727
+ }
8728
+ }
8729
+ ]
8730
+ },
8731
+ {
8732
+ "kind": "method",
8733
+ "name": "deleteSelf"
8734
+ }
8735
+ ],
8736
+ "events": [
8737
+ {
8738
+ "description": "Fired when this whole group should be removed",
8739
+ "name": "delete"
8740
+ },
8741
+ {
8742
+ "description": "Fired when anything inside this group changes",
8743
+ "name": "edit"
8744
+ }
8745
+ ],
8746
+ "superclass": {
8747
+ "name": "GenesisElement",
8748
+ "package": "@genesislcap/web-core"
8749
+ },
8750
+ "tagName": "rule-condition-group",
8751
+ "customElement": true
8752
+ }
8753
+ ],
8754
+ "exports": [
8755
+ {
8756
+ "kind": "js",
8757
+ "name": "RuleConditionGroup",
8758
+ "declaration": {
8759
+ "name": "RuleConditionGroup",
8760
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
8761
+ }
8762
+ },
8763
+ {
8764
+ "kind": "custom-element-definition",
8765
+ "name": "rule-condition-group",
8766
+ "declaration": {
8767
+ "name": "RuleConditionGroup",
8768
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
8769
+ }
8770
+ }
8771
+ ]
8772
+ },
7323
8773
  {
7324
8774
  "kind": "javascript-module",
7325
8775
  "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts",