@iobroker/adapter-react-v5 6.1.10 → 7.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Components/FileBrowser.js +42 -16
- package/Components/ObjectBrowser.d.ts +10 -0
- package/Components/ObjectBrowser.js +228 -80
- package/README.md +1009 -1001
- package/Theme.js +8 -7
- package/i18n/de.json +4 -1
- package/i18n/en.json +4 -1
- package/i18n/es.json +4 -1
- package/i18n/fr.json +4 -1
- package/i18n/it.json +4 -1
- package/i18n/nl.json +4 -1
- package/i18n/pl.json +4 -1
- package/i18n/pt.json +4 -1
- package/i18n/ru.json +4 -1
- package/i18n/uk.json +4 -1
- package/i18n/zh-cn.json +4 -1
- package/package.json +5 -5
- package/src/Components/FileBrowser.tsx +45 -16
- package/src/Components/ObjectBrowser.tsx +281 -98
- package/src/Theme.tsx +2 -2
- package/types.d.ts +0 -134
|
@@ -420,7 +420,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
420
420
|
const folder = key.substring(0, pos);
|
|
421
421
|
console.log(`File changed ${key}[${size}]`);
|
|
422
422
|
if (this.state.folders[folder]) {
|
|
423
|
-
|
|
423
|
+
if (this._tempTimeout[folder]) {
|
|
424
|
+
clearTimeout(this._tempTimeout[folder]);
|
|
425
|
+
}
|
|
424
426
|
this._tempTimeout[folder] = setTimeout(() => {
|
|
425
427
|
delete this._tempTimeout[folder];
|
|
426
428
|
this.browseFolder(folder, null, false, true)
|
|
@@ -604,7 +606,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
604
606
|
}
|
|
605
607
|
}
|
|
606
608
|
componentWillUnmount() {
|
|
607
|
-
|
|
609
|
+
if (this.supportSubscribes) {
|
|
610
|
+
this.props.socket.unsubscribeFiles('*', '*', this.onFileChange);
|
|
611
|
+
}
|
|
608
612
|
this.mounted = false;
|
|
609
613
|
this.browseList = null;
|
|
610
614
|
this.browseListRunning = false;
|
|
@@ -687,7 +691,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
687
691
|
item.reject = null;
|
|
688
692
|
item.adapter = null;
|
|
689
693
|
item.relPath = null;
|
|
690
|
-
|
|
694
|
+
if (resolve) {
|
|
695
|
+
resolve(files);
|
|
696
|
+
}
|
|
691
697
|
this.browseListRunning = false;
|
|
692
698
|
if (this.browseList.length) {
|
|
693
699
|
if (level < 5) {
|
|
@@ -716,7 +722,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
716
722
|
item.reject = null;
|
|
717
723
|
item.adapter = null;
|
|
718
724
|
item.relPath = null;
|
|
719
|
-
|
|
725
|
+
if (reject) {
|
|
726
|
+
reject(e);
|
|
727
|
+
}
|
|
720
728
|
this.browseListRunning = false;
|
|
721
729
|
if (this.browseList.length) {
|
|
722
730
|
if (level < 5) {
|
|
@@ -804,7 +812,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
804
812
|
});
|
|
805
813
|
_folders.sort((a, b) => (a.id > b.id ? 1 : (a.id < b.id ? -1 : 0)));
|
|
806
814
|
if (!this.limitToObjectID || this.limitToObjectID === USER_DATA) {
|
|
807
|
-
|
|
815
|
+
if (userData) {
|
|
816
|
+
_folders.unshift(userData);
|
|
817
|
+
}
|
|
808
818
|
}
|
|
809
819
|
newFoldersNotNull[folderId || '/'] = _folders;
|
|
810
820
|
if (!_checkEmpty) {
|
|
@@ -815,7 +825,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
815
825
|
}
|
|
816
826
|
}
|
|
817
827
|
catch (e) {
|
|
818
|
-
this.initialReadFinished
|
|
828
|
+
if (this.initialReadFinished) {
|
|
829
|
+
window.alert(`Cannot read meta items: ${e}`);
|
|
830
|
+
}
|
|
819
831
|
newFoldersNotNull[folderId || '/'] = [];
|
|
820
832
|
}
|
|
821
833
|
return newFoldersNotNull;
|
|
@@ -876,7 +888,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
876
888
|
}
|
|
877
889
|
}
|
|
878
890
|
catch (e) {
|
|
879
|
-
this.initialReadFinished
|
|
891
|
+
if (this.initialReadFinished) {
|
|
892
|
+
window.alert(`Cannot read ${adapter}${relPath ? `/${relPath}` : ''}: ${e}`);
|
|
893
|
+
}
|
|
880
894
|
newFoldersNotNull[folderId] = [];
|
|
881
895
|
}
|
|
882
896
|
return newFoldersNotNull;
|
|
@@ -907,7 +921,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
907
921
|
}
|
|
908
922
|
}
|
|
909
923
|
changeFolder(e, folder) {
|
|
910
|
-
|
|
924
|
+
if (e) {
|
|
925
|
+
e.stopPropagation();
|
|
926
|
+
}
|
|
911
927
|
this.lastSelect = Date.now();
|
|
912
928
|
let _folder = folder || getParentDir(this.state.currentDir);
|
|
913
929
|
if (_folder === '/') {
|
|
@@ -935,7 +951,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
935
951
|
}, () => this.props.onSelect && this.props.onSelect(''));
|
|
936
952
|
}
|
|
937
953
|
select(id, e, cb) {
|
|
938
|
-
|
|
954
|
+
if (e) {
|
|
955
|
+
e.stopPropagation();
|
|
956
|
+
}
|
|
939
957
|
this.lastSelect = Date.now();
|
|
940
958
|
this.localStorage.setItem('files.selected', id);
|
|
941
959
|
this.setState({ selected: id, path: id, pathFocus: false }, () => {
|
|
@@ -950,7 +968,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
950
968
|
this.props.onSelect('');
|
|
951
969
|
}
|
|
952
970
|
}
|
|
953
|
-
|
|
971
|
+
if (cb) {
|
|
972
|
+
cb();
|
|
973
|
+
}
|
|
954
974
|
});
|
|
955
975
|
}
|
|
956
976
|
getText(text) {
|
|
@@ -1236,7 +1256,7 @@ class FileBrowserClass extends react_1.Component {
|
|
|
1236
1256
|
!this.state.selected.startsWith(`${this.limitToPath}/`) &&
|
|
1237
1257
|
this.limitToPath !== this.state.selected), title: this.props.t('ra_Upload file'), style: styles.menuButton, color: "inherit", "aria-label": "upload file", onClick: () => this.setState({ uploadFile: true }), size: "small" },
|
|
1238
1258
|
react_1.default.createElement(icons_material_1.Publish, { fontSize: "small" })) : null,
|
|
1239
|
-
this.props.showTypeSelector && IconType ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Filter files'),
|
|
1259
|
+
this.props.showTypeSelector && IconType ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Filter files'), slotProps: { popper: { sx: styles.tooltip } } },
|
|
1240
1260
|
react_1.default.createElement(material_1.IconButton, { size: "small", onClick: e => this.setState({ showTypesMenu: e.target }) },
|
|
1241
1261
|
react_1.default.createElement(IconType, { fontSize: "small" }))) : null,
|
|
1242
1262
|
this.state.showTypesMenu ? react_1.default.createElement(material_1.Menu, { open: !0, anchorEl: this.state.showTypesMenu, onClose: () => this.setState({ showTypesMenu: null }) }, Object.keys(FILE_TYPE_ICONS).map(type => {
|
|
@@ -1255,10 +1275,10 @@ class FileBrowserClass extends react_1.Component {
|
|
|
1255
1275
|
react_1.default.createElement(MyIcon, { fontSize: "small" })),
|
|
1256
1276
|
react_1.default.createElement(material_1.ListItemText, null, this.props.t(`ra_fileType_${type}`)));
|
|
1257
1277
|
})) : null,
|
|
1258
|
-
react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Background image'),
|
|
1278
|
+
react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Background image'), slotProps: { popper: { sx: styles.tooltip } } },
|
|
1259
1279
|
react_1.default.createElement(material_1.IconButton, { color: "inherit", edge: "start", style: styles.menuButton, onClick: this.setStateBackgroundImage, size: "small" },
|
|
1260
1280
|
react_1.default.createElement(icons_material_1.Brightness6, { fontSize: "small" }))),
|
|
1261
|
-
this.state.viewType !== TABLE && this.props.allowDelete ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Delete'),
|
|
1281
|
+
this.state.viewType !== TABLE && this.props.allowDelete ? react_1.default.createElement(material_1.Tooltip, { title: this.props.t('ra_Delete'), slotProps: { popper: { sx: styles.tooltip } } },
|
|
1262
1282
|
react_1.default.createElement("span", null,
|
|
1263
1283
|
react_1.default.createElement(material_1.IconButton, { "aria-label": "delete", disabled: !this.state.selected ||
|
|
1264
1284
|
this.state.selected === 'vis.0/' ||
|
|
@@ -1327,7 +1347,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
1327
1347
|
return null;
|
|
1328
1348
|
}
|
|
1329
1349
|
componentDidUpdate( /* prevProps , prevState, snapshot */) {
|
|
1330
|
-
|
|
1350
|
+
if (this.setOpacityTimer) {
|
|
1351
|
+
clearTimeout(this.setOpacityTimer);
|
|
1352
|
+
}
|
|
1331
1353
|
this.setOpacityTimer = setTimeout(() => {
|
|
1332
1354
|
this.setOpacityTimer = null;
|
|
1333
1355
|
const items = window.document.getElementsByClassName('browserItem');
|
|
@@ -1545,7 +1567,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
1545
1567
|
}
|
|
1546
1568
|
});
|
|
1547
1569
|
if (changed) {
|
|
1548
|
-
|
|
1570
|
+
if (this.cacheFoldersTimeout) {
|
|
1571
|
+
clearTimeout(this.cacheFoldersTimeout);
|
|
1572
|
+
}
|
|
1549
1573
|
this.cacheFoldersTimeout = setTimeout(() => {
|
|
1550
1574
|
this.cacheFoldersTimeout = null;
|
|
1551
1575
|
const folders = this.cacheFolders || {};
|
|
@@ -1588,7 +1612,9 @@ class FileBrowserClass extends react_1.Component {
|
|
|
1588
1612
|
: `/${this.state.currentDir}`.split('/');
|
|
1589
1613
|
const p = [];
|
|
1590
1614
|
return react_1.default.createElement(material_1.Breadcrumbs, { style: { paddingLeft: 8 } }, parts.map((part, i) => {
|
|
1591
|
-
|
|
1615
|
+
if (part) {
|
|
1616
|
+
p.push(part);
|
|
1617
|
+
}
|
|
1592
1618
|
const path = p.join('/');
|
|
1593
1619
|
if (i < parts.length - 1) {
|
|
1594
1620
|
return react_1.default.createElement(material_1.Box, { component: "div", key: `${this.state.selected}_${i}`, sx: styles.pathDivBreadcrumbDir, onClick: e => this.changeFolder(e, path || '/') }, part || this.props.t('ra_Root'));
|
|
@@ -331,6 +331,10 @@ interface ObjectBrowserState {
|
|
|
331
331
|
showDescription: boolean;
|
|
332
332
|
showContextMenu: {
|
|
333
333
|
item: TreeItem;
|
|
334
|
+
position: {
|
|
335
|
+
left: number;
|
|
336
|
+
top: number;
|
|
337
|
+
};
|
|
334
338
|
subItem?: string;
|
|
335
339
|
subAnchor?: HTMLLIElement;
|
|
336
340
|
} | null;
|
|
@@ -352,6 +356,8 @@ interface ObjectBrowserState {
|
|
|
352
356
|
el: React.JSX.Element[];
|
|
353
357
|
id: string;
|
|
354
358
|
};
|
|
359
|
+
/** Show the menu with aliases for state */
|
|
360
|
+
aliasMenu: string;
|
|
355
361
|
}
|
|
356
362
|
export declare class ObjectBrowserClass extends Component<ObjectBrowserProps, ObjectBrowserState> {
|
|
357
363
|
#private;
|
|
@@ -469,6 +475,7 @@ export declare class ObjectBrowserClass extends Component<ObjectBrowserProps, Ob
|
|
|
469
475
|
onObjectChangeFromWorker: (events: ObjectEvent[]) => void;
|
|
470
476
|
onObjectChange: (id: string, obj?: ioBroker.Object | null) => void;
|
|
471
477
|
afterObjectUpdated(): void;
|
|
478
|
+
updateAliases(aliasId: string): void;
|
|
472
479
|
/**
|
|
473
480
|
* Processes a single element in regard to certain filters, columns for admin and updates object dict
|
|
474
481
|
* @returns Returns an object containing the new state (if any) and whether the object was filtered.
|
|
@@ -537,6 +544,7 @@ export declare class ObjectBrowserClass extends Component<ObjectBrowserProps, Ob
|
|
|
537
544
|
* Renders a custom value.
|
|
538
545
|
*/
|
|
539
546
|
renderCustomValue(obj: ioBroker.Object, it: AdapterColumn, item: TreeItem): React.JSX.Element | null;
|
|
547
|
+
renderAliasLink(id: string, index?: number, customStyle?: Record<string, any>): React.JSX.Element | null;
|
|
540
548
|
/**
|
|
541
549
|
* Renders a leaf.
|
|
542
550
|
*/
|
|
@@ -582,6 +590,8 @@ export declare class ObjectBrowserClass extends Component<ObjectBrowserProps, Ob
|
|
|
582
590
|
private renderViewObjectFileDialog;
|
|
583
591
|
private renderAliasEditorDialog;
|
|
584
592
|
showAddDataPointDialog(id: string, initialType: ioBroker.ObjectType, initialStateType?: ioBroker.CommonType): void;
|
|
593
|
+
/** Renders the aliases list for one state (if more than 2) */
|
|
594
|
+
private renderAliasMenu;
|
|
585
595
|
/**
|
|
586
596
|
* Renders the right mouse button context menu
|
|
587
597
|
*/
|