Skip to content

Commit dddd8e4

Browse files
authored
[Alerting UI] Alert and Connector flyouts Save and Save&Test buttons should be active by default. (elastic#86708)
* Alert and Connector flyouts Save and Save&Test buttons should be active by default. * fixed typechecks * fixed typechecks * refactored repeted code * fixed typechecks * fixed typechecks * fixed typechecks * fixed due to comments * fixed failing tests * fixed due to comments * fixed due to comments * fixed due to comments * fixed typescript checks
1 parent 051be28 commit dddd8e4

File tree

60 files changed

+1285
-584
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1285
-584
lines changed

x-pack/plugins/monitoring/public/alerts/alert_form.test.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ import { act } from 'react-dom/test-utils';
1515
import { coreMock } from 'src/core/public/mocks';
1616
import { actionTypeRegistryMock } from '../../../triggers_actions_ui/public/application/action_type_registry.mock';
1717
import { alertTypeRegistryMock } from '../../../triggers_actions_ui/public/application/alert_type_registry.mock';
18-
import { ValidationResult, Alert } from '../../../triggers_actions_ui/public/types';
18+
import {
19+
ValidationResult,
20+
Alert,
21+
ConnectorValidationResult,
22+
GenericValidationResult,
23+
} from '../../../triggers_actions_ui/public/types';
1924
import { AlertForm } from '../../../triggers_actions_ui/public/application/sections/alert_form/alert_form';
2025
import ActionForm from '../../../triggers_actions_ui/public/application/sections/action_connector_form/action_form';
2126
import { Legacy } from '../legacy_shims';
@@ -88,8 +93,13 @@ describe('alert_form', () => {
8893
id: 'alert-action-type',
8994
iconClass: '',
9095
selectMessage: '',
91-
validateConnector: validationMethod,
92-
validateParams: validationMethod,
96+
validateConnector: (): ConnectorValidationResult<unknown, unknown> => {
97+
return {};
98+
},
99+
validateParams: (): GenericValidationResult<unknown> => {
100+
const validationResult = { errors: {} };
101+
return validationResult;
102+
},
93103
actionConnectorFields: null,
94104
actionParamsFields: mockedActionParamsFields,
95105
};

x-pack/plugins/security_solution/public/cases/components/connectors/case/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export function getActionType(): ActionTypeModel {
3232
iconClass: 'securityAnalyticsApp',
3333
selectMessage: i18n.CASE_CONNECTOR_DESC,
3434
actionTypeTitle: i18n.CASE_CONNECTOR_TITLE,
35-
validateConnector: () => ({ errors: {} }),
35+
validateConnector: () => ({ config: { errors: {} }, secrets: { errors: {} } }),
3636
validateParams,
3737
actionConnectorFields: null,
3838
actionParamsFields: lazy(() => import('./fields')),

x-pack/plugins/stack_alerts/public/alert_types/threshold/expression.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent<
253253
fullWidth
254254
name="thresholdTimeField"
255255
data-test-subj="thresholdAlertTimeFieldSelect"
256-
value={timeField}
256+
value={timeField || ''}
257257
onChange={(e) => {
258258
setAlertParams('timeField', e.target.value);
259259
}}

x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.test.tsx

Lines changed: 60 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,18 @@ describe('connector validation', () => {
4848
} as EmailActionConnector;
4949

5050
expect(actionTypeModel.validateConnector(actionConnector)).toEqual({
51-
errors: {
52-
from: [],
53-
port: [],
54-
host: [],
55-
user: [],
56-
password: [],
51+
config: {
52+
errors: {
53+
from: [],
54+
port: [],
55+
host: [],
56+
},
57+
},
58+
secrets: {
59+
errors: {
60+
user: [],
61+
password: [],
62+
},
5763
},
5864
});
5965
});
@@ -78,12 +84,18 @@ describe('connector validation', () => {
7884
} as EmailActionConnector;
7985

8086
expect(actionTypeModel.validateConnector(actionConnector)).toEqual({
81-
errors: {
82-
from: [],
83-
port: [],
84-
host: [],
85-
user: [],
86-
password: [],
87+
config: {
88+
errors: {
89+
from: [],
90+
port: [],
91+
host: [],
92+
},
93+
},
94+
secrets: {
95+
errors: {
96+
user: [],
97+
password: [],
98+
},
8799
},
88100
});
89101
});
@@ -103,12 +115,18 @@ describe('connector validation', () => {
103115
} as EmailActionConnector;
104116

105117
expect(actionTypeModel.validateConnector(actionConnector)).toEqual({
106-
errors: {
107-
from: [],
108-
port: ['Port is required.'],
109-
host: ['Host is required.'],
110-
user: [],
111-
password: [],
118+
config: {
119+
errors: {
120+
from: [],
121+
port: ['Port is required.'],
122+
host: ['Host is required.'],
123+
},
124+
},
125+
secrets: {
126+
errors: {
127+
user: [],
128+
password: [],
129+
},
112130
},
113131
});
114132
});
@@ -132,12 +150,18 @@ describe('connector validation', () => {
132150
} as EmailActionConnector;
133151

134152
expect(actionTypeModel.validateConnector(actionConnector)).toEqual({
135-
errors: {
136-
from: [],
137-
port: [],
138-
host: [],
139-
user: [],
140-
password: ['Password is required when username is used.'],
153+
config: {
154+
errors: {
155+
from: [],
156+
port: [],
157+
host: [],
158+
},
159+
},
160+
secrets: {
161+
errors: {
162+
user: [],
163+
password: ['Password is required when username is used.'],
164+
},
141165
},
142166
});
143167
});
@@ -161,12 +185,18 @@ describe('connector validation', () => {
161185
} as EmailActionConnector;
162186

163187
expect(actionTypeModel.validateConnector(actionConnector)).toEqual({
164-
errors: {
165-
from: [],
166-
port: [],
167-
host: [],
168-
user: ['Username is required when password is used.'],
169-
password: [],
188+
config: {
189+
errors: {
190+
from: [],
191+
port: [],
192+
host: [],
193+
},
194+
},
195+
secrets: {
196+
errors: {
197+
user: ['Username is required when password is used.'],
198+
password: [],
199+
},
170200
},
171201
});
172202
});

x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
*/
66
import { lazy } from 'react';
77
import { i18n } from '@kbn/i18n';
8-
import { ActionTypeModel, ValidationResult } from '../../../../types';
8+
import {
9+
ActionTypeModel,
10+
ConnectorValidationResult,
11+
GenericValidationResult,
12+
} from '../../../../types';
913
import { EmailActionParams, EmailConfig, EmailSecrets, EmailActionConnector } from '../types';
1014

1115
export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, EmailActionParams> {
@@ -25,18 +29,25 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
2529
defaultMessage: 'Send to email',
2630
}
2731
),
28-
validateConnector: (action: EmailActionConnector): ValidationResult => {
29-
const validationResult = { errors: {} };
30-
const errors = {
32+
validateConnector: (
33+
action: EmailActionConnector
34+
): ConnectorValidationResult<Omit<EmailConfig, 'secure' | 'hasAuth'>, EmailSecrets> => {
35+
const configErrors = {
3136
from: new Array<string>(),
3237
port: new Array<string>(),
3338
host: new Array<string>(),
39+
};
40+
const secretsErrors = {
3441
user: new Array<string>(),
3542
password: new Array<string>(),
3643
};
37-
validationResult.errors = errors;
44+
45+
const validationResult = {
46+
config: { errors: configErrors },
47+
secrets: { errors: secretsErrors },
48+
};
3849
if (!action.config.from) {
39-
errors.from.push(
50+
configErrors.from.push(
4051
i18n.translate(
4152
'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredFromText',
4253
{
@@ -46,7 +57,7 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
4657
);
4758
}
4859
if (action.config.from && !action.config.from.trim().match(mailformat)) {
49-
errors.from.push(
60+
configErrors.from.push(
5061
i18n.translate(
5162
'xpack.triggersActionsUI.components.builtinActionTypes.error.formatFromText',
5263
{
@@ -56,7 +67,7 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
5667
);
5768
}
5869
if (!action.config.port) {
59-
errors.port.push(
70+
configErrors.port.push(
6071
i18n.translate(
6172
'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredPortText',
6273
{
@@ -66,7 +77,7 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
6677
);
6778
}
6879
if (!action.config.host) {
69-
errors.host.push(
80+
configErrors.host.push(
7081
i18n.translate(
7182
'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredHostText',
7283
{
@@ -76,7 +87,7 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
7687
);
7788
}
7889
if (action.config.hasAuth && !action.secrets.user && !action.secrets.password) {
79-
errors.user.push(
90+
secretsErrors.user.push(
8091
i18n.translate(
8192
'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredAuthUserNameText',
8293
{
@@ -86,7 +97,7 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
8697
);
8798
}
8899
if (action.config.hasAuth && !action.secrets.user && !action.secrets.password) {
89-
errors.password.push(
100+
secretsErrors.password.push(
90101
i18n.translate(
91102
'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredAuthPasswordText',
92103
{
@@ -96,7 +107,7 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
96107
);
97108
}
98109
if (action.secrets.user && !action.secrets.password) {
99-
errors.password.push(
110+
secretsErrors.password.push(
100111
i18n.translate(
101112
'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredPasswordText',
102113
{
@@ -106,7 +117,7 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
106117
);
107118
}
108119
if (!action.secrets.user && action.secrets.password) {
109-
errors.user.push(
120+
secretsErrors.user.push(
110121
i18n.translate(
111122
'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredUserText',
112123
{
@@ -117,16 +128,17 @@ export function getActionType(): ActionTypeModel<EmailConfig, EmailSecrets, Emai
117128
}
118129
return validationResult;
119130
},
120-
validateParams: (actionParams: EmailActionParams): ValidationResult => {
121-
const validationResult = { errors: {} };
131+
validateParams: (
132+
actionParams: EmailActionParams
133+
): GenericValidationResult<EmailActionParams> => {
122134
const errors = {
123135
to: new Array<string>(),
124136
cc: new Array<string>(),
125137
bcc: new Array<string>(),
126138
message: new Array<string>(),
127139
subject: new Array<string>(),
128140
};
129-
validationResult.errors = errors;
141+
const validationResult = { errors };
130142
if (
131143
(!(actionParams.to instanceof Array) || actionParams.to.length === 0) &&
132144
(!(actionParams.cc instanceof Array) || actionParams.cc.length === 0) &&

x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export const EmailActionConnectorFields: React.FunctionComponent<
192192
}
193193
)}
194194
disabled={readOnly}
195-
checked={hasAuth}
195+
checked={hasAuth || false}
196196
onChange={(e) => {
197197
editActionConfig('hasAuth', e.target.checked);
198198
if (!e.target.checked) {

x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.test.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,13 @@ describe('index connector validation', () => {
4242
} as EsIndexActionConnector;
4343

4444
expect(actionTypeModel.validateConnector(actionConnector)).toEqual({
45-
errors: {
46-
index: [],
45+
config: {
46+
errors: {
47+
index: [],
48+
},
49+
},
50+
secrets: {
51+
errors: {},
4752
},
4853
});
4954
});
@@ -62,8 +67,13 @@ describe('index connector validation with minimal config', () => {
6267
} as EsIndexActionConnector;
6368

6469
expect(actionTypeModel.validateConnector(actionConnector)).toEqual({
65-
errors: {
66-
index: [],
70+
config: {
71+
errors: {
72+
index: [],
73+
},
74+
},
75+
secrets: {
76+
errors: {},
6777
},
6878
});
6979
});

x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
*/
66
import { lazy } from 'react';
77
import { i18n } from '@kbn/i18n';
8-
import { ActionTypeModel, ValidationResult } from '../../../../types';
8+
import {
9+
ActionTypeModel,
10+
GenericValidationResult,
11+
ConnectorValidationResult,
12+
} from '../../../../types';
913
import { EsIndexActionConnector, EsIndexConfig, IndexActionParams } from '../types';
1014

1115
export function getActionType(): ActionTypeModel<EsIndexConfig, unknown, IndexActionParams> {
@@ -24,14 +28,15 @@ export function getActionType(): ActionTypeModel<EsIndexConfig, unknown, IndexAc
2428
defaultMessage: 'Index data',
2529
}
2630
),
27-
validateConnector: (action: EsIndexActionConnector): ValidationResult => {
28-
const validationResult = { errors: {} };
29-
const errors = {
31+
validateConnector: (
32+
action: EsIndexActionConnector
33+
): ConnectorValidationResult<Pick<EsIndexConfig, 'index'>, unknown> => {
34+
const configErrors = {
3035
index: new Array<string>(),
3136
};
32-
validationResult.errors = errors;
37+
const validationResult = { config: { errors: configErrors }, secrets: { errors: {} } };
3338
if (!action.config.index) {
34-
errors.index.push(
39+
configErrors.index.push(
3540
i18n.translate(
3641
'xpack.triggersActionsUI.components.builtinActionTypes.indexAction.error.requiredIndexText',
3742
{
@@ -44,12 +49,13 @@ export function getActionType(): ActionTypeModel<EsIndexConfig, unknown, IndexAc
4449
},
4550
actionConnectorFields: lazy(() => import('./es_index_connector')),
4651
actionParamsFields: lazy(() => import('./es_index_params')),
47-
validateParams: (actionParams: IndexActionParams): ValidationResult => {
48-
const validationResult = { errors: {} };
52+
validateParams: (
53+
actionParams: IndexActionParams
54+
): GenericValidationResult<IndexActionParams> => {
4955
const errors = {
5056
documents: new Array<string>(),
5157
};
52-
validationResult.errors = errors;
58+
const validationResult = { errors };
5359
if (!actionParams.documents?.length || Object.keys(actionParams.documents[0]).length === 0) {
5460
errors.documents.push(
5561
i18n.translate(

0 commit comments

Comments
 (0)