@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.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.
@@ -64,12 +64,12 @@ var _get = require('lodash.get');
64
64
  var uiReact = require('@qualtrics/ui-react');
65
65
  var icons = require('@qualtrics/ui-react/icons');
66
66
  require('core-js/modules/es.string.anchor.js');
67
- var _cloneDeep = require('lodash.clonedeep');
68
67
  require('core-js/modules/es.string.trim.js');
69
68
  require('core-js/modules/es.array.map.js');
70
69
  require('core-js/modules/es.array.concat.js');
71
70
  require('core-js/modules/es.array.filter.js');
72
71
  require('regenerator-runtime/runtime.js');
72
+ var _cloneDeep = require('lodash.clonedeep');
73
73
  require('core-js/modules/es.array.is-array.js');
74
74
  var reactPopper = require('react-popper');
75
75
  var ReactDOM = require('react-dom');
@@ -80,6 +80,7 @@ require('core-js/modules/es.array.iterator.js');
80
80
  require('core-js/modules/web.dom-collections.iterator.js');
81
81
  require('core-js/modules/es.array.find.js');
82
82
  require('core-js/modules/es.object.assign.js');
83
+ var _cloneDeepWith = require('lodash.clonedeepwith');
83
84
  var uuid = require('uuid');
84
85
  require('core-js/modules/es.regexp.exec.js');
85
86
  require('core-js/modules/es.string.search.js');
@@ -90,6 +91,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
90
91
  var _get__default = /*#__PURE__*/_interopDefaultLegacy(_get);
91
92
  var _cloneDeep__default = /*#__PURE__*/_interopDefaultLegacy(_cloneDeep);
92
93
  var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
94
+ var _cloneDeepWith__default = /*#__PURE__*/_interopDefaultLegacy(_cloneDeepWith);
93
95
  var uuid__default = /*#__PURE__*/_interopDefaultLegacy(uuid);
94
96
 
95
97
  function styleInject(css, ref) {
@@ -304,6 +306,8 @@ function _assertThisInitialized(self) {
304
306
  function _possibleConstructorReturn(self, call) {
305
307
  if (call && (typeof call === "object" || typeof call === "function")) {
306
308
  return call;
309
+ } else if (call !== void 0) {
310
+ throw new TypeError("Derived constructors may only return object or undefined");
307
311
  }
308
312
 
309
313
  return _assertThisInitialized(self);
@@ -349,7 +353,7 @@ function _iterableToArray(iter) {
349
353
  }
350
354
 
351
355
  function _iterableToArrayLimit(arr, i) {
352
- var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
356
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
353
357
 
354
358
  if (_i == null) return;
355
359
  var _arr = [];
@@ -587,8 +591,8 @@ var languageCodeMapping = {
587
591
  RU: 'ru',
588
592
  SV: 'sv',
589
593
  TH: 'th',
590
- 'ZH-S': 'zh-HANS',
591
- 'ZH-T': 'zh-HANT'
594
+ 'ZH-S': 'zh-Hans',
595
+ 'ZH-T': 'zh-Hant'
592
596
  };
593
597
  function languageCodeAdapter(languageCode) {
594
598
  var adaptedCode;
@@ -675,7 +679,7 @@ var Portal = function (_Component) {
675
679
  }, {
676
680
  key: "render",
677
681
  value: function render() {
678
- return ReactDOM__default['default'].createPortal(this.props.children, this.container);
682
+ return ReactDOM__default["default"].createPortal(this.props.children, this.container);
679
683
  }
680
684
  }]);
681
685
 
@@ -687,10 +691,10 @@ styleInject(css_248z$a);
687
691
 
688
692
  var globalClickRegistry = new EventRegistry();
689
693
  var DEFAULT_PLACEMENT = 'bottom-start';
690
- var DEFAULT_ANCHOR = React__default['default'].createElement(uiReact.Button, null, " anchor ");
694
+ var DEFAULT_ANCHOR = React__default["default"].createElement(uiReact.Button, null, " anchor ");
691
695
  var defaultModifiers = [];
692
696
  initGlobalListener();
693
- function Popover(props, ref) {
697
+ function Popover(props) {
694
698
  var _useState = React.useState(false),
695
699
  _useState2 = _slicedToArray(_useState, 2),
696
700
  isOpen = _useState2[0],
@@ -711,7 +715,7 @@ function Popover(props, ref) {
711
715
  anchor = props.anchor(ref);
712
716
  } else {
713
717
  anchor = props.anchor;
714
- anchor = React__default['default'].createElement("div", {
718
+ anchor = React__default["default"].createElement("div", {
715
719
  ref: ref,
716
720
  className: "popover-anchor-container"
717
721
  }, props.anchor || DEFAULT_ANCHOR);
@@ -745,7 +749,7 @@ function Popover(props, ref) {
745
749
  setIsOpen(props.show);
746
750
  }
747
751
  }, [props.show]);
748
- return React__default['default'].createElement(reactPopper.Manager, null, React__default['default'].createElement(reactPopper.Reference, null, anchorEl), React__default['default'].createElement(Portal, null, isOpen && React__default['default'].createElement(reactPopper.Popper, {
752
+ return React__default["default"].createElement(reactPopper.Manager, null, React__default["default"].createElement(reactPopper.Reference, null, anchorEl), React__default["default"].createElement(Portal, null, isOpen && React__default["default"].createElement(reactPopper.Popper, {
749
753
  placement: props.placement || DEFAULT_PLACEMENT,
750
754
  modifiers: modifiers
751
755
  }, function (_ref2) {
@@ -771,12 +775,12 @@ function Popover(props, ref) {
771
775
  optionsRef.current.scheduleUpdate = scheduleUpdate;
772
776
  }
773
777
  });
774
- return React__default['default'].createElement("div", {
778
+ return React__default["default"].createElement("div", {
775
779
  ref: ref,
776
780
  "data-placement": placement,
777
781
  style: _objectSpread2({}, style),
778
782
  className: "q-popover"
779
- }, props.children, React__default['default'].createElement("div", {
783
+ }, props.children, React__default["default"].createElement("div", {
780
784
  ref: arrowProps.ref,
781
785
  style: arrowProps.style
782
786
  }));
@@ -800,7 +804,7 @@ function initGlobalListener() {
800
804
  var css_248z$9 = "div[role=\"menu\"] .piped-text-search-input-container {\n padding: 5px 10px; }\n\n.piped-text-search-input {\n padding: 10px 12px;\n user-select: none;\n box-sizing: border-box;\n overflow-x: hidden;\n text-overflow: ellipsis;\n align-content: center;\n padding: 4px 8px 8px; }\n .piped-text-search-input input.q-plugin-popover-input {\n box-sizing: border-box;\n height: 36px;\n padding: 7px 9px; }\n\n.piped-text-menu-empty-anchor {\n /* the margin-right hack was not in harmony with tao.\n now, the empty-anchor is truly empty */ }\n\n.piped-text-submenu-item-container {\n position: relative; }\n .piped-text-submenu-item-container .piped-text-menu .piped-text-submenu-anchor {\n position: absolute;\n z-index: -1;\n bottom: 0;\n top: 0;\n left: 0;\n right: 0;\n min-width: 100%; }\n\n.piped-text-menu-item, .piped-text-submenu-item {\n padding: 10px 12px;\n user-select: none;\n box-sizing: border-box;\n overflow-x: hidden;\n text-overflow: ellipsis; }\n .piped-text-menu-item:not(.piped-text-header):not(.piped-text-disabled):hover, .piped-text-submenu-item:not(.piped-text-header):not(.piped-text-disabled):hover {\n cursor: pointer;\n background: RGBA(50, 54, 58, 0.08); }\n .piped-text-menu-item.piped-text-header, .piped-text-submenu-item.piped-text-header {\n font-size: 12px;\n line-height: 16px;\n font-weight: 700;\n padding: 12px; }\n .piped-text-menu-item.piped-text-disabled:not(.piped-text-header), .piped-text-submenu-item.piped-text-disabled:not(.piped-text-header) {\n color: RGB(116, 119, 122); }\n\n.piped-text-submenu-item {\n padding-right: 24px; }\n\n.piped-text-information-message {\n padding: 10px 12px;\n user-select: none;\n box-sizing: border-box;\n overflow-x: hidden;\n text-overflow: ellipsis;\n color: #74777A;\n text-align: center;\n white-space: pre-line; }\n\n.piped-text-loading-spinner {\n width: fit-content;\n margin: 0 auto; }\n\n.piped-text-error-container {\n color: #BB0000; }\n .piped-text-error-container .piped-text-error-icon {\n padding: 8px 0; }\n .piped-text-error-container .piped-text-error-icon svg {\n fill: #BB0000;\n display: block;\n margin: 0 auto; }\n .piped-text-error-container .piped-text-error-text {\n text-align: center;\n white-space: pre-line;\n padding: 0 12px 8px; }\n\n.embedded-data-menu {\n padding: 10px 12px;\n user-select: none;\n box-sizing: border-box;\n overflow-x: hidden;\n text-overflow: ellipsis;\n align-content: center;\n padding: 4px 8px 8px; }\n .embedded-data-menu input.q-plugin-popover-input {\n box-sizing: border-box;\n height: 36px;\n padding: 7px 9px; }\n";
801
805
  styleInject(css_248z$9);
802
806
 
803
- var EmbeddedDataMenu = React__default['default'].forwardRef(function (props, ref) {
807
+ var EmbeddedDataMenu = React__default["default"].forwardRef(function (props, ref) {
804
808
  var _useState = React.useState(''),
805
809
  _useState2 = _slicedToArray(_useState, 2),
806
810
  inputValue = _useState2[0],
@@ -823,7 +827,7 @@ var EmbeddedDataMenu = React__default['default'].forwardRef(function (props, ref
823
827
 
824
828
  React.useEffect(function () {
825
829
  setTimeout(function () {
826
- if (_get__default['default'](inputRef, 'current.focus') !== undefined) {
830
+ if (_get__default["default"](inputRef, 'current.focus') !== undefined) {
827
831
  inputRef.current.focus();
828
832
  }
829
833
  });
@@ -861,24 +865,24 @@ var EmbeddedDataMenu = React__default['default'].forwardRef(function (props, ref
861
865
  handleAddButtonClick();
862
866
  };
863
867
 
864
- return React__default['default'].createElement(Popover, {
868
+ return React__default["default"].createElement(Popover, {
865
869
  show: props.show,
866
870
  anchor: anchor,
867
871
  onClose: onClose,
868
872
  ignoreClickSelector: ignoreClickSelector,
869
873
  placement: props.placement || 'right-start'
870
- }, React__default['default'].createElement("div", {
874
+ }, React__default["default"].createElement("div", {
871
875
  className: "embedded-data-menu"
872
- }, React__default['default'].createElement("div", null, React__default['default'].createElement(uiReact.InputGroup, null, React__default['default'].createElement(uiReact.Input, {
876
+ }, React__default["default"].createElement("div", null, React__default["default"].createElement(uiReact.InputGroup, null, React__default["default"].createElement(uiReact.Input, {
873
877
  onChange: handleInputChange,
874
878
  invalid: isInputInvalid,
875
879
  onKeyDown: handleInputKeyDown,
876
880
  ref: inputRef,
877
881
  className: "q-plugin-popover-input"
878
- }), React__default['default'].createElement(uiReact.Button, {
882
+ }), React__default["default"].createElement(uiReact.Button, {
879
883
  kind: "primary",
880
884
  onClick: handleAddButtonClick
881
- }, React__default['default'].createElement(uiReact.Icon, {
885
+ }, React__default["default"].createElement(uiReact.Icon, {
882
886
  type: uiReact.IconTypes.Add
883
887
  }))))));
884
888
  });
@@ -887,11 +891,11 @@ var css_248z$8 = "div[role=\"menu\"] .piped-text-search-input-container {\n pad
887
891
  styleInject(css_248z$8);
888
892
 
889
893
  var EMBEDDED_DATA_LOCATOR = 'embeddedData';
890
- var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
894
+ var PipedTextMenu = React__default["default"].forwardRef(function PipedTextMenu(props, ref) {
891
895
  var defaultMenuItems = undefined;
892
896
 
893
897
  if (typeof props.items !== 'function') {
894
- defaultMenuItems = _cloneDeep__default['default'](props.items);
898
+ defaultMenuItems = _cloneDeep__default["default"](props.items);
895
899
  }
896
900
 
897
901
  var optionsRef = React.useRef({});
@@ -916,8 +920,47 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
916
920
  searchValue = _useState8[0],
917
921
  setSearchValue = _useState8[1];
918
922
 
919
- var onClose = props.onClose || function () {};
923
+ var _useState9 = React.useState(undefined),
924
+ _useState10 = _slicedToArray(_useState9, 2),
925
+ isSubmenu = _useState10[0],
926
+ setIsSubmenu = _useState10[1];
927
+
928
+ var onClose = props.onClose || function () {
929
+ return undefined;
930
+ };
931
+
932
+ var _useState11 = React.useState(null),
933
+ _useState12 = _slicedToArray(_useState11, 2),
934
+ popoverEl = _useState12[0],
935
+ setPopoverEl = _useState12[1];
936
+
937
+ var popoverRefCb = React.useCallback(function (el) {
938
+ setPopoverEl(el);
939
+ }, []);
940
+
941
+ var _useState13 = React.useState(null),
942
+ _useState14 = _slicedToArray(_useState13, 2),
943
+ searchBoxEl = _useState14[0],
944
+ setSearchBoxEl = _useState14[1];
945
+
946
+ var searchBoxRefCb = React.useCallback(function (el) {
947
+ setSearchBoxEl(el);
948
+ }, []);
949
+ React.useEffect(function () {
950
+ var anchorRefEl = _get__default["default"](props, 'anchorRef.current');
951
+
952
+ if (anchorRefEl) {
953
+ var anchorRefElRole = anchorRefEl.getAttribute('role');
954
+ var nextIsSubmenu = anchorRefElRole === 'menuitem';
955
+ setIsSubmenu(nextIsSubmenu);
956
+ }
920
957
 
958
+ if (isSubmenu === true) ; else if (isSubmenu === false) {
959
+ if (popoverEl !== null) {
960
+ popoverEl.focus();
961
+ }
962
+ }
963
+ }, [popoverEl, searchBoxEl, props.anchorRef, isSubmenu]);
921
964
  React.useEffect(function () {
922
965
  _asyncToGenerator(regeneratorRuntime.mark(function _callee() {
923
966
  var newMenuItems;
@@ -977,7 +1020,7 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
977
1020
 
978
1021
  var reRenderMenus = function reRenderMenus() {
979
1022
  var nextMenuItems;
980
- nextMenuItems = _cloneDeep__default['default'](menuItems);
1023
+ nextMenuItems = _cloneDeep__default["default"](menuItems);
981
1024
  setMenuItems(nextMenuItems);
982
1025
  };
983
1026
 
@@ -995,14 +1038,14 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
995
1038
  menuItem.show = true;
996
1039
  }
997
1040
 
998
- nextMenuItems = _cloneDeep__default['default'](menuItems);
1041
+ nextMenuItems = _cloneDeep__default["default"](menuItems);
999
1042
  setMenuItems(nextMenuItems);
1000
1043
  };
1001
1044
 
1002
1045
  var menuItemHovered = function menuItemHovered(menuItem, evt) {
1003
1046
  var nextMenuItems;
1004
1047
  closeSubmenus(menuItems);
1005
- nextMenuItems = _cloneDeep__default['default'](menuItems);
1048
+ nextMenuItems = _cloneDeep__default["default"](menuItems);
1006
1049
  setMenuItems(nextMenuItems);
1007
1050
  };
1008
1051
 
@@ -1012,6 +1055,10 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1012
1055
  setSearchValue(searchVal);
1013
1056
  };
1014
1057
 
1058
+ var handleSearchInputClick = function handleSearchInputClick(evt) {
1059
+ evt.stopPropagation();
1060
+ };
1061
+
1015
1062
  var matchesSearch = function matchesSearch(item) {
1016
1063
  var searchVal = searchValue || '';
1017
1064
  searchVal = searchVal.trim().toLowerCase();
@@ -1041,12 +1088,13 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1041
1088
  props.onSelected(edMenuItem);
1042
1089
  };
1043
1090
 
1044
- var getSubmenuItem = function getSubmenuItem(menuItem) {
1045
- return React__default['default'].createElement("div", {
1091
+ var SubmenuItem = function SubmenuItem(props) {
1092
+ var submenuAnchorRef = React.useRef(null);
1093
+ var menuItem = props.menuItem;
1094
+ return React__default["default"].createElement("div", {
1046
1095
  "data-testid": "piped-text-submenu",
1047
- className: "piped-text-submenu-item-container",
1048
- key: menuItem.key
1049
- }, menuItem.show && React__default['default'].createElement(PipedTextMenu, {
1096
+ className: "piped-text-submenu-item-container"
1097
+ }, menuItem.show && React__default["default"].createElement(PipedTextMenu, {
1050
1098
  items: menuItem.submenu.items,
1051
1099
  show: menuItem.show,
1052
1100
  placement: "right-start",
@@ -1060,21 +1108,25 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1060
1108
  errorText: menuItem.submenu.errorText,
1061
1109
  onSelected: menuItemClicked,
1062
1110
  anchor: function anchor(ref) {
1063
- return React__default['default'].createElement("div", {
1111
+ return React__default["default"].createElement("div", {
1064
1112
  ref: ref,
1065
1113
  className: "piped-text-submenu-anchor"
1066
1114
  });
1067
- }
1068
- }), React__default['default'].createElement("div", {
1115
+ },
1116
+ anchorRef: submenuAnchorRef
1117
+ }), React__default["default"].createElement("div", {
1069
1118
  className: "piped-text-submenu-item",
1119
+ "aria-haspopup": "menu",
1120
+ role: "menuitem",
1070
1121
  onMouseEnter: function onMouseEnter($e) {
1071
1122
  return submenuHovered(menuItem);
1072
- }
1073
- }, React__default['default'].createElement("div", {
1123
+ },
1124
+ ref: submenuAnchorRef
1125
+ }, React__default["default"].createElement("div", {
1074
1126
  className: "label-text"
1075
- }, menuItem.label), React__default['default'].createElement("div", {
1127
+ }, menuItem.label), React__default["default"].createElement("div", {
1076
1128
  className: "piped-text-icon"
1077
- }, React__default['default'].createElement(uiReact.Icon, {
1129
+ }, React__default["default"].createElement(uiReact.Icon, {
1078
1130
  type: uiReact.IconTypes.ChevronRight,
1079
1131
  size: "medium"
1080
1132
  }))));
@@ -1082,7 +1134,7 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1082
1134
 
1083
1135
  var getPipedTextMenuItems = function getPipedTextMenuItems(menuItems) {
1084
1136
  if (menuItems.length === 0 && props.allowCustom === true && props.customInputMessage) {
1085
- return React__default['default'].createElement("div", null, React__default['default'].createElement("div", {
1137
+ return React__default["default"].createElement("div", null, React__default["default"].createElement("div", {
1086
1138
  className: "piped-text-information-message"
1087
1139
  }, props.customInputMessage));
1088
1140
  }
@@ -1091,17 +1143,20 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1091
1143
  var menuItemHeaderClass, menuItemDisabledClass, menuItemClassName;
1092
1144
 
1093
1145
  if (menuItem.hasSubmenu) {
1094
- return getSubmenuItem(menuItem);
1146
+ return React__default["default"].createElement(SubmenuItem, {
1147
+ key: menuItem.key,
1148
+ menuItem: menuItem
1149
+ });
1095
1150
  } else if (menuItem.header === true || menuItem.disabled === true) {
1096
1151
  menuItemHeaderClass = menuItem.header === true ? 'piped-text-header' : '';
1097
1152
  menuItemDisabledClass = menuItem.disabled === true ? 'piped-text-disabled' : '';
1098
1153
  menuItemClassName = "piped-text-menu-item ".concat(menuItemHeaderClass, " ").concat(menuItemDisabledClass);
1099
- return React__default['default'].createElement("div", {
1154
+ return React__default["default"].createElement("div", {
1100
1155
  key: menuItem.key,
1101
1156
  className: menuItemClassName
1102
1157
  }, menuItem.label);
1103
1158
  } else if (menuItem.value === EMBEDDED_DATA_LOCATOR) {
1104
- return React__default['default'].createElement("div", {
1159
+ return React__default["default"].createElement("div", {
1105
1160
  key: menuItem.key,
1106
1161
  onClick: function onClick($e) {
1107
1162
  return embeddedDataItemClicked(menuItem);
@@ -1109,20 +1164,20 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1109
1164
  onMouseEnter: function onMouseEnter($e) {
1110
1165
  return menuItemHovered();
1111
1166
  }
1112
- }, React__default['default'].createElement(EmbeddedDataMenu, {
1167
+ }, React__default["default"].createElement(EmbeddedDataMenu, {
1113
1168
  show: menuItem.show,
1114
1169
  onSelect: handleEmbeddedDataSelect,
1115
1170
  anchor: function anchor(ref) {
1116
- return React__default['default'].createElement("div", {
1171
+ return React__default["default"].createElement("div", {
1117
1172
  ref: ref,
1118
1173
  className: "embedded-data-menu-anchor"
1119
1174
  });
1120
1175
  }
1121
- }), React__default['default'].createElement("div", {
1176
+ }), React__default["default"].createElement("div", {
1122
1177
  className: "piped-text-menu-item"
1123
1178
  }, menuItem.label));
1124
1179
  } else {
1125
- return React__default['default'].createElement("div", {
1180
+ return React__default["default"].createElement("div", {
1126
1181
  key: menuItem.key,
1127
1182
  onMouseEnter: function onMouseEnter($e) {
1128
1183
  return menuItemHovered();
@@ -1130,7 +1185,7 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1130
1185
  onClick: function onClick($e) {
1131
1186
  return menuItemClicked(menuItem);
1132
1187
  }
1133
- }, React__default['default'].createElement("div", {
1188
+ }, React__default["default"].createElement("div", {
1134
1189
  className: "piped-text-menu-item"
1135
1190
  }, menuItem.label));
1136
1191
  }
@@ -1161,23 +1216,23 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1161
1216
  };
1162
1217
 
1163
1218
  var getLoadError = function getLoadError() {
1164
- return React__default['default'].createElement("div", {
1219
+ return React__default["default"].createElement("div", {
1165
1220
  className: "piped-text-popover-container"
1166
- }, React__default['default'].createElement("div", {
1221
+ }, React__default["default"].createElement("div", {
1167
1222
  className: "piped-text-error-container"
1168
- }, React__default['default'].createElement("div", {
1223
+ }, React__default["default"].createElement("div", {
1169
1224
  className: "piped-text-error-icon"
1170
- }, React__default['default'].createElement(icons.ErrorIcon, {
1225
+ }, React__default["default"].createElement(icons.ErrorIcon, {
1171
1226
  size: "medium"
1172
- })), props.errorText && React__default['default'].createElement("div", {
1227
+ })), props.errorText && React__default["default"].createElement("div", {
1173
1228
  className: "piped-text-error-text"
1174
1229
  }, props.errorText)));
1175
1230
  };
1176
1231
 
1177
1232
  var getLoadingSpinner = function getLoadingSpinner() {
1178
- return React__default['default'].createElement("div", {
1233
+ return React__default["default"].createElement("div", {
1179
1234
  className: "piped-text-loading-spinner"
1180
- }, React__default['default'].createElement(uiReact.LoadingSpinner, {
1235
+ }, React__default["default"].createElement(uiReact.LoadingSpinner, {
1181
1236
  show: true,
1182
1237
  size: "medium"
1183
1238
  }));
@@ -1188,13 +1243,13 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1188
1243
  return getLoadError();
1189
1244
  } else {
1190
1245
  var itemsToRender = (menuItems || []).filter(matchesSearch);
1191
- return React__default['default'].createElement("div", {
1192
- className: "piped-text-popover-container"
1193
- }, React__default['default'].createElement("div", {
1246
+ return React__default["default"].createElement("div", {
1247
+ className: "piped-text-popover-menu"
1248
+ }, React__default["default"].createElement("div", {
1194
1249
  className: "piped-text-search-input"
1195
- }, React__default['default'].createElement("form", {
1250
+ }, React__default["default"].createElement("form", {
1196
1251
  onSubmit: handleSearchSubmit
1197
- }, React__default['default'].createElement(uiReact.Input, {
1252
+ }, React__default["default"].createElement(uiReact.Input, {
1198
1253
  small: true,
1199
1254
  full: true,
1200
1255
  placeholder: props.searchPlaceholder,
@@ -1202,28 +1257,45 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1202
1257
  value: searchValue,
1203
1258
  onChange: function onChange($e) {
1204
1259
  return onSearchInputChange($e);
1205
- }
1260
+ },
1261
+ onClick: function onClick($e) {
1262
+ return handleSearchInputClick($e);
1263
+ },
1264
+ ref: searchBoxRefCb
1206
1265
  }))), menuItems === undefined ? getLoadingSpinner() : getPipedTextMenuItems(itemsToRender));
1207
1266
  }
1208
1267
  };
1209
1268
 
1210
- return React__default['default'].createElement("div", {
1269
+ return React__default["default"].createElement("div", {
1211
1270
  className: "piped-text-menu"
1212
- }, React__default['default'].createElement(Popover, {
1271
+ }, React__default["default"].createElement(Popover, {
1213
1272
  show: isMenuOpen,
1214
1273
  onClose: _onClose,
1215
1274
  placement: props.placement || 'right-start',
1216
1275
  anchor: props.anchor,
1217
1276
  ignoreClickSelector: props.ignoreClickSelector
1218
- }, React__default['default'].createElement("div", {
1219
- className: "piped-text-popover-container"
1220
- }, getMenuContent()), React__default['default'].createElement(OptionsPlaceholder, {
1277
+ }, React__default["default"].createElement("div", {
1278
+ className: "piped-text-popover-container",
1279
+ ref: popoverRefCb,
1280
+ onFocus: function onFocus($e) {
1281
+ return handleFocus($e);
1282
+ },
1283
+ tabIndex: props.tabIndex !== undefined ? props.tabIndex : -1
1284
+ }, getMenuContent()), React__default["default"].createElement(OptionsPlaceholder, {
1221
1285
  optionsRef: optionsRef
1222
1286
  })));
1287
+
1288
+ function handleFocus(evt) {
1289
+ if (!isSubmenu && searchBoxEl !== null) {
1290
+ searchBoxEl.focus();
1291
+ }
1292
+
1293
+ evt.stopPropagation();
1294
+ }
1223
1295
  });
1224
1296
 
1225
1297
  function OptionsPlaceholder() {
1226
- return React__default['default'].createElement("span", null);
1298
+ return React__default["default"].createElement("span", null);
1227
1299
  }
1228
1300
 
1229
1301
  function closeSubmenus(menuItems) {
@@ -1238,13 +1310,13 @@ function pipedTextDataAdapter(pipedTextData, recursed) {
1238
1310
  var uniqueKey;
1239
1311
 
1240
1312
  if (!recursed) {
1241
- pipedTextData = _cloneDeep__default['default'](pipedTextData);
1313
+ pipedTextData = _cloneDeep__default["default"](pipedTextData);
1242
1314
  }
1243
1315
 
1244
1316
  uniqueKey = 1;
1245
1317
  pipedTextData.forEach(function (pipedTextItem) {
1246
1318
  pipedTextItem.key = pipedTextItem.key || uniqueKey++;
1247
- pipedTextItem.hasSubmenu = !!_get__default['default'](pipedTextItem, 'submenu.items.length') || typeof _get__default['default'](pipedTextItem, 'submenu.items') === 'function';
1319
+ pipedTextItem.hasSubmenu = !!_get__default["default"](pipedTextItem, 'submenu.items.length') || typeof _get__default["default"](pipedTextItem, 'submenu.items') === 'function';
1248
1320
 
1249
1321
  if (pipedTextItem.hasSubmenu || pipedTextItem.value === EMBEDDED_DATA_LOCATOR) {
1250
1322
  pipedTextItem.show = false;
@@ -1263,7 +1335,7 @@ var css_248z$7 = ".piped-text-dropdown button[type=button].popover-toggle-button
1263
1335
  styleInject(css_248z$7);
1264
1336
 
1265
1337
  var defaultAnchor = function defaultAnchor(ref) {
1266
- return React__default['default'].createElement("div", {
1338
+ return React__default["default"].createElement("div", {
1267
1339
  ref: ref,
1268
1340
  className: "piped-text-menu-empty-anchor"
1269
1341
  });
@@ -1280,23 +1352,8 @@ function PipedTextSelect(props) {
1280
1352
  pipedTextItems = _useState4[0],
1281
1353
  setPipedTextItems = _useState4[1];
1282
1354
 
1283
- function initializePipedText() {
1284
- if (props.items) {
1285
- return pipedTextDataAdapter(props.items);
1286
- }
1287
- }
1288
-
1289
- var onClose = function onClose() {
1290
- if (props.onClose) {
1291
- props.onClose();
1292
- }
1293
- };
1294
-
1295
- var onSelect = function onSelect(selected) {
1296
- props.onSelect(selected);
1297
- onClose();
1298
- };
1299
-
1355
+ var defaultAnchorRef = React.useRef(null);
1356
+ var externalAnchor = props.anchor;
1300
1357
  React.useEffect(function () {
1301
1358
  return function () {
1302
1359
  return onClose();
@@ -1311,16 +1368,39 @@ function PipedTextSelect(props) {
1311
1368
  var formattedPipedText = initializePipedText();
1312
1369
  setPipedTextItems(formattedPipedText);
1313
1370
  }, [props.items]);
1314
- return React__default['default'].createElement("div", {
1371
+
1372
+ var onClose = function onClose() {
1373
+ if (props.onClose) {
1374
+ props.onClose();
1375
+ }
1376
+ };
1377
+
1378
+ var onSelect = function onSelect(selected) {
1379
+ props.onSelect(selected);
1380
+ onClose();
1381
+ };
1382
+
1383
+ var actualAnchor = externalAnchor !== undefined ? React__default["default"].cloneElement(externalAnchor, {
1384
+ ref: externalAnchor.ref
1385
+ }) : defaultAnchor(defaultAnchorRef);
1386
+ var anchorRef = props.anchorRef || actualAnchor.ref;
1387
+ return React__default["default"].createElement("div", {
1315
1388
  className: "piped-text-dropdown"
1316
- }, isMenuOpen && React__default['default'].createElement(PipedTextMenu, {
1389
+ }, isMenuOpen && React__default["default"].createElement(PipedTextMenu, {
1317
1390
  onClose: onClose,
1318
1391
  show: isMenuOpen,
1319
1392
  onSelected: onSelect,
1320
1393
  items: pipedTextItems,
1321
- anchor: props.anchor || defaultAnchor,
1394
+ anchor: actualAnchor,
1395
+ anchorRef: anchorRef,
1322
1396
  ignoreClickSelector: props.ignoreClickSelector
1323
1397
  }));
1398
+
1399
+ function initializePipedText() {
1400
+ if (props.items) {
1401
+ return pipedTextDataAdapter(props.items);
1402
+ }
1403
+ }
1324
1404
  }
1325
1405
 
1326
1406
  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";
@@ -1329,6 +1409,7 @@ styleInject(css_248z$6);
1329
1409
  function PipedTextInput(props) {
1330
1410
  var _a = React.useState(false), showMenu = _a[0], setShowMenu = _a[1];
1331
1411
  var _b = React.useState(), cursorPosition = _b[0], setCursorPosition = _b[1];
1412
+ var pipedTextButtonRef = React.useRef(null);
1332
1413
  /*
1333
1414
  This has to be an Object type ref instead of 'string' or React will lose
1334
1415
  track of state, and the supplied props input value will become stale
@@ -1358,21 +1439,21 @@ function PipedTextInput(props) {
1358
1439
  value: nextInputValue,
1359
1440
  });
1360
1441
  }, [props.value]);
1361
- return (React__default['default'].createElement("div", { className: "piped-text-input" },
1362
- React__default['default'].createElement("div", { className: 'piped-text-input-toggle popover-toggle' + (multiline ? ' multiline-input' : '') },
1363
- React__default['default'].createElement(uiReact.Input, __assign({ value: inputRefValue.value, onChange: function (evt) {
1442
+ return (React__default["default"].createElement("div", { className: "piped-text-input" },
1443
+ React__default["default"].createElement("div", { className: 'piped-text-input-toggle popover-toggle' + (multiline ? ' multiline-input' : '') },
1444
+ React__default["default"].createElement(uiReact.Input, __assign({ value: inputRefValue.value, onChange: function (evt) {
1364
1445
  onInputChange(evt);
1365
1446
  }, onBlur: onInputBlur, placeholder: placeholder, multiline: multiline }, restProps)),
1366
- React__default['default'].createElement(uiReact.IconButton, { "aria-label": "PipedText", size: "medium", onClick: toggleMenu },
1367
- React__default['default'].createElement(icons.PipedTextIcon, null)),
1368
- React__default['default'].createElement("div", { className: "piped-text-select-container" },
1369
- React__default['default'].createElement(PipedTextSelect, { items: items, onSelect: pipedTextSelected, show: showMenu, onClose: handleClose, ignoreClickSelector: "piped-text-input-toggle" }))),
1370
- showAddonText() && (React__default['default'].createElement("div", { className: "addon-text-container" },
1371
- helperText && (React__default['default'].createElement("div", { className: "helper-text" }, helperText)),
1372
- errorText && (React__default['default'].createElement("div", { className: "error-text" },
1373
- React__default['default'].createElement("div", { className: "error-text-icon" },
1374
- React__default['default'].createElement(icons.ErrorIcon, null)),
1375
- React__default['default'].createElement("div", { className: "error-text-content" }, errorText)))))));
1447
+ React__default["default"].createElement(uiReact.IconButton, { "aria-label": "PipedText", "aria-haspopup": "menu", "aria-expanded": showMenu ? true : undefined, role: "button", size: "medium", onClick: toggleMenu, ref: pipedTextButtonRef },
1448
+ React__default["default"].createElement(icons.PipedTextIcon, null)),
1449
+ React__default["default"].createElement("div", { className: "piped-text-select-container" },
1450
+ React__default["default"].createElement(PipedTextSelect, { items: items, onSelect: pipedTextSelected, show: showMenu, onClose: handleClose, ignoreClickSelector: "piped-text-input-toggle", anchorRef: pipedTextButtonRef }))),
1451
+ showAddonText() && (React__default["default"].createElement("div", { className: "addon-text-container" },
1452
+ helperText && (React__default["default"].createElement("div", { className: "helper-text" }, helperText)),
1453
+ errorText && (React__default["default"].createElement("div", { className: "error-text" },
1454
+ React__default["default"].createElement("div", { className: "error-text-icon" },
1455
+ React__default["default"].createElement(icons.ErrorIcon, null)),
1456
+ React__default["default"].createElement("div", { className: "error-text-content" }, errorText)))))));
1376
1457
  function showAddonText() {
1377
1458
  return ((helperText !== undefined) || (errorText !== undefined));
1378
1459
  }
@@ -1395,7 +1476,7 @@ function PipedTextInput(props) {
1395
1476
  function pipedTextSelected(selected) {
1396
1477
  var nextInputValue, prependString, appendString;
1397
1478
  handleSelect(selected);
1398
- if (_get__default['default'](selected, 'value.locator')) {
1479
+ if (_get__default["default"](selected, 'value.locator')) {
1399
1480
  prependString = inputRefValue.value.substring(0, cursorPosition);
1400
1481
  appendString = inputRefValue.value.substring(cursorPosition);
1401
1482
  nextInputValue = "" + prependString + selected.value.locator + appendString;
@@ -1469,13 +1550,13 @@ function FieldRow(props) {
1469
1550
  }
1470
1551
  };
1471
1552
 
1472
- return React__default['default'].createElement("div", {
1553
+ return React__default["default"].createElement("div", {
1473
1554
  className: "icon-wrapper",
1474
1555
  onClick: handleDelete
1475
- }, !props.required && React__default['default'].createElement(uiReact.IconButton, {
1556
+ }, !props.required && React__default["default"].createElement(uiReact.IconButton, {
1476
1557
  "aria-label": "RemoveRow",
1477
1558
  size: "medium"
1478
- }, React__default['default'].createElement(icons.RemoveItemIcon, null)));
1559
+ }, React__default["default"].createElement(icons.RemoveItemIcon, null)));
1479
1560
  };
1480
1561
 
1481
1562
  var handleFieldSwitch = function handleFieldSwitch(newFieldId) {
@@ -1511,7 +1592,7 @@ function FieldRow(props) {
1511
1592
  var getFieldSelector = function getFieldSelector() {
1512
1593
  var getInternalContent = function getInternalContent() {
1513
1594
  if (props.isCustom) {
1514
- return React__default['default'].createElement(uiReact.Input, {
1595
+ return React__default["default"].createElement(uiReact.Input, {
1515
1596
  full: true,
1516
1597
  value: props.fieldName === undefined ? '' : props.fieldName,
1517
1598
  placeholder: props.customNamePlaceholder === undefined ? '' : props.customNamePlaceholder,
@@ -1521,35 +1602,61 @@ function FieldRow(props) {
1521
1602
  }
1522
1603
 
1523
1604
  if (props.required || !props.children || Array.isArray(children) && children.length === 0) {
1524
- return React__default['default'].createElement("div", {
1525
- className: "required-indicator-container"
1526
- }, React__default['default'].createElement("div", {
1527
- className: "required-indicator-text"
1528
- }, props.fieldName), props.required && React__default['default'].createElement("div", {
1529
- className: "required-indicator-symbol"
1530
- }, "*"));
1605
+ if (props.subMenu) {
1606
+ return React__default["default"].createElement(uiReact.SelectMenu, {
1607
+ searchable: props.searchable !== undefined && props.searchable !== false,
1608
+ defaultLabel: props.fieldName || '',
1609
+ label: props.fieldName,
1610
+ className: "full-width left-align",
1611
+ onChange: handleFieldSwitch
1612
+ }, createMenuItems([{
1613
+ id: props.id,
1614
+ name: props.fieldName,
1615
+ subMenu: props.subMenu,
1616
+ subMenuLabel: props.subMenuLabel
1617
+ }]));
1618
+ } else {
1619
+ return React__default["default"].createElement("div", {
1620
+ className: "required-indicator-container"
1621
+ }, React__default["default"].createElement("div", {
1622
+ className: "required-indicator-text"
1623
+ }, props.fieldName), props.required && React__default["default"].createElement("div", {
1624
+ className: "required-indicator-symbol"
1625
+ }, "*"));
1626
+ }
1531
1627
  }
1532
1628
 
1533
- return React__default['default'].createElement(uiReact.SelectMenu, {
1629
+ return React__default["default"].createElement(uiReact.SelectMenu, {
1534
1630
  searchable: props.searchable !== undefined && props.searchable !== false,
1535
1631
  defaultLabel: props.fieldName || '',
1536
1632
  label: props.fieldName,
1537
1633
  className: "full-width left-align",
1538
1634
  onChange: handleFieldSwitch
1539
- }, children.map(function (field) {
1540
- return React__default['default'].createElement(uiReact.MenuItem, {
1541
- value: field.id,
1542
- key: field.id
1543
- }, field.name);
1544
- }));
1635
+ }, createMenuItems(children));
1545
1636
  };
1546
1637
 
1547
- var tooltipContent = React__default['default'].createElement("div", null, props.nameTooltip);
1548
- return React__default['default'].createElement(uiReact.Tooltip, {
1638
+ var tooltipContent = React__default["default"].createElement("div", null, props.nameTooltip);
1639
+ return React__default["default"].createElement(uiReact.Tooltip, {
1549
1640
  disabled: !props.isCustom || shouldDisableTooltip(props.nameTooltip),
1550
1641
  placement: "top",
1551
1642
  content: tooltipContent
1552
- }, React__default['default'].createElement("div", null, getInternalContent()));
1643
+ }, React__default["default"].createElement("div", null, getInternalContent()));
1644
+ };
1645
+
1646
+ var createMenuItems = function createMenuItems(items) {
1647
+ return items.map(function (_ref) {
1648
+ var id = _ref.id,
1649
+ name = _ref.name,
1650
+ subMenu = _ref.subMenu,
1651
+ subMenuLabel = _ref.subMenuLabel;
1652
+ return subMenu !== undefined ? React__default["default"].createElement(uiReact.SelectMenu, {
1653
+ label: subMenuLabel ? subMenuLabel : name,
1654
+ key: id
1655
+ }, createMenuItems(subMenu)) : React__default["default"].createElement(uiReact.MenuItem, {
1656
+ key: id,
1657
+ value: id
1658
+ }, name);
1659
+ });
1553
1660
  };
1554
1661
 
1555
1662
  var getFieldInput = function getFieldInput() {
@@ -1557,7 +1664,7 @@ function FieldRow(props) {
1557
1664
  if (props.customInput) {
1558
1665
  return props.customInput;
1559
1666
  } else {
1560
- return React__default['default'].createElement(PipedTextInput, {
1667
+ return React__default["default"].createElement(PipedTextInput, {
1561
1668
  items: props.pipedTextItems,
1562
1669
  value: props.value === undefined ? '' : props.value,
1563
1670
  onChange: handleFieldValueChange,
@@ -1566,23 +1673,23 @@ function FieldRow(props) {
1566
1673
  }
1567
1674
  };
1568
1675
 
1569
- var tooltipContent = React__default['default'].createElement("div", null, props.valueTooltip);
1570
- return React__default['default'].createElement(uiReact.Tooltip, {
1676
+ var tooltipContent = React__default["default"].createElement("div", null, props.valueTooltip);
1677
+ return React__default["default"].createElement(uiReact.Tooltip, {
1571
1678
  disabled: shouldDisableTooltip(props.valueTooltip),
1572
1679
  placement: "top",
1573
1680
  content: tooltipContent
1574
- }, React__default['default'].createElement("div", null, getInternalContent()));
1681
+ }, React__default["default"].createElement("div", null, getInternalContent()));
1575
1682
  };
1576
1683
 
1577
- return React__default['default'].createElement("div", {
1684
+ return React__default["default"].createElement("div", {
1578
1685
  className: "field-row"
1579
- }, React__default['default'].createElement("div", {
1580
- className: "field-selector ".concat(props.required ? 'required-field' : '')
1581
- }, getFieldSelector()), React__default['default'].createElement("div", {
1686
+ }, React__default["default"].createElement("div", {
1687
+ className: "field-selector ".concat(props.required && !props.subMenu ? 'required-field' : '')
1688
+ }, getFieldSelector()), React__default["default"].createElement("div", {
1582
1689
  className: "field-input-container"
1583
- }, React__default['default'].createElement("div", {
1690
+ }, React__default["default"].createElement("div", {
1584
1691
  className: "field-input"
1585
- }, getFieldInput()), React__default['default'].createElement("div", {
1692
+ }, getFieldInput()), React__default["default"].createElement("div", {
1586
1693
  className: "delete-row"
1587
1694
  }, getRowDelete())));
1588
1695
  }
@@ -1599,7 +1706,7 @@ function FieldItem(props) {
1599
1706
  }
1600
1707
  };
1601
1708
 
1602
- return React__default['default'].createElement("div", {
1709
+ return React__default["default"].createElement("div", {
1603
1710
  className: "field-item",
1604
1711
  onClick: handleClick
1605
1712
  }, label);
@@ -1608,7 +1715,7 @@ function FieldItem(props) {
1608
1715
  var css_248z$3 = ".task-fields {\n margin-right: 100px; }\n .task-fields .add-field-button .add-field-button-label {\n padding: 0 3px; }\n .task-fields .field-headers {\n margin-bottom: 10px;\n padding-left: 12px; }\n .task-fields .field-headers .field-row {\n color: #6A6D70;\n font-weight: bold; }\n .task-fields .field-headers .field-row .field-selector label, .task-fields .field-headers .field-row .field-input label {\n font-size: 12px; }\n .task-fields .field-headers .field-row .field-selector {\n padding-top: 0;\n padding-right: 24px;\n padding-bottom: 0;\n padding-left: 0; }\n .task-fields .field-headers .field-row .field-input {\n padding-top: 0;\n padding-right: 0;\n padding-bottom: 0;\n padding-left: 12px; }\n .task-fields .field-rows {\n padding-bottom: 12px; }\n .task-fields .field-rows .field-row {\n border-top: 1px solid #E5E5E5; }\n .task-fields .field-rows .field-row .field-selector {\n padding-top: 8px;\n padding-right: 12px;\n padding-bottom: 8px;\n padding-left: 12px; }\n .task-fields .field-rows .field-row .field-input {\n border-left: 1px solid #E5E5E5;\n padding-top: 8px;\n padding-right: 0;\n padding-bottom: 8px;\n padding-left: 12px; }\n\n.q-popover .field-item {\n padding: 5px 32px; }\n .q-popover .field-item:hover {\n cursor: pointer;\n user-select: none;\n background: #007ac0;\n color: #fff;\n fill: #fff; }\n";
1609
1716
  styleInject(css_248z$3);
1610
1717
 
1611
- var uuidv4 = uuid__default['default'].v4;
1718
+ var uuidv4 = uuid__default["default"].v4;
1612
1719
  var CUSTOM_TYPE = 'custom';
1613
1720
  function TaskFields(props) {
1614
1721
  var _useState = React.useState([]),
@@ -1639,7 +1746,7 @@ function TaskFields(props) {
1639
1746
  };
1640
1747
 
1641
1748
  var onFieldNameChange = function onFieldNameChange(fieldId, event) {
1642
- var changeFn = _get__default['default'](props, 'customFieldOptions.onCustomFieldNameChange');
1749
+ var changeFn = _get__default["default"](props, 'customFieldOptions.onCustomFieldNameChange');
1643
1750
 
1644
1751
  if (typeof changeFn === 'function') {
1645
1752
  changeFn(fieldId, event);
@@ -1648,13 +1755,15 @@ function TaskFields(props) {
1648
1755
 
1649
1756
  var getFieldRows = function getFieldRows() {
1650
1757
  return fieldsInUse.map(function (field) {
1651
- return React__default['default'].createElement(FieldRow, {
1758
+ return React__default["default"].createElement(FieldRow, {
1652
1759
  customInput: field.children,
1653
1760
  required: field.required,
1654
1761
  fieldName: field.name,
1655
1762
  id: field.id,
1656
- nameTooltip: field.type === CUSTOM_TYPE ? _get__default['default'](props, 'customFieldOptions.nameTooltip', '') : field.nameTooltip,
1657
- valueTooltip: field.type === CUSTOM_TYPE ? _get__default['default'](props, 'customFieldOptions.valueTooltip', '') : field.valueTooltip,
1763
+ subMenu: field.subMenu,
1764
+ subMenuLabel: field.subMenuLabel,
1765
+ nameTooltip: field.type === CUSTOM_TYPE ? _get__default["default"](props, 'customFieldOptions.nameTooltip', '') : field.nameTooltip,
1766
+ valueTooltip: field.type === CUSTOM_TYPE ? _get__default["default"](props, 'customFieldOptions.valueTooltip', '') : field.valueTooltip,
1658
1767
  onFieldNameChange: onFieldNameChange,
1659
1768
  onFieldValueChange: onFieldValueChange,
1660
1769
  onFieldSwitch: onFieldSwitch,
@@ -1662,14 +1771,30 @@ function TaskFields(props) {
1662
1771
  isCustom: field.type === CUSTOM_TYPE,
1663
1772
  key: field.id,
1664
1773
  value: field.value,
1665
- valuePlaceholder: field.type === CUSTOM_TYPE ? _get__default['default'](props, 'customFieldOptions.valuePlaceholder', '') : field.valuePlaceholder,
1666
- customNamePlaceholder: _get__default['default'](props, 'customFieldOptions.namePlaceholder', ''),
1774
+ valuePlaceholder: field.type === CUSTOM_TYPE ? _get__default["default"](props, 'customFieldOptions.valuePlaceholder', '') : field.valuePlaceholder,
1775
+ customNamePlaceholder: _get__default["default"](props, 'customFieldOptions.namePlaceholder', ''),
1667
1776
  pipedTextItems: props.pipedTextItems,
1668
1777
  searchable: props.searchable
1669
- }, allFieldOptions && availableFields);
1778
+ }, allFieldOptions && getFieldsForFieldRow(availableFields, allFieldOptions, field.id));
1670
1779
  });
1671
1780
  };
1672
1781
 
1782
+ var getFieldsForFieldRow = function getFieldsForFieldRow(allAvailableFields, allFields, fieldId) {
1783
+ var fieldsToAdd = allAvailableFields.slice();
1784
+ allFields.forEach(function (field) {
1785
+ if (field.subMenu !== undefined && fieldId === field.id) {
1786
+ var foundIndex = fieldsToAdd.findIndex(function (fieldToAdd) {
1787
+ return fieldToAdd.id === field.id;
1788
+ });
1789
+
1790
+ if (foundIndex === -1) {
1791
+ fieldsToAdd.push(field);
1792
+ }
1793
+ }
1794
+ });
1795
+ return fieldsToAdd;
1796
+ };
1797
+
1673
1798
  var onFieldAdd = function onFieldAdd(fieldId) {
1674
1799
  if (typeof props.onFieldAdd === 'function') {
1675
1800
  props.onFieldAdd(fieldId);
@@ -1677,19 +1802,21 @@ function TaskFields(props) {
1677
1802
  };
1678
1803
 
1679
1804
  var onCustomFieldAdd = function onCustomFieldAdd() {
1680
- var handleFn = _get__default['default'](props, 'customFieldOptions.onCustomFieldAdd', function () {});
1805
+ var handleFn = _get__default["default"](props, 'customFieldOptions.onCustomFieldAdd', function () {});
1681
1806
 
1682
1807
  handleFn();
1683
1808
  };
1684
1809
 
1685
1810
  var getAvailableFields = function getAvailableFields() {
1686
1811
  return availableFields.map(function (field) {
1687
- return React__default['default'].createElement(FieldItem, {
1812
+ return React__default["default"].createElement(FieldItem, {
1688
1813
  name: field.name,
1689
1814
  type: field.type,
1690
1815
  required: field.required,
1691
1816
  key: field.id,
1692
- id: field.id
1817
+ id: field.id,
1818
+ subMenu: field.subMenu,
1819
+ subMenuLabel: field.subMenuLabel
1693
1820
  });
1694
1821
  });
1695
1822
  };
@@ -1742,7 +1869,9 @@ function TaskFields(props) {
1742
1869
  children: foundNextChild.props.children,
1743
1870
  nameTooltip: foundNextChild.props.nameTooltip,
1744
1871
  valueTooltip: foundNextChild.props.valueTooltip,
1745
- valuePlaceholder: foundNextChild.props.valuePlaceholder
1872
+ valuePlaceholder: foundNextChild.props.valuePlaceholder,
1873
+ subMenu: foundNextChild.props.subMenu,
1874
+ subMenuLabel: foundNextChild.props.subMenuLabel
1746
1875
  });
1747
1876
  }
1748
1877
 
@@ -1763,7 +1892,9 @@ function TaskFields(props) {
1763
1892
  nameTooltip: field.props.nameTooltip,
1764
1893
  valueTooltip: field.props.valueTooltip,
1765
1894
  value: field.props.value || undefined,
1766
- valuePlaceholder: field.props.valuePlaceholder
1895
+ valuePlaceholder: field.props.valuePlaceholder,
1896
+ subMenu: field.props.subMenu,
1897
+ subMenuLabel: field.props.subMenuLabel
1767
1898
  });
1768
1899
  }
1769
1900
  });
@@ -1786,10 +1917,12 @@ function TaskFields(props) {
1786
1917
  name: currentField.name,
1787
1918
  id: currentField.id,
1788
1919
  value: currentField.value,
1789
- nameTooltip: _get__default['default'](props, 'customFieldOptions.nameTooltip', ''),
1790
- valueTooltip: _get__default['default'](props, 'customFieldOptions.valueTooltip', ''),
1791
- namePlaceholder: _get__default['default'](props, 'customFieldOptions.namePlaceholder', ''),
1792
- type: CUSTOM_TYPE
1920
+ nameTooltip: _get__default["default"](props, 'customFieldOptions.nameTooltip', ''),
1921
+ valueTooltip: _get__default["default"](props, 'customFieldOptions.valueTooltip', ''),
1922
+ namePlaceholder: _get__default["default"](props, 'customFieldOptions.namePlaceholder', ''),
1923
+ type: CUSTOM_TYPE,
1924
+ subMenu: currentField.subMenu,
1925
+ subMenuLabel: currentField.subMenuLabel
1793
1926
  };
1794
1927
  nextFieldsInUse.push(customFieldValue);
1795
1928
  }
@@ -1804,7 +1937,11 @@ function TaskFields(props) {
1804
1937
  if (field !== undefined) {
1805
1938
  field.value = fieldValue.value;
1806
1939
  } else {
1807
- var newField = _cloneDeep__default['default'](fieldMetadata);
1940
+ var newField = _cloneDeepWith__default["default"](fieldMetadata, function (value) {
1941
+ if (React__default["default"].isValidElement(value)) {
1942
+ return React__default["default"].cloneElement(value);
1943
+ }
1944
+ });
1808
1945
 
1809
1946
  newField.value = fieldValue.value;
1810
1947
  fieldsInUse.push(newField);
@@ -1823,7 +1960,9 @@ function TaskFields(props) {
1823
1960
  children: childProps.children,
1824
1961
  nameTooltip: childProps.nameTooltip,
1825
1962
  valueTooltip: childProps.valueTooltip,
1826
- valuePlaceholder: childProps.valuePlaceholder
1963
+ valuePlaceholder: childProps.valuePlaceholder,
1964
+ subMenu: childProps.subMenu,
1965
+ subMenuLabel: childProps.subMenuLabel
1827
1966
  };
1828
1967
  });
1829
1968
  var nextFieldsInUse = getFieldsInUse(nextAllFieldOptions);
@@ -1844,22 +1983,23 @@ function TaskFields(props) {
1844
1983
  React.useEffect(function () {
1845
1984
  updateAvailableFields();
1846
1985
  }, [props.values]);
1847
- return React__default['default'].createElement("div", {
1986
+ return React__default["default"].createElement("div", {
1848
1987
  className: "task-fields"
1849
- }, React__default['default'].createElement("div", {
1988
+ }, React__default["default"].createElement("div", {
1850
1989
  className: "field-headers"
1851
- }, React__default['default'].createElement(AddFieldHeaders, {
1990
+ }, React__default["default"].createElement(AddFieldHeaders, {
1852
1991
  itemHeaderText: props.fieldItemsHeaderText,
1853
1992
  inputHeaderText: props.fieldInputsHeaderText
1854
- })), React__default['default'].createElement("div", {
1993
+ })), React__default["default"].createElement("div", {
1855
1994
  className: "field-rows"
1856
- }, getFieldRows()), React__default['default'].createElement("div", {
1995
+ }, getFieldRows()), React__default["default"].createElement("div", {
1857
1996
  className: "add-field-container"
1858
- }, React__default['default'].createElement(AddFieldButton, {
1997
+ }, React__default["default"].createElement(AddFieldButton, {
1859
1998
  label: props.addFieldLabel,
1860
1999
  onFieldAdded: onFieldAdd,
2000
+ disableAddFieldPopover: props.disableAddFieldPopover,
1861
2001
  allowCustom: props.customFieldOptions,
1862
- customLabel: _get__default['default'](props, 'customFieldOptions.label', ''),
2002
+ customLabel: _get__default["default"](props, 'customFieldOptions.label', ''),
1863
2003
  onCustomFieldAdded: props.customFieldOptions ? onCustomFieldAdd : function () {}
1864
2004
  }, getAvailableFields())));
1865
2005
  }
@@ -1867,6 +2007,7 @@ function TaskFields(props) {
1867
2007
  function AddFieldButton(props) {
1868
2008
  var label = props.label || '';
1869
2009
  var customLabel = props.customLabel || '';
2010
+ var disableAddFieldPopover = props.disableAddFieldPopover;
1870
2011
 
1871
2012
  var _useState7 = React.useState(false),
1872
2013
  _useState8 = _slicedToArray(_useState7, 2),
@@ -1874,7 +2015,7 @@ function AddFieldButton(props) {
1874
2015
  setPopoverShow = _useState8[1];
1875
2016
 
1876
2017
  var customId = uuidv4();
1877
- var CUSTOM_OPTION = React__default['default'].createElement(FieldItem, {
2018
+ var CUSTOM_OPTION = React__default["default"].createElement(FieldItem, {
1878
2019
  key: customId,
1879
2020
  onClick: function onClick() {
1880
2021
  props.onCustomFieldAdded();
@@ -1888,15 +2029,30 @@ function AddFieldButton(props) {
1888
2029
  setPopoverShow(false);
1889
2030
  };
1890
2031
 
2032
+ var children = [];
2033
+
1891
2034
  var onPopoverAnchorClick = function onPopoverAnchorClick() {
1892
- setPopoverShow(!popoverShow);
2035
+ if (!disableAddFieldPopover) {
2036
+ setPopoverShow(!popoverShow);
2037
+ } else {
2038
+ props.onFieldAdded(props.children !== 0 ? getFieldIdWhenPopoverIsClicked(props.children[0].props) : '');
2039
+ }
2040
+ };
2041
+
2042
+ var getFieldIdWhenPopoverIsClicked = function getFieldIdWhenPopoverIsClicked(field) {
2043
+ if (field.subMenu) {
2044
+ return getFieldIdWhenPopoverIsClicked(field.subMenu[0]);
2045
+ } else {
2046
+ return field.id;
2047
+ }
1893
2048
  };
1894
2049
 
1895
- var children = props.children.map(function (child) {
1896
- return React__default['default'].createElement(FieldItem, {
2050
+ children = props.children.map(function (child) {
2051
+ return React__default["default"].createElement(FieldItem, {
1897
2052
  name: child.props.name,
1898
2053
  key: child.props.id,
1899
2054
  id: child.props.id,
2055
+ subMenu: child.props.subMenu,
1900
2056
  onClick: function onClick(fieldId) {
1901
2057
  setPopoverShow(false);
1902
2058
  props.onFieldAdded(fieldId);
@@ -1908,18 +2064,18 @@ function AddFieldButton(props) {
1908
2064
  children.push(CUSTOM_OPTION);
1909
2065
  }
1910
2066
 
1911
- return React__default['default'].createElement("div", {
2067
+ return React__default["default"].createElement("div", {
1912
2068
  className: "add-field-button-container"
1913
- }, React__default['default'].createElement(Popover, {
2069
+ }, React__default["default"].createElement(Popover, {
1914
2070
  show: popoverShow,
1915
2071
  onClose: onPopoverClose,
1916
2072
  ignoreClickSelector: ".add-field-button",
1917
- anchor: React__default['default'].createElement(uiReact.Button, {
2073
+ anchor: React__default["default"].createElement(uiReact.Button, {
1918
2074
  disabled: children.length === 0,
1919
2075
  kind: "secondary",
1920
2076
  className: "add-field-button",
1921
2077
  onClick: onPopoverAnchorClick
1922
- }, React__default['default'].createElement("span", {
2078
+ }, React__default["default"].createElement("span", {
1923
2079
  className: "add-field-button-label"
1924
2080
  }, label))
1925
2081
  }, children));
@@ -1930,13 +2086,13 @@ function AddFieldHeaders(props) {
1930
2086
  inputHeaderText = props.inputHeaderText;
1931
2087
 
1932
2088
  if (itemHeaderText || inputHeaderText) {
1933
- return React__default['default'].createElement("div", {
2089
+ return React__default["default"].createElement("div", {
1934
2090
  className: "field-row"
1935
- }, React__default['default'].createElement("div", {
2091
+ }, React__default["default"].createElement("div", {
1936
2092
  className: "field-selector"
1937
- }, React__default['default'].createElement(uiReact.Label, null, itemHeaderText)), React__default['default'].createElement("div", {
2093
+ }, React__default["default"].createElement(uiReact.Label, null, itemHeaderText)), React__default["default"].createElement("div", {
1938
2094
  className: "field-input"
1939
- }, React__default['default'].createElement(uiReact.Label, null, inputHeaderText)));
2095
+ }, React__default["default"].createElement(uiReact.Label, null, inputHeaderText)));
1940
2096
  } else {
1941
2097
  return null;
1942
2098
  }
@@ -1948,19 +2104,19 @@ styleInject(css_248z$2);
1948
2104
  function SelectItem(props) {
1949
2105
  var checked = props.checked || false;
1950
2106
  var children = props.children || '';
1951
- return React__default['default'].createElement("div", {
2107
+ return React__default["default"].createElement("div", {
1952
2108
  className: "select-item",
1953
2109
  onClick: function onClick(event) {
1954
2110
  return props.onChange(props.value, event);
1955
2111
  }
1956
- }, React__default['default'].createElement("div", {
2112
+ }, React__default["default"].createElement("div", {
1957
2113
  className: "item"
1958
- }, React__default['default'].createElement("div", {
2114
+ }, React__default["default"].createElement("div", {
1959
2115
  className: "checked-container ".concat(checked ? 'checked' : '')
1960
- }, React__default['default'].createElement(uiReact.Icon, {
2116
+ }, React__default["default"].createElement(uiReact.Icon, {
1961
2117
  type: uiReact.IconTypes.Check,
1962
2118
  size: "medium"
1963
- })), React__default['default'].createElement("div", {
2119
+ })), React__default["default"].createElement("div", {
1964
2120
  className: "item-content"
1965
2121
  }, children)));
1966
2122
  }
@@ -1987,9 +2143,9 @@ function MultiselectDropdown(props) {
1987
2143
  };
1988
2144
 
1989
2145
  var renderToggleButton = function renderToggleButton() {
1990
- return React__default['default'].createElement("div", {
2146
+ return React__default["default"].createElement("div", {
1991
2147
  className: "multiselect-dropdown-toggle"
1992
- }, React__default['default'].createElement(uiReact.Button, {
2148
+ }, React__default["default"].createElement(uiReact.Button, {
1993
2149
  onClick: function onClick() {
1994
2150
  setIsDropdownOpen(!isDropdownOpen);
1995
2151
  }
@@ -2004,15 +2160,15 @@ function MultiselectDropdown(props) {
2004
2160
  children = temp;
2005
2161
  }
2006
2162
 
2007
- return React__default['default'].createElement("div", {
2163
+ return React__default["default"].createElement("div", {
2008
2164
  className: "multiselect-dropdown"
2009
- }, React__default['default'].createElement(Popover, {
2165
+ }, React__default["default"].createElement(Popover, {
2010
2166
  show: isDropdownOpen,
2011
2167
  onClose: onPopoverClose,
2012
2168
  ignoreClickSelector: ".multiselect-dropdown-toggle",
2013
2169
  anchor: renderToggleButton()
2014
2170
  }, children.map(function (child) {
2015
- return React__default['default'].createElement(SelectItem, {
2171
+ return React__default["default"].createElement(SelectItem, {
2016
2172
  onChange: handleChange,
2017
2173
  checked: child.props.checked,
2018
2174
  value: child.props.value,
@@ -2129,7 +2285,7 @@ function DynamicSearchInput(props) {
2129
2285
  switch (_context2.prev = _context2.next) {
2130
2286
  case 0:
2131
2287
  event.persist();
2132
- inputVal = _get__default['default'](event, 'target.value', '');
2288
+ inputVal = _get__default["default"](event, 'target.value', '');
2133
2289
  searchFunc = props.search ? props.search : defaultSearch;
2134
2290
  _context2.next = 5;
2135
2291
  return searchFunc(inputVal);
@@ -2147,11 +2303,11 @@ function DynamicSearchInput(props) {
2147
2303
 
2148
2304
  case 9:
2149
2305
  nextSearchResults = results.map(function (result) {
2150
- if (_get__default['default'](result, 'props.label') === undefined) {
2306
+ if (_get__default["default"](result, 'props.label') === undefined) {
2151
2307
  throw new Error('DynamicSearchInput: expected search result array values to have label property but found none');
2152
2308
  }
2153
2309
 
2154
- return React__default['default'].createElement(SearchItem, {
2310
+ return React__default["default"].createElement(SearchItem, {
2155
2311
  key: result.props.id,
2156
2312
  onClick: function onClick() {
2157
2313
  handleSearchItemSelected(result.props.label);
@@ -2182,12 +2338,12 @@ function DynamicSearchInput(props) {
2182
2338
  };
2183
2339
  }();
2184
2340
 
2185
- return React__default['default'].createElement("div", {
2341
+ return React__default["default"].createElement("div", {
2186
2342
  className: "dynamic-search-input"
2187
- }, React__default['default'].createElement(Popover, {
2343
+ }, React__default["default"].createElement(Popover, {
2188
2344
  show: isDropdownOpen,
2189
2345
  onClose: onPopoverClose,
2190
- anchor: React__default['default'].createElement(uiReact.Input, {
2346
+ anchor: React__default["default"].createElement(uiReact.Input, {
2191
2347
  className: "search-input",
2192
2348
  full: true,
2193
2349
  small: true,
@@ -2199,7 +2355,7 @@ function DynamicSearchInput(props) {
2199
2355
  }
2200
2356
 
2201
2357
  function SearchItem(props) {
2202
- return React__default['default'].createElement("div", {
2358
+ return React__default["default"].createElement("div", {
2203
2359
  className: "dynamic-search-popover-child",
2204
2360
  onClick: props.onClick
2205
2361
  }, props.children);