@pareto-engineering/design-system 4.0.0-alpha.61 → 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.
Files changed (198) hide show
  1. package/dist/cjs/a/TextSteps/TextSteps.js +4 -4
  2. package/dist/cjs/a/TextSteps/styles.scss +1 -1
  3. package/dist/cjs/f/FormInput/FormInput.js +43 -13
  4. package/dist/cjs/f/common/V2/Description/Description.js +76 -0
  5. package/dist/cjs/f/common/V2/Description/index.js +13 -0
  6. package/dist/cjs/f/common/V2/Description/styles.scss +10 -0
  7. package/dist/cjs/f/common/V2/Label/Label.js +84 -0
  8. package/dist/cjs/f/common/V2/Label/index.js +13 -0
  9. package/dist/cjs/f/common/V2/Label/styles.scss +9 -0
  10. package/dist/cjs/f/common/V2/index.js +19 -0
  11. package/dist/cjs/f/common/index.js +12 -0
  12. package/dist/cjs/f/fields/V2/Checkbox/Checkbox.js +122 -0
  13. package/dist/cjs/f/fields/V2/Checkbox/index.js +13 -0
  14. package/dist/cjs/f/fields/V2/Checkbox/styles.scss +16 -0
  15. package/dist/cjs/f/fields/V2/ChoicesInput/ChoicesInput.js +154 -0
  16. package/dist/cjs/f/fields/V2/ChoicesInput/common/Choice/Choice.js +104 -0
  17. package/dist/cjs/f/fields/V2/ChoicesInput/common/Choice/index.js +13 -0
  18. package/dist/cjs/f/fields/V2/ChoicesInput/common/index.js +12 -0
  19. package/dist/cjs/f/fields/V2/ChoicesInput/index.js +13 -0
  20. package/dist/cjs/f/fields/V2/ChoicesInput/styles.scss +79 -0
  21. package/dist/cjs/f/fields/V2/EditorInput/EditorInput.js +197 -0
  22. package/dist/cjs/f/fields/V2/EditorInput/common/Toolbar.js +257 -0
  23. package/dist/cjs/f/fields/V2/EditorInput/common/TreeViewPlugin.js +18 -0
  24. package/dist/cjs/f/fields/V2/EditorInput/common/index.js +20 -0
  25. package/dist/cjs/f/fields/V2/EditorInput/index.js +13 -0
  26. package/dist/cjs/f/fields/V2/EditorInput/styles.scss +149 -0
  27. package/dist/cjs/f/fields/V2/LinkInput/LinkInput.js +156 -0
  28. package/dist/cjs/f/fields/V2/LinkInput/index.js +13 -0
  29. package/dist/cjs/f/fields/V2/LinkInput/styles.scss +90 -0
  30. package/dist/cjs/f/fields/V2/QueryChoices/QueryChoices.js +137 -0
  31. package/dist/cjs/f/fields/V2/QueryChoices/index.js +13 -0
  32. package/dist/cjs/f/fields/V2/QueryCombobox/QueryCombobox.js +229 -0
  33. package/dist/cjs/f/fields/V2/QueryCombobox/common/Combobox/Combobox.js +236 -0
  34. package/dist/cjs/f/fields/V2/QueryCombobox/common/Combobox/index.js +13 -0
  35. package/dist/cjs/f/fields/V2/QueryCombobox/common/Menu/Menu.js +83 -0
  36. package/dist/cjs/f/fields/V2/QueryCombobox/common/Menu/index.js +13 -0
  37. package/dist/cjs/f/fields/V2/QueryCombobox/common/MultipleCombobox/MultipleCombobox.js +300 -0
  38. package/dist/cjs/f/fields/V2/QueryCombobox/common/MultipleCombobox/index.js +13 -0
  39. package/dist/cjs/f/fields/V2/QueryCombobox/common/index.js +26 -0
  40. package/dist/cjs/f/fields/V2/QueryCombobox/index.js +13 -0
  41. package/dist/cjs/f/fields/V2/QueryCombobox/styles.scss +127 -0
  42. package/dist/cjs/f/fields/V2/QuerySelect/QuerySelect.js +198 -0
  43. package/dist/cjs/f/fields/V2/QuerySelect/index.js +13 -0
  44. package/dist/cjs/f/fields/V2/RatingsInput/RatingsInput.js +130 -0
  45. package/dist/cjs/f/fields/V2/RatingsInput/common/Rating/Rating.js +117 -0
  46. package/dist/cjs/f/fields/V2/RatingsInput/common/Rating/index.js +13 -0
  47. package/dist/cjs/f/fields/V2/RatingsInput/common/index.js +12 -0
  48. package/dist/cjs/f/fields/V2/RatingsInput/index.js +13 -0
  49. package/dist/cjs/f/fields/V2/RatingsInput/styles.scss +48 -0
  50. package/dist/cjs/f/fields/V2/SelectInput/SelectInput.js +154 -0
  51. package/dist/cjs/f/fields/V2/SelectInput/index.js +13 -0
  52. package/dist/cjs/f/fields/V2/SelectInput/styles.scss +87 -0
  53. package/dist/cjs/f/fields/V2/TextInput/TextInput.js +155 -0
  54. package/dist/cjs/f/fields/V2/TextInput/index.js +13 -0
  55. package/dist/cjs/f/fields/V2/TextInput/styles.scss +78 -0
  56. package/dist/cjs/f/fields/V2/TextareaInput/TextareaInput.js +152 -0
  57. package/dist/cjs/f/fields/V2/TextareaInput/index.js +13 -0
  58. package/dist/cjs/f/fields/V2/TextareaInput/styles.scss +53 -0
  59. package/dist/cjs/f/fields/V2/index.js +82 -0
  60. package/dist/cjs/f/fields/index.js +26 -1
  61. package/dist/es/a/TextSteps/TextSteps.js +4 -4
  62. package/dist/es/a/TextSteps/styles.scss +1 -1
  63. package/dist/es/f/FormInput/FormInput.js +33 -3
  64. package/dist/es/f/common/V2/Description/Description.js +68 -0
  65. package/dist/es/f/common/V2/Description/index.js +2 -0
  66. package/dist/es/f/common/V2/Description/styles.scss +10 -0
  67. package/dist/es/f/common/V2/Label/Label.js +76 -0
  68. package/dist/es/f/common/V2/Label/index.js +2 -0
  69. package/dist/es/f/common/V2/Label/styles.scss +9 -0
  70. package/dist/es/f/common/V2/index.js +2 -0
  71. package/dist/es/f/common/index.js +2 -1
  72. package/dist/es/f/fields/V2/Checkbox/Checkbox.js +114 -0
  73. package/dist/es/f/fields/V2/Checkbox/index.js +2 -0
  74. package/dist/es/f/fields/V2/Checkbox/styles.scss +16 -0
  75. package/dist/es/f/fields/V2/ChoicesInput/ChoicesInput.js +148 -0
  76. package/dist/es/f/fields/V2/ChoicesInput/common/Choice/Choice.js +97 -0
  77. package/dist/es/f/fields/V2/ChoicesInput/common/Choice/index.js +2 -0
  78. package/dist/es/f/fields/V2/ChoicesInput/common/index.js +1 -0
  79. package/dist/es/f/fields/V2/ChoicesInput/index.js +2 -0
  80. package/dist/es/f/fields/V2/ChoicesInput/styles.scss +79 -0
  81. package/dist/es/f/fields/V2/EditorInput/EditorInput.js +192 -0
  82. package/dist/es/f/fields/V2/EditorInput/common/Toolbar.js +246 -0
  83. package/dist/es/f/fields/V2/EditorInput/common/TreeViewPlugin.js +11 -0
  84. package/dist/es/f/fields/V2/EditorInput/common/index.js +2 -0
  85. package/dist/es/f/fields/V2/EditorInput/index.js +2 -0
  86. package/dist/es/f/fields/V2/EditorInput/styles.scss +149 -0
  87. package/dist/es/f/fields/V2/LinkInput/LinkInput.js +148 -0
  88. package/dist/es/f/fields/V2/LinkInput/index.js +2 -0
  89. package/dist/es/f/fields/V2/LinkInput/styles.scss +90 -0
  90. package/dist/es/f/fields/V2/QueryChoices/QueryChoices.js +126 -0
  91. package/dist/es/f/fields/V2/QueryChoices/index.js +2 -0
  92. package/dist/es/f/fields/V2/QueryCombobox/QueryCombobox.js +221 -0
  93. package/dist/es/f/fields/V2/QueryCombobox/common/Combobox/Combobox.js +229 -0
  94. package/dist/es/f/fields/V2/QueryCombobox/common/Combobox/index.js +2 -0
  95. package/dist/es/f/fields/V2/QueryCombobox/common/Menu/Menu.js +73 -0
  96. package/dist/es/f/fields/V2/QueryCombobox/common/Menu/index.js +2 -0
  97. package/dist/es/f/fields/V2/QueryCombobox/common/MultipleCombobox/MultipleCombobox.js +293 -0
  98. package/dist/es/f/fields/V2/QueryCombobox/common/MultipleCombobox/index.js +2 -0
  99. package/dist/es/f/fields/V2/QueryCombobox/common/index.js +3 -0
  100. package/dist/es/f/fields/V2/QueryCombobox/index.js +2 -0
  101. package/dist/es/f/fields/V2/QueryCombobox/styles.scss +127 -0
  102. package/dist/es/f/fields/V2/QuerySelect/QuerySelect.js +186 -0
  103. package/dist/es/f/fields/V2/QuerySelect/index.js +2 -0
  104. package/dist/es/f/fields/V2/RatingsInput/RatingsInput.js +124 -0
  105. package/dist/es/f/fields/V2/RatingsInput/common/Rating/Rating.js +109 -0
  106. package/dist/es/f/fields/V2/RatingsInput/common/Rating/index.js +2 -0
  107. package/dist/es/f/fields/V2/RatingsInput/common/index.js +1 -0
  108. package/dist/es/f/fields/V2/RatingsInput/index.js +2 -0
  109. package/dist/es/f/fields/V2/RatingsInput/styles.scss +48 -0
  110. package/dist/es/f/fields/V2/SelectInput/SelectInput.js +146 -0
  111. package/dist/es/f/fields/V2/SelectInput/index.js +2 -0
  112. package/dist/es/f/fields/V2/SelectInput/styles.scss +87 -0
  113. package/dist/es/f/fields/V2/TextInput/TextInput.js +147 -0
  114. package/dist/es/f/fields/V2/TextInput/index.js +2 -0
  115. package/dist/es/f/fields/V2/TextInput/styles.scss +78 -0
  116. package/dist/es/f/fields/V2/TextareaInput/TextareaInput.js +146 -0
  117. package/dist/es/f/fields/V2/TextareaInput/index.js +2 -0
  118. package/dist/es/f/fields/V2/TextareaInput/styles.scss +53 -0
  119. package/dist/es/f/fields/V2/index.js +11 -0
  120. package/dist/es/f/fields/index.js +2 -1
  121. package/package.json +3 -3
  122. package/src/stories/f/v2/Checkbox.stories.jsx +102 -0
  123. package/src/stories/f/v2/ChoicesInput.stories.jsx +139 -0
  124. package/src/stories/f/v2/EditorInput.stories.jsx +81 -0
  125. package/src/stories/f/v2/LinkInput.stories.jsx +93 -0
  126. package/src/stories/f/v2/QueryChoices.stories.jsx +144 -0
  127. package/src/stories/f/v2/QueryCombobox.stories.jsx +301 -0
  128. package/src/stories/f/v2/QuerySelect.stories.jsx +150 -0
  129. package/src/stories/f/v2/RatingsInput.stories.jsx +77 -0
  130. package/src/stories/f/v2/SelectInput.stories.jsx +95 -0
  131. package/src/stories/f/v2/TextInput.stories.jsx +120 -0
  132. package/src/stories/f/v2/TextareaInput.stories.jsx +107 -0
  133. package/src/stories/f/v2/__generated__/FormInputAllTaskStatusesQuery.graphql.js +122 -0
  134. package/src/stories/f/v2/__generated__/FormInputAllTeamsQuery.graphql.js +139 -0
  135. package/src/stories/f/v2/__generated__/QueryChoicesAllTaskStatusesQuery.graphql.js +122 -0
  136. package/src/stories/f/v2/__generated__/QueryComboboxAllTeamsQuery.graphql.js +139 -0
  137. package/src/stories/f/v2/__generated__/QuerySelectAllTaskStatusesQuery.graphql.js +122 -0
  138. package/src/ui/a/TextSteps/TextSteps.jsx +4 -4
  139. package/src/ui/a/TextSteps/styles.scss +1 -1
  140. package/src/ui/f/FormInput/FormInput.jsx +57 -12
  141. package/src/ui/f/common/V2/Description/Description.jsx +94 -0
  142. package/src/ui/f/common/V2/Description/index.js +2 -0
  143. package/src/ui/f/common/V2/Description/styles.scss +10 -0
  144. package/src/ui/f/common/V2/Label/Label.jsx +102 -0
  145. package/src/ui/f/common/V2/Label/index.js +2 -0
  146. package/src/ui/f/common/V2/Label/styles.scss +9 -0
  147. package/src/ui/f/common/V2/index.js +2 -0
  148. package/src/ui/f/common/index.js +1 -0
  149. package/src/ui/f/fields/V2/Checkbox/Checkbox.jsx +146 -0
  150. package/src/ui/f/fields/V2/Checkbox/index.js +2 -0
  151. package/src/ui/f/fields/V2/Checkbox/styles.scss +16 -0
  152. package/src/ui/f/fields/V2/ChoicesInput/ChoicesInput.jsx +183 -0
  153. package/src/ui/f/fields/V2/ChoicesInput/common/Choice/Choice.jsx +125 -0
  154. package/src/ui/f/fields/V2/ChoicesInput/common/Choice/index.js +2 -0
  155. package/src/ui/f/fields/V2/ChoicesInput/common/index.js +1 -0
  156. package/src/ui/f/fields/V2/ChoicesInput/index.js +2 -0
  157. package/src/ui/f/fields/V2/ChoicesInput/styles.scss +79 -0
  158. package/src/ui/f/fields/V2/EditorInput/EditorInput.jsx +244 -0
  159. package/src/ui/f/fields/V2/EditorInput/common/Toolbar.jsx +356 -0
  160. package/src/ui/f/fields/V2/EditorInput/common/TreeViewPlugin.jsx +16 -0
  161. package/src/ui/f/fields/V2/EditorInput/common/index.jsx +2 -0
  162. package/src/ui/f/fields/V2/EditorInput/index.js +2 -0
  163. package/src/ui/f/fields/V2/EditorInput/styles.scss +149 -0
  164. package/src/ui/f/fields/V2/LinkInput/LinkInput.jsx +187 -0
  165. package/src/ui/f/fields/V2/LinkInput/index.js +2 -0
  166. package/src/ui/f/fields/V2/LinkInput/styles.scss +90 -0
  167. package/src/ui/f/fields/V2/QueryChoices/QueryChoices.jsx +153 -0
  168. package/src/ui/f/fields/V2/QueryChoices/index.js +2 -0
  169. package/src/ui/f/fields/V2/QueryCombobox/QueryCombobox.jsx +254 -0
  170. package/src/ui/f/fields/V2/QueryCombobox/common/Combobox/Combobox.jsx +276 -0
  171. package/src/ui/f/fields/V2/QueryCombobox/common/Combobox/index.js +2 -0
  172. package/src/ui/f/fields/V2/QueryCombobox/common/Menu/Menu.jsx +103 -0
  173. package/src/ui/f/fields/V2/QueryCombobox/common/Menu/index.js +2 -0
  174. package/src/ui/f/fields/V2/QueryCombobox/common/MultipleCombobox/MultipleCombobox.jsx +362 -0
  175. package/src/ui/f/fields/V2/QueryCombobox/common/MultipleCombobox/index.js +2 -0
  176. package/src/ui/f/fields/V2/QueryCombobox/common/index.js +3 -0
  177. package/src/ui/f/fields/V2/QueryCombobox/index.js +2 -0
  178. package/src/ui/f/fields/V2/QueryCombobox/styles.scss +127 -0
  179. package/src/ui/f/fields/V2/QuerySelect/QuerySelect.jsx +220 -0
  180. package/src/ui/f/fields/V2/QuerySelect/index.js +2 -0
  181. package/src/ui/f/fields/V2/RatingsInput/RatingsInput.jsx +152 -0
  182. package/src/ui/f/fields/V2/RatingsInput/common/Rating/Rating.jsx +142 -0
  183. package/src/ui/f/fields/V2/RatingsInput/common/Rating/index.js +2 -0
  184. package/src/ui/f/fields/V2/RatingsInput/common/index.js +1 -0
  185. package/src/ui/f/fields/V2/RatingsInput/index.js +2 -0
  186. package/src/ui/f/fields/V2/RatingsInput/styles.scss +48 -0
  187. package/src/ui/f/fields/V2/SelectInput/SelectInput.jsx +187 -0
  188. package/src/ui/f/fields/V2/SelectInput/index.js +2 -0
  189. package/src/ui/f/fields/V2/SelectInput/styles.scss +87 -0
  190. package/src/ui/f/fields/V2/TextInput/TextInput.jsx +192 -0
  191. package/src/ui/f/fields/V2/TextInput/index.js +2 -0
  192. package/src/ui/f/fields/V2/TextInput/styles.scss +78 -0
  193. package/src/ui/f/fields/V2/TextareaInput/TextareaInput.jsx +180 -0
  194. package/src/ui/f/fields/V2/TextareaInput/index.js +2 -0
  195. package/src/ui/f/fields/V2/TextareaInput/styles.scss +53 -0
  196. package/src/ui/f/fields/V2/index.js +11 -0
  197. package/src/ui/f/fields/index.js +1 -0
  198. package/tests/__snapshots__/Storyshots.test.js.snap +5910 -1
@@ -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;
@@ -0,0 +1,2 @@
1
+ /* @pareto-engineering/generator-front 1.0.12 */
2
+ export { default as MultipleCombobox } from "./MultipleCombobox";
@@ -0,0 +1,3 @@
1
+ export { Menu } from "./Menu";
2
+ export { Combobox } from "./Combobox";
3
+ export { MultipleCombobox } from "./MultipleCombobox";
@@ -0,0 +1,2 @@
1
+ /* @pareto-engineering/generator-front 1.0.12 */
2
+ export { default as QueryCombobox } from "./QueryCombobox";
@@ -0,0 +1,127 @@
1
+ /* @pareto-engineering/generator-front 1.0.12 */
2
+ /* stylelint-disable max-nesting-depth -- needed here */
3
+ /* stylelint-disable selector-max-compound-selectors -- needed here */
4
+
5
+ @use "@pareto-engineering/bem";
6
+ @use "@pareto-engineering/styles/src/mixins";
7
+ @use "@pareto-engineering/styles/src/globals" as *;
8
+
9
+ $default-input-padding: .55em .75em;
10
+ $default-gap: var(--gap);
11
+ $default-loading-circle-displacement: .5em;
12
+ $default-input-border-radius: var(--theme-default-input-border-radius);
13
+ $default-border: var(--theme-default-input-border);
14
+ $hover-border: var(--theme-hover-input-border);
15
+ $focus-border: var(--theme-focus-input-border);
16
+ $default-background: var(--background-inputs);
17
+ $on-default-background: var(--paragraph);
18
+ $disabled-background: var(--background-inputs-30);
19
+ $on-disabled-background: var(--on-background-inputs-30);
20
+
21
+ .#{bem.$base}.combobox,
22
+ .#{bem.$base}.multiple-combobox {
23
+ display: flex;
24
+ flex-direction: column;
25
+ outline: none;
26
+ position: relative;
27
+
28
+ > .#{bem.$base}.form-label {
29
+ margin-bottom: var(--gap);
30
+ }
31
+
32
+
33
+ .#{bem.$base}.popover {
34
+ border: $default-border;
35
+ border-radius: $default-input-border-radius;
36
+ width: 100%;
37
+
38
+ >.menu {
39
+ list-style: none;
40
+ margin: 0;
41
+ outline: 0;
42
+ padding: 0;
43
+
44
+ >.item {
45
+ border-radius: $default-input-border-radius;
46
+ padding: $default-input-padding;
47
+
48
+ > p {
49
+ margin: 0;
50
+ }
51
+
52
+ &.#{bem.$modifier-active} {
53
+ background-color: var(--y);
54
+
55
+ > p {
56
+ color: var(--on-y);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ >.#{bem.$base}.loading-circle,
64
+ >.#{bem.$base}.button {
65
+ position: absolute;
66
+ right: $default-loading-circle-displacement;
67
+ }
68
+
69
+ >.#{bem.$base}.loading-circle {
70
+ top: calc($default-loading-circle-displacement * 1.5);
71
+ }
72
+
73
+ >.#{bem.$base}.button {
74
+ top: $default-loading-circle-displacement;
75
+ }
76
+
77
+ > .input {
78
+ background: $default-background;
79
+ border: $default-border;
80
+ border-radius: calc(var(--theme-default-border-radius) / 2);
81
+ color: $on-default-background;
82
+ outline: none;
83
+ padding: $default-input-padding;
84
+
85
+ &::placeholder {
86
+ color: var(--metadata);
87
+ }
88
+
89
+ &:disabled {
90
+ background-color: $disabled-background;
91
+ color: $on-disabled-background;
92
+ }
93
+
94
+ &:not(:disabled) {
95
+ &:hover,
96
+ &:active {
97
+ border: $hover-border;
98
+ }
99
+
100
+ &:focus {
101
+ border: $focus-border;
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+
108
+ .#{bem.$base}.multiple-combobox {
109
+ >.selected-items {
110
+ display: flex;
111
+ flex-wrap: wrap;
112
+ gap: calc($default-gap / 2);
113
+ margin-bottom: calc($default-gap / 2);
114
+
115
+ >.item {
116
+ >.#{bem.$base}.button {
117
+ align-items: center;
118
+ display: flex;
119
+ gap: calc($default-gap / 2);
120
+ }
121
+
122
+ .close {
123
+ font-size: calc(var(--s-3) * 1em);
124
+ }
125
+ }
126
+ }
127
+ }
@@ -0,0 +1,186 @@
1
+ /* @pareto-engineering/generator-front 1.0.12 */
2
+ import * as React from 'react';
3
+ import { useState, useEffect } from 'react';
4
+ import { useRelayEnvironment, fetchQuery } from 'react-relay';
5
+ import { useField } from 'formik';
6
+ import PropTypes from 'prop-types';
7
+
8
+ // Local Definitions
9
+
10
+ import { SelectInput } from "../../..";
11
+
12
+ /**
13
+ * This is the component description.
14
+ */
15
+ const QuerySelect = ({
16
+ id,
17
+ className: userClassName,
18
+ style,
19
+ name,
20
+ label,
21
+ labelColor,
22
+ optional,
23
+ query,
24
+ variables,
25
+ optionsKeyMap,
26
+ description,
27
+ disabled,
28
+ color,
29
+ loadingOption,
30
+ defaultOption,
31
+ validate
32
+ // ...otherProps
33
+ }) => {
34
+ const [,, helpers] = useField({
35
+ name,
36
+ validate
37
+ });
38
+ const {
39
+ setError
40
+ } = helpers;
41
+ const environment = useRelayEnvironment();
42
+ const [isFetching, setIsFetching] = useState(false);
43
+ const [options, setOptions] = useState([]);
44
+ const {
45
+ graphql,
46
+ accessor
47
+ } = query;
48
+ const getOptions = () => {
49
+ if (isFetching) return;
50
+ fetchQuery(environment, graphql, variables).subscribe({
51
+ start: () => {
52
+ setIsFetching(true);
53
+ setOptions([loadingOption]);
54
+ },
55
+ complete: () => {
56
+ setIsFetching(false);
57
+ },
58
+ error: fetchError => {
59
+ setIsFetching(false);
60
+ if (setError) setError(fetchError.message);
61
+ },
62
+ next: data => {
63
+ setOptions([defaultOption, ...data[accessor].edges.map(({
64
+ node
65
+ }) => ({
66
+ value: node[optionsKeyMap.value],
67
+ label: optionsKeyMap.getLabel(node)
68
+ }))]);
69
+ }
70
+ });
71
+ };
72
+ useEffect(() => {
73
+ getOptions();
74
+ }, [variables]);
75
+ return /*#__PURE__*/React.createElement(SelectInput, {
76
+ id: id,
77
+ className: userClassName,
78
+ style: style,
79
+ name: name,
80
+ label: label,
81
+ optional: optional,
82
+ color: color,
83
+ labelColor: labelColor,
84
+ description: description,
85
+ disabled: isFetching || disabled,
86
+ options: options,
87
+ isLoading: isFetching
88
+ });
89
+ };
90
+ QuerySelect.propTypes = {
91
+ /**
92
+ * The HTML id for this element
93
+ */
94
+ id: PropTypes.string,
95
+ /**
96
+ * The HTML class names for this element
97
+ */
98
+ className: PropTypes.string,
99
+ /**
100
+ * The React-written, css properties for this element.
101
+ */
102
+ style: PropTypes.objectOf(PropTypes.string),
103
+ /**
104
+ * The name of the custom select input
105
+ */
106
+ name: PropTypes.string,
107
+ /**
108
+ * The label of the custom select input
109
+ */
110
+ label: PropTypes.string,
111
+ /**
112
+ * The custom select input description
113
+ */
114
+ description: PropTypes.string,
115
+ /**
116
+ * Whether the input should be disabled
117
+ */
118
+ disabled: PropTypes.bool,
119
+ /**
120
+ * The base color of the custom select input
121
+ */
122
+ color: PropTypes.string,
123
+ /**
124
+ * The label color of the custom select input
125
+ */
126
+ labelColor: PropTypes.string,
127
+ /**
128
+ * The graphql query to fetch the options and the accessor to destructure the results from
129
+ */
130
+ query: PropTypes.shape({
131
+ accessor: PropTypes.string,
132
+ graphql: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired
133
+ }),
134
+ /**
135
+ * The variables that might be required to be used in the query to fetch
136
+ * select options.
137
+ */
138
+ variables: PropTypes.objectOf(PropTypes.string),
139
+ /**
140
+ * The select option keys to be used to map the data to the select options.
141
+ * i.e `{ value: 'id', label: 'name' }`
142
+ */
143
+ optionsKeyMap: PropTypes.shape({
144
+ value: PropTypes.string.isRequired,
145
+ getLabel: PropTypes.func.isRequired
146
+ }).isRequired,
147
+ /**
148
+ * The default select option for the query select
149
+ */
150
+ defaultOption: PropTypes.shape({
151
+ value: PropTypes.string.isRequired,
152
+ label: PropTypes.string.isRequired,
153
+ disabled: PropTypes.bool.isRequired
154
+ }),
155
+ /**
156
+ * The option to dipslayed when the select options are being fetched
157
+ */
158
+ loadingOption: PropTypes.shape({
159
+ value: PropTypes.string.isRequired,
160
+ label: PropTypes.string.isRequired,
161
+ disabled: PropTypes.bool.isRequired
162
+ }),
163
+ /**
164
+ * The query select field validator function
165
+ */
166
+ validate: PropTypes.func,
167
+ /*
168
+ * Whether the input is optional or not
169
+ */
170
+ optional: PropTypes.bool
171
+ };
172
+ QuerySelect.defaultProps = {
173
+ disabled: false,
174
+ color: 'paragraph',
175
+ defaultOption: {
176
+ value: '',
177
+ label: 'Select an option',
178
+ disabled: true
179
+ },
180
+ loadingOption: {
181
+ value: '',
182
+ label: 'Fetching Options',
183
+ disabled: true
184
+ }
185
+ };
186
+ export default QuerySelect;
@@ -0,0 +1,2 @@
1
+ /* @pareto-engineering/generator-front 1.0.12 */
2
+ export { default as QuerySelect } from "./QuerySelect";