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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -505,27 +505,6 @@
505
505
  }
506
506
  ]
507
507
  },
508
- {
509
- "kind": "javascript-module",
510
- "path": "src/styles/scrollbar.styles.ts",
511
- "declarations": [
512
- {
513
- "kind": "variable",
514
- "name": "scrollbarStyles",
515
- "default": "css`\n ::-webkit-scrollbar {\n width: calc((var(--base-height-multiplier) + var(--design-unit)) * 1px);\n }\n\n ::-webkit-scrollbar-track {\n background: var(--neutral-layer-1);\n }\n\n ::-webkit-scrollbar-thumb {\n background: var(--neutral-fill-rest);\n }\n`"
516
- }
517
- ],
518
- "exports": [
519
- {
520
- "kind": "js",
521
- "name": "scrollbarStyles",
522
- "declaration": {
523
- "name": "scrollbarStyles",
524
- "module": "src/styles/scrollbar.styles.ts"
525
- }
526
- }
527
- ]
528
- },
529
508
  {
530
509
  "kind": "javascript-module",
531
510
  "path": "src/utils/eventDetail.ts",
@@ -847,6 +826,27 @@
847
826
  }
848
827
  ]
849
828
  },
829
+ {
830
+ "kind": "javascript-module",
831
+ "path": "src/styles/scrollbar.styles.ts",
832
+ "declarations": [
833
+ {
834
+ "kind": "variable",
835
+ "name": "scrollbarStyles",
836
+ "default": "css`\n ::-webkit-scrollbar {\n width: calc((var(--base-height-multiplier) + var(--design-unit)) * 1px);\n }\n\n ::-webkit-scrollbar-track {\n background: var(--neutral-layer-1);\n }\n\n ::-webkit-scrollbar-thumb {\n background: var(--neutral-fill-rest);\n }\n`"
837
+ }
838
+ ],
839
+ "exports": [
840
+ {
841
+ "kind": "js",
842
+ "name": "scrollbarStyles",
843
+ "declaration": {
844
+ "name": "scrollbarStyles",
845
+ "module": "src/styles/scrollbar.styles.ts"
846
+ }
847
+ }
848
+ ]
849
+ },
850
850
  {
851
851
  "kind": "javascript-module",
852
852
  "path": "src/components/foundation-inbox/inbox.styles.ts",
@@ -2840,54 +2840,19 @@
2840
2840
  },
2841
2841
  {
2842
2842
  "kind": "javascript-module",
2843
- "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
2844
- "declarations": [
2845
- {
2846
- "kind": "variable",
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
- {
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",
2843
+ "path": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts",
2865
2844
  "declarations": [
2866
2845
  {
2867
2846
  "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": [
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
+ },
2887
2852
  {
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",
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",
2891
2856
  "members": [
2892
2857
  {
2893
2858
  "kind": "field",
@@ -2898,21 +2863,56 @@
2898
2863
  },
2899
2864
  {
2900
2865
  "kind": "field",
2901
- "name": "volumePercent",
2866
+ "name": "isAlertSoundEditMode",
2902
2867
  "type": {
2903
- "text": "number"
2868
+ "text": "boolean"
2904
2869
  },
2905
- "default": "100",
2906
- "description": "Global playback volume 0–100. @internal"
2870
+ "description": "True when editing an existing entity (clear should set CLEAR_ALERT_SOUND).",
2871
+ "readonly": true
2907
2872
  },
2908
2873
  {
2909
2874
  "kind": "field",
2910
- "name": "selectableRules",
2875
+ "name": "alertSoundEntityId",
2911
2876
  "type": {
2912
- "text": "AlertSoundSelectableRule[]"
2877
+ "text": "string | null"
2913
2878
  },
2914
- "default": "[]",
2915
- "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
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",
2903
+ "type": {
2904
+ "text": "string"
2905
+ },
2906
+ "default": "''"
2907
+ },
2908
+ {
2909
+ "kind": "field",
2910
+ "name": "hasAlertSound",
2911
+ "type": {
2912
+ "text": "boolean"
2913
+ },
2914
+ "default": "false",
2915
+ "description": "True when edit loaded an existing server sound (or user attached one)."
2916
2916
  },
2917
2917
  {
2918
2918
  "kind": "field",
@@ -2923,98 +2923,58 @@
2923
2923
  },
2924
2924
  {
2925
2925
  "kind": "field",
2926
- "name": "pendingRuleIndex",
2926
+ "name": "pendingAlertSoundData",
2927
2927
  "type": {
2928
- "text": "number | null"
2928
+ "text": "string | null"
2929
2929
  },
2930
- "privacy": "private",
2931
2930
  "default": "null"
2932
2931
  },
2933
2932
  {
2934
2933
  "kind": "field",
2935
- "name": "player",
2936
- "privacy": "private",
2937
- "readonly": true
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)."
2938
2940
  },
2939
2941
  {
2940
2942
  "kind": "field",
2941
- "name": "unsubscribePlayer",
2943
+ "name": "clearAlertSound",
2942
2944
  "type": {
2943
- "text": "(() => void) | undefined"
2945
+ "text": "boolean"
2944
2946
  },
2945
- "privacy": "private"
2947
+ "default": "false"
2946
2948
  },
2947
2949
  {
2948
2950
  "kind": "field",
2949
- "name": "ignoreSelectChanges",
2951
+ "name": "testAudio",
2950
2952
  "type": {
2951
- "text": "boolean"
2953
+ "text": "HTMLAudioElement | null"
2952
2954
  },
2953
- "privacy": "private",
2954
- "default": "false",
2955
- "description": "Suppresses select change events while options are rebuilt."
2955
+ "default": "null",
2956
+ "description": "In-progress Test playback; not private — mixin return type is exported."
2956
2957
  },
2957
2958
  {
2958
2959
  "kind": "method",
2959
- "name": "onMatchModeChange",
2960
- "return": {
2961
- "type": {
2962
- "text": "boolean"
2963
- }
2964
- },
2960
+ "name": "loadExistingAlertSound",
2965
2961
  "parameters": [
2966
2962
  {
2967
- "name": "index",
2968
- "type": {
2969
- "text": "number"
2970
- }
2971
- },
2972
- {
2973
- "name": "event",
2963
+ "name": "dynamicRuleId",
2974
2964
  "type": {
2975
- "text": "Event"
2965
+ "text": "string"
2976
2966
  }
2977
2967
  }
2978
2968
  ]
2979
2969
  },
2980
2970
  {
2981
2971
  "kind": "method",
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
- ]
2972
+ "name": "openAlertSoundPicker"
3002
2973
  },
3003
2974
  {
3004
2975
  "kind": "method",
3005
- "name": "onRuleChange",
3006
- "return": {
3007
- "type": {
3008
- "text": "boolean"
3009
- }
3010
- },
2976
+ "name": "onAlertSoundSelected",
3011
2977
  "parameters": [
3012
- {
3013
- "name": "index",
3014
- "type": {
3015
- "text": "number"
3016
- }
3017
- },
3018
2978
  {
3019
2979
  "name": "event",
3020
2980
  "type": {
@@ -3025,75 +2985,354 @@
3025
2985
  },
3026
2986
  {
3027
2987
  "kind": "method",
3028
- "name": "openFilePicker",
2988
+ "name": "clearAttachedAlertSound"
2989
+ },
2990
+ {
2991
+ "kind": "method",
2992
+ "name": "testAttachedAlertSound"
2993
+ },
2994
+ {
2995
+ "kind": "method",
2996
+ "name": "stopTestSound"
2997
+ },
2998
+ {
2999
+ "kind": "method",
3000
+ "name": "resetAlertSoundState"
3001
+ },
3002
+ {
3003
+ "kind": "method",
3004
+ "name": "applyAlertSoundToPayload",
3029
3005
  "return": {
3030
3006
  "type": {
3031
- "text": "boolean"
3007
+ "text": "T"
3032
3008
  }
3033
3009
  },
3034
3010
  "parameters": [
3035
3011
  {
3036
- "name": "index",
3012
+ "name": "target",
3037
3013
  "type": {
3038
- "text": "number"
3014
+ "text": "T"
3039
3015
  }
3040
3016
  }
3041
- ]
3017
+ ],
3018
+ "description": "Merges pending sound / clear flag onto a create/update DETAILS object."
3042
3019
  },
3043
3020
  {
3044
3021
  "kind": "method",
3045
- "name": "onFileSelected",
3046
- "return": {
3047
- "type": {
3048
- "text": "boolean"
3049
- }
3022
+ "name": "syncAlertSoundCacheAfterSave",
3023
+ "description": "Keep AlertSoundPlayer's in-memory NOTIFY_ALERT_SOUND cache in sync with\nwhat we just saved — otherwise the next alert still plays the old file."
3024
+ }
3025
+ ],
3026
+ "parameters": [
3027
+ {
3028
+ "name": "Base",
3029
+ "type": {
3030
+ "text": "TBase"
3031
+ }
3032
+ }
3033
+ ],
3034
+ "privacy": "public"
3035
+ }
3036
+ ],
3037
+ "exports": [
3038
+ {
3039
+ "kind": "js",
3040
+ "name": "alertSoundAttachmentTemplate",
3041
+ "declaration": {
3042
+ "name": "alertSoundAttachmentTemplate",
3043
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3044
+ }
3045
+ },
3046
+ {
3047
+ "kind": "js",
3048
+ "name": "AlertSoundAttachmentMixin",
3049
+ "declaration": {
3050
+ "name": "AlertSoundAttachmentMixin",
3051
+ "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3052
+ }
3053
+ }
3054
+ ]
3055
+ },
3056
+ {
3057
+ "kind": "javascript-module",
3058
+ "path": "src/components/foundation-notification-dashboard/index.ts",
3059
+ "declarations": [],
3060
+ "exports": [
3061
+ {
3062
+ "kind": "js",
3063
+ "name": "*",
3064
+ "declaration": {
3065
+ "name": "*",
3066
+ "package": "./notification-dashboard"
3067
+ }
3068
+ }
3069
+ ]
3070
+ },
3071
+ {
3072
+ "kind": "javascript-module",
3073
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts",
3074
+ "declarations": [
3075
+ {
3076
+ "kind": "variable",
3077
+ "name": "FoundationNotificationDashboardStyles",
3078
+ "default": "css`\n .notification-dashboard,\n rapid-tabs,\n rapid-tab-panel {\n height: 100%;\n }\n\n .no-permissions {\n font-family: var(--body-font);\n color: var(--neutral-foreground-rest);\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n`",
3079
+ "privacy": "public"
3080
+ }
3081
+ ],
3082
+ "exports": [
3083
+ {
3084
+ "kind": "js",
3085
+ "name": "FoundationNotificationDashboardStyles",
3086
+ "declaration": {
3087
+ "name": "FoundationNotificationDashboardStyles",
3088
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
3089
+ }
3090
+ }
3091
+ ]
3092
+ },
3093
+ {
3094
+ "kind": "javascript-module",
3095
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts",
3096
+ "declarations": [
3097
+ {
3098
+ "kind": "class",
3099
+ "description": "",
3100
+ "name": "NotificationDashboardTab",
3101
+ "members": [
3102
+ {
3103
+ "kind": "field",
3104
+ "name": "id",
3105
+ "type": {
3106
+ "text": "string"
3107
+ }
3108
+ },
3109
+ {
3110
+ "kind": "field",
3111
+ "name": "name",
3112
+ "type": {
3113
+ "text": "string"
3114
+ }
3115
+ },
3116
+ {
3117
+ "kind": "field",
3118
+ "name": "component",
3119
+ "type": {
3120
+ "text": "string"
3121
+ }
3122
+ },
3123
+ {
3124
+ "kind": "field",
3125
+ "name": "right",
3126
+ "type": {
3127
+ "text": "string"
3128
+ }
3129
+ }
3130
+ ]
3131
+ },
3132
+ {
3133
+ "kind": "variable",
3134
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3135
+ "type": {
3136
+ "text": "NotificationDashboardTab[]"
3137
+ },
3138
+ "default": "[\n {\n id: 'rules',\n name: 'Rules',\n component: 'rule-management',\n right: 'NotificationRuleView',\n },\n {\n id: 'templates',\n name: 'Templates',\n component: 'template-management',\n right: 'NotificationRuleTemplateView',\n },\n {\n id: 'routes',\n name: 'Routes',\n component: 'route-management',\n right: 'NotificationRouteView',\n },\n /* TODO: Not needed at the moment\n {\n id: 'notify-audit',\n name: 'Notify Audit',\n component: 'notify-audit-management',\n right: 'NotificationAuditView',\n },\n */\n]"
3139
+ }
3140
+ ],
3141
+ "exports": [
3142
+ {
3143
+ "kind": "js",
3144
+ "name": "NotificationDashboardTab",
3145
+ "declaration": {
3146
+ "name": "NotificationDashboardTab",
3147
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3148
+ }
3149
+ },
3150
+ {
3151
+ "kind": "js",
3152
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3153
+ "declaration": {
3154
+ "name": "NOTIFICATION_DASHBOARD_TABS",
3155
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3156
+ }
3157
+ }
3158
+ ]
3159
+ },
3160
+ {
3161
+ "kind": "javascript-module",
3162
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3163
+ "declarations": [
3164
+ {
3165
+ "kind": "variable",
3166
+ "name": "FoundationNotificationDashboardTemplate",
3167
+ "default": "html<FoundationNotificationDashboard>`\n <div class=\"notification-dashboard\">\n ${whenElse(\n (x) => x.hasPermissions,\n html`\n <rapid-tabs class=\"tabs\">\n <!-- Tabs -->\n ${repeat(\n (_) => NOTIFICATION_DASHBOARD_TABS,\n html<NotificationDashboardTab>`\n ${when(\n (x, c) => (c.parent.auth as Auth).currentUser.hasPermission(x.right),\n html<NotificationDashboardTab>`\n <rapid-tab slot=\"${(x) => x.id}-tab\">${(x) => x.name}</rapid-tab>\n `,\n )}\n `,\n )}\n\n <!-- Panels -->\n ${repeat(\n (_) => NOTIFICATION_DASHBOARD_TABS,\n html<NotificationDashboardTab>`\n ${when(\n (x, c) => (c.parent.auth as Auth).currentUser.hasPermission(x.right),\n html`\n ${\n /* HTML Render */\n (x) => html<NotificationDashboardTab>`\n <rapid-tab-panel slot=\"${x.id}-tab\"\n id=\"${x.id}-tab-panel\">\n <${x.component}></${x.component}>\n </rapid-tab-panel>\n `\n }\n `,\n )}\n `,\n )}\n </rapid-tabs>\n `,\n html`\n <div class=\"no-permissions\">\n <label>User has no permissions to view Notification Screens</label>\n </div>\n `,\n )}\n </div>\n`"
3168
+ }
3169
+ ],
3170
+ "exports": [
3171
+ {
3172
+ "kind": "js",
3173
+ "name": "FoundationNotificationDashboardTemplate",
3174
+ "declaration": {
3175
+ "name": "FoundationNotificationDashboardTemplate",
3176
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3177
+ }
3178
+ }
3179
+ ]
3180
+ },
3181
+ {
3182
+ "kind": "javascript-module",
3183
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3184
+ "declarations": [
3185
+ {
3186
+ "kind": "class",
3187
+ "description": "",
3188
+ "name": "FoundationNotificationDashboard",
3189
+ "members": [
3190
+ {
3191
+ "kind": "field",
3192
+ "name": "auth",
3193
+ "type": {
3194
+ "text": "Auth"
3195
+ }
3196
+ },
3197
+ {
3198
+ "kind": "field",
3199
+ "name": "ready",
3200
+ "type": {
3201
+ "text": "boolean"
3050
3202
  },
3051
- "parameters": [
3052
- {
3053
- "name": "event",
3054
- "type": {
3055
- "text": "Event"
3056
- }
3057
- }
3058
- ]
3203
+ "default": "false"
3204
+ },
3205
+ {
3206
+ "kind": "field",
3207
+ "name": "hasPermissions",
3208
+ "type": {
3209
+ "text": "boolean"
3210
+ },
3211
+ "default": "true"
3212
+ }
3213
+ ],
3214
+ "superclass": {
3215
+ "name": "GenesisElement",
3216
+ "package": "@genesislcap/web-core"
3217
+ },
3218
+ "tagName": "foundation-notification-dashboard",
3219
+ "customElement": true
3220
+ }
3221
+ ],
3222
+ "exports": [
3223
+ {
3224
+ "kind": "js",
3225
+ "name": "FoundationNotificationDashboard",
3226
+ "declaration": {
3227
+ "name": "FoundationNotificationDashboard",
3228
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3229
+ }
3230
+ },
3231
+ {
3232
+ "kind": "custom-element-definition",
3233
+ "name": "foundation-notification-dashboard",
3234
+ "declaration": {
3235
+ "name": "FoundationNotificationDashboard",
3236
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3237
+ }
3238
+ }
3239
+ ]
3240
+ },
3241
+ {
3242
+ "kind": "javascript-module",
3243
+ "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3244
+ "declarations": [
3245
+ {
3246
+ "kind": "class",
3247
+ "description": "",
3248
+ "name": "UUIDGenerator",
3249
+ "members": [
3250
+ {
3251
+ "kind": "field",
3252
+ "name": "uuid",
3253
+ "type": {
3254
+ "text": "UUID"
3255
+ },
3256
+ "privacy": "private",
3257
+ "static": true
3258
+ },
3259
+ {
3260
+ "kind": "field",
3261
+ "name": "createUUID",
3262
+ "static": true
3263
+ }
3264
+ ]
3265
+ },
3266
+ {
3267
+ "kind": "function",
3268
+ "name": "isEmpty",
3269
+ "parameters": [
3270
+ {
3271
+ "name": "value"
3272
+ }
3273
+ ]
3274
+ },
3275
+ {
3276
+ "kind": "class",
3277
+ "description": "",
3278
+ "name": "DynamicRuleUtils",
3279
+ "members": [
3280
+ {
3281
+ "kind": "field",
3282
+ "name": "createEmptyCondition",
3283
+ "static": true
3284
+ },
3285
+ {
3286
+ "kind": "field",
3287
+ "name": "createAssignment",
3288
+ "static": true
3289
+ },
3290
+ {
3291
+ "kind": "field",
3292
+ "name": "createPlaceholderAssignment",
3293
+ "static": true
3294
+ },
3295
+ {
3296
+ "kind": "field",
3297
+ "name": "createTextAssignment",
3298
+ "static": true
3299
+ },
3300
+ {
3301
+ "kind": "field",
3302
+ "name": "getAssignmentValue",
3303
+ "static": true
3304
+ },
3305
+ {
3306
+ "kind": "field",
3307
+ "name": "getAssignmentText",
3308
+ "static": true
3059
3309
  },
3060
3310
  {
3061
3311
  "kind": "method",
3062
- "name": "clearSound",
3312
+ "name": "createConditions",
3313
+ "static": true,
3063
3314
  "return": {
3064
3315
  "type": {
3065
- "text": "boolean"
3316
+ "text": "any"
3066
3317
  }
3067
3318
  },
3068
3319
  "parameters": [
3069
3320
  {
3070
- "name": "index",
3321
+ "name": "conditions",
3071
3322
  "type": {
3072
- "text": "number"
3323
+ "text": "ConditionNode[]"
3073
3324
  }
3074
- }
3075
- ]
3076
- },
3077
- {
3078
- "kind": "method",
3079
- "name": "testSound",
3080
- "return": {
3081
- "type": {
3082
- "text": "boolean"
3083
- }
3084
- },
3085
- "parameters": [
3325
+ },
3086
3326
  {
3087
- "name": "index",
3088
- "type": {
3089
- "text": "number"
3090
- }
3327
+ "name": "parameters",
3328
+ "optional": true
3091
3329
  }
3092
3330
  ]
3093
3331
  },
3094
3332
  {
3095
3333
  "kind": "method",
3096
- "name": "toggleRuleMute",
3334
+ "name": "hasMultiValueCondition",
3335
+ "static": true,
3097
3336
  "return": {
3098
3337
  "type": {
3099
3338
  "text": "boolean"
@@ -3101,16 +3340,17 @@
3101
3340
  },
3102
3341
  "parameters": [
3103
3342
  {
3104
- "name": "index",
3343
+ "name": "conditions",
3105
3344
  "type": {
3106
- "text": "number"
3345
+ "text": "ConditionNode[]"
3107
3346
  }
3108
3347
  }
3109
3348
  ]
3110
3349
  },
3111
3350
  {
3112
3351
  "kind": "method",
3113
- "name": "onVolumeChange",
3352
+ "name": "hasOrJoin",
3353
+ "static": true,
3114
3354
  "return": {
3115
3355
  "type": {
3116
3356
  "text": "boolean"
@@ -3118,34 +3358,17 @@
3118
3358
  },
3119
3359
  "parameters": [
3120
3360
  {
3121
- "name": "event",
3361
+ "name": "conditions",
3122
3362
  "type": {
3123
- "text": "Event"
3363
+ "text": "ConditionNode[]"
3124
3364
  }
3125
3365
  }
3126
3366
  ]
3127
3367
  },
3128
3368
  {
3129
3369
  "kind": "method",
3130
- "name": "toggleMute",
3131
- "return": {
3132
- "type": {
3133
- "text": "boolean"
3134
- }
3135
- }
3136
- },
3137
- {
3138
- "kind": "method",
3139
- "name": "addRule",
3140
- "return": {
3141
- "type": {
3142
- "text": "boolean"
3143
- }
3144
- }
3145
- },
3146
- {
3147
- "kind": "method",
3148
- "name": "removeRule",
3370
+ "name": "hasGroup",
3371
+ "static": true,
3149
3372
  "return": {
3150
3373
  "type": {
3151
3374
  "text": "boolean"
@@ -3153,816 +3376,438 @@
3153
3376
  },
3154
3377
  "parameters": [
3155
3378
  {
3156
- "name": "index",
3379
+ "name": "conditions",
3157
3380
  "type": {
3158
- "text": "number"
3381
+ "text": "ConditionNode[]"
3159
3382
  }
3160
3383
  }
3161
3384
  ]
3162
3385
  },
3163
3386
  {
3164
3387
  "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)."
3172
- },
3173
- {
3174
- "kind": "method",
3175
- "name": "loadRules",
3176
- "privacy": "private",
3177
- "return": {
3178
- "type": {
3179
- "text": "Promise<void>"
3180
- }
3181
- }
3182
- },
3183
- {
3184
- "kind": "method",
3185
- "name": "settleRuleOptions",
3186
- "privacy": "private",
3187
- "return": {
3188
- "type": {
3189
- "text": "Promise<void>"
3190
- }
3191
- },
3192
- "description": "Suppresses select `change` events only while options-datasource rebuilds\nthe DOM — not for the `getRules()` round trip itself, so a user picking a\nrule while a request is in flight isn't silently dropped."
3193
- },
3194
- {
3195
- "kind": "method",
3196
- "name": "applyRuleSelectValues",
3197
- "privacy": "private",
3198
- "return": {
3199
- "type": {
3200
- "text": "void"
3201
- }
3202
- },
3203
- "description": "Re-applies persisted template ids onto `.rule-select` hosts after\noptions-datasource has rebuilt its options. We deliberately do *not* bind\n`:initialSelectedValue` to templateId: that path compares the option label\nagainst Select.value (the option id), always mismatches, clearData()'s the\nselect, and leaves the next pick stuck on \"Select a rule...\"."
3204
- },
3205
- {
3206
- "kind": "method",
3207
- "name": "mapRules",
3208
- "privacy": "private",
3388
+ "name": "hasUnsupportedOperator",
3389
+ "static": true,
3209
3390
  "return": {
3210
3391
  "type": {
3211
- "text": "AlertSoundSelectableRule[]"
3392
+ "text": "boolean"
3212
3393
  }
3213
3394
  },
3214
3395
  "parameters": [
3215
3396
  {
3216
- "name": "ruleList",
3397
+ "name": "conditions",
3217
3398
  "type": {
3218
- "text": "NamedRuleRow[]"
3399
+ "text": "ConditionNode[]"
3219
3400
  }
3220
3401
  }
3221
3402
  ]
3222
3403
  },
3223
3404
  {
3224
3405
  "kind": "method",
3225
- "name": "ruleMatchId",
3226
- "privacy": "private",
3406
+ "name": "hasCurrentUser",
3407
+ "static": true,
3227
3408
  "return": {
3228
3409
  "type": {
3229
- "text": "string"
3410
+ "text": "boolean"
3230
3411
  }
3231
3412
  },
3232
3413
  "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"
3245
- }
3246
- ],
3247
- "superclass": {
3248
- "name": "GenesisElement",
3249
- "package": "@genesislcap/web-core"
3250
- },
3251
- "tagName": "foundation-sounds-panel",
3252
- "customElement": true
3253
- }
3254
- ],
3255
- "exports": [
3256
- {
3257
- "kind": "js",
3258
- "name": "FoundationSoundsPanel",
3259
- "declaration": {
3260
- "name": "FoundationSoundsPanel",
3261
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3262
- }
3263
- },
3264
- {
3265
- "kind": "custom-element-definition",
3266
- "name": "foundation-sounds-panel",
3267
- "declaration": {
3268
- "name": "FoundationSoundsPanel",
3269
- "module": "src/components/foundation-sounds/foundation-sounds-panel.ts"
3270
- }
3271
- }
3272
- ]
3273
- },
3274
- {
3275
- "kind": "javascript-module",
3276
- "path": "src/components/foundation-sounds/foundation-sounds.styles.ts",
3277
- "declarations": [
3278
- {
3279
- "kind": "variable",
3280
- "name": "FoundationSoundsStyles",
3281
- "default": "css`\n :host {\n display: none;\n }\n`",
3282
- "description": "Headless layout listener — take no space in the layout chrome."
3283
- }
3284
- ],
3285
- "exports": [
3286
- {
3287
- "kind": "js",
3288
- "name": "FoundationSoundsStyles",
3289
- "declaration": {
3290
- "name": "FoundationSoundsStyles",
3291
- "module": "src/components/foundation-sounds/foundation-sounds.styles.ts"
3292
- }
3293
- }
3294
- ]
3295
- },
3296
- {
3297
- "kind": "javascript-module",
3298
- "path": "src/components/foundation-sounds/foundation-sounds.ts",
3299
- "declarations": [
3300
- {
3301
- "kind": "class",
3302
- "description": "Headless listener for inbox alert inserts. Plays configured sounds via the\nshared AlertSoundPlayer. Mount once in the app layout.\n\nConfigure rules in the inbox Sounds tab with FoundationSoundsPanel.",
3303
- "name": "FoundationSounds",
3304
- "members": [
3305
- {
3306
- "kind": "field",
3307
- "name": "connect",
3308
- "type": {
3309
- "text": "Connect"
3310
- }
3311
- },
3312
- {
3313
- "kind": "field",
3314
- "name": "inboxService",
3315
- "type": {
3316
- "text": "FoundationInboxService"
3317
- }
3318
- },
3319
- {
3320
- "kind": "field",
3321
- "name": "ruleService",
3322
- "type": {
3323
- "text": "RuleService"
3324
- }
3325
- },
3326
- {
3327
- "kind": "field",
3328
- "name": "soundEnabled",
3329
- "type": {
3330
- "text": "boolean"
3331
- },
3332
- "default": "true",
3333
- "description": "When false, new audible alerts are tracked but do not play."
3334
- },
3335
- {
3336
- "kind": "field",
3337
- "name": "connectionSub",
3338
- "type": {
3339
- "text": "Subscription | undefined"
3340
- },
3341
- "privacy": "private"
3342
- },
3343
- {
3344
- "kind": "field",
3345
- "name": "player",
3346
- "privacy": "private",
3347
- "readonly": true
3348
- },
3349
- {
3350
- "kind": "field",
3351
- "name": "knownAlertIds",
3352
- "privacy": "private",
3353
- "default": "new Set<string>()"
3354
- },
3355
- {
3356
- "kind": "field",
3357
- "name": "serverSoundFetches",
3358
- "privacy": "private",
3359
- "readonly": true,
3360
- "default": "new Map<string, Promise<boolean>>()",
3361
- "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
3414
+ {
3415
+ "name": "conditions",
3416
+ "type": {
3417
+ "text": "ConditionNode[]"
3418
+ }
3419
+ }
3420
+ ]
3362
3421
  },
3363
3422
  {
3364
3423
  "kind": "method",
3365
- "name": "subscribeToAlerts",
3366
- "privacy": "private",
3424
+ "name": "flattenConditions",
3425
+ "static": true,
3367
3426
  "return": {
3368
3427
  "type": {
3369
- "text": "void"
3428
+ "text": "ConditionBuilderEntity[]"
3370
3429
  }
3371
- }
3372
- },
3373
- {
3374
- "kind": "field",
3375
- "name": "subscriptionHandler",
3376
- "privacy": "private"
3430
+ },
3431
+ "parameters": [
3432
+ {
3433
+ "name": "conditions",
3434
+ "type": {
3435
+ "text": "ConditionNode[]"
3436
+ }
3437
+ }
3438
+ ]
3377
3439
  },
3378
3440
  {
3379
3441
  "kind": "method",
3380
- "name": "playForNewAlerts",
3381
- "privacy": "private",
3442
+ "name": "resolveLeftValues",
3443
+ "static": true,
3382
3444
  "return": {
3383
3445
  "type": {
3384
- "text": "Promise<void>"
3446
+ "text": "ConditionNode[]"
3385
3447
  }
3386
3448
  },
3387
3449
  "parameters": [
3388
3450
  {
3389
- "name": "rows",
3451
+ "name": "conditions",
3390
3452
  "type": {
3391
- "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
3453
+ "text": "ConditionNode[]"
3454
+ }
3455
+ },
3456
+ {
3457
+ "name": "fields",
3458
+ "type": {
3459
+ "text": "any[]"
3392
3460
  }
3393
3461
  }
3394
3462
  ]
3395
3463
  },
3464
+ {
3465
+ "kind": "field",
3466
+ "name": "createEmptyGroup",
3467
+ "static": true
3468
+ },
3396
3469
  {
3397
3470
  "kind": "method",
3398
- "name": "tryPlayServerSound",
3399
- "privacy": "private",
3471
+ "name": "buildRawExpression",
3472
+ "static": true,
3400
3473
  "return": {
3401
3474
  "type": {
3402
- "text": "Promise<boolean>"
3475
+ "text": "string"
3403
3476
  }
3404
3477
  },
3405
3478
  "parameters": [
3406
3479
  {
3407
- "name": "dynamicRuleId",
3480
+ "name": "conditions",
3408
3481
  "type": {
3409
- "text": "string"
3482
+ "text": "ConditionNode[]"
3410
3483
  }
3411
3484
  }
3412
3485
  ]
3413
3486
  },
3414
3487
  {
3415
3488
  "kind": "method",
3416
- "name": "fetchAndCacheServerSound",
3417
- "privacy": "private",
3489
+ "name": "parseRawExpression",
3490
+ "static": true,
3418
3491
  "return": {
3419
3492
  "type": {
3420
- "text": "Promise<boolean>"
3493
+ "text": "ConditionNode[] | null"
3421
3494
  }
3422
3495
  },
3423
3496
  "parameters": [
3424
3497
  {
3425
- "name": "dynamicRuleId",
3498
+ "name": "rawExpression",
3426
3499
  "type": {
3427
3500
  "text": "string"
3428
3501
  }
3429
3502
  }
3430
3503
  ]
3431
3504
  }
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
- }
3460
- },
3461
- {
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"
3505
+ ]
3481
3506
  },
3482
3507
  {
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",
3508
+ "kind": "class",
3509
+ "description": "",
3510
+ "name": "TemplateUtils",
3486
3511
  "members": [
3487
3512
  {
3488
3513
  "kind": "field",
3489
- "name": "ruleService",
3490
- "type": {
3491
- "text": "RuleService"
3492
- }
3493
- },
3494
- {
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
3502
- },
3503
- {
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"
3514
+ "name": "createEmptyParameter",
3515
+ "static": true
3561
3516
  },
3562
3517
  {
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)."
3518
+ "kind": "method",
3519
+ "name": "getParameters",
3520
+ "static": true,
3521
+ "parameters": [
3522
+ {
3523
+ "name": "parameters"
3524
+ }
3525
+ ]
3570
3526
  },
3571
3527
  {
3572
- "kind": "field",
3573
- "name": "clearAlertSound",
3574
- "type": {
3575
- "text": "boolean"
3576
- },
3577
- "default": "false"
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
+ ]
3578
3547
  },
3579
3548
  {
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."
3549
+ "kind": "method",
3550
+ "name": "getConditions",
3551
+ "static": true,
3552
+ "parameters": [
3553
+ {
3554
+ "name": "conditions"
3555
+ },
3556
+ {
3557
+ "name": "parameters",
3558
+ "optional": true
3559
+ }
3560
+ ]
3587
3561
  },
3588
3562
  {
3589
3563
  "kind": "method",
3590
- "name": "loadExistingAlertSound",
3564
+ "name": "createParameterDetails",
3565
+ "static": true,
3591
3566
  "parameters": [
3592
3567
  {
3593
- "name": "dynamicRuleId",
3594
- "type": {
3595
- "text": "string"
3596
- }
3568
+ "name": "parameters"
3597
3569
  }
3598
3570
  ]
3599
- },
3600
- {
3601
- "kind": "method",
3602
- "name": "openAlertSoundPicker"
3603
- },
3571
+ }
3572
+ ]
3573
+ },
3574
+ {
3575
+ "kind": "class",
3576
+ "description": "",
3577
+ "name": "RuleUtils",
3578
+ "members": [
3604
3579
  {
3605
3580
  "kind": "method",
3606
- "name": "onAlertSoundSelected",
3581
+ "name": "buildRightValue",
3582
+ "privacy": "private",
3583
+ "static": true,
3607
3584
  "parameters": [
3608
3585
  {
3609
- "name": "event",
3586
+ "name": "logicalOperator",
3610
3587
  "type": {
3611
- "text": "Event"
3588
+ "text": "LogicalOperator"
3612
3589
  }
3590
+ },
3591
+ {
3592
+ "name": "condition"
3613
3593
  }
3614
3594
  ]
3615
3595
  },
3616
3596
  {
3617
3597
  "kind": "method",
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
- },
3598
+ "name": "getConditions",
3599
+ "static": true,
3640
3600
  "parameters": [
3641
3601
  {
3642
- "name": "target",
3643
- "type": {
3644
- "text": "T"
3645
- }
3602
+ "name": "conditions"
3646
3603
  }
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."
3604
+ ]
3654
3605
  }
3655
- ],
3606
+ ]
3607
+ },
3608
+ {
3609
+ "kind": "function",
3610
+ "name": "showNotificationError",
3656
3611
  "parameters": [
3657
3612
  {
3658
- "name": "Base",
3659
- "type": {
3660
- "text": "TBase"
3661
- }
3613
+ "name": "error"
3662
3614
  }
3663
- ],
3664
- "privacy": "public"
3615
+ ]
3665
3616
  }
3666
3617
  ],
3667
3618
  "exports": [
3668
3619
  {
3669
3620
  "kind": "js",
3670
- "name": "alertSoundAttachmentTemplate",
3621
+ "name": "UUIDGenerator",
3671
3622
  "declaration": {
3672
- "name": "alertSoundAttachmentTemplate",
3673
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3623
+ "name": "UUIDGenerator",
3624
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3674
3625
  }
3675
3626
  },
3676
3627
  {
3677
3628
  "kind": "js",
3678
- "name": "AlertSoundAttachmentMixin",
3629
+ "name": "isEmpty",
3679
3630
  "declaration": {
3680
- "name": "AlertSoundAttachmentMixin",
3681
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
3631
+ "name": "isEmpty",
3632
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3682
3633
  }
3683
- }
3684
- ]
3685
- },
3686
- {
3687
- "kind": "javascript-module",
3688
- "path": "src/components/foundation-notification-dashboard/index.ts",
3689
- "declarations": [],
3690
- "exports": [
3634
+ },
3691
3635
  {
3692
3636
  "kind": "js",
3693
- "name": "*",
3637
+ "name": "DynamicRuleUtils",
3694
3638
  "declaration": {
3695
- "name": "*",
3696
- "package": "./notification-dashboard"
3639
+ "name": "DynamicRuleUtils",
3640
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3697
3641
  }
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": [
3642
+ },
3713
3643
  {
3714
3644
  "kind": "js",
3715
- "name": "FoundationNotificationDashboardStyles",
3645
+ "name": "TemplateUtils",
3716
3646
  "declaration": {
3717
- "name": "FoundationNotificationDashboardStyles",
3718
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.styles.ts"
3647
+ "name": "TemplateUtils",
3648
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3719
3649
  }
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
- ]
3761
3650
  },
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": [
3772
3651
  {
3773
3652
  "kind": "js",
3774
- "name": "NotificationDashboardTab",
3653
+ "name": "RuleUtils",
3775
3654
  "declaration": {
3776
- "name": "NotificationDashboardTab",
3777
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3655
+ "name": "RuleUtils",
3656
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3778
3657
  }
3779
3658
  },
3780
3659
  {
3781
3660
  "kind": "js",
3782
- "name": "NOTIFICATION_DASHBOARD_TABS",
3661
+ "name": "showNotificationError",
3783
3662
  "declaration": {
3784
- "name": "NOTIFICATION_DASHBOARD_TABS",
3785
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.tabs.ts"
3663
+ "name": "showNotificationError",
3664
+ "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
3786
3665
  }
3787
3666
  }
3788
3667
  ]
3789
3668
  },
3790
3669
  {
3791
3670
  "kind": "javascript-module",
3792
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts",
3671
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts",
3793
3672
  "declarations": [
3794
3673
  {
3795
3674
  "kind": "variable",
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`"
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`"
3798
3677
  }
3799
3678
  ],
3800
3679
  "exports": [
3801
3680
  {
3802
3681
  "kind": "js",
3803
- "name": "FoundationNotificationDashboardTemplate",
3682
+ "name": "FoundationSoundsPanelStyles",
3804
3683
  "declaration": {
3805
- "name": "FoundationNotificationDashboardTemplate",
3806
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.template.ts"
3684
+ "name": "FoundationSoundsPanelStyles",
3685
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.styles.ts"
3807
3686
  }
3808
3687
  }
3809
3688
  ]
3810
3689
  },
3811
3690
  {
3812
3691
  "kind": "javascript-module",
3813
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.ts",
3692
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.template.ts",
3814
3693
  "declarations": [
3815
3694
  {
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
3850
- }
3851
- ],
3852
- "exports": [
3853
- {
3854
- "kind": "js",
3855
- "name": "FoundationNotificationDashboard",
3856
- "declaration": {
3857
- "name": "FoundationNotificationDashboard",
3858
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3859
- }
3860
- },
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`"
3698
+ }
3699
+ ],
3700
+ "exports": [
3861
3701
  {
3862
- "kind": "custom-element-definition",
3863
- "name": "foundation-notification-dashboard",
3702
+ "kind": "js",
3703
+ "name": "FoundationSoundsPanelTemplate",
3864
3704
  "declaration": {
3865
- "name": "FoundationNotificationDashboard",
3866
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.ts"
3705
+ "name": "FoundationSoundsPanelTemplate",
3706
+ "module": "src/components/foundation-sounds/foundation-sounds-panel.template.ts"
3867
3707
  }
3868
3708
  }
3869
3709
  ]
3870
3710
  },
3871
3711
  {
3872
3712
  "kind": "javascript-module",
3873
- "path": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts",
3713
+ "path": "src/components/foundation-sounds/foundation-sounds-panel.ts",
3874
3714
  "declarations": [
3875
3715
  {
3876
3716
  "kind": "class",
3877
- "description": "",
3878
- "name": "UUIDGenerator",
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",
3879
3719
  "members": [
3880
3720
  {
3881
3721
  "kind": "field",
3882
- "name": "uuid",
3722
+ "name": "ruleService",
3883
3723
  "type": {
3884
- "text": "UUID"
3885
- },
3886
- "privacy": "private",
3887
- "static": true
3724
+ "text": "RuleService"
3725
+ }
3888
3726
  },
3889
3727
  {
3890
3728
  "kind": "field",
3891
- "name": "createUUID",
3892
- "static": true
3893
- }
3894
- ]
3895
- },
3896
- {
3897
- "kind": "function",
3898
- "name": "isEmpty",
3899
- "parameters": [
3900
- {
3901
- "name": "value"
3902
- }
3903
- ]
3904
- },
3905
- {
3906
- "kind": "class",
3907
- "description": "",
3908
- "name": "DynamicRuleUtils",
3909
- "members": [
3729
+ "name": "volumePercent",
3730
+ "type": {
3731
+ "text": "number"
3732
+ },
3733
+ "default": "100",
3734
+ "description": "Global playback volume 0–100. @internal"
3735
+ },
3910
3736
  {
3911
3737
  "kind": "field",
3912
- "name": "createEmptyCondition",
3913
- "static": true
3738
+ "name": "selectableRules",
3739
+ "type": {
3740
+ "text": "AlertSoundSelectableRule[]"
3741
+ },
3742
+ "default": "[]",
3743
+ "description": "Notification rules from REQ_NOTIFICATION_RULE. @internal"
3914
3744
  },
3915
3745
  {
3916
3746
  "kind": "field",
3917
- "name": "createAssignment",
3918
- "static": true
3747
+ "name": "fileInput",
3748
+ "type": {
3749
+ "text": "HTMLInputElement"
3750
+ }
3919
3751
  },
3920
3752
  {
3921
3753
  "kind": "field",
3922
- "name": "createPlaceholderAssignment",
3923
- "static": true
3754
+ "name": "pendingRuleIndex",
3755
+ "type": {
3756
+ "text": "number | null"
3757
+ },
3758
+ "privacy": "private",
3759
+ "default": "null"
3924
3760
  },
3925
3761
  {
3926
3762
  "kind": "field",
3927
- "name": "createTextAssignment",
3928
- "static": true
3763
+ "name": "player",
3764
+ "privacy": "private",
3765
+ "readonly": true
3929
3766
  },
3930
3767
  {
3931
3768
  "kind": "field",
3932
- "name": "getAssignmentValue",
3933
- "static": true
3769
+ "name": "unsubscribePlayer",
3770
+ "type": {
3771
+ "text": "(() => void) | undefined"
3772
+ },
3773
+ "privacy": "private"
3934
3774
  },
3935
3775
  {
3936
3776
  "kind": "field",
3937
- "name": "getAssignmentText",
3938
- "static": true
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."
3939
3784
  },
3940
3785
  {
3941
3786
  "kind": "method",
3942
- "name": "createConditions",
3943
- "static": true,
3787
+ "name": "onMatchModeChange",
3944
3788
  "return": {
3945
3789
  "type": {
3946
- "text": "any"
3790
+ "text": "boolean"
3947
3791
  }
3948
3792
  },
3949
3793
  "parameters": [
3950
3794
  {
3951
- "name": "conditions",
3795
+ "name": "index",
3952
3796
  "type": {
3953
- "text": "ConditionNode[]"
3797
+ "text": "number"
3954
3798
  }
3955
3799
  },
3956
3800
  {
3957
- "name": "parameters",
3958
- "optional": true
3801
+ "name": "event",
3802
+ "type": {
3803
+ "text": "Event"
3804
+ }
3959
3805
  }
3960
3806
  ]
3961
3807
  },
3962
3808
  {
3963
3809
  "kind": "method",
3964
- "name": "hasMultiValueCondition",
3965
- "static": true,
3810
+ "name": "onPatternInput",
3966
3811
  "return": {
3967
3812
  "type": {
3968
3813
  "text": "boolean"
@@ -3970,17 +3815,22 @@
3970
3815
  },
3971
3816
  "parameters": [
3972
3817
  {
3973
- "name": "conditions",
3818
+ "name": "index",
3974
3819
  "type": {
3975
- "text": "ConditionNode[]"
3820
+ "text": "number"
3821
+ }
3822
+ },
3823
+ {
3824
+ "name": "event",
3825
+ "type": {
3826
+ "text": "Event"
3976
3827
  }
3977
3828
  }
3978
3829
  ]
3979
3830
  },
3980
3831
  {
3981
3832
  "kind": "method",
3982
- "name": "hasOrJoin",
3983
- "static": true,
3833
+ "name": "onRuleChange",
3984
3834
  "return": {
3985
3835
  "type": {
3986
3836
  "text": "boolean"
@@ -3988,17 +3838,22 @@
3988
3838
  },
3989
3839
  "parameters": [
3990
3840
  {
3991
- "name": "conditions",
3841
+ "name": "index",
3992
3842
  "type": {
3993
- "text": "ConditionNode[]"
3843
+ "text": "number"
3844
+ }
3845
+ },
3846
+ {
3847
+ "name": "event",
3848
+ "type": {
3849
+ "text": "Event"
3994
3850
  }
3995
3851
  }
3996
3852
  ]
3997
3853
  },
3998
3854
  {
3999
3855
  "kind": "method",
4000
- "name": "hasGroup",
4001
- "static": true,
3856
+ "name": "openFilePicker",
4002
3857
  "return": {
4003
3858
  "type": {
4004
3859
  "text": "boolean"
@@ -4006,17 +3861,16 @@
4006
3861
  },
4007
3862
  "parameters": [
4008
3863
  {
4009
- "name": "conditions",
3864
+ "name": "index",
4010
3865
  "type": {
4011
- "text": "ConditionNode[]"
3866
+ "text": "number"
4012
3867
  }
4013
3868
  }
4014
3869
  ]
4015
3870
  },
4016
3871
  {
4017
3872
  "kind": "method",
4018
- "name": "hasUnsupportedOperator",
4019
- "static": true,
3873
+ "name": "onFileSelected",
4020
3874
  "return": {
4021
3875
  "type": {
4022
3876
  "text": "boolean"
@@ -4024,17 +3878,16 @@
4024
3878
  },
4025
3879
  "parameters": [
4026
3880
  {
4027
- "name": "conditions",
3881
+ "name": "event",
4028
3882
  "type": {
4029
- "text": "ConditionNode[]"
3883
+ "text": "Event"
4030
3884
  }
4031
3885
  }
4032
3886
  ]
4033
3887
  },
4034
3888
  {
4035
3889
  "kind": "method",
4036
- "name": "hasCurrentUser",
4037
- "static": true,
3890
+ "name": "clearSound",
4038
3891
  "return": {
4039
3892
  "type": {
4040
3893
  "text": "boolean"
@@ -4042,256 +3895,403 @@
4042
3895
  },
4043
3896
  "parameters": [
4044
3897
  {
4045
- "name": "conditions",
3898
+ "name": "index",
4046
3899
  "type": {
4047
- "text": "ConditionNode[]"
3900
+ "text": "number"
4048
3901
  }
4049
3902
  }
4050
3903
  ]
4051
3904
  },
4052
3905
  {
4053
3906
  "kind": "method",
4054
- "name": "flattenConditions",
4055
- "static": true,
3907
+ "name": "testSound",
4056
3908
  "return": {
4057
3909
  "type": {
4058
- "text": "ConditionBuilderEntity[]"
3910
+ "text": "boolean"
4059
3911
  }
4060
3912
  },
4061
3913
  "parameters": [
4062
3914
  {
4063
- "name": "conditions",
3915
+ "name": "index",
4064
3916
  "type": {
4065
- "text": "ConditionNode[]"
3917
+ "text": "number"
4066
3918
  }
4067
3919
  }
4068
3920
  ]
4069
3921
  },
4070
3922
  {
4071
3923
  "kind": "method",
4072
- "name": "resolveLeftValues",
4073
- "static": true,
3924
+ "name": "toggleRuleMute",
4074
3925
  "return": {
4075
3926
  "type": {
4076
- "text": "ConditionNode[]"
3927
+ "text": "boolean"
4077
3928
  }
4078
3929
  },
4079
3930
  "parameters": [
4080
3931
  {
4081
- "name": "conditions",
3932
+ "name": "index",
4082
3933
  "type": {
4083
- "text": "ConditionNode[]"
3934
+ "text": "number"
4084
3935
  }
4085
- },
3936
+ }
3937
+ ]
3938
+ },
3939
+ {
3940
+ "kind": "method",
3941
+ "name": "onVolumeChange",
3942
+ "return": {
3943
+ "type": {
3944
+ "text": "boolean"
3945
+ }
3946
+ },
3947
+ "parameters": [
4086
3948
  {
4087
- "name": "fields",
3949
+ "name": "event",
4088
3950
  "type": {
4089
- "text": "any[]"
3951
+ "text": "Event"
4090
3952
  }
4091
3953
  }
4092
3954
  ]
4093
3955
  },
4094
3956
  {
4095
- "kind": "field",
4096
- "name": "createEmptyGroup",
4097
- "static": true
3957
+ "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",
3977
+ "return": {
3978
+ "type": {
3979
+ "text": "boolean"
3980
+ }
3981
+ },
3982
+ "parameters": [
3983
+ {
3984
+ "name": "index",
3985
+ "type": {
3986
+ "text": "number"
3987
+ }
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."
4021
+ },
4022
+ {
4023
+ "kind": "method",
4024
+ "name": "applyRuleSelectValues",
4025
+ "privacy": "private",
4026
+ "return": {
4027
+ "type": {
4028
+ "text": "void"
4029
+ }
4030
+ },
4031
+ "description": "Re-applies persisted template ids onto `.rule-select` hosts after\noptions-datasource has rebuilt its options. We deliberately do *not* bind\n`:initialSelectedValue` to templateId: that path compares the option label\nagainst Select.value (the option id), always mismatches, clearData()'s the\nselect, and leaves the next pick stuck on \"Select a rule...\"."
4098
4032
  },
4099
4033
  {
4100
4034
  "kind": "method",
4101
- "name": "buildRawExpression",
4102
- "static": true,
4035
+ "name": "mapRules",
4036
+ "privacy": "private",
4103
4037
  "return": {
4104
4038
  "type": {
4105
- "text": "string"
4039
+ "text": "AlertSoundSelectableRule[]"
4106
4040
  }
4107
4041
  },
4108
4042
  "parameters": [
4109
4043
  {
4110
- "name": "conditions",
4044
+ "name": "ruleList",
4111
4045
  "type": {
4112
- "text": "ConditionNode[]"
4046
+ "text": "NamedRuleRow[]"
4113
4047
  }
4114
4048
  }
4115
4049
  ]
4116
4050
  },
4117
4051
  {
4118
4052
  "kind": "method",
4119
- "name": "parseRawExpression",
4120
- "static": true,
4053
+ "name": "ruleMatchId",
4054
+ "privacy": "private",
4121
4055
  "return": {
4122
4056
  "type": {
4123
- "text": "ConditionNode[] | null"
4057
+ "text": "string"
4124
4058
  }
4125
4059
  },
4126
4060
  "parameters": [
4127
4061
  {
4128
- "name": "rawExpression",
4062
+ "name": "rule",
4129
4063
  "type": {
4130
- "text": "string"
4064
+ "text": "NamedRuleRow | undefined"
4131
4065
  }
4132
4066
  }
4133
4067
  ]
4068
+ },
4069
+ {
4070
+ "kind": "method",
4071
+ "name": "syncSoundState",
4072
+ "privacy": "private"
4134
4073
  }
4135
- ]
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
+ }
4136
4091
  },
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": [
4137
4128
  {
4138
4129
  "kind": "class",
4139
- "description": "",
4140
- "name": "TemplateUtils",
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",
4141
4132
  "members": [
4142
4133
  {
4143
4134
  "kind": "field",
4144
- "name": "createEmptyParameter",
4145
- "static": true
4135
+ "name": "connect",
4136
+ "type": {
4137
+ "text": "Connect"
4138
+ }
4146
4139
  },
4147
4140
  {
4148
- "kind": "method",
4149
- "name": "getParameters",
4150
- "static": true,
4151
- "parameters": [
4152
- {
4153
- "name": "parameters"
4154
- }
4155
- ]
4141
+ "kind": "field",
4142
+ "name": "inboxService",
4143
+ "type": {
4144
+ "text": "FoundationInboxService"
4145
+ }
4156
4146
  },
4157
4147
  {
4158
- "kind": "method",
4159
- "name": "buildRightValue",
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",
4160
4174
  "privacy": "private",
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
4175
- }
4176
- ]
4175
+ "readonly": true
4176
+ },
4177
+ {
4178
+ "kind": "field",
4179
+ "name": "knownAlertIds",
4180
+ "privacy": "private",
4181
+ "default": "new Set<string>()"
4182
+ },
4183
+ {
4184
+ "kind": "field",
4185
+ "name": "serverSoundFetches",
4186
+ "privacy": "private",
4187
+ "readonly": true,
4188
+ "default": "new Map<string, Promise<boolean>>()",
4189
+ "description": "In-flight server sound fetches keyed by DYNAMIC_RULE_ID."
4177
4190
  },
4178
4191
  {
4179
4192
  "kind": "method",
4180
- "name": "getConditions",
4181
- "static": true,
4182
- "parameters": [
4183
- {
4184
- "name": "conditions"
4185
- },
4186
- {
4187
- "name": "parameters",
4188
- "optional": true
4193
+ "name": "subscribeToAlerts",
4194
+ "privacy": "private",
4195
+ "return": {
4196
+ "type": {
4197
+ "text": "void"
4189
4198
  }
4190
- ]
4199
+ }
4200
+ },
4201
+ {
4202
+ "kind": "field",
4203
+ "name": "subscriptionHandler",
4204
+ "privacy": "private"
4191
4205
  },
4192
4206
  {
4193
4207
  "kind": "method",
4194
- "name": "createParameterDetails",
4195
- "static": true,
4208
+ "name": "playForNewAlerts",
4209
+ "privacy": "private",
4210
+ "return": {
4211
+ "type": {
4212
+ "text": "Promise<void>"
4213
+ }
4214
+ },
4196
4215
  "parameters": [
4197
4216
  {
4198
- "name": "parameters"
4217
+ "name": "rows",
4218
+ "type": {
4219
+ "text": "Array<{\n id: string;\n message?: string;\n header?: string;\n dynamicRuleId?: string;\n }>"
4220
+ }
4199
4221
  }
4200
4222
  ]
4201
- }
4202
- ]
4203
- },
4204
- {
4205
- "kind": "class",
4206
- "description": "",
4207
- "name": "RuleUtils",
4208
- "members": [
4223
+ },
4209
4224
  {
4210
4225
  "kind": "method",
4211
- "name": "buildRightValue",
4226
+ "name": "tryPlayServerSound",
4212
4227
  "privacy": "private",
4213
- "static": true,
4228
+ "return": {
4229
+ "type": {
4230
+ "text": "Promise<boolean>"
4231
+ }
4232
+ },
4214
4233
  "parameters": [
4215
4234
  {
4216
- "name": "logicalOperator",
4235
+ "name": "dynamicRuleId",
4217
4236
  "type": {
4218
- "text": "LogicalOperator"
4237
+ "text": "string"
4219
4238
  }
4220
- },
4221
- {
4222
- "name": "condition"
4223
4239
  }
4224
4240
  ]
4225
4241
  },
4226
4242
  {
4227
4243
  "kind": "method",
4228
- "name": "getConditions",
4229
- "static": true,
4244
+ "name": "fetchAndCacheServerSound",
4245
+ "privacy": "private",
4246
+ "return": {
4247
+ "type": {
4248
+ "text": "Promise<boolean>"
4249
+ }
4250
+ },
4230
4251
  "parameters": [
4231
4252
  {
4232
- "name": "conditions"
4233
- }
4234
- ]
4235
- }
4236
- ]
4237
- },
4238
- {
4239
- "kind": "function",
4240
- "name": "showNotificationError",
4241
- "parameters": [
4253
+ "name": "dynamicRuleId",
4254
+ "type": {
4255
+ "text": "string"
4256
+ }
4257
+ }
4258
+ ]
4259
+ }
4260
+ ],
4261
+ "attributes": [
4242
4262
  {
4243
- "name": "error"
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"
4244
4270
  }
4245
- ]
4271
+ ],
4272
+ "superclass": {
4273
+ "name": "GenesisElement",
4274
+ "package": "@genesislcap/web-core"
4275
+ },
4276
+ "tagName": "foundation-sounds",
4277
+ "customElement": true
4246
4278
  }
4247
4279
  ],
4248
4280
  "exports": [
4249
4281
  {
4250
4282
  "kind": "js",
4251
- "name": "UUIDGenerator",
4252
- "declaration": {
4253
- "name": "UUIDGenerator",
4254
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4255
- }
4256
- },
4257
- {
4258
- "kind": "js",
4259
- "name": "isEmpty",
4260
- "declaration": {
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",
4283
+ "name": "FoundationSounds",
4284
4284
  "declaration": {
4285
- "name": "RuleUtils",
4286
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4285
+ "name": "FoundationSounds",
4286
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
4287
4287
  }
4288
4288
  },
4289
4289
  {
4290
- "kind": "js",
4291
- "name": "showNotificationError",
4290
+ "kind": "custom-element-definition",
4291
+ "name": "foundation-sounds",
4292
4292
  "declaration": {
4293
- "name": "showNotificationError",
4294
- "module": "src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"
4293
+ "name": "FoundationSounds",
4294
+ "module": "src/components/foundation-sounds/foundation-sounds.ts"
4295
4295
  }
4296
4296
  }
4297
4297
  ]
@@ -9714,119 +9714,269 @@
9714
9714
  },
9715
9715
  {
9716
9716
  "kind": "method",
9717
- "name": "testAttachedAlertSound",
9718
- "inheritedFrom": {
9719
- "name": "AlertSoundAttachmentMixin",
9720
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9721
- }
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": "[]"
9901
+ },
9902
+ {
9903
+ "kind": "method",
9904
+ "name": "nodeChanged"
9905
+ },
9906
+ {
9907
+ "kind": "method",
9908
+ "name": "joinOperatorChanged"
9722
9909
  },
9723
9910
  {
9724
9911
  "kind": "method",
9725
- "name": "stopTestSound",
9726
- "inheritedFrom": {
9727
- "name": "AlertSoundAttachmentMixin",
9728
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9729
- }
9912
+ "name": "newCondition"
9730
9913
  },
9731
9914
  {
9732
9915
  "kind": "method",
9733
- "name": "resetAlertSoundState",
9734
- "inheritedFrom": {
9735
- "name": "AlertSoundAttachmentMixin",
9736
- "module": "src/components/foundation-notification-dashboard/alert-sound-attachment.ts"
9737
- }
9916
+ "name": "newGroup"
9738
9917
  },
9739
9918
  {
9740
9919
  "kind": "method",
9741
- "name": "applyAlertSoundToPayload",
9742
- "return": {
9743
- "type": {
9744
- "text": "T"
9920
+ "name": "editChild",
9921
+ "parameters": [
9922
+ {
9923
+ "name": "_editedChild",
9924
+ "type": {
9925
+ "text": "ConditionNode"
9926
+ }
9745
9927
  }
9746
- },
9928
+ ]
9929
+ },
9930
+ {
9931
+ "kind": "method",
9932
+ "name": "deleteChild",
9747
9933
  "parameters": [
9748
9934
  {
9749
- "name": "target",
9935
+ "name": "deletedChild",
9750
9936
  "type": {
9751
- "text": "T"
9937
+ "text": "ConditionNode"
9752
9938
  }
9753
9939
  }
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
- }
9940
+ ]
9760
9941
  },
9761
9942
  {
9762
9943
  "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
- }
9944
+ "name": "deleteSelf"
9769
9945
  }
9770
9946
  ],
9771
9947
  "events": [
9772
9948
  {
9773
- "description": "Fired when the dialog should close",
9774
- "name": "close"
9775
- }
9776
- ],
9777
- "mixins": [
9949
+ "description": "Fired when this whole group should be removed",
9950
+ "name": "delete"
9951
+ },
9778
9952
  {
9779
- "name": "AlertSoundAttachmentMixin",
9780
- "module": "/src/components/foundation-notification-dashboard/alert-sound-attachment"
9953
+ "description": "Fired when anything inside this group changes",
9954
+ "name": "edit"
9781
9955
  }
9782
9956
  ],
9783
9957
  "superclass": {
9784
9958
  "name": "GenesisElement",
9785
9959
  "package": "@genesislcap/web-core"
9786
9960
  },
9787
- "tagName": "template-dialog",
9961
+ "tagName": "rule-condition-group",
9788
9962
  "customElement": true
9789
9963
  }
9790
9964
  ],
9791
9965
  "exports": [
9792
9966
  {
9793
9967
  "kind": "js",
9794
- "name": "TemplateDialog",
9968
+ "name": "RuleConditionGroup",
9795
9969
  "declaration": {
9796
- "name": "TemplateDialog",
9797
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"
9970
+ "name": "RuleConditionGroup",
9971
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
9798
9972
  }
9799
9973
  },
9800
9974
  {
9801
9975
  "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",
9976
+ "name": "rule-condition-group",
9827
9977
  "declaration": {
9828
- "name": "TemplateDialogMode",
9829
- "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.types.ts"
9978
+ "name": "RuleConditionGroup",
9979
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
9830
9980
  }
9831
9981
  }
9832
9982
  ]
@@ -10115,156 +10265,6 @@
10115
10265
  "declarations": [],
10116
10266
  "exports": []
10117
10267
  },
10118
- {
10119
- "kind": "javascript-module",
10120
- "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts",
10121
- "declarations": [
10122
- {
10123
- "kind": "variable",
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`"
10126
- }
10127
- ],
10128
- "exports": [
10129
- {
10130
- "kind": "js",
10131
- "name": "RuleConditionGroupTemplate",
10132
- "declaration": {
10133
- "name": "RuleConditionGroupTemplate",
10134
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts"
10135
- }
10136
- }
10137
- ]
10138
- },
10139
- {
10140
- "kind": "javascript-module",
10141
- "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts",
10142
- "declarations": [
10143
- {
10144
- "kind": "class",
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",
10147
- "members": [
10148
- {
10149
- "kind": "field",
10150
- "name": "node",
10151
- "type": {
10152
- "text": "ConditionGroupEntity"
10153
- }
10154
- },
10155
- {
10156
- "kind": "field",
10157
- "name": "fields",
10158
- "type": {
10159
- "text": "Field[]"
10160
- },
10161
- "default": "[]"
10162
- },
10163
- {
10164
- "kind": "field",
10165
- "name": "isFirst",
10166
- "type": {
10167
- "text": "boolean"
10168
- },
10169
- "default": "false"
10170
- },
10171
- {
10172
- "kind": "field",
10173
- "name": "joinOperator",
10174
- "type": {
10175
- "text": "string"
10176
- }
10177
- },
10178
- {
10179
- "kind": "field",
10180
- "name": "groupChildren",
10181
- "type": {
10182
- "text": "ConditionNode[]"
10183
- },
10184
- "default": "[]"
10185
- },
10186
- {
10187
- "kind": "method",
10188
- "name": "nodeChanged"
10189
- },
10190
- {
10191
- "kind": "method",
10192
- "name": "joinOperatorChanged"
10193
- },
10194
- {
10195
- "kind": "method",
10196
- "name": "newCondition"
10197
- },
10198
- {
10199
- "kind": "method",
10200
- "name": "newGroup"
10201
- },
10202
- {
10203
- "kind": "method",
10204
- "name": "editChild",
10205
- "parameters": [
10206
- {
10207
- "name": "_editedChild",
10208
- "type": {
10209
- "text": "ConditionNode"
10210
- }
10211
- }
10212
- ]
10213
- },
10214
- {
10215
- "kind": "method",
10216
- "name": "deleteChild",
10217
- "parameters": [
10218
- {
10219
- "name": "deletedChild",
10220
- "type": {
10221
- "text": "ConditionNode"
10222
- }
10223
- }
10224
- ]
10225
- },
10226
- {
10227
- "kind": "method",
10228
- "name": "deleteSelf"
10229
- }
10230
- ],
10231
- "events": [
10232
- {
10233
- "description": "Fired when this whole group should be removed",
10234
- "name": "delete"
10235
- },
10236
- {
10237
- "description": "Fired when anything inside this group changes",
10238
- "name": "edit"
10239
- }
10240
- ],
10241
- "superclass": {
10242
- "name": "GenesisElement",
10243
- "package": "@genesislcap/web-core"
10244
- },
10245
- "tagName": "rule-condition-group",
10246
- "customElement": true
10247
- }
10248
- ],
10249
- "exports": [
10250
- {
10251
- "kind": "js",
10252
- "name": "RuleConditionGroup",
10253
- "declaration": {
10254
- "name": "RuleConditionGroup",
10255
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
10256
- }
10257
- },
10258
- {
10259
- "kind": "custom-element-definition",
10260
- "name": "rule-condition-group",
10261
- "declaration": {
10262
- "name": "RuleConditionGroup",
10263
- "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
10264
- }
10265
- }
10266
- ]
10267
- },
10268
10268
  {
10269
10269
  "kind": "javascript-module",
10270
10270
  "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-builder/template-condition-builder.template.ts",