@iobroker/adapter-react-v5 7.7.2 → 7.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/build/Components/CustomModal.js +4 -2
  2. package/build/Components/CustomModal.js.map +1 -1
  3. package/build/Components/FileBrowser.d.ts +1 -1
  4. package/build/Components/FileBrowser.js +12 -5
  5. package/build/Components/FileBrowser.js.map +1 -1
  6. package/build/Components/FileViewer.js +1 -1
  7. package/build/Components/FileViewer.js.map +1 -1
  8. package/build/Components/ObjectBrowser.d.ts +7 -5
  9. package/build/Components/ObjectBrowser.js +107 -44
  10. package/build/Components/ObjectBrowser.js.map +1 -1
  11. package/build/Components/Utils.d.ts +7 -6
  12. package/build/Components/Utils.js +67 -62
  13. package/build/Components/Utils.js.map +1 -1
  14. package/build/Dialogs/SelectFile.d.ts +2 -0
  15. package/build/Dialogs/SelectFile.js +2 -3
  16. package/build/Dialogs/SelectFile.js.map +1 -1
  17. package/build/Dialogs/SelectID.d.ts +7 -6
  18. package/build/Dialogs/SelectID.js +3 -3
  19. package/build/Dialogs/SelectID.js.map +1 -1
  20. package/build/LegacyConnection.d.ts +14 -1
  21. package/build/LegacyConnection.js +26 -2
  22. package/build/LegacyConnection.js.map +1 -1
  23. package/build/i18n/de.json +8 -0
  24. package/build/i18n/en.json +8 -0
  25. package/build/i18n/es.json +8 -0
  26. package/build/i18n/fr.json +8 -0
  27. package/build/i18n/it.json +3 -0
  28. package/build/i18n/nl.json +3 -0
  29. package/build/i18n/pl.json +6 -3
  30. package/build/i18n/pt.json +3 -0
  31. package/build/i18n/ru.json +3 -0
  32. package/build/i18n/uk.json +3 -0
  33. package/build/i18n/zh-cn.json +3 -0
  34. package/build/types.d.ts +2 -0
  35. package/i18n/de.json +8 -0
  36. package/i18n/en.json +8 -0
  37. package/i18n/es.json +8 -0
  38. package/i18n/fr.json +8 -0
  39. package/i18n/it.json +3 -0
  40. package/i18n/nl.json +3 -0
  41. package/i18n/pl.json +6 -3
  42. package/i18n/pt.json +3 -0
  43. package/i18n/ru.json +3 -0
  44. package/i18n/uk.json +3 -0
  45. package/i18n/zh-cn.json +3 -0
  46. package/package.json +8 -8
  47. package/craco-module-federation.js +0 -62
@@ -1,5 +1,5 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { Dialog, DialogActions, DialogContent, DialogTitle, IconButton, TextField, Button } from '@mui/material';
2
+ import { Dialog, DialogActions, DialogContent, DialogTitle, IconButton, TextField, Button, useMediaQuery, useTheme, } from '@mui/material';
3
3
  import { Check as CheckIcon, Close as CloseIcon, Language as LanguageIcon } from '@mui/icons-material';
4
4
  import { I18n } from '../i18n';
5
5
  import { Utils } from './Utils';
@@ -33,11 +33,13 @@ export function CustomModal(props) {
33
33
  useEffect(() => {
34
34
  setValue(defaultValue || '');
35
35
  }, [defaultValue]);
36
+ const muiTheme = useTheme();
37
+ const isSmallScreen = useMediaQuery(muiTheme.breakpoints.down('md'));
36
38
  let Icon = null;
37
39
  if (icon) {
38
40
  Icon = icon;
39
41
  }
40
- return (React.createElement(Dialog, { open: open, maxWidth: maxWidth || 'md', fullWidth: !!fullWidth, disableEscapeKeyDown: false, onClose: onClose, sx: { '& .MuiDialog-paper': styles.modalDialog } },
42
+ return (React.createElement(Dialog, { open: open, maxWidth: isSmallScreen ? false : maxWidth || 'md', fullWidth: !!fullWidth, fullScreen: isSmallScreen, disableEscapeKeyDown: false, onClose: onClose, sx: { '& .MuiDialog-paper': isSmallScreen ? {} : styles.modalDialog } },
41
43
  title && (React.createElement(DialogTitle, null,
42
44
  icon ? React.createElement(Icon, { style: styles.titleIcon }) : null,
43
45
  title,
@@ -1 +1 @@
1
- {"version":3,"file":"CustomModal.js","sourceRoot":"./src/","sources":["Components/CustomModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\n\nimport { Dialog, DialogActions, DialogContent, DialogTitle, IconButton, TextField, Button } from '@mui/material';\n\nimport { Check as CheckIcon, Close as CloseIcon, Language as LanguageIcon } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport type { IobTheme } from '../types';\nimport { Utils } from './Utils';\n\nconst styles: Record<string, any> = {\n modalDialog: {\n minWidth: 400,\n maxWidth: 800,\n },\n overflowHidden: {\n display: 'flex',\n overflow: 'hidden',\n },\n titleIcon: {\n marginRight: 5,\n },\n content: {\n fontSize: 16,\n },\n languageButton: {\n position: 'absolute',\n right: 8,\n top: 8,\n },\n languageButtonActive: (theme: IobTheme) => ({\n color: theme.palette.primary.main,\n }),\n};\n\ninterface CustomModalProps {\n icon?: any;\n open: boolean;\n onClose: () => void;\n children: React.JSX.Element | null;\n titleButtonClose?: string;\n titleButtonApply?: string;\n onApply: (result: string) => void;\n fullWidth?: boolean;\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n applyButton?: boolean;\n applyDisabled?: boolean;\n overflowHidden?: boolean;\n help?: string;\n noTranslation?: boolean;\n toggleTranslation?: () => void;\n title?: string;\n progress?: boolean;\n textInput?: boolean;\n defaultValue?: string;\n theme: IobTheme;\n}\n\nexport function CustomModal(props: CustomModalProps): React.JSX.Element {\n const {\n open,\n toggleTranslation,\n noTranslation,\n title,\n fullWidth,\n help,\n maxWidth,\n progress,\n icon,\n applyDisabled,\n applyButton,\n onClose,\n children,\n titleButtonApply,\n titleButtonClose,\n onApply,\n textInput,\n defaultValue,\n overflowHidden,\n } = props;\n\n const [value, setValue] = useState<string>(defaultValue || '');\n\n useEffect(() => {\n setValue(defaultValue || '');\n }, [defaultValue]);\n\n let Icon = null;\n\n if (icon) {\n Icon = icon;\n }\n\n return (\n <Dialog\n open={open}\n maxWidth={maxWidth || 'md'}\n fullWidth={!!fullWidth}\n disableEscapeKeyDown={false}\n onClose={onClose}\n sx={{ '& .MuiDialog-paper': styles.modalDialog }}\n >\n {title && (\n <DialogTitle>\n {icon ? <Icon style={styles.titleIcon} /> : null}\n {title}\n {I18n.getLanguage() !== 'en' && toggleTranslation ? (\n <IconButton\n size=\"large\"\n sx={Utils.getStyle(\n props.theme,\n styles.languageButton,\n noTranslation && styles.languageButtonActive,\n )}\n onClick={() => toggleTranslation()}\n title={I18n.t('Disable/Enable translation')}\n >\n <LanguageIcon />\n </IconButton>\n ) : null}\n </DialogTitle>\n )}\n <DialogContent\n style={{ ...styles.content, ...(overflowHidden ? styles.overflowHidden : undefined), paddingTop: 8 }}\n >\n {textInput && (\n <TextField\n // className={className}\n autoComplete=\"off\"\n fullWidth\n autoFocus\n variant=\"outlined\"\n size=\"medium\"\n // rows={10}\n multiline\n value={value}\n onChange={e => setValue(e.target.value)}\n // customValue\n />\n )}\n {children}\n {help ? <div>{help}</div> : null}\n </DialogContent>\n <DialogActions>\n {applyButton !== false && (\n <Button\n startIcon={<CheckIcon />}\n disabled={progress || (applyDisabled && defaultValue === value)}\n onClick={() => onApply(textInput ? value : '')}\n variant=\"contained\"\n color=\"primary\"\n >\n {I18n.t(titleButtonApply || 'ra_Ok')}\n </Button>\n )}\n <Button\n color=\"grey\"\n onClick={onClose}\n disabled={progress}\n variant=\"contained\"\n startIcon={<CloseIcon />}\n >\n {I18n.t(titleButtonClose || 'ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"]}
1
+ {"version":3,"file":"CustomModal.js","sourceRoot":"./src/","sources":["Components/CustomModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\n\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n TextField,\n Button,\n useMediaQuery,\n useTheme,\n} from '@mui/material';\n\nimport { Check as CheckIcon, Close as CloseIcon, Language as LanguageIcon } from '@mui/icons-material';\n\nimport { I18n } from '../i18n';\nimport type { IobTheme } from '../types';\nimport { Utils } from './Utils';\n\nconst styles: Record<string, any> = {\n modalDialog: {\n minWidth: 400,\n maxWidth: 800,\n },\n overflowHidden: {\n display: 'flex',\n overflow: 'hidden',\n },\n titleIcon: {\n marginRight: 5,\n },\n content: {\n fontSize: 16,\n },\n languageButton: {\n position: 'absolute',\n right: 8,\n top: 8,\n },\n languageButtonActive: (theme: IobTheme) => ({\n color: theme.palette.primary.main,\n }),\n};\n\ninterface CustomModalProps {\n icon?: any;\n open: boolean;\n onClose: () => void;\n children: React.JSX.Element | null;\n titleButtonClose?: string;\n titleButtonApply?: string;\n onApply: (result: string) => void;\n fullWidth?: boolean;\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n applyButton?: boolean;\n applyDisabled?: boolean;\n overflowHidden?: boolean;\n help?: string;\n noTranslation?: boolean;\n toggleTranslation?: () => void;\n title?: string;\n progress?: boolean;\n textInput?: boolean;\n defaultValue?: string;\n theme: IobTheme;\n}\n\nexport function CustomModal(props: CustomModalProps): React.JSX.Element {\n const {\n open,\n toggleTranslation,\n noTranslation,\n title,\n fullWidth,\n help,\n maxWidth,\n progress,\n icon,\n applyDisabled,\n applyButton,\n onClose,\n children,\n titleButtonApply,\n titleButtonClose,\n onApply,\n textInput,\n defaultValue,\n overflowHidden,\n } = props;\n\n const [value, setValue] = useState<string>(defaultValue || '');\n\n useEffect(() => {\n setValue(defaultValue || '');\n }, [defaultValue]);\n\n const muiTheme = useTheme();\n const isSmallScreen = useMediaQuery(muiTheme.breakpoints.down('md'));\n\n let Icon = null;\n\n if (icon) {\n Icon = icon;\n }\n\n return (\n <Dialog\n open={open}\n maxWidth={isSmallScreen ? false : maxWidth || 'md'}\n fullWidth={!!fullWidth}\n fullScreen={isSmallScreen}\n disableEscapeKeyDown={false}\n onClose={onClose}\n sx={{ '& .MuiDialog-paper': isSmallScreen ? {} : styles.modalDialog }}\n >\n {title && (\n <DialogTitle>\n {icon ? <Icon style={styles.titleIcon} /> : null}\n {title}\n {I18n.getLanguage() !== 'en' && toggleTranslation ? (\n <IconButton\n size=\"large\"\n sx={Utils.getStyle(\n props.theme,\n styles.languageButton,\n noTranslation && styles.languageButtonActive,\n )}\n onClick={() => toggleTranslation()}\n title={I18n.t('Disable/Enable translation')}\n >\n <LanguageIcon />\n </IconButton>\n ) : null}\n </DialogTitle>\n )}\n <DialogContent\n style={{ ...styles.content, ...(overflowHidden ? styles.overflowHidden : undefined), paddingTop: 8 }}\n >\n {textInput && (\n <TextField\n // className={className}\n autoComplete=\"off\"\n fullWidth\n autoFocus\n variant=\"outlined\"\n size=\"medium\"\n // rows={10}\n multiline\n value={value}\n onChange={e => setValue(e.target.value)}\n // customValue\n />\n )}\n {children}\n {help ? <div>{help}</div> : null}\n </DialogContent>\n <DialogActions>\n {applyButton !== false && (\n <Button\n startIcon={<CheckIcon />}\n disabled={progress || (applyDisabled && defaultValue === value)}\n onClick={() => onApply(textInput ? value : '')}\n variant=\"contained\"\n color=\"primary\"\n >\n {I18n.t(titleButtonApply || 'ra_Ok')}\n </Button>\n )}\n <Button\n color=\"grey\"\n onClick={onClose}\n disabled={progress}\n variant=\"contained\"\n startIcon={<CloseIcon />}\n >\n {I18n.t(titleButtonClose || 'ra_Cancel')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright 2020-2024, Denis Haev <dogafox@gmail.com>
2
+ * Copyright 2020-2025, Denis Haev <dogafox@gmail.com>
3
3
  *
4
4
  * MIT License
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright 2020-2024, Denis Haev <dogafox@gmail.com>
2
+ * Copyright 2020-2025, Denis Haev <dogafox@gmail.com>
3
3
  *
4
4
  * MIT License
5
5
  *
@@ -544,6 +544,8 @@ export class FileBrowserClass extends Component {
544
544
  async componentDidMount() {
545
545
  this.mounted = true;
546
546
  this.loadFolders().catch(error => console.error(`Cannot load folders: ${error}`));
547
+ this.browseList = [];
548
+ this.browseListRunning = false;
547
549
  this.supportSubscribes = await this.props.socket.checkFeatureSupported('BINARY_STATE_EVENT');
548
550
  if (this.supportSubscribes) {
549
551
  await this.props.socket.subscribeFiles('*', '*', this.onFileChange);
@@ -556,7 +558,11 @@ export class FileBrowserClass extends Component {
556
558
  this.mounted = false;
557
559
  this.browseList = null;
558
560
  this.browseListRunning = false;
559
- Object.values(this._tempTimeout).forEach(timer => timer && clearTimeout(timer));
561
+ Object.values(this._tempTimeout).forEach(timer => {
562
+ if (timer) {
563
+ clearTimeout(timer);
564
+ }
565
+ });
560
566
  this._tempTimeout = {};
561
567
  }
562
568
  browseFoldersCb(foldersList, newFoldersNotNull, cb) {
@@ -623,7 +629,7 @@ export class FileBrowserClass extends Component {
623
629
  }
624
630
  this.browseList[0].processing = true;
625
631
  this.props.socket
626
- .readDir(this.browseList[0].adapter, this.browseList[0].relPath)
632
+ .readDir(this.browseList[0].adapter, this.browseList[0].relPath || '')
627
633
  .then(files => {
628
634
  if (this.browseList) {
629
635
  // if component still mounted
@@ -987,7 +993,7 @@ export class FileBrowserClass extends Component {
987
993
  const isSpecialData = isUserData || item.name === 'vis.0' || item.name === 'vis-2.0';
988
994
  const iconStyle = Utils.getStyle(this.props.theme, styles[`itemFolderIcon${this.state.viewType}`], isSpecialData && styles.specialFolder);
989
995
  return (React.createElement(Box, { component: "div", key: item.id, id: item.id, style: this.state.viewType === TABLE
990
- ? { marginLeft: padding, width: `calc(100% - ${padding}px` }
996
+ ? { marginLeft: padding, width: `calc(100% - ${padding}px)` }
991
997
  : undefined, onClick: e => (this.state.viewType === TABLE ? this.select(item.id, e) : this.changeFolder(e, item.id)), onDoubleClick: e => this.state.viewType === TABLE && this.toggleFolder(item, e), title: this.getText(item.title), className: "browserItem", sx: Utils.getStyle(this.props.theme, styles[`item${this.state.viewType}`], styles[`itemFolder${this.state.viewType}`], this.state.selected === item.id ? styles.itemSelected : {}, item.temp ? styles.itemFolderTemp : {}) },
992
998
  React.createElement(IconEl, { style: iconStyle, onClick: this.state.viewType === TABLE ? (e) => this.toggleFolder(item, e) : undefined }),
993
999
  React.createElement(Box, { component: "div", sx: Utils.getStyle(this.props.theme, styles[`itemName${this.state.viewType}`], styles[`itemNameFolder${this.state.viewType}`]) }, isUserData ? this.props.t('ra_User files') : item.name),
@@ -1064,6 +1070,7 @@ export class FileBrowserClass extends Component {
1064
1070
  case 'txt':
1065
1071
  case 'css':
1066
1072
  case 'log':
1073
+ case 'csv':
1067
1074
  return true;
1068
1075
  default:
1069
1076
  return false;
@@ -1568,7 +1575,7 @@ export class FileBrowserClass extends Component {
1568
1575
  }
1569
1576
  renderViewDialog() {
1570
1577
  const FileViewerComponent = this.props.FileViewer || FileViewer;
1571
- return this.state.viewer ? (React.createElement(FileViewerComponent, { supportSubscribes: this.supportSubscribes, key: this.state.viewer, href: this.state.viewer, formatEditFile: this.state.formatEditFile, themeType: this.props.themeType, setStateBackgroundImage: this.setStateBackgroundImage, getStyleBackgroundImage: this.getStyleBackgroundImage, t: this.props.t, socket: this.props.socket, onClose: () => this.setState({ viewer: '', formatEditFile: '' }) })) : null;
1578
+ return this.state.viewer ? (React.createElement(FileViewerComponent, { supportSubscribes: this.supportSubscribes || undefined, key: this.state.viewer, href: this.state.viewer, formatEditFile: this.state.formatEditFile || undefined, themeType: this.props.themeType || 'light', setStateBackgroundImage: this.setStateBackgroundImage, getStyleBackgroundImage: this.getStyleBackgroundImage, t: this.props.t, socket: this.props.socket, onClose: () => this.setState({ viewer: '', formatEditFile: '' }) })) : null;
1572
1579
  }
1573
1580
  renderError() {
1574
1581
  if (this.state.errorText) {