@iobroker/adapter-react-v5 4.10.0 → 4.10.2

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.
@@ -1,2177 +1,1595 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof3 = require("@babel/runtime/helpers/typeof");
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
7
17
  });
8
- exports["default"] = void 0;
9
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
16
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
17
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
18
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
19
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
20
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
21
- var _react = _interopRequireWildcard(require("react"));
22
- var _styles = require("@mui/styles");
23
- var _propTypes = _interopRequireDefault(require("prop-types"));
24
- var _reactDropzone = _interopRequireDefault(require("react-dropzone"));
25
- var _material = require("@mui/material");
26
- var _iconsMaterial = require("@mui/icons-material");
27
- var _Error = _interopRequireDefault(require("../Dialogs/Error"));
28
- var _Utils = _interopRequireDefault(require("./Utils"));
29
- var _TextInput = _interopRequireDefault(require("../Dialogs/TextInput"));
30
- var _IconExpert = _interopRequireDefault(require("../icons/IconExpert"));
31
- var _IconClosed = _interopRequireDefault(require("../icons/IconClosed"));
32
- var _IconOpen = _interopRequireDefault(require("../icons/IconOpen"));
33
- var _IconNoIcon = _interopRequireDefault(require("../icons/IconNoIcon"));
34
- var _withWidth = _interopRequireDefault(require("./withWidth"));
35
- var _FileViewer = _interopRequireWildcard(require("./FileViewer"));
36
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
37
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
38
- function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
39
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /**
40
- * Copyright 2020-2023, Denis Haev <dogafox@gmail.com>
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ /**
30
+ * Copyright 2020-2024, Denis Haev <dogafox@gmail.com>
41
31
  *
42
32
  * MIT License
43
33
  *
44
- * */ // MUI Icons
34
+ * */
35
+ const react_1 = __importStar(require("react"));
36
+ const styles_1 = require("@mui/styles");
37
+ const react_dropzone_1 = __importDefault(require("react-dropzone"));
38
+ const material_1 = require("@mui/material");
39
+ // MUI Icons
40
+ const icons_material_1 = require("@mui/icons-material");
41
+ const Error_1 = __importDefault(require("../Dialogs/Error"));
42
+ const Utils_1 = __importDefault(require("./Utils"));
43
+ const TextInput_1 = __importDefault(require("../Dialogs/TextInput"));
45
44
  // Custom Icons
46
- var ROW_HEIGHT = 32;
47
- var BUTTON_WIDTH = 32;
48
- var TILE_HEIGHT = 120;
49
- var TILE_WIDTH = 64;
50
- var NOT_FOUND = 'Not found';
51
- var FILE_TYPE_ICONS = {
52
- all: _iconsMaterial.InsertDriveFile,
53
- images: _iconsMaterial.Image,
54
- code: _iconsMaterial.Code,
55
- txt: _iconsMaterial.FontDownload,
56
- audio: _iconsMaterial.AudioFile,
57
- video: _iconsMaterial.Videocam
45
+ const IconExpert_1 = __importDefault(require("../icons/IconExpert"));
46
+ const IconClosed_1 = __importDefault(require("../icons/IconClosed"));
47
+ const IconOpen_1 = __importDefault(require("../icons/IconOpen"));
48
+ const IconNoIcon_1 = __importDefault(require("../icons/IconNoIcon"));
49
+ const withWidth_1 = __importDefault(require("./withWidth"));
50
+ const FileViewer_1 = __importStar(require("./FileViewer"));
51
+ const ROW_HEIGHT = 32;
52
+ const BUTTON_WIDTH = 32;
53
+ const TILE_HEIGHT = 120;
54
+ const TILE_WIDTH = 64;
55
+ const NOT_FOUND = 'Not found';
56
+ const FILE_TYPE_ICONS = {
57
+ all: icons_material_1.InsertDriveFile,
58
+ images: icons_material_1.Image,
59
+ code: icons_material_1.Code,
60
+ txt: icons_material_1.FontDownload,
61
+ audio: icons_material_1.AudioFile,
62
+ video: icons_material_1.Videocam,
58
63
  };
59
- var styles = function styles(theme) {
60
- return {
64
+ const styles = (theme) => ({
61
65
  dialog: {
62
- height: "calc(100% - ".concat(theme.mixins.toolbar.minHeight, "px)")
66
+ height: `calc(100% - ${theme.mixins.toolbar.minHeight}px)`,
63
67
  },
64
68
  root: {
65
- width: '100%',
66
- overflow: 'hidden',
67
- height: '100%',
68
- position: 'relative'
69
+ width: '100%',
70
+ overflow: 'hidden',
71
+ height: '100%',
72
+ position: 'relative',
69
73
  },
70
74
  filesDiv: {
71
- width: "calc(100% - ".concat(theme.spacing(2), ")"),
72
- overflowX: 'hidden',
73
- overflowY: 'auto',
74
- padding: theme.spacing(1)
75
+ width: `calc(100% - ${theme.spacing(2)})`,
76
+ overflowX: 'hidden',
77
+ overflowY: 'auto',
78
+ padding: theme.spacing(1),
75
79
  },
76
80
  filesDivHint: {
77
- position: 'absolute',
78
- bottom: 0,
79
- left: 20,
80
- opacity: 0.7,
81
- fontStyle: 'italic',
82
- fontSize: 12
81
+ position: 'absolute',
82
+ bottom: 0,
83
+ left: 20,
84
+ opacity: 0.7,
85
+ fontStyle: 'italic',
86
+ fontSize: 12,
83
87
  },
84
88
  filesDivTable: {
85
- height: "calc(100% - ".concat(48 + parseInt(theme.spacing(1), 10), "px)")
89
+ height: `calc(100% - ${48 + parseInt(theme.spacing(1), 10)}px)`,
86
90
  },
87
91
  filesDivTile: {
88
- height: "calc(100% - ".concat(48 * 2 + parseInt(theme.spacing(1), 10), "px)"),
89
- display: 'flex',
90
- alignContent: 'flex-start',
91
- alignItems: 'stretch',
92
- flexWrap: 'wrap',
93
- flex: "0 0 ".concat(TILE_WIDTH, "px")
92
+ height: `calc(100% - ${48 * 2 + parseInt(theme.spacing(1), 10)}px)`,
93
+ display: 'flex',
94
+ alignContent: 'flex-start',
95
+ alignItems: 'stretch',
96
+ flexWrap: 'wrap',
97
+ flex: `0 0 ${TILE_WIDTH}px`,
94
98
  },
95
99
  itemTile: {
96
- position: 'relative',
97
- userSelect: 'none',
98
- cursor: 'pointer',
99
- height: TILE_HEIGHT,
100
- width: TILE_WIDTH,
101
- display: 'inline-block',
102
- textAlign: 'center',
103
- opacity: 0.1,
104
- transition: 'opacity 1s',
105
- margin: 4,
106
- '&:hover': {
107
- background: theme.palette.secondary.light,
108
- color: _Utils["default"].invertColor(theme.palette.secondary.main, true)
109
- }
100
+ position: 'relative',
101
+ userSelect: 'none',
102
+ cursor: 'pointer',
103
+ height: TILE_HEIGHT,
104
+ width: TILE_WIDTH,
105
+ display: 'inline-block',
106
+ textAlign: 'center',
107
+ opacity: 0.1,
108
+ transition: 'opacity 1s',
109
+ margin: 4,
110
+ '&:hover': {
111
+ background: theme.palette.secondary.light,
112
+ color: Utils_1.default.invertColor(theme.palette.secondary.main, true),
113
+ },
110
114
  },
111
115
  itemNameFolderTile: {
112
- fontWeight: 'bold'
116
+ fontWeight: 'bold',
113
117
  },
114
118
  itemNameTile: {
115
- width: '100%',
116
- height: 32,
117
- overflow: 'hidden',
118
- textOverflow: 'ellipsis',
119
- fontSize: 12,
120
- textAlign: 'center',
121
- wordBreak: 'break-all'
119
+ width: '100%',
120
+ height: 32,
121
+ overflow: 'hidden',
122
+ textOverflow: 'ellipsis',
123
+ fontSize: 12,
124
+ textAlign: 'center',
125
+ wordBreak: 'break-all',
122
126
  },
123
127
  itemFolderIconTile: {
124
- width: '100%',
125
- height: TILE_HEIGHT - 32 - 16 - 8,
126
- // name + size
127
- display: 'block',
128
- paddingLeft: 8,
129
- color: theme.palette.secondary.main || '#fbff7d'
128
+ width: '100%',
129
+ height: TILE_HEIGHT - 32 - 16 - 8, // name + size
130
+ display: 'block',
131
+ paddingLeft: 8,
132
+ color: theme.palette.secondary.main || '#fbff7d',
130
133
  },
131
134
  itemFolderIconBack: {
132
- position: 'absolute',
133
- top: 22,
134
- left: 18,
135
- zIndex: 1,
136
- color: theme.palette.mode === 'dark' ? '#FFF' : '#000'
135
+ position: 'absolute',
136
+ top: 22,
137
+ left: 18,
138
+ zIndex: 1,
139
+ color: theme.palette.mode === 'dark' ? '#FFF' : '#000',
137
140
  },
138
141
  itemSizeTile: {
139
- width: '100%',
140
- height: 16,
141
- textAlign: 'center',
142
- fontSize: 10
142
+ width: '100%',
143
+ height: 16,
144
+ textAlign: 'center',
145
+ fontSize: 10,
143
146
  },
144
147
  itemImageTile: {
145
- width: 'calc(100% - 8px)',
146
- height: TILE_HEIGHT - 32 - 16 - 8,
147
- // name + size
148
- margin: 4,
149
- display: 'block',
150
- textAlign: 'center',
151
- objectFit: 'contain'
148
+ width: 'calc(100% - 8px)',
149
+ height: TILE_HEIGHT - 32 - 16 - 8, // name + size
150
+ margin: 4,
151
+ display: 'block',
152
+ textAlign: 'center',
153
+ objectFit: 'contain',
152
154
  },
153
155
  itemIconTile: {
154
- width: '100%',
155
- height: TILE_HEIGHT - 32 - 16 - 8,
156
- // name + size
157
- display: 'block',
158
- objectFit: 'contain'
156
+ width: '100%',
157
+ height: TILE_HEIGHT - 32 - 16 - 8, // name + size
158
+ display: 'block',
159
+ objectFit: 'contain',
159
160
  },
160
161
  itemSelected: {
161
- background: theme.palette.primary.main,
162
- color: _Utils["default"].invertColor(theme.palette.primary.main, true)
162
+ background: theme.palette.primary.main,
163
+ color: Utils_1.default.invertColor(theme.palette.primary.main, true),
163
164
  },
164
165
  itemTable: {
165
- userSelect: 'none',
166
- cursor: 'pointer',
167
- height: ROW_HEIGHT,
168
- display: 'inline-flex',
169
- lineHeight: "".concat(ROW_HEIGHT, "px"),
170
- '&:hover': {
171
- background: theme.palette.secondary.light,
172
- color: _Utils["default"].invertColor(theme.palette.secondary.main, true)
173
- }
166
+ userSelect: 'none',
167
+ cursor: 'pointer',
168
+ height: ROW_HEIGHT,
169
+ display: 'inline-flex',
170
+ lineHeight: `${ROW_HEIGHT}px`,
171
+ '&:hover': {
172
+ background: theme.palette.secondary.light,
173
+ color: Utils_1.default.invertColor(theme.palette.secondary.main, true),
174
+ },
174
175
  },
175
176
  itemNameTable: {
176
- display: 'inline-block',
177
- paddingLeft: 10,
178
- fontSize: '1rem',
179
- verticalAlign: 'top',
180
- flexGrow: 1
177
+ display: 'inline-block',
178
+ paddingLeft: 10,
179
+ fontSize: '1rem',
180
+ verticalAlign: 'top',
181
+ flexGrow: 1,
181
182
  },
182
183
  itemNameFolderTable: {
183
- fontWeight: 'bold'
184
+ fontWeight: 'bold',
184
185
  },
185
186
  itemSizeTable: {
186
- display: 'inline-block',
187
- width: 60,
188
- verticalAlign: 'top',
189
- textAlign: 'right'
187
+ display: 'inline-block',
188
+ width: 60,
189
+ verticalAlign: 'top',
190
+ textAlign: 'right',
190
191
  },
191
192
  itemAccessTable: {
192
- // display: 'inline-block',
193
- verticalAlign: 'top',
194
- width: 60,
195
- textAlign: 'right',
196
- paddingRight: 5,
197
- display: 'flex',
198
- justifyContent: 'center'
193
+ // display: 'inline-block',
194
+ verticalAlign: 'top',
195
+ width: 60,
196
+ textAlign: 'right',
197
+ paddingRight: 5,
198
+ display: 'flex',
199
+ justifyContent: 'center',
199
200
  },
200
201
  itemImageTable: {
201
- display: 'inline-block',
202
- width: 30,
203
- marginTop: 1,
204
- objectFit: 'contain',
205
- maxHeight: 30
202
+ display: 'inline-block',
203
+ width: 30,
204
+ marginTop: 1,
205
+ objectFit: 'contain',
206
+ maxHeight: 30,
206
207
  },
207
208
  itemIconTable: {
208
- display: 'inline-block',
209
- marginTop: 1,
210
- width: 30,
211
- height: 30
209
+ display: 'inline-block',
210
+ marginTop: 1,
211
+ width: 30,
212
+ height: 30,
212
213
  },
213
214
  itemFolderTable: {},
214
215
  itemFolderTemp: {
215
- opacity: 0.4
216
+ opacity: 0.4,
216
217
  },
217
218
  itemFolderIconTable: {
218
- marginTop: 1,
219
- marginLeft: theme.spacing(1),
220
- display: 'inline-block',
221
- width: 30,
222
- height: 30,
223
- color: theme.palette.secondary.main || '#fbff7d'
219
+ marginTop: 1,
220
+ marginLeft: theme.spacing(1),
221
+ display: 'inline-block',
222
+ width: 30,
223
+ height: 30,
224
+ color: theme.palette.secondary.main || '#fbff7d',
224
225
  },
225
226
  itemDownloadButtonTable: {
226
- display: 'inline-block',
227
- width: BUTTON_WIDTH,
228
- height: ROW_HEIGHT,
229
- minWidth: BUTTON_WIDTH,
230
- verticalAlign: 'middle',
231
- textAlign: 'center',
232
- padding: 0,
233
- borderRadius: BUTTON_WIDTH / 2,
234
- '&:hover': {
235
- backgroundColor: theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.08)'
236
- },
237
- '& span': {
238
- paddingTop: 9
239
- },
240
- '& svg': {
241
- width: 14,
242
- height: 14,
243
- fontSize: '1rem',
244
- marginTop: -3,
227
+ display: 'inline-block',
228
+ width: BUTTON_WIDTH,
229
+ height: ROW_HEIGHT,
230
+ minWidth: BUTTON_WIDTH,
245
231
  verticalAlign: 'middle',
246
- color: theme.palette.mode === 'dark' ? '#EEE' : '#111'
247
- }
232
+ textAlign: 'center',
233
+ padding: 0,
234
+ borderRadius: BUTTON_WIDTH / 2,
235
+ '&:hover': {
236
+ backgroundColor: theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.08)',
237
+ },
238
+ '& span': {
239
+ paddingTop: 9,
240
+ },
241
+ '& svg': {
242
+ width: 14,
243
+ height: 14,
244
+ fontSize: '1rem',
245
+ marginTop: -3,
246
+ verticalAlign: 'middle',
247
+ color: theme.palette.mode === 'dark' ? '#EEE' : '#111',
248
+ },
248
249
  },
249
250
  itemDownloadEmptyTable: {
250
- display: 'inline-block',
251
- width: BUTTON_WIDTH,
252
- height: ROW_HEIGHT,
253
- minWidth: BUTTON_WIDTH,
254
- padding: 0
251
+ display: 'inline-block',
252
+ width: BUTTON_WIDTH,
253
+ height: ROW_HEIGHT,
254
+ minWidth: BUTTON_WIDTH,
255
+ padding: 0,
255
256
  },
256
257
  itemAclButtonTable: {
257
- width: BUTTON_WIDTH,
258
- height: ROW_HEIGHT,
259
- minWidth: BUTTON_WIDTH,
260
- verticalAlign: 'top',
261
- padding: 0,
262
- fontSize: 12,
263
- display: 'flex'
258
+ width: BUTTON_WIDTH,
259
+ height: ROW_HEIGHT,
260
+ minWidth: BUTTON_WIDTH,
261
+ verticalAlign: 'top',
262
+ padding: 0,
263
+ fontSize: 12,
264
+ display: 'flex',
264
265
  },
265
266
  itemDeleteButtonTable: {
266
- display: 'inline-block',
267
- width: BUTTON_WIDTH,
268
- height: ROW_HEIGHT,
269
- minWidth: BUTTON_WIDTH,
270
- verticalAlign: 'top',
271
- padding: 0,
272
- '& svg': {
273
- width: 18,
274
- height: 18,
275
- fontSize: '1.5rem'
276
- }
267
+ display: 'inline-block',
268
+ width: BUTTON_WIDTH,
269
+ height: ROW_HEIGHT,
270
+ minWidth: BUTTON_WIDTH,
271
+ verticalAlign: 'top',
272
+ padding: 0,
273
+ '& svg': {
274
+ width: 18,
275
+ height: 18,
276
+ fontSize: '1.5rem',
277
+ },
277
278
  },
278
279
  uploadDiv: {
279
- top: 0,
280
- zIndex: 1,
281
- bottom: 0,
282
- left: 0,
283
- right: 0,
284
- position: 'absolute',
285
- opacity: 0.9,
286
- textAlign: 'center',
287
- background: '#FFFFFF'
280
+ top: 0,
281
+ zIndex: 1,
282
+ bottom: 0,
283
+ left: 0,
284
+ right: 0,
285
+ position: 'absolute',
286
+ opacity: 0.9,
287
+ textAlign: 'center',
288
+ background: '#FFFFFF',
288
289
  },
289
290
  uploadDivDragging: {
290
- opacity: 1
291
+ opacity: 1,
291
292
  },
292
293
  uploadCenterDiv: {
293
- margin: 20,
294
- border: '3px dashed grey',
295
- borderRadius: 30,
296
- width: 'calc(100% - 40px)',
297
- height: 'calc(100% - 40px)',
298
- position: 'relative',
299
- color: theme.palette.mode === 'dark' ? '#222' : '#CCC',
300
- display: 'flex',
301
- alignItems: 'center',
302
- justifyContent: 'center'
294
+ margin: 20,
295
+ border: '3px dashed grey',
296
+ borderRadius: 30,
297
+ width: 'calc(100% - 40px)',
298
+ height: 'calc(100% - 40px)',
299
+ position: 'relative',
300
+ color: theme.palette.mode === 'dark' ? '#222' : '#CCC',
301
+ display: 'flex',
302
+ alignItems: 'center',
303
+ justifyContent: 'center',
303
304
  },
304
305
  uploadCenterIcon: {
305
- width: '25%',
306
- height: '25%'
306
+ width: '25%',
307
+ height: '25%',
307
308
  },
308
309
  uploadCenterText: {
309
- fontSize: 24,
310
- fontWeight: 'bold'
310
+ fontSize: 24,
311
+ fontWeight: 'bold',
311
312
  },
312
313
  uploadCloseButton: {
313
- zIndex: 2,
314
- position: 'absolute',
315
- top: 30,
316
- right: 30
314
+ zIndex: 2,
315
+ position: 'absolute',
316
+ top: 30,
317
+ right: 30,
317
318
  },
318
319
  uploadCenterTextAndIcon: {
319
- position: 'absolute',
320
- height: '30%',
321
- width: '100%',
322
- margin: 'auto',
323
- opacity: 0.3
320
+ position: 'absolute',
321
+ height: '30%',
322
+ width: '100%',
323
+ margin: 'auto',
324
+ opacity: 0.3,
324
325
  },
325
326
  menuButtonExpertActive: {
326
- color: '#c00000'
327
+ color: '#c00000',
327
328
  },
328
329
  menuButtonRestrictActive: {
329
- color: '#c05000'
330
+ color: '#c05000',
330
331
  },
331
332
  pathDiv: {
332
- display: 'flex',
333
- width: "calc(100% - ".concat(theme.spacing(2), ")"),
334
- marginLeft: theme.spacing(1),
335
- marginRight: theme.spacing(1),
336
- textOverflow: 'clip',
337
- overflow: 'hidden',
338
- whiteSpace: 'nowrap',
339
- backgroundColor: theme.palette.secondary.main
333
+ display: 'flex',
334
+ width: `calc(100% - ${theme.spacing(2)})`,
335
+ marginLeft: theme.spacing(1),
336
+ marginRight: theme.spacing(1),
337
+ textOverflow: 'clip',
338
+ overflow: 'hidden',
339
+ whiteSpace: 'nowrap',
340
+ backgroundColor: theme.palette.secondary.main,
340
341
  },
341
342
  pathDivInput: {
342
- width: '100%'
343
+ width: '100%',
343
344
  },
344
345
  pathDivBreadcrumbDir: {
345
- paddingLeft: 2,
346
- paddingRight: 2,
347
- cursor: 'pointer',
348
- '&:hover': {
349
- background: theme.palette.primary.main
350
- }
346
+ paddingLeft: 2,
347
+ paddingRight: 2,
348
+ cursor: 'pointer',
349
+ '&:hover': {
350
+ background: theme.palette.primary.main,
351
+ },
351
352
  },
352
353
  backgroundImageLight: {
353
- background: 'white'
354
+ background: 'white',
354
355
  },
355
356
  backgroundImageDark: {
356
- background: 'black'
357
+ background: 'black',
357
358
  },
358
359
  backgroundImageColored: {
359
- background: 'silver'
360
+ background: 'silver',
360
361
  },
361
362
  '@media screen and (max-width: 500px)': {
362
- itemNameTable: {
363
- whiteSpace: 'nowrap',
364
- overflow: 'hidden',
365
- textOverflow: 'ellipsis',
366
- textAlign: 'end',
367
- direction: 'rtl'
368
- }
363
+ itemNameTable: {
364
+ whiteSpace: 'nowrap',
365
+ overflow: 'hidden',
366
+ textOverflow: 'ellipsis',
367
+ textAlign: 'end',
368
+ direction: 'rtl',
369
+ },
369
370
  },
370
371
  specialFolder: {
371
- color: theme.palette.mode === 'dark' ? '#229b0f' : '#5dd300'
372
- }
373
- };
374
- };
375
- var USER_DATA = '0_userdata.0';
372
+ color: theme.palette.mode === 'dark' ? '#229b0f' : '#5dd300',
373
+ },
374
+ });
375
+ const USER_DATA = '0_userdata.0';
376
376
  function sortFolders(a, b) {
377
- if (a.folder && b.folder) {
378
- return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
379
- }
380
- if (a.folder) {
381
- return -1;
382
- }
383
- if (b.folder) {
384
- return 1;
385
- }
386
- return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
377
+ if (a.folder && b.folder) {
378
+ return a.name > b.name ? 1 : (a.name < b.name ? -1 : 0);
379
+ }
380
+ if (a.folder) {
381
+ return -1;
382
+ }
383
+ if (b.folder) {
384
+ return 1;
385
+ }
386
+ return a.name > b.name ? 1 : (a.name < b.name ? -1 : 0);
387
387
  }
388
388
  function getParentDir(dir) {
389
- var parts = (dir || '').split('/');
390
- parts.length && parts.pop();
391
- return parts.join('/');
389
+ const parts = (dir || '').split('/');
390
+ parts.length && parts.pop();
391
+ return parts.join('/');
392
392
  }
393
393
  function isFile(path) {
394
- var ext = _Utils["default"].getFileExtension(path);
395
- return !!(ext && ext.toLowerCase().match(/[a-z]+/) && ext.length < 5);
394
+ const ext = Utils_1.default.getFileExtension(path);
395
+ return !!((ext === null || ext === void 0 ? void 0 : ext.toLowerCase().match(/[a-z]+/)) && ext.length < 5);
396
396
  }
397
- var TABLE = 'Table';
398
- var TILE = 'Tile';
399
-
397
+ const TABLE = 'Table';
398
+ const TILE = 'Tile';
400
399
  /**
401
400
  * @extends {React.Component<import('./types').FileBrowserProps>}
402
401
  */
403
- var FileBrowser = /*#__PURE__*/function (_Component) {
404
- (0, _inherits2["default"])(FileBrowser, _Component);
405
- /**
406
- * @param {Readonly<import("./types").FileBrowserProps>} props
407
- */
408
- function FileBrowser(props) {
409
- var _this;
410
- (0, _classCallCheck2["default"])(this, FileBrowser);
411
- _this = _callSuper(this, FileBrowser, [props]);
412
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onFileChange", function (id, fileName, size) {
413
- var key = "".concat(id, "/").concat(fileName);
414
- var pos = key.lastIndexOf('/');
415
- var folder = key.substring(0, pos);
416
- console.log("File changed ".concat(key, "[").concat(size, "]"));
417
- if (_this.state.folders[folder]) {
418
- _this._tempTimeout[folder] && clearTimeout(_this._tempTimeout[folder]);
419
- _this._tempTimeout[folder] = setTimeout(function () {
420
- delete _this._tempTimeout[folder];
421
- _this.browseFolder(folder, true).then(function (folders) {
422
- return _this.setState({
423
- folders: folders
402
+ class FileBrowser extends react_1.Component {
403
+ constructor(props) {
404
+ super(props);
405
+ this.limitToObjectID = null;
406
+ this.limitToPath = null;
407
+ this.lastSelect = null;
408
+ this.setOpacityTimer = null;
409
+ this.cacheFoldersTimeout = null;
410
+ this.foldersLoading = null;
411
+ this.cacheFolders = null;
412
+ this.onFileChange = (id, fileName, size) => {
413
+ const key = `${id}/${fileName}`;
414
+ const pos = key.lastIndexOf('/');
415
+ const folder = key.substring(0, pos);
416
+ console.log(`File changed ${key}[${size}]`);
417
+ if (this.state.folders[folder]) {
418
+ this._tempTimeout[folder] && clearTimeout(this._tempTimeout[folder]);
419
+ this._tempTimeout[folder] = setTimeout(() => {
420
+ delete this._tempTimeout[folder];
421
+ this.browseFolder(folder, null, false, true)
422
+ .then(folders => this.setState({ folders }));
423
+ }, 300);
424
+ }
425
+ };
426
+ this.setStateBackgroundImage = () => {
427
+ const array = ['light', 'dark', 'colored', 'delete'];
428
+ this.setState(({ backgroundImage }) => {
429
+ if (array.indexOf(backgroundImage) !== -1 && array.length - 1 !== array.indexOf(backgroundImage)) {
430
+ (window._localStorage || window.localStorage).setItem('files.backgroundImage', array[array.indexOf(backgroundImage) + 1]);
431
+ return { backgroundImage: array[array.indexOf(backgroundImage) + 1] };
432
+ }
433
+ (window._localStorage || window.localStorage).setItem('files.backgroundImage', array[0]);
434
+ return { backgroundImage: array[0] };
424
435
  });
425
- });
426
- }, 300);
427
- }
428
- });
429
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "setStateBackgroundImage", function () {
430
- var array = ['light', 'dark', 'colored', 'delete'];
431
- _this.setState(function (_ref) {
432
- var backgroundImage = _ref.backgroundImage;
433
- if (array.indexOf(backgroundImage) !== -1 && array.length - 1 !== array.indexOf(backgroundImage)) {
434
- (window._localStorage || window.localStorage).setItem('files.backgroundImage', array[array.indexOf(backgroundImage) + 1]);
435
- return {
436
- backgroundImage: array[array.indexOf(backgroundImage) + 1]
437
- };
436
+ };
437
+ this.getClassBackgroundImage = () => {
438
+ // ['light', 'dark', 'colored', 'delete']
439
+ switch (this.state.backgroundImage) {
440
+ case 'light':
441
+ return this.props.classes.backgroundImageLight;
442
+ case 'dark':
443
+ return this.props.classes.backgroundImageDark;
444
+ case 'colored':
445
+ return this.props.classes.backgroundImageColored;
446
+ case 'delete':
447
+ return null;
448
+ default:
449
+ return null;
450
+ }
451
+ };
452
+ let expandedStr = (window._localStorage || window.localStorage).getItem('files.expanded') || '[]';
453
+ if (this.props.limitPath) {
454
+ const parts = this.props.limitPath.split('/');
455
+ this.limitToObjectID = parts[0];
456
+ this.limitToPath = !parts.length ? null : (parts.length === 1 && parts[0] === '' ? null : parts.join('/'));
457
+ if (this.limitToPath && this.limitToPath.endsWith('/')) {
458
+ this.limitToPath.substring(0, this.limitToPath.length - 1);
459
+ }
460
+ }
461
+ let expanded;
462
+ try {
463
+ expanded = JSON.parse(expandedStr);
464
+ if (this.limitToPath) {
465
+ expanded = expanded.filter(id => { var _a; return id.startsWith(`${this.limitToPath}/`) || id === this.limitToPath || ((_a = this.limitToPath) === null || _a === void 0 ? void 0 : _a.startsWith(`${id}/`)); });
466
+ }
467
+ }
468
+ catch (e) {
469
+ expanded = [];
470
+ }
471
+ let viewType;
472
+ if (this.props.showViewTypeButton) {
473
+ viewType = (window._localStorage || window.localStorage).getItem('files.viewType') || TABLE;
474
+ }
475
+ else {
476
+ viewType = TABLE;
477
+ }
478
+ let selected = this.props.selected || (window._localStorage || window.localStorage).getItem('files.selected') || USER_DATA;
479
+ let currentDir = '';
480
+ if (props.restrictToFolder) {
481
+ selected = props.restrictToFolder;
482
+ currentDir = props.restrictToFolder;
483
+ const parts = props.restrictToFolder.split('/');
484
+ expanded = [];
485
+ let path = '';
486
+ for (let i = 0; i < parts.length; i++) {
487
+ path += (path ? '/' : '') + parts[i];
488
+ expanded.push(path);
489
+ }
490
+ }
491
+ else {
492
+ // TODO: Now we do not support multiple selection
493
+ if (Array.isArray(selected)) {
494
+ selected = selected[0];
495
+ }
496
+ if (isFile(selected)) {
497
+ currentDir = getParentDir(selected);
498
+ }
499
+ else {
500
+ currentDir = selected;
501
+ }
438
502
  }
439
- (window._localStorage || window.localStorage).setItem('files.backgroundImage', array[0]);
440
- return {
441
- backgroundImage: array[0]
503
+ const backgroundImage = (window._localStorage || window.localStorage).getItem('files.backgroundImage') || null;
504
+ this.state = {
505
+ viewType,
506
+ folders: {},
507
+ filterEmpty: (window._localStorage || window.localStorage).getItem('files.empty') !== 'false',
508
+ expanded,
509
+ currentDir,
510
+ expertMode: !!props.expertMode,
511
+ addFolder: false,
512
+ uploadFile: false,
513
+ deleteItem: '',
514
+ // marked: [],
515
+ viewer: '',
516
+ formatEditFile: '',
517
+ path: selected,
518
+ selected,
519
+ errorText: '',
520
+ modalEditOfAccess: false,
521
+ backgroundImage,
522
+ queueLength: 0,
523
+ loadAllFolders: false,
524
+ // allFoldersLoaded: false,
525
+ fileErrors: [],
526
+ filterByType: props.filterByType || window.localStorage.getItem('files.filterByType') || '',
527
+ showTypesMenu: null,
528
+ restrictToFolder: props.restrictToFolder || '',
529
+ pathFocus: false,
442
530
  };
443
- });
444
- });
445
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getClassBackgroundImage", function () {
446
- // ['light', 'dark', 'colored', 'delete']
447
- switch (_this.state.backgroundImage) {
448
- case 'light':
449
- return _this.props.classes.backgroundImageLight;
450
- case 'dark':
451
- return _this.props.classes.backgroundImageDark;
452
- case 'colored':
453
- return _this.props.classes.backgroundImageColored;
454
- case 'delete':
455
- return null;
456
- default:
457
- return null;
458
- }
459
- });
460
- var expanded = (window._localStorage || window.localStorage).getItem('files.expanded') || '[]';
461
- if (_this.props.limitPath) {
462
- var parts = _this.props.limitPath.split('/');
463
- _this.limitToObjectID = parts[0];
464
- _this.limitToPath = !parts.length ? null : parts.length === 1 && parts[0] === '' ? null : parts.join('/');
465
- if (_this.limitToPath && _this.limitToPath.endsWith('/')) {
466
- _this.limitToPath.substring(0, _this.limitToPath.length - 1);
467
- }
531
+ this.imagePrefix = this.props.imagePrefix || './files/';
532
+ this.levelPadding = this.props.levelPadding || 20;
533
+ this.mounted = true;
534
+ this.suppressDeleteConfirm = 0;
535
+ this.browseList = [];
536
+ this.browseListRunning = false;
537
+ this.initialReadFinished = false;
538
+ this.supportSubscribes = null;
539
+ this._tempTimeout = {};
468
540
  }
469
- try {
470
- expanded = JSON.parse(expanded);
471
- if (_this.limitToPath) {
472
- expanded = expanded.filter(function (id) {
473
- return id.startsWith("".concat(_this.limitToPath, "/")) || id === _this.limitToPath || _this.limitToPath.startsWith("".concat(id, "/"));
474
- });
475
- }
476
- } catch (e) {
477
- expanded = [];
478
- }
479
- var viewType;
480
- if (_this.props.showViewTypeButton) {
481
- viewType = (window._localStorage || window.localStorage).getItem('files.viewType') || TABLE;
482
- } else {
483
- viewType = TABLE;
484
- }
485
- var selected = _this.props.selected || (window._localStorage || window.localStorage).getItem('files.selected') || USER_DATA;
486
- var currentDir = '';
487
- if (props.restrictToFolder) {
488
- selected = props.restrictToFolder;
489
- currentDir = props.restrictToFolder;
490
- var _parts = props.restrictToFolder.split('/');
491
- expanded = [];
492
- var path = '';
493
- for (var i = 0; i < _parts.length; i++) {
494
- path += (path ? '/' : '') + _parts[i];
495
- expanded.push(path);
496
- }
497
- } else {
498
- // TODO: Now we do not support multiple selection
499
- if (Array.isArray(selected)) {
500
- selected = selected[0];
501
- }
502
- if (isFile(selected)) {
503
- currentDir = getParentDir(selected);
504
- } else {
505
- currentDir = selected;
506
- }
541
+ static getDerivedStateFromProps(props, state) {
542
+ if (props.expertMode !== undefined && props.expertMode !== state.expertMode) {
543
+ return { expertMode: props.expertMode, loadAllFolders: true };
544
+ }
545
+ return null;
507
546
  }
508
- var _backgroundImage = (window._localStorage || window.localStorage).getItem('files.backgroundImage') || null;
509
- _this.state = {
510
- viewType: viewType,
511
- folders: {},
512
- filterEmpty: (window._localStorage || window.localStorage).getItem('files.empty') !== 'false',
513
- expanded: expanded,
514
- currentDir: currentDir,
515
- expertMode: _this.props.expertMode,
516
- addFolder: false,
517
- uploadFile: false,
518
- deleteItem: '',
519
- // marked: [],
520
- viewer: '',
521
- formatEditFile: '',
522
- path: selected,
523
- selected: selected,
524
- errorText: '',
525
- modalEditOfAccess: false,
526
- backgroundImage: _backgroundImage,
527
- queueLength: 0,
528
- loadAllFolders: false,
529
- // allFoldersLoaded: false,
530
- fileErrors: [],
531
- filterByType: props.filterByType || window.localStorage.getItem('files.filterByType') || '',
532
- showTypesMenu: null,
533
- restrictToFolder: props.restrictToFolder || ''
534
- };
535
- _this.imagePrefix = _this.props.imagePrefix || './files/';
536
- _this.levelPadding = _this.props.levelPadding || 20;
537
- _this.mounted = true;
538
- _this.suppressDeleteConfirm = 0;
539
- _this.browseList = [];
540
- _this.browseListRunning = false;
541
- _this.initialReadFinished = false;
542
- _this.supportSubscribes = null;
543
- _this._tempTimeout = {};
544
- return _this;
545
- }
546
- (0, _createClass2["default"])(FileBrowser, [{
547
- key: "loadFolders",
548
- value: function () {
549
- var _loadFolders = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
550
- var _this2 = this;
551
- var folders;
552
- return _regenerator["default"].wrap(function _callee$(_context) {
553
- while (1) switch (_context.prev = _context.next) {
554
- case 0:
555
- this.initialReadFinished = false;
556
- _context.next = 3;
557
- return this.browseFolder('/');
558
- case 3:
559
- folders = _context.sent;
560
- if (!(this.state.viewType === TABLE)) {
561
- _context.next = 10;
562
- break;
563
- }
564
- _context.next = 7;
565
- return this.browseFolders((0, _toConsumableArray2["default"])(this.state.expanded), folders);
566
- case 7:
567
- folders = _context.sent;
568
- _context.next = 14;
569
- break;
570
- case 10:
571
- if (!(this.state.currentDir && this.state.currentDir !== '/' && (!this.limitToObjectID || this.state.currentDir.startsWith(this.limitToObjectID)))) {
572
- _context.next = 14;
573
- break;
574
- }
575
- _context.next = 13;
576
- return this.browseFolder(this.state.currentDir, folders);
577
- case 13:
578
- folders = _context.sent;
579
- case 14:
580
- this.setState({
581
- folders: folders
582
- }, function () {
583
- if (_this2.state.viewType === TABLE && !_this2.findItem(_this2.state.selected)) {
584
- var parts = _this2.state.selected.split('/');
585
- while (parts.length && !_this2.findItem(parts.join('/'))) {
547
+ async loadFolders() {
548
+ this.initialReadFinished = false;
549
+ let folders = (await this.browseFolder('/'));
550
+ if (this.state.viewType === TABLE) {
551
+ folders = (await this.browseFolders([...this.state.expanded], folders));
552
+ }
553
+ else if (this.state.currentDir &&
554
+ this.state.currentDir !== '/' &&
555
+ (!this.limitToObjectID || this.state.currentDir.startsWith(this.limitToObjectID))) {
556
+ folders = (await this.browseFolder(this.state.currentDir, folders));
557
+ }
558
+ this.setState({ folders }, () => {
559
+ if (this.state.viewType === TABLE && !this.findItem(this.state.selected)) {
560
+ const parts = this.state.selected.split('/');
561
+ while (parts.length && !this.findItem(parts.join('/'))) {
586
562
  parts.pop();
587
- }
588
- var selected;
589
- if (parts.length) {
563
+ }
564
+ let selected;
565
+ if (parts.length) {
590
566
  selected = parts.join('/');
591
- } else {
567
+ }
568
+ else {
592
569
  selected = USER_DATA;
593
- }
594
- _this2.setState({
595
- selected: selected,
596
- path: selected,
597
- pathFocus: false
598
- }, function () {
599
- return _this2.scrollToSelected();
600
- });
601
- } else {
602
- _this2.scrollToSelected();
603
570
  }
604
- _this2.initialReadFinished = true;
605
- });
606
- case 15:
607
- case "end":
608
- return _context.stop();
609
- }
610
- }, _callee, this);
611
- }));
612
- function loadFolders() {
613
- return _loadFolders.apply(this, arguments);
614
- }
615
- return loadFolders;
616
- }()
617
- }, {
618
- key: "scrollToSelected",
619
- value: function scrollToSelected() {
620
- if (this.mounted) {
621
- var el = document.getElementById(this.state.selected);
622
- el && el.scrollIntoView();
623
- }
624
- }
625
- }, {
626
- key: "componentDidMount",
627
- value: function componentDidMount() {
628
- var _this3 = this;
629
- this.mounted = true;
630
- this.loadFolders();
631
- return this.props.socket.checkFeatureSupported('BINARY_STATE_EVENT').then(function (result) {
632
- _this3.supportSubscribes = result;
633
- _this3.supportSubscribes && _this3.props.socket.subscribeFiles('*', '*', _this3.onFileChange);
634
- });
571
+ this.setState({ selected, path: selected, pathFocus: false }, () => this.scrollToSelected());
572
+ }
573
+ else {
574
+ this.scrollToSelected();
575
+ }
576
+ this.initialReadFinished = true;
577
+ });
635
578
  }
636
- }, {
637
- key: "componentWillUnmount",
638
- value: function componentWillUnmount() {
639
- this.supportSubscribes && this.props.socket.unsubscribeFiles('*', '*', this.onFileChange);
640
- this.mounted = false;
641
- this.browseList = null;
642
- this.browseListRunning = false;
643
- Object.values(this._tempTimeout).forEach(function (timer) {
644
- return timer && clearTimeout(timer);
645
- });
646
- this._tempTimeout = {};
579
+ scrollToSelected() {
580
+ if (this.mounted) {
581
+ const el = document.getElementById(this.state.selected);
582
+ el && el.scrollIntoView();
583
+ }
647
584
  }
648
- }, {
649
- key: "browseFolders",
650
- value: function browseFolders(foldersList, _newFolders, _resolve) {
651
- var _this4 = this;
652
- if (!_newFolders) {
653
- _newFolders = {};
654
- Object.keys(this.state.folders).forEach(function (folder) {
655
- return _newFolders[folder] = _this4.state.folders[folder];
656
- });
657
- }
658
- if (!_resolve) {
659
- return new Promise(function (resolve) {
660
- _this4.browseFolders(foldersList, _newFolders, resolve);
585
+ componentDidMount() {
586
+ this.mounted = true;
587
+ this.loadFolders();
588
+ return this.props.socket.checkFeatureSupported('BINARY_STATE_EVENT')
589
+ .then(result => {
590
+ this.supportSubscribes = result;
591
+ this.supportSubscribes && this.props.socket.subscribeFiles('*', '*', this.onFileChange);
661
592
  });
662
- }
663
- if (!foldersList || !foldersList.length) {
664
- return _resolve(_newFolders);
665
- }
666
- return this.browseFolder(foldersList.shift(), _newFolders).then(function () {
667
- return setTimeout(function () {
668
- return _this4.browseFolders(foldersList, _newFolders, _resolve);
669
- }, 0);
670
- })["catch"](function () {
671
- return setTimeout(function () {
672
- return _this4.browseFolders(foldersList, _newFolders, _resolve);
673
- }, 0);
674
- });
675
593
  }
676
- }, {
677
- key: "readDirSerial",
678
- value: function readDirSerial(adapter, relPath) {
679
- var _this5 = this;
680
- return new Promise(function (resolve, reject) {
681
- if (_this5.browseList) {
682
- // if component still mounted
683
- _this5.browseList.push({
684
- resolve: resolve,
685
- reject: reject,
686
- adapter: adapter,
687
- relPath: relPath
688
- });
689
- !_this5.browseListRunning && _this5.processBrowseList();
690
- }
691
- });
594
+ componentWillUnmount() {
595
+ this.supportSubscribes && this.props.socket.unsubscribeFiles('*', '*', this.onFileChange);
596
+ this.mounted = false;
597
+ this.browseList = null;
598
+ this.browseListRunning = false;
599
+ Object.values(this._tempTimeout)
600
+ .forEach(timer => timer && clearTimeout(timer));
601
+ this._tempTimeout = {};
692
602
  }
693
- }, {
694
- key: "processBrowseList",
695
- value: function processBrowseList(level) {
696
- var _this6 = this;
697
- if (!this.browseListRunning && this.browseList && this.browseList.length) {
698
- this.browseListRunning = true;
699
- if (this.browseList.length > 10) {
700
- // not too often
701
- if (!(this.browseList.length % 10)) {
702
- this.setState({
703
- queueLength: this.browseList.length
704
- });
705
- }
706
- } else {
707
- this.setState({
708
- queueLength: this.browseList.length
709
- });
603
+ browseFoldersCb(foldersList, newFoldersNotNull, cb) {
604
+ if (!(foldersList === null || foldersList === void 0 ? void 0 : foldersList.length)) {
605
+ cb(newFoldersNotNull);
710
606
  }
711
- this.browseList[0].processing = true;
712
- this.props.socket.readDir(this.browseList[0].adapter, this.browseList[0].relPath).then(function (files) {
713
- if (_this6.browseList) {
714
- // if component still mounted
715
- var item = _this6.browseList.shift();
716
- if (item) {
717
- var resolve = item.resolve;
718
- item.resolve = null;
719
- item.reject = null;
720
- item.adapter = null;
721
- item.relPath = null;
722
- resolve(files);
723
- _this6.browseListRunning = false;
724
- if (_this6.browseList.length) {
725
- if (level < 5) {
726
- _this6.processBrowseList(level + 1);
727
- } else {
728
- setTimeout(function () {
729
- return _this6.processBrowseList(0);
730
- }, 0);
731
- }
732
- } else {
733
- _this6.setState({
734
- queueLength: 0
607
+ else {
608
+ const folder = foldersList.shift();
609
+ if (folder) {
610
+ this.browseFolder(folder, newFoldersNotNull)
611
+ .catch((e) => console.error(`Cannot read folder ${folder}: ${e}`))
612
+ .then(() => {
613
+ setTimeout(() => this.browseFoldersCb(foldersList, newFoldersNotNull, cb), 0);
735
614
  });
736
- }
737
- } else {
738
- _this6.setState({
739
- queueLength: 0
740
- });
741
615
  }
742
- }
743
- })["catch"](function (e) {
744
- if (_this6.browseList) {
745
- // if component still mounted
746
- var item = _this6.browseList.shift();
747
- if (item) {
748
- var reject = item.reject;
749
- item.resolve = null;
750
- item.reject = null;
751
- item.adapter = null;
752
- item.relPath = null;
753
- reject(e);
754
- _this6.browseListRunning = false;
755
- if (_this6.browseList.length) {
756
- if (level < 5) {
757
- _this6.processBrowseList(level + 1);
758
- } else {
759
- setTimeout(function () {
760
- return _this6.processBrowseList(0);
761
- }, 0);
762
- }
763
- } else {
764
- _this6.setState({
765
- queueLength: 0
766
- });
767
- }
768
- } else {
769
- _this6.setState({
770
- queueLength: 0
771
- });
616
+ else {
617
+ setTimeout(() => this.browseFoldersCb(foldersList, newFoldersNotNull, cb), 0);
772
618
  }
773
- }
619
+ }
620
+ }
621
+ browseFolders(foldersList, _newFolders) {
622
+ let newFoldersNotNull;
623
+ if (!_newFolders) {
624
+ newFoldersNotNull = {};
625
+ Object.keys(this.state.folders).forEach(folder => newFoldersNotNull[folder] = this.state.folders[folder]);
626
+ }
627
+ else {
628
+ newFoldersNotNull = _newFolders;
629
+ }
630
+ if (!(foldersList === null || foldersList === void 0 ? void 0 : foldersList.length)) {
631
+ return Promise.resolve(newFoldersNotNull);
632
+ }
633
+ return new Promise(resolve => {
634
+ this.browseFoldersCb(foldersList, newFoldersNotNull, resolve);
774
635
  });
775
- }
776
636
  }
777
- }, {
778
- key: "browseFolder",
779
- value: function browseFolder(folderId, _newFolders, _checkEmpty, force) {
780
- var _this7 = this;
781
- if (typeof _newFolders === 'boolean') {
782
- force = _newFolders;
783
- _newFolders = null;
784
- }
785
- if (!_newFolders) {
786
- _newFolders = {};
787
- Object.keys(this.state.folders).forEach(function (folder) {
788
- return _newFolders[folder] = _this7.state.folders[folder];
637
+ readDirSerial(adapter, relPath) {
638
+ return new Promise((resolve, reject) => {
639
+ if (this.browseList) { // if component still mounted
640
+ this.browseList.push({
641
+ resolve: resolve,
642
+ reject,
643
+ adapter,
644
+ relPath,
645
+ });
646
+ !this.browseListRunning && this.processBrowseList();
647
+ }
789
648
  });
790
- }
791
- if (_newFolders[folderId] && !force) {
792
- if (!_checkEmpty) {
793
- return new Promise(function (resolve, reject) {
794
- Promise.all(_newFolders[folderId].filter(function (item) {
795
- return item.folder;
796
- }).map(function (item) {
797
- return _this7.browseFolder(item.id, _newFolders, true)["catch"](function () {});
798
- })).then(function () {
799
- return resolve(_newFolders);
800
- })["catch"](function (error) {
801
- return reject(error);
649
+ }
650
+ processBrowseList(level = 0) {
651
+ if (!this.browseListRunning && this.browseList && this.browseList.length) {
652
+ this.browseListRunning = true;
653
+ if (this.browseList.length > 10) {
654
+ // not too often
655
+ if (!(this.browseList.length % 10)) {
656
+ this.setState({ queueLength: this.browseList.length });
657
+ }
658
+ }
659
+ else {
660
+ this.setState({ queueLength: this.browseList.length });
661
+ }
662
+ this.browseList[0].processing = true;
663
+ this.props.socket.readDir(this.browseList[0].adapter, this.browseList[0].relPath)
664
+ .then(files => {
665
+ if (this.browseList) { // if component still mounted
666
+ const item = this.browseList.shift();
667
+ if (item) {
668
+ const resolve = item.resolve;
669
+ item.resolve = null;
670
+ item.reject = null;
671
+ item.adapter = null;
672
+ item.relPath = null;
673
+ resolve && resolve(files);
674
+ this.browseListRunning = false;
675
+ if (this.browseList.length) {
676
+ if (level < 5) {
677
+ this.processBrowseList(level + 1);
678
+ }
679
+ else {
680
+ setTimeout(() => this.processBrowseList(0), 0);
681
+ }
682
+ }
683
+ else {
684
+ this.setState({ queueLength: 0 });
685
+ }
686
+ }
687
+ else {
688
+ this.setState({ queueLength: 0 });
689
+ }
690
+ }
691
+ })
692
+ .catch(e => {
693
+ if (this.browseList) { // if component still mounted
694
+ const item = this.browseList.shift();
695
+ if (item) {
696
+ const reject = item.reject;
697
+ item.resolve = null;
698
+ item.reject = null;
699
+ item.adapter = null;
700
+ item.relPath = null;
701
+ reject && reject(e);
702
+ this.browseListRunning = false;
703
+ if (this.browseList.length) {
704
+ if (level < 5) {
705
+ this.processBrowseList(level + 1);
706
+ }
707
+ else {
708
+ setTimeout(() => this.processBrowseList(0), 0);
709
+ }
710
+ }
711
+ else {
712
+ this.setState({ queueLength: 0 });
713
+ }
714
+ }
715
+ else {
716
+ this.setState({ queueLength: 0 });
717
+ }
718
+ }
802
719
  });
803
- });
804
720
  }
805
- return Promise.resolve(_newFolders);
806
- }
807
- if (!folderId || folderId === '/') {
808
- return this.props.socket.readMetaItems().then(function (objs) {
809
- var _folders = [];
810
- var userData = null;
811
- if (_this7.state.restrictToFolder) {
812
- var _adapter = _this7.state.restrictToFolder.split('/')[0];
813
- objs = objs.filter(function (obj) {
814
- return obj._id === _adapter;
815
- });
816
- } else if (!_this7.state.expertMode) {
817
- // load only adapter.admin and not other meta files like hm-rpc.0.devices.blablabla
818
- objs = objs.filter(function (obj) {
819
- return !obj._id.endsWith('.admin');
721
+ }
722
+ async browseFolder(folderId, _newFolders, _checkEmpty, force) {
723
+ let newFoldersNotNull;
724
+ if (!_newFolders) {
725
+ newFoldersNotNull = {};
726
+ Object.keys(this.state.folders).forEach(folder => {
727
+ newFoldersNotNull[folder] = this.state.folders[folder];
820
728
  });
821
- }
822
- var pos = objs.findIndex(function (obj) {
823
- return obj._id === 'system.meta.uuid';
824
- });
825
- if (pos !== -1) {
826
- objs.splice(pos, 1);
827
- }
828
- objs.forEach(function (obj) {
829
- if (_this7.limitToObjectID && _this7.limitToObjectID !== obj._id) {
830
- return;
729
+ }
730
+ else {
731
+ newFoldersNotNull = _newFolders;
732
+ }
733
+ if (newFoldersNotNull[folderId] && !force) {
734
+ if (!_checkEmpty) {
735
+ return new Promise((resolve, reject) => {
736
+ Promise.all(newFoldersNotNull[folderId].filter(item => item.folder).map(item => this.browseFolder(item.id, newFoldersNotNull, true)
737
+ .catch(() => { })))
738
+ .then(() => resolve(newFoldersNotNull))
739
+ .catch(error => reject(error));
740
+ });
741
+ }
742
+ return Promise.resolve(newFoldersNotNull);
743
+ }
744
+ // if root folder
745
+ if (!folderId || folderId === '/') {
746
+ try {
747
+ let objs = await this.props.socket.readMetaItems();
748
+ const _folders = [];
749
+ let userData = null;
750
+ if (this.state.restrictToFolder) {
751
+ const adapter = this.state.restrictToFolder.split('/')[0];
752
+ objs = objs.filter(obj => obj._id === adapter);
753
+ }
754
+ else if (!this.state.expertMode) {
755
+ // load only adapter.admin and not other meta files like hm-rpc.0.devices.blablabla
756
+ objs = objs.filter(obj => !obj._id.endsWith('.admin'));
757
+ }
758
+ const pos = objs.findIndex(obj => obj._id === 'system.meta.uuid');
759
+ if (pos !== -1) {
760
+ objs.splice(pos, 1);
761
+ }
762
+ objs.forEach(obj => {
763
+ if (this.limitToObjectID && this.limitToObjectID !== obj._id) {
764
+ return;
765
+ }
766
+ const item = {
767
+ id: obj._id,
768
+ name: obj._id,
769
+ title: (obj.common && obj.common.name) || obj._id,
770
+ meta: true,
771
+ from: obj.from,
772
+ ts: obj.ts,
773
+ color: obj.common && obj.common.color,
774
+ icon: obj.common && obj.common.icon,
775
+ folder: true,
776
+ acl: obj.acl,
777
+ level: 0,
778
+ };
779
+ if (item.id === USER_DATA) {
780
+ // user data must be first
781
+ userData = item;
782
+ }
783
+ else {
784
+ _folders.push(item);
785
+ }
786
+ });
787
+ _folders.sort((a, b) => (a.id > b.id ? 1 : (a.id < b.id ? -1 : 0)));
788
+ if (!this.limitToObjectID || this.limitToObjectID === USER_DATA) {
789
+ userData && _folders.unshift(userData);
790
+ }
791
+ newFoldersNotNull[folderId || '/'] = _folders;
792
+ if (!_checkEmpty) {
793
+ return Promise.all(_folders.filter(item => item.folder)
794
+ .map(item => this.browseFolder(item.id, newFoldersNotNull, true)
795
+ .catch(() => { })))
796
+ .then(() => newFoldersNotNull);
797
+ }
831
798
  }
832
- var item = {
833
- id: obj._id,
834
- name: obj._id,
835
- title: obj.common && obj.common.name || obj._id,
836
- meta: true,
837
- from: obj.from,
838
- ts: obj.ts,
839
- color: obj.common && obj.common.color,
840
- icon: obj.common && obj.common.icon,
841
- folder: true,
842
- acl: obj.acl,
843
- level: 0
844
- };
845
- if (item.id === USER_DATA) {
846
- // user data must be first
847
- userData = item;
848
- } else {
849
- _folders.push(item);
799
+ catch (e) {
800
+ this.initialReadFinished && window.alert(`Cannot read meta items: ${e}`);
801
+ newFoldersNotNull[folderId || '/'] = [];
850
802
  }
851
- });
852
- _folders.sort(function (a, b) {
853
- return a.id > b.id ? 1 : a.id < b.id ? -1 : 0;
854
- });
855
- if (!_this7.limitToObjectID || _this7.limitToObjectID === USER_DATA) {
856
- userData && _folders.unshift(userData);
857
- }
858
- _newFolders[folderId || '/'] = _folders;
859
- if (!_checkEmpty) {
860
- return Promise.all(_folders.filter(function (item) {
861
- return item.folder;
862
- }).map(function (item) {
863
- return _this7.browseFolder(item.id, _newFolders, true)["catch"](function () {});
864
- })).then(function () {
865
- return _newFolders;
803
+ return newFoldersNotNull;
804
+ }
805
+ const parts = folderId.split('/');
806
+ const level = parts.length;
807
+ const adapter = parts.shift();
808
+ const relPath = parts.join('/');
809
+ // make all requests here serial
810
+ const files = await this.readDirSerial(adapter || '', relPath);
811
+ try {
812
+ const _folders = [];
813
+ files.forEach(file => {
814
+ var _a;
815
+ const item = {
816
+ id: `${folderId}/${file.file}`,
817
+ ext: Utils_1.default.getFileExtension(file.file),
818
+ folder: file.isDir,
819
+ name: file.file,
820
+ size: (_a = file.stats) === null || _a === void 0 ? void 0 : _a.size,
821
+ modified: file.modifiedAt,
822
+ acl: file.acl,
823
+ level,
824
+ };
825
+ if (this.state.restrictToFolder) {
826
+ if (item.folder && (item.id.startsWith(`${this.state.restrictToFolder}/`) || item.id === this.state.restrictToFolder || this.state.restrictToFolder.startsWith(`${item.id}/`))) {
827
+ _folders.push(item);
828
+ }
829
+ else if (item.id.startsWith(`${this.state.restrictToFolder}/`)) {
830
+ _folders.push(item);
831
+ }
832
+ }
833
+ else if (this.limitToPath) {
834
+ if (item.folder && (item.id.startsWith(`${this.limitToPath}/`) || item.id === this.limitToPath || this.limitToPath.startsWith(`${item.id}/`))) {
835
+ _folders.push(item);
836
+ }
837
+ else if (item.id.startsWith(`${this.limitToPath}/`)) {
838
+ _folders.push(item);
839
+ }
840
+ }
841
+ else {
842
+ _folders.push(item);
843
+ }
866
844
  });
867
- }
868
- return _newFolders;
869
- })["catch"](function (e) {
870
- return _this7.initialReadFinished && window.alert("Cannot read meta items: ".concat(e));
871
- });
872
- }
873
- var parts = folderId.split('/');
874
- var level = parts.length;
875
- var adapter = parts.shift();
876
- var relPath = parts.join('/');
877
-
878
- // make all requests here serial
879
- return this.readDirSerial(adapter, relPath).then(function (files) {
880
- var _folders = [];
881
- files.forEach(function (file) {
882
- var item = {
883
- id: "".concat(folderId, "/").concat(file.file),
884
- ext: _Utils["default"].getFileExtension(file.file),
885
- folder: file.isDir,
886
- name: file.file,
887
- size: file.stats && file.stats.size,
888
- modified: file.modifiedAt,
889
- acl: file.acl,
890
- level: level
891
- };
892
- if (_this7.state.restrictToFolder) {
893
- if (item.folder && (item.id.startsWith("".concat(_this7.state.restrictToFolder, "/")) || item.id === _this7.state.restrictToFolder || _this7.state.restrictToFolder.startsWith("".concat(item.id, "/")))) {
894
- _folders.push(item);
895
- } else if (item.id.startsWith("".concat(_this7.state.restrictToFolder, "/"))) {
896
- _folders.push(item);
897
- }
898
- } else if (_this7.limitToPath) {
899
- if (item.folder && (item.id.startsWith("".concat(_this7.limitToPath, "/")) || item.id === _this7.limitToPath || _this7.limitToPath.startsWith("".concat(item.id, "/")))) {
900
- _folders.push(item);
901
- } else if (item.id.startsWith("".concat(_this7.limitToPath, "/"))) {
902
- _folders.push(item);
845
+ _folders.sort(sortFolders);
846
+ newFoldersNotNull[folderId] = _folders;
847
+ if (!_checkEmpty) {
848
+ return Promise.all(_folders
849
+ .filter(item => item.folder)
850
+ .map(item => this.browseFolder(item.id, newFoldersNotNull, true)))
851
+ .then(() => newFoldersNotNull);
903
852
  }
904
- } else {
905
- _folders.push(item);
906
- }
907
- });
908
- _folders.sort(sortFolders);
909
- _newFolders[folderId] = _folders;
910
- if (!_checkEmpty) {
911
- return Promise.all(_folders.filter(function (item) {
912
- return item.folder;
913
- }).map(function (item) {
914
- return _this7.browseFolder(item.id, _newFolders, true);
915
- })).then(function () {
916
- return _newFolders;
917
- });
918
853
  }
919
- return _newFolders;
920
- })["catch"](function (e) {
921
- _this7.initialReadFinished && window.alert("Cannot read ".concat(adapter).concat(relPath ? "/".concat(relPath) : '', ": ").concat(e));
922
- _newFolders[folderId] = [];
923
- return _newFolders;
924
- });
854
+ catch (e) {
855
+ this.initialReadFinished && window.alert(`Cannot read ${adapter}${relPath ? `/${relPath}` : ''}: ${e}`);
856
+ newFoldersNotNull[folderId] = [];
857
+ }
858
+ return newFoldersNotNull;
925
859
  }
926
- }, {
927
- key: "toggleFolder",
928
- value: function toggleFolder(item, e) {
929
- var _this8 = this;
930
- e && e.stopPropagation();
931
- var expanded = (0, _toConsumableArray2["default"])(this.state.expanded);
932
- var pos = expanded.indexOf(item.id);
933
- if (pos === -1) {
934
- expanded.push(item.id);
935
- expanded.sort();
936
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
937
- if (!item.temp) {
938
- this.browseFolder(item.id).then(function (folders) {
939
- return _this8.setState({
940
- expanded: expanded,
941
- folders: folders
942
- });
943
- })["catch"](function (err) {
944
- return window.alert(err === NOT_FOUND ? _this8.props.t('ra_Cannot find "%s"', item.id) : _this8.props.t('ra_Cannot read "%s"', item.id));
945
- });
946
- } else {
947
- this.setState({
948
- expanded: expanded
949
- });
860
+ toggleFolder(item, e) {
861
+ e && e.stopPropagation();
862
+ const expanded = [...this.state.expanded];
863
+ const pos = expanded.indexOf(item.id);
864
+ if (pos === -1) {
865
+ expanded.push(item.id);
866
+ expanded.sort();
867
+ (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
868
+ if (!item.temp) {
869
+ this.browseFolder(item.id)
870
+ .then(folders => this.setState({ expanded, folders }))
871
+ .catch(err => window.alert(err === NOT_FOUND ? this.props.t('ra_Cannot find "%s"', item.id) : this.props.t('ra_Cannot read "%s"', item.id)));
872
+ }
873
+ else {
874
+ this.setState({ expanded });
875
+ }
876
+ }
877
+ else {
878
+ expanded.splice(pos, 1);
879
+ (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
880
+ this.setState({ expanded });
950
881
  }
951
- } else {
952
- expanded.splice(pos, 1);
953
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
954
- this.setState({
955
- expanded: expanded
956
- });
957
- }
958
882
  }
959
- }, {
960
- key: "changeFolder",
961
- value: function changeFolder(e, folder) {
962
- var _this9 = this;
963
- e && e.stopPropagation();
964
- this.lastSelect = Date.now();
965
- var _folder = folder || getParentDir(this.state.currentDir);
966
- if (_folder === '/') {
967
- _folder = '';
968
- }
969
- (window._localStorage || window.localStorage).setItem('files.currentDir', _folder);
970
- if (folder && e && (e.altKey || e.shiftKey || e.ctrlKey || e.metaKey)) {
883
+ changeFolder(e, folder) {
884
+ e && e.stopPropagation();
885
+ this.lastSelect = Date.now();
886
+ let _folder = folder || getParentDir(this.state.currentDir);
887
+ if (_folder === '/') {
888
+ _folder = '';
889
+ }
890
+ (window._localStorage || window.localStorage).setItem('files.currentDir', _folder);
891
+ if (folder && e && (e.altKey || e.shiftKey || e.ctrlKey || e.metaKey)) {
892
+ return this.setState({ selected: _folder });
893
+ }
894
+ if (_folder && !this.state.folders[_folder]) {
895
+ return this.browseFolder(_folder)
896
+ .then(folders => this.setState({
897
+ folders,
898
+ path: _folder,
899
+ currentDir: _folder,
900
+ selected: _folder,
901
+ pathFocus: false,
902
+ }, () => this.props.onSelect && this.props.onSelect('')));
903
+ }
971
904
  return this.setState({
972
- selected: _folder
973
- });
974
- }
975
- if (_folder && !this.state.folders[_folder]) {
976
- return this.browseFolder(_folder).then(function (folders) {
977
- return _this9.setState({
978
- folders: folders,
979
- path: _folder,
980
905
  currentDir: _folder,
981
906
  selected: _folder,
982
- pathFocus: false
983
- }, function () {
984
- return _this9.props.onSelect && _this9.props.onSelect('');
985
- });
907
+ path: _folder,
908
+ pathFocus: false,
909
+ }, () => this.props.onSelect && this.props.onSelect(''));
910
+ }
911
+ select(id, e, cb) {
912
+ e && e.stopPropagation();
913
+ this.lastSelect = Date.now();
914
+ (window._localStorage || window.localStorage).setItem('files.selected', id);
915
+ this.setState({ selected: id, path: id, pathFocus: false }, () => {
916
+ if (this.props.onSelect) {
917
+ const ext = Utils_1.default.getFileExtension(id);
918
+ if ((!this.props.filterFiles || (ext && this.props.filterFiles.includes(ext))) &&
919
+ (!this.state.filterByType || (ext && FileViewer_1.EXTENSIONS[this.state.filterByType].includes(ext)))) {
920
+ this.props.onSelect(id, false, !!this.state.folders[id]);
921
+ }
922
+ else {
923
+ this.props.onSelect('');
924
+ }
925
+ }
926
+ cb && cb();
986
927
  });
987
- }
988
- return this.setState({
989
- currentDir: _folder,
990
- selected: _folder,
991
- path: _folder,
992
- pathFocus: false
993
- }, function () {
994
- return _this9.props.onSelect && _this9.props.onSelect('');
995
- });
996
928
  }
997
- }, {
998
- key: "select",
999
- value: function select(id, e, cb) {
1000
- var _this10 = this;
1001
- if (typeof e === 'function') {
1002
- cb = e;
1003
- e = null;
1004
- }
1005
- e && e.stopPropagation();
1006
- this.lastSelect = Date.now();
1007
- (window._localStorage || window.localStorage).setItem('files.selected', id);
1008
- this.setState({
1009
- selected: id,
1010
- path: id,
1011
- pathFocus: false
1012
- }, function () {
1013
- if (_this10.props.onSelect) {
1014
- var ext = _Utils["default"].getFileExtension(id);
1015
- if ((!_this10.props.filterFiles || _this10.props.filterFiles.includes(ext)) && (!_this10.state.filterByType || _FileViewer.EXTENSIONS[_this10.state.filterByType].includes(ext))) {
1016
- _this10.props.onSelect(id, false, !!_this10.state.folders[id]);
1017
- } else {
1018
- _this10.props.onSelect('');
1019
- }
929
+ getText(text) {
930
+ if (text) {
931
+ if (typeof text === 'object') {
932
+ return text[this.props.lang] || text.en || undefined;
933
+ }
934
+ return text;
1020
935
  }
1021
- cb && cb();
1022
- });
936
+ return undefined;
1023
937
  }
1024
- }, {
1025
- key: "renderFolder",
1026
- value: function renderFolder(item, expanded) {
1027
- var _this11 = this;
1028
- if (this.state.viewType === TABLE && this.state.filterEmpty && (!this.state.folders[item.id] || !this.state.folders[item.id].length) && item.id !== USER_DATA && !item.temp) {
1029
- return null;
1030
- }
1031
- var Icon = expanded ? _IconOpen["default"] : _IconClosed["default"];
1032
- var padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;
1033
- var isUserData = item.name === USER_DATA;
1034
- var isSpecialData = isUserData || item.name === 'vis.0' || item.name === 'vis-2.0';
1035
- return /*#__PURE__*/_react["default"].createElement("div", {
1036
- key: item.id,
1037
- id: item.id,
1038
- style: this.state.viewType === TABLE ? {
1039
- marginLeft: padding,
1040
- width: "calc(100% - ".concat(padding, "px")
1041
- } : {},
1042
- onClick: function onClick(e) {
1043
- return _this11.state.viewType === TABLE ? _this11.select(item.id, e) : _this11.changeFolder(e, item.id);
1044
- },
1045
- onDoubleClick: function onDoubleClick(e) {
1046
- return _this11.state.viewType === TABLE && _this11.toggleFolder(item, e);
1047
- },
1048
- title: item.title && (0, _typeof2["default"])(item.title) === 'object' ? item.title[this.props.lang] || item.title.end || '' : item.title || null,
1049
- className: _Utils["default"].clsx('browserItem', this.props.classes["item".concat(this.state.viewType)], this.props.classes["itemFolder".concat(this.state.viewType)], this.state.selected === item.id && this.props.classes.itemSelected, item.temp && this.props.classes.itemFolderTemp)
1050
- }, /*#__PURE__*/_react["default"].createElement(Icon, {
1051
- className: _Utils["default"].clsx(this.props.classes["itemFolderIcon".concat(this.state.viewType)], isSpecialData && this.props.classes.specialFolder),
1052
- onClick: this.state.viewType === TABLE ? function (e) {
1053
- return _this11.toggleFolder(item, e);
1054
- } : undefined
1055
- }), /*#__PURE__*/_react["default"].createElement("div", {
1056
- className: _Utils["default"].clsx(this.props.classes["itemName".concat(this.state.viewType)], this.props.classes["itemNameFolder".concat(this.state.viewType)])
1057
- }, isUserData ? this.props.t('ra_User files') : item.name), /*#__PURE__*/_react["default"].createElement(_material.Hidden, {
1058
- smDown: true
1059
- }, /*#__PURE__*/_react["default"].createElement("div", {
1060
- className: this.props.classes["itemSize".concat(this.state.viewType)]
1061
- }, this.state.viewType === TABLE && this.state.folders[item.id] ? this.state.folders[item.id].length : '')), /*#__PURE__*/_react["default"].createElement(_material.Hidden, {
1062
- smDown: true
1063
- }, this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null), /*#__PURE__*/_react["default"].createElement(_material.Hidden, {
1064
- smDown: true
1065
- }, this.state.viewType === TABLE && this.props.expertMode ? /*#__PURE__*/_react["default"].createElement("div", {
1066
- className: this.props.classes["itemDeleteButton".concat(this.state.viewType)]
1067
- }) : null), this.state.viewType === TABLE && this.props.allowDownload ? /*#__PURE__*/_react["default"].createElement("div", {
1068
- className: this.props.classes["itemDownloadEmpty".concat(this.state.viewType)]
1069
- }) : null, this.state.viewType === TABLE && this.props.allowDelete && this.state.folders[item.id] && this.state.folders[item.id].length ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1070
- "aria-label": "delete",
1071
- onClick: function onClick(e) {
1072
- e.stopPropagation();
1073
- if (_this11.suppressDeleteConfirm > Date.now()) {
1074
- _this11.deleteItem(item.id);
1075
- } else {
1076
- _this11.setState({
1077
- deleteItem: item.id
1078
- });
1079
- }
1080
- },
1081
- className: this.props.classes["itemDeleteButton".concat(this.state.viewType)],
1082
- size: "large"
1083
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Delete, {
1084
- fontSize: "small"
1085
- })) : this.state.viewType === TABLE && this.props.allowDelete ? /*#__PURE__*/_react["default"].createElement("div", {
1086
- className: this.props.classes["itemDeleteButton".concat(this.state.viewType)]
1087
- }) : null);
938
+ renderFolder(item, expanded) {
939
+ if (this.state.viewType === TABLE &&
940
+ this.state.filterEmpty &&
941
+ (!this.state.folders[item.id] || !this.state.folders[item.id].length) &&
942
+ item.id !== USER_DATA && !item.temp) {
943
+ return null;
944
+ }
945
+ const Icon = expanded ? IconOpen_1.default : IconClosed_1.default;
946
+ const padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;
947
+ const isUserData = item.name === USER_DATA;
948
+ const isSpecialData = isUserData || item.name === 'vis.0' || item.name === 'vis-2.0';
949
+ 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) },
950
+ react_1.default.createElement(Icon, { 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 }),
951
+ 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),
952
+ react_1.default.createElement(material_1.Hidden, { smDown: true },
953
+ react_1.default.createElement("div", { className: this.props.classes[`itemSize${this.state.viewType}`] }, this.state.viewType === TABLE && this.state.folders[item.id] ? this.state.folders[item.id].length : '')),
954
+ react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null),
955
+ react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode ? react_1.default.createElement("div", { className: this.props.classes[`itemDeleteButton${this.state.viewType}`] }) : null),
956
+ this.state.viewType === TABLE && this.props.allowDownload ? react_1.default.createElement("div", { className: this.props.classes[`itemDownloadEmpty${this.state.viewType}`] }) : null,
957
+ this.state.viewType === TABLE && this.props.allowDelete && this.state.folders[item.id] && this.state.folders[item.id].length ?
958
+ react_1.default.createElement(material_1.IconButton, { "aria-label": "delete", onClick: e => {
959
+ e.stopPropagation();
960
+ if (this.suppressDeleteConfirm > Date.now()) {
961
+ this.deleteItem(item.id);
962
+ }
963
+ else {
964
+ this.setState({ deleteItem: item.id });
965
+ }
966
+ }, className: this.props.classes[`itemDeleteButton${this.state.viewType}`], size: "large" },
967
+ react_1.default.createElement(icons_material_1.Delete, { fontSize: "small" }))
968
+ :
969
+ (this.state.viewType === TABLE && this.props.allowDelete ? react_1.default.createElement("div", { className: this.props.classes[`itemDeleteButton${this.state.viewType}`] }) : null));
1088
970
  }
1089
- }, {
1090
- key: "renderBackFolder",
1091
- value: function renderBackFolder() {
1092
- var _this12 = this;
1093
- return /*#__PURE__*/_react["default"].createElement("div", {
1094
- key: this.state.currentDir,
1095
- id: this.state.currentDir,
1096
- onClick: function onClick(e) {
1097
- return _this12.changeFolder(e);
1098
- },
1099
- title: this.props.t('ra_Back to %s', getParentDir(this.state.currentDir)),
1100
- className: _Utils["default"].clsx('browserItem', this.props.classes["item".concat(this.state.viewType)], this.props.classes["itemFolder".concat(this.state.viewType)])
1101
- }, /*#__PURE__*/_react["default"].createElement(_IconClosed["default"], {
1102
- className: this.props.classes["itemFolderIcon".concat(this.state.viewType)]
1103
- }), /*#__PURE__*/_react["default"].createElement(_iconsMaterial.ArrowBack, {
1104
- className: this.props.classes.itemFolderIconBack
1105
- }), /*#__PURE__*/_react["default"].createElement("div", {
1106
- className: _Utils["default"].clsx(this.props.classes["itemName".concat(this.state.viewType)], this.props.classes["itemNameFolder".concat(this.state.viewType)])
1107
- }, ".."));
971
+ renderBackFolder() {
972
+ 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}`]) },
973
+ react_1.default.createElement(IconClosed_1.default, { className: this.props.classes[`itemFolderIcon${this.state.viewType}`] }),
974
+ react_1.default.createElement(icons_material_1.ArrowBack, { className: this.props.classes.itemFolderIconBack }),
975
+ react_1.default.createElement("div", { className: Utils_1.default.clsx(this.props.classes[`itemName${this.state.viewType}`], this.props.classes[`itemNameFolder${this.state.viewType}`]) }, ".."));
1108
976
  }
1109
- }, {
1110
- key: "formatSize",
1111
- value: function formatSize(size) {
1112
- return /*#__PURE__*/_react["default"].createElement("div", {
1113
- className: this.props.classes["itemSize".concat(this.state.viewType)]
1114
- }, size || size === 0 ? _Utils["default"].formatBytes(size) : '');
977
+ formatSize(size) {
978
+ return react_1.default.createElement("div", { className: this.props.classes[`itemSize${this.state.viewType}`] }, size || size === 0 ? Utils_1.default.formatBytes(size) : '');
1115
979
  }
1116
- }, {
1117
- key: "formatAcl",
1118
- value: function formatAcl(acl) {
1119
- var _this13 = this;
1120
- var access = acl && (acl.permissions || acl.file);
1121
- if (access) {
1122
- access = access.toString(16).padStart(3, '0');
1123
- }
1124
- return /*#__PURE__*/_react["default"].createElement("div", {
1125
- className: this.props.classes["itemAccess".concat(this.state.viewType)]
1126
- }, this.props.modalEditOfAccessControl ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1127
- size: "large",
1128
- onClick: function onClick() {
1129
- return _this13.setState({
1130
- modalEditOfAccess: true
1131
- });
1132
- },
1133
- className: this.props.classes["itemAclButton".concat(this.state.viewType)]
1134
- }, access || '---') : access || '---');
980
+ formatAcl(acl) {
981
+ let access = acl && (acl.permissions || acl.file);
982
+ let accessStr;
983
+ if (access) {
984
+ accessStr = access.toString(16).padStart(3, '0');
985
+ }
986
+ else {
987
+ accessStr = '';
988
+ }
989
+ 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 || '---');
1135
990
  }
1136
- }, {
1137
- key: "getFileIcon",
1138
- value: function getFileIcon(ext) {
1139
- switch (ext) {
1140
- case 'json':
1141
- case 'json5':
1142
- return /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Bookmark, {
1143
- className: this.props.classes["itemIcon".concat(this.state.viewType)]
1144
- });
1145
- case 'css':
1146
- return /*#__PURE__*/_react["default"].createElement(_iconsMaterial.BookmarkBorder, {
1147
- className: this.props.classes["itemIcon".concat(this.state.viewType)]
1148
- });
1149
- case 'js':
1150
- case 'ts':
1151
- return /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Code, {
1152
- className: this.props.classes["itemIcon".concat(this.state.viewType)]
1153
- });
1154
- case 'html':
1155
- case 'md':
1156
- return /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Description, {
1157
- className: this.props.classes["itemIcon".concat(this.state.viewType)]
1158
- });
1159
- case 'mp3':
1160
- case 'ogg':
1161
- case 'wav':
1162
- case 'm4a':
1163
- case 'mp4':
1164
- case 'flac':
1165
- return /*#__PURE__*/_react["default"].createElement(_iconsMaterial.MusicNote, {
1166
- className: this.props.classes["itemIcon".concat(this.state.viewType)]
1167
- });
1168
- default:
1169
- return /*#__PURE__*/_react["default"].createElement(_iconsMaterial.InsertDriveFile, {
1170
- className: this.props.classes["itemIcon".concat(this.state.viewType)]
1171
- });
1172
- }
991
+ getFileIcon(ext) {
992
+ switch (ext) {
993
+ case 'json':
994
+ case 'json5':
995
+ return react_1.default.createElement(icons_material_1.Bookmark, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
996
+ case 'css':
997
+ return react_1.default.createElement(icons_material_1.BookmarkBorder, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
998
+ case 'js':
999
+ case 'ts':
1000
+ return react_1.default.createElement(icons_material_1.Code, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1001
+ case 'html':
1002
+ case 'md':
1003
+ return react_1.default.createElement(icons_material_1.Description, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1004
+ case 'mp3':
1005
+ case 'ogg':
1006
+ case 'wav':
1007
+ case 'm4a':
1008
+ case 'mp4':
1009
+ case 'flac':
1010
+ return react_1.default.createElement(icons_material_1.MusicNote, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1011
+ default:
1012
+ return react_1.default.createElement(icons_material_1.InsertDriveFile, { className: this.props.classes[`itemIcon${this.state.viewType}`] });
1013
+ }
1173
1014
  }
1174
- }, {
1175
- key: "renderFile",
1176
- value: function renderFile(item) {
1177
- var _this14 = this;
1178
- var padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;
1179
- var ext = _Utils["default"].getFileExtension(item.name);
1180
- return /*#__PURE__*/_react["default"].createElement("div", {
1181
- key: item.id,
1182
- id: item.id,
1183
- onDoubleClick: function onDoubleClick(e) {
1184
- e.stopPropagation();
1185
- if (!_this14.props.onSelect) {
1186
- _this14.setState({
1187
- viewer: _this14.imagePrefix + item.id,
1188
- formatEditFile: ext
1189
- });
1190
- } else if ((!_this14.props.filterFiles || _this14.props.filterFiles.includes(item.ext)) && (!_this14.state.filterByType || _FileViewer.EXTENSIONS[_this14.state.filterByType].includes(item.ext))) {
1191
- _this14.props.onSelect(item.id, true, !!_this14.state.folders[item.id]);
1192
- }
1193
- },
1194
- onClick: function onClick(e) {
1195
- return _this14.select(item.id, e);
1196
- },
1197
- style: this.state.viewType === TABLE ? {
1198
- marginLeft: padding,
1199
- width: "calc(100% - ".concat(padding, "px)")
1200
- } : {},
1201
- className: _Utils["default"].clsx('browserItem', this.props.classes["item".concat(this.state.viewType)], this.props.classes["itemFile".concat(this.state.viewType)], this.state.selected === item.id && this.props.classes.itemSelected)
1202
- }, _FileViewer.EXTENSIONS.images.includes(ext) ? this.state.fileErrors.includes(item.id) ? /*#__PURE__*/_react["default"].createElement(_IconNoIcon["default"], {
1203
- className: _Utils["default"].clsx(this.props.classes["itemImage".concat(this.state.viewType)], this.getClassBackgroundImage())
1204
- }) : /*#__PURE__*/_react["default"].createElement("img", {
1205
- onError: function onError(e) {
1206
- e.target.onerror = null;
1207
- var fileErrors = (0, _toConsumableArray2["default"])(_this14.state.fileErrors);
1208
- if (!fileErrors.includes(item.id)) {
1209
- fileErrors.push(item.id);
1210
- _this14.setState({
1211
- fileErrors: fileErrors
1212
- });
1213
- }
1214
- },
1215
- className: _Utils["default"].clsx(this.props.classes["itemImage".concat(this.state.viewType)], this.getClassBackgroundImage()),
1216
- src: this.imagePrefix + item.id,
1217
- alt: item.name
1218
- }) : this.getFileIcon(ext), /*#__PURE__*/_react["default"].createElement("div", {
1219
- className: this.props.classes["itemName".concat(this.state.viewType)]
1220
- }, item.name), /*#__PURE__*/_react["default"].createElement(_material.Hidden, {
1221
- smDown: true
1222
- }, this.formatSize(item.size)), /*#__PURE__*/_react["default"].createElement(_material.Hidden, {
1223
- smDown: true
1224
- }, this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null), /*#__PURE__*/_react["default"].createElement(_material.Hidden, {
1225
- smDown: true
1226
- }, this.state.viewType === TABLE && this.props.expertMode && FileBrowser.getEditFile(ext) ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1227
- "aria-label": "edit",
1228
- onClick: function onClick(e) {
1229
- e.stopPropagation();
1230
- if (!_this14.props.onSelect) {
1231
- _this14.setState({
1232
- viewer: _this14.imagePrefix + item.id,
1233
- formatEditFile: ext
1234
- });
1235
- } else if ((!_this14.props.filterFiles || _this14.props.filterFiles.includes(item.ext)) && (!_this14.state.filterByType || _FileViewer.EXTENSIONS[_this14.state.filterByType].includes(item.ext))) {
1236
- _this14.props.onSelect(item.id, true, !!_this14.state.folders[item.id]);
1237
- }
1238
- },
1239
- className: this.props.classes["itemDeleteButton".concat(this.state.viewType)],
1240
- size: "large"
1241
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Edit, {
1242
- fontSize: "small"
1243
- })) : /*#__PURE__*/_react["default"].createElement("div", {
1244
- className: this.props.classes["itemDeleteButton".concat(this.state.viewType)]
1245
- })), this.state.viewType === TABLE && this.props.allowDownload ? /*#__PURE__*/_react["default"].createElement("a", {
1246
- className: _Utils["default"].clsx('MuiButtonBase-root', 'MuiIconButton-root', 'MuiIconButton-sizeLarge', this.props.classes.itemDownloadButtonTable),
1247
- tabIndex: "0",
1248
- download: item.id,
1249
- href: this.imagePrefix + item.id,
1250
- onClick: function onClick(e) {
1251
- e.stopPropagation();
1015
+ static getEditFile(ext) {
1016
+ switch (ext) {
1017
+ case 'json':
1018
+ case 'json5':
1019
+ case 'js':
1020
+ case 'html':
1021
+ case 'txt':
1022
+ case 'css':
1023
+ case 'log':
1024
+ return true;
1025
+ default:
1026
+ return false;
1252
1027
  }
1253
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.SaveAlt, null)) : null, this.state.viewType === TABLE && this.props.allowDelete && item.id !== 'vis.0/' && item.id !== 'vis-2.0/' && item.id !== USER_DATA ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1254
- "aria-label": "delete",
1255
- onClick: function onClick(e) {
1256
- e.stopPropagation();
1257
- if (_this14.suppressDeleteConfirm > Date.now()) {
1258
- _this14.deleteItem(item.id);
1259
- } else {
1260
- _this14.setState({
1261
- deleteItem: item.id
1262
- });
1263
- }
1264
- },
1265
- className: this.props.classes["itemDeleteButton".concat(this.state.viewType)],
1266
- size: "large"
1267
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Delete, {
1268
- fontSize: "small"
1269
- })) : this.state.viewType === TABLE && this.props.allowDelete ? /*#__PURE__*/_react["default"].createElement("div", {
1270
- className: this.props.classes["itemDeleteButton".concat(this.state.viewType)]
1271
- }) : null);
1272
1028
  }
1273
- }, {
1274
- key: "renderItems",
1275
- value: function renderItems(folderId) {
1276
- var _this15 = this;
1277
- if (this.state.folders && this.state.folders[folderId]) {
1278
- // tile
1279
- if (this.state.viewType === TILE) {
1280
- var res = [];
1281
- if (folderId && folderId !== '/') {
1282
- res.push(this.renderBackFolder());
1283
- }
1284
- this.state.folders[folderId].forEach(function (item) {
1285
- if (item.folder) {
1286
- res.push(_this15.renderFolder(item));
1287
- } else if ((!_this15.props.filterFiles || _this15.props.filterFiles.includes(item.ext)) && (!_this15.state.filterByType || _FileViewer.EXTENSIONS[_this15.state.filterByType].includes(item.ext))) {
1288
- res.push(_this15.renderFile(item));
1029
+ renderFile(item) {
1030
+ const padding = this.state.viewType === TABLE ? item.level * this.levelPadding : 0;
1031
+ const ext = Utils_1.default.getFileExtension(item.name);
1032
+ return react_1.default.createElement("div", { key: item.id, id: item.id, onDoubleClick: e => {
1033
+ e.stopPropagation();
1034
+ if (!this.props.onSelect) {
1035
+ this.setState({ viewer: this.imagePrefix + item.id, formatEditFile: ext });
1036
+ }
1037
+ else if ((!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&
1038
+ (!this.state.filterByType || (item.ext && FileViewer_1.EXTENSIONS[this.state.filterByType].includes(item.ext)))) {
1039
+ this.props.onSelect(item.id, true, !!this.state.folders[item.id]);
1040
+ }
1041
+ }, 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) },
1042
+ ext && FileViewer_1.EXTENSIONS.images.includes(ext) ?
1043
+ this.state.fileErrors.includes(item.id) ?
1044
+ react_1.default.createElement(IconNoIcon_1.default, { className: Utils_1.default.clsx(this.props.classes[`itemImage${this.state.viewType}`], this.getClassBackgroundImage()) }) :
1045
+ react_1.default.createElement("img", { onError: e => {
1046
+ // @ts-expect-error it exists
1047
+ e.target.onerror = null;
1048
+ const fileErrors = [...this.state.fileErrors];
1049
+ if (!fileErrors.includes(item.id)) {
1050
+ fileErrors.push(item.id);
1051
+ this.setState({ fileErrors });
1052
+ }
1053
+ }, className: Utils_1.default.clsx(this.props.classes[`itemImage${this.state.viewType}`], this.getClassBackgroundImage()), src: this.imagePrefix + item.id, alt: item.name })
1054
+ :
1055
+ this.getFileIcon(ext),
1056
+ react_1.default.createElement("div", { className: this.props.classes[`itemName${this.state.viewType}`] }, item.name),
1057
+ react_1.default.createElement(material_1.Hidden, { smDown: true }, this.formatSize(item.size)),
1058
+ react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode ? this.formatAcl(item.acl) : null),
1059
+ react_1.default.createElement(material_1.Hidden, { smDown: true }, this.state.viewType === TABLE && this.props.expertMode && FileBrowser.getEditFile(ext) ?
1060
+ react_1.default.createElement(material_1.IconButton, { "aria-label": "edit", onClick: e => {
1061
+ e.stopPropagation();
1062
+ if (!this.props.onSelect) {
1063
+ this.setState({ viewer: this.imagePrefix + item.id, formatEditFile: ext });
1064
+ }
1065
+ else if ((!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&
1066
+ (!this.state.filterByType || (item.ext && FileViewer_1.EXTENSIONS[this.state.filterByType].includes(item.ext)))) {
1067
+ this.props.onSelect(item.id, true, !!this.state.folders[item.id]);
1068
+ }
1069
+ }, className: this.props.classes[`itemDeleteButton${this.state.viewType}`], size: "large" },
1070
+ react_1.default.createElement(icons_material_1.Edit, { fontSize: "small" }))
1071
+ :
1072
+ react_1.default.createElement("div", { className: this.props.classes[`itemDeleteButton${this.state.viewType}`] })),
1073
+ 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 => {
1074
+ e.stopPropagation();
1075
+ } },
1076
+ react_1.default.createElement(icons_material_1.SaveAlt, null)) : null,
1077
+ this.state.viewType === TABLE &&
1078
+ this.props.allowDelete &&
1079
+ item.id !== 'vis.0/' &&
1080
+ item.id !== 'vis-2.0/' &&
1081
+ item.id !== USER_DATA
1082
+ ?
1083
+ react_1.default.createElement(material_1.IconButton, { "aria-label": "delete", onClick: e => {
1084
+ e.stopPropagation();
1085
+ if (this.suppressDeleteConfirm > Date.now()) {
1086
+ this.deleteItem(item.id);
1087
+ }
1088
+ else {
1089
+ this.setState({ deleteItem: item.id });
1090
+ }
1091
+ }, className: this.props.classes[`itemDeleteButton${this.state.viewType}`], size: "large" },
1092
+ react_1.default.createElement(icons_material_1.Delete, { fontSize: "small" }))
1093
+ :
1094
+ (this.state.viewType === TABLE && this.props.allowDelete ?
1095
+ react_1.default.createElement("div", { className: this.props.classes[`itemDeleteButton${this.state.viewType}`] })
1096
+ :
1097
+ null));
1098
+ }
1099
+ renderItems(folderId) {
1100
+ if (this.state.folders && this.state.folders[folderId]) {
1101
+ // tile
1102
+ if (this.state.viewType === TILE) {
1103
+ const res = [];
1104
+ if (folderId && folderId !== '/') {
1105
+ res.push(this.renderBackFolder());
1106
+ }
1107
+ this.state.folders[folderId].forEach(item => {
1108
+ if (item.folder) {
1109
+ res.push(this.renderFolder(item));
1110
+ }
1111
+ else if ((!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&
1112
+ (!this.state.filterByType || (item.ext && FileViewer_1.EXTENSIONS[this.state.filterByType].includes(item.ext)))) {
1113
+ res.push(this.renderFile(item));
1114
+ }
1115
+ });
1116
+ return res;
1289
1117
  }
1290
- });
1291
- return res;
1118
+ const totalResult = [];
1119
+ this.state.folders[folderId].forEach(item => {
1120
+ if (item.folder) {
1121
+ const expanded = this.state.expanded.includes(item.id);
1122
+ const folders = this.renderFolder(item, expanded);
1123
+ if (Array.isArray(folders)) {
1124
+ folders.forEach(folder => totalResult.push(folder));
1125
+ }
1126
+ else {
1127
+ totalResult.push(folders);
1128
+ }
1129
+ if (this.state.folders[item.id] && expanded) {
1130
+ const items = this.renderItems(item.id);
1131
+ if (Array.isArray(items)) {
1132
+ items.forEach(item => totalResult.push(item));
1133
+ }
1134
+ else {
1135
+ totalResult.push(items);
1136
+ }
1137
+ }
1138
+ }
1139
+ else if ((!this.props.filterFiles || (item.ext && this.props.filterFiles.includes(item.ext))) &&
1140
+ (!this.state.filterByType || (item.ext && FileViewer_1.EXTENSIONS[this.state.filterByType].includes(item.ext)))) {
1141
+ totalResult.push(this.renderFile(item));
1142
+ }
1143
+ });
1144
+ return totalResult;
1292
1145
  }
1293
- return this.state.folders[folderId].map(function (item) {
1294
- var res = [];
1295
- if (item.folder) {
1296
- var expanded = _this15.state.expanded.includes(item.id);
1297
- res.push(_this15.renderFolder(item, expanded));
1298
- if (_this15.state.folders[item.id] && expanded) {
1299
- res.push(_this15.renderItems(item.id));
1300
- }
1301
- } else if ((!_this15.props.filterFiles || _this15.props.filterFiles.includes(item.ext)) && (!_this15.state.filterByType || _FileViewer.EXTENSIONS[_this15.state.filterByType].includes(item.ext))) {
1302
- res.push(_this15.renderFile(item));
1303
- } else {
1146
+ return react_1.default.createElement("div", { style: { position: 'relative' } },
1147
+ react_1.default.createElement(material_1.CircularProgress, { key: folderId, color: "secondary", size: 24 }),
1148
+ react_1.default.createElement("div", { style: {
1149
+ position: 'absolute', zIndex: 2, top: 4, width: 24, textAlign: 'center',
1150
+ } }, this.state.queueLength));
1151
+ }
1152
+ renderToolbar() {
1153
+ const IconType = this.props.showTypeSelector ?
1154
+ (FILE_TYPE_ICONS[this.state.filterByType || 'all'] || FILE_TYPE_ICONS.all) :
1155
+ null;
1156
+ const isInFolder = this.findFirstFolder(this.state.selected);
1157
+ return react_1.default.createElement(material_1.Toolbar, { key: "toolbar", variant: "dense" },
1158
+ this.props.allowNonRestricted && this.props.restrictToFolder ? react_1.default.createElement(material_1.IconButton, { edge: "start", title: this.state.restrictToFolder ? this.props.t('ra_Show all folders') : 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({
1159
+ restrictToFolder: (this.state.restrictToFolder ? '' : this.props.restrictToFolder) || '',
1160
+ loadAllFolders: true,
1161
+ }), size: "small" },
1162
+ react_1.default.createElement(icons_material_1.FolderSpecial, { fontSize: "small" })) : null,
1163
+ 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" },
1164
+ react_1.default.createElement(IconExpert_1.default, null)) : null,
1165
+ 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: () => {
1166
+ const viewType = this.state.viewType === TABLE ? TILE : TABLE;
1167
+ (window._localStorage || window.localStorage).setItem('files.viewType', viewType);
1168
+ let currentDir = this.state.selected;
1169
+ if (isFile(currentDir)) {
1170
+ currentDir = getParentDir(currentDir);
1171
+ }
1172
+ this.setState({ viewType, currentDir }, () => {
1173
+ if (this.state.viewType === TABLE) {
1174
+ this.scrollToSelected();
1175
+ }
1176
+ });
1177
+ }, 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,
1178
+ 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: () => {
1179
+ (window._localStorage || window.localStorage).setItem('file.empty', !this.state.filterEmpty);
1180
+ this.setState({ filterEmpty: !this.state.filterEmpty });
1181
+ }, size: "small" },
1182
+ react_1.default.createElement(icons_material_1.FolderOpen, { fontSize: "small" })),
1183
+ 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" },
1184
+ react_1.default.createElement(icons_material_1.Refresh, { fontSize: "small" })),
1185
+ this.props.allowCreateFolder ? react_1.default.createElement(material_1.IconButton, { edge: "start", disabled: !this.state.selected ||
1186
+ !isInFolder ||
1187
+ (!!this.limitToPath &&
1188
+ !this.state.selected.startsWith(`${this.limitToPath}/`) &&
1189
+ 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" },
1190
+ react_1.default.createElement(icons_material_1.CreateNewFolder, { fontSize: "small" })) : null,
1191
+ this.props.allowUpload ? react_1.default.createElement(material_1.IconButton, { edge: "start", disabled: !this.state.selected ||
1192
+ !isInFolder ||
1193
+ (!!this.limitToPath &&
1194
+ !this.state.selected.startsWith(`${this.limitToPath}/`) &&
1195
+ 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" },
1196
+ react_1.default.createElement(icons_material_1.Publish, { fontSize: "small" })) : null,
1197
+ this.props.showTypeSelector ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Filter files') },
1198
+ react_1.default.createElement(material_1.IconButton, { size: "small", onClick: e => this.setState({ showTypesMenu: e.target }) },
1199
+ react_1.default.createElement(IconType, { fontSize: "small" }))) : null,
1200
+ 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 => {
1201
+ const MyIcon = FILE_TYPE_ICONS[type];
1202
+ return react_1.default.createElement(material_1.MenuItem, { key: type, selected: this.state.filterByType === type, onClick: () => {
1203
+ if (type === 'all') {
1204
+ (window._localStorage || window.localStorage).removeItem('files.filterByType');
1205
+ this.setState({ filterByType: '', showTypesMenu: null });
1206
+ }
1207
+ else {
1208
+ (window._localStorage || window.localStorage).setItem('files.filterByType', type);
1209
+ this.setState({ filterByType: type, showTypesMenu: null });
1210
+ }
1211
+ } },
1212
+ react_1.default.createElement(material_1.ListItemIcon, null,
1213
+ react_1.default.createElement(MyIcon, { fontSize: "small" })),
1214
+ react_1.default.createElement(material_1.ListItemText, null, this.props.t(`ra_fileType_${type}`)));
1215
+ })) : null,
1216
+ react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Background image') },
1217
+ react_1.default.createElement(material_1.IconButton, { color: "inherit", edge: "start", className: this.props.classes.menuButton, onClick: this.setStateBackgroundImage, size: "small" },
1218
+ react_1.default.createElement(icons_material_1.Brightness6, { fontSize: "small" }))),
1219
+ this.state.viewType !== TABLE && this.props.allowDelete ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Delete') },
1220
+ react_1.default.createElement("span", null,
1221
+ react_1.default.createElement(material_1.IconButton, { "aria-label": "delete", disabled: !this.state.selected ||
1222
+ this.state.selected === 'vis.0/' ||
1223
+ this.state.selected === 'vis-2.0/' ||
1224
+ this.state.selected === USER_DATA, color: "inherit", edge: "start", className: this.props.classes.menuButton, onClick: e => {
1225
+ e.stopPropagation();
1226
+ if (this.suppressDeleteConfirm > Date.now()) {
1227
+ this.deleteItem(this.state.selected);
1228
+ }
1229
+ else {
1230
+ this.setState({ deleteItem: this.state.selected });
1231
+ }
1232
+ }, size: "small" },
1233
+ react_1.default.createElement(icons_material_1.Delete, { fontSize: "small" })))) : null);
1234
+ }
1235
+ findItem(id, folders) {
1236
+ folders = folders || this.state.folders;
1237
+ if (!folders) {
1304
1238
  return null;
1305
- }
1306
- return res;
1307
- });
1308
- }
1309
- return /*#__PURE__*/_react["default"].createElement("div", {
1310
- style: {
1311
- position: 'relative'
1312
1239
  }
1313
- }, /*#__PURE__*/_react["default"].createElement(_material.CircularProgress, {
1314
- key: folderId,
1315
- color: "secondary",
1316
- size: 24
1317
- }), /*#__PURE__*/_react["default"].createElement("div", {
1318
- style: {
1319
- position: 'absolute',
1320
- zIndex: 2,
1321
- top: 4,
1322
- width: 24,
1323
- textAlign: 'center'
1240
+ const parts = id.split('/');
1241
+ parts.pop();
1242
+ const parentFolder = parts.join('/') || '/';
1243
+ if (!folders[parentFolder]) {
1244
+ return null;
1324
1245
  }
1325
- }, this.state.queueLength));
1246
+ return folders[parentFolder].find(item => item.id === id);
1326
1247
  }
1327
- }, {
1328
- key: "renderToolbar",
1329
- value: function renderToolbar() {
1330
- var _this16 = this;
1331
- var IconType = this.props.showTypeSelector ? FILE_TYPE_ICONS[this.state.filterByType || 'all'] || FILE_TYPE_ICONS.all : null;
1332
- var isInFolder = this.findFirstFolder(this.state.selected);
1333
- return /*#__PURE__*/_react["default"].createElement(_material.Toolbar, {
1334
- key: "toolbar",
1335
- variant: "dense"
1336
- }, this.props.allowNonRestricted && this.props.restrictToFolder ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1337
- edge: "start",
1338
- title: this.state.restrictToFolder ? this.props.t('ra_Show all folders') : this.props.t('ra_Restrict to folder'),
1339
- className: _Utils["default"].clsx(this.props.classes.menuButton, this.state.restrictToFolder && this.props.classes.menuButtonRestrictActive),
1340
- "aria-label": "restricted to folder",
1341
- onClick: function onClick() {
1342
- return _this16.setState({
1343
- restrictToFolder: _this16.state.restrictToFolder ? '' : _this16.props.restrictToFolder,
1344
- loadAllFolders: true
1345
- });
1346
- },
1347
- size: "small"
1348
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.FolderSpecial, {
1349
- fontSize: "small"
1350
- })) : null, this.props.showExpertButton ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1351
- edge: "start",
1352
- title: this.props.t('ra_Toggle expert mode'),
1353
- className: _Utils["default"].clsx(this.props.classes.menuButton, this.state.expertMode && this.props.classes.menuButtonExpertActive),
1354
- "aria-label": "expert mode",
1355
- onClick: function onClick() {
1356
- return _this16.setState({
1357
- expertMode: !_this16.state.expertMode
1358
- });
1359
- },
1360
- size: "small"
1361
- }, /*#__PURE__*/_react["default"].createElement(_IconExpert["default"], {
1362
- fontSize: "small"
1363
- })) : null, this.props.showViewTypeButton ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1364
- edge: "start",
1365
- title: this.props.t('ra_Toggle view mode'),
1366
- className: this.props.classes.menuButton,
1367
- "aria-label": "view mode",
1368
- onClick: function onClick() {
1369
- var viewType = _this16.state.viewType === TABLE ? TILE : TABLE;
1370
- (window._localStorage || window.localStorage).setItem('files.viewType', viewType);
1371
- var currentDir = _this16.state.selected;
1372
- if (isFile(currentDir)) {
1373
- currentDir = getParentDir(currentDir);
1374
- }
1375
- _this16.setState({
1376
- viewType: viewType,
1377
- currentDir: currentDir
1378
- }, function () {
1379
- if (_this16.state.viewType === TABLE) {
1380
- _this16.scrollToSelected();
1248
+ renderInputDialog() {
1249
+ if (this.state.addFolder) {
1250
+ const parentFolder = this.findFirstFolder(this.state.selected);
1251
+ if (!parentFolder) {
1252
+ window.alert(this.props.t('ra_Invalid parent folder!'));
1253
+ return null;
1381
1254
  }
1382
- });
1383
- },
1384
- size: "small"
1385
- }, this.state.viewType !== TABLE ? /*#__PURE__*/_react["default"].createElement(_iconsMaterial.List, {
1386
- fontSize: "small"
1387
- }) : /*#__PURE__*/_react["default"].createElement(_iconsMaterial.ViewModule, {
1388
- fontSize: "small"
1389
- })) : null, /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1390
- edge: "start",
1391
- title: this.props.t('ra_Hide empty folders'),
1392
- className: this.props.classes.menuButton,
1393
- color: this.state.filterEmpty ? 'secondary' : 'inherit',
1394
- "aria-label": "filter empty",
1395
- onClick: function onClick() {
1396
- (window._localStorage || window.localStorage).setItem('file.empty', !_this16.state.filterEmpty);
1397
- _this16.setState({
1398
- filterEmpty: !_this16.state.filterEmpty
1399
- });
1400
- },
1401
- size: "small"
1402
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.FolderOpen, {
1403
- fontSize: "small"
1404
- })), /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1405
- edge: "start",
1406
- title: this.props.t('ra_Reload files'),
1407
- className: this.props.classes.menuButton,
1408
- color: "inherit",
1409
- "aria-label": "reload files",
1410
- onClick: function onClick() {
1411
- return _this16.setState({
1412
- folders: {}
1413
- }, function () {
1414
- return _this16.loadFolders();
1415
- });
1416
- },
1417
- size: "small"
1418
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Refresh, {
1419
- fontSize: "small"
1420
- })), this.props.allowCreateFolder ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1421
- edge: "start",
1422
- disabled: !this.state.selected || !isInFolder || this.limitToPath && !this.state.selected.startsWith("".concat(this.limitToPath, "/")) && this.limitToPath !== this.state.selected,
1423
- title: this.props.t('ra_Create folder'),
1424
- className: this.props.classes.menuButton,
1425
- color: "inherit",
1426
- "aria-label": "add folder",
1427
- onClick: function onClick() {
1428
- return _this16.setState({
1429
- addFolder: true
1430
- });
1431
- },
1432
- size: "small"
1433
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.CreateNewFolder, {
1434
- fontSize: "small"
1435
- })) : null, this.props.allowUpload ? /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1436
- edge: "start",
1437
- disabled: !this.state.selected || !isInFolder || this.limitToPath && !this.state.selected.startsWith("".concat(this.limitToPath, "/")) && this.limitToPath !== this.state.selected,
1438
- title: this.props.t('ra_Upload file'),
1439
- className: this.props.classes.menuButton,
1440
- color: "inherit",
1441
- "aria-label": "upload file",
1442
- onClick: function onClick() {
1443
- return _this16.setState({
1444
- uploadFile: true
1445
- });
1446
- },
1447
- size: "small"
1448
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Publish, {
1449
- fontSize: "small"
1450
- })) : null, this.props.showTypeSelector ? /*#__PURE__*/_react["default"].createElement(_material.Tooltip, {
1451
- title: this.props.t('ra_Filter files')
1452
- }, /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1453
- size: "small",
1454
- onClick: function onClick(e) {
1455
- return _this16.setState({
1456
- showTypesMenu: e.target
1457
- });
1458
- }
1459
- }, /*#__PURE__*/_react["default"].createElement(IconType, {
1460
- fontSize: "small"
1461
- }))) : null, this.state.showTypesMenu ? /*#__PURE__*/_react["default"].createElement(_material.Menu, {
1462
- open: !0,
1463
- anchorEl: this.state.showTypesMenu,
1464
- onClose: function onClose() {
1465
- return _this16.setState({
1466
- showTypesMenu: null
1467
- });
1255
+ return react_1.default.createElement(TextInput_1.default, { key: "inputDialog", applyText: this.props.t('ra_Create'), cancelText: this.props.t('ra_Cancel'), titleText: this.props.t('ra_Create new folder in %s', this.state.selected), promptText: this.props.t('ra_If no file will be created in the folder, it will disappear after the browser closed'), labelText: this.props.t('ra_Folder name'), verify: (text) => (this.state.folders[parentFolder].find(item => item.name === text) ? '' : this.props.t('ra_Duplicate name')), onClose: (name) => {
1256
+ if (name) {
1257
+ const folders = {};
1258
+ Object.keys(this.state.folders).forEach(folder => folders[folder] = this.state.folders[folder]);
1259
+ const parent = this.findItem(parentFolder);
1260
+ const id = `${parentFolder}/${name}`;
1261
+ folders[parentFolder].push({
1262
+ id,
1263
+ level: ((parent === null || parent === void 0 ? void 0 : parent.level) || 0) + 1,
1264
+ name,
1265
+ folder: true,
1266
+ temp: true,
1267
+ });
1268
+ folders[parentFolder].sort(sortFolders);
1269
+ folders[id] = [];
1270
+ const expanded = [...this.state.expanded];
1271
+ if (!expanded.includes(parentFolder)) {
1272
+ expanded.push(parentFolder);
1273
+ expanded.sort();
1274
+ }
1275
+ (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1276
+ this.setState({ addFolder: false, folders, expanded }, () => this.select(id));
1277
+ }
1278
+ else {
1279
+ this.setState({ addFolder: false });
1280
+ }
1281
+ }, replace: (text) => text.replace(/[^-_\w\d]/, '_') });
1468
1282
  }
1469
- }, Object.keys(FILE_TYPE_ICONS).map(function (type) {
1470
- var MyIcon = FILE_TYPE_ICONS[type];
1471
- return /*#__PURE__*/_react["default"].createElement(_material.MenuItem, {
1472
- key: type,
1473
- selected: _this16.state.filterByType === type,
1474
- onClick: function onClick() {
1475
- if (type === 'all') {
1476
- (window._localStorage || window.localStorage).removeItem('files.filterByType');
1477
- _this16.setState({
1478
- filterByType: '',
1479
- showTypesMenu: null
1480
- });
1481
- } else {
1482
- (window._localStorage || window.localStorage).setItem('files.filterByType', type);
1483
- _this16.setState({
1484
- filterByType: type,
1485
- showTypesMenu: null
1486
- });
1487
- }
1488
- }
1489
- }, /*#__PURE__*/_react["default"].createElement(_material.ListItemIcon, null, /*#__PURE__*/_react["default"].createElement(MyIcon, {
1490
- fontSize: "small"
1491
- })), /*#__PURE__*/_react["default"].createElement(_material.ListItemText, null, _this16.props.t("ra_fileType_".concat(type))));
1492
- })) : null, /*#__PURE__*/_react["default"].createElement(_material.Tooltip, {
1493
- title: this.props.t('ra_Background image')
1494
- }, /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1495
- color: "inherit",
1496
- edge: "start",
1497
- className: this.props.classes.menuButton,
1498
- onClick: this.setStateBackgroundImage,
1499
- size: "small"
1500
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Brightness6, {
1501
- fontSize: "small"
1502
- }))), this.state.viewType !== TABLE && this.props.allowDelete ? /*#__PURE__*/_react["default"].createElement(_material.Tooltip, {
1503
- title: this.props.t('ra_Delete')
1504
- }, /*#__PURE__*/_react["default"].createElement("span", null, /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
1505
- "aria-label": "delete",
1506
- disabled: !this.state.selected || this.state.selected === 'vis.0/' || this.state.selected === 'vis-2.0/' || this.state.selected === USER_DATA,
1507
- color: "inherit",
1508
- edge: "start",
1509
- className: this.props.classes.menuButton,
1510
- onClick: function onClick(e) {
1511
- e.stopPropagation();
1512
- if (_this16.suppressDeleteConfirm > Date.now()) {
1513
- _this16.deleteItem(_this16.state.selected);
1514
- } else {
1515
- _this16.setState({
1516
- deleteItem: _this16.state.selected
1517
- });
1518
- }
1519
- },
1520
- size: "small"
1521
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Delete, {
1522
- fontSize: "small"
1523
- })))) : null);
1524
- }
1525
- }, {
1526
- key: "findItem",
1527
- value: function findItem(id, folders) {
1528
- folders = folders || this.state.folders;
1529
- if (!folders) {
1530
- return null;
1531
- }
1532
- var parts = id.split('/');
1533
- parts.pop();
1534
- var parentFolder = parts.join('/') || '/';
1535
- if (!folders[parentFolder]) {
1536
1283
  return null;
1537
- }
1538
- return folders[parentFolder].find(function (item) {
1539
- return item.id === id;
1540
- });
1541
1284
  }
1542
- }, {
1543
- key: "renderInputDialog",
1544
- value: function renderInputDialog() {
1545
- var _this17 = this;
1546
- if (this.state.addFolder) {
1547
- var parentFolder = this.findFirstFolder(this.state.selected);
1548
- if (!parentFolder) {
1549
- return window.alert(this.props.t('ra_Invalid parent folder!'));
1550
- }
1551
- return /*#__PURE__*/_react["default"].createElement(_TextInput["default"], {
1552
- key: "inputDialog",
1553
- applyText: this.props.t('ra_Create'),
1554
- cancelText: this.props.t('ra_Cancel'),
1555
- titleText: this.props.t('ra_Create new folder in %s', this.state.selected),
1556
- promptText: this.props.t('ra_If no file will be created in the folder, it will disappear after the browser closed'),
1557
- labelText: this.props.t('ra_Folder name'),
1558
- verify: function verify(text) {
1559
- return _this17.state.folders[parentFolder].find(function (item) {
1560
- return item.name === text;
1561
- }) ? '' : _this17.props.t('ra_Duplicate name');
1562
- },
1563
- onClose: function onClose(name) {
1564
- if (name) {
1565
- var folders = {};
1566
- Object.keys(_this17.state.folders).forEach(function (folder) {
1567
- return folders[folder] = _this17.state.folders[folder];
1568
- });
1569
- var parent = _this17.findItem(parentFolder);
1570
- var id = "".concat(parentFolder, "/").concat(name);
1571
- folders[parentFolder].push({
1572
- id: id,
1573
- level: parent.level + 1,
1574
- name: name,
1575
- folder: true,
1576
- temp: true
1577
- });
1578
- folders[parentFolder].sort(sortFolders);
1579
- folders[id] = [];
1580
- var expanded = (0, _toConsumableArray2["default"])(_this17.state.expanded);
1581
- if (!expanded.includes(parentFolder)) {
1582
- expanded.push(parentFolder);
1583
- expanded.sort();
1584
- }
1585
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1586
- _this17.setState({
1587
- addFolder: false,
1588
- folders: folders,
1589
- expanded: expanded
1590
- }, function () {
1591
- return _this17.select(id);
1592
- });
1593
- } else {
1594
- _this17.setState({
1595
- addFolder: false
1596
- });
1285
+ componentDidUpdate( /* prevProps , prevState, snapshot */) {
1286
+ this.setOpacityTimer && clearTimeout(this.setOpacityTimer);
1287
+ this.setOpacityTimer = setTimeout(() => {
1288
+ this.setOpacityTimer = null;
1289
+ const items = window.document.getElementsByClassName('browserItem');
1290
+ for (let i = 0; i < items.length; i++) {
1291
+ items[i].style.opacity = '1';
1597
1292
  }
1598
- },
1599
- replace: function replace(text) {
1600
- return text.replace(/[^-_\w\d]/, '_');
1601
- }
1602
- });
1603
- }
1604
- return null;
1293
+ }, 100);
1605
1294
  }
1606
- }, {
1607
- key: "componentDidUpdate",
1608
- value: function componentDidUpdate( /* prevProps , prevState, snapshot */
1609
- ) {
1610
- var _this18 = this;
1611
- this.setOpacityTimer && clearTimeout(this.setOpacityTimer);
1612
- this.setOpacityTimer = setTimeout(function () {
1613
- _this18.setOpacityTimer = null;
1614
- var items = window.document.getElementsByClassName('browserItem');
1615
- for (var i = 0; i < items.length; i++) {
1616
- items[i].style.opacity = 1;
1617
- }
1618
- }, 100);
1295
+ uploadFile(fileName, data) {
1296
+ const parts = fileName.split('/');
1297
+ const adapter = parts.shift();
1298
+ return this.props.socket.writeFile64(adapter || '', parts.join('/'), data)
1299
+ .catch(e => window.alert(`Cannot write file: ${e}`));
1619
1300
  }
1620
- }, {
1621
- key: "uploadFile",
1622
- value: function uploadFile(fileName, data) {
1623
- var parts = fileName.split('/');
1624
- var adapter = parts.shift();
1625
- return this.props.socket.writeFile64(adapter, parts.join('/'), data)["catch"](function (e) {
1626
- return window.alert("Cannot write file: ".concat(e));
1627
- });
1301
+ findFirstFolder(id) {
1302
+ let parentFolder = id;
1303
+ const item = this.findItem(parentFolder);
1304
+ // find folder
1305
+ if (item && !item.folder) {
1306
+ const parts = parentFolder.split('/');
1307
+ parts.pop();
1308
+ parentFolder = '';
1309
+ while (parts.length) {
1310
+ const _item = this.findItem(parts.join('/'));
1311
+ if (_item && _item.folder) {
1312
+ parentFolder = parts.join('/');
1313
+ break;
1314
+ }
1315
+ }
1316
+ }
1317
+ return parentFolder;
1628
1318
  }
1629
- }, {
1630
- key: "findFirstFolder",
1631
- value: function findFirstFolder(id) {
1632
- var parentFolder = id;
1633
- var item = this.findItem(parentFolder);
1634
- // find folder
1635
- if (item && !item.folder) {
1636
- var parts = parentFolder.split('/');
1637
- parts.pop();
1638
- parentFolder = '';
1639
- while (parts.length) {
1640
- var _item = this.findItem(parts.join('/'));
1641
- if (_item && _item.folder) {
1642
- parentFolder = parts.join('/');
1643
- break;
1644
- }
1319
+ renderUpload() {
1320
+ if (this.state.uploadFile) {
1321
+ return [
1322
+ react_1.default.createElement(material_1.Fab, { key: "close", color: "primary", "aria-label": "close", className: this.props.classes.uploadCloseButton, onClick: () => this.setState({ uploadFile: false }) },
1323
+ react_1.default.createElement(icons_material_1.Close, null)),
1324
+ react_1.default.createElement(react_dropzone_1.default, { key: "dropzone", onDragEnter: () => this.setState({ uploadFile: 'dragging' }), onDragLeave: () => this.setState({ uploadFile: true }), onDrop: acceptedFiles => {
1325
+ let count = acceptedFiles.length;
1326
+ acceptedFiles.forEach(file => {
1327
+ const reader = new FileReader();
1328
+ reader.onabort = () => console.log('file reading was aborted');
1329
+ reader.onerror = () => console.log('file reading has failed');
1330
+ reader.onload = () => {
1331
+ const parentFolder = this.findFirstFolder(this.state.selected);
1332
+ if (!parentFolder) {
1333
+ window.alert(this.props.t('ra_Invalid parent folder!'));
1334
+ }
1335
+ else {
1336
+ const id = `${parentFolder}/${file.name}`;
1337
+ this.uploadFile(id, reader.result)
1338
+ .then(() => {
1339
+ if (!--count) {
1340
+ this.setState({ uploadFile: false }, () => {
1341
+ if (this.supportSubscribes) {
1342
+ // open current folder
1343
+ const expanded = [...this.state.expanded];
1344
+ if (!expanded.includes(parentFolder)) {
1345
+ expanded.push(parentFolder);
1346
+ expanded.sort();
1347
+ (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1348
+ }
1349
+ this.setState({ expanded }, () => this.select(id));
1350
+ }
1351
+ else {
1352
+ setTimeout(() => this.browseFolder(parentFolder, null, false, true)
1353
+ .then(folders => {
1354
+ // open current folder
1355
+ const expanded = [...this.state.expanded];
1356
+ if (!expanded.includes(parentFolder)) {
1357
+ expanded.push(parentFolder);
1358
+ expanded.sort();
1359
+ (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1360
+ }
1361
+ this.setState({ folders, expanded }, () => this.select(id));
1362
+ }), 500);
1363
+ }
1364
+ });
1365
+ }
1366
+ });
1367
+ }
1368
+ };
1369
+ reader.readAsArrayBuffer(file);
1370
+ });
1371
+ } }, ({ 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()),
1372
+ react_1.default.createElement("input", Object.assign({}, getInputProps())),
1373
+ react_1.default.createElement("div", { className: this.props.classes.uploadCenterDiv },
1374
+ react_1.default.createElement("div", { className: this.props.classes.uploadCenterTextAndIcon },
1375
+ react_1.default.createElement(icons_material_1.Publish, { className: this.props.classes.uploadCenterIcon }),
1376
+ react_1.default.createElement("div", { className: this.props.classes.uploadCenterText }, this.state.uploadFile === 'dragging' ? this.props.t('ra_Drop file here') :
1377
+ this.props.t('ra_Place your files here or click here to open the browse dialog'))))))),
1378
+ ];
1645
1379
  }
1646
- }
1647
- return parentFolder;
1380
+ return null;
1648
1381
  }
1649
- }, {
1650
- key: "renderUpload",
1651
- value: function renderUpload() {
1652
- var _this19 = this;
1653
- if (this.state.uploadFile) {
1654
- return [/*#__PURE__*/_react["default"].createElement(_material.Fab, {
1655
- key: "close",
1656
- color: "primary",
1657
- "aria-label": "close",
1658
- className: this.props.classes.uploadCloseButton,
1659
- onClick: function onClick() {
1660
- return _this19.setState({
1661
- uploadFile: false
1662
- });
1663
- }
1664
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Close, null)), /*#__PURE__*/_react["default"].createElement(_reactDropzone["default"], {
1665
- key: "dropzone",
1666
- onDragEnter: function onDragEnter() {
1667
- return _this19.setState({
1668
- uploadFile: 'dragging'
1669
- });
1670
- },
1671
- onDragLeave: function onDragLeave() {
1672
- return _this19.setState({
1673
- uploadFile: true
1674
- });
1675
- },
1676
- onDrop: function onDrop(acceptedFiles) {
1677
- var count = acceptedFiles.length;
1678
- acceptedFiles.forEach(function (file) {
1679
- var reader = new FileReader();
1680
- reader.onabort = function () {
1681
- return console.log('file reading was aborted');
1682
- };
1683
- reader.onerror = function () {
1684
- return console.log('file reading has failed');
1685
- };
1686
- reader.onload = function () {
1687
- var parentFolder = _this19.findFirstFolder(_this19.state.selected);
1688
- if (!parentFolder) {
1689
- window.alert(_this19.props.t('ra_Invalid parent folder!'));
1690
- } else {
1691
- var id = "".concat(parentFolder, "/").concat(file.name);
1692
- _this19.uploadFile(id, reader.result).then(function () {
1693
- if (! --count) {
1694
- _this19.setState({
1695
- uploadFile: false
1696
- }, function () {
1697
- if (_this19.supportSubscribes) {
1698
- // open current folder
1699
- var expanded = (0, _toConsumableArray2["default"])(_this19.state.expanded);
1700
- if (!expanded.includes(parentFolder)) {
1701
- expanded.push(parentFolder);
1702
- expanded.sort();
1703
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1704
- }
1705
- _this19.setState({
1706
- expanded: expanded
1707
- }, function () {
1708
- return _this19.select(id);
1709
- });
1710
- } else {
1711
- setTimeout(function () {
1712
- return _this19.browseFolder(parentFolder, true).then(function (folders) {
1713
- // open current folder
1714
- var expanded = (0, _toConsumableArray2["default"])(_this19.state.expanded);
1715
- if (!expanded.includes(parentFolder)) {
1716
- expanded.push(parentFolder);
1717
- expanded.sort();
1718
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1719
- }
1720
- _this19.setState({
1721
- folders: folders,
1722
- expanded: expanded
1723
- }, function () {
1724
- return _this19.select(id);
1725
- });
1726
- });
1727
- }, 500);
1382
+ deleteRecursive(id) {
1383
+ const item = this.findItem(id);
1384
+ if (item === null || item === void 0 ? void 0 : item.folder) {
1385
+ return (this.state.folders[id] ? Promise.all(this.state.folders[id].map(_item => this.deleteRecursive(_item.id))) : Promise.resolve())
1386
+ .then(() => {
1387
+ // If it is a folder of second level
1388
+ if (item.level >= 1) {
1389
+ const parts = id.split('/');
1390
+ const adapter = parts.shift();
1391
+ this.props.socket.deleteFolder(adapter || '', parts.join('/'))
1392
+ .then(() => {
1393
+ // remove this folder
1394
+ const folders = JSON.parse(JSON.stringify(this.state.folders));
1395
+ delete folders[item.id];
1396
+ // delete folder from parent item
1397
+ const parentId = getParentDir(item.id);
1398
+ const parentFolder = folders[parentId];
1399
+ if (parentFolder) {
1400
+ const pos = parentFolder.findIndex((f) => f.id === item.id);
1401
+ if (pos !== -1) {
1402
+ parentFolder.splice(pos, 1);
1403
+ }
1404
+ this.select(parentId, null, () => this.setState({ folders }));
1728
1405
  }
1729
- });
1730
- }
1731
- });
1406
+ });
1732
1407
  }
1733
- };
1734
- reader.readAsArrayBuffer(file);
1735
1408
  });
1736
- }
1737
- }, function (_ref2) {
1738
- var getRootProps = _ref2.getRootProps,
1739
- getInputProps = _ref2.getInputProps;
1740
- return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
1741
- className: _Utils["default"].clsx(_this19.props.classes.uploadDiv, _this19.state.uploadFile === 'dragging' && _this19.props.classes.uploadDivDragging)
1742
- }, getRootProps()), /*#__PURE__*/_react["default"].createElement("input", getInputProps()), /*#__PURE__*/_react["default"].createElement("div", {
1743
- className: _this19.props.classes.uploadCenterDiv
1744
- }, /*#__PURE__*/_react["default"].createElement("div", {
1745
- className: _this19.props.classes.uploadCenterTextAndIcon
1746
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.Publish, {
1747
- className: _this19.props.classes.uploadCenterIcon
1748
- }), /*#__PURE__*/_react["default"].createElement("div", {
1749
- className: _this19.props.classes.uploadCenterText
1750
- }, _this19.state.uploadFile === 'dragging' ? _this19.props.t('ra_Drop file here') : _this19.props.t('ra_Place your files here or click here to open the browse dialog')))));
1751
- })];
1752
- }
1753
- return null;
1409
+ }
1410
+ const parts = id.split('/');
1411
+ const adapter = parts.shift();
1412
+ if (parts.length) {
1413
+ return this.props.socket.deleteFile(adapter || '', parts.join('/'))
1414
+ .catch(e => window.alert(`Cannot delete file: ${e}`));
1415
+ }
1416
+ return Promise.resolve();
1754
1417
  }
1755
- }, {
1756
- key: "deleteRecursive",
1757
- value: function deleteRecursive(id) {
1758
- var _this20 = this;
1759
- var item = this.findItem(id);
1760
- if (item.folder) {
1761
- return (this.state.folders[id] ? Promise.all(this.state.folders[id].map(function (_item) {
1762
- return _this20.deleteRecursive(_item.id);
1763
- })) : Promise.resolve()).then(function () {
1764
- // If it is folder of second level
1765
- if (item.level >= 1) {
1766
- var _parts2 = id.split('/');
1767
- var _adapter2 = _parts2.shift();
1768
- _this20.props.socket.deleteFolder(_adapter2, _parts2.join('/')).then(function () {
1769
- // remove this folder
1770
- var folders = JSON.parse(JSON.stringify(_this20.state.folders));
1771
- delete folders[item.id];
1772
- // delete folder from parent item
1773
- var parentId = getParentDir(item.id);
1774
- var parentFolder = folders[parentId];
1775
- if (parentFolder) {
1776
- var pos = parentFolder.indexOf(parentFolder.find(function (f) {
1777
- return f.id === item.id;
1778
- }));
1779
- if (pos !== -1) {
1780
- parentFolder.splice(pos, 1);
1781
- }
1782
- _this20.select(parentId, function () {
1783
- return _this20.setState({
1784
- folders: folders
1785
- });
1418
+ deleteItem(deleteItem) {
1419
+ deleteItem = deleteItem || this.state.deleteItem;
1420
+ this.setState({ deleteItem: '' }, () => this.deleteRecursive(deleteItem)
1421
+ .then(() => {
1422
+ const newState = {};
1423
+ const pos = this.state.expanded.indexOf(deleteItem);
1424
+ if (pos !== -1) {
1425
+ const expanded = [...this.state.expanded];
1426
+ expanded.splice(pos, 1);
1427
+ (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1428
+ newState.expanded = expanded;
1429
+ }
1430
+ if (this.state.selected === deleteItem) {
1431
+ const parts = this.state.selected.split('/');
1432
+ parts.pop();
1433
+ newState.selected = parts.join('/');
1434
+ }
1435
+ if (!this.supportSubscribes) {
1436
+ const parentFolder = this.findFirstFolder(deleteItem);
1437
+ const folders = {};
1438
+ Object.keys(this.state.folders).forEach(name => {
1439
+ if (name !== parentFolder && !name.startsWith(`${parentFolder}/`)) {
1440
+ folders[name] = this.state.folders[name];
1441
+ }
1786
1442
  });
1787
- }
1788
- });
1789
- }
1790
- });
1791
- }
1792
- var parts = id.split('/');
1793
- var adapter = parts.shift();
1794
- if (parts.length) {
1795
- return this.props.socket.deleteFile(adapter, parts.join('/'))["catch"](function (e) {
1796
- return window.alert("Cannot delete file: ".concat(e));
1797
- });
1798
- }
1799
- return Promise.resolve();
1443
+ newState.folders = folders;
1444
+ // @ts-expect-error fix later
1445
+ this.setState(newState, () => setTimeout(() => {
1446
+ this.browseFolders([...this.state.expanded], folders)
1447
+ .then(_folders => this.setState({ folders: _folders }));
1448
+ }, 200));
1449
+ }
1450
+ else {
1451
+ // @ts-expect-error fix later
1452
+ this.setState(newState);
1453
+ }
1454
+ }));
1800
1455
  }
1801
- }, {
1802
- key: "deleteItem",
1803
- value: function deleteItem(_deleteItem) {
1804
- var _this21 = this;
1805
- _deleteItem = _deleteItem || this.state.deleteItem;
1806
- this.setState({
1807
- deleteItem: ''
1808
- }, function () {
1809
- return _this21.deleteRecursive(_deleteItem).then(function () {
1810
- var newState = {};
1811
- var pos = _this21.state.expanded.indexOf(_deleteItem);
1812
- if (pos !== -1) {
1813
- var expanded = (0, _toConsumableArray2["default"])(_this21.state.expanded);
1814
- expanded.splice(pos, 1);
1815
- (window._localStorage || window.localStorage).setItem('files.expanded', JSON.stringify(expanded));
1816
- newState.expanded = expanded;
1817
- }
1818
- if (_this21.state.selected === _deleteItem) {
1819
- var parts = _this21.state.selected.split('/');
1820
- parts.pop();
1821
- newState.selected = parts.join('/');
1822
- }
1823
- if (!_this21.supportSubscribes) {
1824
- var parentFolder = _this21.findFirstFolder(_deleteItem);
1825
- var folders = {};
1826
- Object.keys(_this21.state.folders).forEach(function (name) {
1827
- if (name !== parentFolder && !name.startsWith("".concat(parentFolder, "/"))) {
1828
- folders[name] = _this21.state.folders[name];
1829
- }
1830
- });
1831
- newState.folders = folders;
1832
- _this21.setState(newState, function () {
1833
- return setTimeout(function () {
1834
- return _this21.browseFolders((0, _toConsumableArray2["default"])(_this21.state.expanded), folders).then(function (_folders) {
1835
- return _this21.setState({
1836
- folders: _folders
1837
- });
1838
- });
1839
- }, 200);
1840
- });
1841
- } else {
1842
- _this21.setState(newState);
1843
- }
1844
- });
1845
- });
1456
+ renderDeleteDialog() {
1457
+ if (this.state.deleteItem) {
1458
+ return react_1.default.createElement(material_1.Dialog, { key: "deleteDialog", open: !0, onClose: () => this.setState({ deleteItem: '' }), "aria-labelledby": "ar_dialog_file_delete_title" },
1459
+ react_1.default.createElement(material_1.DialogTitle, { id: "ar_dialog_file_delete_title" }, this.props.t('ra_Confirm deletion of %s', this.state.deleteItem.split('/').pop())),
1460
+ react_1.default.createElement(material_1.DialogContent, null,
1461
+ react_1.default.createElement(material_1.DialogContentText, null, this.props.t('ra_Are you sure?'))),
1462
+ react_1.default.createElement(material_1.DialogActions, null,
1463
+ react_1.default.createElement(material_1.Button
1464
+ // @ts-expect-error grey is valid color
1465
+ , {
1466
+ // @ts-expect-error grey is valid color
1467
+ color: "grey", variant: "contained", onClick: () => {
1468
+ this.suppressDeleteConfirm = Date.now() + 60000 * 5;
1469
+ this.deleteItem('');
1470
+ } }, this.props.t('ra_Delete (no confirm for 5 mins)')),
1471
+ react_1.default.createElement(material_1.Button, { variant: "contained", onClick: () => this.deleteItem(''), color: "primary", autoFocus: true }, this.props.t('ra_Delete')),
1472
+ react_1.default.createElement(material_1.Button, { variant: "contained", onClick: () => this.setState({ deleteItem: '' }),
1473
+ // @ts-expect-error grey is valid color
1474
+ color: "grey" }, this.props.t('ra_Cancel'))));
1475
+ }
1476
+ return false;
1846
1477
  }
1847
- }, {
1848
- key: "renderDeleteDialog",
1849
- value: function renderDeleteDialog() {
1850
- var _this22 = this;
1851
- if (this.state.deleteItem) {
1852
- return /*#__PURE__*/_react["default"].createElement(_material.Dialog, {
1853
- key: "deleteDialog",
1854
- open: !0,
1855
- onClose: function onClose() {
1856
- return _this22.setState({
1857
- deleteItem: ''
1858
- });
1859
- },
1860
- "aria-labelledby": "ar_dialog_file_delete_title"
1861
- }, /*#__PURE__*/_react["default"].createElement(_material.DialogTitle, {
1862
- id: "ar_dialog_file_delete_title"
1863
- }, this.props.t('ra_Confirm deletion of %s', this.state.deleteItem.split('/').pop())), /*#__PURE__*/_react["default"].createElement(_material.DialogContent, null, /*#__PURE__*/_react["default"].createElement(_material.DialogContentText, null, this.props.t('ra_Are you sure?'))), /*#__PURE__*/_react["default"].createElement(_material.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_material.Button, {
1864
- color: "grey",
1865
- variant: "contained",
1866
- onClick: function onClick() {
1867
- _this22.suppressDeleteConfirm = Date.now() + 60000 * 5;
1868
- _this22.deleteItem();
1869
- }
1870
- }, this.props.t('ra_Delete (no confirm for 5 mins)')), /*#__PURE__*/_react["default"].createElement(_material.Button, {
1871
- variant: "contained",
1872
- onClick: function onClick() {
1873
- return _this22.deleteItem();
1874
- },
1875
- color: "primary",
1876
- autoFocus: true
1877
- }, this.props.t('ra_Delete')), /*#__PURE__*/_react["default"].createElement(_material.Button, {
1878
- variant: "contained",
1879
- onClick: function onClick() {
1880
- return _this22.setState({
1881
- deleteItem: ''
1882
- });
1883
- },
1884
- color: "grey"
1885
- }, this.props.t('ra_Cancel'))));
1886
- }
1887
- return false;
1478
+ renderViewDialog() {
1479
+ 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;
1888
1480
  }
1889
- }, {
1890
- key: "renderViewDialog",
1891
- value: function renderViewDialog() {
1892
- var _this23 = this;
1893
- return this.state.viewer ? /*#__PURE__*/_react["default"].createElement(_FileViewer["default"], {
1894
- supportSubscribes: this.supportSubscribes,
1895
- key: this.state.viewer,
1896
- href: this.state.viewer,
1897
- formatEditFile: this.state.formatEditFile,
1898
- themeType: this.props.themeType,
1899
- setStateBackgroundImage: this.setStateBackgroundImage,
1900
- getClassBackgroundImage: this.getClassBackgroundImage,
1901
- t: this.props.t,
1902
- socket: this.props.socket,
1903
- lang: this.props.lang,
1904
- expertMode: this.state.expertMode,
1905
- onClose: function onClose() {
1906
- return _this23.setState({
1907
- viewer: '',
1908
- formatEditFile: ''
1909
- });
1481
+ renderError() {
1482
+ if (this.state.errorText) {
1483
+ return react_1.default.createElement(Error_1.default, { key: "errorDialog", text: this.state.errorText, onClose: () => this.setState({ errorText: '' }) });
1910
1484
  }
1911
- }) : null;
1912
- }
1913
- }, {
1914
- key: "renderError",
1915
- value: function renderError() {
1916
- var _this24 = this;
1917
- if (this.state.errorText) {
1918
- return /*#__PURE__*/_react["default"].createElement(_Error["default"], {
1919
- classes: {},
1920
- key: "errorDialog",
1921
- text: this.state.errorText,
1922
- onClose: function onClose() {
1923
- return _this24.setState({
1924
- errorText: ''
1925
- });
1926
- }
1927
- });
1928
- }
1929
- return null;
1485
+ return null;
1930
1486
  }
1931
-
1932
1487
  // used in tabs/Files
1933
1488
  // eslint-disable-next-line react/no-unused-class-component-methods
1934
- }, {
1935
- key: "updateItemsAcl",
1936
- value: function updateItemsAcl(info) {
1937
- var _this25 = this;
1938
- this.cacheFolders = this.cacheFolders || JSON.parse(JSON.stringify(this.state.folders));
1939
- var changed;
1940
- info.forEach(function (it) {
1941
- var item = _this25.findItem(it.id, _this25.cacheFolders);
1942
- if (item && JSON.stringify(item.acl) !== JSON.stringify(it.acl)) {
1943
- item.acl = it.acl;
1944
- changed = true;
1945
- }
1946
- });
1947
- if (changed) {
1948
- this.cacheFoldersTimeout && clearTimeout(this.cacheFoldersTimeout);
1949
- this.cacheFoldersTimeout = setTimeout(function () {
1950
- _this25.cacheFoldersTimeout = null;
1951
- var folders = _this25.cacheFolders;
1952
- _this25.cacheFolders = null;
1953
- _this25.setState({
1954
- folders: folders
1955
- });
1956
- }, 200);
1957
- }
1958
- }
1959
- }, {
1960
- key: "changeToPath",
1961
- value: function changeToPath() {
1962
- var _this26 = this;
1963
- setTimeout(function () {
1964
- if (_this26.state.path !== _this26.state.selected && (!_this26.lastSelect || Date.now() - _this26.lastSelect > 100)) {
1965
- var folder = _this26.state.path;
1966
- if (isFile(_this26.state.path)) {
1967
- folder = getParentDir(_this26.state.path);
1968
- }
1969
- new Promise(function (resolve) {
1970
- if (!_this26.state.folders[folder]) {
1971
- _this26.browseFolder(folder).then(function (folders) {
1972
- return _this26.setState({
1973
- folders: folders
1974
- }, function () {
1975
- return resolve(true);
1976
- });
1977
- })["catch"](function (err) {
1978
- return _this26.setState({
1979
- errorText: err === NOT_FOUND ? _this26.props.t('ra_Cannot find "%s"', folder) : _this26.props.t('ra_Cannot read "%s"', folder)
1980
- });
1981
- });
1982
- } else {
1983
- resolve(true);
1489
+ updateItemsAcl(info) {
1490
+ this.cacheFolders = this.cacheFolders || JSON.parse(JSON.stringify(this.state.folders));
1491
+ let changed;
1492
+ info.forEach(it => {
1493
+ const item = this.findItem(it.id, this.cacheFolders);
1494
+ if (item && JSON.stringify(item.acl) !== JSON.stringify(it.acl)) {
1495
+ item.acl = it.acl;
1496
+ changed = true;
1984
1497
  }
1985
- }).then(function (result) {
1986
- return result && _this26.setState({
1987
- selected: _this26.state.path,
1988
- currentDir: folder,
1989
- pathFocus: false
1990
- });
1991
- });
1992
- } else if (!_this26.lastSelect || Date.now() - _this26.lastSelect > 100) {
1993
- _this26.setState({
1994
- pathFocus: false
1995
- });
1498
+ });
1499
+ if (changed) {
1500
+ this.cacheFoldersTimeout && clearTimeout(this.cacheFoldersTimeout);
1501
+ this.cacheFoldersTimeout = setTimeout(() => {
1502
+ this.cacheFoldersTimeout = null;
1503
+ const folders = this.cacheFolders || {};
1504
+ this.cacheFolders = null;
1505
+ this.setState({ folders });
1506
+ }, 200);
1996
1507
  }
1997
- }, 100);
1998
1508
  }
1999
- }, {
2000
- key: "renderBreadcrumb",
2001
- value: function renderBreadcrumb() {
2002
- var _this27 = this;
2003
- var parts = this.state.currentDir.startsWith('/') ? this.state.currentDir.split('/') : "/".concat(this.state.currentDir).split('/');
2004
- var p = [];
2005
- return /*#__PURE__*/_react["default"].createElement(_material.Breadcrumbs, {
2006
- style: {
2007
- paddingLeft: 8
2008
- }
2009
- }, parts.map(function (part, i) {
2010
- part && p.push(part);
2011
- var path = p.join('/');
2012
- if (i < parts.length - 1) {
2013
- return /*#__PURE__*/_react["default"].createElement("div", {
2014
- key: "".concat(_this27.state.selected, "_").concat(i),
2015
- className: _this27.props.classes.pathDivBreadcrumbDir,
2016
- onClick: function onClick(e) {
2017
- return _this27.changeFolder(e, path || '/');
1509
+ changeToPath() {
1510
+ setTimeout(() => {
1511
+ if (this.state.path !== this.state.selected && (!this.lastSelect || Date.now() - this.lastSelect > 100)) {
1512
+ let folder = this.state.path;
1513
+ if (isFile(this.state.path)) {
1514
+ folder = getParentDir(this.state.path);
1515
+ }
1516
+ new Promise(resolve => {
1517
+ if (!this.state.folders[folder]) {
1518
+ this.browseFolder(folder)
1519
+ .then(folders => this.setState({ folders }, () => resolve(true)))
1520
+ .catch(err => this.setState({ errorText: err === NOT_FOUND ? this.props.t('ra_Cannot find "%s"', folder) : this.props.t('ra_Cannot read "%s"', folder) }));
1521
+ }
1522
+ else {
1523
+ resolve(true);
1524
+ }
1525
+ })
1526
+ .then(result => result && this.setState({ selected: this.state.path, currentDir: folder, pathFocus: false }));
2018
1527
  }
2019
- }, part || _this27.props.t('ra_Root'));
2020
- }
2021
- return /*#__PURE__*/_react["default"].createElement("div", {
2022
- className: _this27.props.classes.pathDivBreadcrumbSelected,
2023
- key: "".concat(_this27.state.selected, "_").concat(i),
2024
- onClick: function onClick() {
2025
- return _this27.setState({
2026
- pathFocus: true
2027
- });
2028
- }
2029
- }, part);
2030
- }));
2031
- }
2032
- }, {
2033
- key: "renderPath",
2034
- value: function renderPath() {
2035
- var _this28 = this;
2036
- return /*#__PURE__*/_react["default"].createElement("div", {
2037
- key: "path",
2038
- className: this.props.classes.pathDiv
2039
- }, this.state.pathFocus ? /*#__PURE__*/_react["default"].createElement(_material.Input, {
2040
- value: this.state.path,
2041
- onKeyDown: function onKeyDown(e) {
2042
- if (e.keyCode === 13) {
2043
- _this28.changeToPath();
2044
- } else if (e.keyCode === 27) {
2045
- _this28.setState({
2046
- pathFocus: false
2047
- });
2048
- }
2049
- },
2050
- endAdornment: /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
2051
- size: "small",
2052
- onClick: function onClick() {
2053
- return _this28.changeToPath();
2054
- }
2055
- }, /*#__PURE__*/_react["default"].createElement(_iconsMaterial.KeyboardReturn, null)),
2056
- onBlur: function onBlur() {
2057
- return _this28.changeToPath();
2058
- },
2059
- onChange: function onChange(e) {
2060
- return _this28.setState({
2061
- path: e.target.value
2062
- });
2063
- },
2064
- className: this.props.classes.pathDivInput
2065
- }) : this.renderBreadcrumb());
1528
+ else if (!this.lastSelect || Date.now() - this.lastSelect > 100) {
1529
+ this.setState({ pathFocus: false });
1530
+ }
1531
+ }, 100);
2066
1532
  }
2067
- }, {
2068
- key: "render",
2069
- value: function render() {
2070
- var _this29 = this;
2071
- if (!this.props.ready) {
2072
- return /*#__PURE__*/_react["default"].createElement(_material.LinearProgress, null);
2073
- }
2074
- if (this.state.loadAllFolders && !this.foldersLoading) {
2075
- this.foldersLoading = true;
2076
- setTimeout(function () {
2077
- _this29.setState({
2078
- loadAllFolders: false,
2079
- folders: {}
2080
- }, function () {
2081
- _this29.foldersLoading = false;
2082
- _this29.loadFolders();
2083
- });
2084
- }, 300);
2085
- }
2086
- return /*#__PURE__*/_react["default"].createElement("div", {
2087
- style: this.props.style,
2088
- className: _Utils["default"].clsx(this.props.classes.root, this.props.className)
2089
- }, this.props.showToolbar ? this.renderToolbar() : null, this.state.viewType === TILE ? this.renderPath() : null, /*#__PURE__*/_react["default"].createElement("div", {
2090
- className: _Utils["default"].clsx(this.props.classes.filesDiv, this.props.classes["filesDiv".concat(this.state.viewType)]),
2091
- onClick: function onClick(e) {
2092
- if (_this29.state.viewType !== TABLE) {
2093
- if (_this29.state.selected !== (_this29.state.currentDir || '/')) {
2094
- _this29.changeFolder(e, _this29.state.currentDir || '/');
2095
- } else {
2096
- e.stopPropagation();
1533
+ renderBreadcrumb() {
1534
+ const parts = this.state.currentDir.startsWith('/') ? this.state.currentDir.split('/') : (`/${this.state.currentDir}`).split('/');
1535
+ const p = [];
1536
+ return react_1.default.createElement(material_1.Breadcrumbs, { style: { paddingLeft: 8 } }, parts.map((part, i) => {
1537
+ part && p.push(part);
1538
+ const path = p.join('/');
1539
+ if (i < parts.length - 1) {
1540
+ 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'));
2097
1541
  }
2098
- }
2099
- }
2100
- }, this.state.viewType === TABLE ? this.renderItems('/') : this.renderItems(this.state.currentDir || '/'), this.state.viewType !== TABLE ? /*#__PURE__*/_react["default"].createElement("div", {
2101
- className: this.props.classes.filesDivHint
2102
- }, this.props.t('ra_select_folder_hint')) : null), this.props.allowUpload ? this.renderInputDialog() : null, this.props.allowUpload ? this.renderUpload() : null, this.props.allowDelete ? this.renderDeleteDialog() : null, this.props.allowView ? this.renderViewDialog() : null, this.state.modalEditOfAccess && this.props.modalEditOfAccessControl && this.props.modalEditOfAccessControl(this), this.renderError());
1542
+ return react_1.default.createElement("div", { className: this.props.classes.pathDivBreadcrumbSelected, key: `${this.state.selected}_${i}`, onClick: () => this.setState({ pathFocus: true }) }, part);
1543
+ }));
2103
1544
  }
2104
- }], [{
2105
- key: "getDerivedStateFromProps",
2106
- value: function getDerivedStateFromProps(props, state) {
2107
- if (props.expertMode !== undefined && props.expertMode !== state.expertMode) {
2108
- return {
2109
- expertMode: props.expertMode,
2110
- loadAllFolders: true
2111
- };
2112
- }
2113
- return null;
1545
+ renderPath() {
1546
+ return react_1.default.createElement("div", { key: "path", className: this.props.classes.pathDiv }, this.state.pathFocus ?
1547
+ react_1.default.createElement(material_1.Input, { value: this.state.path, onKeyDown: e => {
1548
+ if (e.keyCode === 13) {
1549
+ this.changeToPath();
1550
+ }
1551
+ else if (e.keyCode === 27) {
1552
+ this.setState({ pathFocus: false });
1553
+ }
1554
+ }, endAdornment: react_1.default.createElement(material_1.IconButton, { size: "small", onClick: () => this.changeToPath() },
1555
+ 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 })
1556
+ :
1557
+ this.renderBreadcrumb());
2114
1558
  }
2115
- }, {
2116
- key: "getEditFile",
2117
- value: function getEditFile(ext) {
2118
- switch (ext) {
2119
- case 'json':
2120
- case 'json5':
2121
- case 'js':
2122
- case 'html':
2123
- case 'txt':
2124
- case 'css':
2125
- case 'log':
2126
- return true;
2127
- default:
2128
- return false;
2129
- }
1559
+ render() {
1560
+ if (!this.props.ready) {
1561
+ return react_1.default.createElement(material_1.LinearProgress, null);
1562
+ }
1563
+ if (this.state.loadAllFolders && !this.foldersLoading) {
1564
+ this.foldersLoading = true;
1565
+ setTimeout(() => {
1566
+ this.setState({ loadAllFolders: false, folders: {} }, () => {
1567
+ this.foldersLoading = false;
1568
+ this.loadFolders();
1569
+ });
1570
+ }, 300);
1571
+ }
1572
+ return react_1.default.createElement("div", { style: this.props.style, className: Utils_1.default.clsx(this.props.classes.root, this.props.className) },
1573
+ this.props.showToolbar ? this.renderToolbar() : null,
1574
+ this.state.viewType === TILE ? this.renderPath() : null,
1575
+ react_1.default.createElement("div", { className: Utils_1.default.clsx(this.props.classes.filesDiv, this.props.classes[`filesDiv${this.state.viewType}`]), onClick: e => {
1576
+ if (this.state.viewType !== TABLE) {
1577
+ if (this.state.selected !== (this.state.currentDir || '/')) {
1578
+ this.changeFolder(e, this.state.currentDir || '/');
1579
+ }
1580
+ else {
1581
+ e.stopPropagation();
1582
+ }
1583
+ }
1584
+ } },
1585
+ this.state.viewType === TABLE ? this.renderItems('/') : this.renderItems(this.state.currentDir || '/'),
1586
+ this.state.viewType !== TABLE ? react_1.default.createElement("div", { className: this.props.classes.filesDivHint }, this.props.t('ra_select_folder_hint')) : null),
1587
+ this.props.allowUpload ? this.renderInputDialog() : null,
1588
+ this.props.allowUpload ? this.renderUpload() : null,
1589
+ this.props.allowDelete ? this.renderDeleteDialog() : null,
1590
+ this.props.allowView ? this.renderViewDialog() : null,
1591
+ this.state.modalEditOfAccess && this.props.modalEditOfAccessControl ? this.props.modalEditOfAccessControl(this) : null,
1592
+ this.renderError());
2130
1593
  }
2131
- }]);
2132
- return FileBrowser;
2133
- }(_react.Component);
2134
- FileBrowser.defaultProps = {
2135
- modalEditOfAccessControl: function modalEditOfAccessControl() {}
2136
- };
2137
- FileBrowser.propTypes = {
2138
- style: _propTypes["default"].object,
2139
- className: _propTypes["default"].string,
2140
- t: _propTypes["default"].func.isRequired,
2141
- lang: _propTypes["default"].string.isRequired,
2142
- socket: _propTypes["default"].object.isRequired,
2143
- ready: _propTypes["default"].bool,
2144
- expertMode: _propTypes["default"].bool,
2145
- showTypeSelector: _propTypes["default"].bool,
2146
- showToolbar: _propTypes["default"].bool,
2147
- allowUpload: _propTypes["default"].bool,
2148
- allowDownload: _propTypes["default"].bool,
2149
- allowCreateFolder: _propTypes["default"].bool,
2150
- allowDelete: _propTypes["default"].bool,
2151
- allowView: _propTypes["default"].bool,
2152
- imagePrefix: _propTypes["default"].string,
2153
- showExpertButton: _propTypes["default"].bool,
2154
- viewType: _propTypes["default"].string,
2155
- showViewTypeButton: _propTypes["default"].bool,
2156
- themeType: _propTypes["default"].string,
2157
- restrictToFolder: _propTypes["default"].string,
2158
- // If defined, allow selecting only files from this folder
2159
- allowNonRestricted: _propTypes["default"].bool,
2160
- // If restrictToFolder defined, allow selecting files outside of this folder
2161
-
2162
- selected: _propTypes["default"].string,
2163
- tileView: _propTypes["default"].bool,
2164
- filterFiles: _propTypes["default"].array,
2165
- // like ['png', 'svg', 'bmp', 'jpg', 'jpeg', 'gif']
2166
- filterByType: _propTypes["default"].string,
2167
- // images, code or txt from EXTENSIONS
2168
- onSelect: _propTypes["default"].func,
2169
- // function (id, isDoubleClick)
2170
-
2171
- modalEditOfAccessControl: _propTypes["default"].func
2172
- };
2173
-
2174
- /** @type {typeof FileBrowser} */
2175
- var _export = (0, _withWidth["default"])()((0, _styles.withStyles)(styles)(FileBrowser));
2176
- var _default = exports["default"] = _export;
2177
- //# sourceMappingURL=FileBrowser.js.map
1594
+ }
1595
+ exports.default = (0, withWidth_1.default)()((0, styles_1.withStyles)(styles)(FileBrowser));