@iobroker/adapter-react-v5 7.0.2 → 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 +3 -2
- 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 +135 -152
- 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 +21 -18
- 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 +20 -7
- package/Components/Loaders/Vendor.d.ts +2 -2
- package/Components/Loaders/Vendor.js +15 -7
- package/Components/Logo.js +16 -18
- package/Components/MDUtils.d.ts +1 -1
- package/Components/MDUtils.js +8 -4
- package/Components/ObjectBrowser.d.ts +40 -39
- package/Components/ObjectBrowser.js +550 -435
- 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 +25 -21
- 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 +128 -85
- package/LegacyConnection.d.ts +240 -248
- package/LegacyConnection.js +500 -525
- package/README.md +1234 -1170
- package/Theme.d.ts +1 -1
- package/Theme.js +9 -12
- package/assets/devices.json +1 -0
- package/assets/rooms.json +1 -0
- package/craco-module-federation.js +3 -12
- package/i18n/de.json +434 -434
- package/i18n/en.json +434 -434
- package/i18n/es.json +434 -434
- package/i18n/fr.json +434 -434
- package/i18n/it.json +434 -434
- package/i18n/nl.json +434 -434
- package/i18n/pl.json +434 -434
- package/i18n/pt.json +434 -434
- package/i18n/ru.json +434 -434
- package/i18n/uk.json +434 -434
- package/i18n/zh-cn.json +434 -434
- 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 +3 -2
- package/package.json +1 -1
- package/src/Components/404.tsx +32 -31
- package/src/Components/ColorPicker.tsx +142 -114
- package/src/Components/ComplexCron.tsx +174 -137
- package/src/Components/CopyToClipboard.tsx +22 -9
- package/src/Components/CustomModal.tsx +76 -69
- package/src/Components/FileBrowser.tsx +959 -852
- package/src/Components/FileViewer.tsx +146 -127
- package/src/Components/Icon.tsx +80 -52
- package/src/Components/IconPicker.tsx +83 -67
- package/src/Components/IconSelector.tsx +159 -141
- package/src/Components/Image.tsx +43 -26
- package/src/Components/Loader.tsx +56 -32
- package/src/Components/Logo.tsx +62 -52
- package/src/Components/MDUtils.tsx +10 -6
- package/src/Components/ObjectBrowser.tsx +3198 -2478
- package/src/Components/Router.tsx +11 -11
- package/src/Components/SaveCloseButtons.tsx +43 -39
- package/src/Components/Schedule.tsx +1091 -853
- package/src/Components/SelectWithIcon.tsx +135 -93
- package/src/Components/TabContainer.tsx +21 -19
- package/src/Components/TabContent.tsx +13 -12
- package/src/Components/TabHeader.tsx +10 -9
- package/src/Components/TableResize.tsx +52 -37
- package/src/Components/TextWithIcon.tsx +30 -19
- package/src/Components/ToggleThemeMenu.tsx +31 -13
- package/src/Components/TreeTable.tsx +468 -385
- package/src/Components/UploadImage.tsx +153 -121
- package/src/Components/Utils.tsx +135 -127
- package/src/Components/loader.css +40 -31
- package/src/Components/withWidth.tsx +23 -12
- package/src/Connection.tsx +1 -3
- package/src/Dialogs/ComplexCron.tsx +55 -61
- package/src/Dialogs/Confirm.tsx +88 -65
- package/src/Dialogs/Cron.tsx +122 -112
- package/src/Dialogs/Error.tsx +37 -42
- package/src/Dialogs/Message.tsx +39 -37
- package/src/Dialogs/SelectFile.tsx +95 -85
- package/src/Dialogs/SelectID.tsx +141 -129
- package/src/Dialogs/SimpleCron.tsx +44 -44
- package/src/Dialogs/TextInput.tsx +60 -68
- package/src/GenericApp.tsx +342 -242
- package/src/LegacyConnection.tsx +972 -842
- package/src/Prompt.tsx +3 -1
- package/src/Theme.tsx +19 -26
- package/src/icons/IconAdapter.tsx +16 -14
- package/src/icons/IconAlias.tsx +16 -14
- package/src/icons/IconChannel.tsx +55 -16
- package/src/icons/IconClearFilter.tsx +17 -15
- package/src/icons/IconClosed.tsx +16 -11
- package/src/icons/IconCopy.tsx +16 -11
- package/src/icons/IconDevice.tsx +121 -22
- package/src/icons/IconDocument.tsx +16 -11
- package/src/icons/IconDocumentReadOnly.tsx +21 -12
- package/src/icons/IconExpert.tsx +20 -12
- package/src/icons/IconFx.tsx +16 -14
- package/src/icons/IconInstance.tsx +16 -14
- package/src/icons/IconLogout.tsx +20 -18
- package/src/icons/IconNoIcon.tsx +16 -14
- package/src/icons/IconOpen.tsx +17 -12
- package/src/icons/IconProps.tsx +4 -3
- package/src/icons/IconState.tsx +34 -13
- package/src/index.css +3 -2
- package/tasks.js +91 -0
- package/types.d.ts +141 -0
- 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
|
@@ -5,26 +5,17 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined
|
|
8
|
-
import React from 'react';
|
|
8
|
+
import React, { type JSX } from 'react';
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
Button,
|
|
12
|
-
DialogTitle,
|
|
13
|
-
DialogContent,
|
|
14
|
-
DialogActions,
|
|
15
|
-
Dialog,
|
|
16
|
-
} from '@mui/material';
|
|
10
|
+
import { Button, DialogTitle, DialogContent, DialogActions, Dialog } from '@mui/material';
|
|
17
11
|
|
|
18
|
-
import {
|
|
19
|
-
Cancel as IconCancel,
|
|
20
|
-
Check as IconOk,
|
|
21
|
-
} from '@mui/icons-material';
|
|
12
|
+
import { Cancel as IconCancel, Check as IconOk } from '@mui/icons-material';
|
|
22
13
|
|
|
23
14
|
import type { Connection } from '@iobroker/socket-client';
|
|
24
15
|
|
|
25
16
|
import I18n from '../i18n';
|
|
26
17
|
import FileBrowser from '../Components/FileBrowser';
|
|
27
|
-
import { IobTheme } from '../types';
|
|
18
|
+
import type { IobTheme } from '../types';
|
|
28
19
|
|
|
29
20
|
const styles: Record<string, React.CSSProperties> = {
|
|
30
21
|
headerID: {
|
|
@@ -67,7 +58,7 @@ interface DialogSelectFileProps {
|
|
|
67
58
|
multiSelect?: boolean;
|
|
68
59
|
/** Image prefix. Normally, admin has '../..' and the web has '../' */
|
|
69
60
|
imagePrefix?: string; // Prefix (default: '.')
|
|
70
|
-
/** @
|
|
61
|
+
/** @deprecated Image prefix */
|
|
71
62
|
prefix?: string;
|
|
72
63
|
/** Show the expert button? */
|
|
73
64
|
showExpertButton?: boolean;
|
|
@@ -115,11 +106,11 @@ interface DialogSelectFileProps {
|
|
|
115
106
|
filters?: Record<string, string>;
|
|
116
107
|
/** Allow switch views Table<=>Rows */
|
|
117
108
|
showViewTypeButton?: boolean;
|
|
118
|
-
|
|
109
|
+
/** If type selector should be shown */
|
|
119
110
|
showTypeSelector?: boolean;
|
|
120
|
-
|
|
111
|
+
/** If defined, allow selecting only files from this folder */
|
|
121
112
|
restrictToFolder?: string;
|
|
122
|
-
|
|
113
|
+
/** If restrictToFolder defined, allow selecting files outside of this folder */
|
|
123
114
|
allowNonRestricted?: boolean;
|
|
124
115
|
/** force expert mode */
|
|
125
116
|
expertMode?: boolean;
|
|
@@ -145,7 +136,7 @@ class DialogSelectFile extends React.Component<DialogSelectFileProps, DialogSele
|
|
|
145
136
|
|
|
146
137
|
try {
|
|
147
138
|
this.filters = JSON.parse(filters);
|
|
148
|
-
} catch
|
|
139
|
+
} catch {
|
|
149
140
|
this.filters = {};
|
|
150
141
|
}
|
|
151
142
|
|
|
@@ -161,21 +152,25 @@ class DialogSelectFile extends React.Component<DialogSelectFileProps, DialogSele
|
|
|
161
152
|
}
|
|
162
153
|
selected = selected.filter(id => id);
|
|
163
154
|
|
|
164
|
-
this.state =
|
|
155
|
+
this.state = {
|
|
165
156
|
selected,
|
|
166
157
|
};
|
|
167
158
|
}
|
|
168
159
|
|
|
169
|
-
handleCancel() {
|
|
160
|
+
handleCancel(): void {
|
|
170
161
|
this.props.onClose();
|
|
171
162
|
}
|
|
172
163
|
|
|
173
|
-
handleOk() {
|
|
174
|
-
this.props.onOk(
|
|
164
|
+
handleOk(): void {
|
|
165
|
+
this.props.onOk(
|
|
166
|
+
this.props.multiSelect || !Array.isArray(this.state.selected)
|
|
167
|
+
? this.state.selected
|
|
168
|
+
: this.state.selected[0] || '',
|
|
169
|
+
);
|
|
175
170
|
this.props.onClose();
|
|
176
171
|
}
|
|
177
172
|
|
|
178
|
-
render() {
|
|
173
|
+
render(): JSX.Element {
|
|
179
174
|
let title;
|
|
180
175
|
if (this.state.selected.length) {
|
|
181
176
|
if (!Array.isArray(this.state.selected) || this.state.selected.length === 1) {
|
|
@@ -184,7 +179,10 @@ class DialogSelectFile extends React.Component<DialogSelectFileProps, DialogSele
|
|
|
184
179
|
{I18n.t('ra_Selected')}
|
|
185
180
|
|
|
186
181
|
</span>,
|
|
187
|
-
<span
|
|
182
|
+
<span
|
|
183
|
+
key="id"
|
|
184
|
+
style={styles.headerID}
|
|
185
|
+
>
|
|
188
186
|
{this.state.selected}
|
|
189
187
|
</span>,
|
|
190
188
|
];
|
|
@@ -194,7 +192,10 @@ class DialogSelectFile extends React.Component<DialogSelectFileProps, DialogSele
|
|
|
194
192
|
{I18n.t('ra_Selected')}
|
|
195
193
|
|
|
196
194
|
</span>,
|
|
197
|
-
<span
|
|
195
|
+
<span
|
|
196
|
+
key="id"
|
|
197
|
+
style={styles.headerID}
|
|
198
|
+
>
|
|
198
199
|
{I18n.t('%s items', this.state.selected.length)}
|
|
199
200
|
</span>,
|
|
200
201
|
];
|
|
@@ -203,67 +204,76 @@ class DialogSelectFile extends React.Component<DialogSelectFileProps, DialogSele
|
|
|
203
204
|
title = this.props.title || I18n.t('ra_Please select file...');
|
|
204
205
|
}
|
|
205
206
|
|
|
206
|
-
return
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
imagePrefix={this.props.imagePrefix || this.props.prefix || '../'} // prefix is for back compatibility
|
|
219
|
-
allowUpload={!!this.props.allowUpload}
|
|
220
|
-
allowDownload={this.props.allowDownload !== false}
|
|
221
|
-
allowCreateFolder={!!this.props.allowCreateFolder}
|
|
222
|
-
allowDelete={!!this.props.allowDelete}
|
|
223
|
-
allowView={this.props.allowView !== false}
|
|
224
|
-
showViewTypeButton={this.props.showViewTypeButton !== false}
|
|
225
|
-
showToolbar={this.props.showToolbar !== false}
|
|
226
|
-
limitPath={this.props.limitPath}
|
|
227
|
-
filterFiles={this.props.filterFiles}
|
|
228
|
-
filterByType={this.props.filterByType}
|
|
229
|
-
selected={this.props.selected}
|
|
230
|
-
restrictToFolder={this.props.restrictToFolder}
|
|
231
|
-
allowNonRestricted={this.props.allowNonRestricted}
|
|
232
|
-
onSelect={(selected: string | string[], isDoubleClick?: boolean, isFolder?: boolean) => {
|
|
233
|
-
this.setState({ selected: Array.isArray(selected) ? selected : [selected] }, () =>
|
|
234
|
-
isDoubleClick && (!this.props.selectOnlyFolders || isFolder) && this.handleOk());
|
|
235
|
-
}}
|
|
236
|
-
t={this.props.t || I18n.t}
|
|
237
|
-
lang={this.props.lang || I18n.getLanguage()}
|
|
238
|
-
socket={this.props.socket}
|
|
239
|
-
themeType={this.props.themeType}
|
|
240
|
-
themeName={this.props.themeName}
|
|
241
|
-
theme={this.props.theme}
|
|
242
|
-
showExpertButton={this.props.showExpertButton}
|
|
243
|
-
expertMode={this.props.expertMode}
|
|
244
|
-
showTypeSelector={this.props.showTypeSelector}
|
|
245
|
-
/>
|
|
246
|
-
</DialogContent>
|
|
247
|
-
<DialogActions>
|
|
248
|
-
<Button
|
|
249
|
-
variant="contained"
|
|
250
|
-
onClick={() => this.handleOk()}
|
|
251
|
-
startIcon={<IconOk />}
|
|
252
|
-
disabled={!this.state.selected.length}
|
|
253
|
-
color="primary"
|
|
207
|
+
return (
|
|
208
|
+
<Dialog
|
|
209
|
+
onClose={() => {}}
|
|
210
|
+
maxWidth={false}
|
|
211
|
+
sx={{ '& .MuiDialog-paper': { ...styles.dialog, ...styles.dialogMobile } }}
|
|
212
|
+
fullWidth
|
|
213
|
+
open={!0}
|
|
214
|
+
aria-labelledby="ar_dialog_selectfile_title"
|
|
215
|
+
>
|
|
216
|
+
<DialogTitle
|
|
217
|
+
id="ar_dialog_selectfile_title"
|
|
218
|
+
sx={{ '&.MuiDialogTitle-root': styles.titleRoot }}
|
|
254
219
|
>
|
|
255
|
-
{
|
|
256
|
-
</
|
|
257
|
-
<
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
220
|
+
{title}
|
|
221
|
+
</DialogTitle>
|
|
222
|
+
<DialogContent style={{ ...styles.content, ...styles.contentMobile }}>
|
|
223
|
+
<FileBrowser
|
|
224
|
+
ready
|
|
225
|
+
imagePrefix={this.props.imagePrefix || this.props.prefix || '../'} // prefix is for back compatibility
|
|
226
|
+
allowUpload={!!this.props.allowUpload}
|
|
227
|
+
allowDownload={this.props.allowDownload !== false}
|
|
228
|
+
allowCreateFolder={!!this.props.allowCreateFolder}
|
|
229
|
+
allowDelete={!!this.props.allowDelete}
|
|
230
|
+
allowView={this.props.allowView !== false}
|
|
231
|
+
showViewTypeButton={this.props.showViewTypeButton !== false}
|
|
232
|
+
showToolbar={this.props.showToolbar !== false}
|
|
233
|
+
limitPath={this.props.limitPath}
|
|
234
|
+
filterFiles={this.props.filterFiles}
|
|
235
|
+
filterByType={this.props.filterByType}
|
|
236
|
+
selected={this.props.selected}
|
|
237
|
+
restrictToFolder={this.props.restrictToFolder}
|
|
238
|
+
allowNonRestricted={this.props.allowNonRestricted}
|
|
239
|
+
onSelect={(selected: string | string[], isDoubleClick?: boolean, isFolder?: boolean) => {
|
|
240
|
+
this.setState(
|
|
241
|
+
{ selected: Array.isArray(selected) ? selected : [selected] },
|
|
242
|
+
() => isDoubleClick && (!this.props.selectOnlyFolders || isFolder) && this.handleOk(),
|
|
243
|
+
);
|
|
244
|
+
}}
|
|
245
|
+
t={this.props.t || I18n.t}
|
|
246
|
+
lang={this.props.lang || I18n.getLanguage()}
|
|
247
|
+
socket={this.props.socket}
|
|
248
|
+
themeType={this.props.themeType}
|
|
249
|
+
themeName={this.props.themeName}
|
|
250
|
+
theme={this.props.theme}
|
|
251
|
+
showExpertButton={this.props.showExpertButton}
|
|
252
|
+
expertMode={this.props.expertMode}
|
|
253
|
+
showTypeSelector={this.props.showTypeSelector}
|
|
254
|
+
/>
|
|
255
|
+
</DialogContent>
|
|
256
|
+
<DialogActions>
|
|
257
|
+
<Button
|
|
258
|
+
variant="contained"
|
|
259
|
+
onClick={() => this.handleOk()}
|
|
260
|
+
startIcon={<IconOk />}
|
|
261
|
+
disabled={!this.state.selected.length}
|
|
262
|
+
color="primary"
|
|
263
|
+
>
|
|
264
|
+
{this.props.ok || I18n.t('ra_Ok')}
|
|
265
|
+
</Button>
|
|
266
|
+
<Button
|
|
267
|
+
color="grey"
|
|
268
|
+
variant="contained"
|
|
269
|
+
onClick={() => this.handleCancel()}
|
|
270
|
+
startIcon={<IconCancel />}
|
|
271
|
+
>
|
|
272
|
+
{this.props.cancel || I18n.t('ra_Cancel')}
|
|
273
|
+
</Button>
|
|
274
|
+
</DialogActions>
|
|
275
|
+
</Dialog>
|
|
276
|
+
);
|
|
267
277
|
}
|
|
268
278
|
}
|
|
269
279
|
|
package/src/Dialogs/SelectID.tsx
CHANGED
|
@@ -3,29 +3,20 @@
|
|
|
3
3
|
*
|
|
4
4
|
* MIT License
|
|
5
5
|
*
|
|
6
|
-
|
|
6
|
+
*/
|
|
7
7
|
// please do not delete React, as without it other projects could not be compiled: ReferenceError: React is not defined
|
|
8
|
-
import React, { Component } from 'react';
|
|
8
|
+
import React, { Component, type JSX } from 'react';
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
Button,
|
|
12
|
-
DialogTitle,
|
|
13
|
-
DialogContent,
|
|
14
|
-
DialogActions,
|
|
15
|
-
Dialog,
|
|
16
|
-
} from '@mui/material';
|
|
10
|
+
import { Button, DialogTitle, DialogContent, DialogActions, Dialog } from '@mui/material';
|
|
17
11
|
|
|
18
|
-
import {
|
|
19
|
-
Cancel as IconCancel,
|
|
20
|
-
Check as IconOk,
|
|
21
|
-
} from '@mui/icons-material';
|
|
12
|
+
import { Cancel as IconCancel, Check as IconOk } from '@mui/icons-material';
|
|
22
13
|
|
|
23
14
|
import type Connection from '../Connection';
|
|
24
15
|
|
|
25
16
|
import I18n from '../i18n';
|
|
26
|
-
import ObjectBrowser, { ObjectBrowserFilter } from '../Components/ObjectBrowser';
|
|
27
|
-
import { ObjectBrowserColumn, ObjectBrowserCustomFilter, ObjectBrowserType } from '../Components/types';
|
|
28
|
-
import { IobTheme } from '../types';
|
|
17
|
+
import ObjectBrowser, { type ObjectBrowserFilter } from '../Components/ObjectBrowser';
|
|
18
|
+
import type { ObjectBrowserColumn, ObjectBrowserCustomFilter, ObjectBrowserType } from '../Components/types';
|
|
19
|
+
import type { IobTheme } from '../types';
|
|
29
20
|
|
|
30
21
|
export interface SelectIDFilters {
|
|
31
22
|
id?: string;
|
|
@@ -48,7 +39,7 @@ interface DialogSelectIDProps {
|
|
|
48
39
|
foldersFirst?: boolean;
|
|
49
40
|
/** Path prefix for images (default: '.') */
|
|
50
41
|
imagePrefix?: string;
|
|
51
|
-
/** @deprecated
|
|
42
|
+
/** @deprecated same as imagePrefix */
|
|
52
43
|
prefix?: string;
|
|
53
44
|
/** Show the expert button */
|
|
54
45
|
showExpertButton?: boolean;
|
|
@@ -86,10 +77,12 @@ interface DialogSelectIDProps {
|
|
|
86
77
|
onClose: () => void;
|
|
87
78
|
/** Handler that is called when the user presses OK. */
|
|
88
79
|
onOk: (selected: string | string[] | undefined, name: string) => void;
|
|
89
|
-
/**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Function to filter out all unnecessary objects. Can be string or function.
|
|
82
|
+
* It cannot be used together with "types".
|
|
83
|
+
* Example for function: `obj => obj.common?.type === 'boolean'` to show only boolean states
|
|
84
|
+
* In case of string, it must look like `obj.common && obj.common.type === 'boolean'`
|
|
85
|
+
*/
|
|
93
86
|
filterFunc?: string | ((obj: ioBroker.Object) => boolean);
|
|
94
87
|
/** predefined filter fields, like {"id":"","name":"","room":"","func":"","role":"level","type":"","custom":""} */
|
|
95
88
|
filters?: SelectIDFilters;
|
|
@@ -118,7 +111,7 @@ class DialogSelectID extends Component<DialogSelectIDProps, DialogSelectIDState>
|
|
|
118
111
|
|
|
119
112
|
try {
|
|
120
113
|
this.filters = JSON.parse(filters);
|
|
121
|
-
} catch
|
|
114
|
+
} catch {
|
|
122
115
|
this.filters = {};
|
|
123
116
|
}
|
|
124
117
|
|
|
@@ -135,9 +128,8 @@ class DialogSelectID extends Component<DialogSelectIDProps, DialogSelectIDState>
|
|
|
135
128
|
if (props.filterFunc) {
|
|
136
129
|
if (typeof props.filterFunc === 'string') {
|
|
137
130
|
try {
|
|
138
|
-
// eslint-disable-next-line no-new-func
|
|
139
131
|
this.filterFunc = new Function('obj', props.filterFunc) as (obj: ioBroker.Object) => boolean;
|
|
140
|
-
} catch
|
|
132
|
+
} catch {
|
|
141
133
|
console.error(`Cannot parse filter function: "obj => ${props.filterFunc}"`);
|
|
142
134
|
this.filterFunc = undefined;
|
|
143
135
|
}
|
|
@@ -146,22 +138,22 @@ class DialogSelectID extends Component<DialogSelectIDProps, DialogSelectIDState>
|
|
|
146
138
|
}
|
|
147
139
|
}
|
|
148
140
|
|
|
149
|
-
this.state =
|
|
141
|
+
this.state = {
|
|
150
142
|
selected,
|
|
151
143
|
name: '',
|
|
152
144
|
};
|
|
153
145
|
}
|
|
154
146
|
|
|
155
|
-
handleCancel() {
|
|
147
|
+
handleCancel(): void {
|
|
156
148
|
this.props.onClose();
|
|
157
149
|
}
|
|
158
150
|
|
|
159
|
-
handleOk() {
|
|
151
|
+
handleOk(): void {
|
|
160
152
|
this.props.onOk(this.props.multiSelect ? this.state.selected : this.state.selected[0] || '', this.state.name);
|
|
161
153
|
this.props.onClose();
|
|
162
154
|
}
|
|
163
155
|
|
|
164
|
-
render() {
|
|
156
|
+
render(): JSX.Element {
|
|
165
157
|
let title;
|
|
166
158
|
if (this.state.name || this.state.selected.length) {
|
|
167
159
|
if (this.state.selected.length === 1) {
|
|
@@ -170,8 +162,12 @@ class DialogSelectID extends Component<DialogSelectIDProps, DialogSelectIDState>
|
|
|
170
162
|
{I18n.t('ra_Selected')}
|
|
171
163
|
|
|
172
164
|
</span>,
|
|
173
|
-
<span
|
|
174
|
-
|
|
165
|
+
<span
|
|
166
|
+
key="id"
|
|
167
|
+
style={{ fontWeight: 'bold', fontStyle: 'italic' }}
|
|
168
|
+
>
|
|
169
|
+
{(this.state.name || this.state.selected[0]) +
|
|
170
|
+
(this.state.name ? ` [${this.state.selected[0]}]` : '')}
|
|
175
171
|
</span>,
|
|
176
172
|
];
|
|
177
173
|
} else {
|
|
@@ -180,7 +176,10 @@ class DialogSelectID extends Component<DialogSelectIDProps, DialogSelectIDState>
|
|
|
180
176
|
{I18n.t('ra_Selected')}
|
|
181
177
|
|
|
182
178
|
</span>,
|
|
183
|
-
<span
|
|
179
|
+
<span
|
|
180
|
+
key="id"
|
|
181
|
+
style={{ fontWeight: 'bold', fontStyle: 'italic' }}
|
|
182
|
+
>
|
|
184
183
|
{I18n.t('%s items', this.state.selected.length.toString())}
|
|
185
184
|
</span>,
|
|
186
185
|
];
|
|
@@ -189,109 +188,122 @@ class DialogSelectID extends Component<DialogSelectIDProps, DialogSelectIDState>
|
|
|
189
188
|
title = this.props.title || I18n.t('ra_Please select object ID...');
|
|
190
189
|
}
|
|
191
190
|
|
|
192
|
-
return
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
fullWidth
|
|
205
|
-
open={!0}
|
|
206
|
-
aria-labelledby="ar_dialog_selectid_title"
|
|
207
|
-
>
|
|
208
|
-
<DialogTitle
|
|
209
|
-
id="ar_dialog_selectid_title"
|
|
210
|
-
style={{
|
|
211
|
-
whiteSpace: 'nowrap',
|
|
212
|
-
width: 'calc(100% - 72px)',
|
|
213
|
-
overflow: 'hidden',
|
|
214
|
-
display: 'inline-block',
|
|
215
|
-
textOverflow: 'ellipsis',
|
|
191
|
+
return (
|
|
192
|
+
<Dialog
|
|
193
|
+
onClose={() => {}}
|
|
194
|
+
maxWidth={false}
|
|
195
|
+
sx={{
|
|
196
|
+
'& .MuiDialog-paper': {
|
|
197
|
+
height: '95%',
|
|
198
|
+
p: '4px',
|
|
199
|
+
width: '100%',
|
|
200
|
+
maxWidth: '100%',
|
|
201
|
+
maxHeight: 'calc(100% - 16px)',
|
|
202
|
+
},
|
|
216
203
|
}}
|
|
204
|
+
fullWidth
|
|
205
|
+
open={!0}
|
|
206
|
+
aria-labelledby="ar_dialog_selectid_title"
|
|
217
207
|
>
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
>
|
|
227
|
-
<ObjectBrowser
|
|
228
|
-
foldersFirst={this.props.foldersFirst}
|
|
229
|
-
imagePrefix={this.props.imagePrefix || this.props.prefix} // prefix is for back compatibility
|
|
230
|
-
dateFormat={this.props.dateFormat}
|
|
231
|
-
defaultFilters={this.filters}
|
|
232
|
-
dialogName={this.dialogName}
|
|
233
|
-
isFloatComma={this.props.isFloatComma}
|
|
234
|
-
showExpertButton={this.props.showExpertButton !== undefined ? this.props.showExpertButton : true}
|
|
235
|
-
expertMode={this.props.expertMode}
|
|
236
|
-
// style={{ width: '100%', height: '100%' }}
|
|
237
|
-
columns={this.props.columns || ['name', 'type', 'role', 'room', 'func', 'val']}
|
|
238
|
-
types={this.props.types ? (Array.isArray(this.props.types) ? this.props.types : [this.props.types]) : ['state']}
|
|
239
|
-
root={this.props.root}
|
|
240
|
-
t={I18n.t}
|
|
241
|
-
lang={this.props.lang || I18n.getLanguage()}
|
|
242
|
-
socket={this.props.socket}
|
|
243
|
-
selected={this.state.selected}
|
|
244
|
-
multiSelect={this.props.multiSelect}
|
|
245
|
-
notEditable={this.props.notEditable === undefined ? true : this.props.notEditable}
|
|
246
|
-
// name={this.state.name}
|
|
247
|
-
themeName={this.props.themeName}
|
|
248
|
-
themeType={this.props.themeType}
|
|
249
|
-
theme={this.props.theme}
|
|
250
|
-
customFilter={this.props.customFilter}
|
|
251
|
-
onFilterChanged={(filterConfig: ObjectBrowserFilter) => {
|
|
252
|
-
this.filters = filterConfig;
|
|
253
|
-
((window as any)._localStorage || window.localStorage).setItem(this.dialogName, JSON.stringify(filterConfig));
|
|
254
|
-
}}
|
|
255
|
-
onSelect={(_selected: string | string[], name: string, isDouble?: boolean) => {
|
|
256
|
-
let selected: string[];
|
|
257
|
-
if (!Array.isArray(_selected)) {
|
|
258
|
-
selected = [_selected];
|
|
259
|
-
} else {
|
|
260
|
-
selected = _selected;
|
|
261
|
-
}
|
|
262
|
-
if (JSON.stringify(selected) !== JSON.stringify(this.state.selected)) {
|
|
263
|
-
this.setState({ selected, name }, () => isDouble && this.handleOk());
|
|
264
|
-
} else if (isDouble) {
|
|
265
|
-
this.handleOk();
|
|
266
|
-
}
|
|
208
|
+
<DialogTitle
|
|
209
|
+
id="ar_dialog_selectid_title"
|
|
210
|
+
style={{
|
|
211
|
+
whiteSpace: 'nowrap',
|
|
212
|
+
width: 'calc(100% - 72px)',
|
|
213
|
+
overflow: 'hidden',
|
|
214
|
+
display: 'inline-block',
|
|
215
|
+
textOverflow: 'ellipsis',
|
|
267
216
|
}}
|
|
268
|
-
filterFunc={this.filterFunc}
|
|
269
|
-
title=""
|
|
270
|
-
classes={{ }}
|
|
271
|
-
/>
|
|
272
|
-
</DialogContent>
|
|
273
|
-
<DialogActions>
|
|
274
|
-
<Button
|
|
275
|
-
id={`ar_dialog_selectid_ok_${this.props.dialogName || ''}`}
|
|
276
|
-
variant="contained"
|
|
277
|
-
onClick={() => this.handleOk()}
|
|
278
|
-
startIcon={<IconOk />}
|
|
279
|
-
disabled={!this.state.selected.length}
|
|
280
|
-
color="primary"
|
|
281
217
|
>
|
|
282
|
-
{
|
|
283
|
-
</
|
|
284
|
-
<
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
218
|
+
{title}
|
|
219
|
+
</DialogTitle>
|
|
220
|
+
<DialogContent
|
|
221
|
+
style={{
|
|
222
|
+
height: '100%',
|
|
223
|
+
overflow: 'hidden',
|
|
224
|
+
padding: '8px 4px',
|
|
225
|
+
}}
|
|
290
226
|
>
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
227
|
+
<ObjectBrowser
|
|
228
|
+
foldersFirst={this.props.foldersFirst}
|
|
229
|
+
imagePrefix={this.props.imagePrefix || this.props.prefix} // prefix is for back compatibility
|
|
230
|
+
dateFormat={this.props.dateFormat}
|
|
231
|
+
defaultFilters={this.filters}
|
|
232
|
+
dialogName={this.dialogName}
|
|
233
|
+
isFloatComma={this.props.isFloatComma}
|
|
234
|
+
showExpertButton={
|
|
235
|
+
this.props.showExpertButton !== undefined ? this.props.showExpertButton : true
|
|
236
|
+
}
|
|
237
|
+
expertMode={this.props.expertMode}
|
|
238
|
+
// style={{ width: '100%', height: '100%' }}
|
|
239
|
+
columns={this.props.columns || ['name', 'type', 'role', 'room', 'func', 'val']}
|
|
240
|
+
types={
|
|
241
|
+
this.props.types
|
|
242
|
+
? Array.isArray(this.props.types)
|
|
243
|
+
? this.props.types
|
|
244
|
+
: [this.props.types]
|
|
245
|
+
: ['state']
|
|
246
|
+
}
|
|
247
|
+
root={this.props.root}
|
|
248
|
+
t={I18n.t}
|
|
249
|
+
lang={this.props.lang || I18n.getLanguage()}
|
|
250
|
+
socket={this.props.socket}
|
|
251
|
+
selected={this.state.selected}
|
|
252
|
+
multiSelect={this.props.multiSelect}
|
|
253
|
+
notEditable={this.props.notEditable === undefined ? true : this.props.notEditable}
|
|
254
|
+
// name={this.state.name}
|
|
255
|
+
themeName={this.props.themeName}
|
|
256
|
+
themeType={this.props.themeType}
|
|
257
|
+
theme={this.props.theme}
|
|
258
|
+
customFilter={this.props.customFilter}
|
|
259
|
+
onFilterChanged={(filterConfig: ObjectBrowserFilter) => {
|
|
260
|
+
this.filters = filterConfig;
|
|
261
|
+
((window as any)._localStorage || window.localStorage).setItem(
|
|
262
|
+
this.dialogName,
|
|
263
|
+
JSON.stringify(filterConfig),
|
|
264
|
+
);
|
|
265
|
+
}}
|
|
266
|
+
onSelect={(_selected: string | string[], name: string, isDouble?: boolean) => {
|
|
267
|
+
let selected: string[];
|
|
268
|
+
if (!Array.isArray(_selected)) {
|
|
269
|
+
selected = [_selected];
|
|
270
|
+
} else {
|
|
271
|
+
selected = _selected;
|
|
272
|
+
}
|
|
273
|
+
if (JSON.stringify(selected) !== JSON.stringify(this.state.selected)) {
|
|
274
|
+
this.setState({ selected, name }, () => isDouble && this.handleOk());
|
|
275
|
+
} else if (isDouble) {
|
|
276
|
+
this.handleOk();
|
|
277
|
+
}
|
|
278
|
+
}}
|
|
279
|
+
filterFunc={this.filterFunc}
|
|
280
|
+
title=""
|
|
281
|
+
classes={{}}
|
|
282
|
+
/>
|
|
283
|
+
</DialogContent>
|
|
284
|
+
<DialogActions>
|
|
285
|
+
<Button
|
|
286
|
+
id={`ar_dialog_selectid_ok_${this.props.dialogName || ''}`}
|
|
287
|
+
variant="contained"
|
|
288
|
+
onClick={() => this.handleOk()}
|
|
289
|
+
startIcon={<IconOk />}
|
|
290
|
+
disabled={!this.state.selected.length}
|
|
291
|
+
color="primary"
|
|
292
|
+
>
|
|
293
|
+
{this.props.ok || I18n.t('ra_Ok')}
|
|
294
|
+
</Button>
|
|
295
|
+
<Button
|
|
296
|
+
id={`ar_dialog_selectid_cancel_${this.props.dialogName || ''}`}
|
|
297
|
+
color="grey"
|
|
298
|
+
variant="contained"
|
|
299
|
+
onClick={() => this.handleCancel()}
|
|
300
|
+
startIcon={<IconCancel />}
|
|
301
|
+
>
|
|
302
|
+
{this.props.cancel || I18n.t('ra_Cancel')}
|
|
303
|
+
</Button>
|
|
304
|
+
</DialogActions>
|
|
305
|
+
</Dialog>
|
|
306
|
+
);
|
|
295
307
|
}
|
|
296
308
|
}
|
|
297
309
|
|