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