Skip to content

Commit

Permalink
[8.x] [Response Ops] [Rule Form] Add new flyout to rule form library,…
Browse files Browse the repository at this point in the history
… responsive design and illustration to rule form page (#206141) (#206816)

# Backport

This will backport the following commits from `main` to `8.x`:
- [[Response Ops] [Rule Form] Add new flyout to rule form library,
responsive design and illustration to rule form page
(#206141)](#206141)

<!--- Backport version: 9.4.3 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Zacqary Adam
Xeper","email":"[email protected]"},"sourceCommit":{"committedDate":"2025-01-15T15:37:39Z","message":"[Response
Ops] [Rule Form] Add new flyout to rule form library, responsive design
and illustration to rule form page (#206141)\n\n## Summary\r\n\r\nPart
of #195211\r\n\r\nAdds components for the new rule form flyout, and
duplicates some of its\r\ndesign elements as responsive design on the
Rule Page. This PR makes use\r\nof CSS `@container` queries, which EUI
doesn't yet support natively.\r\nI've opened
elastic/eui#8265 to get native EUI\r\nsupport
for this functionality, but for now we can apply it through\r\nclass
names and SCSS.\r\n\r\nThe reason we're using `@container` is so the
Rule Form can be\r\nresponsive regardless of whether it's bound by the
window size (in the\r\ncase of the Rule Page) or a container element on
a larger screen (in the\r\nRule Flyout). When responsive design just
relies on `@media screen`\r\nqueries, we can have a situation where
we're trying to render the rule\r\nform in a 500px wide flyout, but
because the window is 1920px wide, it\r\nstill tries to apply wide
screen styling. `@container` instead responds\r\nto the width of an
enclosing element, which can either be the body of\r\nthe Rule Page, or
the width of the Rule Flyout.\r\n\r\n### Non-User Facing Changes\r\n-
Adds the new rule flyout to `@kbn/response-ops-rule-form`. ***It
is\r\nnot yet actually user-facing anywhere in the application, this
will be\r\ndone in a second
PR.***\r\n<details>\r\n<summary><h4>Screenshots</h4></summary>\r\n<img
width=\"508\" alt=\"Screenshot 2025-01-08 at 4 29
55 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/7f03cd3a-5f37-4ac2-9992-ca4951664770\"\r\n/>\r\n<img
width=\"502\" alt=\"Screenshot 2025-01-08 at 4 29
59 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/c0620fc2-83db-4603-90b7-1282e5b0e6ab\"\r\n/>\r\n<img
width=\"507\" alt=\"Screenshot 2025-01-08 at 4 30
03 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/8440d551-46af-49e0-9c92-22d6b3ba1866\"\r\n/>\r\n<img
width=\"507\" alt=\"Screenshot 2025-01-08 at 4 30
32 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/cf7493a7-6e4a-4e55-8027-89e9b36012fc\"\r\n/>\r\n\r\n</details>\r\n\r\n\r\n###
User-Facing Changes\r\nThese changes were added to the existing full
page rule form to minimize\r\nthe amount of code differences between the
flyout and the full page\r\n\r\n- Adds some responsive styling to the
rule form page to make it look\r\nmore similar to the flyout when the
browser window is
narrow\r\n<details>\r\n<summary>Screenshot</summary>\r\n<img
width=\"783\" alt=\"Screenshot 2025-01-08 at 4 31
50 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/a3532b92-9f22-4e88-bcc3-e408fc53e64c\"\r\n/>\r\n\r\n</details>\r\n\r\n-
Adds the new illustrated \"Add an action\" empty prompt from the
flyout\r\ndesigns to the existing rule form
page\r\n<details>\r\n<summary>Screenshot</summary>\r\n<img
width=\"1299\" alt=\"Screenshot 2025-01-08 at 5 00
55 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/c4acd50d-9268-4874-b650-ecba532f3e9c\"\r\n/>\r\n\r\n</details>\r\n\r\n###
Testing\r\n\r\nTo test the new flyout,
edit\r\n`packages/response-ops/rule_form/src/create_rule_form.tsx`
and\r\n`packages/response-ops/rule_form/src/edit_rule_form.tsx` so that
they\r\nrender `<RuleFlyout>` instead of
`<RulePage>`.\r\n\r\n<details>\r\n<summary><strong>Use this diff
block</strong></summary>\r\n\r\n```diff\r\ndiff --git
a/packages/response-ops/rule_form/src/create_rule_form.tsx
b/packages/response-ops/rule_form/src/create_rule_form.tsx\r\nindex
2f5e0472dcd..564744b96ec 100644\r\n---
a/packages/response-ops/rule_form/src/create_rule_form.tsx\r\n+++
b/packages/response-ops/rule_form/src/create_rule_form.tsx\r\n@@ -31,6
+31,7 @@ import {\r\n parseRuleCircuitBreakerErrorMessage,\r\n } from
'./utils';\r\n import { RULE_CREATE_SUCCESS_TEXT, RULE_CREATE_ERROR_TEXT
} from './translations';\r\n+import { RuleFlyout } from
'./rule_flyout';\r\n \r\n export interface CreateRuleFormProps {\r\n
ruleTypeId: string;\r\n@@ -199,7 +200,7 @@ export const CreateRuleForm =
(props: CreateRuleFormProps) => {\r\n }),\r\n }}\r\n >\r\n- <RulePage
isEdit={false} isSaving={isSaving} onCancel={onCancel} onSave={onSave}
/>\r\n+ <RuleFlyout isEdit={false} isSaving={isSaving}
onCancel={onCancel} onSave={onSave} />\r\n </RuleFormStateProvider>\r\n
</div>\r\n );\r\ndiff --git
a/packages/response-ops/rule_form/src/edit_rule_form.tsx
b/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\nindex
392447114ed..41aecd7245a 100644\r\n---
a/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\n+++
b/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\n@@ -26,6
+26,7 @@ import {\r\n import { RULE_EDIT_ERROR_TEXT,
RULE_EDIT_SUCCESS_TEXT } from './translations';\r\n import {
getAvailableRuleTypes, parseRuleCircuitBreakerErrorMessage } from
'./utils';\r\n import { DEFAULT_VALID_CONSUMERS, getDefaultFormData }
from './constants';\r\n+import { RuleFlyout } from './rule_flyout';\r\n
\r\n export interface EditRuleFormProps {\r\n id: string;\r\n@@ -193,7
+194,7 @@ export const EditRuleForm = (props: EditRuleFormProps) =>
{\r\n showMustacheAutocompleteSwitch,\r\n }}\r\n >\r\n- <RulePage
isEdit={true} isSaving={isSaving} onSave={onSave} onCancel={onCancel}
/>\r\n+ <RuleFlyout isEdit={true} isSaving={isSaving} onSave={onSave}
onCancel={onCancel} />\r\n </RuleFormStateProvider>\r\n </div>\r\n
);\r\n```\r\n\r\n</details>\r\n\r\n### Still Todo\r\n\r\n1. Replace the
action connector modal with an in-flyout UI as called for\r\nin the
[design\r\nspec](https://www.figma.com/design/zetHXnUP0YnDG4YmvPwRb8/Adapt-new-Rule-form-to-work-in-flyout)\r\n2.
Add the Show Request UI\r\n3. Replace all instances of the v1 rule
flyout with this new one (it's\r\nused heavily in solutions, not in
Stack Management)\r\n\r\n### Checklist\r\n- [x] Any text added follows
[EUI's
writing\r\nguidelines](https://elastic.github.io/eui/#/guidelines/writing),
uses\r\nsentence case text and includes
[i18n\r\nsupport](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)\r\n-
[x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common
scenarios","sha":"471f9482070803fe4b884e7f95bc6502551f891e","branchLabelMapping":{"^v9.0.0$":"main","^v8.18.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:enhancement","Team:ResponseOps","v9.0.0","Feature:Alerting/RulesManagement","backport:version","v8.18.0"],"title":"[Response
Ops] [Rule Form] Add new flyout to rule form library, responsive design
and illustration to rule form page
","number":206141,"url":"https://github.com/elastic/kibana/pull/206141","mergeCommit":{"message":"[Response
Ops] [Rule Form] Add new flyout to rule form library, responsive design
and illustration to rule form page (#206141)\n\n## Summary\r\n\r\nPart
of #195211\r\n\r\nAdds components for the new rule form flyout, and
duplicates some of its\r\ndesign elements as responsive design on the
Rule Page. This PR makes use\r\nof CSS `@container` queries, which EUI
doesn't yet support natively.\r\nI've opened
elastic/eui#8265 to get native EUI\r\nsupport
for this functionality, but for now we can apply it through\r\nclass
names and SCSS.\r\n\r\nThe reason we're using `@container` is so the
Rule Form can be\r\nresponsive regardless of whether it's bound by the
window size (in the\r\ncase of the Rule Page) or a container element on
a larger screen (in the\r\nRule Flyout). When responsive design just
relies on `@media screen`\r\nqueries, we can have a situation where
we're trying to render the rule\r\nform in a 500px wide flyout, but
because the window is 1920px wide, it\r\nstill tries to apply wide
screen styling. `@container` instead responds\r\nto the width of an
enclosing element, which can either be the body of\r\nthe Rule Page, or
the width of the Rule Flyout.\r\n\r\n### Non-User Facing Changes\r\n-
Adds the new rule flyout to `@kbn/response-ops-rule-form`. ***It
is\r\nnot yet actually user-facing anywhere in the application, this
will be\r\ndone in a second
PR.***\r\n<details>\r\n<summary><h4>Screenshots</h4></summary>\r\n<img
width=\"508\" alt=\"Screenshot 2025-01-08 at 4 29
55 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/7f03cd3a-5f37-4ac2-9992-ca4951664770\"\r\n/>\r\n<img
width=\"502\" alt=\"Screenshot 2025-01-08 at 4 29
59 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/c0620fc2-83db-4603-90b7-1282e5b0e6ab\"\r\n/>\r\n<img
width=\"507\" alt=\"Screenshot 2025-01-08 at 4 30
03 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/8440d551-46af-49e0-9c92-22d6b3ba1866\"\r\n/>\r\n<img
width=\"507\" alt=\"Screenshot 2025-01-08 at 4 30
32 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/cf7493a7-6e4a-4e55-8027-89e9b36012fc\"\r\n/>\r\n\r\n</details>\r\n\r\n\r\n###
User-Facing Changes\r\nThese changes were added to the existing full
page rule form to minimize\r\nthe amount of code differences between the
flyout and the full page\r\n\r\n- Adds some responsive styling to the
rule form page to make it look\r\nmore similar to the flyout when the
browser window is
narrow\r\n<details>\r\n<summary>Screenshot</summary>\r\n<img
width=\"783\" alt=\"Screenshot 2025-01-08 at 4 31
50 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/a3532b92-9f22-4e88-bcc3-e408fc53e64c\"\r\n/>\r\n\r\n</details>\r\n\r\n-
Adds the new illustrated \"Add an action\" empty prompt from the
flyout\r\ndesigns to the existing rule form
page\r\n<details>\r\n<summary>Screenshot</summary>\r\n<img
width=\"1299\" alt=\"Screenshot 2025-01-08 at 5 00
55 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/c4acd50d-9268-4874-b650-ecba532f3e9c\"\r\n/>\r\n\r\n</details>\r\n\r\n###
Testing\r\n\r\nTo test the new flyout,
edit\r\n`packages/response-ops/rule_form/src/create_rule_form.tsx`
and\r\n`packages/response-ops/rule_form/src/edit_rule_form.tsx` so that
they\r\nrender `<RuleFlyout>` instead of
`<RulePage>`.\r\n\r\n<details>\r\n<summary><strong>Use this diff
block</strong></summary>\r\n\r\n```diff\r\ndiff --git
a/packages/response-ops/rule_form/src/create_rule_form.tsx
b/packages/response-ops/rule_form/src/create_rule_form.tsx\r\nindex
2f5e0472dcd..564744b96ec 100644\r\n---
a/packages/response-ops/rule_form/src/create_rule_form.tsx\r\n+++
b/packages/response-ops/rule_form/src/create_rule_form.tsx\r\n@@ -31,6
+31,7 @@ import {\r\n parseRuleCircuitBreakerErrorMessage,\r\n } from
'./utils';\r\n import { RULE_CREATE_SUCCESS_TEXT, RULE_CREATE_ERROR_TEXT
} from './translations';\r\n+import { RuleFlyout } from
'./rule_flyout';\r\n \r\n export interface CreateRuleFormProps {\r\n
ruleTypeId: string;\r\n@@ -199,7 +200,7 @@ export const CreateRuleForm =
(props: CreateRuleFormProps) => {\r\n }),\r\n }}\r\n >\r\n- <RulePage
isEdit={false} isSaving={isSaving} onCancel={onCancel} onSave={onSave}
/>\r\n+ <RuleFlyout isEdit={false} isSaving={isSaving}
onCancel={onCancel} onSave={onSave} />\r\n </RuleFormStateProvider>\r\n
</div>\r\n );\r\ndiff --git
a/packages/response-ops/rule_form/src/edit_rule_form.tsx
b/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\nindex
392447114ed..41aecd7245a 100644\r\n---
a/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\n+++
b/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\n@@ -26,6
+26,7 @@ import {\r\n import { RULE_EDIT_ERROR_TEXT,
RULE_EDIT_SUCCESS_TEXT } from './translations';\r\n import {
getAvailableRuleTypes, parseRuleCircuitBreakerErrorMessage } from
'./utils';\r\n import { DEFAULT_VALID_CONSUMERS, getDefaultFormData }
from './constants';\r\n+import { RuleFlyout } from './rule_flyout';\r\n
\r\n export interface EditRuleFormProps {\r\n id: string;\r\n@@ -193,7
+194,7 @@ export const EditRuleForm = (props: EditRuleFormProps) =>
{\r\n showMustacheAutocompleteSwitch,\r\n }}\r\n >\r\n- <RulePage
isEdit={true} isSaving={isSaving} onSave={onSave} onCancel={onCancel}
/>\r\n+ <RuleFlyout isEdit={true} isSaving={isSaving} onSave={onSave}
onCancel={onCancel} />\r\n </RuleFormStateProvider>\r\n </div>\r\n
);\r\n```\r\n\r\n</details>\r\n\r\n### Still Todo\r\n\r\n1. Replace the
action connector modal with an in-flyout UI as called for\r\nin the
[design\r\nspec](https://www.figma.com/design/zetHXnUP0YnDG4YmvPwRb8/Adapt-new-Rule-form-to-work-in-flyout)\r\n2.
Add the Show Request UI\r\n3. Replace all instances of the v1 rule
flyout with this new one (it's\r\nused heavily in solutions, not in
Stack Management)\r\n\r\n### Checklist\r\n- [x] Any text added follows
[EUI's
writing\r\nguidelines](https://elastic.github.io/eui/#/guidelines/writing),
uses\r\nsentence case text and includes
[i18n\r\nsupport](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)\r\n-
[x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common
scenarios","sha":"471f9482070803fe4b884e7f95bc6502551f891e"}},"sourceBranch":"main","suggestedTargetBranches":["8.x"],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","branchLabelMappingKey":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/206141","number":206141,"mergeCommit":{"message":"[Response
Ops] [Rule Form] Add new flyout to rule form library, responsive design
and illustration to rule form page (#206141)\n\n## Summary\r\n\r\nPart
of #195211\r\n\r\nAdds components for the new rule form flyout, and
duplicates some of its\r\ndesign elements as responsive design on the
Rule Page. This PR makes use\r\nof CSS `@container` queries, which EUI
doesn't yet support natively.\r\nI've opened
elastic/eui#8265 to get native EUI\r\nsupport
for this functionality, but for now we can apply it through\r\nclass
names and SCSS.\r\n\r\nThe reason we're using `@container` is so the
Rule Form can be\r\nresponsive regardless of whether it's bound by the
window size (in the\r\ncase of the Rule Page) or a container element on
a larger screen (in the\r\nRule Flyout). When responsive design just
relies on `@media screen`\r\nqueries, we can have a situation where
we're trying to render the rule\r\nform in a 500px wide flyout, but
because the window is 1920px wide, it\r\nstill tries to apply wide
screen styling. `@container` instead responds\r\nto the width of an
enclosing element, which can either be the body of\r\nthe Rule Page, or
the width of the Rule Flyout.\r\n\r\n### Non-User Facing Changes\r\n-
Adds the new rule flyout to `@kbn/response-ops-rule-form`. ***It
is\r\nnot yet actually user-facing anywhere in the application, this
will be\r\ndone in a second
PR.***\r\n<details>\r\n<summary><h4>Screenshots</h4></summary>\r\n<img
width=\"508\" alt=\"Screenshot 2025-01-08 at 4 29
55 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/7f03cd3a-5f37-4ac2-9992-ca4951664770\"\r\n/>\r\n<img
width=\"502\" alt=\"Screenshot 2025-01-08 at 4 29
59 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/c0620fc2-83db-4603-90b7-1282e5b0e6ab\"\r\n/>\r\n<img
width=\"507\" alt=\"Screenshot 2025-01-08 at 4 30
03 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/8440d551-46af-49e0-9c92-22d6b3ba1866\"\r\n/>\r\n<img
width=\"507\" alt=\"Screenshot 2025-01-08 at 4 30
32 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/cf7493a7-6e4a-4e55-8027-89e9b36012fc\"\r\n/>\r\n\r\n</details>\r\n\r\n\r\n###
User-Facing Changes\r\nThese changes were added to the existing full
page rule form to minimize\r\nthe amount of code differences between the
flyout and the full page\r\n\r\n- Adds some responsive styling to the
rule form page to make it look\r\nmore similar to the flyout when the
browser window is
narrow\r\n<details>\r\n<summary>Screenshot</summary>\r\n<img
width=\"783\" alt=\"Screenshot 2025-01-08 at 4 31
50 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/a3532b92-9f22-4e88-bcc3-e408fc53e64c\"\r\n/>\r\n\r\n</details>\r\n\r\n-
Adds the new illustrated \"Add an action\" empty prompt from the
flyout\r\ndesigns to the existing rule form
page\r\n<details>\r\n<summary>Screenshot</summary>\r\n<img
width=\"1299\" alt=\"Screenshot 2025-01-08 at 5 00
55 PM\"\r\nsrc=\"https://github.com/user-attachments/assets/c4acd50d-9268-4874-b650-ecba532f3e9c\"\r\n/>\r\n\r\n</details>\r\n\r\n###
Testing\r\n\r\nTo test the new flyout,
edit\r\n`packages/response-ops/rule_form/src/create_rule_form.tsx`
and\r\n`packages/response-ops/rule_form/src/edit_rule_form.tsx` so that
they\r\nrender `<RuleFlyout>` instead of
`<RulePage>`.\r\n\r\n<details>\r\n<summary><strong>Use this diff
block</strong></summary>\r\n\r\n```diff\r\ndiff --git
a/packages/response-ops/rule_form/src/create_rule_form.tsx
b/packages/response-ops/rule_form/src/create_rule_form.tsx\r\nindex
2f5e0472dcd..564744b96ec 100644\r\n---
a/packages/response-ops/rule_form/src/create_rule_form.tsx\r\n+++
b/packages/response-ops/rule_form/src/create_rule_form.tsx\r\n@@ -31,6
+31,7 @@ import {\r\n parseRuleCircuitBreakerErrorMessage,\r\n } from
'./utils';\r\n import { RULE_CREATE_SUCCESS_TEXT, RULE_CREATE_ERROR_TEXT
} from './translations';\r\n+import { RuleFlyout } from
'./rule_flyout';\r\n \r\n export interface CreateRuleFormProps {\r\n
ruleTypeId: string;\r\n@@ -199,7 +200,7 @@ export const CreateRuleForm =
(props: CreateRuleFormProps) => {\r\n }),\r\n }}\r\n >\r\n- <RulePage
isEdit={false} isSaving={isSaving} onCancel={onCancel} onSave={onSave}
/>\r\n+ <RuleFlyout isEdit={false} isSaving={isSaving}
onCancel={onCancel} onSave={onSave} />\r\n </RuleFormStateProvider>\r\n
</div>\r\n );\r\ndiff --git
a/packages/response-ops/rule_form/src/edit_rule_form.tsx
b/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\nindex
392447114ed..41aecd7245a 100644\r\n---
a/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\n+++
b/packages/response-ops/rule_form/src/edit_rule_form.tsx\r\n@@ -26,6
+26,7 @@ import {\r\n import { RULE_EDIT_ERROR_TEXT,
RULE_EDIT_SUCCESS_TEXT } from './translations';\r\n import {
getAvailableRuleTypes, parseRuleCircuitBreakerErrorMessage } from
'./utils';\r\n import { DEFAULT_VALID_CONSUMERS, getDefaultFormData }
from './constants';\r\n+import { RuleFlyout } from './rule_flyout';\r\n
\r\n export interface EditRuleFormProps {\r\n id: string;\r\n@@ -193,7
+194,7 @@ export const EditRuleForm = (props: EditRuleFormProps) =>
{\r\n showMustacheAutocompleteSwitch,\r\n }}\r\n >\r\n- <RulePage
isEdit={true} isSaving={isSaving} onSave={onSave} onCancel={onCancel}
/>\r\n+ <RuleFlyout isEdit={true} isSaving={isSaving} onSave={onSave}
onCancel={onCancel} />\r\n </RuleFormStateProvider>\r\n </div>\r\n
);\r\n```\r\n\r\n</details>\r\n\r\n### Still Todo\r\n\r\n1. Replace the
action connector modal with an in-flyout UI as called for\r\nin the
[design\r\nspec](https://www.figma.com/design/zetHXnUP0YnDG4YmvPwRb8/Adapt-new-Rule-form-to-work-in-flyout)\r\n2.
Add the Show Request UI\r\n3. Replace all instances of the v1 rule
flyout with this new one (it's\r\nused heavily in solutions, not in
Stack Management)\r\n\r\n### Checklist\r\n- [x] Any text added follows
[EUI's
writing\r\nguidelines](https://elastic.github.io/eui/#/guidelines/writing),
uses\r\nsentence case text and includes
[i18n\r\nsupport](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)\r\n-
[x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common
scenarios","sha":"471f9482070803fe4b884e7f95bc6502551f891e"}},{"branch":"8.x","label":"v8.18.0","branchLabelMappingKey":"^v8.18.0$","isSourceBranch":false,"state":"NOT_CREATED"}]}]
BACKPORT-->

Co-authored-by: Zacqary Adam Xeper <[email protected]>
  • Loading branch information
kibanamachine and Zacqary authored Jan 15, 2025
1 parent 45d0507 commit 6892364
Show file tree
Hide file tree
Showing 16 changed files with 1,818 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import {
RULE_FORM_PAGE_RULE_DEFINITION_TITLE,
RULE_FORM_PAGE_RULE_ACTIONS_TITLE,
RULE_FORM_PAGE_RULE_DETAILS_TITLE,
RULE_FORM_PAGE_RULE_DEFINITION_TITLE_SHORT,
RULE_FORM_PAGE_RULE_DETAILS_TITLE_SHORT,
} from '../translations';
import { RuleFormData } from '../types';
import { EuiSteps, EuiStepsHorizontal } from '@elastic/eui';
Expand Down Expand Up @@ -145,9 +147,9 @@ describe('useRuleFormHorizontalSteps', () => {

render(<TestComponent />);

expect(screen.getByText(RULE_FORM_PAGE_RULE_DEFINITION_TITLE)).toBeInTheDocument();
expect(screen.getByText(RULE_FORM_PAGE_RULE_DEFINITION_TITLE_SHORT)).toBeInTheDocument();
expect(screen.getByText(RULE_FORM_PAGE_RULE_ACTIONS_TITLE)).toBeInTheDocument();
expect(screen.getByText(RULE_FORM_PAGE_RULE_DETAILS_TITLE)).toBeInTheDocument();
expect(screen.getByText(RULE_FORM_PAGE_RULE_DETAILS_TITLE_SHORT)).toBeInTheDocument();
});

test('tracks current step successfully', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import {
RULE_FORM_PAGE_RULE_ACTIONS_TITLE,
RULE_FORM_PAGE_RULE_DEFINITION_TITLE,
RULE_FORM_PAGE_RULE_DETAILS_TITLE,
RULE_FORM_PAGE_RULE_DEFINITION_TITLE_SHORT,
RULE_FORM_PAGE_RULE_DETAILS_TITLE_SHORT,
} from '../translations';
import { hasActionsError, hasActionsParamsErrors, hasParamsErrors } from '../validation';
import { RuleFormStepId } from '../constants';
Expand All @@ -27,6 +29,7 @@ interface UseRuleFormStepsOptions {
touchedSteps: Record<RuleFormStepId, boolean>;
/* Used to track the current step in horizontal steps, not used for vertical steps */
currentStep?: RuleFormStepId;
shortTitles?: boolean;
}

/**
Expand Down Expand Up @@ -69,7 +72,11 @@ const getStepStatus = ({
};

// Create a common hook for both horizontal and vertical steps
const useCommonRuleFormSteps = ({ touchedSteps, currentStep }: UseRuleFormStepsOptions) => {
const useCommonRuleFormSteps = ({
touchedSteps,
currentStep,
shortTitles,
}: UseRuleFormStepsOptions) => {
const {
plugins: { application },
baseErrors = {},
Expand Down Expand Up @@ -132,7 +139,9 @@ const useCommonRuleFormSteps = ({ touchedSteps, currentStep }: UseRuleFormStepsO
const steps = useMemo(
() => ({
[RuleFormStepId.DEFINITION]: {
title: RULE_FORM_PAGE_RULE_DEFINITION_TITLE,
title: shortTitles
? RULE_FORM_PAGE_RULE_DEFINITION_TITLE_SHORT
: RULE_FORM_PAGE_RULE_DEFINITION_TITLE,
status: ruleDefinitionStatus,
children: <RuleDefinition />,
},
Expand All @@ -150,7 +159,9 @@ const useCommonRuleFormSteps = ({ touchedSteps, currentStep }: UseRuleFormStepsO
}
: null,
[RuleFormStepId.DETAILS]: {
title: RULE_FORM_PAGE_RULE_DETAILS_TITLE,
title: shortTitles
? RULE_FORM_PAGE_RULE_DETAILS_TITLE_SHORT
: RULE_FORM_PAGE_RULE_DETAILS_TITLE,
status: ruleDetailsStatus,
children: (
<>
Expand All @@ -161,7 +172,7 @@ const useCommonRuleFormSteps = ({ touchedSteps, currentStep }: UseRuleFormStepsO
),
},
}),
[ruleDefinitionStatus, canReadConnectors, actionsStatus, ruleDetailsStatus]
[ruleDefinitionStatus, canReadConnectors, actionsStatus, ruleDetailsStatus, shortTitles]
);

const stepOrder: RuleFormStepId[] = useMemo(
Expand Down Expand Up @@ -247,6 +258,7 @@ export const useRuleFormHorizontalSteps: () => RuleFormHorizontalSteps = () => {
const { steps, stepOrder } = useCommonRuleFormSteps({
touchedSteps,
currentStep,
shortTitles: true,
});

// Determine current navigation position
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,41 @@
* License v3.0 only", or the "Server Side Public License, v 1".
*/

import React, { useCallback, useMemo, useState } from 'react';
import { EuiButton, EuiSpacer, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import { v4 as uuidv4 } from 'uuid';
import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiImage, EuiSpacer, EuiText } from '@elastic/eui';
import { RuleSystemAction } from '@kbn/alerting-types';
import { ActionConnector } from '@kbn/alerts-ui-shared';
import { ADD_ACTION_TEXT } from '../translations';
import { RuleActionsConnectorsModal } from './rule_actions_connectors_modal';
import { useRuleFormDispatch, useRuleFormState } from '../hooks';
import React, { useCallback, useMemo, useState } from 'react';
import useEffectOnce from 'react-use/lib/useEffectOnce';
import { v4 as uuidv4 } from 'uuid';
import { RuleAction, RuleFormParamsErrors } from '../common/types';
import { DEFAULT_FREQUENCY, MULTI_CONSUMER_RULE_TYPE_IDS } from '../constants';
import { useRuleFormDispatch, useRuleFormState } from '../hooks';
import {
ADD_ACTION_DESCRIPTION_TEXT,
ADD_ACTION_HEADER,
ADD_ACTION_OPTIONAL_TEXT,
ADD_ACTION_TEXT,
} from '../translations';
import { getDefaultParams } from '../utils';
import { RuleActionsConnectorsModal } from './rule_actions_connectors_modal';
import { RuleActionsItem } from './rule_actions_item';
import { RuleActionsSystemActionsItem } from './rule_actions_system_actions_item';
import { getDefaultParams } from '../utils';

const useRuleActionsIllustration = () => {
const [imageData, setImageData] = useState('');
useEffectOnce(() => {
const fetchImage = async () => {
const image = await import('./rule_actions_illustration.svg');
setImageData(image.default);
};
fetchImage();
});
return imageData;
};

export const RuleActions = () => {
const [isConnectorModalOpen, setIsConnectorModalOpen] = useState<boolean>(false);
const ruleActionsIllustration = useRuleActionsIllustration();

const {
formData: { actions, consumer },
Expand Down Expand Up @@ -92,6 +111,8 @@ export const RuleActions = () => {
return selectedRuleType.producer;
}, [consumer, multiConsumerSelection, selectedRuleType]);

const hasActions = actions.length > 0;

return (
<>
<EuiFlexGroup data-test-subj="ruleActions" direction="column">
Expand Down Expand Up @@ -120,15 +141,49 @@ export const RuleActions = () => {
);
})}
</EuiFlexGroup>
{!hasActions && (
<EuiFlexGroup justifyContent="center">
<EuiFlexGroup
alignItems="center"
direction="column"
gutterSize="m"
style={{ maxWidth: 356 }}
>
<EuiImage
alt="Rule actions illustration"
width={198}
height={180}
url={ruleActionsIllustration}
/>
<EuiFlexItem>
<EuiText textAlign="center">
<h3>{ADD_ACTION_HEADER}</h3>
</EuiText>
<EuiText size="s" textAlign="center" color="subdued">
{ADD_ACTION_OPTIONAL_TEXT}
</EuiText>
</EuiFlexItem>
<EuiFlexItem>
<EuiText size="s" textAlign="center" color="subdued">
{ADD_ACTION_DESCRIPTION_TEXT}
</EuiText>
</EuiFlexItem>
</EuiFlexGroup>
</EuiFlexGroup>
)}
<EuiSpacer />
<EuiButton
data-test-subj="ruleActionsAddActionButton"
iconType="push"
iconSide="left"
onClick={onModalOpen}
>
{ADD_ACTION_TEXT}
</EuiButton>
<EuiFlexGroup justifyContent={!hasActions ? 'center' : 'flexStart'}>
<EuiFlexItem grow={0}>
<EuiButton
data-test-subj="ruleActionsAddActionButton"
iconType="push"
iconSide="left"
onClick={onModalOpen}
>
{ADD_ACTION_TEXT}
</EuiButton>
</EuiFlexItem>
</EuiFlexGroup>
{isConnectorModalOpen && (
<RuleActionsConnectorsModal onClose={onModalClose} onSelectConnector={onSelectConnector} />
)}
Expand Down
Loading

0 comments on commit 6892364

Please sign in to comment.