@qualtrics/plugin-ui-react 1.2.4-alpha → 1.3.2-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.es.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @license @qualtrics/plugin-ui-react 1.2.4-alpha
1
+ /*! @license @qualtrics/plugin-ui-react 1.3.2-alpha.0
2
2
  Qualtrics Software License Agreement
3
3
 
4
4
  1. General.
@@ -55,17 +55,17 @@ import 'core-js/modules/es.array.find-index.js';
55
55
  import 'core-js/modules/es.array.splice.js';
56
56
  import 'core-js/modules/es.array.for-each.js';
57
57
  import 'core-js/modules/web.dom-collections.for-each.js';
58
- import React, { Component, useState, useEffect, useRef } from 'react';
58
+ import React, { Component, useState, useEffect, useRef, useCallback } from 'react';
59
59
  import _get from 'lodash.get';
60
60
  import { Button, InputGroup, Input, Icon, IconTypes, LoadingSpinner, IconButton, Tooltip, SelectMenu, MenuItem, Label } from '@qualtrics/ui-react';
61
61
  import { ErrorIcon, PipedTextIcon, RemoveItemIcon } from '@qualtrics/ui-react/icons';
62
62
  import 'core-js/modules/es.string.anchor.js';
63
- import _cloneDeep from 'lodash.clonedeep';
64
63
  import 'core-js/modules/es.string.trim.js';
65
64
  import 'core-js/modules/es.array.map.js';
66
65
  import 'core-js/modules/es.array.concat.js';
67
66
  import 'core-js/modules/es.array.filter.js';
68
67
  import 'regenerator-runtime/runtime.js';
68
+ import _cloneDeep from 'lodash.clonedeep';
69
69
  import 'core-js/modules/es.array.is-array.js';
70
70
  import { Manager, Reference, Popper } from 'react-popper';
71
71
  import ReactDOM from 'react-dom';
@@ -76,6 +76,7 @@ import 'core-js/modules/es.array.iterator.js';
76
76
  import 'core-js/modules/web.dom-collections.iterator.js';
77
77
  import 'core-js/modules/es.array.find.js';
78
78
  import 'core-js/modules/es.object.assign.js';
79
+ import _cloneDeepWith from 'lodash.clonedeepwith';
79
80
  import uuid from 'uuid';
80
81
  import 'core-js/modules/es.regexp.exec.js';
81
82
  import 'core-js/modules/es.string.search.js';
@@ -292,6 +293,8 @@ function _assertThisInitialized(self) {
292
293
  function _possibleConstructorReturn(self, call) {
293
294
  if (call && (typeof call === "object" || typeof call === "function")) {
294
295
  return call;
296
+ } else if (call !== void 0) {
297
+ throw new TypeError("Derived constructors may only return object or undefined");
295
298
  }
296
299
 
297
300
  return _assertThisInitialized(self);
@@ -337,7 +340,7 @@ function _iterableToArray(iter) {
337
340
  }
338
341
 
339
342
  function _iterableToArrayLimit(arr, i) {
340
- var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
343
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
341
344
 
342
345
  if (_i == null) return;
343
346
  var _arr = [];
@@ -575,8 +578,8 @@ var languageCodeMapping = {
575
578
  RU: 'ru',
576
579
  SV: 'sv',
577
580
  TH: 'th',
578
- 'ZH-S': 'zh-HANS',
579
- 'ZH-T': 'zh-HANT'
581
+ 'ZH-S': 'zh-Hans',
582
+ 'ZH-T': 'zh-Hant'
580
583
  };
581
584
  function languageCodeAdapter(languageCode) {
582
585
  var adaptedCode;
@@ -678,7 +681,7 @@ var DEFAULT_PLACEMENT = 'bottom-start';
678
681
  var DEFAULT_ANCHOR = React.createElement(Button, null, " anchor ");
679
682
  var defaultModifiers = [];
680
683
  initGlobalListener();
681
- function Popover(props, ref) {
684
+ function Popover(props) {
682
685
  var _useState = useState(false),
683
686
  _useState2 = _slicedToArray(_useState, 2),
684
687
  isOpen = _useState2[0],
@@ -875,7 +878,7 @@ var css_248z$8 = "div[role=\"menu\"] .piped-text-search-input-container {\n pad
875
878
  styleInject(css_248z$8);
876
879
 
877
880
  var EMBEDDED_DATA_LOCATOR = 'embeddedData';
878
- var PipedTextMenu = React.forwardRef(function (props, ref) {
881
+ var PipedTextMenu = React.forwardRef(function PipedTextMenu(props, ref) {
879
882
  var defaultMenuItems = undefined;
880
883
 
881
884
  if (typeof props.items !== 'function') {
@@ -904,8 +907,47 @@ var PipedTextMenu = React.forwardRef(function (props, ref) {
904
907
  searchValue = _useState8[0],
905
908
  setSearchValue = _useState8[1];
906
909
 
907
- var onClose = props.onClose || function () {};
910
+ var _useState9 = useState(undefined),
911
+ _useState10 = _slicedToArray(_useState9, 2),
912
+ isSubmenu = _useState10[0],
913
+ setIsSubmenu = _useState10[1];
914
+
915
+ var onClose = props.onClose || function () {
916
+ return undefined;
917
+ };
918
+
919
+ var _useState11 = useState(null),
920
+ _useState12 = _slicedToArray(_useState11, 2),
921
+ popoverEl = _useState12[0],
922
+ setPopoverEl = _useState12[1];
923
+
924
+ var popoverRefCb = useCallback(function (el) {
925
+ setPopoverEl(el);
926
+ }, []);
927
+
928
+ var _useState13 = useState(null),
929
+ _useState14 = _slicedToArray(_useState13, 2),
930
+ searchBoxEl = _useState14[0],
931
+ setSearchBoxEl = _useState14[1];
932
+
933
+ var searchBoxRefCb = useCallback(function (el) {
934
+ setSearchBoxEl(el);
935
+ }, []);
936
+ useEffect(function () {
937
+ var anchorRefEl = _get(props, 'anchorRef.current');
938
+
939
+ if (anchorRefEl) {
940
+ var anchorRefElRole = anchorRefEl.getAttribute('role');
941
+ var nextIsSubmenu = anchorRefElRole === 'menuitem';
942
+ setIsSubmenu(nextIsSubmenu);
943
+ }
908
944
 
945
+ if (isSubmenu === true) ; else if (isSubmenu === false) {
946
+ if (popoverEl !== null) {
947
+ popoverEl.focus();
948
+ }
949
+ }
950
+ }, [popoverEl, searchBoxEl, props.anchorRef, isSubmenu]);
909
951
  useEffect(function () {
910
952
  _asyncToGenerator(regeneratorRuntime.mark(function _callee() {
911
953
  var newMenuItems;
@@ -1000,6 +1042,10 @@ var PipedTextMenu = React.forwardRef(function (props, ref) {
1000
1042
  setSearchValue(searchVal);
1001
1043
  };
1002
1044
 
1045
+ var handleSearchInputClick = function handleSearchInputClick(evt) {
1046
+ evt.stopPropagation();
1047
+ };
1048
+
1003
1049
  var matchesSearch = function matchesSearch(item) {
1004
1050
  var searchVal = searchValue || '';
1005
1051
  searchVal = searchVal.trim().toLowerCase();
@@ -1029,11 +1075,12 @@ var PipedTextMenu = React.forwardRef(function (props, ref) {
1029
1075
  props.onSelected(edMenuItem);
1030
1076
  };
1031
1077
 
1032
- var getSubmenuItem = function getSubmenuItem(menuItem) {
1078
+ var SubmenuItem = function SubmenuItem(props) {
1079
+ var submenuAnchorRef = useRef(null);
1080
+ var menuItem = props.menuItem;
1033
1081
  return React.createElement("div", {
1034
1082
  "data-testid": "piped-text-submenu",
1035
- className: "piped-text-submenu-item-container",
1036
- key: menuItem.key
1083
+ className: "piped-text-submenu-item-container"
1037
1084
  }, menuItem.show && React.createElement(PipedTextMenu, {
1038
1085
  items: menuItem.submenu.items,
1039
1086
  show: menuItem.show,
@@ -1052,12 +1099,16 @@ var PipedTextMenu = React.forwardRef(function (props, ref) {
1052
1099
  ref: ref,
1053
1100
  className: "piped-text-submenu-anchor"
1054
1101
  });
1055
- }
1102
+ },
1103
+ anchorRef: submenuAnchorRef
1056
1104
  }), React.createElement("div", {
1057
1105
  className: "piped-text-submenu-item",
1106
+ "aria-haspopup": "menu",
1107
+ role: "menuitem",
1058
1108
  onMouseEnter: function onMouseEnter($e) {
1059
1109
  return submenuHovered(menuItem);
1060
- }
1110
+ },
1111
+ ref: submenuAnchorRef
1061
1112
  }, React.createElement("div", {
1062
1113
  className: "label-text"
1063
1114
  }, menuItem.label), React.createElement("div", {
@@ -1079,7 +1130,10 @@ var PipedTextMenu = React.forwardRef(function (props, ref) {
1079
1130
  var menuItemHeaderClass, menuItemDisabledClass, menuItemClassName;
1080
1131
 
1081
1132
  if (menuItem.hasSubmenu) {
1082
- return getSubmenuItem(menuItem);
1133
+ return React.createElement(SubmenuItem, {
1134
+ key: menuItem.key,
1135
+ menuItem: menuItem
1136
+ });
1083
1137
  } else if (menuItem.header === true || menuItem.disabled === true) {
1084
1138
  menuItemHeaderClass = menuItem.header === true ? 'piped-text-header' : '';
1085
1139
  menuItemDisabledClass = menuItem.disabled === true ? 'piped-text-disabled' : '';
@@ -1177,7 +1231,7 @@ var PipedTextMenu = React.forwardRef(function (props, ref) {
1177
1231
  } else {
1178
1232
  var itemsToRender = (menuItems || []).filter(matchesSearch);
1179
1233
  return React.createElement("div", {
1180
- className: "piped-text-popover-container"
1234
+ className: "piped-text-popover-menu"
1181
1235
  }, React.createElement("div", {
1182
1236
  className: "piped-text-search-input"
1183
1237
  }, React.createElement("form", {
@@ -1190,7 +1244,11 @@ var PipedTextMenu = React.forwardRef(function (props, ref) {
1190
1244
  value: searchValue,
1191
1245
  onChange: function onChange($e) {
1192
1246
  return onSearchInputChange($e);
1193
- }
1247
+ },
1248
+ onClick: function onClick($e) {
1249
+ return handleSearchInputClick($e);
1250
+ },
1251
+ ref: searchBoxRefCb
1194
1252
  }))), menuItems === undefined ? getLoadingSpinner() : getPipedTextMenuItems(itemsToRender));
1195
1253
  }
1196
1254
  };
@@ -1204,10 +1262,23 @@ var PipedTextMenu = React.forwardRef(function (props, ref) {
1204
1262
  anchor: props.anchor,
1205
1263
  ignoreClickSelector: props.ignoreClickSelector
1206
1264
  }, React.createElement("div", {
1207
- className: "piped-text-popover-container"
1265
+ className: "piped-text-popover-container",
1266
+ ref: popoverRefCb,
1267
+ onFocus: function onFocus($e) {
1268
+ return handleFocus($e);
1269
+ },
1270
+ tabIndex: props.tabIndex !== undefined ? props.tabIndex : -1
1208
1271
  }, getMenuContent()), React.createElement(OptionsPlaceholder, {
1209
1272
  optionsRef: optionsRef
1210
1273
  })));
1274
+
1275
+ function handleFocus(evt) {
1276
+ if (!isSubmenu && searchBoxEl !== null) {
1277
+ searchBoxEl.focus();
1278
+ }
1279
+
1280
+ evt.stopPropagation();
1281
+ }
1211
1282
  });
1212
1283
 
1213
1284
  function OptionsPlaceholder() {
@@ -1268,23 +1339,8 @@ function PipedTextSelect(props) {
1268
1339
  pipedTextItems = _useState4[0],
1269
1340
  setPipedTextItems = _useState4[1];
1270
1341
 
1271
- function initializePipedText() {
1272
- if (props.items) {
1273
- return pipedTextDataAdapter(props.items);
1274
- }
1275
- }
1276
-
1277
- var onClose = function onClose() {
1278
- if (props.onClose) {
1279
- props.onClose();
1280
- }
1281
- };
1282
-
1283
- var onSelect = function onSelect(selected) {
1284
- props.onSelect(selected);
1285
- onClose();
1286
- };
1287
-
1342
+ var defaultAnchorRef = useRef(null);
1343
+ var externalAnchor = props.anchor;
1288
1344
  useEffect(function () {
1289
1345
  return function () {
1290
1346
  return onClose();
@@ -1299,6 +1355,22 @@ function PipedTextSelect(props) {
1299
1355
  var formattedPipedText = initializePipedText();
1300
1356
  setPipedTextItems(formattedPipedText);
1301
1357
  }, [props.items]);
1358
+
1359
+ var onClose = function onClose() {
1360
+ if (props.onClose) {
1361
+ props.onClose();
1362
+ }
1363
+ };
1364
+
1365
+ var onSelect = function onSelect(selected) {
1366
+ props.onSelect(selected);
1367
+ onClose();
1368
+ };
1369
+
1370
+ var actualAnchor = externalAnchor !== undefined ? React.cloneElement(externalAnchor, {
1371
+ ref: externalAnchor.ref
1372
+ }) : defaultAnchor(defaultAnchorRef);
1373
+ var anchorRef = props.anchorRef || actualAnchor.ref;
1302
1374
  return React.createElement("div", {
1303
1375
  className: "piped-text-dropdown"
1304
1376
  }, isMenuOpen && React.createElement(PipedTextMenu, {
@@ -1306,9 +1378,16 @@ function PipedTextSelect(props) {
1306
1378
  show: isMenuOpen,
1307
1379
  onSelected: onSelect,
1308
1380
  items: pipedTextItems,
1309
- anchor: props.anchor || defaultAnchor,
1381
+ anchor: actualAnchor,
1382
+ anchorRef: anchorRef,
1310
1383
  ignoreClickSelector: props.ignoreClickSelector
1311
1384
  }));
1385
+
1386
+ function initializePipedText() {
1387
+ if (props.items) {
1388
+ return pipedTextDataAdapter(props.items);
1389
+ }
1390
+ }
1312
1391
  }
1313
1392
 
1314
1393
  var css_248z$6 = ".piped-text-input .piped-text-input-toggle, .piped-text-input .piped-text-select-container {\n display: inline-block; }\n\n.piped-text-input .piped-text-input-toggle {\n display: flex; }\n .piped-text-input .piped-text-input-toggle input {\n flex: 1 1;\n box-sizing: border-box; }\n .piped-text-input .piped-text-input-toggle input:first-child {\n border-right: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0; }\n .piped-text-input .piped-text-input-toggle.multiline-input textarea {\n flex: 1 1;\n box-sizing: border-box; }\n .piped-text-input .piped-text-input-toggle input + button, .piped-text-input .piped-text-input-toggle textarea + button {\n margin-left: 4px; }\n\n.piped-text-input .addon-text-container {\n /*\n These styles are intended to match CFE QDS components,\n notably FormField and InputField.\n See: https://gitlab-app.eng.qops.net/cfe/ui/-/blob/master/packages/ui-react/src/FormField/Caption.less\n */\n margin-top: 6px; }\n .piped-text-input .addon-text-container .helper-text, .piped-text-input .addon-text-container .error-text {\n font-size: 12px; }\n .piped-text-input .addon-text-container .helper-text {\n color: #74777a;\n fill: #74777a; }\n .piped-text-input .addon-text-container .helper-text + .error-text {\n margin-top: 4px; }\n .piped-text-input .addon-text-container .error-text {\n display: flex;\n align-items: center;\n color: #b00;\n fill: #b00; }\n .piped-text-input .addon-text-container .error-text .error-text-icon svg {\n margin-left: -2px;\n margin-right: 3px;\n width: 16px;\n height: 16px; }\n";
@@ -1317,6 +1396,7 @@ styleInject(css_248z$6);
1317
1396
  function PipedTextInput(props) {
1318
1397
  var _a = useState(false), showMenu = _a[0], setShowMenu = _a[1];
1319
1398
  var _b = useState(), cursorPosition = _b[0], setCursorPosition = _b[1];
1399
+ var pipedTextButtonRef = useRef(null);
1320
1400
  /*
1321
1401
  This has to be an Object type ref instead of 'string' or React will lose
1322
1402
  track of state, and the supplied props input value will become stale
@@ -1351,10 +1431,10 @@ function PipedTextInput(props) {
1351
1431
  React.createElement(Input, __assign({ value: inputRefValue.value, onChange: function (evt) {
1352
1432
  onInputChange(evt);
1353
1433
  }, onBlur: onInputBlur, placeholder: placeholder, multiline: multiline }, restProps)),
1354
- React.createElement(IconButton, { "aria-label": "PipedText", size: "medium", onClick: toggleMenu },
1434
+ React.createElement(IconButton, { "aria-label": "PipedText", "aria-haspopup": "menu", "aria-expanded": showMenu ? true : undefined, role: "button", size: "medium", onClick: toggleMenu, ref: pipedTextButtonRef },
1355
1435
  React.createElement(PipedTextIcon, null)),
1356
1436
  React.createElement("div", { className: "piped-text-select-container" },
1357
- React.createElement(PipedTextSelect, { items: items, onSelect: pipedTextSelected, show: showMenu, onClose: handleClose, ignoreClickSelector: "piped-text-input-toggle" }))),
1437
+ React.createElement(PipedTextSelect, { items: items, onSelect: pipedTextSelected, show: showMenu, onClose: handleClose, ignoreClickSelector: "piped-text-input-toggle", anchorRef: pipedTextButtonRef }))),
1358
1438
  showAddonText() && (React.createElement("div", { className: "addon-text-container" },
1359
1439
  helperText && (React.createElement("div", { className: "helper-text" }, helperText)),
1360
1440
  errorText && (React.createElement("div", { className: "error-text" },
@@ -1509,13 +1589,28 @@ function FieldRow(props) {
1509
1589
  }
1510
1590
 
1511
1591
  if (props.required || !props.children || Array.isArray(children) && children.length === 0) {
1512
- return React.createElement("div", {
1513
- className: "required-indicator-container"
1514
- }, React.createElement("div", {
1515
- className: "required-indicator-text"
1516
- }, props.fieldName), props.required && React.createElement("div", {
1517
- className: "required-indicator-symbol"
1518
- }, "*"));
1592
+ if (props.subMenu) {
1593
+ return React.createElement(SelectMenu, {
1594
+ searchable: props.searchable !== undefined && props.searchable !== false,
1595
+ defaultLabel: props.fieldName || '',
1596
+ label: props.fieldName,
1597
+ className: "full-width left-align",
1598
+ onChange: handleFieldSwitch
1599
+ }, createMenuItems([{
1600
+ id: props.id,
1601
+ name: props.fieldName,
1602
+ subMenu: props.subMenu,
1603
+ subMenuLabel: props.subMenuLabel
1604
+ }]));
1605
+ } else {
1606
+ return React.createElement("div", {
1607
+ className: "required-indicator-container"
1608
+ }, React.createElement("div", {
1609
+ className: "required-indicator-text"
1610
+ }, props.fieldName), props.required && React.createElement("div", {
1611
+ className: "required-indicator-symbol"
1612
+ }, "*"));
1613
+ }
1519
1614
  }
1520
1615
 
1521
1616
  return React.createElement(SelectMenu, {
@@ -1524,12 +1619,7 @@ function FieldRow(props) {
1524
1619
  label: props.fieldName,
1525
1620
  className: "full-width left-align",
1526
1621
  onChange: handleFieldSwitch
1527
- }, children.map(function (field) {
1528
- return React.createElement(MenuItem, {
1529
- value: field.id,
1530
- key: field.id
1531
- }, field.name);
1532
- }));
1622
+ }, createMenuItems(children));
1533
1623
  };
1534
1624
 
1535
1625
  var tooltipContent = React.createElement("div", null, props.nameTooltip);
@@ -1540,6 +1630,22 @@ function FieldRow(props) {
1540
1630
  }, React.createElement("div", null, getInternalContent()));
1541
1631
  };
1542
1632
 
1633
+ var createMenuItems = function createMenuItems(items) {
1634
+ return items.map(function (_ref) {
1635
+ var id = _ref.id,
1636
+ name = _ref.name,
1637
+ subMenu = _ref.subMenu,
1638
+ subMenuLabel = _ref.subMenuLabel;
1639
+ return subMenu !== undefined ? React.createElement(SelectMenu, {
1640
+ label: subMenuLabel ? subMenuLabel : name,
1641
+ key: id
1642
+ }, createMenuItems(subMenu)) : React.createElement(MenuItem, {
1643
+ key: id,
1644
+ value: id
1645
+ }, name);
1646
+ });
1647
+ };
1648
+
1543
1649
  var getFieldInput = function getFieldInput() {
1544
1650
  var getInternalContent = function getInternalContent() {
1545
1651
  if (props.customInput) {
@@ -1565,7 +1671,7 @@ function FieldRow(props) {
1565
1671
  return React.createElement("div", {
1566
1672
  className: "field-row"
1567
1673
  }, React.createElement("div", {
1568
- className: "field-selector ".concat(props.required ? 'required-field' : '')
1674
+ className: "field-selector ".concat(props.required && !props.subMenu ? 'required-field' : '')
1569
1675
  }, getFieldSelector()), React.createElement("div", {
1570
1676
  className: "field-input-container"
1571
1677
  }, React.createElement("div", {
@@ -1641,6 +1747,8 @@ function TaskFields(props) {
1641
1747
  required: field.required,
1642
1748
  fieldName: field.name,
1643
1749
  id: field.id,
1750
+ subMenu: field.subMenu,
1751
+ subMenuLabel: field.subMenuLabel,
1644
1752
  nameTooltip: field.type === CUSTOM_TYPE ? _get(props, 'customFieldOptions.nameTooltip', '') : field.nameTooltip,
1645
1753
  valueTooltip: field.type === CUSTOM_TYPE ? _get(props, 'customFieldOptions.valueTooltip', '') : field.valueTooltip,
1646
1754
  onFieldNameChange: onFieldNameChange,
@@ -1654,8 +1762,24 @@ function TaskFields(props) {
1654
1762
  customNamePlaceholder: _get(props, 'customFieldOptions.namePlaceholder', ''),
1655
1763
  pipedTextItems: props.pipedTextItems,
1656
1764
  searchable: props.searchable
1657
- }, allFieldOptions && availableFields);
1765
+ }, allFieldOptions && getFieldsForFieldRow(availableFields, allFieldOptions, field.id));
1766
+ });
1767
+ };
1768
+
1769
+ var getFieldsForFieldRow = function getFieldsForFieldRow(allAvailableFields, allFields, fieldId) {
1770
+ var fieldsToAdd = allAvailableFields.slice();
1771
+ allFields.forEach(function (field) {
1772
+ if (field.subMenu !== undefined && fieldId === field.id) {
1773
+ var foundIndex = fieldsToAdd.findIndex(function (fieldToAdd) {
1774
+ return fieldToAdd.id === field.id;
1775
+ });
1776
+
1777
+ if (foundIndex === -1) {
1778
+ fieldsToAdd.push(field);
1779
+ }
1780
+ }
1658
1781
  });
1782
+ return fieldsToAdd;
1659
1783
  };
1660
1784
 
1661
1785
  var onFieldAdd = function onFieldAdd(fieldId) {
@@ -1677,7 +1801,9 @@ function TaskFields(props) {
1677
1801
  type: field.type,
1678
1802
  required: field.required,
1679
1803
  key: field.id,
1680
- id: field.id
1804
+ id: field.id,
1805
+ subMenu: field.subMenu,
1806
+ subMenuLabel: field.subMenuLabel
1681
1807
  });
1682
1808
  });
1683
1809
  };
@@ -1730,7 +1856,9 @@ function TaskFields(props) {
1730
1856
  children: foundNextChild.props.children,
1731
1857
  nameTooltip: foundNextChild.props.nameTooltip,
1732
1858
  valueTooltip: foundNextChild.props.valueTooltip,
1733
- valuePlaceholder: foundNextChild.props.valuePlaceholder
1859
+ valuePlaceholder: foundNextChild.props.valuePlaceholder,
1860
+ subMenu: foundNextChild.props.subMenu,
1861
+ subMenuLabel: foundNextChild.props.subMenuLabel
1734
1862
  });
1735
1863
  }
1736
1864
 
@@ -1751,7 +1879,9 @@ function TaskFields(props) {
1751
1879
  nameTooltip: field.props.nameTooltip,
1752
1880
  valueTooltip: field.props.valueTooltip,
1753
1881
  value: field.props.value || undefined,
1754
- valuePlaceholder: field.props.valuePlaceholder
1882
+ valuePlaceholder: field.props.valuePlaceholder,
1883
+ subMenu: field.props.subMenu,
1884
+ subMenuLabel: field.props.subMenuLabel
1755
1885
  });
1756
1886
  }
1757
1887
  });
@@ -1777,7 +1907,9 @@ function TaskFields(props) {
1777
1907
  nameTooltip: _get(props, 'customFieldOptions.nameTooltip', ''),
1778
1908
  valueTooltip: _get(props, 'customFieldOptions.valueTooltip', ''),
1779
1909
  namePlaceholder: _get(props, 'customFieldOptions.namePlaceholder', ''),
1780
- type: CUSTOM_TYPE
1910
+ type: CUSTOM_TYPE,
1911
+ subMenu: currentField.subMenu,
1912
+ subMenuLabel: currentField.subMenuLabel
1781
1913
  };
1782
1914
  nextFieldsInUse.push(customFieldValue);
1783
1915
  }
@@ -1792,7 +1924,11 @@ function TaskFields(props) {
1792
1924
  if (field !== undefined) {
1793
1925
  field.value = fieldValue.value;
1794
1926
  } else {
1795
- var newField = _cloneDeep(fieldMetadata);
1927
+ var newField = _cloneDeepWith(fieldMetadata, function (value) {
1928
+ if (React.isValidElement(value)) {
1929
+ return React.cloneElement(value);
1930
+ }
1931
+ });
1796
1932
 
1797
1933
  newField.value = fieldValue.value;
1798
1934
  fieldsInUse.push(newField);
@@ -1811,7 +1947,9 @@ function TaskFields(props) {
1811
1947
  children: childProps.children,
1812
1948
  nameTooltip: childProps.nameTooltip,
1813
1949
  valueTooltip: childProps.valueTooltip,
1814
- valuePlaceholder: childProps.valuePlaceholder
1950
+ valuePlaceholder: childProps.valuePlaceholder,
1951
+ subMenu: childProps.subMenu,
1952
+ subMenuLabel: childProps.subMenuLabel
1815
1953
  };
1816
1954
  });
1817
1955
  var nextFieldsInUse = getFieldsInUse(nextAllFieldOptions);
@@ -1846,6 +1984,7 @@ function TaskFields(props) {
1846
1984
  }, React.createElement(AddFieldButton, {
1847
1985
  label: props.addFieldLabel,
1848
1986
  onFieldAdded: onFieldAdd,
1987
+ disableAddFieldPopover: props.disableAddFieldPopover,
1849
1988
  allowCustom: props.customFieldOptions,
1850
1989
  customLabel: _get(props, 'customFieldOptions.label', ''),
1851
1990
  onCustomFieldAdded: props.customFieldOptions ? onCustomFieldAdd : function () {}
@@ -1855,6 +1994,7 @@ function TaskFields(props) {
1855
1994
  function AddFieldButton(props) {
1856
1995
  var label = props.label || '';
1857
1996
  var customLabel = props.customLabel || '';
1997
+ var disableAddFieldPopover = props.disableAddFieldPopover;
1858
1998
 
1859
1999
  var _useState7 = useState(false),
1860
2000
  _useState8 = _slicedToArray(_useState7, 2),
@@ -1876,15 +2016,30 @@ function AddFieldButton(props) {
1876
2016
  setPopoverShow(false);
1877
2017
  };
1878
2018
 
2019
+ var children = [];
2020
+
1879
2021
  var onPopoverAnchorClick = function onPopoverAnchorClick() {
1880
- setPopoverShow(!popoverShow);
2022
+ if (!disableAddFieldPopover) {
2023
+ setPopoverShow(!popoverShow);
2024
+ } else {
2025
+ props.onFieldAdded(props.children !== 0 ? getFieldIdWhenPopoverIsClicked(props.children[0].props) : '');
2026
+ }
2027
+ };
2028
+
2029
+ var getFieldIdWhenPopoverIsClicked = function getFieldIdWhenPopoverIsClicked(field) {
2030
+ if (field.subMenu) {
2031
+ return getFieldIdWhenPopoverIsClicked(field.subMenu[0]);
2032
+ } else {
2033
+ return field.id;
2034
+ }
1881
2035
  };
1882
2036
 
1883
- var children = props.children.map(function (child) {
2037
+ children = props.children.map(function (child) {
1884
2038
  return React.createElement(FieldItem, {
1885
2039
  name: child.props.name,
1886
2040
  key: child.props.id,
1887
2041
  id: child.props.id,
2042
+ subMenu: child.props.subMenu,
1888
2043
  onClick: function onClick(fieldId) {
1889
2044
  setPopoverShow(false);
1890
2045
  props.onFieldAdded(fieldId);