@genesislcap/pbc-notify-ui 15.19.2 → 15.19.3-alpha-b861ebab1.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.
@@ -2041,54 +2041,19 @@
2041
2041
  },
2042
2042
  {
2043
2043
  "kind": "javascript-module",
2044
- "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2045
- "declarations": [
2046
- {
2047
- "kind": "variable",
2048
- "name": "FoundationSoundsPanelStyles",
2049
- "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`"
2050
- }
2051
- ],
2052
- "exports": [
2053
- {
2054
- "kind": "js",
2055
- "name": "FoundationSoundsPanelStyles",
2056
- "declaration": {
2057
- "name": "FoundationSoundsPanelStyles",
2058
- "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
2059
- }
2060
- }
2061
- ]
2062
- },
2063
- {
2064
- "kind": "javascript-module",
2065
- "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
2044
+ "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
2066
2045
  "declarations": [
2067
2046
  {
2068
2047
  "kind": "variable",
2069
- "name": "FoundationSoundsPanelTemplate",
2070
- "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`"
2071
- }
2072
- ],
2073
- "exports": [
2074
- {
2075
- "kind": "js",
2076
- "name": "FoundationSoundsPanelTemplate",
2077
- "declaration": {
2078
- "name": "FoundationSoundsPanelTemplate",
2079
- "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
2080
- }
2081
- }
2082
- ]
2083
- },
2084
- {
2085
- "kind": "javascript-module",
2086
- "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
2087
- "declarations": [
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.",
2051
+ "privacy": "public"
2052
+ },
2088
2053
  {
2089
- "kind": "class",
2090
- "description": "Configures alert sound rules in the inbox Sounds tab. Persists via the shared\nAlertSoundPlayer; playback is handled by layout-mounted\nFoundationSounds.",
2091
- "name": "FoundationSoundsPanel",
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",
2092
2057
  "members": [
2093
2058
  {
2094
2059
  "kind": "field",
@@ -2099,21 +2064,56 @@
2099
2064
  },
2100
2065
  {
2101
2066
  "kind": "field",
2102
- "name": "volumePercent",
2067
+ "name": "isAlertSoundEditMode",
2103
2068
  "type": {
2104
- "text": "number"
2069
+ "text": "boolean"
2105
2070
  },
2106
- "default": "100",
2107
- "description": "Global playback volume 0–100. @internal"
2071
+ "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
2072
+ "readonly": true
2108
2073
  },
2109
2074
  {
2110
2075
  "kind": "field",
2111
- "name": "selectableRules",
2076
+ "name": "alertSoundEntityId",
2112
2077
  "type": {
2113
- "text": "AlertSoundSelectableRule[]"
2078
+ "text": "string | null"
2114
2079
  },
2115
- "default": "[]",
2116
- "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
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",
2095
+ "type": {
2096
+ "text": "string"
2097
+ },
2098
+ "default": "''",
2099
+ "description": "Display name of the attached / pending alert sound file."
2100
+ },
2101
+ {
2102
+ "kind": "field",
2103
+ "name": "alertSoundMimeType",
2104
+ "type": {
2105
+ "text": "string"
2106
+ },
2107
+ "default": "''"
2108
+ },
2109
+ {
2110
+ "kind": "field",
2111
+ "name": "hasAlertSound",
2112
+ "type": {
2113
+ "text": "boolean"
2114
+ },
2115
+ "default": "false",
2116
+ "description": "True when edit loaded an existing server sound (or user attached one)."
2117
2117
  },
2118
2118
  {
2119
2119
  "kind": "field",
@@ -2124,98 +2124,58 @@
2124
2124
  },
2125
2125
  {
2126
2126
  "kind": "field",
2127
- "name": "pendingRuleIndex",
2127
+ "name": "pendingAlertSoundData",
2128
2128
  "type": {
2129
- "text": "number | null"
2129
+ "text": "string | null"
2130
2130
  },
2131
- "privacy": "private",
2132
2131
  "default": "null"
2133
2132
  },
2134
2133
  {
2135
2134
  "kind": "field",
2136
- "name": "player",
2137
- "privacy": "private",
2138
- "readonly": true
2135
+ "name": "alertSoundDirty",
2136
+ "type": {
2137
+ "text": "boolean"
2138
+ },
2139
+ "default": "false",
2140
+ "description": "True when the user picked a new file this session (needs upload)."
2139
2141
  },
2140
2142
  {
2141
2143
  "kind": "field",
2142
- "name": "unsubscribePlayer",
2144
+ "name": "clearAlertSound",
2143
2145
  "type": {
2144
- "text": "(() => void) | undefined"
2146
+ "text": "boolean"
2145
2147
  },
2146
- "privacy": "private"
2148
+ "default": "false"
2147
2149
  },
2148
2150
  {
2149
2151
  "kind": "field",
2150
- "name": "ignoreSelectChanges",
2152
+ "name": "testAudio",
2151
2153
  "type": {
2152
- "text": "boolean"
2154
+ "text": "HTMLAudioElement | null"
2153
2155
  },
2154
- "privacy": "private",
2155
- "default": "false",
2156
- "description": "Suppresses select change events while options are rebuilt."
2156
+ "default": "null",
2157
+ "description": "In-progress Test playback; not private — mixin return type is exported."
2157
2158
  },
2158
2159
  {
2159
2160
  "kind": "method",
2160
- "name": "onMatchModeChange",
2161
- "return": {
2162
- "type": {
2163
- "text": "boolean"
2164
- }
2165
- },
2161
+ "name": "loadExistingAlertSound",
2166
2162
  "parameters": [
2167
2163
  {
2168
- "name": "index",
2169
- "type": {
2170
- "text": "number"
2171
- }
2172
- },
2173
- {
2174
- "name": "event",
2164
+ "name": "dynamicRuleId",
2175
2165
  "type": {
2176
- "text": "Event"
2166
+ "text": "string"
2177
2167
  }
2178
2168
  }
2179
2169
  ]
2180
2170
  },
2181
2171
  {
2182
2172
  "kind": "method",
2183
- "name": "onPatternInput",
2184
- "return": {
2185
- "type": {
2186
- "text": "boolean"
2187
- }
2188
- },
2189
- "parameters": [
2190
- {
2191
- "name": "index",
2192
- "type": {
2193
- "text": "number"
2194
- }
2195
- },
2196
- {
2197
- "name": "event",
2198
- "type": {
2199
- "text": "Event"
2200
- }
2201
- }
2202
- ]
2173
+ "name": "openAlertSoundPicker"
2203
2174
  },
2204
2175
  {
2205
2176
  "kind": "method",
2206
- "name": "onRuleChange",
2207
- "return": {
2208
- "type": {
2209
- "text": "boolean"
2210
- }
2211
- },
2177
+ "name": "onAlertSoundSelected",
2212
2178
  "parameters": [
2213
- {
2214
- "name": "index",
2215
- "type": {
2216
- "text": "number"
2217
- }
2218
- },
2219
2179
  {
2220
2180
  "name": "event",
2221
2181
  "type": {
@@ -2226,939 +2186,806 @@
2226
2186
  },
2227
2187
  {
2228
2188
  "kind": "method",
2229
- "name": "openFilePicker",
2230
- "return": {
2231
- "type": {
2232
- "text": "boolean"
2233
- }
2234
- },
2235
- "parameters": [
2236
- {
2237
- "name": "index",
2238
- "type": {
2239
- "text": "number"
2240
- }
2241
- }
2242
- ]
2189
+ "name": "clearAttachedAlertSound"
2243
2190
  },
2244
2191
  {
2245
2192
  "kind": "method",
2246
- "name": "onFileSelected",
2247
- "return": {
2248
- "type": {
2249
- "text": "boolean"
2250
- }
2251
- },
2252
- "parameters": [
2253
- {
2254
- "name": "event",
2255
- "type": {
2256
- "text": "Event"
2257
- }
2258
- }
2259
- ]
2193
+ "name": "testAttachedAlertSound"
2260
2194
  },
2261
2195
  {
2262
2196
  "kind": "method",
2263
- "name": "clearSound",
2264
- "return": {
2265
- "type": {
2266
- "text": "boolean"
2267
- }
2268
- },
2269
- "parameters": [
2270
- {
2271
- "name": "index",
2272
- "type": {
2273
- "text": "number"
2274
- }
2275
- }
2276
- ]
2197
+ "name": "stopTestSound"
2277
2198
  },
2278
2199
  {
2279
2200
  "kind": "method",
2280
- "name": "testSound",
2281
- "return": {
2282
- "type": {
2283
- "text": "boolean"
2284
- }
2285
- },
2286
- "parameters": [
2287
- {
2288
- "name": "index",
2289
- "type": {
2290
- "text": "number"
2291
- }
2292
- }
2293
- ]
2201
+ "name": "resetAlertSoundState"
2294
2202
  },
2295
2203
  {
2296
2204
  "kind": "method",
2297
- "name": "toggleRuleMute",
2205
+ "name": "applyAlertSoundToPayload",
2298
2206
  "return": {
2299
2207
  "type": {
2300
- "text": "boolean"
2208
+ "text": "T"
2301
2209
  }
2302
2210
  },
2303
2211
  "parameters": [
2304
2212
  {
2305
- "name": "index",
2213
+ "name": "target",
2306
2214
  "type": {
2307
- "text": "number"
2215
+ "text": "T"
2308
2216
  }
2309
2217
  }
2310
- ]
2218
+ ],
2219
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
2311
2220
  },
2312
2221
  {
2313
2222
  "kind": "method",
2314
- "name": "onVolumeChange",
2315
- "return": {
2316
- "type": {
2317
- "text": "boolean"
2318
- }
2319
- },
2320
- "parameters": [
2321
- {
2322
- "name": "event",
2323
- "type": {
2324
- "text": "Event"
2325
- }
2326
- }
2327
- ]
2328
- },
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": [
2329
2228
  {
2330
- "kind": "method",
2331
- "name": "toggleMute",
2332
- "return": {
2333
- "type": {
2334
- "text": "boolean"
2335
- }
2229
+ "name": "Base",
2230
+ "type": {
2231
+ "text": "TBase"
2336
2232
  }
2337
- },
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": [
2338
2303
  {
2339
- "kind": "method",
2340
- "name": "addRule",
2341
- "return": {
2342
- "type": {
2343
- "text": "boolean"
2344
- }
2304
+ "kind": "field",
2305
+ "name": "id",
2306
+ "type": {
2307
+ "text": "string"
2345
2308
  }
2346
2309
  },
2347
2310
  {
2348
- "kind": "method",
2349
- "name": "removeRule",
2350
- "return": {
2351
- "type": {
2352
- "text": "boolean"
2353
- }
2354
- },
2355
- "parameters": [
2356
- {
2357
- "name": "index",
2358
- "type": {
2359
- "text": "number"
2360
- }
2361
- }
2362
- ]
2363
- },
2364
- {
2365
- "kind": "method",
2366
- "name": "reloadRules",
2367
- "return": {
2368
- "type": {
2369
- "text": "Promise<void>"
2370
- }
2371
- },
2372
- "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
2373
- },
2374
- {
2375
- "kind": "method",
2376
- "name": "loadRules",
2377
- "privacy": "private",
2378
- "return": {
2379
- "type": {
2380
- "text": "Promise<void>"
2381
- }
2311
+ "kind": "field",
2312
+ "name": "name",
2313
+ "type": {
2314
+ "text": "string"
2382
2315
  }
2383
2316
  },
2384
2317
  {
2385
- "kind": "method",
2386
- "name": "settleRuleOptions",
2387
- "privacy": "private",
2388
- "return": {
2389
- "type": {
2390
- "text": "Promise<void>"
2391
- }
2392
- },
2393
- "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."
2394
- },
2395
- {
2396
- "kind": "method",
2397
- "name": "applyRuleSelectValues",
2398
- "privacy": "private",
2399
- "return": {
2400
- "type": {
2401
- "text": "void"
2402
- }
2403
- },
2404
- "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...\"."
2405
- },
2406
- {
2407
- "kind": "method",
2408
- "name": "mapRules",
2409
- "privacy": "private",
2410
- "return": {
2411
- "type": {
2412
- "text": "AlertSoundSelectableRule[]"
2413
- }
2414
- },
2415
- "parameters": [
2416
- {
2417
- "name": "ruleList",
2418
- "type": {
2419
- "text": "NamedRuleRow[]"
2420
- }
2421
- }
2422
- ]
2423
- },
2424
- {
2425
- "kind": "method",
2426
- "name": "ruleMatchId",
2427
- "privacy": "private",
2428
- "return": {
2429
- "type": {
2430
- "text": "string"
2431
- }
2432
- },
2433
- "parameters": [
2434
- {
2435
- "name": "rule",
2436
- "type": {
2437
- "text": "NamedRuleRow | undefined"
2438
- }
2439
- }
2440
- ]
2318
+ "kind": "field",
2319
+ "name": "component",
2320
+ "type": {
2321
+ "text": "string"
2322
+ }
2441
2323
  },
2442
2324
  {
2443
- "kind": "method",
2444
- "name": "syncSoundState",
2445
- "privacy": "private"
2325
+ "kind": "field",
2326
+ "name": "right",
2327
+ "type": {
2328
+ "text": "string"
2329
+ }
2446
2330
  }
2447
- ],
2448
- "superclass": {
2449
- "name": "GenesisElement",
2450
- "package": "@genesislcap/web-core"
2331
+ ]
2332
+ },
2333
+ {
2334
+ "kind": "variable",
2335
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2336
+ "type": {
2337
+ "text": "NotificationDashboardTab[]"
2451
2338
  },
2452
- "tagName": "foundation-sounds-panel",
2453
- "customElement": true
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]"
2454
2340
  }
2455
2341
  ],
2456
2342
  "exports": [
2457
2343
  {
2458
2344
  "kind": "js",
2459
- "name": "FoundationSoundsPanel",
2345
+ "name": "NotificationDashboardTab",
2460
2346
  "declaration": {
2461
- "name": "FoundationSoundsPanel",
2462
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
2347
+ "name": "NotificationDashboardTab",
2348
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2463
2349
  }
2464
2350
  },
2465
2351
  {
2466
- "kind": "custom-element-definition",
2467
- "name": "foundation-sounds-panel",
2352
+ "kind": "js",
2353
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2468
2354
  "declaration": {
2469
- "name": "FoundationSoundsPanel",
2470
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
2355
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2356
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2471
2357
  }
2472
2358
  }
2473
2359
  ]
2474
2360
  },
2475
2361
  {
2476
2362
  "kind": "javascript-module",
2477
- "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
2363
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
2478
2364
  "declarations": [
2479
2365
  {
2480
2366
  "kind": "variable",
2481
- "name": "FoundationSoundsStyles",
2482
- "default": "css`\n :host {\n display: none;\n }\n`",
2483
- "description": "Headless layout listener — take no space in the layout chrome."
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`"
2484
2369
  }
2485
2370
  ],
2486
2371
  "exports": [
2487
2372
  {
2488
2373
  "kind": "js",
2489
- "name": "FoundationSoundsStyles",
2374
+ "name": "FoundationNotificationDashboardTemplate",
2490
2375
  "declaration": {
2491
- "name": "FoundationSoundsStyles",
2492
- "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
2376
+ "name": "FoundationNotificationDashboardTemplate",
2377
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
2493
2378
  }
2494
2379
  }
2495
2380
  ]
2496
2381
  },
2497
2382
  {
2498
2383
  "kind": "javascript-module",
2499
- "path": "src/components/foundation-sounds/foundation-sounds.ts",
2384
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
2500
2385
  "declarations": [
2501
2386
  {
2502
2387
  "kind": "class",
2503
- "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.",
2504
- "name": "FoundationSounds",
2388
+ "description": "",
2389
+ "name": "FoundationNotificationDashboard",
2505
2390
  "members": [
2506
2391
  {
2507
2392
  "kind": "field",
2508
- "name": "connect",
2393
+ "name": "auth",
2509
2394
  "type": {
2510
- "text": "Connect"
2395
+ "text": "Auth"
2511
2396
  }
2512
2397
  },
2513
2398
  {
2514
2399
  "kind": "field",
2515
- "name": "inboxService",
2400
+ "name": "ready",
2516
2401
  "type": {
2517
- "text": "FoundationInboxService"
2518
- }
2402
+ "text": "boolean"
2403
+ },
2404
+ "default": "false"
2519
2405
  },
2520
2406
  {
2521
2407
  "kind": "field",
2522
- "name": "ruleService",
2408
+ "name": "hasPermissions",
2523
2409
  "type": {
2524
- "text": "RuleService"
2525
- }
2526
- },
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
+ ],
2423
+ "exports": [
2424
+ {
2425
+ "kind": "js",
2426
+ "name": "FoundationNotificationDashboard",
2427
+ "declaration": {
2428
+ "name": "FoundationNotificationDashboard",
2429
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
2430
+ }
2431
+ },
2432
+ {
2433
+ "kind": "custom-element-definition",
2434
+ "name": "foundation-notification-dashboard",
2435
+ "declaration": {
2436
+ "name": "FoundationNotificationDashboard",
2437
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
2438
+ }
2439
+ }
2440
+ ]
2441
+ },
2442
+ {
2443
+ "kind": "javascript-module",
2444
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
2445
+ "declarations": [
2446
+ {
2447
+ "kind": "class",
2448
+ "description": "",
2449
+ "name": "UUIDGenerator",
2450
+ "members": [
2527
2451
  {
2528
2452
  "kind": "field",
2529
- "name": "soundEnabled",
2453
+ "name": "uuid",
2530
2454
  "type": {
2531
- "text": "boolean"
2455
+ "text": "UUID"
2532
2456
  },
2533
- "default": "true",
2534
- "description": "When false, new audible alerts are tracked but do not play."
2457
+ "privacy": "private",
2458
+ "static": true
2535
2459
  },
2536
2460
  {
2537
2461
  "kind": "field",
2538
- "name": "connectionSub",
2539
- "type": {
2540
- "text": "Subscription | undefined"
2541
- },
2542
- "privacy": "private"
2462
+ "name": "createUUID",
2463
+ "static": true
2464
+ }
2465
+ ]
2466
+ },
2467
+ {
2468
+ "kind": "function",
2469
+ "name": "isEmpty",
2470
+ "parameters": [
2471
+ {
2472
+ "name": "value"
2473
+ }
2474
+ ]
2475
+ },
2476
+ {
2477
+ "kind": "class",
2478
+ "description": "",
2479
+ "name": "DynamicRuleUtils",
2480
+ "members": [
2481
+ {
2482
+ "kind": "field",
2483
+ "name": "createEmptyCondition",
2484
+ "static": true
2543
2485
  },
2544
2486
  {
2545
2487
  "kind": "field",
2546
- "name": "player",
2547
- "privacy": "private",
2548
- "readonly": true
2488
+ "name": "createAssignment",
2489
+ "static": true
2549
2490
  },
2550
2491
  {
2551
2492
  "kind": "field",
2552
- "name": "knownAlertIds",
2553
- "privacy": "private",
2554
- "default": "new Set<string>()"
2493
+ "name": "createTextAssignment",
2494
+ "static": true
2555
2495
  },
2556
2496
  {
2557
2497
  "kind": "field",
2558
- "name": "serverSoundFetches",
2559
- "privacy": "private",
2560
- "readonly": true,
2561
- "default": "new Map<string, Promise<boolean>>()",
2562
- "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
2498
+ "name": "getAssignmentValue",
2499
+ "static": true
2500
+ },
2501
+ {
2502
+ "kind": "field",
2503
+ "name": "getAssignmentText",
2504
+ "static": true
2563
2505
  },
2564
2506
  {
2565
2507
  "kind": "method",
2566
- "name": "subscribeToAlerts",
2567
- "privacy": "private",
2508
+ "name": "createConditions",
2509
+ "static": true,
2568
2510
  "return": {
2569
2511
  "type": {
2570
- "text": "void"
2512
+ "text": "any"
2513
+ }
2514
+ },
2515
+ "parameters": [
2516
+ {
2517
+ "name": "conditions",
2518
+ "type": {
2519
+ "text": "ConditionNode[]"
2520
+ }
2521
+ },
2522
+ {
2523
+ "name": "parameters",
2524
+ "optional": true
2525
+ }
2526
+ ]
2527
+ },
2528
+ {
2529
+ "kind": "method",
2530
+ "name": "hasMultiValueCondition",
2531
+ "static": true,
2532
+ "return": {
2533
+ "type": {
2534
+ "text": "boolean"
2535
+ }
2536
+ },
2537
+ "parameters": [
2538
+ {
2539
+ "name": "conditions",
2540
+ "type": {
2541
+ "text": "ConditionNode[]"
2542
+ }
2543
+ }
2544
+ ]
2545
+ },
2546
+ {
2547
+ "kind": "method",
2548
+ "name": "hasOrJoin",
2549
+ "static": true,
2550
+ "return": {
2551
+ "type": {
2552
+ "text": "boolean"
2553
+ }
2554
+ },
2555
+ "parameters": [
2556
+ {
2557
+ "name": "conditions",
2558
+ "type": {
2559
+ "text": "ConditionNode[]"
2560
+ }
2561
+ }
2562
+ ]
2563
+ },
2564
+ {
2565
+ "kind": "method",
2566
+ "name": "hasGroup",
2567
+ "static": true,
2568
+ "return": {
2569
+ "type": {
2570
+ "text": "boolean"
2571
+ }
2572
+ },
2573
+ "parameters": [
2574
+ {
2575
+ "name": "conditions",
2576
+ "type": {
2577
+ "text": "ConditionNode[]"
2578
+ }
2579
+ }
2580
+ ]
2581
+ },
2582
+ {
2583
+ "kind": "method",
2584
+ "name": "hasUnsupportedOperator",
2585
+ "static": true,
2586
+ "return": {
2587
+ "type": {
2588
+ "text": "boolean"
2589
+ }
2590
+ },
2591
+ "parameters": [
2592
+ {
2593
+ "name": "conditions",
2594
+ "type": {
2595
+ "text": "ConditionNode[]"
2596
+ }
2597
+ }
2598
+ ]
2599
+ },
2600
+ {
2601
+ "kind": "method",
2602
+ "name": "flattenConditions",
2603
+ "static": true,
2604
+ "return": {
2605
+ "type": {
2606
+ "text": "ConditionBuilderEntity[]"
2571
2607
  }
2572
- }
2573
- },
2574
- {
2575
- "kind": "field",
2576
- "name": "subscriptionHandler",
2577
- "privacy": "private"
2608
+ },
2609
+ "parameters": [
2610
+ {
2611
+ "name": "conditions",
2612
+ "type": {
2613
+ "text": "ConditionNode[]"
2614
+ }
2615
+ }
2616
+ ]
2578
2617
  },
2579
2618
  {
2580
2619
  "kind": "method",
2581
- "name": "playForNewAlerts",
2582
- "privacy": "private",
2620
+ "name": "resolveLeftValues",
2621
+ "static": true,
2583
2622
  "return": {
2584
2623
  "type": {
2585
- "text": "Promise<void>"
2624
+ "text": "ConditionNode[]"
2586
2625
  }
2587
2626
  },
2588
2627
  "parameters": [
2589
2628
  {
2590
- "name": "rows",
2629
+ "name": "conditions",
2591
2630
  "type": {
2592
- "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
2631
+ "text": "ConditionNode[]"
2632
+ }
2633
+ },
2634
+ {
2635
+ "name": "fields",
2636
+ "type": {
2637
+ "text": "any[]"
2593
2638
  }
2594
2639
  }
2595
2640
  ]
2596
2641
  },
2642
+ {
2643
+ "kind": "field",
2644
+ "name": "createEmptyGroup",
2645
+ "static": true
2646
+ },
2597
2647
  {
2598
2648
  "kind": "method",
2599
- "name": "tryPlayServerSound",
2600
- "privacy": "private",
2649
+ "name": "buildRawExpression",
2650
+ "static": true,
2601
2651
  "return": {
2602
2652
  "type": {
2603
- "text": "Promise<boolean>"
2653
+ "text": "string"
2604
2654
  }
2605
2655
  },
2606
2656
  "parameters": [
2607
2657
  {
2608
- "name": "dynamicRuleId",
2658
+ "name": "conditions",
2609
2659
  "type": {
2610
- "text": "string"
2660
+ "text": "ConditionNode[]"
2611
2661
  }
2612
2662
  }
2613
2663
  ]
2614
2664
  },
2615
2665
  {
2616
2666
  "kind": "method",
2617
- "name": "fetchAndCacheServerSound",
2618
- "privacy": "private",
2667
+ "name": "parseRawExpression",
2668
+ "static": true,
2619
2669
  "return": {
2620
2670
  "type": {
2621
- "text": "Promise<boolean>"
2671
+ "text": "ConditionNode[] | null"
2622
2672
  }
2623
2673
  },
2624
2674
  "parameters": [
2625
2675
  {
2626
- "name": "dynamicRuleId",
2676
+ "name": "rawExpression",
2627
2677
  "type": {
2628
2678
  "text": "string"
2629
2679
  }
2630
2680
  }
2631
2681
  ]
2632
2682
  }
2633
- ],
2634
- "attributes": [
2635
- {
2636
- "name": "sound-enabled",
2637
- "type": {
2638
- "text": "boolean"
2639
- },
2640
- "default": "true",
2641
- "description": "When false, new audible alerts are tracked but do not play.",
2642
- "fieldName": "soundEnabled"
2643
- }
2644
- ],
2645
- "superclass": {
2646
- "name": "GenesisElement",
2647
- "package": "@genesislcap/web-core"
2648
- },
2649
- "tagName": "foundation-sounds",
2650
- "customElement": true
2651
- }
2652
- ],
2653
- "exports": [
2654
- {
2655
- "kind": "js",
2656
- "name": "FoundationSounds",
2657
- "declaration": {
2658
- "name": "FoundationSounds",
2659
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
2660
- }
2661
- },
2662
- {
2663
- "kind": "custom-element-definition",
2664
- "name": "foundation-sounds",
2665
- "declaration": {
2666
- "name": "FoundationSounds",
2667
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
2668
- }
2669
- }
2670
- ]
2671
- },
2672
- {
2673
- "kind": "javascript-module",
2674
- "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
2675
- "declarations": [
2676
- {
2677
- "kind": "variable",
2678
- "name": "alertSoundAttachmentTemplate",
2679
- "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`",
2680
- "description": "Shared Attach/Replace/Test/Clear UI for rule and template dialogs.",
2681
- "privacy": "public"
2683
+ ]
2682
2684
  },
2683
2685
  {
2684
- "kind": "mixin",
2685
- "description": "Mixin: pick / test / clear / load server sound + apply fields to submit payload.\n\nSubclasses must provide ruleService, isAlertSoundEditMode,\nalertSoundEntityId, and alertSoundCacheSyncMode.",
2686
- "name": "AlertSoundAttachmentMixin",
2686
+ "kind": "class",
2687
+ "description": "",
2688
+ "name": "TemplateUtils",
2687
2689
  "members": [
2688
2690
  {
2689
2691
  "kind": "field",
2690
- "name": "ruleService",
2691
- "type": {
2692
- "text": "RuleService"
2693
- }
2694
- },
2695
- {
2696
- "kind": "field",
2697
- "name": "isAlertSoundEditMode",
2698
- "type": {
2699
- "text": "boolean"
2700
- },
2701
- "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
2702
- "readonly": true
2703
- },
2704
- {
2705
- "kind": "field",
2706
- "name": "alertSoundEntityId",
2707
- "type": {
2708
- "text": "string | null"
2709
- },
2710
- "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
2711
- "readonly": true
2712
- },
2713
- {
2714
- "kind": "field",
2715
- "name": "alertSoundCacheSyncMode",
2716
- "type": {
2717
- "text": "'entity' | 'all'"
2718
- },
2719
- "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
2720
- "readonly": true
2721
- },
2722
- {
2723
- "kind": "field",
2724
- "name": "alertSoundFileName",
2725
- "type": {
2726
- "text": "string"
2727
- },
2728
- "default": "''",
2729
- "description": "Display name of the attached / pending alert sound file."
2730
- },
2731
- {
2732
- "kind": "field",
2733
- "name": "alertSoundMimeType",
2734
- "type": {
2735
- "text": "string"
2736
- },
2737
- "default": "''"
2738
- },
2739
- {
2740
- "kind": "field",
2741
- "name": "hasAlertSound",
2742
- "type": {
2743
- "text": "boolean"
2744
- },
2745
- "default": "false",
2746
- "description": "True when edit loaded an existing server sound (or user attached one)."
2747
- },
2748
- {
2749
- "kind": "field",
2750
- "name": "fileInput",
2751
- "type": {
2752
- "text": "HTMLInputElement"
2753
- }
2754
- },
2755
- {
2756
- "kind": "field",
2757
- "name": "pendingAlertSoundData",
2758
- "type": {
2759
- "text": "string | null"
2760
- },
2761
- "default": "null"
2762
- },
2763
- {
2764
- "kind": "field",
2765
- "name": "alertSoundDirty",
2766
- "type": {
2767
- "text": "boolean"
2768
- },
2769
- "default": "false",
2770
- "description": "True when the user picked a new file this session (needs upload)."
2771
- },
2772
- {
2773
- "kind": "field",
2774
- "name": "clearAlertSound",
2775
- "type": {
2776
- "text": "boolean"
2777
- },
2778
- "default": "false"
2692
+ "name": "createEmptyParameter",
2693
+ "static": true
2779
2694
  },
2780
2695
  {
2781
- "kind": "field",
2782
- "name": "testAudio",
2783
- "type": {
2784
- "text": "HTMLAudioElement | null"
2785
- },
2786
- "default": "null",
2787
- "description": "In-progress Test playback; not private — mixin return type is exported."
2696
+ "kind": "method",
2697
+ "name": "getParameters",
2698
+ "static": true,
2699
+ "parameters": [
2700
+ {
2701
+ "name": "parameters"
2702
+ }
2703
+ ]
2788
2704
  },
2789
2705
  {
2790
2706
  "kind": "method",
2791
- "name": "loadExistingAlertSound",
2707
+ "name": "buildRightValue",
2708
+ "privacy": "private",
2709
+ "static": true,
2792
2710
  "parameters": [
2793
2711
  {
2794
- "name": "dynamicRuleId",
2712
+ "name": "logicalOperator",
2795
2713
  "type": {
2796
- "text": "string"
2714
+ "text": "LogicalOperator"
2797
2715
  }
2716
+ },
2717
+ {
2718
+ "name": "condition"
2719
+ },
2720
+ {
2721
+ "name": "parameters",
2722
+ "optional": true
2798
2723
  }
2799
2724
  ]
2800
2725
  },
2801
2726
  {
2802
2727
  "kind": "method",
2803
- "name": "openAlertSoundPicker"
2728
+ "name": "getConditions",
2729
+ "static": true,
2730
+ "parameters": [
2731
+ {
2732
+ "name": "conditions"
2733
+ },
2734
+ {
2735
+ "name": "parameters",
2736
+ "optional": true
2737
+ }
2738
+ ]
2804
2739
  },
2805
2740
  {
2806
2741
  "kind": "method",
2807
- "name": "onAlertSoundSelected",
2742
+ "name": "createParameterDetails",
2743
+ "static": true,
2744
+ "parameters": [
2745
+ {
2746
+ "name": "parameters"
2747
+ }
2748
+ ]
2749
+ }
2750
+ ]
2751
+ },
2752
+ {
2753
+ "kind": "class",
2754
+ "description": "",
2755
+ "name": "RuleUtils",
2756
+ "members": [
2757
+ {
2758
+ "kind": "method",
2759
+ "name": "buildRightValue",
2760
+ "privacy": "private",
2761
+ "static": true,
2808
2762
  "parameters": [
2809
2763
  {
2810
- "name": "event",
2764
+ "name": "logicalOperator",
2811
2765
  "type": {
2812
- "text": "Event"
2766
+ "text": "LogicalOperator"
2813
2767
  }
2768
+ },
2769
+ {
2770
+ "name": "condition"
2814
2771
  }
2815
2772
  ]
2816
2773
  },
2817
2774
  {
2818
2775
  "kind": "method",
2819
- "name": "clearAttachedAlertSound"
2820
- },
2821
- {
2822
- "kind": "method",
2823
- "name": "testAttachedAlertSound"
2824
- },
2825
- {
2826
- "kind": "method",
2827
- "name": "stopTestSound"
2828
- },
2829
- {
2830
- "kind": "method",
2831
- "name": "resetAlertSoundState"
2832
- },
2833
- {
2834
- "kind": "method",
2835
- "name": "applyAlertSoundToPayload",
2836
- "return": {
2837
- "type": {
2838
- "text": "T"
2839
- }
2840
- },
2776
+ "name": "getConditions",
2777
+ "static": true,
2841
2778
  "parameters": [
2842
2779
  {
2843
- "name": "target",
2844
- "type": {
2845
- "text": "T"
2846
- }
2780
+ "name": "conditions"
2847
2781
  }
2848
- ],
2849
- "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
2850
- },
2851
- {
2852
- "kind": "method",
2853
- "name": "syncAlertSoundCacheAfterSave",
2854
- "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."
2782
+ ]
2855
2783
  }
2856
- ],
2784
+ ]
2785
+ },
2786
+ {
2787
+ "kind": "function",
2788
+ "name": "showNotificationError",
2857
2789
  "parameters": [
2858
2790
  {
2859
- "name": "Base",
2860
- "type": {
2861
- "text": "TBase"
2862
- }
2791
+ "name": "error"
2863
2792
  }
2864
- ],
2865
- "privacy": "public"
2793
+ ]
2866
2794
  }
2867
2795
  ],
2868
2796
  "exports": [
2869
2797
  {
2870
2798
  "kind": "js",
2871
- "name": "alertSoundAttachmentTemplate",
2799
+ "name": "UUIDGenerator",
2872
2800
  "declaration": {
2873
- "name": "alertSoundAttachmentTemplate",
2874
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2801
+ "name": "UUIDGenerator",
2802
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2875
2803
  }
2876
2804
  },
2877
2805
  {
2878
2806
  "kind": "js",
2879
- "name": "AlertSoundAttachmentMixin",
2807
+ "name": "isEmpty",
2880
2808
  "declaration": {
2881
- "name": "AlertSoundAttachmentMixin",
2882
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2809
+ "name": "isEmpty",
2810
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2883
2811
  }
2884
- }
2885
- ]
2886
- },
2887
- {
2888
- "kind": "javascript-module",
2889
- "path": "src/components/foundation-notification-dashboard/index.ts",
2890
- "declarations": [],
2891
- "exports": [
2812
+ },
2892
2813
  {
2893
2814
  "kind": "js",
2894
- "name": "*",
2815
+ "name": "DynamicRuleUtils",
2895
2816
  "declaration": {
2896
- "name": "*",
2897
- "package": "./notification-dashboard"
2817
+ "name": "DynamicRuleUtils",
2818
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2898
2819
  }
2899
- }
2900
- ]
2901
- },
2902
- {
2903
- "kind": "javascript-module",
2904
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
2905
- "declarations": [
2906
- {
2907
- "kind": "variable",
2908
- "name": "FoundationNotificationDashboardStyles",
2909
- "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`",
2910
- "privacy": "public"
2911
- }
2912
- ],
2913
- "exports": [
2820
+ },
2914
2821
  {
2915
2822
  "kind": "js",
2916
- "name": "FoundationNotificationDashboardStyles",
2823
+ "name": "TemplateUtils",
2917
2824
  "declaration": {
2918
- "name": "FoundationNotificationDashboardStyles",
2919
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
2825
+ "name": "TemplateUtils",
2826
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2920
2827
  }
2921
- }
2922
- ]
2923
- },
2924
- {
2925
- "kind": "javascript-module",
2926
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
2927
- "declarations": [
2928
- {
2929
- "kind": "class",
2930
- "description": "",
2931
- "name": "NotificationDashboardTab",
2932
- "members": [
2933
- {
2934
- "kind": "field",
2935
- "name": "id",
2936
- "type": {
2937
- "text": "string"
2938
- }
2939
- },
2940
- {
2941
- "kind": "field",
2942
- "name": "name",
2943
- "type": {
2944
- "text": "string"
2945
- }
2946
- },
2947
- {
2948
- "kind": "field",
2949
- "name": "component",
2950
- "type": {
2951
- "text": "string"
2952
- }
2953
- },
2954
- {
2955
- "kind": "field",
2956
- "name": "right",
2957
- "type": {
2958
- "text": "string"
2959
- }
2960
- }
2961
- ]
2962
2828
  },
2963
- {
2964
- "kind": "variable",
2965
- "name": "NOTIFICATION_DASHBOARD_TABS",
2966
- "type": {
2967
- "text": "NotificationDashboardTab[]"
2968
- },
2969
- "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]"
2970
- }
2971
- ],
2972
- "exports": [
2973
2829
  {
2974
2830
  "kind": "js",
2975
- "name": "NotificationDashboardTab",
2831
+ "name": "RuleUtils",
2976
2832
  "declaration": {
2977
- "name": "NotificationDashboardTab",
2978
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2833
+ "name": "RuleUtils",
2834
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2979
2835
  }
2980
2836
  },
2981
2837
  {
2982
2838
  "kind": "js",
2983
- "name": "NOTIFICATION_DASHBOARD_TABS",
2839
+ "name": "showNotificationError",
2984
2840
  "declaration": {
2985
- "name": "NOTIFICATION_DASHBOARD_TABS",
2986
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2841
+ "name": "showNotificationError",
2842
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2987
2843
  }
2988
2844
  }
2989
2845
  ]
2990
2846
  },
2991
2847
  {
2992
2848
  "kind": "javascript-module",
2993
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
2849
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2994
2850
  "declarations": [
2995
2851
  {
2996
2852
  "kind": "variable",
2997
- "name": "FoundationNotificationDashboardTemplate",
2998
- "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`"
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`"
2999
2855
  }
3000
2856
  ],
3001
2857
  "exports": [
3002
2858
  {
3003
2859
  "kind": "js",
3004
- "name": "FoundationNotificationDashboardTemplate",
2860
+ "name": "FoundationSoundsPanelStyles",
3005
2861
  "declaration": {
3006
- "name": "FoundationNotificationDashboardTemplate",
3007
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
2862
+ "name": "FoundationSoundsPanelStyles",
2863
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
3008
2864
  }
3009
2865
  }
3010
2866
  ]
3011
2867
  },
3012
2868
  {
3013
2869
  "kind": "javascript-module",
3014
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
2870
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
3015
2871
  "declarations": [
3016
2872
  {
3017
- "kind": "class",
3018
- "description": "",
3019
- "name": "FoundationNotificationDashboard",
3020
- "members": [
3021
- {
3022
- "kind": "field",
3023
- "name": "auth",
3024
- "type": {
3025
- "text": "Auth"
3026
- }
3027
- },
3028
- {
3029
- "kind": "field",
3030
- "name": "ready",
3031
- "type": {
3032
- "text": "boolean"
3033
- },
3034
- "default": "false"
3035
- },
3036
- {
3037
- "kind": "field",
3038
- "name": "hasPermissions",
3039
- "type": {
3040
- "text": "boolean"
3041
- },
3042
- "default": "true"
3043
- }
3044
- ],
3045
- "superclass": {
3046
- "name": "GenesisElement",
3047
- "package": "@genesislcap/web-core"
3048
- },
3049
- "tagName": "foundation-notification-dashboard",
3050
- "customElement": true
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`"
3051
2876
  }
3052
2877
  ],
3053
2878
  "exports": [
3054
2879
  {
3055
2880
  "kind": "js",
3056
- "name": "FoundationNotificationDashboard",
3057
- "declaration": {
3058
- "name": "FoundationNotificationDashboard",
3059
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3060
- }
3061
- },
3062
- {
3063
- "kind": "custom-element-definition",
3064
- "name": "foundation-notification-dashboard",
2881
+ "name": "FoundationSoundsPanelTemplate",
3065
2882
  "declaration": {
3066
- "name": "FoundationNotificationDashboard",
3067
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
2883
+ "name": "FoundationSoundsPanelTemplate",
2884
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
3068
2885
  }
3069
2886
  }
3070
2887
  ]
3071
2888
  },
3072
2889
  {
3073
2890
  "kind": "javascript-module",
3074
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
2891
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
3075
2892
  "declarations": [
3076
2893
  {
3077
2894
  "kind": "class",
3078
- "description": "",
3079
- "name": "UUIDGenerator",
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",
3080
2897
  "members": [
3081
2898
  {
3082
2899
  "kind": "field",
3083
- "name": "uuid",
2900
+ "name": "ruleService",
2901
+ "type": {
2902
+ "text": "RuleService"
2903
+ }
2904
+ },
2905
+ {
2906
+ "kind": "field",
2907
+ "name": "volumePercent",
3084
2908
  "type": {
3085
- "text": "UUID"
2909
+ "text": "number"
3086
2910
  },
3087
- "privacy": "private",
3088
- "static": true
2911
+ "default": "100",
2912
+ "description": "Global playback volume 0–100. @internal"
3089
2913
  },
3090
2914
  {
3091
2915
  "kind": "field",
3092
- "name": "createUUID",
3093
- "static": true
3094
- }
3095
- ]
3096
- },
3097
- {
3098
- "kind": "function",
3099
- "name": "isEmpty",
3100
- "parameters": [
3101
- {
3102
- "name": "value"
3103
- }
3104
- ]
3105
- },
3106
- {
3107
- "kind": "class",
3108
- "description": "",
3109
- "name": "DynamicRuleUtils",
3110
- "members": [
2916
+ "name": "selectableRules",
2917
+ "type": {
2918
+ "text": "AlertSoundSelectableRule[]"
2919
+ },
2920
+ "default": "[]",
2921
+ "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
2922
+ },
3111
2923
  {
3112
2924
  "kind": "field",
3113
- "name": "createEmptyCondition",
3114
- "static": true
2925
+ "name": "fileInput",
2926
+ "type": {
2927
+ "text": "HTMLInputElement"
2928
+ }
3115
2929
  },
3116
2930
  {
3117
2931
  "kind": "field",
3118
- "name": "createAssignment",
3119
- "static": true
2932
+ "name": "pendingRuleIndex",
2933
+ "type": {
2934
+ "text": "number | null"
2935
+ },
2936
+ "privacy": "private",
2937
+ "default": "null"
3120
2938
  },
3121
2939
  {
3122
2940
  "kind": "field",
3123
- "name": "createTextAssignment",
3124
- "static": true
2941
+ "name": "player",
2942
+ "privacy": "private",
2943
+ "readonly": true
3125
2944
  },
3126
2945
  {
3127
2946
  "kind": "field",
3128
- "name": "getAssignmentValue",
3129
- "static": true
2947
+ "name": "unsubscribePlayer",
2948
+ "type": {
2949
+ "text": "(() => void) | undefined"
2950
+ },
2951
+ "privacy": "private"
3130
2952
  },
3131
2953
  {
3132
2954
  "kind": "field",
3133
- "name": "getAssignmentText",
3134
- "static": true
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."
3135
2962
  },
3136
2963
  {
3137
2964
  "kind": "method",
3138
- "name": "createConditions",
3139
- "static": true,
2965
+ "name": "onMatchModeChange",
3140
2966
  "return": {
3141
2967
  "type": {
3142
- "text": "any"
2968
+ "text": "boolean"
3143
2969
  }
3144
2970
  },
3145
2971
  "parameters": [
3146
2972
  {
3147
- "name": "conditions",
2973
+ "name": "index",
3148
2974
  "type": {
3149
- "text": "ConditionNode[]"
2975
+ "text": "number"
3150
2976
  }
3151
2977
  },
3152
2978
  {
3153
- "name": "parameters",
3154
- "optional": true
2979
+ "name": "event",
2980
+ "type": {
2981
+ "text": "Event"
2982
+ }
3155
2983
  }
3156
2984
  ]
3157
2985
  },
3158
2986
  {
3159
2987
  "kind": "method",
3160
- "name": "hasMultiValueCondition",
3161
- "static": true,
2988
+ "name": "onPatternInput",
3162
2989
  "return": {
3163
2990
  "type": {
3164
2991
  "text": "boolean"
@@ -3166,17 +2993,22 @@
3166
2993
  },
3167
2994
  "parameters": [
3168
2995
  {
3169
- "name": "conditions",
2996
+ "name": "index",
3170
2997
  "type": {
3171
- "text": "ConditionNode[]"
2998
+ "text": "number"
2999
+ }
3000
+ },
3001
+ {
3002
+ "name": "event",
3003
+ "type": {
3004
+ "text": "Event"
3172
3005
  }
3173
3006
  }
3174
3007
  ]
3175
3008
  },
3176
3009
  {
3177
3010
  "kind": "method",
3178
- "name": "hasOrJoin",
3179
- "static": true,
3011
+ "name": "onRuleChange",
3180
3012
  "return": {
3181
3013
  "type": {
3182
3014
  "text": "boolean"
@@ -3184,17 +3016,22 @@
3184
3016
  },
3185
3017
  "parameters": [
3186
3018
  {
3187
- "name": "conditions",
3019
+ "name": "index",
3188
3020
  "type": {
3189
- "text": "ConditionNode[]"
3021
+ "text": "number"
3022
+ }
3023
+ },
3024
+ {
3025
+ "name": "event",
3026
+ "type": {
3027
+ "text": "Event"
3190
3028
  }
3191
3029
  }
3192
3030
  ]
3193
3031
  },
3194
3032
  {
3195
3033
  "kind": "method",
3196
- "name": "hasGroup",
3197
- "static": true,
3034
+ "name": "openFilePicker",
3198
3035
  "return": {
3199
3036
  "type": {
3200
3037
  "text": "boolean"
@@ -3202,17 +3039,16 @@
3202
3039
  },
3203
3040
  "parameters": [
3204
3041
  {
3205
- "name": "conditions",
3042
+ "name": "index",
3206
3043
  "type": {
3207
- "text": "ConditionNode[]"
3044
+ "text": "number"
3208
3045
  }
3209
3046
  }
3210
3047
  ]
3211
3048
  },
3212
3049
  {
3213
3050
  "kind": "method",
3214
- "name": "hasUnsupportedOperator",
3215
- "static": true,
3051
+ "name": "onFileSelected",
3216
3052
  "return": {
3217
3053
  "type": {
3218
3054
  "text": "boolean"
@@ -3220,64 +3056,180 @@
3220
3056
  },
3221
3057
  "parameters": [
3222
3058
  {
3223
- "name": "conditions",
3059
+ "name": "event",
3224
3060
  "type": {
3225
- "text": "ConditionNode[]"
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"
3226
3130
  }
3227
3131
  }
3228
- ]
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."
3229
3199
  },
3230
3200
  {
3231
3201
  "kind": "method",
3232
- "name": "flattenConditions",
3233
- "static": true,
3202
+ "name": "applyRuleSelectValues",
3203
+ "privacy": "private",
3234
3204
  "return": {
3235
3205
  "type": {
3236
- "text": "ConditionBuilderEntity[]"
3206
+ "text": "void"
3237
3207
  }
3238
3208
  },
3239
- "parameters": [
3240
- {
3241
- "name": "conditions",
3242
- "type": {
3243
- "text": "ConditionNode[]"
3244
- }
3245
- }
3246
- ]
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...\"."
3247
3210
  },
3248
3211
  {
3249
3212
  "kind": "method",
3250
- "name": "resolveLeftValues",
3251
- "static": true,
3213
+ "name": "mapRules",
3214
+ "privacy": "private",
3252
3215
  "return": {
3253
3216
  "type": {
3254
- "text": "ConditionNode[]"
3217
+ "text": "AlertSoundSelectableRule[]"
3255
3218
  }
3256
3219
  },
3257
3220
  "parameters": [
3258
3221
  {
3259
- "name": "conditions",
3260
- "type": {
3261
- "text": "ConditionNode[]"
3262
- }
3263
- },
3264
- {
3265
- "name": "fields",
3222
+ "name": "ruleList",
3266
3223
  "type": {
3267
- "text": "any[]"
3224
+ "text": "NamedRuleRow[]"
3268
3225
  }
3269
3226
  }
3270
3227
  ]
3271
3228
  },
3272
- {
3273
- "kind": "field",
3274
- "name": "createEmptyGroup",
3275
- "static": true
3276
- },
3277
3229
  {
3278
3230
  "kind": "method",
3279
- "name": "buildRawExpression",
3280
- "static": true,
3231
+ "name": "ruleMatchId",
3232
+ "privacy": "private",
3281
3233
  "return": {
3282
3234
  "type": {
3283
3235
  "text": "string"
@@ -3285,191 +3237,239 @@
3285
3237
  },
3286
3238
  "parameters": [
3287
3239
  {
3288
- "name": "conditions",
3240
+ "name": "rule",
3289
3241
  "type": {
3290
- "text": "ConditionNode[]"
3242
+ "text": "NamedRuleRow | undefined"
3291
3243
  }
3292
3244
  }
3293
3245
  ]
3294
3246
  },
3295
3247
  {
3296
3248
  "kind": "method",
3297
- "name": "parseRawExpression",
3298
- "static": true,
3299
- "return": {
3300
- "type": {
3301
- "text": "ConditionNode[] | null"
3302
- }
3303
- },
3304
- "parameters": [
3305
- {
3306
- "name": "rawExpression",
3307
- "type": {
3308
- "text": "string"
3309
- }
3310
- }
3311
- ]
3249
+ "name": "syncSoundState",
3250
+ "privacy": "private"
3312
3251
  }
3313
- ]
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
+ }
3314
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": [
3315
3306
  {
3316
3307
  "kind": "class",
3317
- "description": "",
3318
- "name": "TemplateUtils",
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",
3319
3310
  "members": [
3320
3311
  {
3321
3312
  "kind": "field",
3322
- "name": "createEmptyParameter",
3323
- "static": true
3313
+ "name": "connect",
3314
+ "type": {
3315
+ "text": "Connect"
3316
+ }
3324
3317
  },
3325
3318
  {
3326
- "kind": "method",
3327
- "name": "getParameters",
3328
- "static": true,
3329
- "parameters": [
3330
- {
3331
- "name": "parameters"
3332
- }
3333
- ]
3319
+ "kind": "field",
3320
+ "name": "inboxService",
3321
+ "type": {
3322
+ "text": "FoundationInboxService"
3323
+ }
3334
3324
  },
3335
3325
  {
3336
- "kind": "method",
3337
- "name": "buildRightValue",
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",
3338
3352
  "privacy": "private",
3339
- "static": true,
3340
- "parameters": [
3341
- {
3342
- "name": "logicalOperator",
3343
- "type": {
3344
- "text": "LogicalOperator"
3345
- }
3346
- },
3347
- {
3348
- "name": "condition"
3349
- },
3350
- {
3351
- "name": "parameters",
3352
- "optional": true
3353
- }
3354
- ]
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."
3355
3368
  },
3356
3369
  {
3357
3370
  "kind": "method",
3358
- "name": "getConditions",
3359
- "static": true,
3360
- "parameters": [
3361
- {
3362
- "name": "conditions"
3363
- },
3364
- {
3365
- "name": "parameters",
3366
- "optional": true
3371
+ "name": "subscribeToAlerts",
3372
+ "privacy": "private",
3373
+ "return": {
3374
+ "type": {
3375
+ "text": "void"
3367
3376
  }
3368
- ]
3377
+ }
3378
+ },
3379
+ {
3380
+ "kind": "field",
3381
+ "name": "subscriptionHandler",
3382
+ "privacy": "private"
3369
3383
  },
3370
3384
  {
3371
3385
  "kind": "method",
3372
- "name": "createParameterDetails",
3373
- "static": true,
3386
+ "name": "playForNewAlerts",
3387
+ "privacy": "private",
3388
+ "return": {
3389
+ "type": {
3390
+ "text": "Promise<void>"
3391
+ }
3392
+ },
3374
3393
  "parameters": [
3375
3394
  {
3376
- "name": "parameters"
3395
+ "name": "rows",
3396
+ "type": {
3397
+ "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
3398
+ }
3377
3399
  }
3378
3400
  ]
3379
- }
3380
- ]
3381
- },
3382
- {
3383
- "kind": "class",
3384
- "description": "",
3385
- "name": "RuleUtils",
3386
- "members": [
3401
+ },
3387
3402
  {
3388
3403
  "kind": "method",
3389
- "name": "buildRightValue",
3404
+ "name": "tryPlayServerSound",
3390
3405
  "privacy": "private",
3391
- "static": true,
3406
+ "return": {
3407
+ "type": {
3408
+ "text": "Promise<boolean>"
3409
+ }
3410
+ },
3392
3411
  "parameters": [
3393
3412
  {
3394
- "name": "logicalOperator",
3413
+ "name": "dynamicRuleId",
3395
3414
  "type": {
3396
- "text": "LogicalOperator"
3415
+ "text": "string"
3397
3416
  }
3398
- },
3399
- {
3400
- "name": "condition"
3401
3417
  }
3402
3418
  ]
3403
3419
  },
3404
3420
  {
3405
3421
  "kind": "method",
3406
- "name": "getConditions",
3407
- "static": true,
3422
+ "name": "fetchAndCacheServerSound",
3423
+ "privacy": "private",
3424
+ "return": {
3425
+ "type": {
3426
+ "text": "Promise<boolean>"
3427
+ }
3428
+ },
3408
3429
  "parameters": [
3409
3430
  {
3410
- "name": "conditions"
3431
+ "name": "dynamicRuleId",
3432
+ "type": {
3433
+ "text": "string"
3434
+ }
3411
3435
  }
3412
3436
  ]
3413
3437
  }
3414
- ]
3415
- },
3416
- {
3417
- "kind": "function",
3418
- "name": "showNotificationError",
3419
- "parameters": [
3438
+ ],
3439
+ "attributes": [
3420
3440
  {
3421
- "name": "error"
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"
3422
3448
  }
3423
- ]
3449
+ ],
3450
+ "superclass": {
3451
+ "name": "GenesisElement",
3452
+ "package": "@genesislcap/web-core"
3453
+ },
3454
+ "tagName": "foundation-sounds",
3455
+ "customElement": true
3424
3456
  }
3425
3457
  ],
3426
3458
  "exports": [
3427
3459
  {
3428
3460
  "kind": "js",
3429
- "name": "UUIDGenerator",
3430
- "declaration": {
3431
- "name": "UUIDGenerator",
3432
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3433
- }
3434
- },
3435
- {
3436
- "kind": "js",
3437
- "name": "isEmpty",
3438
- "declaration": {
3439
- "name": "isEmpty",
3440
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3441
- }
3442
- },
3443
- {
3444
- "kind": "js",
3445
- "name": "DynamicRuleUtils",
3446
- "declaration": {
3447
- "name": "DynamicRuleUtils",
3448
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3449
- }
3450
- },
3451
- {
3452
- "kind": "js",
3453
- "name": "TemplateUtils",
3454
- "declaration": {
3455
- "name": "TemplateUtils",
3456
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3457
- }
3458
- },
3459
- {
3460
- "kind": "js",
3461
- "name": "RuleUtils",
3461
+ "name": "FoundationSounds",
3462
3462
  "declaration": {
3463
- "name": "RuleUtils",
3464
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3463
+ "name": "FoundationSounds",
3464
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
3465
3465
  }
3466
3466
  },
3467
3467
  {
3468
- "kind": "js",
3469
- "name": "showNotificationError",
3468
+ "kind": "custom-element-definition",
3469
+ "name": "foundation-sounds",
3470
3470
  "declaration": {
3471
- "name": "showNotificationError",
3472
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3471
+ "name": "FoundationSounds",
3472
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
3473
3473
  }
3474
3474
  }
3475
3475
  ]
@@ -8869,284 +8869,126 @@
8869
8869
  "kind": "field",
8870
8870
  "name": "sourceSelected",
8871
8871
  "type": {
8872
- "text": "string"
8873
- }
8874
- },
8875
- {
8876
- "kind": "field",
8877
- "name": "sourceTyped",
8878
- "type": {
8879
- "text": "string"
8880
- }
8881
- },
8882
- {
8883
- "kind": "field",
8884
- "name": "sourceTextField",
8885
- "type": {
8886
- "text": "TextField"
8887
- }
8888
- },
8889
- {
8890
- "kind": "field",
8891
- "name": "sourceSelect",
8892
- "type": {
8893
- "text": "Select"
8894
- }
8895
- },
8896
- {
8897
- "kind": "field",
8898
- "name": "reqRepItems",
8899
- "type": {
8900
- "text": "array"
8901
- },
8902
- "default": "['REQUEST_1', 'REQUEST_2', 'REQUEST_3']"
8903
- },
8904
- {
8905
- "kind": "method",
8906
- "name": "deleteParameter"
8907
- },
8908
- {
8909
- "kind": "method",
8910
- "name": "parameterChanged"
8911
- },
8912
- {
8913
- "kind": "method",
8914
- "name": "nameChanged"
8915
- },
8916
- {
8917
- "kind": "method",
8918
- "name": "labelChanged"
8919
- },
8920
- {
8921
- "kind": "method",
8922
- "name": "typeChanged"
8923
- },
8924
- {
8925
- "kind": "method",
8926
- "name": "sourceTypeChanged"
8927
- },
8928
- {
8929
- "kind": "method",
8930
- "name": "sourceSelectedChanged"
8931
- },
8932
- {
8933
- "kind": "method",
8934
- "name": "sourceTypedChanged"
8935
- },
8936
- {
8937
- "kind": "method",
8938
- "name": "genericChanged",
8939
- "privacy": "private",
8940
- "parameters": [
8941
- {
8942
- "name": "parameterAttribute"
8943
- },
8944
- {
8945
- "name": "value"
8946
- }
8947
- ]
8948
- }
8949
- ],
8950
- "events": [
8951
- {
8952
- "description": "Fired when a parameter is deleted. detail: `ParameterBuilderEntity`",
8953
- "name": "delete"
8954
- },
8955
- {
8956
- "description": "Fired when a parameter is edited. detail: `ParameterBuilderEntity`",
8957
- "name": "edit"
8958
- }
8959
- ],
8960
- "attributes": [
8961
- {
8962
- "name": "parameter",
8963
- "type": {
8964
- "text": "ParameterBuilderEntity"
8965
- },
8966
- "fieldName": "parameter"
8967
- }
8968
- ],
8969
- "superclass": {
8970
- "name": "GenesisElement",
8971
- "package": "@genesislcap/web-core"
8972
- },
8973
- "tagName": "parameter-builder",
8974
- "customElement": true
8975
- }
8976
- ],
8977
- "exports": [
8978
- {
8979
- "kind": "js",
8980
- "name": "ParameterBuilder",
8981
- "declaration": {
8982
- "name": "ParameterBuilder",
8983
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
8984
- }
8985
- },
8986
- {
8987
- "kind": "custom-element-definition",
8988
- "name": "parameter-builder",
8989
- "declaration": {
8990
- "name": "ParameterBuilder",
8991
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
8992
- }
8993
- }
8994
- ]
8995
- },
8996
- {
8997
- "kind": "javascript-module",
8998
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts",
8999
- "declarations": [
9000
- {
9001
- "kind": "variable",
9002
- "name": "TemplateConditionGroupTemplate",
9003
- "default": "html<TemplateConditionGroup>`\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, TemplateConditionGroup>`\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.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(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.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></template-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`"
9004
- }
9005
- ],
9006
- "exports": [
9007
- {
9008
- "kind": "js",
9009
- "name": "TemplateConditionGroupTemplate",
9010
- "declaration": {
9011
- "name": "TemplateConditionGroupTemplate",
9012
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts"
9013
- }
9014
- }
9015
- ]
9016
- },
9017
- {
9018
- "kind": "javascript-module",
9019
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts",
9020
- "declarations": [
9021
- {
9022
- "kind": "class",
9023
- "description": "Parenthesized group of conditions/nested groups for notification template\ncriteria - see rule-condition-group for the rationale. Also forwards\n:parameters down to nested template-condition-builder rows so parameter\nbinding (USER_ENTRY) keeps working inside a group.",
9024
- "name": "TemplateConditionGroup",
9025
- "members": [
9026
- {
9027
- "kind": "field",
9028
- "name": "node",
9029
- "type": {
9030
- "text": "ConditionGroupEntity"
9031
- }
9032
- },
9033
- {
9034
- "kind": "field",
9035
- "name": "fields",
9036
- "type": {
9037
- "text": "Field[]"
9038
- },
9039
- "default": "[]"
8872
+ "text": "string"
8873
+ }
9040
8874
  },
9041
8875
  {
9042
8876
  "kind": "field",
9043
- "name": "parameters",
8877
+ "name": "sourceTyped",
9044
8878
  "type": {
9045
- "text": "Array<ParameterBuilderEntity>"
9046
- },
9047
- "default": "[]"
8879
+ "text": "string"
8880
+ }
9048
8881
  },
9049
8882
  {
9050
8883
  "kind": "field",
9051
- "name": "isFirst",
8884
+ "name": "sourceTextField",
9052
8885
  "type": {
9053
- "text": "boolean"
9054
- },
9055
- "default": "false"
8886
+ "text": "TextField"
8887
+ }
9056
8888
  },
9057
8889
  {
9058
8890
  "kind": "field",
9059
- "name": "joinOperator",
8891
+ "name": "sourceSelect",
9060
8892
  "type": {
9061
- "text": "string"
8893
+ "text": "Select"
9062
8894
  }
9063
8895
  },
9064
8896
  {
9065
8897
  "kind": "field",
9066
- "name": "groupChildren",
8898
+ "name": "reqRepItems",
9067
8899
  "type": {
9068
- "text": "ConditionNode[]"
8900
+ "text": "array"
9069
8901
  },
9070
- "default": "[]"
8902
+ "default": "['REQUEST_1', 'REQUEST_2', 'REQUEST_3']"
9071
8903
  },
9072
8904
  {
9073
8905
  "kind": "method",
9074
- "name": "nodeChanged"
8906
+ "name": "deleteParameter"
9075
8907
  },
9076
8908
  {
9077
8909
  "kind": "method",
9078
- "name": "joinOperatorChanged"
8910
+ "name": "parameterChanged"
9079
8911
  },
9080
8912
  {
9081
8913
  "kind": "method",
9082
- "name": "newCondition"
8914
+ "name": "nameChanged"
9083
8915
  },
9084
8916
  {
9085
8917
  "kind": "method",
9086
- "name": "newGroup"
8918
+ "name": "labelChanged"
9087
8919
  },
9088
8920
  {
9089
8921
  "kind": "method",
9090
- "name": "editChild",
9091
- "parameters": [
9092
- {
9093
- "name": "_editedChild",
9094
- "type": {
9095
- "text": "ConditionNode"
9096
- }
9097
- }
9098
- ]
8922
+ "name": "typeChanged"
9099
8923
  },
9100
8924
  {
9101
8925
  "kind": "method",
9102
- "name": "deleteChild",
8926
+ "name": "sourceTypeChanged"
8927
+ },
8928
+ {
8929
+ "kind": "method",
8930
+ "name": "sourceSelectedChanged"
8931
+ },
8932
+ {
8933
+ "kind": "method",
8934
+ "name": "sourceTypedChanged"
8935
+ },
8936
+ {
8937
+ "kind": "method",
8938
+ "name": "genericChanged",
8939
+ "privacy": "private",
9103
8940
  "parameters": [
9104
8941
  {
9105
- "name": "deletedChild",
9106
- "type": {
9107
- "text": "ConditionNode"
9108
- }
8942
+ "name": "parameterAttribute"
8943
+ },
8944
+ {
8945
+ "name": "value"
9109
8946
  }
9110
8947
  ]
9111
- },
9112
- {
9113
- "kind": "method",
9114
- "name": "deleteSelf"
9115
8948
  }
9116
8949
  ],
9117
8950
  "events": [
9118
8951
  {
9119
- "description": "Fired when this whole group should be removed",
8952
+ "description": "Fired when a parameter is deleted. detail: `ParameterBuilderEntity`",
9120
8953
  "name": "delete"
9121
8954
  },
9122
8955
  {
9123
- "description": "Fired when anything inside this group changes",
8956
+ "description": "Fired when a parameter is edited. detail: `ParameterBuilderEntity`",
9124
8957
  "name": "edit"
9125
8958
  }
9126
8959
  ],
8960
+ "attributes": [
8961
+ {
8962
+ "name": "parameter",
8963
+ "type": {
8964
+ "text": "ParameterBuilderEntity"
8965
+ },
8966
+ "fieldName": "parameter"
8967
+ }
8968
+ ],
9127
8969
  "superclass": {
9128
8970
  "name": "GenesisElement",
9129
8971
  "package": "@genesislcap/web-core"
9130
8972
  },
9131
- "tagName": "template-condition-group",
8973
+ "tagName": "parameter-builder",
9132
8974
  "customElement": true
9133
8975
  }
9134
8976
  ],
9135
8977
  "exports": [
9136
8978
  {
9137
8979
  "kind": "js",
9138
- "name": "TemplateConditionGroup",
8980
+ "name": "ParameterBuilder",
9139
8981
  "declaration": {
9140
- "name": "TemplateConditionGroup",
9141
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
8982
+ "name": "ParameterBuilder",
8983
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
9142
8984
  }
9143
8985
  },
9144
8986
  {
9145
8987
  "kind": "custom-element-definition",
9146
- "name": "template-condition-group",
8988
+ "name": "parameter-builder",
9147
8989
  "declaration": {
9148
- "name": "TemplateConditionGroup",
9149
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
8990
+ "name": "ParameterBuilder",
8991
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
9150
8992
  }
9151
8993
  }
9152
8994
  ]
@@ -9417,6 +9259,164 @@
9417
9259
  }
9418
9260
  }
9419
9261
  ]
9262
+ },
9263
+ {
9264
+ "kind": "javascript-module",
9265
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts",
9266
+ "declarations": [
9267
+ {
9268
+ "kind": "variable",
9269
+ "name": "TemplateConditionGroupTemplate",
9270
+ "default": "html<TemplateConditionGroup>`\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, TemplateConditionGroup>`\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.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(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.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></template-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`"
9271
+ }
9272
+ ],
9273
+ "exports": [
9274
+ {
9275
+ "kind": "js",
9276
+ "name": "TemplateConditionGroupTemplate",
9277
+ "declaration": {
9278
+ "name": "TemplateConditionGroupTemplate",
9279
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts"
9280
+ }
9281
+ }
9282
+ ]
9283
+ },
9284
+ {
9285
+ "kind": "javascript-module",
9286
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts",
9287
+ "declarations": [
9288
+ {
9289
+ "kind": "class",
9290
+ "description": "Parenthesized group of conditions/nested groups for notification template\ncriteria - see rule-condition-group for the rationale. Also forwards\n:parameters down to nested template-condition-builder rows so parameter\nbinding (USER_ENTRY) keeps working inside a group.",
9291
+ "name": "TemplateConditionGroup",
9292
+ "members": [
9293
+ {
9294
+ "kind": "field",
9295
+ "name": "node",
9296
+ "type": {
9297
+ "text": "ConditionGroupEntity"
9298
+ }
9299
+ },
9300
+ {
9301
+ "kind": "field",
9302
+ "name": "fields",
9303
+ "type": {
9304
+ "text": "Field[]"
9305
+ },
9306
+ "default": "[]"
9307
+ },
9308
+ {
9309
+ "kind": "field",
9310
+ "name": "parameters",
9311
+ "type": {
9312
+ "text": "Array<ParameterBuilderEntity>"
9313
+ },
9314
+ "default": "[]"
9315
+ },
9316
+ {
9317
+ "kind": "field",
9318
+ "name": "isFirst",
9319
+ "type": {
9320
+ "text": "boolean"
9321
+ },
9322
+ "default": "false"
9323
+ },
9324
+ {
9325
+ "kind": "field",
9326
+ "name": "joinOperator",
9327
+ "type": {
9328
+ "text": "string"
9329
+ }
9330
+ },
9331
+ {
9332
+ "kind": "field",
9333
+ "name": "groupChildren",
9334
+ "type": {
9335
+ "text": "ConditionNode[]"
9336
+ },
9337
+ "default": "[]"
9338
+ },
9339
+ {
9340
+ "kind": "method",
9341
+ "name": "nodeChanged"
9342
+ },
9343
+ {
9344
+ "kind": "method",
9345
+ "name": "joinOperatorChanged"
9346
+ },
9347
+ {
9348
+ "kind": "method",
9349
+ "name": "newCondition"
9350
+ },
9351
+ {
9352
+ "kind": "method",
9353
+ "name": "newGroup"
9354
+ },
9355
+ {
9356
+ "kind": "method",
9357
+ "name": "editChild",
9358
+ "parameters": [
9359
+ {
9360
+ "name": "_editedChild",
9361
+ "type": {
9362
+ "text": "ConditionNode"
9363
+ }
9364
+ }
9365
+ ]
9366
+ },
9367
+ {
9368
+ "kind": "method",
9369
+ "name": "deleteChild",
9370
+ "parameters": [
9371
+ {
9372
+ "name": "deletedChild",
9373
+ "type": {
9374
+ "text": "ConditionNode"
9375
+ }
9376
+ }
9377
+ ]
9378
+ },
9379
+ {
9380
+ "kind": "method",
9381
+ "name": "deleteSelf"
9382
+ }
9383
+ ],
9384
+ "events": [
9385
+ {
9386
+ "description": "Fired when this whole group should be removed",
9387
+ "name": "delete"
9388
+ },
9389
+ {
9390
+ "description": "Fired when anything inside this group changes",
9391
+ "name": "edit"
9392
+ }
9393
+ ],
9394
+ "superclass": {
9395
+ "name": "GenesisElement",
9396
+ "package": "@genesislcap/web-core"
9397
+ },
9398
+ "tagName": "template-condition-group",
9399
+ "customElement": true
9400
+ }
9401
+ ],
9402
+ "exports": [
9403
+ {
9404
+ "kind": "js",
9405
+ "name": "TemplateConditionGroup",
9406
+ "declaration": {
9407
+ "name": "TemplateConditionGroup",
9408
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
9409
+ }
9410
+ },
9411
+ {
9412
+ "kind": "custom-element-definition",
9413
+ "name": "template-condition-group",
9414
+ "declaration": {
9415
+ "name": "TemplateConditionGroup",
9416
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
9417
+ }
9418
+ }
9419
+ ]
9420
9420
  }
9421
9421
  ]
9422
9422
  }