@genesislcap/pbc-notify-ui 15.46.0 → 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.
@@ -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,98 @@
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"
2982
+ "name": "onPatternInput",
2983
+ "return": {
2984
+ "type": {
2985
+ "text": "boolean"
2986
+ }
2987
+ },
2988
+ "parameters": [
2989
+ {
2990
+ "name": "index",
2991
+ "type": {
2992
+ "text": "number"
2993
+ }
2994
+ },
2995
+ {
2996
+ "name": "event",
2997
+ "type": {
2998
+ "text": "Event"
2999
+ }
3000
+ }
3001
+ ]
2973
3002
  },
2974
3003
  {
2975
3004
  "kind": "method",
2976
- "name": "onAlertSoundSelected",
3005
+ "name": "onRuleChange",
3006
+ "return": {
3007
+ "type": {
3008
+ "text": "boolean"
3009
+ }
3010
+ },
2977
3011
  "parameters": [
3012
+ {
3013
+ "name": "index",
3014
+ "type": {
3015
+ "text": "number"
3016
+ }
3017
+ },
2978
3018
  {
2979
3019
  "name": "event",
2980
3020
  "type": {
@@ -2985,892 +3025,944 @@
2985
3025
  },
2986
3026
  {
2987
3027
  "kind": "method",
2988
- "name": "clearAttachedAlertSound"
3028
+ "name": "openFilePicker",
3029
+ "return": {
3030
+ "type": {
3031
+ "text": "boolean"
3032
+ }
3033
+ },
3034
+ "parameters": [
3035
+ {
3036
+ "name": "index",
3037
+ "type": {
3038
+ "text": "number"
3039
+ }
3040
+ }
3041
+ ]
2989
3042
  },
2990
3043
  {
2991
3044
  "kind": "method",
2992
- "name": "testAttachedAlertSound"
3045
+ "name": "onFileSelected",
3046
+ "return": {
3047
+ "type": {
3048
+ "text": "boolean"
3049
+ }
3050
+ },
3051
+ "parameters": [
3052
+ {
3053
+ "name": "event",
3054
+ "type": {
3055
+ "text": "Event"
3056
+ }
3057
+ }
3058
+ ]
2993
3059
  },
2994
3060
  {
2995
3061
  "kind": "method",
2996
- "name": "stopTestSound"
3062
+ "name": "clearSound",
3063
+ "return": {
3064
+ "type": {
3065
+ "text": "boolean"
3066
+ }
3067
+ },
3068
+ "parameters": [
3069
+ {
3070
+ "name": "index",
3071
+ "type": {
3072
+ "text": "number"
3073
+ }
3074
+ }
3075
+ ]
2997
3076
  },
2998
3077
  {
2999
3078
  "kind": "method",
3000
- "name": "resetAlertSoundState"
3079
+ "name": "testSound",
3080
+ "return": {
3081
+ "type": {
3082
+ "text": "boolean"
3083
+ }
3084
+ },
3085
+ "parameters": [
3086
+ {
3087
+ "name": "index",
3088
+ "type": {
3089
+ "text": "number"
3090
+ }
3091
+ }
3092
+ ]
3001
3093
  },
3002
3094
  {
3003
3095
  "kind": "method",
3004
- "name": "applyAlertSoundToPayload",
3096
+ "name": "toggleRuleMute",
3005
3097
  "return": {
3006
3098
  "type": {
3007
- "text": "T"
3099
+ "text": "boolean"
3008
3100
  }
3009
3101
  },
3010
3102
  "parameters": [
3011
3103
  {
3012
- "name": "target",
3104
+ "name": "index",
3013
3105
  "type": {
3014
- "text": "T"
3106
+ "text": "number"
3015
3107
  }
3016
3108
  }
3017
- ],
3018
- "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3109
+ ]
3019
3110
  },
3020
3111
  {
3021
3112
  "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": [
3113
+ "name": "onVolumeChange",
3114
+ "return": {
3115
+ "type": {
3116
+ "text": "boolean"
3117
+ }
3118
+ },
3119
+ "parameters": [
3120
+ {
3121
+ "name": "event",
3122
+ "type": {
3123
+ "text": "Event"
3124
+ }
3125
+ }
3126
+ ]
3127
+ },
3027
3128
  {
3028
- "name": "Base",
3029
- "type": {
3030
- "text": "TBase"
3129
+ "kind": "method",
3130
+ "name": "toggleMute",
3131
+ "return": {
3132
+ "type": {
3133
+ "text": "boolean"
3134
+ }
3031
3135
  }
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": [
3136
+ },
3102
3137
  {
3103
- "kind": "field",
3104
- "name": "id",
3105
- "type": {
3106
- "text": "string"
3138
+ "kind": "method",
3139
+ "name": "addRule",
3140
+ "return": {
3141
+ "type": {
3142
+ "text": "boolean"
3143
+ }
3107
3144
  }
3108
3145
  },
3109
3146
  {
3110
- "kind": "field",
3111
- "name": "name",
3112
- "type": {
3113
- "text": "string"
3114
- }
3147
+ "kind": "method",
3148
+ "name": "removeRule",
3149
+ "return": {
3150
+ "type": {
3151
+ "text": "boolean"
3152
+ }
3153
+ },
3154
+ "parameters": [
3155
+ {
3156
+ "name": "index",
3157
+ "type": {
3158
+ "text": "number"
3159
+ }
3160
+ }
3161
+ ]
3115
3162
  },
3116
3163
  {
3117
- "kind": "field",
3118
- "name": "component",
3119
- "type": {
3120
- "text": "string"
3121
- }
3164
+ "kind": "method",
3165
+ "name": "reloadRules",
3166
+ "return": {
3167
+ "type": {
3168
+ "text": "Promise<void>"
3169
+ }
3170
+ },
3171
+ "description": "Reloads the notification-rule picker (e.g. when the Sounds tab is opened)."
3122
3172
  },
3123
3173
  {
3124
- "kind": "field",
3125
- "name": "right",
3126
- "type": {
3127
- "text": "string"
3174
+ "kind": "method",
3175
+ "name": "loadRules",
3176
+ "privacy": "private",
3177
+ "return": {
3178
+ "type": {
3179
+ "text": "Promise<void>"
3180
+ }
3128
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[]"
3212
+ }
3213
+ },
3214
+ "parameters": [
3215
+ {
3216
+ "name": "ruleList",
3217
+ "type": {
3218
+ "text": "NamedRuleRow[]"
3219
+ }
3220
+ }
3221
+ ]
3222
+ },
3223
+ {
3224
+ "kind": "method",
3225
+ "name": "ruleMatchId",
3226
+ "privacy": "private",
3227
+ "return": {
3228
+ "type": {
3229
+ "text": "string"
3230
+ }
3231
+ },
3232
+ "parameters": [
3233
+ {
3234
+ "name": "rule",
3235
+ "type": {
3236
+ "text": "NamedRuleRow | undefined"
3237
+ }
3238
+ }
3239
+ ]
3240
+ },
3241
+ {
3242
+ "kind": "method",
3243
+ "name": "syncSoundState",
3244
+ "privacy": "private"
3129
3245
  }
3130
- ]
3131
- },
3132
- {
3133
- "kind": "variable",
3134
- "name": "NOTIFICATION_DASHBOARD_TABS",
3135
- "type": {
3136
- "text": "NotificationDashboardTab[]"
3246
+ ],
3247
+ "superclass": {
3248
+ "name": "GenesisElement",
3249
+ "package": "@genesislcap/web-core"
3137
3250
  },
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]"
3251
+ "tagName": "foundation-sounds-panel",
3252
+ "customElement": true
3139
3253
  }
3140
3254
  ],
3141
3255
  "exports": [
3142
3256
  {
3143
3257
  "kind": "js",
3144
- "name": "NotificationDashboardTab",
3258
+ "name": "FoundationSoundsPanel",
3145
3259
  "declaration": {
3146
- "name": "NotificationDashboardTab",
3147
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3260
+ "name": "FoundationSoundsPanel",
3261
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3148
3262
  }
3149
3263
  },
3150
3264
  {
3151
- "kind": "js",
3152
- "name": "NOTIFICATION_DASHBOARD_TABS",
3265
+ "kind": "custom-element-definition",
3266
+ "name": "foundation-sounds-panel",
3153
3267
  "declaration": {
3154
- "name": "NOTIFICATION_DASHBOARD_TABS",
3155
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3268
+ "name": "FoundationSoundsPanel",
3269
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3156
3270
  }
3157
3271
  }
3158
3272
  ]
3159
3273
  },
3160
3274
  {
3161
3275
  "kind": "javascript-module",
3162
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3276
+ "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
3163
3277
  "declarations": [
3164
3278
  {
3165
3279
  "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`"
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."
3168
3283
  }
3169
3284
  ],
3170
3285
  "exports": [
3171
3286
  {
3172
3287
  "kind": "js",
3173
- "name": "FoundationNotificationDashboardTemplate",
3288
+ "name": "FoundationSoundsStyles",
3174
3289
  "declaration": {
3175
- "name": "FoundationNotificationDashboardTemplate",
3176
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3290
+ "name": "FoundationSoundsStyles",
3291
+ "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
3177
3292
  }
3178
3293
  }
3179
3294
  ]
3180
3295
  },
3181
3296
  {
3182
3297
  "kind": "javascript-module",
3183
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3298
+ "path": "src/components/foundation-sounds/foundation-sounds.ts",
3184
3299
  "declarations": [
3185
3300
  {
3186
3301
  "kind": "class",
3187
- "description": "",
3188
- "name": "FoundationNotificationDashboard",
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",
3189
3304
  "members": [
3190
3305
  {
3191
3306
  "kind": "field",
3192
- "name": "auth",
3307
+ "name": "connect",
3193
3308
  "type": {
3194
- "text": "Auth"
3309
+ "text": "Connect"
3195
3310
  }
3196
3311
  },
3197
3312
  {
3198
3313
  "kind": "field",
3199
- "name": "ready",
3314
+ "name": "inboxService",
3200
3315
  "type": {
3201
- "text": "boolean"
3202
- },
3203
- "default": "false"
3316
+ "text": "FoundationInboxService"
3317
+ }
3204
3318
  },
3205
3319
  {
3206
3320
  "kind": "field",
3207
- "name": "hasPermissions",
3321
+ "name": "ruleService",
3208
3322
  "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": [
3323
+ "text": "RuleService"
3324
+ }
3325
+ },
3250
3326
  {
3251
3327
  "kind": "field",
3252
- "name": "uuid",
3328
+ "name": "soundEnabled",
3253
3329
  "type": {
3254
- "text": "UUID"
3330
+ "text": "boolean"
3255
3331
  },
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
3332
+ "default": "true",
3333
+ "description": "When false, new audible alerts are tracked but do not play."
3289
3334
  },
3290
3335
  {
3291
3336
  "kind": "field",
3292
- "name": "createPlaceholderAssignment",
3293
- "static": true
3337
+ "name": "connectionSub",
3338
+ "type": {
3339
+ "text": "Subscription | undefined"
3340
+ },
3341
+ "privacy": "private"
3294
3342
  },
3295
3343
  {
3296
3344
  "kind": "field",
3297
- "name": "createTextAssignment",
3298
- "static": true
3345
+ "name": "player",
3346
+ "privacy": "private",
3347
+ "readonly": true
3299
3348
  },
3300
3349
  {
3301
3350
  "kind": "field",
3302
- "name": "getAssignmentValue",
3303
- "static": true
3351
+ "name": "knownAlertIds",
3352
+ "privacy": "private",
3353
+ "default": "new Set<string>()"
3304
3354
  },
3305
3355
  {
3306
3356
  "kind": "field",
3307
- "name": "getAssignmentText",
3308
- "static": true
3309
- },
3310
- {
3311
- "kind": "method",
3312
- "name": "createConditions",
3313
- "static": true,
3314
- "return": {
3315
- "type": {
3316
- "text": "any"
3317
- }
3318
- },
3319
- "parameters": [
3320
- {
3321
- "name": "conditions",
3322
- "type": {
3323
- "text": "ConditionNode[]"
3324
- }
3325
- },
3326
- {
3327
- "name": "parameters",
3328
- "optional": true
3329
- }
3330
- ]
3331
- },
3332
- {
3333
- "kind": "method",
3334
- "name": "hasMultiValueCondition",
3335
- "static": true,
3336
- "return": {
3337
- "type": {
3338
- "text": "boolean"
3339
- }
3340
- },
3341
- "parameters": [
3342
- {
3343
- "name": "conditions",
3344
- "type": {
3345
- "text": "ConditionNode[]"
3346
- }
3347
- }
3348
- ]
3349
- },
3350
- {
3351
- "kind": "method",
3352
- "name": "hasOrJoin",
3353
- "static": true,
3354
- "return": {
3355
- "type": {
3356
- "text": "boolean"
3357
- }
3358
- },
3359
- "parameters": [
3360
- {
3361
- "name": "conditions",
3362
- "type": {
3363
- "text": "ConditionNode[]"
3364
- }
3365
- }
3366
- ]
3367
- },
3368
- {
3369
- "kind": "method",
3370
- "name": "hasGroup",
3371
- "static": true,
3372
- "return": {
3373
- "type": {
3374
- "text": "boolean"
3375
- }
3376
- },
3377
- "parameters": [
3378
- {
3379
- "name": "conditions",
3380
- "type": {
3381
- "text": "ConditionNode[]"
3382
- }
3383
- }
3384
- ]
3385
- },
3386
- {
3387
- "kind": "method",
3388
- "name": "hasUnsupportedOperator",
3389
- "static": true,
3390
- "return": {
3391
- "type": {
3392
- "text": "boolean"
3393
- }
3394
- },
3395
- "parameters": [
3396
- {
3397
- "name": "conditions",
3398
- "type": {
3399
- "text": "ConditionNode[]"
3400
- }
3401
- }
3402
- ]
3403
- },
3404
- {
3405
- "kind": "method",
3406
- "name": "hasCurrentUser",
3407
- "static": true,
3408
- "return": {
3409
- "type": {
3410
- "text": "boolean"
3411
- }
3412
- },
3413
- "parameters": [
3414
- {
3415
- "name": "conditions",
3416
- "type": {
3417
- "text": "ConditionNode[]"
3418
- }
3419
- }
3420
- ]
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."
3421
3362
  },
3422
3363
  {
3423
3364
  "kind": "method",
3424
- "name": "flattenConditions",
3425
- "static": true,
3365
+ "name": "subscribeToAlerts",
3366
+ "privacy": "private",
3426
3367
  "return": {
3427
3368
  "type": {
3428
- "text": "ConditionBuilderEntity[]"
3429
- }
3430
- },
3431
- "parameters": [
3432
- {
3433
- "name": "conditions",
3434
- "type": {
3435
- "text": "ConditionNode[]"
3436
- }
3369
+ "text": "void"
3437
3370
  }
3438
- ]
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
3511
+ },
3512
+ {
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."
3547
3587
  },
3548
3588
  {
3549
3589
  "kind": "method",
3550
- "name": "getConditions",
3551
- "static": true,
3590
+ "name": "loadExistingAlertSound",
3552
3591
  "parameters": [
3553
3592
  {
3554
- "name": "conditions"
3555
- },
3556
- {
3557
- "name": "parameters",
3558
- "optional": true
3593
+ "name": "dynamicRuleId",
3594
+ "type": {
3595
+ "text": "string"
3596
+ }
3559
3597
  }
3560
3598
  ]
3561
3599
  },
3562
3600
  {
3563
3601
  "kind": "method",
3564
- "name": "createParameterDetails",
3565
- "static": true,
3566
- "parameters": [
3567
- {
3568
- "name": "parameters"
3569
- }
3570
- ]
3571
- }
3572
- ]
3573
- },
3574
- {
3575
- "kind": "class",
3576
- "description": "",
3577
- "name": "RuleUtils",
3578
- "members": [
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",
3670
+ "name": "alertSoundAttachmentTemplate",
3622
3671
  "declaration": {
3623
- "name": "UUIDGenerator",
3624
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3672
+ "name": "alertSoundAttachmentTemplate",
3673
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3625
3674
  }
3626
3675
  },
3627
3676
  {
3628
3677
  "kind": "js",
3629
- "name": "isEmpty",
3678
+ "name": "AlertSoundAttachmentMixin",
3630
3679
  "declaration": {
3631
- "name": "isEmpty",
3632
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3680
+ "name": "AlertSoundAttachmentMixin",
3681
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3633
3682
  }
3634
- },
3683
+ }
3684
+ ]
3685
+ },
3686
+ {
3687
+ "kind": "javascript-module",
3688
+ "path": "src/components/foundation-notification-dashboard/index.ts",
3689
+ "declarations": [],
3690
+ "exports": [
3635
3691
  {
3636
3692
  "kind": "js",
3637
- "name": "DynamicRuleUtils",
3693
+ "name": "*",
3638
3694
  "declaration": {
3639
- "name": "DynamicRuleUtils",
3640
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3695
+ "name": "*",
3696
+ "package": "./notification-dashboard"
3641
3697
  }
3642
- },
3698
+ }
3699
+ ]
3700
+ },
3701
+ {
3702
+ "kind": "javascript-module",
3703
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
3704
+ "declarations": [
3705
+ {
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": [
3643
3713
  {
3644
3714
  "kind": "js",
3645
- "name": "TemplateUtils",
3715
+ "name": "FoundationNotificationDashboardStyles",
3646
3716
  "declaration": {
3647
- "name": "TemplateUtils",
3648
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3717
+ "name": "FoundationNotificationDashboardStyles",
3718
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
3649
3719
  }
3720
+ }
3721
+ ]
3722
+ },
3723
+ {
3724
+ "kind": "javascript-module",
3725
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
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
+ ]
3650
3761
  },
3762
+ {
3763
+ "kind": "variable",
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]"
3769
+ }
3770
+ ],
3771
+ "exports": [
3651
3772
  {
3652
3773
  "kind": "js",
3653
- "name": "RuleUtils",
3774
+ "name": "NotificationDashboardTab",
3654
3775
  "declaration": {
3655
- "name": "RuleUtils",
3656
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3776
+ "name": "NotificationDashboardTab",
3777
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3657
3778
  }
3658
3779
  },
3659
3780
  {
3660
3781
  "kind": "js",
3661
- "name": "showNotificationError",
3782
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3662
3783
  "declaration": {
3663
- "name": "showNotificationError",
3664
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3784
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3785
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3665
3786
  }
3666
3787
  }
3667
3788
  ]
3668
3789
  },
3669
3790
  {
3670
3791
  "kind": "javascript-module",
3671
- "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
3792
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3672
3793
  "declarations": [
3673
3794
  {
3674
3795
  "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`"
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`"
3677
3798
  }
3678
3799
  ],
3679
3800
  "exports": [
3680
3801
  {
3681
3802
  "kind": "js",
3682
- "name": "FoundationSoundsPanelStyles",
3803
+ "name": "FoundationNotificationDashboardTemplate",
3683
3804
  "declaration": {
3684
- "name": "FoundationSoundsPanelStyles",
3685
- "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
3805
+ "name": "FoundationNotificationDashboardTemplate",
3806
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3686
3807
  }
3687
3808
  }
3688
3809
  ]
3689
3810
  },
3690
3811
  {
3691
3812
  "kind": "javascript-module",
3692
- "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
3813
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3693
3814
  "declarations": [
3694
3815
  {
3695
- "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`"
3816
+ "kind": "class",
3817
+ "description": "",
3818
+ "name": "FoundationNotificationDashboard",
3819
+ "members": [
3820
+ {
3821
+ "kind": "field",
3822
+ "name": "auth",
3823
+ "type": {
3824
+ "text": "Auth"
3825
+ }
3826
+ },
3827
+ {
3828
+ "kind": "field",
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
3698
3850
  }
3699
3851
  ],
3700
3852
  "exports": [
3701
3853
  {
3702
3854
  "kind": "js",
3703
- "name": "FoundationSoundsPanelTemplate",
3855
+ "name": "FoundationNotificationDashboard",
3704
3856
  "declaration": {
3705
- "name": "FoundationSoundsPanelTemplate",
3706
- "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
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"
3707
3867
  }
3708
3868
  }
3709
3869
  ]
3710
3870
  },
3711
3871
  {
3712
3872
  "kind": "javascript-module",
3713
- "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
3873
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3714
3874
  "declarations": [
3715
3875
  {
3716
3876
  "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",
3877
+ "description": "",
3878
+ "name": "UUIDGenerator",
3719
3879
  "members": [
3720
3880
  {
3721
3881
  "kind": "field",
3722
- "name": "ruleService",
3723
- "type": {
3724
- "text": "RuleService"
3725
- }
3726
- },
3727
- {
3728
- "kind": "field",
3729
- "name": "volumePercent",
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,352 +4042,256 @@
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
- }
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."
4067
+ }
4068
+ ]
4021
4069
  },
4022
4070
  {
4023
4071
  "kind": "method",
4024
- "name": "applyRuleSelectValues",
4025
- "privacy": "private",
4072
+ "name": "resolveLeftValues",
4073
+ "static": true,
4026
4074
  "return": {
4027
4075
  "type": {
4028
- "text": "void"
4076
+ "text": "ConditionNode[]"
4029
4077
  }
4030
4078
  },
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...\"."
4079
+ "parameters": [
4080
+ {
4081
+ "name": "conditions",
4082
+ "type": {
4083
+ "text": "ConditionNode[]"
4084
+ }
4085
+ },
4086
+ {
4087
+ "name": "fields",
4088
+ "type": {
4089
+ "text": "any[]"
4090
+ }
4091
+ }
4092
+ ]
4093
+ },
4094
+ {
4095
+ "kind": "field",
4096
+ "name": "createEmptyGroup",
4097
+ "static": true
4032
4098
  },
4033
4099
  {
4034
4100
  "kind": "method",
4035
- "name": "mapRules",
4036
- "privacy": "private",
4101
+ "name": "buildRawExpression",
4102
+ "static": true,
4037
4103
  "return": {
4038
4104
  "type": {
4039
- "text": "AlertSoundSelectableRule[]"
4105
+ "text": "string"
4040
4106
  }
4041
4107
  },
4042
4108
  "parameters": [
4043
4109
  {
4044
- "name": "ruleList",
4110
+ "name": "conditions",
4045
4111
  "type": {
4046
- "text": "NamedRuleRow[]"
4112
+ "text": "ConditionNode[]"
4047
4113
  }
4048
4114
  }
4049
4115
  ]
4050
4116
  },
4051
4117
  {
4052
4118
  "kind": "method",
4053
- "name": "ruleMatchId",
4054
- "privacy": "private",
4119
+ "name": "parseRawExpression",
4120
+ "static": true,
4055
4121
  "return": {
4056
4122
  "type": {
4057
- "text": "string"
4123
+ "text": "ConditionNode[] | null"
4058
4124
  }
4059
4125
  },
4060
4126
  "parameters": [
4061
4127
  {
4062
- "name": "rule",
4128
+ "name": "rawExpression",
4063
4129
  "type": {
4064
- "text": "NamedRuleRow | undefined"
4130
+ "text": "string"
4065
4131
  }
4066
4132
  }
4067
4133
  ]
4068
- },
4069
- {
4070
- "kind": "method",
4071
- "name": "syncSoundState",
4072
- "privacy": "private"
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>()"
4144
+ "name": "createEmptyParameter",
4145
+ "static": true
4182
4146
  },
4183
4147
  {
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."
4148
+ "kind": "method",
4149
+ "name": "getParameters",
4150
+ "static": true,
4151
+ "parameters": [
4152
+ {
4153
+ "name": "parameters"
4154
+ }
4155
+ ]
4190
4156
  },
4191
4157
  {
4192
4158
  "kind": "method",
4193
- "name": "subscribeToAlerts",
4159
+ "name": "buildRightValue",
4194
4160
  "privacy": "private",
4195
- "return": {
4196
- "type": {
4197
- "text": "void"
4161
+ "static": true,
4162
+ "parameters": [
4163
+ {
4164
+ "name": "logicalOperator",
4165
+ "type": {
4166
+ "text": "LogicalOperator"
4167
+ }
4168
+ },
4169
+ {
4170
+ "name": "condition"
4171
+ },
4172
+ {
4173
+ "name": "parameters",
4174
+ "optional": true
4198
4175
  }
4199
- }
4176
+ ]
4200
4177
  },
4201
4178
  {
4202
- "kind": "field",
4203
- "name": "subscriptionHandler",
4204
- "privacy": "private"
4179
+ "kind": "method",
4180
+ "name": "getConditions",
4181
+ "static": true,
4182
+ "parameters": [
4183
+ {
4184
+ "name": "conditions"
4185
+ },
4186
+ {
4187
+ "name": "parameters",
4188
+ "optional": true
4189
+ }
4190
+ ]
4205
4191
  },
4206
4192
  {
4207
4193
  "kind": "method",
4208
- "name": "playForNewAlerts",
4209
- "privacy": "private",
4210
- "return": {
4211
- "type": {
4212
- "text": "Promise<void>"
4213
- }
4214
- },
4194
+ "name": "createParameterDetails",
4195
+ "static": true,
4215
4196
  "parameters": [
4216
4197
  {
4217
- "name": "rows",
4218
- "type": {
4219
- "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
4220
- }
4198
+ "name": "parameters"
4221
4199
  }
4222
4200
  ]
4223
- },
4201
+ }
4202
+ ]
4203
+ },
4204
+ {
4205
+ "kind": "class",
4206
+ "description": "",
4207
+ "name": "RuleUtils",
4208
+ "members": [
4224
4209
  {
4225
4210
  "kind": "method",
4226
- "name": "tryPlayServerSound",
4211
+ "name": "buildRightValue",
4227
4212
  "privacy": "private",
4228
- "return": {
4229
- "type": {
4230
- "text": "Promise<boolean>"
4231
- }
4232
- },
4213
+ "static": true,
4233
4214
  "parameters": [
4234
4215
  {
4235
- "name": "dynamicRuleId",
4216
+ "name": "logicalOperator",
4236
4217
  "type": {
4237
- "text": "string"
4218
+ "text": "LogicalOperator"
4238
4219
  }
4220
+ },
4221
+ {
4222
+ "name": "condition"
4239
4223
  }
4240
4224
  ]
4241
4225
  },
4242
4226
  {
4243
- "kind": "method",
4244
- "name": "fetchAndCacheServerSound",
4245
- "privacy": "private",
4246
- "return": {
4247
- "type": {
4248
- "text": "Promise<boolean>"
4249
- }
4250
- },
4227
+ "kind": "method",
4228
+ "name": "getConditions",
4229
+ "static": true,
4251
4230
  "parameters": [
4252
4231
  {
4253
- "name": "dynamicRuleId",
4254
- "type": {
4255
- "text": "string"
4256
- }
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",
@@ -5801,97 +5890,8 @@
5801
5890
  "kind": "js",
5802
5891
  "name": "ALL_SEVERITIES",
5803
5892
  "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`"
5857
- }
5858
- ],
5859
- "exports": [
5860
- {
5861
- "kind": "js",
5862
- "name": "DynamicRuleManagementStyles",
5863
- "declaration": {
5864
- "name": "DynamicRuleManagementStyles",
5865
- "module": "src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts"
5866
- }
5867
- },
5868
- {
5869
- "kind": "js",
5870
- "name": "DynamicRuleDialogStyles",
5871
- "declaration": {
5872
- "name": "DynamicRuleDialogStyles",
5873
- "module": "src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts"
5874
- }
5875
- }
5876
- ]
5877
- },
5878
- {
5879
- "kind": "javascript-module",
5880
- "path": "src/components/foundation-notification-dashboard/styles/management.styles.ts",
5881
- "declarations": [
5882
- {
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": [
5889
- {
5890
- "kind": "js",
5891
- "name": "managementGridStyles",
5892
- "declaration": {
5893
- "name": "managementGridStyles",
5894
- "module": "src/components/foundation-notification-dashboard/styles/management.styles.ts"
5893
+ "name": "ALL_SEVERITIES",
5894
+ "module": "src/components/foundation-notification-dashboard/types/severity.ts"
5895
5895
  }
5896
5896
  }
5897
5897
  ]
@@ -7604,70 +7604,70 @@
7604
7604
  },
7605
7605
  {
7606
7606
  "kind": "javascript-module",
7607
- "path": "src/components/foundation-notification-dashboard/components/routes/route-management.ts",
7607
+ "path": "src/components/foundation-notification-dashboard/components/notify-audit/notify-audit-management.ts",
7608
7608
  "declarations": [
7609
7609
  {
7610
7610
  "kind": "class",
7611
7611
  "description": "",
7612
- "name": "RouteManagement",
7612
+ "name": "NotifyAuditManagement",
7613
7613
  "superclass": {
7614
7614
  "name": "GenesisElement",
7615
7615
  "package": "@genesislcap/web-core"
7616
7616
  },
7617
- "tagName": "route-management",
7617
+ "tagName": "notify-audit-management",
7618
7618
  "customElement": true
7619
7619
  }
7620
7620
  ],
7621
7621
  "exports": [
7622
7622
  {
7623
7623
  "kind": "js",
7624
- "name": "RouteManagement",
7624
+ "name": "NotifyAuditManagement",
7625
7625
  "declaration": {
7626
- "name": "RouteManagement",
7627
- "module": "src/components/foundation-notification-dashboard/components/routes/route-management.ts"
7626
+ "name": "NotifyAuditManagement",
7627
+ "module": "src/components/foundation-notification-dashboard/components/notify-audit/notify-audit-management.ts"
7628
7628
  }
7629
7629
  },
7630
7630
  {
7631
7631
  "kind": "custom-element-definition",
7632
- "name": "route-management",
7632
+ "name": "notify-audit-management",
7633
7633
  "declaration": {
7634
- "name": "RouteManagement",
7635
- "module": "src/components/foundation-notification-dashboard/components/routes/route-management.ts"
7634
+ "name": "NotifyAuditManagement",
7635
+ "module": "src/components/foundation-notification-dashboard/components/notify-audit/notify-audit-management.ts"
7636
7636
  }
7637
7637
  }
7638
7638
  ]
7639
7639
  },
7640
7640
  {
7641
7641
  "kind": "javascript-module",
7642
- "path": "src/components/foundation-notification-dashboard/components/notify-audit/notify-audit-management.ts",
7642
+ "path": "src/components/foundation-notification-dashboard/components/routes/route-management.ts",
7643
7643
  "declarations": [
7644
7644
  {
7645
7645
  "kind": "class",
7646
7646
  "description": "",
7647
- "name": "NotifyAuditManagement",
7647
+ "name": "RouteManagement",
7648
7648
  "superclass": {
7649
7649
  "name": "GenesisElement",
7650
7650
  "package": "@genesislcap/web-core"
7651
7651
  },
7652
- "tagName": "notify-audit-management",
7652
+ "tagName": "route-management",
7653
7653
  "customElement": true
7654
7654
  }
7655
7655
  ],
7656
7656
  "exports": [
7657
7657
  {
7658
7658
  "kind": "js",
7659
- "name": "NotifyAuditManagement",
7659
+ "name": "RouteManagement",
7660
7660
  "declaration": {
7661
- "name": "NotifyAuditManagement",
7662
- "module": "src/components/foundation-notification-dashboard/components/notify-audit/notify-audit-management.ts"
7661
+ "name": "RouteManagement",
7662
+ "module": "src/components/foundation-notification-dashboard/components/routes/route-management.ts"
7663
7663
  }
7664
7664
  },
7665
7665
  {
7666
7666
  "kind": "custom-element-definition",
7667
- "name": "notify-audit-management",
7667
+ "name": "route-management",
7668
7668
  "declaration": {
7669
- "name": "NotifyAuditManagement",
7670
- "module": "src/components/foundation-notification-dashboard/components/notify-audit/notify-audit-management.ts"
7669
+ "name": "RouteManagement",
7670
+ "module": "src/components/foundation-notification-dashboard/components/routes/route-management.ts"
7671
7671
  }
7672
7672
  }
7673
7673
  ]
@@ -9682,301 +9682,151 @@
9682
9682
  },
9683
9683
  {
9684
9684
  "kind": "method",
9685
- "name": "openAlertSoundPicker",
9686
- "inheritedFrom": {
9687
- "name": "AlertSoundAttachmentMixin",
9688
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9689
- }
9690
- },
9691
- {
9692
- "kind": "method",
9693
- "name": "onAlertSoundSelected",
9694
- "parameters": [
9695
- {
9696
- "name": "event",
9697
- "type": {
9698
- "text": "Event"
9699
- }
9700
- }
9701
- ],
9702
- "inheritedFrom": {
9703
- "name": "AlertSoundAttachmentMixin",
9704
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9705
- }
9706
- },
9707
- {
9708
- "kind": "method",
9709
- "name": "clearAttachedAlertSound",
9710
- "inheritedFrom": {
9711
- "name": "AlertSoundAttachmentMixin",
9712
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9713
- }
9714
- },
9715
- {
9716
- "kind": "method",
9717
- "name": "testAttachedAlertSound",
9718
- "inheritedFrom": {
9719
- "name": "AlertSoundAttachmentMixin",
9720
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9721
- }
9722
- },
9723
- {
9724
- "kind": "method",
9725
- "name": "stopTestSound",
9726
- "inheritedFrom": {
9727
- "name": "AlertSoundAttachmentMixin",
9728
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9729
- }
9730
- },
9731
- {
9732
- "kind": "method",
9733
- "name": "resetAlertSoundState",
9734
- "inheritedFrom": {
9735
- "name": "AlertSoundAttachmentMixin",
9736
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9737
- }
9738
- },
9739
- {
9740
- "kind": "method",
9741
- "name": "applyAlertSoundToPayload",
9742
- "return": {
9743
- "type": {
9744
- "text": "T"
9745
- }
9746
- },
9747
- "parameters": [
9748
- {
9749
- "name": "target",
9750
- "type": {
9751
- "text": "T"
9752
- }
9753
- }
9754
- ],
9755
- "description": "Merges pending sound / clear flag onto a create/update DETAILS object.",
9756
- "inheritedFrom": {
9757
- "name": "AlertSoundAttachmentMixin",
9758
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9759
- }
9760
- },
9761
- {
9762
- "kind": "method",
9763
- "name": "syncAlertSoundCacheAfterSave",
9764
- "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.",
9765
- "inheritedFrom": {
9766
- "name": "AlertSoundAttachmentMixin",
9767
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9768
- }
9769
- }
9770
- ],
9771
- "events": [
9772
- {
9773
- "description": "Fired when the dialog should close",
9774
- "name": "close"
9775
- }
9776
- ],
9777
- "mixins": [
9778
- {
9779
- "name": "AlertSoundAttachmentMixin",
9780
- "module": "/src/components/foundation-notification-dashboard/alert-sound-attachment"
9781
- }
9782
- ],
9783
- "superclass": {
9784
- "name": "GenesisElement",
9785
- "package": "@genesislcap/web-core"
9786
- },
9787
- "tagName": "template-dialog",
9788
- "customElement": true
9789
- }
9790
- ],
9791
- "exports": [
9792
- {
9793
- "kind": "js",
9794
- "name": "TemplateDialog",
9795
- "declaration": {
9796
- "name": "TemplateDialog",
9797
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
9798
- }
9799
- },
9800
- {
9801
- "kind": "custom-element-definition",
9802
- "name": "template-dialog",
9803
- "declaration": {
9804
- "name": "TemplateDialog",
9805
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
9806
- }
9807
- }
9808
- ]
9809
- },
9810
- {
9811
- "kind": "javascript-module",
9812
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts",
9813
- "declarations": [
9814
- {
9815
- "kind": "variable",
9816
- "name": "TemplateDialogMode",
9817
- "type": {
9818
- "text": "{\n CREATE: 'create',\n EDIT: 'edit',\n}"
9819
- },
9820
- "default": "{\n CREATE: 'create',\n EDIT: 'edit',\n}"
9821
- }
9822
- ],
9823
- "exports": [
9824
- {
9825
- "kind": "js",
9826
- "name": "TemplateDialogMode",
9827
- "declaration": {
9828
- "name": "TemplateDialogMode",
9829
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts"
9830
- }
9831
- }
9832
- ]
9833
- },
9834
- {
9835
- "kind": "javascript-module",
9836
- "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts",
9837
- "declarations": [
9838
- {
9839
- "kind": "variable",
9840
- "name": "RuleConditionGroupTemplate",
9841
- "default": "html<RuleConditionGroup>`\n ${when(\n (x) => !x.isFirst,\n html`\n <div class=\"join-toggle-row\">\n <div class=\"join-toggle\">\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'AND'])}\"\n @click=${(x) => (x.joinOperator = 'AND')}\n >\n AND\n </span>\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'OR'])}\"\n @click=${(x) => (x.joinOperator = 'OR')}\n >\n OR\n </span>\n </div>\n </div>\n `,\n )}\n <div class=\"condition-group-row\">\n <div class=\"condition-group-box\">\n ${repeat(\n (x) => x.groupChildren,\n html<ConditionNode, RuleConditionGroup>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <rule-condition-group\n :fields=${(x, c) => c.parent.fields}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></rule-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <rule-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></rule-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>+ Group</rapid-button>\n <rapid-button appearance=\"icon\" class=\"delete-group\" @click=${(x) => x.deleteSelf()}>\n <rapid-icon variant=\"regular\" name=\"trash-alt\" size=\"lg\" part=\"icon\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n </div>\n`"
9842
- }
9843
- ],
9844
- "exports": [
9845
- {
9846
- "kind": "js",
9847
- "name": "RuleConditionGroupTemplate",
9848
- "declaration": {
9849
- "name": "RuleConditionGroupTemplate",
9850
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts"
9851
- }
9852
- }
9853
- ]
9854
- },
9855
- {
9856
- "kind": "javascript-module",
9857
- "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts",
9858
- "declarations": [
9859
- {
9860
- "kind": "class",
9861
- "description": "Parenthesized group of conditions/nested groups for notification rule\ncriteria, joined to the previous sibling via AND/OR like a single\ncondition row - but bracketing its own children off from the rest of the\nlist, so e.g. \"(A && B) || C\" can be expressed without the AND silently\nspanning more than intended.",
9862
- "name": "RuleConditionGroup",
9863
- "members": [
9864
- {
9865
- "kind": "field",
9866
- "name": "node",
9867
- "type": {
9868
- "text": "ConditionGroupEntity"
9869
- }
9870
- },
9871
- {
9872
- "kind": "field",
9873
- "name": "fields",
9874
- "type": {
9875
- "text": "Field[]"
9876
- },
9877
- "default": "[]"
9878
- },
9879
- {
9880
- "kind": "field",
9881
- "name": "isFirst",
9882
- "type": {
9883
- "text": "boolean"
9884
- },
9885
- "default": "false"
9886
- },
9887
- {
9888
- "kind": "field",
9889
- "name": "joinOperator",
9890
- "type": {
9891
- "text": "string"
9892
- }
9893
- },
9894
- {
9895
- "kind": "field",
9896
- "name": "groupChildren",
9897
- "type": {
9898
- "text": "ConditionNode[]"
9899
- },
9900
- "default": "[]"
9685
+ "name": "openAlertSoundPicker",
9686
+ "inheritedFrom": {
9687
+ "name": "AlertSoundAttachmentMixin",
9688
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9689
+ }
9901
9690
  },
9902
9691
  {
9903
9692
  "kind": "method",
9904
- "name": "nodeChanged"
9693
+ "name": "onAlertSoundSelected",
9694
+ "parameters": [
9695
+ {
9696
+ "name": "event",
9697
+ "type": {
9698
+ "text": "Event"
9699
+ }
9700
+ }
9701
+ ],
9702
+ "inheritedFrom": {
9703
+ "name": "AlertSoundAttachmentMixin",
9704
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9705
+ }
9905
9706
  },
9906
9707
  {
9907
9708
  "kind": "method",
9908
- "name": "joinOperatorChanged"
9709
+ "name": "clearAttachedAlertSound",
9710
+ "inheritedFrom": {
9711
+ "name": "AlertSoundAttachmentMixin",
9712
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9713
+ }
9909
9714
  },
9910
9715
  {
9911
9716
  "kind": "method",
9912
- "name": "newCondition"
9717
+ "name": "testAttachedAlertSound",
9718
+ "inheritedFrom": {
9719
+ "name": "AlertSoundAttachmentMixin",
9720
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9721
+ }
9913
9722
  },
9914
9723
  {
9915
9724
  "kind": "method",
9916
- "name": "newGroup"
9725
+ "name": "stopTestSound",
9726
+ "inheritedFrom": {
9727
+ "name": "AlertSoundAttachmentMixin",
9728
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9729
+ }
9917
9730
  },
9918
9731
  {
9919
9732
  "kind": "method",
9920
- "name": "editChild",
9921
- "parameters": [
9922
- {
9923
- "name": "_editedChild",
9924
- "type": {
9925
- "text": "ConditionNode"
9926
- }
9927
- }
9928
- ]
9733
+ "name": "resetAlertSoundState",
9734
+ "inheritedFrom": {
9735
+ "name": "AlertSoundAttachmentMixin",
9736
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9737
+ }
9929
9738
  },
9930
9739
  {
9931
9740
  "kind": "method",
9932
- "name": "deleteChild",
9741
+ "name": "applyAlertSoundToPayload",
9742
+ "return": {
9743
+ "type": {
9744
+ "text": "T"
9745
+ }
9746
+ },
9933
9747
  "parameters": [
9934
9748
  {
9935
- "name": "deletedChild",
9749
+ "name": "target",
9936
9750
  "type": {
9937
- "text": "ConditionNode"
9751
+ "text": "T"
9938
9752
  }
9939
9753
  }
9940
- ]
9754
+ ],
9755
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object.",
9756
+ "inheritedFrom": {
9757
+ "name": "AlertSoundAttachmentMixin",
9758
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9759
+ }
9941
9760
  },
9942
9761
  {
9943
9762
  "kind": "method",
9944
- "name": "deleteSelf"
9763
+ "name": "syncAlertSoundCacheAfterSave",
9764
+ "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.",
9765
+ "inheritedFrom": {
9766
+ "name": "AlertSoundAttachmentMixin",
9767
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9768
+ }
9945
9769
  }
9946
9770
  ],
9947
9771
  "events": [
9948
9772
  {
9949
- "description": "Fired when this whole group should be removed",
9950
- "name": "delete"
9951
- },
9773
+ "description": "Fired when the dialog should close",
9774
+ "name": "close"
9775
+ }
9776
+ ],
9777
+ "mixins": [
9952
9778
  {
9953
- "description": "Fired when anything inside this group changes",
9954
- "name": "edit"
9779
+ "name": "AlertSoundAttachmentMixin",
9780
+ "module": "/src/components/foundation-notification-dashboard/alert-sound-attachment"
9955
9781
  }
9956
9782
  ],
9957
9783
  "superclass": {
9958
9784
  "name": "GenesisElement",
9959
9785
  "package": "@genesislcap/web-core"
9960
9786
  },
9961
- "tagName": "rule-condition-group",
9787
+ "tagName": "template-dialog",
9962
9788
  "customElement": true
9963
9789
  }
9964
9790
  ],
9965
9791
  "exports": [
9966
9792
  {
9967
9793
  "kind": "js",
9968
- "name": "RuleConditionGroup",
9794
+ "name": "TemplateDialog",
9969
9795
  "declaration": {
9970
- "name": "RuleConditionGroup",
9971
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
9796
+ "name": "TemplateDialog",
9797
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
9972
9798
  }
9973
9799
  },
9974
9800
  {
9975
9801
  "kind": "custom-element-definition",
9976
- "name": "rule-condition-group",
9802
+ "name": "template-dialog",
9977
9803
  "declaration": {
9978
- "name": "RuleConditionGroup",
9979
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
9804
+ "name": "TemplateDialog",
9805
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
9806
+ }
9807
+ }
9808
+ ]
9809
+ },
9810
+ {
9811
+ "kind": "javascript-module",
9812
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts",
9813
+ "declarations": [
9814
+ {
9815
+ "kind": "variable",
9816
+ "name": "TemplateDialogMode",
9817
+ "type": {
9818
+ "text": "{\n CREATE: 'create',\n EDIT: 'edit',\n}"
9819
+ },
9820
+ "default": "{\n CREATE: 'create',\n EDIT: 'edit',\n}"
9821
+ }
9822
+ ],
9823
+ "exports": [
9824
+ {
9825
+ "kind": "js",
9826
+ "name": "TemplateDialogMode",
9827
+ "declaration": {
9828
+ "name": "TemplateDialogMode",
9829
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts"
9980
9830
  }
9981
9831
  }
9982
9832
  ]
@@ -10267,214 +10117,150 @@
10267
10117
  },
10268
10118
  {
10269
10119
  "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",
10120
+ "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts",
10292
10121
  "declarations": [
10293
10122
  {
10294
10123
  "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`"
10124
+ "name": "RuleConditionGroupTemplate",
10125
+ "default": "html<RuleConditionGroup>`\n ${when(\n (x) => !x.isFirst,\n html`\n <div class=\"join-toggle-row\">\n <div class=\"join-toggle\">\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'AND'])}\"\n @click=${(x) => (x.joinOperator = 'AND')}\n >\n AND\n </span>\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'OR'])}\"\n @click=${(x) => (x.joinOperator = 'OR')}\n >\n OR\n </span>\n </div>\n </div>\n `,\n )}\n <div class=\"condition-group-row\">\n <div class=\"condition-group-box\">\n ${repeat(\n (x) => x.groupChildren,\n html<ConditionNode, RuleConditionGroup>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <rule-condition-group\n :fields=${(x, c) => c.parent.fields}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></rule-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <rule-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></rule-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>+ Group</rapid-button>\n <rapid-button appearance=\"icon\" class=\"delete-group\" @click=${(x) => x.deleteSelf()}>\n <rapid-icon variant=\"regular\" name=\"trash-alt\" size=\"lg\" part=\"icon\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n </div>\n`"
10297
10126
  }
10298
10127
  ],
10299
10128
  "exports": [
10300
10129
  {
10301
10130
  "kind": "js",
10302
- "name": "ParameterBuilderTemplate",
10131
+ "name": "RuleConditionGroupTemplate",
10303
10132
  "declaration": {
10304
- "name": "ParameterBuilderTemplate",
10305
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.template.ts"
10133
+ "name": "RuleConditionGroupTemplate",
10134
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts"
10306
10135
  }
10307
10136
  }
10308
10137
  ]
10309
10138
  },
10310
10139
  {
10311
10140
  "kind": "javascript-module",
10312
- "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts",
10141
+ "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts",
10313
10142
  "declarations": [
10314
10143
  {
10315
10144
  "kind": "class",
10316
- "description": "Parameter builder for notification templates.",
10317
- "name": "ParameterBuilder",
10145
+ "description": "Parenthesized group of conditions/nested groups for notification rule\ncriteria, joined to the previous sibling via AND/OR like a single\ncondition row - but bracketing its own children off from the rest of the\nlist, so e.g. \"(A && B) || C\" can be expressed without the AND silently\nspanning more than intended.",
10146
+ "name": "RuleConditionGroup",
10318
10147
  "members": [
10319
10148
  {
10320
10149
  "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",
10150
+ "name": "node",
10343
10151
  "type": {
10344
- "text": "string"
10152
+ "text": "ConditionGroupEntity"
10345
10153
  }
10346
10154
  },
10347
10155
  {
10348
10156
  "kind": "field",
10349
- "name": "sourceType",
10157
+ "name": "fields",
10350
10158
  "type": {
10351
- "text": "string"
10352
- }
10159
+ "text": "Field[]"
10160
+ },
10161
+ "default": "[]"
10353
10162
  },
10354
10163
  {
10355
10164
  "kind": "field",
10356
- "name": "sourceSelected",
10165
+ "name": "isFirst",
10357
10166
  "type": {
10358
- "text": "string"
10359
- }
10167
+ "text": "boolean"
10168
+ },
10169
+ "default": "false"
10360
10170
  },
10361
10171
  {
10362
10172
  "kind": "field",
10363
- "name": "sourceTyped",
10173
+ "name": "joinOperator",
10364
10174
  "type": {
10365
10175
  "text": "string"
10366
10176
  }
10367
10177
  },
10368
10178
  {
10369
10179
  "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",
10180
+ "name": "groupChildren",
10385
10181
  "type": {
10386
- "text": "array"
10182
+ "text": "ConditionNode[]"
10387
10183
  },
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"
10184
+ "default": "[]"
10401
10185
  },
10402
10186
  {
10403
10187
  "kind": "method",
10404
- "name": "labelChanged"
10188
+ "name": "nodeChanged"
10405
10189
  },
10406
10190
  {
10407
10191
  "kind": "method",
10408
- "name": "typeChanged"
10192
+ "name": "joinOperatorChanged"
10409
10193
  },
10410
10194
  {
10411
10195
  "kind": "method",
10412
- "name": "sourceTypeChanged"
10196
+ "name": "newCondition"
10413
10197
  },
10414
10198
  {
10415
10199
  "kind": "method",
10416
- "name": "sourceSelectedChanged"
10200
+ "name": "newGroup"
10417
10201
  },
10418
10202
  {
10419
10203
  "kind": "method",
10420
- "name": "sourceTypedChanged"
10204
+ "name": "editChild",
10205
+ "parameters": [
10206
+ {
10207
+ "name": "_editedChild",
10208
+ "type": {
10209
+ "text": "ConditionNode"
10210
+ }
10211
+ }
10212
+ ]
10421
10213
  },
10422
10214
  {
10423
10215
  "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",