@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.
Files changed (307) hide show
  1. package/Components/404.d.ts +3 -2
  2. package/Components/404.js +3 -2
  3. package/Components/ColorPicker.d.ts +22 -8
  4. package/Components/ColorPicker.js +34 -17
  5. package/Components/ComplexCron.js +24 -24
  6. package/Components/CopyToClipboard.d.ts +10 -1
  7. package/Components/CopyToClipboard.js +17 -8
  8. package/Components/CustomModal.d.ts +1 -1
  9. package/Components/CustomModal.js +8 -8
  10. package/Components/FileBrowser.d.ts +11 -11
  11. package/Components/FileBrowser.js +135 -152
  12. package/Components/FileViewer.js +34 -23
  13. package/Components/Icon.d.ts +16 -2
  14. package/Components/Icon.js +19 -8
  15. package/Components/IconPicker.js +10 -14
  16. package/Components/IconSelector.d.ts +1 -1
  17. package/Components/IconSelector.js +64 -74
  18. package/Components/Image.d.ts +8 -4
  19. package/Components/Image.js +13 -32
  20. package/Components/Loader.d.ts +2 -2
  21. package/Components/Loader.js +21 -18
  22. package/Components/Loaders/MV.d.ts +6 -1
  23. package/Components/Loaders/MV.js +23 -7
  24. package/Components/Loaders/PT.d.ts +7 -2
  25. package/Components/Loaders/PT.js +20 -7
  26. package/Components/Loaders/Vendor.d.ts +2 -2
  27. package/Components/Loaders/Vendor.js +15 -7
  28. package/Components/Logo.js +16 -18
  29. package/Components/MDUtils.d.ts +1 -1
  30. package/Components/MDUtils.js +8 -4
  31. package/Components/ObjectBrowser.d.ts +40 -39
  32. package/Components/ObjectBrowser.js +550 -435
  33. package/Components/Router.d.ts +1 -3
  34. package/Components/Router.js +3 -1
  35. package/Components/SaveCloseButtons.d.ts +3 -3
  36. package/Components/SaveCloseButtons.js +3 -3
  37. package/Components/Schedule.d.ts +15 -15
  38. package/Components/Schedule.js +177 -154
  39. package/Components/SelectWithIcon.d.ts +2 -2
  40. package/Components/SelectWithIcon.js +45 -34
  41. package/Components/SimpleCron/index.js +83 -43
  42. package/Components/TabContainer.js +2 -2
  43. package/Components/TabContent.js +1 -1
  44. package/Components/TabHeader.js +1 -1
  45. package/Components/TableResize.d.ts +2 -2
  46. package/Components/TableResize.js +5 -5
  47. package/Components/TextWithIcon.d.ts +1 -1
  48. package/Components/TextWithIcon.js +10 -8
  49. package/Components/ToggleThemeMenu.d.ts +2 -2
  50. package/Components/ToggleThemeMenu.js +3 -3
  51. package/Components/TreeTable.d.ts +18 -18
  52. package/Components/TreeTable.js +76 -72
  53. package/Components/UploadImage.d.ts +2 -2
  54. package/Components/UploadImage.js +25 -21
  55. package/Components/Utils.d.ts +42 -22
  56. package/Components/Utils.js +66 -65
  57. package/Components/withWidth.d.ts +2 -2
  58. package/Components/withWidth.js +10 -6
  59. package/Dialogs/ComplexCron.d.ts +2 -2
  60. package/Dialogs/ComplexCron.js +3 -3
  61. package/Dialogs/Confirm.d.ts +4 -4
  62. package/Dialogs/Confirm.js +18 -8
  63. package/Dialogs/Cron.d.ts +3 -3
  64. package/Dialogs/Cron.js +21 -17
  65. package/Dialogs/Error.d.ts +3 -3
  66. package/Dialogs/Error.js +6 -4
  67. package/Dialogs/Message.d.ts +3 -3
  68. package/Dialogs/Message.js +6 -4
  69. package/Dialogs/SelectFile.d.ts +4 -4
  70. package/Dialogs/SelectFile.js +6 -4
  71. package/Dialogs/SelectID.d.ts +12 -10
  72. package/Dialogs/SelectID.js +12 -8
  73. package/Dialogs/SimpleCron.d.ts +2 -2
  74. package/Dialogs/SimpleCron.js +2 -2
  75. package/Dialogs/TextInput.d.ts +2 -2
  76. package/Dialogs/TextInput.js +3 -3
  77. package/GenericApp.d.ts +19 -13
  78. package/GenericApp.js +128 -85
  79. package/LegacyConnection.d.ts +240 -248
  80. package/LegacyConnection.js +500 -525
  81. package/README.md +1234 -1170
  82. package/Theme.d.ts +1 -1
  83. package/Theme.js +9 -12
  84. package/assets/devices.json +1 -0
  85. package/assets/rooms.json +1 -0
  86. package/craco-module-federation.js +3 -12
  87. package/i18n/de.json +434 -434
  88. package/i18n/en.json +434 -434
  89. package/i18n/es.json +434 -434
  90. package/i18n/fr.json +434 -434
  91. package/i18n/it.json +434 -434
  92. package/i18n/nl.json +434 -434
  93. package/i18n/pl.json +434 -434
  94. package/i18n/pt.json +434 -434
  95. package/i18n/ru.json +434 -434
  96. package/i18n/uk.json +434 -434
  97. package/i18n/zh-cn.json +434 -434
  98. package/i18n.d.ts +26 -19
  99. package/i18n.js +28 -22
  100. package/icons/IconAdapter.js +2 -2
  101. package/icons/IconAlias.js +2 -2
  102. package/icons/IconChannel.js +2 -2
  103. package/icons/IconClearFilter.js +2 -2
  104. package/icons/IconClosed.js +2 -2
  105. package/icons/IconCopy.js +2 -2
  106. package/icons/IconDevice.js +2 -2
  107. package/icons/IconDocument.js +2 -2
  108. package/icons/IconDocumentReadOnly.js +2 -2
  109. package/icons/IconExpert.js +2 -2
  110. package/icons/IconFx.js +2 -2
  111. package/icons/IconInstance.js +2 -2
  112. package/icons/IconLogout.js +2 -2
  113. package/icons/IconNoIcon.js +2 -2
  114. package/icons/IconOpen.d.ts +2 -2
  115. package/icons/IconOpen.js +2 -2
  116. package/icons/IconProps.d.ts +4 -3
  117. package/icons/IconState.d.ts +2 -2
  118. package/icons/IconState.js +2 -2
  119. package/index.css +3 -2
  120. package/package.json +1 -1
  121. package/src/Components/404.tsx +32 -31
  122. package/src/Components/ColorPicker.tsx +142 -114
  123. package/src/Components/ComplexCron.tsx +174 -137
  124. package/src/Components/CopyToClipboard.tsx +22 -9
  125. package/src/Components/CustomModal.tsx +76 -69
  126. package/src/Components/FileBrowser.tsx +959 -852
  127. package/src/Components/FileViewer.tsx +146 -127
  128. package/src/Components/Icon.tsx +80 -52
  129. package/src/Components/IconPicker.tsx +83 -67
  130. package/src/Components/IconSelector.tsx +159 -141
  131. package/src/Components/Image.tsx +43 -26
  132. package/src/Components/Loader.tsx +56 -32
  133. package/src/Components/Logo.tsx +62 -52
  134. package/src/Components/MDUtils.tsx +10 -6
  135. package/src/Components/ObjectBrowser.tsx +3198 -2478
  136. package/src/Components/Router.tsx +11 -11
  137. package/src/Components/SaveCloseButtons.tsx +43 -39
  138. package/src/Components/Schedule.tsx +1091 -853
  139. package/src/Components/SelectWithIcon.tsx +135 -93
  140. package/src/Components/TabContainer.tsx +21 -19
  141. package/src/Components/TabContent.tsx +13 -12
  142. package/src/Components/TabHeader.tsx +10 -9
  143. package/src/Components/TableResize.tsx +52 -37
  144. package/src/Components/TextWithIcon.tsx +30 -19
  145. package/src/Components/ToggleThemeMenu.tsx +31 -13
  146. package/src/Components/TreeTable.tsx +468 -385
  147. package/src/Components/UploadImage.tsx +153 -121
  148. package/src/Components/Utils.tsx +135 -127
  149. package/src/Components/loader.css +40 -31
  150. package/src/Components/withWidth.tsx +23 -12
  151. package/src/Connection.tsx +1 -3
  152. package/src/Dialogs/ComplexCron.tsx +55 -61
  153. package/src/Dialogs/Confirm.tsx +88 -65
  154. package/src/Dialogs/Cron.tsx +122 -112
  155. package/src/Dialogs/Error.tsx +37 -42
  156. package/src/Dialogs/Message.tsx +39 -37
  157. package/src/Dialogs/SelectFile.tsx +95 -85
  158. package/src/Dialogs/SelectID.tsx +141 -129
  159. package/src/Dialogs/SimpleCron.tsx +44 -44
  160. package/src/Dialogs/TextInput.tsx +60 -68
  161. package/src/GenericApp.tsx +342 -242
  162. package/src/LegacyConnection.tsx +972 -842
  163. package/src/Prompt.tsx +3 -1
  164. package/src/Theme.tsx +19 -26
  165. package/src/icons/IconAdapter.tsx +16 -14
  166. package/src/icons/IconAlias.tsx +16 -14
  167. package/src/icons/IconChannel.tsx +55 -16
  168. package/src/icons/IconClearFilter.tsx +17 -15
  169. package/src/icons/IconClosed.tsx +16 -11
  170. package/src/icons/IconCopy.tsx +16 -11
  171. package/src/icons/IconDevice.tsx +121 -22
  172. package/src/icons/IconDocument.tsx +16 -11
  173. package/src/icons/IconDocumentReadOnly.tsx +21 -12
  174. package/src/icons/IconExpert.tsx +20 -12
  175. package/src/icons/IconFx.tsx +16 -14
  176. package/src/icons/IconInstance.tsx +16 -14
  177. package/src/icons/IconLogout.tsx +20 -18
  178. package/src/icons/IconNoIcon.tsx +16 -14
  179. package/src/icons/IconOpen.tsx +17 -12
  180. package/src/icons/IconProps.tsx +4 -3
  181. package/src/icons/IconState.tsx +34 -13
  182. package/src/index.css +3 -2
  183. package/tasks.js +91 -0
  184. package/types.d.ts +141 -0
  185. package/Components/Loaders/PT.css +0 -109
  186. package/Components/Loaders/Vendor.css +0 -13
  187. package/Components/loader.css +0 -222
  188. package/Components/types.d.ts +0 -82
  189. package/assets/devices/Alarm Systems.svg +0 -19
  190. package/assets/devices/Amplifier.svg +0 -22
  191. package/assets/devices/Awnings.svg +0 -5
  192. package/assets/devices/Battery Status.svg +0 -5
  193. package/assets/devices/Ceiling Spotlights.svg +0 -16
  194. package/assets/devices/Chandelier.svg +0 -7
  195. package/assets/devices/Climate.svg +0 -12
  196. package/assets/devices/Coffee Makers.svg +0 -6
  197. package/assets/devices/Cold Water.svg +0 -31
  198. package/assets/devices/Computer.svg +0 -21
  199. package/assets/devices/Consumption.svg +0 -8
  200. package/assets/devices/Curtains.svg +0 -43
  201. package/assets/devices/Dishwashers.svg +0 -12
  202. package/assets/devices/Doors.svg +0 -6
  203. package/assets/devices/Doorstep.svg +0 -35
  204. package/assets/devices/Dryer.svg +0 -14
  205. package/assets/devices/Fan.svg +0 -20
  206. package/assets/devices/Floor Lamps.svg +0 -5
  207. package/assets/devices/Garage Doors.svg +0 -9
  208. package/assets/devices/Gates.svg +0 -32
  209. package/assets/devices/Hairdryer.svg +0 -23
  210. package/assets/devices/Handle.svg +0 -6
  211. package/assets/devices/Hanging Lamps.svg +0 -9
  212. package/assets/devices/Heater.svg +0 -44
  213. package/assets/devices/Hoods.svg +0 -12
  214. package/assets/devices/Hot Water.svg +0 -10
  215. package/assets/devices/Humidity.svg +0 -41
  216. package/assets/devices/Iron.svg +0 -5
  217. package/assets/devices/Irrigation.svg +0 -23
  218. package/assets/devices/Led Strip.svg +0 -31
  219. package/assets/devices/Light.svg +0 -30
  220. package/assets/devices/Lightings.svg +0 -46
  221. package/assets/devices/Lock.svg +0 -19
  222. package/assets/devices/Louvre.svg +0 -7
  223. package/assets/devices/Mowing Machine.svg +0 -9
  224. package/assets/devices/Music.svg +0 -13
  225. package/assets/devices/Outdoor Blinds.svg +0 -7
  226. package/assets/devices/People.svg +0 -19
  227. package/assets/devices/Pool.svg +0 -8
  228. package/assets/devices/Power Consumption.svg +0 -13
  229. package/assets/devices/Printer.svg +0 -10
  230. package/assets/devices/Pump.svg +0 -10
  231. package/assets/devices/Receiver.svg +0 -19
  232. package/assets/devices/Sconces.svg +0 -10
  233. package/assets/devices/Security.svg +0 -34
  234. package/assets/devices/Shading.svg +0 -5
  235. package/assets/devices/Shutters.svg +0 -11
  236. package/assets/devices/SmokeDetector.svg +0 -13
  237. package/assets/devices/Sockets.svg +0 -13
  238. package/assets/devices/Speaker.svg +0 -35
  239. package/assets/devices/Stove.svg +0 -12
  240. package/assets/devices/Table Lamps.svg +0 -12
  241. package/assets/devices/Temperature Sensors.svg +0 -28
  242. package/assets/devices/Tv.svg +0 -8
  243. package/assets/devices/Vacuum Cleaner.svg +0 -16
  244. package/assets/devices/Ventilation.svg +0 -12
  245. package/assets/devices/Washing Machines.svg +0 -16
  246. package/assets/devices/Water Consumption.svg +0 -6
  247. package/assets/devices/Water Heater.svg +0 -8
  248. package/assets/devices/Water.svg +0 -40
  249. package/assets/devices/Weather.svg +0 -28
  250. package/assets/devices/Window.svg +0 -8
  251. package/assets/rooms/Anteroom.svg +0 -53
  252. package/assets/rooms/Attic.svg +0 -21
  253. package/assets/rooms/Balcony.svg +0 -13
  254. package/assets/rooms/Barn.svg +0 -6
  255. package/assets/rooms/Basement.svg +0 -5
  256. package/assets/rooms/Bathroom.svg +0 -38
  257. package/assets/rooms/Bedroom.svg +0 -5
  258. package/assets/rooms/Boiler Room.svg +0 -13
  259. package/assets/rooms/Carport.svg +0 -17
  260. package/assets/rooms/Cellar.svg +0 -89
  261. package/assets/rooms/Chamber.svg +0 -9
  262. package/assets/rooms/Corridor.svg +0 -53
  263. package/assets/rooms/Dining Area.svg +0 -37
  264. package/assets/rooms/Dining Room.svg +0 -37
  265. package/assets/rooms/Dining.svg +0 -37
  266. package/assets/rooms/Dressing Room.svg +0 -5
  267. package/assets/rooms/Driveway.svg +0 -15
  268. package/assets/rooms/Entrance.svg +0 -44
  269. package/assets/rooms/Equipment Room.svg +0 -15
  270. package/assets/rooms/Front Yard.svg +0 -64
  271. package/assets/rooms/Gallery.svg +0 -14
  272. package/assets/rooms/Garage.svg +0 -20
  273. package/assets/rooms/Garden.svg +0 -13
  274. package/assets/rooms/Ground Floor.svg +0 -95
  275. package/assets/rooms/Guest Bathroom.svg +0 -33
  276. package/assets/rooms/Guest Room.svg +0 -5
  277. package/assets/rooms/Gym.svg +0 -5
  278. package/assets/rooms/Hall.svg +0 -19
  279. package/assets/rooms/Home Theater.svg +0 -8
  280. package/assets/rooms/Kitchen.svg +0 -18
  281. package/assets/rooms/Laundry Room.svg +0 -12
  282. package/assets/rooms/Living Area.svg +0 -11
  283. package/assets/rooms/Living Room.svg +0 -10
  284. package/assets/rooms/Locker Room.svg +0 -17
  285. package/assets/rooms/Nursery.svg +0 -5
  286. package/assets/rooms/Office.svg +0 -8
  287. package/assets/rooms/Outdoors.svg +0 -7
  288. package/assets/rooms/Playroom.svg +0 -6
  289. package/assets/rooms/Pool.svg +0 -8
  290. package/assets/rooms/Rear Wall.svg +0 -30
  291. package/assets/rooms/Second Floor.svg +0 -95
  292. package/assets/rooms/Shed.svg +0 -16
  293. package/assets/rooms/Sleeping Area.svg +0 -22
  294. package/assets/rooms/Stairway.svg +0 -5
  295. package/assets/rooms/Stairwell.svg +0 -15
  296. package/assets/rooms/Storeroom.svg +0 -5
  297. package/assets/rooms/Summer House.svg +0 -27
  298. package/assets/rooms/Swimming Pool.svg +0 -21
  299. package/assets/rooms/Terrace.svg +0 -7
  300. package/assets/rooms/Toilet.svg +0 -10
  301. package/assets/rooms/Upstairs.svg +0 -6
  302. package/assets/rooms/Wardrobe.svg +0 -60
  303. package/assets/rooms/Washroom.svg +0 -20
  304. package/assets/rooms/Wc.svg +0 -10
  305. package/assets/rooms/Windscreen.svg +0 -60
  306. package/assets/rooms/Workshop.svg +0 -23
  307. 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
- /** @deprectaed Image prefix */
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
- /** If type selector should be shown */
109
+ /** If type selector should be shown */
119
110
  showTypeSelector?: boolean;
120
- /** If defined, allow selecting only files from this folder */
111
+ /** If defined, allow selecting only files from this folder */
121
112
  restrictToFolder?: string;
122
- /** If restrictToFolder defined, allow selecting files outside of this folder */
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 (e) {
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(this.props.multiSelect || !Array.isArray(this.state.selected) ? this.state.selected : this.state.selected[0] || '');
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
  &nbsp;
186
181
  </span>,
187
- <span key="id" style={styles.headerID}>
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
  &nbsp;
196
194
  </span>,
197
- <span key="id" style={styles.headerID}>
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 <Dialog
207
- onClose={() => {}}
208
- maxWidth={false}
209
- sx={{ '& .MuiDialog-paper': { ...styles.dialog, ...styles.dialogMobile } }}
210
- fullWidth
211
- open={!0}
212
- aria-labelledby="ar_dialog_selectfile_title"
213
- >
214
- <DialogTitle id="ar_dialog_selectfile_title" sx={{ '&.MuiDialogTitle-root': styles.titleRoot }}>{title}</DialogTitle>
215
- <DialogContent style={{ ...styles.content, ...styles.contentMobile }}>
216
- <FileBrowser
217
- ready
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
- {this.props.ok || I18n.t('ra_Ok')}
256
- </Button>
257
- <Button
258
- color="grey"
259
- variant="contained"
260
- onClick={() => this.handleCancel()}
261
- startIcon={<IconCancel />}
262
- >
263
- {this.props.cancel || I18n.t('ra_Cancel')}
264
- </Button>
265
- </DialogActions>
266
- </Dialog>;
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
 
@@ -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: same as imagePrefix */
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
- /** Function to filter out all unnecessary objects. Can be string or function.
90
- It cannot be used together with "types".
91
- Example for function: `obj => obj.common?.type === 'boolean'` to show only boolean states
92
- In case of string, it must look like `obj.common && obj.common.type === 'boolean'` */
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 (e) {
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 (e) {
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
  &nbsp;
172
164
  </span>,
173
- <span key="id" style={{ fontWeight: 'bold', fontStyle: 'italic' }}>
174
- {(this.state.name || this.state.selected) + (this.state.name ? ` [${this.state.selected}]` : '')}
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
  &nbsp;
182
178
  </span>,
183
- <span key="id" style={{ fontWeight: 'bold', fontStyle: 'italic' }}>
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 <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
- },
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
- {title}
219
- </DialogTitle>
220
- <DialogContent
221
- style={{
222
- height: '100%',
223
- overflow: 'hidden',
224
- padding: '8px 4px',
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
- {this.props.ok || I18n.t('ra_Ok')}
283
- </Button>
284
- <Button
285
- id={`ar_dialog_selectid_cancel_${this.props.dialogName || ''}`}
286
- color="grey"
287
- variant="contained"
288
- onClick={() => this.handleCancel()}
289
- startIcon={<IconCancel />}
218
+ {title}
219
+ </DialogTitle>
220
+ <DialogContent
221
+ style={{
222
+ height: '100%',
223
+ overflow: 'hidden',
224
+ padding: '8px 4px',
225
+ }}
290
226
  >
291
- {this.props.cancel || I18n.t('ra_Cancel')}
292
- </Button>
293
- </DialogActions>
294
- </Dialog>;
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