@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
|
@@ -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
|
|
83
|
-
const reader = new FileReader();
|
|
78
|
+
const onChange = props.onChange;
|
|
84
79
|
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
const onDrop = useCallback(
|
|
81
|
+
(acceptedFiles: File[]) => {
|
|
82
|
+
const reader = new FileReader();
|
|
87
83
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
<
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
993
|
-
it:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
2041
|
+
// load devices
|
|
2042
|
+
templates =
|
|
2043
|
+
this.props.onlyDevices || (!this.props.onlyRooms && !this.props.onlyDevices) ? devices : null;
|
|
2046
2044
|
if (templates) {
|
|
2047
|
-
const offset =
|
|
2048
|
-
templates &&
|
|
2049
|
-
|
|
2050
|
-
item.name
|
|
2051
|
-
|
|
2052
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
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] =
|
|
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
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
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
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
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
|
|