@iobroker/adapter-react-v5 2.1.10 → 2.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Components/FileBrowser.js +248 -222
- package/Components/FileBrowser.js.map +1 -1
- package/Components/FileViewer.js +219 -75
- package/Components/FileViewer.js.map +1 -1
- package/Components/Utils.js +25 -0
- package/Components/Utils.js.map +1 -1
- package/README.md +4 -1
- package/package.json +1 -1
package/Components/FileViewer.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
5
7
|
Object.defineProperty(exports, "__esModule", {
|
|
6
8
|
value: true
|
|
7
9
|
});
|
|
@@ -11,20 +13,26 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
|
|
|
11
13
|
|
|
12
14
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
15
|
|
|
16
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
17
|
+
|
|
14
18
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
15
19
|
|
|
16
20
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
17
21
|
|
|
18
22
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
19
23
|
|
|
20
|
-
var
|
|
24
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
25
|
+
|
|
26
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
21
27
|
|
|
22
|
-
var
|
|
28
|
+
var _styles = require("@mui/styles");
|
|
23
29
|
|
|
24
|
-
var
|
|
30
|
+
var _withWidth = _interopRequireDefault(require("./withWidth"));
|
|
25
31
|
|
|
26
32
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
27
33
|
|
|
34
|
+
var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
|
|
35
|
+
|
|
28
36
|
var _Button = _interopRequireDefault(require("@mui/material/Button"));
|
|
29
37
|
|
|
30
38
|
var _Dialog = _interopRequireDefault(require("@mui/material/Dialog"));
|
|
@@ -35,7 +43,7 @@ var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent
|
|
|
35
43
|
|
|
36
44
|
var _DialogTitle = _interopRequireDefault(require("@mui/material/DialogTitle"));
|
|
37
45
|
|
|
38
|
-
var
|
|
46
|
+
var _material = require("@mui/material");
|
|
39
47
|
|
|
40
48
|
var _no_icon = _interopRequireDefault(require("../assets/no_icon.svg"));
|
|
41
49
|
|
|
@@ -43,29 +51,27 @@ var _Utils = _interopRequireDefault(require("./Utils"));
|
|
|
43
51
|
|
|
44
52
|
var _fa = require("react-icons/fa");
|
|
45
53
|
|
|
54
|
+
var _Brightness = _interopRequireDefault(require("@mui/icons-material/Brightness6"));
|
|
55
|
+
|
|
46
56
|
var _Close = _interopRequireDefault(require("@mui/icons-material/Close"));
|
|
47
57
|
|
|
58
|
+
var _Save = _interopRequireDefault(require("@mui/icons-material/Save"));
|
|
59
|
+
|
|
60
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
61
|
+
|
|
62
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
63
|
+
|
|
48
64
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
49
65
|
|
|
50
66
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
51
67
|
|
|
52
|
-
// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
|
|
53
|
-
var withWidth = function withWidth() {
|
|
54
|
-
return function (WrappedComponent) {
|
|
55
|
-
return function (props) {
|
|
56
|
-
return /*#__PURE__*/_react["default"].createElement(WrappedComponent, (0, _extends2["default"])({}, props, {
|
|
57
|
-
width: "xs"
|
|
58
|
-
}));
|
|
59
|
-
};
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
|
|
63
68
|
var styles = function styles(theme) {
|
|
64
69
|
return {
|
|
65
70
|
dialog: {
|
|
66
|
-
height: '100%'
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
height: '100%'
|
|
72
|
+
},
|
|
73
|
+
paper: {
|
|
74
|
+
height: 'calc(100% - 64px)'
|
|
69
75
|
},
|
|
70
76
|
content: {
|
|
71
77
|
textAlign: 'center'
|
|
@@ -78,15 +84,32 @@ var styles = function styles(theme) {
|
|
|
78
84
|
width: 'auto',
|
|
79
85
|
height: 'calc(100% - 5px)',
|
|
80
86
|
objectFit: 'contain'
|
|
87
|
+
},
|
|
88
|
+
dialogTitle: {
|
|
89
|
+
justifyContent: 'space-between',
|
|
90
|
+
display: 'flex'
|
|
81
91
|
}
|
|
82
92
|
};
|
|
83
93
|
};
|
|
84
94
|
|
|
85
95
|
var EXTENSIONS = {
|
|
86
|
-
images: ['png', 'jpg', 'svg', 'jpeg', '
|
|
87
|
-
code: ['js', 'json'],
|
|
96
|
+
images: ['png', 'jpg', 'svg', 'jpeg', 'bmp'],
|
|
97
|
+
code: ['js', 'json', 'md'],
|
|
88
98
|
txt: ['log', 'txt', 'html', 'css', 'xml']
|
|
89
99
|
};
|
|
100
|
+
exports.EXTENSIONS = EXTENSIONS;
|
|
101
|
+
|
|
102
|
+
function bufferToBase64(buffer) {
|
|
103
|
+
var binary = '';
|
|
104
|
+
var bytes = new Uint8Array(buffer);
|
|
105
|
+
var len = bytes.byteLength;
|
|
106
|
+
|
|
107
|
+
for (var i = 0; i < len && i < 50; i++) {
|
|
108
|
+
binary += String.fromCharCode(bytes[i]);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return window.btoa(binary);
|
|
112
|
+
}
|
|
90
113
|
/**
|
|
91
114
|
* @typedef {object} FileViewerProps
|
|
92
115
|
* @property {string} [key] The key to identify this component.
|
|
@@ -99,10 +122,9 @@ var EXTENSIONS = {
|
|
|
99
122
|
* @extends {React.Component<FileViewerProps>}
|
|
100
123
|
*/
|
|
101
124
|
|
|
102
|
-
exports.EXTENSIONS = EXTENSIONS;
|
|
103
125
|
|
|
104
|
-
var FileViewer = /*#__PURE__*/function (
|
|
105
|
-
(0, _inherits2["default"])(FileViewer,
|
|
126
|
+
var FileViewer = /*#__PURE__*/function (_Component) {
|
|
127
|
+
(0, _inherits2["default"])(FileViewer, _Component);
|
|
106
128
|
|
|
107
129
|
var _super = _createSuper(FileViewer);
|
|
108
130
|
|
|
@@ -114,63 +136,167 @@ var FileViewer = /*#__PURE__*/function (_React$Component) {
|
|
|
114
136
|
|
|
115
137
|
(0, _classCallCheck2["default"])(this, FileViewer);
|
|
116
138
|
_this = _super.call(this, props);
|
|
117
|
-
|
|
139
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onFileChanged", function (id, fileName, size) {
|
|
140
|
+
if (!_this.state.changed) {
|
|
141
|
+
_this.timeout && clearTimeout(_this.timeout);
|
|
142
|
+
_this.timeout = setTimeout(function () {
|
|
143
|
+
_this.timeout = null;
|
|
144
|
+
|
|
145
|
+
if (size === null) {
|
|
146
|
+
window.alert('Show file was deleted!');
|
|
147
|
+
} else if (_this.state.text !== null || _this.state.code !== null) {
|
|
148
|
+
_this.readFile();
|
|
149
|
+
} else {
|
|
150
|
+
_this.setState({
|
|
151
|
+
forceUpdate: Date.now()
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}, 300);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "writeFile64", function () {
|
|
158
|
+
var parts = _this.props.href.split('/');
|
|
159
|
+
|
|
160
|
+
var data = _this.state.editingValue;
|
|
161
|
+
parts.splice(0, 2);
|
|
162
|
+
var adapter = parts[0];
|
|
163
|
+
var name = parts.splice(1).join('/');
|
|
164
|
+
|
|
165
|
+
_this.props.socket.writeFile64(adapter, name, Buffer.from(data).toString('base64')).then(function (_) {
|
|
166
|
+
return _this.props.onClose();
|
|
167
|
+
})["catch"](function (e) {
|
|
168
|
+
return window.alert('Cannot write file: ' + e);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
var ext = _Utils["default"].getFileExtension(_this.props.href);
|
|
173
|
+
|
|
118
174
|
_this.state = {
|
|
119
175
|
text: null,
|
|
120
176
|
code: null,
|
|
121
|
-
|
|
177
|
+
ext: ext,
|
|
178
|
+
editing: !!_this.props.formatEditFile || false,
|
|
179
|
+
editingValue: null,
|
|
180
|
+
copyPossible: EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext),
|
|
181
|
+
forceUpdate: Date.now(),
|
|
182
|
+
changed: false
|
|
122
183
|
};
|
|
123
|
-
|
|
124
|
-
if (_this.state.copyPossible) {
|
|
125
|
-
fetch(_this.props.href).then(function (response) {
|
|
126
|
-
return response.text();
|
|
127
|
-
}).then(function (data) {
|
|
128
|
-
if (EXTENSIONS.txt.includes(_this.ext)) {
|
|
129
|
-
_this.setState({
|
|
130
|
-
text: data
|
|
131
|
-
});
|
|
132
|
-
} else if (EXTENSIONS.code.includes(_this.ext)) {
|
|
133
|
-
_this.setState({
|
|
134
|
-
code: data
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
184
|
return _this;
|
|
141
185
|
}
|
|
142
186
|
|
|
143
187
|
(0, _createClass2["default"])(FileViewer, [{
|
|
188
|
+
key: "readFile",
|
|
189
|
+
value: function readFile() {
|
|
190
|
+
var _this2 = this;
|
|
191
|
+
|
|
192
|
+
if (this.props.href) {
|
|
193
|
+
var parts = this.props.href.split('/');
|
|
194
|
+
parts.splice(0, 2);
|
|
195
|
+
var adapter = parts[0];
|
|
196
|
+
var name = parts.splice(1).join('/');
|
|
197
|
+
this.props.socket.readFile(adapter, name).then(function (data) {
|
|
198
|
+
if (data.file !== undefined) {
|
|
199
|
+
data = data.file;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
var newState = {
|
|
203
|
+
copyPossible: _this2.state.copyPossible
|
|
204
|
+
}; // try to detect valid extension
|
|
205
|
+
|
|
206
|
+
if (data.type === 'Buffer') {
|
|
207
|
+
var ext = AdminUtils.detectMimeType(bufferToBase64(data.data));
|
|
208
|
+
|
|
209
|
+
if (ext) {
|
|
210
|
+
newState.ext = ext;
|
|
211
|
+
newState.copyPossible = EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (newState.copyPossible) {
|
|
216
|
+
if (EXTENSIONS.txt.includes(_this2.state.ext)) {
|
|
217
|
+
newState.text = data;
|
|
218
|
+
newState.editingValue = data;
|
|
219
|
+
} else if (EXTENSIONS.code.includes(_this2.state.ext)) {
|
|
220
|
+
newState.code = data;
|
|
221
|
+
newState.editingValue = data;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
_this2.setState(newState);
|
|
226
|
+
})["catch"](function (e) {
|
|
227
|
+
return window.alert('Cannot read file: ' + e);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}, {
|
|
232
|
+
key: "componentDidMount",
|
|
233
|
+
value: function componentDidMount() {
|
|
234
|
+
this.readFile();
|
|
235
|
+
var parts = this.props.href.split('/');
|
|
236
|
+
parts.splice(0, 2);
|
|
237
|
+
var adapter = parts[0];
|
|
238
|
+
var name = parts.splice(1).join('/');
|
|
239
|
+
this.props.supportSubscribes && this.props.socket.subscribeFiles(adapter, name, this.onFileChanged);
|
|
240
|
+
}
|
|
241
|
+
}, {
|
|
242
|
+
key: "componentWillUnmount",
|
|
243
|
+
value: function componentWillUnmount() {
|
|
244
|
+
this.timeout && clearTimeout(this.timeout);
|
|
245
|
+
var parts = this.props.href.split('/');
|
|
246
|
+
parts.splice(0, 2);
|
|
247
|
+
var adapter = parts[0];
|
|
248
|
+
var name = parts.splice(1).join('/');
|
|
249
|
+
this.props.supportSubscribes && this.props.socket.subscribeFiles(adapter, name, this.onFileChanged);
|
|
250
|
+
}
|
|
251
|
+
}, {
|
|
252
|
+
key: "getEditFile",
|
|
253
|
+
value: function getEditFile(ext) {
|
|
254
|
+
switch (ext) {
|
|
255
|
+
case 'json':
|
|
256
|
+
return 'json';
|
|
257
|
+
|
|
258
|
+
case 'js':
|
|
259
|
+
return 'javascript';
|
|
260
|
+
|
|
261
|
+
case 'html':
|
|
262
|
+
return 'html';
|
|
263
|
+
|
|
264
|
+
case 'txt':
|
|
265
|
+
return 'html';
|
|
266
|
+
|
|
267
|
+
default:
|
|
268
|
+
return 'json';
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}, {
|
|
144
272
|
key: "getContent",
|
|
145
273
|
value: function getContent() {
|
|
146
|
-
|
|
274
|
+
var _this3 = this;
|
|
275
|
+
|
|
276
|
+
if (EXTENSIONS.images.includes(this.state.ext)) {
|
|
147
277
|
return /*#__PURE__*/_react["default"].createElement("img", {
|
|
148
278
|
onError: function onError(e) {
|
|
149
279
|
e.target.onerror = null;
|
|
150
280
|
e.target.src = _no_icon["default"];
|
|
151
281
|
},
|
|
152
|
-
className: this.props.classes.img,
|
|
153
|
-
src: this.props.href,
|
|
282
|
+
className: _Utils["default"].clsx(this.props.classes.img, this.props.getClassBackgroundImage()),
|
|
283
|
+
src: this.props.href + '?ts=' + this.state.forceUpdate,
|
|
154
284
|
alt: this.props.href
|
|
155
285
|
});
|
|
156
|
-
} else if (this.state.code !== null) {
|
|
286
|
+
} else if (this.state.code !== null || this.state.text !== null || this.state.editing) {
|
|
157
287
|
return /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
|
|
158
288
|
variant: "standard",
|
|
159
289
|
className: this.props.classes.textarea,
|
|
160
290
|
multiline: true,
|
|
161
|
-
value: this.state.code,
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
variant: "standard",
|
|
169
|
-
className: this.props.classes.textarea,
|
|
170
|
-
value: this.state.code,
|
|
171
|
-
multiline: true,
|
|
291
|
+
value: this.state.editingValue || this.state.code || this.state.text,
|
|
292
|
+
onChange: function onChange(newValue) {
|
|
293
|
+
return _this3.setState({
|
|
294
|
+
editingValue: newValue,
|
|
295
|
+
changed: true
|
|
296
|
+
});
|
|
297
|
+
},
|
|
172
298
|
InputProps: {
|
|
173
|
-
readOnly:
|
|
299
|
+
readOnly: !this.state.editing
|
|
174
300
|
}
|
|
175
301
|
});
|
|
176
302
|
}
|
|
@@ -178,49 +304,67 @@ var FileViewer = /*#__PURE__*/function (_React$Component) {
|
|
|
178
304
|
}, {
|
|
179
305
|
key: "render",
|
|
180
306
|
value: function render() {
|
|
181
|
-
var
|
|
307
|
+
var _this4 = this;
|
|
182
308
|
|
|
183
309
|
return /*#__PURE__*/_react["default"].createElement(_Dialog["default"], {
|
|
184
|
-
|
|
310
|
+
classes: {
|
|
311
|
+
scrollPaper: this.props.classes.dialog,
|
|
312
|
+
paper: this.props.classes.paper
|
|
313
|
+
},
|
|
314
|
+
scroll: "paper",
|
|
185
315
|
open: !!this.props.href,
|
|
186
316
|
onClose: function onClose() {
|
|
187
|
-
return
|
|
317
|
+
return _this4.props.onClose();
|
|
188
318
|
},
|
|
189
319
|
fullWidth: true,
|
|
190
|
-
|
|
320
|
+
maxWidth: "xl",
|
|
191
321
|
"aria-labelledby": "form-dialog-title"
|
|
322
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
323
|
+
className: this.props.classes.dialogTitle
|
|
192
324
|
}, /*#__PURE__*/_react["default"].createElement(_DialogTitle["default"], {
|
|
193
325
|
id: "form-dialog-title"
|
|
194
|
-
}, this.props.t('
|
|
326
|
+
}, this.props.t(this.state.editing ? 'Edit' : 'View') + ': ' + this.props.href), EXTENSIONS.images.includes(this.state.ext) && /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
|
|
327
|
+
size: "large",
|
|
328
|
+
color: 'inherit',
|
|
329
|
+
onClick: this.props.setStateBackgroundImage
|
|
330
|
+
}, /*#__PURE__*/_react["default"].createElement(_Brightness["default"], null)))), /*#__PURE__*/_react["default"].createElement(_DialogContent["default"], {
|
|
195
331
|
className: this.props.classes.content
|
|
196
332
|
}, this.getContent()), /*#__PURE__*/_react["default"].createElement(_DialogActions["default"], null, this.state.copyPossible ? /*#__PURE__*/_react["default"].createElement(_Button["default"], {
|
|
197
333
|
color: "grey",
|
|
198
334
|
onClick: function onClick(e) {
|
|
199
|
-
return _Utils["default"].copyToClipboard(
|
|
200
|
-
}
|
|
201
|
-
|
|
335
|
+
return _Utils["default"].copyToClipboard(_this4.state.text || _this4.state.code, e);
|
|
336
|
+
},
|
|
337
|
+
startIcon: /*#__PURE__*/_react["default"].createElement(_fa.FaCopy, null)
|
|
338
|
+
}, this.props.t('Copy content')) : null, this.state.editing ? /*#__PURE__*/_react["default"].createElement(_Button["default"], {
|
|
339
|
+
color: "grey",
|
|
340
|
+
disabled: this.state.editingValue === this.state.code || this.state.editingValue === this.state.text,
|
|
341
|
+
variant: "contained",
|
|
342
|
+
onClick: this.writeFile64,
|
|
343
|
+
startIcon: /*#__PURE__*/_react["default"].createElement(_Save["default"], null)
|
|
344
|
+
}, this.props.t('Save')) : null, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
|
|
345
|
+
variant: "contained",
|
|
202
346
|
onClick: function onClick() {
|
|
203
|
-
return
|
|
347
|
+
return _this4.props.onClose();
|
|
204
348
|
},
|
|
205
|
-
color: "primary"
|
|
206
|
-
|
|
349
|
+
color: "primary",
|
|
350
|
+
startIcon: /*#__PURE__*/_react["default"].createElement(_Close["default"], null)
|
|
351
|
+
}, this.props.t('Close'))));
|
|
207
352
|
}
|
|
208
|
-
}], [{
|
|
209
|
-
key: "getDerivedStateFromProps",
|
|
210
|
-
value: function getDerivedStateFromProps() {}
|
|
211
353
|
}]);
|
|
212
354
|
return FileViewer;
|
|
213
|
-
}(_react
|
|
355
|
+
}(_react.Component);
|
|
214
356
|
|
|
215
357
|
FileViewer.propTypes = {
|
|
216
358
|
t: _propTypes["default"].func,
|
|
359
|
+
lang: _propTypes["default"].string,
|
|
360
|
+
expertMode: _propTypes["default"].bool,
|
|
217
361
|
onClose: _propTypes["default"].func,
|
|
218
362
|
href: _propTypes["default"].string.isRequired,
|
|
219
|
-
|
|
363
|
+
supportSubscribes: _propTypes["default"].bool
|
|
220
364
|
};
|
|
221
365
|
/** @type {typeof FileViewer} */
|
|
222
366
|
|
|
223
|
-
var _export =
|
|
367
|
+
var _export = (0, _withWidth["default"])()((0, _styles.withStyles)(styles)(FileViewer));
|
|
224
368
|
|
|
225
369
|
var _default = _export;
|
|
226
370
|
exports["default"] = _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileViewer.js","names":["withWidth","WrappedComponent","props","styles","theme","dialog","height","maxHeight","maxWidth","content","textAlign","textarea","width","img","objectFit","EXTENSIONS","images","code","txt","FileViewer","ext","Utils","getFileExtension","href","state","text","copyPossible","includes","fetch","then","response","data","setState","e","target","onerror","src","NoImage","classes","readOnly","onClose","fullScreen","undefined","t","getContent","copyToClipboard","React","Component","propTypes","PropTypes","func","string","isRequired","bool","_export","withStyles"],"sources":["FileViewer.js"],"sourcesContent":["import React from 'react';\nimport withStyles from '@mui/styles/withStyles';\nimport PropTypes from 'prop-types';\n\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport TextField from '@mui/material/TextField';\n\nimport NoImage from '../assets/no_icon.svg';\nimport Utils from './Utils';\n\n// Icons\nimport {FaCopy as CopyIcon} from 'react-icons/fa';\nimport CloseIcon from '@mui/icons-material/Close';\n\n// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth\nconst withWidth = () => WrappedComponent => props => <WrappedComponent {...props} width=\"xs\" />;\n\nconst styles = theme => ({\n dialog: {\n height: '100%',\n maxHeight: '100%',\n maxWidth: '100%',\n },\n content: {\n textAlign: 'center',\n },\n textarea: {\n width: '100%',\n height: '100%',\n },\n img: {\n width: 'auto',\n height: 'calc(100% - 5px)',\n objectFit: 'contain',\n }\n});\n\nexport const EXTENSIONS = {\n images: ['png', 'jpg', 'svg', 'jpeg', 'jpg'],\n code: ['js', 'json'],\n txt: ['log', 'txt', 'html', 'css', 'xml'],\n};\n\n/**\n * @typedef {object} FileViewerProps\n * @property {string} [key] The key to identify this component.\n * @property {import('../types').Translator} t Translation function\n * @property {ioBroker.Languages} [lang] The selected language.\n * @property {boolean} [expertMode] Is expert mode enabled? (default: false)\n * @property {() => void} onClose Callback when the viewer is closed.\n * @property {string} href The URL to the file to be displayed.\n *\n * @extends {React.Component<FileViewerProps>}\n */\nclass FileViewer extends React.Component {\n /**\n * @param {Readonly<FileViewerProps>} props\n */\n constructor(props) {\n super(props);\n\n this.ext = Utils.getFileExtension(this.props.href);\n\n this.state = {\n text: null,\n code: null,\n copyPossible: EXTENSIONS.code.includes(this.ext) || EXTENSIONS.txt.includes(this.ext),\n };\n\n if (this.state.copyPossible) {\n fetch(this.props.href)\n .then(response => response.text())\n .then(data => {\n if (EXTENSIONS.txt.includes(this.ext)) {\n this.setState({ text: data });\n } else if (EXTENSIONS.code.includes(this.ext)) {\n this.setState({ code: data });\n }\n });\n }\n }\n\n static getDerivedStateFromProps() {\n\n }\n\n getContent() {\n if (EXTENSIONS.images.includes(this.ext)) {\n return <img\n onError={ e => {\n e.target.onerror = null;\n e.target.src = NoImage;\n }}\n className={ this.props.classes.img }\n src={ this.props.href }\n alt={ this.props.href }\n />;\n } else if (this.state.code !== null) {\n return <TextField\n variant=\"standard\"\n className={ this.props.classes.textarea }\n multiline\n value={ this.state.code }\n InputProps={{\n readOnly: true,\n }}\n />;\n } else if (this.state.text !== null) {\n return <TextField\n variant=\"standard\"\n className={ this.props.classes.textarea }\n value={ this.state.code }\n multiline\n InputProps={{\n readOnly: true,\n }}\n />;\n }\n }\n\n render() {\n return <Dialog\n className={ this.props.classes.dialog }\n open={ !!this.props.href }\n onClose={ () => this.props.onClose() }\n fullWidth\n fullScreen={this.props.fullScreen !== undefined ? this.props.fullScreen : true}\n aria-labelledby=\"form-dialog-title\"\n >\n <DialogTitle id=\"form-dialog-title\">{ this.props.t('ra_View: %s', this.props.href) }</DialogTitle>\n <DialogContent className={ this.props.classes.content }>\n { this.getContent() }\n </DialogContent>\n <DialogActions>\n { this.state.copyPossible ? <Button color=\"grey\" onClick={e => Utils.copyToClipboard(this.state.text || this.state.code, e) } >\n <CopyIcon />\n { this.props.t('ra_Copy content') }\n </Button> : null }\n\n <Button onClick={() => this.props.onClose()} color=\"primary\">\n <CloseIcon />\n { this.props.t('ra_Close') }\n </Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nFileViewer.propTypes = {\n t: PropTypes.func,\n\n onClose: PropTypes.func,\n href: PropTypes.string.isRequired,\n fullScreen: PropTypes.bool,\n};\n\n/** @type {typeof FileViewer} */\nconst _export = withWidth()(withStyles(styles)(FileViewer));\nexport default _export;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileViewer.js","names":["styles","theme","dialog","height","paper","content","textAlign","textarea","width","img","objectFit","dialogTitle","justifyContent","display","EXTENSIONS","images","code","txt","bufferToBase64","buffer","binary","bytes","Uint8Array","len","byteLength","i","String","fromCharCode","window","btoa","FileViewer","props","id","fileName","size","state","changed","timeout","clearTimeout","setTimeout","alert","text","readFile","setState","forceUpdate","Date","now","parts","href","split","data","editingValue","splice","adapter","name","join","socket","writeFile64","Buffer","from","toString","then","_","onClose","e","ext","Utils","getFileExtension","editing","formatEditFile","copyPossible","includes","file","undefined","newState","type","AdminUtils","detectMimeType","supportSubscribes","subscribeFiles","onFileChanged","target","onerror","src","NoImage","clsx","classes","getClassBackgroundImage","newValue","readOnly","scrollPaper","t","setStateBackgroundImage","getContent","copyToClipboard","Component","propTypes","PropTypes","func","lang","string","expertMode","bool","isRequired","_export","withWidth","withStyles"],"sources":["FileViewer.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { withStyles } from '@mui/styles';\nimport withWidth from './withWidth';\nimport PropTypes from 'prop-types';\n\nimport TextField from '@mui/material/TextField';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport { IconButton } from '@mui/material';\n\nimport NoImage from '../assets/no_icon.svg';\nimport Utils from './Utils';\n\n// Icons\nimport { FaCopy as CopyIcon } from 'react-icons/fa';\nimport Brightness5Icon from '@mui/icons-material/Brightness6';\nimport CloseIcon from '@mui/icons-material/Close';\nimport SaveIcon from '@mui/icons-material/Save';\n\nconst styles = theme => ({\n dialog: {\n height: '100%',\n },\n paper: {\n height: 'calc(100% - 64px)',\n },\n content: {\n textAlign: 'center',\n },\n textarea: {\n width: '100%',\n height: '100%',\n },\n img: {\n width: 'auto',\n height: 'calc(100% - 5px)',\n objectFit: 'contain',\n },\n dialogTitle: {\n justifyContent: 'space-between',\n display: 'flex'\n }\n});\n\nexport const EXTENSIONS = {\n images: ['png', 'jpg', 'svg', 'jpeg', 'bmp'],\n code: ['js', 'json', 'md'],\n txt: ['log', 'txt', 'html', 'css', 'xml'],\n};\n\nfunction bufferToBase64(buffer) {\n let binary = '';\n let bytes = new Uint8Array(buffer);\n let len = bytes.byteLength;\n for (let i = 0; i < len && i < 50; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n}\n\n/**\n * @typedef {object} FileViewerProps\n * @property {string} [key] The key to identify this component.\n * @property {import('../types').Translator} t Translation function\n * @property {ioBroker.Languages} [lang] The selected language.\n * @property {boolean} [expertMode] Is expert mode enabled? (default: false)\n * @property {() => void} onClose Callback when the viewer is closed.\n * @property {string} href The URL to the file to be displayed.\n *\n * @extends {React.Component<FileViewerProps>}\n */\nclass FileViewer extends Component {\n /**\n * @param {Readonly<FileViewerProps>} props\n */\n constructor(props) {\n super(props);\n const ext = Utils.getFileExtension(this.props.href);\n\n this.state = {\n text: null,\n code: null,\n ext,\n editing: !!this.props.formatEditFile || false,\n editingValue: null,\n copyPossible: EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext),\n forceUpdate: Date.now(),\n changed: false,\n };\n }\n\n readFile() {\n if (this.props.href) {\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n\n this.props.socket.readFile(adapter, name)\n .then(data => {\n if (data.file !== undefined) {\n data = data.file;\n }\n\n const newState = {copyPossible: this.state.copyPossible};\n // try to detect valid extension\n if (data.type === 'Buffer') {\n const ext = AdminUtils.detectMimeType(bufferToBase64(data.data));\n if (ext) {\n newState.ext = ext;\n newState.copyPossible = EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext);\n }\n }\n\n if (newState.copyPossible) {\n if (EXTENSIONS.txt.includes(this.state.ext)) {\n newState.text = data;\n newState.editingValue = data;\n } else if (EXTENSIONS.code.includes(this.state.ext)) {\n newState.code = data;\n newState.editingValue = data;\n }\n }\n\n this.setState(newState);\n })\n .catch(e => window.alert('Cannot read file: ' + e));\n }\n }\n\n componentDidMount() {\n this.readFile();\n\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n\n this.props.supportSubscribes && this.props.socket.subscribeFiles(adapter, name, this.onFileChanged);\n }\n\n componentWillUnmount() {\n this.timeout && clearTimeout(this.timeout);\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n this.props.supportSubscribes && this.props.socket.subscribeFiles(adapter, name, this.onFileChanged);\n }\n\n onFileChanged = (id, fileName, size) => {\n if (!this.state.changed) {\n this.timeout && clearTimeout(this.timeout);\n this.timeout = setTimeout(() => {\n this.timeout = null;\n if (size === null) {\n window.alert('Show file was deleted!');\n } else if (this.state.text !== null || this.state.code !== null) {\n this.readFile();\n } else {\n this.setState({ forceUpdate: Date.now() });\n }\n }, 300);\n }\n };\n\n writeFile64 = () => {\n const parts = this.props.href.split('/');\n const data = this.state.editingValue;\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n this.props.socket.writeFile64(adapter, name, Buffer.from(data).toString('base64'))\n .then(_ => this.props.onClose())\n .catch(e => window.alert('Cannot write file: ' + e));\n }\n\n getEditFile(ext) {\n switch (ext) {\n case 'json':\n return 'json';\n case 'js':\n return 'javascript';\n case 'html':\n return 'html';\n case 'txt':\n return 'html';\n default:\n return 'json';\n }\n }\n\n getContent() {\n if (EXTENSIONS.images.includes(this.state.ext)) {\n return <img\n onError={e => {\n e.target.onerror = null;\n e.target.src = NoImage;\n }}\n className={Utils.clsx(this.props.classes.img, this.props.getClassBackgroundImage())}\n src={this.props.href + '?ts=' + this.state.forceUpdate}\n alt={this.props.href}\n />;\n } else if (this.state.code !== null || this.state.text !== null || this.state.editing) {\n return <TextField\n variant=\"standard\"\n className={ this.props.classes.textarea }\n multiline\n value={ this.state.editingValue || this.state.code || this.state.text }\n onChange={newValue => this.setState({ editingValue: newValue, changed: true })}\n InputProps={{ readOnly: !this.state.editing,}}\n />;\n }\n }\n\n render() {\n return <Dialog\n classes={{ scrollPaper: this.props.classes.dialog, paper: this.props.classes.paper }}\n scroll=\"paper\"\n open={!!this.props.href}\n onClose={() => this.props.onClose()}\n fullWidth={true}\n maxWidth=\"xl\"\n aria-labelledby=\"form-dialog-title\"\n >\n <div className={this.props.classes.dialogTitle}>\n <DialogTitle id=\"form-dialog-title\">{this.props.t(this.state.editing ? 'Edit' : 'View') + ': ' + this.props.href}</DialogTitle>\n {EXTENSIONS.images.includes(this.state.ext) && <div>\n <IconButton size=\"large\"\n color={'inherit'}\n onClick={this.props.setStateBackgroundImage}\n >\n <Brightness5Icon />\n </IconButton>\n </div>\n }\n </div>\n <DialogContent className={this.props.classes.content}>\n {this.getContent()}\n </DialogContent>\n <DialogActions>\n {this.state.copyPossible ?\n <Button\n color=\"grey\"\n onClick={e => Utils.copyToClipboard(this.state.text || this.state.code, e)}\n startIcon={<CopyIcon />}\n >\n {this.props.t('Copy content')}\n </Button> : null}\n {this.state.editing ?\n <Button\n color=\"grey\"\n disabled={this.state.editingValue === this.state.code || this.state.editingValue === this.state.text}\n variant=\"contained\"\n onClick={this.writeFile64}\n startIcon={<SaveIcon />}\n >\n {this.props.t('Save')}\n </Button> : null}\n <Button\n variant=\"contained\"\n onClick={() => this.props.onClose()}\n color=\"primary\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nFileViewer.propTypes = {\n t: PropTypes.func,\n lang: PropTypes.string,\n expertMode: PropTypes.bool,\n onClose: PropTypes.func,\n href: PropTypes.string.isRequired,\n supportSubscribes: PropTypes.bool,\n};\n\n/** @type {typeof FileViewer} */\nconst _export = withWidth()(withStyles(styles)(FileViewer));\nexport default _export;\n"],"mappings":"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"}
|
package/Components/Utils.js
CHANGED
|
@@ -47,6 +47,17 @@ var QUALITY_BITS = {
|
|
|
47
47
|
0x44: '0x44 - device reports error',
|
|
48
48
|
0x84: '0x84 - sensor reports error'
|
|
49
49
|
};
|
|
50
|
+
var SIGNATURES = {
|
|
51
|
+
JVBERi0: 'pdf',
|
|
52
|
+
R0lGODdh: 'gif',
|
|
53
|
+
R0lGODlh: 'gif',
|
|
54
|
+
iVBORw0KGgo: 'png',
|
|
55
|
+
'/9j/': 'jpg',
|
|
56
|
+
PHN2Zw: 'svg',
|
|
57
|
+
Qk1: 'bmp',
|
|
58
|
+
AAABAA: 'ico' // 00 00 01 00 according to https://en.wikipedia.org/wiki/List_of_file_signatures
|
|
59
|
+
|
|
60
|
+
};
|
|
50
61
|
|
|
51
62
|
var Utils = /*#__PURE__*/function () {
|
|
52
63
|
function Utils() {
|
|
@@ -1742,6 +1753,20 @@ var Utils = /*#__PURE__*/function () {
|
|
|
1742
1753
|
});
|
|
1743
1754
|
});
|
|
1744
1755
|
}
|
|
1756
|
+
/**
|
|
1757
|
+
* Detect file xtension by its content
|
|
1758
|
+
* @param {string} base64 Base64 encoded binary file
|
|
1759
|
+
* @returns {string} Detected extension, like 'jpg'
|
|
1760
|
+
*/
|
|
1761
|
+
|
|
1762
|
+
}, {
|
|
1763
|
+
key: "detectMimeType",
|
|
1764
|
+
value: function detectMimeType(base64) {
|
|
1765
|
+
var signature = Object.keys(SIGNATURES).find(function (s) {
|
|
1766
|
+
return base64.startsWith(s);
|
|
1767
|
+
});
|
|
1768
|
+
return signature ? SIGNATURES[signature] : null;
|
|
1769
|
+
}
|
|
1745
1770
|
}]);
|
|
1746
1771
|
return Utils;
|
|
1747
1772
|
}();
|