@genesislcap/pbc-notify-ui 15.46.1 → 15.46.2-FUI-2625.1

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",
@@ -2840,19 +2840,54 @@
2840
2840
  },
2841
2841
  {
2842
2842
  "kind": "javascript-module",
2843
- "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
2843
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2844
2844
  "declarations": [
2845
2845
  {
2846
2846
  "kind": "variable",
2847
- "name": "alertSoundAttachmentTemplate",
2848
- "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`",
2849
- "description": "Shared Attach/Replace/Test/Clear UI for rule and template dialogs.",
2850
- "privacy": "public"
2851
- },
2847
+ "name": "FoundationSoundsPanelStyles",
2848
+ "default": "css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n width: 100%;\n }\n\n .sounds-controls {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n gap: 12px;\n padding: calc(var(--design-unit) * 3px);\n box-sizing: border-box;\n }\n\n .sounds-help-disclosure {\n flex: 0 0 auto;\n }\n\n .sounds-help-toggle {\n margin-inline-start: calc(var(--design-unit) * 1px);\n }\n\n .sounds-help-toggle::before {\n content: '+';\n }\n\n .sounds-help-disclosure[expanded] .sounds-help-toggle::before {\n content: '−';\n }\n\n .sounds-help {\n margin: 0;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n text-align: left;\n }\n\n .volume-row {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: calc(var(--design-unit) * 2px);\n min-width: 0;\n }\n\n .volume-icon {\n flex: 0 0 auto;\n }\n\n .volume-label {\n flex: 0 0 auto;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .volume-slider {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .volume-percent {\n flex: 0 0 auto;\n min-width: 3ch;\n text-align: end;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .mute-all {\n flex: 0 0 auto;\n margin: 0;\n }\n\n .sound-rules-panel {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n }\n\n .sound-rules {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .sound-rule {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n\n /* Keep absolute listboxes from being clipped by the card itself. */\n overflow: visible;\n }\n\n .sound-rule-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-weight: 700;\n font-size: var(--type-ramp-minus-1-font-size);\n }\n\n .sound-rule-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .sound-rule-label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .pattern-input,\n .match-mode-select,\n .rule-select,\n .sound-file-input {\n width: 100%;\n }\n\n /*\n * Anchor the listbox to the select host and use position:fixed so it escapes\n * .sound-rules-panel overflow:auto (and the rule card). Each select sets a\n * unique --sounds-select-anchor / anchor-name via inline style.\n * !important beats FAST's internal absolute top/bottom for [open] selects.\n */\n .match-mode-select[open]::part(listbox),\n .rule-select[open]::part(listbox) {\n position: fixed !important;\n /* stylelint-disable-next-line property-no-unknown -- CSS anchor positioning */\n position-anchor: var(--sounds-select-anchor);\n inset: auto !important;\n top: anchor(bottom) !important;\n left: anchor(left) !important;\n right: anchor(right) !important;\n bottom: auto !important;\n width: auto !important;\n margin-top: calc(var(--design-unit) * 1px);\n z-index: 10000;\n max-height: min(240px, 40vh);\n overflow-x: hidden;\n overflow-y: auto;\n box-shadow: 0 4px 16px rgb(0 0 0 / 24%);\n }\n\n .match-mode-select[open][position='above']::part(listbox),\n .rule-select[open][position='above']::part(listbox) {\n top: auto !important;\n bottom: anchor(top) !important;\n margin-top: 0;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .sound-file-row {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .sound-file-row .sound-file-input {\n flex: 1;\n min-width: 0;\n }\n\n .choose-sound {\n cursor: pointer;\n }\n\n .sound-rules-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex: 0 0 auto;\n gap: 8px;\n }\n\n .rule-count {\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .file-input {\n display: none;\n }\n\n ${scrollbarStyles}\n`"
2849
+ }
2850
+ ],
2851
+ "exports": [
2852
2852
  {
2853
- "kind": "mixin",
2854
- "description": "Mixin: pick / test / clear / load server sound + apply fields to submit payload.\n\nSubclasses must provide ruleService, isAlertSoundEditMode,\nalertSoundEntityId, and alertSoundCacheSyncMode.",
2855
- "name": "AlertSoundAttachmentMixin",
2853
+ "kind": "js",
2854
+ "name": "FoundationSoundsPanelStyles",
2855
+ "declaration": {
2856
+ "name": "FoundationSoundsPanelStyles",
2857
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
2858
+ }
2859
+ }
2860
+ ]
2861
+ },
2862
+ {
2863
+ "kind": "javascript-module",
2864
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
2865
+ "declarations": [
2866
+ {
2867
+ "kind": "variable",
2868
+ "name": "FoundationSoundsPanelTemplate",
2869
+ "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`"
2870
+ }
2871
+ ],
2872
+ "exports": [
2873
+ {
2874
+ "kind": "js",
2875
+ "name": "FoundationSoundsPanelTemplate",
2876
+ "declaration": {
2877
+ "name": "FoundationSoundsPanelTemplate",
2878
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
2879
+ }
2880
+ }
2881
+ ]
2882
+ },
2883
+ {
2884
+ "kind": "javascript-module",
2885
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
2886
+ "declarations": [
2887
+ {
2888
+ "kind": "class",
2889
+ "description": "Configures alert sound rules in the inbox Sounds tab. Persists via the shared\nAlertSoundPlayer; playback is handled by layout-mounted\nFoundationSounds.",
2890
+ "name": "FoundationSoundsPanel",
2856
2891
  "members": [
2857
2892
  {
2858
2893
  "kind": "field",
@@ -2863,56 +2898,21 @@
2863
2898
  },
2864
2899
  {
2865
2900
  "kind": "field",
2866
- "name": "isAlertSoundEditMode",
2867
- "type": {
2868
- "text": "boolean"
2869
- },
2870
- "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
2871
- "readonly": true
2872
- },
2873
- {
2874
- "kind": "field",
2875
- "name": "alertSoundEntityId",
2876
- "type": {
2877
- "text": "string | null"
2878
- },
2879
- "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
2880
- "readonly": true
2881
- },
2882
- {
2883
- "kind": "field",
2884
- "name": "alertSoundCacheSyncMode",
2885
- "type": {
2886
- "text": "'entity' | 'all'"
2887
- },
2888
- "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
2889
- "readonly": true
2890
- },
2891
- {
2892
- "kind": "field",
2893
- "name": "alertSoundFileName",
2894
- "type": {
2895
- "text": "string"
2896
- },
2897
- "default": "''",
2898
- "description": "Display name of the attached / pending alert sound file."
2899
- },
2900
- {
2901
- "kind": "field",
2902
- "name": "alertSoundMimeType",
2901
+ "name": "volumePercent",
2903
2902
  "type": {
2904
- "text": "string"
2903
+ "text": "number"
2905
2904
  },
2906
- "default": "''"
2905
+ "default": "100",
2906
+ "description": "Global playback volume 0–100. @internal"
2907
2907
  },
2908
2908
  {
2909
2909
  "kind": "field",
2910
- "name": "hasAlertSound",
2910
+ "name": "selectableRules",
2911
2911
  "type": {
2912
- "text": "boolean"
2912
+ "text": "AlertSoundSelectableRule[]"
2913
2913
  },
2914
- "default": "false",
2915
- "description": "True when edit loaded an existing server sound (or user attached one)."
2914
+ "default": "[]",
2915
+ "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
2916
2916
  },
2917
2917
  {
2918
2918
  "kind": "field",
@@ -2923,58 +2923,75 @@
2923
2923
  },
2924
2924
  {
2925
2925
  "kind": "field",
2926
- "name": "pendingAlertSoundData",
2926
+ "name": "pendingRuleIndex",
2927
2927
  "type": {
2928
- "text": "string | null"
2928
+ "text": "number | null"
2929
2929
  },
2930
+ "privacy": "private",
2930
2931
  "default": "null"
2931
2932
  },
2932
2933
  {
2933
2934
  "kind": "field",
2934
- "name": "alertSoundDirty",
2935
- "type": {
2936
- "text": "boolean"
2937
- },
2938
- "default": "false",
2939
- "description": "True when the user picked a new file this session (needs upload)."
2935
+ "name": "player",
2936
+ "privacy": "private",
2937
+ "readonly": true
2940
2938
  },
2941
2939
  {
2942
2940
  "kind": "field",
2943
- "name": "clearAlertSound",
2941
+ "name": "unsubscribePlayer",
2944
2942
  "type": {
2945
- "text": "boolean"
2943
+ "text": "(() => void) | undefined"
2946
2944
  },
2947
- "default": "false"
2945
+ "privacy": "private"
2948
2946
  },
2949
2947
  {
2950
2948
  "kind": "field",
2951
- "name": "testAudio",
2949
+ "name": "ignoreSelectChanges",
2952
2950
  "type": {
2953
- "text": "HTMLAudioElement | null"
2951
+ "text": "boolean"
2954
2952
  },
2955
- "default": "null",
2956
- "description": "In-progress Test playback; not private — mixin return type is exported."
2953
+ "privacy": "private",
2954
+ "default": "false",
2955
+ "description": "Suppresses select change events while options are rebuilt."
2957
2956
  },
2958
2957
  {
2959
2958
  "kind": "method",
2960
- "name": "loadExistingAlertSound",
2959
+ "name": "onMatchModeChange",
2960
+ "return": {
2961
+ "type": {
2962
+ "text": "boolean"
2963
+ }
2964
+ },
2961
2965
  "parameters": [
2962
2966
  {
2963
- "name": "dynamicRuleId",
2967
+ "name": "index",
2964
2968
  "type": {
2965
- "text": "string"
2969
+ "text": "number"
2970
+ }
2971
+ },
2972
+ {
2973
+ "name": "event",
2974
+ "type": {
2975
+ "text": "Event"
2966
2976
  }
2967
2977
  }
2968
2978
  ]
2969
2979
  },
2970
2980
  {
2971
2981
  "kind": "method",
2972
- "name": "openAlertSoundPicker"
2973
- },
2974
- {
2975
- "kind": "method",
2976
- "name": "onAlertSoundSelected",
2982
+ "name": "onPatternInput",
2983
+ "return": {
2984
+ "type": {
2985
+ "text": "boolean"
2986
+ }
2987
+ },
2977
2988
  "parameters": [
2989
+ {
2990
+ "name": "index",
2991
+ "type": {
2992
+ "text": "number"
2993
+ }
2994
+ },
2978
2995
  {
2979
2996
  "name": "event",
2980
2997
  "type": {
@@ -2985,354 +3002,81 @@
2985
3002
  },
2986
3003
  {
2987
3004
  "kind": "method",
2988
- "name": "clearAttachedAlertSound"
2989
- },
2990
- {
2991
- "kind": "method",
2992
- "name": "testAttachedAlertSound"
2993
- },
2994
- {
2995
- "kind": "method",
2996
- "name": "stopTestSound"
2997
- },
2998
- {
2999
- "kind": "method",
3000
- "name": "resetAlertSoundState"
3005
+ "name": "onRuleChange",
3006
+ "return": {
3007
+ "type": {
3008
+ "text": "boolean"
3009
+ }
3010
+ },
3011
+ "parameters": [
3012
+ {
3013
+ "name": "index",
3014
+ "type": {
3015
+ "text": "number"
3016
+ }
3017
+ },
3018
+ {
3019
+ "name": "event",
3020
+ "type": {
3021
+ "text": "Event"
3022
+ }
3023
+ }
3024
+ ]
3001
3025
  },
3002
3026
  {
3003
3027
  "kind": "method",
3004
- "name": "applyAlertSoundToPayload",
3028
+ "name": "openFilePicker",
3005
3029
  "return": {
3006
3030
  "type": {
3007
- "text": "T"
3031
+ "text": "boolean"
3008
3032
  }
3009
3033
  },
3010
3034
  "parameters": [
3011
3035
  {
3012
- "name": "target",
3036
+ "name": "index",
3013
3037
  "type": {
3014
- "text": "T"
3038
+ "text": "number"
3015
3039
  }
3016
3040
  }
3017
- ],
3018
- "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3041
+ ]
3019
3042
  },
3020
3043
  {
3021
3044
  "kind": "method",
3022
- "name": "syncAlertSoundCacheAfterSave",
3023
- "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."
3024
- }
3025
- ],
3026
- "parameters": [
3027
- {
3028
- "name": "Base",
3029
- "type": {
3030
- "text": "TBase"
3031
- }
3032
- }
3033
- ],
3034
- "privacy": "public"
3035
- }
3036
- ],
3037
- "exports": [
3038
- {
3039
- "kind": "js",
3040
- "name": "alertSoundAttachmentTemplate",
3041
- "declaration": {
3042
- "name": "alertSoundAttachmentTemplate",
3043
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3044
- }
3045
- },
3046
- {
3047
- "kind": "js",
3048
- "name": "AlertSoundAttachmentMixin",
3049
- "declaration": {
3050
- "name": "AlertSoundAttachmentMixin",
3051
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3052
- }
3053
- }
3054
- ]
3055
- },
3056
- {
3057
- "kind": "javascript-module",
3058
- "path": "src/components/foundation-notification-dashboard/index.ts",
3059
- "declarations": [],
3060
- "exports": [
3061
- {
3062
- "kind": "js",
3063
- "name": "*",
3064
- "declaration": {
3065
- "name": "*",
3066
- "package": "./notification-dashboard"
3067
- }
3068
- }
3069
- ]
3070
- },
3071
- {
3072
- "kind": "javascript-module",
3073
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
3074
- "declarations": [
3075
- {
3076
- "kind": "variable",
3077
- "name": "FoundationNotificationDashboardStyles",
3078
- "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`",
3079
- "privacy": "public"
3080
- }
3081
- ],
3082
- "exports": [
3083
- {
3084
- "kind": "js",
3085
- "name": "FoundationNotificationDashboardStyles",
3086
- "declaration": {
3087
- "name": "FoundationNotificationDashboardStyles",
3088
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
3089
- }
3090
- }
3091
- ]
3092
- },
3093
- {
3094
- "kind": "javascript-module",
3095
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
3096
- "declarations": [
3097
- {
3098
- "kind": "class",
3099
- "description": "",
3100
- "name": "NotificationDashboardTab",
3101
- "members": [
3102
- {
3103
- "kind": "field",
3104
- "name": "id",
3105
- "type": {
3106
- "text": "string"
3107
- }
3108
- },
3109
- {
3110
- "kind": "field",
3111
- "name": "name",
3112
- "type": {
3113
- "text": "string"
3114
- }
3115
- },
3116
- {
3117
- "kind": "field",
3118
- "name": "component",
3119
- "type": {
3120
- "text": "string"
3121
- }
3122
- },
3123
- {
3124
- "kind": "field",
3125
- "name": "right",
3126
- "type": {
3127
- "text": "string"
3128
- }
3129
- }
3130
- ]
3131
- },
3132
- {
3133
- "kind": "variable",
3134
- "name": "NOTIFICATION_DASHBOARD_TABS",
3135
- "type": {
3136
- "text": "NotificationDashboardTab[]"
3137
- },
3138
- "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]"
3139
- }
3140
- ],
3141
- "exports": [
3142
- {
3143
- "kind": "js",
3144
- "name": "NotificationDashboardTab",
3145
- "declaration": {
3146
- "name": "NotificationDashboardTab",
3147
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3148
- }
3149
- },
3150
- {
3151
- "kind": "js",
3152
- "name": "NOTIFICATION_DASHBOARD_TABS",
3153
- "declaration": {
3154
- "name": "NOTIFICATION_DASHBOARD_TABS",
3155
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3156
- }
3157
- }
3158
- ]
3159
- },
3160
- {
3161
- "kind": "javascript-module",
3162
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3163
- "declarations": [
3164
- {
3165
- "kind": "variable",
3166
- "name": "FoundationNotificationDashboardTemplate",
3167
- "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`"
3168
- }
3169
- ],
3170
- "exports": [
3171
- {
3172
- "kind": "js",
3173
- "name": "FoundationNotificationDashboardTemplate",
3174
- "declaration": {
3175
- "name": "FoundationNotificationDashboardTemplate",
3176
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3177
- }
3178
- }
3179
- ]
3180
- },
3181
- {
3182
- "kind": "javascript-module",
3183
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3184
- "declarations": [
3185
- {
3186
- "kind": "class",
3187
- "description": "",
3188
- "name": "FoundationNotificationDashboard",
3189
- "members": [
3190
- {
3191
- "kind": "field",
3192
- "name": "auth",
3193
- "type": {
3194
- "text": "Auth"
3195
- }
3196
- },
3197
- {
3198
- "kind": "field",
3199
- "name": "ready",
3200
- "type": {
3201
- "text": "boolean"
3202
- },
3203
- "default": "false"
3204
- },
3205
- {
3206
- "kind": "field",
3207
- "name": "hasPermissions",
3208
- "type": {
3209
- "text": "boolean"
3210
- },
3211
- "default": "true"
3212
- }
3213
- ],
3214
- "superclass": {
3215
- "name": "GenesisElement",
3216
- "package": "@genesislcap/web-core"
3217
- },
3218
- "tagName": "foundation-notification-dashboard",
3219
- "customElement": true
3220
- }
3221
- ],
3222
- "exports": [
3223
- {
3224
- "kind": "js",
3225
- "name": "FoundationNotificationDashboard",
3226
- "declaration": {
3227
- "name": "FoundationNotificationDashboard",
3228
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3229
- }
3230
- },
3231
- {
3232
- "kind": "custom-element-definition",
3233
- "name": "foundation-notification-dashboard",
3234
- "declaration": {
3235
- "name": "FoundationNotificationDashboard",
3236
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3237
- }
3238
- }
3239
- ]
3240
- },
3241
- {
3242
- "kind": "javascript-module",
3243
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3244
- "declarations": [
3245
- {
3246
- "kind": "class",
3247
- "description": "",
3248
- "name": "UUIDGenerator",
3249
- "members": [
3250
- {
3251
- "kind": "field",
3252
- "name": "uuid",
3253
- "type": {
3254
- "text": "UUID"
3045
+ "name": "onFileSelected",
3046
+ "return": {
3047
+ "type": {
3048
+ "text": "boolean"
3049
+ }
3255
3050
  },
3256
- "privacy": "private",
3257
- "static": true
3258
- },
3259
- {
3260
- "kind": "field",
3261
- "name": "createUUID",
3262
- "static": true
3263
- }
3264
- ]
3265
- },
3266
- {
3267
- "kind": "function",
3268
- "name": "isEmpty",
3269
- "parameters": [
3270
- {
3271
- "name": "value"
3272
- }
3273
- ]
3274
- },
3275
- {
3276
- "kind": "class",
3277
- "description": "",
3278
- "name": "DynamicRuleUtils",
3279
- "members": [
3280
- {
3281
- "kind": "field",
3282
- "name": "createEmptyCondition",
3283
- "static": true
3284
- },
3285
- {
3286
- "kind": "field",
3287
- "name": "createAssignment",
3288
- "static": true
3289
- },
3290
- {
3291
- "kind": "field",
3292
- "name": "createPlaceholderAssignment",
3293
- "static": true
3294
- },
3295
- {
3296
- "kind": "field",
3297
- "name": "createTextAssignment",
3298
- "static": true
3299
- },
3300
- {
3301
- "kind": "field",
3302
- "name": "getAssignmentValue",
3303
- "static": true
3304
- },
3305
- {
3306
- "kind": "field",
3307
- "name": "getAssignmentText",
3308
- "static": true
3051
+ "parameters": [
3052
+ {
3053
+ "name": "event",
3054
+ "type": {
3055
+ "text": "Event"
3056
+ }
3057
+ }
3058
+ ]
3309
3059
  },
3310
3060
  {
3311
3061
  "kind": "method",
3312
- "name": "createConditions",
3313
- "static": true,
3062
+ "name": "clearSound",
3314
3063
  "return": {
3315
3064
  "type": {
3316
- "text": "any"
3065
+ "text": "boolean"
3317
3066
  }
3318
3067
  },
3319
3068
  "parameters": [
3320
3069
  {
3321
- "name": "conditions",
3070
+ "name": "index",
3322
3071
  "type": {
3323
- "text": "ConditionNode[]"
3072
+ "text": "number"
3324
3073
  }
3325
- },
3326
- {
3327
- "name": "parameters",
3328
- "optional": true
3329
3074
  }
3330
3075
  ]
3331
3076
  },
3332
3077
  {
3333
3078
  "kind": "method",
3334
- "name": "hasMultiValueCondition",
3335
- "static": true,
3079
+ "name": "testSound",
3336
3080
  "return": {
3337
3081
  "type": {
3338
3082
  "text": "boolean"
@@ -3340,17 +3084,16 @@
3340
3084
  },
3341
3085
  "parameters": [
3342
3086
  {
3343
- "name": "conditions",
3087
+ "name": "index",
3344
3088
  "type": {
3345
- "text": "ConditionNode[]"
3089
+ "text": "number"
3346
3090
  }
3347
3091
  }
3348
3092
  ]
3349
3093
  },
3350
3094
  {
3351
3095
  "kind": "method",
3352
- "name": "hasOrJoin",
3353
- "static": true,
3096
+ "name": "toggleRuleMute",
3354
3097
  "return": {
3355
3098
  "type": {
3356
3099
  "text": "boolean"
@@ -3358,17 +3101,16 @@
3358
3101
  },
3359
3102
  "parameters": [
3360
3103
  {
3361
- "name": "conditions",
3104
+ "name": "index",
3362
3105
  "type": {
3363
- "text": "ConditionNode[]"
3106
+ "text": "number"
3364
3107
  }
3365
3108
  }
3366
3109
  ]
3367
3110
  },
3368
3111
  {
3369
3112
  "kind": "method",
3370
- "name": "hasGroup",
3371
- "static": true,
3113
+ "name": "onVolumeChange",
3372
3114
  "return": {
3373
3115
  "type": {
3374
3116
  "text": "boolean"
@@ -3376,17 +3118,34 @@
3376
3118
  },
3377
3119
  "parameters": [
3378
3120
  {
3379
- "name": "conditions",
3121
+ "name": "event",
3380
3122
  "type": {
3381
- "text": "ConditionNode[]"
3123
+ "text": "Event"
3382
3124
  }
3383
3125
  }
3384
3126
  ]
3385
3127
  },
3386
3128
  {
3387
3129
  "kind": "method",
3388
- "name": "hasUnsupportedOperator",
3389
- "static": true,
3130
+ "name": "toggleMute",
3131
+ "return": {
3132
+ "type": {
3133
+ "text": "boolean"
3134
+ }
3135
+ }
3136
+ },
3137
+ {
3138
+ "kind": "method",
3139
+ "name": "addRule",
3140
+ "return": {
3141
+ "type": {
3142
+ "text": "boolean"
3143
+ }
3144
+ }
3145
+ },
3146
+ {
3147
+ "kind": "method",
3148
+ "name": "removeRule",
3390
3149
  "return": {
3391
3150
  "type": {
3392
3151
  "text": "boolean"
@@ -3394,483 +3153,816 @@
3394
3153
  },
3395
3154
  "parameters": [
3396
3155
  {
3397
- "name": "conditions",
3156
+ "name": "index",
3398
3157
  "type": {
3399
- "text": "ConditionNode[]"
3158
+ "text": "number"
3400
3159
  }
3401
3160
  }
3402
3161
  ]
3403
3162
  },
3404
3163
  {
3405
3164
  "kind": "method",
3406
- "name": "hasCurrentUser",
3407
- "static": true,
3165
+ "name": "reloadRules",
3408
3166
  "return": {
3409
3167
  "type": {
3410
- "text": "boolean"
3168
+ "text": "Promise<void>"
3169
+ }
3170
+ },
3171
+ "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
3172
+ },
3173
+ {
3174
+ "kind": "method",
3175
+ "name": "loadRules",
3176
+ "privacy": "private",
3177
+ "return": {
3178
+ "type": {
3179
+ "text": "Promise<void>"
3180
+ }
3181
+ }
3182
+ },
3183
+ {
3184
+ "kind": "method",
3185
+ "name": "settleRuleOptions",
3186
+ "privacy": "private",
3187
+ "return": {
3188
+ "type": {
3189
+ "text": "Promise<void>"
3190
+ }
3191
+ },
3192
+ "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."
3193
+ },
3194
+ {
3195
+ "kind": "method",
3196
+ "name": "applyRuleSelectValues",
3197
+ "privacy": "private",
3198
+ "return": {
3199
+ "type": {
3200
+ "text": "void"
3201
+ }
3202
+ },
3203
+ "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...\"."
3204
+ },
3205
+ {
3206
+ "kind": "method",
3207
+ "name": "mapRules",
3208
+ "privacy": "private",
3209
+ "return": {
3210
+ "type": {
3211
+ "text": "AlertSoundSelectableRule[]"
3411
3212
  }
3412
3213
  },
3413
3214
  "parameters": [
3414
3215
  {
3415
- "name": "conditions",
3216
+ "name": "ruleList",
3416
3217
  "type": {
3417
- "text": "ConditionNode[]"
3218
+ "text": "NamedRuleRow[]"
3418
3219
  }
3419
3220
  }
3420
3221
  ]
3421
3222
  },
3422
3223
  {
3423
3224
  "kind": "method",
3424
- "name": "flattenConditions",
3425
- "static": true,
3225
+ "name": "ruleMatchId",
3226
+ "privacy": "private",
3426
3227
  "return": {
3427
3228
  "type": {
3428
- "text": "ConditionBuilderEntity[]"
3229
+ "text": "string"
3429
3230
  }
3430
3231
  },
3431
3232
  "parameters": [
3432
3233
  {
3433
- "name": "conditions",
3234
+ "name": "rule",
3434
3235
  "type": {
3435
- "text": "ConditionNode[]"
3236
+ "text": "NamedRuleRow | undefined"
3436
3237
  }
3437
3238
  }
3438
- ]
3239
+ ]
3240
+ },
3241
+ {
3242
+ "kind": "method",
3243
+ "name": "syncSoundState",
3244
+ "privacy": "private"
3245
+ }
3246
+ ],
3247
+ "superclass": {
3248
+ "name": "GenesisElement",
3249
+ "package": "@genesislcap/web-core"
3250
+ },
3251
+ "tagName": "foundation-sounds-panel",
3252
+ "customElement": true
3253
+ }
3254
+ ],
3255
+ "exports": [
3256
+ {
3257
+ "kind": "js",
3258
+ "name": "FoundationSoundsPanel",
3259
+ "declaration": {
3260
+ "name": "FoundationSoundsPanel",
3261
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3262
+ }
3263
+ },
3264
+ {
3265
+ "kind": "custom-element-definition",
3266
+ "name": "foundation-sounds-panel",
3267
+ "declaration": {
3268
+ "name": "FoundationSoundsPanel",
3269
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3270
+ }
3271
+ }
3272
+ ]
3273
+ },
3274
+ {
3275
+ "kind": "javascript-module",
3276
+ "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
3277
+ "declarations": [
3278
+ {
3279
+ "kind": "variable",
3280
+ "name": "FoundationSoundsStyles",
3281
+ "default": "css`\n :host {\n display: none;\n }\n`",
3282
+ "description": "Headless layout listener — take no space in the layout chrome."
3283
+ }
3284
+ ],
3285
+ "exports": [
3286
+ {
3287
+ "kind": "js",
3288
+ "name": "FoundationSoundsStyles",
3289
+ "declaration": {
3290
+ "name": "FoundationSoundsStyles",
3291
+ "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
3292
+ }
3293
+ }
3294
+ ]
3295
+ },
3296
+ {
3297
+ "kind": "javascript-module",
3298
+ "path": "src/components/foundation-sounds/foundation-sounds.ts",
3299
+ "declarations": [
3300
+ {
3301
+ "kind": "class",
3302
+ "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.",
3303
+ "name": "FoundationSounds",
3304
+ "members": [
3305
+ {
3306
+ "kind": "field",
3307
+ "name": "connect",
3308
+ "type": {
3309
+ "text": "Connect"
3310
+ }
3311
+ },
3312
+ {
3313
+ "kind": "field",
3314
+ "name": "inboxService",
3315
+ "type": {
3316
+ "text": "FoundationInboxService"
3317
+ }
3318
+ },
3319
+ {
3320
+ "kind": "field",
3321
+ "name": "ruleService",
3322
+ "type": {
3323
+ "text": "RuleService"
3324
+ }
3325
+ },
3326
+ {
3327
+ "kind": "field",
3328
+ "name": "soundEnabled",
3329
+ "type": {
3330
+ "text": "boolean"
3331
+ },
3332
+ "default": "true",
3333
+ "description": "When false, new audible alerts are tracked but do not play."
3334
+ },
3335
+ {
3336
+ "kind": "field",
3337
+ "name": "connectionSub",
3338
+ "type": {
3339
+ "text": "Subscription | undefined"
3340
+ },
3341
+ "privacy": "private"
3342
+ },
3343
+ {
3344
+ "kind": "field",
3345
+ "name": "player",
3346
+ "privacy": "private",
3347
+ "readonly": true
3348
+ },
3349
+ {
3350
+ "kind": "field",
3351
+ "name": "knownAlertIds",
3352
+ "privacy": "private",
3353
+ "default": "new Set<string>()"
3354
+ },
3355
+ {
3356
+ "kind": "field",
3357
+ "name": "serverSoundFetches",
3358
+ "privacy": "private",
3359
+ "readonly": true,
3360
+ "default": "new Map<string, Promise<boolean>>()",
3361
+ "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
3362
+ },
3363
+ {
3364
+ "kind": "method",
3365
+ "name": "subscribeToAlerts",
3366
+ "privacy": "private",
3367
+ "return": {
3368
+ "type": {
3369
+ "text": "void"
3370
+ }
3371
+ }
3372
+ },
3373
+ {
3374
+ "kind": "field",
3375
+ "name": "subscriptionHandler",
3376
+ "privacy": "private"
3439
3377
  },
3440
3378
  {
3441
3379
  "kind": "method",
3442
- "name": "resolveLeftValues",
3443
- "static": true,
3380
+ "name": "playForNewAlerts",
3381
+ "privacy": "private",
3444
3382
  "return": {
3445
3383
  "type": {
3446
- "text": "ConditionNode[]"
3384
+ "text": "Promise<void>"
3447
3385
  }
3448
3386
  },
3449
3387
  "parameters": [
3450
3388
  {
3451
- "name": "conditions",
3452
- "type": {
3453
- "text": "ConditionNode[]"
3454
- }
3455
- },
3456
- {
3457
- "name": "fields",
3389
+ "name": "rows",
3458
3390
  "type": {
3459
- "text": "any[]"
3391
+ "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
3460
3392
  }
3461
3393
  }
3462
3394
  ]
3463
3395
  },
3464
- {
3465
- "kind": "field",
3466
- "name": "createEmptyGroup",
3467
- "static": true
3468
- },
3469
3396
  {
3470
3397
  "kind": "method",
3471
- "name": "buildRawExpression",
3472
- "static": true,
3398
+ "name": "tryPlayServerSound",
3399
+ "privacy": "private",
3473
3400
  "return": {
3474
3401
  "type": {
3475
- "text": "string"
3402
+ "text": "Promise<boolean>"
3476
3403
  }
3477
3404
  },
3478
3405
  "parameters": [
3479
3406
  {
3480
- "name": "conditions",
3407
+ "name": "dynamicRuleId",
3481
3408
  "type": {
3482
- "text": "ConditionNode[]"
3409
+ "text": "string"
3483
3410
  }
3484
3411
  }
3485
3412
  ]
3486
3413
  },
3487
3414
  {
3488
3415
  "kind": "method",
3489
- "name": "parseRawExpression",
3490
- "static": true,
3416
+ "name": "fetchAndCacheServerSound",
3417
+ "privacy": "private",
3491
3418
  "return": {
3492
3419
  "type": {
3493
- "text": "ConditionNode[] | null"
3420
+ "text": "Promise<boolean>"
3494
3421
  }
3495
3422
  },
3496
3423
  "parameters": [
3497
3424
  {
3498
- "name": "rawExpression",
3425
+ "name": "dynamicRuleId",
3499
3426
  "type": {
3500
3427
  "text": "string"
3501
3428
  }
3502
3429
  }
3503
3430
  ]
3504
3431
  }
3505
- ]
3432
+ ],
3433
+ "attributes": [
3434
+ {
3435
+ "name": "sound-enabled",
3436
+ "type": {
3437
+ "text": "boolean"
3438
+ },
3439
+ "default": "true",
3440
+ "description": "When false, new audible alerts are tracked but do not play.",
3441
+ "fieldName": "soundEnabled"
3442
+ }
3443
+ ],
3444
+ "superclass": {
3445
+ "name": "GenesisElement",
3446
+ "package": "@genesislcap/web-core"
3447
+ },
3448
+ "tagName": "foundation-sounds",
3449
+ "customElement": true
3450
+ }
3451
+ ],
3452
+ "exports": [
3453
+ {
3454
+ "kind": "js",
3455
+ "name": "FoundationSounds",
3456
+ "declaration": {
3457
+ "name": "FoundationSounds",
3458
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
3459
+ }
3506
3460
  },
3507
3461
  {
3508
- "kind": "class",
3509
- "description": "",
3510
- "name": "TemplateUtils",
3462
+ "kind": "custom-element-definition",
3463
+ "name": "foundation-sounds",
3464
+ "declaration": {
3465
+ "name": "FoundationSounds",
3466
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
3467
+ }
3468
+ }
3469
+ ]
3470
+ },
3471
+ {
3472
+ "kind": "javascript-module",
3473
+ "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
3474
+ "declarations": [
3475
+ {
3476
+ "kind": "variable",
3477
+ "name": "alertSoundAttachmentTemplate",
3478
+ "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`",
3479
+ "description": "Shared Attach/Replace/Test/Clear UI for rule and template dialogs.",
3480
+ "privacy": "public"
3481
+ },
3482
+ {
3483
+ "kind": "mixin",
3484
+ "description": "Mixin: pick / test / clear / load server sound + apply fields to submit payload.\n\nSubclasses must provide ruleService, isAlertSoundEditMode,\nalertSoundEntityId, and alertSoundCacheSyncMode.",
3485
+ "name": "AlertSoundAttachmentMixin",
3511
3486
  "members": [
3512
3487
  {
3513
3488
  "kind": "field",
3514
- "name": "createEmptyParameter",
3515
- "static": true
3489
+ "name": "ruleService",
3490
+ "type": {
3491
+ "text": "RuleService"
3492
+ }
3516
3493
  },
3517
3494
  {
3518
- "kind": "method",
3519
- "name": "getParameters",
3520
- "static": true,
3521
- "parameters": [
3522
- {
3523
- "name": "parameters"
3524
- }
3525
- ]
3495
+ "kind": "field",
3496
+ "name": "isAlertSoundEditMode",
3497
+ "type": {
3498
+ "text": "boolean"
3499
+ },
3500
+ "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
3501
+ "readonly": true
3526
3502
  },
3527
3503
  {
3528
- "kind": "method",
3529
- "name": "buildRightValue",
3530
- "privacy": "private",
3531
- "static": true,
3532
- "parameters": [
3533
- {
3534
- "name": "logicalOperator",
3535
- "type": {
3536
- "text": "LogicalOperator"
3537
- }
3538
- },
3539
- {
3540
- "name": "condition"
3541
- },
3542
- {
3543
- "name": "parameters",
3544
- "optional": true
3545
- }
3546
- ]
3504
+ "kind": "field",
3505
+ "name": "alertSoundEntityId",
3506
+ "type": {
3507
+ "text": "string | null"
3508
+ },
3509
+ "description": "DYNAMIC_RULE_ID of the entity being edited (null on create).\nUsed when alertSoundCacheSyncMode is `'entity'`.",
3510
+ "readonly": true
3547
3511
  },
3548
3512
  {
3549
- "kind": "method",
3550
- "name": "getConditions",
3551
- "static": true,
3552
- "parameters": [
3553
- {
3554
- "name": "conditions"
3555
- },
3556
- {
3557
- "name": "parameters",
3558
- "optional": true
3559
- }
3560
- ]
3513
+ "kind": "field",
3514
+ "name": "alertSoundCacheSyncMode",
3515
+ "type": {
3516
+ "text": "'entity' | 'all'"
3517
+ },
3518
+ "description": "`'entity'` — update/clear cache for alertSoundEntityId (rules).\n`'all'` — drop every cached server sound (templates; instance ids unknown).",
3519
+ "readonly": true
3520
+ },
3521
+ {
3522
+ "kind": "field",
3523
+ "name": "alertSoundFileName",
3524
+ "type": {
3525
+ "text": "string"
3526
+ },
3527
+ "default": "''",
3528
+ "description": "Display name of the attached / pending alert sound file."
3529
+ },
3530
+ {
3531
+ "kind": "field",
3532
+ "name": "alertSoundMimeType",
3533
+ "type": {
3534
+ "text": "string"
3535
+ },
3536
+ "default": "''"
3537
+ },
3538
+ {
3539
+ "kind": "field",
3540
+ "name": "hasAlertSound",
3541
+ "type": {
3542
+ "text": "boolean"
3543
+ },
3544
+ "default": "false",
3545
+ "description": "True when edit loaded an existing server sound (or user attached one)."
3546
+ },
3547
+ {
3548
+ "kind": "field",
3549
+ "name": "fileInput",
3550
+ "type": {
3551
+ "text": "HTMLInputElement"
3552
+ }
3553
+ },
3554
+ {
3555
+ "kind": "field",
3556
+ "name": "pendingAlertSoundData",
3557
+ "type": {
3558
+ "text": "string | null"
3559
+ },
3560
+ "default": "null"
3561
+ },
3562
+ {
3563
+ "kind": "field",
3564
+ "name": "alertSoundDirty",
3565
+ "type": {
3566
+ "text": "boolean"
3567
+ },
3568
+ "default": "false",
3569
+ "description": "True when the user picked a new file this session (needs upload)."
3570
+ },
3571
+ {
3572
+ "kind": "field",
3573
+ "name": "clearAlertSound",
3574
+ "type": {
3575
+ "text": "boolean"
3576
+ },
3577
+ "default": "false"
3578
+ },
3579
+ {
3580
+ "kind": "field",
3581
+ "name": "testAudio",
3582
+ "type": {
3583
+ "text": "HTMLAudioElement | null"
3584
+ },
3585
+ "default": "null",
3586
+ "description": "In-progress Test playback; not private — mixin return type is exported."
3561
3587
  },
3562
3588
  {
3563
3589
  "kind": "method",
3564
- "name": "createParameterDetails",
3565
- "static": true,
3590
+ "name": "loadExistingAlertSound",
3566
3591
  "parameters": [
3567
3592
  {
3568
- "name": "parameters"
3593
+ "name": "dynamicRuleId",
3594
+ "type": {
3595
+ "text": "string"
3596
+ }
3569
3597
  }
3570
3598
  ]
3571
- }
3572
- ]
3573
- },
3574
- {
3575
- "kind": "class",
3576
- "description": "",
3577
- "name": "RuleUtils",
3578
- "members": [
3599
+ },
3600
+ {
3601
+ "kind": "method",
3602
+ "name": "openAlertSoundPicker"
3603
+ },
3579
3604
  {
3580
3605
  "kind": "method",
3581
- "name": "buildRightValue",
3582
- "privacy": "private",
3583
- "static": true,
3606
+ "name": "onAlertSoundSelected",
3584
3607
  "parameters": [
3585
3608
  {
3586
- "name": "logicalOperator",
3609
+ "name": "event",
3587
3610
  "type": {
3588
- "text": "LogicalOperator"
3611
+ "text": "Event"
3589
3612
  }
3590
- },
3591
- {
3592
- "name": "condition"
3593
3613
  }
3594
3614
  ]
3595
3615
  },
3596
3616
  {
3597
3617
  "kind": "method",
3598
- "name": "getConditions",
3599
- "static": true,
3618
+ "name": "clearAttachedAlertSound"
3619
+ },
3620
+ {
3621
+ "kind": "method",
3622
+ "name": "testAttachedAlertSound"
3623
+ },
3624
+ {
3625
+ "kind": "method",
3626
+ "name": "stopTestSound"
3627
+ },
3628
+ {
3629
+ "kind": "method",
3630
+ "name": "resetAlertSoundState"
3631
+ },
3632
+ {
3633
+ "kind": "method",
3634
+ "name": "applyAlertSoundToPayload",
3635
+ "return": {
3636
+ "type": {
3637
+ "text": "T"
3638
+ }
3639
+ },
3600
3640
  "parameters": [
3601
3641
  {
3602
- "name": "conditions"
3642
+ "name": "target",
3643
+ "type": {
3644
+ "text": "T"
3645
+ }
3603
3646
  }
3604
- ]
3647
+ ],
3648
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3649
+ },
3650
+ {
3651
+ "kind": "method",
3652
+ "name": "syncAlertSoundCacheAfterSave",
3653
+ "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."
3605
3654
  }
3606
- ]
3607
- },
3608
- {
3609
- "kind": "function",
3610
- "name": "showNotificationError",
3655
+ ],
3611
3656
  "parameters": [
3612
3657
  {
3613
- "name": "error"
3658
+ "name": "Base",
3659
+ "type": {
3660
+ "text": "TBase"
3661
+ }
3614
3662
  }
3615
- ]
3663
+ ],
3664
+ "privacy": "public"
3616
3665
  }
3617
3666
  ],
3618
3667
  "exports": [
3619
3668
  {
3620
3669
  "kind": "js",
3621
- "name": "UUIDGenerator",
3622
- "declaration": {
3623
- "name": "UUIDGenerator",
3624
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3625
- }
3626
- },
3627
- {
3628
- "kind": "js",
3629
- "name": "isEmpty",
3670
+ "name": "alertSoundAttachmentTemplate",
3630
3671
  "declaration": {
3631
- "name": "isEmpty",
3632
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3672
+ "name": "alertSoundAttachmentTemplate",
3673
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3633
3674
  }
3634
3675
  },
3635
3676
  {
3636
3677
  "kind": "js",
3637
- "name": "DynamicRuleUtils",
3678
+ "name": "AlertSoundAttachmentMixin",
3638
3679
  "declaration": {
3639
- "name": "DynamicRuleUtils",
3640
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3680
+ "name": "AlertSoundAttachmentMixin",
3681
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3641
3682
  }
3642
- },
3683
+ }
3684
+ ]
3685
+ },
3686
+ {
3687
+ "kind": "javascript-module",
3688
+ "path": "src/components/foundation-notification-dashboard/index.ts",
3689
+ "declarations": [],
3690
+ "exports": [
3643
3691
  {
3644
3692
  "kind": "js",
3645
- "name": "TemplateUtils",
3693
+ "name": "*",
3646
3694
  "declaration": {
3647
- "name": "TemplateUtils",
3648
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3695
+ "name": "*",
3696
+ "package": "./notification-dashboard"
3649
3697
  }
3650
- },
3698
+ }
3699
+ ]
3700
+ },
3701
+ {
3702
+ "kind": "javascript-module",
3703
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
3704
+ "declarations": [
3651
3705
  {
3652
- "kind": "js",
3653
- "name": "RuleUtils",
3654
- "declaration": {
3655
- "name": "RuleUtils",
3656
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3657
- }
3658
- },
3706
+ "kind": "variable",
3707
+ "name": "FoundationNotificationDashboardStyles",
3708
+ "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`",
3709
+ "privacy": "public"
3710
+ }
3711
+ ],
3712
+ "exports": [
3659
3713
  {
3660
3714
  "kind": "js",
3661
- "name": "showNotificationError",
3715
+ "name": "FoundationNotificationDashboardStyles",
3662
3716
  "declaration": {
3663
- "name": "showNotificationError",
3664
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3717
+ "name": "FoundationNotificationDashboardStyles",
3718
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
3665
3719
  }
3666
3720
  }
3667
3721
  ]
3668
3722
  },
3669
3723
  {
3670
3724
  "kind": "javascript-module",
3671
- "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
3725
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
3672
3726
  "declarations": [
3727
+ {
3728
+ "kind": "class",
3729
+ "description": "",
3730
+ "name": "NotificationDashboardTab",
3731
+ "members": [
3732
+ {
3733
+ "kind": "field",
3734
+ "name": "id",
3735
+ "type": {
3736
+ "text": "string"
3737
+ }
3738
+ },
3739
+ {
3740
+ "kind": "field",
3741
+ "name": "name",
3742
+ "type": {
3743
+ "text": "string"
3744
+ }
3745
+ },
3746
+ {
3747
+ "kind": "field",
3748
+ "name": "component",
3749
+ "type": {
3750
+ "text": "string"
3751
+ }
3752
+ },
3753
+ {
3754
+ "kind": "field",
3755
+ "name": "right",
3756
+ "type": {
3757
+ "text": "string"
3758
+ }
3759
+ }
3760
+ ]
3761
+ },
3673
3762
  {
3674
3763
  "kind": "variable",
3675
- "name": "FoundationSoundsPanelStyles",
3676
- "default": "css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n width: 100%;\n }\n\n .sounds-controls {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n gap: 12px;\n padding: calc(var(--design-unit) * 3px);\n box-sizing: border-box;\n }\n\n .sounds-help-disclosure {\n flex: 0 0 auto;\n }\n\n .sounds-help-toggle {\n margin-inline-start: calc(var(--design-unit) * 1px);\n }\n\n .sounds-help-toggle::before {\n content: '+';\n }\n\n .sounds-help-disclosure[expanded] .sounds-help-toggle::before {\n content: '−';\n }\n\n .sounds-help {\n margin: 0;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n text-align: left;\n }\n\n .volume-row {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n gap: calc(var(--design-unit) * 2px);\n min-width: 0;\n }\n\n .volume-icon {\n flex: 0 0 auto;\n }\n\n .volume-label {\n flex: 0 0 auto;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .volume-slider {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .volume-percent {\n flex: 0 0 auto;\n min-width: 3ch;\n text-align: end;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .mute-all {\n flex: 0 0 auto;\n margin: 0;\n }\n\n .sound-rules-panel {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n }\n\n .sound-rules {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .sound-rule {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n\n /* Keep absolute listboxes from being clipped by the card itself. */\n overflow: visible;\n }\n\n .sound-rule-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-weight: 700;\n font-size: var(--type-ramp-minus-1-font-size);\n }\n\n .sound-rule-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .sound-rule-label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .pattern-input,\n .match-mode-select,\n .rule-select,\n .sound-file-input {\n width: 100%;\n }\n\n /*\n * Anchor the listbox to the select host and use position:fixed so it escapes\n * .sound-rules-panel overflow:auto (and the rule card). Each select sets a\n * unique --sounds-select-anchor / anchor-name via inline style.\n * !important beats FAST's internal absolute top/bottom for [open] selects.\n */\n .match-mode-select[open]::part(listbox),\n .rule-select[open]::part(listbox) {\n position: fixed !important;\n /* stylelint-disable-next-line property-no-unknown -- CSS anchor positioning */\n position-anchor: var(--sounds-select-anchor);\n inset: auto !important;\n top: anchor(bottom) !important;\n left: anchor(left) !important;\n right: anchor(right) !important;\n bottom: auto !important;\n width: auto !important;\n margin-top: calc(var(--design-unit) * 1px);\n z-index: 10000;\n max-height: min(240px, 40vh);\n overflow-x: hidden;\n overflow-y: auto;\n box-shadow: 0 4px 16px rgb(0 0 0 / 24%);\n }\n\n .match-mode-select[open][position='above']::part(listbox),\n .rule-select[open][position='above']::part(listbox) {\n top: auto !important;\n bottom: anchor(top) !important;\n margin-top: 0;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .sound-file-row {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .sound-file-row .sound-file-input {\n flex: 1;\n min-width: 0;\n }\n\n .choose-sound {\n cursor: pointer;\n }\n\n .sound-rules-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex: 0 0 auto;\n gap: 8px;\n }\n\n .rule-count {\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n\n .file-input {\n display: none;\n }\n\n ${scrollbarStyles}\n`"
3764
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3765
+ "type": {
3766
+ "text": "NotificationDashboardTab[]"
3767
+ },
3768
+ "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]"
3677
3769
  }
3678
3770
  ],
3679
3771
  "exports": [
3680
3772
  {
3681
3773
  "kind": "js",
3682
- "name": "FoundationSoundsPanelStyles",
3774
+ "name": "NotificationDashboardTab",
3683
3775
  "declaration": {
3684
- "name": "FoundationSoundsPanelStyles",
3685
- "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
3776
+ "name": "NotificationDashboardTab",
3777
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3778
+ }
3779
+ },
3780
+ {
3781
+ "kind": "js",
3782
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3783
+ "declaration": {
3784
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3785
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3686
3786
  }
3687
3787
  }
3688
3788
  ]
3689
3789
  },
3690
3790
  {
3691
3791
  "kind": "javascript-module",
3692
- "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
3792
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3693
3793
  "declarations": [
3694
3794
  {
3695
3795
  "kind": "variable",
3696
- "name": "FoundationSoundsPanelTemplate",
3697
- "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`"
3796
+ "name": "FoundationNotificationDashboardTemplate",
3797
+ "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`"
3698
3798
  }
3699
3799
  ],
3700
3800
  "exports": [
3701
3801
  {
3702
3802
  "kind": "js",
3703
- "name": "FoundationSoundsPanelTemplate",
3803
+ "name": "FoundationNotificationDashboardTemplate",
3704
3804
  "declaration": {
3705
- "name": "FoundationSoundsPanelTemplate",
3706
- "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
3805
+ "name": "FoundationNotificationDashboardTemplate",
3806
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3707
3807
  }
3708
3808
  }
3709
3809
  ]
3710
3810
  },
3711
3811
  {
3712
3812
  "kind": "javascript-module",
3713
- "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
3813
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3714
3814
  "declarations": [
3715
3815
  {
3716
3816
  "kind": "class",
3717
- "description": "Configures alert sound rules in the inbox Sounds tab. Persists via the shared\nAlertSoundPlayer; playback is handled by layout-mounted\nFoundationSounds.",
3718
- "name": "FoundationSoundsPanel",
3817
+ "description": "",
3818
+ "name": "FoundationNotificationDashboard",
3719
3819
  "members": [
3720
3820
  {
3721
3821
  "kind": "field",
3722
- "name": "ruleService",
3822
+ "name": "auth",
3723
3823
  "type": {
3724
- "text": "RuleService"
3824
+ "text": "Auth"
3725
3825
  }
3726
3826
  },
3727
3827
  {
3728
3828
  "kind": "field",
3729
- "name": "volumePercent",
3829
+ "name": "ready",
3830
+ "type": {
3831
+ "text": "boolean"
3832
+ },
3833
+ "default": "false"
3834
+ },
3835
+ {
3836
+ "kind": "field",
3837
+ "name": "hasPermissions",
3838
+ "type": {
3839
+ "text": "boolean"
3840
+ },
3841
+ "default": "true"
3842
+ }
3843
+ ],
3844
+ "superclass": {
3845
+ "name": "GenesisElement",
3846
+ "package": "@genesislcap/web-core"
3847
+ },
3848
+ "tagName": "foundation-notification-dashboard",
3849
+ "customElement": true
3850
+ }
3851
+ ],
3852
+ "exports": [
3853
+ {
3854
+ "kind": "js",
3855
+ "name": "FoundationNotificationDashboard",
3856
+ "declaration": {
3857
+ "name": "FoundationNotificationDashboard",
3858
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3859
+ }
3860
+ },
3861
+ {
3862
+ "kind": "custom-element-definition",
3863
+ "name": "foundation-notification-dashboard",
3864
+ "declaration": {
3865
+ "name": "FoundationNotificationDashboard",
3866
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3867
+ }
3868
+ }
3869
+ ]
3870
+ },
3871
+ {
3872
+ "kind": "javascript-module",
3873
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3874
+ "declarations": [
3875
+ {
3876
+ "kind": "class",
3877
+ "description": "",
3878
+ "name": "UUIDGenerator",
3879
+ "members": [
3880
+ {
3881
+ "kind": "field",
3882
+ "name": "uuid",
3730
3883
  "type": {
3731
- "text": "number"
3884
+ "text": "UUID"
3732
3885
  },
3733
- "default": "100",
3734
- "description": "Global playback volume 0–100. @internal"
3886
+ "privacy": "private",
3887
+ "static": true
3735
3888
  },
3736
3889
  {
3737
3890
  "kind": "field",
3738
- "name": "selectableRules",
3739
- "type": {
3740
- "text": "AlertSoundSelectableRule[]"
3741
- },
3742
- "default": "[]",
3743
- "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
3744
- },
3891
+ "name": "createUUID",
3892
+ "static": true
3893
+ }
3894
+ ]
3895
+ },
3896
+ {
3897
+ "kind": "function",
3898
+ "name": "isEmpty",
3899
+ "parameters": [
3745
3900
  {
3746
- "kind": "field",
3747
- "name": "fileInput",
3748
- "type": {
3749
- "text": "HTMLInputElement"
3750
- }
3751
- },
3901
+ "name": "value"
3902
+ }
3903
+ ]
3904
+ },
3905
+ {
3906
+ "kind": "class",
3907
+ "description": "",
3908
+ "name": "DynamicRuleUtils",
3909
+ "members": [
3752
3910
  {
3753
3911
  "kind": "field",
3754
- "name": "pendingRuleIndex",
3755
- "type": {
3756
- "text": "number | null"
3757
- },
3758
- "privacy": "private",
3759
- "default": "null"
3912
+ "name": "createEmptyCondition",
3913
+ "static": true
3760
3914
  },
3761
3915
  {
3762
3916
  "kind": "field",
3763
- "name": "player",
3764
- "privacy": "private",
3765
- "readonly": true
3917
+ "name": "createAssignment",
3918
+ "static": true
3766
3919
  },
3767
3920
  {
3768
3921
  "kind": "field",
3769
- "name": "unsubscribePlayer",
3770
- "type": {
3771
- "text": "(() => void) | undefined"
3772
- },
3773
- "privacy": "private"
3922
+ "name": "createPlaceholderAssignment",
3923
+ "static": true
3774
3924
  },
3775
3925
  {
3776
3926
  "kind": "field",
3777
- "name": "ignoreSelectChanges",
3778
- "type": {
3779
- "text": "boolean"
3780
- },
3781
- "privacy": "private",
3782
- "default": "false",
3783
- "description": "Suppresses select change events while options are rebuilt."
3927
+ "name": "createTextAssignment",
3928
+ "static": true
3784
3929
  },
3785
3930
  {
3786
- "kind": "method",
3787
- "name": "onMatchModeChange",
3788
- "return": {
3789
- "type": {
3790
- "text": "boolean"
3791
- }
3792
- },
3793
- "parameters": [
3794
- {
3795
- "name": "index",
3796
- "type": {
3797
- "text": "number"
3798
- }
3799
- },
3800
- {
3801
- "name": "event",
3802
- "type": {
3803
- "text": "Event"
3804
- }
3805
- }
3806
- ]
3931
+ "kind": "field",
3932
+ "name": "getAssignmentValue",
3933
+ "static": true
3807
3934
  },
3808
3935
  {
3809
- "kind": "method",
3810
- "name": "onPatternInput",
3811
- "return": {
3812
- "type": {
3813
- "text": "boolean"
3814
- }
3815
- },
3816
- "parameters": [
3817
- {
3818
- "name": "index",
3819
- "type": {
3820
- "text": "number"
3821
- }
3822
- },
3823
- {
3824
- "name": "event",
3825
- "type": {
3826
- "text": "Event"
3827
- }
3828
- }
3829
- ]
3936
+ "kind": "field",
3937
+ "name": "getAssignmentText",
3938
+ "static": true
3830
3939
  },
3831
3940
  {
3832
3941
  "kind": "method",
3833
- "name": "onRuleChange",
3942
+ "name": "createConditions",
3943
+ "static": true,
3834
3944
  "return": {
3835
3945
  "type": {
3836
- "text": "boolean"
3946
+ "text": "any"
3837
3947
  }
3838
3948
  },
3839
3949
  "parameters": [
3840
3950
  {
3841
- "name": "index",
3951
+ "name": "conditions",
3842
3952
  "type": {
3843
- "text": "number"
3953
+ "text": "ConditionNode[]"
3844
3954
  }
3845
3955
  },
3846
3956
  {
3847
- "name": "event",
3848
- "type": {
3849
- "text": "Event"
3850
- }
3851
- }
3852
- ]
3853
- },
3854
- {
3855
- "kind": "method",
3856
- "name": "openFilePicker",
3857
- "return": {
3858
- "type": {
3859
- "text": "boolean"
3860
- }
3861
- },
3862
- "parameters": [
3863
- {
3864
- "name": "index",
3865
- "type": {
3866
- "text": "number"
3867
- }
3957
+ "name": "parameters",
3958
+ "optional": true
3868
3959
  }
3869
3960
  ]
3870
3961
  },
3871
3962
  {
3872
3963
  "kind": "method",
3873
- "name": "onFileSelected",
3964
+ "name": "hasMultiValueCondition",
3965
+ "static": true,
3874
3966
  "return": {
3875
3967
  "type": {
3876
3968
  "text": "boolean"
@@ -3878,16 +3970,17 @@
3878
3970
  },
3879
3971
  "parameters": [
3880
3972
  {
3881
- "name": "event",
3973
+ "name": "conditions",
3882
3974
  "type": {
3883
- "text": "Event"
3975
+ "text": "ConditionNode[]"
3884
3976
  }
3885
3977
  }
3886
3978
  ]
3887
3979
  },
3888
3980
  {
3889
3981
  "kind": "method",
3890
- "name": "clearSound",
3982
+ "name": "hasOrJoin",
3983
+ "static": true,
3891
3984
  "return": {
3892
3985
  "type": {
3893
3986
  "text": "boolean"
@@ -3895,16 +3988,17 @@
3895
3988
  },
3896
3989
  "parameters": [
3897
3990
  {
3898
- "name": "index",
3991
+ "name": "conditions",
3899
3992
  "type": {
3900
- "text": "number"
3993
+ "text": "ConditionNode[]"
3901
3994
  }
3902
3995
  }
3903
3996
  ]
3904
3997
  },
3905
3998
  {
3906
3999
  "kind": "method",
3907
- "name": "testSound",
4000
+ "name": "hasGroup",
4001
+ "static": true,
3908
4002
  "return": {
3909
4003
  "type": {
3910
4004
  "text": "boolean"
@@ -3912,16 +4006,17 @@
3912
4006
  },
3913
4007
  "parameters": [
3914
4008
  {
3915
- "name": "index",
4009
+ "name": "conditions",
3916
4010
  "type": {
3917
- "text": "number"
4011
+ "text": "ConditionNode[]"
3918
4012
  }
3919
4013
  }
3920
4014
  ]
3921
4015
  },
3922
4016
  {
3923
4017
  "kind": "method",
3924
- "name": "toggleRuleMute",
4018
+ "name": "hasUnsupportedOperator",
4019
+ "static": true,
3925
4020
  "return": {
3926
4021
  "type": {
3927
4022
  "text": "boolean"
@@ -3929,16 +4024,17 @@
3929
4024
  },
3930
4025
  "parameters": [
3931
4026
  {
3932
- "name": "index",
4027
+ "name": "conditions",
3933
4028
  "type": {
3934
- "text": "number"
4029
+ "text": "ConditionNode[]"
3935
4030
  }
3936
4031
  }
3937
4032
  ]
3938
4033
  },
3939
4034
  {
3940
4035
  "kind": "method",
3941
- "name": "onVolumeChange",
4036
+ "name": "hasCurrentUser",
4037
+ "static": true,
3942
4038
  "return": {
3943
4039
  "type": {
3944
4040
  "text": "boolean"
@@ -3946,112 +4042,64 @@
3946
4042
  },
3947
4043
  "parameters": [
3948
4044
  {
3949
- "name": "event",
4045
+ "name": "conditions",
3950
4046
  "type": {
3951
- "text": "Event"
4047
+ "text": "ConditionNode[]"
3952
4048
  }
3953
4049
  }
3954
4050
  ]
3955
4051
  },
3956
4052
  {
3957
4053
  "kind": "method",
3958
- "name": "toggleMute",
3959
- "return": {
3960
- "type": {
3961
- "text": "boolean"
3962
- }
3963
- }
3964
- },
3965
- {
3966
- "kind": "method",
3967
- "name": "addRule",
3968
- "return": {
3969
- "type": {
3970
- "text": "boolean"
3971
- }
3972
- }
3973
- },
3974
- {
3975
- "kind": "method",
3976
- "name": "removeRule",
4054
+ "name": "flattenConditions",
4055
+ "static": true,
3977
4056
  "return": {
3978
4057
  "type": {
3979
- "text": "boolean"
4058
+ "text": "ConditionBuilderEntity[]"
3980
4059
  }
3981
4060
  },
3982
4061
  "parameters": [
3983
4062
  {
3984
- "name": "index",
4063
+ "name": "conditions",
3985
4064
  "type": {
3986
- "text": "number"
4065
+ "text": "ConditionNode[]"
3987
4066
  }
3988
4067
  }
3989
- ]
3990
- },
3991
- {
3992
- "kind": "method",
3993
- "name": "reloadRules",
3994
- "return": {
3995
- "type": {
3996
- "text": "Promise<void>"
3997
- }
3998
- },
3999
- "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
4000
- },
4001
- {
4002
- "kind": "method",
4003
- "name": "loadRules",
4004
- "privacy": "private",
4005
- "return": {
4006
- "type": {
4007
- "text": "Promise<void>"
4008
- }
4009
- }
4010
- },
4011
- {
4012
- "kind": "method",
4013
- "name": "settleRuleOptions",
4014
- "privacy": "private",
4015
- "return": {
4016
- "type": {
4017
- "text": "Promise<void>"
4018
- }
4019
- },
4020
- "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."
4021
- },
4022
- {
4023
- "kind": "method",
4024
- "name": "applyRuleSelectValues",
4025
- "privacy": "private",
4026
- "return": {
4027
- "type": {
4028
- "text": "void"
4029
- }
4030
- },
4031
- "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...\"."
4068
+ ]
4032
4069
  },
4033
4070
  {
4034
4071
  "kind": "method",
4035
- "name": "mapRules",
4036
- "privacy": "private",
4072
+ "name": "resolveLeftValues",
4073
+ "static": true,
4037
4074
  "return": {
4038
4075
  "type": {
4039
- "text": "AlertSoundSelectableRule[]"
4076
+ "text": "ConditionNode[]"
4040
4077
  }
4041
4078
  },
4042
4079
  "parameters": [
4043
4080
  {
4044
- "name": "ruleList",
4081
+ "name": "conditions",
4045
4082
  "type": {
4046
- "text": "NamedRuleRow[]"
4083
+ "text": "ConditionNode[]"
4084
+ }
4085
+ },
4086
+ {
4087
+ "name": "fields",
4088
+ "type": {
4089
+ "text": "any[]"
4047
4090
  }
4048
4091
  }
4049
4092
  ]
4050
4093
  },
4094
+ {
4095
+ "kind": "field",
4096
+ "name": "createEmptyGroup",
4097
+ "static": true
4098
+ },
4051
4099
  {
4052
4100
  "kind": "method",
4053
- "name": "ruleMatchId",
4054
- "privacy": "private",
4101
+ "name": "buildRawExpression",
4102
+ "static": true,
4055
4103
  "return": {
4056
4104
  "type": {
4057
4105
  "text": "string"
@@ -4059,239 +4107,191 @@
4059
4107
  },
4060
4108
  "parameters": [
4061
4109
  {
4062
- "name": "rule",
4110
+ "name": "conditions",
4063
4111
  "type": {
4064
- "text": "NamedRuleRow | undefined"
4112
+ "text": "ConditionNode[]"
4065
4113
  }
4066
4114
  }
4067
4115
  ]
4068
4116
  },
4069
4117
  {
4070
4118
  "kind": "method",
4071
- "name": "syncSoundState",
4072
- "privacy": "private"
4119
+ "name": "parseRawExpression",
4120
+ "static": true,
4121
+ "return": {
4122
+ "type": {
4123
+ "text": "ConditionNode[] | null"
4124
+ }
4125
+ },
4126
+ "parameters": [
4127
+ {
4128
+ "name": "rawExpression",
4129
+ "type": {
4130
+ "text": "string"
4131
+ }
4132
+ }
4133
+ ]
4073
4134
  }
4074
- ],
4075
- "superclass": {
4076
- "name": "GenesisElement",
4077
- "package": "@genesislcap/web-core"
4078
- },
4079
- "tagName": "foundation-sounds-panel",
4080
- "customElement": true
4081
- }
4082
- ],
4083
- "exports": [
4084
- {
4085
- "kind": "js",
4086
- "name": "FoundationSoundsPanel",
4087
- "declaration": {
4088
- "name": "FoundationSoundsPanel",
4089
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
4090
- }
4135
+ ]
4091
4136
  },
4092
- {
4093
- "kind": "custom-element-definition",
4094
- "name": "foundation-sounds-panel",
4095
- "declaration": {
4096
- "name": "FoundationSoundsPanel",
4097
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
4098
- }
4099
- }
4100
- ]
4101
- },
4102
- {
4103
- "kind": "javascript-module",
4104
- "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
4105
- "declarations": [
4106
- {
4107
- "kind": "variable",
4108
- "name": "FoundationSoundsStyles",
4109
- "default": "css`\n :host {\n display: none;\n }\n`",
4110
- "description": "Headless layout listener — take no space in the layout chrome."
4111
- }
4112
- ],
4113
- "exports": [
4114
- {
4115
- "kind": "js",
4116
- "name": "FoundationSoundsStyles",
4117
- "declaration": {
4118
- "name": "FoundationSoundsStyles",
4119
- "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
4120
- }
4121
- }
4122
- ]
4123
- },
4124
- {
4125
- "kind": "javascript-module",
4126
- "path": "src/components/foundation-sounds/foundation-sounds.ts",
4127
- "declarations": [
4128
4137
  {
4129
4138
  "kind": "class",
4130
- "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.",
4131
- "name": "FoundationSounds",
4139
+ "description": "",
4140
+ "name": "TemplateUtils",
4132
4141
  "members": [
4133
4142
  {
4134
4143
  "kind": "field",
4135
- "name": "connect",
4136
- "type": {
4137
- "text": "Connect"
4138
- }
4139
- },
4140
- {
4141
- "kind": "field",
4142
- "name": "inboxService",
4143
- "type": {
4144
- "text": "FoundationInboxService"
4145
- }
4146
- },
4147
- {
4148
- "kind": "field",
4149
- "name": "ruleService",
4150
- "type": {
4151
- "text": "RuleService"
4152
- }
4153
- },
4154
- {
4155
- "kind": "field",
4156
- "name": "soundEnabled",
4157
- "type": {
4158
- "text": "boolean"
4159
- },
4160
- "default": "true",
4161
- "description": "When false, new audible alerts are tracked but do not play."
4162
- },
4163
- {
4164
- "kind": "field",
4165
- "name": "connectionSub",
4166
- "type": {
4167
- "text": "Subscription | undefined"
4168
- },
4169
- "privacy": "private"
4170
- },
4171
- {
4172
- "kind": "field",
4173
- "name": "player",
4174
- "privacy": "private",
4175
- "readonly": true
4176
- },
4177
- {
4178
- "kind": "field",
4179
- "name": "knownAlertIds",
4180
- "privacy": "private",
4181
- "default": "new Set<string>()"
4182
- },
4183
- {
4184
- "kind": "field",
4185
- "name": "serverSoundFetches",
4186
- "privacy": "private",
4187
- "readonly": true,
4188
- "default": "new Map<string, Promise<boolean>>()",
4189
- "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
4144
+ "name": "createEmptyParameter",
4145
+ "static": true
4190
4146
  },
4191
4147
  {
4192
4148
  "kind": "method",
4193
- "name": "subscribeToAlerts",
4194
- "privacy": "private",
4195
- "return": {
4196
- "type": {
4197
- "text": "void"
4149
+ "name": "getParameters",
4150
+ "static": true,
4151
+ "parameters": [
4152
+ {
4153
+ "name": "parameters"
4198
4154
  }
4199
- }
4200
- },
4201
- {
4202
- "kind": "field",
4203
- "name": "subscriptionHandler",
4204
- "privacy": "private"
4155
+ ]
4205
4156
  },
4206
4157
  {
4207
4158
  "kind": "method",
4208
- "name": "playForNewAlerts",
4159
+ "name": "buildRightValue",
4209
4160
  "privacy": "private",
4210
- "return": {
4211
- "type": {
4212
- "text": "Promise<void>"
4213
- }
4214
- },
4161
+ "static": true,
4215
4162
  "parameters": [
4216
4163
  {
4217
- "name": "rows",
4164
+ "name": "logicalOperator",
4218
4165
  "type": {
4219
- "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
4166
+ "text": "LogicalOperator"
4220
4167
  }
4168
+ },
4169
+ {
4170
+ "name": "condition"
4171
+ },
4172
+ {
4173
+ "name": "parameters",
4174
+ "optional": true
4221
4175
  }
4222
4176
  ]
4223
4177
  },
4224
4178
  {
4225
4179
  "kind": "method",
4226
- "name": "tryPlayServerSound",
4227
- "privacy": "private",
4228
- "return": {
4229
- "type": {
4230
- "text": "Promise<boolean>"
4231
- }
4232
- },
4180
+ "name": "getConditions",
4181
+ "static": true,
4233
4182
  "parameters": [
4234
4183
  {
4235
- "name": "dynamicRuleId",
4236
- "type": {
4237
- "text": "string"
4238
- }
4184
+ "name": "conditions"
4185
+ },
4186
+ {
4187
+ "name": "parameters",
4188
+ "optional": true
4239
4189
  }
4240
4190
  ]
4241
4191
  },
4242
4192
  {
4243
4193
  "kind": "method",
4244
- "name": "fetchAndCacheServerSound",
4245
- "privacy": "private",
4246
- "return": {
4247
- "type": {
4248
- "text": "Promise<boolean>"
4194
+ "name": "createParameterDetails",
4195
+ "static": true,
4196
+ "parameters": [
4197
+ {
4198
+ "name": "parameters"
4249
4199
  }
4250
- },
4200
+ ]
4201
+ }
4202
+ ]
4203
+ },
4204
+ {
4205
+ "kind": "class",
4206
+ "description": "",
4207
+ "name": "RuleUtils",
4208
+ "members": [
4209
+ {
4210
+ "kind": "method",
4211
+ "name": "buildRightValue",
4212
+ "privacy": "private",
4213
+ "static": true,
4251
4214
  "parameters": [
4252
4215
  {
4253
- "name": "dynamicRuleId",
4216
+ "name": "logicalOperator",
4254
4217
  "type": {
4255
- "text": "string"
4218
+ "text": "LogicalOperator"
4256
4219
  }
4220
+ },
4221
+ {
4222
+ "name": "condition"
4223
+ }
4224
+ ]
4225
+ },
4226
+ {
4227
+ "kind": "method",
4228
+ "name": "getConditions",
4229
+ "static": true,
4230
+ "parameters": [
4231
+ {
4232
+ "name": "conditions"
4257
4233
  }
4258
4234
  ]
4259
4235
  }
4260
- ],
4261
- "attributes": [
4236
+ ]
4237
+ },
4238
+ {
4239
+ "kind": "function",
4240
+ "name": "showNotificationError",
4241
+ "parameters": [
4262
4242
  {
4263
- "name": "sound-enabled",
4264
- "type": {
4265
- "text": "boolean"
4266
- },
4267
- "default": "true",
4268
- "description": "When false, new audible alerts are tracked but do not play.",
4269
- "fieldName": "soundEnabled"
4243
+ "name": "error"
4270
4244
  }
4271
- ],
4272
- "superclass": {
4273
- "name": "GenesisElement",
4274
- "package": "@genesislcap/web-core"
4275
- },
4276
- "tagName": "foundation-sounds",
4277
- "customElement": true
4245
+ ]
4278
4246
  }
4279
4247
  ],
4280
4248
  "exports": [
4281
4249
  {
4282
4250
  "kind": "js",
4283
- "name": "FoundationSounds",
4251
+ "name": "UUIDGenerator",
4284
4252
  "declaration": {
4285
- "name": "FoundationSounds",
4286
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
4253
+ "name": "UUIDGenerator",
4254
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4287
4255
  }
4288
4256
  },
4289
4257
  {
4290
- "kind": "custom-element-definition",
4291
- "name": "foundation-sounds",
4258
+ "kind": "js",
4259
+ "name": "isEmpty",
4292
4260
  "declaration": {
4293
- "name": "FoundationSounds",
4294
- "module": "src/components/foundation-sounds/foundation-sounds.ts"
4261
+ "name": "isEmpty",
4262
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4263
+ }
4264
+ },
4265
+ {
4266
+ "kind": "js",
4267
+ "name": "DynamicRuleUtils",
4268
+ "declaration": {
4269
+ "name": "DynamicRuleUtils",
4270
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4271
+ }
4272
+ },
4273
+ {
4274
+ "kind": "js",
4275
+ "name": "TemplateUtils",
4276
+ "declaration": {
4277
+ "name": "TemplateUtils",
4278
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4279
+ }
4280
+ },
4281
+ {
4282
+ "kind": "js",
4283
+ "name": "RuleUtils",
4284
+ "declaration": {
4285
+ "name": "RuleUtils",
4286
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4287
+ }
4288
+ },
4289
+ {
4290
+ "kind": "js",
4291
+ "name": "showNotificationError",
4292
+ "declaration": {
4293
+ "name": "showNotificationError",
4294
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4295
4295
  }
4296
4296
  }
4297
4297
  ]
@@ -5207,6 +5207,95 @@
5207
5207
  }
5208
5208
  ]
5209
5209
  },
5210
+ {
5211
+ "kind": "javascript-module",
5212
+ "path": "src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts",
5213
+ "declarations": [
5214
+ {
5215
+ "kind": "variable",
5216
+ "name": "ConditionBuilderStyles",
5217
+ "default": "css`\n .condition-builder {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n align-items: center;\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n rapid-button {\n margin: 0;\n }\n\n /* The AND/OR toggle sits on its own row ABOVE the condition it joins,\n rendered as a pair of small text links rather than buttons - reads like\n a sentence connector (\"... and ...\") instead of a UI control competing\n with the row's fields for attention. */\n .join-toggle-row {\n display: flex;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .join-toggle {\n display: flex;\n gap: calc(var(--design-unit) * 1.5px);\n }\n\n .join-text {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: var(--accent-fill-rest);\n cursor: pointer;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n opacity: 40%;\n }\n\n .join-text:hover {\n opacity: 70%;\n }\n\n .join-text.active {\n opacity: 100%;\n text-decoration: underline solid;\n }\n\n .join-text.active:hover {\n opacity: 100%;\n }\n\n .delete {\n margin: 0;\n display: flex;\n justify-content: center;\n height: calc(var(--design-unit) * 9px);\n }\n\n .delete:hover {\n background-color: color-mix(in srgb, var(--neutral-foreground-rest), transparent 89%);\n }\n\n rapid-text-field {\n width: 100%;\n margin-bottom: 0;\n }\n\n rapid-text-field::part(root) {\n height: calc(var(--design-unit) * 9px);\n }\n\n rapid-select {\n min-width: auto;\n }\n\n rapid-select.left-value::part(control) {\n width: 250px;\n }\n\n rapid-select.logical-operator::part(control) {\n width: 160px;\n }\n\n .logical-operator-null-and-blank {\n width: 100%;\n }\n\n rapid-select.right-criteria::part(control) {\n width: 135px;\n }\n\n rapid-select.right-criteria-user-entry {\n width: 100%;\n }\n\n rapid-select.right-criteria-select {\n width: 100%;\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
5218
+ },
5219
+ {
5220
+ "kind": "variable",
5221
+ "name": "ConditionGroupStyles",
5222
+ "default": "css`\n .condition-group-row {\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n /* The AND/OR toggle sits on its own row ABOVE the group it joins - see\n ConditionBuilderStyles' .join-toggle-row/.join-text for why it's a pair\n of text links rather than buttons. */\n .join-toggle-row {\n display: flex;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .join-toggle {\n display: flex;\n gap: calc(var(--design-unit) * 1.5px);\n }\n\n .join-text {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: var(--accent-fill-rest);\n cursor: pointer;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n opacity: 40%;\n }\n\n .join-text:hover {\n opacity: 70%;\n }\n\n .join-text.active {\n opacity: 100%;\n text-decoration: underline solid;\n }\n\n .join-text.active:hover {\n opacity: 100%;\n }\n\n /* A full bordered box reads as \"this is one parenthesized unit\" more\n literally than a left rail - it nests naturally too, a group inside a\n group just gets a second box drawn inside the first, like actual nested\n parens would look. */\n .condition-group-box {\n flex: 1;\n min-width: 0;\n border: calc(var(--design-unit) * 0.5px) solid\n color-mix(in srgb, var(--accent-fill-rest), transparent 25%);\n border-radius: calc(var(--design-unit) * 1px);\n padding: calc(var(--design-unit) * 2px);\n background-color: color-mix(in srgb, var(--accent-fill-rest), transparent 96%);\n }\n\n .condition-group-box > .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n align-items: center;\n margin-top: calc(var(--design-unit) * 1px);\n }\n\n .condition-group-box > .content-row rapid-button {\n font-size: 12px;\n }\n\n rule-condition-builder,\n rule-condition-group,\n template-condition-builder,\n template-condition-group {\n display: block;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .delete-group {\n margin: 0;\n opacity: 60%;\n }\n\n .delete-group:hover {\n opacity: 100%;\n }\n`"
5223
+ }
5224
+ ],
5225
+ "exports": [
5226
+ {
5227
+ "kind": "js",
5228
+ "name": "ConditionBuilderStyles",
5229
+ "declaration": {
5230
+ "name": "ConditionBuilderStyles",
5231
+ "module": "src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts"
5232
+ }
5233
+ },
5234
+ {
5235
+ "kind": "js",
5236
+ "name": "ConditionGroupStyles",
5237
+ "declaration": {
5238
+ "name": "ConditionGroupStyles",
5239
+ "module": "src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts"
5240
+ }
5241
+ }
5242
+ ]
5243
+ },
5244
+ {
5245
+ "kind": "javascript-module",
5246
+ "path": "src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts",
5247
+ "declarations": [
5248
+ {
5249
+ "kind": "variable",
5250
+ "name": "DynamicRuleManagementStyles",
5251
+ "default": "css`\n .container {\n display: flex;\n height: 100%;\n flex-direction: column;\n }\n\n .header {\n display: flex;\n flex-direction: row-reverse;\n }\n\n .grid {\n height: 100%;\n }\n`"
5252
+ },
5253
+ {
5254
+ "kind": "variable",
5255
+ "name": "DynamicRuleDialogStyles",
5256
+ "default": "css`\n ${scrollbarStyles}\n ${top}\n ${bottom}\n\n rapid-modal::part(dialog) {\n padding: 0;\n background: var(--neutral-layer-4);\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n }\n\n .dialog-content {\n display: flex;\n flex-direction: column;\n width: ${String(modalWidthPx)}px;\n max-height: 600px;\n overflow-y: scroll;\n gap: calc(var(--design-unit) * 3px);\n padding: calc(var(--design-unit) * 4px);\n }\n\n .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 3px);\n }\n\n .control {\n display: flex;\n flex-direction: column;\n width: 100%;\n gap: calc(var(--design-unit) * 2px);\n }\n\n .topic-lock-hint {\n color: var(--neutral-foreground-hint, var(--neutral-foreground-rest));\n font-size: var(--type-ramp-minus-1-font-size);\n line-height: var(--type-ramp-minus-1-line-height);\n }\n\n .items {\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n display: flex;\n padding: calc(var(--design-unit) * 2px);\n flex-direction: column;\n }\n\n .item {\n gap: 0;\n flex-direction: column;\n margin-bottom: 0;\n }\n\n ${textField}\n ${select}\n\n rapid-button {\n margin: 0;\n }\n\n rapid-select {\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n\n .horizontal {\n flex-direction: row;\n }\n\n .destination {\n align-self: center;\n }\n\n .topic {\n min-width: revert-layer;\n }\n\n .expression-preview {\n width: 100%;\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .expression-preview::part(control) {\n font-family: var(--body-font, monospace);\n font-size: 12px;\n color: var(--neutral-foreground-hint);\n min-height: calc(var(--design-unit) * 12px);\n resize: vertical;\n }\n\n .alert-sound {\n display: flex;\n flex-direction: column;\n gap: calc(var(--design-unit) * 2px);\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .alert-sound .file-input {\n display: none;\n }\n\n .alert-sound-row {\n display: flex;\n align-items: center;\n gap: calc(var(--design-unit) * 2px);\n flex-wrap: wrap;\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n padding: calc(var(--design-unit) * 2px);\n }\n\n .alert-sound-name {\n flex: 1;\n min-width: 120px;\n color: var(--neutral-foreground-hint);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n`"
5257
+ }
5258
+ ],
5259
+ "exports": [
5260
+ {
5261
+ "kind": "js",
5262
+ "name": "DynamicRuleManagementStyles",
5263
+ "declaration": {
5264
+ "name": "DynamicRuleManagementStyles",
5265
+ "module": "src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts"
5266
+ }
5267
+ },
5268
+ {
5269
+ "kind": "js",
5270
+ "name": "DynamicRuleDialogStyles",
5271
+ "declaration": {
5272
+ "name": "DynamicRuleDialogStyles",
5273
+ "module": "src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts"
5274
+ }
5275
+ }
5276
+ ]
5277
+ },
5278
+ {
5279
+ "kind": "javascript-module",
5280
+ "path": "src/components/foundation-notification-dashboard/styles/management.styles.ts",
5281
+ "declarations": [
5282
+ {
5283
+ "kind": "variable",
5284
+ "name": "managementGridStyles",
5285
+ "default": "css`\n :host {\n height: 100%;\n }\n\n .container {\n display: flex;\n height: 100%;\n flex-direction: column;\n }\n\n .header {\n display: flex;\n }\n\n .grid {\n height: 100%;\n }\n`"
5286
+ }
5287
+ ],
5288
+ "exports": [
5289
+ {
5290
+ "kind": "js",
5291
+ "name": "managementGridStyles",
5292
+ "declaration": {
5293
+ "name": "managementGridStyles",
5294
+ "module": "src/components/foundation-notification-dashboard/styles/management.styles.ts"
5295
+ }
5296
+ }
5297
+ ]
5298
+ },
5210
5299
  {
5211
5300
  "kind": "javascript-module",
5212
5301
  "path": "src/components/foundation-notification-dashboard/types/expression-type.ts",
@@ -5761,137 +5850,48 @@
5761
5850
  "type": {
5762
5851
  "text": "[\n { type: SEVERITY_INFORMATION, text: 'Information' },\n { type: SEVERITY_WARNING, text: 'Warning' },\n { type: SEVERITY_SERIOUS, text: 'Serious' },\n { type: SEVERITY_CRITICAL, text: 'Critical' },\n]"
5763
5852
  },
5764
- "default": "[\n { type: SEVERITY_INFORMATION, text: 'Information' },\n { type: SEVERITY_WARNING, text: 'Warning' },\n { type: SEVERITY_SERIOUS, text: 'Serious' },\n { type: SEVERITY_CRITICAL, text: 'Critical' },\n]"
5765
- }
5766
- ],
5767
- "exports": [
5768
- {
5769
- "kind": "js",
5770
- "name": "SEVERITY_INFORMATION",
5771
- "declaration": {
5772
- "name": "SEVERITY_INFORMATION",
5773
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5774
- }
5775
- },
5776
- {
5777
- "kind": "js",
5778
- "name": "SEVERITY_CRITICAL",
5779
- "declaration": {
5780
- "name": "SEVERITY_CRITICAL",
5781
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5782
- }
5783
- },
5784
- {
5785
- "kind": "js",
5786
- "name": "SEVERITY_SERIOUS",
5787
- "declaration": {
5788
- "name": "SEVERITY_SERIOUS",
5789
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5790
- }
5791
- },
5792
- {
5793
- "kind": "js",
5794
- "name": "SEVERITY_WARNING",
5795
- "declaration": {
5796
- "name": "SEVERITY_WARNING",
5797
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5798
- }
5799
- },
5800
- {
5801
- "kind": "js",
5802
- "name": "ALL_SEVERITIES",
5803
- "declaration": {
5804
- "name": "ALL_SEVERITIES",
5805
- "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5806
- }
5807
- }
5808
- ]
5809
- },
5810
- {
5811
- "kind": "javascript-module",
5812
- "path": "src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts",
5813
- "declarations": [
5814
- {
5815
- "kind": "variable",
5816
- "name": "ConditionBuilderStyles",
5817
- "default": "css`\n .condition-builder {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n align-items: center;\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n rapid-button {\n margin: 0;\n }\n\n /* The AND/OR toggle sits on its own row ABOVE the condition it joins,\n rendered as a pair of small text links rather than buttons - reads like\n a sentence connector (\"... and ...\") instead of a UI control competing\n with the row's fields for attention. */\n .join-toggle-row {\n display: flex;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .join-toggle {\n display: flex;\n gap: calc(var(--design-unit) * 1.5px);\n }\n\n .join-text {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: var(--accent-fill-rest);\n cursor: pointer;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n opacity: 40%;\n }\n\n .join-text:hover {\n opacity: 70%;\n }\n\n .join-text.active {\n opacity: 100%;\n text-decoration: underline solid;\n }\n\n .join-text.active:hover {\n opacity: 100%;\n }\n\n .delete {\n margin: 0;\n display: flex;\n justify-content: center;\n height: calc(var(--design-unit) * 9px);\n }\n\n .delete:hover {\n background-color: color-mix(in srgb, var(--neutral-foreground-rest), transparent 89%);\n }\n\n rapid-text-field {\n width: 100%;\n margin-bottom: 0;\n }\n\n rapid-text-field::part(root) {\n height: calc(var(--design-unit) * 9px);\n }\n\n rapid-select {\n min-width: auto;\n }\n\n rapid-select.left-value::part(control) {\n width: 250px;\n }\n\n rapid-select.logical-operator::part(control) {\n width: 160px;\n }\n\n .logical-operator-null-and-blank {\n width: 100%;\n }\n\n rapid-select.right-criteria::part(control) {\n width: 135px;\n }\n\n rapid-select.right-criteria-user-entry {\n width: 100%;\n }\n\n rapid-select.right-criteria-select {\n width: 100%;\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
5818
- },
5819
- {
5820
- "kind": "variable",
5821
- "name": "ConditionGroupStyles",
5822
- "default": "css`\n .condition-group-row {\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n /* The AND/OR toggle sits on its own row ABOVE the group it joins - see\n ConditionBuilderStyles' .join-toggle-row/.join-text for why it's a pair\n of text links rather than buttons. */\n .join-toggle-row {\n display: flex;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .join-toggle {\n display: flex;\n gap: calc(var(--design-unit) * 1.5px);\n }\n\n .join-text {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: var(--accent-fill-rest);\n cursor: pointer;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n opacity: 40%;\n }\n\n .join-text:hover {\n opacity: 70%;\n }\n\n .join-text.active {\n opacity: 100%;\n text-decoration: underline solid;\n }\n\n .join-text.active:hover {\n opacity: 100%;\n }\n\n /* A full bordered box reads as \"this is one parenthesized unit\" more\n literally than a left rail - it nests naturally too, a group inside a\n group just gets a second box drawn inside the first, like actual nested\n parens would look. */\n .condition-group-box {\n flex: 1;\n min-width: 0;\n border: calc(var(--design-unit) * 0.5px) solid\n color-mix(in srgb, var(--accent-fill-rest), transparent 25%);\n border-radius: calc(var(--design-unit) * 1px);\n padding: calc(var(--design-unit) * 2px);\n background-color: color-mix(in srgb, var(--accent-fill-rest), transparent 96%);\n }\n\n .condition-group-box > .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n align-items: center;\n margin-top: calc(var(--design-unit) * 1px);\n }\n\n .condition-group-box > .content-row rapid-button {\n font-size: 12px;\n }\n\n rule-condition-builder,\n rule-condition-group,\n template-condition-builder,\n template-condition-group {\n display: block;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .delete-group {\n margin: 0;\n opacity: 60%;\n }\n\n .delete-group:hover {\n opacity: 100%;\n }\n`"
5823
- }
5824
- ],
5825
- "exports": [
5826
- {
5827
- "kind": "js",
5828
- "name": "ConditionBuilderStyles",
5829
- "declaration": {
5830
- "name": "ConditionBuilderStyles",
5831
- "module": "src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts"
5832
- }
5833
- },
5834
- {
5835
- "kind": "js",
5836
- "name": "ConditionGroupStyles",
5837
- "declaration": {
5838
- "name": "ConditionGroupStyles",
5839
- "module": "src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts"
5840
- }
5841
- }
5842
- ]
5843
- },
5844
- {
5845
- "kind": "javascript-module",
5846
- "path": "src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts",
5847
- "declarations": [
5848
- {
5849
- "kind": "variable",
5850
- "name": "DynamicRuleManagementStyles",
5851
- "default": "css`\n .container {\n display: flex;\n height: 100%;\n flex-direction: column;\n }\n\n .header {\n display: flex;\n flex-direction: row-reverse;\n }\n\n .grid {\n height: 100%;\n }\n`"
5852
- },
5853
- {
5854
- "kind": "variable",
5855
- "name": "DynamicRuleDialogStyles",
5856
- "default": "css`\n ${scrollbarStyles}\n ${top}\n ${bottom}\n\n rapid-modal::part(dialog) {\n padding: 0;\n background: var(--neutral-layer-4);\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n }\n\n .dialog-content {\n display: flex;\n flex-direction: column;\n width: ${String(modalWidthPx)}px;\n max-height: 600px;\n overflow-y: scroll;\n gap: calc(var(--design-unit) * 3px);\n padding: calc(var(--design-unit) * 4px);\n }\n\n .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 3px);\n }\n\n .control {\n display: flex;\n flex-direction: column;\n width: 100%;\n gap: calc(var(--design-unit) * 2px);\n }\n\n .topic-lock-hint {\n color: var(--neutral-foreground-hint, var(--neutral-foreground-rest));\n font-size: var(--type-ramp-minus-1-font-size);\n line-height: var(--type-ramp-minus-1-line-height);\n }\n\n .items {\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n display: flex;\n padding: calc(var(--design-unit) * 2px);\n flex-direction: column;\n }\n\n .item {\n gap: 0;\n flex-direction: column;\n margin-bottom: 0;\n }\n\n ${textField}\n ${select}\n\n rapid-button {\n margin: 0;\n }\n\n rapid-select {\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n\n .horizontal {\n flex-direction: row;\n }\n\n .destination {\n align-self: center;\n }\n\n .topic {\n min-width: revert-layer;\n }\n\n .expression-preview {\n width: 100%;\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .expression-preview::part(control) {\n font-family: var(--body-font, monospace);\n font-size: 12px;\n color: var(--neutral-foreground-hint);\n min-height: calc(var(--design-unit) * 12px);\n resize: vertical;\n }\n\n .alert-sound {\n display: flex;\n flex-direction: column;\n gap: calc(var(--design-unit) * 2px);\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .alert-sound .file-input {\n display: none;\n }\n\n .alert-sound-row {\n display: flex;\n align-items: center;\n gap: calc(var(--design-unit) * 2px);\n flex-wrap: wrap;\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n padding: calc(var(--design-unit) * 2px);\n }\n\n .alert-sound-name {\n flex: 1;\n min-width: 120px;\n color: var(--neutral-foreground-hint);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n`"
5853
+ "default": "[\n { type: SEVERITY_INFORMATION, text: 'Information' },\n { type: SEVERITY_WARNING, text: 'Warning' },\n { type: SEVERITY_SERIOUS, text: 'Serious' },\n { type: SEVERITY_CRITICAL, text: 'Critical' },\n]"
5857
5854
  }
5858
5855
  ],
5859
5856
  "exports": [
5860
5857
  {
5861
5858
  "kind": "js",
5862
- "name": "DynamicRuleManagementStyles",
5859
+ "name": "SEVERITY_INFORMATION",
5863
5860
  "declaration": {
5864
- "name": "DynamicRuleManagementStyles",
5865
- "module": "src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts"
5861
+ "name": "SEVERITY_INFORMATION",
5862
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5866
5863
  }
5867
5864
  },
5868
5865
  {
5869
5866
  "kind": "js",
5870
- "name": "DynamicRuleDialogStyles",
5867
+ "name": "SEVERITY_CRITICAL",
5871
5868
  "declaration": {
5872
- "name": "DynamicRuleDialogStyles",
5873
- "module": "src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts"
5869
+ "name": "SEVERITY_CRITICAL",
5870
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5874
5871
  }
5875
- }
5876
- ]
5877
- },
5878
- {
5879
- "kind": "javascript-module",
5880
- "path": "src/components/foundation-notification-dashboard/styles/management.styles.ts",
5881
- "declarations": [
5872
+ },
5882
5873
  {
5883
- "kind": "variable",
5884
- "name": "managementGridStyles",
5885
- "default": "css`\n :host {\n height: 100%;\n }\n\n .container {\n display: flex;\n height: 100%;\n flex-direction: column;\n }\n\n .header {\n display: flex;\n }\n\n .grid {\n height: 100%;\n }\n`"
5886
- }
5887
- ],
5888
- "exports": [
5874
+ "kind": "js",
5875
+ "name": "SEVERITY_SERIOUS",
5876
+ "declaration": {
5877
+ "name": "SEVERITY_SERIOUS",
5878
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5879
+ }
5880
+ },
5889
5881
  {
5890
5882
  "kind": "js",
5891
- "name": "managementGridStyles",
5883
+ "name": "SEVERITY_WARNING",
5892
5884
  "declaration": {
5893
- "name": "managementGridStyles",
5894
- "module": "src/components/foundation-notification-dashboard/styles/management.styles.ts"
5885
+ "name": "SEVERITY_WARNING",
5886
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5887
+ }
5888
+ },
5889
+ {
5890
+ "kind": "js",
5891
+ "name": "ALL_SEVERITIES",
5892
+ "declaration": {
5893
+ "name": "ALL_SEVERITIES",
5894
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5895
5895
  }
5896
5896
  }
5897
5897
  ]
@@ -10213,268 +10213,54 @@
10213
10213
  },
10214
10214
  {
10215
10215
  "kind": "method",
10216
- "name": "deleteChild",
10217
- "parameters": [
10218
- {
10219
- "name": "deletedChild",
10220
- "type": {
10221
- "text": "ConditionNode"
10222
- }
10223
- }
10224
- ]
10225
- },
10226
- {
10227
- "kind": "method",
10228
- "name": "deleteSelf"
10229
- }
10230
- ],
10231
- "events": [
10232
- {
10233
- "description": "Fired when this whole group should be removed",
10234
- "name": "delete"
10235
- },
10236
- {
10237
- "description": "Fired when anything inside this group changes",
10238
- "name": "edit"
10239
- }
10240
- ],
10241
- "superclass": {
10242
- "name": "GenesisElement",
10243
- "package": "@genesislcap/web-core"
10244
- },
10245
- "tagName": "rule-condition-group",
10246
- "customElement": true
10247
- }
10248
- ],
10249
- "exports": [
10250
- {
10251
- "kind": "js",
10252
- "name": "RuleConditionGroup",
10253
- "declaration": {
10254
- "name": "RuleConditionGroup",
10255
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
10256
- }
10257
- },
10258
- {
10259
- "kind": "custom-element-definition",
10260
- "name": "rule-condition-group",
10261
- "declaration": {
10262
- "name": "RuleConditionGroup",
10263
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
10264
- }
10265
- }
10266
- ]
10267
- },
10268
- {
10269
- "kind": "javascript-module",
10270
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts",
10271
- "declarations": [
10272
- {
10273
- "kind": "variable",
10274
- "name": "ParameterBuilderStyles",
10275
- "default": "css`\n .parameter-builder {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n rapid-button {\n margin: 0;\n }\n\n .delete {\n margin: 0;\n display: flex;\n justify-content: center;\n height: calc(var(--design-unit) * 9px);\n }\n\n .delete:hover {\n background-color: color-mix(in srgb, var(--neutral-foreground-rest), transparent 89%);\n }\n\n rapid-text-field {\n width: 100%;\n margin-bottom: 0;\n }\n\n rapid-text-field::part(root) {\n height: calc(var(--design-unit) * 9px);\n }\n\n rapid-select {\n min-width: auto;\n }\n\n rapid-select.param-type::part(control) {\n width: 115px;\n }\n\n rapid-select.param-source-type::part(control) {\n width: 160px;\n }\n\n rapid-select.param-source::part(control) {\n width: ${PARAM_SOURCE_WIDTH}px;\n }\n\n rapid-text-field.param-source::part(root) {\n width: calc(${PARAM_SOURCE_WIDTH}px + 2px);\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
10276
- }
10277
- ],
10278
- "exports": [
10279
- {
10280
- "kind": "js",
10281
- "name": "ParameterBuilderStyles",
10282
- "declaration": {
10283
- "name": "ParameterBuilderStyles",
10284
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts"
10285
- }
10286
- }
10287
- ]
10288
- },
10289
- {
10290
- "kind": "javascript-module",
10291
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts",
10292
- "declarations": [
10293
- {
10294
- "kind": "variable",
10295
- "name": "ParameterBuilderTemplate",
10296
- "default": "html<ParameterBuilder>`\n <div class=\"parameter-builder\">\n <rapid-text-field\n id=\"param-name\"\n placeholder=\"Name\"\n :value=${sync((x) => x.name)}\n ></rapid-text-field>\n\n <rapid-text-field\n id=\"param-label\"\n placeholder=\"Label\"\n :value=${sync((x) => x.label)}\n ></rapid-text-field>\n\n <rapid-select\n id=\"param-source-type\"\n :value=${sync((x) => x.sourceType)}\n class=\"param-source-type\"\n >\n ${repeat(\n (x) => ALL_PARAM_SOURCE_TYPES,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_USER_TEXT,\n html<ParameterBuilder>`\n <rapid-text-field class=\"param-source\" disabled></rapid-text-field>\n `,\n )}\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_REQ_REP,\n html<ParameterBuilder>`\n <rapid-select\n ${ref('sourceSelect')}\n id=\"param-source\"\n :value=${sync((x) => x.sourceSelected)}\n class=\"param-source\"\n ?disabled=${(x) => x.sourceType !== PARAM_SOURCE_TYPE_REQ_REP}\n >\n ${repeat(\n (x) => x.reqRepItems,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n `,\n )}\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_DEFINED_GROUP,\n html<ParameterBuilder>`\n <rapid-text-field\n ${ref('sourceTextField')}\n class=\"param-source\"\n placeholder=\"item1,item2,item3\"\n :value=${sync((x) => x.sourceTyped)}\n ></rapid-text-field>\n `,\n )}\n\n <rapid-select id=\"param-type\" :value=${sync((x) => x.type)} class=\"param-type\">\n ${repeat(\n (x) => ALL_PARAM_TYPES,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n <rapid-button appearance=\"icon\" class=\"delete\" @click=${(x) => x.deleteParameter()}>\n <rapid-icon\n style=\"opacity: 0.5\"\n variant=\"regular\"\n name=\"trash-alt\"\n size=\"lg\"\n part=\"icon\"\n ></rapid-icon>\n </rapid-button>\n </div>\n`"
10297
- }
10298
- ],
10299
- "exports": [
10300
- {
10301
- "kind": "js",
10302
- "name": "ParameterBuilderTemplate",
10303
- "declaration": {
10304
- "name": "ParameterBuilderTemplate",
10305
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts"
10306
- }
10307
- }
10308
- ]
10309
- },
10310
- {
10311
- "kind": "javascript-module",
10312
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts",
10313
- "declarations": [
10314
- {
10315
- "kind": "class",
10316
- "description": "Parameter builder for notification templates.",
10317
- "name": "ParameterBuilder",
10318
- "members": [
10319
- {
10320
- "kind": "field",
10321
- "name": "parameter",
10322
- "type": {
10323
- "text": "ParameterBuilderEntity"
10324
- }
10325
- },
10326
- {
10327
- "kind": "field",
10328
- "name": "name",
10329
- "type": {
10330
- "text": "string"
10331
- }
10332
- },
10333
- {
10334
- "kind": "field",
10335
- "name": "label",
10336
- "type": {
10337
- "text": "string"
10338
- }
10339
- },
10340
- {
10341
- "kind": "field",
10342
- "name": "type",
10343
- "type": {
10344
- "text": "string"
10345
- }
10346
- },
10347
- {
10348
- "kind": "field",
10349
- "name": "sourceType",
10350
- "type": {
10351
- "text": "string"
10352
- }
10353
- },
10354
- {
10355
- "kind": "field",
10356
- "name": "sourceSelected",
10357
- "type": {
10358
- "text": "string"
10359
- }
10360
- },
10361
- {
10362
- "kind": "field",
10363
- "name": "sourceTyped",
10364
- "type": {
10365
- "text": "string"
10366
- }
10367
- },
10368
- {
10369
- "kind": "field",
10370
- "name": "sourceTextField",
10371
- "type": {
10372
- "text": "TextField"
10373
- }
10374
- },
10375
- {
10376
- "kind": "field",
10377
- "name": "sourceSelect",
10378
- "type": {
10379
- "text": "Select"
10380
- }
10381
- },
10382
- {
10383
- "kind": "field",
10384
- "name": "reqRepItems",
10385
- "type": {
10386
- "text": "array"
10387
- },
10388
- "default": "['REQUEST_1', 'REQUEST_2', 'REQUEST_3']"
10389
- },
10390
- {
10391
- "kind": "method",
10392
- "name": "deleteParameter"
10393
- },
10394
- {
10395
- "kind": "method",
10396
- "name": "parameterChanged"
10397
- },
10398
- {
10399
- "kind": "method",
10400
- "name": "nameChanged"
10401
- },
10402
- {
10403
- "kind": "method",
10404
- "name": "labelChanged"
10405
- },
10406
- {
10407
- "kind": "method",
10408
- "name": "typeChanged"
10409
- },
10410
- {
10411
- "kind": "method",
10412
- "name": "sourceTypeChanged"
10413
- },
10414
- {
10415
- "kind": "method",
10416
- "name": "sourceSelectedChanged"
10417
- },
10418
- {
10419
- "kind": "method",
10420
- "name": "sourceTypedChanged"
10421
- },
10422
- {
10423
- "kind": "method",
10424
- "name": "genericChanged",
10425
- "privacy": "private",
10216
+ "name": "deleteChild",
10426
10217
  "parameters": [
10427
10218
  {
10428
- "name": "parameterAttribute"
10429
- },
10430
- {
10431
- "name": "value"
10219
+ "name": "deletedChild",
10220
+ "type": {
10221
+ "text": "ConditionNode"
10222
+ }
10432
10223
  }
10433
10224
  ]
10225
+ },
10226
+ {
10227
+ "kind": "method",
10228
+ "name": "deleteSelf"
10434
10229
  }
10435
10230
  ],
10436
10231
  "events": [
10437
10232
  {
10438
- "description": "Fired when a parameter is deleted. detail: `ParameterBuilderEntity`",
10233
+ "description": "Fired when this whole group should be removed",
10439
10234
  "name": "delete"
10440
10235
  },
10441
10236
  {
10442
- "description": "Fired when a parameter is edited. detail: `ParameterBuilderEntity`",
10237
+ "description": "Fired when anything inside this group changes",
10443
10238
  "name": "edit"
10444
10239
  }
10445
10240
  ],
10446
- "attributes": [
10447
- {
10448
- "name": "parameter",
10449
- "type": {
10450
- "text": "ParameterBuilderEntity"
10451
- },
10452
- "fieldName": "parameter"
10453
- }
10454
- ],
10455
10241
  "superclass": {
10456
10242
  "name": "GenesisElement",
10457
10243
  "package": "@genesislcap/web-core"
10458
10244
  },
10459
- "tagName": "parameter-builder",
10245
+ "tagName": "rule-condition-group",
10460
10246
  "customElement": true
10461
10247
  }
10462
10248
  ],
10463
10249
  "exports": [
10464
10250
  {
10465
10251
  "kind": "js",
10466
- "name": "ParameterBuilder",
10252
+ "name": "RuleConditionGroup",
10467
10253
  "declaration": {
10468
- "name": "ParameterBuilder",
10469
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
10254
+ "name": "RuleConditionGroup",
10255
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
10470
10256
  }
10471
10257
  },
10472
10258
  {
10473
10259
  "kind": "custom-element-definition",
10474
- "name": "parameter-builder",
10260
+ "name": "rule-condition-group",
10475
10261
  "declaration": {
10476
- "name": "ParameterBuilder",
10477
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
10262
+ "name": "RuleConditionGroup",
10263
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
10478
10264
  }
10479
10265
  }
10480
10266
  ]
@@ -10763,6 +10549,220 @@
10763
10549
  }
10764
10550
  ]
10765
10551
  },
10552
+ {
10553
+ "kind": "javascript-module",
10554
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts",
10555
+ "declarations": [
10556
+ {
10557
+ "kind": "variable",
10558
+ "name": "ParameterBuilderStyles",
10559
+ "default": "css`\n .parameter-builder {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n rapid-button {\n margin: 0;\n }\n\n .delete {\n margin: 0;\n display: flex;\n justify-content: center;\n height: calc(var(--design-unit) * 9px);\n }\n\n .delete:hover {\n background-color: color-mix(in srgb, var(--neutral-foreground-rest), transparent 89%);\n }\n\n rapid-text-field {\n width: 100%;\n margin-bottom: 0;\n }\n\n rapid-text-field::part(root) {\n height: calc(var(--design-unit) * 9px);\n }\n\n rapid-select {\n min-width: auto;\n }\n\n rapid-select.param-type::part(control) {\n width: 115px;\n }\n\n rapid-select.param-source-type::part(control) {\n width: 160px;\n }\n\n rapid-select.param-source::part(control) {\n width: ${PARAM_SOURCE_WIDTH}px;\n }\n\n rapid-text-field.param-source::part(root) {\n width: calc(${PARAM_SOURCE_WIDTH}px + 2px);\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
10560
+ }
10561
+ ],
10562
+ "exports": [
10563
+ {
10564
+ "kind": "js",
10565
+ "name": "ParameterBuilderStyles",
10566
+ "declaration": {
10567
+ "name": "ParameterBuilderStyles",
10568
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts"
10569
+ }
10570
+ }
10571
+ ]
10572
+ },
10573
+ {
10574
+ "kind": "javascript-module",
10575
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts",
10576
+ "declarations": [
10577
+ {
10578
+ "kind": "variable",
10579
+ "name": "ParameterBuilderTemplate",
10580
+ "default": "html<ParameterBuilder>`\n <div class=\"parameter-builder\">\n <rapid-text-field\n id=\"param-name\"\n placeholder=\"Name\"\n :value=${sync((x) => x.name)}\n ></rapid-text-field>\n\n <rapid-text-field\n id=\"param-label\"\n placeholder=\"Label\"\n :value=${sync((x) => x.label)}\n ></rapid-text-field>\n\n <rapid-select\n id=\"param-source-type\"\n :value=${sync((x) => x.sourceType)}\n class=\"param-source-type\"\n >\n ${repeat(\n (x) => ALL_PARAM_SOURCE_TYPES,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_USER_TEXT,\n html<ParameterBuilder>`\n <rapid-text-field class=\"param-source\" disabled></rapid-text-field>\n `,\n )}\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_REQ_REP,\n html<ParameterBuilder>`\n <rapid-select\n ${ref('sourceSelect')}\n id=\"param-source\"\n :value=${sync((x) => x.sourceSelected)}\n class=\"param-source\"\n ?disabled=${(x) => x.sourceType !== PARAM_SOURCE_TYPE_REQ_REP}\n >\n ${repeat(\n (x) => x.reqRepItems,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n `,\n )}\n ${when(\n (x) => x.sourceType === PARAM_SOURCE_TYPE_DEFINED_GROUP,\n html<ParameterBuilder>`\n <rapid-text-field\n ${ref('sourceTextField')}\n class=\"param-source\"\n placeholder=\"item1,item2,item3\"\n :value=${sync((x) => x.sourceTyped)}\n ></rapid-text-field>\n `,\n )}\n\n <rapid-select id=\"param-type\" :value=${sync((x) => x.type)} class=\"param-type\">\n ${repeat(\n (x) => ALL_PARAM_TYPES,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n <rapid-button appearance=\"icon\" class=\"delete\" @click=${(x) => x.deleteParameter()}>\n <rapid-icon\n style=\"opacity: 0.5\"\n variant=\"regular\"\n name=\"trash-alt\"\n size=\"lg\"\n part=\"icon\"\n ></rapid-icon>\n </rapid-button>\n </div>\n`"
10581
+ }
10582
+ ],
10583
+ "exports": [
10584
+ {
10585
+ "kind": "js",
10586
+ "name": "ParameterBuilderTemplate",
10587
+ "declaration": {
10588
+ "name": "ParameterBuilderTemplate",
10589
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts"
10590
+ }
10591
+ }
10592
+ ]
10593
+ },
10594
+ {
10595
+ "kind": "javascript-module",
10596
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts",
10597
+ "declarations": [
10598
+ {
10599
+ "kind": "class",
10600
+ "description": "Parameter builder for notification templates.",
10601
+ "name": "ParameterBuilder",
10602
+ "members": [
10603
+ {
10604
+ "kind": "field",
10605
+ "name": "parameter",
10606
+ "type": {
10607
+ "text": "ParameterBuilderEntity"
10608
+ }
10609
+ },
10610
+ {
10611
+ "kind": "field",
10612
+ "name": "name",
10613
+ "type": {
10614
+ "text": "string"
10615
+ }
10616
+ },
10617
+ {
10618
+ "kind": "field",
10619
+ "name": "label",
10620
+ "type": {
10621
+ "text": "string"
10622
+ }
10623
+ },
10624
+ {
10625
+ "kind": "field",
10626
+ "name": "type",
10627
+ "type": {
10628
+ "text": "string"
10629
+ }
10630
+ },
10631
+ {
10632
+ "kind": "field",
10633
+ "name": "sourceType",
10634
+ "type": {
10635
+ "text": "string"
10636
+ }
10637
+ },
10638
+ {
10639
+ "kind": "field",
10640
+ "name": "sourceSelected",
10641
+ "type": {
10642
+ "text": "string"
10643
+ }
10644
+ },
10645
+ {
10646
+ "kind": "field",
10647
+ "name": "sourceTyped",
10648
+ "type": {
10649
+ "text": "string"
10650
+ }
10651
+ },
10652
+ {
10653
+ "kind": "field",
10654
+ "name": "sourceTextField",
10655
+ "type": {
10656
+ "text": "TextField"
10657
+ }
10658
+ },
10659
+ {
10660
+ "kind": "field",
10661
+ "name": "sourceSelect",
10662
+ "type": {
10663
+ "text": "Select"
10664
+ }
10665
+ },
10666
+ {
10667
+ "kind": "field",
10668
+ "name": "reqRepItems",
10669
+ "type": {
10670
+ "text": "array"
10671
+ },
10672
+ "default": "['REQUEST_1', 'REQUEST_2', 'REQUEST_3']"
10673
+ },
10674
+ {
10675
+ "kind": "method",
10676
+ "name": "deleteParameter"
10677
+ },
10678
+ {
10679
+ "kind": "method",
10680
+ "name": "parameterChanged"
10681
+ },
10682
+ {
10683
+ "kind": "method",
10684
+ "name": "nameChanged"
10685
+ },
10686
+ {
10687
+ "kind": "method",
10688
+ "name": "labelChanged"
10689
+ },
10690
+ {
10691
+ "kind": "method",
10692
+ "name": "typeChanged"
10693
+ },
10694
+ {
10695
+ "kind": "method",
10696
+ "name": "sourceTypeChanged"
10697
+ },
10698
+ {
10699
+ "kind": "method",
10700
+ "name": "sourceSelectedChanged"
10701
+ },
10702
+ {
10703
+ "kind": "method",
10704
+ "name": "sourceTypedChanged"
10705
+ },
10706
+ {
10707
+ "kind": "method",
10708
+ "name": "genericChanged",
10709
+ "privacy": "private",
10710
+ "parameters": [
10711
+ {
10712
+ "name": "parameterAttribute"
10713
+ },
10714
+ {
10715
+ "name": "value"
10716
+ }
10717
+ ]
10718
+ }
10719
+ ],
10720
+ "events": [
10721
+ {
10722
+ "description": "Fired when a parameter is deleted. detail: `ParameterBuilderEntity`",
10723
+ "name": "delete"
10724
+ },
10725
+ {
10726
+ "description": "Fired when a parameter is edited. detail: `ParameterBuilderEntity`",
10727
+ "name": "edit"
10728
+ }
10729
+ ],
10730
+ "attributes": [
10731
+ {
10732
+ "name": "parameter",
10733
+ "type": {
10734
+ "text": "ParameterBuilderEntity"
10735
+ },
10736
+ "fieldName": "parameter"
10737
+ }
10738
+ ],
10739
+ "superclass": {
10740
+ "name": "GenesisElement",
10741
+ "package": "@genesislcap/web-core"
10742
+ },
10743
+ "tagName": "parameter-builder",
10744
+ "customElement": true
10745
+ }
10746
+ ],
10747
+ "exports": [
10748
+ {
10749
+ "kind": "js",
10750
+ "name": "ParameterBuilder",
10751
+ "declaration": {
10752
+ "name": "ParameterBuilder",
10753
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
10754
+ }
10755
+ },
10756
+ {
10757
+ "kind": "custom-element-definition",
10758
+ "name": "parameter-builder",
10759
+ "declaration": {
10760
+ "name": "ParameterBuilder",
10761
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts"
10762
+ }
10763
+ }
10764
+ ]
10765
+ },
10766
10766
  {
10767
10767
  "kind": "javascript-module",
10768
10768
  "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts",