@genesislcap/pbc-notify-ui 15.11.0 → 15.12.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,320 +2186,755 @@
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",
2223
+ "name": "syncAlertSoundCacheAfterSave",
2224
+ "description": "Keep AlertSoundPlayer's in-memory NOTIFY_ALERT_SOUND cache in sync with\nwhat we just saved — otherwise the next alert still plays the old file."
2225
+ }
2226
+ ],
2227
+ "parameters": [
2228
+ {
2229
+ "name": "Base",
2230
+ "type": {
2231
+ "text": "TBase"
2232
+ }
2233
+ }
2234
+ ],
2235
+ "privacy": "public"
2236
+ }
2237
+ ],
2238
+ "exports": [
2239
+ {
2240
+ "kind": "js",
2241
+ "name": "alertSoundAttachmentTemplate",
2242
+ "declaration": {
2243
+ "name": "alertSoundAttachmentTemplate",
2244
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2245
+ }
2246
+ },
2247
+ {
2248
+ "kind": "js",
2249
+ "name": "AlertSoundAttachmentMixin",
2250
+ "declaration": {
2251
+ "name": "AlertSoundAttachmentMixin",
2252
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2253
+ }
2254
+ }
2255
+ ]
2256
+ },
2257
+ {
2258
+ "kind": "javascript-module",
2259
+ "path": "src/components/foundation-notification-dashboard/index.ts",
2260
+ "declarations": [],
2261
+ "exports": [
2262
+ {
2263
+ "kind": "js",
2264
+ "name": "*",
2265
+ "declaration": {
2266
+ "name": "*",
2267
+ "package": "./notification-dashboard"
2268
+ }
2269
+ }
2270
+ ]
2271
+ },
2272
+ {
2273
+ "kind": "javascript-module",
2274
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
2275
+ "declarations": [
2276
+ {
2277
+ "kind": "variable",
2278
+ "name": "FoundationNotificationDashboardStyles",
2279
+ "default": "css`\n .notification-dashboard,\n rapid-tabs,\n rapid-tab-panel {\n height: 100%;\n }\n\n .no-permissions {\n font-family: var(--body-font);\n color: var(--neutral-foreground-rest);\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n`",
2280
+ "privacy": "public"
2281
+ }
2282
+ ],
2283
+ "exports": [
2284
+ {
2285
+ "kind": "js",
2286
+ "name": "FoundationNotificationDashboardStyles",
2287
+ "declaration": {
2288
+ "name": "FoundationNotificationDashboardStyles",
2289
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
2290
+ }
2291
+ }
2292
+ ]
2293
+ },
2294
+ {
2295
+ "kind": "javascript-module",
2296
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
2297
+ "declarations": [
2298
+ {
2299
+ "kind": "class",
2300
+ "description": "",
2301
+ "name": "NotificationDashboardTab",
2302
+ "members": [
2303
+ {
2304
+ "kind": "field",
2305
+ "name": "id",
2306
+ "type": {
2307
+ "text": "string"
2308
+ }
2309
+ },
2310
+ {
2311
+ "kind": "field",
2312
+ "name": "name",
2313
+ "type": {
2314
+ "text": "string"
2315
+ }
2316
+ },
2317
+ {
2318
+ "kind": "field",
2319
+ "name": "component",
2320
+ "type": {
2321
+ "text": "string"
2322
+ }
2323
+ },
2324
+ {
2325
+ "kind": "field",
2326
+ "name": "right",
2327
+ "type": {
2328
+ "text": "string"
2329
+ }
2330
+ }
2331
+ ]
2332
+ },
2333
+ {
2334
+ "kind": "variable",
2335
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2336
+ "type": {
2337
+ "text": "NotificationDashboardTab[]"
2338
+ },
2339
+ "default": "[\n {\n id: 'rules',\n name: 'Rules',\n component: 'rule-management',\n right: 'NotificationRuleView',\n },\n {\n id: 'templates',\n name: 'Templates',\n component: 'template-management',\n right: 'NotificationRuleTemplateView',\n },\n {\n id: 'routes',\n name: 'Routes',\n component: 'route-management',\n right: 'NotificationRouteView',\n },\n /* TODO: Not needed at the moment\n {\n id: 'notify-audit',\n name: 'Notify Audit',\n component: 'notify-audit-management',\n right: 'NotificationAuditView',\n },\n */\n]"
2340
+ }
2341
+ ],
2342
+ "exports": [
2343
+ {
2344
+ "kind": "js",
2345
+ "name": "NotificationDashboardTab",
2346
+ "declaration": {
2347
+ "name": "NotificationDashboardTab",
2348
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2349
+ }
2350
+ },
2351
+ {
2352
+ "kind": "js",
2353
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2354
+ "declaration": {
2355
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2356
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2357
+ }
2358
+ }
2359
+ ]
2360
+ },
2361
+ {
2362
+ "kind": "javascript-module",
2363
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
2364
+ "declarations": [
2365
+ {
2366
+ "kind": "variable",
2367
+ "name": "FoundationNotificationDashboardTemplate",
2368
+ "default": "html<FoundationNotificationDashboard>`\n <div class=\"notification-dashboard\">\n ${whenElse(\n (x) => x.hasPermissions,\n html`\n <rapid-tabs class=\"tabs\">\n <!-- Tabs -->\n ${repeat(\n (_) => NOTIFICATION_DASHBOARD_TABS,\n html<NotificationDashboardTab>`\n ${when(\n (x, c) => (c.parent.auth as Auth).currentUser.hasPermission(x.right),\n html<NotificationDashboardTab>`\n <rapid-tab slot=\"${(x) => x.id}-tab\">${(x) => x.name}</rapid-tab>\n `,\n )}\n `,\n )}\n\n <!-- Panels -->\n ${repeat(\n (_) => NOTIFICATION_DASHBOARD_TABS,\n html<NotificationDashboardTab>`\n ${when(\n (x, c) => (c.parent.auth as Auth).currentUser.hasPermission(x.right),\n html`\n ${\n /* HTML Render */\n (x) => html<NotificationDashboardTab>`\n <rapid-tab-panel slot=\"${x.id}-tab\"\n id=\"${x.id}-tab-panel\">\n <${x.component}></${x.component}>\n </rapid-tab-panel>\n `\n }\n `,\n )}\n `,\n )}\n </rapid-tabs>\n `,\n html`\n <div class=\"no-permissions\">\n <label>User has no permissions to view Notification Screens</label>\n </div>\n `,\n )}\n </div>\n`"
2369
+ }
2370
+ ],
2371
+ "exports": [
2372
+ {
2373
+ "kind": "js",
2374
+ "name": "FoundationNotificationDashboardTemplate",
2375
+ "declaration": {
2376
+ "name": "FoundationNotificationDashboardTemplate",
2377
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
2378
+ }
2379
+ }
2380
+ ]
2381
+ },
2382
+ {
2383
+ "kind": "javascript-module",
2384
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
2385
+ "declarations": [
2386
+ {
2387
+ "kind": "class",
2388
+ "description": "",
2389
+ "name": "FoundationNotificationDashboard",
2390
+ "members": [
2391
+ {
2392
+ "kind": "field",
2393
+ "name": "auth",
2394
+ "type": {
2395
+ "text": "Auth"
2396
+ }
2397
+ },
2398
+ {
2399
+ "kind": "field",
2400
+ "name": "ready",
2401
+ "type": {
2402
+ "text": "boolean"
2403
+ },
2404
+ "default": "false"
2405
+ },
2406
+ {
2407
+ "kind": "field",
2408
+ "name": "hasPermissions",
2409
+ "type": {
2410
+ "text": "boolean"
2411
+ },
2412
+ "default": "true"
2413
+ }
2414
+ ],
2415
+ "superclass": {
2416
+ "name": "GenesisElement",
2417
+ "package": "@genesislcap/web-core"
2418
+ },
2419
+ "tagName": "foundation-notification-dashboard",
2420
+ "customElement": true
2421
+ }
2422
+ ],
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": [
2451
+ {
2452
+ "kind": "field",
2453
+ "name": "uuid",
2454
+ "type": {
2455
+ "text": "UUID"
2456
+ },
2457
+ "privacy": "private",
2458
+ "static": true
2459
+ },
2460
+ {
2461
+ "kind": "field",
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
2485
+ },
2486
+ {
2487
+ "kind": "field",
2488
+ "name": "createAssignment",
2489
+ "static": true
2490
+ },
2491
+ {
2492
+ "kind": "field",
2493
+ "name": "createTextAssignment",
2494
+ "static": true
2495
+ },
2496
+ {
2497
+ "kind": "field",
2498
+ "name": "getAssignmentValue",
2499
+ "static": true
2500
+ },
2501
+ {
2502
+ "kind": "field",
2503
+ "name": "getAssignmentText",
2504
+ "static": true
2505
+ },
2506
+ {
2507
+ "kind": "method",
2508
+ "name": "createConditions",
2509
+ "static": true,
2510
+ "return": {
2511
+ "type": {
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[]"
2607
+ }
2608
+ },
2609
+ "parameters": [
2610
+ {
2611
+ "name": "conditions",
2612
+ "type": {
2613
+ "text": "ConditionNode[]"
2614
+ }
2615
+ }
2616
+ ]
2617
+ },
2618
+ {
2619
+ "kind": "method",
2620
+ "name": "resolveLeftValues",
2621
+ "static": true,
2315
2622
  "return": {
2316
2623
  "type": {
2317
- "text": "boolean"
2624
+ "text": "ConditionNode[]"
2318
2625
  }
2319
2626
  },
2320
2627
  "parameters": [
2321
2628
  {
2322
- "name": "event",
2629
+ "name": "conditions",
2323
2630
  "type": {
2324
- "text": "Event"
2631
+ "text": "ConditionNode[]"
2632
+ }
2633
+ },
2634
+ {
2635
+ "name": "fields",
2636
+ "type": {
2637
+ "text": "any[]"
2325
2638
  }
2326
2639
  }
2327
2640
  ]
2328
2641
  },
2329
2642
  {
2330
- "kind": "method",
2331
- "name": "toggleMute",
2332
- "return": {
2333
- "type": {
2334
- "text": "boolean"
2335
- }
2336
- }
2643
+ "kind": "field",
2644
+ "name": "createEmptyGroup",
2645
+ "static": true
2337
2646
  },
2338
2647
  {
2339
2648
  "kind": "method",
2340
- "name": "addRule",
2649
+ "name": "buildRawExpression",
2650
+ "static": true,
2341
2651
  "return": {
2342
2652
  "type": {
2343
- "text": "boolean"
2653
+ "text": "string"
2344
2654
  }
2345
- }
2655
+ },
2656
+ "parameters": [
2657
+ {
2658
+ "name": "conditions",
2659
+ "type": {
2660
+ "text": "ConditionNode[]"
2661
+ }
2662
+ }
2663
+ ]
2346
2664
  },
2347
2665
  {
2348
2666
  "kind": "method",
2349
- "name": "removeRule",
2667
+ "name": "parseRawExpression",
2668
+ "static": true,
2350
2669
  "return": {
2351
2670
  "type": {
2352
- "text": "boolean"
2671
+ "text": "ConditionNode[] | null"
2353
2672
  }
2354
2673
  },
2355
2674
  "parameters": [
2356
2675
  {
2357
- "name": "index",
2676
+ "name": "rawExpression",
2358
2677
  "type": {
2359
- "text": "number"
2678
+ "text": "string"
2360
2679
  }
2361
2680
  }
2362
2681
  ]
2682
+ }
2683
+ ]
2684
+ },
2685
+ {
2686
+ "kind": "class",
2687
+ "description": "",
2688
+ "name": "TemplateUtils",
2689
+ "members": [
2690
+ {
2691
+ "kind": "field",
2692
+ "name": "createEmptyParameter",
2693
+ "static": true
2363
2694
  },
2364
2695
  {
2365
2696
  "kind": "method",
2366
- "name": "reloadRules",
2367
- "return": {
2368
- "type": {
2369
- "text": "Promise<void>"
2697
+ "name": "getParameters",
2698
+ "static": true,
2699
+ "parameters": [
2700
+ {
2701
+ "name": "parameters"
2370
2702
  }
2371
- },
2372
- "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
2703
+ ]
2373
2704
  },
2374
2705
  {
2375
2706
  "kind": "method",
2376
- "name": "loadRules",
2707
+ "name": "buildRightValue",
2377
2708
  "privacy": "private",
2378
- "return": {
2379
- "type": {
2380
- "text": "Promise<void>"
2709
+ "static": true,
2710
+ "parameters": [
2711
+ {
2712
+ "name": "logicalOperator",
2713
+ "type": {
2714
+ "text": "LogicalOperator"
2715
+ }
2716
+ },
2717
+ {
2718
+ "name": "condition"
2719
+ },
2720
+ {
2721
+ "name": "parameters",
2722
+ "optional": true
2381
2723
  }
2382
- }
2724
+ ]
2383
2725
  },
2384
2726
  {
2385
2727
  "kind": "method",
2386
- "name": "settleRuleOptions",
2387
- "privacy": "private",
2388
- "return": {
2389
- "type": {
2390
- "text": "Promise<void>"
2728
+ "name": "getConditions",
2729
+ "static": true,
2730
+ "parameters": [
2731
+ {
2732
+ "name": "conditions"
2733
+ },
2734
+ {
2735
+ "name": "parameters",
2736
+ "optional": true
2391
2737
  }
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."
2738
+ ]
2394
2739
  },
2395
2740
  {
2396
2741
  "kind": "method",
2397
- "name": "applyRuleSelectValues",
2398
- "privacy": "private",
2399
- "return": {
2400
- "type": {
2401
- "text": "void"
2742
+ "name": "createParameterDetails",
2743
+ "static": true,
2744
+ "parameters": [
2745
+ {
2746
+ "name": "parameters"
2402
2747
  }
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
- },
2748
+ ]
2749
+ }
2750
+ ]
2751
+ },
2752
+ {
2753
+ "kind": "class",
2754
+ "description": "",
2755
+ "name": "RuleUtils",
2756
+ "members": [
2406
2757
  {
2407
2758
  "kind": "method",
2408
- "name": "mapRules",
2759
+ "name": "buildRightValue",
2409
2760
  "privacy": "private",
2410
- "return": {
2411
- "type": {
2412
- "text": "AlertSoundSelectableRule[]"
2413
- }
2414
- },
2761
+ "static": true,
2415
2762
  "parameters": [
2416
2763
  {
2417
- "name": "ruleList",
2764
+ "name": "logicalOperator",
2418
2765
  "type": {
2419
- "text": "NamedRuleRow[]"
2766
+ "text": "LogicalOperator"
2420
2767
  }
2768
+ },
2769
+ {
2770
+ "name": "condition"
2421
2771
  }
2422
2772
  ]
2423
2773
  },
2424
2774
  {
2425
2775
  "kind": "method",
2426
- "name": "ruleMatchId",
2427
- "privacy": "private",
2428
- "return": {
2429
- "type": {
2430
- "text": "string"
2431
- }
2432
- },
2776
+ "name": "getConditions",
2777
+ "static": true,
2433
2778
  "parameters": [
2434
2779
  {
2435
- "name": "rule",
2436
- "type": {
2437
- "text": "NamedRuleRow | undefined"
2438
- }
2780
+ "name": "conditions"
2439
2781
  }
2440
2782
  ]
2441
- },
2783
+ }
2784
+ ]
2785
+ },
2786
+ {
2787
+ "kind": "function",
2788
+ "name": "showNotificationError",
2789
+ "parameters": [
2442
2790
  {
2443
- "kind": "method",
2444
- "name": "syncSoundState",
2445
- "privacy": "private"
2791
+ "name": "error"
2446
2792
  }
2447
- ],
2448
- "superclass": {
2449
- "name": "GenesisElement",
2450
- "package": "@genesislcap/web-core"
2451
- },
2452
- "tagName": "foundation-sounds-panel",
2453
- "customElement": true
2793
+ ]
2454
2794
  }
2455
2795
  ],
2456
2796
  "exports": [
2457
2797
  {
2458
2798
  "kind": "js",
2459
- "name": "FoundationSoundsPanel",
2799
+ "name": "UUIDGenerator",
2460
2800
  "declaration": {
2461
- "name": "FoundationSoundsPanel",
2462
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
2801
+ "name": "UUIDGenerator",
2802
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2463
2803
  }
2464
2804
  },
2465
2805
  {
2466
- "kind": "custom-element-definition",
2467
- "name": "foundation-sounds-panel",
2806
+ "kind": "js",
2807
+ "name": "isEmpty",
2468
2808
  "declaration": {
2469
- "name": "FoundationSoundsPanel",
2470
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
2809
+ "name": "isEmpty",
2810
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2811
+ }
2812
+ },
2813
+ {
2814
+ "kind": "js",
2815
+ "name": "DynamicRuleUtils",
2816
+ "declaration": {
2817
+ "name": "DynamicRuleUtils",
2818
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2819
+ }
2820
+ },
2821
+ {
2822
+ "kind": "js",
2823
+ "name": "TemplateUtils",
2824
+ "declaration": {
2825
+ "name": "TemplateUtils",
2826
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2827
+ }
2828
+ },
2829
+ {
2830
+ "kind": "js",
2831
+ "name": "RuleUtils",
2832
+ "declaration": {
2833
+ "name": "RuleUtils",
2834
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2835
+ }
2836
+ },
2837
+ {
2838
+ "kind": "js",
2839
+ "name": "showNotificationError",
2840
+ "declaration": {
2841
+ "name": "showNotificationError",
2842
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2471
2843
  }
2472
2844
  }
2473
2845
  ]
2474
2846
  },
2475
2847
  {
2476
2848
  "kind": "javascript-module",
2477
- "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
2849
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2478
2850
  "declarations": [
2479
2851
  {
2480
2852
  "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."
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`"
2484
2855
  }
2485
2856
  ],
2486
2857
  "exports": [
2487
2858
  {
2488
2859
  "kind": "js",
2489
- "name": "FoundationSoundsStyles",
2860
+ "name": "FoundationSoundsPanelStyles",
2861
+ "declaration": {
2862
+ "name": "FoundationSoundsPanelStyles",
2863
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
2864
+ }
2865
+ }
2866
+ ]
2867
+ },
2868
+ {
2869
+ "kind": "javascript-module",
2870
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
2871
+ "declarations": [
2872
+ {
2873
+ "kind": "variable",
2874
+ "name": "FoundationSoundsPanelTemplate",
2875
+ "default": "html<FoundationSoundsPanel>`\n <div class=\"sounds-controls\" part=\"controls\">\n <input\n ${ref('fileInput')}\n class=\"file-input\"\n type=\"file\"\n accept=\"audio/*\"\n @change=${(x, c) => x.onFileSelected(c.event)}\n />\n <rapid-disclosure class=\"sounds-help-disclosure\" appearance=\"lightweight\">\n <span slot=\"title\">\n Sound Alerts Information\n <span class=\"sounds-help-toggle\" aria-hidden=\"true\"></span>\n </span>\n <p class=\"sounds-help\">\n Add up to ${(x) => x.maxRules} sounds.\n <br />\n Match text in MESSAGE or HEADER (a word or phrase), or a notification rule (including rules\n created when you subscribe to a template).\n <br />\n The first matching rule is played.\n </p>\n </rapid-disclosure>\n <div class=\"volume-row\">\n <rapid-icon\n class=\"volume-icon\"\n name=${(x) => (x.muted || x.volumePercent === 0 ? 'volume-xmark' : 'volume-high')}\n ></rapid-icon>\n <span class=\"volume-label\">Volume</span>\n <rapid-slider\n class=\"volume-slider\"\n min=\"0\"\n max=\"100\"\n step=\"1\"\n :value=${(x) => String(x.volumePercent)}\n @change=${(x, c) => x.onVolumeChange(c.event)}\n ></rapid-slider>\n <span class=\"volume-percent\">${(x) => `${x.volumePercent}%`}</span>\n <rapid-button\n class=\"mute-all\"\n appearance=\"lightweight\"\n title=${(x) => (x.muted ? 'Unmute alert sounds' : 'Mute all alert sounds')}\n @click=${(x) => x.toggleMute()}\n >\n ${(x) => (x.muted ? 'Unmute' : 'Mute all')}\n </rapid-button>\n </div>\n <div class=\"sound-rules-panel\">\n <div class=\"sound-rules\">\n ${repeat(\n (x) => x.rules,\n html<AlertSoundRuleView, FoundationSoundsPanel>`\n <div class=\"sound-rule\" data-rule-index=${(x) => x.index}>\n <div class=\"sound-rule-header\">\n <span>Rule ${(x) => x.index + 1}</span>\n <div class=\"sound-rule-actions\">\n <rapid-button\n class=\"mute-rule\"\n appearance=\"stealth\"\n title=${(x) => (x.muted ? 'Unmute this rule' : 'Mute this rule')}\n @click=${(x, c) => c.parent.toggleRuleMute(x.index)}\n >\n <rapid-icon\n name=${(x) => (x.muted ? 'volume-xmark' : 'volume-high')}\n ></rapid-icon>\n </rapid-button>\n <rapid-button\n class=\"remove-rule\"\n appearance=\"stealth\"\n title=${(_, c) => (c.parent.canRemoveRule ? 'Remove rule' : 'Reset rule')}\n @click=${(x, c) => c.parent.removeRule(x.index)}\n >\n <rapid-icon name=\"trash\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n <label class=\"sound-rule-label\">\n Match by\n <rapid-select\n class=\"match-mode-select\"\n style=${(x) =>\n `anchor-name: --sound-match-${x.index}; --sounds-select-anchor: --sound-match-${x.index}`}\n :value=${(x) => x.matchMode}\n @change=${(x, c) => c.parent.onMatchModeChange(x.index, c.event)}\n >\n <rapid-option value=\"message\">MESSAGE text</rapid-option>\n <rapid-option value=\"header\">HEADER text</rapid-option>\n <rapid-option value=\"rule\">Notification rule</rapid-option>\n </rapid-select>\n </label>\n <label\n class=\"sound-rule-label\"\n style=${(x) => (x.matchMode === 'rule' ? 'display: none;' : '')}\n >\n ${(x) => (x.matchMode === 'header' ? 'HEADER text' : 'MESSAGE text')}\n <rapid-text-field\n class=\"pattern-input\"\n placeholder=${(x) =>\n x.matchMode === 'header' ? 'e.g. Price alert' : 'e.g. limit breached'}\n :value=${(x) => x.pattern}\n @input=${(x, c) => c.parent.onPatternInput(x.index, c.event)}\n ></rapid-text-field>\n </label>\n <label\n class=\"sound-rule-label\"\n style=${(x) => (x.matchMode === 'rule' ? '' : 'display: none;')}\n >\n Notification rule\n <rapid-select\n class=\"rule-select\"\n style=${(x) =>\n `anchor-name: --sound-rule-${x.index}; --sounds-select-anchor: --sound-rule-${x.index}`}\n :value=${(x) => x.templateId ?? ''}\n @change=${(x, c) => c.parent.onRuleChange(x.index, c.event)}\n >\n <options-datasource\n value-field=\"id\"\n label-field=\"name\"\n option-element=\"rapid-option\"\n :data=${(_, c) => c.parent.ruleSelectOptions}\n ></options-datasource>\n </rapid-select>\n </label>\n <label class=\"sound-rule-label\">\n Sound file\n <div class=\"sound-file-row\">\n <rapid-text-field\n class=\"sound-file-input\"\n readonly\n placeholder=\"No sound selected\"\n :value=${(x) => x.fileName ?? ''}\n title=${(x) => x.fileName ?? 'No sound selected'}\n >\n <rapid-icon\n slot=\"end\"\n class=\"choose-sound\"\n name=\"folder-open\"\n title=\"Choose alert sound\"\n @click=${(x, c) => {\n c.event.stopPropagation();\n return c.parent.openFilePicker(x.index);\n }}\n ></rapid-icon>\n </rapid-text-field>\n <rapid-button\n class=\"test-sound\"\n appearance=\"stealth\"\n title=\"Test play this sound\"\n ?disabled=${(x) => !x.hasSound}\n @click=${(x, c) => c.parent.testSound(x.index)}\n >\n <rapid-icon name=\"play\"></rapid-icon>\n </rapid-button>\n <rapid-button\n class=\"clear-sound\"\n appearance=\"stealth\"\n title=\"Clear sound file\"\n ?disabled=${(x) => !x.hasSound}\n @click=${(x, c) => c.parent.clearSound(x.index)}\n >\n <rapid-icon name=\"times\"></rapid-icon>\n </rapid-button>\n </div>\n </label>\n </div>\n `,\n )}\n </div>\n </div>\n <div class=\"sound-rules-footer\">\n <rapid-button\n class=\"add-rule\"\n appearance=\"lightweight\"\n title=\"Add sound rule\"\n ?disabled=${(x) => !x.canAddRule}\n @click=${(x) => x.addRule()}\n >\n <rapid-icon name=\"plus\"></rapid-icon>\n Add rule\n </rapid-button>\n <span class=\"rule-count\">${(x) => `${x.rules.length} / ${x.maxRules}`}</span>\n </div>\n </div>\n`"
2876
+ }
2877
+ ],
2878
+ "exports": [
2879
+ {
2880
+ "kind": "js",
2881
+ "name": "FoundationSoundsPanelTemplate",
2490
2882
  "declaration": {
2491
- "name": "FoundationSoundsStyles",
2492
- "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
2883
+ "name": "FoundationSoundsPanelTemplate",
2884
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
2493
2885
  }
2494
2886
  }
2495
2887
  ]
2496
2888
  },
2497
2889
  {
2498
2890
  "kind": "javascript-module",
2499
- "path": "src/components/foundation-sounds/foundation-sounds.ts",
2891
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
2500
2892
  "declarations": [
2501
2893
  {
2502
2894
  "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",
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",
2505
2897
  "members": [
2506
2898
  {
2507
2899
  "kind": "field",
2508
- "name": "connect",
2900
+ "name": "ruleService",
2509
2901
  "type": {
2510
- "text": "Connect"
2902
+ "text": "RuleService"
2511
2903
  }
2512
2904
  },
2513
2905
  {
2514
2906
  "kind": "field",
2515
- "name": "inboxService",
2907
+ "name": "volumePercent",
2516
2908
  "type": {
2517
- "text": "FoundationInboxService"
2518
- }
2909
+ "text": "number"
2910
+ },
2911
+ "default": "100",
2912
+ "description": "Global playback volume 0–100. @internal"
2519
2913
  },
2520
2914
  {
2521
2915
  "kind": "field",
2522
- "name": "ruleService",
2916
+ "name": "selectableRules",
2523
2917
  "type": {
2524
- "text": "RuleService"
2525
- }
2918
+ "text": "AlertSoundSelectableRule[]"
2919
+ },
2920
+ "default": "[]",
2921
+ "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
2526
2922
  },
2527
2923
  {
2528
2924
  "kind": "field",
2529
- "name": "soundEnabled",
2925
+ "name": "fileInput",
2530
2926
  "type": {
2531
- "text": "boolean"
2532
- },
2533
- "default": "true",
2534
- "description": "When false, new audible alerts are tracked but do not play."
2927
+ "text": "HTMLInputElement"
2928
+ }
2535
2929
  },
2536
2930
  {
2537
2931
  "kind": "field",
2538
- "name": "connectionSub",
2932
+ "name": "pendingRuleIndex",
2539
2933
  "type": {
2540
- "text": "Subscription | undefined"
2934
+ "text": "number | null"
2541
2935
  },
2542
- "privacy": "private"
2936
+ "privacy": "private",
2937
+ "default": "null"
2543
2938
  },
2544
2939
  {
2545
2940
  "kind": "field",
@@ -2549,927 +2944,532 @@
2549
2944
  },
2550
2945
  {
2551
2946
  "kind": "field",
2552
- "name": "knownAlertIds",
2553
- "privacy": "private",
2554
- "default": "new Set<string>()"
2947
+ "name": "unsubscribePlayer",
2948
+ "type": {
2949
+ "text": "(() => void) | undefined"
2950
+ },
2951
+ "privacy": "private"
2555
2952
  },
2556
2953
  {
2557
2954
  "kind": "field",
2558
- "name": "serverSoundFetches",
2955
+ "name": "ignoreSelectChanges",
2956
+ "type": {
2957
+ "text": "boolean"
2958
+ },
2559
2959
  "privacy": "private",
2560
- "readonly": true,
2561
- "default": "new Map<string, Promise<boolean>>()",
2562
- "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
2960
+ "default": "false",
2961
+ "description": "Suppresses select change events while options are rebuilt."
2563
2962
  },
2564
2963
  {
2565
2964
  "kind": "method",
2566
- "name": "subscribeToAlerts",
2567
- "privacy": "private",
2965
+ "name": "onMatchModeChange",
2568
2966
  "return": {
2569
2967
  "type": {
2570
- "text": "void"
2968
+ "text": "boolean"
2571
2969
  }
2572
- }
2573
- },
2574
- {
2575
- "kind": "field",
2576
- "name": "subscriptionHandler",
2577
- "privacy": "private"
2970
+ },
2971
+ "parameters": [
2972
+ {
2973
+ "name": "index",
2974
+ "type": {
2975
+ "text": "number"
2976
+ }
2977
+ },
2978
+ {
2979
+ "name": "event",
2980
+ "type": {
2981
+ "text": "Event"
2982
+ }
2983
+ }
2984
+ ]
2578
2985
  },
2579
2986
  {
2580
2987
  "kind": "method",
2581
- "name": "playForNewAlerts",
2582
- "privacy": "private",
2988
+ "name": "onPatternInput",
2583
2989
  "return": {
2584
2990
  "type": {
2585
- "text": "Promise<void>"
2991
+ "text": "boolean"
2586
2992
  }
2587
2993
  },
2588
2994
  "parameters": [
2589
2995
  {
2590
- "name": "rows",
2996
+ "name": "index",
2591
2997
  "type": {
2592
- "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
2998
+ "text": "number"
2999
+ }
3000
+ },
3001
+ {
3002
+ "name": "event",
3003
+ "type": {
3004
+ "text": "Event"
2593
3005
  }
2594
3006
  }
2595
3007
  ]
2596
3008
  },
2597
3009
  {
2598
3010
  "kind": "method",
2599
- "name": "tryPlayServerSound",
2600
- "privacy": "private",
3011
+ "name": "onRuleChange",
2601
3012
  "return": {
2602
3013
  "type": {
2603
- "text": "Promise<boolean>"
3014
+ "text": "boolean"
2604
3015
  }
2605
3016
  },
2606
3017
  "parameters": [
2607
3018
  {
2608
- "name": "dynamicRuleId",
3019
+ "name": "index",
2609
3020
  "type": {
2610
- "text": "string"
3021
+ "text": "number"
3022
+ }
3023
+ },
3024
+ {
3025
+ "name": "event",
3026
+ "type": {
3027
+ "text": "Event"
2611
3028
  }
2612
3029
  }
2613
3030
  ]
2614
3031
  },
2615
3032
  {
2616
3033
  "kind": "method",
2617
- "name": "fetchAndCacheServerSound",
2618
- "privacy": "private",
3034
+ "name": "openFilePicker",
2619
3035
  "return": {
2620
3036
  "type": {
2621
- "text": "Promise<boolean>"
3037
+ "text": "boolean"
2622
3038
  }
2623
3039
  },
2624
3040
  "parameters": [
2625
3041
  {
2626
- "name": "dynamicRuleId",
3042
+ "name": "index",
2627
3043
  "type": {
2628
- "text": "string"
3044
+ "text": "number"
2629
3045
  }
2630
3046
  }
2631
3047
  ]
2632
- }
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"
2682
- },
2683
- {
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",
2687
- "members": [
2688
- {
2689
- "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
3048
  },
2755
3049
  {
2756
- "kind": "field",
2757
- "name": "pendingAlertSoundData",
2758
- "type": {
2759
- "text": "string | null"
3050
+ "kind": "method",
3051
+ "name": "onFileSelected",
3052
+ "return": {
3053
+ "type": {
3054
+ "text": "boolean"
3055
+ }
2760
3056
  },
2761
- "default": "null"
3057
+ "parameters": [
3058
+ {
3059
+ "name": "event",
3060
+ "type": {
3061
+ "text": "Event"
3062
+ }
3063
+ }
3064
+ ]
2762
3065
  },
2763
3066
  {
2764
- "kind": "field",
2765
- "name": "alertSoundDirty",
2766
- "type": {
2767
- "text": "boolean"
3067
+ "kind": "method",
3068
+ "name": "clearSound",
3069
+ "return": {
3070
+ "type": {
3071
+ "text": "boolean"
3072
+ }
2768
3073
  },
2769
- "default": "false",
2770
- "description": "True when the user picked a new file this session (needs upload)."
3074
+ "parameters": [
3075
+ {
3076
+ "name": "index",
3077
+ "type": {
3078
+ "text": "number"
3079
+ }
3080
+ }
3081
+ ]
2771
3082
  },
2772
3083
  {
2773
- "kind": "field",
2774
- "name": "clearAlertSound",
2775
- "type": {
2776
- "text": "boolean"
3084
+ "kind": "method",
3085
+ "name": "testSound",
3086
+ "return": {
3087
+ "type": {
3088
+ "text": "boolean"
3089
+ }
2777
3090
  },
2778
- "default": "false"
3091
+ "parameters": [
3092
+ {
3093
+ "name": "index",
3094
+ "type": {
3095
+ "text": "number"
3096
+ }
3097
+ }
3098
+ ]
2779
3099
  },
2780
3100
  {
2781
- "kind": "field",
2782
- "name": "testAudio",
2783
- "type": {
2784
- "text": "HTMLAudioElement | null"
3101
+ "kind": "method",
3102
+ "name": "toggleRuleMute",
3103
+ "return": {
3104
+ "type": {
3105
+ "text": "boolean"
3106
+ }
2785
3107
  },
2786
- "default": "null",
2787
- "description": "In-progress Test playback; not private — mixin return type is exported."
3108
+ "parameters": [
3109
+ {
3110
+ "name": "index",
3111
+ "type": {
3112
+ "text": "number"
3113
+ }
3114
+ }
3115
+ ]
2788
3116
  },
2789
3117
  {
2790
3118
  "kind": "method",
2791
- "name": "loadExistingAlertSound",
3119
+ "name": "onVolumeChange",
3120
+ "return": {
3121
+ "type": {
3122
+ "text": "boolean"
3123
+ }
3124
+ },
2792
3125
  "parameters": [
2793
3126
  {
2794
- "name": "dynamicRuleId",
3127
+ "name": "event",
2795
3128
  "type": {
2796
- "text": "string"
3129
+ "text": "Event"
2797
3130
  }
2798
3131
  }
2799
3132
  ]
2800
3133
  },
2801
3134
  {
2802
3135
  "kind": "method",
2803
- "name": "openAlertSoundPicker"
3136
+ "name": "toggleMute",
3137
+ "return": {
3138
+ "type": {
3139
+ "text": "boolean"
3140
+ }
3141
+ }
2804
3142
  },
2805
3143
  {
2806
3144
  "kind": "method",
2807
- "name": "onAlertSoundSelected",
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
+ },
2808
3160
  "parameters": [
2809
3161
  {
2810
- "name": "event",
3162
+ "name": "index",
2811
3163
  "type": {
2812
- "text": "Event"
3164
+ "text": "number"
2813
3165
  }
2814
3166
  }
2815
3167
  ]
2816
3168
  },
2817
3169
  {
2818
3170
  "kind": "method",
2819
- "name": "clearAttachedAlertSound"
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)."
2820
3178
  },
2821
3179
  {
2822
3180
  "kind": "method",
2823
- "name": "testAttachedAlertSound"
3181
+ "name": "loadRules",
3182
+ "privacy": "private",
3183
+ "return": {
3184
+ "type": {
3185
+ "text": "Promise<void>"
3186
+ }
3187
+ }
2824
3188
  },
2825
3189
  {
2826
3190
  "kind": "method",
2827
- "name": "stopTestSound"
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."
2828
3199
  },
2829
3200
  {
2830
3201
  "kind": "method",
2831
- "name": "resetAlertSoundState"
3202
+ "name": "applyRuleSelectValues",
3203
+ "privacy": "private",
3204
+ "return": {
3205
+ "type": {
3206
+ "text": "void"
3207
+ }
3208
+ },
3209
+ "description": "Re-applies persisted template ids onto `.rule-select` hosts after\noptions-datasource has rebuilt its options. We deliberately do *not* bind\n`:initialSelectedValue` to templateId: that path compares the option label\nagainst Select.value (the option id), always mismatches, clearData()'s the\nselect, and leaves the next pick stuck on \"Select a rule...\"."
2832
3210
  },
2833
3211
  {
2834
3212
  "kind": "method",
2835
- "name": "applyAlertSoundToPayload",
3213
+ "name": "mapRules",
3214
+ "privacy": "private",
2836
3215
  "return": {
2837
3216
  "type": {
2838
- "text": "T"
3217
+ "text": "AlertSoundSelectableRule[]"
2839
3218
  }
2840
3219
  },
2841
3220
  "parameters": [
2842
3221
  {
2843
- "name": "target",
3222
+ "name": "ruleList",
2844
3223
  "type": {
2845
- "text": "T"
3224
+ "text": "NamedRuleRow[]"
2846
3225
  }
2847
3226
  }
2848
- ],
2849
- "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3227
+ ]
2850
3228
  },
2851
3229
  {
2852
3230
  "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."
2855
- }
2856
- ],
2857
- "parameters": [
2858
- {
2859
- "name": "Base",
2860
- "type": {
2861
- "text": "TBase"
2862
- }
2863
- }
2864
- ],
2865
- "privacy": "public"
2866
- }
2867
- ],
2868
- "exports": [
2869
- {
2870
- "kind": "js",
2871
- "name": "alertSoundAttachmentTemplate",
2872
- "declaration": {
2873
- "name": "alertSoundAttachmentTemplate",
2874
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2875
- }
2876
- },
2877
- {
2878
- "kind": "js",
2879
- "name": "AlertSoundAttachmentMixin",
2880
- "declaration": {
2881
- "name": "AlertSoundAttachmentMixin",
2882
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2883
- }
2884
- }
2885
- ]
2886
- },
2887
- {
2888
- "kind": "javascript-module",
2889
- "path": "src/components/foundation-notification-dashboard/index.ts",
2890
- "declarations": [],
2891
- "exports": [
2892
- {
2893
- "kind": "js",
2894
- "name": "*",
2895
- "declaration": {
2896
- "name": "*",
2897
- "package": "./notification-dashboard"
2898
- }
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": [
2914
- {
2915
- "kind": "js",
2916
- "name": "FoundationNotificationDashboardStyles",
2917
- "declaration": {
2918
- "name": "FoundationNotificationDashboardStyles",
2919
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
2920
- }
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
- }
3231
+ "name": "ruleMatchId",
3232
+ "privacy": "private",
3233
+ "return": {
3234
+ "type": {
3235
+ "text": "string"
3236
+ }
3237
+ },
3238
+ "parameters": [
3239
+ {
3240
+ "name": "rule",
3241
+ "type": {
3242
+ "text": "NamedRuleRow | undefined"
3243
+ }
3244
+ }
3245
+ ]
2953
3246
  },
2954
3247
  {
2955
- "kind": "field",
2956
- "name": "right",
2957
- "type": {
2958
- "text": "string"
2959
- }
3248
+ "kind": "method",
3249
+ "name": "syncSoundState",
3250
+ "privacy": "private"
2960
3251
  }
2961
- ]
2962
- },
2963
- {
2964
- "kind": "variable",
2965
- "name": "NOTIFICATION_DASHBOARD_TABS",
2966
- "type": {
2967
- "text": "NotificationDashboardTab[]"
3252
+ ],
3253
+ "superclass": {
3254
+ "name": "GenesisElement",
3255
+ "package": "@genesislcap/web-core"
2968
3256
  },
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]"
3257
+ "tagName": "foundation-sounds-panel",
3258
+ "customElement": true
2970
3259
  }
2971
3260
  ],
2972
3261
  "exports": [
2973
3262
  {
2974
3263
  "kind": "js",
2975
- "name": "NotificationDashboardTab",
3264
+ "name": "FoundationSoundsPanel",
2976
3265
  "declaration": {
2977
- "name": "NotificationDashboardTab",
2978
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3266
+ "name": "FoundationSoundsPanel",
3267
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
2979
3268
  }
2980
3269
  },
2981
3270
  {
2982
- "kind": "js",
2983
- "name": "NOTIFICATION_DASHBOARD_TABS",
3271
+ "kind": "custom-element-definition",
3272
+ "name": "foundation-sounds-panel",
2984
3273
  "declaration": {
2985
- "name": "NOTIFICATION_DASHBOARD_TABS",
2986
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3274
+ "name": "FoundationSoundsPanel",
3275
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
2987
3276
  }
2988
3277
  }
2989
3278
  ]
2990
3279
  },
2991
3280
  {
2992
3281
  "kind": "javascript-module",
2993
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3282
+ "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
2994
3283
  "declarations": [
2995
3284
  {
2996
3285
  "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`"
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."
2999
3289
  }
3000
3290
  ],
3001
3291
  "exports": [
3002
3292
  {
3003
3293
  "kind": "js",
3004
- "name": "FoundationNotificationDashboardTemplate",
3294
+ "name": "FoundationSoundsStyles",
3005
3295
  "declaration": {
3006
- "name": "FoundationNotificationDashboardTemplate",
3007
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3296
+ "name": "FoundationSoundsStyles",
3297
+ "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
3008
3298
  }
3009
3299
  }
3010
3300
  ]
3011
3301
  },
3012
3302
  {
3013
3303
  "kind": "javascript-module",
3014
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3304
+ "path": "src/components/foundation-sounds/foundation-sounds.ts",
3015
3305
  "declarations": [
3016
3306
  {
3017
3307
  "kind": "class",
3018
- "description": "",
3019
- "name": "FoundationNotificationDashboard",
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",
3020
3310
  "members": [
3021
3311
  {
3022
3312
  "kind": "field",
3023
- "name": "auth",
3313
+ "name": "connect",
3024
3314
  "type": {
3025
- "text": "Auth"
3315
+ "text": "Connect"
3026
3316
  }
3027
3317
  },
3028
3318
  {
3029
3319
  "kind": "field",
3030
- "name": "ready",
3320
+ "name": "inboxService",
3031
3321
  "type": {
3032
- "text": "boolean"
3033
- },
3034
- "default": "false"
3322
+ "text": "FoundationInboxService"
3323
+ }
3035
3324
  },
3036
3325
  {
3037
3326
  "kind": "field",
3038
- "name": "hasPermissions",
3327
+ "name": "ruleService",
3039
3328
  "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
3051
- }
3052
- ],
3053
- "exports": [
3054
- {
3055
- "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",
3065
- "declaration": {
3066
- "name": "FoundationNotificationDashboard",
3067
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3068
- }
3069
- }
3070
- ]
3071
- },
3072
- {
3073
- "kind": "javascript-module",
3074
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3075
- "declarations": [
3076
- {
3077
- "kind": "class",
3078
- "description": "",
3079
- "name": "UUIDGenerator",
3080
- "members": [
3329
+ "text": "RuleService"
3330
+ }
3331
+ },
3081
3332
  {
3082
3333
  "kind": "field",
3083
- "name": "uuid",
3334
+ "name": "soundEnabled",
3084
3335
  "type": {
3085
- "text": "UUID"
3336
+ "text": "boolean"
3086
3337
  },
3087
- "privacy": "private",
3088
- "static": true
3089
- },
3090
- {
3091
- "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": [
3111
- {
3112
- "kind": "field",
3113
- "name": "createEmptyCondition",
3114
- "static": true
3115
- },
3116
- {
3117
- "kind": "field",
3118
- "name": "createAssignment",
3119
- "static": true
3120
- },
3121
- {
3122
- "kind": "field",
3123
- "name": "createTextAssignment",
3124
- "static": true
3125
- },
3126
- {
3127
- "kind": "field",
3128
- "name": "getAssignmentValue",
3129
- "static": true
3338
+ "default": "true",
3339
+ "description": "When false, new audible alerts are tracked but do not play."
3130
3340
  },
3131
3341
  {
3132
3342
  "kind": "field",
3133
- "name": "getAssignmentText",
3134
- "static": true
3135
- },
3136
- {
3137
- "kind": "method",
3138
- "name": "createConditions",
3139
- "static": true,
3140
- "return": {
3141
- "type": {
3142
- "text": "any"
3143
- }
3144
- },
3145
- "parameters": [
3146
- {
3147
- "name": "conditions",
3148
- "type": {
3149
- "text": "ConditionNode[]"
3150
- }
3151
- },
3152
- {
3153
- "name": "parameters",
3154
- "optional": true
3155
- }
3156
- ]
3157
- },
3158
- {
3159
- "kind": "method",
3160
- "name": "hasMultiValueCondition",
3161
- "static": true,
3162
- "return": {
3163
- "type": {
3164
- "text": "boolean"
3165
- }
3166
- },
3167
- "parameters": [
3168
- {
3169
- "name": "conditions",
3170
- "type": {
3171
- "text": "ConditionNode[]"
3172
- }
3173
- }
3174
- ]
3175
- },
3176
- {
3177
- "kind": "method",
3178
- "name": "hasOrJoin",
3179
- "static": true,
3180
- "return": {
3181
- "type": {
3182
- "text": "boolean"
3183
- }
3343
+ "name": "connectionSub",
3344
+ "type": {
3345
+ "text": "Subscription | undefined"
3184
3346
  },
3185
- "parameters": [
3186
- {
3187
- "name": "conditions",
3188
- "type": {
3189
- "text": "ConditionNode[]"
3190
- }
3191
- }
3192
- ]
3347
+ "privacy": "private"
3193
3348
  },
3194
3349
  {
3195
- "kind": "method",
3196
- "name": "hasGroup",
3197
- "static": true,
3198
- "return": {
3199
- "type": {
3200
- "text": "boolean"
3201
- }
3202
- },
3203
- "parameters": [
3204
- {
3205
- "name": "conditions",
3206
- "type": {
3207
- "text": "ConditionNode[]"
3208
- }
3209
- }
3210
- ]
3350
+ "kind": "field",
3351
+ "name": "player",
3352
+ "privacy": "private",
3353
+ "readonly": true
3211
3354
  },
3212
3355
  {
3213
- "kind": "method",
3214
- "name": "hasUnsupportedOperator",
3215
- "static": true,
3216
- "return": {
3217
- "type": {
3218
- "text": "boolean"
3219
- }
3220
- },
3221
- "parameters": [
3222
- {
3223
- "name": "conditions",
3224
- "type": {
3225
- "text": "ConditionNode[]"
3226
- }
3227
- }
3228
- ]
3356
+ "kind": "field",
3357
+ "name": "knownAlertIds",
3358
+ "privacy": "private",
3359
+ "default": "new Set<string>()"
3229
3360
  },
3230
3361
  {
3231
- "kind": "method",
3232
- "name": "flattenConditions",
3233
- "static": true,
3234
- "return": {
3235
- "type": {
3236
- "text": "ConditionBuilderEntity[]"
3237
- }
3238
- },
3239
- "parameters": [
3240
- {
3241
- "name": "conditions",
3242
- "type": {
3243
- "text": "ConditionNode[]"
3244
- }
3245
- }
3246
- ]
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."
3247
3368
  },
3248
3369
  {
3249
3370
  "kind": "method",
3250
- "name": "resolveLeftValues",
3251
- "static": true,
3371
+ "name": "subscribeToAlerts",
3372
+ "privacy": "private",
3252
3373
  "return": {
3253
3374
  "type": {
3254
- "text": "ConditionNode[]"
3255
- }
3256
- },
3257
- "parameters": [
3258
- {
3259
- "name": "conditions",
3260
- "type": {
3261
- "text": "ConditionNode[]"
3262
- }
3263
- },
3264
- {
3265
- "name": "fields",
3266
- "type": {
3267
- "text": "any[]"
3268
- }
3375
+ "text": "void"
3269
3376
  }
3270
- ]
3377
+ }
3271
3378
  },
3272
3379
  {
3273
3380
  "kind": "field",
3274
- "name": "createEmptyGroup",
3275
- "static": true
3381
+ "name": "subscriptionHandler",
3382
+ "privacy": "private"
3276
3383
  },
3277
3384
  {
3278
3385
  "kind": "method",
3279
- "name": "buildRawExpression",
3280
- "static": true,
3386
+ "name": "playForNewAlerts",
3387
+ "privacy": "private",
3281
3388
  "return": {
3282
3389
  "type": {
3283
- "text": "string"
3390
+ "text": "Promise<void>"
3284
3391
  }
3285
3392
  },
3286
3393
  "parameters": [
3287
3394
  {
3288
- "name": "conditions",
3395
+ "name": "rows",
3289
3396
  "type": {
3290
- "text": "ConditionNode[]"
3397
+ "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
3291
3398
  }
3292
3399
  }
3293
3400
  ]
3294
3401
  },
3295
3402
  {
3296
3403
  "kind": "method",
3297
- "name": "parseRawExpression",
3298
- "static": true,
3404
+ "name": "tryPlayServerSound",
3405
+ "privacy": "private",
3299
3406
  "return": {
3300
3407
  "type": {
3301
- "text": "ConditionNode[] | null"
3408
+ "text": "Promise<boolean>"
3302
3409
  }
3303
3410
  },
3304
3411
  "parameters": [
3305
3412
  {
3306
- "name": "rawExpression",
3413
+ "name": "dynamicRuleId",
3307
3414
  "type": {
3308
3415
  "text": "string"
3309
3416
  }
3310
3417
  }
3311
3418
  ]
3312
- }
3313
- ]
3314
- },
3315
- {
3316
- "kind": "class",
3317
- "description": "",
3318
- "name": "TemplateUtils",
3319
- "members": [
3320
- {
3321
- "kind": "field",
3322
- "name": "createEmptyParameter",
3323
- "static": true
3324
- },
3325
- {
3326
- "kind": "method",
3327
- "name": "getParameters",
3328
- "static": true,
3329
- "parameters": [
3330
- {
3331
- "name": "parameters"
3332
- }
3333
- ]
3334
3419
  },
3335
3420
  {
3336
3421
  "kind": "method",
3337
- "name": "buildRightValue",
3422
+ "name": "fetchAndCacheServerSound",
3338
3423
  "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
- ]
3355
- },
3356
- {
3357
- "kind": "method",
3358
- "name": "getConditions",
3359
- "static": true,
3360
- "parameters": [
3361
- {
3362
- "name": "conditions"
3363
- },
3364
- {
3365
- "name": "parameters",
3366
- "optional": true
3367
- }
3368
- ]
3369
- },
3370
- {
3371
- "kind": "method",
3372
- "name": "createParameterDetails",
3373
- "static": true,
3374
- "parameters": [
3375
- {
3376
- "name": "parameters"
3424
+ "return": {
3425
+ "type": {
3426
+ "text": "Promise<boolean>"
3377
3427
  }
3378
- ]
3379
- }
3380
- ]
3381
- },
3382
- {
3383
- "kind": "class",
3384
- "description": "",
3385
- "name": "RuleUtils",
3386
- "members": [
3387
- {
3388
- "kind": "method",
3389
- "name": "buildRightValue",
3390
- "privacy": "private",
3391
- "static": true,
3428
+ },
3392
3429
  "parameters": [
3393
3430
  {
3394
- "name": "logicalOperator",
3431
+ "name": "dynamicRuleId",
3395
3432
  "type": {
3396
- "text": "LogicalOperator"
3433
+ "text": "string"
3397
3434
  }
3398
- },
3399
- {
3400
- "name": "condition"
3401
- }
3402
- ]
3403
- },
3404
- {
3405
- "kind": "method",
3406
- "name": "getConditions",
3407
- "static": true,
3408
- "parameters": [
3409
- {
3410
- "name": "conditions"
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
  ]