dce-reactkit 3.4.0-beta.8 → 3.4.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.
Files changed (128) hide show
  1. package/.eslintrc.js +0 -2
  2. package/dist/cjs/index.js +190 -36371
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/types/helpers/abbreviate.test.d.ts +5 -0
  5. package/dist/cjs/types/helpers/avg.test.d.ts +5 -0
  6. package/dist/cjs/types/helpers/canReviewLogs.d.ts +5 -0
  7. package/dist/cjs/types/helpers/canReviewLogs.test.d.ts +5 -0
  8. package/dist/cjs/types/helpers/ceilToNumDecimals.test.d.ts +5 -0
  9. package/dist/cjs/types/helpers/compareArraysByProp.test.d.ts +5 -0
  10. package/dist/cjs/types/helpers/extractProp.test.d.ts +5 -0
  11. package/dist/cjs/types/helpers/floorToNumDecimals.test.d.ts +5 -0
  12. package/dist/cjs/types/helpers/forceNumIntoBounds.test.d.ts +5 -0
  13. package/dist/cjs/types/helpers/genCSV.test.d.ts +5 -0
  14. package/dist/cjs/types/helpers/genCommaList.d.ts +12 -0
  15. package/dist/cjs/types/helpers/genCommaList.test.d.ts +1 -0
  16. package/dist/cjs/types/helpers/getHumanReadableDate.test.d.ts +5 -0
  17. package/dist/cjs/types/helpers/getLocalTimeInfo.test.d.ts +6 -0
  18. package/dist/cjs/types/helpers/getMonthName.test.d.ts +5 -0
  19. package/dist/cjs/types/helpers/getOrdinal.test.d.ts +5 -0
  20. package/dist/cjs/types/helpers/getPartOfDay.test.d.ts +5 -0
  21. package/dist/cjs/types/helpers/getTimeInfoInET.test.d.ts +5 -0
  22. package/dist/cjs/types/helpers/validators/shared/constants/ERROR_MESSAGES.d.ts +10 -0
  23. package/dist/cjs/types/helpers/validators/shared/helpers/validateRegex.d.ts +19 -0
  24. package/dist/cjs/types/helpers/validators/shared/types/ValidationResult.d.ts +12 -0
  25. package/dist/cjs/types/helpers/validators/validateEmail.d.ts +11 -0
  26. package/dist/cjs/types/helpers/validators/validateEmail.test.d.ts +1 -0
  27. package/dist/cjs/types/helpers/validators/validatePhoneNumber.d.ts +11 -0
  28. package/dist/cjs/types/helpers/validators/validatePhoneNumber.test.d.ts +1 -0
  29. package/dist/cjs/types/helpers/validators/validateString.d.ts +22 -0
  30. package/dist/cjs/types/helpers/validators/validateString.test.d.ts +1 -0
  31. package/dist/cjs/types/index.d.ts +1 -6
  32. package/dist/esm/index.js +419 -36579
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/types/helpers/abbreviate.test.d.ts +5 -0
  35. package/dist/esm/types/helpers/avg.test.d.ts +5 -0
  36. package/dist/esm/types/helpers/canReviewLogs.d.ts +5 -0
  37. package/dist/esm/types/helpers/canReviewLogs.test.d.ts +5 -0
  38. package/dist/esm/types/helpers/ceilToNumDecimals.test.d.ts +5 -0
  39. package/dist/esm/types/helpers/compareArraysByProp.test.d.ts +5 -0
  40. package/dist/esm/types/helpers/extractProp.test.d.ts +5 -0
  41. package/dist/esm/types/helpers/floorToNumDecimals.test.d.ts +5 -0
  42. package/dist/esm/types/helpers/forceNumIntoBounds.test.d.ts +5 -0
  43. package/dist/esm/types/helpers/genCSV.test.d.ts +5 -0
  44. package/dist/esm/types/helpers/genCommaList.d.ts +12 -0
  45. package/dist/esm/types/helpers/genCommaList.test.d.ts +1 -0
  46. package/dist/esm/types/helpers/getHumanReadableDate.test.d.ts +5 -0
  47. package/dist/esm/types/helpers/getLocalTimeInfo.test.d.ts +6 -0
  48. package/dist/esm/types/helpers/getMonthName.test.d.ts +5 -0
  49. package/dist/esm/types/helpers/getOrdinal.test.d.ts +5 -0
  50. package/dist/esm/types/helpers/getPartOfDay.test.d.ts +5 -0
  51. package/dist/esm/types/helpers/getTimeInfoInET.test.d.ts +5 -0
  52. package/dist/esm/types/helpers/validators/shared/constants/ERROR_MESSAGES.d.ts +10 -0
  53. package/dist/esm/types/helpers/validators/shared/helpers/validateRegex.d.ts +19 -0
  54. package/dist/esm/types/helpers/validators/shared/types/ValidationResult.d.ts +12 -0
  55. package/dist/esm/types/helpers/validators/validateEmail.d.ts +11 -0
  56. package/dist/esm/types/helpers/validators/validateEmail.test.d.ts +1 -0
  57. package/dist/esm/types/helpers/validators/validatePhoneNumber.d.ts +11 -0
  58. package/dist/esm/types/helpers/validators/validatePhoneNumber.test.d.ts +1 -0
  59. package/dist/esm/types/helpers/validators/validateString.d.ts +22 -0
  60. package/dist/esm/types/helpers/validators/validateString.test.d.ts +1 -0
  61. package/dist/esm/types/index.d.ts +1 -6
  62. package/dist/index.d.ts +35 -166
  63. package/package.json +13 -17
  64. package/src/client/initClient.tsx +20 -12
  65. package/src/components/AppWrapper.tsx +1 -1
  66. package/src/components/ItemPicker/index.test.tsx +10 -10
  67. package/src/helpers/abbreviate.test.ts +26 -0
  68. package/src/helpers/avg.test.ts +24 -0
  69. package/src/helpers/canReviewLogs.test.ts +67 -0
  70. package/src/helpers/canReviewLogs.ts +20 -0
  71. package/src/helpers/ceilToNumDecimals.test.ts +39 -0
  72. package/src/helpers/compareArraysByProp.test.ts +102 -0
  73. package/src/helpers/extractProp.test.ts +34 -0
  74. package/src/helpers/floorToNumDecimals.test.ts +39 -0
  75. package/src/helpers/forceNumIntoBounds.test.ts +34 -0
  76. package/src/helpers/genCSV.test.ts +61 -0
  77. package/src/helpers/genCSV.ts +5 -2
  78. package/src/helpers/genCommaList.test.ts +57 -0
  79. package/src/helpers/genCommaList.ts +21 -0
  80. package/src/helpers/getHumanReadableDate.test.ts +29 -0
  81. package/src/helpers/getLocalTimeInfo.test.ts +48 -0
  82. package/src/helpers/getMonthName.test.ts +79 -0
  83. package/src/helpers/getOrdinal.test.ts +84 -0
  84. package/src/helpers/{getOrdinal.tsx → getOrdinal.ts} +1 -0
  85. package/src/helpers/getPartOfDay.test.ts +56 -0
  86. package/src/helpers/getTimeInfoInET.test.ts +72 -0
  87. package/src/helpers/validators/shared/constants/ERROR_MESSAGES.ts +18 -0
  88. package/src/helpers/validators/shared/helpers/validateRegex.ts +47 -0
  89. package/src/helpers/validators/shared/types/ValidationResult.ts +20 -0
  90. package/src/helpers/validators/validateEmail.test.ts +110 -0
  91. package/src/helpers/validators/validateEmail.ts +47 -0
  92. package/src/helpers/validators/validatePhoneNumber.test.ts +94 -0
  93. package/src/helpers/validators/validatePhoneNumber.ts +49 -0
  94. package/src/helpers/validators/validateString.test.ts +175 -0
  95. package/src/helpers/validators/validateString.ts +171 -0
  96. package/src/index.ts +10 -12
  97. package/tsconfig.json +6 -2
  98. package/dist/cjs/types/components/DBEntryManagerPanel/AddOrEditDBEntry/CreatableMultiselect.d.ts +0 -10
  99. package/dist/cjs/types/components/DBEntryManagerPanel/AddOrEditDBEntry/index.d.ts +0 -34
  100. package/dist/cjs/types/components/DBEntryManagerPanel/helpers/generateEndpointPath.d.ts +0 -9
  101. package/dist/cjs/types/components/DBEntryManagerPanel/index.d.ts +0 -25
  102. package/dist/cjs/types/components/DBEntryManagerPanel/types/DBEntry.d.ts +0 -8
  103. package/dist/cjs/types/components/DBEntryManagerPanel/types/DBEntryField.d.ts +0 -49
  104. package/dist/cjs/types/components/DBEntryManagerPanel/types/DBEntryFieldType.d.ts +0 -12
  105. package/dist/cjs/types/helpers/addDBEditorEndpoints.d.ts +0 -40
  106. package/dist/esm/types/components/DBEntryManagerPanel/AddOrEditDBEntry/CreatableMultiselect.d.ts +0 -10
  107. package/dist/esm/types/components/DBEntryManagerPanel/AddOrEditDBEntry/index.d.ts +0 -34
  108. package/dist/esm/types/components/DBEntryManagerPanel/helpers/generateEndpointPath.d.ts +0 -9
  109. package/dist/esm/types/components/DBEntryManagerPanel/index.d.ts +0 -25
  110. package/dist/esm/types/components/DBEntryManagerPanel/types/DBEntry.d.ts +0 -8
  111. package/dist/esm/types/components/DBEntryManagerPanel/types/DBEntryField.d.ts +0 -49
  112. package/dist/esm/types/components/DBEntryManagerPanel/types/DBEntryFieldType.d.ts +0 -12
  113. package/dist/esm/types/helpers/addDBEditorEndpoints.d.ts +0 -40
  114. package/src/components/DBEntryManagerPanel/AddOrEditDBEntry/CreatableMultiselect.tsx +0 -286
  115. package/src/components/DBEntryManagerPanel/AddOrEditDBEntry/index.tsx +0 -722
  116. package/src/components/DBEntryManagerPanel/helpers/generateEndpointPath.ts +0 -15
  117. package/src/components/DBEntryManagerPanel/index.tsx +0 -511
  118. package/src/components/DBEntryManagerPanel/types/DBEntry.ts +0 -7
  119. package/src/components/DBEntryManagerPanel/types/DBEntryField.ts +0 -94
  120. package/src/components/DBEntryManagerPanel/types/DBEntryFieldType.ts +0 -18
  121. package/src/helpers/addDBEditorEndpoints.ts +0 -124
  122. /package/src/helpers/{abbreviate.tsx → abbreviate.ts} +0 -0
  123. /package/src/helpers/{avg.tsx → avg.ts} +0 -0
  124. /package/src/helpers/{ceilToNumDecimals.tsx → ceilToNumDecimals.ts} +0 -0
  125. /package/src/helpers/{floorToNumDecimals.tsx → floorToNumDecimals.ts} +0 -0
  126. /package/src/helpers/{forceNumIntoBounds.tsx → forceNumIntoBounds.ts} +0 -0
  127. /package/src/helpers/{getLocalTimeInfo.tsx → getLocalTimeInfo.ts} +0 -0
  128. /package/src/helpers/{getTimeInfoInET.tsx → getTimeInfoInET.ts} +0 -0
@@ -1,25 +0,0 @@
1
- /**
2
- * DB Entry Manager Panel
3
- * @author Yuen Ler Chow
4
- */
5
- import React from 'react';
6
- import DBEntry from './types/DBEntry';
7
- import DBEntryField from './types/DBEntryField';
8
- declare type Props = {
9
- entryFields: DBEntryField[];
10
- idPropName: string;
11
- titlePropName: string;
12
- descriptionPropName: string;
13
- itemListTitle: string;
14
- itemName: string;
15
- validateEntry?: (dbEntry: DBEntry) => Promise<void>;
16
- modifyEntry?: (dbEntry: DBEntry) => Promise<DBEntry>;
17
- disableEdit?: boolean;
18
- collectionName: string;
19
- adminsOnly?: boolean;
20
- filterQuery?: {
21
- [k: string]: any;
22
- };
23
- };
24
- declare const DBEntryManagerPanel: React.FC<Props>;
25
- export default DBEntryManagerPanel;
@@ -1,8 +0,0 @@
1
- /**
2
- * Generic type for an object
3
- * @author Yuen Ler Chow
4
- */
5
- declare type DBEntry = {
6
- [k: string]: any;
7
- };
8
- export default DBEntry;
@@ -1,49 +0,0 @@
1
- import DBEntryFieldType from './DBEntryFieldType';
2
- /**
3
- * A database entry input field
4
- * @author Yuen Ler Chow
5
- */
6
- declare type DBEntryField = ({
7
- label: string;
8
- objectKey: string;
9
- placeholder: string;
10
- lockAfterCreation?: boolean;
11
- required?: boolean;
12
- } & ({
13
- type: DBEntryFieldType.String;
14
- minNumChars?: number;
15
- maxNumChars?: number;
16
- defaultValue?: string;
17
- choices?: {
18
- title: string;
19
- value: string;
20
- }[];
21
- } | {
22
- type: DBEntryFieldType.Number;
23
- minNumber?: number;
24
- maxNumber?: number;
25
- defaultValue?: number;
26
- } | {
27
- type: DBEntryFieldType.StringArray;
28
- minNumElements?: number;
29
- maxNumElements?: number;
30
- defaultValue?: string[];
31
- choices?: {
32
- title: string;
33
- value: string;
34
- }[];
35
- } | {
36
- type: DBEntryFieldType.NumberArray;
37
- minNumElements?: number;
38
- maxNumElements?: number;
39
- minNumber?: number;
40
- maxNumber?: number;
41
- defaultValue?: number[];
42
- } | {
43
- type: DBEntryFieldType.Object;
44
- defaultValue?: {
45
- [k: string]: any;
46
- };
47
- subfields: DBEntryField[];
48
- }));
49
- export default DBEntryField;
@@ -1,12 +0,0 @@
1
- /**
2
- * Options for field types
3
- * @author Yuen Ler Chow
4
- */
5
- declare enum DBEntryFieldType {
6
- String = "String",
7
- Number = "Number",
8
- Object = "Object",
9
- StringArray = "StringArray",
10
- NumberArray = "NumberArray"
11
- }
12
- export default DBEntryFieldType;
@@ -1,40 +0,0 @@
1
- import express from 'express';
2
- /**
3
- * Interface for a collection in the database
4
- * @author Yuen Ler Chow
5
- */
6
- interface Collection {
7
- /**
8
- * Find all items in the collection that match the filter query
9
- * @param filterQuery
10
- * @returns list of items that match the filter query
11
- */
12
- find: (filterQuery: any) => Promise<any[]>;
13
- /**
14
- * Insert an item into the collection
15
- * @param item the item to insert
16
- */
17
- insert: (item: any) => Promise<void>;
18
- /**
19
- * Delete an item in the collection
20
- * @param id the id of the item to delete
21
- */
22
- delete: (filterQuery: {
23
- id: string;
24
- }) => Promise<void>;
25
- }
26
- /**
27
- * Add all routes for the DBEditor
28
- * @author Yuen Ler Chow
29
- * @param opts object containing all arguments
30
- * @param opts.app express app to add routes too
31
- * @param opts.collectionName the name of the collection
32
- * @param opts.adminsOnly true if the endpoint is for admins only
33
- */
34
- declare const addDBEditorEndpoints: (opts: {
35
- app: express.Application;
36
- collectionName: string;
37
- adminsOnly: boolean;
38
- collection: Collection;
39
- }) => void;
40
- export default addDBEditorEndpoints;
@@ -1,286 +0,0 @@
1
- // Import React
2
- import React, { KeyboardEventHandler, useReducer } from 'react';
3
-
4
- // Import React Select
5
- import CreatableSelect from 'react-select/creatable';
6
- import { MultiValue } from 'react-select';
7
-
8
- // Import other types
9
- import DBEntryFieldType from '../types/DBEntryFieldType';
10
-
11
- /*------------------------------------------------------------------------*/
12
- /* -------------------------------- Types ------------------------------- */
13
- /*------------------------------------------------------------------------*/
14
-
15
- // Props definition
16
- type Props = {
17
- // Type of the field
18
- type: DBEntryFieldType.StringArray | DBEntryFieldType.NumberArray;
19
- // The values entered by the user
20
- values: string[] | number[];
21
- // Function to call when the values change
22
- onChange: (values: string[] | number[]) => void;
23
- // True if the field is disabled
24
- disabled?: boolean;
25
- };
26
-
27
- // An option for the multiselect component
28
- type Option = {
29
- // What the user sees and types in for the option
30
- label: string;
31
- // Lowercase, no spaces, no special characters of the label
32
- value: string;
33
- };
34
-
35
- /*------------------------------------------------------------------------*/
36
- /* -------------------------------- State ------------------------------- */
37
- /*------------------------------------------------------------------------*/
38
-
39
- /* -------- State Definition -------- */
40
-
41
- type State = {
42
- // what the user has typed in so far(before pressing enter or tab)
43
- inputValue: string,
44
- };
45
-
46
- /* ------------- Actions ------------ */
47
-
48
- // Types of actions
49
- enum ActionType {
50
- // Update the input value
51
- SetInputValue = 'SetInputValue',
52
- }
53
-
54
- // Action definitions
55
- type Action = (
56
- | {
57
- // Action type
58
- type: ActionType.SetInputValue;
59
- // New value
60
- value: string
61
- }
62
- );
63
-
64
- /**
65
- * Reducer that executes actions
66
- * @author Yuen Ler Chow
67
- * @param state current state
68
- * @param action action to execute
69
- */
70
- const reducer = (state: State, action: Action): State => {
71
- switch (action.type) {
72
- case ActionType.SetInputValue: {
73
- return {
74
- ...state,
75
- inputValue: action.value,
76
- };
77
- }
78
- default: {
79
- return state;
80
- }
81
- }
82
- };
83
-
84
- /*------------------------------------------------------------------------*/
85
- /* -------------------------------- State ------------------------------- */
86
- /*------------------------------------------------------------------------*/
87
-
88
- const CreatableMultiselect: React.FC<Props> = (props) => {
89
- // Destructure all props
90
- const {
91
- type,
92
- values,
93
- onChange,
94
- disabled,
95
- } = props;
96
-
97
- /* -------------- State ------------- */
98
-
99
- // Initial state
100
- const initialState: State = {
101
- inputValue: '',
102
- };
103
-
104
- // Initialize state
105
- const [state, dispatch] = useReducer(reducer, initialState);
106
-
107
- // Destructure common state
108
- const { inputValue } = state;
109
-
110
- /*------------------------------------------------------------------------*/
111
- /* ------------------------- Component Functions ------------------------ */
112
- /*------------------------------------------------------------------------*/
113
-
114
- /**
115
- * Creates an option for the multiselect component
116
- * @author Yuen Ler Chow
117
- * @param label label of the option
118
- */
119
- const createOption = (label: string): Option => {
120
- // set the value to the label without special characters and spaces, and lowercase
121
- return {
122
- label,
123
- value: (
124
- label
125
- .toLowerCase()
126
- .replace(/\W/g, '')
127
- .replace(' ', '-')
128
- ),
129
- };
130
- };
131
-
132
- /**
133
- * Adds the values to the multiselect component
134
- * @author Yuen Ler Chow
135
- * @param newValue new value to add
136
- */
137
- const addValues = (newValue: string) => {
138
- if (type === DBEntryFieldType.NumberArray) {
139
- const newValues = (
140
- newValue
141
- // Split into items
142
- .split(',')
143
- // Trim strings
144
- .map((val) => {
145
- return val.trim();
146
- })
147
- // Filter zero length
148
- .filter((trimmedVal) => {
149
- return trimmedVal.length > 0;
150
- })
151
- // Parse to number
152
- .map(Number.parseFloat)
153
- // Filter out existing values
154
- .filter((numberVal) => {
155
- return !values.some((value) => {
156
- return value === numberVal;
157
- });
158
- })
159
- );
160
- onChange([...values, ...newValues] as number[]);
161
- } else {
162
- const newValues = (
163
- newValue
164
- // Split into items
165
- .split(',')
166
- // Trim strings
167
- .map((val) => {
168
- return val.trim();
169
- })
170
- // Filter zero length
171
- .filter((trimmedVal) => {
172
- return (trimmedVal.length > 0);
173
- })
174
- // Filter out existing values
175
- .filter((val) => {
176
- return !values.some((value) => {
177
- return value === val;
178
- });
179
- })
180
- );
181
- onChange([...values, ...newValues] as string[]);
182
- }
183
- // resets text field to empty because the values have been added
184
- dispatch({
185
- type: ActionType.SetInputValue,
186
- value: '',
187
- });
188
- };
189
-
190
- /**
191
- * Adds the values to the multiselect component when enter or tab is pressed
192
- * @author Yuen Ler Chow
193
- * @param event keyboard event
194
- */
195
- const handleKeyDown: KeyboardEventHandler = (event) => {
196
- // Skip if no input value
197
- if (!inputValue) {
198
- return;
199
- }
200
-
201
- // Add values if enter or tab is pressed
202
- if (['Enter', 'Tab'].includes(event.key)) {
203
- event.preventDefault();
204
- addValues(inputValue);
205
- }
206
- };
207
-
208
- /**
209
- * Handles the input change of the multiselect component
210
- * @author Yuen Ler Chow
211
- * @param input input value
212
- */
213
- const handleInputChange = (input: string) => {
214
- // Create copy of input value so we can modify it
215
- let newValue = input;
216
-
217
- // Don't allow user to type in non numbers
218
- if (type === DBEntryFieldType.NumberArray) {
219
- newValue = input.replace(/[^0-9,]/g, '');
220
- }
221
-
222
- if (input.includes(',')) {
223
- // if the input has a comma, add the values separated by commas
224
- addValues(newValue);
225
- } else {
226
- // simply update the input value to the new input value
227
- dispatch({
228
- type: ActionType.SetInputValue,
229
- value: newValue,
230
- });
231
- }
232
- };
233
-
234
- /**
235
- * Handles the value change of the multiselect component
236
- * @author Yuen Ler Chow
237
- * @param newValue new values
238
- */
239
- const handleValueChange = (newValues: MultiValue<Option>) => {
240
- // Skip if no new values
241
- if (!newValues) {
242
- return;
243
- }
244
-
245
- // Update values based on type
246
- if (type === DBEntryFieldType.NumberArray) {
247
- const numberValues: number[] = newValues.map((val) => {
248
- return Number(val.value);
249
- });
250
- onChange(numberValues);
251
- } else {
252
- const stringValues: string[] = newValues.map((val) => {
253
- return val.value;
254
- });
255
- onChange(stringValues);
256
- }
257
- };
258
-
259
- /*----------------------------------------*/
260
- /* --------------- Main UI -------------- */
261
- /*----------------------------------------*/
262
-
263
- return (
264
- <CreatableSelect
265
- isDisabled={!!disabled}
266
- components={{ DropdownIndicator: null }}
267
- inputValue={inputValue}
268
- isClearable
269
- isMulti
270
- menuIsOpen={false}
271
- onChange={handleValueChange}
272
- onInputChange={handleInputChange}
273
- onKeyDown={handleKeyDown}
274
- placeholder="Type/paste value and press enter..."
275
- value={values.map((val) => {
276
- return createOption(String(val));
277
- })}
278
- />
279
- );
280
- };
281
-
282
- /*------------------------------------------------------------------------*/
283
- /* ------------------------------- Wrap Up ------------------------------ */
284
- /*------------------------------------------------------------------------*/
285
-
286
- export default CreatableMultiselect;