@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/README.md CHANGED
@@ -496,7 +496,7 @@ const initialProps = {
496
496
  {
497
497
  value: "add_tags",
498
498
  label: "Add Tags",
499
- type: "multiSelect", // Types : emailToIds, emailTo, email, dropdown, list, multiSelect, note, date, text, textarea, decimal, number, regex, longText, sms, smsToNumbers, smsTo
499
+ type: "multiSelect", // Types : emailToIds, emailTo, email, dropdown, list, multiSelect, note, date, text, textarea, decimal, number, regex, longText, sms, smsToNumbers, smsTo, sendToApi
500
500
  hideSeparator: true,
501
501
  placeholder: "Select tags",
502
502
  dropdownOptions: [
@@ -562,7 +562,7 @@ neetoRulesFrontend allows to pass custom action components from host application
562
562
 
563
563
  #### 2.10 Custom message templates
564
564
 
565
- neetoRulesFrontend allows to pass predefined email and SMS templates from host application. This enables to use templates created using neeto-message-templates-nano. Below is an example for custom message template which is being sent by neeto-form in action options.
565
+ neetoRulesFrontend allows to pass predefined email, SMS and API templates from host application. This enables to use templates created using neeto-message-templates-nano. Below is an example for custom message template which is being sent by neeto-form in action options.
566
566
 
567
567
  ```jsx
568
568
  {
@@ -31,7 +31,8 @@
31
31
  "viewLess": "View less",
32
32
  "sms": "SMS",
33
33
  "phoneNumber": "Phone number",
34
- "phoneNumbers": "Phone numbers"
34
+ "phoneNumbers": "Phone numbers",
35
+ "data": "Data"
35
36
  },
36
37
  "form": {
37
38
  "noEvents": "A rule without events will run hourly.",
@@ -135,7 +136,12 @@
135
136
  "text": "Text",
136
137
  "ruleSummary": "Automation rule summary",
137
138
  "template": "Template",
138
- "remainingItemsCount": "{{count}} more"
139
+ "remainingItemsCount": "{{count}} more",
140
+ "endpoint": "Endpoint",
141
+ "key": "Key",
142
+ "value": "Value",
143
+ "addKeyValuePair": "Add new key value pair",
144
+ "additionalData": "Additional data"
139
145
  },
140
146
  "placeholders": {
141
147
  "if": "If",
@@ -189,7 +195,8 @@
189
195
  "invalidChannel": "Could not connect to the channel, please select other options.",
190
196
  "errorInIntegration": "Could not connect to Slack! Please check the integration or remove this action otherwise the automation rule will not be able to function as intended."
191
197
  },
192
- "inValidPhoneNumber": "Phone number is invalid"
198
+ "invalidPhoneNumber": "Phone number is invalid",
199
+ "invalidUrlEntity": "{{entity}} must be a valid URL"
193
200
  },
194
201
  "conditionVerbs": {
195
202
  "is": "Is",
package/dist/index.cjs.js CHANGED
@@ -270,7 +270,8 @@ var ACTION_TYPES = {
270
270
  longText: "longText",
271
271
  sms: "sms",
272
272
  smsToNumbers: "smsToNumbers",
273
- smsTo: "smsTo"
273
+ smsTo: "smsTo",
274
+ sendToApi: "sendToApi"
274
275
  };
275
276
  var LIST_FIELD_TOOLTIP_PROPS = {
276
277
  save: {
@@ -483,7 +484,7 @@ var getActionsSchema = function getActionsSchema(element, customData) {
483
484
  return yup__namespace.object({
484
485
  phoneNumbers: selectedAction.type === ACTION_TYPES.smsToNumbers ? yup__namespace.array().required(i18next.t("neetoRules.validations.required.entity", {
485
486
  entity: i18next.t("neetoRules.common.phoneNumber")
486
- })).of(yup__namespace.string().test("testPhoneNumber", i18next.t("neetoRules.validations.inValidPhoneNumber"), function (value) {
487
+ })).of(yup__namespace.string().test("testPhoneNumber", i18next.t("neetoRules.validations.invalidPhoneNumber"), function (value) {
487
488
  return PhoneNumber.isPhoneNumberValid(value);
488
489
  })) : schema,
489
490
  body: yup__namespace.string().test("body", i18next.t("neetoRules.validations.required.body"), function (value) {
@@ -491,6 +492,14 @@ var getActionsSchema = function getActionsSchema(element, customData) {
491
492
  }),
492
493
  value: selectedAction.type === ACTION_TYPES.smsTo ? yup__namespace.string().required(i18next.t("neetoRules.validations.required.value")) : schema
493
494
  });
495
+ } else if (ACTION_TYPES.sendToApi === (selectedAction === null || selectedAction === void 0 ? void 0 : selectedAction.type)) {
496
+ return yup__namespace.object({
497
+ endpoint: yup__namespace.string().url(i18next.t("neetoRules.validations.invalidUrlEntity", {
498
+ entity: i18next.t("neetoRules.labels.endpoint")
499
+ })).required(i18next.t("neetoRules.validations.required.entity", {
500
+ entity: i18next.t("neetoRules.labels.endpoint")
501
+ }))
502
+ });
494
503
  } else if (ACTION_TYPES.multiSelect === (selectedAction === null || selectedAction === void 0 ? void 0 : selectedAction.type)) {
495
504
  return yup__namespace.object({
496
505
  value: yup__namespace.array().min(1, i18next.t("neetoRules.validations.atLeastOneValue")).required(i18next.t("neetoRules.validations.atLeastOneValue"))
@@ -731,7 +740,8 @@ var NeetoRules$2 = function NeetoRules(_ref) {
731
740
  className: "mr-2",
732
741
  htmlType: "submit",
733
742
  disabled: isSubmitting || !dirty,
734
- onClick: function onClick() {}
743
+ onClick: function onClick() {},
744
+ "data-cy": "form-submit-button"
735
745
  }
736
746
  })));
737
747
  });
@@ -1218,6 +1228,247 @@ var LongTextField = function LongTextField(_ref) {
1218
1228
  }))));
1219
1229
  };
1220
1230
 
1231
+ function _extends$1() {
1232
+ _extends$1 = Object.assign ? Object.assign.bind() : function (target) {
1233
+ for (var i = 1; i < arguments.length; i++) {
1234
+ var source = arguments[i];
1235
+ for (var key in source) {
1236
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
1237
+ target[key] = source[key];
1238
+ }
1239
+ }
1240
+ }
1241
+ return target;
1242
+ };
1243
+ return _extends$1.apply(this, arguments);
1244
+ }
1245
+
1246
+ var _excluded$f = ["initialFocusRef", "name", "label"];
1247
+ var InputField$2 = function InputField(_ref) {
1248
+ var initialFocusRef = _ref.initialFocusRef,
1249
+ name = _ref.name,
1250
+ label = _ref.label,
1251
+ otherProps = _objectWithoutProperties$1(_ref, _excluded$f);
1252
+ var _useField = formik.useField(name),
1253
+ _useField2 = _slicedToArray$1(_useField, 2),
1254
+ field = _useField2[0],
1255
+ meta = _useField2[1];
1256
+ return /*#__PURE__*/React__default["default"].createElement(neetoui.Input, _extends$1({
1257
+ label: label,
1258
+ type: "text"
1259
+ }, field, {
1260
+ error: meta.touched ? meta.error : "",
1261
+ ref: initialFocusRef
1262
+ }, otherProps));
1263
+ };
1264
+
1265
+ var ADDITIONAL_DATA_INITIAL_VALUE = {
1266
+ key: "",
1267
+ value: ""
1268
+ };
1269
+ var SAMPLE_ENDPOINT = "https://example.com";
1270
+
1271
+ var addOption = function addOption(arrayHelpers) {
1272
+ return arrayHelpers.push(ADDITIONAL_DATA_INITIAL_VALUE);
1273
+ };
1274
+ var removeOption = function removeOption(_ref) {
1275
+ var arrayHelpers = _ref.arrayHelpers,
1276
+ index = _ref.index,
1277
+ data = _ref.data;
1278
+ arrayHelpers.remove(index);
1279
+ if (data.length === 1) {
1280
+ addOption(arrayHelpers);
1281
+ }
1282
+ };
1283
+ var hasKeyOrValue = ramda.whereAny({
1284
+ key: neetoCist.isNotEmpty,
1285
+ value: neetoCist.isNotEmpty
1286
+ });
1287
+
1288
+ var setEditorContent = function setEditorContent(ref, content) {
1289
+ if (!ref.current) return;
1290
+ ref.current.editor.commands.setContent(content);
1291
+ };
1292
+
1293
+ // eslint-disable-next-line react-hooks/rules-of-hooks
1294
+ var dotPath = ramda.useWith(ramda.path, [ramda.split(".")]);
1295
+
1296
+ var KeyValuePairsField = reactUtils.withT(function (_ref) {
1297
+ var t = _ref.t,
1298
+ name = _ref.name,
1299
+ _ref$label = _ref.label,
1300
+ label = _ref$label === void 0 ? "" : _ref$label;
1301
+ return /*#__PURE__*/React__default["default"].createElement(formik.FieldArray, {
1302
+ name: name
1303
+ }, function (arrayHelpers) {
1304
+ var data = dotPath(name, arrayHelpers.form.values);
1305
+ var showDeleteButton = data.length > 1 || hasKeyOrValue(data[0]);
1306
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1307
+ className: "space-y-3"
1308
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Label, null, label), data.map(function (_, index) {
1309
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1310
+ className: "flex h-8 space-x-3",
1311
+ key: index
1312
+ }, /*#__PURE__*/React__default["default"].createElement(InputField$2, {
1313
+ className: "w-2/5",
1314
+ name: "".concat(name, ".").concat(index, ".key"),
1315
+ placeholder: t("neetoRules.labels.key")
1316
+ }), /*#__PURE__*/React__default["default"].createElement(InputField$2, {
1317
+ className: "w-3/5",
1318
+ name: "".concat(name, ".").concat(index, ".value"),
1319
+ placeholder: t("neetoRules.labels.value"),
1320
+ suffix: showDeleteButton && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
1321
+ icon: neetoIcons.Delete,
1322
+ size: "small",
1323
+ style: "text",
1324
+ onClick: function onClick() {
1325
+ return removeOption({
1326
+ arrayHelpers: arrayHelpers,
1327
+ index: index,
1328
+ data: data
1329
+ });
1330
+ }
1331
+ })
1332
+ }));
1333
+ }), /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
1334
+ label: t("neetoRules.labels.addKeyValuePair"),
1335
+ style: "secondary",
1336
+ onClick: function onClick() {
1337
+ return addOption(arrayHelpers);
1338
+ }
1339
+ }));
1340
+ });
1341
+ });
1342
+
1343
+ var SelectTemplateField = function SelectTemplateField(_ref) {
1344
+ var selectedField = _ref.selectedField,
1345
+ templates = _ref.templates,
1346
+ onChange = _ref.onChange,
1347
+ initialFocusRef = _ref.initialFocusRef;
1348
+ var _useStateWithDependen = reactUtils.useStateWithDependency(null, [selectedField]),
1349
+ _useStateWithDependen2 = _slicedToArray$1(_useStateWithDependen, 2),
1350
+ selectedTemplate = _useStateWithDependen2[0],
1351
+ setSelectedTemplate = _useStateWithDependen2[1];
1352
+ var _useTranslation = reactI18next.useTranslation(),
1353
+ t = _useTranslation.t;
1354
+ var handleTemplateChange = function handleTemplateChange(option) {
1355
+ setSelectedTemplate(option);
1356
+ if (!option) return;
1357
+ var template = neetoCist.findBy({
1358
+ id: option.value
1359
+ }, templates);
1360
+ onChange === null || onChange === void 0 || onChange(template);
1361
+ };
1362
+ return /*#__PURE__*/React__default["default"].createElement(neetoui.Select, {
1363
+ isClearable: true,
1364
+ isSearchable: true,
1365
+ className: "mb-4",
1366
+ innerRef: initialFocusRef,
1367
+ label: t("neetoRules.labels.template"),
1368
+ options: neetoCist.renameKeys({
1369
+ name: "label",
1370
+ id: "value"
1371
+ }, templates),
1372
+ placeholder: t("neetoRules.placeholders.selectTemplate"),
1373
+ value: selectedTemplate,
1374
+ onChange: handleTemplateChange
1375
+ });
1376
+ };
1377
+
1378
+ var ApiFields = function ApiFields(_ref) {
1379
+ var _errors$actions, _touched$actions, _selectedField$separa;
1380
+ var name = _ref.name,
1381
+ selectedField = _ref.selectedField,
1382
+ index = _ref.index;
1383
+ var _useFormikContext = formik.useFormikContext(),
1384
+ errors = _useFormikContext.errors,
1385
+ touched = _useFormikContext.touched,
1386
+ setFieldValue = _useFormikContext.setFieldValue;
1387
+ var _useState = React.useState(false),
1388
+ _useState2 = _slicedToArray$1(_useState, 2),
1389
+ showPane = _useState2[0],
1390
+ setShowPane = _useState2[1];
1391
+ var initialFocusRef = React.useRef(null);
1392
+ var _useTranslation = reactI18next.useTranslation(),
1393
+ t = _useTranslation.t;
1394
+ useOnButtonPressed(initialFocusRef, function () {
1395
+ return setShowPane(false);
1396
+ });
1397
+ var isValid = errors.actions && ramda.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]) && ramda.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]);
1398
+ 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");
1399
+ var defaultLabel = (selectedField === null || selectedField === void 0 ? void 0 : selectedField.dataPlaceholder) || t("neetoRules.common.data");
1400
+ var templates = selectedField === null || selectedField === void 0 ? void 0 : selectedField.templates;
1401
+ var isTemplateSelectionEnabled = neetoCist.isPresent(templates);
1402
+ var handleTemplateChange = function handleTemplateChange(template) {
1403
+ setFieldValue("".concat(name, ".endpoint"), template.endpoint);
1404
+ setFieldValue("".concat(name, ".additionalData"), template.additionalData);
1405
+ };
1406
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
1407
+ className: "neeto-ui-text-gray-700 mt-1",
1408
+ "data-cy": "api-action-separator-text",
1409
+ style: "h5",
1410
+ weight: "normal"
1411
+ }, separator), /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
1412
+ "data-cy": "api-action-button",
1413
+ style: "h5",
1414
+ weight: "semibold",
1415
+ className: classNames__default["default"]("hover:neeto-ui-text-primary-800 neeto-ui-text-gray-800 mt-1 cursor-pointer underline", {
1416
+ "neeto-ui-text-primary-800": showPane,
1417
+ "neeto-ui-text-error-500": isValid
1418
+ }),
1419
+ onClick: function onClick() {
1420
+ return setShowPane(function (prevState) {
1421
+ return !prevState;
1422
+ });
1423
+ }
1424
+ }, defaultLabel.toLowerCase()), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane, {
1425
+ initialFocusRef: initialFocusRef,
1426
+ isOpen: showPane,
1427
+ size: "large",
1428
+ onClose: function onClose() {
1429
+ return setShowPane(false);
1430
+ }
1431
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Header, null, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
1432
+ className: "neeto-ui-text-gray-800 cursor-pointer",
1433
+ "data-cy": "api-action-pane-header-title",
1434
+ style: "h3",
1435
+ weight: "semibold"
1436
+ }, defaultLabel)), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Body, null, /*#__PURE__*/React__default["default"].createElement("div", {
1437
+ className: "w-full"
1438
+ }, isTemplateSelectionEnabled && /*#__PURE__*/React__default["default"].createElement(SelectTemplateField, {
1439
+ initialFocusRef: initialFocusRef,
1440
+ selectedField: selectedField,
1441
+ templates: templates,
1442
+ onChange: handleTemplateChange
1443
+ }), /*#__PURE__*/React__default["default"].createElement(InputField$2, {
1444
+ required: true,
1445
+ className: "mb-4",
1446
+ "data-cy": "api-action-endpoint-text-field",
1447
+ label: t("neetoRules.labels.endpoint"),
1448
+ name: "".concat(name, ".endpoint"),
1449
+ placeholder: SAMPLE_ENDPOINT,
1450
+ initialFocusRef: isTemplateSelectionEnabled ? null : initialFocusRef
1451
+ }), /*#__PURE__*/React__default["default"].createElement(KeyValuePairsField, {
1452
+ label: t("neetoRules.labels.additionalData"),
1453
+ name: "".concat(name, ".additionalData")
1454
+ }))), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Footer, {
1455
+ className: "flex items-center space-x-2"
1456
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
1457
+ "data-cy": "save-changes-button",
1458
+ label: t("neetoRules.common.saveChange"),
1459
+ onClick: function onClick() {
1460
+ return setShowPane(false);
1461
+ }
1462
+ }), /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
1463
+ "data-cy": "cancel-button",
1464
+ label: t("neetoRules.buttons.cancel"),
1465
+ style: "text",
1466
+ onClick: function onClick() {
1467
+ return setShowPane(false);
1468
+ }
1469
+ }))));
1470
+ };
1471
+
1221
1472
  var CustomAction = function CustomAction(_ref) {
1222
1473
  var _errors$actions, _touched$actions, _selectedField$separa;
1223
1474
  var ActionComponent = _ref.ActionComponent,
@@ -1541,22 +1792,7 @@ var DropdownField$1 = function DropdownField(_ref) {
1541
1792
  }, i18next.t("neetoRules.common.noOptions")))));
1542
1793
  };
1543
1794
 
1544
- function _extends$1() {
1545
- _extends$1 = Object.assign ? Object.assign.bind() : function (target) {
1546
- for (var i = 1; i < arguments.length; i++) {
1547
- var source = arguments[i];
1548
- for (var key in source) {
1549
- if (Object.prototype.hasOwnProperty.call(source, key)) {
1550
- target[key] = source[key];
1551
- }
1552
- }
1553
- }
1554
- return target;
1555
- };
1556
- return _extends$1.apply(this, arguments);
1557
- }
1558
-
1559
- var _excluded$f = ["autoFocus", "name", "value", "label", "variables", "addons", "editorRef", "defaults"];
1795
+ var _excluded$e = ["autoFocus", "name", "value", "label", "variables", "addons", "editorRef", "defaults"];
1560
1796
  var EditorAction = function EditorAction(_ref) {
1561
1797
  var autoFocus = _ref.autoFocus,
1562
1798
  name = _ref.name,
@@ -1570,7 +1806,7 @@ var EditorAction = function EditorAction(_ref) {
1570
1806
  _ref$editorRef = _ref.editorRef,
1571
1807
  editorRef = _ref$editorRef === void 0 ? null : _ref$editorRef,
1572
1808
  defaults = _ref.defaults,
1573
- otherProps = _objectWithoutProperties$1(_ref, _excluded$f);
1809
+ otherProps = _objectWithoutProperties$1(_ref, _excluded$e);
1574
1810
  var _useFormikContext = formik.useFormikContext(),
1575
1811
  setFieldValue = _useFormikContext.setFieldValue;
1576
1812
  var _useState = React.useState(value),
@@ -1621,30 +1857,6 @@ var EmailIdFields = function EmailIdFields(_ref) {
1621
1857
  }));
1622
1858
  };
1623
1859
 
1624
- var _excluded$e = ["initialFocusRef", "name", "label"];
1625
- var InputField$2 = function InputField(_ref) {
1626
- var initialFocusRef = _ref.initialFocusRef,
1627
- name = _ref.name,
1628
- label = _ref.label,
1629
- otherProps = _objectWithoutProperties$1(_ref, _excluded$e);
1630
- var _useField = formik.useField(name),
1631
- _useField2 = _slicedToArray$1(_useField, 2),
1632
- field = _useField2[0],
1633
- meta = _useField2[1];
1634
- return /*#__PURE__*/React__default["default"].createElement(neetoui.Input, _extends$1({
1635
- label: label,
1636
- type: "text"
1637
- }, field, {
1638
- error: meta.touched ? meta.error : "",
1639
- ref: initialFocusRef
1640
- }, otherProps));
1641
- };
1642
-
1643
- var setEditorContent = function setEditorContent(ref, content) {
1644
- if (!ref.current) return;
1645
- ref.current.editor.commands.setContent(content);
1646
- };
1647
-
1648
1860
  var EmailFields = function EmailFields(_ref) {
1649
1861
  var _errors$actions, _touched$actions, _selectedField$separa, _action$metadata;
1650
1862
  var _ref$isEmailIdField = _ref.isEmailIdField,
@@ -1663,10 +1875,6 @@ var EmailFields = function EmailFields(_ref) {
1663
1875
  _useState2 = _slicedToArray$1(_useState, 2),
1664
1876
  showPane = _useState2[0],
1665
1877
  setShowPane = _useState2[1];
1666
- var _useStateWithDependen = reactUtils.useStateWithDependency(null, [selectedField]),
1667
- _useStateWithDependen2 = _slicedToArray$1(_useStateWithDependen, 2),
1668
- selectedTemplate = _useStateWithDependen2[0],
1669
- setSelectedTemplate = _useStateWithDependen2[1];
1670
1878
  var initialFocusRef = React.useRef(null);
1671
1879
  var editorRef = React.useRef(null);
1672
1880
  var _useTranslation = reactI18next.useTranslation(),
@@ -1679,12 +1887,7 @@ var EmailFields = function EmailFields(_ref) {
1679
1887
  var defaultLabel = (selectedField === null || selectedField === void 0 ? void 0 : selectedField.emailPlaceholder) || t("neetoRules.common.email");
1680
1888
  var templates = selectedField === null || selectedField === void 0 ? void 0 : selectedField.templates;
1681
1889
  var isTemplateSelectionEnabled = neetoCist.isPresent(templates);
1682
- var handleTemplateChange = function handleTemplateChange(option) {
1683
- setSelectedTemplate(option);
1684
- if (!option) return;
1685
- var template = neetoCist.findBy({
1686
- id: option.value
1687
- }, templates);
1890
+ var handleTemplateChange = function handleTemplateChange(template) {
1688
1891
  setFieldValue("".concat(name, ".body"), template.body);
1689
1892
  setEditorContent(editorRef, template.body);
1690
1893
  if (selectedField.hideSubject) return;
@@ -1735,18 +1938,10 @@ var EmailFields = function EmailFields(_ref) {
1735
1938
  weight: "semibold"
1736
1939
  }, defaultLabel)), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Body, null, /*#__PURE__*/React__default["default"].createElement("div", {
1737
1940
  className: "w-full"
1738
- }, isTemplateSelectionEnabled && /*#__PURE__*/React__default["default"].createElement(neetoui.Select, {
1739
- isClearable: true,
1740
- isSearchable: true,
1741
- className: "mb-4",
1742
- innerRef: initialFocusRef,
1743
- label: t("neetoRules.labels.template"),
1744
- options: neetoCist.renameKeys({
1745
- name: "label",
1746
- id: "value"
1747
- }, templates),
1748
- placeholder: t("neetoRules.placeholders.selectTemplate"),
1749
- value: selectedTemplate,
1941
+ }, isTemplateSelectionEnabled && /*#__PURE__*/React__default["default"].createElement(SelectTemplateField, {
1942
+ initialFocusRef: initialFocusRef,
1943
+ selectedField: selectedField,
1944
+ templates: templates,
1750
1945
  onChange: handleTemplateChange
1751
1946
  }), isEmailIdField && /*#__PURE__*/React__default["default"].createElement(EmailIdFields, {
1752
1947
  emails: emails,
@@ -1768,7 +1963,7 @@ var EmailFields = function EmailFields(_ref) {
1768
1963
  }))), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Footer, {
1769
1964
  className: "flex items-center space-x-2"
1770
1965
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
1771
- "data-cy": "save-changes-button",
1966
+ "data-cy": "email-action-save-changes-button",
1772
1967
  label: t("neetoRules.common.saveChange"),
1773
1968
  onClick: function onClick() {
1774
1969
  return setShowPane(false);
@@ -10125,7 +10320,7 @@ var PHONE_NUMBER_SEPARATION_REGEX = /[^\s,]+/g;
10125
10320
  var FLEXIBLE_PHONE_NUMBER_REGEX = /[0-9+, ]+/g;
10126
10321
  var PHONE_NUMBER_VALIDATION_SCHEMA = yup__namespace.string().required(i18next.t("neetoRules.validations.required.entity", {
10127
10322
  entity: i18next.t("neetoRules.common.phoneNumber")
10128
- })).test("testPhoneNumber", i18next.t("neetoRules.validations.inValidPhoneNumber"), PhoneNumber.isPhoneNumberValid);
10323
+ })).test("testPhoneNumber", i18next.t("neetoRules.validations.invalidPhoneNumber"), PhoneNumber.isPhoneNumberValid);
10129
10324
  var CUSTOM_STYLES = {
10130
10325
  input: ramda.assoc("overflow", "hidden"),
10131
10326
  multiValue: function multiValue(styles, _ref2) {
@@ -10296,10 +10491,6 @@ var SmsFields = function SmsFields(_ref) {
10296
10491
  _useState2 = _slicedToArray$1(_useState, 2),
10297
10492
  showPane = _useState2[0],
10298
10493
  setShowPane = _useState2[1];
10299
- var _useStateWithDependen = reactUtils.useStateWithDependency(null, [selectedField]),
10300
- _useStateWithDependen2 = _slicedToArray$1(_useStateWithDependen, 2),
10301
- selectedTemplate = _useStateWithDependen2[0],
10302
- setSelectedTemplate = _useStateWithDependen2[1];
10303
10494
  var initialFocusRef = React.useRef(null);
10304
10495
  var editorRef = React.useRef(null);
10305
10496
  var _useTranslation = reactI18next.useTranslation(),
@@ -10312,12 +10503,7 @@ var SmsFields = function SmsFields(_ref) {
10312
10503
  var defaultLabel = (selectedField === null || selectedField === void 0 ? void 0 : selectedField.smsPlaceholder) || t("neetoRules.common.sms");
10313
10504
  var templates = selectedField === null || selectedField === void 0 ? void 0 : selectedField.templates;
10314
10505
  var isTemplateSelectionEnabled = neetoCist.isPresent(templates);
10315
- var handleTemplateChange = function handleTemplateChange(option) {
10316
- setSelectedTemplate(option);
10317
- if (!option) return;
10318
- var template = neetoCist.findBy({
10319
- id: option.value
10320
- }, templates);
10506
+ var handleTemplateChange = function handleTemplateChange(template) {
10321
10507
  setFieldValue("".concat(name, ".body"), template.body);
10322
10508
  setEditorContent(editorRef, template.body);
10323
10509
  };
@@ -10359,18 +10545,10 @@ var SmsFields = function SmsFields(_ref) {
10359
10545
  weight: "semibold"
10360
10546
  }, defaultLabel)), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Body, null, /*#__PURE__*/React__default["default"].createElement("div", {
10361
10547
  className: "w-full"
10362
- }, isTemplateSelectionEnabled && /*#__PURE__*/React__default["default"].createElement(neetoui.Select, {
10363
- isClearable: true,
10364
- isSearchable: true,
10365
- className: "mb-4",
10366
- innerRef: initialFocusRef,
10367
- label: t("neetoRules.labels.template"),
10368
- options: neetoCist.renameKeys({
10369
- name: "label",
10370
- id: "value"
10371
- }, templates),
10372
- placeholder: t("neetoRules.placeholders.selectTemplate"),
10373
- value: selectedTemplate,
10548
+ }, isTemplateSelectionEnabled && /*#__PURE__*/React__default["default"].createElement(SelectTemplateField, {
10549
+ initialFocusRef: initialFocusRef,
10550
+ selectedField: selectedField,
10551
+ templates: templates,
10374
10552
  onChange: handleTemplateChange
10375
10553
  }), showPhoneNumberInput && /*#__PURE__*/React__default["default"].createElement(PhoneNumberField, {
10376
10554
  phoneNumbers: phoneNumbers,
@@ -10484,6 +10662,14 @@ var ActionSubItems = function ActionSubItems(_ref) {
10484
10662
  key: name
10485
10663
  }));
10486
10664
  }
10665
+ if ((selectedField === null || selectedField === void 0 ? void 0 : selectedField.type) === ACTION_TYPES.sendToApi) {
10666
+ return /*#__PURE__*/React__default["default"].createElement(ApiFields, {
10667
+ index: index,
10668
+ name: name,
10669
+ selectedField: selectedField,
10670
+ key: name
10671
+ });
10672
+ }
10487
10673
  if ((selectedField === null || selectedField === void 0 ? void 0 : selectedField.type) === ACTION_TYPES.dropdown) {
10488
10674
  return /*#__PURE__*/React__default["default"].createElement(DropdownField$1, {
10489
10675
  index: index,
@@ -10815,7 +11001,7 @@ var Actions = function Actions(_ref) {
10815
11001
  return arrayHelpers.push(DEFAULT_RULE_ACTION);
10816
11002
  }
10817
11003
  }), actions.length > 1 && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
10818
- "data-cy": "delete-action-button",
11004
+ "data-cy": "delete-action-button-".concat(index),
10819
11005
  icon: neetoIcons.Delete,
10820
11006
  size: 24,
10821
11007
  style: "icon",
@@ -11963,6 +12149,8 @@ var Conditions = function Conditions(_ref) {
11963
12149
  setValue = _useField2[2].setValue;
11964
12150
  var _useFormikContext = formik.useFormikContext(),
11965
12151
  setFieldValue = _useFormikContext.setFieldValue;
12152
+ var _useTranslation = reactI18next.useTranslation(),
12153
+ t = _useTranslation.t;
11966
12154
  var elementProps = data[name] || {};
11967
12155
  var conditions = ((_field$value = field.value) === null || _field$value === void 0 ? void 0 : _field$value.value) || [];
11968
12156
  var handleAddCondition = function handleAddCondition(arrayHelpers, logicOperation) {
@@ -12022,19 +12210,19 @@ var Conditions = function Conditions(_ref) {
12022
12210
  size: 24,
12023
12211
  style: "icon",
12024
12212
  tooltipProps: {
12025
- content: i18next.t("neetoRules.form.addCondition"),
12213
+ content: t("neetoRules.form.addCondition"),
12026
12214
  position: "top"
12027
12215
  },
12028
12216
  onClick: function onClick() {
12029
12217
  return handleAddCondition(arrayHelpers, condition.joinType);
12030
12218
  }
12031
12219
  }), /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
12032
- "data-cy": "delete-condition-button",
12220
+ "data-cy": "delete-condition-button-".concat(index),
12033
12221
  icon: neetoIcons.Delete,
12034
12222
  size: 24,
12035
12223
  style: "icon",
12036
12224
  tooltipProps: {
12037
- content: i18next.t("neetoRules.common.delete"),
12225
+ content: t("neetoRules.common.delete"),
12038
12226
  position: "top"
12039
12227
  },
12040
12228
  onClick: function onClick() {
@@ -12044,7 +12232,7 @@ var Conditions = function Conditions(_ref) {
12044
12232
  }), ramda.isEmpty(conditions) && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
12045
12233
  className: "neeto-ui-text-gray-600 mr-auto",
12046
12234
  "data-cy": "add-condition-button",
12047
- label: i18next.t("neetoRules.form.addCondition"),
12235
+ label: t("neetoRules.form.addCondition"),
12048
12236
  style: "text",
12049
12237
  onClick: function onClick() {
12050
12238
  return handleAddCondition(arrayHelpers, OPERATORS$1.or);
@@ -12053,7 +12241,7 @@ var Conditions = function Conditions(_ref) {
12053
12241
  className: "mt-2",
12054
12242
  "data-cy": "preview-callback-button",
12055
12243
  icon: neetoIcons.Eye,
12056
- label: i18next.t("neetoRules.common.preview"),
12244
+ label: t("neetoRules.common.preview"),
12057
12245
  style: "secondary",
12058
12246
  onClick: function onClick() {
12059
12247
  return previewCallback(conditions);