@iobroker/adapter-react-v5 5.0.7 → 6.0.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 (54) hide show
  1. package/Components/404.d.ts +2 -5
  2. package/Components/404.js +10 -10
  3. package/Components/ColorPicker.d.ts +41 -4
  4. package/Components/ColorPicker.js +35 -32
  5. package/Components/ComplexCron.d.ts +35 -4
  6. package/Components/ComplexCron.js +14 -15
  7. package/Components/CustomModal.d.ts +2 -3
  8. package/Components/CustomModal.js +15 -16
  9. package/Components/FileBrowser.d.ts +116 -4
  10. package/Components/FileBrowser.js +160 -164
  11. package/Components/FileViewer.js +10 -8
  12. package/Components/Icon.d.ts +1 -0
  13. package/Components/Icon.js +11 -4
  14. package/Components/IconPicker.d.ts +5 -1
  15. package/Components/IconPicker.js +47 -49
  16. package/Components/ObjectBrowser.d.ts +12 -15
  17. package/Components/ObjectBrowser.js +362 -326
  18. package/Components/SaveCloseButtons.d.ts +6 -3
  19. package/Components/SaveCloseButtons.js +4 -5
  20. package/Components/Schedule.d.ts +60 -3
  21. package/Components/Schedule.js +112 -117
  22. package/Components/SelectWithIcon.d.ts +17 -4
  23. package/Components/SelectWithIcon.js +11 -7
  24. package/Components/SimpleCron/index.d.ts +19 -3
  25. package/Components/SimpleCron/index.js +8 -9
  26. package/Components/TabContainer.d.ts +3 -4
  27. package/Components/TabContainer.js +3 -7
  28. package/Components/TabContent.d.ts +2 -3
  29. package/Components/TabContent.js +2 -4
  30. package/Components/TableResize.d.ts +26 -3
  31. package/Components/TableResize.js +1 -39
  32. package/Components/TextWithIcon.d.ts +4 -4
  33. package/Components/TextWithIcon.js +6 -7
  34. package/Components/TreeTable.d.ts +40 -5
  35. package/Components/TreeTable.js +39 -37
  36. package/Components/UploadImage.d.ts +13 -4
  37. package/Components/UploadImage.js +11 -13
  38. package/Components/Utils.d.ts +2 -1
  39. package/Components/Utils.js +31 -0
  40. package/Dialogs/ComplexCron.d.ts +11 -3
  41. package/Dialogs/ComplexCron.js +2 -3
  42. package/Dialogs/Confirm.d.ts +20 -7
  43. package/Dialogs/Confirm.js +4 -15
  44. package/Dialogs/Cron.d.ts +12 -3
  45. package/Dialogs/Cron.js +3 -11
  46. package/Dialogs/SelectFile.d.ts +12 -3
  47. package/Dialogs/SelectFile.js +8 -9
  48. package/Dialogs/SelectID.d.ts +1 -1
  49. package/Dialogs/SelectID.js +1 -1
  50. package/Dialogs/SimpleCron.d.ts +10 -3
  51. package/Dialogs/SimpleCron.js +2 -10
  52. package/README.md +74 -1
  53. package/modulefederation.admin.config.js +2 -0
  54. package/package.json +6 -7
@@ -26,6 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.FileBrowserClass = void 0;
29
30
  /**
30
31
  * Copyright 2020-2024, Denis Haev <dogafox@gmail.com>
31
32
  *
@@ -33,7 +34,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
33
34
  *
34
35
  * */
35
36
  const react_1 = __importStar(require("react"));
36
- const styles_1 = require("@mui/styles");
37
37
  const react_dropzone_1 = __importDefault(require("react-dropzone"));
38
38
  const material_1 = require("@mui/material");
39
39
  // MUI Icons
@@ -62,10 +62,10 @@ const FILE_TYPE_ICONS = {
62
62
  audio: icons_material_1.AudioFile,
63
63
  video: icons_material_1.Videocam,
64
64
  };
65
- const styles = (theme) => ({
66
- dialog: {
65
+ const styles = {
66
+ dialog: (theme) => ({
67
67
  height: `calc(100% - ${theme.mixins.toolbar.minHeight}px)`,
68
- },
68
+ }),
69
69
  root: {
70
70
  width: '100%',
71
71
  overflow: 'hidden',
@@ -73,10 +73,10 @@ const styles = (theme) => ({
73
73
  position: 'relative',
74
74
  },
75
75
  filesDiv: {
76
- width: `calc(100% - ${theme.spacing(2)})`,
76
+ width: 'calc(100% - 16px)',
77
77
  overflowX: 'hidden',
78
78
  overflowY: 'auto',
79
- padding: theme.spacing(1),
79
+ padding: 8,
80
80
  },
81
81
  filesDivHint: {
82
82
  position: 'absolute',
@@ -87,17 +87,17 @@ const styles = (theme) => ({
87
87
  fontSize: 12,
88
88
  },
89
89
  filesDivTable: {
90
- height: `calc(100% - ${48 + parseInt(theme.spacing(1), 10)}px)`,
90
+ height: 'calc(100% - 56px)',
91
91
  },
92
92
  filesDivTile: {
93
- height: `calc(100% - ${48 * 2 + parseInt(theme.spacing(1), 10)}px)`,
93
+ height: `calc(100% - ${48 * 2 + 8}px)`,
94
94
  display: 'flex',
95
95
  alignContent: 'flex-start',
96
96
  alignItems: 'stretch',
97
97
  flexWrap: 'wrap',
98
98
  flex: `0 0 ${TILE_WIDTH}px`,
99
99
  },
100
- itemTile: {
100
+ itemTile: (theme) => ({
101
101
  position: 'relative',
102
102
  userSelect: 'none',
103
103
  cursor: 'pointer',
@@ -112,7 +112,7 @@ const styles = (theme) => ({
112
112
  background: theme.palette.secondary.light,
113
113
  color: Utils_1.default.invertColor(theme.palette.secondary.main, true),
114
114
  },
115
- },
115
+ }),
116
116
  itemNameFolderTile: {
117
117
  fontWeight: 'bold',
118
118
  },
@@ -125,20 +125,20 @@ const styles = (theme) => ({
125
125
  textAlign: 'center',
126
126
  wordBreak: 'break-all',
127
127
  },
128
- itemFolderIconTile: {
128
+ itemFolderIconTile: (theme) => ({
129
129
  width: '100%',
130
130
  height: TILE_HEIGHT - 32 - 16 - 8, // name + size
131
131
  display: 'block',
132
- paddingLeft: 8,
132
+ pl: 1,
133
133
  color: theme.palette.secondary.main || '#fbff7d',
134
- },
135
- itemFolderIconBack: {
134
+ }),
135
+ itemFolderIconBack: (theme) => ({
136
136
  position: 'absolute',
137
137
  top: 22,
138
138
  left: 18,
139
139
  zIndex: 1,
140
140
  color: theme.palette.mode === 'dark' ? '#FFF' : '#000',
141
- },
141
+ }),
142
142
  itemSizeTile: {
143
143
  width: '100%',
144
144
  height: 16,
@@ -159,11 +159,11 @@ const styles = (theme) => ({
159
159
  display: 'block',
160
160
  objectFit: 'contain',
161
161
  },
162
- itemSelected: {
162
+ itemSelected: (theme) => ({
163
163
  background: theme.palette.primary.main,
164
164
  color: Utils_1.default.invertColor(theme.palette.primary.main, true),
165
- },
166
- itemTable: {
165
+ }),
166
+ itemTable: (theme) => ({
167
167
  userSelect: 'none',
168
168
  cursor: 'pointer',
169
169
  height: ROW_HEIGHT,
@@ -173,13 +173,20 @@ const styles = (theme) => ({
173
173
  background: theme.palette.secondary.light,
174
174
  color: Utils_1.default.invertColor(theme.palette.secondary.main, true),
175
175
  },
176
- },
176
+ }),
177
177
  itemNameTable: {
178
178
  display: 'inline-block',
179
- paddingLeft: 10,
179
+ pl: '10px',
180
180
  fontSize: '1rem',
181
181
  verticalAlign: 'top',
182
182
  flexGrow: 1,
183
+ '@media screen and (max-width: 500px)': {
184
+ whiteSpace: 'nowrap',
185
+ overflow: 'hidden',
186
+ textOverflow: 'ellipsis',
187
+ textAlign: 'end',
188
+ direction: 'rtl',
189
+ },
183
190
  },
184
191
  itemNameFolderTable: {
185
192
  fontWeight: 'bold',
@@ -220,15 +227,15 @@ const styles = (theme) => ({
220
227
  itemFolderTemp: {
221
228
  opacity: 0.4,
222
229
  },
223
- itemFolderIconTable: {
230
+ itemFolderIconTable: (theme) => ({
224
231
  marginTop: 1,
225
- marginLeft: theme.spacing(1),
232
+ marginLeft: 8,
226
233
  display: 'inline-block',
227
234
  width: 30,
228
235
  height: 30,
229
236
  color: theme.palette.secondary.main || '#fbff7d',
230
- },
231
- itemDownloadButtonTable: {
237
+ }),
238
+ itemDownloadButtonTable: (theme) => ({
232
239
  display: 'inline-block',
233
240
  width: BUTTON_WIDTH,
234
241
  height: ROW_HEIGHT,
@@ -236,22 +243,22 @@ const styles = (theme) => ({
236
243
  verticalAlign: 'middle',
237
244
  textAlign: 'center',
238
245
  padding: 0,
239
- borderRadius: BUTTON_WIDTH / 2,
246
+ borderRadius: `${BUTTON_WIDTH / 2}px`,
240
247
  '&:hover': {
241
248
  backgroundColor: theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.08)',
242
249
  },
243
250
  '& span': {
244
- paddingTop: 9,
251
+ pt: '9px',
245
252
  },
246
253
  '& svg': {
247
254
  width: 14,
248
255
  height: 14,
249
256
  fontSize: '1rem',
250
- marginTop: -3,
257
+ mt: '-3px',
251
258
  verticalAlign: 'middle',
252
259
  color: theme.palette.mode === 'dark' ? '#EEE' : '#111',
253
260
  },
254
- },
261
+ }),
255
262
  itemDownloadEmptyTable: {
256
263
  display: 'inline-block',
257
264
  width: BUTTON_WIDTH,
@@ -295,10 +302,10 @@ const styles = (theme) => ({
295
302
  uploadDivDragging: {
296
303
  opacity: 1,
297
304
  },
298
- uploadCenterDiv: {
299
- margin: 20,
305
+ uploadCenterDiv: (theme) => ({
306
+ m: '20px',
300
307
  border: '3px dashed grey',
301
- borderRadius: 30,
308
+ borderRadius: '30px',
302
309
  width: 'calc(100% - 40px)',
303
310
  height: 'calc(100% - 40px)',
304
311
  position: 'relative',
@@ -306,7 +313,7 @@ const styles = (theme) => ({
306
313
  display: 'flex',
307
314
  alignItems: 'center',
308
315
  justifyContent: 'center',
309
- },
316
+ }),
310
317
  uploadCenterIcon: {
311
318
  width: '25%',
312
319
  height: '25%',
@@ -334,27 +341,27 @@ const styles = (theme) => ({
334
341
  menuButtonRestrictActive: {
335
342
  color: '#c05000',
336
343
  },
337
- pathDiv: {
344
+ pathDiv: (theme) => ({
338
345
  display: 'flex',
339
- width: `calc(100% - ${theme.spacing(2)})`,
340
- marginLeft: theme.spacing(1),
341
- marginRight: theme.spacing(1),
346
+ width: 'calc(100% - 16px)',
347
+ ml: 1,
348
+ mr: 1,
342
349
  textOverflow: 'clip',
343
350
  overflow: 'hidden',
344
351
  whiteSpace: 'nowrap',
345
352
  backgroundColor: theme.palette.secondary.main,
346
- },
353
+ }),
347
354
  pathDivInput: {
348
355
  width: '100%',
349
356
  },
350
- pathDivBreadcrumbDir: {
351
- paddingLeft: 2,
352
- paddingRight: 2,
357
+ pathDivBreadcrumbDir: (theme) => ({
358
+ pl: '2px',
359
+ pr: '2px',
353
360
  cursor: 'pointer',
354
361
  '&:hover': {
355
362
  background: theme.palette.primary.main,
356
363
  },
357
- },
364
+ }),
358
365
  backgroundImageLight: {
359
366
  background: 'white',
360
367
  },
@@ -364,19 +371,13 @@ const styles = (theme) => ({
364
371
  backgroundImageColored: {
365
372
  background: 'silver',
366
373
  },
367
- '@media screen and (max-width: 500px)': {
368
- itemNameTable: {
369
- whiteSpace: 'nowrap',
370
- overflow: 'hidden',
371
- textOverflow: 'ellipsis',
372
- textAlign: 'end',
373
- direction: 'rtl',
374
- },
375
- },
376
- specialFolder: {
374
+ specialFolder: (theme) => ({
377
375
  color: theme.palette.mode === 'dark' ? '#229b0f' : '#5dd300',
376
+ }),
377
+ tooltip: {
378
+ pointerEvents: 'none',
378
379
  },
379
- });
380
+ };
380
381
  const USER_DATA = '0_userdata.0';
381
382
  function getParentDir(dir) {
382
383
  const parts = (dir || '').split('/');
@@ -401,10 +402,7 @@ function sortFolders(a, b) {
401
402
  }
402
403
  return a.name > b.name ? 1 : (a.name < b.name ? -1 : 0);
403
404
  }
404
- /**
405
- * @extends {React.Component<import('./types').FileBrowserProps>}
406
- */
407
- class FileBrowser extends react_1.Component {
405
+ class FileBrowserClass extends react_1.Component {
408
406
  constructor(props) {
409
407
  super(props);
410
408
  this.limitToObjectID = null;
@@ -431,30 +429,31 @@ class FileBrowser extends react_1.Component {
431
429
  this.setStateBackgroundImage = () => {
432
430
  const array = ['light', 'dark', 'colored', 'delete'];
433
431
  this.setState(({ backgroundImage }) => {
434
- if (array.indexOf(backgroundImage) !== -1 && array.length - 1 !== array.indexOf(backgroundImage)) {
435
- (window._localStorage || window.localStorage).setItem('files.backgroundImage', array[array.indexOf(backgroundImage) + 1]);
432
+ if (backgroundImage && array.indexOf(backgroundImage) !== -1 && array.length - 1 !== array.indexOf(backgroundImage)) {
433
+ this.localStorage.setItem('files.backgroundImage', array[array.indexOf(backgroundImage) + 1]);
436
434
  return { backgroundImage: array[array.indexOf(backgroundImage) + 1] };
437
435
  }
438
- (window._localStorage || window.localStorage).setItem('files.backgroundImage', array[0]);
436
+ this.localStorage.setItem('files.backgroundImage', array[0]);
439
437
  return { backgroundImage: array[0] };
440
438
  });
441
439
  };
442
- this.getClassBackgroundImage = () => {
440
+ this.getStyleBackgroundImage = () => {
443
441
  // ['light', 'dark', 'colored', 'delete']
444
442
  switch (this.state.backgroundImage) {
445
443
  case 'light':
446
- return this.props.classes.backgroundImageLight;
444
+ return styles.backgroundImageLight;
447
445
  case 'dark':
448
- return this.props.classes.backgroundImageDark;
446
+ return styles.backgroundImageDark;
449
447
  case 'colored':
450
- return this.props.classes.backgroundImageColored;
448
+ return styles.backgroundImageColored;
451
449
  case 'delete':
452
450
  return null;
453
451
  default:
454
452
  return null;
455
453
  }
456
454
  };
457
- const expandedStr = (window._localStorage || window.localStorage).getItem('files.expanded') || '[]';
455
+ this.localStorage = (window._localStorage || window.localStorage);
456
+ const expandedStr = this.localStorage.getItem('files.expanded') || '[]';
458
457
  if (this.props.limitPath) {
459
458
  const parts = this.props.limitPath.split('/');
460
459
  this.limitToObjectID = parts[0];
@@ -479,13 +478,13 @@ class FileBrowser extends react_1.Component {
479
478
  }
480
479
  let viewType;
481
480
  if (this.props.showViewTypeButton) {
482
- viewType = (window._localStorage || window.localStorage).getItem('files.viewType') || TABLE;
481
+ viewType = this.localStorage.getItem('files.viewType') || TABLE;
483
482
  }
484
483
  else {
485
484
  viewType = TABLE;
486
485
  }
487
486
  let selected = this.props.selected ||
488
- (window._localStorage || window.localStorage).getItem('files.selected') ||
487
+ this.localStorage.getItem('files.selected') ||
489
488
  USER_DATA;
490
489
  let currentDir;
491
490
  if (props.restrictToFolder) {
@@ -511,11 +510,11 @@ class FileBrowser extends react_1.Component {
511
510
  currentDir = selected;
512
511
  }
513
512
  }
514
- const backgroundImage = (window._localStorage || window.localStorage).getItem('files.backgroundImage') || null;
513
+ const backgroundImage = this.localStorage.getItem('files.backgroundImage') || null;
515
514
  this.state = {
516
515
  viewType,
517
516
  folders: {},
518
- filterEmpty: (window._localStorage || window.localStorage).getItem('files.empty') !== 'false',
517
+ filterEmpty: this.localStorage.getItem('files.empty') !== 'false',
519
518
  expanded,
520
519
  currentDir,
521
520
  expertMode: !!props.expertMode,
@@ -757,7 +756,7 @@ class FileBrowser extends react_1.Component {
757
756
  // if root folder
758
757
  if (!folderId || folderId === '/') {
759
758
  try {
760
- let objs = await this.props.socket.readMetaItems();
759
+ let objs = (await this.props.socket.readMetaItems());
761
760
  const _folders = [];
762
761
  let userData = null;
763
762
  if (this.state.restrictToFolder) {
@@ -883,7 +882,7 @@ class FileBrowser extends react_1.Component {
883
882
  if (pos === -1) {
884
883
  expanded.push(item.id);
885
884
  expanded.sort();
886
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
885
+ this.localStorage.setItem('files.expanded', JSON.stringify(expanded));
887
886
  if (!item.temp) {
888
887
  this.browseFolder(item.id)
889
888
  .then(folders => this.setState({ expanded, folders }))
@@ -897,7 +896,7 @@ class FileBrowser extends react_1.Component {
897
896
  }
898
897
  else {
899
898
  expanded.splice(pos, 1);
900
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
899
+ this.localStorage.setItem('files.expanded', JSON.stringify(expanded));
901
900
  this.setState({ expanded });
902
901
  }
903
902
  }
@@ -908,7 +907,7 @@ class FileBrowser extends react_1.Component {
908
907
  if (_folder === '/') {
909
908
  _folder = '';
910
909
  }
911
- (window._localStorage || window.localStorage).setItem('files.currentDir', _folder);
910
+ this.localStorage.setItem('files.currentDir', _folder);
912
911
  if (folder && e && (e.altKey || e.shiftKey || e.ctrlKey || e.metaKey)) {
913
912
  return this.setState({ selected: _folder });
914
913
  }
@@ -932,7 +931,7 @@ class FileBrowser extends react_1.Component {
932
931
  select(id, e, cb) {
933
932
  e && e.stopPropagation();
934
933
  this.lastSelect = Date.now();
935
- (window._localStorage || window.localStorage).setItem('files.selected', id);
934
+ this.localStorage.setItem('files.selected', id);
936
935
  this.setState({ selected: id, path: id, pathFocus: false }, () => {
937
936
  if (this.props.onSelect) {
938
937
  const ext = Utils_1.default.getFileExtension(id);
@@ -969,18 +968,18 @@ class FileBrowser extends react_1.Component {
969
968
  const padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;
970
969
  const isUserData = item.name === USER_DATA;
971
970
  const isSpecialData = isUserData || item.name === 'vis.0' || item.name === 'vis-2.0';
972
- return react_1.default.createElement("div", { key: item.id, id: item.id, style: this.state.viewType === TABLE ? { marginLeft: padding, width: `calc(100% - ${padding}px` } : {}, onClick: e => (this.state.viewType === TABLE ? this.select(item.id, e) : this.changeFolder(e, item.id)), onDoubleClick: e => this.state.viewType === TABLE && this.toggleFolder(item, e), title: this.getText(item.title), className: Utils_1.default.clsx('browserItem', this.props.classes[`item${this.state.viewType}`], this.props.classes[`itemFolder${this.state.viewType}`], this.state.selected === item.id && this.props.classes.itemSelected, item.temp && this.props.classes.itemFolderTemp) },
973
- react_1.default.createElement(IconEl, { className: Utils_1.default.clsx(this.props.classes[`itemFolderIcon${this.state.viewType}`], isSpecialData && this.props.classes.specialFolder), onClick: this.state.viewType === TABLE ? (e) => this.toggleFolder(item, e) : undefined }),
974
- react_1.default.createElement("div", { className: Utils_1.default.clsx(this.props.classes[`itemName${this.state.viewType}`], this.props.classes[`itemNameFolder${this.state.viewType}`]) }, isUserData ? this.props.t('ra_User files') : item.name),
971
+ return react_1.default.createElement(material_1.Box, { component: "div", key: item.id, id: item.id, style: this.state.viewType === TABLE ? { marginLeft: padding, width: `calc(100% - ${padding}px` } : {}, onClick: e => (this.state.viewType === TABLE ? this.select(item.id, e) : this.changeFolder(e, item.id)), onDoubleClick: e => this.state.viewType === TABLE && this.toggleFolder(item, e), title: this.getText(item.title), className: "browserItem", sx: Utils_1.default.getStyle(this.props.theme, styles[`item${this.state.viewType}`], styles[`itemFolder${this.state.viewType}`], this.state.selected === item.id ? styles.itemSelected : {}, item.temp ? styles.itemFolderTemp : {}) },
972
+ react_1.default.createElement(IconEl, { style: Utils_1.default.getStyle(this.props.theme, styles[`itemFolderIcon${this.state.viewType}`], isSpecialData && styles.specialFolder), onClick: this.state.viewType === TABLE ? (e) => this.toggleFolder(item, e) : undefined }),
973
+ react_1.default.createElement(material_1.Box, { component: "div", sx: Utils_1.default.getStyle(this.props.theme, styles[`itemName${this.state.viewType}`], styles[`itemNameFolder${this.state.viewType}`]) }, isUserData ? this.props.t('ra_User files') : item.name),
975
974
  react_1.default.createElement(material_1.Hidden, { smDown: true },
976
- react_1.default.createElement("div", { className: this.props.classes[`itemSize${this.state.viewType}`] }, this.state.viewType === TABLE && this.state.folders[item.id]
975
+ react_1.default.createElement("div", { style: styles[`itemSize${this.state.viewType}`] }, this.state.viewType === TABLE && this.state.folders[item.id]
977
976
  ? this.state.folders[item.id].length
978
977
  : '')),
979
978
  react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null),
980
979
  react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode ?
981
- react_1.default.createElement("div", { className: this.props.classes[`itemDeleteButton${this.state.viewType}`] }) : null),
980
+ react_1.default.createElement(material_1.Box, { component: "div", sx: styles[`itemDeleteButton${this.state.viewType}`] }) : null),
982
981
  this.state.viewType === TABLE && this.props.allowDownload ?
983
- react_1.default.createElement("div", { className: this.props.classes[`itemDownloadEmpty${this.state.viewType}`] }) : null,
982
+ react_1.default.createElement("div", { style: styles[`itemDownloadEmpty${this.state.viewType}`] }) : null,
984
983
  this.state.viewType === TABLE &&
985
984
  this.props.allowDelete &&
986
985
  this.state.folders[item.id] &&
@@ -992,22 +991,22 @@ class FileBrowser extends react_1.Component {
992
991
  else {
993
992
  this.setState({ deleteItem: item.id });
994
993
  }
995
- }, className: this.props.classes[`itemDeleteButton${this.state.viewType}`], size: "large" },
994
+ }, sx: styles[`itemDeleteButton${this.state.viewType}`], size: "large" },
996
995
  react_1.default.createElement(icons_material_1.Delete, { fontSize: "small" })) :
997
996
  this.state.viewType === TABLE && this.props.allowDelete ?
998
- react_1.default.createElement("div", { className: this.props.classes[`itemDeleteButton${this.state.viewType}`] }) : null);
997
+ react_1.default.createElement(material_1.Box, { component: "div", sx: styles[`itemDeleteButton${this.state.viewType}`] }) : null);
999
998
  }
1000
999
  renderBackFolder() {
1001
- return react_1.default.createElement("div", { key: this.state.currentDir, id: this.state.currentDir, onClick: e => this.changeFolder(e), title: this.props.t('ra_Back to %s', getParentDir(this.state.currentDir)), className: Utils_1.default.clsx('browserItem', this.props.classes[`item${this.state.viewType}`], this.props.classes[`itemFolder${this.state.viewType}`]) },
1002
- react_1.default.createElement(IconClosed_1.default, { className: this.props.classes[`itemFolderIcon${this.state.viewType}`] }),
1003
- react_1.default.createElement(icons_material_1.ArrowBack, { className: this.props.classes.itemFolderIconBack }),
1004
- react_1.default.createElement("div", { className: Utils_1.default.clsx(this.props.classes[`itemName${this.state.viewType}`], this.props.classes[`itemNameFolder${this.state.viewType}`]) }, ".."));
1000
+ return react_1.default.createElement(material_1.Box, { component: "div", key: this.state.currentDir, id: this.state.currentDir, onClick: e => this.changeFolder(e), title: this.props.t('ra_Back to %s', getParentDir(this.state.currentDir)), className: "browserItem", sx: Utils_1.default.getStyle(this.props.theme, styles[`item${this.state.viewType}`], styles[`itemFolder${this.state.viewType}`]) },
1001
+ react_1.default.createElement(IconClosed_1.default, { style: styles[`itemFolderIcon${this.state.viewType}`] }),
1002
+ react_1.default.createElement(icons_material_1.ArrowBack, { sx: styles.itemFolderIconBack }),
1003
+ react_1.default.createElement(material_1.Box, { component: "div", sx: Utils_1.default.getStyle(this.props.theme, styles[`itemName${this.state.viewType}`], styles[`itemNameFolder${this.state.viewType}`]) }, ".."));
1005
1004
  }
1006
1005
  formatSize(size) {
1007
- return react_1.default.createElement("div", { className: this.props.classes[`itemSize${this.state.viewType}`] }, size || size === 0 ? Utils_1.default.formatBytes(size) : '');
1006
+ return react_1.default.createElement("div", { style: styles[`itemSize${this.state.viewType}`] }, size || size === 0 ? Utils_1.default.formatBytes(size) : '');
1008
1007
  }
1009
1008
  formatAcl(acl) {
1010
- const access = acl && (acl.permissions || acl.file);
1009
+ const access = acl ? (acl.permissions || acl.file) : 0;
1011
1010
  let accessStr;
1012
1011
  if (access) {
1013
1012
  accessStr = access.toString(16).padStart(3, '0');
@@ -1015,30 +1014,30 @@ class FileBrowser extends react_1.Component {
1015
1014
  else {
1016
1015
  accessStr = '';
1017
1016
  }
1018
- return react_1.default.createElement("div", { className: this.props.classes[`itemAccess${this.state.viewType}`] }, this.props.modalEditOfAccessControl ? react_1.default.createElement(material_1.IconButton, { size: "large", onClick: () => this.setState({ modalEditOfAccess: true }), className: this.props.classes[`itemAclButton${this.state.viewType}`] }, accessStr || '---') : accessStr || '---');
1017
+ return react_1.default.createElement("div", { style: styles[`itemAccess${this.state.viewType}`] }, this.props.modalEditOfAccessControl ? react_1.default.createElement(material_1.IconButton, { size: "large", onClick: () => this.setState({ modalEditOfAccess: true }), sx: styles[`itemAclButton${this.state.viewType}`] }, accessStr || '---') : accessStr || '---');
1019
1018
  }
1020
1019
  getFileIcon(ext) {
1021
1020
  switch (ext) {
1022
1021
  case 'json':
1023
1022
  case 'json5':
1024
- return react_1.default.createElement(icons_material_1.Bookmark, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1023
+ return react_1.default.createElement(icons_material_1.Bookmark, { style: styles[`itemIcon${this.state.viewType}`] });
1025
1024
  case 'css':
1026
- return react_1.default.createElement(icons_material_1.BookmarkBorder, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1025
+ return react_1.default.createElement(icons_material_1.BookmarkBorder, { style: styles[`itemIcon${this.state.viewType}`] });
1027
1026
  case 'js':
1028
1027
  case 'ts':
1029
- return react_1.default.createElement(icons_material_1.Code, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1028
+ return react_1.default.createElement(icons_material_1.Code, { style: styles[`itemIcon${this.state.viewType}`] });
1030
1029
  case 'html':
1031
1030
  case 'md':
1032
- return react_1.default.createElement(icons_material_1.Description, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1031
+ return react_1.default.createElement(icons_material_1.Description, { style: styles[`itemIcon${this.state.viewType}`] });
1033
1032
  case 'mp3':
1034
1033
  case 'ogg':
1035
1034
  case 'wav':
1036
1035
  case 'm4a':
1037
1036
  case 'mp4':
1038
1037
  case 'flac':
1039
- return react_1.default.createElement(icons_material_1.MusicNote, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1038
+ return react_1.default.createElement(icons_material_1.MusicNote, { style: styles[`itemIcon${this.state.viewType}`] });
1040
1039
  default:
1041
- return react_1.default.createElement(icons_material_1.InsertDriveFile, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1040
+ return react_1.default.createElement(icons_material_1.InsertDriveFile, { style: styles[`itemIcon${this.state.viewType}`] });
1042
1041
  }
1043
1042
  }
1044
1043
  static getEditFile(ext) {
@@ -1058,7 +1057,7 @@ class FileBrowser extends react_1.Component {
1058
1057
  renderFile(item) {
1059
1058
  const padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;
1060
1059
  const ext = Utils_1.default.getFileExtension(item.name);
1061
- return react_1.default.createElement("div", { key: item.id, id: item.id, onDoubleClick: e => {
1060
+ return react_1.default.createElement(material_1.Box, { component: "div", key: item.id, id: item.id, onDoubleClick: e => {
1062
1061
  e.stopPropagation();
1063
1062
  if (!this.props.onSelect) {
1064
1063
  this.setState({ viewer: this.imagePrefix + item.id, formatEditFile: ext });
@@ -1069,25 +1068,24 @@ class FileBrowser extends react_1.Component {
1069
1068
  FileViewer_1.EXTENSIONS[this.state.filterByType].includes(item.ext)))) {
1070
1069
  this.props.onSelect(item.id, true, !!this.state.folders[item.id]);
1071
1070
  }
1072
- }, onClick: e => this.select(item.id, e), style: this.state.viewType === TABLE ? { marginLeft: padding, width: `calc(100% - ${padding}px)` } : {}, className: Utils_1.default.clsx('browserItem', this.props.classes[`item${this.state.viewType}`], this.props.classes[`itemFile${this.state.viewType}`], this.state.selected === item.id && this.props.classes.itemSelected) },
1071
+ }, onClick: e => this.select(item.id, e), style: this.state.viewType === TABLE ? { marginLeft: padding, width: `calc(100% - ${padding}px)` } : {}, className: "browserItem", sx: Utils_1.default.getStyle(this.props.theme, styles[`item${this.state.viewType}`], styles[`itemFile${this.state.viewType}`], this.state.selected === item.id ? styles.itemSelected : undefined) },
1073
1072
  ext && FileViewer_1.EXTENSIONS.images.includes(ext) ?
1074
1073
  this.state.fileErrors.includes(item.id) ?
1075
- react_1.default.createElement(IconNoIcon_1.default, { className: Utils_1.default.clsx(this.props.classes[`itemImage${this.state.viewType}`], this.getClassBackgroundImage(), this.props.classes[`itemNoImage${this.state.viewType}`]) }) :
1074
+ react_1.default.createElement(IconNoIcon_1.default, { style: Object.assign(Object.assign(Object.assign({}, styles[`itemImage${this.state.viewType}`]), this.getStyleBackgroundImage()), styles[`itemNoImage${this.state.viewType}`]) }) :
1076
1075
  react_1.default.createElement(Icon_1.default, { onError: e => {
1077
- // @ts-expect-error it exists
1078
1076
  e.target.onerror = null;
1079
1077
  const fileErrors = [...this.state.fileErrors];
1080
1078
  if (!fileErrors.includes(item.id)) {
1081
1079
  fileErrors.push(item.id);
1082
1080
  this.setState({ fileErrors });
1083
1081
  }
1084
- }, className: Utils_1.default.clsx(this.props.classes[`itemImage${this.state.viewType}`], this.getClassBackgroundImage()), src: this.imagePrefix + item.id, alt: item.name })
1082
+ }, style: Object.assign(Object.assign({}, styles[`itemImage${this.state.viewType}`]), this.getStyleBackgroundImage()), src: this.imagePrefix + item.id, alt: item.name })
1085
1083
  :
1086
1084
  this.getFileIcon(ext),
1087
- react_1.default.createElement("div", { className: this.props.classes[`itemName${this.state.viewType}`] }, item.name),
1085
+ react_1.default.createElement(material_1.Box, { component: "div", sx: styles[`itemName${this.state.viewType}`] }, item.name),
1088
1086
  react_1.default.createElement(material_1.Hidden, { smDown: true }, this.formatSize(item.size)),
1089
1087
  react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null),
1090
- react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode && FileBrowser.getEditFile(ext) ?
1088
+ react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode && FileBrowserClass.getEditFile(ext) ?
1091
1089
  react_1.default.createElement(material_1.IconButton, { "aria-label": "edit", onClick: e => {
1092
1090
  e.stopPropagation();
1093
1091
  if (!this.props.onSelect) {
@@ -1100,32 +1098,29 @@ class FileBrowser extends react_1.Component {
1100
1098
  FileViewer_1.EXTENSIONS[this.state.filterByType].includes(item.ext)))) {
1101
1099
  this.props.onSelect(item.id, true, !!this.state.folders[item.id]);
1102
1100
  }
1103
- }, className: this.props.classes[`itemDeleteButton${this.state.viewType}`], size: "large" },
1101
+ }, sx: styles[`itemDeleteButton${this.state.viewType}`], size: "large" },
1104
1102
  react_1.default.createElement(icons_material_1.Edit, { fontSize: "small" }))
1105
1103
  :
1106
- react_1.default.createElement("div", { className: this.props.classes[`itemDeleteButton${this.state.viewType}`] })),
1107
- this.state.viewType === TABLE && this.props.allowDownload ? react_1.default.createElement("a", { className: Utils_1.default.clsx('MuiButtonBase-root', 'MuiIconButton-root', 'MuiIconButton-sizeLarge', this.props.classes.itemDownloadButtonTable), tabIndex: 0, download: item.id, href: this.imagePrefix + item.id, onClick: e => {
1108
- e.stopPropagation();
1109
- } },
1104
+ react_1.default.createElement(material_1.Box, { component: "div", sx: styles[`itemDeleteButton${this.state.viewType}`] })),
1105
+ this.state.viewType === TABLE && this.props.allowDownload ? react_1.default.createElement(material_1.Box, { component: "a", className: "MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeLarge", sx: styles.itemDownloadButtonTable, tabIndex: 0, download: item.id, href: this.imagePrefix + item.id, onClick: e => e.stopPropagation() },
1110
1106
  react_1.default.createElement(icons_material_1.SaveAlt, null)) : null,
1111
1107
  this.state.viewType === TABLE &&
1112
1108
  this.props.allowDelete &&
1113
1109
  item.id !== 'vis.0/' &&
1114
1110
  item.id !== 'vis-2.0/' &&
1115
- item.id !== USER_DATA ?
1116
- react_1.default.createElement(material_1.IconButton, { "aria-label": "delete", onClick: e => {
1117
- e.stopPropagation();
1118
- if (this.suppressDeleteConfirm > Date.now()) {
1119
- this.deleteItem(item.id);
1120
- }
1121
- else {
1122
- this.setState({ deleteItem: item.id });
1123
- }
1124
- }, className: this.props.classes[`itemDeleteButton${this.state.viewType}`], size: "large" },
1125
- react_1.default.createElement(icons_material_1.Delete, { fontSize: "small" }))
1111
+ item.id !== USER_DATA ? react_1.default.createElement(material_1.IconButton, { "aria-label": "delete", onClick: e => {
1112
+ e.stopPropagation();
1113
+ if (this.suppressDeleteConfirm > Date.now()) {
1114
+ this.deleteItem(item.id);
1115
+ }
1116
+ else {
1117
+ this.setState({ deleteItem: item.id });
1118
+ }
1119
+ }, sx: styles[`itemDeleteButton${this.state.viewType}`], size: "large" },
1120
+ react_1.default.createElement(icons_material_1.Delete, { fontSize: "small" }))
1126
1121
  :
1127
1122
  (this.state.viewType === TABLE && this.props.allowDelete ?
1128
- react_1.default.createElement("div", { className: this.props.classes[`itemDeleteButton${this.state.viewType}`] }) : null));
1123
+ react_1.default.createElement(material_1.Box, { component: "div", sx: styles[`itemDeleteButton${this.state.viewType}`] }) : null));
1129
1124
  }
1130
1125
  renderItems(folderId) {
1131
1126
  if (this.state.folders && this.state.folders[folderId]) {
@@ -1197,16 +1192,16 @@ class FileBrowser extends react_1.Component {
1197
1192
  return react_1.default.createElement(material_1.Toolbar, { key: "toolbar", variant: "dense" },
1198
1193
  this.props.allowNonRestricted && this.props.restrictToFolder ? react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.state.restrictToFolder
1199
1194
  ? this.props.t('ra_Show all folders')
1200
- : this.props.t('ra_Restrict to folder'), className: Utils_1.default.clsx(this.props.classes.menuButton, this.state.restrictToFolder && this.props.classes.menuButtonRestrictActive), "aria-label": "restricted to folder", onClick: () => this.setState({
1195
+ : this.props.t('ra_Restrict to folder'), style: Object.assign(Object.assign({}, styles.menuButton), (this.state.restrictToFolder ? styles.menuButtonRestrictActive : undefined)), "aria-label": "restricted to folder", onClick: () => this.setState({
1201
1196
  restrictToFolder: (this.state.restrictToFolder ? '' : this.props.restrictToFolder) || '',
1202
1197
  loadAllFolders: true,
1203
1198
  }), size: "small" },
1204
1199
  react_1.default.createElement(icons_material_1.FolderSpecial, { fontSize: "small" })) : null,
1205
- this.props.showExpertButton ? react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.props.t('ra_Toggle expert mode'), className: Utils_1.default.clsx(this.props.classes.menuButton, this.state.expertMode && this.props.classes.menuButtonExpertActive), "aria-label": "expert mode", onClick: () => this.setState({ expertMode: !this.state.expertMode }), size: "small" },
1200
+ this.props.showExpertButton ? react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.props.t('ra_Toggle expert mode'), style: Object.assign(Object.assign({}, styles.menuButton), (this.state.expertMode ? styles.menuButtonExpertActive : undefined)), "aria-label": "expert mode", onClick: () => this.setState({ expertMode: !this.state.expertMode }), size: "small" },
1206
1201
  react_1.default.createElement(IconExpert_1.default, null)) : null,
1207
- this.props.showViewTypeButton ? react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.props.t('ra_Toggle view mode'), className: this.props.classes.menuButton, "aria-label": "view mode", onClick: () => {
1202
+ this.props.showViewTypeButton ? react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.props.t('ra_Toggle view mode'), style: styles.menuButton, "aria-label": "view mode", onClick: () => {
1208
1203
  const viewType = this.state.viewType === TABLE ? TILE : TABLE;
1209
- (window._localStorage || window.localStorage).setItem('files.viewType', viewType);
1204
+ this.localStorage.setItem('files.viewType', viewType);
1210
1205
  let currentDir = this.state.selected;
1211
1206
  if (isFile(currentDir)) {
1212
1207
  currentDir = getParentDir(currentDir);
@@ -1217,37 +1212,37 @@ class FileBrowser extends react_1.Component {
1217
1212
  }
1218
1213
  });
1219
1214
  }, size: "small" }, this.state.viewType !== TABLE ? react_1.default.createElement(icons_material_1.List, { fontSize: "small" }) : react_1.default.createElement(icons_material_1.ViewModule, { fontSize: "small" })) : null,
1220
- react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.props.t('ra_Hide empty folders'), className: this.props.classes.menuButton, color: this.state.filterEmpty ? 'secondary' : 'inherit', "aria-label": "filter empty", onClick: () => {
1221
- (window._localStorage || window.localStorage).setItem('file.empty', !this.state.filterEmpty);
1215
+ react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.props.t('ra_Hide empty folders'), style: styles.menuButton, color: this.state.filterEmpty ? 'secondary' : 'inherit', "aria-label": "filter empty", onClick: () => {
1216
+ this.localStorage.setItem('file.empty', this.state.filterEmpty ? 'false' : 'true');
1222
1217
  this.setState({ filterEmpty: !this.state.filterEmpty });
1223
1218
  }, size: "small" },
1224
1219
  react_1.default.createElement(icons_material_1.FolderOpen, { fontSize: "small" })),
1225
- react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.props.t('ra_Reload files'), className: this.props.classes.menuButton, color: "inherit", "aria-label": "reload files", onClick: () => this.setState({ folders: {} }, () => this.loadFolders()), size: "small" },
1220
+ react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.props.t('ra_Reload files'), style: styles.menuButton, color: "inherit", "aria-label": "reload files", onClick: () => this.setState({ folders: {} }, () => this.loadFolders()), size: "small" },
1226
1221
  react_1.default.createElement(icons_material_1.Refresh, { fontSize: "small" })),
1227
1222
  this.props.allowCreateFolder ? react_1.default.createElement(material_1.IconButton, { edge: "start", disabled: !this.state.selected ||
1228
1223
  !isInFolder ||
1229
1224
  (!!this.limitToPath &&
1230
1225
  !this.state.selected.startsWith(`${this.limitToPath}/`) &&
1231
- this.limitToPath !== this.state.selected), title: this.props.t('ra_Create folder'), className: this.props.classes.menuButton, color: "inherit", "aria-label": "add folder", onClick: () => this.setState({ addFolder: true }), size: "small" },
1226
+ this.limitToPath !== this.state.selected), title: this.props.t('ra_Create folder'), style: styles.menuButton, color: "inherit", "aria-label": "add folder", onClick: () => this.setState({ addFolder: true }), size: "small" },
1232
1227
  react_1.default.createElement(icons_material_1.CreateNewFolder, { fontSize: "small" })) : null,
1233
1228
  this.props.allowUpload ? react_1.default.createElement(material_1.IconButton, { edge: "start", disabled: !this.state.selected ||
1234
1229
  !isInFolder ||
1235
1230
  (!!this.limitToPath &&
1236
1231
  !this.state.selected.startsWith(`${this.limitToPath}/`) &&
1237
- this.limitToPath !== this.state.selected), title: this.props.t('ra_Upload file'), className: this.props.classes.menuButton, color: "inherit", "aria-label": "upload file", onClick: () => this.setState({ uploadFile: true }), size: "small" },
1232
+ this.limitToPath !== this.state.selected), title: this.props.t('ra_Upload file'), style: styles.menuButton, color: "inherit", "aria-label": "upload file", onClick: () => this.setState({ uploadFile: true }), size: "small" },
1238
1233
  react_1.default.createElement(icons_material_1.Publish, { fontSize: "small" })) : null,
1239
- this.props.showTypeSelector ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Filter files') },
1234
+ this.props.showTypeSelector && IconType ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Filter files') },
1240
1235
  react_1.default.createElement(material_1.IconButton, { size: "small", onClick: e => this.setState({ showTypesMenu: e.target }) },
1241
1236
  react_1.default.createElement(IconType, { fontSize: "small" }))) : null,
1242
1237
  this.state.showTypesMenu ? react_1.default.createElement(material_1.Menu, { open: !0, anchorEl: this.state.showTypesMenu, onClose: () => this.setState({ showTypesMenu: null }) }, Object.keys(FILE_TYPE_ICONS).map(type => {
1243
1238
  const MyIcon = FILE_TYPE_ICONS[type];
1244
1239
  return react_1.default.createElement(material_1.MenuItem, { key: type, selected: this.state.filterByType === type, onClick: () => {
1245
1240
  if (type === 'all') {
1246
- (window._localStorage || window.localStorage).removeItem('files.filterByType');
1241
+ this.localStorage.removeItem('files.filterByType');
1247
1242
  this.setState({ filterByType: '', showTypesMenu: null });
1248
1243
  }
1249
1244
  else {
1250
- (window._localStorage || window.localStorage).setItem('files.filterByType', type);
1245
+ this.localStorage.setItem('files.filterByType', type);
1251
1246
  this.setState({ filterByType: type, showTypesMenu: null });
1252
1247
  }
1253
1248
  } },
@@ -1255,15 +1250,15 @@ class FileBrowser extends react_1.Component {
1255
1250
  react_1.default.createElement(MyIcon, { fontSize: "small" })),
1256
1251
  react_1.default.createElement(material_1.ListItemText, null, this.props.t(`ra_fileType_${type}`)));
1257
1252
  })) : null,
1258
- react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Background image') },
1259
- react_1.default.createElement(material_1.IconButton, { color: "inherit", edge: "start", className: this.props.classes.menuButton, onClick: this.setStateBackgroundImage, size: "small" },
1253
+ react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Background image'), componentsProps: { popper: { sx: styles.tooltip } } },
1254
+ react_1.default.createElement(material_1.IconButton, { color: "inherit", edge: "start", style: styles.menuButton, onClick: this.setStateBackgroundImage, size: "small" },
1260
1255
  react_1.default.createElement(icons_material_1.Brightness6, { fontSize: "small" }))),
1261
- this.state.viewType !== TABLE && this.props.allowDelete ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Delete') },
1256
+ this.state.viewType !== TABLE && this.props.allowDelete ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Delete'), componentsProps: { popper: { sx: styles.tooltip } } },
1262
1257
  react_1.default.createElement("span", null,
1263
1258
  react_1.default.createElement(material_1.IconButton, { "aria-label": "delete", disabled: !this.state.selected ||
1264
1259
  this.state.selected === 'vis.0/' ||
1265
1260
  this.state.selected === 'vis-2.0/' ||
1266
- this.state.selected === USER_DATA, color: "inherit", edge: "start", className: this.props.classes.menuButton, onClick: e => {
1261
+ this.state.selected === USER_DATA, color: "inherit", edge: "start", style: styles.menuButton, onClick: e => {
1267
1262
  e.stopPropagation();
1268
1263
  if (this.suppressDeleteConfirm > Date.now()) {
1269
1264
  this.deleteItem(this.state.selected);
@@ -1316,7 +1311,7 @@ class FileBrowser extends react_1.Component {
1316
1311
  expanded.push(parentFolder);
1317
1312
  expanded.sort();
1318
1313
  }
1319
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1314
+ this.localStorage.setItem('files.expanded', JSON.stringify(expanded));
1320
1315
  this.setState({ addFolder: false, folders, expanded }, () => this.select(id));
1321
1316
  }
1322
1317
  else {
@@ -1336,16 +1331,6 @@ class FileBrowser extends react_1.Component {
1336
1331
  }
1337
1332
  }, 100);
1338
1333
  }
1339
- async uploadFile(fileName, data) {
1340
- const parts = fileName.split('/');
1341
- const adapter = parts.shift();
1342
- try {
1343
- return await this.props.socket.writeFile64(adapter || '', parts.join('/'), data);
1344
- }
1345
- catch (e) {
1346
- return window.alert(`Cannot write file: ${e}`);
1347
- }
1348
- }
1349
1334
  findFirstFolder(id) {
1350
1335
  let parentFolder = id;
1351
1336
  const item = this.findItem(parentFolder);
@@ -1368,10 +1353,20 @@ class FileBrowser extends react_1.Component {
1368
1353
  }
1369
1354
  return parentFolder;
1370
1355
  }
1356
+ async uploadFile(fileName, data) {
1357
+ const parts = fileName.split('/');
1358
+ const adapterName = parts.shift();
1359
+ try {
1360
+ await this.props.socket.writeFile64(adapterName || '', parts.join('/'), data);
1361
+ }
1362
+ catch (e) {
1363
+ window.alert(`Cannot write file: ${e}`);
1364
+ }
1365
+ }
1371
1366
  renderUpload() {
1372
1367
  if (this.state.uploadFile) {
1373
1368
  return [
1374
- react_1.default.createElement(material_1.Fab, { key: "close", color: "primary", "aria-label": "close", className: this.props.classes.uploadCloseButton, onClick: () => this.setState({ uploadFile: false }) },
1369
+ react_1.default.createElement(material_1.Fab, { key: "close", color: "primary", "aria-label": "close", style: styles.uploadCloseButton, onClick: () => this.setState({ uploadFile: false }) },
1375
1370
  react_1.default.createElement(icons_material_1.Close, null)),
1376
1371
  react_1.default.createElement(react_dropzone_1.default, { key: "dropzone", onDragEnter: () => this.setState({ uploadFile: 'dragging' }), onDragLeave: () => this.setState({ uploadFile: true }), onDrop: acceptedFiles => {
1377
1372
  let count = acceptedFiles.length;
@@ -1396,7 +1391,7 @@ class FileBrowser extends react_1.Component {
1396
1391
  if (!expanded.includes(parentFolder)) {
1397
1392
  expanded.push(parentFolder);
1398
1393
  expanded.sort();
1399
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1394
+ this.localStorage.setItem('files.expanded', JSON.stringify(expanded));
1400
1395
  }
1401
1396
  this.setState({ expanded }, () => this.select(id));
1402
1397
  }
@@ -1408,8 +1403,7 @@ class FileBrowser extends react_1.Component {
1408
1403
  if (!expanded.includes(parentFolder)) {
1409
1404
  expanded.push(parentFolder);
1410
1405
  expanded.sort();
1411
- (window._localStorage ||
1412
- window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1406
+ this.localStorage.setItem('files.expanded', JSON.stringify(expanded));
1413
1407
  }
1414
1408
  this.setState({ folders, expanded }, () => this.select(id));
1415
1409
  }), 500);
@@ -1421,12 +1415,12 @@ class FileBrowser extends react_1.Component {
1421
1415
  };
1422
1416
  reader.readAsArrayBuffer(file);
1423
1417
  });
1424
- } }, ({ getRootProps, getInputProps }) => react_1.default.createElement("div", Object.assign({ className: Utils_1.default.clsx(this.props.classes.uploadDiv, this.state.uploadFile === 'dragging' && this.props.classes.uploadDivDragging) }, getRootProps()),
1418
+ } }, ({ getRootProps, getInputProps }) => react_1.default.createElement("div", Object.assign({ style: Object.assign(Object.assign({}, styles.uploadDiv), (this.state.uploadFile === 'dragging' ? styles.uploadDivDragging : undefined)) }, getRootProps()),
1425
1419
  react_1.default.createElement("input", Object.assign({}, getInputProps())),
1426
- react_1.default.createElement("div", { className: this.props.classes.uploadCenterDiv },
1427
- react_1.default.createElement("div", { className: this.props.classes.uploadCenterTextAndIcon },
1428
- react_1.default.createElement(icons_material_1.Publish, { className: this.props.classes.uploadCenterIcon }),
1429
- react_1.default.createElement("div", { className: this.props.classes.uploadCenterText }, this.state.uploadFile === 'dragging'
1420
+ react_1.default.createElement(material_1.Box, { component: "div", sx: styles.uploadCenterDiv },
1421
+ react_1.default.createElement("div", { style: styles.uploadCenterTextAndIcon },
1422
+ react_1.default.createElement(icons_material_1.Publish, { style: styles.uploadCenterIcon }),
1423
+ react_1.default.createElement("div", { style: styles.uploadCenterText }, this.state.uploadFile === 'dragging'
1430
1424
  ? this.props.t('ra_Drop file here')
1431
1425
  : this.props.t('ra_Place your files here or click here to open the browse dialog')))))),
1432
1426
  ];
@@ -1480,7 +1474,7 @@ class FileBrowser extends react_1.Component {
1480
1474
  if (pos !== -1) {
1481
1475
  const expanded = [...this.state.expanded];
1482
1476
  expanded.splice(pos, 1);
1483
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1477
+ this.localStorage.setItem('files.expanded', JSON.stringify(expanded));
1484
1478
  newState.expanded = expanded;
1485
1479
  }
1486
1480
  if (this.state.selected === deleteItem) {
@@ -1525,7 +1519,7 @@ class FileBrowser extends react_1.Component {
1525
1519
  return false;
1526
1520
  }
1527
1521
  renderViewDialog() {
1528
- return this.state.viewer ? react_1.default.createElement(FileViewer_1.default, { supportSubscribes: this.supportSubscribes, key: this.state.viewer, href: this.state.viewer, formatEditFile: this.state.formatEditFile, themeType: this.props.themeType, setStateBackgroundImage: this.setStateBackgroundImage, getClassBackgroundImage: this.getClassBackgroundImage, t: this.props.t, socket: this.props.socket, lang: this.props.lang, expertMode: this.state.expertMode, onClose: () => this.setState({ viewer: '', formatEditFile: '' }) }) : null;
1522
+ return this.state.viewer ? react_1.default.createElement(FileViewer_1.default, { supportSubscribes: this.supportSubscribes, key: this.state.viewer, href: this.state.viewer, formatEditFile: this.state.formatEditFile, themeType: this.props.themeType, setStateBackgroundImage: this.setStateBackgroundImage, getStyleBackgroundImage: this.getStyleBackgroundImage, t: this.props.t, socket: this.props.socket, lang: this.props.lang, expertMode: this.state.expertMode, onClose: () => this.setState({ viewer: '', formatEditFile: '' }) }) : null;
1529
1523
  }
1530
1524
  renderError() {
1531
1525
  if (this.state.errorText) {
@@ -1592,13 +1586,13 @@ class FileBrowser extends react_1.Component {
1592
1586
  part && p.push(part);
1593
1587
  const path = p.join('/');
1594
1588
  if (i < parts.length - 1) {
1595
- return react_1.default.createElement("div", { key: `${this.state.selected}_${i}`, className: this.props.classes.pathDivBreadcrumbDir, onClick: e => this.changeFolder(e, path || '/') }, part || this.props.t('ra_Root'));
1589
+ return react_1.default.createElement(material_1.Box, { component: "div", key: `${this.state.selected}_${i}`, sx: styles.pathDivBreadcrumbDir, onClick: e => this.changeFolder(e, path || '/') }, part || this.props.t('ra_Root'));
1596
1590
  }
1597
- return react_1.default.createElement("div", { className: this.props.classes.pathDivBreadcrumbSelected, key: `${this.state.selected}_${i}`, onClick: () => this.setState({ pathFocus: true }) }, part);
1591
+ return react_1.default.createElement("div", { style: styles.pathDivBreadcrumbSelected, key: `${this.state.selected}_${i}`, onClick: () => this.setState({ pathFocus: true }) }, part);
1598
1592
  }));
1599
1593
  }
1600
1594
  renderPath() {
1601
- return react_1.default.createElement("div", { key: "path", className: this.props.classes.pathDiv }, this.state.pathFocus ?
1595
+ return react_1.default.createElement(material_1.Box, { component: "div", key: "path", sx: styles.pathDiv }, this.state.pathFocus ?
1602
1596
  react_1.default.createElement(material_1.Input, { value: this.state.path, onKeyDown: e => {
1603
1597
  if (e.key === 'Enter') {
1604
1598
  this.changeToPath();
@@ -1607,7 +1601,7 @@ class FileBrowser extends react_1.Component {
1607
1601
  this.setState({ pathFocus: false });
1608
1602
  }
1609
1603
  }, endAdornment: react_1.default.createElement(material_1.IconButton, { size: "small", onClick: () => this.changeToPath() },
1610
- react_1.default.createElement(icons_material_1.KeyboardReturn, null)), onBlur: () => this.changeToPath(), onChange: e => this.setState({ path: e.target.value }), className: this.props.classes.pathDivInput })
1604
+ react_1.default.createElement(icons_material_1.KeyboardReturn, null)), onBlur: () => this.changeToPath(), onChange: e => this.setState({ path: e.target.value }), style: styles.pathDivInput })
1611
1605
  :
1612
1606
  this.renderBreadcrumb());
1613
1607
  }
@@ -1625,10 +1619,10 @@ class FileBrowser extends react_1.Component {
1625
1619
  });
1626
1620
  }, 300);
1627
1621
  }
1628
- return react_1.default.createElement("div", { style: this.props.style, className: Utils_1.default.clsx(this.props.classes.root, this.props.className) },
1622
+ return react_1.default.createElement("div", { style: Object.assign(Object.assign({}, styles.root), this.props.style), className: this.props.className },
1629
1623
  this.props.showToolbar ? this.renderToolbar() : null,
1630
1624
  this.state.viewType === TILE ? this.renderPath() : null,
1631
- react_1.default.createElement("div", { className: Utils_1.default.clsx(this.props.classes.filesDiv, this.props.classes[`filesDiv${this.state.viewType}`]), onClick: e => {
1625
+ react_1.default.createElement("div", { style: Object.assign(Object.assign({}, styles.filesDiv), styles[`filesDiv${this.state.viewType}`]), onClick: e => {
1632
1626
  if (this.state.viewType !== TABLE) {
1633
1627
  if (this.state.selected !== (this.state.currentDir || '/')) {
1634
1628
  this.changeFolder(e, this.state.currentDir || '/');
@@ -1641,7 +1635,8 @@ class FileBrowser extends react_1.Component {
1641
1635
  this.state.viewType === TABLE
1642
1636
  ? this.renderItems('/')
1643
1637
  : this.renderItems(this.state.currentDir || '/'),
1644
- this.state.viewType !== TABLE ? (react_1.default.createElement("div", { className: this.props.classes.filesDivHint }, this.props.t('ra_select_folder_hint'))) : null),
1638
+ this.state.viewType !== TABLE ?
1639
+ react_1.default.createElement("div", { style: styles.filesDivHint }, this.props.t('ra_select_folder_hint')) : null),
1645
1640
  this.props.allowUpload ? this.renderInputDialog() : null,
1646
1641
  this.props.allowUpload ? this.renderUpload() : null,
1647
1642
  this.props.allowDelete ? this.renderDeleteDialog() : null,
@@ -1652,4 +1647,5 @@ class FileBrowser extends react_1.Component {
1652
1647
  this.renderError());
1653
1648
  }
1654
1649
  }
1655
- exports.default = (0, withWidth_1.default)()((0, styles_1.withStyles)(styles)(FileBrowser));
1650
+ exports.FileBrowserClass = FileBrowserClass;
1651
+ exports.default = (0, withWidth_1.default)()(FileBrowserClass);