@iobroker/adapter-react-v5 7.1.3 → 7.2.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/README.md CHANGED
@@ -1,1437 +1,1446 @@
1
- # Help ReactJS classes for adapter config
2
-
3
- You can find demo on https://github.com/ioBroker/adapter-react-demo
4
-
5
- ## Getting started
6
-
7
- If you want to create the configuration page with ReactJS:
8
-
9
- 1. Create github repo for adapter.
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
- ```
16
- "@iobroker/adapter-react-v5": "^7.1.3",
17
- ```
18
- Versions can be higher.
19
- So your `src/package.json` should look like:
20
-
21
- ```json
22
- {
23
- "name": "ADAPTERNAME-admin",
24
- "version": "0.1.0",
25
- "private": true,
26
- "dependencies": {
27
- "@iobroker/adapter-react-v5": "^7.1.3",
28
- "@iobroker/build-tools": "^1.0.0",
29
- "@iobroker/eslint-config": "^0.1.2",
30
- "@mui/material": "^6.0.2",
31
- "@mui/icons-material": "^6.0.2",
32
- "@sentry/browser": "^8.28.0",
33
- "babel-eslint": "^10.1.0",
34
- "eslint": "^9.10.0",
35
- "react": "^18.3.1",
36
- "react-dom": "^18.3.1",
37
- "react-scripts": "^5.0.1",
38
- "react-icons": "^5.3.0"
39
- },
40
- "scripts": {
41
- "start": "react-scripts start",
42
- "build": "react-scripts build",
43
- "test": "react-scripts test",
44
- "eject": "react-scripts eject"
45
- },
46
- "eslintConfig": {
47
- "extends": "react-app"
48
- },
49
- "homepage": ".",
50
- "browserslist": [">0.2%", "not dead", "not ie <= 11", "not op_mini all"]
51
- }
52
- ```
53
-
54
- 5. Call in `src`: `npm install`
55
- 6. Copy `tasks.js` into `src`: `cp node_modules/@iobroker/adapter-react-v5/tasks.js tasks.js`
56
- 7. Add scripts to your `package.json` `scripts` section:
57
-
58
- ```json
59
- "scripts": {
60
- "0-clean": "node tasks --0-clean",
61
- "1-npm": "node tasks --1-npm",
62
- "2-build": "node tasks --2-build",
63
- "3-copy": "node tasks --3-copy",
64
- "4-patch": "node tasks --4-patch",
65
- "build": "node tasks"
66
- }
67
- ```
68
-
69
- 7. Start your dummy application `npm run start` for developing or build with `npm run build` and
70
- copy files in `build` directory to `www` or to `admin`. In the admin you must rename `index.html` to `index_m.html`.
71
- 8. You can do that with `npm` tasks: `npm run build`
72
-
73
- ## Development
74
-
75
- 1. Add `socket.io` to `public/index.html`.
76
- After
77
-
78
- ```html
79
- <link
80
- rel="manifest"
81
- href="%PUBLIC_URL%/manifest.json"
82
- />
83
- ```
84
-
85
- insert
86
-
87
- ```html
88
- <script>
89
- const script = document.createElement('script');
90
- window.registerSocketOnLoad = function (cb) {
91
- window.socketLoadedHandler = cb;
92
- };
93
- const parts = (window.location.search || '').replace(/^\?/, '').split('&');
94
- const query = {};
95
- parts.forEach(item => {
96
- const [name, val] = item.split('=');
97
- query[decodeURIComponent(name)] = val !== undefined ? decodeURIComponent(val) : true;
98
- });
99
- script.onload = function () {
100
- typeof window.socketLoadedHandler === 'function' && window.socketLoadedHandler();
101
- };
102
- script.src =
103
- window.location.port === '3000'
104
- ? window.location.protocol +
105
- '//' +
106
- (query.host || window.location.hostname) +
107
- ':' +
108
- (query.port || 8081) +
109
- '/lib/js/socket.io.js'
110
- : '%PUBLIC_URL%/../../lib/js/socket.io.js';
111
-
112
- document.head.appendChild(script);
113
- </script>
114
- ```
115
-
116
- 3. Add to App.js constructor initialization for I18n:
117
-
118
- ```jsx
119
- class App extends GenericApp {
120
- constructor(props) {
121
- const extendedProps = { ...props };
122
- extendedProps.encryptedFields = ['pass']; // this parameter will be encrypted and decrypted automatically
123
- extendedProps.translations = {
124
- en: require('./i18n/en'),
125
- de: require('./i18n/de'),
126
- ru: require('./i18n/ru'),
127
- pt: require('./i18n/pt'),
128
- nl: require('./i18n/nl'),
129
- fr: require('./i18n/fr'),
130
- it: require('./i18n/it'),
131
- es: require('./i18n/es'),
132
- pl: require('./i18n/pl'),
133
- uk: require('./i18n/uk'),
134
- 'zh-cn': require('./i18n/zh-cn'),
135
- };
136
- // get actual admin port
137
- extendedProps.socket = { port: parseInt(window.location.port, 10) };
138
-
139
- // Only if close, save buttons are not required at the bottom (e.g. if admin tab)
140
- // extendedProps.bottomButtons = false;
141
-
142
- // only for debug purposes
143
- if (extendedProps.socket.port === 3000) {
144
- extendedProps.socket.port = 8081;
145
- }
146
-
147
- // allow to manage GenericApp the sentry initialisation or do not set the sentryDSN if no sentry available
148
- extendedProps.sentryDSN = 'https://yyy@sentry.iobroker.net/xx';
149
-
150
- super(extendedProps);
151
- }
152
- // ...
153
- }
154
- ```
155
-
156
- 4. Replace `index.js` with the following code to support themes:
157
-
158
- ```jsx
159
- import React from 'react';
160
- import { createRoot } from 'react-dom/client';
161
- import * as serviceWorker from './serviceWorker';
162
-
163
- import './index.css';
164
- import App from './App';
165
- import { version } from '../package.json';
166
-
167
- console.log(`iobroker.scenes@${version}`);
168
-
169
- const container = document.getElementById('root');
170
- const root = createRoot(container);
171
- root.render(<App />);
172
-
173
- // If you want your app to work offline and load faster, you can change
174
- // unregister() to register() below. Note this comes with some pitfalls.
175
- // Learn more about service workers: http://bit.ly/CRA-PWA
176
- serviceWorker.unregister();
177
- ```
178
-
179
- 5. Add to App.js encoding and decoding of values:
180
-
181
- ```jsx
182
- class App extends GenericApp {
183
- // ...
184
- onPrepareLoad(settings) {
185
- settings.pass = this.decode(settings.pass);
186
- }
187
- onPrepareSave(settings) {
188
- settings.pass = this.encode(settings.pass);
189
- }
190
- }
191
- ```
192
-
193
- 6. The optional step is to validate the data to be saved:
194
-
195
- ```jsx
196
- onPrepareSave(settings) {
197
- super.onPrepareSave(settings);
198
- if (DATA_INVALID) {
199
- return false; // configuration will not be saved
200
- } else {
201
- return true;
202
- }
203
- }
204
- ```
205
-
206
- ## Components
207
-
208
- ### Connection.tsx
209
-
210
- This is a non-React class to provide the communication for socket connection with the server.
211
-
212
- ### GenericApp.tsx
213
-
214
- ### i18n.ts
215
-
216
- ### Theme.tsx
217
-
218
- ### Dialogs
219
-
220
- Some dialogs are predefined and could be used out of the box.
221
-
222
- #### Confirm.tsx
223
-
224
- <!-- TODO: Provide screenshot here -->
225
-
226
- Usage:
227
-
228
- ```jsx
229
- import React from 'react';
230
- import { I18n, Confirm as ConfirmDialog } from '@iobroker/adapter-react-v5';
231
-
232
- class ExportImportDialog extends React.Component {
233
- constructor(props) {
234
- super(props);
235
-
236
- this.state = {
237
- confirmDialog: false,
238
- };
239
- }
240
-
241
- renderConfirmDialog() {
242
- if (!this.state.confirmDialog) {
243
- return null;
244
- }
245
- return (
246
- <ConfirmDialog
247
- title={I18n.t('Scene will be overwritten.')}
248
- text={I18n.t('All data will be lost. Confirm?')}
249
- ok={I18n.t('Yes')}
250
- cancel={I18n.t('Cancel')}
251
- suppressQuestionMinutes={5}
252
- dialogName="myConfirmDialogThatCouldBeSuppressed"
253
- suppressText={I18n.t('Suppress question for next %s minutes', 5)}
254
- onClose={isYes => {
255
- this.setState({ confirmDialog: false });
256
- }}
257
- />
258
- );
259
- }
260
- render() {
261
- return (
262
- <div>
263
- <Button onClick={() => this.setState({ confirmDialog: true })}>Click</Button>
264
- {this.renderConfirmDialog()}
265
- </div>
266
- );
267
- }
268
- }
269
-
270
- export default ExportImportDialog;
271
- ```
272
-
273
- #### Error.tsx
274
-
275
- <!-- TODO: Provide screenshot here -->
276
-
277
- #### Message.tsx
278
-
279
- <!-- TODO: Provide screenshot here -->
280
-
281
- ```jsx
282
- renderMessage() {
283
- if (this.state.showMessage) {
284
- return <Message
285
- text={this.state.showMessage}
286
- onClose={() => this.setState({showMessage: false})}
287
- />;
288
- } else {
289
- return null;
290
- }
291
- }
292
- ```
293
-
294
- #### SelectID.tsx
295
-
296
- ![Logo](img/selectID.png)
297
-
298
- ```jsx
299
- import { SelectID as DialogSelectID } from '@iobroker/adapter-react-v5';
300
-
301
- class MyComponent extends Component {
302
- constructor(props) {
303
- super(props);
304
- this.state = {
305
- showSelectId: false,
306
- };
307
- }
308
-
309
- renderSelectIdDialog() {
310
- if (this.state.showSelectId) {
311
- return (
312
- <DialogSelectID
313
- key="tableSelect"
314
- imagePrefix="../.."
315
- dialogName={this.props.adapterName}
316
- themeType={this.props.themeType}
317
- socket={this.props.socket}
318
- statesOnly={true}
319
- selected={this.state.selectIdValue}
320
- onClose={() => this.setState({ showSelectId: false })}
321
- onOk={(selected, name) => {
322
- this.setState({ showSelectId: false, selectIdValue: selected });
323
- }}
324
- />
325
- );
326
- } else {
327
- return null;
328
- }
329
- }
330
- render() {
331
- return renderSelectIdDialog();
332
- }
333
- }
334
- ```
335
-
336
- #### Cron
337
-
338
- Include `"react-text-mask": "^5.4.3",` in package.json.
339
-
340
- <!-- TODO: Provide screenshot here -->
341
-
342
- ```jsx
343
- function renderCron() {
344
- if (!showCron) {
345
- return null;
346
- } else {
347
- return (
348
- <DialogCron
349
- key="dialogCron1"
350
- cron={this.state.cronValue || '* * * * *'}
351
- onClose={() => this.setState({ showCron: false })}
352
- onOk={cronValue => {
353
- this.setState({ cronValue });
354
- }}
355
- />
356
- );
357
- }
358
- }
359
- ```
360
-
361
- ### Components
362
-
363
- #### Utils.tsx
364
-
365
- ##### getObjectNameFromObj
366
-
367
- `getObjectNameFromObj(obj, settings, options, isDesc)`
368
-
369
- Get object name from a single object.
370
-
371
- Usage: `Utils.getObjectNameFromObj(this.objects[id], null, {language: I18n.getLanguage()})`
372
-
373
- ##### getObjectIcon
374
-
375
- `getObjectIcon(id, obj)`
376
-
377
- Get icon from the object.
378
-
379
- Usage:
380
-
381
- ```jsx
382
- const icon = Utils.getObjectIcon(id, this.objects[id]);
383
- return <img src={icon} />;
384
- ```
385
-
386
- ##### isUseBright
387
-
388
- `isUseBright(color, defaultValue)`
389
-
390
- Usage: `
391
-
392
- #### Loader.tsx
393
-
394
- ![Logo](img/loader.png)
395
-
396
- ```jsx
397
- render() {
398
- if (!this.state.loaded) {
399
- return <MuiThemeProvider theme={this.state.theme}>
400
- <Loader theme={this.state.themeType}/>
401
- </MuiThemeProvider>;
402
- }
403
- // render loaded data
404
- }
405
-
406
- ```
407
-
408
- #### Logo.tsx
409
-
410
- ![Logo](img/logo.png)
411
-
412
- ```jsx
413
- render() {
414
- return <form className={this.props.classes.tab}>
415
- <Logo
416
- instance={this.props.instance}
417
- common={this.props.common}
418
- native={this.props.native}
419
- onError={text => this.setState({errorText: text})}
420
- onLoad={this.props.onLoad}
421
- />
422
- ...
423
- </form>;
424
- }
425
- ```
426
-
427
- #### Router.tsx
428
-
429
- #### ObjectBrowser.js
430
-
431
- It is better to use `Dialog/SelectID`, but if you want:
432
-
433
- ![Logo](img/objectBrowser.png)
434
-
435
- ```jsx
436
- <ObjectBrowser
437
- foldersFirst={this.props.foldersFirst}
438
- imagePrefix={this.props.imagePrefix || this.props.prefix} // prefix is for back compatibility
439
- defaultFilters={this.filters}
440
- dialogName={this.dialogName}
441
- showExpertButton={this.props.showExpertButton !== undefined ? this.props.showExpertButton : true}
442
- style={{ width: '100%', height: '100%' }}
443
- columns={this.props.columns || ['name', 'type', 'role', 'room', 'func', 'val']}
444
- types={this.props.types || ['state']}
445
- t={I18n.t}
446
- lang={this.props.lang || I18n.getLanguage()}
447
- socket={this.props.socket}
448
- selected={this.state.selected}
449
- multiSelect={this.props.multiSelect}
450
- notEditable={this.props.notEditable === undefined ? true : this.props.notEditable}
451
- name={this.state.name}
452
- theme={this.props.theme}
453
- themeName={this.props.themeName}
454
- themeType={this.props.themeType}
455
- customFilter={this.props.customFilter}
456
- onFilterChanged={filterConfig => {
457
- this.filters = filterConfig;
458
- window.localStorage.setItem(this.dialogName, JSON.stringify(filterConfig));
459
- }}
460
- onSelect={(selected, name, isDouble) => {
461
- if (JSON.stringify(selected) !== JSON.stringify(this.state.selected)) {
462
- this.setState({ selected, name }, () => isDouble && this.handleOk());
463
- } else if (isDouble) {
464
- this.handleOk();
465
- }
466
- }}
467
- />
468
- ```
469
-
470
- #### TreeTable.ts
471
-
472
- ![Logo](img/tableTree.png)
473
-
474
- ```jsx
475
- // STYLES
476
- const styles = {
477
- tableDiv: {
478
- width: '100%',
479
- overflow: 'hidden',
480
- height: 'calc(100% - 48px)',
481
- },
482
- };
483
- class MyComponent extends Component {
484
- constructor(props) {
485
- super(props);
486
-
487
- this.state = {
488
- data: [
489
- {
490
- id: 'UniqueID1', // required
491
- fieldIdInData: 'Name1',
492
- myType: 'number',
493
- },
494
- {
495
- id: 'UniqueID2', // required
496
- fieldIdInData: 'Name12',
497
- myType: 'string',
498
- },
499
- ],
500
- };
501
-
502
- this.columns = [
503
- {
504
- title: 'Name of field', // required, else it will be "field"
505
- field: 'fieldIdInData', // required
506
- editable: false, // or true [default - true]
507
- cellStyle: {
508
- // CSS style - // optional
509
- maxWidth: '12rem',
510
- overflow: 'hidden',
511
- wordBreak: 'break-word',
512
- },
513
- lookup: {
514
- // optional => edit will be automatically "SELECT"
515
- value1: 'text1',
516
- value2: 'text2',
517
- },
518
- },
519
- {
520
- title: 'Type', // required, else it will be "field"
521
- field: 'myType', // required
522
- editable: true, // or true [default - true]
523
- lookup: {
524
- // optional => edit will be automatically "SELECT"
525
- number: 'Number',
526
- string: 'String',
527
- boolean: 'Boolean',
528
- },
529
- type: 'number/string/color/oid/icon/boolean', // oid=ObjectID,icon=base64-icon
530
- editComponent: props => (
531
- <div>
532
- Prefix&#123; <br />
533
- <textarea
534
- rows={4}
535
- style={{ width: '100%', resize: 'vertical' }}
536
- value={props.value}
537
- onChange={e => props.onChange(e.target.value)}
538
- />
539
- Suffix
540
- </div>
541
- ),
542
- },
543
- ];
544
- }
545
- // renderTable
546
- render() {
547
- return (
548
- <div className={this.props.classes.tableDiv}>
549
- <TreeTable
550
- columns={this.columns}
551
- data={this.state.data}
552
- onUpdate={(newData, oldData) => {
553
- const data = JSON.parse(JSON.stringify(this.state.data));
554
-
555
- // Added new line
556
- if (newData === true) {
557
- // find unique ID
558
- let i = 1;
559
- let id = 'line_' + i;
560
-
561
- // eslint-disable-next-line
562
- while (this.state.data.find(item => item.id === id)) {
563
- i++;
564
- id = 'line_' + i;
565
- }
566
-
567
- data.push({
568
- id,
569
- name: I18n.t('New resource') + '_' + i,
570
- color: '',
571
- icon: '',
572
- unit: '',
573
- price: 0,
574
- });
575
- } else {
576
- // existing line was modifed
577
- const pos = this.state.data.indexOf(oldData);
578
- if (pos !== -1) {
579
- Object.keys(newData).forEach(attr => (data[pos][attr] = newData[attr]));
580
- }
581
- }
582
-
583
- this.setState({ data });
584
- }}
585
- onDelete={oldData => {
586
- console.log('Delete: ' + JSON.stringify(oldData));
587
- const pos = this.state.data.indexOf(oldData);
588
- if (pos !== -1) {
589
- const data = JSON.parse(JSON.stringify(this.state.data));
590
- data.splice(pos, 1);
591
- this.setState({ data });
592
- }
593
- }}
594
- />
595
- </div>
596
- );
597
- }
598
- }
599
- ```
600
-
601
- #### Toast
602
-
603
- <!-- TODO: Provide screenshot here -->
604
-
605
- Toast is not a part of `adapter-react` but it is an example how to use toast in application:
606
-
607
- ```jsx
608
- import { Component } from 'react';
609
- import { Snackbar } from '@mui/material';
610
-
611
- class MyComponent extends Component {
612
- constructor(props) {
613
- super(props);
614
- this.state = {
615
- // ....
616
- toast: '',
617
- };
618
- }
619
-
620
- // ...
621
- renderToast() {
622
- if (!this.state.toast) {
623
- return null;
624
- }
625
- return (
626
- <Snackbar
627
- anchorOrigin={{
628
- vertical: 'bottom',
629
- horizontal: 'left',
630
- }}
631
- open={true}
632
- autoHideDuration={6000}
633
- onClose={() => this.setState({ toast: '' })}
634
- ContentProps={{ 'aria-describedby': 'message-id' }}
635
- message={<span id="message-id">{this.state.toast}</span>}
636
- action={[
637
- <IconButton
638
- key="close"
639
- aria-label="Close"
640
- color="inherit"
641
- className={this.props.classes.close}
642
- onClick={() => this.setState({ toast: '' })}
643
- >
644
- <IconClose />
645
- </IconButton>,
646
- ]}
647
- />
648
- );
649
- }
650
-
651
- render() {
652
- return <div>{this.renderToast()}</div>;
653
- }
654
- }
655
- ```
656
-
657
- ## List of adapters that use adapter-react
658
-
659
- - Admin
660
- - Backitup
661
- - iot
662
- - echarts
663
- - text2command
664
- - scenes
665
- - javascript
666
- - devices
667
- - eventlist
668
- - cameras
669
- - web
670
- - vis-2
671
- - vis-2-widgets-xxx
672
- - fullcalendar
673
- - openweathermap
674
-
675
- ## Usability
676
-
677
- In dialogs, the OK button is first (on the left) and the cancel button is last (on the right)
678
-
679
- ## Used icons
680
-
681
- This project uses icons from [Flaticon](https://www.flaticon.com/).
682
-
683
- ioBroker GmbH has a valid license for all the used icons.
684
- The icons may not be reused in other projects without the proper flaticon license or flaticon subscription.
685
-
686
- ## Migration instructions
687
-
688
- You can find the migration instructions:
689
-
690
- - [from adapter-react-v5@6.x to adapter-react-v5@7.x](MIGRATION_6_7.md)
691
- - [from adapter-react-v5@5.x to adapter-react-v5@6.x](MIGRATION_5_6.md)
692
- - [from adapter-react to adapter-react-v5@5.x](MIGRATION_4_5.md)
693
-
694
- <!--
695
- Placeholder for the next version (at the beginning of the line):
696
- ### **WORK IN PROGRESS**
697
- -->
698
-
699
- ## Changelog
700
- ### 7.1.3 (2024-09-15)
701
-
702
- - (bluefox) Updated socket classes
703
- - (bluefox) Added additional confirmation dialog for CRONs for every minute execution
704
-
705
- ### 7.1.1 (2024-09-13)
706
-
707
- - (bluefox) Corrected TabContainer
708
-
709
- ### 7.1.0 (2024-09-12)
710
-
711
- - (bluefox) Optimized the icon picker
712
- - (bluefox) Used common eslint-config
713
-
714
- ### 7.0.2 (2024-09-10)
715
-
716
- - (bluefox) Showed the context menu under cursor position in the object browser
717
- - (bluefox) Added links to aliases in the object browser
718
-
719
- ### 7.0.1 (2024-08-29)
720
-
721
- - (bluefox) Updated the object browser
722
- - (bluefox) Used MUI Library 6.0
723
-
724
- ### 6.1.10 (2024-08-30)
725
-
726
- - (bluefox) Updated the object browser
727
-
728
- ### 6.1.9 (2024-08-14)
729
-
730
- - (bluefox) Updated JSON schema
731
-
732
- ### 6.1.8 (2024-08-03)
733
-
734
- - (bluefox) Added translations
735
-
736
- ### 6.1.6 (2024-07-23)
737
-
738
- - (bluefox) Optimize package
739
-
740
- ### 6.1.5 (2024-07-20)
741
-
742
- - (bluefox) Added sources to package
743
-
744
- ### 6.1.3 (2024-07-20)
745
-
746
- - (bluefox) Better typing of legacy connection
747
-
748
- ### 6.1.1 (2024-07-16)
749
-
750
- - (bluefox) Added translations
751
-
752
- ### 6.1.0 (2024-07-15)
753
-
754
- - (bluefox) Replace by CRON to text the package to `cronstrue`
755
-
756
- ### 6.0.19 (2024-07-14)
757
-
758
- - (bluefox) added some packages for federation
759
-
760
- ### 6.0.17 (2024-07-14)
761
-
762
- - (bluefox) Allowed playing mp3 files in the file browser
763
- - (bluefox) Corrected jump by object selection
764
-
765
- ### 6.0.14 (2024-07-07)
766
-
767
- - (bluefox) Corrected theme type selection
768
-
769
- ### 6.0.13 (2024-06-30)
770
-
771
- - (bluefox) Corrected color picker
772
-
773
- ### 6.0.12 (2024-06-29)
774
-
775
- - (bluefox) Added support for the overrides in the theme
776
-
777
- ### 6.0.10 (2024-06-27)
778
-
779
- - (bluefox) Added translation
780
- - (bluefox) Mobile object browser improved
781
-
782
- ### 6.0.9 (2024-06-26)
783
-
784
- - (bluefox) Corrected Icons
785
-
786
- ### 6.0.8 (2024-06-26)
787
-
788
- - (bluefox) Corrected types of the select ID dialog
789
- - (bluefox) Made the tooltips neutral to the pointer events
790
-
791
- ### 6.0.6 (2024-06-24)
792
-
793
- - (bluefox) Synchronised with admin
794
- - (bluefox) Added translations for time scheduler
795
-
796
- ### 6.0.4 (2024-06-21)
797
-
798
- - (bluefox) Removed the usage of `withStyles` in favor of `sx` and `style` properties (see [Migration from v5 to v6](#migration-from-v5-to-v6)
799
- - (bluefox) (BREAKING) Higher version of `@mui/material` (5.15.20) is used
800
-
801
- ### 5.0.8 (2024-06-15)
802
-
803
- - (bluefox) Added `modulefederation.admin.config.js` for module federation
804
-
805
- ### 5.0.5 (2024-06-10)
806
-
807
- - (bluefox) Sources were synchronized with admin
808
-
809
- ### 5.0.4 (2024-06-07)
810
-
811
- - (bluefox) Added better typing
812
-
813
- ### 5.0.2 (2024-05-30)
814
-
815
- - (bluefox) Added better typing
816
- - (bluefox) Json-Config is now a separate package and must be installed additionally
817
-
818
- ### 5.0.0 (2024-05-29)
819
-
820
- - (bluefox) Types are now exported
821
- - (bluefox) Translator renamed to Translate
822
- - (bluefox) Breaking: Theme renamed to IobTheme because of the naming conflict
823
-
824
- ### 4.13.24 (2024-05-25)
825
-
826
- - (bluefox) Updated packages
827
-
828
- - ### 4.13.22 (2024-05-23)
829
- - (bluefox) Updated packages
830
-
831
- ### 4.13.20 (2024-05-22)
832
-
833
- - (bluefox) Better types added
834
- - (bluefox) updated theme definitions
835
- - (bluefox) corrected dates in cron dialog
836
-
837
- ### 4.13.14 (2024-05-19)
838
-
839
- - (bluefox) Updated packages
840
-
841
- ### 4.13.13 (2024-05-09)
842
-
843
- - (bluefox) Updated ioBroker types
844
-
845
- ### 4.13.12 (2024-05-06)
846
-
847
- - (bluefox) All files are migrated to Typescript
848
-
849
- ### 4.13.11 (2024-04-23)
850
-
851
- - (bluefox) Corrected the size of icons
852
-
853
- ### 4.13.10 (2024-04-22)
854
-
855
- - (bluefox) Migrated all icons to Typescript
856
-
857
- ### 4.13.9 (2024-04-20)
858
-
859
- - (bluefox) Updated socket-client package
860
-
861
- ### 4.13.8 (2024-04-19)
862
-
863
- - (bluefox) Corrected CRON selector
864
-
865
- ### 4.13.7 (2024-04-19)
866
-
867
- - (bluefox) Migrated ColorPicker to typescript
868
-
869
- ### 4.13.6 (2024-04-11)
870
-
871
- - (bluefox) Migrated TreeTable to typescript
872
- - (bluefox) corrected the object subscription
873
-
874
- ### 4.13.5 (2024-04-02)
875
-
876
- - (bluefox) used new connection classes
877
- - (bluefox) Improved the `SelectID` dialog
878
-
879
- ### 4.13.3 (2024-04-01)
880
-
881
- - (bluefox) used new connection classes
882
-
883
- ### 4.12.3 (2024-03-30)
884
-
885
- - (bluefox) Migrated legacy connection to typescript
886
-
887
- ### 4.12.2 (2024-03-25)
888
-
889
- - (bluefox) Added support for remote cloud
890
-
891
- ### 4.11.6 (2024-03-19)
892
-
893
- - (bluefox) Corrected rendering of LoaderMV
894
-
895
- ### 4.11.4 (2024-03-18)
896
-
897
- - (bluefox) Corrected types of IconPicker
898
-
899
- ### 4.11.3 (2024-03-17)
900
-
901
- - (bluefox) Made filters for the file selector dialog optional
902
-
903
- ### 4.11.2 (2024-03-16)
904
-
905
- - (bluefox) Migrated GenericApp to typescript
906
-
907
- ### 4.10.4 (2024-03-16)
908
-
909
- - (bluefox) Migrated some components to typescript
910
-
911
- ### 4.10.1 (2024-03-11)
912
-
913
- - (bluefox) Migrated some components to typescript
914
-
915
- ### 4.9.11 (2024-03-08)
916
-
917
- - (foxriver76) type GenericApp socket correctly
918
-
919
- ### 4.9.10 (2024-02-21)
920
-
921
- - (bluefox) translations
922
- - (bluefox) updated JSON config
923
-
924
- ### 4.9.9 (2024-02-16)
925
-
926
- - (foxriver76) also check plugin state of instance to see if Sentry is explicitly disabled
927
-
928
- ### 4.9.8 (2024-02-13)
929
-
930
- - (bluefox) allowed hiding wizard in cron dialog
931
-
932
- ### 4.9.7 (2024-02-03)
933
-
934
- - (foxriver76) allow passing down the instance number do avoid determining from url
935
-
936
- ### 4.9.5 (2024-01-01)
937
-
938
- - (foxriver76) make `copyToClipboard` event parameter optional
939
-
940
- ### 4.9.4 (2024-01-01)
941
-
942
- - (foxriver76) try to fix `SelectID` scrolling
943
-
944
- ### 4.9.2 (2023-12-30)
945
-
946
- - (foxriver76) bump version of `@iobroker/json-config`
947
-
948
- ### 4.9.1 (2023-12-22)
949
-
950
- - (foxriver76) `@iobroker/json-config` moved to real dependencies
951
-
952
- ### 4.9.0 (2023-12-22)
953
-
954
- - (foxriver76) migrate to `@iobroker/json-config` module to have a single point of truth
955
- - (bluefox) Allowed using of `filterFunc` as string
956
-
957
- ### 4.8.1 (2023-12-14)
958
-
959
- - (bluefox) Added Device manager to JSON Config
960
-
961
- ### 4.7.15 (2023-12-12)
962
-
963
- - (bluefox) Corrected parsing of a text
964
-
965
- ### 4.7.13 (2023-12-10)
966
-
967
- - (bluefox) Added possibility to define the root style and embedded property
968
-
969
- ### 4.7.11 (2023-12-06)
970
-
971
- - (bluefox) Extended color picker with "noInputField" option
972
-
973
- ### 4.7.9 (2023-12-04)
974
-
975
- - (bluefox) Corrected the icon picker
976
-
977
- ### 4.7.8 (2023-12-04)
978
-
979
- - (foxriver76) port to `@iobroker/types`
980
-
981
- ### 4.7.6 (2023-11-29)
982
-
983
- - (bluefox) Added translations
984
-
985
- ### 4.7.5 (2023-11-28)
986
-
987
- - (bluefox) Corrected subscribe on objects in the legacy connection
988
-
989
- ### 4.7.4 (2023-11-23)
990
-
991
- - (bluefox) Updated packages
992
- - (bluefox) Made getStates method in legacy connection compatible with new one
993
-
994
- ### 4.7.3 (2023-11-08)
995
-
996
- - (bluefox) Updated packages
997
-
998
- ### 4.7.2 (2023-11-03)
999
-
1000
- - (foxriver76) fixed problem with color picker, where editing TextField was buggy
1001
- - (foxriver76) fixed light mode color of a path in FileBrowser
1002
-
1003
- ### 4.7.0 (2023-10-31)
1004
-
1005
- - (bluefox) Synced with admin
1006
- - (bluefox) Added GIF to image files
1007
-
1008
- ### 4.6.7 (2023-10-19)
1009
-
1010
- - (bluefox) Added return value for `subscribeOnInstance` for Connection class
1011
-
1012
- ### 4.6.6 (2023-10-13)
1013
-
1014
- - (bluefox) Fixed the legacy connection
1015
-
1016
- ### 4.6.5 (2023-10-12)
1017
-
1018
- - (foxriver76) fixed object browser with date
1019
-
1020
- ### 4.6.4 (2023-10-11)
1021
-
1022
- - (bluefox) Updated the packages
1023
-
1024
- ### 4.6.3 (2023-10-09)
1025
-
1026
- - (bluefox) Just updated the packages
1027
- - (bluefox) Synced with admin
1028
-
1029
- ### 4.6.2 (2023-09-29)
1030
-
1031
- - (bluefox) Experimental feature added: update states on re-subscribe
1032
-
1033
- ### 4.5.5 (2023-09-27)
1034
-
1035
- - (bluefox) Added export for IconNoIcon
1036
-
1037
- ### 4.5.4 (2023-09-17)
1038
-
1039
- - (bluefox) Added the restricting to folder property for select file dialog
1040
-
1041
- ### 4.5.3 (2023-08-20)
1042
-
1043
- - (foxriver76) fixed css classes of TableResize, see https://github.com/ioBroker/ioBroker.admin/issues/1860
1044
-
1045
- ### 4.5.2 (2023-08-20)
1046
-
1047
- - (foxriver76) added missing export of TableResize
1048
-
1049
- ### 4.5.1 (2023-08-19)
1050
-
1051
- - (foxriver76) fix dialog TextInput
1052
-
1053
- ### 4.5.0 (2023-08-18)
1054
-
1055
- - (bluefox) Synchronize components with admin
1056
-
1057
- ### 4.4.8 (2023-08-17)
1058
-
1059
- - (bluefox) Added translations
1060
-
1061
- ### 4.4.7 (2023-08-10)
1062
-
1063
- - (bluefox) Added `subscribeStateAsync` method to wait for answer
1064
- - (bluefox) Added support for arrays for un/subscriptions
1065
-
1066
- ### 4.4.5 (2023-08-01)
1067
-
1068
- - (bluefox) Updated packages
1069
-
1070
- ### 4.3.3 (2023-07-28)
1071
-
1072
- - (bluefox) Added translations
1073
-
1074
- ### 4.3.0 (2023-07-19)
1075
-
1076
- - (bluefox) Updated packages
1077
- - (bluefox) Added translations
1078
- - (bluefox) Synced object browser
1079
- - (bluefox) formatting
1080
-
1081
- ### 4.2.1 (2023-07-17)
1082
-
1083
- - (bluefox) Updated packages
1084
- - (bluefox) Added translations
1085
-
1086
- ### 4.2.0 (2023-07-07)
1087
-
1088
- - (bluefox) Updated packages
1089
- - (bluefox) Added new method `getObjectsById` to the socket communication
1090
-
1091
- ### 4.1.2 (2023-06-20)
1092
-
1093
- - (bluefox) Allowed setting theme name directly by theme toggle
1094
-
1095
- ### 4.1.0 (2023-05-10)
1096
-
1097
- - (bluefox) `craco-module-federation.js` was added. For node 16
1098
-
1099
- ### 4.0.27 (2023-05-09)
1100
-
1101
- - (bluefox) Allowed showing only specific root in SelectIDDialog
1102
-
1103
- ### 4.0.26 (2023-05-08)
1104
-
1105
- - (bluefox) Added IDs to the buttons in the dialog for GUI tests
1106
-
1107
- ### 4.0.25 (2023-04-23)
1108
-
1109
- - (bluefox) Extended `TextWithIcon` with defined color and icon
1110
-
1111
- ### 4.0.24 (2023-04-03)
1112
-
1113
- - (bluefox) Updated the file selector in tile mode
1114
-
1115
- ### 4.0.23 (2023-03-27)
1116
-
1117
- - (bluefox) Added translations
1118
-
1119
- ### 4.0.22 (2023-03-22)
1120
-
1121
- - (bluefox) Re-Activate legacy connection
1122
-
1123
- ### 4.0.21 (2023-03-22)
1124
-
1125
- - (bluefox) Added translations
1126
-
1127
- ### 4.0.20 (2023-03-21)
1128
-
1129
- - (bluefox) Color picker was improved
1130
-
1131
- ### 4.0.19 (2023-03-20)
1132
-
1133
- - (bluefox) Packages were updated
1134
- - (bluefox) Added new translations
1135
-
1136
- ### 4.0.18 (2023-03-16)
1137
-
1138
- - (bluefox) Packages were updated
1139
-
1140
- ### 4.0.17 (2023-03-15)
1141
-
1142
- - (bluefox) Added translations
1143
- - (bluefox) Added port controller to JSON config
1144
-
1145
- ### 4.0.15 (2023-03-12)
1146
-
1147
- - (bluefox) Updated the object browser and file browser
1148
-
1149
- ### 4.0.14 (2023-03-03)
1150
-
1151
- - (bluefox) added handler of alert messages
1152
-
1153
- ### 4.0.13 (2023-02-15)
1154
-
1155
- - (bluefox) Corrected the theme button
1156
-
1157
- ### 4.0.12 (2023-02-15)
1158
-
1159
- - (bluefox) made the fix for `echarts`
1160
-
1161
- ### 4.0.11 (2023-02-14)
1162
-
1163
- - (bluefox) Updated packages
1164
- - (bluefox) The `chartReady` event was omitted
1165
-
1166
- ### 4.0.10 (2023-02-10)
1167
-
1168
- - (bluefox) Updated packages
1169
- - (bluefox) made the fix for `material`
1170
-
1171
- ### 4.0.9 (2023-02-02)
1172
-
1173
- - (bluefox) Updated packages
1174
-
1175
- ### 4.0.8 (2022-12-19)
1176
-
1177
- - (bluefox) Extended socket with `log` command
1178
-
1179
- ### 4.0.6 (2022-12-19)
1180
-
1181
- - (bluefox) Corrected URL for the connection
1182
-
1183
- ### 4.0.5 (2022-12-14)
1184
-
1185
- - (bluefox) Added support of custom palette for color picker
1186
-
1187
- ### 4.0.2 (2022-12-01)
1188
-
1189
- - (bluefox) use `@iobroker/socket-client` instead of `Connection.tsx`
1190
-
1191
- ### 3.5.3 (2022-11-30)
1192
-
1193
- - (bluefox) Improved `renderTextWithA` function to support `<b>` and `<i>` tags
1194
-
1195
- ### 3.5.2 (2022-11-30)
1196
-
1197
- - (bluefox) updated json config component
1198
-
1199
- ### 3.4.1 (2022-11-29)
1200
-
1201
- - (bluefox) Added button text for message dialog
1202
-
1203
- ### 3.4.0 (2022-11-29)
1204
-
1205
- - (bluefox) Added file selector
1206
-
1207
- ### 3.3.0 (2022-11-26)
1208
-
1209
- - (bluefox) Added subscribe on files
1210
-
1211
- ### 3.2.7 (2022-11-13)
1212
-
1213
- - (bluefox) Added `fullWidth` property to `Dialog`
1214
-
1215
- ### 3.2.6 (2022-11-08)
1216
-
1217
- - (xXBJXx) Improved TreeTable component
1218
-
1219
- ### 3.2.5 (2022-11-08)
1220
-
1221
- - (bluefox) Added the role filter for the object browser
1222
-
1223
- ### 3.2.4 (2022-11-03)
1224
-
1225
- - (bluefox) Added support for alfa channel for `invertColor`
1226
-
1227
- ### 3.2.3 (2022-10-26)
1228
-
1229
- - (bluefox) Corrected expert mode for object browser
1230
-
1231
- ### 3.2.2 (2022-10-25)
1232
-
1233
- - (bluefox) Added support for prefixes for translations
1234
-
1235
- ### 3.2.1 (2022-10-24)
1236
-
1237
- - (bluefox) Corrected color inversion
1238
-
1239
- ### 3.2.0 (2022-10-19)
1240
-
1241
- - (bluefox) Added ukrainian translation
1242
-
1243
- ### 3.1.35 (2022-10-17)
1244
-
1245
- - (bluefox) small changes for material
1246
-
1247
- ### 3.1.34 (2022-08-24)
1248
-
1249
- - (bluefox) Implemented fallback to english by translations
1250
-
1251
- ### 3.1.33 (2022-08-24)
1252
-
1253
- - (bluefox) Added support for onchange flag
1254
-
1255
- ### 3.1.30 (2022-08-23)
1256
-
1257
- - (bluefox) Added method `getCompactSystemRepositories`
1258
- - (bluefox) corrected error in `ObjectBrowser`
1259
-
1260
- ### 3.1.27 (2022-08-01)
1261
-
1262
- - (bluefox) Disable file editing in FileViewer
1263
-
1264
- ### 3.1.26 (2022-08-01)
1265
-
1266
- - (bluefox) Added translations
1267
- - (bluefox) JSON schema was extended with missing definitions
1268
-
1269
- ### 3.1.24 (2022-07-28)
1270
-
1271
- - (bluefox) Updated file browser and object browser
1272
-
1273
- ### 3.1.23 (2022-07-25)
1274
-
1275
- - (bluefox) Extend custom filter for object selector
1276
-
1277
- ### 3.1.22 (2022-07-22)
1278
-
1279
- - (bluefox) Added i18n tools for development
1280
-
1281
- ### 3.1.20 (2022-07-14)
1282
-
1283
- - (bluefox) Allowed to show select dialog with the expert mode enabled
1284
-
1285
- ### 3.1.19 (2022-07-08)
1286
-
1287
- - (bluefox) Allowed extending translations for all languages together
1288
-
1289
- ### 3.1.18 (2022-07-06)
1290
-
1291
- - (bluefox) Added translation
1292
-
1293
- ### 3.1.17 (2022-07-05)
1294
-
1295
- - (bluefox) Deactivate JSON editor for JSONConfig because of space
1296
-
1297
- ### 3.1.16 (2022-06-27)
1298
-
1299
- - (bluefox) Update object browser
1300
-
1301
- ### 3.1.15 (2022-06-27)
1302
-
1303
- - (bluefox) Allowed using of spaces in name
1304
-
1305
- ### 3.1.14 (2022-06-23)
1306
-
1307
- - (bluefox) Added translations
1308
-
1309
- ### 3.1.11 (2022-06-22)
1310
-
1311
- - (bluefox) Added preparations for iobroker cloud
1312
-
1313
- ### 3.1.10 (2022-06-22)
1314
-
1315
- - (bluefox) Added translations
1316
-
1317
- ### 3.1.9 (2022-06-20)
1318
-
1319
- - (bluefox) Allowed working behind reverse proxy
1320
-
1321
- ### 3.1.7 (2022-06-19)
1322
-
1323
- - (bluefox) Added file select dialog
1324
-
1325
- ### 3.1.3 (2022-06-13)
1326
-
1327
- - (bluefox) Added table with resized headers
1328
-
1329
- ### 3.1.2 (2022-06-09)
1330
-
1331
- - (bluefox) Added new document icon (read only)
1332
-
1333
- ### 3.1.1 (2022-06-09)
1334
-
1335
- - (bluefox) Allowed working behind reverse proxy
1336
-
1337
- ### 3.1.0 (2022-06-07)
1338
-
1339
- - (bluefox) Some german texts were corrected
1340
-
1341
- ### 3.0.17 (2022-06-03)
1342
-
1343
- - (bluefox) Allowed calling getAdapterInstances not for admin too
1344
-
1345
- ### 3.0.15 (2022-06-01)
1346
-
1347
- - (bluefox) Updated JsonConfigComponent: password, table
1348
-
1349
- ### 3.0.14 (2022-05-25)
1350
-
1351
- - (bluefox) Added ConfigGeneric to import
1352
-
1353
- ### 3.0.7 (2022-05-25)
1354
-
1355
- - (bluefox) Made the module definitions
1356
-
1357
- ### 3.0.6 (2022-05-25)
1358
-
1359
- - (bluefox) Added JsonConfigComponent
1360
-
1361
- ### 2.1.11 (2022-05-24)
1362
-
1363
- - (bluefox) Update file browser. It supports now the file changed events.
1364
-
1365
- ### 2.1.10 (2022-05-24)
1366
-
1367
- - (bluefox) Corrected object browser
1368
-
1369
- ### 2.1.9 (2022-05-16)
1370
-
1371
- - (bluefox) Corrected expert mode in object browser
1372
-
1373
- ### 2.1.7 (2022-05-09)
1374
-
1375
- - (bluefox) Changes were synchronized with adapter-react-v5
1376
- - (bluefox) Added `I18n.disableWarning` method
1377
-
1378
- ### 2.1.6 (2022-03-28)
1379
-
1380
- - (bluefox) Added `log` method to connection
1381
- - (bluefox) Corrected translations
1382
-
1383
- ### 2.1.1 (2022-03-27)
1384
-
1385
- - (bluefox) Corrected error in TreeTable
1386
-
1387
- ### 2.1.0 (2022-03-26)
1388
-
1389
- - (bluefox) BREAKING_CHANGE: Corrected error with readFile(base64=false)
1390
-
1391
- ### 2.0.0 (2022-03-26)
1392
-
1393
- - (bluefox) Initial version
1394
-
1395
- ### 0.1.0 (2022-03-23)
1396
-
1397
- - (bluefox) Fixed theme errors
1398
-
1399
- ### 0.0.4 (2022-03-22)
1400
-
1401
- - (bluefox) Fixed eslint warnings
1402
-
1403
- ### 0.0.3 (2022-03-19)
1404
-
1405
- - (bluefox) beta version
1406
-
1407
- ### 0.0.2 (2022-02-24)
1408
-
1409
- - (bluefox) try to publish a first version
1410
-
1411
- ### 0.0.1 (2022-02-24)
1412
-
1413
- - initial commit
1414
-
1415
- ## License
1416
-
1417
- The MIT License (MIT)
1418
-
1419
- Copyright (c) 2019-2024 bluefox <dogafox@gmail.com>
1420
-
1421
- Permission is hereby granted, free of charge, to any person obtaining a copy
1422
- of this software and associated documentation files (the "Software"), to deal
1423
- in the Software without restriction, including without limitation the rights
1424
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1425
- copies of the Software, and to permit persons to whom the Software is
1426
- furnished to do so, subject to the following conditions:
1427
-
1428
- The above copyright notice and this permission notice shall be included in all
1429
- copies or substantial portions of the Software.
1430
-
1431
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1432
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1433
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1434
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1435
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1436
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1437
- SOFTWARE.
1
+ # Help ReactJS classes for adapter config
2
+
3
+ You can find demo on https://github.com/ioBroker/adapter-react-demo
4
+
5
+ ## Getting started
6
+
7
+ If you want to create the configuration page with ReactJS:
8
+
9
+ 1. Create github repo for adapter.
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
+ ```
16
+ "@iobroker/adapter-react-v5": "^7.2.1",
17
+ ```
18
+ Versions can be higher.
19
+ So your `src/package.json` should look like:
20
+
21
+ ```json
22
+ {
23
+ "name": "ADAPTERNAME-admin",
24
+ "version": "0.1.0",
25
+ "private": true,
26
+ "dependencies": {
27
+ "@iobroker/adapter-react-v5": "^7.2.1",
28
+ "@iobroker/build-tools": "^1.0.0",
29
+ "@iobroker/eslint-config": "^0.1.2",
30
+ "@mui/material": "^6.0.2",
31
+ "@mui/icons-material": "^6.0.2",
32
+ "@sentry/browser": "^8.28.0",
33
+ "babel-eslint": "^10.1.0",
34
+ "eslint": "^9.10.0",
35
+ "react": "^18.3.1",
36
+ "react-dom": "^18.3.1",
37
+ "react-scripts": "^5.0.1",
38
+ "react-icons": "^5.3.0"
39
+ },
40
+ "scripts": {
41
+ "start": "react-scripts start",
42
+ "build": "react-scripts build",
43
+ "test": "react-scripts test",
44
+ "eject": "react-scripts eject"
45
+ },
46
+ "eslintConfig": {
47
+ "extends": "react-app"
48
+ },
49
+ "homepage": ".",
50
+ "browserslist": [">0.2%", "not dead", "not ie <= 11", "not op_mini all"]
51
+ }
52
+ ```
53
+
54
+ 5. Call in `src`: `npm install`
55
+ 6. Copy `tasks.js` into `src`: `cp node_modules/@iobroker/adapter-react-v5/tasks.js tasks.js`
56
+ 7. Add scripts to your `package.json` `scripts` section:
57
+
58
+ ```json
59
+ "scripts": {
60
+ "0-clean": "node tasks --0-clean",
61
+ "1-npm": "node tasks --1-npm",
62
+ "2-build": "node tasks --2-build",
63
+ "3-copy": "node tasks --3-copy",
64
+ "4-patch": "node tasks --4-patch",
65
+ "build": "node tasks"
66
+ }
67
+ ```
68
+
69
+ 7. Start your dummy application `npm run start` for developing or build with `npm run build` and
70
+ copy files in `build` directory to `www` or to `admin`. In the admin you must rename `index.html` to `index_m.html`.
71
+ 8. You can do that with `npm` tasks: `npm run build`
72
+
73
+ ## Development
74
+
75
+ 1. Add `socket.io` to `public/index.html`.
76
+ After
77
+
78
+ ```html
79
+ <link
80
+ rel="manifest"
81
+ href="%PUBLIC_URL%/manifest.json"
82
+ />
83
+ ```
84
+
85
+ insert
86
+
87
+ ```html
88
+ <script>
89
+ const script = document.createElement('script');
90
+ window.registerSocketOnLoad = function (cb) {
91
+ window.socketLoadedHandler = cb;
92
+ };
93
+ const parts = (window.location.search || '').replace(/^\?/, '').split('&');
94
+ const query = {};
95
+ parts.forEach(item => {
96
+ const [name, val] = item.split('=');
97
+ query[decodeURIComponent(name)] = val !== undefined ? decodeURIComponent(val) : true;
98
+ });
99
+ script.onload = function () {
100
+ typeof window.socketLoadedHandler === 'function' && window.socketLoadedHandler();
101
+ };
102
+ script.src =
103
+ window.location.port === '3000'
104
+ ? window.location.protocol +
105
+ '//' +
106
+ (query.host || window.location.hostname) +
107
+ ':' +
108
+ (query.port || 8081) +
109
+ '/lib/js/socket.io.js'
110
+ : '%PUBLIC_URL%/../../lib/js/socket.io.js';
111
+
112
+ document.head.appendChild(script);
113
+ </script>
114
+ ```
115
+
116
+ 3. Add to App.js constructor initialization for I18n:
117
+
118
+ ```jsx
119
+ class App extends GenericApp {
120
+ constructor(props) {
121
+ const extendedProps = { ...props };
122
+ extendedProps.encryptedFields = ['pass']; // this parameter will be encrypted and decrypted automatically
123
+ extendedProps.translations = {
124
+ en: require('./i18n/en'),
125
+ de: require('./i18n/de'),
126
+ ru: require('./i18n/ru'),
127
+ pt: require('./i18n/pt'),
128
+ nl: require('./i18n/nl'),
129
+ fr: require('./i18n/fr'),
130
+ it: require('./i18n/it'),
131
+ es: require('./i18n/es'),
132
+ pl: require('./i18n/pl'),
133
+ uk: require('./i18n/uk'),
134
+ 'zh-cn': require('./i18n/zh-cn'),
135
+ };
136
+ // get actual admin port
137
+ extendedProps.socket = { port: parseInt(window.location.port, 10) };
138
+
139
+ // Only if close, save buttons are not required at the bottom (e.g. if admin tab)
140
+ // extendedProps.bottomButtons = false;
141
+
142
+ // only for debug purposes
143
+ if (extendedProps.socket.port === 3000) {
144
+ extendedProps.socket.port = 8081;
145
+ }
146
+
147
+ // allow to manage GenericApp the sentry initialisation or do not set the sentryDSN if no sentry available
148
+ extendedProps.sentryDSN = 'https://yyy@sentry.iobroker.net/xx';
149
+
150
+ super(extendedProps);
151
+ }
152
+ // ...
153
+ }
154
+ ```
155
+
156
+ 4. Replace `index.js` with the following code to support themes:
157
+
158
+ ```jsx
159
+ import React from 'react';
160
+ import { createRoot } from 'react-dom/client';
161
+ import * as serviceWorker from './serviceWorker';
162
+
163
+ import './index.css';
164
+ import App from './App';
165
+ import { version } from '../package.json';
166
+
167
+ console.log(`iobroker.scenes@${version}`);
168
+
169
+ const container = document.getElementById('root');
170
+ const root = createRoot(container);
171
+ root.render(<App />);
172
+
173
+ // If you want your app to work offline and load faster, you can change
174
+ // unregister() to register() below. Note this comes with some pitfalls.
175
+ // Learn more about service workers: http://bit.ly/CRA-PWA
176
+ serviceWorker.unregister();
177
+ ```
178
+
179
+ 5. Add to App.js encoding and decoding of values:
180
+
181
+ ```jsx
182
+ class App extends GenericApp {
183
+ // ...
184
+ onPrepareLoad(settings) {
185
+ settings.pass = this.decode(settings.pass);
186
+ }
187
+ onPrepareSave(settings) {
188
+ settings.pass = this.encode(settings.pass);
189
+ }
190
+ }
191
+ ```
192
+
193
+ 6. The optional step is to validate the data to be saved:
194
+
195
+ ```jsx
196
+ onPrepareSave(settings) {
197
+ super.onPrepareSave(settings);
198
+ if (DATA_INVALID) {
199
+ return false; // configuration will not be saved
200
+ } else {
201
+ return true;
202
+ }
203
+ }
204
+ ```
205
+
206
+ ## Components
207
+
208
+ ### Connection.tsx
209
+
210
+ This is a non-React class to provide the communication for socket connection with the server.
211
+
212
+ ### GenericApp.tsx
213
+
214
+ ### i18n.ts
215
+
216
+ ### Theme.tsx
217
+
218
+ ### Dialogs
219
+
220
+ Some dialogs are predefined and could be used out of the box.
221
+
222
+ #### Confirm.tsx
223
+
224
+ <!-- TODO: Provide screenshot here -->
225
+
226
+ Usage:
227
+
228
+ ```jsx
229
+ import React from 'react';
230
+ import { I18n, Confirm as ConfirmDialog } from '@iobroker/adapter-react-v5';
231
+
232
+ class ExportImportDialog extends React.Component {
233
+ constructor(props) {
234
+ super(props);
235
+
236
+ this.state = {
237
+ confirmDialog: false,
238
+ };
239
+ }
240
+
241
+ renderConfirmDialog() {
242
+ if (!this.state.confirmDialog) {
243
+ return null;
244
+ }
245
+ return (
246
+ <ConfirmDialog
247
+ title={I18n.t('Scene will be overwritten.')}
248
+ text={I18n.t('All data will be lost. Confirm?')}
249
+ ok={I18n.t('Yes')}
250
+ cancel={I18n.t('Cancel')}
251
+ suppressQuestionMinutes={5}
252
+ dialogName="myConfirmDialogThatCouldBeSuppressed"
253
+ suppressText={I18n.t('Suppress question for next %s minutes', 5)}
254
+ onClose={isYes => {
255
+ this.setState({ confirmDialog: false });
256
+ }}
257
+ />
258
+ );
259
+ }
260
+ render() {
261
+ return (
262
+ <div>
263
+ <Button onClick={() => this.setState({ confirmDialog: true })}>Click</Button>
264
+ {this.renderConfirmDialog()}
265
+ </div>
266
+ );
267
+ }
268
+ }
269
+
270
+ export default ExportImportDialog;
271
+ ```
272
+
273
+ #### Error.tsx
274
+
275
+ <!-- TODO: Provide screenshot here -->
276
+
277
+ #### Message.tsx
278
+
279
+ <!-- TODO: Provide screenshot here -->
280
+
281
+ ```jsx
282
+ renderMessage() {
283
+ if (this.state.showMessage) {
284
+ return <Message
285
+ text={this.state.showMessage}
286
+ onClose={() => this.setState({showMessage: false})}
287
+ />;
288
+ } else {
289
+ return null;
290
+ }
291
+ }
292
+ ```
293
+
294
+ #### SelectID.tsx
295
+
296
+ ![Logo](img/selectID.png)
297
+
298
+ ```jsx
299
+ import { SelectID as DialogSelectID } from '@iobroker/adapter-react-v5';
300
+
301
+ class MyComponent extends Component {
302
+ constructor(props) {
303
+ super(props);
304
+ this.state = {
305
+ showSelectId: false,
306
+ };
307
+ }
308
+
309
+ renderSelectIdDialog() {
310
+ if (this.state.showSelectId) {
311
+ return (
312
+ <DialogSelectID
313
+ key="tableSelect"
314
+ imagePrefix="../.."
315
+ dialogName={this.props.adapterName}
316
+ themeType={this.props.themeType}
317
+ socket={this.props.socket}
318
+ statesOnly={true}
319
+ selected={this.state.selectIdValue}
320
+ onClose={() => this.setState({ showSelectId: false })}
321
+ onOk={(selected, name) => {
322
+ this.setState({ showSelectId: false, selectIdValue: selected });
323
+ }}
324
+ />
325
+ );
326
+ } else {
327
+ return null;
328
+ }
329
+ }
330
+ render() {
331
+ return renderSelectIdDialog();
332
+ }
333
+ }
334
+ ```
335
+
336
+ #### Cron
337
+
338
+ Include `"react-text-mask": "^5.4.3",` in package.json.
339
+
340
+ <!-- TODO: Provide screenshot here -->
341
+
342
+ ```jsx
343
+ function renderCron() {
344
+ if (!showCron) {
345
+ return null;
346
+ } else {
347
+ return (
348
+ <DialogCron
349
+ key="dialogCron1"
350
+ cron={this.state.cronValue || '* * * * *'}
351
+ onClose={() => this.setState({ showCron: false })}
352
+ onOk={cronValue => {
353
+ this.setState({ cronValue });
354
+ }}
355
+ />
356
+ );
357
+ }
358
+ }
359
+ ```
360
+
361
+ ### Components
362
+
363
+ #### Utils.tsx
364
+
365
+ ##### getObjectNameFromObj
366
+
367
+ `getObjectNameFromObj(obj, settings, options, isDesc)`
368
+
369
+ Get object name from a single object.
370
+
371
+ Usage: `Utils.getObjectNameFromObj(this.objects[id], null, {language: I18n.getLanguage()})`
372
+
373
+ ##### getObjectIcon
374
+
375
+ `getObjectIcon(id, obj)`
376
+
377
+ Get icon from the object.
378
+
379
+ Usage:
380
+
381
+ ```jsx
382
+ const icon = Utils.getObjectIcon(id, this.objects[id]);
383
+ return <img src={icon} />;
384
+ ```
385
+
386
+ ##### isUseBright
387
+
388
+ `isUseBright(color, defaultValue)`
389
+
390
+ Usage: `
391
+
392
+ #### Loader.tsx
393
+
394
+ ![Logo](img/loader.png)
395
+
396
+ ```jsx
397
+ render() {
398
+ if (!this.state.loaded) {
399
+ return <MuiThemeProvider theme={this.state.theme}>
400
+ <Loader theme={this.state.themeType}/>
401
+ </MuiThemeProvider>;
402
+ }
403
+ // render loaded data
404
+ }
405
+
406
+ ```
407
+
408
+ #### Logo.tsx
409
+
410
+ ![Logo](img/logo.png)
411
+
412
+ ```jsx
413
+ render() {
414
+ return <form className={this.props.classes.tab}>
415
+ <Logo
416
+ instance={this.props.instance}
417
+ common={this.props.common}
418
+ native={this.props.native}
419
+ onError={text => this.setState({errorText: text})}
420
+ onLoad={this.props.onLoad}
421
+ />
422
+ ...
423
+ </form>;
424
+ }
425
+ ```
426
+
427
+ #### Router.tsx
428
+
429
+ #### ObjectBrowser.js
430
+
431
+ It is better to use `Dialog/SelectID`, but if you want:
432
+
433
+ ![Logo](img/objectBrowser.png)
434
+
435
+ ```jsx
436
+ <ObjectBrowser
437
+ foldersFirst={this.props.foldersFirst}
438
+ imagePrefix={this.props.imagePrefix || this.props.prefix} // prefix is for back compatibility
439
+ defaultFilters={this.filters}
440
+ dialogName={this.dialogName}
441
+ showExpertButton={this.props.showExpertButton !== undefined ? this.props.showExpertButton : true}
442
+ style={{ width: '100%', height: '100%' }}
443
+ columns={this.props.columns || ['name', 'type', 'role', 'room', 'func', 'val']}
444
+ types={this.props.types || ['state']}
445
+ t={I18n.t}
446
+ lang={this.props.lang || I18n.getLanguage()}
447
+ socket={this.props.socket}
448
+ selected={this.state.selected}
449
+ multiSelect={this.props.multiSelect}
450
+ notEditable={this.props.notEditable === undefined ? true : this.props.notEditable}
451
+ name={this.state.name}
452
+ theme={this.props.theme}
453
+ themeName={this.props.themeName}
454
+ themeType={this.props.themeType}
455
+ customFilter={this.props.customFilter}
456
+ onFilterChanged={filterConfig => {
457
+ this.filters = filterConfig;
458
+ window.localStorage.setItem(this.dialogName, JSON.stringify(filterConfig));
459
+ }}
460
+ onSelect={(selected, name, isDouble) => {
461
+ if (JSON.stringify(selected) !== JSON.stringify(this.state.selected)) {
462
+ this.setState({ selected, name }, () => isDouble && this.handleOk());
463
+ } else if (isDouble) {
464
+ this.handleOk();
465
+ }
466
+ }}
467
+ />
468
+ ```
469
+
470
+ #### TreeTable.ts
471
+
472
+ ![Logo](img/tableTree.png)
473
+
474
+ ```jsx
475
+ // STYLES
476
+ const styles = {
477
+ tableDiv: {
478
+ width: '100%',
479
+ overflow: 'hidden',
480
+ height: 'calc(100% - 48px)',
481
+ },
482
+ };
483
+ class MyComponent extends Component {
484
+ constructor(props) {
485
+ super(props);
486
+
487
+ this.state = {
488
+ data: [
489
+ {
490
+ id: 'UniqueID1', // required
491
+ fieldIdInData: 'Name1',
492
+ myType: 'number',
493
+ },
494
+ {
495
+ id: 'UniqueID2', // required
496
+ fieldIdInData: 'Name12',
497
+ myType: 'string',
498
+ },
499
+ ],
500
+ };
501
+
502
+ this.columns = [
503
+ {
504
+ title: 'Name of field', // required, else it will be "field"
505
+ field: 'fieldIdInData', // required
506
+ editable: false, // or true [default - true]
507
+ cellStyle: {
508
+ // CSS style - // optional
509
+ maxWidth: '12rem',
510
+ overflow: 'hidden',
511
+ wordBreak: 'break-word',
512
+ },
513
+ lookup: {
514
+ // optional => edit will be automatically "SELECT"
515
+ value1: 'text1',
516
+ value2: 'text2',
517
+ },
518
+ },
519
+ {
520
+ title: 'Type', // required, else it will be "field"
521
+ field: 'myType', // required
522
+ editable: true, // or true [default - true]
523
+ lookup: {
524
+ // optional => edit will be automatically "SELECT"
525
+ number: 'Number',
526
+ string: 'String',
527
+ boolean: 'Boolean',
528
+ },
529
+ type: 'number/string/color/oid/icon/boolean', // oid=ObjectID,icon=base64-icon
530
+ editComponent: props => (
531
+ <div>
532
+ Prefix&#123; <br />
533
+ <textarea
534
+ rows={4}
535
+ style={{ width: '100%', resize: 'vertical' }}
536
+ value={props.value}
537
+ onChange={e => props.onChange(e.target.value)}
538
+ />
539
+ Suffix
540
+ </div>
541
+ ),
542
+ },
543
+ ];
544
+ }
545
+ // renderTable
546
+ render() {
547
+ return (
548
+ <div className={this.props.classes.tableDiv}>
549
+ <TreeTable
550
+ columns={this.columns}
551
+ data={this.state.data}
552
+ onUpdate={(newData, oldData) => {
553
+ const data = JSON.parse(JSON.stringify(this.state.data));
554
+
555
+ // Added new line
556
+ if (newData === true) {
557
+ // find unique ID
558
+ let i = 1;
559
+ let id = 'line_' + i;
560
+
561
+ // eslint-disable-next-line
562
+ while (this.state.data.find(item => item.id === id)) {
563
+ i++;
564
+ id = 'line_' + i;
565
+ }
566
+
567
+ data.push({
568
+ id,
569
+ name: I18n.t('New resource') + '_' + i,
570
+ color: '',
571
+ icon: '',
572
+ unit: '',
573
+ price: 0,
574
+ });
575
+ } else {
576
+ // existing line was modifed
577
+ const pos = this.state.data.indexOf(oldData);
578
+ if (pos !== -1) {
579
+ Object.keys(newData).forEach(attr => (data[pos][attr] = newData[attr]));
580
+ }
581
+ }
582
+
583
+ this.setState({ data });
584
+ }}
585
+ onDelete={oldData => {
586
+ console.log('Delete: ' + JSON.stringify(oldData));
587
+ const pos = this.state.data.indexOf(oldData);
588
+ if (pos !== -1) {
589
+ const data = JSON.parse(JSON.stringify(this.state.data));
590
+ data.splice(pos, 1);
591
+ this.setState({ data });
592
+ }
593
+ }}
594
+ />
595
+ </div>
596
+ );
597
+ }
598
+ }
599
+ ```
600
+
601
+ #### Toast
602
+
603
+ <!-- TODO: Provide screenshot here -->
604
+
605
+ Toast is not a part of `adapter-react` but it is an example how to use toast in application:
606
+
607
+ ```jsx
608
+ import { Component } from 'react';
609
+ import { Snackbar } from '@mui/material';
610
+
611
+ class MyComponent extends Component {
612
+ constructor(props) {
613
+ super(props);
614
+ this.state = {
615
+ // ....
616
+ toast: '',
617
+ };
618
+ }
619
+
620
+ // ...
621
+ renderToast() {
622
+ if (!this.state.toast) {
623
+ return null;
624
+ }
625
+ return (
626
+ <Snackbar
627
+ anchorOrigin={{
628
+ vertical: 'bottom',
629
+ horizontal: 'left',
630
+ }}
631
+ open={true}
632
+ autoHideDuration={6000}
633
+ onClose={() => this.setState({ toast: '' })}
634
+ ContentProps={{ 'aria-describedby': 'message-id' }}
635
+ message={<span id="message-id">{this.state.toast}</span>}
636
+ action={[
637
+ <IconButton
638
+ key="close"
639
+ aria-label="Close"
640
+ color="inherit"
641
+ className={this.props.classes.close}
642
+ onClick={() => this.setState({ toast: '' })}
643
+ >
644
+ <IconClose />
645
+ </IconButton>,
646
+ ]}
647
+ />
648
+ );
649
+ }
650
+
651
+ render() {
652
+ return <div>{this.renderToast()}</div>;
653
+ }
654
+ }
655
+ ```
656
+
657
+ ## List of adapters that use adapter-react
658
+
659
+ - Admin
660
+ - Backitup
661
+ - iot
662
+ - echarts
663
+ - text2command
664
+ - scenes
665
+ - javascript
666
+ - devices
667
+ - eventlist
668
+ - cameras
669
+ - web
670
+ - vis-2
671
+ - vis-2-widgets-xxx
672
+ - fullcalendar
673
+ - openweathermap
674
+
675
+ ## Usability
676
+
677
+ In dialogs, the OK button is first (on the left) and the cancel button is last (on the right)
678
+
679
+ ## Used icons
680
+
681
+ This project uses icons from [Flaticon](https://www.flaticon.com/).
682
+
683
+ ioBroker GmbH has a valid license for all the used icons.
684
+ The icons may not be reused in other projects without the proper flaticon license or flaticon subscription.
685
+
686
+ ## Migration instructions
687
+
688
+ You can find the migration instructions:
689
+
690
+ - [from adapter-react-v5@6.x to adapter-react-v5@7.x](MIGRATION_6_7.md)
691
+ - [from adapter-react-v5@5.x to adapter-react-v5@6.x](MIGRATION_5_6.md)
692
+ - [from adapter-react to adapter-react-v5@5.x](MIGRATION_4_5.md)
693
+
694
+ <!--
695
+ Placeholder for the next version (at the beginning of the line):
696
+ ### **WORK IN PROGRESS**
697
+ -->
698
+
699
+ ## Changelog
700
+ ### 7.2.1 (2024-09-30)
701
+
702
+ - (bluefox) Allowed using an array of elements in dialogs
703
+ - (@GermanBluefox) Allowed to use `socket.iob` instead of `socket.io`
704
+
705
+ ### 7.1.4 (2024-09-15)
706
+
707
+ - (@GermanBluefox) Updated socket classes
708
+
709
+ ### 7.1.3 (2024-09-15)
710
+
711
+ - (@GermanBluefox) Updated socket classes
712
+ - (@GermanBluefox) Added additional confirmation dialog for CRONs for every minute execution
713
+
714
+ ### 7.1.1 (2024-09-13)
715
+
716
+ - (@GermanBluefox) Corrected TabContainer
717
+
718
+ ### 7.1.0 (2024-09-12)
719
+
720
+ - (@GermanBluefox) Optimized the icon picker
721
+ - (@GermanBluefox) Used common eslint-config
722
+
723
+ ### 7.0.2 (2024-09-10)
724
+
725
+ - (@GermanBluefox) Showed the context menu under cursor position in the object browser
726
+ - (@GermanBluefox) Added links to aliases in the object browser
727
+
728
+ ### 7.0.1 (2024-08-29)
729
+
730
+ - (@GermanBluefox) Updated the object browser
731
+ - (@GermanBluefox) Used MUI Library 6.0
732
+
733
+ ### 6.1.10 (2024-08-30)
734
+
735
+ - (@GermanBluefox) Updated the object browser
736
+
737
+ ### 6.1.9 (2024-08-14)
738
+
739
+ - (@GermanBluefox) Updated JSON schema
740
+
741
+ ### 6.1.8 (2024-08-03)
742
+
743
+ - (@GermanBluefox) Added translations
744
+
745
+ ### 6.1.6 (2024-07-23)
746
+
747
+ - (@GermanBluefox) Optimize package
748
+
749
+ ### 6.1.5 (2024-07-20)
750
+
751
+ - (@GermanBluefox) Added sources to package
752
+
753
+ ### 6.1.3 (2024-07-20)
754
+
755
+ - (@GermanBluefox) Better typing of legacy connection
756
+
757
+ ### 6.1.1 (2024-07-16)
758
+
759
+ - (@GermanBluefox) Added translations
760
+
761
+ ### 6.1.0 (2024-07-15)
762
+
763
+ - (@GermanBluefox) Replace by CRON to text the package to `cronstrue`
764
+
765
+ ### 6.0.19 (2024-07-14)
766
+
767
+ - (@GermanBluefox) added some packages for federation
768
+
769
+ ### 6.0.17 (2024-07-14)
770
+
771
+ - (@GermanBluefox) Allowed playing mp3 files in the file browser
772
+ - (@GermanBluefox) Corrected jump by object selection
773
+
774
+ ### 6.0.14 (2024-07-07)
775
+
776
+ - (@GermanBluefox) Corrected theme type selection
777
+
778
+ ### 6.0.13 (2024-06-30)
779
+
780
+ - (@GermanBluefox) Corrected color picker
781
+
782
+ ### 6.0.12 (2024-06-29)
783
+
784
+ - (@GermanBluefox) Added support for the overrides in the theme
785
+
786
+ ### 6.0.10 (2024-06-27)
787
+
788
+ - (@GermanBluefox) Added translation
789
+ - (@GermanBluefox) Mobile object browser improved
790
+
791
+ ### 6.0.9 (2024-06-26)
792
+
793
+ - (@GermanBluefox) Corrected Icons
794
+
795
+ ### 6.0.8 (2024-06-26)
796
+
797
+ - (@GermanBluefox) Corrected types of the select ID dialog
798
+ - (@GermanBluefox) Made the tooltips neutral to the pointer events
799
+
800
+ ### 6.0.6 (2024-06-24)
801
+
802
+ - (@GermanBluefox) Synchronised with admin
803
+ - (@GermanBluefox) Added translations for time scheduler
804
+
805
+ ### 6.0.4 (2024-06-21)
806
+
807
+ - (@GermanBluefox) Removed the usage of `withStyles` in favor of `sx` and `style` properties (see [Migration from v5 to v6](#migration-from-v5-to-v6)
808
+ - (@GermanBluefox) (BREAKING) Higher version of `@mui/material` (5.15.20) is used
809
+
810
+ ### 5.0.8 (2024-06-15)
811
+
812
+ - (@GermanBluefox) Added `modulefederation.admin.config.js` for module federation
813
+
814
+ ### 5.0.5 (2024-06-10)
815
+
816
+ - (@GermanBluefox) Sources were synchronized with admin
817
+
818
+ ### 5.0.4 (2024-06-07)
819
+
820
+ - (@GermanBluefox) Added better typing
821
+
822
+ ### 5.0.2 (2024-05-30)
823
+
824
+ - (@GermanBluefox) Added better typing
825
+ - (@GermanBluefox) Json-Config is now a separate package and must be installed additionally
826
+
827
+ ### 5.0.0 (2024-05-29)
828
+
829
+ - (@GermanBluefox) Types are now exported
830
+ - (@GermanBluefox) Translator renamed to Translate
831
+ - (@GermanBluefox) Breaking: Theme renamed to IobTheme because of the naming conflict
832
+
833
+ ### 4.13.24 (2024-05-25)
834
+
835
+ - (@GermanBluefox) Updated packages
836
+
837
+ - ### 4.13.22 (2024-05-23)
838
+ - (@GermanBluefox) Updated packages
839
+
840
+ ### 4.13.20 (2024-05-22)
841
+
842
+ - (@GermanBluefox) Better types added
843
+ - (@GermanBluefox) updated theme definitions
844
+ - (@GermanBluefox) corrected dates in cron dialog
845
+
846
+ ### 4.13.14 (2024-05-19)
847
+
848
+ - (@GermanBluefox) Updated packages
849
+
850
+ ### 4.13.13 (2024-05-09)
851
+
852
+ - (@GermanBluefox) Updated ioBroker types
853
+
854
+ ### 4.13.12 (2024-05-06)
855
+
856
+ - (@GermanBluefox) All files are migrated to Typescript
857
+
858
+ ### 4.13.11 (2024-04-23)
859
+
860
+ - (@GermanBluefox) Corrected the size of icons
861
+
862
+ ### 4.13.10 (2024-04-22)
863
+
864
+ - (@GermanBluefox) Migrated all icons to Typescript
865
+
866
+ ### 4.13.9 (2024-04-20)
867
+
868
+ - (@GermanBluefox) Updated socket-client package
869
+
870
+ ### 4.13.8 (2024-04-19)
871
+
872
+ - (@GermanBluefox) Corrected CRON selector
873
+
874
+ ### 4.13.7 (2024-04-19)
875
+
876
+ - (@GermanBluefox) Migrated ColorPicker to typescript
877
+
878
+ ### 4.13.6 (2024-04-11)
879
+
880
+ - (@GermanBluefox) Migrated TreeTable to typescript
881
+ - (@GermanBluefox) corrected the object subscription
882
+
883
+ ### 4.13.5 (2024-04-02)
884
+
885
+ - (@GermanBluefox) used new connection classes
886
+ - (@GermanBluefox) Improved the `SelectID` dialog
887
+
888
+ ### 4.13.3 (2024-04-01)
889
+
890
+ - (@GermanBluefox) used new connection classes
891
+
892
+ ### 4.12.3 (2024-03-30)
893
+
894
+ - (@GermanBluefox) Migrated legacy connection to typescript
895
+
896
+ ### 4.12.2 (2024-03-25)
897
+
898
+ - (@GermanBluefox) Added support for remote cloud
899
+
900
+ ### 4.11.6 (2024-03-19)
901
+
902
+ - (@GermanBluefox) Corrected rendering of LoaderMV
903
+
904
+ ### 4.11.4 (2024-03-18)
905
+
906
+ - (@GermanBluefox) Corrected types of IconPicker
907
+
908
+ ### 4.11.3 (2024-03-17)
909
+
910
+ - (@GermanBluefox) Made filters for the file selector dialog optional
911
+
912
+ ### 4.11.2 (2024-03-16)
913
+
914
+ - (@GermanBluefox) Migrated GenericApp to typescript
915
+
916
+ ### 4.10.4 (2024-03-16)
917
+
918
+ - (@GermanBluefox) Migrated some components to typescript
919
+
920
+ ### 4.10.1 (2024-03-11)
921
+
922
+ - (@GermanBluefox) Migrated some components to typescript
923
+
924
+ ### 4.9.11 (2024-03-08)
925
+
926
+ - (foxriver76) type GenericApp socket correctly
927
+
928
+ ### 4.9.10 (2024-02-21)
929
+
930
+ - (@GermanBluefox) translations
931
+ - (@GermanBluefox) updated JSON config
932
+
933
+ ### 4.9.9 (2024-02-16)
934
+
935
+ - (foxriver76) also check plugin state of instance to see if Sentry is explicitly disabled
936
+
937
+ ### 4.9.8 (2024-02-13)
938
+
939
+ - (@GermanBluefox) allowed hiding wizard in cron dialog
940
+
941
+ ### 4.9.7 (2024-02-03)
942
+
943
+ - (foxriver76) allow passing down the instance number do avoid determining from url
944
+
945
+ ### 4.9.5 (2024-01-01)
946
+
947
+ - (foxriver76) make `copyToClipboard` event parameter optional
948
+
949
+ ### 4.9.4 (2024-01-01)
950
+
951
+ - (foxriver76) try to fix `SelectID` scrolling
952
+
953
+ ### 4.9.2 (2023-12-30)
954
+
955
+ - (foxriver76) bump version of `@iobroker/json-config`
956
+
957
+ ### 4.9.1 (2023-12-22)
958
+
959
+ - (foxriver76) `@iobroker/json-config` moved to real dependencies
960
+
961
+ ### 4.9.0 (2023-12-22)
962
+
963
+ - (foxriver76) migrate to `@iobroker/json-config` module to have a single point of truth
964
+ - (@GermanBluefox) Allowed using of `filterFunc` as string
965
+
966
+ ### 4.8.1 (2023-12-14)
967
+
968
+ - (@GermanBluefox) Added Device manager to JSON Config
969
+
970
+ ### 4.7.15 (2023-12-12)
971
+
972
+ - (@GermanBluefox) Corrected parsing of a text
973
+
974
+ ### 4.7.13 (2023-12-10)
975
+
976
+ - (@GermanBluefox) Added possibility to define the root style and embedded property
977
+
978
+ ### 4.7.11 (2023-12-06)
979
+
980
+ - (@GermanBluefox) Extended color picker with "noInputField" option
981
+
982
+ ### 4.7.9 (2023-12-04)
983
+
984
+ - (@GermanBluefox) Corrected the icon picker
985
+
986
+ ### 4.7.8 (2023-12-04)
987
+
988
+ - (foxriver76) port to `@iobroker/types`
989
+
990
+ ### 4.7.6 (2023-11-29)
991
+
992
+ - (@GermanBluefox) Added translations
993
+
994
+ ### 4.7.5 (2023-11-28)
995
+
996
+ - (@GermanBluefox) Corrected subscribe on objects in the legacy connection
997
+
998
+ ### 4.7.4 (2023-11-23)
999
+
1000
+ - (@GermanBluefox) Updated packages
1001
+ - (@GermanBluefox) Made getStates method in legacy connection compatible with new one
1002
+
1003
+ ### 4.7.3 (2023-11-08)
1004
+
1005
+ - (@GermanBluefox) Updated packages
1006
+
1007
+ ### 4.7.2 (2023-11-03)
1008
+
1009
+ - (foxriver76) fixed problem with color picker, where editing TextField was buggy
1010
+ - (foxriver76) fixed light mode color of a path in FileBrowser
1011
+
1012
+ ### 4.7.0 (2023-10-31)
1013
+
1014
+ - (@GermanBluefox) Synced with admin
1015
+ - (@GermanBluefox) Added GIF to image files
1016
+
1017
+ ### 4.6.7 (2023-10-19)
1018
+
1019
+ - (@GermanBluefox) Added return value for `subscribeOnInstance` for Connection class
1020
+
1021
+ ### 4.6.6 (2023-10-13)
1022
+
1023
+ - (@GermanBluefox) Fixed the legacy connection
1024
+
1025
+ ### 4.6.5 (2023-10-12)
1026
+
1027
+ - (foxriver76) fixed object browser with date
1028
+
1029
+ ### 4.6.4 (2023-10-11)
1030
+
1031
+ - (@GermanBluefox) Updated the packages
1032
+
1033
+ ### 4.6.3 (2023-10-09)
1034
+
1035
+ - (@GermanBluefox) Just updated the packages
1036
+ - (@GermanBluefox) Synced with admin
1037
+
1038
+ ### 4.6.2 (2023-09-29)
1039
+
1040
+ - (@GermanBluefox) Experimental feature added: update states on re-subscribe
1041
+
1042
+ ### 4.5.5 (2023-09-27)
1043
+
1044
+ - (@GermanBluefox) Added export for IconNoIcon
1045
+
1046
+ ### 4.5.4 (2023-09-17)
1047
+
1048
+ - (@GermanBluefox) Added the restricting to folder property for select file dialog
1049
+
1050
+ ### 4.5.3 (2023-08-20)
1051
+
1052
+ - (foxriver76) fixed css classes of TableResize, see https://github.com/ioBroker/ioBroker.admin/issues/1860
1053
+
1054
+ ### 4.5.2 (2023-08-20)
1055
+
1056
+ - (foxriver76) added missing export of TableResize
1057
+
1058
+ ### 4.5.1 (2023-08-19)
1059
+
1060
+ - (foxriver76) fix dialog TextInput
1061
+
1062
+ ### 4.5.0 (2023-08-18)
1063
+
1064
+ - (@GermanBluefox) Synchronize components with admin
1065
+
1066
+ ### 4.4.8 (2023-08-17)
1067
+
1068
+ - (@GermanBluefox) Added translations
1069
+
1070
+ ### 4.4.7 (2023-08-10)
1071
+
1072
+ - (@GermanBluefox) Added `subscribeStateAsync` method to wait for answer
1073
+ - (@GermanBluefox) Added support for arrays for un/subscriptions
1074
+
1075
+ ### 4.4.5 (2023-08-01)
1076
+
1077
+ - (@GermanBluefox) Updated packages
1078
+
1079
+ ### 4.3.3 (2023-07-28)
1080
+
1081
+ - (@GermanBluefox) Added translations
1082
+
1083
+ ### 4.3.0 (2023-07-19)
1084
+
1085
+ - (@GermanBluefox) Updated packages
1086
+ - (@GermanBluefox) Added translations
1087
+ - (@GermanBluefox) Synced object browser
1088
+ - (@GermanBluefox) formatting
1089
+
1090
+ ### 4.2.1 (2023-07-17)
1091
+
1092
+ - (@GermanBluefox) Updated packages
1093
+ - (@GermanBluefox) Added translations
1094
+
1095
+ ### 4.2.0 (2023-07-07)
1096
+
1097
+ - (@GermanBluefox) Updated packages
1098
+ - (@GermanBluefox) Added new method `getObjectsById` to the socket communication
1099
+
1100
+ ### 4.1.2 (2023-06-20)
1101
+
1102
+ - (@GermanBluefox) Allowed setting theme name directly by theme toggle
1103
+
1104
+ ### 4.1.0 (2023-05-10)
1105
+
1106
+ - (@GermanBluefox) `craco-module-federation.js` was added. For node 16
1107
+
1108
+ ### 4.0.27 (2023-05-09)
1109
+
1110
+ - (@GermanBluefox) Allowed showing only specific root in SelectIDDialog
1111
+
1112
+ ### 4.0.26 (2023-05-08)
1113
+
1114
+ - (@GermanBluefox) Added IDs to the buttons in the dialog for GUI tests
1115
+
1116
+ ### 4.0.25 (2023-04-23)
1117
+
1118
+ - (@GermanBluefox) Extended `TextWithIcon` with defined color and icon
1119
+
1120
+ ### 4.0.24 (2023-04-03)
1121
+
1122
+ - (@GermanBluefox) Updated the file selector in tile mode
1123
+
1124
+ ### 4.0.23 (2023-03-27)
1125
+
1126
+ - (@GermanBluefox) Added translations
1127
+
1128
+ ### 4.0.22 (2023-03-22)
1129
+
1130
+ - (@GermanBluefox) Re-Activate legacy connection
1131
+
1132
+ ### 4.0.21 (2023-03-22)
1133
+
1134
+ - (@GermanBluefox) Added translations
1135
+
1136
+ ### 4.0.20 (2023-03-21)
1137
+
1138
+ - (@GermanBluefox) Color picker was improved
1139
+
1140
+ ### 4.0.19 (2023-03-20)
1141
+
1142
+ - (@GermanBluefox) Packages were updated
1143
+ - (@GermanBluefox) Added new translations
1144
+
1145
+ ### 4.0.18 (2023-03-16)
1146
+
1147
+ - (@GermanBluefox) Packages were updated
1148
+
1149
+ ### 4.0.17 (2023-03-15)
1150
+
1151
+ - (@GermanBluefox) Added translations
1152
+ - (@GermanBluefox) Added port controller to JSON config
1153
+
1154
+ ### 4.0.15 (2023-03-12)
1155
+
1156
+ - (@GermanBluefox) Updated the object browser and file browser
1157
+
1158
+ ### 4.0.14 (2023-03-03)
1159
+
1160
+ - (@GermanBluefox) added handler of alert messages
1161
+
1162
+ ### 4.0.13 (2023-02-15)
1163
+
1164
+ - (@GermanBluefox) Corrected the theme button
1165
+
1166
+ ### 4.0.12 (2023-02-15)
1167
+
1168
+ - (@GermanBluefox) made the fix for `echarts`
1169
+
1170
+ ### 4.0.11 (2023-02-14)
1171
+
1172
+ - (@GermanBluefox) Updated packages
1173
+ - (@GermanBluefox) The `chartReady` event was omitted
1174
+
1175
+ ### 4.0.10 (2023-02-10)
1176
+
1177
+ - (@GermanBluefox) Updated packages
1178
+ - (@GermanBluefox) made the fix for `material`
1179
+
1180
+ ### 4.0.9 (2023-02-02)
1181
+
1182
+ - (@GermanBluefox) Updated packages
1183
+
1184
+ ### 4.0.8 (2022-12-19)
1185
+
1186
+ - (@GermanBluefox) Extended socket with `log` command
1187
+
1188
+ ### 4.0.6 (2022-12-19)
1189
+
1190
+ - (@GermanBluefox) Corrected URL for the connection
1191
+
1192
+ ### 4.0.5 (2022-12-14)
1193
+
1194
+ - (@GermanBluefox) Added support of custom palette for color picker
1195
+
1196
+ ### 4.0.2 (2022-12-01)
1197
+
1198
+ - (@GermanBluefox) use `@iobroker/socket-client` instead of `Connection.tsx`
1199
+
1200
+ ### 3.5.3 (2022-11-30)
1201
+
1202
+ - (@GermanBluefox) Improved `renderTextWithA` function to support `<b>` and `<i>` tags
1203
+
1204
+ ### 3.5.2 (2022-11-30)
1205
+
1206
+ - (@GermanBluefox) updated json config component
1207
+
1208
+ ### 3.4.1 (2022-11-29)
1209
+
1210
+ - (@GermanBluefox) Added button text for message dialog
1211
+
1212
+ ### 3.4.0 (2022-11-29)
1213
+
1214
+ - (@GermanBluefox) Added file selector
1215
+
1216
+ ### 3.3.0 (2022-11-26)
1217
+
1218
+ - (@GermanBluefox) Added subscribe on files
1219
+
1220
+ ### 3.2.7 (2022-11-13)
1221
+
1222
+ - (@GermanBluefox) Added `fullWidth` property to `Dialog`
1223
+
1224
+ ### 3.2.6 (2022-11-08)
1225
+
1226
+ - (xXBJXx) Improved TreeTable component
1227
+
1228
+ ### 3.2.5 (2022-11-08)
1229
+
1230
+ - (@GermanBluefox) Added the role filter for the object browser
1231
+
1232
+ ### 3.2.4 (2022-11-03)
1233
+
1234
+ - (@GermanBluefox) Added support for alfa channel for `invertColor`
1235
+
1236
+ ### 3.2.3 (2022-10-26)
1237
+
1238
+ - (@GermanBluefox) Corrected expert mode for object browser
1239
+
1240
+ ### 3.2.2 (2022-10-25)
1241
+
1242
+ - (@GermanBluefox) Added support for prefixes for translations
1243
+
1244
+ ### 3.2.1 (2022-10-24)
1245
+
1246
+ - (@GermanBluefox) Corrected color inversion
1247
+
1248
+ ### 3.2.0 (2022-10-19)
1249
+
1250
+ - (@GermanBluefox) Added ukrainian translation
1251
+
1252
+ ### 3.1.35 (2022-10-17)
1253
+
1254
+ - (@GermanBluefox) small changes for material
1255
+
1256
+ ### 3.1.34 (2022-08-24)
1257
+
1258
+ - (@GermanBluefox) Implemented fallback to english by translations
1259
+
1260
+ ### 3.1.33 (2022-08-24)
1261
+
1262
+ - (@GermanBluefox) Added support for onchange flag
1263
+
1264
+ ### 3.1.30 (2022-08-23)
1265
+
1266
+ - (@GermanBluefox) Added method `getCompactSystemRepositories`
1267
+ - (@GermanBluefox) corrected error in `ObjectBrowser`
1268
+
1269
+ ### 3.1.27 (2022-08-01)
1270
+
1271
+ - (@GermanBluefox) Disable file editing in FileViewer
1272
+
1273
+ ### 3.1.26 (2022-08-01)
1274
+
1275
+ - (@GermanBluefox) Added translations
1276
+ - (@GermanBluefox) JSON schema was extended with missing definitions
1277
+
1278
+ ### 3.1.24 (2022-07-28)
1279
+
1280
+ - (@GermanBluefox) Updated file browser and object browser
1281
+
1282
+ ### 3.1.23 (2022-07-25)
1283
+
1284
+ - (@GermanBluefox) Extend custom filter for object selector
1285
+
1286
+ ### 3.1.22 (2022-07-22)
1287
+
1288
+ - (@GermanBluefox) Added i18n tools for development
1289
+
1290
+ ### 3.1.20 (2022-07-14)
1291
+
1292
+ - (@GermanBluefox) Allowed to show select dialog with the expert mode enabled
1293
+
1294
+ ### 3.1.19 (2022-07-08)
1295
+
1296
+ - (@GermanBluefox) Allowed extending translations for all languages together
1297
+
1298
+ ### 3.1.18 (2022-07-06)
1299
+
1300
+ - (@GermanBluefox) Added translation
1301
+
1302
+ ### 3.1.17 (2022-07-05)
1303
+
1304
+ - (@GermanBluefox) Deactivate JSON editor for JSONConfig because of space
1305
+
1306
+ ### 3.1.16 (2022-06-27)
1307
+
1308
+ - (@GermanBluefox) Update object browser
1309
+
1310
+ ### 3.1.15 (2022-06-27)
1311
+
1312
+ - (@GermanBluefox) Allowed using of spaces in name
1313
+
1314
+ ### 3.1.14 (2022-06-23)
1315
+
1316
+ - (@GermanBluefox) Added translations
1317
+
1318
+ ### 3.1.11 (2022-06-22)
1319
+
1320
+ - (@GermanBluefox) Added preparations for iobroker cloud
1321
+
1322
+ ### 3.1.10 (2022-06-22)
1323
+
1324
+ - (@GermanBluefox) Added translations
1325
+
1326
+ ### 3.1.9 (2022-06-20)
1327
+
1328
+ - (@GermanBluefox) Allowed working behind reverse proxy
1329
+
1330
+ ### 3.1.7 (2022-06-19)
1331
+
1332
+ - (@GermanBluefox) Added file select dialog
1333
+
1334
+ ### 3.1.3 (2022-06-13)
1335
+
1336
+ - (@GermanBluefox) Added table with resized headers
1337
+
1338
+ ### 3.1.2 (2022-06-09)
1339
+
1340
+ - (@GermanBluefox) Added new document icon (read only)
1341
+
1342
+ ### 3.1.1 (2022-06-09)
1343
+
1344
+ - (@GermanBluefox) Allowed working behind reverse proxy
1345
+
1346
+ ### 3.1.0 (2022-06-07)
1347
+
1348
+ - (@GermanBluefox) Some german texts were corrected
1349
+
1350
+ ### 3.0.17 (2022-06-03)
1351
+
1352
+ - (@GermanBluefox) Allowed calling getAdapterInstances not for admin too
1353
+
1354
+ ### 3.0.15 (2022-06-01)
1355
+
1356
+ - (@GermanBluefox) Updated JsonConfigComponent: password, table
1357
+
1358
+ ### 3.0.14 (2022-05-25)
1359
+
1360
+ - (@GermanBluefox) Added ConfigGeneric to import
1361
+
1362
+ ### 3.0.7 (2022-05-25)
1363
+
1364
+ - (@GermanBluefox) Made the module definitions
1365
+
1366
+ ### 3.0.6 (2022-05-25)
1367
+
1368
+ - (@GermanBluefox) Added JsonConfigComponent
1369
+
1370
+ ### 2.1.11 (2022-05-24)
1371
+
1372
+ - (@GermanBluefox) Update file browser. It supports now the file changed events.
1373
+
1374
+ ### 2.1.10 (2022-05-24)
1375
+
1376
+ - (@GermanBluefox) Corrected object browser
1377
+
1378
+ ### 2.1.9 (2022-05-16)
1379
+
1380
+ - (@GermanBluefox) Corrected expert mode in object browser
1381
+
1382
+ ### 2.1.7 (2022-05-09)
1383
+
1384
+ - (@GermanBluefox) Changes were synchronized with adapter-react-v5
1385
+ - (@GermanBluefox) Added `I18n.disableWarning` method
1386
+
1387
+ ### 2.1.6 (2022-03-28)
1388
+
1389
+ - (@GermanBluefox) Added `log` method to connection
1390
+ - (@GermanBluefox) Corrected translations
1391
+
1392
+ ### 2.1.1 (2022-03-27)
1393
+
1394
+ - (@GermanBluefox) Corrected error in TreeTable
1395
+
1396
+ ### 2.1.0 (2022-03-26)
1397
+
1398
+ - (@GermanBluefox) BREAKING_CHANGE: Corrected error with readFile(base64=false)
1399
+
1400
+ ### 2.0.0 (2022-03-26)
1401
+
1402
+ - (@GermanBluefox) Initial version
1403
+
1404
+ ### 0.1.0 (2022-03-23)
1405
+
1406
+ - (@GermanBluefox) Fixed theme errors
1407
+
1408
+ ### 0.0.4 (2022-03-22)
1409
+
1410
+ - (@GermanBluefox) Fixed eslint warnings
1411
+
1412
+ ### 0.0.3 (2022-03-19)
1413
+
1414
+ - (@GermanBluefox) beta version
1415
+
1416
+ ### 0.0.2 (2022-02-24)
1417
+
1418
+ - (@GermanBluefox) try to publish a first version
1419
+
1420
+ ### 0.0.1 (2022-02-24)
1421
+
1422
+ - initial commit
1423
+
1424
+ ## License
1425
+
1426
+ The MIT License (MIT)
1427
+
1428
+ Copyright (c) 2019-2024 @GermanBluefox <dogafox@gmail.com>
1429
+
1430
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1431
+ of this software and associated documentation files (the "Software"), to deal
1432
+ in the Software without restriction, including without limitation the rights
1433
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1434
+ copies of the Software, and to permit persons to whom the Software is
1435
+ furnished to do so, subject to the following conditions:
1436
+
1437
+ The above copyright notice and this permission notice shall be included in all
1438
+ copies or substantial portions of the Software.
1439
+
1440
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1441
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1442
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1443
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1444
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1445
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1446
+ SOFTWARE.