@onehat/ui 0.3.30 → 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 +60 -0
  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 +34 -28
  30. package/src/Components/Hoc/withPresetButtons.js +26 -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 +58 -14
  43. package/src/Components/index.js +4 -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
@@ -8,6 +8,7 @@ import ArrayRadioGroup from './Form/Field/RadioGroup/ArrayRadioGroup.js';
8
8
  // import BackButton from '../Components/Buttons/BackButton.js';
9
9
  import Blank from './Blank.js';
10
10
  import BooleanCombo from './Form/Field/Combo/BooleanCombo.js';
11
+ import Button from '../Components/Buttons/Button.js';
11
12
  // import CartButtonWithBadge from '../Components/Buttons/CartButtonWithBadge.js';
12
13
  // import CKEditor from './Form/Field/CKEditor/CKEditor.js'; // web only
13
14
  import Checkbox from './Form/Field/Checkbox/Checkbox.js';
@@ -37,6 +38,7 @@ import Panel from './Panel/Panel.js';
37
38
  // import Picker from '../Components/Panel/Picker.js';
38
39
  import PlusMinusButton from './Buttons/PlusMinusButton.js';
39
40
  import RadioGroup from './Form/Field/RadioGroup/RadioGroup.js';
41
+ import SquareButton from './Buttons/SquareButton.js';
40
42
  import TabPanel from './Panel/TabPanel.js';
41
43
  import Tag from './Form/Field/Combo/Tag.js';
42
44
  import TagViewer from './Viewer/TagViewer.js';
@@ -58,6 +60,7 @@ const components = {
58
60
  // BackButton,
59
61
  Blank,
60
62
  BooleanCombo,
63
+ Button,
61
64
  // CartButtonWithBadge,
62
65
  Checkbox,
63
66
  CheckboxGroup,
@@ -88,6 +91,7 @@ const components = {
88
91
  // Picker,
89
92
  PlusMinusButton,
90
93
  RadioGroup,
94
+ SquareButton,
91
95
  TabPanel,
92
96
  Tag,
93
97
  TagViewer,
@@ -1,7 +1,7 @@
1
1
  import IconButton from '../Components/Buttons/IconButton.js';
2
2
  import UiGlobals from '../UiGlobals.js';
3
3
 
4
- export default function getIconButtonFromConfig(config, ix) {
4
+ export default function getIconButtonFromConfig(config, ix, parent) {
5
5
  const
6
6
  {
7
7
  key,
@@ -27,6 +27,8 @@ export default function getIconButtonFromConfig(config, ix) {
27
27
  };
28
28
  return <IconButton
29
29
  key={key || ix}
30
+ parent={parent}
31
+ reference={key || ix}
30
32
  onPress={handler}
31
33
  icon={icon}
32
34
  _icon={_icon}
@@ -1,14 +0,0 @@
1
- import {
2
- Box,
3
- } from 'native-base';
4
- import _ from 'lodash';
5
-
6
- export default function Blank(props) {
7
- const {
8
- children,
9
- ...propsToPass
10
- } = props;
11
- return <Box {...propsToPass}>
12
- {children}
13
- </Box>;
14
- }
@@ -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
- }