@genesislcap/pbc-notify-ui 15.76.1-alpha-aff9783af4.0 → 15.78.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.
@@ -2906,54 +2906,19 @@
2906
2906
  },
2907
2907
  {
2908
2908
  "kind": "javascript-module",
2909
- "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2910
- "declarations": [
2911
- {
2912
- "kind": "variable",
2913
- "name": "FoundationSoundsPanelStyles",
2914
- "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 width: auto !important;\n margin-top: calc(var(--design-unit) * 1px);\n z-index: 10000;\n max-height: min(240px, 40vh);\n overflow: hidden 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`"
2915
- }
2916
- ],
2917
- "exports": [
2918
- {
2919
- "kind": "js",
2920
- "name": "FoundationSoundsPanelStyles",
2921
- "declaration": {
2922
- "name": "FoundationSoundsPanelStyles",
2923
- "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
2924
- }
2925
- }
2926
- ]
2927
- },
2928
- {
2929
- "kind": "javascript-module",
2930
- "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
2909
+ "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
2931
2910
  "declarations": [
2932
2911
  {
2933
2912
  "kind": "variable",
2934
- "name": "FoundationSoundsPanelTemplate",
2935
- "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`"
2936
- }
2937
- ],
2938
- "exports": [
2939
- {
2940
- "kind": "js",
2941
- "name": "FoundationSoundsPanelTemplate",
2942
- "declaration": {
2943
- "name": "FoundationSoundsPanelTemplate",
2944
- "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
2945
- }
2946
- }
2947
- ]
2948
- },
2949
- {
2950
- "kind": "javascript-module",
2951
- "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
2952
- "declarations": [
2913
+ "name": "alertSoundAttachmentTemplate",
2914
+ "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`",
2915
+ "description": "Shared Attach/Replace/Test/Clear UI for rule and template dialogs.",
2916
+ "privacy": "public"
2917
+ },
2953
2918
  {
2954
- "kind": "class",
2955
- "description": "Configures alert sound rules in the inbox Sounds tab. Persists via the shared\nAlertSoundPlayer; playback is handled by layout-mounted\nFoundationSounds.",
2956
- "name": "FoundationSoundsPanel",
2919
+ "kind": "mixin",
2920
+ "description": "Mixin: pick / test / clear / load server sound + apply fields to submit payload.\n\nSubclasses must provide ruleService, isAlertSoundEditMode,\nalertSoundEntityId, and alertSoundCacheSyncMode.",
2921
+ "name": "AlertSoundAttachmentMixin",
2957
2922
  "members": [
2958
2923
  {
2959
2924
  "kind": "field",
@@ -2964,21 +2929,56 @@
2964
2929
  },
2965
2930
  {
2966
2931
  "kind": "field",
2967
- "name": "volumePercent",
2932
+ "name": "isAlertSoundEditMode",
2968
2933
  "type": {
2969
- "text": "number"
2934
+ "text": "boolean"
2970
2935
  },
2971
- "default": "100",
2972
- "description": "Global playback volume 0–100. @internal"
2936
+ "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
2937
+ "readonly": true
2973
2938
  },
2974
2939
  {
2975
2940
  "kind": "field",
2976
- "name": "selectableRules",
2941
+ "name": "alertSoundEntityId",
2977
2942
  "type": {
2978
- "text": "AlertSoundSelectableRule[]"
2943
+ "text": "string | null"
2979
2944
  },
2980
- "default": "[]",
2981
- "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
2945
+ "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
2946
+ "readonly": true
2947
+ },
2948
+ {
2949
+ "kind": "field",
2950
+ "name": "alertSoundCacheSyncMode",
2951
+ "type": {
2952
+ "text": "'entity' | 'all'"
2953
+ },
2954
+ "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
2955
+ "readonly": true
2956
+ },
2957
+ {
2958
+ "kind": "field",
2959
+ "name": "alertSoundFileName",
2960
+ "type": {
2961
+ "text": "string"
2962
+ },
2963
+ "default": "''",
2964
+ "description": "Display name of the attached / pending alert sound file."
2965
+ },
2966
+ {
2967
+ "kind": "field",
2968
+ "name": "alertSoundMimeType",
2969
+ "type": {
2970
+ "text": "string"
2971
+ },
2972
+ "default": "''"
2973
+ },
2974
+ {
2975
+ "kind": "field",
2976
+ "name": "hasAlertSound",
2977
+ "type": {
2978
+ "text": "boolean"
2979
+ },
2980
+ "default": "false",
2981
+ "description": "True when edit loaded an existing server sound (or user attached one)."
2982
2982
  },
2983
2983
  {
2984
2984
  "kind": "field",
@@ -2989,98 +2989,58 @@
2989
2989
  },
2990
2990
  {
2991
2991
  "kind": "field",
2992
- "name": "pendingRuleIndex",
2992
+ "name": "pendingAlertSoundData",
2993
2993
  "type": {
2994
- "text": "number | null"
2994
+ "text": "string | null"
2995
2995
  },
2996
- "privacy": "private",
2997
2996
  "default": "null"
2998
2997
  },
2999
2998
  {
3000
2999
  "kind": "field",
3001
- "name": "player",
3002
- "privacy": "private",
3003
- "readonly": true
3000
+ "name": "alertSoundDirty",
3001
+ "type": {
3002
+ "text": "boolean"
3003
+ },
3004
+ "default": "false",
3005
+ "description": "True when the user picked a new file this session (needs upload)."
3004
3006
  },
3005
3007
  {
3006
3008
  "kind": "field",
3007
- "name": "unsubscribePlayer",
3009
+ "name": "clearAlertSound",
3008
3010
  "type": {
3009
- "text": "(() => void) | undefined"
3011
+ "text": "boolean"
3010
3012
  },
3011
- "privacy": "private"
3013
+ "default": "false"
3012
3014
  },
3013
3015
  {
3014
3016
  "kind": "field",
3015
- "name": "ignoreSelectChanges",
3017
+ "name": "testAudio",
3016
3018
  "type": {
3017
- "text": "boolean"
3019
+ "text": "HTMLAudioElement | null"
3018
3020
  },
3019
- "privacy": "private",
3020
- "default": "false",
3021
- "description": "Suppresses select change events while options are rebuilt."
3021
+ "default": "null",
3022
+ "description": "In-progress Test playback; not private — mixin return type is exported."
3022
3023
  },
3023
3024
  {
3024
3025
  "kind": "method",
3025
- "name": "onMatchModeChange",
3026
- "return": {
3027
- "type": {
3028
- "text": "boolean"
3029
- }
3030
- },
3026
+ "name": "loadExistingAlertSound",
3031
3027
  "parameters": [
3032
3028
  {
3033
- "name": "index",
3034
- "type": {
3035
- "text": "number"
3036
- }
3037
- },
3038
- {
3039
- "name": "event",
3029
+ "name": "dynamicRuleId",
3040
3030
  "type": {
3041
- "text": "Event"
3031
+ "text": "string"
3042
3032
  }
3043
3033
  }
3044
3034
  ]
3045
3035
  },
3046
3036
  {
3047
3037
  "kind": "method",
3048
- "name": "onPatternInput",
3049
- "return": {
3050
- "type": {
3051
- "text": "boolean"
3052
- }
3053
- },
3054
- "parameters": [
3055
- {
3056
- "name": "index",
3057
- "type": {
3058
- "text": "number"
3059
- }
3060
- },
3061
- {
3062
- "name": "event",
3063
- "type": {
3064
- "text": "Event"
3065
- }
3066
- }
3067
- ]
3038
+ "name": "openAlertSoundPicker"
3068
3039
  },
3069
3040
  {
3070
3041
  "kind": "method",
3071
- "name": "onRuleChange",
3072
- "return": {
3073
- "type": {
3074
- "text": "boolean"
3075
- }
3076
- },
3042
+ "name": "onAlertSoundSelected",
3077
3043
  "parameters": [
3078
- {
3079
- "name": "index",
3080
- "type": {
3081
- "text": "number"
3082
- }
3083
- },
3084
3044
  {
3085
3045
  "name": "event",
3086
3046
  "type": {
@@ -3091,944 +3051,909 @@
3091
3051
  },
3092
3052
  {
3093
3053
  "kind": "method",
3094
- "name": "openFilePicker",
3095
- "return": {
3096
- "type": {
3097
- "text": "boolean"
3098
- }
3099
- },
3100
- "parameters": [
3101
- {
3102
- "name": "index",
3103
- "type": {
3104
- "text": "number"
3105
- }
3106
- }
3107
- ]
3054
+ "name": "clearAttachedAlertSound"
3108
3055
  },
3109
3056
  {
3110
3057
  "kind": "method",
3111
- "name": "onFileSelected",
3112
- "return": {
3113
- "type": {
3114
- "text": "boolean"
3115
- }
3116
- },
3117
- "parameters": [
3118
- {
3119
- "name": "event",
3120
- "type": {
3121
- "text": "Event"
3122
- }
3123
- }
3124
- ]
3058
+ "name": "testAttachedAlertSound"
3125
3059
  },
3126
3060
  {
3127
3061
  "kind": "method",
3128
- "name": "clearSound",
3129
- "return": {
3130
- "type": {
3131
- "text": "boolean"
3132
- }
3133
- },
3134
- "parameters": [
3135
- {
3136
- "name": "index",
3137
- "type": {
3138
- "text": "number"
3139
- }
3140
- }
3141
- ]
3062
+ "name": "stopTestSound"
3142
3063
  },
3143
3064
  {
3144
3065
  "kind": "method",
3145
- "name": "testSound",
3146
- "return": {
3147
- "type": {
3148
- "text": "boolean"
3149
- }
3150
- },
3151
- "parameters": [
3152
- {
3153
- "name": "index",
3154
- "type": {
3155
- "text": "number"
3156
- }
3157
- }
3158
- ]
3066
+ "name": "resetAlertSoundState"
3159
3067
  },
3160
3068
  {
3161
3069
  "kind": "method",
3162
- "name": "toggleRuleMute",
3070
+ "name": "applyAlertSoundToPayload",
3163
3071
  "return": {
3164
3072
  "type": {
3165
- "text": "boolean"
3073
+ "text": "T"
3166
3074
  }
3167
3075
  },
3168
3076
  "parameters": [
3169
3077
  {
3170
- "name": "index",
3078
+ "name": "target",
3171
3079
  "type": {
3172
- "text": "number"
3080
+ "text": "T"
3173
3081
  }
3174
3082
  }
3175
- ]
3083
+ ],
3084
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3176
3085
  },
3177
3086
  {
3178
3087
  "kind": "method",
3179
- "name": "onVolumeChange",
3180
- "return": {
3181
- "type": {
3182
- "text": "boolean"
3183
- }
3184
- },
3185
- "parameters": [
3186
- {
3187
- "name": "event",
3188
- "type": {
3189
- "text": "Event"
3190
- }
3191
- }
3192
- ]
3193
- },
3088
+ "name": "syncAlertSoundCacheAfterSave",
3089
+ "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."
3090
+ }
3091
+ ],
3092
+ "parameters": [
3194
3093
  {
3195
- "kind": "method",
3196
- "name": "toggleMute",
3197
- "return": {
3198
- "type": {
3199
- "text": "boolean"
3200
- }
3094
+ "name": "Base",
3095
+ "type": {
3096
+ "text": "TBase"
3201
3097
  }
3202
- },
3098
+ }
3099
+ ],
3100
+ "privacy": "public"
3101
+ }
3102
+ ],
3103
+ "exports": [
3104
+ {
3105
+ "kind": "js",
3106
+ "name": "alertSoundAttachmentTemplate",
3107
+ "declaration": {
3108
+ "name": "alertSoundAttachmentTemplate",
3109
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3110
+ }
3111
+ },
3112
+ {
3113
+ "kind": "js",
3114
+ "name": "AlertSoundAttachmentMixin",
3115
+ "declaration": {
3116
+ "name": "AlertSoundAttachmentMixin",
3117
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3118
+ }
3119
+ }
3120
+ ]
3121
+ },
3122
+ {
3123
+ "kind": "javascript-module",
3124
+ "path": "src/components/foundation-notification-dashboard/index.ts",
3125
+ "declarations": [],
3126
+ "exports": [
3127
+ {
3128
+ "kind": "js",
3129
+ "name": "*",
3130
+ "declaration": {
3131
+ "name": "*",
3132
+ "package": "./notification-dashboard"
3133
+ }
3134
+ }
3135
+ ]
3136
+ },
3137
+ {
3138
+ "kind": "javascript-module",
3139
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
3140
+ "declarations": [
3141
+ {
3142
+ "kind": "variable",
3143
+ "name": "FoundationNotificationDashboardStyles",
3144
+ "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`",
3145
+ "privacy": "public"
3146
+ }
3147
+ ],
3148
+ "exports": [
3149
+ {
3150
+ "kind": "js",
3151
+ "name": "FoundationNotificationDashboardStyles",
3152
+ "declaration": {
3153
+ "name": "FoundationNotificationDashboardStyles",
3154
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
3155
+ }
3156
+ }
3157
+ ]
3158
+ },
3159
+ {
3160
+ "kind": "javascript-module",
3161
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
3162
+ "declarations": [
3163
+ {
3164
+ "kind": "class",
3165
+ "description": "",
3166
+ "name": "NotificationDashboardTab",
3167
+ "members": [
3203
3168
  {
3204
- "kind": "method",
3205
- "name": "addRule",
3206
- "return": {
3207
- "type": {
3208
- "text": "boolean"
3209
- }
3169
+ "kind": "field",
3170
+ "name": "id",
3171
+ "type": {
3172
+ "text": "string"
3210
3173
  }
3211
3174
  },
3212
3175
  {
3213
- "kind": "method",
3214
- "name": "removeRule",
3215
- "return": {
3216
- "type": {
3217
- "text": "boolean"
3218
- }
3219
- },
3220
- "parameters": [
3221
- {
3222
- "name": "index",
3223
- "type": {
3224
- "text": "number"
3225
- }
3226
- }
3227
- ]
3228
- },
3229
- {
3230
- "kind": "method",
3231
- "name": "reloadRules",
3232
- "return": {
3233
- "type": {
3234
- "text": "Promise<void>"
3235
- }
3236
- },
3237
- "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
3238
- },
3239
- {
3240
- "kind": "method",
3241
- "name": "loadRules",
3242
- "privacy": "private",
3243
- "return": {
3244
- "type": {
3245
- "text": "Promise<void>"
3246
- }
3176
+ "kind": "field",
3177
+ "name": "name",
3178
+ "type": {
3179
+ "text": "string"
3247
3180
  }
3248
3181
  },
3249
3182
  {
3250
- "kind": "method",
3251
- "name": "settleRuleOptions",
3252
- "privacy": "private",
3253
- "return": {
3254
- "type": {
3255
- "text": "Promise<void>"
3256
- }
3257
- },
3258
- "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."
3259
- },
3260
- {
3261
- "kind": "method",
3262
- "name": "applyRuleSelectValues",
3263
- "privacy": "private",
3264
- "return": {
3265
- "type": {
3266
- "text": "void"
3267
- }
3268
- },
3269
- "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...\"."
3270
- },
3271
- {
3272
- "kind": "method",
3273
- "name": "mapRules",
3274
- "privacy": "private",
3275
- "return": {
3276
- "type": {
3277
- "text": "AlertSoundSelectableRule[]"
3278
- }
3279
- },
3280
- "parameters": [
3281
- {
3282
- "name": "ruleList",
3283
- "type": {
3284
- "text": "NamedRuleRow[]"
3285
- }
3286
- }
3287
- ]
3288
- },
3289
- {
3290
- "kind": "method",
3291
- "name": "ruleMatchId",
3292
- "privacy": "private",
3293
- "return": {
3294
- "type": {
3295
- "text": "string"
3296
- }
3297
- },
3298
- "parameters": [
3299
- {
3300
- "name": "rule",
3301
- "type": {
3302
- "text": "NamedRuleRow | undefined"
3303
- }
3304
- }
3305
- ]
3183
+ "kind": "field",
3184
+ "name": "component",
3185
+ "type": {
3186
+ "text": "string"
3187
+ }
3306
3188
  },
3307
3189
  {
3308
- "kind": "method",
3309
- "name": "syncSoundState",
3310
- "privacy": "private"
3190
+ "kind": "field",
3191
+ "name": "right",
3192
+ "type": {
3193
+ "text": "string"
3194
+ }
3311
3195
  }
3312
- ],
3313
- "superclass": {
3314
- "name": "GenesisElement",
3315
- "package": "@genesislcap/web-core"
3196
+ ]
3197
+ },
3198
+ {
3199
+ "kind": "variable",
3200
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3201
+ "type": {
3202
+ "text": "NotificationDashboardTab[]"
3316
3203
  },
3317
- "tagName": "foundation-sounds-panel",
3318
- "customElement": true
3204
+ "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]"
3319
3205
  }
3320
3206
  ],
3321
3207
  "exports": [
3322
3208
  {
3323
3209
  "kind": "js",
3324
- "name": "FoundationSoundsPanel",
3210
+ "name": "NotificationDashboardTab",
3325
3211
  "declaration": {
3326
- "name": "FoundationSoundsPanel",
3327
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3212
+ "name": "NotificationDashboardTab",
3213
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3328
3214
  }
3329
3215
  },
3330
3216
  {
3331
- "kind": "custom-element-definition",
3332
- "name": "foundation-sounds-panel",
3217
+ "kind": "js",
3218
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3333
3219
  "declaration": {
3334
- "name": "FoundationSoundsPanel",
3335
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3220
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3221
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3336
3222
  }
3337
3223
  }
3338
3224
  ]
3339
3225
  },
3340
3226
  {
3341
3227
  "kind": "javascript-module",
3342
- "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
3228
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3343
3229
  "declarations": [
3344
3230
  {
3345
3231
  "kind": "variable",
3346
- "name": "FoundationSoundsStyles",
3347
- "default": "css`\n :host {\n display: none;\n }\n`",
3348
- "description": "Headless layout listener — take no space in the layout chrome."
3232
+ "name": "FoundationNotificationDashboardTemplate",
3233
+ "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`"
3349
3234
  }
3350
3235
  ],
3351
3236
  "exports": [
3352
3237
  {
3353
3238
  "kind": "js",
3354
- "name": "FoundationSoundsStyles",
3239
+ "name": "FoundationNotificationDashboardTemplate",
3355
3240
  "declaration": {
3356
- "name": "FoundationSoundsStyles",
3357
- "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
3241
+ "name": "FoundationNotificationDashboardTemplate",
3242
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3358
3243
  }
3359
3244
  }
3360
3245
  ]
3361
3246
  },
3362
3247
  {
3363
3248
  "kind": "javascript-module",
3364
- "path": "src/components/foundation-sounds/foundation-sounds.ts",
3249
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3365
3250
  "declarations": [
3366
3251
  {
3367
3252
  "kind": "class",
3368
- "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.",
3369
- "name": "FoundationSounds",
3253
+ "description": "",
3254
+ "name": "FoundationNotificationDashboard",
3370
3255
  "members": [
3371
3256
  {
3372
3257
  "kind": "field",
3373
- "name": "connect",
3258
+ "name": "auth",
3374
3259
  "type": {
3375
- "text": "Connect"
3260
+ "text": "Auth"
3376
3261
  }
3377
3262
  },
3378
3263
  {
3379
3264
  "kind": "field",
3380
- "name": "inboxService",
3265
+ "name": "ready",
3381
3266
  "type": {
3382
- "text": "FoundationInboxService"
3383
- }
3267
+ "text": "boolean"
3268
+ },
3269
+ "default": "false"
3384
3270
  },
3385
3271
  {
3386
3272
  "kind": "field",
3387
- "name": "ruleService",
3273
+ "name": "hasPermissions",
3388
3274
  "type": {
3389
- "text": "RuleService"
3390
- }
3391
- },
3275
+ "text": "boolean"
3276
+ },
3277
+ "default": "true"
3278
+ }
3279
+ ],
3280
+ "superclass": {
3281
+ "name": "GenesisElement",
3282
+ "package": "@genesislcap/web-core"
3283
+ },
3284
+ "tagName": "foundation-notification-dashboard",
3285
+ "customElement": true
3286
+ }
3287
+ ],
3288
+ "exports": [
3289
+ {
3290
+ "kind": "js",
3291
+ "name": "FoundationNotificationDashboard",
3292
+ "declaration": {
3293
+ "name": "FoundationNotificationDashboard",
3294
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3295
+ }
3296
+ },
3297
+ {
3298
+ "kind": "custom-element-definition",
3299
+ "name": "foundation-notification-dashboard",
3300
+ "declaration": {
3301
+ "name": "FoundationNotificationDashboard",
3302
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3303
+ }
3304
+ }
3305
+ ]
3306
+ },
3307
+ {
3308
+ "kind": "javascript-module",
3309
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3310
+ "declarations": [
3311
+ {
3312
+ "kind": "class",
3313
+ "description": "",
3314
+ "name": "UUIDGenerator",
3315
+ "members": [
3392
3316
  {
3393
3317
  "kind": "field",
3394
- "name": "soundEnabled",
3318
+ "name": "uuid",
3395
3319
  "type": {
3396
- "text": "boolean"
3320
+ "text": "UUID"
3397
3321
  },
3398
- "default": "true",
3399
- "description": "When false, new audible alerts are tracked but do not play."
3322
+ "privacy": "private",
3323
+ "static": true
3400
3324
  },
3401
3325
  {
3402
3326
  "kind": "field",
3403
- "name": "connectionSub",
3404
- "type": {
3405
- "text": "Subscription | undefined"
3406
- },
3407
- "privacy": "private"
3327
+ "name": "createUUID",
3328
+ "static": true
3329
+ }
3330
+ ]
3331
+ },
3332
+ {
3333
+ "kind": "function",
3334
+ "name": "isEmpty",
3335
+ "parameters": [
3336
+ {
3337
+ "name": "value"
3338
+ }
3339
+ ]
3340
+ },
3341
+ {
3342
+ "kind": "class",
3343
+ "description": "",
3344
+ "name": "DynamicRuleUtils",
3345
+ "members": [
3346
+ {
3347
+ "kind": "field",
3348
+ "name": "createEmptyCondition",
3349
+ "static": true
3408
3350
  },
3409
3351
  {
3410
3352
  "kind": "field",
3411
- "name": "player",
3412
- "privacy": "private",
3413
- "readonly": true
3353
+ "name": "createAssignment",
3354
+ "static": true
3414
3355
  },
3415
3356
  {
3416
3357
  "kind": "field",
3417
- "name": "knownAlertIds",
3418
- "privacy": "private",
3419
- "default": "new Set<string>()"
3358
+ "name": "createPlaceholderAssignment",
3359
+ "static": true
3360
+ },
3361
+ {
3362
+ "kind": "field",
3363
+ "name": "createTextAssignment",
3364
+ "static": true
3365
+ },
3366
+ {
3367
+ "kind": "field",
3368
+ "name": "getAssignmentValue",
3369
+ "static": true
3420
3370
  },
3421
3371
  {
3422
3372
  "kind": "field",
3423
- "name": "serverSoundFetches",
3424
- "privacy": "private",
3425
- "readonly": true,
3426
- "default": "new Map<string, Promise<boolean>>()",
3427
- "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
3373
+ "name": "getAssignmentText",
3374
+ "static": true
3428
3375
  },
3429
3376
  {
3430
3377
  "kind": "method",
3431
- "name": "subscribeToAlerts",
3432
- "privacy": "private",
3378
+ "name": "createConditions",
3379
+ "static": true,
3433
3380
  "return": {
3434
3381
  "type": {
3435
- "text": "void"
3382
+ "text": "any"
3436
3383
  }
3437
- }
3438
- },
3439
- {
3440
- "kind": "field",
3441
- "name": "subscriptionHandler",
3442
- "privacy": "private"
3384
+ },
3385
+ "parameters": [
3386
+ {
3387
+ "name": "conditions",
3388
+ "type": {
3389
+ "text": "ConditionNode[]"
3390
+ }
3391
+ },
3392
+ {
3393
+ "name": "parameters",
3394
+ "optional": true
3395
+ }
3396
+ ]
3443
3397
  },
3444
3398
  {
3445
3399
  "kind": "method",
3446
- "name": "playForNewAlerts",
3447
- "privacy": "private",
3400
+ "name": "hasMultiValueCondition",
3401
+ "static": true,
3448
3402
  "return": {
3449
3403
  "type": {
3450
- "text": "Promise<void>"
3404
+ "text": "boolean"
3451
3405
  }
3452
3406
  },
3453
3407
  "parameters": [
3454
3408
  {
3455
- "name": "rows",
3409
+ "name": "conditions",
3456
3410
  "type": {
3457
- "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
3411
+ "text": "ConditionNode[]"
3458
3412
  }
3459
3413
  }
3460
3414
  ]
3461
3415
  },
3462
3416
  {
3463
3417
  "kind": "method",
3464
- "name": "tryPlayServerSound",
3465
- "privacy": "private",
3418
+ "name": "hasOrJoin",
3419
+ "static": true,
3466
3420
  "return": {
3467
3421
  "type": {
3468
- "text": "Promise<boolean>"
3422
+ "text": "boolean"
3469
3423
  }
3470
3424
  },
3471
3425
  "parameters": [
3472
3426
  {
3473
- "name": "dynamicRuleId",
3427
+ "name": "conditions",
3474
3428
  "type": {
3475
- "text": "string"
3429
+ "text": "ConditionNode[]"
3476
3430
  }
3477
3431
  }
3478
3432
  ]
3479
3433
  },
3480
3434
  {
3481
3435
  "kind": "method",
3482
- "name": "fetchAndCacheServerSound",
3483
- "privacy": "private",
3436
+ "name": "hasGroup",
3437
+ "static": true,
3484
3438
  "return": {
3485
3439
  "type": {
3486
- "text": "Promise<boolean>"
3440
+ "text": "boolean"
3487
3441
  }
3488
3442
  },
3489
3443
  "parameters": [
3490
3444
  {
3491
- "name": "dynamicRuleId",
3445
+ "name": "conditions",
3492
3446
  "type": {
3493
- "text": "string"
3447
+ "text": "ConditionNode[]"
3494
3448
  }
3495
3449
  }
3496
3450
  ]
3497
- }
3498
- ],
3499
- "attributes": [
3500
- {
3501
- "name": "sound-enabled",
3502
- "type": {
3503
- "text": "boolean"
3504
- },
3505
- "default": "true",
3506
- "description": "When false, new audible alerts are tracked but do not play.",
3507
- "fieldName": "soundEnabled"
3508
- }
3509
- ],
3510
- "superclass": {
3511
- "name": "GenesisElement",
3512
- "package": "@genesislcap/web-core"
3513
- },
3514
- "tagName": "foundation-sounds",
3515
- "customElement": true
3516
- }
3517
- ],
3518
- "exports": [
3519
- {
3520
- "kind": "js",
3521
- "name": "FoundationSounds",
3522
- "declaration": {
3523
- "name": "FoundationSounds",
3524
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
3525
- }
3526
- },
3527
- {
3528
- "kind": "custom-element-definition",
3529
- "name": "foundation-sounds",
3530
- "declaration": {
3531
- "name": "FoundationSounds",
3532
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
3533
- }
3534
- }
3535
- ]
3536
- },
3537
- {
3538
- "kind": "javascript-module",
3539
- "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
3540
- "declarations": [
3541
- {
3542
- "kind": "variable",
3543
- "name": "alertSoundAttachmentTemplate",
3544
- "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`",
3545
- "description": "Shared Attach/Replace/Test/Clear UI for rule and template dialogs.",
3546
- "privacy": "public"
3547
- },
3548
- {
3549
- "kind": "mixin",
3550
- "description": "Mixin: pick / test / clear / load server sound + apply fields to submit payload.\n\nSubclasses must provide ruleService, isAlertSoundEditMode,\nalertSoundEntityId, and alertSoundCacheSyncMode.",
3551
- "name": "AlertSoundAttachmentMixin",
3552
- "members": [
3553
- {
3554
- "kind": "field",
3555
- "name": "ruleService",
3556
- "type": {
3557
- "text": "RuleService"
3558
- }
3559
3451
  },
3560
3452
  {
3561
- "kind": "field",
3562
- "name": "isAlertSoundEditMode",
3563
- "type": {
3564
- "text": "boolean"
3565
- },
3566
- "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
3567
- "readonly": true
3568
- },
3569
- {
3570
- "kind": "field",
3571
- "name": "alertSoundEntityId",
3572
- "type": {
3573
- "text": "string | null"
3574
- },
3575
- "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
3576
- "readonly": true
3577
- },
3578
- {
3579
- "kind": "field",
3580
- "name": "alertSoundCacheSyncMode",
3581
- "type": {
3582
- "text": "'entity' | 'all'"
3583
- },
3584
- "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
3585
- "readonly": true
3586
- },
3587
- {
3588
- "kind": "field",
3589
- "name": "alertSoundFileName",
3590
- "type": {
3591
- "text": "string"
3592
- },
3593
- "default": "''",
3594
- "description": "Display name of the attached / pending alert sound file."
3595
- },
3596
- {
3597
- "kind": "field",
3598
- "name": "alertSoundMimeType",
3599
- "type": {
3600
- "text": "string"
3453
+ "kind": "method",
3454
+ "name": "hasUnsupportedOperator",
3455
+ "static": true,
3456
+ "return": {
3457
+ "type": {
3458
+ "text": "boolean"
3459
+ }
3601
3460
  },
3602
- "default": "''"
3461
+ "parameters": [
3462
+ {
3463
+ "name": "conditions",
3464
+ "type": {
3465
+ "text": "ConditionNode[]"
3466
+ }
3467
+ }
3468
+ ]
3603
3469
  },
3604
3470
  {
3605
- "kind": "field",
3606
- "name": "hasAlertSound",
3607
- "type": {
3608
- "text": "boolean"
3471
+ "kind": "method",
3472
+ "name": "hasCurrentUser",
3473
+ "static": true,
3474
+ "return": {
3475
+ "type": {
3476
+ "text": "boolean"
3477
+ }
3609
3478
  },
3610
- "default": "false",
3611
- "description": "True when edit loaded an existing server sound (or user attached one)."
3612
- },
3613
- {
3614
- "kind": "field",
3615
- "name": "fileInput",
3616
- "type": {
3617
- "text": "HTMLInputElement"
3618
- }
3479
+ "parameters": [
3480
+ {
3481
+ "name": "conditions",
3482
+ "type": {
3483
+ "text": "ConditionNode[]"
3484
+ }
3485
+ }
3486
+ ]
3619
3487
  },
3620
3488
  {
3621
- "kind": "field",
3622
- "name": "pendingAlertSoundData",
3623
- "type": {
3624
- "text": "string | null"
3489
+ "kind": "method",
3490
+ "name": "flattenConditions",
3491
+ "static": true,
3492
+ "return": {
3493
+ "type": {
3494
+ "text": "ConditionBuilderEntity[]"
3495
+ }
3625
3496
  },
3626
- "default": "null"
3497
+ "parameters": [
3498
+ {
3499
+ "name": "conditions",
3500
+ "type": {
3501
+ "text": "ConditionNode[]"
3502
+ }
3503
+ }
3504
+ ]
3627
3505
  },
3628
3506
  {
3629
- "kind": "field",
3630
- "name": "alertSoundDirty",
3631
- "type": {
3632
- "text": "boolean"
3507
+ "kind": "method",
3508
+ "name": "resolveLeftValues",
3509
+ "static": true,
3510
+ "return": {
3511
+ "type": {
3512
+ "text": "ConditionNode[]"
3513
+ }
3633
3514
  },
3634
- "default": "false",
3635
- "description": "True when the user picked a new file this session (needs upload)."
3515
+ "parameters": [
3516
+ {
3517
+ "name": "conditions",
3518
+ "type": {
3519
+ "text": "ConditionNode[]"
3520
+ }
3521
+ },
3522
+ {
3523
+ "name": "fields",
3524
+ "type": {
3525
+ "text": "any[]"
3526
+ }
3527
+ }
3528
+ ]
3636
3529
  },
3637
3530
  {
3638
3531
  "kind": "field",
3639
- "name": "clearAlertSound",
3640
- "type": {
3641
- "text": "boolean"
3642
- },
3643
- "default": "false"
3532
+ "name": "createEmptyGroup",
3533
+ "static": true
3644
3534
  },
3645
3535
  {
3646
- "kind": "field",
3647
- "name": "testAudio",
3648
- "type": {
3649
- "text": "HTMLAudioElement | null"
3536
+ "kind": "method",
3537
+ "name": "buildRawExpression",
3538
+ "static": true,
3539
+ "return": {
3540
+ "type": {
3541
+ "text": "string"
3542
+ }
3650
3543
  },
3651
- "default": "null",
3652
- "description": "In-progress Test playback; not private — mixin return type is exported."
3544
+ "parameters": [
3545
+ {
3546
+ "name": "conditions",
3547
+ "type": {
3548
+ "text": "ConditionNode[]"
3549
+ }
3550
+ }
3551
+ ]
3653
3552
  },
3654
3553
  {
3655
3554
  "kind": "method",
3656
- "name": "loadExistingAlertSound",
3555
+ "name": "parseRawExpression",
3556
+ "static": true,
3557
+ "return": {
3558
+ "type": {
3559
+ "text": "ConditionNode[] | null"
3560
+ }
3561
+ },
3657
3562
  "parameters": [
3658
3563
  {
3659
- "name": "dynamicRuleId",
3564
+ "name": "rawExpression",
3660
3565
  "type": {
3661
3566
  "text": "string"
3662
3567
  }
3663
3568
  }
3664
3569
  ]
3570
+ }
3571
+ ]
3572
+ },
3573
+ {
3574
+ "kind": "class",
3575
+ "description": "",
3576
+ "name": "TemplateUtils",
3577
+ "members": [
3578
+ {
3579
+ "kind": "field",
3580
+ "name": "createEmptyParameter",
3581
+ "static": true
3665
3582
  },
3666
3583
  {
3667
3584
  "kind": "method",
3668
- "name": "openAlertSoundPicker"
3585
+ "name": "getParameters",
3586
+ "static": true,
3587
+ "parameters": [
3588
+ {
3589
+ "name": "parameters"
3590
+ }
3591
+ ]
3669
3592
  },
3670
3593
  {
3671
3594
  "kind": "method",
3672
- "name": "onAlertSoundSelected",
3595
+ "name": "buildRightValue",
3596
+ "privacy": "private",
3597
+ "static": true,
3673
3598
  "parameters": [
3674
3599
  {
3675
- "name": "event",
3600
+ "name": "logicalOperator",
3676
3601
  "type": {
3677
- "text": "Event"
3602
+ "text": "LogicalOperator"
3678
3603
  }
3604
+ },
3605
+ {
3606
+ "name": "condition"
3607
+ },
3608
+ {
3609
+ "name": "parameters",
3610
+ "optional": true
3679
3611
  }
3680
3612
  ]
3681
3613
  },
3682
3614
  {
3683
3615
  "kind": "method",
3684
- "name": "clearAttachedAlertSound"
3685
- },
3686
- {
3687
- "kind": "method",
3688
- "name": "testAttachedAlertSound"
3689
- },
3690
- {
3691
- "kind": "method",
3692
- "name": "stopTestSound"
3616
+ "name": "getConditions",
3617
+ "static": true,
3618
+ "parameters": [
3619
+ {
3620
+ "name": "conditions"
3621
+ },
3622
+ {
3623
+ "name": "parameters",
3624
+ "optional": true
3625
+ }
3626
+ ]
3693
3627
  },
3694
3628
  {
3695
3629
  "kind": "method",
3696
- "name": "resetAlertSoundState"
3697
- },
3630
+ "name": "createParameterDetails",
3631
+ "static": true,
3632
+ "parameters": [
3633
+ {
3634
+ "name": "parameters"
3635
+ }
3636
+ ]
3637
+ }
3638
+ ]
3639
+ },
3640
+ {
3641
+ "kind": "class",
3642
+ "description": "",
3643
+ "name": "RuleUtils",
3644
+ "members": [
3698
3645
  {
3699
3646
  "kind": "method",
3700
- "name": "applyAlertSoundToPayload",
3701
- "return": {
3702
- "type": {
3703
- "text": "T"
3704
- }
3705
- },
3647
+ "name": "buildRightValue",
3648
+ "privacy": "private",
3649
+ "static": true,
3706
3650
  "parameters": [
3707
3651
  {
3708
- "name": "target",
3652
+ "name": "logicalOperator",
3709
3653
  "type": {
3710
- "text": "T"
3654
+ "text": "LogicalOperator"
3711
3655
  }
3656
+ },
3657
+ {
3658
+ "name": "condition"
3712
3659
  }
3713
- ],
3714
- "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3660
+ ]
3715
3661
  },
3716
3662
  {
3717
3663
  "kind": "method",
3718
- "name": "syncAlertSoundCacheAfterSave",
3719
- "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."
3664
+ "name": "getConditions",
3665
+ "static": true,
3666
+ "parameters": [
3667
+ {
3668
+ "name": "conditions"
3669
+ }
3670
+ ]
3720
3671
  }
3721
- ],
3672
+ ]
3673
+ },
3674
+ {
3675
+ "kind": "function",
3676
+ "name": "showNotificationError",
3722
3677
  "parameters": [
3723
3678
  {
3724
- "name": "Base",
3725
- "type": {
3726
- "text": "TBase"
3727
- }
3679
+ "name": "error"
3728
3680
  }
3729
- ],
3730
- "privacy": "public"
3681
+ ]
3731
3682
  }
3732
3683
  ],
3733
3684
  "exports": [
3734
3685
  {
3735
3686
  "kind": "js",
3736
- "name": "alertSoundAttachmentTemplate",
3687
+ "name": "UUIDGenerator",
3737
3688
  "declaration": {
3738
- "name": "alertSoundAttachmentTemplate",
3739
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3689
+ "name": "UUIDGenerator",
3690
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3740
3691
  }
3741
3692
  },
3742
3693
  {
3743
3694
  "kind": "js",
3744
- "name": "AlertSoundAttachmentMixin",
3745
- "declaration": {
3746
- "name": "AlertSoundAttachmentMixin",
3747
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3748
- }
3749
- }
3750
- ]
3751
- },
3752
- {
3753
- "kind": "javascript-module",
3754
- "path": "src/components/foundation-notification-dashboard/index.ts",
3755
- "declarations": [],
3756
- "exports": [
3757
- {
3758
- "kind": "js",
3759
- "name": "*",
3695
+ "name": "isEmpty",
3760
3696
  "declaration": {
3761
- "name": "*",
3762
- "package": "./notification-dashboard"
3697
+ "name": "isEmpty",
3698
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3763
3699
  }
3764
- }
3765
- ]
3766
- },
3767
- {
3768
- "kind": "javascript-module",
3769
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
3770
- "declarations": [
3771
- {
3772
- "kind": "variable",
3773
- "name": "FoundationNotificationDashboardStyles",
3774
- "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`",
3775
- "privacy": "public"
3776
- }
3777
- ],
3778
- "exports": [
3700
+ },
3779
3701
  {
3780
3702
  "kind": "js",
3781
- "name": "FoundationNotificationDashboardStyles",
3703
+ "name": "DynamicRuleUtils",
3782
3704
  "declaration": {
3783
- "name": "FoundationNotificationDashboardStyles",
3784
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
3705
+ "name": "DynamicRuleUtils",
3706
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3785
3707
  }
3786
- }
3787
- ]
3788
- },
3789
- {
3790
- "kind": "javascript-module",
3791
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
3792
- "declarations": [
3793
- {
3794
- "kind": "class",
3795
- "description": "",
3796
- "name": "NotificationDashboardTab",
3797
- "members": [
3798
- {
3799
- "kind": "field",
3800
- "name": "id",
3801
- "type": {
3802
- "text": "string"
3803
- }
3804
- },
3805
- {
3806
- "kind": "field",
3807
- "name": "name",
3808
- "type": {
3809
- "text": "string"
3810
- }
3811
- },
3812
- {
3813
- "kind": "field",
3814
- "name": "component",
3815
- "type": {
3816
- "text": "string"
3817
- }
3818
- },
3819
- {
3820
- "kind": "field",
3821
- "name": "right",
3822
- "type": {
3823
- "text": "string"
3824
- }
3825
- }
3826
- ]
3827
3708
  },
3828
3709
  {
3829
- "kind": "variable",
3830
- "name": "NOTIFICATION_DASHBOARD_TABS",
3831
- "type": {
3832
- "text": "NotificationDashboardTab[]"
3833
- },
3834
- "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]"
3835
- }
3836
- ],
3837
- "exports": [
3710
+ "kind": "js",
3711
+ "name": "TemplateUtils",
3712
+ "declaration": {
3713
+ "name": "TemplateUtils",
3714
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3715
+ }
3716
+ },
3838
3717
  {
3839
3718
  "kind": "js",
3840
- "name": "NotificationDashboardTab",
3719
+ "name": "RuleUtils",
3841
3720
  "declaration": {
3842
- "name": "NotificationDashboardTab",
3843
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3721
+ "name": "RuleUtils",
3722
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3844
3723
  }
3845
3724
  },
3846
3725
  {
3847
3726
  "kind": "js",
3848
- "name": "NOTIFICATION_DASHBOARD_TABS",
3727
+ "name": "showNotificationError",
3849
3728
  "declaration": {
3850
- "name": "NOTIFICATION_DASHBOARD_TABS",
3851
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3729
+ "name": "showNotificationError",
3730
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3852
3731
  }
3853
3732
  }
3854
3733
  ]
3855
3734
  },
3856
3735
  {
3857
3736
  "kind": "javascript-module",
3858
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3737
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
3859
3738
  "declarations": [
3860
3739
  {
3861
3740
  "kind": "variable",
3862
- "name": "FoundationNotificationDashboardTemplate",
3863
- "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`"
3741
+ "name": "FoundationSoundsPanelStyles",
3742
+ "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 width: auto !important;\n margin-top: calc(var(--design-unit) * 1px);\n z-index: 10000;\n max-height: min(240px, 40vh);\n overflow: hidden 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`"
3864
3743
  }
3865
3744
  ],
3866
3745
  "exports": [
3867
3746
  {
3868
3747
  "kind": "js",
3869
- "name": "FoundationNotificationDashboardTemplate",
3748
+ "name": "FoundationSoundsPanelStyles",
3870
3749
  "declaration": {
3871
- "name": "FoundationNotificationDashboardTemplate",
3872
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3750
+ "name": "FoundationSoundsPanelStyles",
3751
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
3873
3752
  }
3874
3753
  }
3875
3754
  ]
3876
3755
  },
3877
3756
  {
3878
3757
  "kind": "javascript-module",
3879
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3758
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
3880
3759
  "declarations": [
3881
3760
  {
3882
- "kind": "class",
3883
- "description": "",
3884
- "name": "FoundationNotificationDashboard",
3885
- "members": [
3886
- {
3887
- "kind": "field",
3888
- "name": "auth",
3889
- "type": {
3890
- "text": "Auth"
3891
- }
3892
- },
3893
- {
3894
- "kind": "field",
3895
- "name": "ready",
3896
- "type": {
3897
- "text": "boolean"
3898
- },
3899
- "default": "false"
3900
- },
3901
- {
3902
- "kind": "field",
3903
- "name": "hasPermissions",
3904
- "type": {
3905
- "text": "boolean"
3906
- },
3907
- "default": "true"
3908
- }
3909
- ],
3910
- "superclass": {
3911
- "name": "GenesisElement",
3912
- "package": "@genesislcap/web-core"
3913
- },
3914
- "tagName": "foundation-notification-dashboard",
3915
- "customElement": true
3761
+ "kind": "variable",
3762
+ "name": "FoundationSoundsPanelTemplate",
3763
+ "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`"
3916
3764
  }
3917
3765
  ],
3918
3766
  "exports": [
3919
3767
  {
3920
3768
  "kind": "js",
3921
- "name": "FoundationNotificationDashboard",
3922
- "declaration": {
3923
- "name": "FoundationNotificationDashboard",
3924
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3925
- }
3926
- },
3927
- {
3928
- "kind": "custom-element-definition",
3929
- "name": "foundation-notification-dashboard",
3769
+ "name": "FoundationSoundsPanelTemplate",
3930
3770
  "declaration": {
3931
- "name": "FoundationNotificationDashboard",
3932
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3771
+ "name": "FoundationSoundsPanelTemplate",
3772
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
3933
3773
  }
3934
3774
  }
3935
3775
  ]
3936
3776
  },
3937
3777
  {
3938
3778
  "kind": "javascript-module",
3939
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3779
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
3940
3780
  "declarations": [
3941
3781
  {
3942
3782
  "kind": "class",
3943
- "description": "",
3944
- "name": "UUIDGenerator",
3783
+ "description": "Configures alert sound rules in the inbox Sounds tab. Persists via the shared\nAlertSoundPlayer; playback is handled by layout-mounted\nFoundationSounds.",
3784
+ "name": "FoundationSoundsPanel",
3945
3785
  "members": [
3946
3786
  {
3947
3787
  "kind": "field",
3948
- "name": "uuid",
3788
+ "name": "ruleService",
3949
3789
  "type": {
3950
- "text": "UUID"
3951
- },
3952
- "privacy": "private",
3953
- "static": true
3790
+ "text": "RuleService"
3791
+ }
3954
3792
  },
3955
3793
  {
3956
3794
  "kind": "field",
3957
- "name": "createUUID",
3958
- "static": true
3959
- }
3960
- ]
3961
- },
3962
- {
3963
- "kind": "function",
3964
- "name": "isEmpty",
3965
- "parameters": [
3966
- {
3967
- "name": "value"
3968
- }
3969
- ]
3970
- },
3971
- {
3972
- "kind": "class",
3973
- "description": "",
3974
- "name": "DynamicRuleUtils",
3975
- "members": [
3795
+ "name": "volumePercent",
3796
+ "type": {
3797
+ "text": "number"
3798
+ },
3799
+ "default": "100",
3800
+ "description": "Global playback volume 0–100. @internal"
3801
+ },
3976
3802
  {
3977
3803
  "kind": "field",
3978
- "name": "createEmptyCondition",
3979
- "static": true
3804
+ "name": "selectableRules",
3805
+ "type": {
3806
+ "text": "AlertSoundSelectableRule[]"
3807
+ },
3808
+ "default": "[]",
3809
+ "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
3980
3810
  },
3981
3811
  {
3982
3812
  "kind": "field",
3983
- "name": "createAssignment",
3984
- "static": true
3813
+ "name": "fileInput",
3814
+ "type": {
3815
+ "text": "HTMLInputElement"
3816
+ }
3985
3817
  },
3986
3818
  {
3987
3819
  "kind": "field",
3988
- "name": "createPlaceholderAssignment",
3989
- "static": true
3820
+ "name": "pendingRuleIndex",
3821
+ "type": {
3822
+ "text": "number | null"
3823
+ },
3824
+ "privacy": "private",
3825
+ "default": "null"
3990
3826
  },
3991
3827
  {
3992
3828
  "kind": "field",
3993
- "name": "createTextAssignment",
3994
- "static": true
3829
+ "name": "player",
3830
+ "privacy": "private",
3831
+ "readonly": true
3995
3832
  },
3996
3833
  {
3997
3834
  "kind": "field",
3998
- "name": "getAssignmentValue",
3999
- "static": true
3835
+ "name": "unsubscribePlayer",
3836
+ "type": {
3837
+ "text": "(() => void) | undefined"
3838
+ },
3839
+ "privacy": "private"
4000
3840
  },
4001
3841
  {
4002
3842
  "kind": "field",
4003
- "name": "getAssignmentText",
4004
- "static": true
3843
+ "name": "ignoreSelectChanges",
3844
+ "type": {
3845
+ "text": "boolean"
3846
+ },
3847
+ "privacy": "private",
3848
+ "default": "false",
3849
+ "description": "Suppresses select change events while options are rebuilt."
4005
3850
  },
4006
3851
  {
4007
3852
  "kind": "method",
4008
- "name": "createConditions",
4009
- "static": true,
3853
+ "name": "onMatchModeChange",
4010
3854
  "return": {
4011
3855
  "type": {
4012
- "text": "any"
3856
+ "text": "boolean"
3857
+ }
3858
+ },
3859
+ "parameters": [
3860
+ {
3861
+ "name": "index",
3862
+ "type": {
3863
+ "text": "number"
3864
+ }
3865
+ },
3866
+ {
3867
+ "name": "event",
3868
+ "type": {
3869
+ "text": "Event"
3870
+ }
3871
+ }
3872
+ ]
3873
+ },
3874
+ {
3875
+ "kind": "method",
3876
+ "name": "onPatternInput",
3877
+ "return": {
3878
+ "type": {
3879
+ "text": "boolean"
3880
+ }
3881
+ },
3882
+ "parameters": [
3883
+ {
3884
+ "name": "index",
3885
+ "type": {
3886
+ "text": "number"
3887
+ }
3888
+ },
3889
+ {
3890
+ "name": "event",
3891
+ "type": {
3892
+ "text": "Event"
3893
+ }
3894
+ }
3895
+ ]
3896
+ },
3897
+ {
3898
+ "kind": "method",
3899
+ "name": "onRuleChange",
3900
+ "return": {
3901
+ "type": {
3902
+ "text": "boolean"
3903
+ }
3904
+ },
3905
+ "parameters": [
3906
+ {
3907
+ "name": "index",
3908
+ "type": {
3909
+ "text": "number"
3910
+ }
3911
+ },
3912
+ {
3913
+ "name": "event",
3914
+ "type": {
3915
+ "text": "Event"
3916
+ }
3917
+ }
3918
+ ]
3919
+ },
3920
+ {
3921
+ "kind": "method",
3922
+ "name": "openFilePicker",
3923
+ "return": {
3924
+ "type": {
3925
+ "text": "boolean"
3926
+ }
3927
+ },
3928
+ "parameters": [
3929
+ {
3930
+ "name": "index",
3931
+ "type": {
3932
+ "text": "number"
3933
+ }
3934
+ }
3935
+ ]
3936
+ },
3937
+ {
3938
+ "kind": "method",
3939
+ "name": "onFileSelected",
3940
+ "return": {
3941
+ "type": {
3942
+ "text": "boolean"
4013
3943
  }
4014
3944
  },
4015
3945
  "parameters": [
4016
3946
  {
4017
- "name": "conditions",
3947
+ "name": "event",
4018
3948
  "type": {
4019
- "text": "ConditionNode[]"
3949
+ "text": "Event"
4020
3950
  }
4021
- },
4022
- {
4023
- "name": "parameters",
4024
- "optional": true
4025
3951
  }
4026
3952
  ]
4027
3953
  },
4028
3954
  {
4029
3955
  "kind": "method",
4030
- "name": "hasMultiValueCondition",
4031
- "static": true,
3956
+ "name": "clearSound",
4032
3957
  "return": {
4033
3958
  "type": {
4034
3959
  "text": "boolean"
@@ -4036,17 +3961,16 @@
4036
3961
  },
4037
3962
  "parameters": [
4038
3963
  {
4039
- "name": "conditions",
3964
+ "name": "index",
4040
3965
  "type": {
4041
- "text": "ConditionNode[]"
3966
+ "text": "number"
4042
3967
  }
4043
3968
  }
4044
3969
  ]
4045
3970
  },
4046
3971
  {
4047
3972
  "kind": "method",
4048
- "name": "hasOrJoin",
4049
- "static": true,
3973
+ "name": "testSound",
4050
3974
  "return": {
4051
3975
  "type": {
4052
3976
  "text": "boolean"
@@ -4054,17 +3978,16 @@
4054
3978
  },
4055
3979
  "parameters": [
4056
3980
  {
4057
- "name": "conditions",
3981
+ "name": "index",
4058
3982
  "type": {
4059
- "text": "ConditionNode[]"
3983
+ "text": "number"
4060
3984
  }
4061
3985
  }
4062
3986
  ]
4063
3987
  },
4064
3988
  {
4065
3989
  "kind": "method",
4066
- "name": "hasGroup",
4067
- "static": true,
3990
+ "name": "toggleRuleMute",
4068
3991
  "return": {
4069
3992
  "type": {
4070
3993
  "text": "boolean"
@@ -4072,17 +3995,16 @@
4072
3995
  },
4073
3996
  "parameters": [
4074
3997
  {
4075
- "name": "conditions",
3998
+ "name": "index",
4076
3999
  "type": {
4077
- "text": "ConditionNode[]"
4000
+ "text": "number"
4078
4001
  }
4079
4002
  }
4080
4003
  ]
4081
4004
  },
4082
4005
  {
4083
4006
  "kind": "method",
4084
- "name": "hasUnsupportedOperator",
4085
- "static": true,
4007
+ "name": "onVolumeChange",
4086
4008
  "return": {
4087
4009
  "type": {
4088
4010
  "text": "boolean"
@@ -4090,17 +4012,34 @@
4090
4012
  },
4091
4013
  "parameters": [
4092
4014
  {
4093
- "name": "conditions",
4015
+ "name": "event",
4094
4016
  "type": {
4095
- "text": "ConditionNode[]"
4017
+ "text": "Event"
4096
4018
  }
4097
4019
  }
4098
4020
  ]
4099
4021
  },
4100
4022
  {
4101
4023
  "kind": "method",
4102
- "name": "hasCurrentUser",
4103
- "static": true,
4024
+ "name": "toggleMute",
4025
+ "return": {
4026
+ "type": {
4027
+ "text": "boolean"
4028
+ }
4029
+ }
4030
+ },
4031
+ {
4032
+ "kind": "method",
4033
+ "name": "addRule",
4034
+ "return": {
4035
+ "type": {
4036
+ "text": "boolean"
4037
+ }
4038
+ }
4039
+ },
4040
+ {
4041
+ "kind": "method",
4042
+ "name": "removeRule",
4104
4043
  "return": {
4105
4044
  "type": {
4106
4045
  "text": "boolean"
@@ -4108,256 +4047,317 @@
4108
4047
  },
4109
4048
  "parameters": [
4110
4049
  {
4111
- "name": "conditions",
4050
+ "name": "index",
4112
4051
  "type": {
4113
- "text": "ConditionNode[]"
4052
+ "text": "number"
4114
4053
  }
4115
4054
  }
4116
4055
  ]
4117
4056
  },
4118
4057
  {
4119
4058
  "kind": "method",
4120
- "name": "flattenConditions",
4121
- "static": true,
4059
+ "name": "reloadRules",
4122
4060
  "return": {
4123
4061
  "type": {
4124
- "text": "ConditionBuilderEntity[]"
4062
+ "text": "Promise<void>"
4063
+ }
4064
+ },
4065
+ "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
4066
+ },
4067
+ {
4068
+ "kind": "method",
4069
+ "name": "loadRules",
4070
+ "privacy": "private",
4071
+ "return": {
4072
+ "type": {
4073
+ "text": "Promise<void>"
4074
+ }
4075
+ }
4076
+ },
4077
+ {
4078
+ "kind": "method",
4079
+ "name": "settleRuleOptions",
4080
+ "privacy": "private",
4081
+ "return": {
4082
+ "type": {
4083
+ "text": "Promise<void>"
4084
+ }
4085
+ },
4086
+ "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."
4087
+ },
4088
+ {
4089
+ "kind": "method",
4090
+ "name": "applyRuleSelectValues",
4091
+ "privacy": "private",
4092
+ "return": {
4093
+ "type": {
4094
+ "text": "void"
4095
+ }
4096
+ },
4097
+ "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...\"."
4098
+ },
4099
+ {
4100
+ "kind": "method",
4101
+ "name": "mapRules",
4102
+ "privacy": "private",
4103
+ "return": {
4104
+ "type": {
4105
+ "text": "AlertSoundSelectableRule[]"
4125
4106
  }
4126
4107
  },
4127
4108
  "parameters": [
4128
4109
  {
4129
- "name": "conditions",
4110
+ "name": "ruleList",
4130
4111
  "type": {
4131
- "text": "ConditionNode[]"
4112
+ "text": "NamedRuleRow[]"
4132
4113
  }
4133
4114
  }
4134
4115
  ]
4135
4116
  },
4136
4117
  {
4137
4118
  "kind": "method",
4138
- "name": "resolveLeftValues",
4139
- "static": true,
4119
+ "name": "ruleMatchId",
4120
+ "privacy": "private",
4140
4121
  "return": {
4141
4122
  "type": {
4142
- "text": "ConditionNode[]"
4123
+ "text": "string"
4143
4124
  }
4144
4125
  },
4145
4126
  "parameters": [
4146
4127
  {
4147
- "name": "conditions",
4148
- "type": {
4149
- "text": "ConditionNode[]"
4150
- }
4151
- },
4152
- {
4153
- "name": "fields",
4128
+ "name": "rule",
4154
4129
  "type": {
4155
- "text": "any[]"
4130
+ "text": "NamedRuleRow | undefined"
4156
4131
  }
4157
4132
  }
4158
- ]
4133
+ ]
4134
+ },
4135
+ {
4136
+ "kind": "method",
4137
+ "name": "syncSoundState",
4138
+ "privacy": "private"
4139
+ }
4140
+ ],
4141
+ "superclass": {
4142
+ "name": "GenesisElement",
4143
+ "package": "@genesislcap/web-core"
4144
+ },
4145
+ "tagName": "foundation-sounds-panel",
4146
+ "customElement": true
4147
+ }
4148
+ ],
4149
+ "exports": [
4150
+ {
4151
+ "kind": "js",
4152
+ "name": "FoundationSoundsPanel",
4153
+ "declaration": {
4154
+ "name": "FoundationSoundsPanel",
4155
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
4156
+ }
4157
+ },
4158
+ {
4159
+ "kind": "custom-element-definition",
4160
+ "name": "foundation-sounds-panel",
4161
+ "declaration": {
4162
+ "name": "FoundationSoundsPanel",
4163
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
4164
+ }
4165
+ }
4166
+ ]
4167
+ },
4168
+ {
4169
+ "kind": "javascript-module",
4170
+ "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
4171
+ "declarations": [
4172
+ {
4173
+ "kind": "variable",
4174
+ "name": "FoundationSoundsStyles",
4175
+ "default": "css`\n :host {\n display: none;\n }\n`",
4176
+ "description": "Headless layout listener — take no space in the layout chrome."
4177
+ }
4178
+ ],
4179
+ "exports": [
4180
+ {
4181
+ "kind": "js",
4182
+ "name": "FoundationSoundsStyles",
4183
+ "declaration": {
4184
+ "name": "FoundationSoundsStyles",
4185
+ "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
4186
+ }
4187
+ }
4188
+ ]
4189
+ },
4190
+ {
4191
+ "kind": "javascript-module",
4192
+ "path": "src/components/foundation-sounds/foundation-sounds.ts",
4193
+ "declarations": [
4194
+ {
4195
+ "kind": "class",
4196
+ "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.",
4197
+ "name": "FoundationSounds",
4198
+ "members": [
4199
+ {
4200
+ "kind": "field",
4201
+ "name": "connect",
4202
+ "type": {
4203
+ "text": "Connect"
4204
+ }
4205
+ },
4206
+ {
4207
+ "kind": "field",
4208
+ "name": "inboxService",
4209
+ "type": {
4210
+ "text": "FoundationInboxService"
4211
+ }
4212
+ },
4213
+ {
4214
+ "kind": "field",
4215
+ "name": "ruleService",
4216
+ "type": {
4217
+ "text": "RuleService"
4218
+ }
4219
+ },
4220
+ {
4221
+ "kind": "field",
4222
+ "name": "soundEnabled",
4223
+ "type": {
4224
+ "text": "boolean"
4225
+ },
4226
+ "default": "true",
4227
+ "description": "When false, new audible alerts are tracked but do not play."
4228
+ },
4229
+ {
4230
+ "kind": "field",
4231
+ "name": "connectionSub",
4232
+ "type": {
4233
+ "text": "Subscription | undefined"
4234
+ },
4235
+ "privacy": "private"
4236
+ },
4237
+ {
4238
+ "kind": "field",
4239
+ "name": "player",
4240
+ "privacy": "private",
4241
+ "readonly": true
4242
+ },
4243
+ {
4244
+ "kind": "field",
4245
+ "name": "knownAlertIds",
4246
+ "privacy": "private",
4247
+ "default": "new Set<string>()"
4248
+ },
4249
+ {
4250
+ "kind": "field",
4251
+ "name": "serverSoundFetches",
4252
+ "privacy": "private",
4253
+ "readonly": true,
4254
+ "default": "new Map<string, Promise<boolean>>()",
4255
+ "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
4256
+ },
4257
+ {
4258
+ "kind": "method",
4259
+ "name": "subscribeToAlerts",
4260
+ "privacy": "private",
4261
+ "return": {
4262
+ "type": {
4263
+ "text": "void"
4264
+ }
4265
+ }
4159
4266
  },
4160
4267
  {
4161
4268
  "kind": "field",
4162
- "name": "createEmptyGroup",
4163
- "static": true
4269
+ "name": "subscriptionHandler",
4270
+ "privacy": "private"
4164
4271
  },
4165
4272
  {
4166
4273
  "kind": "method",
4167
- "name": "buildRawExpression",
4168
- "static": true,
4274
+ "name": "playForNewAlerts",
4275
+ "privacy": "private",
4169
4276
  "return": {
4170
4277
  "type": {
4171
- "text": "string"
4278
+ "text": "Promise<void>"
4172
4279
  }
4173
4280
  },
4174
4281
  "parameters": [
4175
4282
  {
4176
- "name": "conditions",
4283
+ "name": "rows",
4177
4284
  "type": {
4178
- "text": "ConditionNode[]"
4285
+ "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
4179
4286
  }
4180
4287
  }
4181
4288
  ]
4182
4289
  },
4183
4290
  {
4184
4291
  "kind": "method",
4185
- "name": "parseRawExpression",
4186
- "static": true,
4292
+ "name": "tryPlayServerSound",
4293
+ "privacy": "private",
4187
4294
  "return": {
4188
4295
  "type": {
4189
- "text": "ConditionNode[] | null"
4296
+ "text": "Promise<boolean>"
4190
4297
  }
4191
4298
  },
4192
4299
  "parameters": [
4193
4300
  {
4194
- "name": "rawExpression",
4301
+ "name": "dynamicRuleId",
4195
4302
  "type": {
4196
4303
  "text": "string"
4197
4304
  }
4198
4305
  }
4199
4306
  ]
4200
- }
4201
- ]
4202
- },
4203
- {
4204
- "kind": "class",
4205
- "description": "",
4206
- "name": "TemplateUtils",
4207
- "members": [
4208
- {
4209
- "kind": "field",
4210
- "name": "createEmptyParameter",
4211
- "static": true
4212
- },
4213
- {
4214
- "kind": "method",
4215
- "name": "getParameters",
4216
- "static": true,
4217
- "parameters": [
4218
- {
4219
- "name": "parameters"
4220
- }
4221
- ]
4222
4307
  },
4223
4308
  {
4224
4309
  "kind": "method",
4225
- "name": "buildRightValue",
4310
+ "name": "fetchAndCacheServerSound",
4226
4311
  "privacy": "private",
4227
- "static": true,
4228
- "parameters": [
4229
- {
4230
- "name": "logicalOperator",
4231
- "type": {
4232
- "text": "LogicalOperator"
4233
- }
4234
- },
4235
- {
4236
- "name": "condition"
4237
- },
4238
- {
4239
- "name": "parameters",
4240
- "optional": true
4241
- }
4242
- ]
4243
- },
4244
- {
4245
- "kind": "method",
4246
- "name": "getConditions",
4247
- "static": true,
4248
- "parameters": [
4249
- {
4250
- "name": "conditions"
4251
- },
4252
- {
4253
- "name": "parameters",
4254
- "optional": true
4255
- }
4256
- ]
4257
- },
4258
- {
4259
- "kind": "method",
4260
- "name": "createParameterDetails",
4261
- "static": true,
4262
- "parameters": [
4263
- {
4264
- "name": "parameters"
4312
+ "return": {
4313
+ "type": {
4314
+ "text": "Promise<boolean>"
4265
4315
  }
4266
- ]
4267
- }
4268
- ]
4269
- },
4270
- {
4271
- "kind": "class",
4272
- "description": "",
4273
- "name": "RuleUtils",
4274
- "members": [
4275
- {
4276
- "kind": "method",
4277
- "name": "buildRightValue",
4278
- "privacy": "private",
4279
- "static": true,
4316
+ },
4280
4317
  "parameters": [
4281
4318
  {
4282
- "name": "logicalOperator",
4319
+ "name": "dynamicRuleId",
4283
4320
  "type": {
4284
- "text": "LogicalOperator"
4321
+ "text": "string"
4285
4322
  }
4286
- },
4287
- {
4288
- "name": "condition"
4289
- }
4290
- ]
4291
- },
4292
- {
4293
- "kind": "method",
4294
- "name": "getConditions",
4295
- "static": true,
4296
- "parameters": [
4297
- {
4298
- "name": "conditions"
4299
4323
  }
4300
4324
  ]
4301
4325
  }
4302
- ]
4303
- },
4304
- {
4305
- "kind": "function",
4306
- "name": "showNotificationError",
4307
- "parameters": [
4326
+ ],
4327
+ "attributes": [
4308
4328
  {
4309
- "name": "error"
4329
+ "name": "sound-enabled",
4330
+ "type": {
4331
+ "text": "boolean"
4332
+ },
4333
+ "default": "true",
4334
+ "description": "When false, new audible alerts are tracked but do not play.",
4335
+ "fieldName": "soundEnabled"
4310
4336
  }
4311
- ]
4337
+ ],
4338
+ "superclass": {
4339
+ "name": "GenesisElement",
4340
+ "package": "@genesislcap/web-core"
4341
+ },
4342
+ "tagName": "foundation-sounds",
4343
+ "customElement": true
4312
4344
  }
4313
4345
  ],
4314
4346
  "exports": [
4315
4347
  {
4316
4348
  "kind": "js",
4317
- "name": "UUIDGenerator",
4318
- "declaration": {
4319
- "name": "UUIDGenerator",
4320
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4321
- }
4322
- },
4323
- {
4324
- "kind": "js",
4325
- "name": "isEmpty",
4326
- "declaration": {
4327
- "name": "isEmpty",
4328
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4329
- }
4330
- },
4331
- {
4332
- "kind": "js",
4333
- "name": "DynamicRuleUtils",
4334
- "declaration": {
4335
- "name": "DynamicRuleUtils",
4336
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4337
- }
4338
- },
4339
- {
4340
- "kind": "js",
4341
- "name": "TemplateUtils",
4342
- "declaration": {
4343
- "name": "TemplateUtils",
4344
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4345
- }
4346
- },
4347
- {
4348
- "kind": "js",
4349
- "name": "RuleUtils",
4349
+ "name": "FoundationSounds",
4350
4350
  "declaration": {
4351
- "name": "RuleUtils",
4352
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4351
+ "name": "FoundationSounds",
4352
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
4353
4353
  }
4354
4354
  },
4355
4355
  {
4356
- "kind": "js",
4357
- "name": "showNotificationError",
4356
+ "kind": "custom-element-definition",
4357
+ "name": "foundation-sounds",
4358
4358
  "declaration": {
4359
- "name": "showNotificationError",
4360
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4359
+ "name": "FoundationSounds",
4360
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
4361
4361
  }
4362
4362
  }
4363
4363
  ]
@@ -5952,34 +5952,177 @@
5952
5952
  },
5953
5953
  {
5954
5954
  "kind": "js",
5955
- "name": "SEVERITY_CRITICAL",
5955
+ "name": "SEVERITY_CRITICAL",
5956
+ "declaration": {
5957
+ "name": "SEVERITY_CRITICAL",
5958
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5959
+ }
5960
+ },
5961
+ {
5962
+ "kind": "js",
5963
+ "name": "SEVERITY_SERIOUS",
5964
+ "declaration": {
5965
+ "name": "SEVERITY_SERIOUS",
5966
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5967
+ }
5968
+ },
5969
+ {
5970
+ "kind": "js",
5971
+ "name": "SEVERITY_WARNING",
5972
+ "declaration": {
5973
+ "name": "SEVERITY_WARNING",
5974
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5975
+ }
5976
+ },
5977
+ {
5978
+ "kind": "js",
5979
+ "name": "ALL_SEVERITIES",
5980
+ "declaration": {
5981
+ "name": "ALL_SEVERITIES",
5982
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5983
+ }
5984
+ }
5985
+ ]
5986
+ },
5987
+ {
5988
+ "kind": "javascript-module",
5989
+ "path": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.styles.ts",
5990
+ "declarations": [
5991
+ {
5992
+ "kind": "variable",
5993
+ "name": "noItemsClass",
5994
+ "type": {
5995
+ "text": "string"
5996
+ },
5997
+ "default": "'no-items'",
5998
+ "description": "Class to use when there are no items"
5999
+ },
6000
+ {
6001
+ "kind": "variable",
6002
+ "name": "FoundationInboxCounterStyles",
6003
+ "default": "css`\n :host {\n display: inline-block;\n min-width: 16px;\n height: 16px;\n border-radius: 9px;\n text-align: center;\n color: #fff;\n line-height: 16px;\n font-size: 9px;\n font-weight: 700;\n background: ${BACKGROUND_COLOR};\n pointer-events: none;\n }\n\n .hidden {\n visibility: hidden;\n }\n\n :host(.${noItemsClass}) {\n display: none;\n }\n`"
6004
+ }
6005
+ ],
6006
+ "exports": [
6007
+ {
6008
+ "kind": "js",
6009
+ "name": "noItemsClass",
6010
+ "declaration": {
6011
+ "name": "noItemsClass",
6012
+ "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.styles.ts"
6013
+ }
6014
+ },
6015
+ {
6016
+ "kind": "js",
6017
+ "name": "FoundationInboxCounterStyles",
5956
6018
  "declaration": {
5957
- "name": "SEVERITY_CRITICAL",
5958
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6019
+ "name": "FoundationInboxCounterStyles",
6020
+ "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.styles.ts"
5959
6021
  }
5960
- },
6022
+ }
6023
+ ]
6024
+ },
6025
+ {
6026
+ "kind": "javascript-module",
6027
+ "path": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.template.ts",
6028
+ "declarations": [
6029
+ {
6030
+ "kind": "variable",
6031
+ "name": "FoundationInboxCounterTemplate",
6032
+ "default": "html<FoundationInboxCounter>`\n <template class=\"${(x) => classNames([noItemsClass, x.value < 1])}\">\n ${when(\n (x) => x.value > 0,\n html`\n ${(x) => (x.value > MAX_NUMBER_TO_DISPLAY ? `${MAX_NUMBER_TO_DISPLAY}+` : x.value)}\n `,\n )}\n </template>\n`"
6033
+ }
6034
+ ],
6035
+ "exports": [
5961
6036
  {
5962
6037
  "kind": "js",
5963
- "name": "SEVERITY_SERIOUS",
6038
+ "name": "FoundationInboxCounterTemplate",
5964
6039
  "declaration": {
5965
- "name": "SEVERITY_SERIOUS",
5966
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6040
+ "name": "FoundationInboxCounterTemplate",
6041
+ "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.template.ts"
5967
6042
  }
5968
- },
6043
+ }
6044
+ ]
6045
+ },
6046
+ {
6047
+ "kind": "javascript-module",
6048
+ "path": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts",
6049
+ "declarations": [
6050
+ {
6051
+ "kind": "class",
6052
+ "description": "",
6053
+ "name": "FoundationInboxCounter",
6054
+ "members": [
6055
+ {
6056
+ "kind": "field",
6057
+ "name": "value",
6058
+ "type": {
6059
+ "text": "number"
6060
+ },
6061
+ "default": "0"
6062
+ },
6063
+ {
6064
+ "kind": "field",
6065
+ "name": "connect",
6066
+ "type": {
6067
+ "text": "Connect"
6068
+ }
6069
+ },
6070
+ {
6071
+ "kind": "field",
6072
+ "name": "inboxService",
6073
+ "type": {
6074
+ "text": "FoundationInboxService"
6075
+ }
6076
+ },
6077
+ {
6078
+ "kind": "field",
6079
+ "name": "connectionSub",
6080
+ "type": {
6081
+ "text": "Subscription"
6082
+ },
6083
+ "privacy": "private"
6084
+ },
6085
+ {
6086
+ "kind": "method",
6087
+ "name": "subscribeToAlerts",
6088
+ "privacy": "private",
6089
+ "return": {
6090
+ "type": {
6091
+ "text": "Promise<void>"
6092
+ }
6093
+ },
6094
+ "description": "Subscribes to alerts from the inbox service"
6095
+ },
6096
+ {
6097
+ "kind": "field",
6098
+ "name": "subscriptionHandler",
6099
+ "privacy": "private",
6100
+ "description": "Handles subscription updates from the inbox service"
6101
+ }
6102
+ ],
6103
+ "superclass": {
6104
+ "name": "GenesisElement",
6105
+ "package": "@genesislcap/web-core"
6106
+ },
6107
+ "tagName": "foundation-inbox-counter",
6108
+ "customElement": true
6109
+ }
6110
+ ],
6111
+ "exports": [
5969
6112
  {
5970
6113
  "kind": "js",
5971
- "name": "SEVERITY_WARNING",
6114
+ "name": "FoundationInboxCounter",
5972
6115
  "declaration": {
5973
- "name": "SEVERITY_WARNING",
5974
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6116
+ "name": "FoundationInboxCounter",
6117
+ "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts"
5975
6118
  }
5976
6119
  },
5977
6120
  {
5978
- "kind": "js",
5979
- "name": "ALL_SEVERITIES",
6121
+ "kind": "custom-element-definition",
6122
+ "name": "foundation-inbox-counter",
5980
6123
  "declaration": {
5981
- "name": "ALL_SEVERITIES",
5982
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6124
+ "name": "FoundationInboxCounter",
6125
+ "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts"
5983
6126
  }
5984
6127
  }
5985
6128
  ]
@@ -7382,149 +7525,6 @@
7382
7525
  }
7383
7526
  ]
7384
7527
  },
7385
- {
7386
- "kind": "javascript-module",
7387
- "path": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.styles.ts",
7388
- "declarations": [
7389
- {
7390
- "kind": "variable",
7391
- "name": "noItemsClass",
7392
- "type": {
7393
- "text": "string"
7394
- },
7395
- "default": "'no-items'",
7396
- "description": "Class to use when there are no items"
7397
- },
7398
- {
7399
- "kind": "variable",
7400
- "name": "FoundationInboxCounterStyles",
7401
- "default": "css`\n :host {\n display: inline-block;\n min-width: 16px;\n height: 16px;\n border-radius: 9px;\n text-align: center;\n color: #fff;\n line-height: 16px;\n font-size: 9px;\n font-weight: 700;\n background: ${BACKGROUND_COLOR};\n pointer-events: none;\n }\n\n .hidden {\n visibility: hidden;\n }\n\n :host(.${noItemsClass}) {\n display: none;\n }\n`"
7402
- }
7403
- ],
7404
- "exports": [
7405
- {
7406
- "kind": "js",
7407
- "name": "noItemsClass",
7408
- "declaration": {
7409
- "name": "noItemsClass",
7410
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.styles.ts"
7411
- }
7412
- },
7413
- {
7414
- "kind": "js",
7415
- "name": "FoundationInboxCounterStyles",
7416
- "declaration": {
7417
- "name": "FoundationInboxCounterStyles",
7418
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.styles.ts"
7419
- }
7420
- }
7421
- ]
7422
- },
7423
- {
7424
- "kind": "javascript-module",
7425
- "path": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.template.ts",
7426
- "declarations": [
7427
- {
7428
- "kind": "variable",
7429
- "name": "FoundationInboxCounterTemplate",
7430
- "default": "html<FoundationInboxCounter>`\n <template class=\"${(x) => classNames([noItemsClass, x.value < 1])}\">\n ${when(\n (x) => x.value > 0,\n html`\n ${(x) => (x.value > MAX_NUMBER_TO_DISPLAY ? `${MAX_NUMBER_TO_DISPLAY}+` : x.value)}\n `,\n )}\n </template>\n`"
7431
- }
7432
- ],
7433
- "exports": [
7434
- {
7435
- "kind": "js",
7436
- "name": "FoundationInboxCounterTemplate",
7437
- "declaration": {
7438
- "name": "FoundationInboxCounterTemplate",
7439
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.template.ts"
7440
- }
7441
- }
7442
- ]
7443
- },
7444
- {
7445
- "kind": "javascript-module",
7446
- "path": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts",
7447
- "declarations": [
7448
- {
7449
- "kind": "class",
7450
- "description": "",
7451
- "name": "FoundationInboxCounter",
7452
- "members": [
7453
- {
7454
- "kind": "field",
7455
- "name": "value",
7456
- "type": {
7457
- "text": "number"
7458
- },
7459
- "default": "0"
7460
- },
7461
- {
7462
- "kind": "field",
7463
- "name": "connect",
7464
- "type": {
7465
- "text": "Connect"
7466
- }
7467
- },
7468
- {
7469
- "kind": "field",
7470
- "name": "inboxService",
7471
- "type": {
7472
- "text": "FoundationInboxService"
7473
- }
7474
- },
7475
- {
7476
- "kind": "field",
7477
- "name": "connectionSub",
7478
- "type": {
7479
- "text": "Subscription"
7480
- },
7481
- "privacy": "private"
7482
- },
7483
- {
7484
- "kind": "method",
7485
- "name": "subscribeToAlerts",
7486
- "privacy": "private",
7487
- "return": {
7488
- "type": {
7489
- "text": "Promise<void>"
7490
- }
7491
- },
7492
- "description": "Subscribes to alerts from the inbox service"
7493
- },
7494
- {
7495
- "kind": "field",
7496
- "name": "subscriptionHandler",
7497
- "privacy": "private",
7498
- "description": "Handles subscription updates from the inbox service"
7499
- }
7500
- ],
7501
- "superclass": {
7502
- "name": "GenesisElement",
7503
- "package": "@genesislcap/web-core"
7504
- },
7505
- "tagName": "foundation-inbox-counter",
7506
- "customElement": true
7507
- }
7508
- ],
7509
- "exports": [
7510
- {
7511
- "kind": "js",
7512
- "name": "FoundationInboxCounter",
7513
- "declaration": {
7514
- "name": "FoundationInboxCounter",
7515
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts"
7516
- }
7517
- },
7518
- {
7519
- "kind": "custom-element-definition",
7520
- "name": "foundation-inbox-counter",
7521
- "declaration": {
7522
- "name": "FoundationInboxCounter",
7523
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts"
7524
- }
7525
- }
7526
- ]
7527
- },
7528
7528
  {
7529
7529
  "kind": "javascript-module",
7530
7530
  "path": "src/components/foundation-inbox/components/inbox-subscription/inbox-subscription.styles.ts",