@genesislcap/pbc-notify-ui 15.76.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,926 +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"
3627
+ },
3628
+ {
3629
+ "kind": "field",
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)."
3529
3636
  },
3530
3637
  {
3531
3638
  "kind": "field",
3532
- "name": "createEmptyGroup",
3533
- "static": true
3639
+ "name": "clearAlertSound",
3640
+ "type": {
3641
+ "text": "boolean"
3642
+ },
3643
+ "default": "false"
3534
3644
  },
3535
3645
  {
3536
- "kind": "method",
3537
- "name": "buildRawExpression",
3538
- "static": true,
3539
- "return": {
3540
- "type": {
3541
- "text": "string"
3542
- }
3646
+ "kind": "field",
3647
+ "name": "testAudio",
3648
+ "type": {
3649
+ "text": "HTMLAudioElement | null"
3543
3650
  },
3544
- "parameters": [
3545
- {
3546
- "name": "conditions",
3547
- "type": {
3548
- "text": "ConditionNode[]"
3549
- }
3550
- }
3551
- ]
3651
+ "default": "null",
3652
+ "description": "In-progress Test playback; not private — mixin return type is exported."
3552
3653
  },
3553
3654
  {
3554
3655
  "kind": "method",
3555
- "name": "parseRawExpression",
3556
- "static": true,
3557
- "return": {
3558
- "type": {
3559
- "text": "ConditionNode[] | null"
3560
- }
3561
- },
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": [
3739
3793
  {
3740
- "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`"
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
+ },
3828
+ {
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]"
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."
3978
+ "name": "createEmptyCondition",
3979
+ "static": true
3850
3980
  },
3851
3981
  {
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
- ]
3982
+ "kind": "field",
3983
+ "name": "createAssignment",
3984
+ "static": true
3873
3985
  },
3874
3986
  {
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
- ]
3987
+ "kind": "field",
3988
+ "name": "createPlaceholderAssignment",
3989
+ "static": true
3896
3990
  },
3897
3991
  {
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
- ]
3992
+ "kind": "field",
3993
+ "name": "createTextAssignment",
3994
+ "static": true
3919
3995
  },
3920
3996
  {
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
- ]
3997
+ "kind": "field",
3998
+ "name": "getAssignmentValue",
3999
+ "static": true
3936
4000
  },
3937
4001
  {
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
- ]
4002
+ "kind": "field",
4003
+ "name": "getAssignmentText",
4004
+ "static": true
3953
4005
  },
3954
4006
  {
3955
4007
  "kind": "method",
3956
- "name": "clearSound",
4008
+ "name": "createConditions",
4009
+ "static": true,
3957
4010
  "return": {
3958
4011
  "type": {
3959
- "text": "boolean"
4012
+ "text": "any"
3960
4013
  }
3961
4014
  },
3962
4015
  "parameters": [
3963
4016
  {
3964
- "name": "index",
4017
+ "name": "conditions",
3965
4018
  "type": {
3966
- "text": "number"
4019
+ "text": "ConditionNode[]"
3967
4020
  }
4021
+ },
4022
+ {
4023
+ "name": "parameters",
4024
+ "optional": true
3968
4025
  }
3969
4026
  ]
3970
4027
  },
3971
4028
  {
3972
4029
  "kind": "method",
3973
- "name": "testSound",
4030
+ "name": "hasMultiValueCondition",
4031
+ "static": true,
3974
4032
  "return": {
3975
4033
  "type": {
3976
4034
  "text": "boolean"
@@ -3978,16 +4036,17 @@
3978
4036
  },
3979
4037
  "parameters": [
3980
4038
  {
3981
- "name": "index",
4039
+ "name": "conditions",
3982
4040
  "type": {
3983
- "text": "number"
4041
+ "text": "ConditionNode[]"
3984
4042
  }
3985
4043
  }
3986
4044
  ]
3987
4045
  },
3988
4046
  {
3989
4047
  "kind": "method",
3990
- "name": "toggleRuleMute",
4048
+ "name": "hasOrJoin",
4049
+ "static": true,
3991
4050
  "return": {
3992
4051
  "type": {
3993
4052
  "text": "boolean"
@@ -3995,16 +4054,17 @@
3995
4054
  },
3996
4055
  "parameters": [
3997
4056
  {
3998
- "name": "index",
4057
+ "name": "conditions",
3999
4058
  "type": {
4000
- "text": "number"
4059
+ "text": "ConditionNode[]"
4001
4060
  }
4002
4061
  }
4003
4062
  ]
4004
4063
  },
4005
4064
  {
4006
4065
  "kind": "method",
4007
- "name": "onVolumeChange",
4066
+ "name": "hasGroup",
4067
+ "static": true,
4008
4068
  "return": {
4009
4069
  "type": {
4010
4070
  "text": "boolean"
@@ -4012,34 +4072,17 @@
4012
4072
  },
4013
4073
  "parameters": [
4014
4074
  {
4015
- "name": "event",
4075
+ "name": "conditions",
4016
4076
  "type": {
4017
- "text": "Event"
4077
+ "text": "ConditionNode[]"
4018
4078
  }
4019
4079
  }
4020
4080
  ]
4021
4081
  },
4022
4082
  {
4023
4083
  "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",
4084
+ "name": "hasUnsupportedOperator",
4085
+ "static": true,
4043
4086
  "return": {
4044
4087
  "type": {
4045
4088
  "text": "boolean"
@@ -4047,317 +4090,274 @@
4047
4090
  },
4048
4091
  "parameters": [
4049
4092
  {
4050
- "name": "index",
4093
+ "name": "conditions",
4051
4094
  "type": {
4052
- "text": "number"
4095
+ "text": "ConditionNode[]"
4053
4096
  }
4054
4097
  }
4055
4098
  ]
4056
4099
  },
4057
4100
  {
4058
4101
  "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",
4102
+ "name": "hasCurrentUser",
4103
+ "static": true,
4081
4104
  "return": {
4082
4105
  "type": {
4083
- "text": "Promise<void>"
4106
+ "text": "boolean"
4084
4107
  }
4085
4108
  },
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"
4109
+ "parameters": [
4110
+ {
4111
+ "name": "conditions",
4112
+ "type": {
4113
+ "text": "ConditionNode[]"
4114
+ }
4095
4115
  }
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...\"."
4116
+ ]
4098
4117
  },
4099
4118
  {
4100
4119
  "kind": "method",
4101
- "name": "mapRules",
4102
- "privacy": "private",
4120
+ "name": "flattenConditions",
4121
+ "static": true,
4103
4122
  "return": {
4104
4123
  "type": {
4105
- "text": "AlertSoundSelectableRule[]"
4124
+ "text": "ConditionBuilderEntity[]"
4106
4125
  }
4107
4126
  },
4108
4127
  "parameters": [
4109
4128
  {
4110
- "name": "ruleList",
4129
+ "name": "conditions",
4111
4130
  "type": {
4112
- "text": "NamedRuleRow[]"
4131
+ "text": "ConditionNode[]"
4113
4132
  }
4114
4133
  }
4115
4134
  ]
4116
4135
  },
4117
4136
  {
4118
4137
  "kind": "method",
4119
- "name": "ruleMatchId",
4120
- "privacy": "private",
4138
+ "name": "resolveLeftValues",
4139
+ "static": true,
4121
4140
  "return": {
4122
4141
  "type": {
4123
- "text": "string"
4142
+ "text": "ConditionNode[]"
4124
4143
  }
4125
4144
  },
4126
4145
  "parameters": [
4127
4146
  {
4128
- "name": "rule",
4147
+ "name": "conditions",
4129
4148
  "type": {
4130
- "text": "NamedRuleRow | undefined"
4149
+ "text": "ConditionNode[]"
4150
+ }
4151
+ },
4152
+ {
4153
+ "name": "fields",
4154
+ "type": {
4155
+ "text": "any[]"
4131
4156
  }
4132
4157
  }
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
- }
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
  ]
@@ -5946,183 +5946,40 @@
5946
5946
  "kind": "js",
5947
5947
  "name": "SEVERITY_INFORMATION",
5948
5948
  "declaration": {
5949
- "name": "SEVERITY_INFORMATION",
5950
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5951
- }
5952
- },
5953
- {
5954
- "kind": "js",
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"
5949
+ "name": "SEVERITY_INFORMATION",
5950
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6013
5951
  }
6014
5952
  },
6015
5953
  {
6016
5954
  "kind": "js",
6017
- "name": "FoundationInboxCounterStyles",
5955
+ "name": "SEVERITY_CRITICAL",
6018
5956
  "declaration": {
6019
- "name": "FoundationInboxCounterStyles",
6020
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.styles.ts"
5957
+ "name": "SEVERITY_CRITICAL",
5958
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6021
5959
  }
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": [
5960
+ },
6036
5961
  {
6037
5962
  "kind": "js",
6038
- "name": "FoundationInboxCounterTemplate",
5963
+ "name": "SEVERITY_SERIOUS",
6039
5964
  "declaration": {
6040
- "name": "FoundationInboxCounterTemplate",
6041
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.template.ts"
5965
+ "name": "SEVERITY_SERIOUS",
5966
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6042
5967
  }
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": [
5968
+ },
6112
5969
  {
6113
5970
  "kind": "js",
6114
- "name": "FoundationInboxCounter",
5971
+ "name": "SEVERITY_WARNING",
6115
5972
  "declaration": {
6116
- "name": "FoundationInboxCounter",
6117
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts"
5973
+ "name": "SEVERITY_WARNING",
5974
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6118
5975
  }
6119
5976
  },
6120
5977
  {
6121
- "kind": "custom-element-definition",
6122
- "name": "foundation-inbox-counter",
5978
+ "kind": "js",
5979
+ "name": "ALL_SEVERITIES",
6123
5980
  "declaration": {
6124
- "name": "FoundationInboxCounter",
6125
- "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts"
5981
+ "name": "ALL_SEVERITIES",
5982
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
6126
5983
  }
6127
5984
  }
6128
5985
  ]
@@ -7452,75 +7309,218 @@
7452
7309
  }
7453
7310
  },
7454
7311
  {
7455
- "name": "hide-date-range",
7312
+ "name": "hide-date-range",
7313
+ "type": {
7314
+ "text": "boolean"
7315
+ },
7316
+ "default": "false",
7317
+ "description": "Hide the Date Range filter block in the search bar. Set via the `hide-date-range`\nattribute or property. @public",
7318
+ "fieldName": "hideDateRange",
7319
+ "inheritedFrom": {
7320
+ "name": "FoundationInboxBase",
7321
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
7322
+ }
7323
+ },
7324
+ {
7325
+ "name": "hide-title-search",
7326
+ "type": {
7327
+ "text": "boolean"
7328
+ },
7329
+ "default": "false",
7330
+ "description": "Hide the Search-by-Title field in the search bar. Set via the `hide-title-search`\nattribute or property. @public",
7331
+ "fieldName": "hideTitleSearch",
7332
+ "inheritedFrom": {
7333
+ "name": "FoundationInboxBase",
7334
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
7335
+ }
7336
+ },
7337
+ {
7338
+ "name": "hide-body-search",
7339
+ "type": {
7340
+ "text": "boolean"
7341
+ },
7342
+ "default": "false",
7343
+ "description": "Hide the Search-by-Body field in the search bar. Set via the `hide-body-search`\nattribute or property. @public",
7344
+ "fieldName": "hideBodySearch",
7345
+ "inheritedFrom": {
7346
+ "name": "FoundationInboxBase",
7347
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
7348
+ }
7349
+ },
7350
+ {
7351
+ "name": "hide-clear-all",
7352
+ "type": {
7353
+ "text": "boolean"
7354
+ },
7355
+ "default": "false",
7356
+ "description": "Hide the Clear All Alerts button on the Alerts tab. Set via the `hide-clear-all`\nattribute or property. Per-item dismiss is unchanged. @public",
7357
+ "fieldName": "hideClearAll",
7358
+ "inheritedFrom": {
7359
+ "name": "FoundationInboxBase",
7360
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
7361
+ }
7362
+ }
7363
+ ]
7364
+ }
7365
+ ],
7366
+ "exports": [
7367
+ {
7368
+ "kind": "js",
7369
+ "name": "FoundationInboxFlyout",
7370
+ "declaration": {
7371
+ "name": "FoundationInboxFlyout",
7372
+ "module": "src/components/foundation-inbox/components/foundation-inbox-flyout/foundation-inbox-flyout.ts"
7373
+ }
7374
+ },
7375
+ {
7376
+ "kind": "custom-element-definition",
7377
+ "name": "foundation-inbox-flyout",
7378
+ "declaration": {
7379
+ "name": "FoundationInboxFlyout",
7380
+ "module": "src/components/foundation-inbox/components/foundation-inbox-flyout/foundation-inbox-flyout.ts"
7381
+ }
7382
+ }
7383
+ ]
7384
+ },
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
7456
  "type": {
7457
- "text": "boolean"
7457
+ "text": "number"
7458
7458
  },
7459
- "default": "false",
7460
- "description": "Hide the Date Range filter block in the search bar. Set via the `hide-date-range`\nattribute or property. @public",
7461
- "fieldName": "hideDateRange",
7462
- "inheritedFrom": {
7463
- "name": "FoundationInboxBase",
7464
- "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
7465
- }
7459
+ "default": "0"
7466
7460
  },
7467
7461
  {
7468
- "name": "hide-title-search",
7462
+ "kind": "field",
7463
+ "name": "connect",
7469
7464
  "type": {
7470
- "text": "boolean"
7471
- },
7472
- "default": "false",
7473
- "description": "Hide the Search-by-Title field in the search bar. Set via the `hide-title-search`\nattribute or property. @public",
7474
- "fieldName": "hideTitleSearch",
7475
- "inheritedFrom": {
7476
- "name": "FoundationInboxBase",
7477
- "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
7465
+ "text": "Connect"
7478
7466
  }
7479
7467
  },
7480
7468
  {
7481
- "name": "hide-body-search",
7469
+ "kind": "field",
7470
+ "name": "inboxService",
7482
7471
  "type": {
7483
- "text": "boolean"
7484
- },
7485
- "default": "false",
7486
- "description": "Hide the Search-by-Body field in the search bar. Set via the `hide-body-search`\nattribute or property. @public",
7487
- "fieldName": "hideBodySearch",
7488
- "inheritedFrom": {
7489
- "name": "FoundationInboxBase",
7490
- "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
7472
+ "text": "FoundationInboxService"
7491
7473
  }
7492
7474
  },
7493
7475
  {
7494
- "name": "hide-clear-all",
7476
+ "kind": "field",
7477
+ "name": "connectionSub",
7495
7478
  "type": {
7496
- "text": "boolean"
7479
+ "text": "Subscription"
7497
7480
  },
7498
- "default": "false",
7499
- "description": "Hide the Clear All Alerts button on the Alerts tab. Set via the `hide-clear-all`\nattribute or property. Per-item dismiss is unchanged. @public",
7500
- "fieldName": "hideClearAll",
7501
- "inheritedFrom": {
7502
- "name": "FoundationInboxBase",
7503
- "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
7504
- }
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"
7505
7499
  }
7506
- ]
7500
+ ],
7501
+ "superclass": {
7502
+ "name": "GenesisElement",
7503
+ "package": "@genesislcap/web-core"
7504
+ },
7505
+ "tagName": "foundation-inbox-counter",
7506
+ "customElement": true
7507
7507
  }
7508
7508
  ],
7509
7509
  "exports": [
7510
7510
  {
7511
7511
  "kind": "js",
7512
- "name": "FoundationInboxFlyout",
7512
+ "name": "FoundationInboxCounter",
7513
7513
  "declaration": {
7514
- "name": "FoundationInboxFlyout",
7515
- "module": "src/components/foundation-inbox/components/foundation-inbox-flyout/foundation-inbox-flyout.ts"
7514
+ "name": "FoundationInboxCounter",
7515
+ "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts"
7516
7516
  }
7517
7517
  },
7518
7518
  {
7519
7519
  "kind": "custom-element-definition",
7520
- "name": "foundation-inbox-flyout",
7520
+ "name": "foundation-inbox-counter",
7521
7521
  "declaration": {
7522
- "name": "FoundationInboxFlyout",
7523
- "module": "src/components/foundation-inbox/components/foundation-inbox-flyout/foundation-inbox-flyout.ts"
7522
+ "name": "FoundationInboxCounter",
7523
+ "module": "src/components/foundation-inbox/components/foundation-inbox-counter/foundation-inbox-counter.ts"
7524
7524
  }
7525
7525
  }
7526
7526
  ]
@@ -10509,284 +10509,126 @@
10509
10509
  "kind": "field",
10510
10510
  "name": "sourceSelected",
10511
10511
  "type": {
10512
- "text": "string"
10513
- }
10514
- },
10515
- {
10516
- "kind": "field",
10517
- "name": "sourceTyped",
10518
- "type": {
10519
- "text": "string"
10520
- }
10521
- },
10522
- {
10523
- "kind": "field",
10524
- "name": "sourceTextField",
10525
- "type": {
10526
- "text": "TextField"
10527
- }
10528
- },
10529
- {
10530
- "kind": "field",
10531
- "name": "sourceSelect",
10532
- "type": {
10533
- "text": "Select"
10534
- }
10535
- },
10536
- {
10537
- "kind": "field",
10538
- "name": "reqRepItems",
10539
- "type": {
10540
- "text": "array"
10541
- },
10542
- "default": "['REQUEST_1', 'REQUEST_2', 'REQUEST_3']"
10543
- },
10544
- {
10545
- "kind": "method",
10546
- "name": "deleteParameter"
10547
- },
10548
- {
10549
- "kind": "method",
10550
- "name": "parameterChanged"
10551
- },
10552
- {
10553
- "kind": "method",
10554
- "name": "nameChanged"
10555
- },
10556
- {
10557
- "kind": "method",
10558
- "name": "labelChanged"
10559
- },
10560
- {
10561
- "kind": "method",
10562
- "name": "typeChanged"
10563
- },
10564
- {
10565
- "kind": "method",
10566
- "name": "sourceTypeChanged"
10567
- },
10568
- {
10569
- "kind": "method",
10570
- "name": "sourceSelectedChanged"
10571
- },
10572
- {
10573
- "kind": "method",
10574
- "name": "sourceTypedChanged"
10575
- },
10576
- {
10577
- "kind": "method",
10578
- "name": "genericChanged",
10579
- "privacy": "private",
10580
- "parameters": [
10581
- {
10582
- "name": "parameterAttribute"
10583
- },
10584
- {
10585
- "name": "value"
10586
- }
10587
- ]
10588
- }
10589
- ],
10590
- "events": [
10591
- {
10592
- "description": "Fired when a parameter is deleted. detail: `ParameterBuilderEntity`",
10593
- "name": "delete"
10594
- },
10595
- {
10596
- "description": "Fired when a parameter is edited. detail: `ParameterBuilderEntity`",
10597
- "name": "edit"
10598
- }
10599
- ],
10600
- "attributes": [
10601
- {
10602
- "name": "parameter",
10603
- "type": {
10604
- "text": "ParameterBuilderEntity"
10605
- },
10606
- "fieldName": "parameter"
10607
- }
10608
- ],
10609
- "superclass": {
10610
- "name": "GenesisElement",
10611
- "package": "@genesislcap/web-core"
10612
- },
10613
- "tagName": "parameter-builder",
10614
- "customElement": true
10615
- }
10616
- ],
10617
- "exports": [
10618
- {
10619
- "kind": "js",
10620
- "name": "ParameterBuilder",
10621
- "declaration": {
10622
- "name": "ParameterBuilder",
10623
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
10624
- }
10625
- },
10626
- {
10627
- "kind": "custom-element-definition",
10628
- "name": "parameter-builder",
10629
- "declaration": {
10630
- "name": "ParameterBuilder",
10631
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
10632
- }
10633
- }
10634
- ]
10635
- },
10636
- {
10637
- "kind": "javascript-module",
10638
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts",
10639
- "declarations": [
10640
- {
10641
- "kind": "variable",
10642
- "name": "TemplateConditionGroupTemplate",
10643
- "default": "html<TemplateConditionGroup>`\n ${when(\n (x) => !x.isFirst,\n html`\n <div class=\"join-toggle-row\">\n <div class=\"join-toggle\">\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'AND'])}\"\n @click=${(x) => (x.joinOperator = 'AND')}\n >\n AND\n </span>\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'OR'])}\"\n @click=${(x) => (x.joinOperator = 'OR')}\n >\n OR\n </span>\n </div>\n </div>\n `,\n )}\n <div class=\"condition-group-row\">\n <div class=\"condition-group-box\">\n ${repeat(\n (x) => x.groupChildren,\n html<ConditionNode, TemplateConditionGroup>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <template-condition-group\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></template-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <template-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></template-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>+ Group</rapid-button>\n <rapid-button appearance=\"icon\" class=\"delete-group\" @click=${(x) => x.deleteSelf()}>\n <rapid-icon variant=\"regular\" name=\"trash-alt\" size=\"lg\" part=\"icon\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n </div>\n`"
10644
- }
10645
- ],
10646
- "exports": [
10647
- {
10648
- "kind": "js",
10649
- "name": "TemplateConditionGroupTemplate",
10650
- "declaration": {
10651
- "name": "TemplateConditionGroupTemplate",
10652
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts"
10653
- }
10654
- }
10655
- ]
10656
- },
10657
- {
10658
- "kind": "javascript-module",
10659
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts",
10660
- "declarations": [
10661
- {
10662
- "kind": "class",
10663
- "description": "Parenthesized group of conditions/nested groups for notification template\ncriteria - see rule-condition-group for the rationale. Also forwards\n:parameters down to nested template-condition-builder rows so parameter\nbinding (USER_ENTRY) keeps working inside a group.",
10664
- "name": "TemplateConditionGroup",
10665
- "members": [
10666
- {
10667
- "kind": "field",
10668
- "name": "node",
10669
- "type": {
10670
- "text": "ConditionGroupEntity"
10671
- }
10672
- },
10673
- {
10674
- "kind": "field",
10675
- "name": "fields",
10676
- "type": {
10677
- "text": "Field[]"
10678
- },
10679
- "default": "[]"
10512
+ "text": "string"
10513
+ }
10680
10514
  },
10681
10515
  {
10682
10516
  "kind": "field",
10683
- "name": "parameters",
10517
+ "name": "sourceTyped",
10684
10518
  "type": {
10685
- "text": "Array<ParameterBuilderEntity>"
10686
- },
10687
- "default": "[]"
10519
+ "text": "string"
10520
+ }
10688
10521
  },
10689
10522
  {
10690
10523
  "kind": "field",
10691
- "name": "isFirst",
10524
+ "name": "sourceTextField",
10692
10525
  "type": {
10693
- "text": "boolean"
10694
- },
10695
- "default": "false"
10526
+ "text": "TextField"
10527
+ }
10696
10528
  },
10697
10529
  {
10698
10530
  "kind": "field",
10699
- "name": "joinOperator",
10531
+ "name": "sourceSelect",
10700
10532
  "type": {
10701
- "text": "string"
10533
+ "text": "Select"
10702
10534
  }
10703
10535
  },
10704
10536
  {
10705
10537
  "kind": "field",
10706
- "name": "groupChildren",
10538
+ "name": "reqRepItems",
10707
10539
  "type": {
10708
- "text": "ConditionNode[]"
10540
+ "text": "array"
10709
10541
  },
10710
- "default": "[]"
10542
+ "default": "['REQUEST_1', 'REQUEST_2', 'REQUEST_3']"
10711
10543
  },
10712
10544
  {
10713
10545
  "kind": "method",
10714
- "name": "nodeChanged"
10546
+ "name": "deleteParameter"
10715
10547
  },
10716
10548
  {
10717
10549
  "kind": "method",
10718
- "name": "joinOperatorChanged"
10550
+ "name": "parameterChanged"
10719
10551
  },
10720
10552
  {
10721
10553
  "kind": "method",
10722
- "name": "newCondition"
10554
+ "name": "nameChanged"
10723
10555
  },
10724
10556
  {
10725
10557
  "kind": "method",
10726
- "name": "newGroup"
10558
+ "name": "labelChanged"
10727
10559
  },
10728
10560
  {
10729
10561
  "kind": "method",
10730
- "name": "editChild",
10731
- "parameters": [
10732
- {
10733
- "name": "_editedChild",
10734
- "type": {
10735
- "text": "ConditionNode"
10736
- }
10737
- }
10738
- ]
10562
+ "name": "typeChanged"
10739
10563
  },
10740
10564
  {
10741
10565
  "kind": "method",
10742
- "name": "deleteChild",
10566
+ "name": "sourceTypeChanged"
10567
+ },
10568
+ {
10569
+ "kind": "method",
10570
+ "name": "sourceSelectedChanged"
10571
+ },
10572
+ {
10573
+ "kind": "method",
10574
+ "name": "sourceTypedChanged"
10575
+ },
10576
+ {
10577
+ "kind": "method",
10578
+ "name": "genericChanged",
10579
+ "privacy": "private",
10743
10580
  "parameters": [
10744
10581
  {
10745
- "name": "deletedChild",
10746
- "type": {
10747
- "text": "ConditionNode"
10748
- }
10582
+ "name": "parameterAttribute"
10583
+ },
10584
+ {
10585
+ "name": "value"
10749
10586
  }
10750
10587
  ]
10751
- },
10752
- {
10753
- "kind": "method",
10754
- "name": "deleteSelf"
10755
10588
  }
10756
10589
  ],
10757
10590
  "events": [
10758
10591
  {
10759
- "description": "Fired when this whole group should be removed",
10592
+ "description": "Fired when a parameter is deleted. detail: `ParameterBuilderEntity`",
10760
10593
  "name": "delete"
10761
10594
  },
10762
10595
  {
10763
- "description": "Fired when anything inside this group changes",
10596
+ "description": "Fired when a parameter is edited. detail: `ParameterBuilderEntity`",
10764
10597
  "name": "edit"
10765
10598
  }
10766
10599
  ],
10600
+ "attributes": [
10601
+ {
10602
+ "name": "parameter",
10603
+ "type": {
10604
+ "text": "ParameterBuilderEntity"
10605
+ },
10606
+ "fieldName": "parameter"
10607
+ }
10608
+ ],
10767
10609
  "superclass": {
10768
10610
  "name": "GenesisElement",
10769
10611
  "package": "@genesislcap/web-core"
10770
10612
  },
10771
- "tagName": "template-condition-group",
10613
+ "tagName": "parameter-builder",
10772
10614
  "customElement": true
10773
10615
  }
10774
10616
  ],
10775
10617
  "exports": [
10776
10618
  {
10777
10619
  "kind": "js",
10778
- "name": "TemplateConditionGroup",
10620
+ "name": "ParameterBuilder",
10779
10621
  "declaration": {
10780
- "name": "TemplateConditionGroup",
10781
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
10622
+ "name": "ParameterBuilder",
10623
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
10782
10624
  }
10783
10625
  },
10784
10626
  {
10785
10627
  "kind": "custom-element-definition",
10786
- "name": "template-condition-group",
10628
+ "name": "parameter-builder",
10787
10629
  "declaration": {
10788
- "name": "TemplateConditionGroup",
10789
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
10630
+ "name": "ParameterBuilder",
10631
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
10790
10632
  }
10791
10633
  }
10792
10634
  ]
@@ -11074,6 +10916,164 @@
11074
10916
  }
11075
10917
  }
11076
10918
  ]
10919
+ },
10920
+ {
10921
+ "kind": "javascript-module",
10922
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts",
10923
+ "declarations": [
10924
+ {
10925
+ "kind": "variable",
10926
+ "name": "TemplateConditionGroupTemplate",
10927
+ "default": "html<TemplateConditionGroup>`\n ${when(\n (x) => !x.isFirst,\n html`\n <div class=\"join-toggle-row\">\n <div class=\"join-toggle\">\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'AND'])}\"\n @click=${(x) => (x.joinOperator = 'AND')}\n >\n AND\n </span>\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'OR'])}\"\n @click=${(x) => (x.joinOperator = 'OR')}\n >\n OR\n </span>\n </div>\n </div>\n `,\n )}\n <div class=\"condition-group-row\">\n <div class=\"condition-group-box\">\n ${repeat(\n (x) => x.groupChildren,\n html<ConditionNode, TemplateConditionGroup>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <template-condition-group\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></template-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <template-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></template-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>+ Group</rapid-button>\n <rapid-button appearance=\"icon\" class=\"delete-group\" @click=${(x) => x.deleteSelf()}>\n <rapid-icon variant=\"regular\" name=\"trash-alt\" size=\"lg\" part=\"icon\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n </div>\n`"
10928
+ }
10929
+ ],
10930
+ "exports": [
10931
+ {
10932
+ "kind": "js",
10933
+ "name": "TemplateConditionGroupTemplate",
10934
+ "declaration": {
10935
+ "name": "TemplateConditionGroupTemplate",
10936
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts"
10937
+ }
10938
+ }
10939
+ ]
10940
+ },
10941
+ {
10942
+ "kind": "javascript-module",
10943
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts",
10944
+ "declarations": [
10945
+ {
10946
+ "kind": "class",
10947
+ "description": "Parenthesized group of conditions/nested groups for notification template\ncriteria - see rule-condition-group for the rationale. Also forwards\n:parameters down to nested template-condition-builder rows so parameter\nbinding (USER_ENTRY) keeps working inside a group.",
10948
+ "name": "TemplateConditionGroup",
10949
+ "members": [
10950
+ {
10951
+ "kind": "field",
10952
+ "name": "node",
10953
+ "type": {
10954
+ "text": "ConditionGroupEntity"
10955
+ }
10956
+ },
10957
+ {
10958
+ "kind": "field",
10959
+ "name": "fields",
10960
+ "type": {
10961
+ "text": "Field[]"
10962
+ },
10963
+ "default": "[]"
10964
+ },
10965
+ {
10966
+ "kind": "field",
10967
+ "name": "parameters",
10968
+ "type": {
10969
+ "text": "Array<ParameterBuilderEntity>"
10970
+ },
10971
+ "default": "[]"
10972
+ },
10973
+ {
10974
+ "kind": "field",
10975
+ "name": "isFirst",
10976
+ "type": {
10977
+ "text": "boolean"
10978
+ },
10979
+ "default": "false"
10980
+ },
10981
+ {
10982
+ "kind": "field",
10983
+ "name": "joinOperator",
10984
+ "type": {
10985
+ "text": "string"
10986
+ }
10987
+ },
10988
+ {
10989
+ "kind": "field",
10990
+ "name": "groupChildren",
10991
+ "type": {
10992
+ "text": "ConditionNode[]"
10993
+ },
10994
+ "default": "[]"
10995
+ },
10996
+ {
10997
+ "kind": "method",
10998
+ "name": "nodeChanged"
10999
+ },
11000
+ {
11001
+ "kind": "method",
11002
+ "name": "joinOperatorChanged"
11003
+ },
11004
+ {
11005
+ "kind": "method",
11006
+ "name": "newCondition"
11007
+ },
11008
+ {
11009
+ "kind": "method",
11010
+ "name": "newGroup"
11011
+ },
11012
+ {
11013
+ "kind": "method",
11014
+ "name": "editChild",
11015
+ "parameters": [
11016
+ {
11017
+ "name": "_editedChild",
11018
+ "type": {
11019
+ "text": "ConditionNode"
11020
+ }
11021
+ }
11022
+ ]
11023
+ },
11024
+ {
11025
+ "kind": "method",
11026
+ "name": "deleteChild",
11027
+ "parameters": [
11028
+ {
11029
+ "name": "deletedChild",
11030
+ "type": {
11031
+ "text": "ConditionNode"
11032
+ }
11033
+ }
11034
+ ]
11035
+ },
11036
+ {
11037
+ "kind": "method",
11038
+ "name": "deleteSelf"
11039
+ }
11040
+ ],
11041
+ "events": [
11042
+ {
11043
+ "description": "Fired when this whole group should be removed",
11044
+ "name": "delete"
11045
+ },
11046
+ {
11047
+ "description": "Fired when anything inside this group changes",
11048
+ "name": "edit"
11049
+ }
11050
+ ],
11051
+ "superclass": {
11052
+ "name": "GenesisElement",
11053
+ "package": "@genesislcap/web-core"
11054
+ },
11055
+ "tagName": "template-condition-group",
11056
+ "customElement": true
11057
+ }
11058
+ ],
11059
+ "exports": [
11060
+ {
11061
+ "kind": "js",
11062
+ "name": "TemplateConditionGroup",
11063
+ "declaration": {
11064
+ "name": "TemplateConditionGroup",
11065
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
11066
+ }
11067
+ },
11068
+ {
11069
+ "kind": "custom-element-definition",
11070
+ "name": "template-condition-group",
11071
+ "declaration": {
11072
+ "name": "TemplateConditionGroup",
11073
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
11074
+ }
11075
+ }
11076
+ ]
11077
11077
  }
11078
11078
  ]
11079
11079
  }