@pareto-engineering/design-system 4.0.0-alpha.62 → 4.0.0-alpha.63
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/cjs/f/FormInput/FormInput.js +43 -13
- package/dist/cjs/f/common/V2/Description/Description.js +76 -0
- package/dist/cjs/f/common/V2/Description/index.js +13 -0
- package/dist/cjs/f/common/V2/Description/styles.scss +10 -0
- package/dist/cjs/f/common/V2/Label/Label.js +84 -0
- package/dist/cjs/f/common/V2/Label/index.js +13 -0
- package/dist/cjs/f/common/V2/Label/styles.scss +9 -0
- package/dist/cjs/f/common/V2/index.js +19 -0
- package/dist/cjs/f/common/index.js +12 -0
- package/dist/cjs/f/fields/V2/Checkbox/Checkbox.js +122 -0
- package/dist/cjs/f/fields/V2/Checkbox/index.js +13 -0
- package/dist/cjs/f/fields/V2/Checkbox/styles.scss +16 -0
- package/dist/cjs/f/fields/V2/ChoicesInput/ChoicesInput.js +154 -0
- package/dist/cjs/f/fields/V2/ChoicesInput/common/Choice/Choice.js +104 -0
- package/dist/cjs/f/fields/V2/ChoicesInput/common/Choice/index.js +13 -0
- package/dist/cjs/f/fields/V2/ChoicesInput/common/index.js +12 -0
- package/dist/cjs/f/fields/V2/ChoicesInput/index.js +13 -0
- package/dist/cjs/f/fields/V2/ChoicesInput/styles.scss +79 -0
- package/dist/cjs/f/fields/V2/EditorInput/EditorInput.js +197 -0
- package/dist/cjs/f/fields/V2/EditorInput/common/Toolbar.js +257 -0
- package/dist/cjs/f/fields/V2/EditorInput/common/TreeViewPlugin.js +18 -0
- package/dist/cjs/f/fields/V2/EditorInput/common/index.js +20 -0
- package/dist/cjs/f/fields/V2/EditorInput/index.js +13 -0
- package/dist/cjs/f/fields/V2/EditorInput/styles.scss +149 -0
- package/dist/cjs/f/fields/V2/LinkInput/LinkInput.js +156 -0
- package/dist/cjs/f/fields/V2/LinkInput/index.js +13 -0
- package/dist/cjs/f/fields/V2/LinkInput/styles.scss +90 -0
- package/dist/cjs/f/fields/V2/QueryChoices/QueryChoices.js +137 -0
- package/dist/cjs/f/fields/V2/QueryChoices/index.js +13 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/QueryCombobox.js +229 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/common/Combobox/Combobox.js +236 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/common/Combobox/index.js +13 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/common/Menu/Menu.js +83 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/common/Menu/index.js +13 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/common/MultipleCombobox/MultipleCombobox.js +300 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/common/MultipleCombobox/index.js +13 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/common/index.js +26 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/index.js +13 -0
- package/dist/cjs/f/fields/V2/QueryCombobox/styles.scss +127 -0
- package/dist/cjs/f/fields/V2/QuerySelect/QuerySelect.js +198 -0
- package/dist/cjs/f/fields/V2/QuerySelect/index.js +13 -0
- package/dist/cjs/f/fields/V2/RatingsInput/RatingsInput.js +130 -0
- package/dist/cjs/f/fields/V2/RatingsInput/common/Rating/Rating.js +117 -0
- package/dist/cjs/f/fields/V2/RatingsInput/common/Rating/index.js +13 -0
- package/dist/cjs/f/fields/V2/RatingsInput/common/index.js +12 -0
- package/dist/cjs/f/fields/V2/RatingsInput/index.js +13 -0
- package/dist/cjs/f/fields/V2/RatingsInput/styles.scss +48 -0
- package/dist/cjs/f/fields/V2/SelectInput/SelectInput.js +154 -0
- package/dist/cjs/f/fields/V2/SelectInput/index.js +13 -0
- package/dist/cjs/f/fields/V2/SelectInput/styles.scss +87 -0
- package/dist/cjs/f/fields/V2/TextInput/TextInput.js +155 -0
- package/dist/cjs/f/fields/V2/TextInput/index.js +13 -0
- package/dist/cjs/f/fields/V2/TextInput/styles.scss +78 -0
- package/dist/cjs/f/fields/V2/TextareaInput/TextareaInput.js +152 -0
- package/dist/cjs/f/fields/V2/TextareaInput/index.js +13 -0
- package/dist/cjs/f/fields/V2/TextareaInput/styles.scss +53 -0
- package/dist/cjs/f/fields/V2/index.js +82 -0
- package/dist/cjs/f/fields/index.js +26 -1
- package/dist/es/f/FormInput/FormInput.js +33 -3
- package/dist/es/f/common/V2/Description/Description.js +68 -0
- package/dist/es/f/common/V2/Description/index.js +2 -0
- package/dist/es/f/common/V2/Description/styles.scss +10 -0
- package/dist/es/f/common/V2/Label/Label.js +76 -0
- package/dist/es/f/common/V2/Label/index.js +2 -0
- package/dist/es/f/common/V2/Label/styles.scss +9 -0
- package/dist/es/f/common/V2/index.js +2 -0
- package/dist/es/f/common/index.js +2 -1
- package/dist/es/f/fields/V2/Checkbox/Checkbox.js +114 -0
- package/dist/es/f/fields/V2/Checkbox/index.js +2 -0
- package/dist/es/f/fields/V2/Checkbox/styles.scss +16 -0
- package/dist/es/f/fields/V2/ChoicesInput/ChoicesInput.js +148 -0
- package/dist/es/f/fields/V2/ChoicesInput/common/Choice/Choice.js +97 -0
- package/dist/es/f/fields/V2/ChoicesInput/common/Choice/index.js +2 -0
- package/dist/es/f/fields/V2/ChoicesInput/common/index.js +1 -0
- package/dist/es/f/fields/V2/ChoicesInput/index.js +2 -0
- package/dist/es/f/fields/V2/ChoicesInput/styles.scss +79 -0
- package/dist/es/f/fields/V2/EditorInput/EditorInput.js +192 -0
- package/dist/es/f/fields/V2/EditorInput/common/Toolbar.js +246 -0
- package/dist/es/f/fields/V2/EditorInput/common/TreeViewPlugin.js +11 -0
- package/dist/es/f/fields/V2/EditorInput/common/index.js +2 -0
- package/dist/es/f/fields/V2/EditorInput/index.js +2 -0
- package/dist/es/f/fields/V2/EditorInput/styles.scss +149 -0
- package/dist/es/f/fields/V2/LinkInput/LinkInput.js +148 -0
- package/dist/es/f/fields/V2/LinkInput/index.js +2 -0
- package/dist/es/f/fields/V2/LinkInput/styles.scss +90 -0
- package/dist/es/f/fields/V2/QueryChoices/QueryChoices.js +126 -0
- package/dist/es/f/fields/V2/QueryChoices/index.js +2 -0
- package/dist/es/f/fields/V2/QueryCombobox/QueryCombobox.js +221 -0
- package/dist/es/f/fields/V2/QueryCombobox/common/Combobox/Combobox.js +229 -0
- package/dist/es/f/fields/V2/QueryCombobox/common/Combobox/index.js +2 -0
- package/dist/es/f/fields/V2/QueryCombobox/common/Menu/Menu.js +73 -0
- package/dist/es/f/fields/V2/QueryCombobox/common/Menu/index.js +2 -0
- package/dist/es/f/fields/V2/QueryCombobox/common/MultipleCombobox/MultipleCombobox.js +293 -0
- package/dist/es/f/fields/V2/QueryCombobox/common/MultipleCombobox/index.js +2 -0
- package/dist/es/f/fields/V2/QueryCombobox/common/index.js +3 -0
- package/dist/es/f/fields/V2/QueryCombobox/index.js +2 -0
- package/dist/es/f/fields/V2/QueryCombobox/styles.scss +127 -0
- package/dist/es/f/fields/V2/QuerySelect/QuerySelect.js +186 -0
- package/dist/es/f/fields/V2/QuerySelect/index.js +2 -0
- package/dist/es/f/fields/V2/RatingsInput/RatingsInput.js +124 -0
- package/dist/es/f/fields/V2/RatingsInput/common/Rating/Rating.js +109 -0
- package/dist/es/f/fields/V2/RatingsInput/common/Rating/index.js +2 -0
- package/dist/es/f/fields/V2/RatingsInput/common/index.js +1 -0
- package/dist/es/f/fields/V2/RatingsInput/index.js +2 -0
- package/dist/es/f/fields/V2/RatingsInput/styles.scss +48 -0
- package/dist/es/f/fields/V2/SelectInput/SelectInput.js +146 -0
- package/dist/es/f/fields/V2/SelectInput/index.js +2 -0
- package/dist/es/f/fields/V2/SelectInput/styles.scss +87 -0
- package/dist/es/f/fields/V2/TextInput/TextInput.js +147 -0
- package/dist/es/f/fields/V2/TextInput/index.js +2 -0
- package/dist/es/f/fields/V2/TextInput/styles.scss +78 -0
- package/dist/es/f/fields/V2/TextareaInput/TextareaInput.js +146 -0
- package/dist/es/f/fields/V2/TextareaInput/index.js +2 -0
- package/dist/es/f/fields/V2/TextareaInput/styles.scss +53 -0
- package/dist/es/f/fields/V2/index.js +11 -0
- package/dist/es/f/fields/index.js +2 -1
- package/package.json +3 -3
- package/src/stories/f/v2/Checkbox.stories.jsx +102 -0
- package/src/stories/f/v2/ChoicesInput.stories.jsx +139 -0
- package/src/stories/f/v2/EditorInput.stories.jsx +81 -0
- package/src/stories/f/v2/LinkInput.stories.jsx +93 -0
- package/src/stories/f/v2/QueryChoices.stories.jsx +144 -0
- package/src/stories/f/v2/QueryCombobox.stories.jsx +301 -0
- package/src/stories/f/v2/QuerySelect.stories.jsx +150 -0
- package/src/stories/f/v2/RatingsInput.stories.jsx +77 -0
- package/src/stories/f/v2/SelectInput.stories.jsx +95 -0
- package/src/stories/f/v2/TextInput.stories.jsx +120 -0
- package/src/stories/f/v2/TextareaInput.stories.jsx +107 -0
- package/src/stories/f/v2/__generated__/FormInputAllTaskStatusesQuery.graphql.js +122 -0
- package/src/stories/f/v2/__generated__/FormInputAllTeamsQuery.graphql.js +139 -0
- package/src/stories/f/v2/__generated__/QueryChoicesAllTaskStatusesQuery.graphql.js +122 -0
- package/src/stories/f/v2/__generated__/QueryComboboxAllTeamsQuery.graphql.js +139 -0
- package/src/stories/f/v2/__generated__/QuerySelectAllTaskStatusesQuery.graphql.js +122 -0
- package/src/ui/f/FormInput/FormInput.jsx +57 -12
- package/src/ui/f/common/V2/Description/Description.jsx +94 -0
- package/src/ui/f/common/V2/Description/index.js +2 -0
- package/src/ui/f/common/V2/Description/styles.scss +10 -0
- package/src/ui/f/common/V2/Label/Label.jsx +102 -0
- package/src/ui/f/common/V2/Label/index.js +2 -0
- package/src/ui/f/common/V2/Label/styles.scss +9 -0
- package/src/ui/f/common/V2/index.js +2 -0
- package/src/ui/f/common/index.js +1 -0
- package/src/ui/f/fields/V2/Checkbox/Checkbox.jsx +146 -0
- package/src/ui/f/fields/V2/Checkbox/index.js +2 -0
- package/src/ui/f/fields/V2/Checkbox/styles.scss +16 -0
- package/src/ui/f/fields/V2/ChoicesInput/ChoicesInput.jsx +183 -0
- package/src/ui/f/fields/V2/ChoicesInput/common/Choice/Choice.jsx +125 -0
- package/src/ui/f/fields/V2/ChoicesInput/common/Choice/index.js +2 -0
- package/src/ui/f/fields/V2/ChoicesInput/common/index.js +1 -0
- package/src/ui/f/fields/V2/ChoicesInput/index.js +2 -0
- package/src/ui/f/fields/V2/ChoicesInput/styles.scss +79 -0
- package/src/ui/f/fields/V2/EditorInput/EditorInput.jsx +244 -0
- package/src/ui/f/fields/V2/EditorInput/common/Toolbar.jsx +356 -0
- package/src/ui/f/fields/V2/EditorInput/common/TreeViewPlugin.jsx +16 -0
- package/src/ui/f/fields/V2/EditorInput/common/index.jsx +2 -0
- package/src/ui/f/fields/V2/EditorInput/index.js +2 -0
- package/src/ui/f/fields/V2/EditorInput/styles.scss +149 -0
- package/src/ui/f/fields/V2/LinkInput/LinkInput.jsx +187 -0
- package/src/ui/f/fields/V2/LinkInput/index.js +2 -0
- package/src/ui/f/fields/V2/LinkInput/styles.scss +90 -0
- package/src/ui/f/fields/V2/QueryChoices/QueryChoices.jsx +153 -0
- package/src/ui/f/fields/V2/QueryChoices/index.js +2 -0
- package/src/ui/f/fields/V2/QueryCombobox/QueryCombobox.jsx +254 -0
- package/src/ui/f/fields/V2/QueryCombobox/common/Combobox/Combobox.jsx +276 -0
- package/src/ui/f/fields/V2/QueryCombobox/common/Combobox/index.js +2 -0
- package/src/ui/f/fields/V2/QueryCombobox/common/Menu/Menu.jsx +103 -0
- package/src/ui/f/fields/V2/QueryCombobox/common/Menu/index.js +2 -0
- package/src/ui/f/fields/V2/QueryCombobox/common/MultipleCombobox/MultipleCombobox.jsx +362 -0
- package/src/ui/f/fields/V2/QueryCombobox/common/MultipleCombobox/index.js +2 -0
- package/src/ui/f/fields/V2/QueryCombobox/common/index.js +3 -0
- package/src/ui/f/fields/V2/QueryCombobox/index.js +2 -0
- package/src/ui/f/fields/V2/QueryCombobox/styles.scss +127 -0
- package/src/ui/f/fields/V2/QuerySelect/QuerySelect.jsx +220 -0
- package/src/ui/f/fields/V2/QuerySelect/index.js +2 -0
- package/src/ui/f/fields/V2/RatingsInput/RatingsInput.jsx +152 -0
- package/src/ui/f/fields/V2/RatingsInput/common/Rating/Rating.jsx +142 -0
- package/src/ui/f/fields/V2/RatingsInput/common/Rating/index.js +2 -0
- package/src/ui/f/fields/V2/RatingsInput/common/index.js +1 -0
- package/src/ui/f/fields/V2/RatingsInput/index.js +2 -0
- package/src/ui/f/fields/V2/RatingsInput/styles.scss +48 -0
- package/src/ui/f/fields/V2/SelectInput/SelectInput.jsx +187 -0
- package/src/ui/f/fields/V2/SelectInput/index.js +2 -0
- package/src/ui/f/fields/V2/SelectInput/styles.scss +87 -0
- package/src/ui/f/fields/V2/TextInput/TextInput.jsx +192 -0
- package/src/ui/f/fields/V2/TextInput/index.js +2 -0
- package/src/ui/f/fields/V2/TextInput/styles.scss +78 -0
- package/src/ui/f/fields/V2/TextareaInput/TextareaInput.jsx +180 -0
- package/src/ui/f/fields/V2/TextareaInput/index.js +2 -0
- package/src/ui/f/fields/V2/TextareaInput/styles.scss +53 -0
- package/src/ui/f/fields/V2/index.js +11 -0
- package/src/ui/f/fields/index.js +1 -0
- package/tests/__snapshots__/Storyshots.test.js.snap +5909 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
+
/* @pareto-engineering/generator-front 1.0.12 */
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useEffect, useRef } from 'react';
|
|
5
|
+
import PropTypes from 'prop-types';
|
|
6
|
+
import { useCombobox } from 'downshift';
|
|
7
|
+
import styleNames from '@pareto-engineering/bem/exports';
|
|
8
|
+
import { FormLabelV2, FormDescriptionV2 } from "../../../../..";
|
|
9
|
+
import { Popover, LoadingCircle } from "../../../../../../a";
|
|
10
|
+
import { Button } from "../../../../../../b";
|
|
11
|
+
import { lookUpInputValueFromFetchedOptions } from "../../../../../common";
|
|
12
|
+
|
|
13
|
+
// Local Definitions
|
|
14
|
+
|
|
15
|
+
import { Menu } from "../Menu";
|
|
16
|
+
const baseClassName = styleNames.base;
|
|
17
|
+
const componentClassName = 'combobox';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* This is the component description.
|
|
21
|
+
*/
|
|
22
|
+
const Combobox = ({
|
|
23
|
+
id,
|
|
24
|
+
className: userClassName,
|
|
25
|
+
style,
|
|
26
|
+
label,
|
|
27
|
+
labelColor,
|
|
28
|
+
name,
|
|
29
|
+
options: items,
|
|
30
|
+
getOptions,
|
|
31
|
+
setOptions,
|
|
32
|
+
setValue,
|
|
33
|
+
description,
|
|
34
|
+
value,
|
|
35
|
+
color,
|
|
36
|
+
minLength,
|
|
37
|
+
isFetching,
|
|
38
|
+
transformSearch,
|
|
39
|
+
disabled,
|
|
40
|
+
optional,
|
|
41
|
+
placeholder,
|
|
42
|
+
promptCreateNewOption
|
|
43
|
+
// ...otherProps
|
|
44
|
+
}) => {
|
|
45
|
+
const {
|
|
46
|
+
isOpen,
|
|
47
|
+
selectItem,
|
|
48
|
+
selectedItem,
|
|
49
|
+
inputValue,
|
|
50
|
+
setInputValue,
|
|
51
|
+
getLabelProps,
|
|
52
|
+
getMenuProps,
|
|
53
|
+
getInputProps,
|
|
54
|
+
highlightedIndex,
|
|
55
|
+
getComboboxProps,
|
|
56
|
+
getItemProps
|
|
57
|
+
} = useCombobox({
|
|
58
|
+
items,
|
|
59
|
+
initialSelectedItem: value,
|
|
60
|
+
itemToString: item => item ? item.label : '',
|
|
61
|
+
onInputValueChange: ({
|
|
62
|
+
inputValue: searchInputValue
|
|
63
|
+
}) => {
|
|
64
|
+
const transformedInput = transformSearch(searchInputValue);
|
|
65
|
+
if (transformedInput.length > minLength) {
|
|
66
|
+
getOptions(transformedInput);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
if (promptCreateNewOption) {
|
|
72
|
+
lookUpInputValueFromFetchedOptions({
|
|
73
|
+
items,
|
|
74
|
+
inputValue,
|
|
75
|
+
setOptions,
|
|
76
|
+
minLength
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}, [inputValue, items, promptCreateNewOption]);
|
|
80
|
+
|
|
81
|
+
// If the user has selected an item, we'll set the value of the field
|
|
82
|
+
// or if the combobox state has a selected item, we'll set the value to the formik state
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (selectedItem) {
|
|
85
|
+
setValue(selectedItem);
|
|
86
|
+
}
|
|
87
|
+
}, [selectedItem]);
|
|
88
|
+
|
|
89
|
+
// If the formik state has a value, we'll set the selected item to the combobox state
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
if (value?.value !== selectedItem?.value) {
|
|
92
|
+
selectItem(value);
|
|
93
|
+
}
|
|
94
|
+
}, [value]);
|
|
95
|
+
const parentRef = useRef(null);
|
|
96
|
+
const resetInputValue = () => setInputValue('');
|
|
97
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
98
|
+
id: id,
|
|
99
|
+
className: [baseClassName, componentClassName, userClassName, `y-${color}`].filter(e => e).join(' '),
|
|
100
|
+
style: style,
|
|
101
|
+
ref: parentRef
|
|
102
|
+
}, getComboboxProps()), /*#__PURE__*/React.createElement(FormLabelV2, _extends({}, getLabelProps(), {
|
|
103
|
+
name: name,
|
|
104
|
+
optional: optional,
|
|
105
|
+
color: labelColor
|
|
106
|
+
}), label), /*#__PURE__*/React.createElement("input", _extends({}, getInputProps(), {
|
|
107
|
+
className: "input",
|
|
108
|
+
disabled: disabled,
|
|
109
|
+
placeholder: placeholder
|
|
110
|
+
})), isFetching && /*#__PURE__*/React.createElement(LoadingCircle, {
|
|
111
|
+
className: "x-main"
|
|
112
|
+
}), inputValue.length > minLength && !isFetching && /*#__PURE__*/React.createElement(Button, {
|
|
113
|
+
isSimple: true,
|
|
114
|
+
isCompact: true,
|
|
115
|
+
color: "heading",
|
|
116
|
+
onClick: resetInputValue
|
|
117
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
118
|
+
className: "icon"
|
|
119
|
+
}, "Y")), /*#__PURE__*/React.createElement(FormDescriptionV2, {
|
|
120
|
+
className: "s-1",
|
|
121
|
+
description: description,
|
|
122
|
+
name: name
|
|
123
|
+
}), /*#__PURE__*/React.createElement(Popover, {
|
|
124
|
+
isOpen: isOpen,
|
|
125
|
+
parentRef: parentRef
|
|
126
|
+
}, /*#__PURE__*/React.createElement(Menu, _extends({
|
|
127
|
+
className: `y-${color}`,
|
|
128
|
+
isOpen: isOpen,
|
|
129
|
+
getItemProps: getItemProps,
|
|
130
|
+
highlightedIndex: highlightedIndex,
|
|
131
|
+
items: items
|
|
132
|
+
}, getMenuProps()))));
|
|
133
|
+
};
|
|
134
|
+
Combobox.propTypes = {
|
|
135
|
+
/**
|
|
136
|
+
* The HTML id for this element
|
|
137
|
+
*/
|
|
138
|
+
id: PropTypes.string,
|
|
139
|
+
/**
|
|
140
|
+
* The HTML class names for this element
|
|
141
|
+
*/
|
|
142
|
+
className: PropTypes.string,
|
|
143
|
+
/**
|
|
144
|
+
* The React-written, css properties for this element.
|
|
145
|
+
*/
|
|
146
|
+
style: PropTypes.objectOf(PropTypes.string),
|
|
147
|
+
/**
|
|
148
|
+
* The label of the custom select input
|
|
149
|
+
*/
|
|
150
|
+
label: PropTypes.string,
|
|
151
|
+
/**
|
|
152
|
+
* The custom select input options from the backend
|
|
153
|
+
*/
|
|
154
|
+
options: PropTypes.arrayOf(PropTypes.shape({
|
|
155
|
+
value: PropTypes.string,
|
|
156
|
+
label: PropTypes.string
|
|
157
|
+
})),
|
|
158
|
+
/**
|
|
159
|
+
* The name of the custom select input
|
|
160
|
+
*/
|
|
161
|
+
name: PropTypes.string,
|
|
162
|
+
/**
|
|
163
|
+
* The function to fetch the options from the backend
|
|
164
|
+
*/
|
|
165
|
+
getOptions: PropTypes.func,
|
|
166
|
+
/**
|
|
167
|
+
* The function to set the value of the custom select input
|
|
168
|
+
*/
|
|
169
|
+
setValue: PropTypes.func.isRequired,
|
|
170
|
+
/**
|
|
171
|
+
* The custom select input description
|
|
172
|
+
*/
|
|
173
|
+
description: PropTypes.string,
|
|
174
|
+
/**
|
|
175
|
+
* The value of the custom select input
|
|
176
|
+
*/
|
|
177
|
+
value: PropTypes.shape({
|
|
178
|
+
value: PropTypes.string,
|
|
179
|
+
label: PropTypes.string
|
|
180
|
+
}),
|
|
181
|
+
/**
|
|
182
|
+
* The base color of the combobox custom select input
|
|
183
|
+
*/
|
|
184
|
+
color: PropTypes.string,
|
|
185
|
+
/**
|
|
186
|
+
* Whether the query getting the combobox options is inFlight
|
|
187
|
+
*/
|
|
188
|
+
isFetching: PropTypes.bool.isRequired,
|
|
189
|
+
/**
|
|
190
|
+
* The minimum length of the search input to start fetching the options
|
|
191
|
+
*/
|
|
192
|
+
minLength: PropTypes.number,
|
|
193
|
+
/**
|
|
194
|
+
* The function to transform the search input
|
|
195
|
+
*/
|
|
196
|
+
transformSearch: PropTypes.func,
|
|
197
|
+
/**
|
|
198
|
+
* Whether the input filed shpuld be disabled
|
|
199
|
+
*/
|
|
200
|
+
disabled: PropTypes.bool,
|
|
201
|
+
/**
|
|
202
|
+
* The number of columns the label should span
|
|
203
|
+
*/
|
|
204
|
+
labelSpan: PropTypes.number,
|
|
205
|
+
/**
|
|
206
|
+
* The number of columns the input should span
|
|
207
|
+
*/
|
|
208
|
+
inputSpan: PropTypes.number,
|
|
209
|
+
/**
|
|
210
|
+
* The number of columns the label should span on desktop
|
|
211
|
+
*/
|
|
212
|
+
desktopLabelSpan: PropTypes.number,
|
|
213
|
+
/**
|
|
214
|
+
* The number of columns the input should span on desktop
|
|
215
|
+
*/
|
|
216
|
+
desktopInputSpan: PropTypes.number,
|
|
217
|
+
/**
|
|
218
|
+
* Whether the input is optional or not
|
|
219
|
+
*/
|
|
220
|
+
optional: PropTypes.bool,
|
|
221
|
+
/**
|
|
222
|
+
* The placeholder text for the input
|
|
223
|
+
*/
|
|
224
|
+
placeholder: PropTypes.string
|
|
225
|
+
};
|
|
226
|
+
Combobox.defaultProps = {
|
|
227
|
+
// someProp: false
|
|
228
|
+
};
|
|
229
|
+
export default Combobox;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
+
/* @pareto-engineering/generator-front 1.0.12 */
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import PropTypes from 'prop-types';
|
|
5
|
+
import styleNames from '@pareto-engineering/bem/exports';
|
|
6
|
+
|
|
7
|
+
// Local Definitions
|
|
8
|
+
|
|
9
|
+
const baseClassName = styleNames.base;
|
|
10
|
+
const componentClassName = 'menu';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* This is the component description.
|
|
14
|
+
*/
|
|
15
|
+
const Menu = /*#__PURE__*/React.forwardRef(({
|
|
16
|
+
id,
|
|
17
|
+
className: userClassName,
|
|
18
|
+
style,
|
|
19
|
+
items,
|
|
20
|
+
isOpen,
|
|
21
|
+
highlightedIndex,
|
|
22
|
+
getItemProps,
|
|
23
|
+
...otherProps
|
|
24
|
+
}, ref) => /*#__PURE__*/React.createElement("ul", _extends({
|
|
25
|
+
id: id,
|
|
26
|
+
className: [baseClassName, componentClassName, userClassName].filter(e => e).join(' '),
|
|
27
|
+
style: style,
|
|
28
|
+
ref: ref
|
|
29
|
+
}, otherProps), isOpen && items.map((item, index) => /*#__PURE__*/React.createElement("li", _extends({
|
|
30
|
+
key: item.label
|
|
31
|
+
}, getItemProps({
|
|
32
|
+
item,
|
|
33
|
+
index
|
|
34
|
+
}), {
|
|
35
|
+
className: ['item', highlightedIndex === index && styleNames.modifierActive].filter(Boolean).join(' ')
|
|
36
|
+
}), /*#__PURE__*/React.createElement("p", null, item.label)))));
|
|
37
|
+
Menu.propTypes = {
|
|
38
|
+
/**
|
|
39
|
+
* The HTML id for this element
|
|
40
|
+
*/
|
|
41
|
+
id: PropTypes.string,
|
|
42
|
+
/**
|
|
43
|
+
* The HTML class names for this element
|
|
44
|
+
*/
|
|
45
|
+
className: PropTypes.string,
|
|
46
|
+
/**
|
|
47
|
+
* The React-written, css properties for this element.
|
|
48
|
+
*/
|
|
49
|
+
style: PropTypes.objectOf(PropTypes.string),
|
|
50
|
+
/**
|
|
51
|
+
* The items to be displayed in the menu
|
|
52
|
+
*/
|
|
53
|
+
items: PropTypes.arrayOf(PropTypes.shape({
|
|
54
|
+
value: PropTypes.string,
|
|
55
|
+
label: PropTypes.string
|
|
56
|
+
})),
|
|
57
|
+
/**
|
|
58
|
+
* Whether or not the menu is open
|
|
59
|
+
*/
|
|
60
|
+
isOpen: PropTypes.bool,
|
|
61
|
+
/**
|
|
62
|
+
* The index of the highlighted item
|
|
63
|
+
*/
|
|
64
|
+
highlightedIndex: PropTypes.number,
|
|
65
|
+
/**
|
|
66
|
+
* The function to get the item props
|
|
67
|
+
*/
|
|
68
|
+
getItemProps: PropTypes.func
|
|
69
|
+
};
|
|
70
|
+
Menu.defaultProps = {
|
|
71
|
+
// someProp:false
|
|
72
|
+
};
|
|
73
|
+
export default Menu;
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
+
/* @pareto-engineering/generator-front 1.0.12 */
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useState, useEffect, useRef } from 'react';
|
|
5
|
+
import PropTypes from 'prop-types';
|
|
6
|
+
import styleNames from '@pareto-engineering/bem/exports';
|
|
7
|
+
import { useCombobox, useMultipleSelection } from 'downshift';
|
|
8
|
+
import { Button } from "../../../../../../b";
|
|
9
|
+
import { Popover, LoadingCircle } from "../../../../../../a";
|
|
10
|
+
import { FormDescriptionV2, FormLabelV2 } from "../../../../..";
|
|
11
|
+
import { lookUpInputValueFromFetchedOptions } from "../../../../../common";
|
|
12
|
+
|
|
13
|
+
// Local Definitions
|
|
14
|
+
|
|
15
|
+
import { Menu } from "../Menu";
|
|
16
|
+
const baseClassName = styleNames.base;
|
|
17
|
+
const componentClassName = 'multiple-combobox';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param {Array[Object]} first - first array to check if it has an item not in the second array.
|
|
21
|
+
* @param {Array[Object]} second - second array to check against the first array.
|
|
22
|
+
*
|
|
23
|
+
* @returns {Boolean} - true if the first array has an item not in the second array.
|
|
24
|
+
*/
|
|
25
|
+
const testIfArraysAreUnique = (first, second) => first.filter(objInFirstArray => !second.some(objInSecondArray => objInFirstArray.value === objInSecondArray.value)).length > 0;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* This is the component description.
|
|
29
|
+
*/
|
|
30
|
+
const MultipleCombobox = ({
|
|
31
|
+
id,
|
|
32
|
+
className: userClassName,
|
|
33
|
+
style,
|
|
34
|
+
label,
|
|
35
|
+
labelColor,
|
|
36
|
+
name,
|
|
37
|
+
optional,
|
|
38
|
+
options: items,
|
|
39
|
+
getOptions,
|
|
40
|
+
setValue,
|
|
41
|
+
description,
|
|
42
|
+
value,
|
|
43
|
+
color,
|
|
44
|
+
isFetching,
|
|
45
|
+
minLength,
|
|
46
|
+
transformSearch,
|
|
47
|
+
disabled,
|
|
48
|
+
placeholder,
|
|
49
|
+
setOptions,
|
|
50
|
+
promptCreateNewOption
|
|
51
|
+
// ...otherProps
|
|
52
|
+
}) => {
|
|
53
|
+
const [searchInputValue, setSearchInputValue] = useState('');
|
|
54
|
+
const {
|
|
55
|
+
getSelectedItemProps,
|
|
56
|
+
getDropdownProps,
|
|
57
|
+
addSelectedItem,
|
|
58
|
+
removeSelectedItem,
|
|
59
|
+
setSelectedItems,
|
|
60
|
+
selectedItems
|
|
61
|
+
} = useMultipleSelection({
|
|
62
|
+
initialSelectedItems: value || []
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @returns {Boolean} - Unique items from the options array so that the combobox
|
|
67
|
+
* shows only the options that are not yet selected.
|
|
68
|
+
*/
|
|
69
|
+
const getFilteredItems = () => items.filter(item => selectedItems.findIndex(e => e.label === item.label) < 0);
|
|
70
|
+
const {
|
|
71
|
+
isOpen,
|
|
72
|
+
getLabelProps,
|
|
73
|
+
getMenuProps,
|
|
74
|
+
getInputProps,
|
|
75
|
+
getComboboxProps,
|
|
76
|
+
highlightedIndex,
|
|
77
|
+
getItemProps,
|
|
78
|
+
inputValue,
|
|
79
|
+
setInputValue
|
|
80
|
+
} = useCombobox({
|
|
81
|
+
searchInputValue,
|
|
82
|
+
defaultHighlightedIndex: 0,
|
|
83
|
+
// after selection, highlight the first item.
|
|
84
|
+
selectedItem: null,
|
|
85
|
+
items: getFilteredItems(),
|
|
86
|
+
circularNavigation: true,
|
|
87
|
+
stateReducer: (state, actionAndChanges) => {
|
|
88
|
+
const {
|
|
89
|
+
changes,
|
|
90
|
+
type
|
|
91
|
+
} = actionAndChanges;
|
|
92
|
+
switch (type) {
|
|
93
|
+
case useCombobox.stateChangeTypes.InputKeyDownEnter:
|
|
94
|
+
case useCombobox.stateChangeTypes.ItemClick:
|
|
95
|
+
return {
|
|
96
|
+
...changes,
|
|
97
|
+
isOpen: true // keep the menu open after selection.
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
default:
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
return changes;
|
|
104
|
+
},
|
|
105
|
+
onStateChange: ({
|
|
106
|
+
inputValue: newSearchInputValue,
|
|
107
|
+
type,
|
|
108
|
+
selectedItem
|
|
109
|
+
}) => {
|
|
110
|
+
switch (type) {
|
|
111
|
+
case useCombobox.stateChangeTypes.InputChange:
|
|
112
|
+
{
|
|
113
|
+
const transformedInput = transformSearch(newSearchInputValue);
|
|
114
|
+
if (transformedInput.length > minLength) {
|
|
115
|
+
getOptions(transformedInput);
|
|
116
|
+
}
|
|
117
|
+
setSearchInputValue(newSearchInputValue);
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case useCombobox.stateChangeTypes.InputKeyDownEnter:
|
|
121
|
+
case useCombobox.stateChangeTypes.ItemClick:
|
|
122
|
+
case useCombobox.stateChangeTypes.InputBlur:
|
|
123
|
+
if (selectedItem) {
|
|
124
|
+
setSearchInputValue('');
|
|
125
|
+
addSelectedItem(selectedItem);
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
if (selectedItems?.length > 0) {
|
|
135
|
+
setValue(selectedItems);
|
|
136
|
+
}
|
|
137
|
+
}, [selectedItems]);
|
|
138
|
+
useEffect(() => {
|
|
139
|
+
if (promptCreateNewOption) {
|
|
140
|
+
lookUpInputValueFromFetchedOptions({
|
|
141
|
+
items,
|
|
142
|
+
inputValue,
|
|
143
|
+
setOptions,
|
|
144
|
+
minLength
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}, [inputValue, items, promptCreateNewOption]);
|
|
148
|
+
useEffect(() => {
|
|
149
|
+
if (value?.length > 0 && (testIfArraysAreUnique(value, selectedItems) || testIfArraysAreUnique(selectedItems, value))) {
|
|
150
|
+
setSelectedItems(value);
|
|
151
|
+
}
|
|
152
|
+
}, [value]);
|
|
153
|
+
const parentRef = useRef(null);
|
|
154
|
+
const resetInputValue = () => setInputValue('');
|
|
155
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
156
|
+
id: id,
|
|
157
|
+
className: [baseClassName, componentClassName, userClassName].filter(e => e).join(' '),
|
|
158
|
+
style: style,
|
|
159
|
+
ref: parentRef
|
|
160
|
+
}, getComboboxProps()), /*#__PURE__*/React.createElement(FormLabelV2, _extends({
|
|
161
|
+
className: [baseClassName, componentClassName].filter(e => e).join(' ')
|
|
162
|
+
}, getLabelProps(), {
|
|
163
|
+
name: name,
|
|
164
|
+
optional: optional,
|
|
165
|
+
color: labelColor
|
|
166
|
+
}), label), selectedItems?.length > 0 && /*#__PURE__*/React.createElement("div", {
|
|
167
|
+
className: "selected-items"
|
|
168
|
+
}, selectedItems.map((selectedItem, index) => /*#__PURE__*/React.createElement("div", _extends({
|
|
169
|
+
key: selectedItem.label
|
|
170
|
+
}, getSelectedItemProps({
|
|
171
|
+
selectedItem,
|
|
172
|
+
index
|
|
173
|
+
}), {
|
|
174
|
+
className: "item"
|
|
175
|
+
}), /*#__PURE__*/React.createElement(Button, {
|
|
176
|
+
onClick: e => {
|
|
177
|
+
e.stopPropagation();
|
|
178
|
+
removeSelectedItem(selectedItem);
|
|
179
|
+
},
|
|
180
|
+
isCompact: true,
|
|
181
|
+
color: color
|
|
182
|
+
}, /*#__PURE__*/React.createElement("span", null, selectedItem.label), /*#__PURE__*/React.createElement("span", {
|
|
183
|
+
className: "icon close"
|
|
184
|
+
}, "Y"))))), /*#__PURE__*/React.createElement("input", _extends({}, getInputProps(getDropdownProps({
|
|
185
|
+
preventKeyAction: isOpen
|
|
186
|
+
})), {
|
|
187
|
+
className: "input",
|
|
188
|
+
disabled: disabled,
|
|
189
|
+
placeholder: placeholder
|
|
190
|
+
})), isFetching && /*#__PURE__*/React.createElement(LoadingCircle, {
|
|
191
|
+
className: "x-main"
|
|
192
|
+
}), inputValue.length > minLength && !isFetching && /*#__PURE__*/React.createElement(Button, {
|
|
193
|
+
isSimple: true,
|
|
194
|
+
isCompact: true,
|
|
195
|
+
color: "interactive",
|
|
196
|
+
onClick: resetInputValue
|
|
197
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
198
|
+
className: "icon"
|
|
199
|
+
}, "Y")), /*#__PURE__*/React.createElement(FormDescriptionV2, {
|
|
200
|
+
className: "s-1",
|
|
201
|
+
description: description,
|
|
202
|
+
name: name
|
|
203
|
+
}), /*#__PURE__*/React.createElement(Popover, {
|
|
204
|
+
isOpen: isOpen,
|
|
205
|
+
parentRef: parentRef
|
|
206
|
+
}, /*#__PURE__*/React.createElement(Menu, _extends({
|
|
207
|
+
className: `y-${color}`,
|
|
208
|
+
isOpen: isOpen,
|
|
209
|
+
getItemProps: getItemProps,
|
|
210
|
+
highlightedIndex: highlightedIndex,
|
|
211
|
+
items: getFilteredItems()
|
|
212
|
+
}, getMenuProps()))));
|
|
213
|
+
};
|
|
214
|
+
MultipleCombobox.propTypes = {
|
|
215
|
+
/**
|
|
216
|
+
* The HTML id for this element
|
|
217
|
+
*/
|
|
218
|
+
id: PropTypes.string,
|
|
219
|
+
/**
|
|
220
|
+
* The HTML class names for this element
|
|
221
|
+
*/
|
|
222
|
+
className: PropTypes.string,
|
|
223
|
+
/**
|
|
224
|
+
* The React-written, css properties for this element.
|
|
225
|
+
*/
|
|
226
|
+
style: PropTypes.objectOf(PropTypes.string),
|
|
227
|
+
/**
|
|
228
|
+
* The label of the custom select input
|
|
229
|
+
*/
|
|
230
|
+
label: PropTypes.string,
|
|
231
|
+
/**
|
|
232
|
+
* The custom select input options from the backend
|
|
233
|
+
*/
|
|
234
|
+
options: PropTypes.arrayOf(PropTypes.shape({
|
|
235
|
+
value: PropTypes.string,
|
|
236
|
+
label: PropTypes.string
|
|
237
|
+
})),
|
|
238
|
+
/**
|
|
239
|
+
* The name of the custom select input
|
|
240
|
+
*/
|
|
241
|
+
name: PropTypes.string,
|
|
242
|
+
/**
|
|
243
|
+
* The function to fetch the options from the backend
|
|
244
|
+
*/
|
|
245
|
+
getOptions: PropTypes.func,
|
|
246
|
+
/**
|
|
247
|
+
* The function to set the value of the custom select input
|
|
248
|
+
*/
|
|
249
|
+
setValue: PropTypes.func.isRequired,
|
|
250
|
+
/**
|
|
251
|
+
* The custom select input description
|
|
252
|
+
*/
|
|
253
|
+
description: PropTypes.string,
|
|
254
|
+
/**
|
|
255
|
+
* The value of the custom select input
|
|
256
|
+
*/
|
|
257
|
+
value: PropTypes.arrayOf(PropTypes.shape({
|
|
258
|
+
value: PropTypes.string,
|
|
259
|
+
label: PropTypes.string
|
|
260
|
+
})),
|
|
261
|
+
/**
|
|
262
|
+
* The base color of the custom select input
|
|
263
|
+
*/
|
|
264
|
+
color: PropTypes.string,
|
|
265
|
+
/**
|
|
266
|
+
* Whether the query getting the combobox options is inFlight
|
|
267
|
+
*/
|
|
268
|
+
isFetching: PropTypes.bool.isRequired,
|
|
269
|
+
/**
|
|
270
|
+
* The minimum length of the search input to start fetching the options
|
|
271
|
+
*/
|
|
272
|
+
minLength: PropTypes.number,
|
|
273
|
+
/**
|
|
274
|
+
* The function to transform the search input
|
|
275
|
+
*/
|
|
276
|
+
transformSearch: PropTypes.func,
|
|
277
|
+
/**
|
|
278
|
+
* Whether the input filed shpuld be disabled
|
|
279
|
+
*/
|
|
280
|
+
disabled: PropTypes.bool,
|
|
281
|
+
/**
|
|
282
|
+
* Whether the input is optional or not
|
|
283
|
+
*/
|
|
284
|
+
optional: PropTypes.bool,
|
|
285
|
+
/**
|
|
286
|
+
* The placeholder text for the input
|
|
287
|
+
*/
|
|
288
|
+
placeholder: PropTypes.string
|
|
289
|
+
};
|
|
290
|
+
MultipleCombobox.defaultProps = {
|
|
291
|
+
// someProp: false
|
|
292
|
+
};
|
|
293
|
+
export default MultipleCombobox;
|