@iobroker/adapter-react-v5 5.0.8 → 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.
- package/Components/404.d.ts +2 -5
- package/Components/404.js +10 -10
- package/Components/ColorPicker.d.ts +41 -4
- package/Components/ColorPicker.js +35 -32
- package/Components/ComplexCron.d.ts +35 -4
- package/Components/ComplexCron.js +14 -15
- package/Components/CustomModal.d.ts +2 -3
- package/Components/CustomModal.js +15 -16
- package/Components/FileBrowser.d.ts +116 -4
- package/Components/FileBrowser.js +160 -164
- package/Components/FileViewer.js +10 -8
- package/Components/Icon.d.ts +1 -0
- package/Components/Icon.js +11 -4
- package/Components/IconPicker.d.ts +5 -1
- package/Components/IconPicker.js +47 -49
- package/Components/ObjectBrowser.d.ts +12 -15
- package/Components/ObjectBrowser.js +362 -326
- package/Components/SaveCloseButtons.d.ts +6 -3
- package/Components/SaveCloseButtons.js +4 -5
- package/Components/Schedule.d.ts +60 -3
- package/Components/Schedule.js +112 -117
- package/Components/SelectWithIcon.d.ts +17 -4
- package/Components/SelectWithIcon.js +11 -7
- package/Components/SimpleCron/index.d.ts +19 -3
- package/Components/SimpleCron/index.js +8 -9
- package/Components/TabContainer.d.ts +3 -4
- package/Components/TabContainer.js +3 -7
- package/Components/TabContent.d.ts +2 -3
- package/Components/TabContent.js +2 -4
- package/Components/TableResize.d.ts +26 -3
- package/Components/TableResize.js +1 -39
- package/Components/TextWithIcon.d.ts +4 -4
- package/Components/TextWithIcon.js +6 -7
- package/Components/TreeTable.d.ts +40 -5
- package/Components/TreeTable.js +39 -37
- package/Components/UploadImage.d.ts +13 -4
- package/Components/UploadImage.js +11 -13
- package/Components/Utils.d.ts +2 -1
- package/Components/Utils.js +31 -0
- package/Dialogs/ComplexCron.d.ts +11 -3
- package/Dialogs/ComplexCron.js +2 -3
- package/Dialogs/Confirm.d.ts +20 -7
- package/Dialogs/Confirm.js +4 -15
- package/Dialogs/Cron.d.ts +12 -3
- package/Dialogs/Cron.js +3 -11
- package/Dialogs/SelectFile.d.ts +12 -3
- package/Dialogs/SelectFile.js +8 -9
- package/Dialogs/SelectID.d.ts +1 -1
- package/Dialogs/SelectID.js +1 -1
- package/Dialogs/SimpleCron.d.ts +10 -3
- package/Dialogs/SimpleCron.js +2 -10
- package/README.md +73 -0
- 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 =
|
|
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:
|
|
76
|
+
width: 'calc(100% - 16px)',
|
|
77
77
|
overflowX: 'hidden',
|
|
78
78
|
overflowY: 'auto',
|
|
79
|
-
padding:
|
|
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:
|
|
90
|
+
height: 'calc(100% - 56px)',
|
|
91
91
|
},
|
|
92
92
|
filesDivTile: {
|
|
93
|
-
height: `calc(100% - ${48 * 2 +
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
251
|
+
pt: '9px',
|
|
245
252
|
},
|
|
246
253
|
'& svg': {
|
|
247
254
|
width: 14,
|
|
248
255
|
height: 14,
|
|
249
256
|
fontSize: '1rem',
|
|
250
|
-
|
|
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
|
-
|
|
305
|
+
uploadCenterDiv: (theme) => ({
|
|
306
|
+
m: '20px',
|
|
300
307
|
border: '3px dashed grey',
|
|
301
|
-
borderRadius:
|
|
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:
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
352
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
436
|
+
this.localStorage.setItem('files.backgroundImage', array[0]);
|
|
439
437
|
return { backgroundImage: array[0] };
|
|
440
438
|
});
|
|
441
439
|
};
|
|
442
|
-
this.
|
|
440
|
+
this.getStyleBackgroundImage = () => {
|
|
443
441
|
// ['light', 'dark', 'colored', 'delete']
|
|
444
442
|
switch (this.state.backgroundImage) {
|
|
445
443
|
case 'light':
|
|
446
|
-
return
|
|
444
|
+
return styles.backgroundImageLight;
|
|
447
445
|
case 'dark':
|
|
448
|
-
return
|
|
446
|
+
return styles.backgroundImageDark;
|
|
449
447
|
case 'colored':
|
|
450
|
-
return
|
|
448
|
+
return styles.backgroundImageColored;
|
|
451
449
|
case 'delete':
|
|
452
450
|
return null;
|
|
453
451
|
default:
|
|
454
452
|
return null;
|
|
455
453
|
}
|
|
456
454
|
};
|
|
457
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
513
|
+
const backgroundImage = this.localStorage.getItem('files.backgroundImage') || null;
|
|
515
514
|
this.state = {
|
|
516
515
|
viewType,
|
|
517
516
|
folders: {},
|
|
518
|
-
filterEmpty:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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",
|
|
973
|
-
react_1.default.createElement(IconEl, {
|
|
974
|
-
react_1.default.createElement("div",
|
|
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", {
|
|
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",
|
|
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", {
|
|
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
|
-
},
|
|
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",
|
|
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",
|
|
1002
|
-
react_1.default.createElement(IconClosed_1.default, {
|
|
1003
|
-
react_1.default.createElement(icons_material_1.ArrowBack, {
|
|
1004
|
-
react_1.default.createElement("div",
|
|
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", {
|
|
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
|
|
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", {
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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",
|
|
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.
|
|
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, {
|
|
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
|
-
},
|
|
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",
|
|
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 &&
|
|
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
|
-
},
|
|
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",
|
|
1107
|
-
this.state.viewType === TABLE && this.props.allowDownload ? react_1.default.createElement("a",
|
|
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
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
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",
|
|
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'),
|
|
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'),
|
|
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'),
|
|
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
|
-
|
|
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'),
|
|
1221
|
-
|
|
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'),
|
|
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'),
|
|
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'),
|
|
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
|
-
|
|
1241
|
+
this.localStorage.removeItem('files.filterByType');
|
|
1247
1242
|
this.setState({ filterByType: '', showTypesMenu: null });
|
|
1248
1243
|
}
|
|
1249
1244
|
else {
|
|
1250
|
-
|
|
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",
|
|
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",
|
|
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
|
-
|
|
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",
|
|
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
|
-
|
|
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
|
-
(
|
|
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({
|
|
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",
|
|
1427
|
-
react_1.default.createElement("div", {
|
|
1428
|
-
react_1.default.createElement(icons_material_1.Publish, {
|
|
1429
|
-
react_1.default.createElement("div", {
|
|
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
|
-
|
|
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,
|
|
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",
|
|
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", {
|
|
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",
|
|
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 }),
|
|
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:
|
|
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", {
|
|
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 ?
|
|
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.
|
|
1650
|
+
exports.FileBrowserClass = FileBrowserClass;
|
|
1651
|
+
exports.default = (0, withWidth_1.default)()(FileBrowserClass);
|