@genesislcap/pbc-notify-ui 15.23.3 → 15.24.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,19 +2041,54 @@
2041
2041
  },
2042
2042
  {
2043
2043
  "kind": "javascript-module",
2044
- "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
2044
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2045
2045
  "declarations": [
2046
2046
  {
2047
2047
  "kind": "variable",
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
- },
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
2053
  {
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",
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",
2066
+ "declarations": [
2067
+ {
2068
+ "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": [
2088
+ {
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",
2057
2092
  "members": [
2058
2093
  {
2059
2094
  "kind": "field",
@@ -2064,56 +2099,21 @@
2064
2099
  },
2065
2100
  {
2066
2101
  "kind": "field",
2067
- "name": "isAlertSoundEditMode",
2068
- "type": {
2069
- "text": "boolean"
2070
- },
2071
- "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
2072
- "readonly": true
2073
- },
2074
- {
2075
- "kind": "field",
2076
- "name": "alertSoundEntityId",
2077
- "type": {
2078
- "text": "string | null"
2079
- },
2080
- "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
2081
- "readonly": true
2082
- },
2083
- {
2084
- "kind": "field",
2085
- "name": "alertSoundCacheSyncMode",
2086
- "type": {
2087
- "text": "'entity' | 'all'"
2088
- },
2089
- "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
2090
- "readonly": true
2091
- },
2092
- {
2093
- "kind": "field",
2094
- "name": "alertSoundFileName",
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",
2102
+ "name": "volumePercent",
2104
2103
  "type": {
2105
- "text": "string"
2104
+ "text": "number"
2106
2105
  },
2107
- "default": "''"
2106
+ "default": "100",
2107
+ "description": "Global playback volume 0–100. @internal"
2108
2108
  },
2109
2109
  {
2110
2110
  "kind": "field",
2111
- "name": "hasAlertSound",
2111
+ "name": "selectableRules",
2112
2112
  "type": {
2113
- "text": "boolean"
2113
+ "text": "AlertSoundSelectableRule[]"
2114
2114
  },
2115
- "default": "false",
2116
- "description": "True when edit loaded an existing server sound (or user attached one)."
2115
+ "default": "[]",
2116
+ "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
2117
2117
  },
2118
2118
  {
2119
2119
  "kind": "field",
@@ -2124,58 +2124,98 @@
2124
2124
  },
2125
2125
  {
2126
2126
  "kind": "field",
2127
- "name": "pendingAlertSoundData",
2127
+ "name": "pendingRuleIndex",
2128
2128
  "type": {
2129
- "text": "string | null"
2129
+ "text": "number | null"
2130
2130
  },
2131
+ "privacy": "private",
2131
2132
  "default": "null"
2132
2133
  },
2133
2134
  {
2134
2135
  "kind": "field",
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)."
2136
+ "name": "player",
2137
+ "privacy": "private",
2138
+ "readonly": true
2141
2139
  },
2142
2140
  {
2143
2141
  "kind": "field",
2144
- "name": "clearAlertSound",
2142
+ "name": "unsubscribePlayer",
2145
2143
  "type": {
2146
- "text": "boolean"
2144
+ "text": "(() => void) | undefined"
2147
2145
  },
2148
- "default": "false"
2146
+ "privacy": "private"
2149
2147
  },
2150
2148
  {
2151
2149
  "kind": "field",
2152
- "name": "testAudio",
2150
+ "name": "ignoreSelectChanges",
2153
2151
  "type": {
2154
- "text": "HTMLAudioElement | null"
2152
+ "text": "boolean"
2155
2153
  },
2156
- "default": "null",
2157
- "description": "In-progress Test playback; not private — mixin return type is exported."
2154
+ "privacy": "private",
2155
+ "default": "false",
2156
+ "description": "Suppresses select change events while options are rebuilt."
2158
2157
  },
2159
2158
  {
2160
2159
  "kind": "method",
2161
- "name": "loadExistingAlertSound",
2160
+ "name": "onMatchModeChange",
2161
+ "return": {
2162
+ "type": {
2163
+ "text": "boolean"
2164
+ }
2165
+ },
2162
2166
  "parameters": [
2163
2167
  {
2164
- "name": "dynamicRuleId",
2168
+ "name": "index",
2165
2169
  "type": {
2166
- "text": "string"
2170
+ "text": "number"
2171
+ }
2172
+ },
2173
+ {
2174
+ "name": "event",
2175
+ "type": {
2176
+ "text": "Event"
2167
2177
  }
2168
2178
  }
2169
2179
  ]
2170
2180
  },
2171
2181
  {
2172
2182
  "kind": "method",
2173
- "name": "openAlertSoundPicker"
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
+ ]
2174
2203
  },
2175
2204
  {
2176
2205
  "kind": "method",
2177
- "name": "onAlertSoundSelected",
2206
+ "name": "onRuleChange",
2207
+ "return": {
2208
+ "type": {
2209
+ "text": "boolean"
2210
+ }
2211
+ },
2178
2212
  "parameters": [
2213
+ {
2214
+ "name": "index",
2215
+ "type": {
2216
+ "text": "number"
2217
+ }
2218
+ },
2179
2219
  {
2180
2220
  "name": "event",
2181
2221
  "type": {
@@ -2186,852 +2226,939 @@
2186
2226
  },
2187
2227
  {
2188
2228
  "kind": "method",
2189
- "name": "clearAttachedAlertSound"
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
+ ]
2190
2243
  },
2191
2244
  {
2192
2245
  "kind": "method",
2193
- "name": "testAttachedAlertSound"
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
+ ]
2194
2260
  },
2195
2261
  {
2196
2262
  "kind": "method",
2197
- "name": "stopTestSound"
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
+ ]
2198
2277
  },
2199
2278
  {
2200
2279
  "kind": "method",
2201
- "name": "resetAlertSoundState"
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
+ ]
2202
2294
  },
2203
2295
  {
2204
2296
  "kind": "method",
2205
- "name": "applyAlertSoundToPayload",
2297
+ "name": "toggleRuleMute",
2206
2298
  "return": {
2207
2299
  "type": {
2208
- "text": "T"
2300
+ "text": "boolean"
2209
2301
  }
2210
2302
  },
2211
2303
  "parameters": [
2212
2304
  {
2213
- "name": "target",
2305
+ "name": "index",
2214
2306
  "type": {
2215
- "text": "T"
2307
+ "text": "number"
2216
2308
  }
2217
2309
  }
2218
- ],
2219
- "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
2310
+ ]
2220
2311
  },
2221
2312
  {
2222
2313
  "kind": "method",
2223
- "name": "syncAlertSoundCacheAfterSave",
2224
- "description": "Keep AlertSoundPlayer's in-memory NOTIFY_ALERT_SOUND cache in sync with\nwhat we just saved — otherwise the next alert still plays the old file."
2225
- }
2226
- ],
2227
- "parameters": [
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
+ },
2228
2329
  {
2229
- "name": "Base",
2230
- "type": {
2231
- "text": "TBase"
2330
+ "kind": "method",
2331
+ "name": "toggleMute",
2332
+ "return": {
2333
+ "type": {
2334
+ "text": "boolean"
2335
+ }
2232
2336
  }
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": [
2337
+ },
2303
2338
  {
2304
- "kind": "field",
2305
- "name": "id",
2306
- "type": {
2307
- "text": "string"
2339
+ "kind": "method",
2340
+ "name": "addRule",
2341
+ "return": {
2342
+ "type": {
2343
+ "text": "boolean"
2344
+ }
2308
2345
  }
2309
2346
  },
2310
2347
  {
2311
- "kind": "field",
2312
- "name": "name",
2313
- "type": {
2314
- "text": "string"
2315
- }
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
+ ]
2316
2363
  },
2317
2364
  {
2318
- "kind": "field",
2319
- "name": "component",
2320
- "type": {
2321
- "text": "string"
2322
- }
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)."
2323
2373
  },
2324
2374
  {
2325
- "kind": "field",
2326
- "name": "right",
2327
- "type": {
2328
- "text": "string"
2375
+ "kind": "method",
2376
+ "name": "loadRules",
2377
+ "privacy": "private",
2378
+ "return": {
2379
+ "type": {
2380
+ "text": "Promise<void>"
2381
+ }
2329
2382
  }
2383
+ },
2384
+ {
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
+ ]
2441
+ },
2442
+ {
2443
+ "kind": "method",
2444
+ "name": "syncSoundState",
2445
+ "privacy": "private"
2330
2446
  }
2331
- ]
2332
- },
2333
- {
2334
- "kind": "variable",
2335
- "name": "NOTIFICATION_DASHBOARD_TABS",
2336
- "type": {
2337
- "text": "NotificationDashboardTab[]"
2447
+ ],
2448
+ "superclass": {
2449
+ "name": "GenesisElement",
2450
+ "package": "@genesislcap/web-core"
2338
2451
  },
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]"
2452
+ "tagName": "foundation-sounds-panel",
2453
+ "customElement": true
2340
2454
  }
2341
2455
  ],
2342
2456
  "exports": [
2343
2457
  {
2344
2458
  "kind": "js",
2345
- "name": "NotificationDashboardTab",
2459
+ "name": "FoundationSoundsPanel",
2346
2460
  "declaration": {
2347
- "name": "NotificationDashboardTab",
2348
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2461
+ "name": "FoundationSoundsPanel",
2462
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
2349
2463
  }
2350
2464
  },
2351
2465
  {
2352
- "kind": "js",
2353
- "name": "NOTIFICATION_DASHBOARD_TABS",
2466
+ "kind": "custom-element-definition",
2467
+ "name": "foundation-sounds-panel",
2354
2468
  "declaration": {
2355
- "name": "NOTIFICATION_DASHBOARD_TABS",
2356
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2469
+ "name": "FoundationSoundsPanel",
2470
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
2357
2471
  }
2358
2472
  }
2359
2473
  ]
2360
2474
  },
2361
2475
  {
2362
2476
  "kind": "javascript-module",
2363
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
2477
+ "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
2364
2478
  "declarations": [
2365
2479
  {
2366
2480
  "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`"
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."
2369
2484
  }
2370
2485
  ],
2371
2486
  "exports": [
2372
2487
  {
2373
2488
  "kind": "js",
2374
- "name": "FoundationNotificationDashboardTemplate",
2489
+ "name": "FoundationSoundsStyles",
2375
2490
  "declaration": {
2376
- "name": "FoundationNotificationDashboardTemplate",
2377
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
2491
+ "name": "FoundationSoundsStyles",
2492
+ "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
2378
2493
  }
2379
2494
  }
2380
2495
  ]
2381
2496
  },
2382
2497
  {
2383
2498
  "kind": "javascript-module",
2384
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
2499
+ "path": "src/components/foundation-sounds/foundation-sounds.ts",
2385
2500
  "declarations": [
2386
2501
  {
2387
2502
  "kind": "class",
2388
- "description": "",
2389
- "name": "FoundationNotificationDashboard",
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",
2390
2505
  "members": [
2391
2506
  {
2392
2507
  "kind": "field",
2393
- "name": "auth",
2508
+ "name": "connect",
2394
2509
  "type": {
2395
- "text": "Auth"
2510
+ "text": "Connect"
2396
2511
  }
2397
2512
  },
2398
2513
  {
2399
2514
  "kind": "field",
2400
- "name": "ready",
2515
+ "name": "inboxService",
2401
2516
  "type": {
2402
- "text": "boolean"
2403
- },
2404
- "default": "false"
2517
+ "text": "FoundationInboxService"
2518
+ }
2405
2519
  },
2406
2520
  {
2407
2521
  "kind": "field",
2408
- "name": "hasPermissions",
2522
+ "name": "ruleService",
2409
2523
  "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": [
2524
+ "text": "RuleService"
2525
+ }
2526
+ },
2451
2527
  {
2452
2528
  "kind": "field",
2453
- "name": "uuid",
2529
+ "name": "soundEnabled",
2454
2530
  "type": {
2455
- "text": "UUID"
2531
+ "text": "boolean"
2456
2532
  },
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
2533
+ "default": "true",
2534
+ "description": "When false, new audible alerts are tracked but do not play."
2485
2535
  },
2486
2536
  {
2487
2537
  "kind": "field",
2488
- "name": "createAssignment",
2489
- "static": true
2538
+ "name": "connectionSub",
2539
+ "type": {
2540
+ "text": "Subscription | undefined"
2541
+ },
2542
+ "privacy": "private"
2490
2543
  },
2491
2544
  {
2492
2545
  "kind": "field",
2493
- "name": "createTextAssignment",
2494
- "static": true
2546
+ "name": "player",
2547
+ "privacy": "private",
2548
+ "readonly": true
2495
2549
  },
2496
2550
  {
2497
2551
  "kind": "field",
2498
- "name": "getAssignmentValue",
2499
- "static": true
2552
+ "name": "knownAlertIds",
2553
+ "privacy": "private",
2554
+ "default": "new Set<string>()"
2500
2555
  },
2501
2556
  {
2502
2557
  "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
- ]
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."
2599
2563
  },
2600
2564
  {
2601
2565
  "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
- }
2566
+ "name": "subscribeToAlerts",
2567
+ "privacy": "private",
2568
+ "return": {
2569
+ "type": {
2570
+ "text": "void"
2615
2571
  }
2616
- ]
2572
+ }
2573
+ },
2574
+ {
2575
+ "kind": "field",
2576
+ "name": "subscriptionHandler",
2577
+ "privacy": "private"
2617
2578
  },
2618
2579
  {
2619
2580
  "kind": "method",
2620
- "name": "resolveLeftValues",
2621
- "static": true,
2581
+ "name": "playForNewAlerts",
2582
+ "privacy": "private",
2622
2583
  "return": {
2623
2584
  "type": {
2624
- "text": "ConditionNode[]"
2585
+ "text": "Promise<void>"
2625
2586
  }
2626
2587
  },
2627
2588
  "parameters": [
2628
2589
  {
2629
- "name": "conditions",
2630
- "type": {
2631
- "text": "ConditionNode[]"
2632
- }
2633
- },
2634
- {
2635
- "name": "fields",
2590
+ "name": "rows",
2636
2591
  "type": {
2637
- "text": "any[]"
2592
+ "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
2638
2593
  }
2639
2594
  }
2640
2595
  ]
2641
2596
  },
2642
- {
2643
- "kind": "field",
2644
- "name": "createEmptyGroup",
2645
- "static": true
2646
- },
2647
2597
  {
2648
2598
  "kind": "method",
2649
- "name": "buildRawExpression",
2650
- "static": true,
2599
+ "name": "tryPlayServerSound",
2600
+ "privacy": "private",
2651
2601
  "return": {
2652
2602
  "type": {
2653
- "text": "string"
2603
+ "text": "Promise<boolean>"
2654
2604
  }
2655
2605
  },
2656
2606
  "parameters": [
2657
2607
  {
2658
- "name": "conditions",
2608
+ "name": "dynamicRuleId",
2659
2609
  "type": {
2660
- "text": "ConditionNode[]"
2610
+ "text": "string"
2661
2611
  }
2662
2612
  }
2663
2613
  ]
2664
2614
  },
2665
2615
  {
2666
2616
  "kind": "method",
2667
- "name": "parseRawExpression",
2668
- "static": true,
2617
+ "name": "fetchAndCacheServerSound",
2618
+ "privacy": "private",
2669
2619
  "return": {
2670
2620
  "type": {
2671
- "text": "ConditionNode[] | null"
2621
+ "text": "Promise<boolean>"
2672
2622
  }
2673
2623
  },
2674
2624
  "parameters": [
2675
2625
  {
2676
- "name": "rawExpression",
2626
+ "name": "dynamicRuleId",
2677
2627
  "type": {
2678
2628
  "text": "string"
2679
2629
  }
2680
2630
  }
2681
2631
  ]
2682
2632
  }
2683
- ]
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
+ }
2684
2661
  },
2685
2662
  {
2686
- "kind": "class",
2687
- "description": "",
2688
- "name": "TemplateUtils",
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",
2689
2687
  "members": [
2690
2688
  {
2691
2689
  "kind": "field",
2692
- "name": "createEmptyParameter",
2693
- "static": true
2690
+ "name": "ruleService",
2691
+ "type": {
2692
+ "text": "RuleService"
2693
+ }
2694
2694
  },
2695
2695
  {
2696
- "kind": "method",
2697
- "name": "getParameters",
2698
- "static": true,
2699
- "parameters": [
2700
- {
2701
- "name": "parameters"
2702
- }
2703
- ]
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
2704
2703
  },
2705
2704
  {
2706
- "kind": "method",
2707
- "name": "buildRightValue",
2708
- "privacy": "private",
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
2723
- }
2724
- ]
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
2725
2712
  },
2726
2713
  {
2727
- "kind": "method",
2728
- "name": "getConditions",
2729
- "static": true,
2730
- "parameters": [
2731
- {
2732
- "name": "conditions"
2733
- },
2734
- {
2735
- "name": "parameters",
2736
- "optional": true
2737
- }
2738
- ]
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"
2779
+ },
2780
+ {
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."
2739
2788
  },
2740
2789
  {
2741
2790
  "kind": "method",
2742
- "name": "createParameterDetails",
2743
- "static": true,
2791
+ "name": "loadExistingAlertSound",
2744
2792
  "parameters": [
2745
2793
  {
2746
- "name": "parameters"
2794
+ "name": "dynamicRuleId",
2795
+ "type": {
2796
+ "text": "string"
2797
+ }
2747
2798
  }
2748
2799
  ]
2749
- }
2750
- ]
2751
- },
2752
- {
2753
- "kind": "class",
2754
- "description": "",
2755
- "name": "RuleUtils",
2756
- "members": [
2800
+ },
2757
2801
  {
2758
2802
  "kind": "method",
2759
- "name": "buildRightValue",
2760
- "privacy": "private",
2761
- "static": true,
2803
+ "name": "openAlertSoundPicker"
2804
+ },
2805
+ {
2806
+ "kind": "method",
2807
+ "name": "onAlertSoundSelected",
2762
2808
  "parameters": [
2763
2809
  {
2764
- "name": "logicalOperator",
2810
+ "name": "event",
2765
2811
  "type": {
2766
- "text": "LogicalOperator"
2812
+ "text": "Event"
2767
2813
  }
2768
- },
2769
- {
2770
- "name": "condition"
2771
2814
  }
2772
2815
  ]
2773
2816
  },
2774
2817
  {
2775
2818
  "kind": "method",
2776
- "name": "getConditions",
2777
- "static": true,
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
+ },
2778
2841
  "parameters": [
2779
2842
  {
2780
- "name": "conditions"
2843
+ "name": "target",
2844
+ "type": {
2845
+ "text": "T"
2846
+ }
2781
2847
  }
2782
- ]
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."
2783
2855
  }
2784
- ]
2785
- },
2786
- {
2787
- "kind": "function",
2788
- "name": "showNotificationError",
2856
+ ],
2789
2857
  "parameters": [
2790
2858
  {
2791
- "name": "error"
2859
+ "name": "Base",
2860
+ "type": {
2861
+ "text": "TBase"
2862
+ }
2792
2863
  }
2793
- ]
2864
+ ],
2865
+ "privacy": "public"
2794
2866
  }
2795
2867
  ],
2796
2868
  "exports": [
2797
2869
  {
2798
2870
  "kind": "js",
2799
- "name": "UUIDGenerator",
2871
+ "name": "alertSoundAttachmentTemplate",
2800
2872
  "declaration": {
2801
- "name": "UUIDGenerator",
2802
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2873
+ "name": "alertSoundAttachmentTemplate",
2874
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2803
2875
  }
2804
2876
  },
2805
2877
  {
2806
2878
  "kind": "js",
2807
- "name": "isEmpty",
2879
+ "name": "AlertSoundAttachmentMixin",
2808
2880
  "declaration": {
2809
- "name": "isEmpty",
2810
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2881
+ "name": "AlertSoundAttachmentMixin",
2882
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
2811
2883
  }
2812
- },
2884
+ }
2885
+ ]
2886
+ },
2887
+ {
2888
+ "kind": "javascript-module",
2889
+ "path": "src/components/foundation-notification-dashboard/index.ts",
2890
+ "declarations": [],
2891
+ "exports": [
2813
2892
  {
2814
2893
  "kind": "js",
2815
- "name": "DynamicRuleUtils",
2894
+ "name": "*",
2816
2895
  "declaration": {
2817
- "name": "DynamicRuleUtils",
2818
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2896
+ "name": "*",
2897
+ "package": "./notification-dashboard"
2819
2898
  }
2820
- },
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": [
2821
2914
  {
2822
2915
  "kind": "js",
2823
- "name": "TemplateUtils",
2916
+ "name": "FoundationNotificationDashboardStyles",
2824
2917
  "declaration": {
2825
- "name": "TemplateUtils",
2826
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2918
+ "name": "FoundationNotificationDashboardStyles",
2919
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
2827
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
+ }
2953
+ },
2954
+ {
2955
+ "kind": "field",
2956
+ "name": "right",
2957
+ "type": {
2958
+ "text": "string"
2959
+ }
2960
+ }
2961
+ ]
2828
2962
  },
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": [
2829
2973
  {
2830
2974
  "kind": "js",
2831
- "name": "RuleUtils",
2975
+ "name": "NotificationDashboardTab",
2832
2976
  "declaration": {
2833
- "name": "RuleUtils",
2834
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2977
+ "name": "NotificationDashboardTab",
2978
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2835
2979
  }
2836
2980
  },
2837
2981
  {
2838
2982
  "kind": "js",
2839
- "name": "showNotificationError",
2983
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2840
2984
  "declaration": {
2841
- "name": "showNotificationError",
2842
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
2985
+ "name": "NOTIFICATION_DASHBOARD_TABS",
2986
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
2843
2987
  }
2844
2988
  }
2845
2989
  ]
2846
2990
  },
2847
2991
  {
2848
2992
  "kind": "javascript-module",
2849
- "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2993
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
2850
2994
  "declarations": [
2851
2995
  {
2852
2996
  "kind": "variable",
2853
- "name": "FoundationSoundsPanelStyles",
2854
- "default": "css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n width: 100%;\n }\n\n .sounds-controls {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n gap: 12px;\n padding: calc(var(--design-unit) * 3px);\n box-sizing: border-box;\n }\n\n .sounds-help-disclosure {\n flex: 0 0 auto;\n }\n\n .sounds-help-toggle {\n margin-inline-start: calc(var(--design-unit) * 1px);\n }\n\n .sounds-help-toggle::before {\n content: '+';\n }\n\n .sounds-help-disclosure[expanded] .sounds-help-toggle::before {\n content: '−';\n }\n\n .sounds-help {\n margin: 0;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n text-align: left;\n }\n\n .volume-row {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: calc(var(--design-unit) * 2px);\n min-width: 0;\n }\n\n .volume-icon {\n flex: 0 0 auto;\n }\n\n .volume-label {\n flex: 0 0 auto;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .volume-slider {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .volume-percent {\n flex: 0 0 auto;\n min-width: 3ch;\n text-align: end;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .mute-all {\n flex: 0 0 auto;\n margin: 0;\n }\n\n .sound-rules-panel {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n }\n\n .sound-rules {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .sound-rule {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n\n /* Keep absolute listboxes from being clipped by the card itself. */\n overflow: visible;\n }\n\n .sound-rule-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-weight: 700;\n font-size: var(--type-ramp-minus-1-font-size);\n }\n\n .sound-rule-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .sound-rule-label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .pattern-input,\n .match-mode-select,\n .rule-select,\n .sound-file-input {\n width: 100%;\n }\n\n /*\n * Anchor the listbox to the select host and use position:fixed so it escapes\n * .sound-rules-panel overflow:auto (and the rule card). Each select sets a\n * unique --sounds-select-anchor / anchor-name via inline style.\n * !important beats FAST's internal absolute top/bottom for [open] selects.\n */\n .match-mode-select[open]::part(listbox),\n .rule-select[open]::part(listbox) {\n position: fixed !important;\n /* stylelint-disable-next-line property-no-unknown -- CSS anchor positioning */\n position-anchor: var(--sounds-select-anchor);\n inset: auto !important;\n top: anchor(bottom) !important;\n left: anchor(left) !important;\n right: anchor(right) !important;\n bottom: auto !important;\n width: auto !important;\n margin-top: calc(var(--design-unit) * 1px);\n z-index: 10000;\n max-height: min(240px, 40vh);\n overflow-x: hidden;\n overflow-y: auto;\n box-shadow: 0 4px 16px rgb(0 0 0 / 24%);\n }\n\n .match-mode-select[open][position='above']::part(listbox),\n .rule-select[open][position='above']::part(listbox) {\n top: auto !important;\n bottom: anchor(top) !important;\n margin-top: 0;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .sound-file-row {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .sound-file-row .sound-file-input {\n flex: 1;\n min-width: 0;\n }\n\n .choose-sound {\n cursor: pointer;\n }\n\n .sound-rules-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex: 0 0 auto;\n gap: 8px;\n }\n\n .rule-count {\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .file-input {\n display: none;\n }\n\n ${scrollbarStyles}\n`"
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`"
2855
2999
  }
2856
3000
  ],
2857
3001
  "exports": [
2858
3002
  {
2859
3003
  "kind": "js",
2860
- "name": "FoundationSoundsPanelStyles",
3004
+ "name": "FoundationNotificationDashboardTemplate",
2861
3005
  "declaration": {
2862
- "name": "FoundationSoundsPanelStyles",
2863
- "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
3006
+ "name": "FoundationNotificationDashboardTemplate",
3007
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
2864
3008
  }
2865
3009
  }
2866
3010
  ]
2867
3011
  },
2868
3012
  {
2869
3013
  "kind": "javascript-module",
2870
- "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
3014
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
2871
3015
  "declarations": [
2872
3016
  {
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`"
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
2876
3051
  }
2877
3052
  ],
2878
3053
  "exports": [
2879
3054
  {
2880
3055
  "kind": "js",
2881
- "name": "FoundationSoundsPanelTemplate",
3056
+ "name": "FoundationNotificationDashboard",
2882
3057
  "declaration": {
2883
- "name": "FoundationSoundsPanelTemplate",
2884
- "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
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"
2885
3068
  }
2886
3069
  }
2887
3070
  ]
2888
3071
  },
2889
3072
  {
2890
3073
  "kind": "javascript-module",
2891
- "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
3074
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
2892
3075
  "declarations": [
2893
3076
  {
2894
3077
  "kind": "class",
2895
- "description": "Configures alert sound rules in the inbox Sounds tab. Persists via the shared\nAlertSoundPlayer; playback is handled by layout-mounted\nFoundationSounds.",
2896
- "name": "FoundationSoundsPanel",
3078
+ "description": "",
3079
+ "name": "UUIDGenerator",
2897
3080
  "members": [
2898
3081
  {
2899
3082
  "kind": "field",
2900
- "name": "ruleService",
2901
- "type": {
2902
- "text": "RuleService"
2903
- }
2904
- },
2905
- {
2906
- "kind": "field",
2907
- "name": "volumePercent",
3083
+ "name": "uuid",
2908
3084
  "type": {
2909
- "text": "number"
3085
+ "text": "UUID"
2910
3086
  },
2911
- "default": "100",
2912
- "description": "Global playback volume 0–100. @internal"
3087
+ "privacy": "private",
3088
+ "static": true
2913
3089
  },
2914
3090
  {
2915
3091
  "kind": "field",
2916
- "name": "selectableRules",
2917
- "type": {
2918
- "text": "AlertSoundSelectableRule[]"
2919
- },
2920
- "default": "[]",
2921
- "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
2922
- },
3092
+ "name": "createUUID",
3093
+ "static": true
3094
+ }
3095
+ ]
3096
+ },
3097
+ {
3098
+ "kind": "function",
3099
+ "name": "isEmpty",
3100
+ "parameters": [
2923
3101
  {
2924
- "kind": "field",
2925
- "name": "fileInput",
2926
- "type": {
2927
- "text": "HTMLInputElement"
2928
- }
2929
- },
3102
+ "name": "value"
3103
+ }
3104
+ ]
3105
+ },
3106
+ {
3107
+ "kind": "class",
3108
+ "description": "",
3109
+ "name": "DynamicRuleUtils",
3110
+ "members": [
2930
3111
  {
2931
3112
  "kind": "field",
2932
- "name": "pendingRuleIndex",
2933
- "type": {
2934
- "text": "number | null"
2935
- },
2936
- "privacy": "private",
2937
- "default": "null"
3113
+ "name": "createEmptyCondition",
3114
+ "static": true
2938
3115
  },
2939
3116
  {
2940
3117
  "kind": "field",
2941
- "name": "player",
2942
- "privacy": "private",
2943
- "readonly": true
3118
+ "name": "createAssignment",
3119
+ "static": true
2944
3120
  },
2945
3121
  {
2946
3122
  "kind": "field",
2947
- "name": "unsubscribePlayer",
2948
- "type": {
2949
- "text": "(() => void) | undefined"
2950
- },
2951
- "privacy": "private"
3123
+ "name": "createTextAssignment",
3124
+ "static": true
2952
3125
  },
2953
3126
  {
2954
3127
  "kind": "field",
2955
- "name": "ignoreSelectChanges",
2956
- "type": {
2957
- "text": "boolean"
2958
- },
2959
- "privacy": "private",
2960
- "default": "false",
2961
- "description": "Suppresses select change events while options are rebuilt."
2962
- },
2963
- {
2964
- "kind": "method",
2965
- "name": "onMatchModeChange",
2966
- "return": {
2967
- "type": {
2968
- "text": "boolean"
2969
- }
2970
- },
2971
- "parameters": [
2972
- {
2973
- "name": "index",
2974
- "type": {
2975
- "text": "number"
2976
- }
2977
- },
2978
- {
2979
- "name": "event",
2980
- "type": {
2981
- "text": "Event"
2982
- }
2983
- }
2984
- ]
3128
+ "name": "getAssignmentValue",
3129
+ "static": true
2985
3130
  },
2986
3131
  {
2987
- "kind": "method",
2988
- "name": "onPatternInput",
2989
- "return": {
2990
- "type": {
2991
- "text": "boolean"
2992
- }
2993
- },
2994
- "parameters": [
2995
- {
2996
- "name": "index",
2997
- "type": {
2998
- "text": "number"
2999
- }
3000
- },
3001
- {
3002
- "name": "event",
3003
- "type": {
3004
- "text": "Event"
3005
- }
3006
- }
3007
- ]
3132
+ "kind": "field",
3133
+ "name": "getAssignmentText",
3134
+ "static": true
3008
3135
  },
3009
3136
  {
3010
3137
  "kind": "method",
3011
- "name": "onRuleChange",
3138
+ "name": "createConditions",
3139
+ "static": true,
3012
3140
  "return": {
3013
3141
  "type": {
3014
- "text": "boolean"
3142
+ "text": "any"
3015
3143
  }
3016
3144
  },
3017
3145
  "parameters": [
3018
3146
  {
3019
- "name": "index",
3147
+ "name": "conditions",
3020
3148
  "type": {
3021
- "text": "number"
3149
+ "text": "ConditionNode[]"
3022
3150
  }
3023
3151
  },
3024
3152
  {
3025
- "name": "event",
3026
- "type": {
3027
- "text": "Event"
3028
- }
3153
+ "name": "parameters",
3154
+ "optional": true
3029
3155
  }
3030
3156
  ]
3031
3157
  },
3032
3158
  {
3033
3159
  "kind": "method",
3034
- "name": "openFilePicker",
3160
+ "name": "hasMultiValueCondition",
3161
+ "static": true,
3035
3162
  "return": {
3036
3163
  "type": {
3037
3164
  "text": "boolean"
@@ -3039,16 +3166,17 @@
3039
3166
  },
3040
3167
  "parameters": [
3041
3168
  {
3042
- "name": "index",
3169
+ "name": "conditions",
3043
3170
  "type": {
3044
- "text": "number"
3171
+ "text": "ConditionNode[]"
3045
3172
  }
3046
3173
  }
3047
3174
  ]
3048
3175
  },
3049
3176
  {
3050
3177
  "kind": "method",
3051
- "name": "onFileSelected",
3178
+ "name": "hasOrJoin",
3179
+ "static": true,
3052
3180
  "return": {
3053
3181
  "type": {
3054
3182
  "text": "boolean"
@@ -3056,16 +3184,17 @@
3056
3184
  },
3057
3185
  "parameters": [
3058
3186
  {
3059
- "name": "event",
3187
+ "name": "conditions",
3060
3188
  "type": {
3061
- "text": "Event"
3189
+ "text": "ConditionNode[]"
3062
3190
  }
3063
3191
  }
3064
3192
  ]
3065
3193
  },
3066
3194
  {
3067
3195
  "kind": "method",
3068
- "name": "clearSound",
3196
+ "name": "hasGroup",
3197
+ "static": true,
3069
3198
  "return": {
3070
3199
  "type": {
3071
3200
  "text": "boolean"
@@ -3073,16 +3202,17 @@
3073
3202
  },
3074
3203
  "parameters": [
3075
3204
  {
3076
- "name": "index",
3205
+ "name": "conditions",
3077
3206
  "type": {
3078
- "text": "number"
3207
+ "text": "ConditionNode[]"
3079
3208
  }
3080
3209
  }
3081
3210
  ]
3082
3211
  },
3083
3212
  {
3084
3213
  "kind": "method",
3085
- "name": "testSound",
3214
+ "name": "hasUnsupportedOperator",
3215
+ "static": true,
3086
3216
  "return": {
3087
3217
  "type": {
3088
3218
  "text": "boolean"
@@ -3090,386 +3220,256 @@
3090
3220
  },
3091
3221
  "parameters": [
3092
3222
  {
3093
- "name": "index",
3223
+ "name": "conditions",
3094
3224
  "type": {
3095
- "text": "number"
3225
+ "text": "ConditionNode[]"
3096
3226
  }
3097
3227
  }
3098
3228
  ]
3099
3229
  },
3100
3230
  {
3101
3231
  "kind": "method",
3102
- "name": "toggleRuleMute",
3232
+ "name": "flattenConditions",
3233
+ "static": true,
3103
3234
  "return": {
3104
3235
  "type": {
3105
- "text": "boolean"
3236
+ "text": "ConditionBuilderEntity[]"
3106
3237
  }
3107
3238
  },
3108
3239
  "parameters": [
3109
3240
  {
3110
- "name": "index",
3241
+ "name": "conditions",
3111
3242
  "type": {
3112
- "text": "number"
3243
+ "text": "ConditionNode[]"
3113
3244
  }
3114
3245
  }
3115
3246
  ]
3116
3247
  },
3117
3248
  {
3118
3249
  "kind": "method",
3119
- "name": "onVolumeChange",
3250
+ "name": "resolveLeftValues",
3251
+ "static": true,
3120
3252
  "return": {
3121
3253
  "type": {
3122
- "text": "boolean"
3254
+ "text": "ConditionNode[]"
3123
3255
  }
3124
3256
  },
3125
3257
  "parameters": [
3126
3258
  {
3127
- "name": "event",
3259
+ "name": "conditions",
3128
3260
  "type": {
3129
- "text": "Event"
3261
+ "text": "ConditionNode[]"
3130
3262
  }
3131
- }
3132
- ]
3133
- },
3134
- {
3135
- "kind": "method",
3136
- "name": "toggleMute",
3137
- "return": {
3138
- "type": {
3139
- "text": "boolean"
3140
- }
3141
- }
3142
- },
3143
- {
3144
- "kind": "method",
3145
- "name": "addRule",
3146
- "return": {
3147
- "type": {
3148
- "text": "boolean"
3149
- }
3150
- }
3151
- },
3152
- {
3153
- "kind": "method",
3154
- "name": "removeRule",
3155
- "return": {
3156
- "type": {
3157
- "text": "boolean"
3158
- }
3159
- },
3160
- "parameters": [
3263
+ },
3161
3264
  {
3162
- "name": "index",
3265
+ "name": "fields",
3163
3266
  "type": {
3164
- "text": "number"
3267
+ "text": "any[]"
3165
3268
  }
3166
3269
  }
3167
3270
  ]
3168
3271
  },
3169
3272
  {
3170
- "kind": "method",
3171
- "name": "reloadRules",
3172
- "return": {
3173
- "type": {
3174
- "text": "Promise<void>"
3175
- }
3176
- },
3177
- "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
3178
- },
3179
- {
3180
- "kind": "method",
3181
- "name": "loadRules",
3182
- "privacy": "private",
3183
- "return": {
3184
- "type": {
3185
- "text": "Promise<void>"
3186
- }
3187
- }
3188
- },
3189
- {
3190
- "kind": "method",
3191
- "name": "settleRuleOptions",
3192
- "privacy": "private",
3193
- "return": {
3194
- "type": {
3195
- "text": "Promise<void>"
3196
- }
3197
- },
3198
- "description": "Suppresses select `change` events only while options-datasource rebuilds\nthe DOM — not for the `getRules()` round trip itself, so a user picking a\nrule while a request is in flight isn't silently dropped."
3199
- },
3200
- {
3201
- "kind": "method",
3202
- "name": "applyRuleSelectValues",
3203
- "privacy": "private",
3204
- "return": {
3205
- "type": {
3206
- "text": "void"
3207
- }
3208
- },
3209
- "description": "Re-applies persisted template ids onto `.rule-select` hosts after\noptions-datasource has rebuilt its options. We deliberately do *not* bind\n`:initialSelectedValue` to templateId: that path compares the option label\nagainst Select.value (the option id), always mismatches, clearData()'s the\nselect, and leaves the next pick stuck on \"Select a rule...\"."
3273
+ "kind": "field",
3274
+ "name": "createEmptyGroup",
3275
+ "static": true
3210
3276
  },
3211
3277
  {
3212
3278
  "kind": "method",
3213
- "name": "mapRules",
3214
- "privacy": "private",
3279
+ "name": "buildRawExpression",
3280
+ "static": true,
3215
3281
  "return": {
3216
3282
  "type": {
3217
- "text": "AlertSoundSelectableRule[]"
3283
+ "text": "string"
3218
3284
  }
3219
3285
  },
3220
3286
  "parameters": [
3221
3287
  {
3222
- "name": "ruleList",
3288
+ "name": "conditions",
3223
3289
  "type": {
3224
- "text": "NamedRuleRow[]"
3290
+ "text": "ConditionNode[]"
3225
3291
  }
3226
3292
  }
3227
3293
  ]
3228
3294
  },
3229
3295
  {
3230
3296
  "kind": "method",
3231
- "name": "ruleMatchId",
3232
- "privacy": "private",
3297
+ "name": "parseRawExpression",
3298
+ "static": true,
3233
3299
  "return": {
3234
3300
  "type": {
3235
- "text": "string"
3301
+ "text": "ConditionNode[] | null"
3236
3302
  }
3237
3303
  },
3238
3304
  "parameters": [
3239
3305
  {
3240
- "name": "rule",
3306
+ "name": "rawExpression",
3241
3307
  "type": {
3242
- "text": "NamedRuleRow | undefined"
3308
+ "text": "string"
3243
3309
  }
3244
3310
  }
3245
3311
  ]
3246
- },
3247
- {
3248
- "kind": "method",
3249
- "name": "syncSoundState",
3250
- "privacy": "private"
3251
3312
  }
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
- }
3313
+ ]
3269
3314
  },
3270
- {
3271
- "kind": "custom-element-definition",
3272
- "name": "foundation-sounds-panel",
3273
- "declaration": {
3274
- "name": "FoundationSoundsPanel",
3275
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3276
- }
3277
- }
3278
- ]
3279
- },
3280
- {
3281
- "kind": "javascript-module",
3282
- "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
3283
- "declarations": [
3284
- {
3285
- "kind": "variable",
3286
- "name": "FoundationSoundsStyles",
3287
- "default": "css`\n :host {\n display: none;\n }\n`",
3288
- "description": "Headless layout listener — take no space in the layout chrome."
3289
- }
3290
- ],
3291
- "exports": [
3292
- {
3293
- "kind": "js",
3294
- "name": "FoundationSoundsStyles",
3295
- "declaration": {
3296
- "name": "FoundationSoundsStyles",
3297
- "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
3298
- }
3299
- }
3300
- ]
3301
- },
3302
- {
3303
- "kind": "javascript-module",
3304
- "path": "src/components/foundation-sounds/foundation-sounds.ts",
3305
- "declarations": [
3306
3315
  {
3307
3316
  "kind": "class",
3308
- "description": "Headless listener for inbox alert inserts. Plays configured sounds via the\nshared AlertSoundPlayer. Mount once in the app layout.\n\nConfigure rules in the inbox Sounds tab with FoundationSoundsPanel.",
3309
- "name": "FoundationSounds",
3317
+ "description": "",
3318
+ "name": "TemplateUtils",
3310
3319
  "members": [
3311
3320
  {
3312
3321
  "kind": "field",
3313
- "name": "connect",
3314
- "type": {
3315
- "text": "Connect"
3316
- }
3317
- },
3318
- {
3319
- "kind": "field",
3320
- "name": "inboxService",
3321
- "type": {
3322
- "text": "FoundationInboxService"
3323
- }
3324
- },
3325
- {
3326
- "kind": "field",
3327
- "name": "ruleService",
3328
- "type": {
3329
- "text": "RuleService"
3330
- }
3331
- },
3332
- {
3333
- "kind": "field",
3334
- "name": "soundEnabled",
3335
- "type": {
3336
- "text": "boolean"
3337
- },
3338
- "default": "true",
3339
- "description": "When false, new audible alerts are tracked but do not play."
3340
- },
3341
- {
3342
- "kind": "field",
3343
- "name": "connectionSub",
3344
- "type": {
3345
- "text": "Subscription | undefined"
3346
- },
3347
- "privacy": "private"
3348
- },
3349
- {
3350
- "kind": "field",
3351
- "name": "player",
3352
- "privacy": "private",
3353
- "readonly": true
3354
- },
3355
- {
3356
- "kind": "field",
3357
- "name": "knownAlertIds",
3358
- "privacy": "private",
3359
- "default": "new Set<string>()"
3322
+ "name": "createEmptyParameter",
3323
+ "static": true
3360
3324
  },
3361
3325
  {
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."
3326
+ "kind": "method",
3327
+ "name": "getParameters",
3328
+ "static": true,
3329
+ "parameters": [
3330
+ {
3331
+ "name": "parameters"
3332
+ }
3333
+ ]
3368
3334
  },
3369
3335
  {
3370
3336
  "kind": "method",
3371
- "name": "subscribeToAlerts",
3337
+ "name": "buildRightValue",
3372
3338
  "privacy": "private",
3373
- "return": {
3374
- "type": {
3375
- "text": "void"
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
3376
3353
  }
3377
- }
3354
+ ]
3378
3355
  },
3379
3356
  {
3380
- "kind": "field",
3381
- "name": "subscriptionHandler",
3382
- "privacy": "private"
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
+ ]
3383
3369
  },
3384
3370
  {
3385
3371
  "kind": "method",
3386
- "name": "playForNewAlerts",
3387
- "privacy": "private",
3388
- "return": {
3389
- "type": {
3390
- "text": "Promise<void>"
3391
- }
3392
- },
3372
+ "name": "createParameterDetails",
3373
+ "static": true,
3393
3374
  "parameters": [
3394
3375
  {
3395
- "name": "rows",
3396
- "type": {
3397
- "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
3398
- }
3376
+ "name": "parameters"
3399
3377
  }
3400
3378
  ]
3401
- },
3379
+ }
3380
+ ]
3381
+ },
3382
+ {
3383
+ "kind": "class",
3384
+ "description": "",
3385
+ "name": "RuleUtils",
3386
+ "members": [
3402
3387
  {
3403
3388
  "kind": "method",
3404
- "name": "tryPlayServerSound",
3389
+ "name": "buildRightValue",
3405
3390
  "privacy": "private",
3406
- "return": {
3407
- "type": {
3408
- "text": "Promise<boolean>"
3409
- }
3410
- },
3391
+ "static": true,
3411
3392
  "parameters": [
3412
3393
  {
3413
- "name": "dynamicRuleId",
3394
+ "name": "logicalOperator",
3414
3395
  "type": {
3415
- "text": "string"
3396
+ "text": "LogicalOperator"
3416
3397
  }
3398
+ },
3399
+ {
3400
+ "name": "condition"
3417
3401
  }
3418
3402
  ]
3419
3403
  },
3420
3404
  {
3421
3405
  "kind": "method",
3422
- "name": "fetchAndCacheServerSound",
3423
- "privacy": "private",
3424
- "return": {
3425
- "type": {
3426
- "text": "Promise<boolean>"
3427
- }
3428
- },
3406
+ "name": "getConditions",
3407
+ "static": true,
3429
3408
  "parameters": [
3430
3409
  {
3431
- "name": "dynamicRuleId",
3432
- "type": {
3433
- "text": "string"
3434
- }
3410
+ "name": "conditions"
3435
3411
  }
3436
3412
  ]
3437
3413
  }
3438
- ],
3439
- "attributes": [
3414
+ ]
3415
+ },
3416
+ {
3417
+ "kind": "function",
3418
+ "name": "showNotificationError",
3419
+ "parameters": [
3440
3420
  {
3441
- "name": "sound-enabled",
3442
- "type": {
3443
- "text": "boolean"
3444
- },
3445
- "default": "true",
3446
- "description": "When false, new audible alerts are tracked but do not play.",
3447
- "fieldName": "soundEnabled"
3448
- }
3449
- ],
3450
- "superclass": {
3451
- "name": "GenesisElement",
3452
- "package": "@genesislcap/web-core"
3453
- },
3454
- "tagName": "foundation-sounds",
3455
- "customElement": true
3421
+ "name": "error"
3422
+ }
3423
+ ]
3456
3424
  }
3457
3425
  ],
3458
3426
  "exports": [
3459
3427
  {
3460
3428
  "kind": "js",
3461
- "name": "FoundationSounds",
3429
+ "name": "UUIDGenerator",
3462
3430
  "declaration": {
3463
- "name": "FoundationSounds",
3464
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
3431
+ "name": "UUIDGenerator",
3432
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3465
3433
  }
3466
3434
  },
3467
3435
  {
3468
- "kind": "custom-element-definition",
3469
- "name": "foundation-sounds",
3436
+ "kind": "js",
3437
+ "name": "isEmpty",
3470
3438
  "declaration": {
3471
- "name": "FoundationSounds",
3472
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
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",
3462
+ "declaration": {
3463
+ "name": "RuleUtils",
3464
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3465
+ }
3466
+ },
3467
+ {
3468
+ "kind": "js",
3469
+ "name": "showNotificationError",
3470
+ "declaration": {
3471
+ "name": "showNotificationError",
3472
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3473
3473
  }
3474
3474
  }
3475
3475
  ]
@@ -8727,54 +8727,268 @@
8727
8727
  },
8728
8728
  {
8729
8729
  "kind": "method",
8730
- "name": "deleteChild",
8730
+ "name": "deleteChild",
8731
+ "parameters": [
8732
+ {
8733
+ "name": "deletedChild",
8734
+ "type": {
8735
+ "text": "ConditionNode"
8736
+ }
8737
+ }
8738
+ ]
8739
+ },
8740
+ {
8741
+ "kind": "method",
8742
+ "name": "deleteSelf"
8743
+ }
8744
+ ],
8745
+ "events": [
8746
+ {
8747
+ "description": "Fired when this whole group should be removed",
8748
+ "name": "delete"
8749
+ },
8750
+ {
8751
+ "description": "Fired when anything inside this group changes",
8752
+ "name": "edit"
8753
+ }
8754
+ ],
8755
+ "superclass": {
8756
+ "name": "GenesisElement",
8757
+ "package": "@genesislcap/web-core"
8758
+ },
8759
+ "tagName": "rule-condition-group",
8760
+ "customElement": true
8761
+ }
8762
+ ],
8763
+ "exports": [
8764
+ {
8765
+ "kind": "js",
8766
+ "name": "RuleConditionGroup",
8767
+ "declaration": {
8768
+ "name": "RuleConditionGroup",
8769
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
8770
+ }
8771
+ },
8772
+ {
8773
+ "kind": "custom-element-definition",
8774
+ "name": "rule-condition-group",
8775
+ "declaration": {
8776
+ "name": "RuleConditionGroup",
8777
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
8778
+ }
8779
+ }
8780
+ ]
8781
+ },
8782
+ {
8783
+ "kind": "javascript-module",
8784
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts",
8785
+ "declarations": [
8786
+ {
8787
+ "kind": "variable",
8788
+ "name": "ParameterBuilderStyles",
8789
+ "default": "css`\n .parameter-builder {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n rapid-button {\n margin: 0;\n }\n\n .delete {\n margin: 0;\n display: flex;\n justify-content: center;\n height: calc(var(--design-unit) * 9px);\n }\n\n .delete:hover {\n background-color: color-mix(in srgb, var(--neutral-foreground-rest), transparent 89%);\n }\n\n rapid-text-field {\n width: 100%;\n margin-bottom: 0;\n }\n\n rapid-text-field::part(root) {\n height: calc(var(--design-unit) * 9px);\n }\n\n rapid-select {\n min-width: auto;\n }\n\n rapid-select.param-type::part(control) {\n width: 115px;\n }\n\n rapid-select.param-source-type::part(control) {\n width: 160px;\n }\n\n rapid-select.param-source::part(control) {\n width: ${PARAM_SOURCE_WIDTH}px;\n }\n\n rapid-text-field.param-source::part(root) {\n width: calc(${PARAM_SOURCE_WIDTH}px + 2px);\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
8790
+ }
8791
+ ],
8792
+ "exports": [
8793
+ {
8794
+ "kind": "js",
8795
+ "name": "ParameterBuilderStyles",
8796
+ "declaration": {
8797
+ "name": "ParameterBuilderStyles",
8798
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts"
8799
+ }
8800
+ }
8801
+ ]
8802
+ },
8803
+ {
8804
+ "kind": "javascript-module",
8805
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts",
8806
+ "declarations": [
8807
+ {
8808
+ "kind": "variable",
8809
+ "name": "ParameterBuilderTemplate",
8810
+ "default": "html<ParameterBuilder>`\n <div class=\"parameter-builder\">\n <rapid-text-field\n id=\"param-name\"\n placeholder=\"Name\"\n :value=${sync((x) => x.name)}\n ></rapid-text-field>\n\n <rapid-text-field\n id=\"param-label\"\n placeholder=\"Label\"\n :value=${sync((x) => x.label)}\n ></rapid-text-field>\n\n <rapid-select\n id=\"param-source-type\"\n :value=${sync((x) => x.sourceType)}\n class=\"param-source-type\"\n >\n ${repeat(\n (x) => ALL_PARAM_SOURCE_TYPES,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_USER_TEXT,\n html<ParameterBuilder>`\n <rapid-text-field class=\"param-source\" disabled></rapid-text-field>\n `,\n )}\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_REQ_REP,\n html<ParameterBuilder>`\n <rapid-select\n ${ref('sourceSelect')}\n id=\"param-source\"\n :value=${sync((x) => x.sourceSelected)}\n class=\"param-source\"\n ?disabled=${(x) => x.sourceType !== PARAM_SOURCE_TYPE_REQ_REP}\n >\n ${repeat(\n (x) => x.reqRepItems,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n `,\n )}\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_DEFINED_GROUP,\n html<ParameterBuilder>`\n <rapid-text-field\n ${ref('sourceTextField')}\n class=\"param-source\"\n placeholder=\"item1,item2,item3\"\n :value=${sync((x) => x.sourceTyped)}\n ></rapid-text-field>\n `,\n )}\n\n <rapid-select id=\"param-type\" :value=${sync((x) => x.type)} class=\"param-type\">\n ${repeat(\n (x) => ALL_PARAM_TYPES,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n <rapid-button appearance=\"icon\" class=\"delete\" @click=${(x) => x.deleteParameter()}>\n <rapid-icon\n style=\"opacity: 0.5\"\n variant=\"regular\"\n name=\"trash-alt\"\n size=\"lg\"\n part=\"icon\"\n ></rapid-icon>\n </rapid-button>\n </div>\n`"
8811
+ }
8812
+ ],
8813
+ "exports": [
8814
+ {
8815
+ "kind": "js",
8816
+ "name": "ParameterBuilderTemplate",
8817
+ "declaration": {
8818
+ "name": "ParameterBuilderTemplate",
8819
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts"
8820
+ }
8821
+ }
8822
+ ]
8823
+ },
8824
+ {
8825
+ "kind": "javascript-module",
8826
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts",
8827
+ "declarations": [
8828
+ {
8829
+ "kind": "class",
8830
+ "description": "Parameter builder for notification templates.",
8831
+ "name": "ParameterBuilder",
8832
+ "members": [
8833
+ {
8834
+ "kind": "field",
8835
+ "name": "parameter",
8836
+ "type": {
8837
+ "text": "ParameterBuilderEntity"
8838
+ }
8839
+ },
8840
+ {
8841
+ "kind": "field",
8842
+ "name": "name",
8843
+ "type": {
8844
+ "text": "string"
8845
+ }
8846
+ },
8847
+ {
8848
+ "kind": "field",
8849
+ "name": "label",
8850
+ "type": {
8851
+ "text": "string"
8852
+ }
8853
+ },
8854
+ {
8855
+ "kind": "field",
8856
+ "name": "type",
8857
+ "type": {
8858
+ "text": "string"
8859
+ }
8860
+ },
8861
+ {
8862
+ "kind": "field",
8863
+ "name": "sourceType",
8864
+ "type": {
8865
+ "text": "string"
8866
+ }
8867
+ },
8868
+ {
8869
+ "kind": "field",
8870
+ "name": "sourceSelected",
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",
8731
8940
  "parameters": [
8732
8941
  {
8733
- "name": "deletedChild",
8734
- "type": {
8735
- "text": "ConditionNode"
8736
- }
8942
+ "name": "parameterAttribute"
8943
+ },
8944
+ {
8945
+ "name": "value"
8737
8946
  }
8738
8947
  ]
8739
- },
8740
- {
8741
- "kind": "method",
8742
- "name": "deleteSelf"
8743
8948
  }
8744
8949
  ],
8745
8950
  "events": [
8746
8951
  {
8747
- "description": "Fired when this whole group should be removed",
8952
+ "description": "Fired when a parameter is deleted. detail: `ParameterBuilderEntity`",
8748
8953
  "name": "delete"
8749
8954
  },
8750
8955
  {
8751
- "description": "Fired when anything inside this group changes",
8956
+ "description": "Fired when a parameter is edited. detail: `ParameterBuilderEntity`",
8752
8957
  "name": "edit"
8753
8958
  }
8754
8959
  ],
8960
+ "attributes": [
8961
+ {
8962
+ "name": "parameter",
8963
+ "type": {
8964
+ "text": "ParameterBuilderEntity"
8965
+ },
8966
+ "fieldName": "parameter"
8967
+ }
8968
+ ],
8755
8969
  "superclass": {
8756
8970
  "name": "GenesisElement",
8757
8971
  "package": "@genesislcap/web-core"
8758
8972
  },
8759
- "tagName": "rule-condition-group",
8973
+ "tagName": "parameter-builder",
8760
8974
  "customElement": true
8761
8975
  }
8762
8976
  ],
8763
8977
  "exports": [
8764
8978
  {
8765
8979
  "kind": "js",
8766
- "name": "RuleConditionGroup",
8980
+ "name": "ParameterBuilder",
8767
8981
  "declaration": {
8768
- "name": "RuleConditionGroup",
8769
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
8982
+ "name": "ParameterBuilder",
8983
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
8770
8984
  }
8771
8985
  },
8772
8986
  {
8773
8987
  "kind": "custom-element-definition",
8774
- "name": "rule-condition-group",
8988
+ "name": "parameter-builder",
8775
8989
  "declaration": {
8776
- "name": "RuleConditionGroup",
8777
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
8990
+ "name": "ParameterBuilder",
8991
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
8778
8992
  }
8779
8993
  }
8780
8994
  ]
@@ -9046,220 +9260,6 @@
9046
9260
  }
9047
9261
  ]
9048
9262
  },
9049
- {
9050
- "kind": "javascript-module",
9051
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts",
9052
- "declarations": [
9053
- {
9054
- "kind": "variable",
9055
- "name": "ParameterBuilderStyles",
9056
- "default": "css`\n .parameter-builder {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n rapid-button {\n margin: 0;\n }\n\n .delete {\n margin: 0;\n display: flex;\n justify-content: center;\n height: calc(var(--design-unit) * 9px);\n }\n\n .delete:hover {\n background-color: color-mix(in srgb, var(--neutral-foreground-rest), transparent 89%);\n }\n\n rapid-text-field {\n width: 100%;\n margin-bottom: 0;\n }\n\n rapid-text-field::part(root) {\n height: calc(var(--design-unit) * 9px);\n }\n\n rapid-select {\n min-width: auto;\n }\n\n rapid-select.param-type::part(control) {\n width: 115px;\n }\n\n rapid-select.param-source-type::part(control) {\n width: 160px;\n }\n\n rapid-select.param-source::part(control) {\n width: ${PARAM_SOURCE_WIDTH}px;\n }\n\n rapid-text-field.param-source::part(root) {\n width: calc(${PARAM_SOURCE_WIDTH}px + 2px);\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
9057
- }
9058
- ],
9059
- "exports": [
9060
- {
9061
- "kind": "js",
9062
- "name": "ParameterBuilderStyles",
9063
- "declaration": {
9064
- "name": "ParameterBuilderStyles",
9065
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts"
9066
- }
9067
- }
9068
- ]
9069
- },
9070
- {
9071
- "kind": "javascript-module",
9072
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts",
9073
- "declarations": [
9074
- {
9075
- "kind": "variable",
9076
- "name": "ParameterBuilderTemplate",
9077
- "default": "html<ParameterBuilder>`\n <div class=\"parameter-builder\">\n <rapid-text-field\n id=\"param-name\"\n placeholder=\"Name\"\n :value=${sync((x) => x.name)}\n ></rapid-text-field>\n\n <rapid-text-field\n id=\"param-label\"\n placeholder=\"Label\"\n :value=${sync((x) => x.label)}\n ></rapid-text-field>\n\n <rapid-select\n id=\"param-source-type\"\n :value=${sync((x) => x.sourceType)}\n class=\"param-source-type\"\n >\n ${repeat(\n (x) => ALL_PARAM_SOURCE_TYPES,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_USER_TEXT,\n html<ParameterBuilder>`\n <rapid-text-field class=\"param-source\" disabled></rapid-text-field>\n `,\n )}\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_REQ_REP,\n html<ParameterBuilder>`\n <rapid-select\n ${ref('sourceSelect')}\n id=\"param-source\"\n :value=${sync((x) => x.sourceSelected)}\n class=\"param-source\"\n ?disabled=${(x) => x.sourceType !== PARAM_SOURCE_TYPE_REQ_REP}\n >\n ${repeat(\n (x) => x.reqRepItems,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n `,\n )}\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_DEFINED_GROUP,\n html<ParameterBuilder>`\n <rapid-text-field\n ${ref('sourceTextField')}\n class=\"param-source\"\n placeholder=\"item1,item2,item3\"\n :value=${sync((x) => x.sourceTyped)}\n ></rapid-text-field>\n `,\n )}\n\n <rapid-select id=\"param-type\" :value=${sync((x) => x.type)} class=\"param-type\">\n ${repeat(\n (x) => ALL_PARAM_TYPES,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n <rapid-button appearance=\"icon\" class=\"delete\" @click=${(x) => x.deleteParameter()}>\n <rapid-icon\n style=\"opacity: 0.5\"\n variant=\"regular\"\n name=\"trash-alt\"\n size=\"lg\"\n part=\"icon\"\n ></rapid-icon>\n </rapid-button>\n </div>\n`"
9078
- }
9079
- ],
9080
- "exports": [
9081
- {
9082
- "kind": "js",
9083
- "name": "ParameterBuilderTemplate",
9084
- "declaration": {
9085
- "name": "ParameterBuilderTemplate",
9086
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts"
9087
- }
9088
- }
9089
- ]
9090
- },
9091
- {
9092
- "kind": "javascript-module",
9093
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts",
9094
- "declarations": [
9095
- {
9096
- "kind": "class",
9097
- "description": "Parameter builder for notification templates.",
9098
- "name": "ParameterBuilder",
9099
- "members": [
9100
- {
9101
- "kind": "field",
9102
- "name": "parameter",
9103
- "type": {
9104
- "text": "ParameterBuilderEntity"
9105
- }
9106
- },
9107
- {
9108
- "kind": "field",
9109
- "name": "name",
9110
- "type": {
9111
- "text": "string"
9112
- }
9113
- },
9114
- {
9115
- "kind": "field",
9116
- "name": "label",
9117
- "type": {
9118
- "text": "string"
9119
- }
9120
- },
9121
- {
9122
- "kind": "field",
9123
- "name": "type",
9124
- "type": {
9125
- "text": "string"
9126
- }
9127
- },
9128
- {
9129
- "kind": "field",
9130
- "name": "sourceType",
9131
- "type": {
9132
- "text": "string"
9133
- }
9134
- },
9135
- {
9136
- "kind": "field",
9137
- "name": "sourceSelected",
9138
- "type": {
9139
- "text": "string"
9140
- }
9141
- },
9142
- {
9143
- "kind": "field",
9144
- "name": "sourceTyped",
9145
- "type": {
9146
- "text": "string"
9147
- }
9148
- },
9149
- {
9150
- "kind": "field",
9151
- "name": "sourceTextField",
9152
- "type": {
9153
- "text": "TextField"
9154
- }
9155
- },
9156
- {
9157
- "kind": "field",
9158
- "name": "sourceSelect",
9159
- "type": {
9160
- "text": "Select"
9161
- }
9162
- },
9163
- {
9164
- "kind": "field",
9165
- "name": "reqRepItems",
9166
- "type": {
9167
- "text": "array"
9168
- },
9169
- "default": "['REQUEST_1', 'REQUEST_2', 'REQUEST_3']"
9170
- },
9171
- {
9172
- "kind": "method",
9173
- "name": "deleteParameter"
9174
- },
9175
- {
9176
- "kind": "method",
9177
- "name": "parameterChanged"
9178
- },
9179
- {
9180
- "kind": "method",
9181
- "name": "nameChanged"
9182
- },
9183
- {
9184
- "kind": "method",
9185
- "name": "labelChanged"
9186
- },
9187
- {
9188
- "kind": "method",
9189
- "name": "typeChanged"
9190
- },
9191
- {
9192
- "kind": "method",
9193
- "name": "sourceTypeChanged"
9194
- },
9195
- {
9196
- "kind": "method",
9197
- "name": "sourceSelectedChanged"
9198
- },
9199
- {
9200
- "kind": "method",
9201
- "name": "sourceTypedChanged"
9202
- },
9203
- {
9204
- "kind": "method",
9205
- "name": "genericChanged",
9206
- "privacy": "private",
9207
- "parameters": [
9208
- {
9209
- "name": "parameterAttribute"
9210
- },
9211
- {
9212
- "name": "value"
9213
- }
9214
- ]
9215
- }
9216
- ],
9217
- "events": [
9218
- {
9219
- "description": "Fired when a parameter is deleted. detail: `ParameterBuilderEntity`",
9220
- "name": "delete"
9221
- },
9222
- {
9223
- "description": "Fired when a parameter is edited. detail: `ParameterBuilderEntity`",
9224
- "name": "edit"
9225
- }
9226
- ],
9227
- "attributes": [
9228
- {
9229
- "name": "parameter",
9230
- "type": {
9231
- "text": "ParameterBuilderEntity"
9232
- },
9233
- "fieldName": "parameter"
9234
- }
9235
- ],
9236
- "superclass": {
9237
- "name": "GenesisElement",
9238
- "package": "@genesislcap/web-core"
9239
- },
9240
- "tagName": "parameter-builder",
9241
- "customElement": true
9242
- }
9243
- ],
9244
- "exports": [
9245
- {
9246
- "kind": "js",
9247
- "name": "ParameterBuilder",
9248
- "declaration": {
9249
- "name": "ParameterBuilder",
9250
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
9251
- }
9252
- },
9253
- {
9254
- "kind": "custom-element-definition",
9255
- "name": "parameter-builder",
9256
- "declaration": {
9257
- "name": "ParameterBuilder",
9258
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
9259
- }
9260
- }
9261
- ]
9262
- },
9263
9263
  {
9264
9264
  "kind": "javascript-module",
9265
9265
  "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts",