@iobroker/adapter-react-v5 7.0.1 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Components/404.d.ts +3 -2
- package/Components/404.js +16 -15
- package/Components/ColorPicker.d.ts +22 -8
- package/Components/ColorPicker.js +34 -17
- package/Components/ComplexCron.js +24 -24
- package/Components/CopyToClipboard.d.ts +10 -1
- package/Components/CopyToClipboard.js +17 -8
- package/Components/CustomModal.d.ts +1 -1
- package/Components/CustomModal.js +8 -8
- package/Components/FileBrowser.d.ts +11 -11
- package/Components/FileBrowser.js +173 -164
- package/Components/FileViewer.js +34 -23
- package/Components/Icon.d.ts +16 -2
- package/Components/Icon.js +19 -8
- package/Components/IconPicker.js +10 -14
- package/Components/IconSelector.d.ts +1 -1
- package/Components/IconSelector.js +64 -74
- package/Components/Image.d.ts +8 -4
- package/Components/Image.js +13 -32
- package/Components/Loader.d.ts +2 -2
- package/Components/Loader.js +244 -241
- package/Components/Loaders/MV.d.ts +6 -1
- package/Components/Loaders/MV.js +23 -7
- package/Components/Loaders/PT.d.ts +7 -2
- package/Components/Loaders/PT.js +123 -110
- package/Components/Loaders/Vendor.d.ts +2 -2
- package/Components/Loaders/Vendor.js +22 -14
- package/Components/Logo.js +16 -18
- package/Components/MDUtils.d.ts +1 -1
- package/Components/MDUtils.js +8 -4
- package/Components/ObjectBrowser.d.ts +49 -38
- package/Components/ObjectBrowser.js +757 -494
- package/Components/Router.d.ts +1 -3
- package/Components/Router.js +3 -1
- package/Components/SaveCloseButtons.d.ts +3 -3
- package/Components/SaveCloseButtons.js +3 -3
- package/Components/Schedule.d.ts +15 -15
- package/Components/Schedule.js +177 -154
- package/Components/SelectWithIcon.d.ts +2 -2
- package/Components/SelectWithIcon.js +45 -34
- package/Components/SimpleCron/index.js +83 -43
- package/Components/TabContainer.js +2 -2
- package/Components/TabContent.js +1 -1
- package/Components/TabHeader.js +1 -1
- package/Components/TableResize.d.ts +2 -2
- package/Components/TableResize.js +5 -5
- package/Components/TextWithIcon.d.ts +1 -1
- package/Components/TextWithIcon.js +10 -8
- package/Components/ToggleThemeMenu.d.ts +2 -2
- package/Components/ToggleThemeMenu.js +3 -3
- package/Components/TreeTable.d.ts +18 -18
- package/Components/TreeTable.js +76 -72
- package/Components/UploadImage.d.ts +2 -2
- package/Components/UploadImage.js +330 -326
- package/Components/Utils.d.ts +42 -22
- package/Components/Utils.js +66 -65
- package/Components/withWidth.d.ts +2 -2
- package/Components/withWidth.js +10 -6
- package/Dialogs/ComplexCron.d.ts +2 -2
- package/Dialogs/ComplexCron.js +3 -3
- package/Dialogs/Confirm.d.ts +4 -4
- package/Dialogs/Confirm.js +18 -8
- package/Dialogs/Cron.d.ts +3 -3
- package/Dialogs/Cron.js +21 -17
- package/Dialogs/Error.d.ts +3 -3
- package/Dialogs/Error.js +6 -4
- package/Dialogs/Message.d.ts +3 -3
- package/Dialogs/Message.js +6 -4
- package/Dialogs/SelectFile.d.ts +4 -4
- package/Dialogs/SelectFile.js +6 -4
- package/Dialogs/SelectID.d.ts +12 -10
- package/Dialogs/SelectID.js +12 -8
- package/Dialogs/SimpleCron.d.ts +2 -2
- package/Dialogs/SimpleCron.js +2 -2
- package/Dialogs/TextInput.d.ts +2 -2
- package/Dialogs/TextInput.js +3 -3
- package/GenericApp.d.ts +19 -13
- package/GenericApp.js +177 -134
- package/LICENSE +22 -22
- package/LegacyConnection.d.ts +240 -248
- package/LegacyConnection.js +500 -525
- package/Prompt.js +7 -7
- package/README.md +1239 -1166
- package/Theme.d.ts +1 -1
- package/Theme.js +9 -12
- package/assets/devices.json +1 -0
- package/assets/lamp_ceiling.svg +8 -8
- package/assets/lamp_table.svg +7 -7
- package/assets/no_icon.svg +9 -9
- package/assets/rooms.json +1 -0
- package/craco-module-federation.js +62 -71
- package/i18n/de.json +434 -431
- package/i18n/en.json +434 -431
- package/i18n/es.json +434 -431
- package/i18n/fr.json +434 -431
- package/i18n/it.json +434 -431
- package/i18n/nl.json +434 -431
- package/i18n/pl.json +434 -431
- package/i18n/pt.json +434 -431
- package/i18n/ru.json +434 -431
- package/i18n/uk.json +434 -431
- package/i18n/zh-cn.json +434 -431
- package/i18n.d.ts +26 -19
- package/i18n.js +28 -22
- package/icons/IconAdapter.js +2 -2
- package/icons/IconAlias.js +2 -2
- package/icons/IconChannel.js +2 -2
- package/icons/IconClearFilter.js +2 -2
- package/icons/IconClosed.js +2 -2
- package/icons/IconCopy.js +2 -2
- package/icons/IconDevice.js +2 -2
- package/icons/IconDocument.js +2 -2
- package/icons/IconDocumentReadOnly.js +2 -2
- package/icons/IconExpert.js +2 -2
- package/icons/IconFx.js +2 -2
- package/icons/IconInstance.js +2 -2
- package/icons/IconLogout.js +2 -2
- package/icons/IconNoIcon.js +2 -2
- package/icons/IconOpen.d.ts +2 -2
- package/icons/IconOpen.js +2 -2
- package/icons/IconProps.d.ts +4 -3
- package/icons/IconState.d.ts +2 -2
- package/icons/IconState.js +2 -2
- package/index.css +56 -55
- package/modulefederation.admin.config.js +31 -31
- package/package.json +5 -5
- package/src/AdminConnection.tsx +3 -3
- package/src/Components/404.tsx +122 -121
- package/src/Components/ColorPicker.tsx +343 -315
- package/src/Components/ComplexCron.tsx +544 -507
- package/src/Components/CopyToClipboard.tsx +178 -165
- package/src/Components/CustomModal.tsx +170 -163
- package/src/Components/FileBrowser.tsx +2550 -2414
- package/src/Components/FileViewer.tsx +412 -393
- package/src/Components/Icon.tsx +238 -210
- package/src/Components/IconPicker.tsx +165 -149
- package/src/Components/IconSelector.tsx +2220 -2202
- package/src/Components/Image.tsx +193 -176
- package/src/Components/Loader.tsx +328 -304
- package/src/Components/Logo.tsx +176 -166
- package/src/Components/MDUtils.tsx +104 -100
- package/src/Components/ObjectBrowser.tsx +8935 -8032
- package/src/Components/Router.tsx +90 -90
- package/src/Components/SaveCloseButtons.tsx +117 -113
- package/src/Components/Schedule.tsx +1962 -1724
- package/src/Components/SelectWithIcon.tsx +239 -197
- package/src/Components/TabContainer.tsx +57 -55
- package/src/Components/TabContent.tsx +38 -37
- package/src/Components/TabHeader.tsx +20 -19
- package/src/Components/TableResize.tsx +274 -259
- package/src/Components/TextWithIcon.tsx +159 -148
- package/src/Components/ToggleThemeMenu.tsx +52 -34
- package/src/Components/TreeTable.tsx +1002 -919
- package/src/Components/UploadImage.tsx +631 -599
- package/src/Components/Utils.tsx +1802 -1794
- package/src/Components/loader.css +231 -222
- package/src/Components/withWidth.tsx +32 -21
- package/src/Connection.tsx +5 -7
- package/src/Dialogs/ComplexCron.tsx +123 -129
- package/src/Dialogs/Confirm.tsx +185 -162
- package/src/Dialogs/Cron.tsx +192 -182
- package/src/Dialogs/Error.tsx +67 -72
- package/src/Dialogs/Message.tsx +73 -71
- package/src/Dialogs/SelectFile.tsx +280 -270
- package/src/Dialogs/SelectID.tsx +310 -298
- package/src/Dialogs/SimpleCron.tsx +100 -100
- package/src/Dialogs/TextInput.tsx +99 -107
- package/src/GenericApp.tsx +1076 -976
- package/src/LegacyConnection.tsx +3719 -3589
- package/src/Prompt.tsx +22 -20
- package/src/Theme.tsx +472 -479
- package/src/icons/IconAdapter.tsx +22 -20
- package/src/icons/IconAlias.tsx +22 -20
- package/src/icons/IconChannel.tsx +60 -21
- package/src/icons/IconClearFilter.tsx +24 -22
- package/src/icons/IconClosed.tsx +22 -17
- package/src/icons/IconCopy.tsx +21 -16
- package/src/icons/IconDevice.tsx +126 -27
- package/src/icons/IconDocument.tsx +22 -17
- package/src/icons/IconDocumentReadOnly.tsx +27 -18
- package/src/icons/IconExpert.tsx +26 -18
- package/src/icons/IconFx.tsx +38 -36
- package/src/icons/IconInstance.tsx +22 -20
- package/src/icons/IconLogout.tsx +32 -30
- package/src/icons/IconNoIcon.tsx +21 -19
- package/src/icons/IconOpen.tsx +22 -17
- package/src/icons/IconProps.tsx +16 -15
- package/src/icons/IconState.tsx +38 -17
- package/src/index.css +56 -55
- package/tasks.js +91 -0
- package/types.d.ts +141 -134
- package/Components/Loaders/PT.css +0 -109
- package/Components/Loaders/Vendor.css +0 -13
- package/Components/loader.css +0 -222
- package/Components/types.d.ts +0 -82
- package/assets/devices/Alarm Systems.svg +0 -19
- package/assets/devices/Amplifier.svg +0 -22
- package/assets/devices/Awnings.svg +0 -5
- package/assets/devices/Battery Status.svg +0 -5
- package/assets/devices/Ceiling Spotlights.svg +0 -16
- package/assets/devices/Chandelier.svg +0 -7
- package/assets/devices/Climate.svg +0 -12
- package/assets/devices/Coffee Makers.svg +0 -6
- package/assets/devices/Cold Water.svg +0 -31
- package/assets/devices/Computer.svg +0 -21
- package/assets/devices/Consumption.svg +0 -8
- package/assets/devices/Curtains.svg +0 -43
- package/assets/devices/Dishwashers.svg +0 -12
- package/assets/devices/Doors.svg +0 -6
- package/assets/devices/Doorstep.svg +0 -35
- package/assets/devices/Dryer.svg +0 -14
- package/assets/devices/Fan.svg +0 -20
- package/assets/devices/Floor Lamps.svg +0 -5
- package/assets/devices/Garage Doors.svg +0 -9
- package/assets/devices/Gates.svg +0 -32
- package/assets/devices/Hairdryer.svg +0 -23
- package/assets/devices/Handle.svg +0 -6
- package/assets/devices/Hanging Lamps.svg +0 -9
- package/assets/devices/Heater.svg +0 -44
- package/assets/devices/Hoods.svg +0 -12
- package/assets/devices/Hot Water.svg +0 -10
- package/assets/devices/Humidity.svg +0 -41
- package/assets/devices/Iron.svg +0 -5
- package/assets/devices/Irrigation.svg +0 -23
- package/assets/devices/Led Strip.svg +0 -31
- package/assets/devices/Light.svg +0 -30
- package/assets/devices/Lightings.svg +0 -46
- package/assets/devices/Lock.svg +0 -19
- package/assets/devices/Louvre.svg +0 -7
- package/assets/devices/Mowing Machine.svg +0 -9
- package/assets/devices/Music.svg +0 -13
- package/assets/devices/Outdoor Blinds.svg +0 -7
- package/assets/devices/People.svg +0 -19
- package/assets/devices/Pool.svg +0 -8
- package/assets/devices/Power Consumption.svg +0 -13
- package/assets/devices/Printer.svg +0 -10
- package/assets/devices/Pump.svg +0 -10
- package/assets/devices/Receiver.svg +0 -19
- package/assets/devices/Sconces.svg +0 -10
- package/assets/devices/Security.svg +0 -34
- package/assets/devices/Shading.svg +0 -5
- package/assets/devices/Shutters.svg +0 -11
- package/assets/devices/SmokeDetector.svg +0 -13
- package/assets/devices/Sockets.svg +0 -13
- package/assets/devices/Speaker.svg +0 -35
- package/assets/devices/Stove.svg +0 -12
- package/assets/devices/Table Lamps.svg +0 -12
- package/assets/devices/Temperature Sensors.svg +0 -28
- package/assets/devices/Tv.svg +0 -8
- package/assets/devices/Vacuum Cleaner.svg +0 -16
- package/assets/devices/Ventilation.svg +0 -12
- package/assets/devices/Washing Machines.svg +0 -16
- package/assets/devices/Water Consumption.svg +0 -6
- package/assets/devices/Water Heater.svg +0 -8
- package/assets/devices/Water.svg +0 -40
- package/assets/devices/Weather.svg +0 -28
- package/assets/devices/Window.svg +0 -8
- package/assets/rooms/Anteroom.svg +0 -53
- package/assets/rooms/Attic.svg +0 -21
- package/assets/rooms/Balcony.svg +0 -13
- package/assets/rooms/Barn.svg +0 -6
- package/assets/rooms/Basement.svg +0 -5
- package/assets/rooms/Bathroom.svg +0 -38
- package/assets/rooms/Bedroom.svg +0 -5
- package/assets/rooms/Boiler Room.svg +0 -13
- package/assets/rooms/Carport.svg +0 -17
- package/assets/rooms/Cellar.svg +0 -89
- package/assets/rooms/Chamber.svg +0 -9
- package/assets/rooms/Corridor.svg +0 -53
- package/assets/rooms/Dining Area.svg +0 -37
- package/assets/rooms/Dining Room.svg +0 -37
- package/assets/rooms/Dining.svg +0 -37
- package/assets/rooms/Dressing Room.svg +0 -5
- package/assets/rooms/Driveway.svg +0 -15
- package/assets/rooms/Entrance.svg +0 -44
- package/assets/rooms/Equipment Room.svg +0 -15
- package/assets/rooms/Front Yard.svg +0 -64
- package/assets/rooms/Gallery.svg +0 -14
- package/assets/rooms/Garage.svg +0 -20
- package/assets/rooms/Garden.svg +0 -13
- package/assets/rooms/Ground Floor.svg +0 -95
- package/assets/rooms/Guest Bathroom.svg +0 -33
- package/assets/rooms/Guest Room.svg +0 -5
- package/assets/rooms/Gym.svg +0 -5
- package/assets/rooms/Hall.svg +0 -19
- package/assets/rooms/Home Theater.svg +0 -8
- package/assets/rooms/Kitchen.svg +0 -18
- package/assets/rooms/Laundry Room.svg +0 -12
- package/assets/rooms/Living Area.svg +0 -11
- package/assets/rooms/Living Room.svg +0 -10
- package/assets/rooms/Locker Room.svg +0 -17
- package/assets/rooms/Nursery.svg +0 -5
- package/assets/rooms/Office.svg +0 -8
- package/assets/rooms/Outdoors.svg +0 -7
- package/assets/rooms/Playroom.svg +0 -6
- package/assets/rooms/Pool.svg +0 -8
- package/assets/rooms/Rear Wall.svg +0 -30
- package/assets/rooms/Second Floor.svg +0 -95
- package/assets/rooms/Shed.svg +0 -16
- package/assets/rooms/Sleeping Area.svg +0 -22
- package/assets/rooms/Stairway.svg +0 -5
- package/assets/rooms/Stairwell.svg +0 -15
- package/assets/rooms/Storeroom.svg +0 -5
- package/assets/rooms/Summer House.svg +0 -27
- package/assets/rooms/Swimming Pool.svg +0 -21
- package/assets/rooms/Terrace.svg +0 -7
- package/assets/rooms/Toilet.svg +0 -10
- package/assets/rooms/Upstairs.svg +0 -6
- package/assets/rooms/Wardrobe.svg +0 -60
- package/assets/rooms/Washroom.svg +0 -20
- package/assets/rooms/Wc.svg +0 -10
- package/assets/rooms/Windscreen.svg +0 -60
- package/assets/rooms/Workshop.svg +0 -23
- package/assets/rooms/Workspace.svg +0 -8
package/Components/FileViewer.js
CHANGED
|
@@ -87,7 +87,7 @@ class FileViewer extends react_1.Component {
|
|
|
87
87
|
constructor(props) {
|
|
88
88
|
super(props);
|
|
89
89
|
this.timeout = null;
|
|
90
|
-
this.onFileChanged = (
|
|
90
|
+
this.onFileChanged = (_id, _fileName, size) => {
|
|
91
91
|
if (!this.state.changed) {
|
|
92
92
|
if (this.timeout) {
|
|
93
93
|
clearTimeout(this.timeout);
|
|
@@ -140,13 +140,17 @@ class FileViewer extends react_1.Component {
|
|
|
140
140
|
parts.splice(0, 2);
|
|
141
141
|
const adapter = parts[0];
|
|
142
142
|
const name = parts.splice(1).join('/');
|
|
143
|
-
this.props.socket
|
|
143
|
+
this.props.socket
|
|
144
|
+
.readFile(adapter, name)
|
|
144
145
|
.then((data) => {
|
|
145
146
|
let fileData = '';
|
|
146
147
|
if (data.file !== undefined) {
|
|
147
148
|
fileData = data.file;
|
|
148
149
|
}
|
|
149
|
-
const newState = {
|
|
150
|
+
const newState = {
|
|
151
|
+
copyPossible: this.state.copyPossible,
|
|
152
|
+
ext: this.state.ext,
|
|
153
|
+
};
|
|
150
154
|
// try to detect valid extension
|
|
151
155
|
if (data.type === 'Buffer') {
|
|
152
156
|
if (name.toLowerCase().endsWith('.json5')) {
|
|
@@ -190,7 +194,9 @@ class FileViewer extends react_1.Component {
|
|
|
190
194
|
const adapter = parts[0];
|
|
191
195
|
const name = parts.splice(1).join('/');
|
|
192
196
|
if (this.props.supportSubscribes) {
|
|
193
|
-
this.props.socket
|
|
197
|
+
this.props.socket
|
|
198
|
+
.subscribeFiles(adapter, name, this.onFileChanged)
|
|
199
|
+
.catch(e => window.alert(`Cannot subscribe on file: ${e}`));
|
|
194
200
|
}
|
|
195
201
|
}
|
|
196
202
|
componentWillUnmount() {
|
|
@@ -203,7 +209,9 @@ class FileViewer extends react_1.Component {
|
|
|
203
209
|
const adapter = parts[0];
|
|
204
210
|
const name = parts.splice(1).join('/');
|
|
205
211
|
if (this.props.supportSubscribes) {
|
|
206
|
-
this.props.socket
|
|
212
|
+
this.props.socket
|
|
213
|
+
.subscribeFiles(adapter, name, this.onFileChanged)
|
|
214
|
+
.catch(e => window.alert(`Cannot subscribe on file: ${e}`));
|
|
207
215
|
}
|
|
208
216
|
}
|
|
209
217
|
static getEditFile(ext) {
|
|
@@ -228,20 +236,20 @@ class FileViewer extends react_1.Component {
|
|
|
228
236
|
if (this.state.imgError) {
|
|
229
237
|
return react_1.default.createElement(IconNoIcon_1.default, { style: Object.assign(Object.assign({}, styles.img), this.props.getStyleBackgroundImage()) });
|
|
230
238
|
}
|
|
231
|
-
return react_1.default.createElement(Icon_1.default, { onError: e => {
|
|
239
|
+
return (react_1.default.createElement(Icon_1.default, { onError: e => {
|
|
232
240
|
e.target.onerror = null;
|
|
233
241
|
this.setState({ imgError: true });
|
|
234
|
-
}, style: Object.assign(Object.assign({}, styles.img), this.props.getStyleBackgroundImage()), src: `${this.props.href}?ts=${this.state.forceUpdate}`, alt: this.props.href });
|
|
242
|
+
}, style: Object.assign(Object.assign({}, styles.img), this.props.getStyleBackgroundImage()), src: `${this.props.href}?ts=${this.state.forceUpdate}`, alt: this.props.href }));
|
|
235
243
|
}
|
|
236
244
|
if (this.state.ext && exports.EXTENSIONS.audio.includes(this.state.ext)) {
|
|
237
|
-
return react_1.default.createElement("div", { style: {
|
|
245
|
+
return (react_1.default.createElement("div", { style: {
|
|
238
246
|
width: '100%',
|
|
239
247
|
height: '100%',
|
|
240
248
|
display: 'flex',
|
|
241
249
|
justifyContent: 'center',
|
|
242
250
|
alignItems: 'center',
|
|
243
251
|
} },
|
|
244
|
-
react_1.default.createElement("audio", { style: { width: '100%' }, src: this.props.href, controls: true }));
|
|
252
|
+
react_1.default.createElement("audio", { style: { width: '100%' }, src: this.props.href, controls: true })));
|
|
245
253
|
}
|
|
246
254
|
if (this.state.ext && exports.EXTENSIONS.video.includes(this.state.ext)) {
|
|
247
255
|
return (react_1.default.createElement("div", { style: {
|
|
@@ -262,33 +270,36 @@ class FileViewer extends react_1.Component {
|
|
|
262
270
|
// value={this.state.editingValue || this.state.code || this.state.text}
|
|
263
271
|
// onChange={this.state.editing ? newValue => this.setState({ editingValue: newValue, changed: true }) : undefined}
|
|
264
272
|
// />;
|
|
265
|
-
return react_1.default.createElement(material_1.TextField, { variant: "standard", style: styles.textarea, multiline: true, value: this.state.editingValue || this.state.code || this.state.text,
|
|
273
|
+
return (react_1.default.createElement(material_1.TextField, { variant: "standard", style: styles.textarea, multiline: true, value: this.state.editingValue || this.state.code || this.state.text,
|
|
266
274
|
// onChange={newValue => this.setState({ editingValue: newValue, changed: true })}
|
|
267
|
-
|
|
275
|
+
slotProps: {
|
|
276
|
+
htmlInput: {
|
|
277
|
+
readOnly: !this.state.editing,
|
|
278
|
+
},
|
|
279
|
+
} }));
|
|
268
280
|
}
|
|
269
281
|
return null;
|
|
270
282
|
}
|
|
271
283
|
render() {
|
|
272
|
-
return react_1.default.createElement(material_1.Dialog, { sx: {
|
|
284
|
+
return (react_1.default.createElement(material_1.Dialog, { sx: {
|
|
273
285
|
'&.MuiDialog-scrollPaper': styles.dialog,
|
|
274
286
|
'& .MuiDialog-paper': styles.paper,
|
|
275
287
|
}, scroll: "paper", open: !!this.props.href, onClose: () => this.props.onClose(), fullWidth: true, maxWidth: "xl", "aria-labelledby": "ar_dialog_file_view_title" },
|
|
276
288
|
react_1.default.createElement("div", { style: styles.dialogTitle },
|
|
277
289
|
react_1.default.createElement(material_1.DialogTitle, { id: "ar_dialog_file_view_title" }, `${this.props.t(this.state.editing ? 'Edit' : 'View')}: ${this.props.href}`),
|
|
278
|
-
this.state.ext && exports.EXTENSIONS.images.includes(this.state.ext) && react_1.default.createElement("div", null,
|
|
290
|
+
this.state.ext && exports.EXTENSIONS.images.includes(this.state.ext) && (react_1.default.createElement("div", null,
|
|
279
291
|
react_1.default.createElement(material_1.IconButton, { size: "large", color: "inherit", onClick: this.props.setStateBackgroundImage },
|
|
280
|
-
react_1.default.createElement(icons_material_1.Brightness6, null)))),
|
|
292
|
+
react_1.default.createElement(icons_material_1.Brightness6, null))))),
|
|
281
293
|
react_1.default.createElement(material_1.DialogContent, { style: styles.content }, this.getContent()),
|
|
282
294
|
react_1.default.createElement(material_1.DialogActions, null,
|
|
283
|
-
this.state.copyPossible ?
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
react_1.default.createElement(material_1.Button, { variant: "contained", onClick: () => this.props.onClose(), color: "primary", startIcon: react_1.default.createElement(icons_material_1.Close, null) }, this.props.t('Close'))));
|
|
295
|
+
this.state.copyPossible ? (react_1.default.createElement(material_1.Button, { color: "grey", onClick: e => {
|
|
296
|
+
e.stopPropagation();
|
|
297
|
+
e.preventDefault();
|
|
298
|
+
Utils_1.default.copyToClipboard(this.state.text || this.state.code || '');
|
|
299
|
+
}, startIcon: react_1.default.createElement(fa_1.FaCopy, null) }, this.props.t('Copy content'))) : null,
|
|
300
|
+
this.state.editing ? (react_1.default.createElement(material_1.Button, { color: "grey", disabled: this.state.editingValue === this.state.code ||
|
|
301
|
+
this.state.editingValue === this.state.text, variant: "contained", onClick: this.writeFile64, startIcon: react_1.default.createElement(icons_material_1.Save, null) }, this.props.t('Save'))) : null,
|
|
302
|
+
react_1.default.createElement(material_1.Button, { variant: "contained", onClick: () => this.props.onClose(), color: "primary", startIcon: react_1.default.createElement(icons_material_1.Close, null) }, this.props.t('Close')))));
|
|
292
303
|
}
|
|
293
304
|
}
|
|
294
305
|
exports.default = (0, withWidth_1.default)()(FileViewer);
|
package/Components/Icon.d.ts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
|
-
import React, { ReactEventHandler } from 'react';
|
|
1
|
+
import React, { type ReactEventHandler } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Get icon by object type (state, channel, device, ...).
|
|
4
|
+
*
|
|
5
|
+
* @param obj Object
|
|
6
|
+
*/
|
|
2
7
|
export declare function getSystemIcon(obj: ioBroker.Object | null): React.JSX.Element | null;
|
|
8
|
+
/**
|
|
9
|
+
* Get icon from the object.
|
|
10
|
+
*
|
|
11
|
+
* @param obj Object
|
|
12
|
+
* @param imagePrefix Prefix for image
|
|
13
|
+
*/
|
|
3
14
|
export declare function getSelectIdIcon(obj: ioBroker.Object | null, imagePrefix?: string): string | null;
|
|
4
15
|
interface IconProps {
|
|
5
16
|
/** URL, UTF-8 character, or svg code (data:image/svg...) */
|
|
@@ -8,15 +19,18 @@ interface IconProps {
|
|
|
8
19
|
className?: string;
|
|
9
20
|
/** Style for image */
|
|
10
21
|
style?: React.CSSProperties;
|
|
22
|
+
/** Styles for mui */
|
|
11
23
|
sx?: Record<string, any>;
|
|
12
24
|
/** Tooltip */
|
|
13
25
|
title?: string;
|
|
14
26
|
/** Styles for utf-8 characters */
|
|
15
27
|
styleUTF8?: React.CSSProperties;
|
|
28
|
+
/** On error handler */
|
|
16
29
|
onError?: ReactEventHandler<HTMLImageElement>;
|
|
30
|
+
/** Reference to image */
|
|
17
31
|
ref?: React.RefObject<HTMLImageElement>;
|
|
18
32
|
/** Alternative text for image */
|
|
19
33
|
alt?: string;
|
|
20
34
|
}
|
|
21
|
-
export default function Icon(props: IconProps): React.JSX.Element;
|
|
35
|
+
export default function Icon(props: IconProps): React.JSX.Element | null;
|
|
22
36
|
export {};
|
package/Components/Icon.js
CHANGED
|
@@ -12,6 +12,11 @@ const material_1 = require("@mui/material");
|
|
|
12
12
|
const icons_material_1 = require("@mui/icons-material");
|
|
13
13
|
const IconAlias_1 = __importDefault(require("../icons/IconAlias"));
|
|
14
14
|
const Utils_1 = __importDefault(require("./Utils"));
|
|
15
|
+
/**
|
|
16
|
+
* Get icon by object type (state, channel, device, ...).
|
|
17
|
+
*
|
|
18
|
+
* @param obj Object
|
|
19
|
+
*/
|
|
15
20
|
function getSystemIcon(obj) {
|
|
16
21
|
let icon;
|
|
17
22
|
const id = obj === null || obj === void 0 ? void 0 : obj._id;
|
|
@@ -19,7 +24,7 @@ function getSystemIcon(obj) {
|
|
|
19
24
|
return null;
|
|
20
25
|
}
|
|
21
26
|
// system or design has special icons
|
|
22
|
-
if (id.startsWith('_design/') ||
|
|
27
|
+
if (id.startsWith('_design/') || id === 'system') {
|
|
23
28
|
icon = react_1.default.createElement(icons_material_1.SettingsApplications, { className: "iconOwn" });
|
|
24
29
|
}
|
|
25
30
|
else if (id === '0_userdata' || id === '0_userdata.0') {
|
|
@@ -51,6 +56,12 @@ function getSystemIcon(obj) {
|
|
|
51
56
|
}
|
|
52
57
|
return icon || null;
|
|
53
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Get icon from the object.
|
|
61
|
+
*
|
|
62
|
+
* @param obj Object
|
|
63
|
+
* @param imagePrefix Prefix for image
|
|
64
|
+
*/
|
|
54
65
|
function getSelectIdIcon(obj, imagePrefix) {
|
|
55
66
|
imagePrefix = imagePrefix || '.'; // http://localhost:8081';
|
|
56
67
|
let src = '';
|
|
@@ -106,12 +117,12 @@ function Icon(props) {
|
|
|
106
117
|
if (props.src.length < 3) {
|
|
107
118
|
// utf-8 char
|
|
108
119
|
if (props.sx) {
|
|
109
|
-
return react_1.default.createElement(material_1.Box, { component: "span", sx: props.sx, title: props.title || undefined, style: Object.assign({ height: 27, marginTop: -8 }, (props.styleUTF8 || props.style)), className: Utils_1.default.clsx(props.className, 'iconOwn') }, props.src);
|
|
120
|
+
return (react_1.default.createElement(material_1.Box, { component: "span", sx: props.sx, title: props.title || undefined, style: Object.assign({ height: 27, marginTop: -8 }, (props.styleUTF8 || props.style)), className: Utils_1.default.clsx(props.className, 'iconOwn') }, props.src));
|
|
110
121
|
}
|
|
111
|
-
return react_1.default.createElement("span", { title: props.title || undefined, style: Object.assign({ height: 27, marginTop: -8 }, (props.styleUTF8 || props.style)), className: Utils_1.default.clsx(props.className, 'iconOwn') }, props.src);
|
|
122
|
+
return (react_1.default.createElement("span", { title: props.title || undefined, style: Object.assign({ height: 27, marginTop: -8 }, (props.styleUTF8 || props.style)), className: Utils_1.default.clsx(props.className, 'iconOwn') }, props.src));
|
|
112
123
|
}
|
|
113
124
|
if (props.src.startsWith('data:image/svg')) {
|
|
114
|
-
return react_1.default.createElement(react_inlinesvg_1.default, { title: props.title || undefined, src: props.src, className: Utils_1.default.clsx(props.className, 'iconOwn'), width: ((_a = props.style) === null || _a === void 0 ? void 0 : _a.width) || 28, height: ((_b = props.style) === null || _b === void 0 ? void 0 : _b.height) || ((_c = props.style) === null || _c === void 0 ? void 0 : _c.width) || 28, style: props.style || {} });
|
|
125
|
+
return (react_1.default.createElement(react_inlinesvg_1.default, { title: props.title || undefined, src: props.src, className: Utils_1.default.clsx(props.className, 'iconOwn'), width: ((_a = props.style) === null || _a === void 0 ? void 0 : _a.width) || 28, height: ((_b = props.style) === null || _b === void 0 ? void 0 : _b.height) || ((_c = props.style) === null || _c === void 0 ? void 0 : _c.width) || 28, style: props.style || {} }));
|
|
115
126
|
}
|
|
116
127
|
if (REMOTE_SERVER && !props.src.startsWith('http://') && !props.src.startsWith('https://')) {
|
|
117
128
|
let src = props.src;
|
|
@@ -122,14 +133,14 @@ function Icon(props) {
|
|
|
122
133
|
src = REMOTE_PREFIX + src;
|
|
123
134
|
}
|
|
124
135
|
if (props.sx) {
|
|
125
|
-
return react_1.default.createElement(material_1.Box, { component: "img", sx: props.sx, title: props.title || undefined, style: props.style || {}, className: Utils_1.default.clsx(props.className, 'iconOwn'), src: `https://remote-files.iobroker.in${src}`, alt: props.alt || undefined, ref: props.ref, onError: e => props.onError && props.onError(e) });
|
|
136
|
+
return (react_1.default.createElement(material_1.Box, { component: "img", sx: props.sx, title: props.title || undefined, style: props.style || {}, className: Utils_1.default.clsx(props.className, 'iconOwn'), src: `https://remote-files.iobroker.in${src}`, alt: props.alt || undefined, ref: props.ref, onError: e => props.onError && props.onError(e) }));
|
|
126
137
|
}
|
|
127
|
-
return react_1.default.createElement("img", { title: props.title || undefined, style: props.style || {}, className: Utils_1.default.clsx(props.className, 'iconOwn'), src: `https://remote-files.iobroker.in${src}`, alt: props.alt || undefined, ref: props.ref, onError: e => props.onError && props.onError(e) });
|
|
138
|
+
return (react_1.default.createElement("img", { title: props.title || undefined, style: props.style || {}, className: Utils_1.default.clsx(props.className, 'iconOwn'), src: `https://remote-files.iobroker.in${src}`, alt: props.alt || undefined, ref: props.ref, onError: e => props.onError && props.onError(e) }));
|
|
128
139
|
}
|
|
129
140
|
if (props.sx) {
|
|
130
|
-
return react_1.default.createElement(material_1.Box, { component: "img", sx: props.sx, title: props.title || undefined, style: props.style || {}, className: Utils_1.default.clsx(props.className, 'iconOwn'), src: props.src, alt: props.alt || undefined, ref: props.ref, onError: props.onError });
|
|
141
|
+
return (react_1.default.createElement(material_1.Box, { component: "img", sx: props.sx, title: props.title || undefined, style: props.style || {}, className: Utils_1.default.clsx(props.className, 'iconOwn'), src: props.src, alt: props.alt || undefined, ref: props.ref, onError: props.onError }));
|
|
131
142
|
}
|
|
132
|
-
return react_1.default.createElement("img", { title: props.title || undefined, style: props.style || {}, className: Utils_1.default.clsx(props.className, 'iconOwn'), src: props.src, alt: props.alt || undefined, ref: props.ref, onError: props.onError });
|
|
143
|
+
return (react_1.default.createElement("img", { title: props.title || undefined, style: props.style || {}, className: Utils_1.default.clsx(props.className, 'iconOwn'), src: props.src, alt: props.alt || undefined, ref: props.ref, onError: props.onError }));
|
|
133
144
|
}
|
|
134
145
|
return props.src;
|
|
135
146
|
}
|
package/Components/IconPicker.js
CHANGED
|
@@ -73,30 +73,26 @@ const styles = {
|
|
|
73
73
|
const IconPicker = (props) => {
|
|
74
74
|
var _a, _b, _c, _d;
|
|
75
75
|
const IconCustom = props.icon;
|
|
76
|
+
const onChange = props.onChange;
|
|
76
77
|
const onDrop = (0, react_1.useCallback)((acceptedFiles) => {
|
|
77
78
|
const reader = new FileReader();
|
|
78
|
-
reader.addEventListener('load', () =>
|
|
79
|
+
reader.addEventListener('load', () => onChange(reader.result), false);
|
|
79
80
|
if (acceptedFiles[0]) {
|
|
80
81
|
reader.readAsDataURL(acceptedFiles[0]);
|
|
81
82
|
}
|
|
82
|
-
}, []);
|
|
83
|
+
}, [onChange]);
|
|
83
84
|
const { getRootProps, getInputProps, isDragActive } = (0, react_dropzone_1.useDropzone)({ onDrop });
|
|
84
|
-
return react_1.default.createElement("div", { style: styles.formContainer },
|
|
85
|
+
return (react_1.default.createElement("div", { style: styles.formContainer },
|
|
85
86
|
IconCustom ? react_1.default.createElement(IconCustom, { style: styles.formIcon }) : null,
|
|
86
87
|
react_1.default.createElement(material_1.FormControl, { variant: "standard", style: Object.assign(Object.assign({}, styles.formControl), { padding: 3 }) },
|
|
87
88
|
react_1.default.createElement(material_1.InputLabel, { shrink: true, sx: ((_a = props.customStyles) === null || _a === void 0 ? void 0 : _a.label) ? { '&.MuiInputLabel-root': props.customStyles.label } : undefined, classes: { root: (_b = props.customClasses) === null || _b === void 0 ? void 0 : _b.label } }, props.label),
|
|
88
89
|
react_1.default.createElement("div", { style: styles.formContainer },
|
|
89
|
-
props.value ?
|
|
90
|
-
react_1.default.createElement(
|
|
91
|
-
|
|
92
|
-
!props.disabled && react_1.default.createElement(
|
|
93
|
-
|
|
94
|
-
:
|
|
95
|
-
(!props.disabled && react_1.default.createElement(IconSelector_1.default, { icons: props.icons, onlyRooms: props.onlyRooms, onlyDevices: props.onlyDevices, onSelect: (base64) => props.onChange(base64), t: i18n_1.default.t, lang: i18n_1.default.getLanguage() })),
|
|
96
|
-
!props.disabled && react_1.default.createElement("div", Object.assign({}, getRootProps(), { style: Object.assign(Object.assign({}, styles.dragField), (isDragActive ? { backgroundColor: 'rgba(0, 255, 0, 0.1)' } : { cursor: 'pointer' })) }),
|
|
90
|
+
props.value ? (react_1.default.createElement("div", { style: styles.divContainer },
|
|
91
|
+
react_1.default.createElement(Icon_1.default, { style: Object.assign(Object.assign({}, props.previewStyle), (((_c = props.customStyles) === null || _c === void 0 ? void 0 : _c.icon) || undefined)), src: props.value, className: Utils_1.default.clsx(props.previewClassName, (_d = props.customClasses) === null || _d === void 0 ? void 0 : _d.icon) }),
|
|
92
|
+
!props.disabled && (react_1.default.createElement(material_1.IconButton, { style: { verticalAlign: 'top' }, title: i18n_1.default.t('ra_Clear icon'), size: "small", onClick: () => props.onChange('') },
|
|
93
|
+
react_1.default.createElement(icons_material_1.Clear, null))))) : (!props.disabled && (react_1.default.createElement(IconSelector_1.default, { icons: props.icons, onlyRooms: props.onlyRooms, onlyDevices: props.onlyDevices, onSelect: (base64) => props.onChange(base64), t: i18n_1.default.t, lang: i18n_1.default.getLanguage() }))),
|
|
94
|
+
!props.disabled && (react_1.default.createElement("div", Object.assign({}, getRootProps(), { style: Object.assign(Object.assign({}, styles.dragField), (isDragActive ? { backgroundColor: 'rgba(0, 255, 0, 0.1)' } : { cursor: 'pointer' })) }),
|
|
97
95
|
react_1.default.createElement("input", Object.assign({}, getInputProps())),
|
|
98
|
-
isDragActive ?
|
|
99
|
-
react_1.default.createElement("span", { style: styles.text }, i18n_1.default.t('ra_Drop the files here...')) :
|
|
100
|
-
react_1.default.createElement("span", { style: styles.text }, i18n_1.default.t('ra_Drag \'n\' drop some files here, or click to select files'))))));
|
|
96
|
+
isDragActive ? (react_1.default.createElement("span", { style: styles.text }, i18n_1.default.t('ra_Drop the files here...'))) : (react_1.default.createElement("span", { style: styles.text }, i18n_1.default.t("ra_Drag 'n' drop some files here, or click to select files")))))))));
|
|
101
97
|
};
|
|
102
98
|
exports.default = IconPicker;
|
|
@@ -31,6 +31,8 @@ const material_1 = require("@mui/material");
|
|
|
31
31
|
const icons_material_1 = require("@mui/icons-material");
|
|
32
32
|
const Icon_1 = __importDefault(require("./Icon"));
|
|
33
33
|
const Utils_1 = __importDefault(require("./Utils"));
|
|
34
|
+
const devices_json_1 = __importDefault(require("../assets/devices.json"));
|
|
35
|
+
const rooms_json_1 = __importDefault(require("../assets/rooms.json"));
|
|
34
36
|
// import devices from '../assets/devices/list.json';
|
|
35
37
|
const devices = [
|
|
36
38
|
{
|
|
@@ -55,7 +57,7 @@ const devices = [
|
|
|
55
57
|
en: 'Alarm System',
|
|
56
58
|
ru: 'Сигнализация',
|
|
57
59
|
de: 'Alarmanlage',
|
|
58
|
-
fr:
|
|
60
|
+
fr: "Systèmes D'Alarme",
|
|
59
61
|
it: 'Sistemi Di Allarme',
|
|
60
62
|
nl: 'Alarm Systems',
|
|
61
63
|
pl: 'Systemy Alarmowe',
|
|
@@ -151,7 +153,7 @@ const devices = [
|
|
|
151
153
|
en: 'Computer',
|
|
152
154
|
ru: 'Компьютер',
|
|
153
155
|
de: 'Rechner',
|
|
154
|
-
fr:
|
|
156
|
+
fr: "L'Ordinateur",
|
|
155
157
|
it: 'Computer',
|
|
156
158
|
nl: 'Computer',
|
|
157
159
|
pl: 'Komputer',
|
|
@@ -199,7 +201,7 @@ const devices = [
|
|
|
199
201
|
en: 'Power Consumption',
|
|
200
202
|
ru: 'Потребляемая мощность',
|
|
201
203
|
de: 'Stromverbrauch',
|
|
202
|
-
fr:
|
|
204
|
+
fr: "Consommation D'Énergie",
|
|
203
205
|
it: 'Consumo Di Energia',
|
|
204
206
|
nl: 'Energieverbruik',
|
|
205
207
|
pl: 'Pobór Energii',
|
|
@@ -775,7 +777,7 @@ const devices = [
|
|
|
775
777
|
en: 'Power Consumption',
|
|
776
778
|
ru: 'Потребляемая мощность',
|
|
777
779
|
de: 'Stromverbrauch',
|
|
778
|
-
fr:
|
|
780
|
+
fr: "Consommation D'Énergie",
|
|
779
781
|
it: 'Consumo Di Energia',
|
|
780
782
|
nl: 'Energieverbruik',
|
|
781
783
|
pl: 'Pobór Energii',
|
|
@@ -967,7 +969,7 @@ const devices = [
|
|
|
967
969
|
en: 'Water',
|
|
968
970
|
ru: 'Вода',
|
|
969
971
|
de: 'Wasser',
|
|
970
|
-
fr:
|
|
972
|
+
fr: "L'Eau",
|
|
971
973
|
it: 'Acqua',
|
|
972
974
|
nl: 'Water',
|
|
973
975
|
pl: 'Woda',
|
|
@@ -999,8 +1001,8 @@ const devices = [
|
|
|
999
1001
|
en: 'Water Consumption',
|
|
1000
1002
|
ru: 'Потребление воды',
|
|
1001
1003
|
de: 'Wasserverbrauch',
|
|
1002
|
-
fr:
|
|
1003
|
-
it:
|
|
1004
|
+
fr: "Consommation D'Eau",
|
|
1005
|
+
it: "Consumo D'Acqua",
|
|
1004
1006
|
nl: 'Waterverbruik',
|
|
1005
1007
|
pl: 'Konsumpcja Wody',
|
|
1006
1008
|
pt: 'Consumo De Água',
|
|
@@ -1115,7 +1117,7 @@ const rooms = [
|
|
|
1115
1117
|
ru: 'На Улице',
|
|
1116
1118
|
de: 'Außenbereich',
|
|
1117
1119
|
fr: 'En Plein Air',
|
|
1118
|
-
it:
|
|
1120
|
+
it: "All'Aperto",
|
|
1119
1121
|
nl: 'Buitenshuis',
|
|
1120
1122
|
pl: 'Na Dworze',
|
|
1121
1123
|
pt: 'Ao Ar Livre',
|
|
@@ -1370,7 +1372,7 @@ const rooms = [
|
|
|
1370
1372
|
en: 'Summer House',
|
|
1371
1373
|
ru: 'Дача',
|
|
1372
1374
|
de: 'Gartenhaus',
|
|
1373
|
-
fr:
|
|
1375
|
+
fr: "Maison D'Été",
|
|
1374
1376
|
it: 'Casa Estiva',
|
|
1375
1377
|
nl: 'Zomerhuis',
|
|
1376
1378
|
pl: 'Domek Letniskowy',
|
|
@@ -1402,7 +1404,7 @@ const rooms = [
|
|
|
1402
1404
|
en: 'Guest Room',
|
|
1403
1405
|
ru: 'Гостевая Комната',
|
|
1404
1406
|
de: 'Gästezimmer',
|
|
1405
|
-
fr:
|
|
1407
|
+
fr: "Chambre D'Amis",
|
|
1406
1408
|
it: 'Stanza Degli Ospiti',
|
|
1407
1409
|
nl: 'Guest Room',
|
|
1408
1410
|
pl: 'Pokój Gościnny',
|
|
@@ -1738,7 +1740,7 @@ const rooms = [
|
|
|
1738
1740
|
en: 'Equipment Room',
|
|
1739
1741
|
ru: 'Оборудование Номера',
|
|
1740
1742
|
de: 'Technikraum',
|
|
1741
|
-
fr:
|
|
1743
|
+
fr: "Salle D'Équipement",
|
|
1742
1744
|
it: 'Stanza Degli Attrezzi',
|
|
1743
1745
|
nl: 'Technische Ruimte',
|
|
1744
1746
|
pl: 'Wyposażenie Pokoi',
|
|
@@ -1786,7 +1788,7 @@ const rooms = [
|
|
|
1786
1788
|
en: 'Stairwell',
|
|
1787
1789
|
ru: 'Лестничная клетка',
|
|
1788
1790
|
de: 'Treppenhaus',
|
|
1789
|
-
fr:
|
|
1791
|
+
fr: "Cage D'Escalier",
|
|
1790
1792
|
it: 'Tromba Delle Scale',
|
|
1791
1793
|
nl: 'Trappenhuis',
|
|
1792
1794
|
pl: 'Klatka Schodowa',
|
|
@@ -1993,8 +1995,8 @@ class IconSelector extends react_1.Component {
|
|
|
1993
1995
|
const icons = [];
|
|
1994
1996
|
const names = [];
|
|
1995
1997
|
if (!this.props.icons) {
|
|
1998
|
+
// load rooms
|
|
1996
1999
|
let templates = this.props.onlyRooms || (!this.props.onlyRooms && !this.props.onlyDevices) ? rooms : null;
|
|
1997
|
-
const promises = [];
|
|
1998
2000
|
if (templates) {
|
|
1999
2001
|
templates.forEach(item => {
|
|
2000
2002
|
if (item.name && typeof item.name === 'object') {
|
|
@@ -2004,59 +2006,46 @@ class IconSelector extends react_1.Component {
|
|
|
2004
2006
|
});
|
|
2005
2007
|
templates = templates.filter((item, i) => !(templates === null || templates === void 0 ? void 0 : templates.find((_item, _i) => i !== _i && _item.icon === item.icon && _item.name === item.name)));
|
|
2006
2008
|
templates.forEach((template, i) => {
|
|
2007
|
-
let image;
|
|
2008
|
-
try {
|
|
2009
|
-
image = require(`../assets/rooms/${template.icon}`);
|
|
2010
|
-
}
|
|
2011
|
-
catch (e) {
|
|
2012
|
-
return;
|
|
2013
|
-
}
|
|
2014
2009
|
names[i] = template.name;
|
|
2015
|
-
|
|
2016
|
-
.
|
|
2017
|
-
icons[i] = icon;
|
|
2018
|
-
}));
|
|
2010
|
+
icons[i] =
|
|
2011
|
+
`data:image/svg+xml;base64,${rooms_json_1.default[template.icon.replace(/\.svg$/, '')]}`;
|
|
2019
2012
|
});
|
|
2020
2013
|
}
|
|
2021
|
-
|
|
2014
|
+
// load devices
|
|
2015
|
+
templates =
|
|
2016
|
+
this.props.onlyDevices || (!this.props.onlyRooms && !this.props.onlyDevices) ? devices : null;
|
|
2022
2017
|
if (templates) {
|
|
2023
|
-
const offset =
|
|
2024
|
-
templates &&
|
|
2025
|
-
|
|
2026
|
-
item.name
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2018
|
+
const offset = icons.length;
|
|
2019
|
+
templates &&
|
|
2020
|
+
templates.forEach(item => {
|
|
2021
|
+
if (item.name && typeof item.name === 'object') {
|
|
2022
|
+
item.name = item.name[this.props.lang] || item.name.en || item._id;
|
|
2023
|
+
}
|
|
2024
|
+
item.name = item.name || item._id;
|
|
2025
|
+
});
|
|
2030
2026
|
templates = templates.filter((item, i) => !(templates === null || templates === void 0 ? void 0 : templates.find((_item, _i) => i !== _i && _item.icon === item.icon && _item.name === item.name)));
|
|
2031
2027
|
templates.forEach((template, i) => {
|
|
2032
|
-
let image;
|
|
2033
|
-
try {
|
|
2034
|
-
image = require(`../assets/devices/${template.icon}`);
|
|
2035
|
-
}
|
|
2036
|
-
catch (e) {
|
|
2037
|
-
return;
|
|
2038
|
-
}
|
|
2039
2028
|
names[i + offset] = template.name;
|
|
2040
|
-
|
|
2041
|
-
.
|
|
2042
|
-
icons[i + offset] = icon;
|
|
2043
|
-
}));
|
|
2029
|
+
icons[i + offset] =
|
|
2030
|
+
`data:image/svg+xml;base64,${devices_json_1.default[template.icon.replace(/\.svg$/, '')]}`;
|
|
2044
2031
|
});
|
|
2045
2032
|
}
|
|
2046
|
-
|
|
2047
|
-
.then(() => this.setState({
|
|
2033
|
+
this.setState({
|
|
2048
2034
|
icons,
|
|
2049
2035
|
loading: false,
|
|
2050
2036
|
names,
|
|
2051
2037
|
isAnyName: !!names.find(i => i),
|
|
2052
|
-
})
|
|
2038
|
+
});
|
|
2053
2039
|
}
|
|
2054
2040
|
else {
|
|
2055
2041
|
const promises = this.props.icons.map((item, i) => {
|
|
2056
2042
|
let href;
|
|
2057
2043
|
if (typeof item === 'object') {
|
|
2058
2044
|
href = item.icon || item.src || item.href || '';
|
|
2059
|
-
names[i] =
|
|
2045
|
+
names[i] =
|
|
2046
|
+
typeof item.name === 'object'
|
|
2047
|
+
? item.name[this.props.lang] || item.name.en || item._id || ''
|
|
2048
|
+
: item.name || '';
|
|
2060
2049
|
if (!names[i]) {
|
|
2061
2050
|
const parts = href.split('.');
|
|
2062
2051
|
parts.pop();
|
|
@@ -2071,12 +2060,12 @@ class IconSelector extends react_1.Component {
|
|
|
2071
2060
|
icons[i] = href;
|
|
2072
2061
|
return Promise.resolve();
|
|
2073
2062
|
}
|
|
2074
|
-
return Utils_1.default.getSvg(href)
|
|
2075
|
-
.then(icon => icons[i] = icon);
|
|
2063
|
+
return Utils_1.default.getSvg(href).then(icon => (icons[i] = icon));
|
|
2076
2064
|
}
|
|
2077
2065
|
return Promise.resolve();
|
|
2078
2066
|
});
|
|
2079
|
-
Promise.all(promises)
|
|
2067
|
+
void Promise.all(promises)
|
|
2068
|
+
.catch((e) => console.error(e))
|
|
2080
2069
|
.then(() => this.setState({
|
|
2081
2070
|
icons,
|
|
2082
2071
|
loading: false,
|
|
@@ -2090,35 +2079,36 @@ class IconSelector extends react_1.Component {
|
|
|
2090
2079
|
if (this.state.loading) {
|
|
2091
2080
|
return react_1.default.createElement(material_1.CircularProgress, null);
|
|
2092
2081
|
}
|
|
2093
|
-
return react_1.default.createElement(react_1.default.Fragment, null,
|
|
2082
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
2094
2083
|
react_1.default.createElement(material_1.Button, { color: "grey", variant: "outlined", title: this.props.t('ra_Select predefined icon'), onClick: () => this.setState({ opened: true }, () => this.loadAllIcons()), style: { minWidth: 40, marginRight: 8 } }, "..."),
|
|
2095
|
-
this.state.opened ? react_1.default.createElement(material_1.Dialog, { onClose: () => this.setState({ opened: false }), open: !0 },
|
|
2084
|
+
this.state.opened ? (react_1.default.createElement(material_1.Dialog, { onClose: () => this.setState({ opened: false }), open: !0 },
|
|
2096
2085
|
react_1.default.createElement(material_1.DialogTitle, null,
|
|
2097
2086
|
this.props.t('ra_Select predefined icon'),
|
|
2098
|
-
this.state.isAnyName ? react_1.default.createElement(material_1.TextField, { variant: "standard", margin: "dense", style: { marginLeft: 20 }, value: this.state.filter, onChange: e => this.setState({ filter: e.target.value.toLowerCase() }), placeholder: this.props.t('ra_Filter'),
|
|
2099
|
-
|
|
2100
|
-
?
|
|
2101
|
-
react_1.default.createElement(
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
undefined,
|
|
2105
|
-
} }) : null),
|
|
2087
|
+
this.state.isAnyName ? (react_1.default.createElement(material_1.TextField, { variant: "standard", margin: "dense", style: { marginLeft: 20 }, value: this.state.filter, onChange: e => this.setState({ filter: e.target.value.toLowerCase() }), placeholder: this.props.t('ra_Filter'), slotProps: {
|
|
2088
|
+
input: {
|
|
2089
|
+
endAdornment: this.state.filter ? (react_1.default.createElement(material_1.IconButton, { size: "small", onClick: () => this.setState({ filter: '' }) },
|
|
2090
|
+
react_1.default.createElement(icons_material_1.Clear, null))) : undefined,
|
|
2091
|
+
},
|
|
2092
|
+
} })) : null),
|
|
2106
2093
|
react_1.default.createElement(material_1.DialogContent, null,
|
|
2107
|
-
react_1.default.createElement("div", { style: { width: '100%', textAlign: 'center' } }, this.state.icons &&
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2094
|
+
react_1.default.createElement("div", { style: { width: '100%', textAlign: 'center' } }, this.state.icons &&
|
|
2095
|
+
this.state.icons.map((icon, i) => {
|
|
2096
|
+
if (!this.state.filter ||
|
|
2097
|
+
(this.state.names[i] &&
|
|
2098
|
+
this.state.names[i].toLowerCase().includes(this.state.filter))) {
|
|
2099
|
+
return (react_1.default.createElement(material_1.Tooltip, { title: this.state.names[i] || '', key: i, slotProps: { popper: { sx: { pointerEvents: 'none' } } } },
|
|
2100
|
+
react_1.default.createElement(material_1.IconButton, { onClick: () => this.setState({ opened: false }, () => {
|
|
2101
|
+
const onApply = this.props.onSelect || this.props.onChange;
|
|
2102
|
+
if (onApply) {
|
|
2103
|
+
onApply(icon);
|
|
2104
|
+
}
|
|
2105
|
+
}), size: "large" },
|
|
2106
|
+
react_1.default.createElement(Icon_1.default, { src: icon, alt: i.toString(), style: { width: 32, height: 32, borderRadius: 5 } }))));
|
|
2107
|
+
}
|
|
2108
|
+
return null;
|
|
2109
|
+
}))),
|
|
2120
2110
|
react_1.default.createElement(material_1.DialogActions, null,
|
|
2121
|
-
react_1.default.createElement(material_1.Button, { color: "grey", variant: "contained", onClick: () => this.setState({ opened: false }), startIcon: react_1.default.createElement(icons_material_1.Close, null) }, this.props.t('ra_Close')))) : null);
|
|
2111
|
+
react_1.default.createElement(material_1.Button, { color: "grey", variant: "contained", onClick: () => this.setState({ opened: false }), startIcon: react_1.default.createElement(icons_material_1.Close, null) }, this.props.t('ra_Close'))))) : null));
|
|
2122
2112
|
}
|
|
2123
2113
|
}
|
|
2124
2114
|
exports.default = IconSelector;
|
package/Components/Image.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type JSX } from 'react';
|
|
2
|
+
import { Component } from 'react';
|
|
2
3
|
interface ImageProps {
|
|
3
4
|
color?: string;
|
|
4
5
|
src?: string;
|
|
@@ -14,13 +15,16 @@ interface ImageState {
|
|
|
14
15
|
imgError?: boolean;
|
|
15
16
|
showError?: boolean;
|
|
16
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* A component for displaying an image.
|
|
20
|
+
*/
|
|
17
21
|
declare class Image extends Component<ImageProps, ImageState> {
|
|
18
22
|
private svg;
|
|
19
23
|
static REMOTE_SERVER: boolean;
|
|
20
24
|
static REMOTE_PREFIX: string;
|
|
21
25
|
constructor(props: ImageProps);
|
|
22
|
-
static getDerivedStateFromProps(props: ImageProps, state: ImageState): ImageState;
|
|
23
|
-
getSvgFromData(src: string):
|
|
24
|
-
render():
|
|
26
|
+
static getDerivedStateFromProps(props: ImageProps, state: ImageState): Partial<ImageState> | null;
|
|
27
|
+
getSvgFromData(src: string): JSX.Element | null;
|
|
28
|
+
render(): JSX.Element | null;
|
|
25
29
|
}
|
|
26
30
|
export default Image;
|