@qualtrics/plugin-ui-react 1.2.4 → 1.3.3-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @license @qualtrics/plugin-ui-react 1.2.4
1
+ /*! @license @qualtrics/plugin-ui-react 1.3.3-alpha.1
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) {
@@ -127,14 +129,9 @@ function ownKeys(object, enumerableOnly) {
127
129
 
128
130
  if (Object.getOwnPropertySymbols) {
129
131
  var symbols = Object.getOwnPropertySymbols(object);
130
-
131
- if (enumerableOnly) {
132
- symbols = symbols.filter(function (sym) {
133
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
134
- });
135
- }
136
-
137
- keys.push.apply(keys, symbols);
132
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
133
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
134
+ })), keys.push.apply(keys, symbols);
138
135
  }
139
136
 
140
137
  return keys;
@@ -142,19 +139,12 @@ function ownKeys(object, enumerableOnly) {
142
139
 
143
140
  function _objectSpread2(target) {
144
141
  for (var i = 1; i < arguments.length; i++) {
145
- var source = arguments[i] != null ? arguments[i] : {};
146
-
147
- if (i % 2) {
148
- ownKeys(Object(source), true).forEach(function (key) {
149
- _defineProperty(target, key, source[key]);
150
- });
151
- } else if (Object.getOwnPropertyDescriptors) {
152
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
153
- } else {
154
- ownKeys(Object(source)).forEach(function (key) {
155
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
156
- });
157
- }
142
+ var source = null != arguments[i] ? arguments[i] : {};
143
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
144
+ _defineProperty(target, key, source[key]);
145
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
146
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
147
+ });
158
148
  }
159
149
 
160
150
  return target;
@@ -163,17 +153,11 @@ function _objectSpread2(target) {
163
153
  function _typeof(obj) {
164
154
  "@babel/helpers - typeof";
165
155
 
166
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
167
- _typeof = function (obj) {
168
- return typeof obj;
169
- };
170
- } else {
171
- _typeof = function (obj) {
172
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
173
- };
174
- }
175
-
176
- return _typeof(obj);
156
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
157
+ return typeof obj;
158
+ } : function (obj) {
159
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
160
+ }, _typeof(obj);
177
161
  }
178
162
 
179
163
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
@@ -231,6 +215,9 @@ function _defineProperties(target, props) {
231
215
  function _createClass(Constructor, protoProps, staticProps) {
232
216
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
233
217
  if (staticProps) _defineProperties(Constructor, staticProps);
218
+ Object.defineProperty(Constructor, "prototype", {
219
+ writable: false
220
+ });
234
221
  return Constructor;
235
222
  }
236
223
 
@@ -261,6 +248,9 @@ function _inherits(subClass, superClass) {
261
248
  configurable: true
262
249
  }
263
250
  });
251
+ Object.defineProperty(subClass, "prototype", {
252
+ writable: false
253
+ });
264
254
  if (superClass) _setPrototypeOf(subClass, superClass);
265
255
  }
266
256
 
@@ -304,6 +294,8 @@ function _assertThisInitialized(self) {
304
294
  function _possibleConstructorReturn(self, call) {
305
295
  if (call && (typeof call === "object" || typeof call === "function")) {
306
296
  return call;
297
+ } else if (call !== void 0) {
298
+ throw new TypeError("Derived constructors may only return object or undefined");
307
299
  }
308
300
 
309
301
  return _assertThisInitialized(self);
@@ -349,7 +341,7 @@ function _iterableToArray(iter) {
349
341
  }
350
342
 
351
343
  function _iterableToArrayLimit(arr, i) {
352
- var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
344
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
353
345
 
354
346
  if (_i == null) return;
355
347
  var _arr = [];
@@ -587,8 +579,8 @@ var languageCodeMapping = {
587
579
  RU: 'ru',
588
580
  SV: 'sv',
589
581
  TH: 'th',
590
- 'ZH-S': 'zh-HANS',
591
- 'ZH-T': 'zh-HANT'
582
+ 'ZH-S': 'zh-Hans',
583
+ 'ZH-T': 'zh-Hant'
592
584
  };
593
585
  function languageCodeAdapter(languageCode) {
594
586
  var adaptedCode;
@@ -675,7 +667,7 @@ var Portal = function (_Component) {
675
667
  }, {
676
668
  key: "render",
677
669
  value: function render() {
678
- return ReactDOM__default['default'].createPortal(this.props.children, this.container);
670
+ return ReactDOM__default["default"].createPortal(this.props.children, this.container);
679
671
  }
680
672
  }]);
681
673
 
@@ -687,10 +679,10 @@ styleInject(css_248z$a);
687
679
 
688
680
  var globalClickRegistry = new EventRegistry();
689
681
  var DEFAULT_PLACEMENT = 'bottom-start';
690
- var DEFAULT_ANCHOR = React__default['default'].createElement(uiReact.Button, null, " anchor ");
682
+ var DEFAULT_ANCHOR = React__default["default"].createElement(uiReact.Button, null, " anchor ");
691
683
  var defaultModifiers = [];
692
684
  initGlobalListener();
693
- function Popover(props, ref) {
685
+ function Popover(props) {
694
686
  var _useState = React.useState(false),
695
687
  _useState2 = _slicedToArray(_useState, 2),
696
688
  isOpen = _useState2[0],
@@ -711,7 +703,7 @@ function Popover(props, ref) {
711
703
  anchor = props.anchor(ref);
712
704
  } else {
713
705
  anchor = props.anchor;
714
- anchor = React__default['default'].createElement("div", {
706
+ anchor = React__default["default"].createElement("div", {
715
707
  ref: ref,
716
708
  className: "popover-anchor-container"
717
709
  }, props.anchor || DEFAULT_ANCHOR);
@@ -745,7 +737,7 @@ function Popover(props, ref) {
745
737
  setIsOpen(props.show);
746
738
  }
747
739
  }, [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, {
740
+ 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
741
  placement: props.placement || DEFAULT_PLACEMENT,
750
742
  modifiers: modifiers
751
743
  }, function (_ref2) {
@@ -771,12 +763,12 @@ function Popover(props, ref) {
771
763
  optionsRef.current.scheduleUpdate = scheduleUpdate;
772
764
  }
773
765
  });
774
- return React__default['default'].createElement("div", {
766
+ return React__default["default"].createElement("div", {
775
767
  ref: ref,
776
768
  "data-placement": placement,
777
769
  style: _objectSpread2({}, style),
778
770
  className: "q-popover"
779
- }, props.children, React__default['default'].createElement("div", {
771
+ }, props.children, React__default["default"].createElement("div", {
780
772
  ref: arrowProps.ref,
781
773
  style: arrowProps.style
782
774
  }));
@@ -800,7 +792,7 @@ function initGlobalListener() {
800
792
  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
793
  styleInject(css_248z$9);
802
794
 
803
- var EmbeddedDataMenu = React__default['default'].forwardRef(function (props, ref) {
795
+ var EmbeddedDataMenu = React__default["default"].forwardRef(function (props, ref) {
804
796
  var _useState = React.useState(''),
805
797
  _useState2 = _slicedToArray(_useState, 2),
806
798
  inputValue = _useState2[0],
@@ -823,7 +815,7 @@ var EmbeddedDataMenu = React__default['default'].forwardRef(function (props, ref
823
815
 
824
816
  React.useEffect(function () {
825
817
  setTimeout(function () {
826
- if (_get__default['default'](inputRef, 'current.focus') !== undefined) {
818
+ if (_get__default["default"](inputRef, 'current.focus') !== undefined) {
827
819
  inputRef.current.focus();
828
820
  }
829
821
  });
@@ -861,24 +853,24 @@ var EmbeddedDataMenu = React__default['default'].forwardRef(function (props, ref
861
853
  handleAddButtonClick();
862
854
  };
863
855
 
864
- return React__default['default'].createElement(Popover, {
856
+ return React__default["default"].createElement(Popover, {
865
857
  show: props.show,
866
858
  anchor: anchor,
867
859
  onClose: onClose,
868
860
  ignoreClickSelector: ignoreClickSelector,
869
861
  placement: props.placement || 'right-start'
870
- }, React__default['default'].createElement("div", {
862
+ }, React__default["default"].createElement("div", {
871
863
  className: "embedded-data-menu"
872
- }, React__default['default'].createElement("div", null, React__default['default'].createElement(uiReact.InputGroup, null, React__default['default'].createElement(uiReact.Input, {
864
+ }, React__default["default"].createElement("div", null, React__default["default"].createElement(uiReact.InputGroup, null, React__default["default"].createElement(uiReact.Input, {
873
865
  onChange: handleInputChange,
874
866
  invalid: isInputInvalid,
875
867
  onKeyDown: handleInputKeyDown,
876
868
  ref: inputRef,
877
869
  className: "q-plugin-popover-input"
878
- }), React__default['default'].createElement(uiReact.Button, {
870
+ }), React__default["default"].createElement(uiReact.Button, {
879
871
  kind: "primary",
880
872
  onClick: handleAddButtonClick
881
- }, React__default['default'].createElement(uiReact.Icon, {
873
+ }, React__default["default"].createElement(uiReact.Icon, {
882
874
  type: uiReact.IconTypes.Add
883
875
  }))))));
884
876
  });
@@ -887,11 +879,11 @@ var css_248z$8 = "div[role=\"menu\"] .piped-text-search-input-container {\n pad
887
879
  styleInject(css_248z$8);
888
880
 
889
881
  var EMBEDDED_DATA_LOCATOR = 'embeddedData';
890
- var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
882
+ var PipedTextMenu = React__default["default"].forwardRef(function PipedTextMenu(props, ref) {
891
883
  var defaultMenuItems = undefined;
892
884
 
893
885
  if (typeof props.items !== 'function') {
894
- defaultMenuItems = _cloneDeep__default['default'](props.items);
886
+ defaultMenuItems = _cloneDeep__default["default"](props.items);
895
887
  }
896
888
 
897
889
  var optionsRef = React.useRef({});
@@ -916,8 +908,47 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
916
908
  searchValue = _useState8[0],
917
909
  setSearchValue = _useState8[1];
918
910
 
919
- var onClose = props.onClose || function () {};
911
+ var _useState9 = React.useState(undefined),
912
+ _useState10 = _slicedToArray(_useState9, 2),
913
+ isSubmenu = _useState10[0],
914
+ setIsSubmenu = _useState10[1];
915
+
916
+ var onClose = props.onClose || function () {
917
+ return undefined;
918
+ };
919
+
920
+ var _useState11 = React.useState(null),
921
+ _useState12 = _slicedToArray(_useState11, 2),
922
+ popoverEl = _useState12[0],
923
+ setPopoverEl = _useState12[1];
924
+
925
+ var popoverRefCb = React.useCallback(function (el) {
926
+ setPopoverEl(el);
927
+ }, []);
928
+
929
+ var _useState13 = React.useState(null),
930
+ _useState14 = _slicedToArray(_useState13, 2),
931
+ searchBoxEl = _useState14[0],
932
+ setSearchBoxEl = _useState14[1];
920
933
 
934
+ var searchBoxRefCb = React.useCallback(function (el) {
935
+ setSearchBoxEl(el);
936
+ }, []);
937
+ React.useEffect(function () {
938
+ var anchorRefEl = _get__default["default"](props, 'anchorRef.current');
939
+
940
+ if (anchorRefEl) {
941
+ var anchorRefElRole = anchorRefEl.getAttribute('role');
942
+ var nextIsSubmenu = anchorRefElRole === 'menuitem';
943
+ setIsSubmenu(nextIsSubmenu);
944
+ }
945
+
946
+ if (isSubmenu === true) ; else if (isSubmenu === false) {
947
+ if (popoverEl !== null) {
948
+ popoverEl.focus();
949
+ }
950
+ }
951
+ }, [popoverEl, searchBoxEl, props.anchorRef, isSubmenu]);
921
952
  React.useEffect(function () {
922
953
  _asyncToGenerator(regeneratorRuntime.mark(function _callee() {
923
954
  var newMenuItems;
@@ -977,7 +1008,7 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
977
1008
 
978
1009
  var reRenderMenus = function reRenderMenus() {
979
1010
  var nextMenuItems;
980
- nextMenuItems = _cloneDeep__default['default'](menuItems);
1011
+ nextMenuItems = _cloneDeep__default["default"](menuItems);
981
1012
  setMenuItems(nextMenuItems);
982
1013
  };
983
1014
 
@@ -995,14 +1026,14 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
995
1026
  menuItem.show = true;
996
1027
  }
997
1028
 
998
- nextMenuItems = _cloneDeep__default['default'](menuItems);
1029
+ nextMenuItems = _cloneDeep__default["default"](menuItems);
999
1030
  setMenuItems(nextMenuItems);
1000
1031
  };
1001
1032
 
1002
1033
  var menuItemHovered = function menuItemHovered(menuItem, evt) {
1003
1034
  var nextMenuItems;
1004
1035
  closeSubmenus(menuItems);
1005
- nextMenuItems = _cloneDeep__default['default'](menuItems);
1036
+ nextMenuItems = _cloneDeep__default["default"](menuItems);
1006
1037
  setMenuItems(nextMenuItems);
1007
1038
  };
1008
1039
 
@@ -1012,6 +1043,10 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1012
1043
  setSearchValue(searchVal);
1013
1044
  };
1014
1045
 
1046
+ var handleSearchInputClick = function handleSearchInputClick(evt) {
1047
+ evt.stopPropagation();
1048
+ };
1049
+
1015
1050
  var matchesSearch = function matchesSearch(item) {
1016
1051
  var searchVal = searchValue || '';
1017
1052
  searchVal = searchVal.trim().toLowerCase();
@@ -1041,12 +1076,13 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1041
1076
  props.onSelected(edMenuItem);
1042
1077
  };
1043
1078
 
1044
- var getSubmenuItem = function getSubmenuItem(menuItem) {
1045
- return React__default['default'].createElement("div", {
1079
+ var SubmenuItem = function SubmenuItem(props) {
1080
+ var submenuAnchorRef = React.useRef(null);
1081
+ var menuItem = props.menuItem;
1082
+ return React__default["default"].createElement("div", {
1046
1083
  "data-testid": "piped-text-submenu",
1047
- className: "piped-text-submenu-item-container",
1048
- key: menuItem.key
1049
- }, menuItem.show && React__default['default'].createElement(PipedTextMenu, {
1084
+ className: "piped-text-submenu-item-container"
1085
+ }, menuItem.show && React__default["default"].createElement(PipedTextMenu, {
1050
1086
  items: menuItem.submenu.items,
1051
1087
  show: menuItem.show,
1052
1088
  placement: "right-start",
@@ -1060,21 +1096,25 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1060
1096
  errorText: menuItem.submenu.errorText,
1061
1097
  onSelected: menuItemClicked,
1062
1098
  anchor: function anchor(ref) {
1063
- return React__default['default'].createElement("div", {
1099
+ return React__default["default"].createElement("div", {
1064
1100
  ref: ref,
1065
1101
  className: "piped-text-submenu-anchor"
1066
1102
  });
1067
- }
1068
- }), React__default['default'].createElement("div", {
1103
+ },
1104
+ anchorRef: submenuAnchorRef
1105
+ }), React__default["default"].createElement("div", {
1069
1106
  className: "piped-text-submenu-item",
1107
+ "aria-haspopup": "menu",
1108
+ role: "menuitem",
1070
1109
  onMouseEnter: function onMouseEnter($e) {
1071
1110
  return submenuHovered(menuItem);
1072
- }
1073
- }, React__default['default'].createElement("div", {
1111
+ },
1112
+ ref: submenuAnchorRef
1113
+ }, React__default["default"].createElement("div", {
1074
1114
  className: "label-text"
1075
- }, menuItem.label), React__default['default'].createElement("div", {
1115
+ }, menuItem.label), React__default["default"].createElement("div", {
1076
1116
  className: "piped-text-icon"
1077
- }, React__default['default'].createElement(uiReact.Icon, {
1117
+ }, React__default["default"].createElement(uiReact.Icon, {
1078
1118
  type: uiReact.IconTypes.ChevronRight,
1079
1119
  size: "medium"
1080
1120
  }))));
@@ -1082,7 +1122,7 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1082
1122
 
1083
1123
  var getPipedTextMenuItems = function getPipedTextMenuItems(menuItems) {
1084
1124
  if (menuItems.length === 0 && props.allowCustom === true && props.customInputMessage) {
1085
- return React__default['default'].createElement("div", null, React__default['default'].createElement("div", {
1125
+ return React__default["default"].createElement("div", null, React__default["default"].createElement("div", {
1086
1126
  className: "piped-text-information-message"
1087
1127
  }, props.customInputMessage));
1088
1128
  }
@@ -1091,17 +1131,20 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1091
1131
  var menuItemHeaderClass, menuItemDisabledClass, menuItemClassName;
1092
1132
 
1093
1133
  if (menuItem.hasSubmenu) {
1094
- return getSubmenuItem(menuItem);
1134
+ return React__default["default"].createElement(SubmenuItem, {
1135
+ key: menuItem.key,
1136
+ menuItem: menuItem
1137
+ });
1095
1138
  } else if (menuItem.header === true || menuItem.disabled === true) {
1096
1139
  menuItemHeaderClass = menuItem.header === true ? 'piped-text-header' : '';
1097
1140
  menuItemDisabledClass = menuItem.disabled === true ? 'piped-text-disabled' : '';
1098
1141
  menuItemClassName = "piped-text-menu-item ".concat(menuItemHeaderClass, " ").concat(menuItemDisabledClass);
1099
- return React__default['default'].createElement("div", {
1142
+ return React__default["default"].createElement("div", {
1100
1143
  key: menuItem.key,
1101
1144
  className: menuItemClassName
1102
1145
  }, menuItem.label);
1103
1146
  } else if (menuItem.value === EMBEDDED_DATA_LOCATOR) {
1104
- return React__default['default'].createElement("div", {
1147
+ return React__default["default"].createElement("div", {
1105
1148
  key: menuItem.key,
1106
1149
  onClick: function onClick($e) {
1107
1150
  return embeddedDataItemClicked(menuItem);
@@ -1109,20 +1152,20 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1109
1152
  onMouseEnter: function onMouseEnter($e) {
1110
1153
  return menuItemHovered();
1111
1154
  }
1112
- }, React__default['default'].createElement(EmbeddedDataMenu, {
1155
+ }, React__default["default"].createElement(EmbeddedDataMenu, {
1113
1156
  show: menuItem.show,
1114
1157
  onSelect: handleEmbeddedDataSelect,
1115
1158
  anchor: function anchor(ref) {
1116
- return React__default['default'].createElement("div", {
1159
+ return React__default["default"].createElement("div", {
1117
1160
  ref: ref,
1118
1161
  className: "embedded-data-menu-anchor"
1119
1162
  });
1120
1163
  }
1121
- }), React__default['default'].createElement("div", {
1164
+ }), React__default["default"].createElement("div", {
1122
1165
  className: "piped-text-menu-item"
1123
1166
  }, menuItem.label));
1124
1167
  } else {
1125
- return React__default['default'].createElement("div", {
1168
+ return React__default["default"].createElement("div", {
1126
1169
  key: menuItem.key,
1127
1170
  onMouseEnter: function onMouseEnter($e) {
1128
1171
  return menuItemHovered();
@@ -1130,7 +1173,7 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1130
1173
  onClick: function onClick($e) {
1131
1174
  return menuItemClicked(menuItem);
1132
1175
  }
1133
- }, React__default['default'].createElement("div", {
1176
+ }, React__default["default"].createElement("div", {
1134
1177
  className: "piped-text-menu-item"
1135
1178
  }, menuItem.label));
1136
1179
  }
@@ -1161,23 +1204,23 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1161
1204
  };
1162
1205
 
1163
1206
  var getLoadError = function getLoadError() {
1164
- return React__default['default'].createElement("div", {
1207
+ return React__default["default"].createElement("div", {
1165
1208
  className: "piped-text-popover-container"
1166
- }, React__default['default'].createElement("div", {
1209
+ }, React__default["default"].createElement("div", {
1167
1210
  className: "piped-text-error-container"
1168
- }, React__default['default'].createElement("div", {
1211
+ }, React__default["default"].createElement("div", {
1169
1212
  className: "piped-text-error-icon"
1170
- }, React__default['default'].createElement(icons.ErrorIcon, {
1213
+ }, React__default["default"].createElement(icons.ErrorIcon, {
1171
1214
  size: "medium"
1172
- })), props.errorText && React__default['default'].createElement("div", {
1215
+ })), props.errorText && React__default["default"].createElement("div", {
1173
1216
  className: "piped-text-error-text"
1174
1217
  }, props.errorText)));
1175
1218
  };
1176
1219
 
1177
1220
  var getLoadingSpinner = function getLoadingSpinner() {
1178
- return React__default['default'].createElement("div", {
1221
+ return React__default["default"].createElement("div", {
1179
1222
  className: "piped-text-loading-spinner"
1180
- }, React__default['default'].createElement(uiReact.LoadingSpinner, {
1223
+ }, React__default["default"].createElement(uiReact.LoadingSpinner, {
1181
1224
  show: true,
1182
1225
  size: "medium"
1183
1226
  }));
@@ -1188,13 +1231,13 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1188
1231
  return getLoadError();
1189
1232
  } else {
1190
1233
  var itemsToRender = (menuItems || []).filter(matchesSearch);
1191
- return React__default['default'].createElement("div", {
1192
- className: "piped-text-popover-container"
1193
- }, React__default['default'].createElement("div", {
1234
+ return React__default["default"].createElement("div", {
1235
+ className: "piped-text-popover-menu"
1236
+ }, React__default["default"].createElement("div", {
1194
1237
  className: "piped-text-search-input"
1195
- }, React__default['default'].createElement("form", {
1238
+ }, React__default["default"].createElement("form", {
1196
1239
  onSubmit: handleSearchSubmit
1197
- }, React__default['default'].createElement(uiReact.Input, {
1240
+ }, React__default["default"].createElement(uiReact.Input, {
1198
1241
  small: true,
1199
1242
  full: true,
1200
1243
  placeholder: props.searchPlaceholder,
@@ -1202,28 +1245,45 @@ var PipedTextMenu = React__default['default'].forwardRef(function (props, ref) {
1202
1245
  value: searchValue,
1203
1246
  onChange: function onChange($e) {
1204
1247
  return onSearchInputChange($e);
1205
- }
1248
+ },
1249
+ onClick: function onClick($e) {
1250
+ return handleSearchInputClick($e);
1251
+ },
1252
+ ref: searchBoxRefCb
1206
1253
  }))), menuItems === undefined ? getLoadingSpinner() : getPipedTextMenuItems(itemsToRender));
1207
1254
  }
1208
1255
  };
1209
1256
 
1210
- return React__default['default'].createElement("div", {
1257
+ return React__default["default"].createElement("div", {
1211
1258
  className: "piped-text-menu"
1212
- }, React__default['default'].createElement(Popover, {
1259
+ }, React__default["default"].createElement(Popover, {
1213
1260
  show: isMenuOpen,
1214
1261
  onClose: _onClose,
1215
1262
  placement: props.placement || 'right-start',
1216
1263
  anchor: props.anchor,
1217
1264
  ignoreClickSelector: props.ignoreClickSelector
1218
- }, React__default['default'].createElement("div", {
1219
- className: "piped-text-popover-container"
1220
- }, getMenuContent()), React__default['default'].createElement(OptionsPlaceholder, {
1265
+ }, React__default["default"].createElement("div", {
1266
+ className: "piped-text-popover-container",
1267
+ ref: popoverRefCb,
1268
+ onFocus: function onFocus($e) {
1269
+ return handleFocus($e);
1270
+ },
1271
+ tabIndex: props.tabIndex !== undefined ? props.tabIndex : -1
1272
+ }, getMenuContent()), React__default["default"].createElement(OptionsPlaceholder, {
1221
1273
  optionsRef: optionsRef
1222
1274
  })));
1275
+
1276
+ function handleFocus(evt) {
1277
+ if (!isSubmenu && searchBoxEl !== null) {
1278
+ searchBoxEl.focus();
1279
+ }
1280
+
1281
+ evt.stopPropagation();
1282
+ }
1223
1283
  });
1224
1284
 
1225
1285
  function OptionsPlaceholder() {
1226
- return React__default['default'].createElement("span", null);
1286
+ return React__default["default"].createElement("span", null);
1227
1287
  }
1228
1288
 
1229
1289
  function closeSubmenus(menuItems) {
@@ -1238,13 +1298,13 @@ function pipedTextDataAdapter(pipedTextData, recursed) {
1238
1298
  var uniqueKey;
1239
1299
 
1240
1300
  if (!recursed) {
1241
- pipedTextData = _cloneDeep__default['default'](pipedTextData);
1301
+ pipedTextData = _cloneDeep__default["default"](pipedTextData);
1242
1302
  }
1243
1303
 
1244
1304
  uniqueKey = 1;
1245
1305
  pipedTextData.forEach(function (pipedTextItem) {
1246
1306
  pipedTextItem.key = pipedTextItem.key || uniqueKey++;
1247
- pipedTextItem.hasSubmenu = !!_get__default['default'](pipedTextItem, 'submenu.items.length') || typeof _get__default['default'](pipedTextItem, 'submenu.items') === 'function';
1307
+ pipedTextItem.hasSubmenu = !!_get__default["default"](pipedTextItem, 'submenu.items.length') || typeof _get__default["default"](pipedTextItem, 'submenu.items') === 'function';
1248
1308
 
1249
1309
  if (pipedTextItem.hasSubmenu || pipedTextItem.value === EMBEDDED_DATA_LOCATOR) {
1250
1310
  pipedTextItem.show = false;
@@ -1263,7 +1323,7 @@ var css_248z$7 = ".piped-text-dropdown button[type=button].popover-toggle-button
1263
1323
  styleInject(css_248z$7);
1264
1324
 
1265
1325
  var defaultAnchor = function defaultAnchor(ref) {
1266
- return React__default['default'].createElement("div", {
1326
+ return React__default["default"].createElement("div", {
1267
1327
  ref: ref,
1268
1328
  className: "piped-text-menu-empty-anchor"
1269
1329
  });
@@ -1280,23 +1340,8 @@ function PipedTextSelect(props) {
1280
1340
  pipedTextItems = _useState4[0],
1281
1341
  setPipedTextItems = _useState4[1];
1282
1342
 
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
-
1343
+ var defaultAnchorRef = React.useRef(null);
1344
+ var externalAnchor = props.anchor;
1300
1345
  React.useEffect(function () {
1301
1346
  return function () {
1302
1347
  return onClose();
@@ -1311,16 +1356,39 @@ function PipedTextSelect(props) {
1311
1356
  var formattedPipedText = initializePipedText();
1312
1357
  setPipedTextItems(formattedPipedText);
1313
1358
  }, [props.items]);
1314
- return React__default['default'].createElement("div", {
1359
+
1360
+ var onClose = function onClose() {
1361
+ if (props.onClose) {
1362
+ props.onClose();
1363
+ }
1364
+ };
1365
+
1366
+ var onSelect = function onSelect(selected) {
1367
+ props.onSelect(selected);
1368
+ onClose();
1369
+ };
1370
+
1371
+ var actualAnchor = externalAnchor !== undefined ? React__default["default"].cloneElement(externalAnchor, {
1372
+ ref: externalAnchor.ref
1373
+ }) : defaultAnchor(defaultAnchorRef);
1374
+ var anchorRef = props.anchorRef || actualAnchor.ref;
1375
+ return React__default["default"].createElement("div", {
1315
1376
  className: "piped-text-dropdown"
1316
- }, isMenuOpen && React__default['default'].createElement(PipedTextMenu, {
1377
+ }, isMenuOpen && React__default["default"].createElement(PipedTextMenu, {
1317
1378
  onClose: onClose,
1318
1379
  show: isMenuOpen,
1319
1380
  onSelected: onSelect,
1320
1381
  items: pipedTextItems,
1321
- anchor: props.anchor || defaultAnchor,
1382
+ anchor: actualAnchor,
1383
+ anchorRef: anchorRef,
1322
1384
  ignoreClickSelector: props.ignoreClickSelector
1323
1385
  }));
1386
+
1387
+ function initializePipedText() {
1388
+ if (props.items) {
1389
+ return pipedTextDataAdapter(props.items);
1390
+ }
1391
+ }
1324
1392
  }
1325
1393
 
1326
1394
  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 +1397,7 @@ styleInject(css_248z$6);
1329
1397
  function PipedTextInput(props) {
1330
1398
  var _a = React.useState(false), showMenu = _a[0], setShowMenu = _a[1];
1331
1399
  var _b = React.useState(), cursorPosition = _b[0], setCursorPosition = _b[1];
1400
+ var pipedTextButtonRef = React.useRef(null);
1332
1401
  /*
1333
1402
  This has to be an Object type ref instead of 'string' or React will lose
1334
1403
  track of state, and the supplied props input value will become stale
@@ -1358,21 +1427,21 @@ function PipedTextInput(props) {
1358
1427
  value: nextInputValue,
1359
1428
  });
1360
1429
  }, [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) {
1430
+ return (React__default["default"].createElement("div", { className: "piped-text-input" },
1431
+ React__default["default"].createElement("div", { className: 'piped-text-input-toggle popover-toggle' + (multiline ? ' multiline-input' : '') },
1432
+ React__default["default"].createElement(uiReact.Input, __assign({ value: inputRefValue.value, onChange: function (evt) {
1364
1433
  onInputChange(evt);
1365
1434
  }, 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)))))));
1435
+ React__default["default"].createElement(uiReact.IconButton, { "aria-label": "PipedText", "aria-haspopup": "menu", "aria-expanded": showMenu ? true : undefined, role: "button", onClick: toggleMenu, ref: pipedTextButtonRef },
1436
+ React__default["default"].createElement(icons.PipedTextIcon, null)),
1437
+ React__default["default"].createElement("div", { className: "piped-text-select-container" },
1438
+ React__default["default"].createElement(PipedTextSelect, { items: items, onSelect: pipedTextSelected, show: showMenu, onClose: handleClose, ignoreClickSelector: "piped-text-input-toggle", anchorRef: pipedTextButtonRef }))),
1439
+ showAddonText() && (React__default["default"].createElement("div", { className: "addon-text-container" },
1440
+ helperText && (React__default["default"].createElement("div", { className: "helper-text" }, helperText)),
1441
+ errorText && (React__default["default"].createElement("div", { className: "error-text" },
1442
+ React__default["default"].createElement("div", { className: "error-text-icon" },
1443
+ React__default["default"].createElement(icons.ErrorIcon, null)),
1444
+ React__default["default"].createElement("div", { className: "error-text-content" }, errorText)))))));
1376
1445
  function showAddonText() {
1377
1446
  return ((helperText !== undefined) || (errorText !== undefined));
1378
1447
  }
@@ -1395,10 +1464,10 @@ function PipedTextInput(props) {
1395
1464
  function pipedTextSelected(selected) {
1396
1465
  var nextInputValue, prependString, appendString;
1397
1466
  handleSelect(selected);
1398
- if (_get__default['default'](selected, 'value.locator')) {
1467
+ if (_get__default["default"](selected, 'value.locator')) {
1399
1468
  prependString = inputRefValue.value.substring(0, cursorPosition);
1400
1469
  appendString = inputRefValue.value.substring(cursorPosition);
1401
- nextInputValue = "" + prependString + selected.value.locator + appendString;
1470
+ nextInputValue = "".concat(prependString).concat(selected.value.locator).concat(appendString);
1402
1471
  setInputRefValue({
1403
1472
  value: nextInputValue,
1404
1473
  });
@@ -1469,13 +1538,13 @@ function FieldRow(props) {
1469
1538
  }
1470
1539
  };
1471
1540
 
1472
- return React__default['default'].createElement("div", {
1541
+ return React__default["default"].createElement("div", {
1473
1542
  className: "icon-wrapper",
1474
1543
  onClick: handleDelete
1475
- }, !props.required && React__default['default'].createElement(uiReact.IconButton, {
1544
+ }, !props.required && React__default["default"].createElement(uiReact.IconButton, {
1476
1545
  "aria-label": "RemoveRow",
1477
1546
  size: "medium"
1478
- }, React__default['default'].createElement(icons.RemoveItemIcon, null)));
1547
+ }, React__default["default"].createElement(icons.RemoveItemIcon, null)));
1479
1548
  };
1480
1549
 
1481
1550
  var handleFieldSwitch = function handleFieldSwitch(newFieldId) {
@@ -1511,7 +1580,7 @@ function FieldRow(props) {
1511
1580
  var getFieldSelector = function getFieldSelector() {
1512
1581
  var getInternalContent = function getInternalContent() {
1513
1582
  if (props.isCustom) {
1514
- return React__default['default'].createElement(uiReact.Input, {
1583
+ return React__default["default"].createElement(uiReact.Input, {
1515
1584
  full: true,
1516
1585
  value: props.fieldName === undefined ? '' : props.fieldName,
1517
1586
  placeholder: props.customNamePlaceholder === undefined ? '' : props.customNamePlaceholder,
@@ -1521,35 +1590,61 @@ function FieldRow(props) {
1521
1590
  }
1522
1591
 
1523
1592
  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
- }, "*"));
1593
+ if (props.subMenu) {
1594
+ return React__default["default"].createElement(uiReact.SelectMenu, {
1595
+ searchable: props.searchable !== undefined && props.searchable !== false,
1596
+ defaultLabel: props.fieldName || '',
1597
+ label: props.fieldName,
1598
+ className: "full-width left-align",
1599
+ onChange: handleFieldSwitch
1600
+ }, createMenuItems([{
1601
+ id: props.id,
1602
+ name: props.fieldName,
1603
+ subMenu: props.subMenu,
1604
+ subMenuLabel: props.subMenuLabel
1605
+ }]));
1606
+ } else {
1607
+ return React__default["default"].createElement("div", {
1608
+ className: "required-indicator-container"
1609
+ }, React__default["default"].createElement("div", {
1610
+ className: "required-indicator-text"
1611
+ }, props.fieldName), props.required && React__default["default"].createElement("div", {
1612
+ className: "required-indicator-symbol"
1613
+ }, "*"));
1614
+ }
1531
1615
  }
1532
1616
 
1533
- return React__default['default'].createElement(uiReact.SelectMenu, {
1617
+ return React__default["default"].createElement(uiReact.SelectMenu, {
1534
1618
  searchable: props.searchable !== undefined && props.searchable !== false,
1535
1619
  defaultLabel: props.fieldName || '',
1536
1620
  label: props.fieldName,
1537
1621
  className: "full-width left-align",
1538
1622
  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
- }));
1623
+ }, createMenuItems(children));
1545
1624
  };
1546
1625
 
1547
- var tooltipContent = React__default['default'].createElement("div", null, props.nameTooltip);
1548
- return React__default['default'].createElement(uiReact.Tooltip, {
1626
+ var tooltipContent = React__default["default"].createElement("div", null, props.nameTooltip);
1627
+ return React__default["default"].createElement(uiReact.Tooltip, {
1549
1628
  disabled: !props.isCustom || shouldDisableTooltip(props.nameTooltip),
1550
1629
  placement: "top",
1551
1630
  content: tooltipContent
1552
- }, React__default['default'].createElement("div", null, getInternalContent()));
1631
+ }, React__default["default"].createElement("div", null, getInternalContent()));
1632
+ };
1633
+
1634
+ var createMenuItems = function createMenuItems(items) {
1635
+ return items.map(function (_ref) {
1636
+ var id = _ref.id,
1637
+ name = _ref.name,
1638
+ subMenu = _ref.subMenu,
1639
+ subMenuLabel = _ref.subMenuLabel;
1640
+ return subMenu !== undefined ? React__default["default"].createElement(uiReact.SelectMenu, {
1641
+ label: subMenuLabel ? subMenuLabel : name,
1642
+ key: id
1643
+ }, createMenuItems(subMenu)) : React__default["default"].createElement(uiReact.MenuItem, {
1644
+ key: id,
1645
+ value: id
1646
+ }, name);
1647
+ });
1553
1648
  };
1554
1649
 
1555
1650
  var getFieldInput = function getFieldInput() {
@@ -1557,7 +1652,7 @@ function FieldRow(props) {
1557
1652
  if (props.customInput) {
1558
1653
  return props.customInput;
1559
1654
  } else {
1560
- return React__default['default'].createElement(PipedTextInput, {
1655
+ return React__default["default"].createElement(PipedTextInput, {
1561
1656
  items: props.pipedTextItems,
1562
1657
  value: props.value === undefined ? '' : props.value,
1563
1658
  onChange: handleFieldValueChange,
@@ -1566,23 +1661,23 @@ function FieldRow(props) {
1566
1661
  }
1567
1662
  };
1568
1663
 
1569
- var tooltipContent = React__default['default'].createElement("div", null, props.valueTooltip);
1570
- return React__default['default'].createElement(uiReact.Tooltip, {
1664
+ var tooltipContent = React__default["default"].createElement("div", null, props.valueTooltip);
1665
+ return React__default["default"].createElement(uiReact.Tooltip, {
1571
1666
  disabled: shouldDisableTooltip(props.valueTooltip),
1572
1667
  placement: "top",
1573
1668
  content: tooltipContent
1574
- }, React__default['default'].createElement("div", null, getInternalContent()));
1669
+ }, React__default["default"].createElement("div", null, getInternalContent()));
1575
1670
  };
1576
1671
 
1577
- return React__default['default'].createElement("div", {
1672
+ return React__default["default"].createElement("div", {
1578
1673
  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", {
1674
+ }, React__default["default"].createElement("div", {
1675
+ className: "field-selector ".concat(props.required && !props.subMenu ? 'required-field' : '')
1676
+ }, getFieldSelector()), React__default["default"].createElement("div", {
1582
1677
  className: "field-input-container"
1583
- }, React__default['default'].createElement("div", {
1678
+ }, React__default["default"].createElement("div", {
1584
1679
  className: "field-input"
1585
- }, getFieldInput()), React__default['default'].createElement("div", {
1680
+ }, getFieldInput()), React__default["default"].createElement("div", {
1586
1681
  className: "delete-row"
1587
1682
  }, getRowDelete())));
1588
1683
  }
@@ -1599,7 +1694,7 @@ function FieldItem(props) {
1599
1694
  }
1600
1695
  };
1601
1696
 
1602
- return React__default['default'].createElement("div", {
1697
+ return React__default["default"].createElement("div", {
1603
1698
  className: "field-item",
1604
1699
  onClick: handleClick
1605
1700
  }, label);
@@ -1608,7 +1703,7 @@ function FieldItem(props) {
1608
1703
  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
1704
  styleInject(css_248z$3);
1610
1705
 
1611
- var uuidv4 = uuid__default['default'].v4;
1706
+ var uuidv4 = uuid__default["default"].v4;
1612
1707
  var CUSTOM_TYPE = 'custom';
1613
1708
  function TaskFields(props) {
1614
1709
  var _useState = React.useState([]),
@@ -1639,7 +1734,7 @@ function TaskFields(props) {
1639
1734
  };
1640
1735
 
1641
1736
  var onFieldNameChange = function onFieldNameChange(fieldId, event) {
1642
- var changeFn = _get__default['default'](props, 'customFieldOptions.onCustomFieldNameChange');
1737
+ var changeFn = _get__default["default"](props, 'customFieldOptions.onCustomFieldNameChange');
1643
1738
 
1644
1739
  if (typeof changeFn === 'function') {
1645
1740
  changeFn(fieldId, event);
@@ -1648,13 +1743,15 @@ function TaskFields(props) {
1648
1743
 
1649
1744
  var getFieldRows = function getFieldRows() {
1650
1745
  return fieldsInUse.map(function (field) {
1651
- return React__default['default'].createElement(FieldRow, {
1746
+ return React__default["default"].createElement(FieldRow, {
1652
1747
  customInput: field.children,
1653
1748
  required: field.required,
1654
1749
  fieldName: field.name,
1655
1750
  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,
1751
+ subMenu: field.subMenu,
1752
+ subMenuLabel: field.subMenuLabel,
1753
+ nameTooltip: field.type === CUSTOM_TYPE ? _get__default["default"](props, 'customFieldOptions.nameTooltip', '') : field.nameTooltip,
1754
+ valueTooltip: field.type === CUSTOM_TYPE ? _get__default["default"](props, 'customFieldOptions.valueTooltip', '') : field.valueTooltip,
1658
1755
  onFieldNameChange: onFieldNameChange,
1659
1756
  onFieldValueChange: onFieldValueChange,
1660
1757
  onFieldSwitch: onFieldSwitch,
@@ -1662,14 +1759,30 @@ function TaskFields(props) {
1662
1759
  isCustom: field.type === CUSTOM_TYPE,
1663
1760
  key: field.id,
1664
1761
  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', ''),
1762
+ valuePlaceholder: field.type === CUSTOM_TYPE ? _get__default["default"](props, 'customFieldOptions.valuePlaceholder', '') : field.valuePlaceholder,
1763
+ customNamePlaceholder: _get__default["default"](props, 'customFieldOptions.namePlaceholder', ''),
1667
1764
  pipedTextItems: props.pipedTextItems,
1668
1765
  searchable: props.searchable
1669
- }, allFieldOptions && availableFields);
1766
+ }, allFieldOptions && getFieldsForFieldRow(availableFields, allFieldOptions, field.id));
1670
1767
  });
1671
1768
  };
1672
1769
 
1770
+ var getFieldsForFieldRow = function getFieldsForFieldRow(allAvailableFields, allFields, fieldId) {
1771
+ var fieldsToAdd = allAvailableFields.slice();
1772
+ allFields.forEach(function (field) {
1773
+ if (field.subMenu !== undefined && fieldId === field.id) {
1774
+ var foundIndex = fieldsToAdd.findIndex(function (fieldToAdd) {
1775
+ return fieldToAdd.id === field.id;
1776
+ });
1777
+
1778
+ if (foundIndex === -1) {
1779
+ fieldsToAdd.push(field);
1780
+ }
1781
+ }
1782
+ });
1783
+ return fieldsToAdd;
1784
+ };
1785
+
1673
1786
  var onFieldAdd = function onFieldAdd(fieldId) {
1674
1787
  if (typeof props.onFieldAdd === 'function') {
1675
1788
  props.onFieldAdd(fieldId);
@@ -1677,19 +1790,21 @@ function TaskFields(props) {
1677
1790
  };
1678
1791
 
1679
1792
  var onCustomFieldAdd = function onCustomFieldAdd() {
1680
- var handleFn = _get__default['default'](props, 'customFieldOptions.onCustomFieldAdd', function () {});
1793
+ var handleFn = _get__default["default"](props, 'customFieldOptions.onCustomFieldAdd', function () {});
1681
1794
 
1682
1795
  handleFn();
1683
1796
  };
1684
1797
 
1685
1798
  var getAvailableFields = function getAvailableFields() {
1686
1799
  return availableFields.map(function (field) {
1687
- return React__default['default'].createElement(FieldItem, {
1800
+ return React__default["default"].createElement(FieldItem, {
1688
1801
  name: field.name,
1689
1802
  type: field.type,
1690
1803
  required: field.required,
1691
1804
  key: field.id,
1692
- id: field.id
1805
+ id: field.id,
1806
+ subMenu: field.subMenu,
1807
+ subMenuLabel: field.subMenuLabel
1693
1808
  });
1694
1809
  });
1695
1810
  };
@@ -1742,7 +1857,9 @@ function TaskFields(props) {
1742
1857
  children: foundNextChild.props.children,
1743
1858
  nameTooltip: foundNextChild.props.nameTooltip,
1744
1859
  valueTooltip: foundNextChild.props.valueTooltip,
1745
- valuePlaceholder: foundNextChild.props.valuePlaceholder
1860
+ valuePlaceholder: foundNextChild.props.valuePlaceholder,
1861
+ subMenu: foundNextChild.props.subMenu,
1862
+ subMenuLabel: foundNextChild.props.subMenuLabel
1746
1863
  });
1747
1864
  }
1748
1865
 
@@ -1763,7 +1880,9 @@ function TaskFields(props) {
1763
1880
  nameTooltip: field.props.nameTooltip,
1764
1881
  valueTooltip: field.props.valueTooltip,
1765
1882
  value: field.props.value || undefined,
1766
- valuePlaceholder: field.props.valuePlaceholder
1883
+ valuePlaceholder: field.props.valuePlaceholder,
1884
+ subMenu: field.props.subMenu,
1885
+ subMenuLabel: field.props.subMenuLabel
1767
1886
  });
1768
1887
  }
1769
1888
  });
@@ -1786,10 +1905,12 @@ function TaskFields(props) {
1786
1905
  name: currentField.name,
1787
1906
  id: currentField.id,
1788
1907
  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
1908
+ nameTooltip: _get__default["default"](props, 'customFieldOptions.nameTooltip', ''),
1909
+ valueTooltip: _get__default["default"](props, 'customFieldOptions.valueTooltip', ''),
1910
+ namePlaceholder: _get__default["default"](props, 'customFieldOptions.namePlaceholder', ''),
1911
+ type: CUSTOM_TYPE,
1912
+ subMenu: currentField.subMenu,
1913
+ subMenuLabel: currentField.subMenuLabel
1793
1914
  };
1794
1915
  nextFieldsInUse.push(customFieldValue);
1795
1916
  }
@@ -1804,7 +1925,11 @@ function TaskFields(props) {
1804
1925
  if (field !== undefined) {
1805
1926
  field.value = fieldValue.value;
1806
1927
  } else {
1807
- var newField = _cloneDeep__default['default'](fieldMetadata);
1928
+ var newField = _cloneDeepWith__default["default"](fieldMetadata, function (value) {
1929
+ if (React__default["default"].isValidElement(value)) {
1930
+ return React__default["default"].cloneElement(value);
1931
+ }
1932
+ });
1808
1933
 
1809
1934
  newField.value = fieldValue.value;
1810
1935
  fieldsInUse.push(newField);
@@ -1823,7 +1948,9 @@ function TaskFields(props) {
1823
1948
  children: childProps.children,
1824
1949
  nameTooltip: childProps.nameTooltip,
1825
1950
  valueTooltip: childProps.valueTooltip,
1826
- valuePlaceholder: childProps.valuePlaceholder
1951
+ valuePlaceholder: childProps.valuePlaceholder,
1952
+ subMenu: childProps.subMenu,
1953
+ subMenuLabel: childProps.subMenuLabel
1827
1954
  };
1828
1955
  });
1829
1956
  var nextFieldsInUse = getFieldsInUse(nextAllFieldOptions);
@@ -1844,22 +1971,23 @@ function TaskFields(props) {
1844
1971
  React.useEffect(function () {
1845
1972
  updateAvailableFields();
1846
1973
  }, [props.values]);
1847
- return React__default['default'].createElement("div", {
1974
+ return React__default["default"].createElement("div", {
1848
1975
  className: "task-fields"
1849
- }, React__default['default'].createElement("div", {
1976
+ }, React__default["default"].createElement("div", {
1850
1977
  className: "field-headers"
1851
- }, React__default['default'].createElement(AddFieldHeaders, {
1978
+ }, React__default["default"].createElement(AddFieldHeaders, {
1852
1979
  itemHeaderText: props.fieldItemsHeaderText,
1853
1980
  inputHeaderText: props.fieldInputsHeaderText
1854
- })), React__default['default'].createElement("div", {
1981
+ })), React__default["default"].createElement("div", {
1855
1982
  className: "field-rows"
1856
- }, getFieldRows()), React__default['default'].createElement("div", {
1983
+ }, getFieldRows()), React__default["default"].createElement("div", {
1857
1984
  className: "add-field-container"
1858
- }, React__default['default'].createElement(AddFieldButton, {
1985
+ }, React__default["default"].createElement(AddFieldButton, {
1859
1986
  label: props.addFieldLabel,
1860
1987
  onFieldAdded: onFieldAdd,
1988
+ disableAddFieldPopover: props.disableAddFieldPopover,
1861
1989
  allowCustom: props.customFieldOptions,
1862
- customLabel: _get__default['default'](props, 'customFieldOptions.label', ''),
1990
+ customLabel: _get__default["default"](props, 'customFieldOptions.label', ''),
1863
1991
  onCustomFieldAdded: props.customFieldOptions ? onCustomFieldAdd : function () {}
1864
1992
  }, getAvailableFields())));
1865
1993
  }
@@ -1867,6 +1995,7 @@ function TaskFields(props) {
1867
1995
  function AddFieldButton(props) {
1868
1996
  var label = props.label || '';
1869
1997
  var customLabel = props.customLabel || '';
1998
+ var disableAddFieldPopover = props.disableAddFieldPopover;
1870
1999
 
1871
2000
  var _useState7 = React.useState(false),
1872
2001
  _useState8 = _slicedToArray(_useState7, 2),
@@ -1874,7 +2003,7 @@ function AddFieldButton(props) {
1874
2003
  setPopoverShow = _useState8[1];
1875
2004
 
1876
2005
  var customId = uuidv4();
1877
- var CUSTOM_OPTION = React__default['default'].createElement(FieldItem, {
2006
+ var CUSTOM_OPTION = React__default["default"].createElement(FieldItem, {
1878
2007
  key: customId,
1879
2008
  onClick: function onClick() {
1880
2009
  props.onCustomFieldAdded();
@@ -1888,15 +2017,30 @@ function AddFieldButton(props) {
1888
2017
  setPopoverShow(false);
1889
2018
  };
1890
2019
 
2020
+ var children = [];
2021
+
1891
2022
  var onPopoverAnchorClick = function onPopoverAnchorClick() {
1892
- setPopoverShow(!popoverShow);
2023
+ if (!disableAddFieldPopover) {
2024
+ setPopoverShow(!popoverShow);
2025
+ } else {
2026
+ props.onFieldAdded(props.children !== 0 ? getFieldIdWhenPopoverIsClicked(props.children[0].props) : '');
2027
+ }
2028
+ };
2029
+
2030
+ var getFieldIdWhenPopoverIsClicked = function getFieldIdWhenPopoverIsClicked(field) {
2031
+ if (field.subMenu) {
2032
+ return getFieldIdWhenPopoverIsClicked(field.subMenu[0]);
2033
+ } else {
2034
+ return field.id;
2035
+ }
1893
2036
  };
1894
2037
 
1895
- var children = props.children.map(function (child) {
1896
- return React__default['default'].createElement(FieldItem, {
2038
+ children = props.children.map(function (child) {
2039
+ return React__default["default"].createElement(FieldItem, {
1897
2040
  name: child.props.name,
1898
2041
  key: child.props.id,
1899
2042
  id: child.props.id,
2043
+ subMenu: child.props.subMenu,
1900
2044
  onClick: function onClick(fieldId) {
1901
2045
  setPopoverShow(false);
1902
2046
  props.onFieldAdded(fieldId);
@@ -1908,18 +2052,18 @@ function AddFieldButton(props) {
1908
2052
  children.push(CUSTOM_OPTION);
1909
2053
  }
1910
2054
 
1911
- return React__default['default'].createElement("div", {
2055
+ return React__default["default"].createElement("div", {
1912
2056
  className: "add-field-button-container"
1913
- }, React__default['default'].createElement(Popover, {
2057
+ }, React__default["default"].createElement(Popover, {
1914
2058
  show: popoverShow,
1915
2059
  onClose: onPopoverClose,
1916
2060
  ignoreClickSelector: ".add-field-button",
1917
- anchor: React__default['default'].createElement(uiReact.Button, {
2061
+ anchor: React__default["default"].createElement(uiReact.Button, {
1918
2062
  disabled: children.length === 0,
1919
2063
  kind: "secondary",
1920
2064
  className: "add-field-button",
1921
2065
  onClick: onPopoverAnchorClick
1922
- }, React__default['default'].createElement("span", {
2066
+ }, React__default["default"].createElement("span", {
1923
2067
  className: "add-field-button-label"
1924
2068
  }, label))
1925
2069
  }, children));
@@ -1930,13 +2074,13 @@ function AddFieldHeaders(props) {
1930
2074
  inputHeaderText = props.inputHeaderText;
1931
2075
 
1932
2076
  if (itemHeaderText || inputHeaderText) {
1933
- return React__default['default'].createElement("div", {
2077
+ return React__default["default"].createElement("div", {
1934
2078
  className: "field-row"
1935
- }, React__default['default'].createElement("div", {
2079
+ }, React__default["default"].createElement("div", {
1936
2080
  className: "field-selector"
1937
- }, React__default['default'].createElement(uiReact.Label, null, itemHeaderText)), React__default['default'].createElement("div", {
2081
+ }, React__default["default"].createElement(uiReact.Label, null, itemHeaderText)), React__default["default"].createElement("div", {
1938
2082
  className: "field-input"
1939
- }, React__default['default'].createElement(uiReact.Label, null, inputHeaderText)));
2083
+ }, React__default["default"].createElement(uiReact.Label, null, inputHeaderText)));
1940
2084
  } else {
1941
2085
  return null;
1942
2086
  }
@@ -1948,19 +2092,19 @@ styleInject(css_248z$2);
1948
2092
  function SelectItem(props) {
1949
2093
  var checked = props.checked || false;
1950
2094
  var children = props.children || '';
1951
- return React__default['default'].createElement("div", {
2095
+ return React__default["default"].createElement("div", {
1952
2096
  className: "select-item",
1953
2097
  onClick: function onClick(event) {
1954
2098
  return props.onChange(props.value, event);
1955
2099
  }
1956
- }, React__default['default'].createElement("div", {
2100
+ }, React__default["default"].createElement("div", {
1957
2101
  className: "item"
1958
- }, React__default['default'].createElement("div", {
2102
+ }, React__default["default"].createElement("div", {
1959
2103
  className: "checked-container ".concat(checked ? 'checked' : '')
1960
- }, React__default['default'].createElement(uiReact.Icon, {
2104
+ }, React__default["default"].createElement(uiReact.Icon, {
1961
2105
  type: uiReact.IconTypes.Check,
1962
2106
  size: "medium"
1963
- })), React__default['default'].createElement("div", {
2107
+ })), React__default["default"].createElement("div", {
1964
2108
  className: "item-content"
1965
2109
  }, children)));
1966
2110
  }
@@ -1987,9 +2131,9 @@ function MultiselectDropdown(props) {
1987
2131
  };
1988
2132
 
1989
2133
  var renderToggleButton = function renderToggleButton() {
1990
- return React__default['default'].createElement("div", {
2134
+ return React__default["default"].createElement("div", {
1991
2135
  className: "multiselect-dropdown-toggle"
1992
- }, React__default['default'].createElement(uiReact.Button, {
2136
+ }, React__default["default"].createElement(uiReact.Button, {
1993
2137
  onClick: function onClick() {
1994
2138
  setIsDropdownOpen(!isDropdownOpen);
1995
2139
  }
@@ -2004,15 +2148,15 @@ function MultiselectDropdown(props) {
2004
2148
  children = temp;
2005
2149
  }
2006
2150
 
2007
- return React__default['default'].createElement("div", {
2151
+ return React__default["default"].createElement("div", {
2008
2152
  className: "multiselect-dropdown"
2009
- }, React__default['default'].createElement(Popover, {
2153
+ }, React__default["default"].createElement(Popover, {
2010
2154
  show: isDropdownOpen,
2011
2155
  onClose: onPopoverClose,
2012
2156
  ignoreClickSelector: ".multiselect-dropdown-toggle",
2013
2157
  anchor: renderToggleButton()
2014
2158
  }, children.map(function (child) {
2015
- return React__default['default'].createElement(SelectItem, {
2159
+ return React__default["default"].createElement(SelectItem, {
2016
2160
  onChange: handleChange,
2017
2161
  checked: child.props.checked,
2018
2162
  value: child.props.value,
@@ -2129,7 +2273,7 @@ function DynamicSearchInput(props) {
2129
2273
  switch (_context2.prev = _context2.next) {
2130
2274
  case 0:
2131
2275
  event.persist();
2132
- inputVal = _get__default['default'](event, 'target.value', '');
2276
+ inputVal = _get__default["default"](event, 'target.value', '');
2133
2277
  searchFunc = props.search ? props.search : defaultSearch;
2134
2278
  _context2.next = 5;
2135
2279
  return searchFunc(inputVal);
@@ -2147,11 +2291,11 @@ function DynamicSearchInput(props) {
2147
2291
 
2148
2292
  case 9:
2149
2293
  nextSearchResults = results.map(function (result) {
2150
- if (_get__default['default'](result, 'props.label') === undefined) {
2294
+ if (_get__default["default"](result, 'props.label') === undefined) {
2151
2295
  throw new Error('DynamicSearchInput: expected search result array values to have label property but found none');
2152
2296
  }
2153
2297
 
2154
- return React__default['default'].createElement(SearchItem, {
2298
+ return React__default["default"].createElement(SearchItem, {
2155
2299
  key: result.props.id,
2156
2300
  onClick: function onClick() {
2157
2301
  handleSearchItemSelected(result.props.label);
@@ -2182,12 +2326,12 @@ function DynamicSearchInput(props) {
2182
2326
  };
2183
2327
  }();
2184
2328
 
2185
- return React__default['default'].createElement("div", {
2329
+ return React__default["default"].createElement("div", {
2186
2330
  className: "dynamic-search-input"
2187
- }, React__default['default'].createElement(Popover, {
2331
+ }, React__default["default"].createElement(Popover, {
2188
2332
  show: isDropdownOpen,
2189
2333
  onClose: onPopoverClose,
2190
- anchor: React__default['default'].createElement(uiReact.Input, {
2334
+ anchor: React__default["default"].createElement(uiReact.Input, {
2191
2335
  className: "search-input",
2192
2336
  full: true,
2193
2337
  small: true,
@@ -2199,7 +2343,7 @@ function DynamicSearchInput(props) {
2199
2343
  }
2200
2344
 
2201
2345
  function SearchItem(props) {
2202
- return React__default['default'].createElement("div", {
2346
+ return React__default["default"].createElement("div", {
2203
2347
  className: "dynamic-search-popover-child",
2204
2348
  onClick: props.onClick
2205
2349
  }, props.children);