dce-reactkit 3.4.1 → 3.5.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/.eslintrc.js +2 -0
  2. package/.vscode/settings.json +1 -0
  3. package/dist/cjs/index.js +36372 -435
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/types/components/DBEntryManagerPanel/AddOrEditDBEntry/CreatableMultiselect.d.ts +10 -0
  6. package/dist/cjs/types/components/DBEntryManagerPanel/AddOrEditDBEntry/index.d.ts +34 -0
  7. package/dist/cjs/types/components/DBEntryManagerPanel/helpers/generateEndpointPath.d.ts +9 -0
  8. package/dist/cjs/types/components/DBEntryManagerPanel/index.d.ts +25 -0
  9. package/dist/cjs/types/components/DBEntryManagerPanel/types/DBEntry.d.ts +8 -0
  10. package/dist/cjs/types/components/DBEntryManagerPanel/types/DBEntryField.d.ts +49 -0
  11. package/dist/cjs/types/components/DBEntryManagerPanel/types/DBEntryFieldType.d.ts +12 -0
  12. package/dist/cjs/types/helpers/addDBEditorEndpoints.d.ts +40 -0
  13. package/dist/cjs/types/helpers/canReviewLogs.d.ts +0 -5
  14. package/dist/cjs/types/index.d.ts +6 -5
  15. package/dist/esm/index.js +36587 -667
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/types/components/DBEntryManagerPanel/AddOrEditDBEntry/CreatableMultiselect.d.ts +10 -0
  18. package/dist/esm/types/components/DBEntryManagerPanel/AddOrEditDBEntry/index.d.ts +34 -0
  19. package/dist/esm/types/components/DBEntryManagerPanel/helpers/generateEndpointPath.d.ts +9 -0
  20. package/dist/esm/types/components/DBEntryManagerPanel/index.d.ts +25 -0
  21. package/dist/esm/types/components/DBEntryManagerPanel/types/DBEntry.d.ts +8 -0
  22. package/dist/esm/types/components/DBEntryManagerPanel/types/DBEntryField.d.ts +49 -0
  23. package/dist/esm/types/components/DBEntryManagerPanel/types/DBEntryFieldType.d.ts +12 -0
  24. package/dist/esm/types/helpers/addDBEditorEndpoints.d.ts +40 -0
  25. package/dist/esm/types/helpers/canReviewLogs.d.ts +0 -5
  26. package/dist/esm/types/index.d.ts +6 -5
  27. package/dist/index.d.ts +166 -100
  28. package/package.json +16 -12
  29. package/src/client/initClient.tsx +23 -31
  30. package/src/components/AppWrapper.tsx +1 -1
  31. package/src/components/DBEntryManagerPanel/AddOrEditDBEntry/CreatableMultiselect.tsx +303 -0
  32. package/src/components/DBEntryManagerPanel/AddOrEditDBEntry/index.tsx +737 -0
  33. package/src/components/DBEntryManagerPanel/helpers/generateEndpointPath.ts +16 -0
  34. package/src/components/DBEntryManagerPanel/index.tsx +522 -0
  35. package/src/components/DBEntryManagerPanel/types/DBEntry.ts +7 -0
  36. package/src/components/DBEntryManagerPanel/types/DBEntryField.ts +94 -0
  37. package/src/components/DBEntryManagerPanel/types/DBEntryFieldType.ts +18 -0
  38. package/src/components/ItemPicker/index.test.tsx +10 -10
  39. package/src/helpers/addDBEditorEndpoints.ts +128 -0
  40. package/src/helpers/canReviewLogs.ts +0 -20
  41. package/src/helpers/genCSV.ts +2 -5
  42. package/src/helpers/{getOrdinal.ts → getOrdinal.tsx} +0 -1
  43. package/src/index.ts +11 -9
  44. package/tsconfig.json +2 -6
  45. package/dist/cjs/types/helpers/abbreviate.test.d.ts +0 -5
  46. package/dist/cjs/types/helpers/avg.test.d.ts +0 -5
  47. package/dist/cjs/types/helpers/canReviewLogs.test.d.ts +0 -5
  48. package/dist/cjs/types/helpers/ceilToNumDecimals.test.d.ts +0 -5
  49. package/dist/cjs/types/helpers/compareArraysByProp.test.d.ts +0 -5
  50. package/dist/cjs/types/helpers/extractProp.test.d.ts +0 -5
  51. package/dist/cjs/types/helpers/floorToNumDecimals.test.d.ts +0 -5
  52. package/dist/cjs/types/helpers/forceNumIntoBounds.test.d.ts +0 -5
  53. package/dist/cjs/types/helpers/genCSV.test.d.ts +0 -5
  54. package/dist/cjs/types/helpers/genCommaList.d.ts +0 -12
  55. package/dist/cjs/types/helpers/genCommaList.test.d.ts +0 -1
  56. package/dist/cjs/types/helpers/getHumanReadableDate.test.d.ts +0 -5
  57. package/dist/cjs/types/helpers/getLocalTimeInfo.test.d.ts +0 -6
  58. package/dist/cjs/types/helpers/getMonthName.test.d.ts +0 -5
  59. package/dist/cjs/types/helpers/getOrdinal.test.d.ts +0 -5
  60. package/dist/cjs/types/helpers/getPartOfDay.test.d.ts +0 -5
  61. package/dist/cjs/types/helpers/getTimeInfoInET.test.d.ts +0 -5
  62. package/dist/cjs/types/helpers/validators/shared/constants/ERROR_MESSAGES.d.ts +0 -10
  63. package/dist/cjs/types/helpers/validators/shared/helpers/validateRegex.d.ts +0 -19
  64. package/dist/cjs/types/helpers/validators/shared/types/ValidationResult.d.ts +0 -12
  65. package/dist/cjs/types/helpers/validators/validateEmail.d.ts +0 -11
  66. package/dist/cjs/types/helpers/validators/validateEmail.test.d.ts +0 -1
  67. package/dist/cjs/types/helpers/validators/validatePhoneNumber.d.ts +0 -11
  68. package/dist/cjs/types/helpers/validators/validatePhoneNumber.test.d.ts +0 -1
  69. package/dist/cjs/types/helpers/validators/validateString.d.ts +0 -22
  70. package/dist/cjs/types/helpers/validators/validateString.test.d.ts +0 -1
  71. package/dist/esm/types/helpers/abbreviate.test.d.ts +0 -5
  72. package/dist/esm/types/helpers/avg.test.d.ts +0 -5
  73. package/dist/esm/types/helpers/canReviewLogs.test.d.ts +0 -5
  74. package/dist/esm/types/helpers/ceilToNumDecimals.test.d.ts +0 -5
  75. package/dist/esm/types/helpers/compareArraysByProp.test.d.ts +0 -5
  76. package/dist/esm/types/helpers/extractProp.test.d.ts +0 -5
  77. package/dist/esm/types/helpers/floorToNumDecimals.test.d.ts +0 -5
  78. package/dist/esm/types/helpers/forceNumIntoBounds.test.d.ts +0 -5
  79. package/dist/esm/types/helpers/genCSV.test.d.ts +0 -5
  80. package/dist/esm/types/helpers/genCommaList.d.ts +0 -12
  81. package/dist/esm/types/helpers/genCommaList.test.d.ts +0 -1
  82. package/dist/esm/types/helpers/getHumanReadableDate.test.d.ts +0 -5
  83. package/dist/esm/types/helpers/getLocalTimeInfo.test.d.ts +0 -6
  84. package/dist/esm/types/helpers/getMonthName.test.d.ts +0 -5
  85. package/dist/esm/types/helpers/getOrdinal.test.d.ts +0 -5
  86. package/dist/esm/types/helpers/getPartOfDay.test.d.ts +0 -5
  87. package/dist/esm/types/helpers/getTimeInfoInET.test.d.ts +0 -5
  88. package/dist/esm/types/helpers/validators/shared/constants/ERROR_MESSAGES.d.ts +0 -10
  89. package/dist/esm/types/helpers/validators/shared/helpers/validateRegex.d.ts +0 -19
  90. package/dist/esm/types/helpers/validators/shared/types/ValidationResult.d.ts +0 -12
  91. package/dist/esm/types/helpers/validators/validateEmail.d.ts +0 -11
  92. package/dist/esm/types/helpers/validators/validateEmail.test.d.ts +0 -1
  93. package/dist/esm/types/helpers/validators/validatePhoneNumber.d.ts +0 -11
  94. package/dist/esm/types/helpers/validators/validatePhoneNumber.test.d.ts +0 -1
  95. package/dist/esm/types/helpers/validators/validateString.d.ts +0 -22
  96. package/dist/esm/types/helpers/validators/validateString.test.d.ts +0 -1
  97. package/src/helpers/abbreviate.test.ts +0 -26
  98. package/src/helpers/avg.test.ts +0 -24
  99. package/src/helpers/canReviewLogs.test.ts +0 -67
  100. package/src/helpers/ceilToNumDecimals.test.ts +0 -39
  101. package/src/helpers/compareArraysByProp.test.ts +0 -102
  102. package/src/helpers/extractProp.test.ts +0 -34
  103. package/src/helpers/floorToNumDecimals.test.ts +0 -39
  104. package/src/helpers/forceNumIntoBounds.test.ts +0 -34
  105. package/src/helpers/genCSV.test.ts +0 -61
  106. package/src/helpers/genCommaList.test.ts +0 -57
  107. package/src/helpers/genCommaList.ts +0 -21
  108. package/src/helpers/getHumanReadableDate.test.ts +0 -29
  109. package/src/helpers/getLocalTimeInfo.test.ts +0 -48
  110. package/src/helpers/getMonthName.test.ts +0 -79
  111. package/src/helpers/getOrdinal.test.ts +0 -84
  112. package/src/helpers/getPartOfDay.test.ts +0 -56
  113. package/src/helpers/getTimeInfoInET.test.ts +0 -72
  114. package/src/helpers/validators/shared/constants/ERROR_MESSAGES.ts +0 -18
  115. package/src/helpers/validators/shared/helpers/validateRegex.ts +0 -47
  116. package/src/helpers/validators/shared/types/ValidationResult.ts +0 -20
  117. package/src/helpers/validators/validateEmail.test.ts +0 -110
  118. package/src/helpers/validators/validateEmail.ts +0 -47
  119. package/src/helpers/validators/validatePhoneNumber.test.ts +0 -94
  120. package/src/helpers/validators/validatePhoneNumber.ts +0 -49
  121. package/src/helpers/validators/validateString.test.ts +0 -175
  122. package/src/helpers/validators/validateString.ts +0 -171
  123. /package/src/helpers/{abbreviate.ts → abbreviate.tsx} +0 -0
  124. /package/src/helpers/{avg.ts → avg.tsx} +0 -0
  125. /package/src/helpers/{ceilToNumDecimals.ts → ceilToNumDecimals.tsx} +0 -0
  126. /package/src/helpers/{floorToNumDecimals.ts → floorToNumDecimals.tsx} +0 -0
  127. /package/src/helpers/{forceNumIntoBounds.ts → forceNumIntoBounds.tsx} +0 -0
  128. /package/src/helpers/{getLocalTimeInfo.ts → getLocalTimeInfo.tsx} +0 -0
  129. /package/src/helpers/{getTimeInfoInET.ts → getTimeInfoInET.tsx} +0 -0
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Multiselect component that allows the user to type in values and add them to
3
+ * the multiselect component
4
+ * @author Yuen Ler Chow
5
+ * @author Gabe Abrams
6
+ */
7
+
8
+ // Import React
9
+ import React, { KeyboardEventHandler, useReducer } from 'react';
10
+
11
+ // Import React Select
12
+ import CreatableSelect from 'react-select/creatable';
13
+ import { MultiValue } from 'react-select';
14
+
15
+ // Import other types
16
+ import DBEntryFieldType from '../types/DBEntryFieldType';
17
+
18
+ /*------------------------------------------------------------------------*/
19
+ /* -------------------------------- Types ------------------------------- */
20
+ /*------------------------------------------------------------------------*/
21
+
22
+ // Props definition
23
+ type Props = {
24
+ // Type of the field
25
+ type: DBEntryFieldType.StringArray | DBEntryFieldType.NumberArray,
26
+ // The values entered by the user
27
+ values: string[] | number[],
28
+ // Function to call when the values change
29
+ onChange: (values: string[] | number[]) => void,
30
+ // True if the field is disabled
31
+ disabled?: boolean,
32
+ };
33
+
34
+ // An option for the multiselect component
35
+ type Option = {
36
+ // What the user sees and types in for the option
37
+ label: string,
38
+ // Lowercase, no spaces, no special characters of the label
39
+ value: string,
40
+ };
41
+
42
+ /*------------------------------------------------------------------------*/
43
+ /* -------------------------------- State ------------------------------- */
44
+ /*------------------------------------------------------------------------*/
45
+
46
+ /* -------- State Definition -------- */
47
+
48
+ type State = {
49
+ // what the user has typed in so far(before pressing enter or tab)
50
+ inputValue: string,
51
+ };
52
+
53
+ /* ------------- Actions ------------ */
54
+
55
+ // Types of actions
56
+ enum ActionType {
57
+ // Update the input value
58
+ SetInputValue = 'SetInputValue',
59
+ }
60
+
61
+ // Action definitions
62
+ type Action = (
63
+ | {
64
+ // Action type
65
+ type: ActionType.SetInputValue,
66
+ // New value
67
+ value: string,
68
+ }
69
+ );
70
+
71
+ /**
72
+ * Reducer that executes actions
73
+ * @author Yuen Ler Chow
74
+ * @param state current state
75
+ * @param action action to execute
76
+ * @returns updated state
77
+ */
78
+ const reducer = (state: State, action: Action): State => {
79
+ switch (action.type) {
80
+ case ActionType.SetInputValue: {
81
+ return {
82
+ ...state,
83
+ inputValue: action.value,
84
+ };
85
+ }
86
+ default: {
87
+ return state;
88
+ }
89
+ }
90
+ };
91
+
92
+ /*------------------------------------------------------------------------*/
93
+ /* -------------------------------- State ------------------------------- */
94
+ /*------------------------------------------------------------------------*/
95
+
96
+ const CreatableMultiselect: React.FC<Props> = (props) => {
97
+ // Destructure all props
98
+ const {
99
+ type,
100
+ values,
101
+ onChange,
102
+ disabled,
103
+ } = props;
104
+
105
+ /* -------------- State ------------- */
106
+
107
+ // Initial state
108
+ const initialState: State = {
109
+ inputValue: '',
110
+ };
111
+
112
+ // Initialize state
113
+ const [state, dispatch] = useReducer(reducer, initialState);
114
+
115
+ // Destructure common state
116
+ const { inputValue } = state;
117
+
118
+ /*------------------------------------------------------------------------*/
119
+ /* ------------------------- Component Functions ------------------------ */
120
+ /*------------------------------------------------------------------------*/
121
+
122
+ /**
123
+ * Creates an option for the multiselect component
124
+ * @author Yuen Ler Chow
125
+ * @param label label of the option
126
+ * @returns the new option
127
+ */
128
+ const createOption = (label: string): Option => {
129
+ // set the value to the label without special characters and spaces, and lowercase
130
+ return {
131
+ label,
132
+ value: (
133
+ label
134
+ // Make lowercase
135
+ .toLowerCase()
136
+ // Replace special characters with nothing
137
+ .replace(/\W/g, '')
138
+ // Replace spaces with dashes
139
+ .replace(' ', '-')
140
+ ),
141
+ };
142
+ };
143
+
144
+ /**
145
+ * Adds the values to the multiselect component
146
+ * @author Yuen Ler Chow
147
+ * @param newValue new value to add
148
+ */
149
+ const addValues = (newValue: string) => {
150
+ if (type === DBEntryFieldType.NumberArray) {
151
+ const newValues = (
152
+ newValue
153
+ // Split into items
154
+ .split(',')
155
+ // Trim strings
156
+ .map((val) => {
157
+ return val.trim();
158
+ })
159
+ // Filter zero length
160
+ .filter((trimmedVal) => {
161
+ return trimmedVal.length > 0;
162
+ })
163
+ // Parse to number
164
+ .map(Number.parseFloat)
165
+ // Filter out existing values
166
+ .filter((numberVal) => {
167
+ return !values.some((value) => {
168
+ return value === numberVal;
169
+ });
170
+ })
171
+ );
172
+
173
+ // Notify parent of new values
174
+ onChange([...values, ...newValues] as number[]);
175
+ } else {
176
+ const newValues = (
177
+ newValue
178
+ // Split into items
179
+ .split(',')
180
+ // Trim strings
181
+ .map((val) => {
182
+ return val.trim();
183
+ })
184
+ // Filter zero length
185
+ .filter((trimmedVal) => {
186
+ return (trimmedVal.length > 0);
187
+ })
188
+ // Filter out existing values
189
+ .filter((val) => {
190
+ return !values.some((value) => {
191
+ return value === val;
192
+ });
193
+ })
194
+ );
195
+
196
+ // Notify parent of new values
197
+ onChange([...values, ...newValues] as string[]);
198
+ }
199
+
200
+ // Reset text field to empty because the values have been added
201
+ dispatch({
202
+ type: ActionType.SetInputValue,
203
+ value: '',
204
+ });
205
+ };
206
+
207
+ /**
208
+ * Adds the values to the multiselect component when enter or tab is pressed
209
+ * @author Yuen Ler Chow
210
+ * @param event keyboard event
211
+ */
212
+ const handleKeyDown: KeyboardEventHandler = (event) => {
213
+ // Skip if no input value
214
+ if (!inputValue) {
215
+ return;
216
+ }
217
+
218
+ // Add values if enter or tab is pressed
219
+ if (['Enter', 'Tab'].includes(event.key)) {
220
+ event.preventDefault();
221
+ addValues(inputValue);
222
+ }
223
+ };
224
+
225
+ /**
226
+ * Handles the input change of the multiselect component
227
+ * @author Yuen Ler Chow
228
+ * @param input input value
229
+ */
230
+ const handleInputChange = (input: string) => {
231
+ // Create copy of input value so we can modify it
232
+ let newValue = input;
233
+
234
+ // Don't allow user to type in non numbers
235
+ if (type === DBEntryFieldType.NumberArray) {
236
+ newValue = input.replace(/[^0-9,]/g, '');
237
+ }
238
+
239
+ if (input.includes(',')) {
240
+ // if the input has a comma, add the values separated by commas
241
+ addValues(newValue);
242
+ } else {
243
+ // simply update the input value to the new input value
244
+ dispatch({
245
+ type: ActionType.SetInputValue,
246
+ value: newValue,
247
+ });
248
+ }
249
+ };
250
+
251
+ /**
252
+ * Handles the value change of the multiselect component
253
+ * @author Yuen Ler Chow
254
+ * @param newValue new values
255
+ */
256
+ const handleValueChange = (newValues: MultiValue<Option>) => {
257
+ // Skip if no new values
258
+ if (!newValues) {
259
+ return;
260
+ }
261
+
262
+ // Update values based on type
263
+ if (type === DBEntryFieldType.NumberArray) {
264
+ const numberValues: number[] = newValues.map((val) => {
265
+ return Number.parseFloat(val.value);
266
+ });
267
+ onChange(numberValues);
268
+ } else {
269
+ const stringValues: string[] = newValues.map((val) => {
270
+ return val.value;
271
+ });
272
+ onChange(stringValues);
273
+ }
274
+ };
275
+
276
+ /*----------------------------------------*/
277
+ /* --------------- Main UI -------------- */
278
+ /*----------------------------------------*/
279
+
280
+ return (
281
+ <CreatableSelect
282
+ isDisabled={!!disabled}
283
+ components={{ DropdownIndicator: null }}
284
+ inputValue={inputValue}
285
+ isClearable
286
+ isMulti
287
+ menuIsOpen={false}
288
+ onChange={handleValueChange}
289
+ onInputChange={handleInputChange}
290
+ onKeyDown={handleKeyDown}
291
+ placeholder="Type/paste value and press enter..."
292
+ value={values.map((val) => {
293
+ return createOption(String(val));
294
+ })}
295
+ />
296
+ );
297
+ };
298
+
299
+ /*------------------------------------------------------------------------*/
300
+ /* ------------------------------- Wrap Up ------------------------------ */
301
+ /*------------------------------------------------------------------------*/
302
+
303
+ export default CreatableMultiselect;