@genesislcap/pbc-notify-ui 14.484.0 → 14.484.2-alpha-92fa356.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/custom-elements.json +1085 -191
  2. package/dist/dts/components/components.d.ts.map +1 -1
  3. package/dist/dts/components/foundation-inbox/components/inbox-subscription/inbox-subscription.d.ts +8 -1
  4. package/dist/dts/components/foundation-inbox/components/inbox-subscription/inbox-subscription.d.ts.map +1 -1
  5. package/dist/dts/components/foundation-inbox/components/inbox-subscription/inbox-subscription.styles.d.ts.map +1 -1
  6. package/dist/dts/components/foundation-inbox/components/inbox-subscription/inbox-subscription.template.d.ts.map +1 -1
  7. package/dist/dts/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.d.ts +7 -0
  8. package/dist/dts/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.d.ts.map +1 -1
  9. package/dist/dts/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.styles.d.ts.map +1 -1
  10. package/dist/dts/components/foundation-inbox/inbox-base/inbox-base.d.ts +8 -6
  11. package/dist/dts/components/foundation-inbox/inbox-base/inbox-base.d.ts.map +1 -1
  12. package/dist/dts/components/foundation-inbox/inbox.styles.d.ts.map +1 -1
  13. package/dist/dts/components/foundation-inbox/inbox.template.d.ts.map +1 -1
  14. package/dist/dts/components/foundation-inbox/inbox.types.d.ts +3 -2
  15. package/dist/dts/components/foundation-inbox/inbox.types.d.ts.map +1 -1
  16. package/dist/dts/components/foundation-inbox/inbox.utils.d.ts +0 -2
  17. package/dist/dts/components/foundation-inbox/inbox.utils.d.ts.map +1 -1
  18. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-builder/rule-condition-builder.d.ts +6 -0
  19. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-builder/rule-condition-builder.d.ts.map +1 -1
  20. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-builder/rule-condition-builder.template.d.ts.map +1 -1
  21. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.d.ts +29 -0
  22. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.d.ts.map +1 -0
  23. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.d.ts +3 -0
  24. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.d.ts.map +1 -0
  25. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.d.ts +7 -5
  26. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.d.ts.map +1 -1
  27. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.template.d.ts.map +1 -1
  28. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.types.d.ts +1 -1
  29. package/dist/dts/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.types.d.ts.map +1 -1
  30. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-builder/template-condition-builder.d.ts +9 -0
  31. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-builder/template-condition-builder.d.ts.map +1 -1
  32. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-builder/template-condition-builder.template.d.ts.map +1 -1
  33. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.d.ts +30 -0
  34. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.d.ts.map +1 -0
  35. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.d.ts +3 -0
  36. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.d.ts.map +1 -0
  37. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.d.ts +7 -4
  38. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.d.ts.map +1 -1
  39. package/dist/dts/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.template.d.ts.map +1 -1
  40. package/dist/dts/components/foundation-notification-dashboard/notification-dashboard.utils.d.ts +20 -2
  41. package/dist/dts/components/foundation-notification-dashboard/notification-dashboard.utils.d.ts.map +1 -1
  42. package/dist/dts/components/foundation-notification-dashboard/rule-expression-builder.utils.d.ts +10 -0
  43. package/dist/dts/components/foundation-notification-dashboard/rule-expression-builder.utils.d.ts.map +1 -0
  44. package/dist/dts/components/foundation-notification-dashboard/styles/condition-builder.styles.d.ts +1 -0
  45. package/dist/dts/components/foundation-notification-dashboard/styles/condition-builder.styles.d.ts.map +1 -1
  46. package/dist/dts/components/foundation-notification-dashboard/styles/dynamic-rule.styles.d.ts.map +1 -1
  47. package/dist/dts/components/foundation-notification-dashboard/types/param-type.d.ts +1 -1
  48. package/dist/dts/components/foundation-notification-dashboard/types/param-type.d.ts.map +1 -1
  49. package/dist/dts/notify.types.d.ts +12 -0
  50. package/dist/dts/notify.types.d.ts.map +1 -1
  51. package/dist/dts/react.d.ts +25 -0
  52. package/dist/dts/services/system.service.d.ts +1 -0
  53. package/dist/dts/services/system.service.d.ts.map +1 -1
  54. package/dist/esm/components/components.js +6 -0
  55. package/dist/esm/components/foundation-inbox/components/inbox-subscription/inbox-subscription.js +51 -9
  56. package/dist/esm/components/foundation-inbox/components/inbox-subscription/inbox-subscription.styles.js +48 -6
  57. package/dist/esm/components/foundation-inbox/components/inbox-subscription/inbox-subscription.template.js +40 -21
  58. package/dist/esm/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.js +70 -3
  59. package/dist/esm/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.styles.js +16 -2
  60. package/dist/esm/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.template.js +12 -11
  61. package/dist/esm/components/foundation-inbox/inbox-base/inbox-base.js +76 -40
  62. package/dist/esm/components/foundation-inbox/inbox.styles.js +24 -3
  63. package/dist/esm/components/foundation-inbox/inbox.template.js +26 -66
  64. package/dist/esm/components/foundation-inbox/inbox.types.js +1 -2
  65. package/dist/esm/components/foundation-inbox/inbox.utils.js +0 -2
  66. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-builder/rule-condition-builder.js +57 -1
  67. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-builder/rule-condition-builder.template.js +50 -14
  68. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.js +91 -0
  69. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.js +57 -0
  70. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.js +59 -31
  71. package/dist/esm/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.template.js +11 -17
  72. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.js +2 -1
  73. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-builder/template-condition-builder.js +119 -7
  74. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-builder/template-condition-builder.template.js +42 -6
  75. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.js +92 -0
  76. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.js +59 -0
  77. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.js +61 -13
  78. package/dist/esm/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.template.js +36 -10
  79. package/dist/esm/components/foundation-notification-dashboard/notification-dashboard.utils.js +365 -1
  80. package/dist/esm/components/foundation-notification-dashboard/rule-expression-builder.utils.js +230 -0
  81. package/dist/esm/components/foundation-notification-dashboard/styles/condition-builder.styles.js +123 -0
  82. package/dist/esm/components/foundation-notification-dashboard/styles/dynamic-rule.styles.js +13 -0
  83. package/dist/esm/components/foundation-notification-dashboard/types/param-type.js +1 -1
  84. package/dist/esm/notify.types.js +8 -1
  85. package/dist/esm/services/system.service.js +3 -0
  86. package/dist/pbc-notify-ui.api.json +1 -1
  87. package/dist/pbc-notify-ui.d.ts +13 -9
  88. package/dist/react.cjs +54 -1
  89. package/dist/react.mjs +52 -1
  90. package/dist/tsconfig.tsbuildinfo +1 -1
  91. package/package.json +23 -22
  92. package/src/components/components.ts +6 -0
  93. package/src/components/foundation-inbox/components/inbox-subscription/inbox-subscription.styles.ts +48 -6
  94. package/src/components/foundation-inbox/components/inbox-subscription/inbox-subscription.template.ts +52 -21
  95. package/src/components/foundation-inbox/components/inbox-subscription/inbox-subscription.ts +54 -11
  96. package/src/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.styles.ts +16 -2
  97. package/src/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.template.ts +11 -11
  98. package/src/components/foundation-inbox/components/inbox-subscription/rule-parameter/rule-parameter.ts +76 -3
  99. package/src/components/foundation-inbox/inbox-base/inbox-base.ts +75 -44
  100. package/src/components/foundation-inbox/inbox.styles.ts +24 -3
  101. package/src/components/foundation-inbox/inbox.template.ts +33 -80
  102. package/src/components/foundation-inbox/inbox.types.ts +2 -1
  103. package/src/components/foundation-inbox/inbox.utils.ts +0 -4
  104. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-builder/rule-condition-builder.template.ts +58 -14
  105. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-builder/rule-condition-builder.ts +51 -0
  106. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts +74 -0
  107. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts +82 -0
  108. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.template.ts +12 -21
  109. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.ts +63 -36
  110. package/src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.types.ts +1 -1
  111. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.ts +1 -1
  112. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-builder/template-condition-builder.template.ts +49 -6
  113. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-builder/template-condition-builder.ts +116 -5
  114. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts +76 -0
  115. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts +81 -0
  116. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.template.ts +45 -11
  117. package/src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts +62 -18
  118. package/src/components/foundation-notification-dashboard/notification-dashboard.utils.ts +417 -2
  119. package/src/components/foundation-notification-dashboard/rule-expression-builder.utils.ts +259 -0
  120. package/src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts +124 -0
  121. package/src/components/foundation-notification-dashboard/styles/dynamic-rule.styles.ts +13 -0
  122. package/src/components/foundation-notification-dashboard/types/param-type.ts +1 -1
  123. package/src/notify.types.ts +22 -1
  124. package/src/services/system.service.ts +4 -0
@@ -748,7 +748,7 @@
748
748
  {
749
749
  "kind": "variable",
750
750
  "name": "ruleAndTemplate",
751
- "default": "css`\n .template {\n cursor: pointer;\n\n .template-name {\n font-weight: 700;\n }\n\n .template-description {\n font-size: var(--type-ramp-minus-2-font-size);\n }\n\n .template-datetime {\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n }\n\n .rule {\n cursor: pointer;\n\n .rule-name {\n font-weight: 700;\n }\n\n .rule-expression {\n font-size: var(--type-ramp-minus-2-font-size);\n }\n\n .rule-datetime {\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n }\n\n .rule,\n .template {\n border-bottom: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n padding: calc(var(--design-unit) * 2px) calc(var(--design-unit) * 3px);\n }\n\n .rule-status-actions {\n display: flex;\n flex-direction: row;\n gap: calc(var(--design-unit) * 2px);\n }\n\n .rule:hover,\n .template:hover {\n background-color: var(--neutral-layer-3);\n }\n\n .rule-actions {\n margin-left: auto;\n display: flex;\n gap: calc(var(--design-unit) * 3px);\n justify-content: space-between;\n visibility: hidden;\n }\n\n .rule:hover > .rule-status-actions > .rule-actions {\n visibility: visible;\n }\n\n .active {\n color: #7acc79;\n }\n\n .paused {\n color: #ffb660;\n }\n\n .rule-action-edit,\n .rule-action-enable-disable,\n .rule-action-delete {\n cursor: pointer;\n }\n\n .close-icon {\n position: absolute;\n right: calc(var(--design-unit) * 2px);\n cursor: pointer;\n }\n`"
751
+ "default": "css`\n .template {\n .template-row {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: calc(var(--design-unit) * 3px);\n }\n\n .template-details {\n flex: 1;\n min-width: 0;\n }\n\n .template-subscribe-toggle {\n flex-shrink: 0;\n margin-top: calc(var(--design-unit) * 1px);\n }\n\n .template-name {\n font-weight: 700;\n }\n\n .template-description {\n font-size: var(--type-ramp-minus-2-font-size);\n }\n\n .template-datetime {\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n }\n\n .rule {\n cursor: pointer;\n\n .rule-name {\n font-weight: 700;\n }\n\n .rule-expression {\n font-size: var(--type-ramp-minus-2-font-size);\n }\n\n .rule-datetime {\n font-size: var(--type-ramp-minus-1-font-size);\n color: var(--neutral-foreground-hint);\n }\n }\n\n .rule,\n .template {\n border-bottom: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n padding: calc(var(--design-unit) * 2px) calc(var(--design-unit) * 3px);\n }\n\n .template-subscribing {\n position: relative;\n z-index: 5;\n overflow: visible;\n padding-bottom: calc(var(--design-unit) * 24px);\n }\n\n .rule-status-actions {\n display: flex;\n flex-direction: row;\n gap: calc(var(--design-unit) * 2px);\n }\n\n .rule:hover {\n background-color: var(--neutral-layer-3);\n }\n\n .rule-actions {\n margin-left: auto;\n display: flex;\n gap: calc(var(--design-unit) * 3px);\n justify-content: space-between;\n visibility: hidden;\n }\n\n .rule:hover > .rule-status-actions > .rule-actions {\n visibility: visible;\n }\n\n .active {\n color: #7acc79;\n }\n\n .paused {\n color: #ffb660;\n }\n\n .rule-action-edit,\n .rule-action-enable-disable,\n .rule-action-delete {\n cursor: pointer;\n }\n\n .close-icon {\n position: absolute;\n right: calc(var(--design-unit) * 2px);\n cursor: pointer;\n }\n`"
752
752
  },
753
753
  {
754
754
  "kind": "variable",
@@ -815,7 +815,7 @@
815
815
  {
816
816
  "kind": "variable",
817
817
  "name": "FoundationInboxTemplate",
818
- "default": "html<FoundationInbox>`\n <div class=\"inbox-content\">\n <rapid-tabs ${ref('tabs')} appearance=\"secondary\" activeid=${(x) => InboxTab.ALERTS_NEW}>\n <rapid-tab\n slot=\"alert-log-tab\"\n id=${InboxTab.ALERTS_NEW}\n @click=${(x) => x.inboxTabChanged(InboxTab.ALERTS_NEW)}\n appearance=\"secondary\"\n >\n Alerts\n </rapid-tab>\n <rapid-tab\n slot=\"alert-log-tab\"\n id=${InboxTab.ALERT_HISTORY}\n @click=${(x) => x.inboxTabChanged(InboxTab.ALERT_HISTORY)}\n appearance=\"secondary\"\n >\n Alert History\n </rapid-tab>\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleView),\n html`\n <rapid-tab\n slot=\"my-alerts-tab\"\n id=${InboxTab.MY_ALERTS}\n @click=${(x) => x.inboxTabChanged(InboxTab.MY_ALERTS)}\n appearance=\"secondary\"\n >\n Subscriptions\n </rapid-tab>\n `,\n )}\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleTemplateView),\n html`\n <rapid-tab\n slot=\"subscribe-tab\"\n id=${InboxTab.SUBSCRIBE}\n @click=${(x) => x.inboxTabChanged(InboxTab.SUBSCRIBE)}\n appearance=\"secondary\"\n >\n Subscribe\n </rapid-tab>\n `,\n )}\n\n <!-- Alerts -->\n ${(_) => alertsTab(InboxTab.ALERTS_NEW)} ${(_) => alertsTab(InboxTab.ALERT_HISTORY)}\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleView),\n html`\n <!-- Rules -->\n <rapid-tab-panel\n slot=\"my-alerts-tab\"\n class=\"my-alerts-tab-panel\"\n id=${InboxTab.MY_ALERTS}\n style=${(x) => (x.selectedTab === InboxTab.MY_ALERTS ? '' : 'display: none;')}\n >\n <div class=\"my-alerts-tab-content\">\n ${repeat(\n (x) => x.rulesFilter,\n html<any>`\n <div class=\"rule\">\n <div class=\"rule-name\">${(x) => x.NAME}</div>\n <div class=\"rule-expression\">${(x) => x.RULE_EXPRESSION}</div>\n <div class=\"rule-datetime\">${(x, c) => getFormattedDate(x.DATETIME)}</div>\n <div class=\"rule-status-actions\">\n <div class=\"rule-status ${(x) => getStatus(x.RULE_STATUS).toLowerCase()}\">\n ${(x, c) => getStatus(x.RULE_STATUS)}\n </div>\n <div class=\"rule-actions\">\n <!--\n <span class=\"rule-action-edit\" @click=${(x, c) => c.parent.editAlert(x)}}>\n <rapid-icon name=\"gear\"></rapid-icon>\n </span>\n -->\n <span\n class=\"rule-action-enable-disable\"\n @click=${(x, c) => c.parent.playPauseAlert(x)}\n >\n <rapid-icon name=${(x) => getIcon(x.RULE_STATUS)}></rapid-icon>\n </span>\n <span\n class=\"rule-action-delete\"\n @click=${(x, c) => c.parent.deleteAlert(x)}\n >\n <rapid-icon name=\"trash\"></rapid-icon>\n </span>\n </div>\n </div>\n </div>\n `,\n )}\n </div>\n </rapid-tab-panel>\n `,\n )}\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleTemplateView),\n html`\n <!-- Templates -->\n <rapid-tab-panel\n slot=\"subscribe-tab\"\n class=\"subscribe-tab-panel\"\n id=${InboxTab.SUBSCRIBE}\n style=${(x) => (x.selectedTab === InboxTab.SUBSCRIBE ? '' : 'display: none;')}\n >\n <div class=\"search\">\n <rapid-text-field\n class=\"search-input\"\n @input=${(x, c) => {\n x.searchSubscribe = (c.event.target as HTMLInputElement).value;\n x.filterSearchSubscribe();\n }}\n placeholder=\"Search Templates...\"\n autocomplete=\"off\"\n ></rapid-text-field>\n </div>\n <div class=\"subscribe-tab-content\">\n ${repeat(\n (x) => x.templatesFilter,\n html`\n <div\n class=\"template\"\n @click=${(x, c) => c.parent.openTemplateSubscription(x)}\n id=${(x) => x.ID}\n >\n <div class=\"template-name\">${(x) => x.NAME}</div>\n <div class=\"template-description\">${(x) => x.DESCRIPTION}</div>\n <div class=\"template-datetime\">${(x, c) => getFormattedDate(x.DATETIME)}</div>\n </div>\n `,\n )}\n </div>\n ${when(\n (x) => x.ruleTemplateDetails,\n html`\n <inbox-subscription\n :template=${(x) => x.ruleTemplateDetails}\n @templateSubscribed=${(x) => (x.ruleTemplateDetails = null)}\n ></inbox-subscription>\n `,\n )}\n </rapid-tab-panel>\n `,\n )}\n </rapid-tabs>\n </div>\n`",
818
+ "default": "html<FoundationInbox>`\n <div class=\"inbox-content\">\n <rapid-tabs ${ref('tabs')} appearance=\"secondary\" activeid=${(x) => InboxTab.ALERTS_NEW}>\n <rapid-tab\n slot=\"alert-log-tab\"\n id=${InboxTab.ALERTS_NEW}\n @click=${(x) => x.inboxTabChanged(InboxTab.ALERTS_NEW)}\n appearance=\"secondary\"\n >\n Alerts\n </rapid-tab>\n <rapid-tab\n slot=\"alert-log-tab\"\n id=${InboxTab.ALERT_HISTORY}\n @click=${(x) => x.inboxTabChanged(InboxTab.ALERT_HISTORY)}\n appearance=\"secondary\"\n >\n Alert History\n </rapid-tab>\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleTemplateView),\n html`\n <rapid-tab\n slot=\"subscribe-tab\"\n id=${InboxTab.SUBSCRIBE}\n @click=${(x) => x.inboxTabChanged(InboxTab.SUBSCRIBE)}\n appearance=\"secondary\"\n >\n Subscribe\n </rapid-tab>\n `,\n )}\n\n <!-- Alerts -->\n ${(_) => alertsTab(InboxTab.ALERTS_NEW)} ${(_) => alertsTab(InboxTab.ALERT_HISTORY)}\n ${when(\n (x) => x.auth.currentUser?.hasPermission(NotifyPermission.NotificationRuleTemplateView),\n html`\n <rapid-tab-panel\n slot=\"subscribe-tab\"\n class=\"subscribe-tab-panel\"\n id=${InboxTab.SUBSCRIBE}\n style=${(x) => (x.selectedTab === InboxTab.SUBSCRIBE ? '' : 'display: none;')}\n >\n <div class=\"search\">\n <rapid-text-field\n class=\"search-input\"\n @input=${(x, c) => {\n x.searchSubscribe = (c.event.target as HTMLInputElement).value;\n x.filterSearchSubscribe();\n }}\n placeholder=\"Search Templates...\"\n autocomplete=\"off\"\n ></rapid-text-field>\n </div>\n <div class=\"subscribe-tab-content\">\n ${repeat(\n (x) => x.templatesFilter,\n html<RuleTemplate, FoundationInbox>`\n <div\n class=\"template ${(x, c) =>\n c.parent.pendingSubscribeTemplateId === x.ID ? 'template-subscribing' : ''}\"\n id=${(x) => x.ID}\n >\n <div class=\"template-row\">\n <div class=\"template-details\">\n <div class=\"template-name\">${(x) => x.NAME}</div>\n <div class=\"template-description\">${(x) => x.DESCRIPTION}</div>\n <div class=\"template-datetime\">\n ${(x, c) => getFormattedDate(x.DATETIME)}\n </div>\n </div>\n <rapid-switch\n class=\"template-subscribe-toggle\"\n :checked=${(x, c) => c.parent.isTemplateSubscribed(x)}\n @change=${(x, c) => c.parent.handleTemplateToggle(x, c.event as Event)}\n @click=${(_, c) => c.event.stopPropagation()}\n ></rapid-switch>\n </div>\n ${when(\n (x, c) => c.parent.pendingSubscribeTemplateId === x.ID,\n html`\n <inbox-subscription\n inline\n :template=${(x, c) => c.parent.ruleTemplateDetails}\n @templateSubscribed=${(x, c) =>\n c.parent.onTemplateSubscribed(eventDetail(c))}\n @subscribeCancelled=${(x, c) => c.parent.cancelPendingSubscribe()}\n ></inbox-subscription>\n `,\n )}\n </div>\n `,\n )}\n </div>\n </rapid-tab-panel>\n `,\n )}\n </rapid-tabs>\n </div>\n`",
819
819
  "privacy": "public"
820
820
  }
821
821
  ],
@@ -961,18 +961,6 @@
961
961
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
962
962
  }
963
963
  },
964
- {
965
- "kind": "field",
966
- "name": "rulesFilter",
967
- "type": {
968
- "text": "Rule[]"
969
- },
970
- "default": "[]",
971
- "inheritedFrom": {
972
- "name": "FoundationInboxBase",
973
- "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
974
- }
975
- },
976
964
  {
977
965
  "kind": "field",
978
966
  "name": "templateService",
@@ -1068,6 +1056,30 @@
1068
1056
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1069
1057
  }
1070
1058
  },
1059
+ {
1060
+ "kind": "field",
1061
+ "name": "pendingSubscribeTemplateId",
1062
+ "type": {
1063
+ "text": "string"
1064
+ },
1065
+ "default": "null",
1066
+ "inheritedFrom": {
1067
+ "name": "FoundationInboxBase",
1068
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1069
+ }
1070
+ },
1071
+ {
1072
+ "kind": "field",
1073
+ "name": "subscribedTemplateIds",
1074
+ "type": {
1075
+ "text": "Record<string, boolean>"
1076
+ },
1077
+ "default": "{}",
1078
+ "inheritedFrom": {
1079
+ "name": "FoundationInboxBase",
1080
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1081
+ }
1082
+ },
1071
1083
  {
1072
1084
  "kind": "field",
1073
1085
  "name": "selectedTab",
@@ -1222,14 +1234,6 @@
1222
1234
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1223
1235
  }
1224
1236
  },
1225
- {
1226
- "kind": "field",
1227
- "name": "rulesChanged",
1228
- "inheritedFrom": {
1229
- "name": "FoundationInboxBase",
1230
- "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1231
- }
1232
- },
1233
1237
  {
1234
1238
  "kind": "field",
1235
1239
  "name": "templatesChanged",
@@ -1317,7 +1321,7 @@
1317
1321
  },
1318
1322
  {
1319
1323
  "kind": "method",
1320
- "name": "editAlert",
1324
+ "name": "refreshSubscribeData",
1321
1325
  "inheritedFrom": {
1322
1326
  "name": "FoundationInboxBase",
1323
1327
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
@@ -1325,12 +1329,17 @@
1325
1329
  },
1326
1330
  {
1327
1331
  "kind": "method",
1328
- "name": "playPauseAlert",
1332
+ "name": "findSubscribedRule",
1333
+ "return": {
1334
+ "type": {
1335
+ "text": "Rule | undefined"
1336
+ }
1337
+ },
1329
1338
  "parameters": [
1330
1339
  {
1331
- "name": "ruleClicked",
1340
+ "name": "template",
1332
1341
  "type": {
1333
- "text": "Rule"
1342
+ "text": "RuleTemplate"
1334
1343
  }
1335
1344
  }
1336
1345
  ],
@@ -1341,12 +1350,17 @@
1341
1350
  },
1342
1351
  {
1343
1352
  "kind": "method",
1344
- "name": "deleteAlert",
1353
+ "name": "isTemplateSubscribed",
1354
+ "return": {
1355
+ "type": {
1356
+ "text": "boolean"
1357
+ }
1358
+ },
1345
1359
  "parameters": [
1346
1360
  {
1347
- "name": "ruleClicked",
1361
+ "name": "template",
1348
1362
  "type": {
1349
- "text": "Rule"
1363
+ "text": "RuleTemplate"
1350
1364
  }
1351
1365
  }
1352
1366
  ],
@@ -1357,12 +1371,35 @@
1357
1371
  },
1358
1372
  {
1359
1373
  "kind": "method",
1360
- "name": "openTemplateSubscription",
1374
+ "name": "handleTemplateToggle",
1361
1375
  "parameters": [
1362
1376
  {
1363
- "name": "ruleTemplate",
1377
+ "name": "template",
1364
1378
  "type": {
1365
- "text": "any"
1379
+ "text": "RuleTemplate"
1380
+ }
1381
+ },
1382
+ {
1383
+ "name": "event",
1384
+ "type": {
1385
+ "text": "Event"
1386
+ }
1387
+ }
1388
+ ],
1389
+ "inheritedFrom": {
1390
+ "name": "FoundationInboxBase",
1391
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1392
+ }
1393
+ },
1394
+ {
1395
+ "kind": "method",
1396
+ "name": "onTemplateSubscribed",
1397
+ "parameters": [
1398
+ {
1399
+ "name": "templateId",
1400
+ "optional": true,
1401
+ "type": {
1402
+ "text": "string"
1366
1403
  }
1367
1404
  }
1368
1405
  ],
@@ -1371,6 +1408,14 @@
1371
1408
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1372
1409
  }
1373
1410
  },
1411
+ {
1412
+ "kind": "method",
1413
+ "name": "cancelPendingSubscribe",
1414
+ "inheritedFrom": {
1415
+ "name": "FoundationInboxBase",
1416
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
1417
+ }
1418
+ },
1374
1419
  {
1375
1420
  "kind": "method",
1376
1421
  "name": "formatDateStrForMatchCriteria",
@@ -1420,24 +1465,6 @@
1420
1465
  "kind": "javascript-module",
1421
1466
  "path": "src/components/foundation-inbox/inbox.utils.ts",
1422
1467
  "declarations": [
1423
- {
1424
- "kind": "function",
1425
- "name": "getStatus",
1426
- "parameters": [
1427
- {
1428
- "name": "ruleStatus"
1429
- }
1430
- ]
1431
- },
1432
- {
1433
- "kind": "function",
1434
- "name": "getIcon",
1435
- "parameters": [
1436
- {
1437
- "name": "ruleStatus"
1438
- }
1439
- ]
1440
- },
1441
1468
  {
1442
1469
  "kind": "function",
1443
1470
  "name": "getFormattedDate",
@@ -1461,22 +1488,6 @@
1461
1488
  }
1462
1489
  ],
1463
1490
  "exports": [
1464
- {
1465
- "kind": "js",
1466
- "name": "getStatus",
1467
- "declaration": {
1468
- "name": "getStatus",
1469
- "module": "src/components/foundation-inbox/inbox.utils.ts"
1470
- }
1471
- },
1472
- {
1473
- "kind": "js",
1474
- "name": "getIcon",
1475
- "declaration": {
1476
- "name": "getIcon",
1477
- "module": "src/components/foundation-inbox/inbox.utils.ts"
1478
- }
1479
- },
1480
1491
  {
1481
1492
  "kind": "js",
1482
1493
  "name": "getFormattedDate",
@@ -1729,11 +1740,21 @@
1729
1740
  "name": "createAssignment",
1730
1741
  "static": true
1731
1742
  },
1743
+ {
1744
+ "kind": "field",
1745
+ "name": "createTextAssignment",
1746
+ "static": true
1747
+ },
1732
1748
  {
1733
1749
  "kind": "field",
1734
1750
  "name": "getAssignmentValue",
1735
1751
  "static": true
1736
1752
  },
1753
+ {
1754
+ "kind": "field",
1755
+ "name": "getAssignmentText",
1756
+ "static": true
1757
+ },
1737
1758
  {
1738
1759
  "kind": "method",
1739
1760
  "name": "createConditions",
@@ -1747,7 +1768,7 @@
1747
1768
  {
1748
1769
  "name": "conditions",
1749
1770
  "type": {
1750
- "text": "ConditionBuilderEntity[]"
1771
+ "text": "ConditionNode[]"
1751
1772
  }
1752
1773
  },
1753
1774
  {
@@ -1755,6 +1776,143 @@
1755
1776
  "optional": true
1756
1777
  }
1757
1778
  ]
1779
+ },
1780
+ {
1781
+ "kind": "method",
1782
+ "name": "hasMultiValueCondition",
1783
+ "static": true,
1784
+ "return": {
1785
+ "type": {
1786
+ "text": "boolean"
1787
+ }
1788
+ },
1789
+ "parameters": [
1790
+ {
1791
+ "name": "conditions",
1792
+ "type": {
1793
+ "text": "ConditionNode[]"
1794
+ }
1795
+ }
1796
+ ]
1797
+ },
1798
+ {
1799
+ "kind": "method",
1800
+ "name": "hasOrJoin",
1801
+ "static": true,
1802
+ "return": {
1803
+ "type": {
1804
+ "text": "boolean"
1805
+ }
1806
+ },
1807
+ "parameters": [
1808
+ {
1809
+ "name": "conditions",
1810
+ "type": {
1811
+ "text": "ConditionNode[]"
1812
+ }
1813
+ }
1814
+ ]
1815
+ },
1816
+ {
1817
+ "kind": "method",
1818
+ "name": "hasGroup",
1819
+ "static": true,
1820
+ "return": {
1821
+ "type": {
1822
+ "text": "boolean"
1823
+ }
1824
+ },
1825
+ "parameters": [
1826
+ {
1827
+ "name": "conditions",
1828
+ "type": {
1829
+ "text": "ConditionNode[]"
1830
+ }
1831
+ }
1832
+ ]
1833
+ },
1834
+ {
1835
+ "kind": "method",
1836
+ "name": "flattenConditions",
1837
+ "static": true,
1838
+ "return": {
1839
+ "type": {
1840
+ "text": "ConditionBuilderEntity[]"
1841
+ }
1842
+ },
1843
+ "parameters": [
1844
+ {
1845
+ "name": "conditions",
1846
+ "type": {
1847
+ "text": "ConditionNode[]"
1848
+ }
1849
+ }
1850
+ ]
1851
+ },
1852
+ {
1853
+ "kind": "method",
1854
+ "name": "resolveLeftValues",
1855
+ "static": true,
1856
+ "return": {
1857
+ "type": {
1858
+ "text": "ConditionNode[]"
1859
+ }
1860
+ },
1861
+ "parameters": [
1862
+ {
1863
+ "name": "conditions",
1864
+ "type": {
1865
+ "text": "ConditionNode[]"
1866
+ }
1867
+ },
1868
+ {
1869
+ "name": "fields",
1870
+ "type": {
1871
+ "text": "any[]"
1872
+ }
1873
+ }
1874
+ ]
1875
+ },
1876
+ {
1877
+ "kind": "field",
1878
+ "name": "createEmptyGroup",
1879
+ "static": true
1880
+ },
1881
+ {
1882
+ "kind": "method",
1883
+ "name": "buildRawExpression",
1884
+ "static": true,
1885
+ "return": {
1886
+ "type": {
1887
+ "text": "string"
1888
+ }
1889
+ },
1890
+ "parameters": [
1891
+ {
1892
+ "name": "conditions",
1893
+ "type": {
1894
+ "text": "ConditionNode[]"
1895
+ }
1896
+ }
1897
+ ]
1898
+ },
1899
+ {
1900
+ "kind": "method",
1901
+ "name": "parseRawExpression",
1902
+ "static": true,
1903
+ "return": {
1904
+ "type": {
1905
+ "text": "ConditionNode[] | null"
1906
+ }
1907
+ },
1908
+ "parameters": [
1909
+ {
1910
+ "name": "rawExpression",
1911
+ "type": {
1912
+ "text": "string"
1913
+ }
1914
+ }
1915
+ ]
1758
1916
  }
1759
1917
  ]
1760
1918
  },
@@ -1922,32 +2080,140 @@
1922
2080
  },
1923
2081
  {
1924
2082
  "kind": "javascript-module",
1925
- "path": "src/components/foundation-inbox/inbox-base/inbox-base.ts",
2083
+ "path": "src/components/foundation-notification-dashboard/rule-expression-builder.utils.ts",
1926
2084
  "declarations": [
1927
2085
  {
1928
- "kind": "class",
1929
- "description": "",
1930
- "name": "FoundationInboxBase",
1931
- "members": [
2086
+ "kind": "function",
2087
+ "name": "mapFieldsToExpressionBuilderFields",
2088
+ "return": {
2089
+ "type": {
2090
+ "text": "ExpressionBuilderTypes.Field[]"
2091
+ }
2092
+ },
2093
+ "parameters": [
1932
2094
  {
1933
- "kind": "field",
1934
- "name": "auth",
2095
+ "name": "fields",
1935
2096
  "type": {
1936
- "text": "Auth"
2097
+ "text": "Field[]"
1937
2098
  }
1938
- },
2099
+ }
2100
+ ]
2101
+ },
2102
+ {
2103
+ "kind": "function",
2104
+ "name": "ruleExpressionToRawText",
2105
+ "return": {
2106
+ "type": {
2107
+ "text": "string"
2108
+ }
2109
+ },
2110
+ "parameters": [
1939
2111
  {
1940
- "kind": "field",
1941
- "name": "connect",
2112
+ "name": "expr",
1942
2113
  "type": {
1943
- "text": "Connect"
2114
+ "text": "AnyExpression | null | undefined"
1944
2115
  }
1945
- },
1946
- {
1947
- "kind": "field",
1948
- "name": "alertService",
1949
- "type": {
1950
- "text": "AlertService"
2116
+ }
2117
+ ]
2118
+ },
2119
+ {
2120
+ "kind": "function",
2121
+ "name": "rawTextToRuleExpression",
2122
+ "return": {
2123
+ "type": {
2124
+ "text": "PredicateExpression | null"
2125
+ }
2126
+ },
2127
+ "parameters": [
2128
+ {
2129
+ "name": "raw",
2130
+ "type": {
2131
+ "text": "string"
2132
+ }
2133
+ }
2134
+ ]
2135
+ },
2136
+ {
2137
+ "kind": "function",
2138
+ "name": "conditionsToRuleExpression",
2139
+ "return": {
2140
+ "type": {
2141
+ "text": "PredicateExpression"
2142
+ }
2143
+ },
2144
+ "parameters": [
2145
+ {
2146
+ "name": "conditions",
2147
+ "type": {
2148
+ "text": "RuleExpression.Condition[]"
2149
+ }
2150
+ }
2151
+ ]
2152
+ }
2153
+ ],
2154
+ "exports": [
2155
+ {
2156
+ "kind": "js",
2157
+ "name": "mapFieldsToExpressionBuilderFields",
2158
+ "declaration": {
2159
+ "name": "mapFieldsToExpressionBuilderFields",
2160
+ "module": "src/components/foundation-notification-dashboard/rule-expression-builder.utils.ts"
2161
+ }
2162
+ },
2163
+ {
2164
+ "kind": "js",
2165
+ "name": "ruleExpressionToRawText",
2166
+ "declaration": {
2167
+ "name": "ruleExpressionToRawText",
2168
+ "module": "src/components/foundation-notification-dashboard/rule-expression-builder.utils.ts"
2169
+ }
2170
+ },
2171
+ {
2172
+ "kind": "js",
2173
+ "name": "rawTextToRuleExpression",
2174
+ "declaration": {
2175
+ "name": "rawTextToRuleExpression",
2176
+ "module": "src/components/foundation-notification-dashboard/rule-expression-builder.utils.ts"
2177
+ }
2178
+ },
2179
+ {
2180
+ "kind": "js",
2181
+ "name": "conditionsToRuleExpression",
2182
+ "declaration": {
2183
+ "name": "conditionsToRuleExpression",
2184
+ "module": "src/components/foundation-notification-dashboard/rule-expression-builder.utils.ts"
2185
+ }
2186
+ }
2187
+ ]
2188
+ },
2189
+ {
2190
+ "kind": "javascript-module",
2191
+ "path": "src/components/foundation-inbox/inbox-base/inbox-base.ts",
2192
+ "declarations": [
2193
+ {
2194
+ "kind": "class",
2195
+ "description": "",
2196
+ "name": "FoundationInboxBase",
2197
+ "members": [
2198
+ {
2199
+ "kind": "field",
2200
+ "name": "auth",
2201
+ "type": {
2202
+ "text": "Auth"
2203
+ }
2204
+ },
2205
+ {
2206
+ "kind": "field",
2207
+ "name": "connect",
2208
+ "type": {
2209
+ "text": "Connect"
2210
+ }
2211
+ },
2212
+ {
2213
+ "kind": "field",
2214
+ "name": "alertService",
2215
+ "type": {
2216
+ "text": "AlertService"
1951
2217
  }
1952
2218
  },
1953
2219
  {
@@ -2005,14 +2271,6 @@
2005
2271
  },
2006
2272
  "default": "[]"
2007
2273
  },
2008
- {
2009
- "kind": "field",
2010
- "name": "rulesFilter",
2011
- "type": {
2012
- "text": "Rule[]"
2013
- },
2014
- "default": "[]"
2015
- },
2016
2274
  {
2017
2275
  "kind": "field",
2018
2276
  "name": "templateService",
@@ -2076,6 +2334,22 @@
2076
2334
  },
2077
2335
  "default": "null"
2078
2336
  },
2337
+ {
2338
+ "kind": "field",
2339
+ "name": "pendingSubscribeTemplateId",
2340
+ "type": {
2341
+ "text": "string"
2342
+ },
2343
+ "default": "null"
2344
+ },
2345
+ {
2346
+ "kind": "field",
2347
+ "name": "subscribedTemplateIds",
2348
+ "type": {
2349
+ "text": "Record<string, boolean>"
2350
+ },
2351
+ "default": "{}"
2352
+ },
2079
2353
  {
2080
2354
  "kind": "field",
2081
2355
  "name": "selectedTab",
@@ -2174,10 +2448,6 @@
2174
2448
  "kind": "method",
2175
2449
  "name": "loadMoreAlerts"
2176
2450
  },
2177
- {
2178
- "kind": "field",
2179
- "name": "rulesChanged"
2180
- },
2181
2451
  {
2182
2452
  "kind": "field",
2183
2453
  "name": "templatesChanged"
@@ -2229,44 +2499,77 @@
2229
2499
  },
2230
2500
  {
2231
2501
  "kind": "method",
2232
- "name": "editAlert"
2502
+ "name": "refreshSubscribeData"
2233
2503
  },
2234
2504
  {
2235
2505
  "kind": "method",
2236
- "name": "playPauseAlert",
2506
+ "name": "findSubscribedRule",
2507
+ "return": {
2508
+ "type": {
2509
+ "text": "Rule | undefined"
2510
+ }
2511
+ },
2237
2512
  "parameters": [
2238
2513
  {
2239
- "name": "ruleClicked",
2514
+ "name": "template",
2240
2515
  "type": {
2241
- "text": "Rule"
2516
+ "text": "RuleTemplate"
2242
2517
  }
2243
2518
  }
2244
2519
  ]
2245
2520
  },
2246
2521
  {
2247
2522
  "kind": "method",
2248
- "name": "deleteAlert",
2523
+ "name": "isTemplateSubscribed",
2524
+ "return": {
2525
+ "type": {
2526
+ "text": "boolean"
2527
+ }
2528
+ },
2249
2529
  "parameters": [
2250
2530
  {
2251
- "name": "ruleClicked",
2531
+ "name": "template",
2252
2532
  "type": {
2253
- "text": "Rule"
2533
+ "text": "RuleTemplate"
2254
2534
  }
2255
2535
  }
2256
2536
  ]
2257
2537
  },
2258
2538
  {
2259
2539
  "kind": "method",
2260
- "name": "openTemplateSubscription",
2540
+ "name": "handleTemplateToggle",
2261
2541
  "parameters": [
2262
2542
  {
2263
- "name": "ruleTemplate",
2543
+ "name": "template",
2264
2544
  "type": {
2265
- "text": "any"
2545
+ "text": "RuleTemplate"
2546
+ }
2547
+ },
2548
+ {
2549
+ "name": "event",
2550
+ "type": {
2551
+ "text": "Event"
2552
+ }
2553
+ }
2554
+ ]
2555
+ },
2556
+ {
2557
+ "kind": "method",
2558
+ "name": "onTemplateSubscribed",
2559
+ "parameters": [
2560
+ {
2561
+ "name": "templateId",
2562
+ "optional": true,
2563
+ "type": {
2564
+ "text": "string"
2266
2565
  }
2267
2566
  }
2268
2567
  ]
2269
2568
  },
2569
+ {
2570
+ "kind": "method",
2571
+ "name": "cancelPendingSubscribe"
2572
+ },
2270
2573
  {
2271
2574
  "kind": "method",
2272
2575
  "name": "formatDateStrForMatchCriteria",
@@ -2305,7 +2608,12 @@
2305
2608
  {
2306
2609
  "kind": "variable",
2307
2610
  "name": "ConditionBuilderStyles",
2308
- "default": "css`\n .condition-builder {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n rapid-button {\n margin: 0;\n }\n\n .delete {\n margin: 0;\n display: flex;\n justify-content: center;\n height: calc(var(--design-unit) * 9px);\n }\n\n .delete:hover {\n background-color: color-mix(in srgb, var(--neutral-foreground-rest), transparent 89%);\n }\n\n rapid-text-field {\n width: 100%;\n margin-bottom: 0;\n }\n\n rapid-text-field::part(root) {\n height: calc(var(--design-unit) * 9px);\n }\n\n rapid-select {\n min-width: auto;\n }\n\n rapid-select.left-value::part(control) {\n width: 250px;\n }\n\n rapid-select.logical-operator::part(control) {\n width: 160px;\n }\n\n .logical-operator-null-and-blank {\n width: 100%;\n }\n\n rapid-select.right-criteria::part(control) {\n width: 135px;\n }\n\n rapid-select.right-criteria-user-entry {\n width: 100%;\n }\n\n rapid-select.right-criteria-select {\n width: 100%;\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
2611
+ "default": "css`\n .condition-builder {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n align-items: center;\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n rapid-button {\n margin: 0;\n }\n\n /* The AND/OR toggle sits on its own row ABOVE the condition it joins,\n rendered as a pair of small text links rather than buttons - reads like\n a sentence connector (\"... and ...\") instead of a UI control competing\n with the row's fields for attention. */\n .join-toggle-row {\n display: flex;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .join-toggle {\n display: flex;\n gap: calc(var(--design-unit) * 1.5px);\n }\n\n .join-text {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: var(--accent-fill-rest);\n cursor: pointer;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n opacity: 40%;\n }\n\n .join-text:hover {\n opacity: 70%;\n }\n\n .join-text.active {\n opacity: 100%;\n text-decoration: underline solid;\n }\n\n .join-text.active:hover {\n opacity: 100%;\n }\n\n .delete {\n margin: 0;\n display: flex;\n justify-content: center;\n height: calc(var(--design-unit) * 9px);\n }\n\n .delete:hover {\n background-color: color-mix(in srgb, var(--neutral-foreground-rest), transparent 89%);\n }\n\n rapid-text-field {\n width: 100%;\n margin-bottom: 0;\n }\n\n rapid-text-field::part(root) {\n height: calc(var(--design-unit) * 9px);\n }\n\n rapid-select {\n min-width: auto;\n }\n\n rapid-select.left-value::part(control) {\n width: 250px;\n }\n\n rapid-select.logical-operator::part(control) {\n width: 160px;\n }\n\n .logical-operator-null-and-blank {\n width: 100%;\n }\n\n rapid-select.right-criteria::part(control) {\n width: 135px;\n }\n\n rapid-select.right-criteria-user-entry {\n width: 100%;\n }\n\n rapid-select.right-criteria-select {\n width: 100%;\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
2612
+ },
2613
+ {
2614
+ "kind": "variable",
2615
+ "name": "ConditionGroupStyles",
2616
+ "default": "css`\n .condition-group-row {\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n /* The AND/OR toggle sits on its own row ABOVE the group it joins - see\n ConditionBuilderStyles' .join-toggle-row/.join-text for why it's a pair\n of text links rather than buttons. */\n .join-toggle-row {\n display: flex;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .join-toggle {\n display: flex;\n gap: calc(var(--design-unit) * 1.5px);\n }\n\n .join-text {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: var(--accent-fill-rest);\n cursor: pointer;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n opacity: 40%;\n }\n\n .join-text:hover {\n opacity: 70%;\n }\n\n .join-text.active {\n opacity: 100%;\n text-decoration: underline solid;\n }\n\n .join-text.active:hover {\n opacity: 100%;\n }\n\n /* A full bordered box reads as \"this is one parenthesized unit\" more\n literally than a left rail - it nests naturally too, a group inside a\n group just gets a second box drawn inside the first, like actual nested\n parens would look. */\n .condition-group-box {\n flex: 1;\n min-width: 0;\n border: calc(var(--design-unit) * 0.5px) solid\n color-mix(in srgb, var(--accent-fill-rest), transparent 25%);\n border-radius: calc(var(--design-unit) * 1px);\n padding: calc(var(--design-unit) * 2px);\n background-color: color-mix(in srgb, var(--accent-fill-rest), transparent 96%);\n }\n\n .condition-group-box > .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n align-items: center;\n margin-top: calc(var(--design-unit) * 1px);\n }\n\n .condition-group-box > .content-row rapid-button {\n font-size: 12px;\n }\n\n rule-condition-builder,\n rule-condition-group,\n template-condition-builder,\n template-condition-group {\n display: block;\n margin-bottom: calc(var(--design-unit) * 1px);\n }\n\n .delete-group {\n margin: 0;\n opacity: 60%;\n }\n\n .delete-group:hover {\n opacity: 100%;\n }\n`"
2309
2617
  }
2310
2618
  ],
2311
2619
  "exports": [
@@ -2316,6 +2624,14 @@
2316
2624
  "name": "ConditionBuilderStyles",
2317
2625
  "module": "src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts"
2318
2626
  }
2627
+ },
2628
+ {
2629
+ "kind": "js",
2630
+ "name": "ConditionGroupStyles",
2631
+ "declaration": {
2632
+ "name": "ConditionGroupStyles",
2633
+ "module": "src/components/foundation-notification-dashboard/styles/condition-builder.styles.ts"
2634
+ }
2319
2635
  }
2320
2636
  ]
2321
2637
  },
@@ -2331,7 +2647,7 @@
2331
2647
  {
2332
2648
  "kind": "variable",
2333
2649
  "name": "DynamicRuleDialogStyles",
2334
- "default": "css`\n ${scrollbarStyles}\n ${top}\n ${bottom}\n\n rapid-modal::part(dialog) {\n padding: 0;\n background: var(--neutral-layer-4);\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n }\n\n .dialog-content {\n display: flex;\n flex-direction: column;\n width: ${String(modalWidthPx)}px;\n max-height: 500px;\n overflow-y: scroll;\n gap: calc(var(--design-unit) * 3px);\n padding: calc(var(--design-unit) * 4px);\n }\n\n .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 3px);\n }\n\n .control {\n display: flex;\n flex-direction: column;\n width: 100%;\n gap: calc(var(--design-unit) * 2px);\n }\n\n .items {\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n display: flex;\n padding: calc(var(--design-unit) * 2px);\n flex-direction: column;\n }\n\n .item {\n gap: 0;\n flex-direction: column;\n margin-bottom: 0;\n }\n\n ${textField}\n ${select}\n\n rapid-button {\n margin: 0;\n }\n\n rapid-select {\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n\n .horizontal {\n flex-direction: row;\n }\n\n .destination {\n align-self: center;\n }\n\n .topic {\n min-width: revert-layer;\n }\n`"
2650
+ "default": "css`\n ${scrollbarStyles}\n ${top}\n ${bottom}\n\n rapid-modal::part(dialog) {\n padding: 0;\n background: var(--neutral-layer-4);\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n }\n\n .dialog-content {\n display: flex;\n flex-direction: column;\n width: ${String(modalWidthPx)}px;\n max-height: 500px;\n overflow-y: scroll;\n gap: calc(var(--design-unit) * 3px);\n padding: calc(var(--design-unit) * 4px);\n }\n\n .content-row {\n display: flex;\n gap: calc(var(--design-unit) * 3px);\n }\n\n .control {\n display: flex;\n flex-direction: column;\n width: 100%;\n gap: calc(var(--design-unit) * 2px);\n }\n\n .items {\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-radius: calc(var(--control-corner-radius) * 1px);\n display: flex;\n padding: calc(var(--design-unit) * 2px);\n flex-direction: column;\n }\n\n .item {\n gap: 0;\n flex-direction: column;\n margin-bottom: 0;\n }\n\n ${textField}\n ${select}\n\n rapid-button {\n margin: 0;\n }\n\n rapid-select {\n min-width: 0;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n\n .horizontal {\n flex-direction: row;\n }\n\n .destination {\n align-self: center;\n }\n\n .topic {\n min-width: revert-layer;\n }\n\n .expression-preview {\n width: 100%;\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .expression-preview::part(control) {\n font-family: var(--body-font, monospace);\n font-size: 12px;\n color: var(--neutral-foreground-hint);\n min-height: calc(var(--design-unit) * 12px);\n resize: vertical;\n }\n`"
2335
2651
  }
2336
2652
  ],
2337
2653
  "exports": [
@@ -2726,9 +3042,9 @@
2726
3042
  "kind": "variable",
2727
3043
  "name": "ALL_PARAM_TYPES",
2728
3044
  "type": {
2729
- "text": "[\n // PARAM_TYPE_FIELD,\n PARAM_TYPE_STRING,\n // PARAM_TYPE_BOOLEAN,\n PARAM_TYPE_NUMBER,\n]"
3045
+ "text": "[\n // PARAM_TYPE_FIELD,\n PARAM_TYPE_STRING,\n PARAM_TYPE_BOOLEAN,\n PARAM_TYPE_NUMBER,\n]"
2730
3046
  },
2731
- "default": "[\n // PARAM_TYPE_FIELD,\n PARAM_TYPE_STRING,\n // PARAM_TYPE_BOOLEAN,\n PARAM_TYPE_NUMBER,\n]"
3047
+ "default": "[\n // PARAM_TYPE_FIELD,\n PARAM_TYPE_STRING,\n PARAM_TYPE_BOOLEAN,\n PARAM_TYPE_NUMBER,\n]"
2732
3048
  }
2733
3049
  ],
2734
3050
  "exports": [
@@ -3321,18 +3637,6 @@
3321
3637
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
3322
3638
  }
3323
3639
  },
3324
- {
3325
- "kind": "field",
3326
- "name": "rulesFilter",
3327
- "type": {
3328
- "text": "Rule[]"
3329
- },
3330
- "default": "[]",
3331
- "inheritedFrom": {
3332
- "name": "FoundationInboxBase",
3333
- "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
3334
- }
3335
- },
3336
3640
  {
3337
3641
  "kind": "field",
3338
3642
  "name": "templateService",
@@ -3428,6 +3732,30 @@
3428
3732
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
3429
3733
  }
3430
3734
  },
3735
+ {
3736
+ "kind": "field",
3737
+ "name": "pendingSubscribeTemplateId",
3738
+ "type": {
3739
+ "text": "string"
3740
+ },
3741
+ "default": "null",
3742
+ "inheritedFrom": {
3743
+ "name": "FoundationInboxBase",
3744
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
3745
+ }
3746
+ },
3747
+ {
3748
+ "kind": "field",
3749
+ "name": "subscribedTemplateIds",
3750
+ "type": {
3751
+ "text": "Record<string, boolean>"
3752
+ },
3753
+ "default": "{}",
3754
+ "inheritedFrom": {
3755
+ "name": "FoundationInboxBase",
3756
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
3757
+ }
3758
+ },
3431
3759
  {
3432
3760
  "kind": "field",
3433
3761
  "name": "selectedTab",
@@ -3582,14 +3910,6 @@
3582
3910
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
3583
3911
  }
3584
3912
  },
3585
- {
3586
- "kind": "field",
3587
- "name": "rulesChanged",
3588
- "inheritedFrom": {
3589
- "name": "FoundationInboxBase",
3590
- "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
3591
- }
3592
- },
3593
3913
  {
3594
3914
  "kind": "field",
3595
3915
  "name": "templatesChanged",
@@ -3677,7 +3997,7 @@
3677
3997
  },
3678
3998
  {
3679
3999
  "kind": "method",
3680
- "name": "editAlert",
4000
+ "name": "refreshSubscribeData",
3681
4001
  "inheritedFrom": {
3682
4002
  "name": "FoundationInboxBase",
3683
4003
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
@@ -3685,12 +4005,17 @@
3685
4005
  },
3686
4006
  {
3687
4007
  "kind": "method",
3688
- "name": "playPauseAlert",
4008
+ "name": "findSubscribedRule",
4009
+ "return": {
4010
+ "type": {
4011
+ "text": "Rule | undefined"
4012
+ }
4013
+ },
3689
4014
  "parameters": [
3690
4015
  {
3691
- "name": "ruleClicked",
4016
+ "name": "template",
3692
4017
  "type": {
3693
- "text": "Rule"
4018
+ "text": "RuleTemplate"
3694
4019
  }
3695
4020
  }
3696
4021
  ],
@@ -3701,12 +4026,17 @@
3701
4026
  },
3702
4027
  {
3703
4028
  "kind": "method",
3704
- "name": "deleteAlert",
4029
+ "name": "isTemplateSubscribed",
4030
+ "return": {
4031
+ "type": {
4032
+ "text": "boolean"
4033
+ }
4034
+ },
3705
4035
  "parameters": [
3706
4036
  {
3707
- "name": "ruleClicked",
4037
+ "name": "template",
3708
4038
  "type": {
3709
- "text": "Rule"
4039
+ "text": "RuleTemplate"
3710
4040
  }
3711
4041
  }
3712
4042
  ],
@@ -3717,12 +4047,35 @@
3717
4047
  },
3718
4048
  {
3719
4049
  "kind": "method",
3720
- "name": "openTemplateSubscription",
4050
+ "name": "handleTemplateToggle",
3721
4051
  "parameters": [
3722
4052
  {
3723
- "name": "ruleTemplate",
4053
+ "name": "template",
3724
4054
  "type": {
3725
- "text": "any"
4055
+ "text": "RuleTemplate"
4056
+ }
4057
+ },
4058
+ {
4059
+ "name": "event",
4060
+ "type": {
4061
+ "text": "Event"
4062
+ }
4063
+ }
4064
+ ],
4065
+ "inheritedFrom": {
4066
+ "name": "FoundationInboxBase",
4067
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
4068
+ }
4069
+ },
4070
+ {
4071
+ "kind": "method",
4072
+ "name": "onTemplateSubscribed",
4073
+ "parameters": [
4074
+ {
4075
+ "name": "templateId",
4076
+ "optional": true,
4077
+ "type": {
4078
+ "text": "string"
3726
4079
  }
3727
4080
  }
3728
4081
  ],
@@ -3731,6 +4084,14 @@
3731
4084
  "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
3732
4085
  }
3733
4086
  },
4087
+ {
4088
+ "kind": "method",
4089
+ "name": "cancelPendingSubscribe",
4090
+ "inheritedFrom": {
4091
+ "name": "FoundationInboxBase",
4092
+ "module": "src/components/foundation-inbox/inbox-base/inbox-base.ts"
4093
+ }
4094
+ },
3734
4095
  {
3735
4096
  "kind": "method",
3736
4097
  "name": "formatDateStrForMatchCriteria",
@@ -3783,7 +4144,7 @@
3783
4144
  {
3784
4145
  "kind": "variable",
3785
4146
  "name": "InboxSubscriptionStyles",
3786
- "default": "css`\n .inbox-subscription {\n display: flex;\n flex-direction: column;\n }\n\n .inbox-subscription-header {\n border-top: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-bottom: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n padding: calc(var(--design-unit) * 2px);\n }\n\n .inbox-subscription-content {\n display: flex;\n flex-direction: column;\n gap: calc(var(--design-unit) * 2px);\n overflow: auto;\n max-height: calc(var(--design-unit) * 80px);\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n margin: calc(var(--design-unit) * 2px);\n padding: calc(var(--design-unit) * 2px);\n border-radius: calc(var(--control-corner-radius) * 1px);\n }\n\n .inbox-subscription-footer {\n padding: calc(var(--design-unit) * 2px);\n border-top: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n }\n\n rapid-button.subscribe {\n display: flex;\n margin: 0;\n width: 100%;\n }\n`"
4147
+ "default": "css`\n .inbox-subscription {\n display: flex;\n flex-direction: column;\n }\n\n .inbox-subscription.inline {\n margin-top: calc(var(--design-unit) * 2px);\n padding-top: calc(var(--design-unit) * 2px);\n border-top: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n }\n\n .inbox-subscription-header {\n border-top: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n border-bottom: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n padding: calc(var(--design-unit) * 2px);\n }\n\n .inbox-subscription-empty {\n padding: 0 calc(var(--design-unit) * 2px);\n margin: calc(var(--design-unit) * 2px) 0 0;\n }\n\n .inbox-subscription-content {\n display: flex;\n flex-direction: column;\n gap: calc(var(--design-unit) * 3px);\n border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n margin: calc(var(--design-unit) * 2px);\n padding: calc(var(--design-unit) * 2px);\n border-radius: calc(var(--control-corner-radius) * 1px);\n }\n\n .inbox-subscription:not(.inline) .inbox-subscription-content {\n overflow: auto;\n max-height: calc(var(--design-unit) * 80px);\n }\n\n .inbox-subscription.inline .inbox-subscription-content {\n margin: calc(var(--design-unit) * 2px) 0 0;\n overflow: visible;\n max-height: none;\n padding-bottom: calc(var(--design-unit) * 4px);\n }\n\n .inbox-subscription.inline .control:focus-within {\n position: relative;\n z-index: 2;\n }\n\n .inbox-subscription-footer {\n display: flex;\n gap: calc(var(--design-unit) * 2px);\n padding: calc(var(--design-unit) * 2px) 0 0;\n border-top: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-divider-rest);\n margin-top: calc(var(--design-unit) * 2px);\n }\n\n .inbox-subscription:not(.inline) .inbox-subscription-footer {\n padding: calc(var(--design-unit) * 2px);\n margin-top: 0;\n }\n\n .inbox-subscription-footer.auto-submit {\n justify-content: flex-end;\n border-top: none;\n margin-top: 0;\n padding-top: 0;\n }\n\n rapid-button.subscribe,\n rapid-button.cancel {\n display: flex;\n margin: 0;\n flex: 1;\n }\n`"
3787
4148
  }
3788
4149
  ],
3789
4150
  "exports": [
@@ -3804,7 +4165,7 @@
3804
4165
  {
3805
4166
  "kind": "variable",
3806
4167
  "name": "InboxSubscriptionTemplate",
3807
- "default": "html<InboxSubscription>`\n <div class=\"inbox-subscription\">\n <div class=\"inbox-subscription-header\">\n Subscribe to\n <span style=\"font-weight: bold;\">${(x) => x.template.RULE_NAME}</span>\n </div>\n\n ${when(\n (x) => Object.values(x.template.PARAMETERS).length === 0,\n html`\n <p style=\"padding-left: 10px;\">The selected template doesn't have parameters.</p>\n `,\n )}\n ${when(\n (x) => Object.values(x.template.PARAMETERS).length > 0,\n html`\n <div class=\"inbox-subscription-content\">\n ${repeat(\n // @ts-ignore\n (x) => Object.values(x.template.PARAMETERS),\n html<RuleParameterEntity>`\n <rule-parameter\n :parameter=${(x) => x}\n :isFirstElement=${(x, c) => c.parent.isFirstElement(x)}\n :operator=${(x, c) => c.parent.parametersOperators[x.PARAM_NAME]}\n @parameterEdited=${(x, c) => c.parent.parameterEdit(eventDetail(c))}\n ></rule-parameter>\n `,\n )}\n </div>\n `,\n )}\n\n <div class=\"inbox-subscription-footer\">\n <rapid-button\n class=\"subscribe\"\n appearance=\"primary\"\n @click=${(x) => x.subscribeTemplate()}\n ?disabled=${(x) => x.subscribeDisabled}\n >\n Subscribe\n </rapid-button>\n </div>\n </div>\n`"
4168
+ "default": "html<InboxSubscription>`\n <div class=\"inbox-subscription ${(x) => (x.inline ? 'inline' : '')}\">\n ${when(\n (x) => !x.inline,\n html`\n <div class=\"inbox-subscription-header\">\n Subscribe to\n <span style=\"font-weight: bold;\">${(x) => x.template.RULE_NAME}</span>\n </div>\n `,\n )}\n ${when(\n (x) => Object.values(x.template?.PARAMETERS ?? {}).length === 0,\n html`\n <p class=\"inbox-subscription-empty\">The selected template doesn't have parameters.</p>\n `,\n )}\n ${when(\n (x) => Object.values(x.template?.PARAMETERS ?? {}).length > 0,\n html`\n <div class=\"inbox-subscription-content\">\n ${repeat(\n // @ts-ignore\n (x) => Object.values(x.template?.PARAMETERS ?? {}),\n html<RuleParameterEntity>`\n <rule-parameter\n :parameter=${(x) => x}\n :isFirstElement=${(x, c) => c.parent.isFirstElement(x)}\n :operator=${(x, c) => c.parent.parametersOperators[x.PARAM_NAME]}\n :requireSelection=${(x, c) => c.parent.usesAutoSubmit()}\n @parameterEdited=${(x, c) => c.parent.parameterEdit(eventDetail(c))}\n ></rule-parameter>\n `,\n )}\n </div>\n `,\n )}\n ${when(\n (x) => !x.inline || x.requiresManualSubscribe(),\n html`\n <div class=\"inbox-subscription-footer\">\n ${when(\n (x) => x.inline,\n html`\n <rapid-button\n class=\"cancel\"\n appearance=\"neutral\"\n @click=${(x) => x.cancelSubscribe()}\n >\n Cancel\n </rapid-button>\n `,\n )}\n <rapid-button\n class=\"subscribe\"\n appearance=\"primary\"\n @click=${(x) => x.subscribeTemplate()}\n ?disabled=${(x) => x.subscribeDisabled}\n >\n Subscribe\n </rapid-button>\n </div>\n `,\n )}\n ${when(\n (x) => x.inline && x.usesAutoSubmit(),\n html`\n <div class=\"inbox-subscription-footer auto-submit\">\n <rapid-button class=\"cancel\" appearance=\"neutral\" @click=${(x) => x.cancelSubscribe()}>\n Cancel\n </rapid-button>\n </div>\n `,\n )}\n </div>\n`"
3808
4169
  }
3809
4170
  ],
3810
4171
  "exports": [
@@ -3831,6 +4192,14 @@
3831
4192
  "kind": "field",
3832
4193
  "name": "template"
3833
4194
  },
4195
+ {
4196
+ "kind": "field",
4197
+ "name": "inline",
4198
+ "type": {
4199
+ "text": "boolean"
4200
+ },
4201
+ "default": "false"
4202
+ },
3834
4203
  {
3835
4204
  "kind": "field",
3836
4205
  "name": "parametersDetails",
@@ -3840,6 +4209,15 @@
3840
4209
  "privacy": "private",
3841
4210
  "default": "{}"
3842
4211
  },
4212
+ {
4213
+ "kind": "field",
4214
+ "name": "isSubmitting",
4215
+ "type": {
4216
+ "text": "boolean"
4217
+ },
4218
+ "privacy": "private",
4219
+ "default": "false"
4220
+ },
3843
4221
  {
3844
4222
  "kind": "field",
3845
4223
  "name": "parametersOperators",
@@ -3867,6 +4245,24 @@
3867
4245
  "kind": "method",
3868
4246
  "name": "templateChanged"
3869
4247
  },
4248
+ {
4249
+ "kind": "method",
4250
+ "name": "usesAutoSubmit",
4251
+ "return": {
4252
+ "type": {
4253
+ "text": "boolean"
4254
+ }
4255
+ }
4256
+ },
4257
+ {
4258
+ "kind": "method",
4259
+ "name": "requiresManualSubscribe",
4260
+ "return": {
4261
+ "type": {
4262
+ "text": "boolean"
4263
+ }
4264
+ }
4265
+ },
3870
4266
  {
3871
4267
  "kind": "method",
3872
4268
  "name": "parameterEdit",
@@ -3879,6 +4275,11 @@
3879
4275
  }
3880
4276
  ]
3881
4277
  },
4278
+ {
4279
+ "kind": "method",
4280
+ "name": "autoSubscribe",
4281
+ "privacy": "private"
4282
+ },
3882
4283
  {
3883
4284
  "kind": "method",
3884
4285
  "name": "verifySubscribe"
@@ -3891,6 +4292,10 @@
3891
4292
  "kind": "method",
3892
4293
  "name": "subscribeTemplate"
3893
4294
  },
4295
+ {
4296
+ "kind": "method",
4297
+ "name": "cancelSubscribe"
4298
+ },
3894
4299
  {
3895
4300
  "kind": "field",
3896
4301
  "name": "createParametersOperatorMap"
@@ -3900,15 +4305,26 @@
3900
4305
  {
3901
4306
  "description": "Fired when a template subscription is created",
3902
4307
  "name": "templateSubscribed"
4308
+ },
4309
+ {
4310
+ "description": "Fired when inline parameter entry is cancelled",
4311
+ "name": "subscribeCancelled"
3903
4312
  }
3904
4313
  ],
3905
4314
  "attributes": [
3906
4315
  {
3907
4316
  "name": "template",
3908
4317
  "fieldName": "template"
3909
- }
3910
- ],
3911
- "superclass": {
4318
+ },
4319
+ {
4320
+ "type": {
4321
+ "text": "boolean"
4322
+ },
4323
+ "default": "false",
4324
+ "fieldName": "inline"
4325
+ }
4326
+ ],
4327
+ "superclass": {
3912
4328
  "name": "GenesisElement",
3913
4329
  "package": "@genesislcap/web-core"
3914
4330
  },
@@ -4214,7 +4630,7 @@
4214
4630
  {
4215
4631
  "kind": "variable",
4216
4632
  "name": "RuleParameterStyles",
4217
- "default": "css`\n .control {\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n\n label {\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n .input-field {\n display: flex;\n }\n\n .input-field::part(root) {\n width: 100%;\n }\n\n rapid-select::part(listbox) {\n max-height: 160px;\n }\n`"
4633
+ "default": "css`\n .control {\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n\n label {\n margin-bottom: calc(var(--design-unit) * 2px);\n }\n\n .input-field {\n display: flex;\n width: 100%;\n min-width: 0;\n }\n\n .input-field::part(root) {\n width: 100%;\n }\n\n rapid-select.input-field {\n width: 100%;\n min-width: 0;\n }\n\n rapid-select.input-field::part(control) {\n width: 100%;\n }\n\n rapid-select.input-field::part(listbox) {\n z-index: 1000;\n max-height: min(240px, 50vh);\n overflow-y: auto;\n box-shadow: 0 4px 16px rgb(0 0 0 / 24%);\n }\n`"
4218
4634
  }
4219
4635
  ],
4220
4636
  "exports": [
@@ -4235,7 +4651,7 @@
4235
4651
  {
4236
4652
  "kind": "variable",
4237
4653
  "name": "RuleParameterTemplate",
4238
- "default": "html<RuleParameter>`\n <div class=\"control\">\n <label>\n <span style=\"font-weight: bold;\">${(x) => x.parameter.PARAM_LABEL}</span>\n ${(x, c) => humanize(x.operator).toLowerCase()}\n </label>\n\n <!-- USER_TEXT -->\n ${when(\n (x) => x.parameter.PARAM_SOURCE_TYPE === PARAM_SOURCE_TYPE_USER_TEXT,\n html`\n ${when(\n (x) => x.parameter.PARAM_TYPE === PARAM_TYPE_STRING,\n html`\n <rapid-text-field\n autofocus=${(x) => x.isFirstElement}\n class=\"input-field\"\n :value=${sync((x) => x.inputValue)}\n @input=${(x, c) => x.parameterEdit((c.event.target as HTMLInputElement).value)}\n ></rapid-text-field>\n `,\n )}\n ${when(\n (x) => x.parameter.PARAM_TYPE === PARAM_TYPE_NUMBER,\n html`\n <rapid-number-field\n hide-step\n autofocus=${(x) => x.isFirstElement}\n class=\"input-field\"\n :value=${sync((x) => x.inputValue)}\n @input=${(x, c) => x.parameterEdit((c.event.target as HTMLInputElement).value)}\n ></rapid-number-field>\n `,\n )}\n\n <!-- TODO: Implement\n ${when(\n (x) => x.parameter.PARAM_TYPE === PARAM_TYPE_BOOLEAN,\n html`\n <rapid-select\n autofocus=${(x) => x.isFirstElement}\n class=\"input-field\"\n :value=${sync((x) => x.inputValue)}\n >\n <rapid-option value=\"true\">true</rapid-option>\n <rapid-option value=\"false\">false</rapid-option>\n </rapid-select>\n `,\n )}\n -->\n `,\n )}\n\n <!-- DEFINED_GROUP -->\n ${when(\n (x) => x.parameter.PARAM_SOURCE_TYPE === PARAM_SOURCE_TYPE_DEFINED_GROUP,\n html`\n <rapid-select\n autofocus=${(x) => x.isFirstElement}\n class=\"input-field\"\n :value=${sync((x) => x.inputValue)}\n >\n ${repeat(\n (x) => x.parameter.PARAM_SOURCE.split(','),\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n `,\n )}\n\n <!-- TODO: REQ_REP -->\n ${when(\n (x) => x.parameter.PARAM_SOURCE_TYPE === PARAM_SOURCE_TYPE_REQ_REP,\n html`\n <rapid-select :value=${sync((x) => x.inputValue)}></rapid-select>\n `,\n )}\n </div>\n`"
4654
+ "default": "html<RuleParameter>`\n <div class=\"control\">\n <label>\n <span style=\"font-weight: bold;\">${(x) => x.parameter.PARAM_LABEL}</span>\n ${(x, c) => humanize(x.operator).toLowerCase()}\n </label>\n\n <!-- USER_TEXT -->\n ${when(\n (x) => x.parameter.PARAM_SOURCE_TYPE === PARAM_SOURCE_TYPE_USER_TEXT,\n html`\n ${when(\n (x) => x.parameter.PARAM_TYPE === PARAM_TYPE_STRING,\n html`\n <rapid-text-field\n autofocus=${(x) => x.isFirstElement}\n class=\"input-field\"\n :value=${sync((x) => x.inputValue)}\n @input=${(x, c) => x.parameterEdit((c.event.target as HTMLInputElement).value)}\n ></rapid-text-field>\n `,\n )}\n ${when(\n (x) => x.parameter.PARAM_TYPE === PARAM_TYPE_NUMBER,\n html`\n <rapid-number-field\n hide-step\n autofocus=${(x) => x.isFirstElement}\n class=\"input-field\"\n :value=${sync((x) => x.inputValue)}\n @input=${(x, c) => x.parameterEdit((c.event.target as HTMLInputElement).value)}\n ></rapid-number-field>\n `,\n )}\n ${when(\n (x) => x.parameter.PARAM_TYPE === PARAM_TYPE_BOOLEAN,\n html`\n <rapid-switch\n class=\"input-field\"\n ?checked=${(x) => x.inputValue === 'true'}\n @change=${(x, c) =>\n x.parameterEdit(String((c.event.target as HTMLInputElement).checked))}\n ></rapid-switch>\n `,\n )}\n `,\n )}\n\n <!-- DEFINED_GROUP -->\n ${when(\n (x) => x.parameter.PARAM_SOURCE_TYPE === PARAM_SOURCE_TYPE_DEFINED_GROUP,\n html`\n <rapid-select\n autofocus=${(x) => x.isFirstElement}\n class=\"input-field\"\n :value=${sync((x) => x.inputValue)}\n @change=${(x, c) => x.parameterEdit((c.event.currentTarget as HTMLSelectElement).value)}\n >\n ${repeat(\n (x) =>\n (x.parameter.PARAM_SOURCE ?? '')\n .split(',')\n .map((value) => value.trim())\n .filter((value) => value.length),\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n `,\n )}\n\n <!-- TODO: REQ_REP -->\n ${when(\n (x) => x.parameter.PARAM_SOURCE_TYPE === PARAM_SOURCE_TYPE_REQ_REP,\n html`\n <rapid-select :value=${sync((x) => x.inputValue)}></rapid-select>\n `,\n )}\n </div>\n`"
4239
4655
  }
4240
4656
  ],
4241
4657
  "exports": [
@@ -4265,6 +4681,14 @@
4265
4681
  "text": "RuleParameterEntity"
4266
4682
  }
4267
4683
  },
4684
+ {
4685
+ "kind": "field",
4686
+ "name": "requireSelection",
4687
+ "type": {
4688
+ "text": "boolean"
4689
+ },
4690
+ "default": "false"
4691
+ },
4268
4692
  {
4269
4693
  "kind": "field",
4270
4694
  "name": "isFirstElement",
@@ -4289,6 +4713,33 @@
4289
4713
  },
4290
4714
  "default": "''"
4291
4715
  },
4716
+ {
4717
+ "kind": "method",
4718
+ "name": "parameterChanged"
4719
+ },
4720
+ {
4721
+ "kind": "method",
4722
+ "name": "requireSelectionChanged"
4723
+ },
4724
+ {
4725
+ "kind": "method",
4726
+ "name": "inputValueChanged"
4727
+ },
4728
+ {
4729
+ "kind": "method",
4730
+ "name": "initParameter",
4731
+ "privacy": "private"
4732
+ },
4733
+ {
4734
+ "kind": "method",
4735
+ "name": "checkAndClearForcedSelection",
4736
+ "privacy": "private"
4737
+ },
4738
+ {
4739
+ "kind": "method",
4740
+ "name": "clearForcedSelection",
4741
+ "privacy": "private"
4742
+ },
4292
4743
  {
4293
4744
  "kind": "method",
4294
4745
  "name": "parameterEdit",
@@ -4316,6 +4767,13 @@
4316
4767
  },
4317
4768
  "fieldName": "parameter"
4318
4769
  },
4770
+ {
4771
+ "type": {
4772
+ "text": "boolean"
4773
+ },
4774
+ "default": "false",
4775
+ "fieldName": "requireSelection"
4776
+ },
4319
4777
  {
4320
4778
  "name": "isFirstElement",
4321
4779
  "type": {
@@ -4542,7 +5000,7 @@
4542
5000
  {
4543
5001
  "kind": "variable",
4544
5002
  "name": "RuleDialogTemplate",
4545
- "default": "html<RuleDialog>`\n <rapid-modal ${ref('dialog')} class=\"dialog\" :onCloseCallback=${(x) => () => x.close()}>\n <div slot=\"top\" class=\"dialog-top\">${(x) => x.ruleDialogTitle}</div>\n\n <div class=\"dialog-content\">\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field\n :value=${sync((x) => x.name)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autofocus\n autocomplete=\"off\"\n required\n >\n Name\n </rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field\n :value=${sync((x) => x.description)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n required\n >\n Description\n </rapid-text-field>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <label>Resource</label>\n <rapid-select\n :value=${sync((x) => x.resource)}\n title=${(x) => x.resource}\n position=\"below\"\n >\n ${repeat(\n (x) => x.resources,\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Topic</label>\n <rapid-combobox\n autocomplete=\"both\"\n :value=${sync((x) => x.topic)}\n title=${(x) => x.topic}\n >\n ${repeat(\n (x) => x.topics,\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-combobox>\n </div>\n\n <div class=\"control\">\n <label>Severity</label>\n <rapid-select :value=${sync((x) => x.severity)}>\n <options-datasource\n value-field=\"value\"\n label-field=\"value\"\n option-element=\"rapid-option\"\n :data=${(_) => Object.values(Severity).map((value) => ({ value }))}\n ></options-datasource>\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Update Type</label>\n <rapid-multiselect\n :selectedOptions=${(x) => x.updateType}\n @selectionChange=${(x, c) => {\n x.updateType = (c.event as CustomEvent).detail;\n }}\n search=\"false\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${() => Object.values(UpdateType).map((value) => ({ value, label: value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field\n required\n :value=${sync((x) => x.header)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n >\n Header\n </rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field\n required\n :value=${sync((x) => x.message)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n >\n Message\n </rapid-text-field>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Condition(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.conditions,\n html<ConditionBuilderEntity>`\n <rule-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :condition=${(x) => x}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></rule-condition-builder>\n `,\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button @click=${(x) => x.newCondition()}>+ Condition</rapid-button>\n </div>\n </div>\n </div>\n </div>\n\n <div slot=\"bottom\" class=\"dialog-bottom\">\n <rapid-button\n appearance=\"primary\"\n @click=${(x) => x.submit()}\n ?disabled=${(x) => x.submitDisabled}\n >\n Submit\n </rapid-button>\n </div>\n </rapid-modal>\n`"
5003
+ "default": "html<RuleDialog>`\n <rapid-modal ${ref('dialog')} class=\"dialog\" :onCloseCallback=${(x) => () => x.close()}>\n <div slot=\"top\" class=\"dialog-top\">${(x) => x.ruleDialogTitle}</div>\n\n <div class=\"dialog-content\">\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field\n :value=${sync((x) => x.name)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autofocus\n autocomplete=\"off\"\n required\n >\n Name\n </rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field\n :value=${sync((x) => x.description)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n required\n >\n Description\n </rapid-text-field>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <label>Resource</label>\n <rapid-select\n :value=${sync((x) => x.resource)}\n title=${(x) => x.resource}\n position=\"below\"\n >\n ${repeat(\n (x) => x.resources,\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Topic</label>\n <rapid-combobox\n autocomplete=\"both\"\n :value=${sync((x) => x.topic)}\n title=${(x) => x.topic}\n >\n ${repeat(\n (x) => x.topics,\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-combobox>\n </div>\n\n <div class=\"control\">\n <label>Severity</label>\n <rapid-select :value=${sync((x) => x.severity)}>\n <options-datasource\n value-field=\"value\"\n label-field=\"value\"\n option-element=\"rapid-option\"\n :data=${(_) => Object.values(Severity).map((value) => ({ value }))}\n ></options-datasource>\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Update Type</label>\n <rapid-multiselect\n :selectedOptions=${(x) => x.updateType}\n @selectionChange=${(x, c) => {\n x.updateType = (c.event as CustomEvent).detail;\n }}\n search=\"false\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${() => Object.values(UpdateType).map((value) => ({ value, label: value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field\n required\n :value=${sync((x) => x.header)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n >\n Header\n </rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field\n required\n :value=${sync((x) => x.message)}\n @change=\"${(x) => x.validateRequiredFields()}\"\n autocomplete=\"off\"\n >\n Message\n </rapid-text-field>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Condition(s)</label>\n <rapid-rule-expression-builder\n :ruleConfig=${(x) => x.ruleExpressionConfig}\n @change=${(x, c) => x.handleRuleExpressionChange((c.event as CustomEvent).detail)}\n ></rapid-rule-expression-builder>\n <rapid-text-area\n class=\"expression-preview\"\n readonly\n :value=${(x) => x.rawExpressionPreview}\n >\n Compiled expression\n </rapid-text-area>\n </div>\n </div>\n\n <div slot=\"bottom\" class=\"dialog-bottom\">\n <rapid-button\n appearance=\"primary\"\n @click=${(x) => x.submit()}\n ?disabled=${(x) => x.submitDisabled}\n >\n Submit\n </rapid-button>\n </div>\n </rapid-modal>\n`"
4546
5004
  }
4547
5005
  ],
4548
5006
  "exports": [
@@ -4673,14 +5131,6 @@
4673
5131
  },
4674
5132
  "default": "''"
4675
5133
  },
4676
- {
4677
- "kind": "field",
4678
- "name": "conditions",
4679
- "type": {
4680
- "text": "Array<ConditionBuilderEntity>"
4681
- },
4682
- "default": "[]"
4683
- },
4684
5134
  {
4685
5135
  "kind": "field",
4686
5136
  "name": "submitDisabled",
@@ -4712,6 +5162,31 @@
4712
5162
  },
4713
5163
  "default": "[]"
4714
5164
  },
5165
+ {
5166
+ "kind": "field",
5167
+ "name": "ruleExpressionConfig",
5168
+ "type": {
5169
+ "text": "ExpressionBuilderTypes.RuleConfig"
5170
+ },
5171
+ "default": "{\n fields: [],\n partialRuleValidationWarning: true,\n }"
5172
+ },
5173
+ {
5174
+ "kind": "field",
5175
+ "name": "currentRuleExpression",
5176
+ "type": {
5177
+ "text": "RuleExpression.Expression['PredicateExpression'] | null"
5178
+ },
5179
+ "privacy": "private",
5180
+ "default": "null"
5181
+ },
5182
+ {
5183
+ "kind": "field",
5184
+ "name": "rawExpressionPreview",
5185
+ "type": {
5186
+ "text": "string"
5187
+ },
5188
+ "default": "''"
5189
+ },
4715
5190
  {
4716
5191
  "kind": "method",
4717
5192
  "name": "openDialog",
@@ -4744,6 +5219,23 @@
4744
5219
  }
4745
5220
  ]
4746
5221
  },
5222
+ {
5223
+ "kind": "method",
5224
+ "name": "refreshRuleExpressionConfig",
5225
+ "privacy": "private"
5226
+ },
5227
+ {
5228
+ "kind": "method",
5229
+ "name": "handleRuleExpressionChange",
5230
+ "parameters": [
5231
+ {
5232
+ "name": "expression",
5233
+ "type": {
5234
+ "text": "RuleExpression.Expression['PredicateExpression']"
5235
+ }
5236
+ }
5237
+ ]
5238
+ },
4747
5239
  {
4748
5240
  "kind": "method",
4749
5241
  "name": "attributeAssignments",
@@ -4789,34 +5281,6 @@
4789
5281
  "kind": "method",
4790
5282
  "name": "resourceChanged"
4791
5283
  },
4792
- {
4793
- "kind": "method",
4794
- "name": "newCondition"
4795
- },
4796
- {
4797
- "kind": "method",
4798
- "name": "editCondition",
4799
- "parameters": [
4800
- {
4801
- "name": "editedCondition",
4802
- "type": {
4803
- "text": "ConditionBuilderEntity"
4804
- }
4805
- }
4806
- ]
4807
- },
4808
- {
4809
- "kind": "method",
4810
- "name": "deleteCondition",
4811
- "parameters": [
4812
- {
4813
- "name": "deletedCondition",
4814
- "type": {
4815
- "text": "ConditionBuilderEntity"
4816
- }
4817
- }
4818
- ]
4819
- },
4820
5284
  {
4821
5285
  "kind": "method",
4822
5286
  "name": "validateRequiredFields",
@@ -4887,7 +5351,7 @@
4887
5351
  {
4888
5352
  "kind": "variable",
4889
5353
  "name": "TemplateDialogTemplate",
4890
- "default": "html<TemplateDialog>`\n <rapid-modal ${ref('dialog')} class=\"dialog\" :onCloseCallback=${(x) => () => x.close()}>\n <div slot=\"top\" class=\"dialog-top\">${(x) => x.templateDialogTitle}</div>\n\n <div class=\"dialog-content\">\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.name)} autofocus>Name</rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.description)}>Description</rapid-text-field>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <label>Resource</label>\n <rapid-select :value=${sync((x) => x.resource)} position=\"below\">\n ${repeat(\n (x) => x.resources,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Topic</label>\n <rapid-select :value=${sync((x) => x.topic)}>\n ${repeat(\n (x) => x.topics,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Severity</label>\n <rapid-select :value=${sync((x) => x.severity)}>\n <options-datasource\n value-field=\"value\"\n label-field=\"value\"\n option-element=\"rapid-option\"\n :data=${(_) => Object.values(Severity).map((value) => ({ value }))}\n ></options-datasource>\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Update Type</label>\n <rapid-multiselect\n :selectedOptions=${(x) => x.updateType}\n @selectionChange=${(x, c) => {\n x.updateType = (c.event as CustomEvent).detail;\n }}\n search=\"false\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${() => Object.values(UpdateType).map((value) => ({ value, label: value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.header)}>Header</rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.message)}>Message</rapid-text-field>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Parameter(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.parameters,\n html`\n <parameter-builder\n :parameter=${(x) => x}\n @edit=${(x, c) => c.parent.editParameter(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteParameter(eventDetail(c))}\n ></parameter-builder>\n `,\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button @click=${(x) => x.newParameter()}>+ Parameter</rapid-button>\n </div>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Condition(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.conditions,\n html<ConditionBuilderEntity>`\n <template-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :condition=${(x) => x}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></template-condition-builder>\n `,\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button @click=${(x) => x.newCondition()}>+ Condition</rapid-button>\n </div>\n </div>\n </div>\n </div>\n\n <div slot=\"bottom\" class=\"dialog-bottom\">\n <rapid-button appearance=\"primary\" @click=${(x) => x.submit()}>Submit</rapid-button>\n </div>\n </rapid-modal>\n`"
5354
+ "default": "html<TemplateDialog>`\n <rapid-modal ${ref('dialog')} class=\"dialog\" :onCloseCallback=${(x) => () => x.close()}>\n <div slot=\"top\" class=\"dialog-top\">${(x) => x.templateDialogTitle}</div>\n\n <div class=\"dialog-content\">\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.name)} autofocus>Name</rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.description)}>Description</rapid-text-field>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <label>Resource</label>\n <rapid-select :value=${sync((x) => x.resource)} position=\"below\">\n ${repeat(\n (x) => x.resources,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Topic</label>\n <rapid-select :value=${sync((x) => x.topic)}>\n ${repeat(\n (x) => x.topics,\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Severity</label>\n <rapid-select :value=${sync((x) => x.severity)}>\n <options-datasource\n value-field=\"value\"\n label-field=\"value\"\n option-element=\"rapid-option\"\n :data=${(_) => Object.values(Severity).map((value) => ({ value }))}\n ></options-datasource>\n </rapid-select>\n </div>\n\n <div class=\"control\">\n <label>Update Type</label>\n <rapid-multiselect\n :selectedOptions=${(x) => x.updateType}\n @selectionChange=${(x, c) => {\n x.updateType = (c.event as CustomEvent).detail;\n }}\n search=\"false\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${() => Object.values(UpdateType).map((value) => ({ value, label: value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n </div>\n </div>\n\n <div class=\"content-row\">\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.header)}>Header</rapid-text-field>\n </div>\n\n <div class=\"control\">\n <rapid-text-field :value=${sync((x) => x.message)}>Message</rapid-text-field>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Parameter(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.parameters,\n html`\n <parameter-builder\n :parameter=${(x) => x}\n @edit=${(x, c) => c.parent.editParameter(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteParameter(eventDetail(c))}\n ></parameter-builder>\n `,\n )}\n </div>\n\n <div class=\"content-row\">\n <rapid-button @click=${(x) => x.newParameter()}>+ Parameter</rapid-button>\n </div>\n </div>\n </div>\n\n <div class=\"control\">\n <label>Condition(s)</label>\n <div class=\"items\">\n <div class=\"content-row item\">\n ${repeat(\n (x) => x.conditions,\n html<ConditionNode, TemplateDialog>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <template-condition-group\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></template-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <template-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editCondition(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteCondition(eventDetail(c))}\n ></template-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n </div>\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()}>\n + Group\n </rapid-button>\n </div>\n </div>\n <rapid-text-area\n class=\"expression-preview\"\n readonly\n :value=${(x) => x.rawExpressionPreview}\n >\n Compiled expression\n </rapid-text-area>\n </div>\n </div>\n\n <div slot=\"bottom\" class=\"dialog-bottom\">\n <rapid-button appearance=\"primary\" @click=${(x) => x.submit()}>Submit</rapid-button>\n </div>\n </rapid-modal>\n`"
4891
5355
  }
4892
5356
  ],
4893
5357
  "exports": [
@@ -5031,10 +5495,18 @@
5031
5495
  "kind": "field",
5032
5496
  "name": "conditions",
5033
5497
  "type": {
5034
- "text": "Array<ConditionBuilderEntity>"
5498
+ "text": "Array<ConditionNode>"
5035
5499
  },
5036
5500
  "default": "[]"
5037
5501
  },
5502
+ {
5503
+ "kind": "field",
5504
+ "name": "rawExpressionPreview",
5505
+ "type": {
5506
+ "text": "string"
5507
+ },
5508
+ "default": "''"
5509
+ },
5038
5510
  {
5039
5511
  "kind": "field",
5040
5512
  "name": "resources",
@@ -5096,6 +5568,11 @@
5096
5568
  }
5097
5569
  ]
5098
5570
  },
5571
+ {
5572
+ "kind": "method",
5573
+ "name": "refreshExpressionPreview",
5574
+ "privacy": "private"
5575
+ },
5099
5576
  {
5100
5577
  "kind": "method",
5101
5578
  "name": "attributeAssignments",
@@ -5145,6 +5622,10 @@
5145
5622
  "kind": "method",
5146
5623
  "name": "newCondition"
5147
5624
  },
5625
+ {
5626
+ "kind": "method",
5627
+ "name": "newGroup"
5628
+ },
5148
5629
  {
5149
5630
  "kind": "method",
5150
5631
  "name": "editCondition",
@@ -5152,7 +5633,7 @@
5152
5633
  {
5153
5634
  "name": "editedCondition",
5154
5635
  "type": {
5155
- "text": "ConditionBuilderEntity"
5636
+ "text": "ConditionNode"
5156
5637
  }
5157
5638
  }
5158
5639
  ]
@@ -5164,7 +5645,7 @@
5164
5645
  {
5165
5646
  "name": "deletedCondition",
5166
5647
  "type": {
5167
- "text": "ConditionBuilderEntity"
5648
+ "text": "ConditionNode"
5168
5649
  }
5169
5650
  }
5170
5651
  ]
@@ -5271,7 +5752,7 @@
5271
5752
  {
5272
5753
  "kind": "variable",
5273
5754
  "name": "RuleConditionBuilderTemplate",
5274
- "default": "html<RuleConditionBuilder>`\n <div class=\"condition-builder\">\n <rapid-select\n :value=${sync((x) => x.leftValue)}\n :initialValue=${sync((x) => x.leftValue)}\n title=${(x) => (x.leftValue ? JSON.parse(x.leftValue).FIELD_NAME : '')}\n class=\"left-value\"\n >\n ${repeat(\n (x) => x.getAllFields(),\n html`\n <rapid-option value=${(x) => JSON.stringify(x)} title=${(x) => x.FIELD_NAME}>\n ${(x) => x.FIELD_NAME}\n </rapid-option>\n `,\n )}\n </rapid-select>\n\n <rapid-select\n class=\"logical-operator${(x) =>\n classNames([\n '-null-and-blank',\n nullAndBlankLogicalOperatorValues.includes(LogicalOperator[x.logicalOperator]),\n ])}\"\n :value=${sync((x) => x.logicalOperator)}\n title=${(x) => x.logicalOperator}\n >\n ${repeat(\n (x) => x.getLogicalOperators(),\n html`\n <rapid-option value=${(x) => x.operator} title=${(x) => x}>\n ${(x) => x.label}\n </rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => !nullAndBlankLogicalOperatorValues.includes(LogicalOperator[x.logicalOperator]),\n html`\n <rapid-select\n class=\"right-criteria\"\n :value=${sync((x) => x.rightCriteria)}\n title=${(x) => x.rightCriteria}\n >\n ${repeat(\n (x) => x.getRightCriteria(),\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => x.rightCriteria === RightCriteria.VALUE,\n html`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === FieldTypeEnum.BOOLEAN,\n html`\n <rapid-select class=\"right-criteria-select\" :value=${sync((x) => x.rightValueText)}>\n <rapid-option value=\"true\">true</rapid-option>\n <rapid-option value=\"false\">false</rapid-option>\n </rapid-select>\n `,\n html`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === FieldTypeEnum.DATE,\n html`\n <rapid-text-field\n class=\"right-criteria-text\"\n :value=${sync((x) => x.rightValueText)}\n type=\"date\"\n ></rapid-text-field>\n `,\n html`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === FieldTypeEnum.DATETIME,\n html`\n <rapid-text-field\n class=\"right-criteria-text\"\n :value=${sync((x) => x.rightValueText)}\n type=\"datetime-local\"\n ></rapid-text-field>\n `,\n html`\n <rapid-text-field\n class=\"right-criteria-text\"\n :value=${sync((x) => x.rightValueText)}\n placeholder=\"Value\"\n autocomplete=\"off\"\n ></rapid-text-field>\n `,\n )}\n `,\n )}\n `,\n )}\n `,\n )}\n ${when(\n (x) => x.rightCriteria === RightCriteria.FIELD,\n html`\n <rapid-select\n class=\"right-criteria-select\"\n :value=${sync((x) => x.rightValueSelect)}\n title=${(x) => x.rightValueSelect}\n >\n ${repeat(\n (x) => x.getApplicableFields(),\n html`\n <rapid-option value=${(x) => x.FIELD_NAME} title=${(x) => x.FIELD_NAME}>\n ${(x) => x.FIELD_NAME}\n </rapid-option>\n `,\n )}\n </rapid-select>\n `,\n )}\n `,\n )}\n\n <rapid-button appearance=\"icon\" class=\"delete\" @click=${(x) => x.deleteCondition()}>\n <rapid-icon\n style=\"opacity: 0.5\"\n variant=\"regular\"\n name=\"trash-alt\"\n size=\"lg\"\n part=\"icon\"\n ></rapid-icon>\n </rapid-button>\n </div>\n`"
5755
+ "default": "html<RuleConditionBuilder>`\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-builder\">\n <rapid-select\n :value=${sync((x) => x.leftValue)}\n :initialValue=${sync((x) => x.leftValue)}\n title=${(x) => (x.leftValue ? JSON.parse(x.leftValue).FIELD_NAME : '')}\n class=\"left-value\"\n >\n ${repeat(\n (x) => x.getAllFields(),\n html`\n <rapid-option value=${(x) => JSON.stringify(x)} title=${(x) => x.FIELD_NAME}>\n ${(x) => x.FIELD_NAME}\n </rapid-option>\n `,\n )}\n </rapid-select>\n\n <rapid-select\n class=\"logical-operator${(x) =>\n classNames([\n '-null-and-blank',\n nullAndBlankLogicalOperatorValues.includes(LogicalOperator[x.logicalOperator]),\n ])}\"\n :value=${sync((x) => x.logicalOperator)}\n title=${(x) => x.logicalOperator}\n >\n ${repeat(\n (x) => x.getLogicalOperators(),\n html`\n <rapid-option value=${(x) => x.operator} title=${(x) => x}>\n ${(x) => x.label}\n </rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => !nullAndBlankLogicalOperatorValues.includes(LogicalOperator[x.logicalOperator]),\n html`\n <rapid-select\n class=\"right-criteria\"\n :value=${sync((x) => x.rightCriteria)}\n title=${(x) => x.rightCriteria}\n >\n ${repeat(\n (x) => x.getRightCriteria(),\n html`\n <rapid-option value=${(x) => x} title=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => x.rightCriteria === RightCriteria.VALUE,\n html`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === FieldTypeEnum.BOOLEAN,\n html`\n <rapid-select class=\"right-criteria-select\" :value=${sync((x) => x.rightValueText)}>\n <rapid-option value=\"true\">true</rapid-option>\n <rapid-option value=\"false\">false</rapid-option>\n </rapid-select>\n `,\n html`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === 'ENUM',\n html`\n <rapid-multiselect\n class=\"right-criteria-select\"\n :selectedOptions=${(x) => x.rightValueMultiSelect}\n @selectionChange=${(x, c) => {\n x.rightValueMultiSelect = (c.event as CustomEvent).detail;\n }}\n search=\"true\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${(x) => x.getEnumValues().map((value) => ({ value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n `,\n html`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === FieldTypeEnum.DATE,\n html`\n <rapid-text-field\n class=\"right-criteria-text\"\n :value=${sync((x) => x.rightValueText)}\n type=\"date\"\n ></rapid-text-field>\n `,\n html`\n ${whenElse(\n (x) =>\n JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === FieldTypeEnum.DATETIME,\n html`\n <rapid-text-field\n class=\"right-criteria-text\"\n :value=${sync((x) => x.rightValueText)}\n type=\"datetime-local\"\n ></rapid-text-field>\n `,\n html`\n <rapid-text-field\n class=\"right-criteria-text\"\n :value=${sync((x) => x.rightValueText)}\n placeholder=\"Value (comma-separate for multiple)\"\n autocomplete=\"off\"\n ></rapid-text-field>\n `,\n )}\n `,\n )}\n `,\n )}\n `,\n )}\n `,\n )}\n ${when(\n (x) => x.rightCriteria === RightCriteria.FIELD,\n html`\n <rapid-select\n class=\"right-criteria-select\"\n :value=${sync((x) => x.rightValueSelect)}\n title=${(x) => x.rightValueSelect}\n >\n ${repeat(\n (x) => x.getApplicableFields(),\n html`\n <rapid-option value=${(x) => x.FIELD_NAME} title=${(x) => x.FIELD_NAME}>\n ${(x) => x.FIELD_NAME}\n </rapid-option>\n `,\n )}\n </rapid-select>\n `,\n )}\n `,\n )}\n\n <rapid-button appearance=\"icon\" class=\"delete\" @click=${(x) => x.deleteCondition()}>\n <rapid-icon\n style=\"opacity: 0.5\"\n variant=\"regular\"\n name=\"trash-alt\"\n size=\"lg\"\n part=\"icon\"\n ></rapid-icon>\n </rapid-button>\n </div>\n`"
5275
5756
  }
5276
5757
  ],
5277
5758
  "exports": [
@@ -5309,6 +5790,21 @@
5309
5790
  },
5310
5791
  "default": "[]"
5311
5792
  },
5793
+ {
5794
+ "kind": "field",
5795
+ "name": "isFirst",
5796
+ "type": {
5797
+ "text": "boolean"
5798
+ },
5799
+ "default": "false"
5800
+ },
5801
+ {
5802
+ "kind": "field",
5803
+ "name": "joinOperator",
5804
+ "type": {
5805
+ "text": "string"
5806
+ }
5807
+ },
5312
5808
  {
5313
5809
  "kind": "field",
5314
5810
  "name": "leftValue",
@@ -5356,6 +5852,14 @@
5356
5852
  },
5357
5853
  "default": "null"
5358
5854
  },
5855
+ {
5856
+ "kind": "field",
5857
+ "name": "rightValueMultiSelect",
5858
+ "type": {
5859
+ "text": "string[]"
5860
+ },
5861
+ "default": "[]"
5862
+ },
5359
5863
  {
5360
5864
  "kind": "method",
5361
5865
  "name": "deleteCondition"
@@ -5364,6 +5868,10 @@
5364
5868
  "kind": "method",
5365
5869
  "name": "conditionChanged"
5366
5870
  },
5871
+ {
5872
+ "kind": "method",
5873
+ "name": "joinOperatorChanged"
5874
+ },
5367
5875
  {
5368
5876
  "kind": "method",
5369
5877
  "name": "fieldsChanged"
@@ -5425,6 +5933,19 @@
5425
5933
  "kind": "method",
5426
5934
  "name": "rightValueSelectChanged"
5427
5935
  },
5936
+ {
5937
+ "kind": "method",
5938
+ "name": "rightValueMultiSelectChanged"
5939
+ },
5940
+ {
5941
+ "kind": "method",
5942
+ "name": "getEnumValues",
5943
+ "return": {
5944
+ "type": {
5945
+ "text": "string[]"
5946
+ }
5947
+ }
5948
+ },
5428
5949
  {
5429
5950
  "kind": "method",
5430
5951
  "name": "convertDateTime",
@@ -5508,6 +6029,156 @@
5508
6029
  "declarations": [],
5509
6030
  "exports": []
5510
6031
  },
6032
+ {
6033
+ "kind": "javascript-module",
6034
+ "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts",
6035
+ "declarations": [
6036
+ {
6037
+ "kind": "variable",
6038
+ "name": "RuleConditionGroupTemplate",
6039
+ "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`"
6040
+ }
6041
+ ],
6042
+ "exports": [
6043
+ {
6044
+ "kind": "js",
6045
+ "name": "RuleConditionGroupTemplate",
6046
+ "declaration": {
6047
+ "name": "RuleConditionGroupTemplate",
6048
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.template.ts"
6049
+ }
6050
+ }
6051
+ ]
6052
+ },
6053
+ {
6054
+ "kind": "javascript-module",
6055
+ "path": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts",
6056
+ "declarations": [
6057
+ {
6058
+ "kind": "class",
6059
+ "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.",
6060
+ "name": "RuleConditionGroup",
6061
+ "members": [
6062
+ {
6063
+ "kind": "field",
6064
+ "name": "node",
6065
+ "type": {
6066
+ "text": "ConditionGroupEntity"
6067
+ }
6068
+ },
6069
+ {
6070
+ "kind": "field",
6071
+ "name": "fields",
6072
+ "type": {
6073
+ "text": "Field[]"
6074
+ },
6075
+ "default": "[]"
6076
+ },
6077
+ {
6078
+ "kind": "field",
6079
+ "name": "isFirst",
6080
+ "type": {
6081
+ "text": "boolean"
6082
+ },
6083
+ "default": "false"
6084
+ },
6085
+ {
6086
+ "kind": "field",
6087
+ "name": "joinOperator",
6088
+ "type": {
6089
+ "text": "string"
6090
+ }
6091
+ },
6092
+ {
6093
+ "kind": "field",
6094
+ "name": "groupChildren",
6095
+ "type": {
6096
+ "text": "ConditionNode[]"
6097
+ },
6098
+ "default": "[]"
6099
+ },
6100
+ {
6101
+ "kind": "method",
6102
+ "name": "nodeChanged"
6103
+ },
6104
+ {
6105
+ "kind": "method",
6106
+ "name": "joinOperatorChanged"
6107
+ },
6108
+ {
6109
+ "kind": "method",
6110
+ "name": "newCondition"
6111
+ },
6112
+ {
6113
+ "kind": "method",
6114
+ "name": "newGroup"
6115
+ },
6116
+ {
6117
+ "kind": "method",
6118
+ "name": "editChild",
6119
+ "parameters": [
6120
+ {
6121
+ "name": "_editedChild",
6122
+ "type": {
6123
+ "text": "ConditionNode"
6124
+ }
6125
+ }
6126
+ ]
6127
+ },
6128
+ {
6129
+ "kind": "method",
6130
+ "name": "deleteChild",
6131
+ "parameters": [
6132
+ {
6133
+ "name": "deletedChild",
6134
+ "type": {
6135
+ "text": "ConditionNode"
6136
+ }
6137
+ }
6138
+ ]
6139
+ },
6140
+ {
6141
+ "kind": "method",
6142
+ "name": "deleteSelf"
6143
+ }
6144
+ ],
6145
+ "events": [
6146
+ {
6147
+ "description": "Fired when this whole group should be removed",
6148
+ "name": "delete"
6149
+ },
6150
+ {
6151
+ "description": "Fired when anything inside this group changes",
6152
+ "name": "edit"
6153
+ }
6154
+ ],
6155
+ "superclass": {
6156
+ "name": "GenesisElement",
6157
+ "package": "@genesislcap/web-core"
6158
+ },
6159
+ "tagName": "rule-condition-group",
6160
+ "customElement": true
6161
+ }
6162
+ ],
6163
+ "exports": [
6164
+ {
6165
+ "kind": "js",
6166
+ "name": "RuleConditionGroup",
6167
+ "declaration": {
6168
+ "name": "RuleConditionGroup",
6169
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
6170
+ }
6171
+ },
6172
+ {
6173
+ "kind": "custom-element-definition",
6174
+ "name": "rule-condition-group",
6175
+ "declaration": {
6176
+ "name": "RuleConditionGroup",
6177
+ "module": "src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-condition-group/rule-condition-group.ts"
6178
+ }
6179
+ }
6180
+ ]
6181
+ },
5511
6182
  {
5512
6183
  "kind": "javascript-module",
5513
6184
  "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/parameter-builder/parameter-builder.styles.ts",
@@ -5729,7 +6400,7 @@
5729
6400
  {
5730
6401
  "kind": "variable",
5731
6402
  "name": "TemplateConditionBuilderTemplate",
5732
- "default": "html<TemplateConditionBuilder>`\n <div class=\"condition-builder\">\n <rapid-select\n :value=${sync((x) => x.leftValue)}\n :initialValue=${sync((x) => x.leftValue)}\n class=\"left-value\"\n >\n ${repeat(\n (x) => x.leftValueItems,\n html<Field>`\n <rapid-option value=${(x) => JSON.stringify(x)}>${(x) => x.FIELD_NAME}</rapid-option>\n `,\n )}\n </rapid-select>\n\n <rapid-select\n class=\"logical-operator${(x) =>\n classNames([\n '-null-and-blank',\n nullAndBlankLogicalOperatorValues.includes(LogicalOperator[x.logicalOperator]),\n ])}\"\n :value=${sync((x) => x.logicalOperator)}\n >\n ${repeat(\n (_) => Object.values(LogicalOperator),\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => !nullAndBlankLogicalOperatorValues.includes(LogicalOperator[x.logicalOperator]),\n html`\n <rapid-select class=\"right-criteria\" :value=${sync((x) => x.rightCriteria)}>\n ${repeat(\n (_) => Object.values(RightCriteria),\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => x.rightCriteria === RightCriteria.VALUE,\n html<TemplateConditionBuilder>`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === FieldTypeEnum.BOOLEAN,\n html`\n <rapid-select class=\"right-criteria-select\" :value=${sync((x) => x.rightValueText)}>\n <rapid-option value=\"true\">true</rapid-option>\n <rapid-option value=\"false\">false</rapid-option>\n </rapid-select>\n `,\n html`\n <rapid-text-field\n class=\"right-criteria-text\"\n :value=${sync((x) => x.rightValueText)}\n placeholder=\"Value\"\n autocomplete=\"off\"\n ></rapid-text-field>\n `,\n )}\n `,\n )}\n ${when(\n (x) => x.rightCriteria === RightCriteria.USER_ENTRY,\n html<TemplateConditionBuilder>`\n <rapid-select class=\"right-criteria-select\" :value=${sync((x) => x.rightValueSelect)}>\n ${(x) => rightValueItemsOptions(x.rightValueItems)}\n </rapid-select>\n `,\n )}\n `,\n )}\n\n <rapid-button appearance=\"icon\" class=\"delete\" @click=${(x) => x.deleteCondition()}>\n <rapid-icon\n style=\"opacity: 0.5\"\n variant=\"regular\"\n name=\"trash-alt\"\n size=\"lg\"\n part=\"icon\"\n ></rapid-icon>\n </rapid-button>\n </div>\n`"
6403
+ "default": "html<TemplateConditionBuilder>`\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-builder\">\n <rapid-select\n :value=${sync((x) => x.leftValue)}\n :initialValue=${sync((x) => x.leftValue)}\n class=\"left-value\"\n >\n ${repeat(\n (x) => x.leftValueItems,\n html<Field>`\n <rapid-option value=${(x) => JSON.stringify(x)}>${(x) => x.FIELD_NAME}</rapid-option>\n `,\n )}\n </rapid-select>\n\n <rapid-select\n class=\"logical-operator${(x) =>\n classNames([\n '-null-and-blank',\n nullAndBlankLogicalOperatorValues.includes(LogicalOperator[x.logicalOperator]),\n ])}\"\n :value=${sync((x) => x.logicalOperator)}\n >\n ${repeat(\n (_) => Object.values(LogicalOperator),\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => !nullAndBlankLogicalOperatorValues.includes(LogicalOperator[x.logicalOperator]),\n html`\n <rapid-select class=\"right-criteria\" :value=${sync((x) => x.rightCriteria)}>\n ${repeat(\n (_) => Object.values(RightCriteria),\n html`\n <rapid-option value=${(x) => x}>${(x) => x}</rapid-option>\n `,\n )}\n </rapid-select>\n\n ${when(\n (x) => x.rightCriteria === RightCriteria.VALUE,\n html<TemplateConditionBuilder>`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === FieldTypeEnum.BOOLEAN,\n html`\n <rapid-select class=\"right-criteria-select\" :value=${sync((x) => x.rightValueText)}>\n <rapid-option value=\"true\">true</rapid-option>\n <rapid-option value=\"false\">false</rapid-option>\n </rapid-select>\n `,\n html`\n ${whenElse(\n (x) => JSON.parse(x.leftValue ?? '{}').FIELD_TYPE === 'ENUM',\n html`\n <rapid-multiselect\n class=\"right-criteria-select\"\n :selectedOptions=${(x) => x.rightValueMultiSelect}\n @selectionChange=${(x, c) => {\n x.rightValueMultiSelect = (c.event as CustomEvent).detail;\n }}\n search=\"true\"\n all=\"false\"\n >\n <multiselect-datasource\n value-field=\"value\"\n label-field=\"value\"\n :data=${(x) => x.getEnumValues().map((value) => ({ value }))}\n ></multiselect-datasource>\n </rapid-multiselect>\n `,\n html`\n <rapid-text-field\n class=\"right-criteria-text\"\n :value=${sync((x) => x.rightValueText)}\n placeholder=\"Value (comma-separate for multiple)\"\n autocomplete=\"off\"\n ></rapid-text-field>\n `,\n )}\n `,\n )}\n `,\n )}\n ${when(\n (x) => x.rightCriteria === RightCriteria.USER_ENTRY,\n html<TemplateConditionBuilder>`\n <rapid-select class=\"right-criteria-select\" :value=${sync((x) => x.rightValueSelect)}>\n ${(x) => rightValueItemsOptions(x.rightValueItems)}\n </rapid-select>\n `,\n )}\n `,\n )}\n\n <rapid-button appearance=\"icon\" class=\"delete\" @click=${(x) => x.deleteCondition()}>\n <rapid-icon\n style=\"opacity: 0.5\"\n variant=\"regular\"\n name=\"trash-alt\"\n size=\"lg\"\n part=\"icon\"\n ></rapid-icon>\n </rapid-button>\n </div>\n`"
5733
6404
  }
5734
6405
  ],
5735
6406
  "exports": [
@@ -5775,6 +6446,21 @@
5775
6446
  },
5776
6447
  "default": "[]"
5777
6448
  },
6449
+ {
6450
+ "kind": "field",
6451
+ "name": "isFirst",
6452
+ "type": {
6453
+ "text": "boolean"
6454
+ },
6455
+ "default": "false"
6456
+ },
6457
+ {
6458
+ "kind": "field",
6459
+ "name": "joinOperator",
6460
+ "type": {
6461
+ "text": "string"
6462
+ }
6463
+ },
5778
6464
  {
5779
6465
  "kind": "field",
5780
6466
  "name": "leftValue",
@@ -5830,6 +6516,14 @@
5830
6516
  },
5831
6517
  "default": "[]"
5832
6518
  },
6519
+ {
6520
+ "kind": "field",
6521
+ "name": "rightValueMultiSelect",
6522
+ "type": {
6523
+ "text": "string[]"
6524
+ },
6525
+ "default": "[]"
6526
+ },
5833
6527
  {
5834
6528
  "kind": "method",
5835
6529
  "name": "deleteCondition"
@@ -5838,10 +6532,39 @@
5838
6532
  "kind": "method",
5839
6533
  "name": "conditionChanged"
5840
6534
  },
6535
+ {
6536
+ "kind": "method",
6537
+ "name": "joinOperatorChanged"
6538
+ },
5841
6539
  {
5842
6540
  "kind": "method",
5843
6541
  "name": "parametersChanged"
5844
6542
  },
6543
+ {
6544
+ "kind": "method",
6545
+ "name": "getMatchingParameter",
6546
+ "privacy": "private",
6547
+ "return": {
6548
+ "type": {
6549
+ "text": "ParameterBuilderEntity | undefined"
6550
+ }
6551
+ }
6552
+ },
6553
+ {
6554
+ "kind": "method",
6555
+ "name": "syncParameterBinding",
6556
+ "privacy": "private",
6557
+ "return": {
6558
+ "type": {
6559
+ "text": "boolean"
6560
+ }
6561
+ }
6562
+ },
6563
+ {
6564
+ "kind": "method",
6565
+ "name": "resetToValueEditor",
6566
+ "privacy": "private"
6567
+ },
5845
6568
  {
5846
6569
  "kind": "method",
5847
6570
  "name": "fieldsChanged"
@@ -5885,6 +6608,19 @@
5885
6608
  {
5886
6609
  "kind": "method",
5887
6610
  "name": "rightValueSelectChanged"
6611
+ },
6612
+ {
6613
+ "kind": "method",
6614
+ "name": "rightValueMultiSelectChanged"
6615
+ },
6616
+ {
6617
+ "kind": "method",
6618
+ "name": "getEnumValues",
6619
+ "return": {
6620
+ "type": {
6621
+ "text": "string[]"
6622
+ }
6623
+ }
5888
6624
  }
5889
6625
  ],
5890
6626
  "events": [
@@ -5948,6 +6684,164 @@
5948
6684
  }
5949
6685
  }
5950
6686
  ]
6687
+ },
6688
+ {
6689
+ "kind": "javascript-module",
6690
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts",
6691
+ "declarations": [
6692
+ {
6693
+ "kind": "variable",
6694
+ "name": "TemplateConditionGroupTemplate",
6695
+ "default": "html<TemplateConditionGroup>`\n ${when(\n (x) => !x.isFirst,\n html`\n <div class=\"join-toggle-row\">\n <div class=\"join-toggle\">\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'AND'])}\"\n @click=${(x) => (x.joinOperator = 'AND')}\n >\n AND\n </span>\n <span\n class=\"join-text${(x) => classNames(['active', x.joinOperator === 'OR'])}\"\n @click=${(x) => (x.joinOperator = 'OR')}\n >\n OR\n </span>\n </div>\n </div>\n `,\n )}\n <div class=\"condition-group-row\">\n <div class=\"condition-group-box\">\n ${repeat(\n (x) => x.groupChildren,\n html<ConditionNode, TemplateConditionGroup>`\n ${when(\n (x) => isGroup(x),\n html<ConditionNode>`\n <template-condition-group\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :node=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></template-condition-group>\n `,\n )}\n ${when(\n (x) => !isGroup(x),\n html<ConditionNode>`\n <template-condition-builder\n :fields=${(x, c) => c.parent.fields}\n :parameters=${(x, c) => c.parent.parameters}\n :condition=${(x) => x}\n :isFirst=${(x, c) => c.index === 0}\n @edit=${(x, c) => c.parent.editChild(eventDetail(c))}\n @delete=${(x, c) => c.parent.deleteChild(eventDetail(c))}\n ></template-condition-builder>\n `,\n )}\n `,\n { positioning: true },\n )}\n\n <div class=\"content-row\">\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newCondition()}>\n + Condition\n </rapid-button>\n <rapid-button appearance=\"lightweight\" @click=${(x) => x.newGroup()}>+ Group</rapid-button>\n <rapid-button appearance=\"icon\" class=\"delete-group\" @click=${(x) => x.deleteSelf()}>\n <rapid-icon variant=\"regular\" name=\"trash-alt\" size=\"lg\" part=\"icon\"></rapid-icon>\n </rapid-button>\n </div>\n </div>\n </div>\n`"
6696
+ }
6697
+ ],
6698
+ "exports": [
6699
+ {
6700
+ "kind": "js",
6701
+ "name": "TemplateConditionGroupTemplate",
6702
+ "declaration": {
6703
+ "name": "TemplateConditionGroupTemplate",
6704
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.template.ts"
6705
+ }
6706
+ }
6707
+ ]
6708
+ },
6709
+ {
6710
+ "kind": "javascript-module",
6711
+ "path": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts",
6712
+ "declarations": [
6713
+ {
6714
+ "kind": "class",
6715
+ "description": "Parenthesized group of conditions/nested groups for notification template\ncriteria - see rule-condition-group for the rationale. Also forwards\n:parameters down to nested template-condition-builder rows so parameter\nbinding (USER_ENTRY) keeps working inside a group.",
6716
+ "name": "TemplateConditionGroup",
6717
+ "members": [
6718
+ {
6719
+ "kind": "field",
6720
+ "name": "node",
6721
+ "type": {
6722
+ "text": "ConditionGroupEntity"
6723
+ }
6724
+ },
6725
+ {
6726
+ "kind": "field",
6727
+ "name": "fields",
6728
+ "type": {
6729
+ "text": "Field[]"
6730
+ },
6731
+ "default": "[]"
6732
+ },
6733
+ {
6734
+ "kind": "field",
6735
+ "name": "parameters",
6736
+ "type": {
6737
+ "text": "Array<ParameterBuilderEntity>"
6738
+ },
6739
+ "default": "[]"
6740
+ },
6741
+ {
6742
+ "kind": "field",
6743
+ "name": "isFirst",
6744
+ "type": {
6745
+ "text": "boolean"
6746
+ },
6747
+ "default": "false"
6748
+ },
6749
+ {
6750
+ "kind": "field",
6751
+ "name": "joinOperator",
6752
+ "type": {
6753
+ "text": "string"
6754
+ }
6755
+ },
6756
+ {
6757
+ "kind": "field",
6758
+ "name": "groupChildren",
6759
+ "type": {
6760
+ "text": "ConditionNode[]"
6761
+ },
6762
+ "default": "[]"
6763
+ },
6764
+ {
6765
+ "kind": "method",
6766
+ "name": "nodeChanged"
6767
+ },
6768
+ {
6769
+ "kind": "method",
6770
+ "name": "joinOperatorChanged"
6771
+ },
6772
+ {
6773
+ "kind": "method",
6774
+ "name": "newCondition"
6775
+ },
6776
+ {
6777
+ "kind": "method",
6778
+ "name": "newGroup"
6779
+ },
6780
+ {
6781
+ "kind": "method",
6782
+ "name": "editChild",
6783
+ "parameters": [
6784
+ {
6785
+ "name": "_editedChild",
6786
+ "type": {
6787
+ "text": "ConditionNode"
6788
+ }
6789
+ }
6790
+ ]
6791
+ },
6792
+ {
6793
+ "kind": "method",
6794
+ "name": "deleteChild",
6795
+ "parameters": [
6796
+ {
6797
+ "name": "deletedChild",
6798
+ "type": {
6799
+ "text": "ConditionNode"
6800
+ }
6801
+ }
6802
+ ]
6803
+ },
6804
+ {
6805
+ "kind": "method",
6806
+ "name": "deleteSelf"
6807
+ }
6808
+ ],
6809
+ "events": [
6810
+ {
6811
+ "description": "Fired when this whole group should be removed",
6812
+ "name": "delete"
6813
+ },
6814
+ {
6815
+ "description": "Fired when anything inside this group changes",
6816
+ "name": "edit"
6817
+ }
6818
+ ],
6819
+ "superclass": {
6820
+ "name": "GenesisElement",
6821
+ "package": "@genesislcap/web-core"
6822
+ },
6823
+ "tagName": "template-condition-group",
6824
+ "customElement": true
6825
+ }
6826
+ ],
6827
+ "exports": [
6828
+ {
6829
+ "kind": "js",
6830
+ "name": "TemplateConditionGroup",
6831
+ "declaration": {
6832
+ "name": "TemplateConditionGroup",
6833
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
6834
+ }
6835
+ },
6836
+ {
6837
+ "kind": "custom-element-definition",
6838
+ "name": "template-condition-group",
6839
+ "declaration": {
6840
+ "name": "TemplateConditionGroup",
6841
+ "module": "src/components/foundation-notification-dashboard/components/templates/template-dialog/template-condition-group/template-condition-group.ts"
6842
+ }
6843
+ }
6844
+ ]
5951
6845
  }
5952
6846
  ]
5953
6847
  }