@onehat/ui 0.3.332 → 0.3.334

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onehat/ui",
3
- "version": "0.3.332",
3
+ "version": "0.3.334",
4
4
  "description": "Base UI for OneHat apps",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -79,9 +79,11 @@ export default function ColumnSelectorWindow(props) {
79
79
  const
80
80
  [ix, header] = datum,
81
81
  columnConfig = localColumnsConfig.current[ix],
82
- isHidden = columnConfig.isHidden;
82
+ isHidden = columnConfig.isHidden,
83
+ isHidable = columnConfig.isHidable;
83
84
  return <CheckboxButton
84
85
  isChecked={!isHidden}
86
+ isDisabled={!isHidable}
85
87
  onPress={() => {
86
88
  if (isHidden) {
87
89
  onShowColumn(ix);
@@ -14,9 +14,6 @@ import {
14
14
  SELECTION_MODE_SINGLE,
15
15
  SELECTION_MODE_MULTI,
16
16
  } from '../../Constants/Selection.js';
17
- import {
18
- v4 as uuid,
19
- } from 'uuid';
20
17
  import {
21
18
  DROP_POSITION_BEFORE,
22
19
  DROP_POSITION_AFTER,
@@ -35,18 +32,19 @@ import withComponent from '../Hoc/withComponent.js';
35
32
  import withData from '../Hoc/withData.js';
36
33
  import { withDropTarget } from '../Hoc/withDnd.js';
37
34
  import withEvents from '../Hoc/withEvents.js';
38
- import withSideEditor from '../Hoc/withSideEditor.js';
39
35
  import withFilters from '../Hoc/withFilters.js';
36
+ import withInlineEditor from '../Hoc/withInlineEditor.js';
37
+ import withPermissions from '../Hoc/withPermissions.js';
40
38
  import withPresetButtons from '../Hoc/withPresetButtons.js';
41
39
  import withMultiSelection from '../Hoc/withMultiSelection.js';
42
40
  import withSelection from '../Hoc/withSelection.js';
41
+ import withSideEditor from '../Hoc/withSideEditor.js';
43
42
  import withWindowedEditor from '../Hoc/withWindowedEditor.js';
44
- import withInlineEditor from '../Hoc/withInlineEditor.js';
45
43
  import getSaved from '../../Functions/getSaved.js';
46
44
  import setSaved from '../../Functions/setSaved.js';
47
45
  import getIconButtonFromConfig from '../../Functions/getIconButtonFromConfig.js';
48
- import nbToRgb from '../../Functions/nbToRgb.js';
49
46
  import testProps from '../../Functions/testProps.js';
47
+ import nbToRgb from '../../Functions/nbToRgb.js';
50
48
  import Loading from '../Messages/Loading.js';
51
49
  import isSerializable from '../../Functions/isSerializable.js';
52
50
  import inArray from '../../Functions/inArray.js';
@@ -841,6 +839,7 @@ function GridComponent(props) {
841
839
  isResizable: true,
842
840
  isSortable: true,
843
841
  isHidden: inArray(columnConfig.id, defaultHiddenColumns),
842
+ isHidable: true,
844
843
  isOver: false,
845
844
  },
846
845
  config = _.assign({}, defaults, columnConfig);
@@ -1148,16 +1147,18 @@ export const Grid = withComponent(
1148
1147
  withAlert(
1149
1148
  withEvents(
1150
1149
  withData(
1151
- withDropTarget(
1152
- withMultiSelection(
1153
- withSelection(
1154
- withFilters(
1155
- withPresetButtons(
1156
- withContextMenu(
1157
- GridComponent
1158
- )
1159
- ),
1160
- true // isGrid
1150
+ withPermissions(
1151
+ withDropTarget(
1152
+ withMultiSelection(
1153
+ withSelection(
1154
+ withFilters(
1155
+ withPresetButtons(
1156
+ withContextMenu(
1157
+ GridComponent
1158
+ )
1159
+ ),
1160
+ true // isGrid
1161
+ )
1161
1162
  )
1162
1163
  )
1163
1164
  )
@@ -1171,17 +1172,19 @@ export const SideGridEditor = withComponent(
1171
1172
  withAlert(
1172
1173
  withEvents(
1173
1174
  withData(
1174
- withDropTarget(
1175
- withMultiSelection(
1176
- withSelection(
1177
- withSideEditor(
1178
- withFilters(
1179
- withPresetButtons(
1180
- withContextMenu(
1181
- GridComponent
1182
- )
1183
- ),
1184
- true // isGrid
1175
+ withPermissions(
1176
+ withDropTarget(
1177
+ withMultiSelection(
1178
+ withSelection(
1179
+ withSideEditor(
1180
+ withFilters(
1181
+ withPresetButtons(
1182
+ withContextMenu(
1183
+ GridComponent
1184
+ )
1185
+ ),
1186
+ true // isGrid
1187
+ )
1185
1188
  )
1186
1189
  )
1187
1190
  )
@@ -1196,16 +1199,18 @@ export const WindowedGridEditor = withComponent(
1196
1199
  withAlert(
1197
1200
  withEvents(
1198
1201
  withData(
1199
- withDropTarget(
1200
- withMultiSelection(
1201
- withSelection(
1202
- withWindowedEditor(
1203
- withFilters(
1204
- withPresetButtons(
1205
- withContextMenu(
1206
- GridComponent
1207
- ),
1208
- true // isGrid
1202
+ withPermissions(
1203
+ withDropTarget(
1204
+ withMultiSelection(
1205
+ withSelection(
1206
+ withWindowedEditor(
1207
+ withFilters(
1208
+ withPresetButtons(
1209
+ withContextMenu(
1210
+ GridComponent
1211
+ ),
1212
+ true // isGrid
1213
+ )
1209
1214
  )
1210
1215
  )
1211
1216
  )
@@ -1221,17 +1226,19 @@ export const InlineGridEditor = withComponent(
1221
1226
  withAlert(
1222
1227
  withEvents(
1223
1228
  withData(
1224
- withDropTarget(
1225
- withMultiSelection(
1226
- withSelection(
1227
- withInlineEditor(
1228
- withFilters(
1229
- withPresetButtons(
1230
- withContextMenu(
1231
- GridComponent
1232
- )
1233
- ),
1234
- true // isGrid
1229
+ withPermissions(
1230
+ withDropTarget(
1231
+ withMultiSelection(
1232
+ withSelection(
1233
+ withInlineEditor(
1234
+ withFilters(
1235
+ withPresetButtons(
1236
+ withContextMenu(
1237
+ GridComponent
1238
+ )
1239
+ ),
1240
+ true // isGrid
1241
+ )
1235
1242
  )
1236
1243
  )
1237
1244
  )
@@ -1246,17 +1253,19 @@ export const InlineGridEditor = withComponent(
1246
1253
  // withAlert(
1247
1254
  // withEvents(
1248
1255
  // withData(
1249
- // withDropTarget(
1250
- // withMultiSelection(
1251
- // withSelection(
1252
- // withInlineSideEditor(
1253
- // withFilters(
1254
- // withPresetButtons(
1255
- // withContextMenu(
1256
- // GridComponent
1257
- // )
1258
- // ),
1259
- // true // isGrid
1256
+ // withPermissions(
1257
+ // withDropTarget(
1258
+ // withMultiSelection(
1259
+ // withSelection(
1260
+ // withInlineSideEditor(
1261
+ // withFilters(
1262
+ // withPresetButtons(
1263
+ // withContextMenu(
1264
+ // GridComponent
1265
+ // )
1266
+ // ),
1267
+ // true // isGrid
1268
+ // )
1260
1269
  // )
1261
1270
  // )
1262
1271
  // )
@@ -296,8 +296,8 @@ export default function GridHeaderRow(props) {
296
296
  let {
297
297
  fieldName,
298
298
  header = _.upperFirst(fieldName),
299
- isReorderable,
300
- isResizable,
299
+ isReorderable: configIsReorderable,
300
+ isResizable: configIsResizable,
301
301
  isSortable,
302
302
  w,
303
303
  flex,
@@ -305,8 +305,8 @@ export default function GridHeaderRow(props) {
305
305
  isHidden = false,
306
306
  } = config,
307
307
  isSorter = isSortable && canColumnsSort && sortField === fieldName,
308
- isReorderable = canColumnsReorder && isReorderable,
309
- isResizable = canColumnsResize && isResizable,
308
+ isReorderable = canColumnsReorder && configIsReorderable,
309
+ isResizable = canColumnsResize && configIsResizable,
310
310
  propsToPass = {
311
311
  borderRightWidth: 2,
312
312
  borderRightColor: '#fff',
@@ -22,7 +22,7 @@ export default function withSecondaryEditor(WrappedComponent, isTree = false) {
22
22
 
23
23
  let [secondaryEditorMode, secondarySetEditorMode] = useState(EDITOR_MODE__VIEW); // Can change below, so use 'let'
24
24
  const {
25
- secondaryUserCanEdit = true,
25
+ secondaryUserCanEdit = true, // not permissions, but capability
26
26
  secondaryUserCanView = true,
27
27
  secondaryCanEditorViewOnly = false, // whether the editor can *ever* change state out of 'View' mode
28
28
  secondaryDisableAdd = false,
@@ -38,7 +38,6 @@ export default function withData(WrappedComponent) {
38
38
  // withComponent
39
39
  self,
40
40
  } = props,
41
- propsToPass = _.omit(props, ['model']), // passing 'model' would mess things up if withData gets called twice (e.g. withData(...withData(...)) ), as we'd be trying to recreate Repository twice
42
41
  localIdIx = idIx || (fields && idField ? fields.indexOf(idField) : null),
43
42
  localDisplayIx = displayIx || (fields && displayField ? fields?.indexOf(displayField) : null),
44
43
  [LocalRepository, setLocalRepository] = useState(Repository || null), // simply pass on Repository if it's already supplied
@@ -106,11 +105,9 @@ export default function withData(WrappedComponent) {
106
105
  }
107
106
 
108
107
  return <WrappedComponent
109
- {...propsToPass}
108
+ {...props}
110
109
  disableWithData={false}
111
110
  Repository={LocalRepository}
112
- model={model}
113
- data={data}
114
111
  fields={fields}
115
112
  idField={idField}
116
113
  displayField={displayField}
@@ -20,7 +20,7 @@ export default function withEditor(WrappedComponent, isTree = false) {
20
20
 
21
21
  let [editorMode, setEditorMode] = useState(EDITOR_MODE__VIEW); // Can change below, so use 'let'
22
22
  const {
23
- userCanEdit = true,
23
+ userCanEdit = true, // not permissions, but capability
24
24
  userCanView = true,
25
25
  canEditorViewOnly = false, // whether the editor can *ever* change state out of 'View' mode
26
26
  disableAdd = false,
@@ -0,0 +1,87 @@
1
+ import Inflector from 'inflector-js';
2
+ import inArray from '../../Functions/inArray.js';
3
+ import {
4
+ ADD,
5
+ EDIT,
6
+ DELETE,
7
+ VIEW,
8
+ COPY,
9
+ DUPLICATE,
10
+ PRINT,
11
+ UPLOAD_DOWNLOAD,
12
+ } from '../../Constants/Commands.js';
13
+ import UiGlobals from '../../UiGlobals.js';
14
+ import _ from 'lodash';
15
+
16
+
17
+ export default function withPermissions(WrappedComponent) {
18
+ return (props) => {
19
+
20
+ if (!props.usePermissions) {
21
+ return <WrappedComponent {...props} />;
22
+ }
23
+
24
+ const {
25
+ // withData
26
+ Repository,
27
+ } = props,
28
+ model = Repository.schema.name,
29
+ checkPermission = (permission) => {
30
+ const
31
+ reduxState = UiGlobals.redux?.getState(),
32
+ permissions = reduxState?.app?.permissions;
33
+ if (!permissions) {
34
+ return false;
35
+ }
36
+ return inArray(permission, permissions);
37
+ },
38
+
39
+ /**
40
+ * Check if user has permission to perform an action
41
+ *
42
+ * Example usages:
43
+ * canUser('view') // check if user can perform 'view' action on the default model
44
+ * canUser('add', 'PmEvents') // check if user can perform 'add' action on a specific model
45
+ * canUser('do_something_else) // check if user has a custom permission
46
+ *
47
+ * @param {string} permission - The permission to check for.
48
+ * @param {string} modelToCheck - The model to check for the permission on.
49
+ * @returns {boolean} - Whether user has permission
50
+ */
51
+ canUser = (permission, modelToCheck = null) => {
52
+
53
+ // in certain cases, shift permissions to standard CRUD operations
54
+ switch(permission) {
55
+ case COPY:
56
+ case DUPLICATE:
57
+ permission = ADD;
58
+ break;
59
+ case PRINT:
60
+ permission = VIEW;
61
+ break;
62
+ case UPLOAD_DOWNLOAD:
63
+ permission = EDIT;
64
+ break;
65
+ default:
66
+ // do nothing
67
+ break;
68
+ }
69
+
70
+ // standard CRUD permissions
71
+ if (inArray(permission, [VIEW, ADD, EDIT, DELETE])) {
72
+ if (!modelToCheck) {
73
+ modelToCheck = model; // use default model if none supplied
74
+ }
75
+ modelToCheck = Inflector.underscore(modelToCheck); // 'PmEvents' -> 'pm_events'
76
+ permission += '_' + modelToCheck; // e.g. 'view_pm_events'
77
+ }
78
+
79
+ return checkPermission(permission);
80
+ };
81
+
82
+ return <WrappedComponent
83
+ {...props}
84
+ canUser={canUser}
85
+ />;
86
+ };
87
+ }
@@ -2,6 +2,16 @@ import React, { useState, useEffect, } from 'react';
2
2
  import {
3
3
  Modal,
4
4
  } from 'native-base';
5
+ import {
6
+ ADD,
7
+ EDIT,
8
+ DELETE,
9
+ VIEW,
10
+ COPY,
11
+ DUPLICATE,
12
+ PRINT,
13
+ UPLOAD_DOWNLOAD,
14
+ } from '../../constants/Commands.js';
5
15
  import Clipboard from '../Icons/Clipboard.js';
6
16
  import Duplicate from '../Icons/Duplicate.js';
7
17
  import Edit from '../Icons/Edit.js';
@@ -18,14 +28,14 @@ import _ from 'lodash';
18
28
  // and a toolbar button that match in text label, icon, and handler.
19
29
 
20
30
  const presetButtons = [
21
- 'view',
22
- 'add',
23
- 'edit',
24
- 'delete',
25
- 'duplicate',
26
- 'copy',
27
- // 'print',
28
- 'uploadDownload',
31
+ ADD,
32
+ EDIT,
33
+ DELETE,
34
+ VIEW,
35
+ COPY,
36
+ DUPLICATE,
37
+ // PRINT,
38
+ UPLOAD_DOWNLOAD,
29
39
  ];
30
40
 
31
41
  export default function withPresetButtons(WrappedComponent, isGrid = false) {
@@ -71,8 +81,11 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
71
81
  // withData
72
82
  Repository,
73
83
 
84
+ // withPermissions
85
+ canUser,
86
+
74
87
  // withEditor
75
- userCanEdit = true,
88
+ userCanEdit = true, // not permissions, but capability
76
89
  userCanView = true,
77
90
  onAdd,
78
91
  onEdit,
@@ -101,44 +114,60 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
101
114
  isTypeDisabledCompletely = (type) => {
102
115
  let isDisabled = false;
103
116
  switch(type) {
104
- case 'add':
117
+ case ADD:
105
118
  if (disableAdd || canEditorViewOnly) {
106
119
  isDisabled = true;
120
+ } else if (canUser && !canUser(ADD)) { // check Permissions
121
+ isDisabled = true;
107
122
  }
108
123
  break;
109
- case 'edit':
124
+ case EDIT:
110
125
  if (disableEdit || canEditorViewOnly || isSideEditor) {
111
126
  isDisabled = true;
127
+ } else if (canUser && !canUser(EDIT)) { // check Permissions
128
+ isDisabled = true;
112
129
  }
113
130
  break;
114
- case 'delete':
131
+ case DELETE:
115
132
  if (disableDelete || canEditorViewOnly) {
116
133
  isDisabled = true;
134
+ } else if (canUser && !canUser(DELETE)) { // check Permissions
135
+ isDisabled = true;
117
136
  }
118
137
  break;
119
- case 'view':
138
+ case VIEW:
120
139
  if (disableView || isSideEditor) {
121
140
  isDisabled = true;
141
+ } else if (canUser && !canUser(VIEW)) { // check Permissions
142
+ isDisabled = true;
122
143
  }
123
144
  break;
124
- case 'copy':
145
+ case COPY:
125
146
  if (disableCopy) {
126
147
  isDisabled = true;
148
+ } else if (canUser && !canUser(COPY)) { // check Permissions
149
+ isDisabled = true;
127
150
  }
128
151
  break;
129
- case 'duplicate':
152
+ case DUPLICATE:
130
153
  if (disableDuplicate || canEditorViewOnly) {
131
154
  isDisabled = true;
155
+ } else if (canUser && !canUser(DUPLICATE)) { // check Permissions
156
+ isDisabled = true;
132
157
  }
133
158
  break;
134
- case 'print':
159
+ case PRINT:
135
160
  if (disablePrint) {
136
161
  isDisabled = true;
162
+ } else if (canUser && !canUser(PRINT)) { // check Permissions
163
+ isDisabled = true;
137
164
  }
138
165
  break;
139
- case 'uploadDownload':
166
+ case UPLOAD_DOWNLOAD:
140
167
  if (!useUploadDownload) {
141
168
  isDisabled = true;
169
+ } else if (canUser && !canUser(UPLOAD_DOWNLOAD)) { // check Permissions
170
+ isDisabled = true;
142
171
  }
143
172
  break;
144
173
  default:
@@ -152,7 +181,7 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
152
181
  icon = null,
153
182
  isDisabled = false;
154
183
  switch(type) {
155
- case 'add':
184
+ case ADD:
156
185
  key = 'addBtn';
157
186
  text = 'Add';
158
187
  handler = onAdd;
@@ -164,7 +193,7 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
164
193
  isDisabled = true;
165
194
  }
166
195
  break;
167
- case 'edit':
196
+ case EDIT:
168
197
  key = 'editBtn';
169
198
  text = 'Edit';
170
199
  handler = onEdit;
@@ -179,7 +208,7 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
179
208
  isDisabled = true;
180
209
  }
181
210
  break;
182
- case 'delete':
211
+ case DELETE:
183
212
  key = 'deleteBtn';
184
213
  text = 'Delete';
185
214
  handler = onDelete;
@@ -200,7 +229,7 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
200
229
  }
201
230
  }
202
231
  break;
203
- case 'view':
232
+ case VIEW:
204
233
  key = 'viewBtn';
205
234
  text = 'View';
206
235
  handler = onView;
@@ -213,7 +242,7 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
213
242
  isDisabled = true;
214
243
  }
215
244
  break;
216
- case 'copy':
245
+ case COPY:
217
246
  key = 'copyBtn';
218
247
  text = 'Copy to Clipboard';
219
248
  handler = onCopyToClipboard;
@@ -226,7 +255,7 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
226
255
  isDisabled = true;
227
256
  }
228
257
  break;
229
- case 'duplicate':
258
+ case DUPLICATE:
230
259
  key = 'duplicateBtn';
231
260
  text = 'Duplicate';
232
261
  handler = onDuplicate;
@@ -242,12 +271,12 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
242
271
  isDisabled = true;
243
272
  }
244
273
  break;
245
- // case 'print':
274
+ // case PRINT:
246
275
  // text = 'Print';
247
276
  // handler = onPrint;
248
277
  // icon = <Print />;
249
278
  // break;
250
- case 'uploadDownload':
279
+ case UPLOAD_DOWNLOAD:
251
280
  key = 'uploadDownloadBtn';
252
281
  text = 'Upload/Download';
253
282
  handler = onUploadDownload;
@@ -274,8 +303,8 @@ export default function withPresetButtons(WrappedComponent, isGrid = false) {
274
303
  if (isTypeDisabledCompletely(type)) { // i.e. not just temporarily disabled because of selection
275
304
  return;
276
305
  }
277
- if ((!userCanEdit && inArray(type, ['add', 'edit', 'delete', 'duplicate',])) ||
278
- (!userCanView && type === 'view')) {
306
+ if ((!userCanEdit && inArray(type, [ADD, EDIT, DELETE, DUPLICATE,])) ||
307
+ (!userCanView && type === VIEW)) {
279
308
  return;
280
309
  }
281
310
 
@@ -31,8 +31,9 @@ import withData from '../Hoc/withData.js';
31
31
  import withEvents from '../Hoc/withEvents.js';
32
32
  import withSideEditor from '../Hoc/withSideEditor.js';
33
33
  import withFilters from '../Hoc/withFilters.js';
34
- import withPresetButtons from '../Hoc/withPresetButtons.js';
35
34
  import withMultiSelection from '../Hoc/withMultiSelection.js';
35
+ import withPresetButtons from '../Hoc/withPresetButtons.js';
36
+ import withPermissions from '../Hoc/withPermissions.js';
36
37
  import withSelection from '../Hoc/withSelection.js';
37
38
  import withWindowedEditor from '../Hoc/withWindowedEditor.js';
38
39
  import getIconButtonFromConfig from '../../Functions/getIconButtonFromConfig.js';
@@ -1320,15 +1321,17 @@ export const Tree = withComponent(
1320
1321
  withAlert(
1321
1322
  withEvents(
1322
1323
  withData(
1323
- // withMultiSelection(
1324
- withSelection(
1325
- withFilters(
1326
- withContextMenu(
1327
- TreeComponent
1324
+ withPermissions(
1325
+ // withMultiSelection(
1326
+ withSelection(
1327
+ withFilters(
1328
+ withContextMenu(
1329
+ TreeComponent
1330
+ )
1328
1331
  )
1329
1332
  )
1330
- )
1331
- // )
1333
+ // )
1334
+ )
1332
1335
  )
1333
1336
  )
1334
1337
  )
@@ -1338,20 +1341,22 @@ export const SideTreeEditor = withComponent(
1338
1341
  withAlert(
1339
1342
  withEvents(
1340
1343
  withData(
1341
- // withMultiSelection(
1342
- withSelection(
1343
- withSideEditor(
1344
- withFilters(
1345
- withPresetButtons(
1346
- withContextMenu(
1347
- TreeComponent
1344
+ withPermissions(
1345
+ // withMultiSelection(
1346
+ withSelection(
1347
+ withSideEditor(
1348
+ withFilters(
1349
+ withPresetButtons(
1350
+ withContextMenu(
1351
+ TreeComponent
1352
+ )
1348
1353
  )
1349
- )
1350
- ),
1351
- true // isTree
1354
+ ),
1355
+ true // isTree
1356
+ )
1352
1357
  )
1353
- )
1354
- // )
1358
+ // )
1359
+ )
1355
1360
  )
1356
1361
  )
1357
1362
  )
@@ -1361,20 +1366,22 @@ export const WindowedTreeEditor = withComponent(
1361
1366
  withAlert(
1362
1367
  withEvents(
1363
1368
  withData(
1364
- // withMultiSelection(
1365
- withSelection(
1366
- withWindowedEditor(
1367
- withFilters(
1368
- withPresetButtons(
1369
- withContextMenu(
1370
- TreeComponent
1369
+ withPermissions(
1370
+ // withMultiSelection(
1371
+ withSelection(
1372
+ withWindowedEditor(
1373
+ withFilters(
1374
+ withPresetButtons(
1375
+ withContextMenu(
1376
+ TreeComponent
1377
+ )
1371
1378
  )
1372
- )
1373
- ),
1374
- true // isTree
1379
+ ),
1380
+ true // isTree
1381
+ )
1375
1382
  )
1376
- )
1377
- // )
1383
+ // )
1384
+ )
1378
1385
  )
1379
1386
  )
1380
1387
  )
@@ -0,0 +1,8 @@
1
+ export const ADD = 'add';
2
+ export const EDIT = 'edit';
3
+ export const DELETE = 'delete';
4
+ export const VIEW = 'view';
5
+ export const COPY = 'copy';
6
+ export const DUPLICATE = 'duplicate';
7
+ export const PRINT = 'print';
8
+ export const UPLOAD_DOWNLOAD = 'uploadDownload';
@@ -1,31 +0,0 @@
1
- import {
2
- Modal,
3
- Row,
4
- Text,
5
- } from 'native-base';
6
- import withRedux from '../Data/hoc/withRedux';
7
- import Loading from './Loading';
8
- import _ from 'lodash';
9
-
10
- export function WaitModal(props) {
11
- const {
12
- textMessage = 'Please wait...',
13
- waitStack,
14
- } = props;
15
-
16
- return <Modal {...props} _backdrop={{ bg: "#000" }}>
17
- <Modal.Content maxWidth="400px">
18
- <Modal.Body>
19
- <Row justifyContent="center" alignItems="center">
20
- <Loading minHeight="auto" h={5} w={5} mr={2} />
21
- <Text color="#000">{textMessage}</Text>
22
- {/* {!!waitStack ? <Text color="#000">{_.keys(waitStack).join(', ')}</Text> : null} */}
23
- </Row>
24
- </Modal.Body>
25
- </Modal.Content>
26
- </Modal>;
27
- }
28
-
29
- export default withRedux(WaitModal, [
30
- 'waitStack',
31
- ]);