@bigbinary/neeto-rules-frontend 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,19 +4,19 @@ import { BrowserRouter } from 'react-router-dom';
4
4
  import { shallow } from 'zustand/shallow';
5
5
  import classNames$1 from 'classnames';
6
6
  import { useFormikContext, Formik, Form, useField, FieldArray, ErrorMessage } from 'formik';
7
- import { findBy, noop as noop$1, isPresent, renameKeys, isNotEmpty, nullSafe, toLabelAndValue, removeBy } from '@bigbinary/neeto-cist';
7
+ import { findBy, noop as noop$1, isNotEmpty, renameKeys, isPresent, nullSafe, toLabelAndValue, removeBy } from '@bigbinary/neeto-cist';
8
8
  import { ActionBlock, Textarea, MultiEmailInput, Input as Input$3, Select as Select$2, Radio } from '@bigbinary/neetoui/formik';
9
9
  import { t as t$2 } from 'i18next';
10
10
  import { isPhoneNumberValid } from '@bigbinary/neeto-molecules/PhoneNumber';
11
11
  import * as yup from 'yup';
12
12
  import { isEditorEmpty, FormikEditor } from '@bigbinary/neeto-editor';
13
- import { withImmutableActions, useDebounce, useStateWithDependency } from '@bigbinary/neeto-commons-frontend/react-utils';
13
+ import { withImmutableActions, withT, useStateWithDependency, useDebounce } from '@bigbinary/neeto-commons-frontend/react-utils';
14
14
  import { create } from 'zustand';
15
15
  import PageLoader from '@bigbinary/neeto-molecules/PageLoader';
16
- import { Typography, Button, Pane, DatePicker, Dropdown as Dropdown$1, Input as Input$2, Select as Select$1, Checkbox, Tag, Label, Tooltip } from '@bigbinary/neetoui';
16
+ import { Typography, Button, Pane, Input as Input$2, Label, Select as Select$1, DatePicker, Dropdown as Dropdown$1, Checkbox, Tag, Tooltip } from '@bigbinary/neetoui';
17
17
  import { useTranslation } from 'react-i18next';
18
- import { Down, Up, Check, Search, Close, Delete, Plus, Refresh, Eye } from '@bigbinary/neeto-icons';
19
- import { pluck, isNil, isNotNil, assocPath, toLower, isEmpty, without, append as append$1, pipe, filter, uniq, join, map, assoc, mergeLeft, includes, test, partition } from 'ramda';
18
+ import { Down, Up, Delete, Check, Search, Close, Plus, Refresh, Eye } from '@bigbinary/neeto-icons';
19
+ import { pluck, isNil, isNotNil, whereAny, useWith, path, split, assocPath, toLower, isEmpty, without, append as append$1, pipe, filter, uniq, join, map, assoc, mergeLeft, includes, test, partition } from 'ramda';
20
20
  import { joinHyphenCase, hyphenize } from '@bigbinary/neeto-commons-frontend/utils';
21
21
  import useHotkeys from '@bigbinary/neeto-hotkeys';
22
22
  import { createPortal } from 'react-dom';
@@ -240,7 +240,8 @@ var ACTION_TYPES = {
240
240
  longText: "longText",
241
241
  sms: "sms",
242
242
  smsToNumbers: "smsToNumbers",
243
- smsTo: "smsTo"
243
+ smsTo: "smsTo",
244
+ sendToApi: "sendToApi"
244
245
  };
245
246
  var LIST_FIELD_TOOLTIP_PROPS = {
246
247
  save: {
@@ -453,7 +454,7 @@ var getActionsSchema = function getActionsSchema(element, customData) {
453
454
  return yup.object({
454
455
  phoneNumbers: selectedAction.type === ACTION_TYPES.smsToNumbers ? yup.array().required(t$2("neetoRules.validations.required.entity", {
455
456
  entity: t$2("neetoRules.common.phoneNumber")
456
- })).of(yup.string().test("testPhoneNumber", t$2("neetoRules.validations.inValidPhoneNumber"), function (value) {
457
+ })).of(yup.string().test("testPhoneNumber", t$2("neetoRules.validations.invalidPhoneNumber"), function (value) {
457
458
  return isPhoneNumberValid(value);
458
459
  })) : schema,
459
460
  body: yup.string().test("body", t$2("neetoRules.validations.required.body"), function (value) {
@@ -461,6 +462,14 @@ var getActionsSchema = function getActionsSchema(element, customData) {
461
462
  }),
462
463
  value: selectedAction.type === ACTION_TYPES.smsTo ? yup.string().required(t$2("neetoRules.validations.required.value")) : schema
463
464
  });
465
+ } else if (ACTION_TYPES.sendToApi === (selectedAction === null || selectedAction === void 0 ? void 0 : selectedAction.type)) {
466
+ return yup.object({
467
+ endpoint: yup.string().url(t$2("neetoRules.validations.invalidUrlEntity", {
468
+ entity: t$2("neetoRules.labels.endpoint")
469
+ })).required(t$2("neetoRules.validations.required.entity", {
470
+ entity: t$2("neetoRules.labels.endpoint")
471
+ }))
472
+ });
464
473
  } else if (ACTION_TYPES.multiSelect === (selectedAction === null || selectedAction === void 0 ? void 0 : selectedAction.type)) {
465
474
  return yup.object({
466
475
  value: yup.array().min(1, t$2("neetoRules.validations.atLeastOneValue")).required(t$2("neetoRules.validations.atLeastOneValue"))
@@ -701,7 +710,8 @@ var NeetoRules$2 = function NeetoRules(_ref) {
701
710
  className: "mr-2",
702
711
  htmlType: "submit",
703
712
  disabled: isSubmitting || !dirty,
704
- onClick: function onClick() {}
713
+ onClick: function onClick() {},
714
+ "data-cy": "form-submit-button"
705
715
  }
706
716
  })));
707
717
  });
@@ -1188,6 +1198,247 @@ var LongTextField = function LongTextField(_ref) {
1188
1198
  }))));
1189
1199
  };
1190
1200
 
1201
+ function _extends$1() {
1202
+ _extends$1 = Object.assign ? Object.assign.bind() : function (target) {
1203
+ for (var i = 1; i < arguments.length; i++) {
1204
+ var source = arguments[i];
1205
+ for (var key in source) {
1206
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
1207
+ target[key] = source[key];
1208
+ }
1209
+ }
1210
+ }
1211
+ return target;
1212
+ };
1213
+ return _extends$1.apply(this, arguments);
1214
+ }
1215
+
1216
+ var _excluded$f = ["initialFocusRef", "name", "label"];
1217
+ var InputField$2 = function InputField(_ref) {
1218
+ var initialFocusRef = _ref.initialFocusRef,
1219
+ name = _ref.name,
1220
+ label = _ref.label,
1221
+ otherProps = _objectWithoutProperties$1(_ref, _excluded$f);
1222
+ var _useField = useField(name),
1223
+ _useField2 = _slicedToArray$1(_useField, 2),
1224
+ field = _useField2[0],
1225
+ meta = _useField2[1];
1226
+ return /*#__PURE__*/React__default.createElement(Input$2, _extends$1({
1227
+ label: label,
1228
+ type: "text"
1229
+ }, field, {
1230
+ error: meta.touched ? meta.error : "",
1231
+ ref: initialFocusRef
1232
+ }, otherProps));
1233
+ };
1234
+
1235
+ var ADDITIONAL_DATA_INITIAL_VALUE = {
1236
+ key: "",
1237
+ value: ""
1238
+ };
1239
+ var SAMPLE_ENDPOINT = "https://example.com";
1240
+
1241
+ var addOption = function addOption(arrayHelpers) {
1242
+ return arrayHelpers.push(ADDITIONAL_DATA_INITIAL_VALUE);
1243
+ };
1244
+ var removeOption = function removeOption(_ref) {
1245
+ var arrayHelpers = _ref.arrayHelpers,
1246
+ index = _ref.index,
1247
+ data = _ref.data;
1248
+ arrayHelpers.remove(index);
1249
+ if (data.length === 1) {
1250
+ addOption(arrayHelpers);
1251
+ }
1252
+ };
1253
+ var hasKeyOrValue = whereAny({
1254
+ key: isNotEmpty,
1255
+ value: isNotEmpty
1256
+ });
1257
+
1258
+ var setEditorContent = function setEditorContent(ref, content) {
1259
+ if (!ref.current) return;
1260
+ ref.current.editor.commands.setContent(content);
1261
+ };
1262
+
1263
+ // eslint-disable-next-line react-hooks/rules-of-hooks
1264
+ var dotPath = useWith(path, [split(".")]);
1265
+
1266
+ var KeyValuePairsField = withT(function (_ref) {
1267
+ var t = _ref.t,
1268
+ name = _ref.name,
1269
+ _ref$label = _ref.label,
1270
+ label = _ref$label === void 0 ? "" : _ref$label;
1271
+ return /*#__PURE__*/React__default.createElement(FieldArray, {
1272
+ name: name
1273
+ }, function (arrayHelpers) {
1274
+ var data = dotPath(name, arrayHelpers.form.values);
1275
+ var showDeleteButton = data.length > 1 || hasKeyOrValue(data[0]);
1276
+ return /*#__PURE__*/React__default.createElement("div", {
1277
+ className: "space-y-3"
1278
+ }, /*#__PURE__*/React__default.createElement(Label, null, label), data.map(function (_, index) {
1279
+ return /*#__PURE__*/React__default.createElement("div", {
1280
+ className: "flex h-8 space-x-3",
1281
+ key: index
1282
+ }, /*#__PURE__*/React__default.createElement(InputField$2, {
1283
+ className: "w-2/5",
1284
+ name: "".concat(name, ".").concat(index, ".key"),
1285
+ placeholder: t("neetoRules.labels.key")
1286
+ }), /*#__PURE__*/React__default.createElement(InputField$2, {
1287
+ className: "w-3/5",
1288
+ name: "".concat(name, ".").concat(index, ".value"),
1289
+ placeholder: t("neetoRules.labels.value"),
1290
+ suffix: showDeleteButton && /*#__PURE__*/React__default.createElement(Button, {
1291
+ icon: Delete,
1292
+ size: "small",
1293
+ style: "text",
1294
+ onClick: function onClick() {
1295
+ return removeOption({
1296
+ arrayHelpers: arrayHelpers,
1297
+ index: index,
1298
+ data: data
1299
+ });
1300
+ }
1301
+ })
1302
+ }));
1303
+ }), /*#__PURE__*/React__default.createElement(Button, {
1304
+ label: t("neetoRules.labels.addKeyValuePair"),
1305
+ style: "secondary",
1306
+ onClick: function onClick() {
1307
+ return addOption(arrayHelpers);
1308
+ }
1309
+ }));
1310
+ });
1311
+ });
1312
+
1313
+ var SelectTemplateField = function SelectTemplateField(_ref) {
1314
+ var selectedField = _ref.selectedField,
1315
+ templates = _ref.templates,
1316
+ onChange = _ref.onChange,
1317
+ initialFocusRef = _ref.initialFocusRef;
1318
+ var _useStateWithDependen = useStateWithDependency(null, [selectedField]),
1319
+ _useStateWithDependen2 = _slicedToArray$1(_useStateWithDependen, 2),
1320
+ selectedTemplate = _useStateWithDependen2[0],
1321
+ setSelectedTemplate = _useStateWithDependen2[1];
1322
+ var _useTranslation = useTranslation(),
1323
+ t = _useTranslation.t;
1324
+ var handleTemplateChange = function handleTemplateChange(option) {
1325
+ setSelectedTemplate(option);
1326
+ if (!option) return;
1327
+ var template = findBy({
1328
+ id: option.value
1329
+ }, templates);
1330
+ onChange === null || onChange === void 0 || onChange(template);
1331
+ };
1332
+ return /*#__PURE__*/React__default.createElement(Select$1, {
1333
+ isClearable: true,
1334
+ isSearchable: true,
1335
+ className: "mb-4",
1336
+ innerRef: initialFocusRef,
1337
+ label: t("neetoRules.labels.template"),
1338
+ options: renameKeys({
1339
+ name: "label",
1340
+ id: "value"
1341
+ }, templates),
1342
+ placeholder: t("neetoRules.placeholders.selectTemplate"),
1343
+ value: selectedTemplate,
1344
+ onChange: handleTemplateChange
1345
+ });
1346
+ };
1347
+
1348
+ var ApiFields = function ApiFields(_ref) {
1349
+ var _errors$actions, _touched$actions, _selectedField$separa;
1350
+ var name = _ref.name,
1351
+ selectedField = _ref.selectedField,
1352
+ index = _ref.index;
1353
+ var _useFormikContext = useFormikContext(),
1354
+ errors = _useFormikContext.errors,
1355
+ touched = _useFormikContext.touched,
1356
+ setFieldValue = _useFormikContext.setFieldValue;
1357
+ var _useState = useState(false),
1358
+ _useState2 = _slicedToArray$1(_useState, 2),
1359
+ showPane = _useState2[0],
1360
+ setShowPane = _useState2[1];
1361
+ var initialFocusRef = useRef(null);
1362
+ var _useTranslation = useTranslation(),
1363
+ t = _useTranslation.t;
1364
+ useOnButtonPressed(initialFocusRef, function () {
1365
+ return setShowPane(false);
1366
+ });
1367
+ var isValid = errors.actions && isNotNil((_errors$actions = errors.actions) === null || _errors$actions === void 0 || (_errors$actions = _errors$actions.value) === null || _errors$actions === void 0 ? void 0 : _errors$actions[index]) && isNotNil((_touched$actions = touched.actions) === null || _touched$actions === void 0 || (_touched$actions = _touched$actions.value) === null || _touched$actions === void 0 ? void 0 : _touched$actions[index]);
1368
+ var separator = (selectedField === null || selectedField === void 0 || (_selectedField$separa = selectedField.separator) === null || _selectedField$separa === void 0 ? void 0 : _selectedField$separa.toLowerCase()) || t("neetoRules.common.as");
1369
+ var defaultLabel = (selectedField === null || selectedField === void 0 ? void 0 : selectedField.dataPlaceholder) || t("neetoRules.common.data");
1370
+ var templates = selectedField === null || selectedField === void 0 ? void 0 : selectedField.templates;
1371
+ var isTemplateSelectionEnabled = isPresent(templates);
1372
+ var handleTemplateChange = function handleTemplateChange(template) {
1373
+ setFieldValue("".concat(name, ".endpoint"), template.endpoint);
1374
+ setFieldValue("".concat(name, ".additionalData"), template.additionalData);
1375
+ };
1376
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Typography, {
1377
+ className: "neeto-ui-text-gray-700 mt-1",
1378
+ "data-cy": "api-action-separator-text",
1379
+ style: "h5",
1380
+ weight: "normal"
1381
+ }, separator), /*#__PURE__*/React__default.createElement(Typography, {
1382
+ "data-cy": "api-action-button",
1383
+ style: "h5",
1384
+ weight: "semibold",
1385
+ className: classNames$1("hover:neeto-ui-text-primary-800 neeto-ui-text-gray-800 mt-1 cursor-pointer underline", {
1386
+ "neeto-ui-text-primary-800": showPane,
1387
+ "neeto-ui-text-error-500": isValid
1388
+ }),
1389
+ onClick: function onClick() {
1390
+ return setShowPane(function (prevState) {
1391
+ return !prevState;
1392
+ });
1393
+ }
1394
+ }, defaultLabel.toLowerCase()), /*#__PURE__*/React__default.createElement(Pane, {
1395
+ initialFocusRef: initialFocusRef,
1396
+ isOpen: showPane,
1397
+ size: "large",
1398
+ onClose: function onClose() {
1399
+ return setShowPane(false);
1400
+ }
1401
+ }, /*#__PURE__*/React__default.createElement(Pane.Header, null, /*#__PURE__*/React__default.createElement(Typography, {
1402
+ className: "neeto-ui-text-gray-800 cursor-pointer",
1403
+ "data-cy": "api-action-pane-header-title",
1404
+ style: "h3",
1405
+ weight: "semibold"
1406
+ }, defaultLabel)), /*#__PURE__*/React__default.createElement(Pane.Body, null, /*#__PURE__*/React__default.createElement("div", {
1407
+ className: "w-full"
1408
+ }, isTemplateSelectionEnabled && /*#__PURE__*/React__default.createElement(SelectTemplateField, {
1409
+ initialFocusRef: initialFocusRef,
1410
+ selectedField: selectedField,
1411
+ templates: templates,
1412
+ onChange: handleTemplateChange
1413
+ }), /*#__PURE__*/React__default.createElement(InputField$2, {
1414
+ required: true,
1415
+ className: "mb-4",
1416
+ "data-cy": "api-action-endpoint-text-field",
1417
+ label: t("neetoRules.labels.endpoint"),
1418
+ name: "".concat(name, ".endpoint"),
1419
+ placeholder: SAMPLE_ENDPOINT,
1420
+ initialFocusRef: isTemplateSelectionEnabled ? null : initialFocusRef
1421
+ }), /*#__PURE__*/React__default.createElement(KeyValuePairsField, {
1422
+ label: t("neetoRules.labels.additionalData"),
1423
+ name: "".concat(name, ".additionalData")
1424
+ }))), /*#__PURE__*/React__default.createElement(Pane.Footer, {
1425
+ className: "flex items-center space-x-2"
1426
+ }, /*#__PURE__*/React__default.createElement(Button, {
1427
+ "data-cy": "save-changes-button",
1428
+ label: t("neetoRules.common.saveChange"),
1429
+ onClick: function onClick() {
1430
+ return setShowPane(false);
1431
+ }
1432
+ }), /*#__PURE__*/React__default.createElement(Button, {
1433
+ "data-cy": "cancel-button",
1434
+ label: t("neetoRules.buttons.cancel"),
1435
+ style: "text",
1436
+ onClick: function onClick() {
1437
+ return setShowPane(false);
1438
+ }
1439
+ }))));
1440
+ };
1441
+
1191
1442
  var CustomAction = function CustomAction(_ref) {
1192
1443
  var _errors$actions, _touched$actions, _selectedField$separa;
1193
1444
  var ActionComponent = _ref.ActionComponent,
@@ -1511,22 +1762,7 @@ var DropdownField$1 = function DropdownField(_ref) {
1511
1762
  }, t$2("neetoRules.common.noOptions")))));
1512
1763
  };
1513
1764
 
1514
- function _extends$1() {
1515
- _extends$1 = Object.assign ? Object.assign.bind() : function (target) {
1516
- for (var i = 1; i < arguments.length; i++) {
1517
- var source = arguments[i];
1518
- for (var key in source) {
1519
- if (Object.prototype.hasOwnProperty.call(source, key)) {
1520
- target[key] = source[key];
1521
- }
1522
- }
1523
- }
1524
- return target;
1525
- };
1526
- return _extends$1.apply(this, arguments);
1527
- }
1528
-
1529
- var _excluded$f = ["autoFocus", "name", "value", "label", "variables", "addons", "editorRef", "defaults"];
1765
+ var _excluded$e = ["autoFocus", "name", "value", "label", "variables", "addons", "editorRef", "defaults"];
1530
1766
  var EditorAction = function EditorAction(_ref) {
1531
1767
  var autoFocus = _ref.autoFocus,
1532
1768
  name = _ref.name,
@@ -1540,7 +1776,7 @@ var EditorAction = function EditorAction(_ref) {
1540
1776
  _ref$editorRef = _ref.editorRef,
1541
1777
  editorRef = _ref$editorRef === void 0 ? null : _ref$editorRef,
1542
1778
  defaults = _ref.defaults,
1543
- otherProps = _objectWithoutProperties$1(_ref, _excluded$f);
1779
+ otherProps = _objectWithoutProperties$1(_ref, _excluded$e);
1544
1780
  var _useFormikContext = useFormikContext(),
1545
1781
  setFieldValue = _useFormikContext.setFieldValue;
1546
1782
  var _useState = useState(value),
@@ -1591,30 +1827,6 @@ var EmailIdFields = function EmailIdFields(_ref) {
1591
1827
  }));
1592
1828
  };
1593
1829
 
1594
- var _excluded$e = ["initialFocusRef", "name", "label"];
1595
- var InputField$2 = function InputField(_ref) {
1596
- var initialFocusRef = _ref.initialFocusRef,
1597
- name = _ref.name,
1598
- label = _ref.label,
1599
- otherProps = _objectWithoutProperties$1(_ref, _excluded$e);
1600
- var _useField = useField(name),
1601
- _useField2 = _slicedToArray$1(_useField, 2),
1602
- field = _useField2[0],
1603
- meta = _useField2[1];
1604
- return /*#__PURE__*/React__default.createElement(Input$2, _extends$1({
1605
- label: label,
1606
- type: "text"
1607
- }, field, {
1608
- error: meta.touched ? meta.error : "",
1609
- ref: initialFocusRef
1610
- }, otherProps));
1611
- };
1612
-
1613
- var setEditorContent = function setEditorContent(ref, content) {
1614
- if (!ref.current) return;
1615
- ref.current.editor.commands.setContent(content);
1616
- };
1617
-
1618
1830
  var EmailFields = function EmailFields(_ref) {
1619
1831
  var _errors$actions, _touched$actions, _selectedField$separa, _action$metadata;
1620
1832
  var _ref$isEmailIdField = _ref.isEmailIdField,
@@ -1633,10 +1845,6 @@ var EmailFields = function EmailFields(_ref) {
1633
1845
  _useState2 = _slicedToArray$1(_useState, 2),
1634
1846
  showPane = _useState2[0],
1635
1847
  setShowPane = _useState2[1];
1636
- var _useStateWithDependen = useStateWithDependency(null, [selectedField]),
1637
- _useStateWithDependen2 = _slicedToArray$1(_useStateWithDependen, 2),
1638
- selectedTemplate = _useStateWithDependen2[0],
1639
- setSelectedTemplate = _useStateWithDependen2[1];
1640
1848
  var initialFocusRef = useRef(null);
1641
1849
  var editorRef = useRef(null);
1642
1850
  var _useTranslation = useTranslation(),
@@ -1649,12 +1857,7 @@ var EmailFields = function EmailFields(_ref) {
1649
1857
  var defaultLabel = (selectedField === null || selectedField === void 0 ? void 0 : selectedField.emailPlaceholder) || t("neetoRules.common.email");
1650
1858
  var templates = selectedField === null || selectedField === void 0 ? void 0 : selectedField.templates;
1651
1859
  var isTemplateSelectionEnabled = isPresent(templates);
1652
- var handleTemplateChange = function handleTemplateChange(option) {
1653
- setSelectedTemplate(option);
1654
- if (!option) return;
1655
- var template = findBy({
1656
- id: option.value
1657
- }, templates);
1860
+ var handleTemplateChange = function handleTemplateChange(template) {
1658
1861
  setFieldValue("".concat(name, ".body"), template.body);
1659
1862
  setEditorContent(editorRef, template.body);
1660
1863
  if (selectedField.hideSubject) return;
@@ -1705,18 +1908,10 @@ var EmailFields = function EmailFields(_ref) {
1705
1908
  weight: "semibold"
1706
1909
  }, defaultLabel)), /*#__PURE__*/React__default.createElement(Pane.Body, null, /*#__PURE__*/React__default.createElement("div", {
1707
1910
  className: "w-full"
1708
- }, isTemplateSelectionEnabled && /*#__PURE__*/React__default.createElement(Select$1, {
1709
- isClearable: true,
1710
- isSearchable: true,
1711
- className: "mb-4",
1712
- innerRef: initialFocusRef,
1713
- label: t("neetoRules.labels.template"),
1714
- options: renameKeys({
1715
- name: "label",
1716
- id: "value"
1717
- }, templates),
1718
- placeholder: t("neetoRules.placeholders.selectTemplate"),
1719
- value: selectedTemplate,
1911
+ }, isTemplateSelectionEnabled && /*#__PURE__*/React__default.createElement(SelectTemplateField, {
1912
+ initialFocusRef: initialFocusRef,
1913
+ selectedField: selectedField,
1914
+ templates: templates,
1720
1915
  onChange: handleTemplateChange
1721
1916
  }), isEmailIdField && /*#__PURE__*/React__default.createElement(EmailIdFields, {
1722
1917
  emails: emails,
@@ -1738,7 +1933,7 @@ var EmailFields = function EmailFields(_ref) {
1738
1933
  }))), /*#__PURE__*/React__default.createElement(Pane.Footer, {
1739
1934
  className: "flex items-center space-x-2"
1740
1935
  }, /*#__PURE__*/React__default.createElement(Button, {
1741
- "data-cy": "save-changes-button",
1936
+ "data-cy": "email-action-save-changes-button",
1742
1937
  label: t("neetoRules.common.saveChange"),
1743
1938
  onClick: function onClick() {
1744
1939
  return setShowPane(false);
@@ -10095,7 +10290,7 @@ var PHONE_NUMBER_SEPARATION_REGEX = /[^\s,]+/g;
10095
10290
  var FLEXIBLE_PHONE_NUMBER_REGEX = /[0-9+, ]+/g;
10096
10291
  var PHONE_NUMBER_VALIDATION_SCHEMA = yup.string().required(t$2("neetoRules.validations.required.entity", {
10097
10292
  entity: t$2("neetoRules.common.phoneNumber")
10098
- })).test("testPhoneNumber", t$2("neetoRules.validations.inValidPhoneNumber"), isPhoneNumberValid);
10293
+ })).test("testPhoneNumber", t$2("neetoRules.validations.invalidPhoneNumber"), isPhoneNumberValid);
10099
10294
  var CUSTOM_STYLES = {
10100
10295
  input: assoc("overflow", "hidden"),
10101
10296
  multiValue: function multiValue(styles, _ref2) {
@@ -10266,10 +10461,6 @@ var SmsFields = function SmsFields(_ref) {
10266
10461
  _useState2 = _slicedToArray$1(_useState, 2),
10267
10462
  showPane = _useState2[0],
10268
10463
  setShowPane = _useState2[1];
10269
- var _useStateWithDependen = useStateWithDependency(null, [selectedField]),
10270
- _useStateWithDependen2 = _slicedToArray$1(_useStateWithDependen, 2),
10271
- selectedTemplate = _useStateWithDependen2[0],
10272
- setSelectedTemplate = _useStateWithDependen2[1];
10273
10464
  var initialFocusRef = useRef(null);
10274
10465
  var editorRef = useRef(null);
10275
10466
  var _useTranslation = useTranslation(),
@@ -10282,12 +10473,7 @@ var SmsFields = function SmsFields(_ref) {
10282
10473
  var defaultLabel = (selectedField === null || selectedField === void 0 ? void 0 : selectedField.smsPlaceholder) || t("neetoRules.common.sms");
10283
10474
  var templates = selectedField === null || selectedField === void 0 ? void 0 : selectedField.templates;
10284
10475
  var isTemplateSelectionEnabled = isPresent(templates);
10285
- var handleTemplateChange = function handleTemplateChange(option) {
10286
- setSelectedTemplate(option);
10287
- if (!option) return;
10288
- var template = findBy({
10289
- id: option.value
10290
- }, templates);
10476
+ var handleTemplateChange = function handleTemplateChange(template) {
10291
10477
  setFieldValue("".concat(name, ".body"), template.body);
10292
10478
  setEditorContent(editorRef, template.body);
10293
10479
  };
@@ -10329,18 +10515,10 @@ var SmsFields = function SmsFields(_ref) {
10329
10515
  weight: "semibold"
10330
10516
  }, defaultLabel)), /*#__PURE__*/React__default.createElement(Pane.Body, null, /*#__PURE__*/React__default.createElement("div", {
10331
10517
  className: "w-full"
10332
- }, isTemplateSelectionEnabled && /*#__PURE__*/React__default.createElement(Select$1, {
10333
- isClearable: true,
10334
- isSearchable: true,
10335
- className: "mb-4",
10336
- innerRef: initialFocusRef,
10337
- label: t("neetoRules.labels.template"),
10338
- options: renameKeys({
10339
- name: "label",
10340
- id: "value"
10341
- }, templates),
10342
- placeholder: t("neetoRules.placeholders.selectTemplate"),
10343
- value: selectedTemplate,
10518
+ }, isTemplateSelectionEnabled && /*#__PURE__*/React__default.createElement(SelectTemplateField, {
10519
+ initialFocusRef: initialFocusRef,
10520
+ selectedField: selectedField,
10521
+ templates: templates,
10344
10522
  onChange: handleTemplateChange
10345
10523
  }), showPhoneNumberInput && /*#__PURE__*/React__default.createElement(PhoneNumberField, {
10346
10524
  phoneNumbers: phoneNumbers,
@@ -10454,6 +10632,14 @@ var ActionSubItems = function ActionSubItems(_ref) {
10454
10632
  key: name
10455
10633
  }));
10456
10634
  }
10635
+ if ((selectedField === null || selectedField === void 0 ? void 0 : selectedField.type) === ACTION_TYPES.sendToApi) {
10636
+ return /*#__PURE__*/React__default.createElement(ApiFields, {
10637
+ index: index,
10638
+ name: name,
10639
+ selectedField: selectedField,
10640
+ key: name
10641
+ });
10642
+ }
10457
10643
  if ((selectedField === null || selectedField === void 0 ? void 0 : selectedField.type) === ACTION_TYPES.dropdown) {
10458
10644
  return /*#__PURE__*/React__default.createElement(DropdownField$1, {
10459
10645
  index: index,
@@ -10785,7 +10971,7 @@ var Actions = function Actions(_ref) {
10785
10971
  return arrayHelpers.push(DEFAULT_RULE_ACTION);
10786
10972
  }
10787
10973
  }), actions.length > 1 && /*#__PURE__*/React__default.createElement(Button, {
10788
- "data-cy": "delete-action-button",
10974
+ "data-cy": "delete-action-button-".concat(index),
10789
10975
  icon: Delete,
10790
10976
  size: 24,
10791
10977
  style: "icon",
@@ -11933,6 +12119,8 @@ var Conditions = function Conditions(_ref) {
11933
12119
  setValue = _useField2[2].setValue;
11934
12120
  var _useFormikContext = useFormikContext(),
11935
12121
  setFieldValue = _useFormikContext.setFieldValue;
12122
+ var _useTranslation = useTranslation(),
12123
+ t = _useTranslation.t;
11936
12124
  var elementProps = data[name] || {};
11937
12125
  var conditions = ((_field$value = field.value) === null || _field$value === void 0 ? void 0 : _field$value.value) || [];
11938
12126
  var handleAddCondition = function handleAddCondition(arrayHelpers, logicOperation) {
@@ -11992,19 +12180,19 @@ var Conditions = function Conditions(_ref) {
11992
12180
  size: 24,
11993
12181
  style: "icon",
11994
12182
  tooltipProps: {
11995
- content: t$2("neetoRules.form.addCondition"),
12183
+ content: t("neetoRules.form.addCondition"),
11996
12184
  position: "top"
11997
12185
  },
11998
12186
  onClick: function onClick() {
11999
12187
  return handleAddCondition(arrayHelpers, condition.joinType);
12000
12188
  }
12001
12189
  }), /*#__PURE__*/React__default.createElement(Button, {
12002
- "data-cy": "delete-condition-button",
12190
+ "data-cy": "delete-condition-button-".concat(index),
12003
12191
  icon: Delete,
12004
12192
  size: 24,
12005
12193
  style: "icon",
12006
12194
  tooltipProps: {
12007
- content: t$2("neetoRules.common.delete"),
12195
+ content: t("neetoRules.common.delete"),
12008
12196
  position: "top"
12009
12197
  },
12010
12198
  onClick: function onClick() {
@@ -12014,7 +12202,7 @@ var Conditions = function Conditions(_ref) {
12014
12202
  }), isEmpty(conditions) && /*#__PURE__*/React__default.createElement(Button, {
12015
12203
  className: "neeto-ui-text-gray-600 mr-auto",
12016
12204
  "data-cy": "add-condition-button",
12017
- label: t$2("neetoRules.form.addCondition"),
12205
+ label: t("neetoRules.form.addCondition"),
12018
12206
  style: "text",
12019
12207
  onClick: function onClick() {
12020
12208
  return handleAddCondition(arrayHelpers, OPERATORS$1.or);
@@ -12023,7 +12211,7 @@ var Conditions = function Conditions(_ref) {
12023
12211
  className: "mt-2",
12024
12212
  "data-cy": "preview-callback-button",
12025
12213
  icon: Eye,
12026
- label: t$2("neetoRules.common.preview"),
12214
+ label: t("neetoRules.common.preview"),
12027
12215
  style: "secondary",
12028
12216
  onClick: function onClick() {
12029
12217
  return previewCallback(conditions);