@genesislcap/pbc-notify-ui 15.75.0 → 15.76.1-alpha-aff9783af4.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.
@@ -505,6 +505,27 @@
505
505
  }
506
506
  ]
507
507
  },
508
+ {
509
+ "kind": "javascript-module",
510
+ "path": "src/styles/scrollbar.styles.ts",
511
+ "declarations": [
512
+ {
513
+ "kind": "variable",
514
+ "name": "scrollbarStyles",
515
+ "default": "css`\n ::-webkit-scrollbar {\n width: calc((var(--base-height-multiplier) + var(--design-unit)) * 1px);\n }\n\n ::-webkit-scrollbar-track {\n background: var(--neutral-layer-1);\n }\n\n ::-webkit-scrollbar-thumb {\n background: var(--neutral-fill-rest);\n }\n`"
516
+ }
517
+ ],
518
+ "exports": [
519
+ {
520
+ "kind": "js",
521
+ "name": "scrollbarStyles",
522
+ "declaration": {
523
+ "name": "scrollbarStyles",
524
+ "module": "src/styles/scrollbar.styles.ts"
525
+ }
526
+ }
527
+ ]
528
+ },
508
529
  {
509
530
  "kind": "javascript-module",
510
531
  "path": "src/utils/eventDetail.ts",
@@ -826,27 +847,6 @@
826
847
  }
827
848
  ]
828
849
  },
829
- {
830
- "kind": "javascript-module",
831
- "path": "src/styles/scrollbar.styles.ts",
832
- "declarations": [
833
- {
834
- "kind": "variable",
835
- "name": "scrollbarStyles",
836
- "default": "css`\n ::-webkit-scrollbar {\n width: calc((var(--base-height-multiplier) + var(--design-unit)) * 1px);\n }\n\n ::-webkit-scrollbar-track {\n background: var(--neutral-layer-1);\n }\n\n ::-webkit-scrollbar-thumb {\n background: var(--neutral-fill-rest);\n }\n`"
837
- }
838
- ],
839
- "exports": [
840
- {
841
- "kind": "js",
842
- "name": "scrollbarStyles",
843
- "declaration": {
844
- "name": "scrollbarStyles",
845
- "module": "src/styles/scrollbar.styles.ts"
846
- }
847
- }
848
- ]
849
- },
850
850
  {
851
851
  "kind": "javascript-module",
852
852
  "path": "src/components/foundation-inbox/inbox.styles.ts",
@@ -2906,19 +2906,54 @@
2906
2906
  },
2907
2907
  {
2908
2908
  "kind": "javascript-module",
2909
- "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
2909
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2910
2910
  "declarations": [
2911
2911
  {
2912
2912
  "kind": "variable",
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
- },
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
2918
  {
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",
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",
2931
+ "declarations": [
2932
+ {
2933
+ "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": [
2953
+ {
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",
2922
2957
  "members": [
2923
2958
  {
2924
2959
  "kind": "field",
@@ -2929,56 +2964,21 @@
2929
2964
  },
2930
2965
  {
2931
2966
  "kind": "field",
2932
- "name": "isAlertSoundEditMode",
2933
- "type": {
2934
- "text": "boolean"
2935
- },
2936
- "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
2937
- "readonly": true
2938
- },
2939
- {
2940
- "kind": "field",
2941
- "name": "alertSoundEntityId",
2942
- "type": {
2943
- "text": "string | null"
2944
- },
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",
2967
+ "name": "volumePercent",
2969
2968
  "type": {
2970
- "text": "string"
2969
+ "text": "number"
2971
2970
  },
2972
- "default": "''"
2971
+ "default": "100",
2972
+ "description": "Global playback volume 0–100. @internal"
2973
2973
  },
2974
2974
  {
2975
2975
  "kind": "field",
2976
- "name": "hasAlertSound",
2976
+ "name": "selectableRules",
2977
2977
  "type": {
2978
- "text": "boolean"
2978
+ "text": "AlertSoundSelectableRule[]"
2979
2979
  },
2980
- "default": "false",
2981
- "description": "True when edit loaded an existing server sound (or user attached one)."
2980
+ "default": "[]",
2981
+ "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
2982
2982
  },
2983
2983
  {
2984
2984
  "kind": "field",
@@ -2989,58 +2989,75 @@
2989
2989
  },
2990
2990
  {
2991
2991
  "kind": "field",
2992
- "name": "pendingAlertSoundData",
2992
+ "name": "pendingRuleIndex",
2993
2993
  "type": {
2994
- "text": "string | null"
2994
+ "text": "number | null"
2995
2995
  },
2996
+ "privacy": "private",
2996
2997
  "default": "null"
2997
2998
  },
2998
2999
  {
2999
3000
  "kind": "field",
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)."
3001
+ "name": "player",
3002
+ "privacy": "private",
3003
+ "readonly": true
3006
3004
  },
3007
3005
  {
3008
3006
  "kind": "field",
3009
- "name": "clearAlertSound",
3007
+ "name": "unsubscribePlayer",
3010
3008
  "type": {
3011
- "text": "boolean"
3009
+ "text": "(() => void) | undefined"
3012
3010
  },
3013
- "default": "false"
3011
+ "privacy": "private"
3014
3012
  },
3015
3013
  {
3016
3014
  "kind": "field",
3017
- "name": "testAudio",
3015
+ "name": "ignoreSelectChanges",
3018
3016
  "type": {
3019
- "text": "HTMLAudioElement | null"
3017
+ "text": "boolean"
3020
3018
  },
3021
- "default": "null",
3022
- "description": "In-progress Test playback; not private — mixin return type is exported."
3019
+ "privacy": "private",
3020
+ "default": "false",
3021
+ "description": "Suppresses select change events while options are rebuilt."
3023
3022
  },
3024
3023
  {
3025
3024
  "kind": "method",
3026
- "name": "loadExistingAlertSound",
3025
+ "name": "onMatchModeChange",
3026
+ "return": {
3027
+ "type": {
3028
+ "text": "boolean"
3029
+ }
3030
+ },
3027
3031
  "parameters": [
3028
3032
  {
3029
- "name": "dynamicRuleId",
3033
+ "name": "index",
3030
3034
  "type": {
3031
- "text": "string"
3035
+ "text": "number"
3036
+ }
3037
+ },
3038
+ {
3039
+ "name": "event",
3040
+ "type": {
3041
+ "text": "Event"
3032
3042
  }
3033
3043
  }
3034
3044
  ]
3035
3045
  },
3036
3046
  {
3037
3047
  "kind": "method",
3038
- "name": "openAlertSoundPicker"
3039
- },
3040
- {
3041
- "kind": "method",
3042
- "name": "onAlertSoundSelected",
3048
+ "name": "onPatternInput",
3049
+ "return": {
3050
+ "type": {
3051
+ "text": "boolean"
3052
+ }
3053
+ },
3043
3054
  "parameters": [
3055
+ {
3056
+ "name": "index",
3057
+ "type": {
3058
+ "text": "number"
3059
+ }
3060
+ },
3044
3061
  {
3045
3062
  "name": "event",
3046
3063
  "type": {
@@ -3051,960 +3068,967 @@
3051
3068
  },
3052
3069
  {
3053
3070
  "kind": "method",
3054
- "name": "clearAttachedAlertSound"
3055
- },
3056
- {
3057
- "kind": "method",
3058
- "name": "testAttachedAlertSound"
3059
- },
3060
- {
3061
- "kind": "method",
3062
- "name": "stopTestSound"
3063
- },
3064
- {
3065
- "kind": "method",
3066
- "name": "resetAlertSoundState"
3071
+ "name": "onRuleChange",
3072
+ "return": {
3073
+ "type": {
3074
+ "text": "boolean"
3075
+ }
3076
+ },
3077
+ "parameters": [
3078
+ {
3079
+ "name": "index",
3080
+ "type": {
3081
+ "text": "number"
3082
+ }
3083
+ },
3084
+ {
3085
+ "name": "event",
3086
+ "type": {
3087
+ "text": "Event"
3088
+ }
3089
+ }
3090
+ ]
3067
3091
  },
3068
3092
  {
3069
3093
  "kind": "method",
3070
- "name": "applyAlertSoundToPayload",
3094
+ "name": "openFilePicker",
3071
3095
  "return": {
3072
3096
  "type": {
3073
- "text": "T"
3097
+ "text": "boolean"
3074
3098
  }
3075
3099
  },
3076
3100
  "parameters": [
3077
3101
  {
3078
- "name": "target",
3102
+ "name": "index",
3079
3103
  "type": {
3080
- "text": "T"
3104
+ "text": "number"
3081
3105
  }
3082
3106
  }
3083
- ],
3084
- "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3107
+ ]
3085
3108
  },
3086
3109
  {
3087
3110
  "kind": "method",
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": [
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
+ ]
3125
+ },
3093
3126
  {
3094
- "name": "Base",
3095
- "type": {
3096
- "text": "TBase"
3097
- }
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": [
3127
+ "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
+ ]
3142
+ },
3168
3143
  {
3169
- "kind": "field",
3170
- "name": "id",
3171
- "type": {
3172
- "text": "string"
3173
- }
3144
+ "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
+ ]
3174
3159
  },
3175
3160
  {
3176
- "kind": "field",
3177
- "name": "name",
3178
- "type": {
3179
- "text": "string"
3161
+ "kind": "method",
3162
+ "name": "toggleRuleMute",
3163
+ "return": {
3164
+ "type": {
3165
+ "text": "boolean"
3166
+ }
3167
+ },
3168
+ "parameters": [
3169
+ {
3170
+ "name": "index",
3171
+ "type": {
3172
+ "text": "number"
3173
+ }
3174
+ }
3175
+ ]
3176
+ },
3177
+ {
3178
+ "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
+ },
3194
+ {
3195
+ "kind": "method",
3196
+ "name": "toggleMute",
3197
+ "return": {
3198
+ "type": {
3199
+ "text": "boolean"
3200
+ }
3180
3201
  }
3181
3202
  },
3182
3203
  {
3183
- "kind": "field",
3184
- "name": "component",
3185
- "type": {
3186
- "text": "string"
3204
+ "kind": "method",
3205
+ "name": "addRule",
3206
+ "return": {
3207
+ "type": {
3208
+ "text": "boolean"
3209
+ }
3187
3210
  }
3188
3211
  },
3189
3212
  {
3190
- "kind": "field",
3191
- "name": "right",
3192
- "type": {
3193
- "text": "string"
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
+ }
3194
3247
  }
3248
+ },
3249
+ {
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
+ ]
3306
+ },
3307
+ {
3308
+ "kind": "method",
3309
+ "name": "syncSoundState",
3310
+ "privacy": "private"
3195
3311
  }
3196
- ]
3197
- },
3198
- {
3199
- "kind": "variable",
3200
- "name": "NOTIFICATION_DASHBOARD_TABS",
3201
- "type": {
3202
- "text": "NotificationDashboardTab[]"
3312
+ ],
3313
+ "superclass": {
3314
+ "name": "GenesisElement",
3315
+ "package": "@genesislcap/web-core"
3203
3316
  },
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]"
3317
+ "tagName": "foundation-sounds-panel",
3318
+ "customElement": true
3205
3319
  }
3206
3320
  ],
3207
3321
  "exports": [
3208
3322
  {
3209
3323
  "kind": "js",
3210
- "name": "NotificationDashboardTab",
3324
+ "name": "FoundationSoundsPanel",
3211
3325
  "declaration": {
3212
- "name": "NotificationDashboardTab",
3213
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3326
+ "name": "FoundationSoundsPanel",
3327
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3214
3328
  }
3215
3329
  },
3216
3330
  {
3217
- "kind": "js",
3218
- "name": "NOTIFICATION_DASHBOARD_TABS",
3331
+ "kind": "custom-element-definition",
3332
+ "name": "foundation-sounds-panel",
3219
3333
  "declaration": {
3220
- "name": "NOTIFICATION_DASHBOARD_TABS",
3221
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3334
+ "name": "FoundationSoundsPanel",
3335
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3222
3336
  }
3223
3337
  }
3224
3338
  ]
3225
3339
  },
3226
3340
  {
3227
3341
  "kind": "javascript-module",
3228
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3342
+ "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
3229
3343
  "declarations": [
3230
3344
  {
3231
3345
  "kind": "variable",
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`"
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."
3234
3349
  }
3235
3350
  ],
3236
3351
  "exports": [
3237
3352
  {
3238
3353
  "kind": "js",
3239
- "name": "FoundationNotificationDashboardTemplate",
3354
+ "name": "FoundationSoundsStyles",
3240
3355
  "declaration": {
3241
- "name": "FoundationNotificationDashboardTemplate",
3242
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3356
+ "name": "FoundationSoundsStyles",
3357
+ "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
3243
3358
  }
3244
3359
  }
3245
3360
  ]
3246
3361
  },
3247
3362
  {
3248
3363
  "kind": "javascript-module",
3249
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3364
+ "path": "src/components/foundation-sounds/foundation-sounds.ts",
3250
3365
  "declarations": [
3251
3366
  {
3252
3367
  "kind": "class",
3253
- "description": "",
3254
- "name": "FoundationNotificationDashboard",
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",
3255
3370
  "members": [
3256
3371
  {
3257
3372
  "kind": "field",
3258
- "name": "auth",
3373
+ "name": "connect",
3259
3374
  "type": {
3260
- "text": "Auth"
3375
+ "text": "Connect"
3261
3376
  }
3262
3377
  },
3263
3378
  {
3264
3379
  "kind": "field",
3265
- "name": "ready",
3380
+ "name": "inboxService",
3266
3381
  "type": {
3267
- "text": "boolean"
3268
- },
3269
- "default": "false"
3382
+ "text": "FoundationInboxService"
3383
+ }
3270
3384
  },
3271
3385
  {
3272
3386
  "kind": "field",
3273
- "name": "hasPermissions",
3387
+ "name": "ruleService",
3274
3388
  "type": {
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": [
3389
+ "text": "RuleService"
3390
+ }
3391
+ },
3316
3392
  {
3317
3393
  "kind": "field",
3318
- "name": "uuid",
3394
+ "name": "soundEnabled",
3319
3395
  "type": {
3320
- "text": "UUID"
3396
+ "text": "boolean"
3321
3397
  },
3322
- "privacy": "private",
3323
- "static": true
3324
- },
3325
- {
3326
- "kind": "field",
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
3350
- },
3351
- {
3352
- "kind": "field",
3353
- "name": "createAssignment",
3354
- "static": true
3398
+ "default": "true",
3399
+ "description": "When false, new audible alerts are tracked but do not play."
3355
3400
  },
3356
3401
  {
3357
3402
  "kind": "field",
3358
- "name": "createPlaceholderAssignment",
3359
- "static": true
3403
+ "name": "connectionSub",
3404
+ "type": {
3405
+ "text": "Subscription | undefined"
3406
+ },
3407
+ "privacy": "private"
3360
3408
  },
3361
3409
  {
3362
3410
  "kind": "field",
3363
- "name": "createTextAssignment",
3364
- "static": true
3411
+ "name": "player",
3412
+ "privacy": "private",
3413
+ "readonly": true
3365
3414
  },
3366
3415
  {
3367
3416
  "kind": "field",
3368
- "name": "getAssignmentValue",
3369
- "static": true
3417
+ "name": "knownAlertIds",
3418
+ "privacy": "private",
3419
+ "default": "new Set<string>()"
3370
3420
  },
3371
3421
  {
3372
3422
  "kind": "field",
3373
- "name": "getAssignmentText",
3374
- "static": true
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."
3375
3428
  },
3376
3429
  {
3377
3430
  "kind": "method",
3378
- "name": "createConditions",
3379
- "static": true,
3431
+ "name": "subscribeToAlerts",
3432
+ "privacy": "private",
3380
3433
  "return": {
3381
3434
  "type": {
3382
- "text": "any"
3383
- }
3384
- },
3385
- "parameters": [
3386
- {
3387
- "name": "conditions",
3388
- "type": {
3389
- "text": "ConditionNode[]"
3390
- }
3391
- },
3392
- {
3393
- "name": "parameters",
3394
- "optional": true
3435
+ "text": "void"
3395
3436
  }
3396
- ]
3437
+ }
3438
+ },
3439
+ {
3440
+ "kind": "field",
3441
+ "name": "subscriptionHandler",
3442
+ "privacy": "private"
3397
3443
  },
3398
3444
  {
3399
3445
  "kind": "method",
3400
- "name": "hasMultiValueCondition",
3401
- "static": true,
3446
+ "name": "playForNewAlerts",
3447
+ "privacy": "private",
3402
3448
  "return": {
3403
3449
  "type": {
3404
- "text": "boolean"
3450
+ "text": "Promise<void>"
3405
3451
  }
3406
3452
  },
3407
3453
  "parameters": [
3408
3454
  {
3409
- "name": "conditions",
3455
+ "name": "rows",
3410
3456
  "type": {
3411
- "text": "ConditionNode[]"
3457
+ "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
3412
3458
  }
3413
3459
  }
3414
3460
  ]
3415
3461
  },
3416
3462
  {
3417
3463
  "kind": "method",
3418
- "name": "hasOrJoin",
3419
- "static": true,
3464
+ "name": "tryPlayServerSound",
3465
+ "privacy": "private",
3420
3466
  "return": {
3421
3467
  "type": {
3422
- "text": "boolean"
3468
+ "text": "Promise<boolean>"
3423
3469
  }
3424
3470
  },
3425
3471
  "parameters": [
3426
3472
  {
3427
- "name": "conditions",
3473
+ "name": "dynamicRuleId",
3428
3474
  "type": {
3429
- "text": "ConditionNode[]"
3475
+ "text": "string"
3430
3476
  }
3431
3477
  }
3432
3478
  ]
3433
3479
  },
3434
3480
  {
3435
3481
  "kind": "method",
3436
- "name": "hasGroup",
3437
- "static": true,
3482
+ "name": "fetchAndCacheServerSound",
3483
+ "privacy": "private",
3438
3484
  "return": {
3439
3485
  "type": {
3440
- "text": "boolean"
3486
+ "text": "Promise<boolean>"
3441
3487
  }
3442
3488
  },
3443
3489
  "parameters": [
3444
3490
  {
3445
- "name": "conditions",
3491
+ "name": "dynamicRuleId",
3446
3492
  "type": {
3447
- "text": "ConditionNode[]"
3493
+ "text": "string"
3448
3494
  }
3449
3495
  }
3450
3496
  ]
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
+ }
3451
3559
  },
3452
3560
  {
3453
- "kind": "method",
3454
- "name": "hasUnsupportedOperator",
3455
- "static": true,
3456
- "return": {
3457
- "type": {
3458
- "text": "boolean"
3459
- }
3561
+ "kind": "field",
3562
+ "name": "isAlertSoundEditMode",
3563
+ "type": {
3564
+ "text": "boolean"
3460
3565
  },
3461
- "parameters": [
3462
- {
3463
- "name": "conditions",
3464
- "type": {
3465
- "text": "ConditionNode[]"
3466
- }
3467
- }
3468
- ]
3566
+ "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
3567
+ "readonly": true
3469
3568
  },
3470
3569
  {
3471
- "kind": "method",
3472
- "name": "hasCurrentUser",
3473
- "static": true,
3474
- "return": {
3475
- "type": {
3476
- "text": "boolean"
3477
- }
3570
+ "kind": "field",
3571
+ "name": "alertSoundEntityId",
3572
+ "type": {
3573
+ "text": "string | null"
3478
3574
  },
3479
- "parameters": [
3480
- {
3481
- "name": "conditions",
3482
- "type": {
3483
- "text": "ConditionNode[]"
3484
- }
3485
- }
3486
- ]
3575
+ "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
3576
+ "readonly": true
3487
3577
  },
3488
3578
  {
3489
- "kind": "method",
3490
- "name": "flattenConditions",
3491
- "static": true,
3492
- "return": {
3493
- "type": {
3494
- "text": "ConditionBuilderEntity[]"
3495
- }
3579
+ "kind": "field",
3580
+ "name": "alertSoundCacheSyncMode",
3581
+ "type": {
3582
+ "text": "'entity' | 'all'"
3496
3583
  },
3497
- "parameters": [
3498
- {
3499
- "name": "conditions",
3500
- "type": {
3501
- "text": "ConditionNode[]"
3502
- }
3503
- }
3504
- ]
3584
+ "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
3585
+ "readonly": true
3505
3586
  },
3506
3587
  {
3507
- "kind": "method",
3508
- "name": "resolveLeftValues",
3509
- "static": true,
3510
- "return": {
3511
- "type": {
3512
- "text": "ConditionNode[]"
3513
- }
3588
+ "kind": "field",
3589
+ "name": "alertSoundFileName",
3590
+ "type": {
3591
+ "text": "string"
3514
3592
  },
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
- ]
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"
3601
+ },
3602
+ "default": "''"
3603
+ },
3604
+ {
3605
+ "kind": "field",
3606
+ "name": "hasAlertSound",
3607
+ "type": {
3608
+ "text": "boolean"
3609
+ },
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
+ }
3619
+ },
3620
+ {
3621
+ "kind": "field",
3622
+ "name": "pendingAlertSoundData",
3623
+ "type": {
3624
+ "text": "string | null"
3625
+ },
3626
+ "default": "null"
3529
3627
  },
3530
3628
  {
3531
3629
  "kind": "field",
3532
- "name": "createEmptyGroup",
3533
- "static": true
3630
+ "name": "alertSoundDirty",
3631
+ "type": {
3632
+ "text": "boolean"
3633
+ },
3634
+ "default": "false",
3635
+ "description": "True when the user picked a new file this session (needs upload)."
3534
3636
  },
3535
3637
  {
3536
- "kind": "method",
3537
- "name": "buildRawExpression",
3538
- "static": true,
3539
- "return": {
3540
- "type": {
3541
- "text": "string"
3542
- }
3638
+ "kind": "field",
3639
+ "name": "clearAlertSound",
3640
+ "type": {
3641
+ "text": "boolean"
3543
3642
  },
3544
- "parameters": [
3545
- {
3546
- "name": "conditions",
3547
- "type": {
3548
- "text": "ConditionNode[]"
3549
- }
3550
- }
3551
- ]
3643
+ "default": "false"
3552
3644
  },
3553
3645
  {
3554
- "kind": "method",
3555
- "name": "parseRawExpression",
3556
- "static": true,
3557
- "return": {
3558
- "type": {
3559
- "text": "ConditionNode[] | null"
3560
- }
3646
+ "kind": "field",
3647
+ "name": "testAudio",
3648
+ "type": {
3649
+ "text": "HTMLAudioElement | null"
3561
3650
  },
3651
+ "default": "null",
3652
+ "description": "In-progress Test playback; not private — mixin return type is exported."
3653
+ },
3654
+ {
3655
+ "kind": "method",
3656
+ "name": "loadExistingAlertSound",
3562
3657
  "parameters": [
3563
3658
  {
3564
- "name": "rawExpression",
3659
+ "name": "dynamicRuleId",
3565
3660
  "type": {
3566
3661
  "text": "string"
3567
3662
  }
3568
3663
  }
3569
3664
  ]
3570
- }
3571
- ]
3572
- },
3573
- {
3574
- "kind": "class",
3575
- "description": "",
3576
- "name": "TemplateUtils",
3577
- "members": [
3578
- {
3579
- "kind": "field",
3580
- "name": "createEmptyParameter",
3581
- "static": true
3582
3665
  },
3583
3666
  {
3584
3667
  "kind": "method",
3585
- "name": "getParameters",
3586
- "static": true,
3587
- "parameters": [
3588
- {
3589
- "name": "parameters"
3590
- }
3591
- ]
3668
+ "name": "openAlertSoundPicker"
3592
3669
  },
3593
3670
  {
3594
3671
  "kind": "method",
3595
- "name": "buildRightValue",
3596
- "privacy": "private",
3597
- "static": true,
3672
+ "name": "onAlertSoundSelected",
3598
3673
  "parameters": [
3599
3674
  {
3600
- "name": "logicalOperator",
3675
+ "name": "event",
3601
3676
  "type": {
3602
- "text": "LogicalOperator"
3677
+ "text": "Event"
3603
3678
  }
3604
- },
3605
- {
3606
- "name": "condition"
3607
- },
3608
- {
3609
- "name": "parameters",
3610
- "optional": true
3611
3679
  }
3612
3680
  ]
3613
3681
  },
3614
3682
  {
3615
3683
  "kind": "method",
3616
- "name": "getConditions",
3617
- "static": true,
3618
- "parameters": [
3619
- {
3620
- "name": "conditions"
3621
- },
3622
- {
3623
- "name": "parameters",
3624
- "optional": true
3625
- }
3626
- ]
3684
+ "name": "clearAttachedAlertSound"
3627
3685
  },
3628
3686
  {
3629
3687
  "kind": "method",
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": [
3688
+ "name": "testAttachedAlertSound"
3689
+ },
3645
3690
  {
3646
3691
  "kind": "method",
3647
- "name": "buildRightValue",
3648
- "privacy": "private",
3649
- "static": true,
3692
+ "name": "stopTestSound"
3693
+ },
3694
+ {
3695
+ "kind": "method",
3696
+ "name": "resetAlertSoundState"
3697
+ },
3698
+ {
3699
+ "kind": "method",
3700
+ "name": "applyAlertSoundToPayload",
3701
+ "return": {
3702
+ "type": {
3703
+ "text": "T"
3704
+ }
3705
+ },
3650
3706
  "parameters": [
3651
3707
  {
3652
- "name": "logicalOperator",
3708
+ "name": "target",
3653
3709
  "type": {
3654
- "text": "LogicalOperator"
3710
+ "text": "T"
3655
3711
  }
3656
- },
3657
- {
3658
- "name": "condition"
3659
3712
  }
3660
- ]
3713
+ ],
3714
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3661
3715
  },
3662
3716
  {
3663
3717
  "kind": "method",
3664
- "name": "getConditions",
3665
- "static": true,
3666
- "parameters": [
3667
- {
3668
- "name": "conditions"
3669
- }
3670
- ]
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."
3671
3720
  }
3672
- ]
3673
- },
3674
- {
3675
- "kind": "function",
3676
- "name": "showNotificationError",
3721
+ ],
3677
3722
  "parameters": [
3678
3723
  {
3679
- "name": "error"
3724
+ "name": "Base",
3725
+ "type": {
3726
+ "text": "TBase"
3727
+ }
3680
3728
  }
3681
- ]
3729
+ ],
3730
+ "privacy": "public"
3682
3731
  }
3683
3732
  ],
3684
3733
  "exports": [
3685
3734
  {
3686
3735
  "kind": "js",
3687
- "name": "UUIDGenerator",
3688
- "declaration": {
3689
- "name": "UUIDGenerator",
3690
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3691
- }
3692
- },
3693
- {
3694
- "kind": "js",
3695
- "name": "isEmpty",
3736
+ "name": "alertSoundAttachmentTemplate",
3696
3737
  "declaration": {
3697
- "name": "isEmpty",
3698
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3738
+ "name": "alertSoundAttachmentTemplate",
3739
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3699
3740
  }
3700
3741
  },
3701
3742
  {
3702
3743
  "kind": "js",
3703
- "name": "DynamicRuleUtils",
3744
+ "name": "AlertSoundAttachmentMixin",
3704
3745
  "declaration": {
3705
- "name": "DynamicRuleUtils",
3706
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3746
+ "name": "AlertSoundAttachmentMixin",
3747
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3707
3748
  }
3708
- },
3749
+ }
3750
+ ]
3751
+ },
3752
+ {
3753
+ "kind": "javascript-module",
3754
+ "path": "src/components/foundation-notification-dashboard/index.ts",
3755
+ "declarations": [],
3756
+ "exports": [
3709
3757
  {
3710
3758
  "kind": "js",
3711
- "name": "TemplateUtils",
3759
+ "name": "*",
3712
3760
  "declaration": {
3713
- "name": "TemplateUtils",
3714
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3761
+ "name": "*",
3762
+ "package": "./notification-dashboard"
3715
3763
  }
3716
- },
3764
+ }
3765
+ ]
3766
+ },
3767
+ {
3768
+ "kind": "javascript-module",
3769
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
3770
+ "declarations": [
3717
3771
  {
3718
- "kind": "js",
3719
- "name": "RuleUtils",
3720
- "declaration": {
3721
- "name": "RuleUtils",
3722
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3723
- }
3724
- },
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": [
3725
3779
  {
3726
3780
  "kind": "js",
3727
- "name": "showNotificationError",
3781
+ "name": "FoundationNotificationDashboardStyles",
3728
3782
  "declaration": {
3729
- "name": "showNotificationError",
3730
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3783
+ "name": "FoundationNotificationDashboardStyles",
3784
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
3731
3785
  }
3732
3786
  }
3733
3787
  ]
3734
3788
  },
3735
3789
  {
3736
3790
  "kind": "javascript-module",
3737
- "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
3791
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
3738
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
+ },
3739
3828
  {
3740
3829
  "kind": "variable",
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`"
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]"
3743
3835
  }
3744
3836
  ],
3745
3837
  "exports": [
3746
3838
  {
3747
3839
  "kind": "js",
3748
- "name": "FoundationSoundsPanelStyles",
3840
+ "name": "NotificationDashboardTab",
3749
3841
  "declaration": {
3750
- "name": "FoundationSoundsPanelStyles",
3751
- "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
3842
+ "name": "NotificationDashboardTab",
3843
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3844
+ }
3845
+ },
3846
+ {
3847
+ "kind": "js",
3848
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3849
+ "declaration": {
3850
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3851
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3752
3852
  }
3753
3853
  }
3754
3854
  ]
3755
3855
  },
3756
3856
  {
3757
3857
  "kind": "javascript-module",
3758
- "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
3858
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3759
3859
  "declarations": [
3760
3860
  {
3761
3861
  "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`"
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`"
3764
3864
  }
3765
3865
  ],
3766
3866
  "exports": [
3767
3867
  {
3768
3868
  "kind": "js",
3769
- "name": "FoundationSoundsPanelTemplate",
3869
+ "name": "FoundationNotificationDashboardTemplate",
3770
3870
  "declaration": {
3771
- "name": "FoundationSoundsPanelTemplate",
3772
- "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
3871
+ "name": "FoundationNotificationDashboardTemplate",
3872
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3773
3873
  }
3774
3874
  }
3775
3875
  ]
3776
3876
  },
3777
3877
  {
3778
3878
  "kind": "javascript-module",
3779
- "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
3879
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3780
3880
  "declarations": [
3781
3881
  {
3782
3882
  "kind": "class",
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",
3883
+ "description": "",
3884
+ "name": "FoundationNotificationDashboard",
3785
3885
  "members": [
3786
3886
  {
3787
3887
  "kind": "field",
3788
- "name": "ruleService",
3888
+ "name": "auth",
3789
3889
  "type": {
3790
- "text": "RuleService"
3890
+ "text": "Auth"
3791
3891
  }
3792
3892
  },
3793
3893
  {
3794
3894
  "kind": "field",
3795
- "name": "volumePercent",
3895
+ "name": "ready",
3796
3896
  "type": {
3797
- "text": "number"
3897
+ "text": "boolean"
3798
3898
  },
3799
- "default": "100",
3800
- "description": "Global playback volume 0–100. @internal"
3899
+ "default": "false"
3801
3900
  },
3802
3901
  {
3803
3902
  "kind": "field",
3804
- "name": "selectableRules",
3903
+ "name": "hasPermissions",
3805
3904
  "type": {
3806
- "text": "AlertSoundSelectableRule[]"
3905
+ "text": "boolean"
3807
3906
  },
3808
- "default": "[]",
3809
- "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
3810
- },
3811
- {
3812
- "kind": "field",
3813
- "name": "fileInput",
3814
- "type": {
3815
- "text": "HTMLInputElement"
3816
- }
3817
- },
3907
+ "default": "true"
3908
+ }
3909
+ ],
3910
+ "superclass": {
3911
+ "name": "GenesisElement",
3912
+ "package": "@genesislcap/web-core"
3913
+ },
3914
+ "tagName": "foundation-notification-dashboard",
3915
+ "customElement": true
3916
+ }
3917
+ ],
3918
+ "exports": [
3919
+ {
3920
+ "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",
3930
+ "declaration": {
3931
+ "name": "FoundationNotificationDashboard",
3932
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3933
+ }
3934
+ }
3935
+ ]
3936
+ },
3937
+ {
3938
+ "kind": "javascript-module",
3939
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3940
+ "declarations": [
3941
+ {
3942
+ "kind": "class",
3943
+ "description": "",
3944
+ "name": "UUIDGenerator",
3945
+ "members": [
3818
3946
  {
3819
3947
  "kind": "field",
3820
- "name": "pendingRuleIndex",
3948
+ "name": "uuid",
3821
3949
  "type": {
3822
- "text": "number | null"
3950
+ "text": "UUID"
3823
3951
  },
3824
3952
  "privacy": "private",
3825
- "default": "null"
3953
+ "static": true
3826
3954
  },
3827
3955
  {
3828
3956
  "kind": "field",
3829
- "name": "player",
3830
- "privacy": "private",
3831
- "readonly": true
3832
- },
3957
+ "name": "createUUID",
3958
+ "static": true
3959
+ }
3960
+ ]
3961
+ },
3962
+ {
3963
+ "kind": "function",
3964
+ "name": "isEmpty",
3965
+ "parameters": [
3833
3966
  {
3834
- "kind": "field",
3835
- "name": "unsubscribePlayer",
3836
- "type": {
3837
- "text": "(() => void) | undefined"
3838
- },
3839
- "privacy": "private"
3840
- },
3967
+ "name": "value"
3968
+ }
3969
+ ]
3970
+ },
3971
+ {
3972
+ "kind": "class",
3973
+ "description": "",
3974
+ "name": "DynamicRuleUtils",
3975
+ "members": [
3841
3976
  {
3842
3977
  "kind": "field",
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."
3850
- },
3851
- {
3852
- "kind": "method",
3853
- "name": "onMatchModeChange",
3854
- "return": {
3855
- "type": {
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
- ]
3978
+ "name": "createEmptyCondition",
3979
+ "static": true
3896
3980
  },
3897
3981
  {
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
- ]
3982
+ "kind": "field",
3983
+ "name": "createAssignment",
3984
+ "static": true
3919
3985
  },
3920
3986
  {
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
- ]
3987
+ "kind": "field",
3988
+ "name": "createPlaceholderAssignment",
3989
+ "static": true
3936
3990
  },
3937
3991
  {
3938
- "kind": "method",
3939
- "name": "onFileSelected",
3940
- "return": {
3941
- "type": {
3942
- "text": "boolean"
3943
- }
3944
- },
3945
- "parameters": [
3946
- {
3947
- "name": "event",
3948
- "type": {
3949
- "text": "Event"
3950
- }
3951
- }
3952
- ]
3992
+ "kind": "field",
3993
+ "name": "createTextAssignment",
3994
+ "static": true
3953
3995
  },
3954
3996
  {
3955
- "kind": "method",
3956
- "name": "clearSound",
3957
- "return": {
3958
- "type": {
3959
- "text": "boolean"
3960
- }
3961
- },
3962
- "parameters": [
3963
- {
3964
- "name": "index",
3965
- "type": {
3966
- "text": "number"
3967
- }
3968
- }
3969
- ]
3997
+ "kind": "field",
3998
+ "name": "getAssignmentValue",
3999
+ "static": true
3970
4000
  },
3971
4001
  {
3972
- "kind": "method",
3973
- "name": "testSound",
3974
- "return": {
3975
- "type": {
3976
- "text": "boolean"
3977
- }
3978
- },
3979
- "parameters": [
3980
- {
3981
- "name": "index",
3982
- "type": {
3983
- "text": "number"
3984
- }
3985
- }
3986
- ]
4002
+ "kind": "field",
4003
+ "name": "getAssignmentText",
4004
+ "static": true
3987
4005
  },
3988
4006
  {
3989
4007
  "kind": "method",
3990
- "name": "toggleRuleMute",
4008
+ "name": "createConditions",
4009
+ "static": true,
3991
4010
  "return": {
3992
4011
  "type": {
3993
- "text": "boolean"
4012
+ "text": "any"
3994
4013
  }
3995
4014
  },
3996
4015
  "parameters": [
3997
4016
  {
3998
- "name": "index",
4017
+ "name": "conditions",
3999
4018
  "type": {
4000
- "text": "number"
4019
+ "text": "ConditionNode[]"
4001
4020
  }
4021
+ },
4022
+ {
4023
+ "name": "parameters",
4024
+ "optional": true
4002
4025
  }
4003
4026
  ]
4004
4027
  },
4005
4028
  {
4006
4029
  "kind": "method",
4007
- "name": "onVolumeChange",
4030
+ "name": "hasMultiValueCondition",
4031
+ "static": true,
4008
4032
  "return": {
4009
4033
  "type": {
4010
4034
  "text": "boolean"
@@ -4012,34 +4036,17 @@
4012
4036
  },
4013
4037
  "parameters": [
4014
4038
  {
4015
- "name": "event",
4039
+ "name": "conditions",
4016
4040
  "type": {
4017
- "text": "Event"
4041
+ "text": "ConditionNode[]"
4018
4042
  }
4019
4043
  }
4020
4044
  ]
4021
4045
  },
4022
4046
  {
4023
4047
  "kind": "method",
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",
4048
+ "name": "hasOrJoin",
4049
+ "static": true,
4043
4050
  "return": {
4044
4051
  "type": {
4045
4052
  "text": "boolean"
@@ -4047,317 +4054,310 @@
4047
4054
  },
4048
4055
  "parameters": [
4049
4056
  {
4050
- "name": "index",
4057
+ "name": "conditions",
4051
4058
  "type": {
4052
- "text": "number"
4059
+ "text": "ConditionNode[]"
4053
4060
  }
4054
4061
  }
4055
4062
  ]
4056
4063
  },
4057
4064
  {
4058
4065
  "kind": "method",
4059
- "name": "reloadRules",
4060
- "return": {
4061
- "type": {
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",
4066
+ "name": "hasGroup",
4067
+ "static": true,
4103
4068
  "return": {
4104
4069
  "type": {
4105
- "text": "AlertSoundSelectableRule[]"
4070
+ "text": "boolean"
4106
4071
  }
4107
4072
  },
4108
4073
  "parameters": [
4109
4074
  {
4110
- "name": "ruleList",
4075
+ "name": "conditions",
4111
4076
  "type": {
4112
- "text": "NamedRuleRow[]"
4077
+ "text": "ConditionNode[]"
4113
4078
  }
4114
4079
  }
4115
4080
  ]
4116
4081
  },
4117
4082
  {
4118
4083
  "kind": "method",
4119
- "name": "ruleMatchId",
4120
- "privacy": "private",
4084
+ "name": "hasUnsupportedOperator",
4085
+ "static": true,
4121
4086
  "return": {
4122
4087
  "type": {
4123
- "text": "string"
4088
+ "text": "boolean"
4124
4089
  }
4125
4090
  },
4126
4091
  "parameters": [
4127
4092
  {
4128
- "name": "rule",
4093
+ "name": "conditions",
4129
4094
  "type": {
4130
- "text": "NamedRuleRow | undefined"
4131
- }
4132
- }
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
4095
+ "text": "ConditionNode[]"
4096
+ }
4097
+ }
4098
+ ]
4242
4099
  },
4243
4100
  {
4244
- "kind": "field",
4245
- "name": "knownAlertIds",
4246
- "privacy": "private",
4247
- "default": "new Set<string>()"
4101
+ "kind": "method",
4102
+ "name": "hasCurrentUser",
4103
+ "static": true,
4104
+ "return": {
4105
+ "type": {
4106
+ "text": "boolean"
4107
+ }
4108
+ },
4109
+ "parameters": [
4110
+ {
4111
+ "name": "conditions",
4112
+ "type": {
4113
+ "text": "ConditionNode[]"
4114
+ }
4115
+ }
4116
+ ]
4248
4117
  },
4249
4118
  {
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."
4119
+ "kind": "method",
4120
+ "name": "flattenConditions",
4121
+ "static": true,
4122
+ "return": {
4123
+ "type": {
4124
+ "text": "ConditionBuilderEntity[]"
4125
+ }
4126
+ },
4127
+ "parameters": [
4128
+ {
4129
+ "name": "conditions",
4130
+ "type": {
4131
+ "text": "ConditionNode[]"
4132
+ }
4133
+ }
4134
+ ]
4256
4135
  },
4257
4136
  {
4258
4137
  "kind": "method",
4259
- "name": "subscribeToAlerts",
4260
- "privacy": "private",
4138
+ "name": "resolveLeftValues",
4139
+ "static": true,
4261
4140
  "return": {
4262
4141
  "type": {
4263
- "text": "void"
4142
+ "text": "ConditionNode[]"
4264
4143
  }
4265
- }
4144
+ },
4145
+ "parameters": [
4146
+ {
4147
+ "name": "conditions",
4148
+ "type": {
4149
+ "text": "ConditionNode[]"
4150
+ }
4151
+ },
4152
+ {
4153
+ "name": "fields",
4154
+ "type": {
4155
+ "text": "any[]"
4156
+ }
4157
+ }
4158
+ ]
4266
4159
  },
4267
4160
  {
4268
4161
  "kind": "field",
4269
- "name": "subscriptionHandler",
4270
- "privacy": "private"
4162
+ "name": "createEmptyGroup",
4163
+ "static": true
4271
4164
  },
4272
4165
  {
4273
4166
  "kind": "method",
4274
- "name": "playForNewAlerts",
4275
- "privacy": "private",
4167
+ "name": "buildRawExpression",
4168
+ "static": true,
4276
4169
  "return": {
4277
4170
  "type": {
4278
- "text": "Promise<void>"
4171
+ "text": "string"
4279
4172
  }
4280
4173
  },
4281
4174
  "parameters": [
4282
4175
  {
4283
- "name": "rows",
4176
+ "name": "conditions",
4284
4177
  "type": {
4285
- "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
4178
+ "text": "ConditionNode[]"
4286
4179
  }
4287
4180
  }
4288
4181
  ]
4289
4182
  },
4290
4183
  {
4291
4184
  "kind": "method",
4292
- "name": "tryPlayServerSound",
4293
- "privacy": "private",
4185
+ "name": "parseRawExpression",
4186
+ "static": true,
4294
4187
  "return": {
4295
4188
  "type": {
4296
- "text": "Promise<boolean>"
4189
+ "text": "ConditionNode[] | null"
4297
4190
  }
4298
4191
  },
4299
4192
  "parameters": [
4300
4193
  {
4301
- "name": "dynamicRuleId",
4194
+ "name": "rawExpression",
4302
4195
  "type": {
4303
4196
  "text": "string"
4304
4197
  }
4305
4198
  }
4306
4199
  ]
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
+ ]
4307
4222
  },
4308
4223
  {
4309
4224
  "kind": "method",
4310
- "name": "fetchAndCacheServerSound",
4225
+ "name": "buildRightValue",
4311
4226
  "privacy": "private",
4312
- "return": {
4313
- "type": {
4314
- "text": "Promise<boolean>"
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
4315
4241
  }
4316
- },
4242
+ ]
4243
+ },
4244
+ {
4245
+ "kind": "method",
4246
+ "name": "getConditions",
4247
+ "static": true,
4317
4248
  "parameters": [
4318
4249
  {
4319
- "name": "dynamicRuleId",
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"
4265
+ }
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,
4280
+ "parameters": [
4281
+ {
4282
+ "name": "logicalOperator",
4320
4283
  "type": {
4321
- "text": "string"
4284
+ "text": "LogicalOperator"
4322
4285
  }
4286
+ },
4287
+ {
4288
+ "name": "condition"
4289
+ }
4290
+ ]
4291
+ },
4292
+ {
4293
+ "kind": "method",
4294
+ "name": "getConditions",
4295
+ "static": true,
4296
+ "parameters": [
4297
+ {
4298
+ "name": "conditions"
4323
4299
  }
4324
4300
  ]
4325
4301
  }
4326
- ],
4327
- "attributes": [
4302
+ ]
4303
+ },
4304
+ {
4305
+ "kind": "function",
4306
+ "name": "showNotificationError",
4307
+ "parameters": [
4328
4308
  {
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"
4309
+ "name": "error"
4336
4310
  }
4337
- ],
4338
- "superclass": {
4339
- "name": "GenesisElement",
4340
- "package": "@genesislcap/web-core"
4341
- },
4342
- "tagName": "foundation-sounds",
4343
- "customElement": true
4311
+ ]
4344
4312
  }
4345
4313
  ],
4346
4314
  "exports": [
4347
4315
  {
4348
4316
  "kind": "js",
4349
- "name": "FoundationSounds",
4317
+ "name": "UUIDGenerator",
4350
4318
  "declaration": {
4351
- "name": "FoundationSounds",
4352
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
4319
+ "name": "UUIDGenerator",
4320
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4353
4321
  }
4354
4322
  },
4355
4323
  {
4356
- "kind": "custom-element-definition",
4357
- "name": "foundation-sounds",
4324
+ "kind": "js",
4325
+ "name": "isEmpty",
4358
4326
  "declaration": {
4359
- "name": "FoundationSounds",
4360
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
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",
4350
+ "declaration": {
4351
+ "name": "RuleUtils",
4352
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4353
+ }
4354
+ },
4355
+ {
4356
+ "kind": "js",
4357
+ "name": "showNotificationError",
4358
+ "declaration": {
4359
+ "name": "showNotificationError",
4360
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4361
4361
  }
4362
4362
  }
4363
4363
  ]