@iobroker/gui-components 8.0.2 → 10.0.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.
- package/LICENSE +22 -22
- package/README.md +834 -543
- package/build/AdminConnection.js.map +1 -1
- package/build/Components/404.js +13 -13
- package/build/Components/404.js.map +1 -1
- package/build/Components/ColorPicker.js.map +1 -1
- package/build/Components/ComplexCron.js +2 -2
- package/build/Components/ComplexCron.js.map +1 -1
- package/build/Components/CopyToClipboard.js.map +1 -1
- package/build/Components/CustomModal.js +1 -1
- package/build/Components/CustomModal.js.map +1 -1
- package/build/Components/DeviceType/DeviceTypeIcon.js +1 -0
- package/build/Components/DeviceType/DeviceTypeIcon.js.map +1 -1
- package/build/Components/DeviceType/DeviceTypeSelector.js +2 -2
- package/build/Components/DeviceType/DeviceTypeSelector.js.map +1 -1
- package/build/Components/DeviceType/i18n/de.json +1 -0
- package/build/Components/DeviceType/i18n/en.json +1 -0
- package/build/Components/DeviceType/i18n/fr.json +1 -0
- package/build/Components/DeviceType/i18n/it.json +1 -0
- package/build/Components/DeviceType/i18n/nl.json +1 -0
- package/build/Components/DeviceType/i18n/pl.json +1 -0
- package/build/Components/DeviceType/i18n/pt.json +1 -0
- package/build/Components/DeviceType/i18n/ru.json +1 -0
- package/build/Components/DeviceType/i18n/uk.json +1 -0
- package/build/Components/DeviceType/i18n/zh-cn.json +1 -0
- package/build/Components/FileBrowser.d.ts +39 -4
- package/build/Components/FileBrowser.js +104 -11
- package/build/Components/FileBrowser.js.map +1 -1
- package/build/Components/FileViewer.js +2 -4
- package/build/Components/FileViewer.js.map +1 -1
- package/build/Components/Icon.d.ts +1 -3
- package/build/Components/Icon.js +11 -11
- package/build/Components/Icon.js.map +1 -1
- package/build/Components/Image.js +8 -4
- package/build/Components/Image.js.map +1 -1
- package/build/Components/InfoBox.js +1 -1
- package/build/Components/InfoBox.js.map +1 -1
- package/build/Components/IobUri.js +5 -5
- package/build/Components/IobUri.js.map +1 -1
- package/build/Components/Loader.d.ts +2 -3
- package/build/Components/Loader.js +25 -257
- package/build/Components/Loader.js.map +1 -1
- package/build/Components/Loaders/Community.d.ts +31 -0
- package/build/Components/Loaders/Community.js +265 -0
- package/build/Components/Loaders/Community.js.map +1 -0
- package/build/Components/Loaders/HA.d.ts +17 -0
- package/build/Components/Loaders/HA.js +99 -0
- package/build/Components/Loaders/HA.js.map +1 -0
- package/build/Components/Loaders/MV.js.map +1 -1
- package/build/Components/Loaders/NW.d.ts +17 -0
- package/build/Components/Loaders/NW.js +70 -0
- package/build/Components/Loaders/NW.js.map +1 -0
- package/build/Components/Loaders/PT.js +103 -103
- package/build/Components/Loaders/PT.js.map +1 -1
- package/build/Components/Loaders/Vendor.js +7 -7
- package/build/Components/Loaders/Vendor.js.map +1 -1
- package/build/Components/MDUtils.js.map +1 -1
- package/build/Components/ObjectBrowser.d.ts +25 -406
- package/build/Components/ObjectBrowser.js +460 -1543
- package/build/Components/ObjectBrowser.js.map +1 -1
- package/build/Components/Router.js.map +1 -1
- package/build/Components/SaveCloseButtons.js.map +1 -1
- package/build/Components/Schedule.d.ts +27 -1
- package/build/Components/Schedule.js +60 -50
- package/build/Components/Schedule.js.map +1 -1
- package/build/Components/SelectWithIcon.js +1 -1
- package/build/Components/SelectWithIcon.js.map +1 -1
- package/build/Components/SimpleCron/cronText.js.map +1 -1
- package/build/Components/SimpleCron/index.js +3 -3
- package/build/Components/SimpleCron/index.js.map +1 -1
- package/build/Components/TabContainer.js +7 -2
- package/build/Components/TabContainer.js.map +1 -1
- package/build/Components/TabContent.d.ts +1 -1
- package/build/Components/TabContent.js +5 -5
- package/build/Components/TabContent.js.map +1 -1
- package/build/Components/TabHeader.js +2 -2
- package/build/Components/TabHeader.js.map +1 -1
- package/build/Components/TableResize.js.map +1 -1
- package/build/Components/TextWithIcon.js.map +1 -1
- package/build/Components/TreeTable.d.ts +1 -0
- package/build/Components/TreeTable.js +16 -6
- package/build/Components/TreeTable.js.map +1 -1
- package/build/Components/UploadImage.js +305 -305
- package/build/Components/UploadImage.js.map +1 -1
- package/build/Components/Utils.d.ts +17 -3
- package/build/Components/Utils.js +167 -9
- package/build/Components/Utils.js.map +1 -1
- package/build/Components/objectBrowser.types.d.ts +496 -0
- package/build/Components/objectBrowserUtils.d.ts +170 -0
- package/build/Components/objectBrowserUtils.js +1375 -0
- package/build/Components/objectBrowserUtils.js.map +1 -0
- package/build/Connection.js.map +1 -1
- package/build/Dialogs/ComplexCron.js.map +1 -1
- package/build/Dialogs/Confirm.js.map +1 -1
- package/build/Dialogs/Cron.js.map +1 -1
- package/build/Dialogs/Error.js.map +1 -1
- package/build/Dialogs/Message.js.map +1 -1
- package/build/Dialogs/SelectFile.d.ts +1 -1
- package/build/Dialogs/SelectFile.js +1 -1
- package/build/Dialogs/SelectFile.js.map +1 -1
- package/build/Dialogs/SelectID.d.ts +1 -1
- package/build/Dialogs/SelectID.js +1 -1
- package/build/Dialogs/SelectID.js.map +1 -1
- package/build/Dialogs/SimpleCron.js.map +1 -1
- package/build/Dialogs/TextInput.js +1 -1
- package/build/Dialogs/TextInput.js.map +1 -1
- package/build/GenericApp.d.ts +6 -4
- package/build/GenericApp.js +22 -16
- package/build/GenericApp.js.map +1 -1
- package/build/Prompt.js +7 -7
- package/build/Prompt.js.map +1 -1
- package/build/Theme.js +57 -11
- package/build/Theme.js.map +1 -1
- package/build/assets/devices/parseNames.js +1 -0
- package/build/assets/devices/parseNames.js.map +1 -1
- package/build/assets/rooms/parseNames.js +1 -0
- package/build/assets/rooms/parseNames.js.map +1 -1
- package/build/dictionary.js.map +1 -1
- package/build/globals.d.ts +2 -0
- package/build/i18n/de.json +5 -66
- package/build/i18n/en.json +5 -66
- package/build/i18n/es.json +5 -66
- package/build/i18n/fr.json +5 -66
- package/build/i18n/it.json +5 -61
- package/build/i18n/nl.json +5 -61
- package/build/i18n/pl.json +5 -61
- package/build/i18n/pt.json +5 -61
- package/build/i18n/ru.json +5 -61
- package/build/i18n/uk.json +5 -61
- package/build/i18n/zh-cn.json +5 -61
- package/build/i18n.js +12 -15
- package/build/i18n.js.map +1 -1
- package/build/index.css +56 -56
- package/build/index.d.ts +9 -4
- package/build/index.js +5 -2
- package/build/index.js.map +1 -1
- package/build/modulefederation.admin.config.d.ts +1 -0
- package/build/modulefederation.admin.config.js +1 -1
- package/build/modulefederation.admin.config.js.map +1 -1
- package/build/types.d.ts +4 -84
- package/i18n/de.json +5 -66
- package/i18n/en.json +5 -66
- package/i18n/es.json +5 -66
- package/i18n/fr.json +5 -66
- package/i18n/it.json +5 -61
- package/i18n/nl.json +5 -61
- package/i18n/pl.json +5 -61
- package/i18n/pt.json +5 -61
- package/i18n/ru.json +5 -61
- package/i18n/uk.json +5 -61
- package/i18n/zh-cn.json +5 -61
- package/index.css +56 -56
- package/modulefederation.admin.config.d.ts +1 -0
- package/modulefederation.admin.config.js +1 -2
- package/package.json +50 -35
- package/tasksExample.ts +93 -0
- package/build/LegacyConnection.d.ts +0 -938
- package/build/LegacyConnection.js +0 -2849
- package/build/LegacyConnection.js.map +0 -1
- package/tasksExample.js +0 -91
package/README.md
CHANGED
|
@@ -1,80 +1,122 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ioBroker GUI components
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`@iobroker/gui-components` is the shared React component library for ioBroker adapter configuration
|
|
4
|
+
pages, admin tabs and web applications: theme system, i18n, socket connection handling, object and file
|
|
5
|
+
browser, and a set of ready-to-use dialogs.
|
|
6
|
+
|
|
7
|
+
- Requires **React 19** and **MUI 9** (both are peer dependencies)
|
|
8
|
+
- Successor of `@iobroker/adapter-react-v5` (React 18 / MUI 6), which is still maintained on the
|
|
9
|
+
`adapter-react-v5` branch for older systems.
|
|
10
|
+
See [migration from 8.x to 10.x](MIGRATION_8_10.md)
|
|
11
|
+
|
|
12
|
+
You can find a demo on https://github.com/ioBroker/adapter-react-demo
|
|
4
13
|
|
|
5
14
|
## Getting started
|
|
6
15
|
|
|
7
|
-
|
|
16
|
+
The GUI of an adapter is a standalone React application in the `src` directory of the adapter.
|
|
17
|
+
It is built with [vite](https://vite.dev/) and the result is copied into the `admin` directory.
|
|
18
|
+
|
|
19
|
+
1. Create the GitHub repository for the adapter (e.g., with `npx @iobroker/create-adapter`).
|
|
20
|
+
|
|
21
|
+
2. Create the GUI project in the `src` directory:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm create vite@latest src -- --template react-ts
|
|
25
|
+
```
|
|
8
26
|
|
|
9
|
-
|
|
10
|
-
2. execute `npx create-react-app src` . It will take a while.
|
|
11
|
-
3. `cd src`
|
|
12
|
-
4. Modify package.json file in src directory:
|
|
13
|
-
- Change `name` from `src` to `ADAPTERNAME-admin` (Of course replace `ADAPTERNAME` with yours)
|
|
14
|
-
- Add to devDependencies:
|
|
15
|
-
```json
|
|
16
|
-
"@iobroker/adapter-react-v5": "^7.4.10",
|
|
17
|
-
```
|
|
18
|
-
Versions can be higher.
|
|
19
|
-
So your `src/package.json` should look like:
|
|
27
|
+
3. Modify `src/package.json`:
|
|
20
28
|
|
|
21
29
|
```json
|
|
22
30
|
{
|
|
23
31
|
"name": "ADAPTERNAME-admin",
|
|
24
32
|
"version": "0.1.0",
|
|
25
33
|
"private": true,
|
|
34
|
+
"type": "module",
|
|
35
|
+
"homepage": ".",
|
|
26
36
|
"dependencies": {
|
|
27
|
-
"@
|
|
28
|
-
"@
|
|
29
|
-
"
|
|
30
|
-
"
|
|
37
|
+
"@emotion/react": "^11.14.0",
|
|
38
|
+
"@emotion/styled": "^11.14.1",
|
|
39
|
+
"@iobroker/gui-components": "^10.0.1",
|
|
40
|
+
"@mui/icons-material": "^9.0.1",
|
|
41
|
+
"@mui/material": "^9.0.1",
|
|
42
|
+
"react": "^19.2.5",
|
|
43
|
+
"react-dom": "^19.2.5"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/react": "^19.2.0",
|
|
47
|
+
"@types/react-dom": "^19.2.0",
|
|
48
|
+
"@vitejs/plugin-react": "^6.0.4",
|
|
49
|
+
"typescript": "~5.9.3",
|
|
50
|
+
"vite": "^8.1.5"
|
|
31
51
|
},
|
|
32
52
|
"scripts": {
|
|
33
|
-
"start": "
|
|
34
|
-
"build": "
|
|
35
|
-
"
|
|
36
|
-
|
|
53
|
+
"start": "vite",
|
|
54
|
+
"build": "vite build",
|
|
55
|
+
"preview": "vite preview"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Of course, replace `ADAPTERNAME` with your adapter name. The versions can be higher, but React must
|
|
61
|
+
stay at 19 and MUI at 9.
|
|
62
|
+
|
|
63
|
+
4. Write the vite configuration `src/vite.config.ts`. Important are `base` (the GUI is served from a
|
|
64
|
+
subdirectory of the admin) and `build.outDir` (the build script expects the result in `src/build`):
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { defineConfig } from 'vite';
|
|
68
|
+
import react from '@vitejs/plugin-react';
|
|
69
|
+
|
|
70
|
+
export default defineConfig({
|
|
71
|
+
plugins: [react()],
|
|
72
|
+
base: './',
|
|
73
|
+
build: {
|
|
74
|
+
outDir: 'build',
|
|
37
75
|
},
|
|
38
|
-
|
|
39
|
-
|
|
76
|
+
server: {
|
|
77
|
+
port: 3000,
|
|
40
78
|
},
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
5. Install the packages: `cd src && npm install && cd ..`
|
|
83
|
+
|
|
84
|
+
6. Copy the build script into the root of the adapter:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
cp src/node_modules/@iobroker/gui-components/tasksExample.ts tasks.ts
|
|
44
88
|
```
|
|
45
89
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
90
|
+
The build script is TypeScript and is executed directly by node, which strips the types at load
|
|
91
|
+
time. This requires **node >= 22.18** (or >= 23.6). Note that node does not resolve the extension
|
|
92
|
+
for TypeScript, so the scripts below must call `node tasks.ts` and not `node tasks`.
|
|
93
|
+
|
|
94
|
+
7. Add `@iobroker/build-tools` to the `devDependencies` of the **adapter** `package.json` and the
|
|
95
|
+
following scripts:
|
|
49
96
|
|
|
50
97
|
```json
|
|
51
|
-
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
98
|
+
{
|
|
99
|
+
"scripts": {
|
|
100
|
+
"0-clean": "node tasks.ts --0-clean",
|
|
101
|
+
"1-npm": "node tasks.ts --1-npm",
|
|
102
|
+
"2-build": "node tasks.ts --2-build",
|
|
103
|
+
"3-copy": "node tasks.ts --3-copy",
|
|
104
|
+
"4-patch": "node tasks.ts --4-patch",
|
|
105
|
+
"build": "node tasks.ts"
|
|
106
|
+
}
|
|
58
107
|
}
|
|
59
108
|
```
|
|
60
109
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
110
|
+
8. Develop with `cd src && npm run start` (vite dev server on port 3000) or build everything with
|
|
111
|
+
`npm run build` in the adapter root. The build copies all files into the `admin` directory and
|
|
112
|
+
patches the socket.io script tag in `index.html`.
|
|
64
113
|
|
|
65
114
|
## Development
|
|
66
115
|
|
|
67
|
-
1.
|
|
68
|
-
After
|
|
69
|
-
|
|
70
|
-
```html
|
|
71
|
-
<link
|
|
72
|
-
rel="manifest"
|
|
73
|
-
href="%PUBLIC_URL%/manifest.json"
|
|
74
|
-
/>
|
|
75
|
-
```
|
|
116
|
+
### 1. Load socket.io in `src/index.html`
|
|
76
117
|
|
|
77
|
-
|
|
118
|
+
The GUI does not bundle socket.io. It is delivered by the admin instance and must be loaded before the
|
|
119
|
+
application starts. Add this to the `<head>` of `src/index.html`:
|
|
78
120
|
|
|
79
121
|
```html
|
|
80
122
|
<script>
|
|
@@ -91,343 +133,425 @@ insert
|
|
|
91
133
|
script.onload = function () {
|
|
92
134
|
typeof window.socketLoadedHandler === 'function' && window.socketLoadedHandler();
|
|
93
135
|
};
|
|
136
|
+
// On the vite dev server (port 3000) the socket must be loaded from the admin instance (port 8081)
|
|
94
137
|
script.src =
|
|
95
138
|
window.location.port === '3000'
|
|
96
|
-
? window.location.protocol
|
|
97
|
-
|
|
98
|
-
(query.host || window.location.hostname) +
|
|
99
|
-
':' +
|
|
100
|
-
(query.port || 8081) +
|
|
101
|
-
'/lib/js/socket.io.js'
|
|
102
|
-
: '%PUBLIC_URL%/../../lib/js/socket.io.js';
|
|
139
|
+
? `${window.location.protocol}//${query.host || window.location.hostname}:${query.port || 8081}/lib/js/socket.io.js`
|
|
140
|
+
: './../../lib/js/socket.io.js';
|
|
103
141
|
|
|
104
142
|
document.head.appendChild(script);
|
|
105
143
|
</script>
|
|
106
144
|
```
|
|
107
145
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
146
|
+
`node tasks.ts --4-patch` replaces this block in the built `index.html` with a direct include of
|
|
147
|
+
`./../../lib/js/socket.io.js`.
|
|
148
|
+
|
|
149
|
+
### 2. Extend `GenericApp` in `src/src/App.tsx`
|
|
150
|
+
|
|
151
|
+
`GenericApp` handles the socket connection, the theme, loading and saving of the instance
|
|
152
|
+
configuration, the save/close buttons, and the Sentry initialization.
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
import React from 'react';
|
|
156
|
+
import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles';
|
|
157
|
+
import {
|
|
158
|
+
GenericApp,
|
|
159
|
+
Loader,
|
|
160
|
+
I18n,
|
|
161
|
+
type GenericAppProps,
|
|
162
|
+
type GenericAppSettings,
|
|
163
|
+
type GenericAppState,
|
|
164
|
+
} from '@iobroker/gui-components';
|
|
165
|
+
|
|
166
|
+
import en from './i18n/en.json';
|
|
167
|
+
import de from './i18n/de.json';
|
|
168
|
+
import ru from './i18n/ru.json';
|
|
169
|
+
import pt from './i18n/pt.json';
|
|
170
|
+
import nl from './i18n/nl.json';
|
|
171
|
+
import fr from './i18n/fr.json';
|
|
172
|
+
import it from './i18n/it.json';
|
|
173
|
+
import es from './i18n/es.json';
|
|
174
|
+
import pl from './i18n/pl.json';
|
|
175
|
+
import uk from './i18n/uk.json';
|
|
176
|
+
import zhCn from './i18n/zh-cn.json';
|
|
177
|
+
|
|
178
|
+
interface AppState extends GenericAppState {
|
|
179
|
+
// your own state
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export default class App extends GenericApp<GenericAppProps, AppState> {
|
|
183
|
+
constructor(props: GenericAppProps) {
|
|
184
|
+
const extendedProps: GenericAppSettings = { ...props };
|
|
185
|
+
// these fields will be encrypted and decrypted automatically
|
|
186
|
+
extendedProps.encryptedFields = ['pass'];
|
|
187
|
+
extendedProps.translations = { en, de, ru, pt, nl, fr, it, es, pl, uk, 'zh-cn': zhCn };
|
|
188
|
+
// get the actual admin port
|
|
129
189
|
extendedProps.socket = { port: parseInt(window.location.port, 10) };
|
|
130
190
|
|
|
131
|
-
//
|
|
191
|
+
// only if the save/close buttons at the bottom are not required (e.g., for an admin tab)
|
|
132
192
|
// extendedProps.bottomButtons = false;
|
|
133
193
|
|
|
134
|
-
// only for debug purposes
|
|
194
|
+
// only for debug purposes: the vite dev server runs on 3000, the admin on 8081
|
|
135
195
|
if (extendedProps.socket.port === 3000) {
|
|
136
196
|
extendedProps.socket.port = 8081;
|
|
137
197
|
}
|
|
138
198
|
|
|
139
|
-
//
|
|
199
|
+
// let GenericApp manage the Sentry initialization. Do not set it if no Sentry is available
|
|
140
200
|
extendedProps.sentryDSN = 'https://yyy@sentry.iobroker.net/xx';
|
|
141
201
|
|
|
142
|
-
super(extendedProps);
|
|
202
|
+
super(props, extendedProps);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
onConnectionReady(): void {
|
|
206
|
+
// called after the socket is connected and the configuration is loaded
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
render(): React.JSX.Element {
|
|
210
|
+
if (!this.state.loaded) {
|
|
211
|
+
return (
|
|
212
|
+
<StyledEngineProvider injectFirst>
|
|
213
|
+
<ThemeProvider theme={this.state.theme}>
|
|
214
|
+
<Loader themeType={this.state.themeType} />
|
|
215
|
+
</ThemeProvider>
|
|
216
|
+
</StyledEngineProvider>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<StyledEngineProvider injectFirst>
|
|
222
|
+
<ThemeProvider theme={this.state.theme}>
|
|
223
|
+
<div
|
|
224
|
+
className="App"
|
|
225
|
+
style={{
|
|
226
|
+
background: this.state.theme.palette.background.default,
|
|
227
|
+
color: this.state.theme.palette.text.primary,
|
|
228
|
+
}}
|
|
229
|
+
>
|
|
230
|
+
<div>
|
|
231
|
+
{I18n.t('Port')}:
|
|
232
|
+
<input
|
|
233
|
+
value={this.state.native.port || ''}
|
|
234
|
+
onChange={e => this.updateNativeValue('port', e.target.value)}
|
|
235
|
+
/>
|
|
236
|
+
</div>
|
|
237
|
+
{/* renders the error, toast, alert dialogs and the save/close buttons */}
|
|
238
|
+
{this.renderHelperDialogs()}
|
|
239
|
+
</div>
|
|
240
|
+
</ThemeProvider>
|
|
241
|
+
</StyledEngineProvider>
|
|
242
|
+
);
|
|
143
243
|
}
|
|
144
|
-
// ...
|
|
145
244
|
}
|
|
146
245
|
```
|
|
147
246
|
|
|
148
|
-
|
|
247
|
+
### 3. Entry point `src/src/index.tsx`
|
|
149
248
|
|
|
150
|
-
```
|
|
249
|
+
```tsx
|
|
151
250
|
import React from 'react';
|
|
152
251
|
import { createRoot } from 'react-dom/client';
|
|
153
|
-
import * as serviceWorker from './serviceWorker';
|
|
154
252
|
|
|
155
253
|
import './index.css';
|
|
156
254
|
import App from './App';
|
|
157
255
|
import { version } from '../package.json';
|
|
158
256
|
|
|
159
|
-
console.log(`iobroker.
|
|
257
|
+
console.log(`iobroker.ADAPTERNAME@${version}`);
|
|
160
258
|
|
|
161
259
|
const container = document.getElementById('root');
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
// If you want your app to work offline and load faster, you can change
|
|
166
|
-
// unregister() to register() below. Note this comes with some pitfalls.
|
|
167
|
-
// Learn more about service workers: http://bit.ly/CRA-PWA
|
|
168
|
-
serviceWorker.unregister();
|
|
260
|
+
if (container) {
|
|
261
|
+
createRoot(container).render(<App />);
|
|
262
|
+
}
|
|
169
263
|
```
|
|
170
264
|
|
|
171
|
-
|
|
265
|
+
### 4. Encrypt and decrypt values
|
|
172
266
|
|
|
173
|
-
|
|
174
|
-
|
|
267
|
+
Fields listed in `encryptedFields` are encrypted and decrypted automatically. If you need more control,
|
|
268
|
+
override the hooks:
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
class App extends GenericApp<GenericAppProps, AppState> {
|
|
175
272
|
// ...
|
|
176
|
-
onPrepareLoad(settings) {
|
|
177
|
-
settings.pass = this.
|
|
273
|
+
onPrepareLoad(settings: Record<string, any>, encryptedNative?: string[]): void {
|
|
274
|
+
settings.pass = this.decrypt(settings.pass);
|
|
178
275
|
}
|
|
179
|
-
|
|
180
|
-
|
|
276
|
+
|
|
277
|
+
onPrepareSave(settings: Record<string, any>): boolean {
|
|
278
|
+
settings.pass = this.encrypt(settings.pass);
|
|
279
|
+
return true;
|
|
181
280
|
}
|
|
182
281
|
}
|
|
183
282
|
```
|
|
184
283
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
```
|
|
188
|
-
onPrepareSave(settings) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
284
|
+
### 5. Validate the data before saving (optional)
|
|
285
|
+
|
|
286
|
+
```tsx
|
|
287
|
+
onPrepareSave(settings: Record<string, any>): boolean {
|
|
288
|
+
super.onPrepareSave(settings);
|
|
289
|
+
if (DATA_INVALID) {
|
|
290
|
+
return false; // the configuration will not be saved
|
|
291
|
+
}
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
196
294
|
```
|
|
197
295
|
|
|
198
296
|
## Components
|
|
199
297
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
This is a non-React class to provide the communication for socket connection with the server.
|
|
298
|
+
All components, dialogs, icons, and types are exported from the package root:
|
|
203
299
|
|
|
204
|
-
|
|
300
|
+
```ts
|
|
301
|
+
import { GenericApp, ObjectBrowser, DialogSelectID, I18n, Utils } from '@iobroker/gui-components';
|
|
302
|
+
```
|
|
205
303
|
|
|
206
|
-
###
|
|
304
|
+
### Core modules
|
|
207
305
|
|
|
208
|
-
|
|
306
|
+
| Module | Description |
|
|
307
|
+
| -------------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
308
|
+
| `GenericApp` | Base class of every adapter GUI: connection, theme, config load/save, save/close buttons, Sentry |
|
|
309
|
+
| `Connection` / `AdminConnection` | Re-export of the socket classes from `@iobroker/socket-client` |
|
|
310
|
+
| `I18n` | Static translation class (`I18n.t`, `I18n.setLanguage`, `I18n.getLanguage`) |
|
|
311
|
+
| `Theme` | MUI theme factory that produces the ioBroker themes (`IobTheme`) |
|
|
312
|
+
| `Router` | Simple hash-based router |
|
|
313
|
+
| `Utils` | Helper functions for names, icons, colors, clipboard, ... |
|
|
209
314
|
|
|
210
315
|
### Dialogs
|
|
211
316
|
|
|
212
|
-
Some dialogs are predefined and
|
|
317
|
+
Some dialogs are predefined and can be used out of the box. In all dialogs, the OK button is first (on
|
|
318
|
+
the left) and the cancel button is last (on the right).
|
|
213
319
|
|
|
214
|
-
|
|
320
|
+
| Dialog | Deprecated alias | Description |
|
|
321
|
+
| ------------------- | ------------------- | ------------------------------------- |
|
|
322
|
+
| `DialogConfirm` | `Confirm` | Yes/no question, can be suppressed |
|
|
323
|
+
| `DialogError` | `Error` | Error message |
|
|
324
|
+
| `DialogMessage` | `Message` | Information message |
|
|
325
|
+
| `DialogTextInput` | `TextInput` | Ask for a text |
|
|
326
|
+
| `DialogSelectID` | `SelectID` | Object ID selector |
|
|
327
|
+
| `DialogSelectFile` | `SelectFile` | File selector |
|
|
328
|
+
| `DialogCron` | `Cron` | CRON editor (wizard, simple, complex) |
|
|
329
|
+
| `DialogSimpleCron` | `SimpleCronDialog` | Only the simple CRON editor |
|
|
330
|
+
| `DialogComplexCron` | `ComplexCronDialog` | Only the complex CRON editor |
|
|
215
331
|
|
|
216
|
-
|
|
332
|
+
#### DialogConfirm
|
|
217
333
|
|
|
218
|
-
|
|
334
|
+
<!-- TODO: Provide screenshot here -->
|
|
219
335
|
|
|
220
|
-
```
|
|
336
|
+
```tsx
|
|
221
337
|
import React from 'react';
|
|
222
|
-
import {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
render() {
|
|
253
|
-
return (
|
|
254
|
-
<div>
|
|
255
|
-
<Button onClick={() => this.setState({ confirmDialog: true })}>Click</Button>
|
|
256
|
-
{this.renderConfirmDialog()}
|
|
257
|
-
</div>
|
|
258
|
-
);
|
|
259
|
-
}
|
|
338
|
+
import { Button } from '@mui/material';
|
|
339
|
+
import { I18n, DialogConfirm } from '@iobroker/gui-components';
|
|
340
|
+
|
|
341
|
+
export default function ExportImportDialog(): React.JSX.Element {
|
|
342
|
+
const [confirmDialog, setConfirmDialog] = React.useState(false);
|
|
343
|
+
|
|
344
|
+
return (
|
|
345
|
+
<div>
|
|
346
|
+
<Button onClick={() => setConfirmDialog(true)}>Click</Button>
|
|
347
|
+
{confirmDialog ? (
|
|
348
|
+
<DialogConfirm
|
|
349
|
+
title={I18n.t('Scene will be overwritten.')}
|
|
350
|
+
text={I18n.t('All data will be lost. Confirm?')}
|
|
351
|
+
ok={I18n.t('Yes')}
|
|
352
|
+
cancel={I18n.t('Cancel')}
|
|
353
|
+
suppressQuestionMinutes={5}
|
|
354
|
+
// `dialogName` is required if `suppressQuestionMinutes` is used
|
|
355
|
+
dialogName="myConfirmDialogThatCouldBeSuppressed"
|
|
356
|
+
suppressText={I18n.t('Suppress question for next %s minutes', 5)}
|
|
357
|
+
onClose={(isYes: boolean) => {
|
|
358
|
+
setConfirmDialog(false);
|
|
359
|
+
if (isYes) {
|
|
360
|
+
// do something
|
|
361
|
+
}
|
|
362
|
+
}}
|
|
363
|
+
/>
|
|
364
|
+
) : null}
|
|
365
|
+
</div>
|
|
366
|
+
);
|
|
260
367
|
}
|
|
261
|
-
|
|
262
|
-
export default ExportImportDialog;
|
|
263
368
|
```
|
|
264
369
|
|
|
265
|
-
####
|
|
370
|
+
#### DialogError
|
|
266
371
|
|
|
267
372
|
<!-- TODO: Provide screenshot here -->
|
|
268
373
|
|
|
269
|
-
|
|
374
|
+
```tsx
|
|
375
|
+
{
|
|
376
|
+
this.state.errorText ? (
|
|
377
|
+
<DialogError
|
|
378
|
+
text={this.state.errorText}
|
|
379
|
+
onClose={() => this.setState({ errorText: '' })}
|
|
380
|
+
/>
|
|
381
|
+
) : null;
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
#### DialogMessage
|
|
270
386
|
|
|
271
387
|
<!-- TODO: Provide screenshot here -->
|
|
272
388
|
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
return null;
|
|
282
|
-
}
|
|
389
|
+
```tsx
|
|
390
|
+
{
|
|
391
|
+
this.state.showMessage ? (
|
|
392
|
+
<DialogMessage
|
|
393
|
+
text={this.state.showMessage}
|
|
394
|
+
onClose={() => this.setState({ showMessage: '' })}
|
|
395
|
+
/>
|
|
396
|
+
) : null;
|
|
283
397
|
}
|
|
284
398
|
```
|
|
285
399
|
|
|
286
|
-
####
|
|
400
|
+
#### DialogSelectID
|
|
287
401
|
|
|
288
|
-
|
|
402
|
+
<!-- TODO: Provide screenshot here -->
|
|
289
403
|
|
|
290
|
-
```
|
|
291
|
-
import {
|
|
404
|
+
```tsx
|
|
405
|
+
import React, { Component } from 'react';
|
|
406
|
+
import { DialogSelectID, type IobTheme } from '@iobroker/gui-components';
|
|
407
|
+
import type { AdminConnection } from '@iobroker/socket-client';
|
|
292
408
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
409
|
+
interface MyComponentProps {
|
|
410
|
+
socket: AdminConnection;
|
|
411
|
+
theme: IobTheme;
|
|
412
|
+
themeType: 'dark' | 'light';
|
|
413
|
+
adapterName: string;
|
|
414
|
+
}
|
|
300
415
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
<DialogSelectID
|
|
305
|
-
key="tableSelect"
|
|
306
|
-
imagePrefix="../.."
|
|
307
|
-
dialogName={this.props.adapterName}
|
|
308
|
-
themeType={this.props.themeType}
|
|
309
|
-
socket={this.props.socket}
|
|
310
|
-
statesOnly={true}
|
|
311
|
-
selected={this.state.selectIdValue}
|
|
312
|
-
onClose={() => this.setState({ showSelectId: false })}
|
|
313
|
-
onOk={(selected, name) => {
|
|
314
|
-
this.setState({ showSelectId: false, selectIdValue: selected });
|
|
315
|
-
}}
|
|
316
|
-
/>
|
|
317
|
-
);
|
|
318
|
-
} else {
|
|
416
|
+
class MyComponent extends Component<MyComponentProps, { showSelectId: boolean; selectIdValue: string }> {
|
|
417
|
+
renderSelectIdDialog(): React.JSX.Element | null {
|
|
418
|
+
if (!this.state.showSelectId) {
|
|
319
419
|
return null;
|
|
320
420
|
}
|
|
421
|
+
return (
|
|
422
|
+
<DialogSelectID
|
|
423
|
+
imagePrefix="../.."
|
|
424
|
+
dialogName={this.props.adapterName}
|
|
425
|
+
// `theme` is mandatory, without it the dialog will crash
|
|
426
|
+
theme={this.props.theme}
|
|
427
|
+
themeType={this.props.themeType}
|
|
428
|
+
socket={this.props.socket}
|
|
429
|
+
types={['state']}
|
|
430
|
+
selected={this.state.selectIdValue}
|
|
431
|
+
onClose={() => this.setState({ showSelectId: false })}
|
|
432
|
+
onOk={(selected, _name) => this.setState({ showSelectId: false, selectIdValue: selected as string })}
|
|
433
|
+
/>
|
|
434
|
+
);
|
|
321
435
|
}
|
|
322
|
-
|
|
323
|
-
|
|
436
|
+
|
|
437
|
+
render(): React.JSX.Element | null {
|
|
438
|
+
return this.renderSelectIdDialog();
|
|
324
439
|
}
|
|
325
440
|
}
|
|
326
441
|
```
|
|
327
442
|
|
|
328
|
-
####
|
|
329
|
-
|
|
330
|
-
Include `"react-text-mask": "^5.4.3",` in package.json.
|
|
443
|
+
#### DialogCron
|
|
331
444
|
|
|
332
445
|
<!-- TODO: Provide screenshot here -->
|
|
333
446
|
|
|
334
|
-
```
|
|
335
|
-
function renderCron() {
|
|
447
|
+
```tsx
|
|
448
|
+
function renderCron(): React.JSX.Element | null {
|
|
336
449
|
if (!showCron) {
|
|
337
450
|
return null;
|
|
338
|
-
} else {
|
|
339
|
-
return (
|
|
340
|
-
<DialogCron
|
|
341
|
-
key="dialogCron1"
|
|
342
|
-
cron={this.state.cronValue || '* * * * *'}
|
|
343
|
-
onClose={() => this.setState({ showCron: false })}
|
|
344
|
-
onOk={cronValue => {
|
|
345
|
-
this.setState({ cronValue });
|
|
346
|
-
}}
|
|
347
|
-
/>
|
|
348
|
-
);
|
|
349
451
|
}
|
|
452
|
+
return (
|
|
453
|
+
<DialogCron
|
|
454
|
+
cron={this.state.cronValue || '* * * * *'}
|
|
455
|
+
// `theme` is mandatory
|
|
456
|
+
theme={this.props.theme}
|
|
457
|
+
// noWizard, simple or complex can limit the available editors
|
|
458
|
+
onClose={() => this.setState({ showCron: false })}
|
|
459
|
+
onOk={(cronValue: string) => this.setState({ cronValue })}
|
|
460
|
+
/>
|
|
461
|
+
);
|
|
350
462
|
}
|
|
351
463
|
```
|
|
352
464
|
|
|
353
|
-
###
|
|
465
|
+
### Component examples
|
|
354
466
|
|
|
355
|
-
#### Utils
|
|
467
|
+
#### Utils
|
|
356
468
|
|
|
357
469
|
##### getObjectNameFromObj
|
|
358
470
|
|
|
359
|
-
`getObjectNameFromObj(obj, settings, options, isDesc)`
|
|
471
|
+
`getObjectNameFromObj(obj, settings, options, isDesc, noTrim)`
|
|
360
472
|
|
|
361
|
-
Get
|
|
473
|
+
Get the name from a single object.
|
|
362
474
|
|
|
363
|
-
Usage: `Utils.getObjectNameFromObj(this.objects[id], null, {language: I18n.getLanguage()})`
|
|
475
|
+
Usage: `Utils.getObjectNameFromObj(this.objects[id], null, { language: I18n.getLanguage() })`
|
|
364
476
|
|
|
365
477
|
##### getObjectIcon
|
|
366
478
|
|
|
367
479
|
`getObjectIcon(id, obj)`
|
|
368
480
|
|
|
369
|
-
Get icon from the object.
|
|
370
|
-
|
|
371
|
-
Usage:
|
|
481
|
+
Get the icon from the object.
|
|
372
482
|
|
|
373
|
-
```
|
|
483
|
+
```tsx
|
|
374
484
|
const icon = Utils.getObjectIcon(id, this.objects[id]);
|
|
375
|
-
return
|
|
485
|
+
return (
|
|
486
|
+
<img
|
|
487
|
+
src={icon}
|
|
488
|
+
alt=""
|
|
489
|
+
/>
|
|
490
|
+
);
|
|
376
491
|
```
|
|
377
492
|
|
|
378
493
|
##### isUseBright
|
|
379
494
|
|
|
380
495
|
`isUseBright(color, defaultValue)`
|
|
381
496
|
|
|
382
|
-
|
|
497
|
+
Returns `true` if a bright (white) text must be used on the given background color.
|
|
383
498
|
|
|
384
|
-
|
|
499
|
+
Usage: `const textColor = Utils.isUseBright(backgroundColor) ? '#FFF' : '#000';`
|
|
385
500
|
|
|
386
|
-
|
|
501
|
+
#### Loader
|
|
387
502
|
|
|
388
|
-
|
|
389
|
-
render() {
|
|
390
|
-
if (!this.state.loaded) {
|
|
391
|
-
return <MuiThemeProvider theme={this.state.theme}>
|
|
392
|
-
<Loader theme={this.state.themeType}/>
|
|
393
|
-
</MuiThemeProvider>;
|
|
394
|
-
}
|
|
395
|
-
// render loaded data
|
|
396
|
-
}
|
|
503
|
+
<!-- TODO: Provide screenshot here -->
|
|
397
504
|
|
|
398
|
-
|
|
505
|
+
The loader detects the vendor (`window.vendorPrefix`) and shows the corresponding animation.
|
|
399
506
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
!
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
onLoad={this.props.onLoad}
|
|
413
|
-
/>
|
|
414
|
-
...
|
|
415
|
-
</form>;
|
|
507
|
+
```tsx
|
|
508
|
+
render(): React.JSX.Element {
|
|
509
|
+
if (!this.state.loaded) {
|
|
510
|
+
return (
|
|
511
|
+
<StyledEngineProvider injectFirst>
|
|
512
|
+
<ThemeProvider theme={this.state.theme}>
|
|
513
|
+
<Loader themeType={this.state.themeType} />
|
|
514
|
+
</ThemeProvider>
|
|
515
|
+
</StyledEngineProvider>
|
|
516
|
+
);
|
|
517
|
+
}
|
|
518
|
+
// render the loaded data
|
|
416
519
|
}
|
|
417
520
|
```
|
|
418
521
|
|
|
419
|
-
####
|
|
522
|
+
#### Logo
|
|
523
|
+
|
|
524
|
+
<!-- TODO: Provide screenshot here -->
|
|
525
|
+
|
|
526
|
+
Shows the adapter logo and the import/export buttons for the configuration.
|
|
527
|
+
|
|
528
|
+
```tsx
|
|
529
|
+
render(): React.JSX.Element {
|
|
530
|
+
return (
|
|
531
|
+
<form style={styles.tab}>
|
|
532
|
+
<Logo
|
|
533
|
+
instance={this.props.instance}
|
|
534
|
+
common={this.props.common}
|
|
535
|
+
native={this.props.native}
|
|
536
|
+
onError={(text: string) => this.setState({ errorText: text })}
|
|
537
|
+
onLoad={this.props.onLoad}
|
|
538
|
+
/>
|
|
539
|
+
...
|
|
540
|
+
</form>
|
|
541
|
+
);
|
|
542
|
+
}
|
|
543
|
+
```
|
|
420
544
|
|
|
421
|
-
#### ObjectBrowser
|
|
545
|
+
#### ObjectBrowser
|
|
422
546
|
|
|
423
|
-
It is better to use `
|
|
547
|
+
It is better to use `DialogSelectID`, but if you want:
|
|
424
548
|
|
|
425
|
-
|
|
549
|
+
<!-- TODO: Provide screenshot here -->
|
|
426
550
|
|
|
427
|
-
```
|
|
551
|
+
```tsx
|
|
428
552
|
<ObjectBrowser
|
|
429
553
|
foldersFirst={this.props.foldersFirst}
|
|
430
|
-
imagePrefix={this.props.imagePrefix
|
|
554
|
+
imagePrefix={this.props.imagePrefix}
|
|
431
555
|
defaultFilters={this.filters}
|
|
432
556
|
dialogName={this.dialogName}
|
|
433
557
|
showExpertButton={this.props.showExpertButton !== undefined ? this.props.showExpertButton : true}
|
|
@@ -459,21 +583,25 @@ It is better to use `Dialog/SelectID`, but if you want:
|
|
|
459
583
|
/>
|
|
460
584
|
```
|
|
461
585
|
|
|
462
|
-
#### TreeTable
|
|
586
|
+
#### TreeTable
|
|
463
587
|
|
|
464
|
-
|
|
588
|
+
<!-- TODO: Provide screenshot here -->
|
|
465
589
|
|
|
466
|
-
```
|
|
590
|
+
```tsx
|
|
467
591
|
// STYLES
|
|
468
|
-
const styles = {
|
|
592
|
+
const styles: Record<string, React.CSSProperties> = {
|
|
469
593
|
tableDiv: {
|
|
470
594
|
width: '100%',
|
|
471
595
|
overflow: 'hidden',
|
|
472
596
|
height: 'calc(100% - 48px)',
|
|
473
597
|
},
|
|
474
598
|
};
|
|
475
|
-
|
|
476
|
-
|
|
599
|
+
|
|
600
|
+
class MyComponent extends Component<MyComponentProps, MyComponentState> {
|
|
601
|
+
// the `Column` type is not exported, the structure is described below
|
|
602
|
+
private readonly columns: Record<string, any>[];
|
|
603
|
+
|
|
604
|
+
constructor(props: MyComponentProps) {
|
|
477
605
|
super(props);
|
|
478
606
|
|
|
479
607
|
this.state = {
|
|
@@ -534,13 +662,16 @@ class MyComponent extends Component {
|
|
|
534
662
|
},
|
|
535
663
|
];
|
|
536
664
|
}
|
|
537
|
-
|
|
538
|
-
render() {
|
|
665
|
+
|
|
666
|
+
render(): React.JSX.Element {
|
|
539
667
|
return (
|
|
540
|
-
<div
|
|
668
|
+
<div style={styles.tableDiv}>
|
|
541
669
|
<TreeTable
|
|
542
670
|
columns={this.columns}
|
|
543
671
|
data={this.state.data}
|
|
672
|
+
// `theme` and `adapterName` are mandatory
|
|
673
|
+
theme={this.props.theme}
|
|
674
|
+
adapterName={this.props.adapterName}
|
|
544
675
|
onUpdate={(newData, oldData) => {
|
|
545
676
|
const data = JSON.parse(JSON.stringify(this.state.data));
|
|
546
677
|
|
|
@@ -548,24 +679,23 @@ class MyComponent extends Component {
|
|
|
548
679
|
if (newData === true) {
|
|
549
680
|
// find unique ID
|
|
550
681
|
let i = 1;
|
|
551
|
-
let id =
|
|
682
|
+
let id = `line_${i}`;
|
|
552
683
|
|
|
553
|
-
// eslint-disable-next-line
|
|
554
684
|
while (this.state.data.find(item => item.id === id)) {
|
|
555
685
|
i++;
|
|
556
|
-
id =
|
|
686
|
+
id = `line_${i}`;
|
|
557
687
|
}
|
|
558
688
|
|
|
559
689
|
data.push({
|
|
560
690
|
id,
|
|
561
|
-
name: I18n.t('New resource')
|
|
691
|
+
name: `${I18n.t('New resource')}_${i}`,
|
|
562
692
|
color: '',
|
|
563
693
|
icon: '',
|
|
564
694
|
unit: '',
|
|
565
695
|
price: 0,
|
|
566
696
|
});
|
|
567
697
|
} else {
|
|
568
|
-
// existing line was
|
|
698
|
+
// an existing line was modified
|
|
569
699
|
const pos = this.state.data.indexOf(oldData);
|
|
570
700
|
if (pos !== -1) {
|
|
571
701
|
Object.keys(newData).forEach(attr => (data[pos][attr] = newData[attr]));
|
|
@@ -575,7 +705,6 @@ class MyComponent extends Component {
|
|
|
575
705
|
this.setState({ data });
|
|
576
706
|
}}
|
|
577
707
|
onDelete={oldData => {
|
|
578
|
-
console.log('Delete: ' + JSON.stringify(oldData));
|
|
579
708
|
const pos = this.state.data.indexOf(oldData);
|
|
580
709
|
if (pos !== -1) {
|
|
581
710
|
const data = JSON.parse(JSON.stringify(this.state.data));
|
|
@@ -594,75 +723,112 @@ class MyComponent extends Component {
|
|
|
594
723
|
|
|
595
724
|
<!-- TODO: Provide screenshot here -->
|
|
596
725
|
|
|
597
|
-
Toast is not a part of
|
|
598
|
-
|
|
599
|
-
```jsx
|
|
600
|
-
import { Component } from 'react';
|
|
601
|
-
import { Snackbar } from '@mui/material';
|
|
726
|
+
Toast is not a part of this package, but this is an example of how to use a toast in the application.
|
|
727
|
+
`GenericApp` already provides one via `this.showToast('text')`.
|
|
602
728
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
// ....
|
|
608
|
-
toast: '',
|
|
609
|
-
};
|
|
610
|
-
}
|
|
729
|
+
```tsx
|
|
730
|
+
import React, { Component } from 'react';
|
|
731
|
+
import { IconButton, Snackbar } from '@mui/material';
|
|
732
|
+
import { Close as IconClose } from '@mui/icons-material';
|
|
611
733
|
|
|
612
|
-
|
|
613
|
-
renderToast() {
|
|
734
|
+
class MyComponent extends Component<MyComponentProps, { toast: string }> {
|
|
735
|
+
renderToast(): React.JSX.Element | null {
|
|
614
736
|
if (!this.state.toast) {
|
|
615
737
|
return null;
|
|
616
738
|
}
|
|
617
739
|
return (
|
|
618
740
|
<Snackbar
|
|
619
|
-
anchorOrigin={{
|
|
620
|
-
|
|
621
|
-
horizontal: 'left',
|
|
622
|
-
}}
|
|
623
|
-
open={true}
|
|
741
|
+
anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
|
|
742
|
+
open
|
|
624
743
|
autoHideDuration={6000}
|
|
625
744
|
onClose={() => this.setState({ toast: '' })}
|
|
626
|
-
|
|
745
|
+
// MUI 9: `ContentProps` was replaced by `slotProps`
|
|
746
|
+
slotProps={{ content: { 'aria-describedby': 'message-id' } }}
|
|
627
747
|
message={<span id="message-id">{this.state.toast}</span>}
|
|
628
|
-
action={
|
|
748
|
+
action={
|
|
629
749
|
<IconButton
|
|
630
750
|
key="close"
|
|
631
751
|
aria-label="Close"
|
|
632
752
|
color="inherit"
|
|
633
|
-
className={this.props.classes.close}
|
|
634
753
|
onClick={() => this.setState({ toast: '' })}
|
|
635
754
|
>
|
|
636
755
|
<IconClose />
|
|
637
|
-
</IconButton
|
|
638
|
-
|
|
756
|
+
</IconButton>
|
|
757
|
+
}
|
|
639
758
|
/>
|
|
640
759
|
);
|
|
641
760
|
}
|
|
642
761
|
|
|
643
|
-
render() {
|
|
762
|
+
render(): React.JSX.Element {
|
|
644
763
|
return <div>{this.renderToast()}</div>;
|
|
645
764
|
}
|
|
646
765
|
}
|
|
647
766
|
```
|
|
648
767
|
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
-
|
|
660
|
-
|
|
661
|
-
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
768
|
+
### Further components
|
|
769
|
+
|
|
770
|
+
| Component | Description |
|
|
771
|
+
| ----------------------------------------- | -------------------------------------------------------------------------- |
|
|
772
|
+
| `ColorPicker` | Color selector with a custom palette |
|
|
773
|
+
| `CustomModal` | Simple modal dialog with OK/Cancel |
|
|
774
|
+
| `DeviceTypeSelector` / `DeviceTypeIcon` | Selector and icons for the device types of `@iobroker/type-detector` |
|
|
775
|
+
| `FileBrowser` | Browser for the files of the ioBroker file system |
|
|
776
|
+
| `FileViewer` | Viewer/editor for a single file |
|
|
777
|
+
| `IconPicker` / `IconSelector` | Selection of an icon (base64 or from the icon sets) |
|
|
778
|
+
| `Icon` / `Image` | Renders an icon or an image from any source (base64, URL, UTF-8 character) |
|
|
779
|
+
| `InfoBox` | Colored box for hints, warnings, and errors |
|
|
780
|
+
| `Loader`, `LoaderPT`, `LoaderMV`, ... | Vendor-specific loading animations |
|
|
781
|
+
| `Logo` | Adapter logo with import/export of the configuration |
|
|
782
|
+
| `SaveCloseButtons` | Save and close buttons (used by `GenericApp`) |
|
|
783
|
+
| `Schedule` | Editor for the ioBroker schedule format |
|
|
784
|
+
| `SelectWithIcon` | Select box with icons (e.g., for rooms and functions) |
|
|
785
|
+
| `SimpleCron` / `ComplexCron` | Inline CRON editors |
|
|
786
|
+
| `TabContainer`, `TabHeader`, `TabContent` | Layout components for tabs in the adapter configuration |
|
|
787
|
+
| `TableResize` | Table with resizable columns |
|
|
788
|
+
| `TextWithIcon` | Text with the icon of the object in front |
|
|
789
|
+
| `ToggleThemeMenu` | Menu to switch between the themes |
|
|
790
|
+
| `UploadImage` | Upload with drag-and-drop and cropper |
|
|
791
|
+
| `iobUriParse` / `iobUriRead` | Helpers to parse and read `iob://` URIs |
|
|
792
|
+
|
|
793
|
+
### Module federation
|
|
794
|
+
|
|
795
|
+
The ioBroker admin loads the adapter GUIs as micro-frontends. The list of the packages that must be
|
|
796
|
+
shared is delivered with this package:
|
|
797
|
+
|
|
798
|
+
```js
|
|
799
|
+
const { moduleFederationShared } = require('@iobroker/gui-components/modulefederation.admin.config');
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
## Test GUI
|
|
803
|
+
|
|
804
|
+
The `test-gui` directory contains a vite application to develop and test the components visually.
|
|
805
|
+
It imports directly from `../../src`, so changes are visible immediately:
|
|
806
|
+
|
|
807
|
+
```bash
|
|
808
|
+
cd test-gui
|
|
809
|
+
npm install
|
|
810
|
+
npm start
|
|
811
|
+
```
|
|
812
|
+
|
|
813
|
+
It expects a running ioBroker admin on `127.0.0.1:8081`.
|
|
814
|
+
|
|
815
|
+
## List of adapters that use this library
|
|
816
|
+
|
|
817
|
+
- Admin
|
|
818
|
+
- Backitup
|
|
819
|
+
- iot
|
|
820
|
+
- echarts
|
|
821
|
+
- text2command
|
|
822
|
+
- scenes
|
|
823
|
+
- javascript
|
|
824
|
+
- devices
|
|
825
|
+
- eventlist
|
|
826
|
+
- cameras
|
|
827
|
+
- web
|
|
828
|
+
- vis-2
|
|
829
|
+
- vis-2-widgets-xxx
|
|
830
|
+
- fullcalendar
|
|
831
|
+
- openweathermap
|
|
666
832
|
|
|
667
833
|
## Usability
|
|
668
834
|
|
|
@@ -679,9 +845,10 @@ The icons may not be reused in other projects without the proper flaticon licens
|
|
|
679
845
|
|
|
680
846
|
You can find the migration instructions:
|
|
681
847
|
|
|
682
|
-
-
|
|
683
|
-
-
|
|
684
|
-
-
|
|
848
|
+
- [from adapter-react-v5@8.x to gui-components@10.x](MIGRATION_8_10.md)
|
|
849
|
+
- [from adapter-react-v5@6.x to adapter-react-v5@7.x](MIGRATION_6_7.md)
|
|
850
|
+
- [from adapter-react-v5@5.x to adapter-react-v5@6.x](MIGRATION_5_6.md)
|
|
851
|
+
- [from adapter-react to adapter-react-v5@5.x](MIGRATION_4_5.md)
|
|
685
852
|
|
|
686
853
|
<!--
|
|
687
854
|
Placeholder for the next version (at the beginning of the line):
|
|
@@ -689,747 +856,871 @@ You can find the migration instructions:
|
|
|
689
856
|
-->
|
|
690
857
|
|
|
691
858
|
## Changelog
|
|
692
|
-
###
|
|
859
|
+
### 10.0.1 (2026-07-25)
|
|
860
|
+
|
|
861
|
+
- (@GermanBluefox) BREAKING: Package renamed from `@iobroker/adapter-react-v5` to `@iobroker/gui-components`
|
|
862
|
+
- (@GermanBluefox) BREAKING: React19 + MUI9
|
|
863
|
+
- (@GermanBluefox) BREAKING: Removed `LegacyConnection`. Use `Connection`/`AdminConnection` instead
|
|
864
|
+
- (@GermanBluefox) Used TypeScript 6
|
|
865
|
+
- (@GermanBluefox) Updated README and added the migration guide `MIGRATION_8_10.md`
|
|
866
|
+
|
|
867
|
+
### 8.3.2 (2026-07-22)
|
|
868
|
+
|
|
869
|
+
- (@GermanBluefox) Corrected tooltip if object is wrong
|
|
870
|
+
|
|
871
|
+
### 8.3.1 (2026-07-12)
|
|
872
|
+
|
|
873
|
+
- (@GermanBluefox) Used strict types
|
|
874
|
+
|
|
875
|
+
### 8.2.13 (2026-06-21)
|
|
876
|
+
|
|
877
|
+
- (@GermanBluefox) Updated socket-client package to support web-socket-only mode
|
|
878
|
+
|
|
879
|
+
### 8.2.12 (2026-06-20)
|
|
880
|
+
|
|
881
|
+
- (@GermanBluefox) Corrected InfoBox color
|
|
882
|
+
|
|
883
|
+
### 8.2.11 (2026-06-19)
|
|
884
|
+
|
|
885
|
+
- (@GermanBluefox) Correcting background of state if overloaded
|
|
886
|
+
- (@GermanBluefox) Moved translations for json-config to another package
|
|
887
|
+
|
|
888
|
+
### 8.2.10 (2026-06-16)
|
|
889
|
+
|
|
890
|
+
- (@GermanBluefox) Corrected the folder creation
|
|
891
|
+
|
|
892
|
+
### 8.2.9 (2026-06-12)
|
|
893
|
+
|
|
894
|
+
- (@GermanBluefox) Updated socket-client package to support reverse proxy
|
|
895
|
+
|
|
896
|
+
### 8.2.8 (2026-06-11)
|
|
897
|
+
|
|
898
|
+
- (@GermanBluefox) Added object and file navigation
|
|
899
|
+
|
|
900
|
+
### 8.2.7 (2026-05-29)
|
|
901
|
+
|
|
902
|
+
- (@GermanBluefox) Updated loader
|
|
903
|
+
|
|
904
|
+
### 8.2.6 (2026-05-25)
|
|
905
|
+
|
|
906
|
+
- (@GermanBluefox) Updated loader
|
|
907
|
+
|
|
908
|
+
### 8.2.4 (2026-05-15)
|
|
909
|
+
|
|
910
|
+
- (@GermanBluefox) allowed to define the theme by query parameter `?theme=dark` or `?theme=light` or `?theme=auto`
|
|
911
|
+
|
|
912
|
+
### 8.2.2 (2026-04-21)
|
|
913
|
+
|
|
914
|
+
- (@GermanBluefox) Force using React 18
|
|
915
|
+
|
|
916
|
+
### 8.2.0 (2026-04-17)
|
|
917
|
+
|
|
918
|
+
- (@GermanBluefox) Added support for a new post-message about the theme change
|
|
919
|
+
- (@GermanBluefox) Updated packages
|
|
920
|
+
|
|
921
|
+
### 8.1.8 (2026-04-11)
|
|
922
|
+
|
|
923
|
+
- (@GermanBluefox) Fixed some minor bugs
|
|
924
|
+
|
|
925
|
+
### 8.1.6 (2026-03-24)
|
|
926
|
+
|
|
927
|
+
- (@GermanBluefox) Added translations
|
|
928
|
+
|
|
929
|
+
### 8.1.4 (2026-03-21)
|
|
930
|
+
|
|
931
|
+
- (@GermanBluefox) Optimisations of the translation engine
|
|
932
|
+
|
|
933
|
+
### 8.1.3 (2026-03-09)
|
|
934
|
+
|
|
935
|
+
- (@GermanBluefox) Added export of the types icons
|
|
936
|
+
|
|
937
|
+
### 8.1.2 (2026-03-05)
|
|
938
|
+
|
|
939
|
+
- (@GermanBluefox) Updated packages
|
|
940
|
+
|
|
941
|
+
### 8.1.1 (2026-03-02)
|
|
942
|
+
|
|
943
|
+
- (@GermanBluefox) Force react 18
|
|
944
|
+
|
|
945
|
+
### 8.0.21 (2026-02-10)
|
|
946
|
+
|
|
947
|
+
- (@GermanBluefox) Added translations
|
|
948
|
+
|
|
949
|
+
### 8.0.20 (2026-02-09)
|
|
950
|
+
|
|
951
|
+
- (@GermanBluefox) Small typing fixes
|
|
952
|
+
|
|
953
|
+
### 8.0.17 (2026-01-27)
|
|
954
|
+
|
|
955
|
+
- (@GermanBluefox) Added percentage icon
|
|
956
|
+
|
|
957
|
+
### 8.0.16 (2025-12-16)
|
|
958
|
+
|
|
959
|
+
- (@GermanBluefox) Updated packages and used standard GitHub actions
|
|
960
|
+
|
|
961
|
+
### 8.0.13 (2025-11-13)
|
|
962
|
+
|
|
963
|
+
- (@GermanBluefox) Changed theme for NW
|
|
964
|
+
|
|
965
|
+
### 8.0.12 (2025-11-09)
|
|
966
|
+
|
|
967
|
+
- (@GermanBluefox) Fixing ref for Icon and TabContent components
|
|
968
|
+
|
|
969
|
+
### 8.0.9 (2025-11-02)
|
|
970
|
+
|
|
971
|
+
- (@GermanBluefox) Added possibility to import objects from text
|
|
972
|
+
- (@GermanBluefox) Object browser was split into a few files
|
|
973
|
+
|
|
974
|
+
### 8.0.7 (2025-10-28)
|
|
975
|
+
|
|
976
|
+
- (@GermanBluefox) Added `updateSmartNameEx` function to Utils
|
|
977
|
+
- (@GermanBluefox) Corrected expert mode toggle in object browser
|
|
978
|
+
|
|
979
|
+
### 8.0.5 (2025-10-25)
|
|
980
|
+
|
|
981
|
+
- (@GermanBluefox) Fixed filter in the object browser
|
|
982
|
+
|
|
983
|
+
### 8.0.3 (2025-10-23)
|
|
693
984
|
|
|
694
|
-
-
|
|
985
|
+
- (@GermanBluefox) Split packages from mono-repo
|
|
695
986
|
|
|
696
987
|
### 7.2.3 (2024-10-05)
|
|
697
988
|
|
|
698
|
-
-
|
|
989
|
+
- (@GermanBluefox) Corrected error in the simple CRON dialog
|
|
699
990
|
|
|
700
991
|
### 7.2.2 (2024-10-04)
|
|
701
992
|
|
|
702
|
-
-
|
|
993
|
+
- (@GermanBluefox) Small layout change for Icon Picker
|
|
703
994
|
|
|
704
995
|
### 7.2.1 (2024-09-30)
|
|
705
996
|
|
|
706
|
-
-
|
|
707
|
-
-
|
|
997
|
+
- (@GermanBluefox) Allowed using an array of elements in dialogs
|
|
998
|
+
- (@GermanBluefox) Allowed to use `socket.iob` instead of `socket.io`
|
|
708
999
|
|
|
709
1000
|
### 7.1.4 (2024-09-15)
|
|
710
1001
|
|
|
711
|
-
-
|
|
1002
|
+
- (@GermanBluefox) Updated socket classes
|
|
712
1003
|
|
|
713
1004
|
### 7.1.3 (2024-09-15)
|
|
714
1005
|
|
|
715
|
-
-
|
|
716
|
-
-
|
|
1006
|
+
- (@GermanBluefox) Updated socket classes
|
|
1007
|
+
- (@GermanBluefox) Added additional confirmation dialog for CRONs for every minute execution
|
|
717
1008
|
|
|
718
1009
|
### 7.1.1 (2024-09-13)
|
|
719
1010
|
|
|
720
|
-
-
|
|
1011
|
+
- (@GermanBluefox) Corrected TabContainer
|
|
721
1012
|
|
|
722
1013
|
### 7.1.0 (2024-09-12)
|
|
723
1014
|
|
|
724
|
-
-
|
|
725
|
-
-
|
|
1015
|
+
- (@GermanBluefox) Optimized the icon picker
|
|
1016
|
+
- (@GermanBluefox) Used common eslint-config
|
|
726
1017
|
|
|
727
1018
|
### 7.0.2 (2024-09-10)
|
|
728
1019
|
|
|
729
|
-
-
|
|
730
|
-
-
|
|
1020
|
+
- (@GermanBluefox) Showed the context menu under cursor position in the object browser
|
|
1021
|
+
- (@GermanBluefox) Added links to aliases in the object browser
|
|
731
1022
|
|
|
732
1023
|
### 7.0.1 (2024-08-29)
|
|
733
1024
|
|
|
734
|
-
-
|
|
735
|
-
-
|
|
1025
|
+
- (@GermanBluefox) Updated the object browser
|
|
1026
|
+
- (@GermanBluefox) Used MUI Library 6.0
|
|
736
1027
|
|
|
737
1028
|
### 6.1.10 (2024-08-30)
|
|
738
1029
|
|
|
739
|
-
-
|
|
1030
|
+
- (@GermanBluefox) Updated the object browser
|
|
740
1031
|
|
|
741
1032
|
### 6.1.9 (2024-08-14)
|
|
742
1033
|
|
|
743
|
-
-
|
|
1034
|
+
- (@GermanBluefox) Updated JSON schema
|
|
744
1035
|
|
|
745
1036
|
### 6.1.8 (2024-08-03)
|
|
746
1037
|
|
|
747
|
-
-
|
|
1038
|
+
- (@GermanBluefox) Added translations
|
|
748
1039
|
|
|
749
1040
|
### 6.1.6 (2024-07-23)
|
|
750
1041
|
|
|
751
|
-
-
|
|
1042
|
+
- (@GermanBluefox) Optimize package
|
|
752
1043
|
|
|
753
1044
|
### 6.1.5 (2024-07-20)
|
|
754
1045
|
|
|
755
|
-
-
|
|
1046
|
+
- (@GermanBluefox) Added sources to package
|
|
756
1047
|
|
|
757
1048
|
### 6.1.3 (2024-07-20)
|
|
758
1049
|
|
|
759
|
-
-
|
|
1050
|
+
- (@GermanBluefox) Better typing of legacy connection
|
|
760
1051
|
|
|
761
1052
|
### 6.1.1 (2024-07-16)
|
|
762
1053
|
|
|
763
|
-
-
|
|
1054
|
+
- (@GermanBluefox) Added translations
|
|
764
1055
|
|
|
765
1056
|
### 6.1.0 (2024-07-15)
|
|
766
1057
|
|
|
767
|
-
-
|
|
1058
|
+
- (@GermanBluefox) Replace by CRON to text the package to `cronstrue`
|
|
768
1059
|
|
|
769
1060
|
### 6.0.19 (2024-07-14)
|
|
770
1061
|
|
|
771
|
-
-
|
|
1062
|
+
- (@GermanBluefox) added some packages for federation
|
|
772
1063
|
|
|
773
1064
|
### 6.0.17 (2024-07-14)
|
|
774
1065
|
|
|
775
|
-
-
|
|
776
|
-
-
|
|
1066
|
+
- (@GermanBluefox) Allowed playing mp3 files in the file browser
|
|
1067
|
+
- (@GermanBluefox) Corrected jump by object selection
|
|
777
1068
|
|
|
778
1069
|
### 6.0.14 (2024-07-07)
|
|
779
1070
|
|
|
780
|
-
-
|
|
1071
|
+
- (@GermanBluefox) Corrected theme type selection
|
|
781
1072
|
|
|
782
1073
|
### 6.0.13 (2024-06-30)
|
|
783
1074
|
|
|
784
|
-
-
|
|
1075
|
+
- (@GermanBluefox) Corrected color picker
|
|
785
1076
|
|
|
786
1077
|
### 6.0.12 (2024-06-29)
|
|
787
1078
|
|
|
788
|
-
-
|
|
1079
|
+
- (@GermanBluefox) Added support for the overrides in the theme
|
|
789
1080
|
|
|
790
1081
|
### 6.0.10 (2024-06-27)
|
|
791
1082
|
|
|
792
|
-
-
|
|
793
|
-
-
|
|
1083
|
+
- (@GermanBluefox) Added translation
|
|
1084
|
+
- (@GermanBluefox) Mobile object browser improved
|
|
794
1085
|
|
|
795
1086
|
### 6.0.9 (2024-06-26)
|
|
796
1087
|
|
|
797
|
-
-
|
|
1088
|
+
- (@GermanBluefox) Corrected Icons
|
|
798
1089
|
|
|
799
1090
|
### 6.0.8 (2024-06-26)
|
|
800
1091
|
|
|
801
|
-
-
|
|
802
|
-
-
|
|
1092
|
+
- (@GermanBluefox) Corrected types of the select ID dialog
|
|
1093
|
+
- (@GermanBluefox) Made the tooltips neutral to the pointer events
|
|
803
1094
|
|
|
804
1095
|
### 6.0.6 (2024-06-24)
|
|
805
1096
|
|
|
806
|
-
-
|
|
807
|
-
-
|
|
1097
|
+
- (@GermanBluefox) Synchronised with admin
|
|
1098
|
+
- (@GermanBluefox) Added translations for time scheduler
|
|
808
1099
|
|
|
809
1100
|
### 6.0.4 (2024-06-21)
|
|
810
1101
|
|
|
811
|
-
-
|
|
812
|
-
-
|
|
1102
|
+
- (@GermanBluefox) Removed the usage of `withStyles` in favor of `sx` and `style` properties (see [Migration from v5 to v6](#migration-from-v5-to-v6)
|
|
1103
|
+
- (@GermanBluefox) (BREAKING) Higher version of `@mui/material` (5.15.20) is used
|
|
813
1104
|
|
|
814
1105
|
### 5.0.8 (2024-06-15)
|
|
815
1106
|
|
|
816
|
-
-
|
|
1107
|
+
- (@GermanBluefox) Added `modulefederation.admin.config.js` for module federation
|
|
817
1108
|
|
|
818
1109
|
### 5.0.5 (2024-06-10)
|
|
819
1110
|
|
|
820
|
-
-
|
|
1111
|
+
- (@GermanBluefox) Sources were synchronized with admin
|
|
821
1112
|
|
|
822
1113
|
### 5.0.4 (2024-06-07)
|
|
823
1114
|
|
|
824
|
-
-
|
|
1115
|
+
- (@GermanBluefox) Added better typing
|
|
825
1116
|
|
|
826
1117
|
### 5.0.2 (2024-05-30)
|
|
827
1118
|
|
|
828
|
-
-
|
|
829
|
-
-
|
|
1119
|
+
- (@GermanBluefox) Added better typing
|
|
1120
|
+
- (@GermanBluefox) Json-Config is now a separate package and must be installed additionally
|
|
830
1121
|
|
|
831
1122
|
### 5.0.0 (2024-05-29)
|
|
832
1123
|
|
|
833
|
-
-
|
|
834
|
-
-
|
|
835
|
-
-
|
|
1124
|
+
- (@GermanBluefox) Types are now exported
|
|
1125
|
+
- (@GermanBluefox) Translator renamed to Translate
|
|
1126
|
+
- (@GermanBluefox) Breaking: Theme renamed to IobTheme because of the naming conflict
|
|
836
1127
|
|
|
837
1128
|
### 4.13.24 (2024-05-25)
|
|
838
1129
|
|
|
839
|
-
-
|
|
1130
|
+
- (@GermanBluefox) Updated packages
|
|
840
1131
|
|
|
841
|
-
-
|
|
842
|
-
-
|
|
1132
|
+
- ### 4.13.22 (2024-05-23)
|
|
1133
|
+
- (@GermanBluefox) Updated packages
|
|
843
1134
|
|
|
844
1135
|
### 4.13.20 (2024-05-22)
|
|
845
1136
|
|
|
846
|
-
-
|
|
847
|
-
-
|
|
848
|
-
-
|
|
1137
|
+
- (@GermanBluefox) Better types added
|
|
1138
|
+
- (@GermanBluefox) updated theme definitions
|
|
1139
|
+
- (@GermanBluefox) corrected dates in cron dialog
|
|
849
1140
|
|
|
850
1141
|
### 4.13.14 (2024-05-19)
|
|
851
1142
|
|
|
852
|
-
-
|
|
1143
|
+
- (@GermanBluefox) Updated packages
|
|
853
1144
|
|
|
854
1145
|
### 4.13.13 (2024-05-09)
|
|
855
1146
|
|
|
856
|
-
-
|
|
1147
|
+
- (@GermanBluefox) Updated ioBroker types
|
|
857
1148
|
|
|
858
1149
|
### 4.13.12 (2024-05-06)
|
|
859
1150
|
|
|
860
|
-
-
|
|
1151
|
+
- (@GermanBluefox) All files are migrated to TypeScript
|
|
861
1152
|
|
|
862
1153
|
### 4.13.11 (2024-04-23)
|
|
863
1154
|
|
|
864
|
-
-
|
|
1155
|
+
- (@GermanBluefox) Corrected the size of icons
|
|
865
1156
|
|
|
866
1157
|
### 4.13.10 (2024-04-22)
|
|
867
1158
|
|
|
868
|
-
-
|
|
1159
|
+
- (@GermanBluefox) Migrated all icons to TypeScript
|
|
869
1160
|
|
|
870
1161
|
### 4.13.9 (2024-04-20)
|
|
871
1162
|
|
|
872
|
-
-
|
|
1163
|
+
- (@GermanBluefox) Updated socket-client package
|
|
873
1164
|
|
|
874
1165
|
### 4.13.8 (2024-04-19)
|
|
875
1166
|
|
|
876
|
-
-
|
|
1167
|
+
- (@GermanBluefox) Corrected CRON selector
|
|
877
1168
|
|
|
878
1169
|
### 4.13.7 (2024-04-19)
|
|
879
1170
|
|
|
880
|
-
-
|
|
1171
|
+
- (@GermanBluefox) Migrated ColorPicker to TypeScript
|
|
881
1172
|
|
|
882
1173
|
### 4.13.6 (2024-04-11)
|
|
883
1174
|
|
|
884
|
-
-
|
|
885
|
-
-
|
|
1175
|
+
- (@GermanBluefox) Migrated TreeTable to TypeScript
|
|
1176
|
+
- (@GermanBluefox) corrected the object subscription
|
|
886
1177
|
|
|
887
1178
|
### 4.13.5 (2024-04-02)
|
|
888
1179
|
|
|
889
|
-
-
|
|
890
|
-
-
|
|
1180
|
+
- (@GermanBluefox) used new connection classes
|
|
1181
|
+
- (@GermanBluefox) Improved the `SelectID` dialog
|
|
891
1182
|
|
|
892
1183
|
### 4.13.3 (2024-04-01)
|
|
893
1184
|
|
|
894
|
-
-
|
|
1185
|
+
- (@GermanBluefox) used new connection classes
|
|
895
1186
|
|
|
896
1187
|
### 4.12.3 (2024-03-30)
|
|
897
1188
|
|
|
898
|
-
-
|
|
1189
|
+
- (@GermanBluefox) Migrated legacy connection to TypeScript
|
|
899
1190
|
|
|
900
1191
|
### 4.12.2 (2024-03-25)
|
|
901
1192
|
|
|
902
|
-
-
|
|
1193
|
+
- (@GermanBluefox) Added support for remote cloud
|
|
903
1194
|
|
|
904
1195
|
### 4.11.6 (2024-03-19)
|
|
905
1196
|
|
|
906
|
-
-
|
|
1197
|
+
- (@GermanBluefox) Corrected rendering of LoaderMV
|
|
907
1198
|
|
|
908
1199
|
### 4.11.4 (2024-03-18)
|
|
909
1200
|
|
|
910
|
-
-
|
|
1201
|
+
- (@GermanBluefox) Corrected types of IconPicker
|
|
911
1202
|
|
|
912
1203
|
### 4.11.3 (2024-03-17)
|
|
913
1204
|
|
|
914
|
-
-
|
|
1205
|
+
- (@GermanBluefox) Made filters for the file selector dialog optional
|
|
915
1206
|
|
|
916
1207
|
### 4.11.2 (2024-03-16)
|
|
917
1208
|
|
|
918
|
-
-
|
|
1209
|
+
- (@GermanBluefox) Migrated GenericApp to TypeScript
|
|
919
1210
|
|
|
920
1211
|
### 4.10.4 (2024-03-16)
|
|
921
1212
|
|
|
922
|
-
-
|
|
1213
|
+
- (@GermanBluefox) Migrated some components to TypeScript
|
|
923
1214
|
|
|
924
1215
|
### 4.10.1 (2024-03-11)
|
|
925
1216
|
|
|
926
|
-
-
|
|
1217
|
+
- (@GermanBluefox) Migrated some components to TypeScript
|
|
927
1218
|
|
|
928
1219
|
### 4.9.11 (2024-03-08)
|
|
929
1220
|
|
|
930
|
-
-
|
|
1221
|
+
- (foxriver76) type GenericApp socket correctly
|
|
931
1222
|
|
|
932
1223
|
### 4.9.10 (2024-02-21)
|
|
933
1224
|
|
|
934
|
-
-
|
|
935
|
-
-
|
|
1225
|
+
- (@GermanBluefox) translations
|
|
1226
|
+
- (@GermanBluefox) updated JSON config
|
|
936
1227
|
|
|
937
1228
|
### 4.9.9 (2024-02-16)
|
|
938
1229
|
|
|
939
|
-
-
|
|
1230
|
+
- (foxriver76) also check plugin state of instance to see if Sentry is explicitly disabled
|
|
940
1231
|
|
|
941
1232
|
### 4.9.8 (2024-02-13)
|
|
942
1233
|
|
|
943
|
-
-
|
|
1234
|
+
- (@GermanBluefox) allowed hiding wizard in cron dialog
|
|
944
1235
|
|
|
945
1236
|
### 4.9.7 (2024-02-03)
|
|
946
1237
|
|
|
947
|
-
-
|
|
1238
|
+
- (foxriver76) allow passing down the instance number do avoid determining from url
|
|
948
1239
|
|
|
949
1240
|
### 4.9.5 (2024-01-01)
|
|
950
1241
|
|
|
951
|
-
-
|
|
1242
|
+
- (foxriver76) make `copyToClipboard` event parameter optional
|
|
952
1243
|
|
|
953
1244
|
### 4.9.4 (2024-01-01)
|
|
954
1245
|
|
|
955
|
-
-
|
|
1246
|
+
- (foxriver76) try to fix `SelectID` scrolling
|
|
956
1247
|
|
|
957
1248
|
### 4.9.2 (2023-12-30)
|
|
958
1249
|
|
|
959
|
-
-
|
|
1250
|
+
- (foxriver76) bump version of `@iobroker/json-config`
|
|
960
1251
|
|
|
961
1252
|
### 4.9.1 (2023-12-22)
|
|
962
1253
|
|
|
963
|
-
-
|
|
1254
|
+
- (foxriver76) `@iobroker/json-config` moved to real dependencies
|
|
964
1255
|
|
|
965
1256
|
### 4.9.0 (2023-12-22)
|
|
966
1257
|
|
|
967
|
-
-
|
|
968
|
-
-
|
|
1258
|
+
- (foxriver76) migrate to `@iobroker/json-config` module to have a single point of truth
|
|
1259
|
+
- (@GermanBluefox) Allowed using of `filterFunc` as string
|
|
969
1260
|
|
|
970
1261
|
### 4.8.1 (2023-12-14)
|
|
971
1262
|
|
|
972
|
-
-
|
|
1263
|
+
- (@GermanBluefox) Added Device manager to JSON Config
|
|
973
1264
|
|
|
974
1265
|
### 4.7.15 (2023-12-12)
|
|
975
1266
|
|
|
976
|
-
-
|
|
1267
|
+
- (@GermanBluefox) Corrected parsing of a text
|
|
977
1268
|
|
|
978
1269
|
### 4.7.13 (2023-12-10)
|
|
979
1270
|
|
|
980
|
-
-
|
|
1271
|
+
- (@GermanBluefox) Added possibility to define the root style and embedded property
|
|
981
1272
|
|
|
982
1273
|
### 4.7.11 (2023-12-06)
|
|
983
1274
|
|
|
984
|
-
-
|
|
1275
|
+
- (@GermanBluefox) Extended color picker with "noInputField" option
|
|
985
1276
|
|
|
986
1277
|
### 4.7.9 (2023-12-04)
|
|
987
1278
|
|
|
988
|
-
-
|
|
1279
|
+
- (@GermanBluefox) Corrected the icon picker
|
|
989
1280
|
|
|
990
1281
|
### 4.7.8 (2023-12-04)
|
|
991
1282
|
|
|
992
|
-
-
|
|
1283
|
+
- (foxriver76) port to `@iobroker/types`
|
|
993
1284
|
|
|
994
1285
|
### 4.7.6 (2023-11-29)
|
|
995
1286
|
|
|
996
|
-
-
|
|
1287
|
+
- (@GermanBluefox) Added translations
|
|
997
1288
|
|
|
998
1289
|
### 4.7.5 (2023-11-28)
|
|
999
1290
|
|
|
1000
|
-
-
|
|
1291
|
+
- (@GermanBluefox) Corrected subscribe on objects in the legacy connection
|
|
1001
1292
|
|
|
1002
1293
|
### 4.7.4 (2023-11-23)
|
|
1003
1294
|
|
|
1004
|
-
-
|
|
1005
|
-
-
|
|
1295
|
+
- (@GermanBluefox) Updated packages
|
|
1296
|
+
- (@GermanBluefox) Made getStates method in legacy connection compatible with new one
|
|
1006
1297
|
|
|
1007
1298
|
### 4.7.3 (2023-11-08)
|
|
1008
1299
|
|
|
1009
|
-
-
|
|
1300
|
+
- (@GermanBluefox) Updated packages
|
|
1010
1301
|
|
|
1011
1302
|
### 4.7.2 (2023-11-03)
|
|
1012
1303
|
|
|
1013
|
-
-
|
|
1014
|
-
-
|
|
1304
|
+
- (foxriver76) fixed the problem with color picker, where editing TextField was buggy
|
|
1305
|
+
- (foxriver76) fixed light mode color of a path in FileBrowser
|
|
1015
1306
|
|
|
1016
1307
|
### 4.7.0 (2023-10-31)
|
|
1017
1308
|
|
|
1018
|
-
-
|
|
1019
|
-
-
|
|
1309
|
+
- (@GermanBluefox) Synced with admin
|
|
1310
|
+
- (@GermanBluefox) Added GIF to image files
|
|
1020
1311
|
|
|
1021
1312
|
### 4.6.7 (2023-10-19)
|
|
1022
1313
|
|
|
1023
|
-
-
|
|
1314
|
+
- (@GermanBluefox) Added return value for `subscribeOnInstance` for Connection class
|
|
1024
1315
|
|
|
1025
1316
|
### 4.6.6 (2023-10-13)
|
|
1026
1317
|
|
|
1027
|
-
-
|
|
1318
|
+
- (@GermanBluefox) Fixed the legacy connection
|
|
1028
1319
|
|
|
1029
1320
|
### 4.6.5 (2023-10-12)
|
|
1030
1321
|
|
|
1031
|
-
-
|
|
1322
|
+
- (foxriver76) fixed object browser with date
|
|
1032
1323
|
|
|
1033
1324
|
### 4.6.4 (2023-10-11)
|
|
1034
1325
|
|
|
1035
|
-
-
|
|
1326
|
+
- (@GermanBluefox) Updated the packages
|
|
1036
1327
|
|
|
1037
1328
|
### 4.6.3 (2023-10-09)
|
|
1038
1329
|
|
|
1039
|
-
-
|
|
1040
|
-
-
|
|
1330
|
+
- (@GermanBluefox) Just updated the packages
|
|
1331
|
+
- (@GermanBluefox) Synced with admin
|
|
1041
1332
|
|
|
1042
1333
|
### 4.6.2 (2023-09-29)
|
|
1043
1334
|
|
|
1044
|
-
-
|
|
1335
|
+
- (@GermanBluefox) Experimental feature added: update states on re-subscribe
|
|
1045
1336
|
|
|
1046
1337
|
### 4.5.5 (2023-09-27)
|
|
1047
1338
|
|
|
1048
|
-
-
|
|
1339
|
+
- (@GermanBluefox) Added export for IconNoIcon
|
|
1049
1340
|
|
|
1050
1341
|
### 4.5.4 (2023-09-17)
|
|
1051
1342
|
|
|
1052
|
-
-
|
|
1343
|
+
- (@GermanBluefox) Added the restricting to folder property for select file dialog
|
|
1053
1344
|
|
|
1054
1345
|
### 4.5.3 (2023-08-20)
|
|
1055
1346
|
|
|
1056
|
-
-
|
|
1347
|
+
- (foxriver76) fixed CSS classes of TableResize, see https://github.com/ioBroker/ioBroker.admin/issues/1860
|
|
1057
1348
|
|
|
1058
1349
|
### 4.5.2 (2023-08-20)
|
|
1059
1350
|
|
|
1060
|
-
-
|
|
1351
|
+
- (foxriver76) added missing export of TableResize
|
|
1061
1352
|
|
|
1062
1353
|
### 4.5.1 (2023-08-19)
|
|
1063
1354
|
|
|
1064
|
-
-
|
|
1355
|
+
- (foxriver76) fix dialog TextInput
|
|
1065
1356
|
|
|
1066
1357
|
### 4.5.0 (2023-08-18)
|
|
1067
1358
|
|
|
1068
|
-
-
|
|
1359
|
+
- (@GermanBluefox) Synchronize components with admin
|
|
1069
1360
|
|
|
1070
1361
|
### 4.4.8 (2023-08-17)
|
|
1071
1362
|
|
|
1072
|
-
-
|
|
1363
|
+
- (@GermanBluefox) Added translations
|
|
1073
1364
|
|
|
1074
1365
|
### 4.4.7 (2023-08-10)
|
|
1075
1366
|
|
|
1076
|
-
-
|
|
1077
|
-
-
|
|
1367
|
+
- (@GermanBluefox) Added `subscribeStateAsync` method to wait for answer
|
|
1368
|
+
- (@GermanBluefox) Added support for arrays for un/subscriptions
|
|
1078
1369
|
|
|
1079
1370
|
### 4.4.5 (2023-08-01)
|
|
1080
1371
|
|
|
1081
|
-
-
|
|
1372
|
+
- (@GermanBluefox) Updated packages
|
|
1082
1373
|
|
|
1083
1374
|
### 4.3.3 (2023-07-28)
|
|
1084
1375
|
|
|
1085
|
-
-
|
|
1376
|
+
- (@GermanBluefox) Added translations
|
|
1086
1377
|
|
|
1087
1378
|
### 4.3.0 (2023-07-19)
|
|
1088
1379
|
|
|
1089
|
-
-
|
|
1090
|
-
-
|
|
1091
|
-
-
|
|
1092
|
-
-
|
|
1380
|
+
- (@GermanBluefox) Updated packages
|
|
1381
|
+
- (@GermanBluefox) Added translations
|
|
1382
|
+
- (@GermanBluefox) Synced object browser
|
|
1383
|
+
- (@GermanBluefox) formatting
|
|
1093
1384
|
|
|
1094
1385
|
### 4.2.1 (2023-07-17)
|
|
1095
1386
|
|
|
1096
|
-
-
|
|
1097
|
-
-
|
|
1387
|
+
- (@GermanBluefox) Updated packages
|
|
1388
|
+
- (@GermanBluefox) Added translations
|
|
1098
1389
|
|
|
1099
1390
|
### 4.2.0 (2023-07-07)
|
|
1100
1391
|
|
|
1101
|
-
-
|
|
1102
|
-
-
|
|
1392
|
+
- (@GermanBluefox) Updated packages
|
|
1393
|
+
- (@GermanBluefox) Added new method `getObjectsById` to the socket communication
|
|
1103
1394
|
|
|
1104
1395
|
### 4.1.2 (2023-06-20)
|
|
1105
1396
|
|
|
1106
|
-
-
|
|
1397
|
+
- (@GermanBluefox) Allowed setting theme name directly by theme toggle
|
|
1107
1398
|
|
|
1108
1399
|
### 4.1.0 (2023-05-10)
|
|
1109
1400
|
|
|
1110
|
-
-
|
|
1401
|
+
- (@GermanBluefox) `craco-module-federation.js` was added. For node 16
|
|
1111
1402
|
|
|
1112
1403
|
### 4.0.27 (2023-05-09)
|
|
1113
1404
|
|
|
1114
|
-
-
|
|
1405
|
+
- (@GermanBluefox) Allowed showing only specific root in SelectIDDialog
|
|
1115
1406
|
|
|
1116
1407
|
### 4.0.26 (2023-05-08)
|
|
1117
1408
|
|
|
1118
|
-
-
|
|
1409
|
+
- (@GermanBluefox) Added IDs to the buttons in the dialog for GUI tests
|
|
1119
1410
|
|
|
1120
1411
|
### 4.0.25 (2023-04-23)
|
|
1121
1412
|
|
|
1122
|
-
-
|
|
1413
|
+
- (@GermanBluefox) Extended `TextWithIcon` with defined color and icon
|
|
1123
1414
|
|
|
1124
1415
|
### 4.0.24 (2023-04-03)
|
|
1125
1416
|
|
|
1126
|
-
-
|
|
1417
|
+
- (@GermanBluefox) Updated the file selector in tile mode
|
|
1127
1418
|
|
|
1128
1419
|
### 4.0.23 (2023-03-27)
|
|
1129
1420
|
|
|
1130
|
-
-
|
|
1421
|
+
- (@GermanBluefox) Added translations
|
|
1131
1422
|
|
|
1132
1423
|
### 4.0.22 (2023-03-22)
|
|
1133
1424
|
|
|
1134
|
-
-
|
|
1425
|
+
- (@GermanBluefox) Re-Activate legacy connection
|
|
1135
1426
|
|
|
1136
1427
|
### 4.0.21 (2023-03-22)
|
|
1137
1428
|
|
|
1138
|
-
-
|
|
1429
|
+
- (@GermanBluefox) Added translations
|
|
1139
1430
|
|
|
1140
1431
|
### 4.0.20 (2023-03-21)
|
|
1141
1432
|
|
|
1142
|
-
-
|
|
1433
|
+
- (@GermanBluefox) Color picker was improved
|
|
1143
1434
|
|
|
1144
1435
|
### 4.0.19 (2023-03-20)
|
|
1145
1436
|
|
|
1146
|
-
-
|
|
1147
|
-
-
|
|
1437
|
+
- (@GermanBluefox) Packages were updated
|
|
1438
|
+
- (@GermanBluefox) Added new translations
|
|
1148
1439
|
|
|
1149
1440
|
### 4.0.18 (2023-03-16)
|
|
1150
1441
|
|
|
1151
|
-
-
|
|
1442
|
+
- (@GermanBluefox) Packages were updated
|
|
1152
1443
|
|
|
1153
1444
|
### 4.0.17 (2023-03-15)
|
|
1154
1445
|
|
|
1155
|
-
-
|
|
1156
|
-
-
|
|
1446
|
+
- (@GermanBluefox) Added translations
|
|
1447
|
+
- (@GermanBluefox) Added port controller to JSON config
|
|
1157
1448
|
|
|
1158
1449
|
### 4.0.15 (2023-03-12)
|
|
1159
1450
|
|
|
1160
|
-
-
|
|
1451
|
+
- (@GermanBluefox) Updated the object browser and file browser
|
|
1161
1452
|
|
|
1162
1453
|
### 4.0.14 (2023-03-03)
|
|
1163
1454
|
|
|
1164
|
-
-
|
|
1455
|
+
- (@GermanBluefox) added handler of alert messages
|
|
1165
1456
|
|
|
1166
1457
|
### 4.0.13 (2023-02-15)
|
|
1167
1458
|
|
|
1168
|
-
-
|
|
1459
|
+
- (@GermanBluefox) Corrected the theme button
|
|
1169
1460
|
|
|
1170
1461
|
### 4.0.12 (2023-02-15)
|
|
1171
1462
|
|
|
1172
|
-
-
|
|
1463
|
+
- (@GermanBluefox) made the fix for `echarts`
|
|
1173
1464
|
|
|
1174
1465
|
### 4.0.11 (2023-02-14)
|
|
1175
1466
|
|
|
1176
|
-
-
|
|
1177
|
-
-
|
|
1467
|
+
- (@GermanBluefox) Updated packages
|
|
1468
|
+
- (@GermanBluefox) The `chartReady` event was omitted
|
|
1178
1469
|
|
|
1179
1470
|
### 4.0.10 (2023-02-10)
|
|
1180
1471
|
|
|
1181
|
-
-
|
|
1182
|
-
-
|
|
1472
|
+
- (@GermanBluefox) Updated packages
|
|
1473
|
+
- (@GermanBluefox) made the fix for `material`
|
|
1183
1474
|
|
|
1184
1475
|
### 4.0.9 (2023-02-02)
|
|
1185
1476
|
|
|
1186
|
-
-
|
|
1477
|
+
- (@GermanBluefox) Updated packages
|
|
1187
1478
|
|
|
1188
1479
|
### 4.0.8 (2022-12-19)
|
|
1189
1480
|
|
|
1190
|
-
-
|
|
1481
|
+
- (@GermanBluefox) Extended socket with `log` command
|
|
1191
1482
|
|
|
1192
1483
|
### 4.0.6 (2022-12-19)
|
|
1193
1484
|
|
|
1194
|
-
-
|
|
1485
|
+
- (@GermanBluefox) Corrected URL for the connection
|
|
1195
1486
|
|
|
1196
1487
|
### 4.0.5 (2022-12-14)
|
|
1197
1488
|
|
|
1198
|
-
-
|
|
1489
|
+
- (@GermanBluefox) Added support of custom palette for color picker
|
|
1199
1490
|
|
|
1200
1491
|
### 4.0.2 (2022-12-01)
|
|
1201
1492
|
|
|
1202
|
-
-
|
|
1493
|
+
- (@GermanBluefox) use `@iobroker/socket-client` instead of `Connection.tsx`
|
|
1203
1494
|
|
|
1204
1495
|
### 3.5.3 (2022-11-30)
|
|
1205
1496
|
|
|
1206
|
-
-
|
|
1497
|
+
- (@GermanBluefox) Improved `renderTextWithA` function to support `<b>` and `<i>` tags
|
|
1207
1498
|
|
|
1208
1499
|
### 3.5.2 (2022-11-30)
|
|
1209
1500
|
|
|
1210
|
-
-
|
|
1501
|
+
- (@GermanBluefox) updated json config component
|
|
1211
1502
|
|
|
1212
1503
|
### 3.4.1 (2022-11-29)
|
|
1213
1504
|
|
|
1214
|
-
-
|
|
1505
|
+
- (@GermanBluefox) Added button text for message dialog
|
|
1215
1506
|
|
|
1216
1507
|
### 3.4.0 (2022-11-29)
|
|
1217
1508
|
|
|
1218
|
-
-
|
|
1509
|
+
- (@GermanBluefox) Added file selector
|
|
1219
1510
|
|
|
1220
1511
|
### 3.3.0 (2022-11-26)
|
|
1221
1512
|
|
|
1222
|
-
-
|
|
1513
|
+
- (@GermanBluefox) Added subscribe on files
|
|
1223
1514
|
|
|
1224
1515
|
### 3.2.7 (2022-11-13)
|
|
1225
1516
|
|
|
1226
|
-
-
|
|
1517
|
+
- (@GermanBluefox) Added `fullWidth` property to `Dialog`
|
|
1227
1518
|
|
|
1228
1519
|
### 3.2.6 (2022-11-08)
|
|
1229
1520
|
|
|
1230
|
-
-
|
|
1521
|
+
- (xXBJXx) Improved TreeTable component
|
|
1231
1522
|
|
|
1232
1523
|
### 3.2.5 (2022-11-08)
|
|
1233
1524
|
|
|
1234
|
-
-
|
|
1525
|
+
- (@GermanBluefox) Added the role filter for the object browser
|
|
1235
1526
|
|
|
1236
1527
|
### 3.2.4 (2022-11-03)
|
|
1237
1528
|
|
|
1238
|
-
-
|
|
1529
|
+
- (@GermanBluefox) Added support for alfa channel for `invertColor`
|
|
1239
1530
|
|
|
1240
1531
|
### 3.2.3 (2022-10-26)
|
|
1241
1532
|
|
|
1242
|
-
-
|
|
1533
|
+
- (@GermanBluefox) Corrected expert mode for object browser
|
|
1243
1534
|
|
|
1244
1535
|
### 3.2.2 (2022-10-25)
|
|
1245
1536
|
|
|
1246
|
-
-
|
|
1537
|
+
- (@GermanBluefox) Added support for prefixes for translations
|
|
1247
1538
|
|
|
1248
1539
|
### 3.2.1 (2022-10-24)
|
|
1249
1540
|
|
|
1250
|
-
-
|
|
1541
|
+
- (@GermanBluefox) Corrected color inversion
|
|
1251
1542
|
|
|
1252
1543
|
### 3.2.0 (2022-10-19)
|
|
1253
1544
|
|
|
1254
|
-
-
|
|
1545
|
+
- (@GermanBluefox) Added ukrainian translation
|
|
1255
1546
|
|
|
1256
1547
|
### 3.1.35 (2022-10-17)
|
|
1257
1548
|
|
|
1258
|
-
-
|
|
1549
|
+
- (@GermanBluefox) small changes for material
|
|
1259
1550
|
|
|
1260
1551
|
### 3.1.34 (2022-08-24)
|
|
1261
1552
|
|
|
1262
|
-
-
|
|
1553
|
+
- (@GermanBluefox) Implemented fallback to english by translations
|
|
1263
1554
|
|
|
1264
1555
|
### 3.1.33 (2022-08-24)
|
|
1265
1556
|
|
|
1266
|
-
-
|
|
1557
|
+
- (@GermanBluefox) Added support for onchange flag
|
|
1267
1558
|
|
|
1268
1559
|
### 3.1.30 (2022-08-23)
|
|
1269
1560
|
|
|
1270
|
-
-
|
|
1271
|
-
-
|
|
1561
|
+
- (@GermanBluefox) Added method `getCompactSystemRepositories`
|
|
1562
|
+
- (@GermanBluefox) corrected error in `ObjectBrowser`
|
|
1272
1563
|
|
|
1273
1564
|
### 3.1.27 (2022-08-01)
|
|
1274
1565
|
|
|
1275
|
-
-
|
|
1566
|
+
- (@GermanBluefox) Disable file editing in FileViewer
|
|
1276
1567
|
|
|
1277
1568
|
### 3.1.26 (2022-08-01)
|
|
1278
1569
|
|
|
1279
|
-
-
|
|
1280
|
-
-
|
|
1570
|
+
- (@GermanBluefox) Added translations
|
|
1571
|
+
- (@GermanBluefox) JSON schema was extended with missing definitions
|
|
1281
1572
|
|
|
1282
1573
|
### 3.1.24 (2022-07-28)
|
|
1283
1574
|
|
|
1284
|
-
-
|
|
1575
|
+
- (@GermanBluefox) Updated file browser and object browser
|
|
1285
1576
|
|
|
1286
1577
|
### 3.1.23 (2022-07-25)
|
|
1287
1578
|
|
|
1288
|
-
-
|
|
1579
|
+
- (@GermanBluefox) Extend custom filter for object selector
|
|
1289
1580
|
|
|
1290
1581
|
### 3.1.22 (2022-07-22)
|
|
1291
1582
|
|
|
1292
|
-
-
|
|
1583
|
+
- (@GermanBluefox) Added i18n tools for development
|
|
1293
1584
|
|
|
1294
1585
|
### 3.1.20 (2022-07-14)
|
|
1295
1586
|
|
|
1296
|
-
-
|
|
1587
|
+
- (@GermanBluefox) Allowed showing the select dialog with the expert mode enabled
|
|
1297
1588
|
|
|
1298
1589
|
### 3.1.19 (2022-07-08)
|
|
1299
1590
|
|
|
1300
|
-
-
|
|
1591
|
+
- (@GermanBluefox) Allowed extending translations for all languages together
|
|
1301
1592
|
|
|
1302
1593
|
### 3.1.18 (2022-07-06)
|
|
1303
1594
|
|
|
1304
|
-
-
|
|
1595
|
+
- (@GermanBluefox) Added translation
|
|
1305
1596
|
|
|
1306
1597
|
### 3.1.17 (2022-07-05)
|
|
1307
1598
|
|
|
1308
|
-
-
|
|
1599
|
+
- (@GermanBluefox) Deactivate JSON editor for JSONConfig because of space
|
|
1309
1600
|
|
|
1310
1601
|
### 3.1.16 (2022-06-27)
|
|
1311
1602
|
|
|
1312
|
-
-
|
|
1603
|
+
- (@GermanBluefox) Update object browser
|
|
1313
1604
|
|
|
1314
1605
|
### 3.1.15 (2022-06-27)
|
|
1315
1606
|
|
|
1316
|
-
-
|
|
1607
|
+
- (@GermanBluefox) Allowed using of spaces in name
|
|
1317
1608
|
|
|
1318
1609
|
### 3.1.14 (2022-06-23)
|
|
1319
1610
|
|
|
1320
|
-
-
|
|
1611
|
+
- (@GermanBluefox) Added translations
|
|
1321
1612
|
|
|
1322
1613
|
### 3.1.11 (2022-06-22)
|
|
1323
1614
|
|
|
1324
|
-
-
|
|
1615
|
+
- (@GermanBluefox) Added preparations for iobroker cloud
|
|
1325
1616
|
|
|
1326
1617
|
### 3.1.10 (2022-06-22)
|
|
1327
1618
|
|
|
1328
|
-
-
|
|
1619
|
+
- (@GermanBluefox) Added translations
|
|
1329
1620
|
|
|
1330
1621
|
### 3.1.9 (2022-06-20)
|
|
1331
1622
|
|
|
1332
|
-
-
|
|
1623
|
+
- (@GermanBluefox) Allowed working behind reverse proxy
|
|
1333
1624
|
|
|
1334
1625
|
### 3.1.7 (2022-06-19)
|
|
1335
1626
|
|
|
1336
|
-
-
|
|
1627
|
+
- (@GermanBluefox) Added file select dialog
|
|
1337
1628
|
|
|
1338
1629
|
### 3.1.3 (2022-06-13)
|
|
1339
1630
|
|
|
1340
|
-
-
|
|
1631
|
+
- (@GermanBluefox) Added table with resized headers
|
|
1341
1632
|
|
|
1342
1633
|
### 3.1.2 (2022-06-09)
|
|
1343
1634
|
|
|
1344
|
-
-
|
|
1635
|
+
- (@GermanBluefox) Added new document icon (read only)
|
|
1345
1636
|
|
|
1346
1637
|
### 3.1.1 (2022-06-09)
|
|
1347
1638
|
|
|
1348
|
-
-
|
|
1639
|
+
- (@GermanBluefox) Allowed working behind reverse proxy
|
|
1349
1640
|
|
|
1350
1641
|
### 3.1.0 (2022-06-07)
|
|
1351
1642
|
|
|
1352
|
-
-
|
|
1643
|
+
- (@GermanBluefox) Some german texts were corrected
|
|
1353
1644
|
|
|
1354
1645
|
### 3.0.17 (2022-06-03)
|
|
1355
1646
|
|
|
1356
|
-
-
|
|
1647
|
+
- (@GermanBluefox) Allowed calling getAdapterInstances not for admin too
|
|
1357
1648
|
|
|
1358
1649
|
### 3.0.15 (2022-06-01)
|
|
1359
1650
|
|
|
1360
|
-
-
|
|
1651
|
+
- (@GermanBluefox) Updated JsonConfigComponent: password, table
|
|
1361
1652
|
|
|
1362
1653
|
### 3.0.14 (2022-05-25)
|
|
1363
1654
|
|
|
1364
|
-
-
|
|
1655
|
+
- (@GermanBluefox) Added ConfigGeneric to import
|
|
1365
1656
|
|
|
1366
1657
|
### 3.0.7 (2022-05-25)
|
|
1367
1658
|
|
|
1368
|
-
-
|
|
1659
|
+
- (@GermanBluefox) Made the module definitions
|
|
1369
1660
|
|
|
1370
1661
|
### 3.0.6 (2022-05-25)
|
|
1371
1662
|
|
|
1372
|
-
-
|
|
1663
|
+
- (@GermanBluefox) Added JsonConfigComponent
|
|
1373
1664
|
|
|
1374
1665
|
### 2.1.11 (2022-05-24)
|
|
1375
1666
|
|
|
1376
|
-
-
|
|
1667
|
+
- (@GermanBluefox) Update file browser. It supports now the file changed events.
|
|
1377
1668
|
|
|
1378
1669
|
### 2.1.10 (2022-05-24)
|
|
1379
1670
|
|
|
1380
|
-
-
|
|
1671
|
+
- (@GermanBluefox) Corrected object browser
|
|
1381
1672
|
|
|
1382
1673
|
### 2.1.9 (2022-05-16)
|
|
1383
1674
|
|
|
1384
|
-
-
|
|
1675
|
+
- (@GermanBluefox) Corrected expert mode in object browser
|
|
1385
1676
|
|
|
1386
1677
|
### 2.1.7 (2022-05-09)
|
|
1387
1678
|
|
|
1388
|
-
-
|
|
1389
|
-
-
|
|
1679
|
+
- (@GermanBluefox) Changes were synchronized with adapter-react-v5
|
|
1680
|
+
- (@GermanBluefox) Added `I18n.disableWarning` method
|
|
1390
1681
|
|
|
1391
1682
|
### 2.1.6 (2022-03-28)
|
|
1392
1683
|
|
|
1393
|
-
-
|
|
1394
|
-
-
|
|
1684
|
+
- (@GermanBluefox) Added `log` method to connection
|
|
1685
|
+
- (@GermanBluefox) Corrected translations
|
|
1395
1686
|
|
|
1396
1687
|
### 2.1.1 (2022-03-27)
|
|
1397
1688
|
|
|
1398
|
-
-
|
|
1689
|
+
- (@GermanBluefox) Corrected error in TreeTable
|
|
1399
1690
|
|
|
1400
1691
|
### 2.1.0 (2022-03-26)
|
|
1401
1692
|
|
|
1402
|
-
-
|
|
1693
|
+
- (@GermanBluefox) BREAKING_CHANGE: Corrected error with readFile(base64=false)
|
|
1403
1694
|
|
|
1404
1695
|
### 2.0.0 (2022-03-26)
|
|
1405
1696
|
|
|
1406
|
-
-
|
|
1697
|
+
- (@GermanBluefox) Initial version
|
|
1407
1698
|
|
|
1408
1699
|
### 0.1.0 (2022-03-23)
|
|
1409
1700
|
|
|
1410
|
-
-
|
|
1701
|
+
- (@GermanBluefox) Fixed theme errors
|
|
1411
1702
|
|
|
1412
1703
|
### 0.0.4 (2022-03-22)
|
|
1413
1704
|
|
|
1414
|
-
-
|
|
1705
|
+
- (@GermanBluefox) Fixed eslint warnings
|
|
1415
1706
|
|
|
1416
1707
|
### 0.0.3 (2022-03-19)
|
|
1417
1708
|
|
|
1418
|
-
-
|
|
1709
|
+
- (@GermanBluefox) beta version
|
|
1419
1710
|
|
|
1420
1711
|
### 0.0.2 (2022-02-24)
|
|
1421
1712
|
|
|
1422
|
-
-
|
|
1713
|
+
- (@GermanBluefox) try to publish a first version
|
|
1423
1714
|
|
|
1424
1715
|
### 0.0.1 (2022-02-24)
|
|
1425
1716
|
|
|
1426
|
-
-
|
|
1717
|
+
- initial commit
|
|
1427
1718
|
|
|
1428
1719
|
## License
|
|
1429
1720
|
|
|
1430
1721
|
The MIT License (MIT)
|
|
1431
1722
|
|
|
1432
|
-
Copyright
|
|
1723
|
+
Copyright © 2019-2026 @GermanBluefox <dogafox@gmail.com>
|
|
1433
1724
|
|
|
1434
1725
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
1435
1726
|
of this software and associated documentation files (the "Software"), to deal
|