@onehat/ui 0.3.31 → 0.3.32

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 (48) hide show
  1. package/package.json +1 -1
  2. package/src/Components/Buttons/Button.js +20 -0
  3. package/src/Components/Buttons/IconButton.js +68 -51
  4. package/src/Components/Buttons/SquareButton.js +6 -4
  5. package/src/Components/Container/Container.js +4 -1
  6. package/src/Components/Container/ScreenContainer.js +4 -1
  7. package/src/Components/Editor/Editor.js +15 -1
  8. package/src/Components/Form/Field/CKEditor/CKEditor.js +2 -1
  9. package/src/Components/Form/Field/Checkbox/Checkbox.js +2 -1
  10. package/src/Components/Form/Field/Color.js +2 -1
  11. package/src/Components/Form/Field/Combo/Combo.js +7 -4
  12. package/src/Components/Form/Field/Date.js +2 -1
  13. package/src/Components/Form/Field/DisplayField.js +2 -1
  14. package/src/Components/Form/Field/File.js +2 -1
  15. package/src/Components/Form/Field/Input.js +2 -1
  16. package/src/Components/Form/Field/Number.js +2 -1
  17. package/src/Components/Form/Field/RadioGroup/RadioGroup.js +2 -1
  18. package/src/Components/Form/Field/Text.js +2 -1
  19. package/src/Components/Form/Field/TextArea.js +3 -2
  20. package/src/Components/Form/Field/Toggle.js +2 -1
  21. package/src/Components/Form/Form.js +91 -44
  22. package/src/Components/Grid/Grid.js +67 -53
  23. package/src/Components/Grid/GridHeaderRow.js +5 -2
  24. package/src/Components/Grid/GridRow.js +8 -2
  25. package/src/Components/Hoc/withAlert.js +1 -3
  26. package/src/Components/Hoc/withComponent.js +59 -0
  27. package/src/Components/Hoc/withEditor.js +16 -4
  28. package/src/Components/Hoc/withInlineEditor.js +4 -0
  29. package/src/Components/Hoc/withPdfButton.js +12 -13
  30. package/src/Components/Hoc/withPresetButtons.js +14 -1
  31. package/src/Components/Hoc/withSideEditor.js +7 -1
  32. package/src/Components/Hoc/withWindowedEditor.js +7 -1
  33. package/src/Components/Icons/HighPriority.js +20 -0
  34. package/src/Components/Icons/LowPriority.js +20 -0
  35. package/src/Components/Icons/MedPriority.js +20 -0
  36. package/src/Components/Icons/Pdf.js +14 -0
  37. package/src/Components/Screens/Manager.js +5 -2
  38. package/src/Components/Tab/TabBar.js +5 -2
  39. package/src/Components/Toolbar/Pagination.js +2 -1
  40. package/src/Components/Tree/Tree.js +47 -40
  41. package/src/Components/Viewer/TagViewer.js +3 -1
  42. package/src/Components/Viewer/Viewer.js +57 -14
  43. package/src/Components/index.js +2 -0
  44. package/src/Functions/getIconButtonFromConfig.js +3 -1
  45. package/src/Components/Form/Field/Field.js +0 -14
  46. package/src/Components/Grid/ReactGrid.js +0 -468
  47. package/src/Components/Grid/SenchaGrid.js +0 -421
  48. package/src/Components/Grid/reactgrid.css +0 -6
@@ -1,468 +0,0 @@
1
- import { useState, useEffect, } from 'react';
2
- import {
3
- Column as Col,
4
- Text,
5
- } from 'native-base';
6
- import {
7
- ReactGrid,
8
- } from '@silevis/reactgrid';
9
- // import {
10
- // // Undocumented API
11
- // getCalculatedScrollLeftValueToLeft,
12
- // getCalculatedScrollLeftValueToRight,
13
- // getDerivedStateFromProps,
14
- // getLocationFromClient,
15
- // getReactGridOffsets,
16
- // getScrollLeft,
17
- // getSizeOfElement,
18
- // getVisibleColumns,
19
- // getVisibleScrollAreaWidth,
20
- // getVisibleSizeOfReactGrid,
21
- // recalcVisibleRange,
22
- // setStyles,
23
- // VS_PAGE_WIDTH,
24
- // stateDeriver,
25
- // updateStateProps,
26
- // } from '@silevis/reactgrid';
27
- import '@silevis/reactgrid/Styles.css'; // https://www.npmjs.com/package/@silevis/reactgrid
28
- import './reactgrid.css';
29
- // import * as Silevis from '@silevis/reactgrid';
30
- // debugger;
31
- // import { useReactGridState } from '@silevis/reactgrid/src/lib/Components/StateProvider';
32
- import oneHatData from '@onehat/data';
33
- import testProps from '../../Functions/testProps';
34
- import inArray from '../../Functions/inArray';
35
- import useForceUpdate from '../../Hooks/useForceUpdate';
36
- import Loading from '../Messages/Loading';
37
- import Toolbar from '../Toolbar/Toolbar';
38
- import PaginationToolbar from '../Toolbar/PaginationToolbar';
39
- import NoRecordsFound from './NoRecordsFound';
40
- import AngleRight from '../Icons/AngleRight';
41
- import _ from 'lodash';
42
-
43
- // This grid makes @silevis/reactgrid a UI for @onehat/data
44
- // If you want a simple grid for static data, just use <ReactGrid /> directly.
45
-
46
- // helper fn from https://reactgrid.com/docs/4.0/2-implementing-core-features/3-column-and-row-reordering/
47
- const reorderArray = (arr, idxs, to) => {
48
- const
49
- movedElements = arr.filter((_, idx) => idxs.includes(idx)),
50
- targetIdx = Math.min(...idxs) < to ? to += 1 : to -= idxs.filter(idx => idx < to).length,
51
- leftSide = arr.filter((_, idx) => idx < targetIdx && !idxs.includes(idx)),
52
- rightSide = arr.filter((_, idx) => idx >= targetIdx && !idxs.includes(idx));
53
- return [...leftSide, ...movedElements, ...rightSide];
54
- }
55
-
56
- export default function Grid(props) {
57
- const
58
- {
59
- // #### General grid configuration ####
60
- model, // @onehat/data model name
61
- topToolbar,
62
- bottomToolbar = 'pagination',
63
- columnsConfig = [], // json configurations for each column in format:
64
- // [{
65
- // text, // header
66
- // field, // field name from @onehat/data model
67
- // type, // specify which column type to use (custom or built-in)
68
- // editable = false,
69
- // editor,
70
- // format,
71
- // renderer, // React component will render the output
72
- // resizable = true,
73
- // sortable = true,
74
- // width = 150, // default of ReactGrid
75
- // }]
76
- showHeaders = true,
77
- showRowExpander = false,
78
- enableEditors = false,
79
- cellEditing = false,
80
- rowEditing = false,
81
- contextMenuOptions = [], // json configurations for each menu option in format:
82
- // [{
83
- // id;
84
- // label;
85
- // handler: (selectedRowIds, selectedColIds, selectionMode, selectedRanges) => {},
86
- // }]
87
- // columnProps = {},
88
- // getRowProps = () => {
89
- // return {
90
- // bg: '#fff',
91
- // p: 2,
92
- // };
93
- // },
94
- gridProps = {},
95
- pullToRefresh = true,
96
- hideNavColumn = true,
97
- disableReloadOnChangeFilters = false,
98
- noneFoundText,
99
-
100
- // #### ReactGrid overrides ####
101
- // properties
102
- customCellTemplates,
103
- focusLocation,
104
- initialFocusLocation,
105
- highlights,
106
- stickyTopRows = 0,
107
- stickyBottomRows = 0,
108
- stickyLeftColumns = 0,
109
- stickyRightColumns = 0,
110
- enableFillHandle,
111
- enableRangeSelection = true,
112
- enableRowSelection = false,
113
- enableColumnSelection = false,
114
- labels,
115
- enableFullWidthHeader = false,
116
- enableGroupIdRender = false,
117
- horizontalStickyBreakpoint,
118
- verticalStickyBreakpoint,
119
- disableVirtualScrolling = false,
120
-
121
- // ReactGrid events
122
- onCellsChanged,
123
- onFocusLocationChanged,
124
- onFocusLocationChanging,
125
- // onColumnResized,
126
- // onRowsReordered,
127
- // onColumnsReordered,
128
- onContextMenu,
129
- // canReorderColumns,
130
- // canReorderRows,
131
- } = props,
132
- Repository = model && oneHatData.getRepository(model),
133
- forceUpdate = useForceUpdate(),
134
- [isReady, setIsReady] = useState(false),
135
- [isLoading, setIsLoading] = useState(false),
136
- onRefresh = () => Repository.load(),
137
- onColumnsReordered = (targetColumnId, columnIds) => {
138
- const
139
- to = columns.findIndex((column) => column.columnId === targetColumnId),
140
- columnIdxs = columnIds.map((columnId) => columns.findIndex((c) => c.columnId === columnId)),
141
- reorderedColumns = reorderArray(columns, columnIdxs, to);
142
- setColumns(reorderedColumns);
143
- },
144
- onRowsReordered = () => {},
145
- onColumnResized = (targetColumnId, newWidth, arr) => {
146
- const column = _.find(columns, (column) => column.columnId === targetColumnId);
147
- column.width = newWidth;
148
- forceUpdate();
149
- },
150
- canReorderColumns = (targetColumnId, columnIds, beforeAfter) => {
151
- // Verify that *all* columns in selection can be reordered
152
- let canReorder = true;
153
- _.each(columns, (column) => {
154
- if (inArray(column.columnId, columnIds) && !column.reorderable) {
155
- canReorder = false;
156
- return false;
157
- }
158
- });
159
-
160
- // Verify that targetColumn can be reordered
161
- const targetColumn = _.find(columns, (column) => column.columnId === targetColumnId);
162
- if (!targetColumn.reorderable) {
163
- canReorder = false;
164
- }
165
-
166
- return canReorder;
167
- },
168
- canReorderRows = (targetRowId, rowIds) => {
169
- return targetRowId !== 'header'; // Prevent reordering rows to be above header
170
- },
171
- getCellType = (field) => {
172
- const
173
- schema = Repository.schema,
174
- propertyDefinition = schema.getPropertyDefinition(field);
175
- switch(propertyDefinition.type) {
176
- case 'base64':
177
- propsToPass[type] = 'text';
178
- break;
179
- case 'boolean':
180
- break;
181
- case 'currency':
182
- break;
183
- case 'date':
184
- propsToPass[type] = 'date';
185
- break;
186
- case 'dateTime':
187
- break;
188
- case 'file':
189
- propsToPass[type] = 'text';
190
- break;
191
- case 'float':
192
- break;
193
- case 'integer':
194
- break;
195
- case 'json':
196
- propsToPass[type] = 'text';
197
- break;
198
- case 'oercent':
199
- break;
200
- case 'oercentInt':
201
- break;
202
- case 'string':
203
- propsToPass[type] = 'text';
204
- break;
205
- case 'time':
206
- break;
207
- case 'uuid':
208
- propsToPass[type] = 'text';
209
- break;
210
- default:
211
- propsToPass[type] = 'text';
212
- }
213
- },
214
- getColumns = () => {
215
- const columns = _.map(columnsConfig, (columnConfig) => {
216
- const {
217
- field,
218
- resizable = true,
219
- sortable = true,
220
- width = 150, // default of ReactGrid
221
- } = columnConfig;
222
- return {
223
- columnId: field,
224
- reorderable: sortable,
225
- resizable,
226
- width,
227
- };
228
- });
229
- if (!hideNavColumn) {
230
- columns.push({
231
- columnId: 'nav',
232
- reorderable: false,
233
- resizable: false,
234
- width: 10,
235
- });
236
- }
237
-
238
- // Try to simulate 'flex' width for a single column
239
- // const flexColumnConfig = _.find(columnsConfig, (columnConfig) => !!columnConfig.flex);
240
- // if (flexColumnConfig) {
241
- // const flexColumn = _.find(columns, (column) => column.columnId === flexColumnConfig.field);
242
- // const r = ref;
243
- // debugger;
244
- // }
245
- return columns;
246
- },
247
- getRows = () => {
248
- const
249
- entities = Repository.getEntitiesOnPage(),
250
- rows = [];
251
-
252
- if (showHeaders) {
253
- // Build header row
254
- const headerCells = [];
255
- _.each(columns, (column) => {
256
- // These columns may have been reordered, so match them with columnConfig setting, but user ordering of columns
257
- const columnConfig = _.find(columnsConfig, (columnConfig) => {
258
- return columnConfig.field === column.columnId;
259
- });
260
- if (!columnConfig) { // e.g rightColumn (nav) cell
261
- return;
262
- }
263
- headerCells.push({
264
- type: 'header',
265
- text: columnConfig.text,
266
- });
267
- });
268
- if (!hideNavColumn) {
269
- headerCells.push({
270
- type: 'header',
271
- text: '',
272
- });
273
- }
274
- rows.push({ rowId: 'header', cells: headerCells, });
275
- }
276
-
277
- _.each(entities, (entity, ix) => {
278
- // Build the cells for this row, based on previously defined columns
279
- const cells = [];
280
- _.each(columns, (column) => {
281
- // These columns may have been reordered, so match them with columnConfig setting, but user ordering of columns
282
- const columnConfig = _.find(columnsConfig, (columnConfig) => {
283
- return columnConfig.field === column.columnId;
284
- });
285
- if (!columnConfig) { // e.g rightColumn (nav) cell
286
- return;
287
- }
288
- const {
289
- type = 'text', // specify which Column type to use for this cell (custom or built-in)
290
- field,
291
- placeholder,
292
- validator,
293
- renderer,
294
- checkedText,
295
- uncheckedText,
296
- format,
297
- } = columnConfig,
298
- property = entity.properties[field],
299
- propsToPass = {
300
- type,
301
- },
302
- propsToCheck = {
303
- placeholder,
304
- validator,
305
- renderer,
306
- checkedText,
307
- uncheckedText,
308
- // date,
309
- format,
310
- // text,
311
- };
312
- _.each(propsToCheck, (prop, name) => {
313
- if (!_.isEmpty(prop)) {
314
- propsToPass[name] = prop;
315
- }
316
- });
317
-
318
- // Determine value for this cell
319
- switch(type) {
320
- case 'text':
321
- propsToPass.text = property.displayValue;
322
- break;
323
- default:
324
- }
325
-
326
- cells.push(propsToPass);
327
- }); // end each(columns)
328
-
329
- if (!hideNavColumn) {
330
- cells.push({
331
- type: 'text',
332
- text: '',
333
- renderer: () => <AngleRight
334
- color="#aaa"
335
- variant="ghost"
336
- alignSelf="center"
337
- ml={1}
338
- />,
339
- });
340
- }
341
-
342
- rows.push({
343
- rowId: entity.id,
344
- cells,
345
- });
346
- });
347
- return rows;
348
- },
349
- [columns, setColumns] = useState(getColumns());
350
-
351
- useEffect(() => {
352
- const
353
- setTrue = () => setIsLoading(true),
354
- setFalse = () => setIsLoading(false),
355
- onChangeFilters = () => {
356
- if (!Repository.isAutoLoad && Repository.isLoaded && !disableReloadOnChangeFilters) {
357
- Repository.reload();
358
- }
359
- };
360
-
361
- Repository.on('beforeLoad', setTrue);
362
- Repository.on('load', setFalse);
363
- Repository.ons(['changePage', 'changePageSize', 'changeData', 'change'], forceUpdate);
364
- Repository.on('changeFilters', onChangeFilters);
365
-
366
- setIsReady(true);
367
-
368
- return () => {
369
- Repository.off('beforeLoad', setTrue);
370
- Repository.off('load', setFalse);
371
- Repository.offs(['changePage', 'changePageSize', 'changeData', 'change'], forceUpdate);
372
- Repository.off('changeFilters', onChangeFilters);
373
- };
374
- }, [Repository, disableReloadOnChangeFilters, forceUpdate]);
375
-
376
- if (!Repository) {
377
- throw Error('No Repository!');
378
- }
379
-
380
- if (!isReady) {
381
- return null;
382
- }
383
-
384
- const
385
- propsToPass = {
386
- enableRangeSelection,
387
- enableRowSelection,
388
- enableColumnSelection,
389
- enableFullWidthHeader,
390
- enableGroupIdRender,
391
- stickyTopRows,
392
- stickyBottomRows,
393
- stickyLeftColumns,
394
- stickyRightColumns,
395
- disableVirtualScrolling,
396
- },
397
- propsToCheck = {
398
- customCellTemplates,
399
- focusLocation,
400
- initialFocusLocation,
401
- highlights,
402
- enableFillHandle,
403
- labels,
404
- horizontalStickyBreakpoint,
405
- verticalStickyBreakpoint,
406
-
407
- onCellsChanged,
408
- onFocusLocationChanged,
409
- onFocusLocationChanging,
410
- // onColumnResized,
411
- // onRowsReordered,
412
- // onColumnsReordered,
413
- onContextMenu,
414
- // canReorderColumns,
415
- // canReorderRows,
416
- };
417
- _.each(propsToCheck, (prop, name) => {
418
- if (!_.isEmpty(prop)) {
419
- propsToPass[name] = prop;
420
- }
421
- });
422
-
423
- propsToPass.onColumnsReordered = onColumnsReordered;
424
- propsToPass.onColumnResized = onColumnResized;
425
- propsToPass.canReorderColumns = canReorderColumns;
426
- propsToPass.canReorderRows = canReorderRows;
427
- propsToPass.columns = columns;
428
- propsToPass.rows = getRows();
429
-
430
-
431
- propsToPass.onContextMenu = (selectedRowIds, selectedColIds, selectionMode, menuOptions) => {
432
- debugger;
433
- };
434
- propsToPass.onCellsChanged = (a,b,c,d,e) => {
435
- debugger;
436
- };
437
- propsToPass.onFocusLocationChanged = (pos) => {
438
- debugger;
439
- };
440
- propsToPass.onFocusLocationChanging = (pos) => {
441
- return true;
442
- };
443
- // special props
444
- // data,
445
- // treeData,
446
-
447
- return <Col
448
- {...testProps('GridPanelContainer')}
449
- flex={1}
450
- w="100%"
451
- >
452
- {topToolbar && <Toolbar>{topToolbar}</Toolbar>}
453
-
454
- {isLoading && <Col flex={1}><Loading /></Col>}
455
-
456
- {!isLoading && (!Repository.getEntitiesOnPage().length ? <NoRecordsFound text={noneFoundText} onRefresh={onRefresh} /> :
457
-
458
- <ReactGrid
459
- {...propsToPass}
460
- {...gridProps}
461
- />)}
462
-
463
- {bottomToolbar && (bottomToolbar === 'pagination' ?
464
- <PaginationToolbar Repository={Repository} />:
465
- <Toolbar>{bottomToolbar}</Toolbar>)}
466
- </Col>;
467
-
468
- }