@iobroker/adapter-react-v5 7.0.2 → 7.1.1

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 +1264 -1171
  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 +4 -4
  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 +22 -20
  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
@@ -1,11 +1,7 @@
1
1
  import React, { useCallback } from 'react';
2
2
  import { useDropzone } from 'react-dropzone';
3
3
 
4
- import {
5
- InputLabel,
6
- FormControl,
7
- IconButton,
8
- } from '@mui/material';
4
+ import { InputLabel, FormControl, IconButton } from '@mui/material';
9
5
  import { Clear as ClearIcon } from '@mui/icons-material';
10
6
 
11
7
  import IconSelector from './IconSelector';
@@ -14,12 +10,12 @@ import I18n from '../i18n';
14
10
  import Utils from './Utils';
15
11
 
16
12
  const styles: Record<string, React.CSSProperties> = {
17
- formContainer : {
13
+ formContainer: {
18
14
  display: 'flex',
19
15
  justifyContent: 'left',
20
16
  alignItems: 'center',
21
17
  },
22
- formControl : {
18
+ formControl: {
23
19
  display: 'flex',
24
20
  padding: 24,
25
21
  flexGrow: 1000,
@@ -40,7 +36,7 @@ const styles: Record<string, React.CSSProperties> = {
40
36
  borderRadius: 10,
41
37
  padding: 4,
42
38
  },
43
- formIcon : {
39
+ formIcon: {
44
40
  margin: 10,
45
41
  opacity: 0.6,
46
42
  },
@@ -76,74 +72,94 @@ interface IconPickerProps {
76
72
  onlyDevices?: boolean;
77
73
  }
78
74
 
79
- const IconPicker = (props: IconPickerProps) => {
75
+ const IconPicker = (props: IconPickerProps): React.JSX.Element => {
80
76
  const IconCustom = props.icon;
81
77
 
82
- const onDrop = useCallback((acceptedFiles: File[]) => {
83
- const reader = new FileReader();
78
+ const onChange = props.onChange;
84
79
 
85
- reader.addEventListener('load', () =>
86
- props.onChange(reader.result as string), false);
80
+ const onDrop = useCallback(
81
+ (acceptedFiles: File[]) => {
82
+ const reader = new FileReader();
87
83
 
88
- if (acceptedFiles[0]) {
89
- reader.readAsDataURL(acceptedFiles[0]);
90
- }
91
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
84
+ reader.addEventListener('load', () => onChange(reader.result as string), false);
85
+
86
+ if (acceptedFiles[0]) {
87
+ reader.readAsDataURL(acceptedFiles[0]);
88
+ }
89
+ },
90
+ [onChange],
91
+ );
92
92
 
93
93
  const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });
94
94
 
95
- return <div style={styles.formContainer}>
96
- {IconCustom ? <IconCustom style={styles.formIcon} /> : null}
97
- <FormControl variant="standard" style={{ ...styles.formControl, padding: 3 }}>
98
- <InputLabel
99
- shrink
100
- sx={props.customStyles?.label ? { '&.MuiInputLabel-root': props.customStyles.label } : undefined}
101
- classes={{ root: props.customClasses?.label }}
95
+ return (
96
+ <div style={styles.formContainer}>
97
+ {IconCustom ? <IconCustom style={styles.formIcon} /> : null}
98
+ <FormControl
99
+ variant="standard"
100
+ style={{ ...styles.formControl, padding: 3 }}
102
101
  >
103
- {props.label}
104
- </InputLabel>
105
- <div style={styles.formContainer}>
106
- {props.value ?
107
- <div style={styles.divContainer}>
108
- <Icon
109
- style={{ ...props.previewStyle, ...(props.customStyles?.icon || undefined) }}
110
- src={props.value}
111
- className={Utils.clsx(props.previewClassName, props.customClasses?.icon)}
112
- />
113
- {!props.disabled && <IconButton
114
- style={{ verticalAlign: 'top' }}
115
- title={I18n.t('ra_Clear icon')}
116
- size="small"
117
- onClick={() => props.onChange('')}
118
- >
119
- <ClearIcon />
120
- </IconButton>}
121
- </div>
122
- :
123
- (!props.disabled && <IconSelector
124
- icons={props.icons}
125
- onlyRooms={props.onlyRooms}
126
- onlyDevices={props.onlyDevices}
127
- onSelect={(base64: string) => props.onChange(base64)}
128
- t={I18n.t}
129
- lang={I18n.getLanguage()}
130
- />)}
131
-
132
- {!props.disabled && <div
133
- {...getRootProps()}
134
- style={{
135
- ...styles.dragField,
136
- ...(isDragActive ? { backgroundColor: 'rgba(0, 255, 0, 0.1)' } : { cursor: 'pointer' }),
137
- }}
102
+ <InputLabel
103
+ shrink
104
+ sx={props.customStyles?.label ? { '&.MuiInputLabel-root': props.customStyles.label } : undefined}
105
+ classes={{ root: props.customClasses?.label }}
138
106
  >
139
- <input {...getInputProps()} />
140
- {isDragActive ?
141
- <span style={styles.text}>{I18n.t('ra_Drop the files here...')}</span> :
142
- <span style={styles.text}>{I18n.t('ra_Drag \'n\' drop some files here, or click to select files')}</span>}
143
- </div>}
144
- </div>
145
- </FormControl>
146
- </div>;
107
+ {props.label}
108
+ </InputLabel>
109
+ <div style={styles.formContainer}>
110
+ {props.value ? (
111
+ <div style={styles.divContainer}>
112
+ <Icon
113
+ style={{ ...props.previewStyle, ...(props.customStyles?.icon || undefined) }}
114
+ src={props.value}
115
+ className={Utils.clsx(props.previewClassName, props.customClasses?.icon)}
116
+ />
117
+ {!props.disabled && (
118
+ <IconButton
119
+ style={{ verticalAlign: 'top' }}
120
+ title={I18n.t('ra_Clear icon')}
121
+ size="small"
122
+ onClick={() => props.onChange('')}
123
+ >
124
+ <ClearIcon />
125
+ </IconButton>
126
+ )}
127
+ </div>
128
+ ) : (
129
+ !props.disabled && (
130
+ <IconSelector
131
+ icons={props.icons}
132
+ onlyRooms={props.onlyRooms}
133
+ onlyDevices={props.onlyDevices}
134
+ onSelect={(base64: string) => props.onChange(base64)}
135
+ t={I18n.t}
136
+ lang={I18n.getLanguage()}
137
+ />
138
+ )
139
+ )}
140
+
141
+ {!props.disabled && (
142
+ <div
143
+ {...getRootProps()}
144
+ style={{
145
+ ...styles.dragField,
146
+ ...(isDragActive ? { backgroundColor: 'rgba(0, 255, 0, 0.1)' } : { cursor: 'pointer' }),
147
+ }}
148
+ >
149
+ <input {...getInputProps()} />
150
+ {isDragActive ? (
151
+ <span style={styles.text}>{I18n.t('ra_Drop the files here...')}</span>
152
+ ) : (
153
+ <span style={styles.text}>
154
+ {I18n.t("ra_Drag 'n' drop some files here, or click to select files")}
155
+ </span>
156
+ )}
157
+ </div>
158
+ )}
159
+ </div>
160
+ </FormControl>
161
+ </div>
162
+ );
147
163
  };
148
164
 
149
165
  export default IconPicker;
@@ -12,14 +12,13 @@ import {
12
12
  CircularProgress,
13
13
  } from '@mui/material';
14
14
 
15
- import {
16
- Close as CloseIcon,
17
- Clear as ClearIcon,
18
- } from '@mui/icons-material';
15
+ import { Close as CloseIcon, Clear as ClearIcon } from '@mui/icons-material';
19
16
 
20
17
  import Icon from './Icon';
21
18
  import Utils from './Utils';
22
- import { Translate } from '../types';
19
+ import devicesIcons from '../assets/devices.json';
20
+ import roomsIcons from '../assets/rooms.json';
21
+ import { type Translate } from '../types';
23
22
 
24
23
  // import devices from '../assets/devices/list.json';
25
24
  const devices: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[] = [
@@ -45,7 +44,7 @@ const devices: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[
45
44
  en: 'Alarm System',
46
45
  ru: 'Сигнализация',
47
46
  de: 'Alarmanlage',
48
- fr: 'Systèmes D\'Alarme',
47
+ fr: "Systèmes D'Alarme",
49
48
  it: 'Sistemi Di Allarme',
50
49
  nl: 'Alarm Systems',
51
50
  pl: 'Systemy Alarmowe',
@@ -141,7 +140,7 @@ const devices: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[
141
140
  en: 'Computer',
142
141
  ru: 'Компьютер',
143
142
  de: 'Rechner',
144
- fr: 'L\'Ordinateur',
143
+ fr: "L'Ordinateur",
145
144
  it: 'Computer',
146
145
  nl: 'Computer',
147
146
  pl: 'Komputer',
@@ -189,7 +188,7 @@ const devices: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[
189
188
  en: 'Power Consumption',
190
189
  ru: 'Потребляемая мощность',
191
190
  de: 'Stromverbrauch',
192
- fr: 'Consommation D\'Énergie',
191
+ fr: "Consommation D'Énergie",
193
192
  it: 'Consumo Di Energia',
194
193
  nl: 'Energieverbruik',
195
194
  pl: 'Pobór Energii',
@@ -765,7 +764,7 @@ const devices: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[
765
764
  en: 'Power Consumption',
766
765
  ru: 'Потребляемая мощность',
767
766
  de: 'Stromverbrauch',
768
- fr: 'Consommation D\'Énergie',
767
+ fr: "Consommation D'Énergie",
769
768
  it: 'Consumo Di Energia',
770
769
  nl: 'Energieverbruik',
771
770
  pl: 'Pobór Energii',
@@ -957,7 +956,7 @@ const devices: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[
957
956
  en: 'Water',
958
957
  ru: 'Вода',
959
958
  de: 'Wasser',
960
- fr: 'L\'Eau',
959
+ fr: "L'Eau",
961
960
  it: 'Acqua',
962
961
  nl: 'Water',
963
962
  pl: 'Woda',
@@ -989,8 +988,8 @@ const devices: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[
989
988
  en: 'Water Consumption',
990
989
  ru: 'Потребление воды',
991
990
  de: 'Wasserverbrauch',
992
- fr: 'Consommation D\'Eau',
993
- it: 'Consumo D\'Acqua',
991
+ fr: "Consommation D'Eau",
992
+ it: "Consumo D'Acqua",
994
993
  nl: 'Waterverbruik',
995
994
  pl: 'Konsumpcja Wody',
996
995
  pt: 'Consumo De Água',
@@ -1106,7 +1105,7 @@ const rooms: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[]
1106
1105
  ru: 'На Улице',
1107
1106
  de: 'Außenbereich',
1108
1107
  fr: 'En Plein Air',
1109
- it: 'All\'Aperto',
1108
+ it: "All'Aperto",
1110
1109
  nl: 'Buitenshuis',
1111
1110
  pl: 'Na Dworze',
1112
1111
  pt: 'Ao Ar Livre',
@@ -1361,7 +1360,7 @@ const rooms: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[]
1361
1360
  en: 'Summer House',
1362
1361
  ru: 'Дача',
1363
1362
  de: 'Gartenhaus',
1364
- fr: 'Maison D\'Été',
1363
+ fr: "Maison D'Été",
1365
1364
  it: 'Casa Estiva',
1366
1365
  nl: 'Zomerhuis',
1367
1366
  pl: 'Domek Letniskowy',
@@ -1393,7 +1392,7 @@ const rooms: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[]
1393
1392
  en: 'Guest Room',
1394
1393
  ru: 'Гостевая Комната',
1395
1394
  de: 'Gästezimmer',
1396
- fr: 'Chambre D\'Amis',
1395
+ fr: "Chambre D'Amis",
1397
1396
  it: 'Stanza Degli Ospiti',
1398
1397
  nl: 'Guest Room',
1399
1398
  pl: 'Pokój Gościnny',
@@ -1729,7 +1728,7 @@ const rooms: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[]
1729
1728
  en: 'Equipment Room',
1730
1729
  ru: 'Оборудование Номера',
1731
1730
  de: 'Technikraum',
1732
- fr: 'Salle D\'Équipement',
1731
+ fr: "Salle D'Équipement",
1733
1732
  it: 'Stanza Degli Attrezzi',
1734
1733
  nl: 'Technische Ruimte',
1735
1734
  pl: 'Wyposażenie Pokoi',
@@ -1777,7 +1776,7 @@ const rooms: { _id: string; name: ioBroker.StringOrTranslated; icon: string }[]
1777
1776
  en: 'Stairwell',
1778
1777
  ru: 'Лестничная клетка',
1779
1778
  de: 'Treppenhaus',
1780
- fr: 'Cage D\'Escalier',
1779
+ fr: "Cage D'Escalier",
1781
1780
  it: 'Tromba Delle Scale',
1782
1781
  nl: 'Trappenhuis',
1783
1782
  pl: 'Klatka Schodowa',
@@ -1993,6 +1992,7 @@ interface IconSelectorState {
1993
1992
  class IconSelector extends Component<IconSelectorProps, IconSelectorState> {
1994
1993
  constructor(props: IconSelectorProps) {
1995
1994
  super(props);
1995
+
1996
1996
  this.state = {
1997
1997
  opened: false,
1998
1998
  names: [],
@@ -2003,7 +2003,7 @@ class IconSelector extends Component<IconSelectorProps, IconSelectorState> {
2003
2003
  };
2004
2004
  }
2005
2005
 
2006
- loadAllIcons() {
2006
+ loadAllIcons(): void {
2007
2007
  if (this.state.loading || this.state.icons) {
2008
2008
  return;
2009
2009
  }
@@ -2012,9 +2012,10 @@ class IconSelector extends Component<IconSelectorProps, IconSelectorState> {
2012
2012
  const names: string[] = [];
2013
2013
 
2014
2014
  if (!this.props.icons) {
2015
- let templates = this.props.onlyRooms || (!this.props.onlyRooms && !this.props.onlyDevices) ? rooms : null;
2015
+ // load rooms
2016
+ let templates =
2017
+ this.props.onlyRooms || (!this.props.onlyRooms && !this.props.onlyDevices) ? rooms : null;
2016
2018
 
2017
- const promises: Promise<void>[] = [];
2018
2019
  if (templates) {
2019
2020
  templates.forEach(item => {
2020
2021
  if (item.name && typeof item.name === 'object') {
@@ -2023,67 +2024,61 @@ class IconSelector extends Component<IconSelectorProps, IconSelectorState> {
2023
2024
  item.name = item.name || item._id;
2024
2025
  });
2025
2026
 
2026
- templates = templates.filter((item, i) => !templates?.find((_item, _i) => i !== _i && _item.icon === item.icon && _item.name === item.name));
2027
+ templates = templates.filter(
2028
+ (item, i) =>
2029
+ !templates?.find(
2030
+ (_item, _i) => i !== _i && _item.icon === item.icon && _item.name === item.name,
2031
+ ),
2032
+ );
2027
2033
 
2028
2034
  templates.forEach((template, i) => {
2029
- let image;
2030
- try {
2031
- image = require(`../assets/rooms/${template.icon}`);
2032
- } catch (e) {
2033
- return;
2034
- }
2035
-
2036
2035
  names[i] = template.name as string;
2037
-
2038
- promises.push(Utils.getSvg(image)
2039
- .then(icon => {
2040
- icons[i] = icon;
2041
- }));
2036
+ icons[i] =
2037
+ `data:image/svg+xml;base64,${(roomsIcons as Record<string, string>)[template.icon.replace(/\.svg$/, '')]}`;
2042
2038
  });
2043
2039
  }
2044
2040
 
2045
- templates = this.props.onlyDevices || (!this.props.onlyRooms && !this.props.onlyDevices) ? devices : null;
2041
+ // load devices
2042
+ templates =
2043
+ this.props.onlyDevices || (!this.props.onlyRooms && !this.props.onlyDevices) ? devices : null;
2046
2044
  if (templates) {
2047
- const offset = promises.length;
2048
- templates && templates.forEach(item => {
2049
- if (item.name && typeof item.name === 'object') {
2050
- item.name = item.name[this.props.lang] || item.name.en || item._id;
2051
- }
2052
- item.name = item.name || item._id;
2053
- });
2045
+ const offset = icons.length;
2046
+ templates &&
2047
+ templates.forEach(item => {
2048
+ if (item.name && typeof item.name === 'object') {
2049
+ item.name = item.name[this.props.lang] || item.name.en || item._id;
2050
+ }
2051
+ item.name = item.name || item._id;
2052
+ });
2054
2053
 
2055
- templates = templates.filter((item, i) => !templates?.find((_item, _i) => i !== _i && _item.icon === item.icon && _item.name === item.name));
2054
+ templates = templates.filter(
2055
+ (item, i) =>
2056
+ !templates?.find(
2057
+ (_item, _i) => i !== _i && _item.icon === item.icon && _item.name === item.name,
2058
+ ),
2059
+ );
2056
2060
 
2057
2061
  templates.forEach((template, i) => {
2058
- let image;
2059
- try {
2060
- image = require(`../assets/devices/${template.icon}`);
2061
- } catch (e) {
2062
- return;
2063
- }
2064
-
2065
2062
  names[i + offset] = template.name as string;
2066
-
2067
- promises.push(Utils.getSvg(image)
2068
- .then(icon => {
2069
- icons[i + offset] = icon;
2070
- }));
2063
+ icons[i + offset] =
2064
+ `data:image/svg+xml;base64,${(devicesIcons as Record<string, string>)[template.icon.replace(/\.svg$/, '')]}`;
2071
2065
  });
2072
2066
  }
2073
- Promise.all(promises)
2074
- .then(() =>
2075
- this.setState({
2076
- icons,
2077
- loading: false,
2078
- names,
2079
- isAnyName: !!names.find(i => i),
2080
- }));
2067
+ this.setState({
2068
+ icons,
2069
+ loading: false,
2070
+ names,
2071
+ isAnyName: !!names.find(i => i),
2072
+ });
2081
2073
  } else {
2082
2074
  const promises = this.props.icons.map((item, i) => {
2083
2075
  let href: string;
2084
2076
  if (typeof item === 'object') {
2085
2077
  href = item.icon || item.src || item.href || '';
2086
- names[i] = typeof item.name === 'object' ? item.name[this.props.lang] || item.name.en || item._id || '' : (item.name || '');
2078
+ names[i] =
2079
+ typeof item.name === 'object'
2080
+ ? item.name[this.props.lang] || item.name.en || item._id || ''
2081
+ : item.name || '';
2087
2082
  if (!names[i]) {
2088
2083
  const parts = href.split('.');
2089
2084
  parts.pop();
@@ -2098,104 +2093,127 @@ class IconSelector extends Component<IconSelectorProps, IconSelectorState> {
2098
2093
  icons[i] = href;
2099
2094
  return Promise.resolve();
2100
2095
  }
2101
- return Utils.getSvg(href)
2102
- .then(icon =>
2103
- icons[i] = icon);
2096
+ return Utils.getSvg(href).then(icon => (icons[i] = icon));
2104
2097
  }
2105
2098
 
2106
2099
  return Promise.resolve();
2107
2100
  });
2108
2101
 
2109
- Promise.all(promises)
2102
+ void Promise.all(promises)
2103
+ .catch((e: Error) => console.error(e))
2110
2104
  .then(() =>
2111
2105
  this.setState({
2112
2106
  icons,
2113
2107
  loading: false,
2114
2108
  names,
2115
2109
  isAnyName: !!names.find(i => i),
2116
- }));
2110
+ }),
2111
+ );
2117
2112
  }
2118
2113
  });
2119
2114
  }
2120
2115
 
2121
- render() {
2116
+ render(): React.JSX.Element {
2122
2117
  if (this.state.loading) {
2123
2118
  return <CircularProgress />;
2124
2119
  }
2125
2120
 
2126
- return <>
2127
- <Button
2128
- color="grey"
2129
- variant="outlined"
2130
- title={this.props.t('ra_Select predefined icon')}
2131
- onClick={() => this.setState({ opened: true }, () => this.loadAllIcons())}
2132
- style={{ minWidth: 40, marginRight: 8 }}
2133
- >
2134
- ...
2135
- </Button>
2136
- {this.state.opened ? <Dialog onClose={() => this.setState({ opened: false })} open={!0}>
2137
- <DialogTitle>
2138
- {this.props.t('ra_Select predefined icon')}
2139
- {this.state.isAnyName ? <TextField
2140
- variant="standard"
2141
- margin="dense"
2142
- style={{ marginLeft: 20 }}
2143
- value={this.state.filter}
2144
- onChange={e => this.setState({ filter: e.target.value.toLowerCase() })}
2145
- placeholder={this.props.t('ra_Filter')}
2146
- InputProps={{
2147
- endAdornment: this.state.filter
2148
- ?
2149
- <IconButton
2150
- size="small"
2151
- onClick={() => this.setState({ filter: '' })}
2152
- >
2153
- <ClearIcon />
2154
- </IconButton>
2155
- :
2156
- undefined,
2157
- }}
2158
- /> : null}
2159
- </DialogTitle>
2160
- <DialogContent>
2161
- <div style={{ width: '100%', textAlign: 'center' }}>
2162
- {this.state.icons && this.state.icons.map((icon, i) => {
2163
- if (!this.state.filter || (this.state.names[i] && this.state.names[i].toLowerCase().includes(this.state.filter))) {
2164
- return <Tooltip
2165
- title={this.state.names[i] || ''}
2166
- key={i}
2167
- componentsProps={{ popper: { sx: { pointerEvents: 'none' } } }}
2168
- >
2169
- <IconButton
2170
- onClick={() => this.setState({ opened: false }, () => {
2171
- const onApply: ((_icon: string) => void) | undefined = this.props.onSelect || this.props.onChange;
2172
- if (onApply) {
2173
- onApply(icon);
2174
- }
2175
- })}
2176
- size="large"
2177
- >
2178
- <Icon src={icon} alt={i.toString()} style={{ width: 32, height: 32, borderRadius: 5 }} />
2179
- </IconButton>
2180
- </Tooltip>;
2181
- }
2182
-
2183
- return null;
2184
- })}
2185
- </div>
2186
- </DialogContent>
2187
- <DialogActions>
2188
- <Button
2189
- color="grey"
2190
- variant="contained"
2191
- onClick={() => this.setState({ opened: false })}
2192
- startIcon={<CloseIcon />}
2121
+ return (
2122
+ <>
2123
+ <Button
2124
+ color="grey"
2125
+ variant="outlined"
2126
+ title={this.props.t('ra_Select predefined icon')}
2127
+ onClick={() => this.setState({ opened: true }, () => this.loadAllIcons())}
2128
+ style={{ minWidth: 40, marginRight: 8 }}
2129
+ >
2130
+ ...
2131
+ </Button>
2132
+ {this.state.opened ? (
2133
+ <Dialog
2134
+ onClose={() => this.setState({ opened: false })}
2135
+ open={!0}
2193
2136
  >
2194
- {this.props.t('ra_Close')}
2195
- </Button>
2196
- </DialogActions>
2197
- </Dialog> : null}
2198
- </>;
2137
+ <DialogTitle>
2138
+ {this.props.t('ra_Select predefined icon')}
2139
+ {this.state.isAnyName ? (
2140
+ <TextField
2141
+ variant="standard"
2142
+ margin="dense"
2143
+ style={{ marginLeft: 20 }}
2144
+ value={this.state.filter}
2145
+ onChange={e => this.setState({ filter: e.target.value.toLowerCase() })}
2146
+ placeholder={this.props.t('ra_Filter')}
2147
+ slotProps={{
2148
+ input: {
2149
+ endAdornment: this.state.filter ? (
2150
+ <IconButton
2151
+ size="small"
2152
+ onClick={() => this.setState({ filter: '' })}
2153
+ >
2154
+ <ClearIcon />
2155
+ </IconButton>
2156
+ ) : undefined,
2157
+ },
2158
+ }}
2159
+ />
2160
+ ) : null}
2161
+ </DialogTitle>
2162
+ <DialogContent>
2163
+ <div style={{ width: '100%', textAlign: 'center' }}>
2164
+ {this.state.icons &&
2165
+ this.state.icons.map((icon, i) => {
2166
+ if (
2167
+ !this.state.filter ||
2168
+ (this.state.names[i] &&
2169
+ this.state.names[i].toLowerCase().includes(this.state.filter))
2170
+ ) {
2171
+ return (
2172
+ <Tooltip
2173
+ title={this.state.names[i] || ''}
2174
+ key={i}
2175
+ slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}
2176
+ >
2177
+ <IconButton
2178
+ onClick={() =>
2179
+ this.setState({ opened: false }, () => {
2180
+ const onApply: ((_icon: string) => void) | undefined =
2181
+ this.props.onSelect || this.props.onChange;
2182
+ if (onApply) {
2183
+ onApply(icon);
2184
+ }
2185
+ })
2186
+ }
2187
+ size="large"
2188
+ >
2189
+ <Icon
2190
+ src={icon}
2191
+ alt={i.toString()}
2192
+ style={{ width: 32, height: 32, borderRadius: 5 }}
2193
+ />
2194
+ </IconButton>
2195
+ </Tooltip>
2196
+ );
2197
+ }
2198
+
2199
+ return null;
2200
+ })}
2201
+ </div>
2202
+ </DialogContent>
2203
+ <DialogActions>
2204
+ <Button
2205
+ color="grey"
2206
+ variant="contained"
2207
+ onClick={() => this.setState({ opened: false })}
2208
+ startIcon={<CloseIcon />}
2209
+ >
2210
+ {this.props.t('ra_Close')}
2211
+ </Button>
2212
+ </DialogActions>
2213
+ </Dialog>
2214
+ ) : null}
2215
+ </>
2216
+ );
2199
2217
  }
2200
2218
  }
2201
2219