iobroker.admin 7.1.2 → 7.1.3

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 (26) hide show
  1. package/README.md +7 -4
  2. package/adminWww/asset-manifest.json +13 -13
  3. package/adminWww/index.html +1 -1
  4. package/adminWww/static/css/{3210.f6c8a5fc.chunk.css → 4684.f5525d8f.chunk.css} +2 -2
  5. package/adminWww/static/css/4684.f5525d8f.chunk.css.map +1 -0
  6. package/adminWww/static/js/2534.89c71e34.chunk.js +2 -0
  7. package/adminWww/static/js/2534.89c71e34.chunk.js.map +1 -0
  8. package/adminWww/static/js/4684.e5f7632b.chunk.js +2 -0
  9. package/adminWww/static/js/4684.e5f7632b.chunk.js.map +1 -0
  10. package/adminWww/static/js/5056.9247882b.chunk.js +3 -0
  11. package/adminWww/static/js/5056.9247882b.chunk.js.map +1 -0
  12. package/adminWww/static/js/{8038.ae8b7862.chunk.js → 8038.64137a64.chunk.js} +2 -2
  13. package/adminWww/static/js/8038.64137a64.chunk.js.map +1 -0
  14. package/adminWww/static/js/{main.423e60b6.js → main.d3fd9aec.js} +2 -2
  15. package/adminWww/static/js/{main.423e60b6.js.map → main.d3fd9aec.js.map} +1 -1
  16. package/io-package.json +14 -14
  17. package/package.json +4 -13
  18. package/adminWww/static/css/3210.f6c8a5fc.chunk.css.map +0 -1
  19. package/adminWww/static/js/2534.d8fd195b.chunk.js +0 -2
  20. package/adminWww/static/js/2534.d8fd195b.chunk.js.map +0 -1
  21. package/adminWww/static/js/3210.1be726e7.chunk.js +0 -2
  22. package/adminWww/static/js/3210.1be726e7.chunk.js.map +0 -1
  23. package/adminWww/static/js/6539.0a444811.chunk.js +0 -3
  24. package/adminWww/static/js/6539.0a444811.chunk.js.map +0 -1
  25. package/adminWww/static/js/8038.ae8b7862.chunk.js.map +0 -1
  26. /package/adminWww/static/js/{6539.0a444811.chunk.js.LICENSE.txt → 5056.9247882b.chunk.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/2534.89c71e34.chunk.js","mappings":"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","sources":["assets/sentry.svg","components/CustomSelectButton.tsx","helpers/MaterialDynamicIcon.tsx","components/Adapters/AdaptersUpdater.tsx","dialogs/AdaptersUpdaterDialog.tsx","dialogs/GitHubInstallDialog.tsx","dialogs/AddInstanceDialog.tsx","components/Adapters/Utils.ts","components/Adapters/AdapterInstallDialog.tsx","components/Adapters/AdapterCategoryRow.tsx","dialogs/RatingDialog.tsx","dialogs/AdapterDeletionDialog.tsx","dialogs/AutoUpgradeConfigDialog.tsx","components/Adapters/AdapterGeneric.tsx","components/Adapters/AdapterTile.tsx","components/Adapters/AdapterRow.tsx","components/Adapters/AdaptersList.tsx","dialogs/AdminUpdater.tsx","tabs/Adapters.tsx"],"sourcesContent":["var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgSentry(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"0 0 256 230\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M251.22 187.856c5.785 10.045 6.345 20.608 1.538 28.958-4.8 8.357-14.192 13.143-25.768 13.143h-21.816c.259-4.068.431-8.17.431-12.302 0-4.628-.215-9.198-.531-13.754l14.35-.014c3.528 0 6.38-2.867 6.38-6.403a6.46 6.46 0 0 0-.768-3.053l-91.46-158.97a6.349 6.349 0 0 0-5.54-3.24 6.374 6.374 0 0 0-5.461 3.09l-14.522 25.243c44.134 33.27 73.804 84.813 77.864 143.333.316 4.548.531 9.119.531 13.753 0 4.132-.172 8.228-.424 12.302h-71.246c.388-4.053.611-8.148.611-12.302 0-4.649-.273-9.233-.776-13.753-3.52-32.206-19.286-60.748-42.503-80.89l-10.003 17.376c17.54 16.325 29.512 38.558 32.767 63.514.59 4.505.92 9.09.92 13.753 0 4.154-.273 8.264-.74 12.302H29.01c-11.576 0-20.968-4.793-25.768-13.15-4.807-8.35-4.247-18.905 1.538-28.958l13.56-23.238a79.42 79.42 0 0 1 20.715 16.052l-8.083 13.768a6.523 6.523 0 0 0-.77 3.054 6.383 6.383 0 0 0 6.382 6.395l32.033.015c-2.687-15.356-9.772-29.21-19.918-40.183-5.979-6.445-12.963-11.9-20.738-16.074l35.77-62.15a151.427 151.427 0 0 1 21.564 14.624c30.827 25.013 51.644 61.955 55.416 103.776h19.172c-3.91-48.892-28.477-92.006-64.937-120.548a171.205 171.205 0 0 0-21.672-14.457l30.532-53.045C109.583 5.77 118.42 0 128.036 0c9.607 0 18.438 5.77 24.223 15.823l98.961 172.033z\",\n fill: \"#FB2D26\"\n })));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgSentry);\nexport default __webpack_public_path__ + \"static/media/sentry.e732e10c5c1ceed0955b2fec6dab33f8.svg\";\nexport { ForwardRef as ReactComponent };","import React, { useState, type JSX } from 'react';\n\nimport { Button, Menu, MenuItem, Tooltip } from '@mui/material';\n\nimport type { Translate } from '@iobroker/adapter-react-v5';\nimport MaterialDynamicIcon from '../helpers/MaterialDynamicIcon';\n\nconst styles: Record<string, React.CSSProperties> = {\n button: {\n marginLeft: 10,\n marginRight: 10,\n },\n icon: {\n marginRight: 5,\n },\n};\n\ninterface CustomSelectButtonProps {\n arrayItem: { name: string | number }[];\n title?: string;\n onClick: (name: string | number) => void;\n value: string | number;\n contained?: boolean;\n buttonIcon?: JSX.Element;\n icons?: boolean;\n t: Translate;\n translateSuffix?: string;\n noTranslation?: boolean;\n}\n\nfunction CustomSelectButton({\n arrayItem,\n title,\n onClick,\n value,\n contained,\n buttonIcon,\n icons,\n t,\n translateSuffix,\n noTranslation,\n}: CustomSelectButtonProps): JSX.Element {\n const [anchorEl, setAnchorEl] = useState(null);\n translateSuffix = translateSuffix || '';\n\n return (\n <>\n <Tooltip\n title={title || ''}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <Button\n style={styles.button}\n variant={contained ? 'contained' : 'outlined'}\n color=\"primary\"\n onClick={e => setAnchorEl(e.currentTarget)}\n >\n {buttonIcon ||\n (icons && (\n <MaterialDynamicIcon\n iconName={value as string}\n style={styles.icon}\n />\n ))}\n {typeof value === 'number' ? value : noTranslation ? value : t(value + translateSuffix)}\n </Button>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n keepMounted\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(null)}\n >\n {arrayItem.map(({ name }, idx) => (\n <MenuItem\n key={name}\n selected={value ? name === value : value === 0 ? name === value : idx === 0}\n disabled={value ? name === value : value === 0 ? name === value : idx === 0}\n className={`tag-card-${name}`}\n style={{ placeContent: 'space-between' }}\n value={name}\n onClick={() => {\n onClick(name);\n setAnchorEl(null);\n }}\n >\n {icons && (\n <MaterialDynamicIcon\n iconName={name as string}\n style={styles.icon}\n />\n )}\n {typeof name === 'number' ? name : noTranslation ? name : t(name + translateSuffix)}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n\nexport default CustomSelectButton;\n","import React, { useState, useEffect, type JSX } from 'react';\nimport {\n AllInclusive,\n Message,\n WifiTethering,\n Apps,\n VpnKey,\n NotificationsActive,\n SystemUpdateAlt,\n EmojiSymbols,\n PermMedia,\n SettingsEthernet,\n Storage,\n Visibility,\n SettingsBrightness,\n DateRange,\n BatteryChargingFull,\n FilterVintage,\n LocationOn,\n Phonelink,\n Favorite,\n House,\n Apartment,\n EmojiObjects,\n DialerSip,\n PhonelinkSetup,\n AirportShuttle,\n BubbleChart,\n Widgets,\n Brightness6,\n LinearScale,\n Help,\n} from '@mui/icons-material';\nimport { type SvgIconComponent } from '@mui/icons-material';\n\nconst ICON_CACHE: Record<string, Promise<ioBroker.AdapterObject>> = {};\n\nconst objIcon: Record<string, SvgIconComponent> = {\n All: AllInclusive,\n messaging: Message,\n communication: WifiTethering,\n general: Apps,\n logic: VpnKey,\n alarm: NotificationsActive,\n 'iot-systems': SystemUpdateAlt,\n 'misc-data': EmojiSymbols,\n multimedia: PermMedia,\n network: SettingsEthernet,\n storage: Storage,\n visualization: Visibility,\n 'climate-control': SettingsBrightness,\n 'date-and-time': DateRange,\n energy: BatteryChargingFull,\n garden: FilterVintage,\n geoposition: LocationOn,\n hardware: Phonelink,\n health: Favorite,\n household: House,\n infrastructure: Apartment,\n lighting: EmojiObjects,\n protocols: DialerSip,\n utility: PhonelinkSetup,\n vehicle: AirportShuttle,\n 'visualization-icons': BubbleChart,\n 'visualization-widgets': Widgets,\n weather: Brightness6,\n metering: LinearScale,\n};\n\ninterface MaterialDynamicIconProps {\n iconName?: string;\n className?: string;\n style?: React.CSSProperties;\n adapter?: string;\n socket?: any;\n onClick?: (e: React.MouseEvent) => void;\n}\n\nfunction MaterialDynamicIcon({\n iconName,\n className,\n adapter,\n socket,\n onClick,\n style,\n}: MaterialDynamicIconProps): JSX.Element {\n const [url, setUrl] = useState('');\n\n useEffect(() => {\n if (adapter && socket) {\n if (!(ICON_CACHE[adapter] instanceof Promise)) {\n ICON_CACHE[adapter] = socket.getObject(`system.adapter.${adapter}`);\n }\n void ICON_CACHE[adapter].then(\n obj => obj?.common?.icon && setUrl(`../../adapter/${adapter}/${obj.common.icon}`),\n );\n }\n }, [adapter, socket]);\n\n if (adapter) {\n return (\n <img\n onClick={e => onClick && onClick(e)}\n src={url || ''}\n className={className}\n style={style}\n alt=\"\"\n />\n );\n }\n const Element = objIcon[iconName] || Help;\n\n return (\n <Element\n className={className}\n style={style}\n onClick={(e: React.MouseEvent) => onClick && onClick(e)}\n />\n );\n}\n\nexport default MaterialDynamicIcon;\n","import React, { Component, type JSX } from 'react';\nimport semver from 'semver';\n\nimport {\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Checkbox,\n Avatar,\n Button,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Grid2,\n IconButton,\n Typography,\n Box,\n} from '@mui/material';\n\nimport { Close as CloseIcon, Language as LanguageIcon, Info as InfoIcon } from '@mui/icons-material';\n\nimport { I18n, type IobTheme, Utils } from '@iobroker/adapter-react-v5';\n\nimport type { AdapterRatingInfo, InstalledInfo } from '@/components/Adapters/AdapterInstallDialog';\nimport { checkCondition } from '@/dialogs/AdapterUpdateDialog';\nimport type { RepoAdapterObject } from '@/components/Adapters/Utils';\n\ninterface GetNewsResultEntry {\n version: string;\n news: string;\n}\n\nconst styles: Record<string, any> = {\n smallAvatar: {\n width: 24,\n height: 24,\n },\n listItem: (theme: IobTheme) => ({\n mb: '2px',\n background: theme.palette.background,\n '@media screen and (max-width: 400px)': {\n pl: '2px',\n },\n }),\n toVersion: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#00dc00' : '#008100',\n fontWeight: 'bold',\n ml: '4px',\n }),\n updateDone: {\n background: '#5ef05e80',\n opacity: 0.7,\n },\n minWidthCss: {\n '@media screen and (max-width: 400px)': {\n minWidth: 32,\n },\n },\n wrapperButton: {},\n typography: {\n paddingRight: 30,\n },\n versions: {\n minWidth: 110,\n display: 'inline-block',\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n languageButton: {\n position: 'absolute',\n right: 52 + 8,\n top: 8,\n },\n languageButtonActive: (theme: IobTheme) => ({\n color: theme.palette.primary.main,\n }),\n versionHeader: (theme: IobTheme) => ({\n background: '#4dabf5',\n borderRadius: '3px',\n pl: '10px',\n fontWeight: 'bold',\n color: theme.palette.mode === 'dark' ? 'black' : 'white',\n }),\n};\n\ninterface AdaptersUpdaterProps {\n inProcess: boolean;\n lang: ioBroker.Languages;\n /** if a process has been stopped, e.g., due to an error */\n stopped: boolean;\n repository: Record<string, RepoAdapterObject & { rating?: AdapterRatingInfo }>;\n installed: InstalledInfo;\n onUpdateSelected: (adapters: string[], adapters2?: string[]) => void;\n selected: string[];\n current: string;\n updated: string[];\n finished: boolean;\n noTranslation: boolean;\n toggleTranslation: () => void;\n theme: IobTheme;\n}\n\ninterface AdaptersUpdaterState {\n showNews: null | Record<string, any>;\n}\n\ninterface UpdateAvailableCheckOptions {\n /** The installed version */\n oldVersion: string;\n /** The repo version or new version */\n newVersion: string;\n /** Adapter name */\n name: string;\n}\n\nclass AdaptersUpdater extends Component<AdaptersUpdaterProps, AdaptersUpdaterState> {\n private readonly updateAvailable: string[];\n\n /** Key adapterName, value: version */\n private readonly initialVersions: Record<string, string>;\n\n private readonly currentRef: React.RefObject<HTMLLIElement>;\n\n private current: string;\n\n constructor(props: AdaptersUpdaterProps) {\n super(props);\n\n this.updateAvailable = this.detectUpdates();\n this.initialVersions = {};\n this.updateAvailable.forEach(\n adapter => (this.initialVersions[adapter] = this.props.installed[adapter].version),\n );\n\n this.state = {\n showNews: null,\n };\n\n this.currentRef = React.createRef();\n this.current = props.current;\n\n this.props.onUpdateSelected([...this.updateAvailable], this.updateAvailable);\n }\n\n static isUpdateAvailable(options: UpdateAvailableCheckOptions): boolean {\n const { oldVersion, newVersion, name } = options;\n\n try {\n return semver.gt(newVersion, oldVersion);\n } catch {\n console.warn(`Cannot compare \"${newVersion}\" and \"${oldVersion}\" of adapter ${name}`);\n return false;\n }\n }\n\n /**\n * Get a list of available adapter updates\n * Admin and controller are filtered out,\n * and all adapters that have messages for this update are filtered out too\n */\n detectUpdates(): string[] {\n const updateAvailable: string[] = [];\n\n Object.keys(this.props.repository).forEach(adapter => {\n const _installed = this.props.installed[adapter];\n // ignore js-controller in this dialog\n if (adapter === 'js-controller' || adapter === 'admin') {\n return;\n }\n if (\n _installed &&\n this.props.repository[adapter].version &&\n _installed.ignoreVersion !== this.props.repository[adapter].version &&\n AdaptersUpdater.isUpdateAvailable({\n oldVersion: _installed.version,\n newVersion: this.props.repository[adapter].version,\n name: adapter,\n })\n ) {\n if (\n !checkCondition(\n this.props.repository[adapter].messages,\n _installed.version,\n this.props.repository[adapter].version,\n )\n ) {\n updateAvailable.push(adapter);\n } else {\n console.log(\n `Adapter ${adapter} is filtered out from update all functionality, because it has messages which need to be read before update`,\n );\n }\n }\n });\n\n updateAvailable.sort();\n\n return updateAvailable;\n }\n\n getNews(adapter: string): GetNewsResultEntry[] {\n const adapterObj = this.props.repository[adapter];\n const installed = this.props.installed[adapter];\n const news: GetNewsResultEntry[] = [];\n\n if (installed && adapterObj?.news) {\n Object.keys(adapterObj.news).forEach(version => {\n try {\n if (semver.gt(version, installed.version)) {\n news.push({\n version,\n news: this.props.noTranslation\n ? adapterObj.news[version].en\n : adapterObj.news[version][this.props.lang] || adapterObj.news[version].en,\n });\n }\n } catch {\n // ignore it\n console.warn(`Cannot compare \"${version}\" and \"${installed.version}\"`);\n }\n });\n }\n\n return news;\n }\n\n renderOneAdapter(adapter: string): JSX.Element | null {\n const checked = this.props.selected.includes(adapter);\n if ((this.props.finished || this.props.inProcess) && !checked) {\n return null;\n }\n if (!this.props.installed[adapter]) {\n // during installation, this adapter was uninstalled\n return null;\n }\n const image = `.${this.props.installed[adapter].localIcon}`;\n\n return (\n <ListItem\n key={adapter}\n dense\n sx={{\n '&.MuiListItem-root': Utils.getStyle(\n this.props.theme,\n styles.listItem,\n this.props.updated.includes(adapter) && styles.updateDone,\n ),\n }}\n ref={this.props.current === adapter ? this.currentRef : null}\n secondaryAction={\n !this.props.finished && !this.props.inProcess ? (\n <Checkbox\n edge=\"end\"\n checked={checked}\n tabIndex={-1}\n disableRipple\n disabled={this.props.inProcess}\n onClick={() => {\n const selected = [...this.props.selected];\n const pos = selected.indexOf(adapter);\n if (pos !== -1) {\n selected.splice(pos, 1);\n } else {\n selected.push(adapter);\n selected.sort();\n }\n this.props.onUpdateSelected(selected);\n }}\n />\n ) : (\n this.props.current === adapter &&\n !this.props.stopped &&\n !this.props.finished && <CircularProgress />\n )\n }\n >\n <ListItemIcon sx={styles.minWidthCss}>\n <Avatar\n variant=\"square\"\n alt={adapter}\n src={image}\n style={styles.smallAvatar}\n />\n </ListItemIcon>\n <ListItemText\n primary={adapter}\n title={this.getNews(adapter)\n .map(item => `${item.version}: ${item.news}`)\n .join('\\n')}\n secondary={\n <span>\n <div style={styles.versions}>\n {this.initialVersions[adapter]} →\n <Box\n component=\"span\"\n sx={styles.toVersion}\n >\n {this.props.repository[adapter].version}\n </Box>\n </div>\n <IconButton\n title={I18n.t('Show change log')}\n onClick={() =>\n this.setState({\n showNews: {\n adapter,\n version: this.props.repository[adapter].version,\n fromVersion: this.initialVersions[adapter],\n },\n })\n }\n size=\"small\"\n >\n <InfoIcon />\n </IconButton>\n </span>\n }\n />\n </ListItem>\n );\n }\n\n getReactNews(adapter: string, fromVersion: string): JSX.Element[] {\n const adapterObj = this.props.repository[adapter];\n const installed = this.props.installed[adapter];\n fromVersion = fromVersion || installed.version;\n const result: JSX.Element[] = [];\n\n if (installed && adapterObj?.news) {\n Object.keys(adapterObj.news).forEach(version => {\n try {\n if (semver.gt(version, fromVersion) && adapterObj.news[version]) {\n const newsText: string = this.props.noTranslation\n ? adapterObj.news[version].en || ''\n : adapterObj.news[version][this.props.lang] || adapterObj.news[version].en || '';\n\n const news = newsText\n .split('\\n')\n .map(line =>\n line\n .trim()\n .replace(/^\\*\\s?/, '')\n .replace(/<!--[^>]*->/g, '')\n .replace(/<! -[^>]*->/g, '')\n .trim(),\n )\n .filter(line => !!line);\n\n result.push(\n <Grid2 key={version}>\n <Typography sx={styles.versionHeader}>{version}</Typography>\n {news.map((value, index) => (\n <Typography\n key={`${version}-${index}`}\n component=\"div\"\n variant=\"body2\"\n >\n {`• ${value}`}\n </Typography>\n ))}\n </Grid2>,\n );\n }\n } catch {\n // ignore it\n console.warn(`Cannot compare \"${version}\" and \"${fromVersion}\"`);\n }\n });\n }\n\n return result;\n }\n\n renderShowNews(): JSX.Element | null {\n if (this.state.showNews) {\n const news = this.getReactNews(this.state.showNews.adapter, this.state.showNews.fromVersion);\n\n const closeButton = Utils.getStyle(this.props.theme, styles.closeButton);\n\n const languageButtonActive = Utils.getStyle(this.props.theme, styles.languageButtonActive);\n\n return (\n <Dialog\n onClose={() => this.setState({ showNews: null })}\n open={!0}\n >\n <DialogTitle>\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={{ '&.MuiTypography-root': styles.typography }}\n >\n <div style={{ width: 'calc(100% - 60px)' }}>\n {I18n.t('Update \"%s\" to v%s', this.state.showNews.adapter, this.state.showNews.version)}\n </div>\n <IconButton\n size=\"large\"\n style={closeButton}\n onClick={() => this.setState({ showNews: null })}\n >\n <CloseIcon />\n </IconButton>\n {I18n.getLanguage() !== 'en' && this.props.toggleTranslation ? (\n <IconButton\n size=\"large\"\n style={{\n ...styles.languageButton,\n ...(this.props.noTranslation ? languageButtonActive : undefined),\n }}\n onClick={this.props.toggleTranslation}\n title={I18n.t('Disable/Enable translation')}\n >\n <LanguageIcon />\n </IconButton>\n ) : null}\n </Typography>\n </DialogTitle>\n <DialogContent dividers>\n <Grid2\n container\n direction=\"column\"\n spacing={2}\n wrap=\"nowrap\"\n >\n {news.length ? (\n <Grid2>\n <Typography\n variant=\"h6\"\n gutterBottom\n >\n {I18n.t('Change log')}\n </Typography>\n <Grid2\n container\n spacing={2}\n direction=\"column\"\n wrap=\"nowrap\"\n >\n {news}\n </Grid2>\n </Grid2>\n ) : (\n I18n.t('No change log available')\n )}\n </Grid2>\n </DialogContent>\n <DialogActions style={styles.wrapperButton}>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ showNews: null })}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {I18n.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n return null;\n }\n\n render(): JSX.Element {\n if (this.current !== this.props.current) {\n this.current = this.props.current;\n setTimeout(() => this.currentRef.current?.scrollIntoView(), 200);\n }\n\n return (\n <List style={styles.root}>\n {this.updateAvailable.map(adapter => this.renderOneAdapter(adapter))}\n {this.renderShowNews()}\n </List>\n );\n }\n}\n\nexport default AdaptersUpdater;\n","import React, { Component, type JSX } from 'react';\n\nimport {\n DialogActions,\n Checkbox,\n DialogTitle,\n Button,\n Dialog,\n Grid2,\n FormControlLabel,\n Toolbar,\n IconButton,\n Tooltip,\n DialogContent,\n} from '@mui/material';\n\nimport {\n Check as CheckIcon,\n Close as CloseIcon,\n Cancel as CancelIcon,\n Language as LanguageIcon,\n} from '@mui/icons-material';\n\nimport { type AdminConnection, I18n, Utils, type IobTheme, type Translate } from '@iobroker/adapter-react-v5';\n\nimport type { AdapterRatingInfo, InstalledInfo } from '@/components/Adapters/AdapterInstallDialog';\nimport type { RepoAdapterObject } from '@/components/Adapters/Utils';\nimport AdaptersUpdater from '../components/Adapters/AdaptersUpdater';\nimport Command from '../components/Command';\n\nconst styles: Record<string, any> = {\n dialogRoot: {\n height: 'calc(100% - 64px)',\n },\n wrapperHead: {\n justifyContent: 'space-between',\n display: 'flex',\n },\n checkbox: {\n marginRight: 10,\n },\n appBar: (theme: IobTheme) => ({\n flexWrap: 'wrap',\n position: 'sticky',\n bottom: -10,\n pl: 1,\n background: theme.name === 'blue' ? '#5d6467' : theme.name === 'dark' ? '#5b5b5b' : '#FFF',\n }),\n container: {\n overflow: 'hidden',\n height: 'calc(100% - 48px)',\n '@media screen and (max-width: 602px)': {\n height: 'auto',\n },\n },\n content: {\n '@media screen and (max-width: 500px)': {\n p: 1,\n },\n },\n languageButton: {\n position: 'absolute',\n right: 73,\n top: 11,\n },\n languageButtonActive: (theme: IobTheme) => ({\n color: theme.palette.primary.main,\n }),\n};\n\ninterface AdaptersUpdaterDialogProps {\n currentHost: string;\n lang: ioBroker.Languages;\n t: Translate;\n socket: AdminConnection;\n onClose: (updated: boolean) => void;\n repository: Record<string, RepoAdapterObject & { rating?: AdapterRatingInfo }>;\n installed: InstalledInfo;\n onSetCommandRunning: (running: boolean) => void;\n noTranslation?: boolean;\n toggleTranslation?: () => void;\n theme: IobTheme;\n}\n\ninterface AdaptersUpdaterDialogState {\n selected: string[];\n inProcess: boolean;\n finished: boolean;\n current: string;\n updated: string[];\n stopped: boolean;\n debug: boolean;\n stopOnError: boolean;\n closeOnFinished: boolean;\n currentVersion: string;\n}\n\nclass AdaptersUpdaterDialog extends Component<AdaptersUpdaterDialogProps, AdaptersUpdaterDialogState> {\n updateAvailable: string[] = [];\n\n onAdapterFinished: () => void;\n\n processList: { adapter: string; version: string }[];\n\n constructor(props: AdaptersUpdaterDialogProps) {\n super(props);\n\n this.state = {\n selected: [],\n inProcess: false,\n finished: false,\n current: '',\n updated: [],\n /** If an upgrade process has been stopped, e.g., due to an error */\n stopped: false,\n debug:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem(\n 'AdaptersUpdaterDialog.debug',\n ) === 'true',\n stopOnError:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem(\n 'AdaptersUpdaterDialog.stopOnError',\n ) !== 'false',\n closeOnFinished:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem(\n 'AdaptersUpdaterDialog.closeOnFinished',\n ) === 'true',\n currentVersion: '',\n };\n\n this.updateAvailable = [];\n }\n\n updateAdapter(adapter: string, version: string, cb: () => void): void {\n this.onAdapterFinished = cb;\n this.setState({ current: adapter, currentVersion: version });\n }\n\n onStartUpdate(): void {\n this.setState({ inProcess: true }, () => {\n this.props.onSetCommandRunning(true);\n this.processList = [...this.state.selected].map(adapter => ({\n adapter,\n version: this.props.repository[adapter]?.version,\n }));\n\n this.updateAdapters(() => {\n this.setState({ inProcess: false, finished: true }, () => {\n this.props.onSetCommandRunning(false);\n if (this.state.closeOnFinished) {\n this.props.onClose(!!this.state.updated.length);\n } else {\n // update adapters and so on\n }\n });\n });\n });\n }\n\n updateAdapters(cb: () => void): void {\n if (!this.processList || !this.processList.length || this.state.stopped) {\n if (cb) {\n cb();\n }\n } else {\n const { adapter, version } = this.processList.shift();\n\n this.updateAdapter(adapter, version, () => {\n const updated = [...this.state.updated];\n updated.push(adapter);\n this.setState({ updated }, () => setTimeout(() => this.updateAdapters(cb), 200));\n });\n }\n }\n\n render(): JSX.Element {\n const languageButtonActive = this.props.noTranslation\n ? Utils.getStyle(this.props.theme, styles.languageButtonActive)\n : undefined;\n\n return (\n <Dialog\n open={!0}\n maxWidth=\"lg\"\n fullWidth={!!this.state.current}\n onClose={() => this.props.onClose(!!this.state.updated.length)}\n aria-labelledby=\"update-dialog-title\"\n aria-describedby=\"update-dialog-description\"\n sx={{ '& .MuiPaper-root': styles.dialogRoot }}\n scroll=\"paper\"\n >\n <DialogTitle id=\"update-dialog-title\">\n <div style={styles.wrapperHead}>\n {this.props.t('Update %s adapter(s)', this.state.selected.length)}\n {!this.state.finished && !this.state.inProcess && (\n <Tooltip\n title={this.props.t('Select/Unselect all')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <Checkbox\n checked={this.state.selected.length === this.updateAvailable.length}\n style={styles.checkbox}\n tabIndex={-1}\n indeterminate={\n this.state.selected.length !== this.updateAvailable.length &&\n this.state.selected.length !== 0\n }\n disableRipple\n onClick={() => {\n let selected: string[] = [];\n if (this.state.selected.length !== this.updateAvailable.length) {\n selected = [...this.updateAvailable];\n }\n this.setState({ selected });\n }}\n />\n </Tooltip>\n )}\n {I18n.getLanguage() !== 'en' && this.props.toggleTranslation ? (\n <IconButton\n size=\"large\"\n style={{ ...styles.languageButton, ...languageButtonActive }}\n onClick={() => this.props.toggleTranslation()}\n title={I18n.t('Disable/Enable translation')}\n >\n <LanguageIcon />\n </IconButton>\n ) : null}\n </div>\n </DialogTitle>\n <DialogContent\n sx={{ '&.MuiDialogContent-root': styles.content }}\n style={{ height: '100%' }}\n >\n <Grid2\n container\n direction=\"row\"\n sx={styles.container}\n >\n <Grid2 style={{ height: '100%', overflow: 'hidden', width: this.state.current ? 250 : '100%' }}>\n <div style={{ height: '100%', overflow: 'auto' }}>\n <AdaptersUpdater\n finished={this.state.finished}\n inProcess={this.state.inProcess}\n selected={this.state.selected}\n current={this.state.current}\n stopped={this.state.stopped}\n updated={this.state.updated}\n lang={this.props.lang}\n installed={this.props.installed}\n repository={this.props.repository}\n noTranslation={this.props.noTranslation}\n toggleTranslation={this.props.toggleTranslation}\n onUpdateSelected={(selected: string[], updateAvailable: string[]) => {\n if (updateAvailable) {\n this.updateAvailable = updateAvailable;\n }\n this.setState({ selected });\n }}\n theme={this.props.theme}\n />\n </div>\n </Grid2>\n {!!this.state.current && (\n <Grid2\n style={{\n height: '100%',\n overflow: 'hidden',\n width: 'calc(100% - 260px)',\n minWidth: 240,\n }}\n >\n <Command\n noSpacing\n key={this.state.current}\n ready\n host={this.props.currentHost}\n socket={this.props.socket}\n t={this.props.t}\n cmd={`upgrade ${this.state.current}@${this.state.currentVersion}${this.state.debug ? ' --debug' : ''}`}\n onFinished={() => this.onAdapterFinished()}\n errorFunc={() => {\n if (this.state.stopOnError) {\n this.setState({ stopped: true, finished: true });\n this.onAdapterFinished = null;\n this.props.onSetCommandRunning(false);\n } else {\n this.onAdapterFinished();\n }\n }}\n />\n </Grid2>\n )}\n </Grid2>\n <Toolbar\n variant=\"dense\"\n disableGutters\n sx={styles.appBar}\n >\n <FormControlLabel\n control={\n <Checkbox\n disabled={this.state.finished}\n checked={this.state.stopOnError}\n onChange={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'AdaptersUpdaterDialog.stopOnError',\n this.state.stopOnError ? 'false' : 'true',\n );\n this.setState({ stopOnError: !this.state.stopOnError });\n }}\n />\n }\n label={this.props.t('Stop on error')}\n />\n <FormControlLabel\n control={\n <Checkbox\n disabled={this.state.finished}\n checked={this.state.closeOnFinished}\n onChange={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'AdaptersUpdaterDialog.closeOnFinished',\n this.state.closeOnFinished ? 'false' : 'true',\n );\n this.setState({ closeOnFinished: !this.state.closeOnFinished });\n }}\n />\n }\n label={this.props.t('Close on finished')}\n />\n <FormControlLabel\n control={\n <Checkbox\n disabled={this.state.finished || this.state.inProcess}\n checked={this.state.debug}\n onChange={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'AdaptersUpdaterDialog.debug',\n this.state.debug ? 'false' : 'true',\n );\n this.setState({ debug: !this.state.debug });\n }}\n />\n }\n label={this.props.t('Debug info')}\n />\n </Toolbar>\n </DialogContent>\n <DialogActions>\n <Button\n id=\"adapters-update-dialog-update\"\n variant=\"contained\"\n disabled={\n this.state.stopped ||\n this.state.inProcess ||\n this.state.finished ||\n !this.state.selected.length\n }\n onClick={() => this.onStartUpdate()}\n color=\"primary\"\n autoFocus\n startIcon={<CheckIcon />}\n >\n {this.props.t('Update')}\n </Button>\n <Button\n id=\"adapters-update-dialog-cancel\"\n variant=\"contained\"\n disabled={!this.state.inProcess}\n color=\"grey\"\n startIcon={<CancelIcon />}\n onClick={() => {\n this.setState({ stopped: true, finished: true });\n this.props.onSetCommandRunning(false);\n }}\n >\n {this.props.t('Cancel')}\n </Button>\n <Button\n id=\"adapters-update-dialog-close\"\n variant=\"contained\"\n onClick={() => this.props.onClose(!!this.state.updated.length)}\n disabled={this.state.inProcess && !this.state.stopped}\n color={this.state.stopped ? 'error' : 'grey'}\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nexport default AdaptersUpdaterDialog;\n","import React, { type JSX } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n Paper,\n AppBar,\n Box,\n Checkbox,\n FormControlLabel,\n IconButton,\n InputAdornment,\n Tab,\n Tabs,\n TextField,\n Autocomplete,\n} from '@mui/material';\n\nimport { FaGithub as GithubIcon } from 'react-icons/fa';\nimport { Language as UrlIcon, Sms as SmsIcon, Close as CloseIcon, Check as CheckIcon } from '@mui/icons-material';\n\nimport { I18n, Icon, type IobTheme } from '@iobroker/adapter-react-v5';\n\nimport type { RepoAdapterObject } from '@/components/Adapters/Utils';\nimport type { AdapterRatingInfo, InstalledInfo } from '@/components/Adapters/AdapterInstallDialog';\n\nimport npmIcon from '../assets/npm.png';\n\nfunction a11yProps(name: string): { id: string; 'aria-controls': string } {\n return {\n id: `github-install-dialog-tab-${name}`,\n 'aria-controls': `github-install-dialog-panel-${name}`,\n };\n}\n\nconst styles: Record<string, any> = {\n root: (theme: IobTheme) => ({\n backgroundColor: theme.palette.background.paper,\n width: '100%',\n height: '100%',\n }),\n paper: {\n maxWidth: 1000,\n },\n tabPaper: {\n padding: 16,\n },\n title: (theme: IobTheme) => ({\n mt: '10px',\n p: 1,\n ml: 1,\n fontSize: 18,\n color: theme.palette.primary.main,\n }),\n warningText: {\n color: '#f53939',\n },\n noteText: {\n marginTop: 16,\n },\n errorTextNoGit: {\n fontSize: 13,\n color: '#ff1616',\n },\n listIcon: {\n width: 24,\n height: 24,\n },\n listIconWithMargin: {\n width: 24,\n height: 24,\n marginRight: 8,\n },\n tabSelected: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? theme.palette.secondary.contrastText : '#222 !important',\n }),\n};\n\n// some older browsers do not have `flat`\nfunction arrayFlat(arr: (string[] | string)[]): string[] {\n const result: string[] = [];\n for (let i = 0; i < arr.length; i++) {\n if (typeof arr[i] === 'object') {\n (arr[i] as string[]).forEach((item: string) => result.push(item));\n } else {\n result.push(arr[i] as string);\n }\n }\n return result;\n}\n\ninterface GitHubInstallDialogProps {\n categories: {\n name: string;\n translation: string;\n count: number;\n installed: number;\n adapters: string[];\n }[];\n repository: Record<string, RepoAdapterObject & { rating?: AdapterRatingInfo }>;\n installed: InstalledInfo;\n onClose: () => void;\n t: typeof I18n.t;\n /** Method to install adapter */\n installFromUrl: (adapter: string, debug: boolean, customUrl: boolean) => Promise<void>;\n /** Upload the adapter */\n upload: (adapter: string) => void;\n}\n\ninterface AutoCompleteValue {\n value: string;\n nogit: boolean;\n name: string;\n icon: string;\n title: string;\n}\n\ninterface GitHubInstallDialogState {\n autoCompleteValue: AutoCompleteValue | null;\n /** If debug output is desired */\n debug: boolean;\n /** The selected url */\n url: string;\n /** Name of the current tab */\n currentTab: string;\n}\n\nclass GitHubInstallDialog extends React.Component<GitHubInstallDialogProps, GitHubInstallDialogState> {\n constructor(props: GitHubInstallDialogProps) {\n super(props);\n\n this.state = {\n autoCompleteValue:\n ((window as any)._localstorage || window.localStorage).getItem('App.autocomplete') || null,\n debug: ((window as any)._localstorage || window.localStorage).getItem('App.gitDebug') === 'true',\n url: ((window as any)._localstorage || window.localStorage).getItem('App.userUrl') || '',\n currentTab: ((window as any)._localstorage || window.localStorage).getItem('App.gitTab') || 'npm',\n };\n }\n\n renderNpm(): JSX.Element | null {\n return this.state.currentTab === 'npm' ? (\n <Paper\n style={styles.tabPaper}\n id=\"github-install-dialog-panel-npm\"\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.debug}\n onChange={e => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.gitDebug',\n e.target.checked ? 'true' : 'false',\n );\n this.setState({ debug: e.target.checked });\n }}\n />\n }\n label={this.props.t('Debug outputs')}\n />\n </div>\n <div style={{ display: 'flex', alignItems: 'flex-end' }}>\n <SmsIcon style={{ marginRight: 10 }} />\n <Autocomplete\n fullWidth\n value={this.state.autoCompleteValue}\n onChange={(_, newValue) => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.autocomplete',\n newValue,\n );\n this.setState({ autoCompleteValue: newValue });\n }}\n options={this.getList()}\n getOptionLabel={option => option?.name ?? ''}\n renderInput={params => {\n const _params = { ...params };\n _params.InputProps = _params.InputProps || ({} as any);\n _params.InputProps.startAdornment = (\n <InputAdornment position=\"start\">\n <Icon\n src={this.state.autoCompleteValue?.icon || ''}\n style={styles.listIcon}\n />\n </InputAdornment>\n );\n\n return (\n <TextField\n variant=\"standard\"\n {...params}\n label={I18n.t('Select adapter')}\n />\n );\n }}\n renderOption={(props, option) => (\n <Box\n component=\"li\"\n sx={{ '& > img': { mr: 2, flexShrink: 0 } }}\n {...props}\n >\n <Icon\n src={option?.icon || ''}\n style={styles.listIconWithMargin}\n />\n {option?.name ?? ''}\n </Box>\n )}\n />\n </div>\n <div\n style={{\n fontSize: 24,\n fontWeight: 'bold',\n marginTop: 40,\n }}\n >\n {this.props.t('Warning!')}\n </div>\n <div style={styles.warningText}>{this.props.t('npm_warning', 'NPM', 'NPM')}</div>\n <div style={styles.noteText}>{this.props.t('github_note')}</div>\n </Paper>\n ) : null;\n }\n\n renderGitHub(): JSX.Element | null {\n return this.state.currentTab === 'GitHub' ? (\n <Paper\n style={styles.tabPaper}\n id=\"github-install-dialog-panel-github\"\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.debug}\n onChange={e => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.gitDebug',\n e.target.checked ? 'true' : 'false',\n );\n this.setState({ debug: e.target.checked });\n }}\n />\n }\n label={this.props.t('Debug outputs')}\n />\n </div>\n <div style={{ display: 'flex', alignItems: 'flex-end' }}>\n <SmsIcon style={{ marginRight: 10 }} />\n <Autocomplete\n fullWidth\n value={this.state.autoCompleteValue}\n getOptionDisabled={option => !!option?.nogit}\n renderOption={(props, option) => (\n <Box\n component=\"li\"\n sx={{ '& > img': { mr: 2, flexShrink: 0 } }}\n {...props}\n >\n <Icon\n src={option?.icon || ''}\n style={styles.listIconWithMargin}\n />\n {option?.name ?? ''}\n {option?.nogit && (\n <div style={styles.errorTextNoGit}>\n {I18n.t(\n 'This adapter cannot be installed from git as must be built before installation.',\n )}\n </div>\n )}\n </Box>\n )}\n onChange={(_, newValue) => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.autocomplete',\n newValue,\n );\n this.setState({ autoCompleteValue: newValue });\n }}\n options={this.getList()}\n getOptionLabel={option => option?.name ?? ''}\n renderInput={params => {\n const _params = { ...params };\n _params.InputProps = _params.InputProps || ({} as any);\n _params.InputProps.startAdornment = (\n <InputAdornment position=\"start\">\n <Icon\n src={this.state.autoCompleteValue?.icon || ''}\n style={styles.listIconWithMargin}\n />\n </InputAdornment>\n );\n\n return (\n <TextField\n variant=\"standard\"\n {...params}\n label={I18n.t('Select adapter')}\n />\n );\n }}\n />\n </div>\n <div\n style={{\n fontSize: 24,\n fontWeight: 'bold',\n marginTop: 40,\n }}\n >\n {this.props.t('Warning!')}\n </div>\n <div style={styles.warningText}>{this.props.t('github_warning', 'GitHub', 'GitHub')}</div>\n <div style={styles.noteText}>{this.props.t('github_note')}</div>\n </Paper>\n ) : null;\n }\n\n renderCustom(): JSX.Element | null {\n return this.state.currentTab === 'URL' ? (\n <Paper\n style={styles.tabPaper}\n id=\"github-install-dialog-panel-custom\"\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.debug}\n onChange={e => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.gitDebug',\n e.target.checked ? 'true' : 'false',\n );\n this.setState({ debug: e.target.checked });\n }}\n />\n }\n label={this.props.t('Debug outputs')}\n />\n </div>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <TextField\n variant=\"standard\"\n fullWidth\n label={this.props.t('URL')}\n helperText={this.props.t('URL or file path')}\n value={this.state.url}\n onChange={event => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.userUrl',\n event.target.value,\n );\n this.setState({ url: event.target.value });\n }}\n onKeyUp={event => {\n if (event.key === 'Enter' && this.state.url) {\n if (!this.state.url.includes('.')) {\n void this.props.installFromUrl(\n `iobroker.${this.state.url}`,\n this.state.debug,\n true,\n );\n } else {\n void this.props.installFromUrl(this.state.url, this.state.debug, true);\n }\n }\n }}\n slotProps={{\n input: {\n endAdornment: this.state.url ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ url: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n </div>\n <div\n style={{\n fontSize: 24,\n fontWeight: 'bold',\n marginTop: 40,\n }}\n >\n {this.props.t('Warning!')}\n </div>\n <div style={styles.warningText}>{this.props.t('github_warning', 'URL', 'URL')}</div>\n <div style={styles.noteText}>{this.props.t('github_note')}</div>\n </Paper>\n ) : null;\n }\n\n getList(): ({ value: string; name: string; icon: string; nogit: boolean; title: string } | null)[] {\n const adaptersArrays: string[][] = this.props.categories.map(category => category.adapters);\n const adapters: string[] = arrayFlat(adaptersArrays);\n adapters.sort();\n\n return adapters\n .map((el, i) => {\n if (i && adapters[i - 1] === el) {\n return null;\n }\n const adapter = this.props.repository[el];\n if (!adapter?.controller) {\n // @ts-expect-error meta / readme\n const parts = (adapter.extIcon || adapter.meta || adapter.readme || '').toString().split('/');\n\n let name: ioBroker.StringOrTranslated = adapter?.name;\n if (!name) {\n name = adapter.titleLang;\n if (name && typeof name === 'object') {\n name = name[I18n.getLanguage()] || name.en;\n } else {\n name = adapter.title || el;\n }\n }\n\n const item = {\n value: `${el}/${parts[3]}`,\n name: `${name} [${parts[3]}]`,\n icon: adapter.extIcon || adapter.icon,\n nogit: !!adapter.nogit,\n title: el,\n };\n\n // If installed, take the icon from local web server\n if (this.props.installed[name] && name !== 'admin') {\n item.icon = `/adapter/${el}/${adapter.icon.split('/admin/').pop()}`;\n }\n\n return item;\n }\n return null;\n })\n .filter(it => it)\n .sort((a: any, b: any) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n }\n\n render(): JSX.Element {\n const closeInit = (): void => this.setState({ autoCompleteValue: null, url: '' });\n\n return (\n <Dialog\n onClose={() => this.props.onClose()}\n open={!0}\n sx={{ '& .MuiDialog-paper': styles.paper }}\n >\n <DialogContent dividers>\n <Box\n component=\"div\"\n sx={styles.root}\n >\n <AppBar\n position=\"static\"\n color=\"default\"\n >\n <Tabs\n value={this.state.currentTab}\n onChange={(_e, newTab) => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.gitTab',\n newTab,\n );\n this.setState({ currentTab: newTab });\n }}\n variant=\"fullWidth\"\n indicatorColor=\"secondary\"\n >\n <Tab\n label={this.props.t('From npm')}\n wrapped\n sx={{ '&.Mui-selected': styles.tabSelected }}\n icon={\n <img\n src={npmIcon}\n alt=\"npm\"\n width={24}\n height={24}\n />\n }\n {...a11yProps('npm')}\n value=\"npm\"\n />\n <Tab\n label={this.props.t('From github')}\n wrapped\n sx={{ '&.Mui-selected': styles.tabSelected }}\n icon={\n <GithubIcon\n style={{ width: 24, height: 24 }}\n width={24}\n height={24}\n />\n }\n {...a11yProps('github')}\n value=\"GitHub\"\n />\n <Tab\n label={this.props.t('Custom')}\n wrapped\n sx={{ '&.Mui-selected': styles.tabSelected }}\n icon={\n <UrlIcon\n width={24}\n height={24}\n />\n }\n {...a11yProps('custom')}\n value=\"URL\"\n />\n </Tabs>\n </AppBar>\n <Box\n component=\"div\"\n sx={styles.title}\n >\n {this.props.t('Install or update the adapter from %s', this.state.currentTab || 'npm')}\n </Box>\n {this.renderNpm()}\n {this.renderGitHub()}\n {this.renderCustom()}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button\n id=\"github-install-dialog-ok\"\n variant=\"contained\"\n disabled={\n ((this.state.currentTab === 'GitHub' || this.state.currentTab === 'npm') &&\n !this.state.autoCompleteValue?.value) ||\n (this.state.currentTab === 'URL' && !this.state.url)\n }\n autoFocus\n onClick={async () => {\n if (this.state.currentTab === 'GitHub') {\n const parts = (this.state.autoCompleteValue?.value || '').split('/');\n const _url = `${parts[1]}/ioBroker.${parts[0]}`;\n void this.props.installFromUrl(_url, this.state.debug, true);\n } else if (this.state.currentTab === 'URL') {\n if (!this.state.url.includes('.')) {\n void this.props.installFromUrl(\n `iobroker.${this.state.url}`,\n this.state.debug,\n true,\n );\n } else {\n void this.props.installFromUrl(this.state.url, this.state.debug, true);\n }\n } else if (this.state.currentTab === 'npm') {\n const fullAdapterName = (this.state.autoCompleteValue?.value || '').split('/')[0];\n const adapterName = fullAdapterName.includes('.')\n ? fullAdapterName.split('.')[1]\n : fullAdapterName;\n\n try {\n await this.props.installFromUrl(\n `iobroker.${adapterName}@latest`,\n this.state.debug,\n true,\n );\n // on npm installations we want to perform an additional upload\n this.props.upload(adapterName);\n } catch (e) {\n console.error(`Installation from url failed: ${e.message}`);\n }\n }\n this.props.onClose();\n closeInit();\n }}\n color=\"primary\"\n startIcon={<CheckIcon />}\n >\n {this.props.t('Install')}\n </Button>\n <Button\n id=\"github-install-dialog-close\"\n variant=\"contained\"\n onClick={() => {\n this.props.onClose();\n closeInit();\n }}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nexport default GitHubInstallDialog;\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n Grid2,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n Typography,\n type SelectChangeEvent,\n Box,\n} from '@mui/material';\nimport { Close as CloseIcon, Add as AddIcon, Public as IconWeb, Language as LanguageIcon } from '@mui/icons-material';\n\nimport { type AdminConnection, I18n, Utils, type IobTheme, type Translate } from '@iobroker/adapter-react-v5';\n\nimport type HostsWorker from '@/Workers/HostsWorker';\nimport type InstancesWorker from '@/Workers/InstancesWorker';\nimport { checkCondition, type CompactInstanceInfo, type Message } from '@/dialogs/AdapterUpdateDialog';\nimport HostSelectors from '@/components/HostSelectors';\n\nconst styles: Record<string, any> = {\n formControl: {\n marginTop: 24,\n width: 100,\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n languageButton: {\n position: 'absolute',\n right: 52 + 8,\n top: 8,\n },\n languageButtonActive: (theme: IobTheme) => ({\n color: theme.palette.primary.main,\n }),\n paper: {\n // minWidth: 600\n },\n typography: {\n pr: '30px',\n },\n messageText: {},\n messageColor_warn: {\n color: '#cb7642',\n },\n messageColor_error: {\n color: '#f5614d',\n },\n messageColor_info: {\n color: '#5abd29',\n },\n messageTitle_warn: (theme: IobTheme) => ({\n background: '#cb7642',\n borderRadius: '3px',\n pl: '10px',\n fontWeight: 'bold',\n color: theme.palette.mode === 'dark' ? 'black' : 'white',\n }),\n messageTitle_error: (theme: IobTheme) => ({\n background: '#f5614d',\n borderRadius: '3px',\n pl: '10px',\n fontWeight: 'bold',\n color: theme.palette.mode === 'dark' ? 'black' : 'white',\n }),\n messageTitle_info: (theme: IobTheme) => ({\n background: '#5abd29',\n borderRadius: '3px',\n pl: '10px',\n fontWeight: 'bold',\n color: theme.palette.mode === 'dark' ? 'black' : 'white',\n }),\n deps: (theme: IobTheme) => ({\n m: '10px',\n fontSize: 16,\n color: theme.palette.mode === 'dark' ? '#e70000' : '#840101',\n }),\n};\n\nexport interface AdapterDependencies {\n name: string;\n version: string | null;\n installed: boolean;\n installedVersion: string;\n rightVersion: boolean;\n}\n\ninterface AddInstanceDialogProps {\n adapter: string;\n instancesWorker: InstancesWorker;\n socket: AdminConnection;\n currentHost: string;\n currentInstance: string;\n t: Translate;\n onClose: (result: boolean) => void;\n onHostChange: (host: string) => void;\n onInstanceChange: (event: SelectChangeEvent<string>) => void;\n instances: Record<string, CompactInstanceInfo>;\n adapterObject: ioBroker.AdapterCommon;\n dependencies: AdapterDependencies[];\n hostsWorker: InstanceType<typeof HostsWorker>;\n noTranslation: boolean;\n toggleTranslation: () => void;\n expertMode: boolean;\n theme: IobTheme;\n}\n\ninterface AddInstanceDialogState {\n instanceNumbers: string[];\n}\n\nclass AddInstanceDialog extends Component<AddInstanceDialogProps, AddInstanceDialogState> {\n private readonly t: Translate;\n\n private readonly messages: Message[] | null = null;\n\n private readonly lang: string;\n\n constructor(props: AddInstanceDialogProps) {\n super(props);\n this.state = {\n instanceNumbers: [],\n };\n this.t = props.t;\n this.lang = I18n.getLanguage();\n\n this.messages = checkCondition(\n props.adapterObject.messages,\n null,\n props.adapterObject.version,\n props.instances,\n );\n }\n\n componentDidMount(): void {\n void this.props.instancesWorker.getInstances().then((instances: Record<string, ioBroker.InstanceObject>) => {\n const instanceNumbers = Object.keys(instances)\n .filter(id => instances[id]?.common?.name === this.props.adapter)\n .map(id => id.substring(id.lastIndexOf('.') + 1));\n\n this.setState({ instanceNumbers });\n });\n }\n\n getAvailableInstances(): JSX.Element[] {\n const result = [];\n result.push(\n <MenuItem\n value=\"auto\"\n key=\"auto\"\n >\n {this.t('auto')}\n </MenuItem>,\n );\n\n for (let i = 0; i <= 10; i++) {\n if (!this.state.instanceNumbers.includes(i.toString())) {\n result.push(\n <MenuItem\n value={i}\n key={i}\n >\n {i}\n </MenuItem>,\n );\n }\n }\n\n return result;\n }\n\n checkDependencies(dependencies = this.props.dependencies): string | JSX.Element[] {\n if (!dependencies) {\n return '';\n }\n const array = [];\n for (const adapter of dependencies) {\n if (!adapter.installedVersion) {\n array.push(\n this.props.t(\n 'Latest available version of \"%s\" is required, but nothing installed. Please install first \"%s\" and then retry.',\n adapter.name,\n adapter.name,\n ),\n );\n } else if (!adapter.rightVersion) {\n array.push(\n `${this.props.t('Invalid version of %s. Required %s. Current ', adapter.name, adapter.version)}${adapter.installedVersion}`,\n );\n }\n }\n return array.length ? array.map(el => <div key={el}>{el}</div>) : '';\n }\n\n getText(text: string | { [lang: string]: string }, noTranslation?: boolean): string {\n if (text && typeof text === 'object') {\n if (noTranslation) {\n return text.en;\n }\n return text[this.lang] || text.en;\n }\n return typeof text === 'object' ? '' : text;\n }\n\n renderOneMessage(message: Message, index: number): JSX.Element {\n return (\n <Grid2 key={index}>\n <Typography sx={styles[`messageTitle_${message.level || 'warn'}`]}>\n {this.getText(message.title, this.props.noTranslation) || ''}\n </Typography>\n <Typography\n component=\"div\"\n variant=\"body2\"\n style={styles.messageText}\n >\n {this.getText(message.text, this.props.noTranslation) || ''}\n </Typography>\n {message.link ? (\n <Button\n onClick={() => {\n const w = window.open(message.link, '_blank');\n w.focus();\n }}\n startIcon={<IconWeb />}\n variant=\"contained\"\n color=\"grey\"\n >\n {this.getText(message.linkText, this.props.noTranslation) || this.props.t('More info')}\n </Button>\n ) : null}\n </Grid2>\n );\n }\n\n renderMessages(): JSX.Element | null {\n if (this.messages) {\n return (\n <Grid2\n container\n spacing={2}\n direction=\"column\"\n wrap=\"nowrap\"\n sx={{ marginBottom: 1 }}\n >\n {this.messages.map((message, i) => this.renderOneMessage(message, i))}\n </Grid2>\n );\n }\n return null;\n }\n\n render(): JSX.Element {\n const checkDeps = this.checkDependencies();\n\n return (\n <Dialog\n onClose={() => {}}\n open={!0}\n sx={{ '& .MuiDialog-paper': styles.paper }}\n >\n <DialogTitle>\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={{ '&.MuiTypography-root': styles.typography }}\n >\n {this.t('You are going to add new instance:')} {this.props.adapter}\n <IconButton\n size=\"large\"\n sx={styles.closeButton}\n onClick={() => this.props.onClose(false)}\n >\n <CloseIcon />\n </IconButton>\n {this.messages && this.lang !== 'en' && this.props.toggleTranslation ? (\n <IconButton\n size=\"large\"\n style={Utils.getStyle(\n this.props.theme,\n styles.languageButton,\n this.props.noTranslation && styles.languageButtonActive,\n )}\n onClick={this.props.toggleTranslation}\n title={I18n.t('Disable/Enable translation')}\n >\n <LanguageIcon />\n </IconButton>\n ) : null}\n </Typography>\n </DialogTitle>\n <DialogContent dividers>\n {this.renderMessages()}\n {!checkDeps && this.props.expertMode ? (\n <Grid2\n container\n direction=\"column\"\n >\n <HostSelectors\n tooltip={this.t('Select host to add the instance')}\n expertMode\n socket={this.props.socket}\n hostsWorker={this.props.hostsWorker}\n currentHost={this.props.currentHost}\n setCurrentHost={(hostName, hostId) =>\n this.props.onHostChange(hostId.replace(/^system\\.host\\./, ''))\n }\n />\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <InputLabel id=\"instance-label\">{this.t('Instance')}</InputLabel>\n <Select\n variant=\"standard\"\n labelId=\"instance-label\"\n value={this.props.currentInstance}\n onChange={this.props.onInstanceChange}\n >\n {this.getAvailableInstances()}\n </Select>\n </FormControl>\n </Grid2>\n ) : null}\n <Box\n component=\"div\"\n sx={styles.deps}\n >\n {checkDeps}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button\n id=\"instance-add-dialog-ok\"\n variant=\"contained\"\n autoFocus\n disabled={!!checkDeps}\n onClick={() => this.props.onClose(true)}\n color=\"primary\"\n startIcon={<AddIcon />}\n >\n {this.t('Add')}\n </Button>\n <Button\n id=\"instance-add-dialog-cancel\"\n variant=\"contained\"\n onClick={() => this.props.onClose(false)}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {this.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nexport default AddInstanceDialog;\n","export interface RepoAdapterObject extends ioBroker.AdapterCommon {\n versionDate: string;\n controller?: boolean;\n stat?: number;\n node?: string;\n allowAdapterInstall?: boolean;\n allowAdapterUpdate?: boolean;\n allowAdapterDelete?: boolean;\n allowAdapterReadme?: boolean;\n allowAdapterRating?: boolean;\n}\n\nexport function extractUrlLink(adapterRepo: RepoAdapterObject): string {\n if (!adapterRepo) {\n return '';\n }\n let url =\n adapterRepo.licenseInformation?.link ||\n // @ts-expect-error licenseUrl is deprecated\n adapterRepo.licenseUrl;\n\n if (!url || !url.includes('/LICENSE') || !url.includes('raw.githubusercontent.com')) {\n url = adapterRepo.extIcon;\n if (!url) {\n url = adapterRepo.readme;\n if (!url) {\n console.error(`No extIcon for ${adapterRepo.name}`);\n return '';\n }\n url = url.replace('github.com', 'raw.githubusercontent.com').replace('/blob/', '/');\n if (url.includes('/main')) {\n url = `${url.split('/main')[0]}/main/LICENSE`;\n } else if (url.includes('/master')) {\n url = `${url.split('/master')[0]}/master/LICENSE`;\n }\n }\n if (url.includes('/main')) {\n url = `${url.split('/main')[0]}/main/LICENSE`;\n } else if (url.includes('/master')) {\n url = `${url.split('/master')[0]}/master/LICENSE`;\n } else {\n return '';\n }\n }\n\n return url;\n}\n","import React, { Component, type JSX } from 'react';\nimport semver from 'semver';\n\nimport { type Translate, type AdminConnection, type ThemeType, type IobTheme } from '@iobroker/adapter-react-v5';\n\nimport { checkCondition, type CompactInstanceInfo } from '@/dialogs/AdapterUpdateDialog';\n\nimport AddInstanceDialog, { type AdapterDependencies } from '@/dialogs/AddInstanceDialog';\nimport LicenseDialog from '@/dialogs/LicenseDialog';\nimport type { AdapterInformation } from '@iobroker/js-controller-common-db/build/esm/lib/common/tools';\nimport type InstancesWorker from '@/Workers/InstancesWorker';\nimport type HostsWorker from '@/Workers/HostsWorker';\nimport type { RatingDialogRepository } from '@/dialogs/RatingDialog';\nimport { extractUrlLink, type RepoAdapterObject } from './Utils';\n\nexport type AdapterRating = {\n rating?: { r: number; c: number };\n [version: string]: { r: number; c: number };\n};\nexport type AdapterRatingInfo = AdapterRating & { title: string };\n\nexport type AdapterInformationEx = AdapterInformation & {\n installedFrom?: string;\n enabled: number;\n count: number;\n ignoreVersion?: string;\n};\nexport type InstalledInfo = { [adapterName: string]: AdapterInformationEx } & {\n hosts?: { [hostName: string]: ioBroker.HostCommon & { host: string; runningVersion: string } };\n};\n\nexport type AdaptersContext = {\n expertMode: boolean;\n t: Translate;\n /** current selected host */\n socket: AdminConnection;\n removeUpdateAvailable: (adapterName: string) => void;\n toggleTranslation: () => void;\n noTranslation: boolean;\n rightDependenciesFunc: (adapterName: string) => boolean;\n lang: ioBroker.Languages;\n uuid: string;\n themeType: ThemeType;\n theme: IobTheme;\n onUpdating: (isUpdating: boolean) => void;\n /** Information about ALL KNOWN adapters in the ioBroker infrastructure. Repo */\n repository: Record<string, RepoAdapterObject & { rating?: AdapterRatingInfo }>;\n /** Information about all installed adapters on this host */\n installed: InstalledInfo;\n /** Information about all installed adapters on all hosts */\n installedGlobal: InstalledInfo;\n /** very compact information about instances */\n compactInstances: Record<string, CompactInstanceInfo>;\n /** Information about installed adapters */\n adapters: Record<string, ioBroker.AdapterObject>;\n nodeJsVersion: string;\n currentHost: string;\n /** The host ID of the admin adapter, like system.host.test */\n adminHost: string;\n adminInstance: string;\n /** Current selected host */\n instancesWorker: InstancesWorker;\n hostsWorker: HostsWorker;\n executeCommand: (cmd: string, host?: string, callback?: (exitCode: number) => void) => void;\n /** node.js version of current host */\n categories: {\n name: string;\n translation: string;\n count: number;\n installed: number;\n adapters: string[];\n }[];\n descHidden: boolean;\n sortPopularFirst: boolean;\n sortRecentlyUpdated: boolean;\n isTileView: boolean;\n updateRating: (adapter: string, rating: RatingDialogRepository) => void;\n setAdminUpgradeTo: (version: string) => void;\n};\n\nexport interface AdapterInstallDialogState {\n showLicenseDialog: {\n url: string;\n licenseType: string;\n upload?: boolean;\n adapterName: string;\n } | null;\n addInstanceHostName: string;\n addInstanceId: string;\n addInstanceDialog: string;\n showDialog: boolean;\n}\n\nexport default abstract class AdapterInstallDialog<TProps, TState extends AdapterInstallDialogState> extends Component<\n TProps,\n TState\n> {\n protected constructor(props: TProps) {\n super(props);\n\n this.state = {\n showDialog: false,\n showLicenseDialog: null,\n addInstanceHostName: '',\n addInstanceId: 'auto',\n addInstanceDialog: '',\n } as TState;\n }\n\n renderLicenseDialog(context: AdaptersContext): JSX.Element | null {\n if (!this.state.showLicenseDialog) {\n return null;\n }\n\n return (\n <LicenseDialog\n licenseType={this.state.showLicenseDialog.licenseType}\n url={this.state.showLicenseDialog.url}\n onClose={result => {\n const showLicenseDialog = result ? this.state.showLicenseDialog : null;\n this.setState({ showLicenseDialog: null, showDialog: false }, () => {\n if (showLicenseDialog) {\n if (showLicenseDialog.upload) {\n AdapterInstallDialog.upload(showLicenseDialog.adapterName, context);\n } else {\n this.addInstance({ adapterName: showLicenseDialog.adapterName, context }).catch(e =>\n window.alert(`Cannot add instance: ${e}`),\n );\n }\n }\n });\n }}\n />\n );\n }\n\n async addInstance(options: {\n adapterName: string;\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n instance?: 'auto' | string;\n debug?: boolean;\n customUrl?: boolean;\n context: AdaptersContext;\n }): Promise<void> {\n if (!options.customUrl) {\n const adapterObject = options.context.repository[options.adapterName];\n\n const messages = checkCondition(\n adapterObject.messages,\n null,\n adapterObject.version,\n options.context.compactInstances,\n );\n\n if (!options.instance && (options.context.expertMode || messages)) {\n this.setState({\n addInstanceDialog: options.adapterName,\n showDialog: true,\n addInstanceHostName: options.context.currentHost.replace(/^system\\.host\\./, ''),\n addInstanceId: options.instance || 'auto',\n });\n return;\n }\n\n if (options.instance) {\n const instances = await options.context.instancesWorker.getInstances();\n // if the instance already exists\n if (instances && instances[`system.adapter.${options.adapterName}.${options.instance}`]) {\n window.alert(\n options.context.t('Instance %s already exists', `${options.adapterName}.${options.instance}`),\n );\n return;\n }\n }\n }\n\n const host = (this.state.addInstanceHostName || options.context.currentHost).replace(/^system\\.host\\./, '');\n\n await new Promise<void>((resolve, reject) => {\n options.context.executeCommand(\n `${options.customUrl ? 'url' : 'add'} ${options.adapterName} ${options.instance ? `${options.instance} ` : ''}--host ${host} ${\n options.debug || options.context.expertMode ? '--debug' : ''\n }`,\n host,\n exitCode =>\n !exitCode ? resolve() : reject(new Error(`The process returned an exit code of ${exitCode}`)),\n );\n });\n }\n\n static getDependencies(adapterName: string, context: AdaptersContext): AdapterDependencies[] {\n const adapter = context.repository[adapterName];\n const result: AdapterDependencies[] = [];\n\n if (adapter) {\n if (adapter.dependencies && !Array.isArray(adapter.dependencies)) {\n adapter.dependencies = [adapter.dependencies];\n }\n\n if (adapter.globalDependencies && !Array.isArray(adapter.globalDependencies)) {\n adapter.globalDependencies = [adapter.globalDependencies];\n }\n\n const nodeVersion = adapter.node;\n\n if (adapter.dependencies?.length) {\n for (const dependency of adapter.dependencies) {\n const entry: AdapterDependencies = {\n name: '',\n version: null,\n installed: false,\n installedVersion: null,\n rightVersion: false,\n };\n\n const checkVersion = typeof dependency !== 'string';\n const keys = Object.keys(dependency);\n entry.name = !checkVersion ? dependency : keys ? keys[0] : null;\n entry.version = checkVersion ? dependency[entry.name] : null;\n\n if (result && entry.name) {\n const installed = context.installed[entry.name];\n\n entry.installed = !!installed;\n entry.installedVersion = installed ? installed.version : null;\n try {\n entry.rightVersion = installed\n ? checkVersion\n ? semver.satisfies(installed.version, entry.version, { includePrerelease: true })\n : true\n : false;\n } catch {\n entry.rightVersion = true;\n }\n }\n\n result.push(entry);\n }\n }\n\n if (adapter.globalDependencies?.length) {\n for (const dependency of adapter.globalDependencies) {\n const entry: AdapterDependencies = {\n name: '',\n version: null,\n installed: false,\n installedVersion: null,\n rightVersion: false,\n };\n\n const checkVersion = typeof dependency !== 'string';\n const keys = Object.keys(dependency);\n entry.name = !checkVersion ? dependency : keys ? keys[0] : null;\n entry.version = checkVersion ? dependency[entry.name] : null;\n\n if (result && entry.name) {\n const installed = context.installedGlobal[entry.name];\n\n entry.installed = !!installed;\n entry.installedVersion = installed ? installed.version : null;\n try {\n entry.rightVersion = installed\n ? checkVersion\n ? semver.satisfies(installed.version, entry.version, { includePrerelease: true })\n : true\n : false;\n } catch {\n entry.rightVersion = true;\n }\n }\n\n result.push(entry);\n }\n }\n\n if (nodeVersion) {\n const entry: AdapterDependencies = {\n name: 'node',\n version: nodeVersion,\n installed: true,\n installedVersion: context.nodeJsVersion,\n rightVersion: false,\n };\n\n try {\n entry.rightVersion = semver.satisfies(context.nodeJsVersion, nodeVersion);\n } catch {\n entry.rightVersion = true;\n }\n\n result.push(entry);\n }\n }\n\n return result;\n }\n\n renderAddInstanceDialog(context: AdaptersContext): JSX.Element | null {\n if (!this.state.addInstanceDialog) {\n return null;\n }\n\n return (\n <AddInstanceDialog\n adapter={this.state.addInstanceDialog}\n socket={context.socket}\n hostsWorker={context.hostsWorker}\n instancesWorker={context.instancesWorker}\n dependencies={AdapterInstallDialog.getDependencies(this.state.addInstanceDialog, context)}\n currentHost={`system.host.${this.state.addInstanceHostName}`}\n currentInstance={this.state.addInstanceId}\n t={context.t}\n onClose={(result: boolean) => {\n const addInstanceDialog = result ? this.state.addInstanceDialog : '';\n const addInstanceId = result ? this.state.addInstanceId : '';\n this.setState(\n {\n addInstanceDialog: '',\n addInstanceId: 'auto',\n showDialog: false,\n },\n () => {\n if (addInstanceDialog) {\n void this.addInstance({\n adapterName: addInstanceDialog,\n instance: addInstanceId,\n context,\n });\n }\n },\n );\n }}\n onHostChange={hostName =>\n this.setState({ addInstanceHostName: hostName.replace(/^system\\.host\\./, '') })\n }\n onInstanceChange={event => this.setState({ addInstanceId: event.target.value })}\n adapterObject={context.repository[this.state.addInstanceDialog]}\n instances={context.compactInstances}\n toggleTranslation={context.toggleTranslation}\n noTranslation={context.noTranslation}\n expertMode={context.expertMode}\n theme={context.theme}\n />\n );\n }\n\n static upload(adapterName: string, context: AdaptersContext): void {\n context.executeCommand(`upload ${adapterName}${context.expertMode ? ' --debug' : ''}`);\n }\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n onAddInstance(adapterName: string, context: AdaptersContext): void {\n const adapter = context.repository[adapterName];\n const url = extractUrlLink(adapter);\n const licenseType = adapter.licenseInformation?.license || adapter.license;\n\n if (licenseType === 'MIT') {\n this.addInstance({ adapterName, context }).catch(e => window.alert(`Cannot add instance: ${e}`));\n } else {\n this.setState({ showLicenseDialog: { url, adapterName, licenseType }, showDialog: true });\n }\n }\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n renderDialogs(context: AdaptersContext): JSX.Element | null {\n if (!this.state.showDialog) {\n return null;\n }\n\n return (\n <>\n {this.renderAddInstanceDialog(context)}\n {this.renderLicenseDialog(context)}\n </>\n );\n }\n}\n","import React, { type JSX } from 'react';\n\nimport { Grid2 as Grid, IconButton, TableCell, TableRow, Typography } from '@mui/material';\n\nimport { blue, green } from '@mui/material/colors';\n\nimport { ChevronRight as ChevronRightIcon, ExpandMore as ExpandMoreIcon } from '@mui/icons-material';\n\nimport { type Translate } from '@iobroker/adapter-react-v5';\n\nimport MaterialDynamicIcon from '../../helpers/MaterialDynamicIcon';\n\nconst styles: Record<string, React.CSSProperties> = {\n name: {\n flexWrap: 'nowrap',\n width: 300,\n marginTop: 0,\n },\n nameDiv: {\n display: 'flex',\n alignItems: 'center',\n },\n categoryName: {\n fontWeight: 'bold',\n cursor: 'pointer',\n },\n green: {\n color: green[500],\n },\n blue: {\n color: blue[700],\n },\n category: {\n backgroundColor: 'background.default',\n },\n marginRight5: {\n marginRight: 5,\n },\n};\n\ninterface AdapterCategoryRowProps {\n descHidden: boolean;\n categoryName: string;\n expanded: boolean;\n installedCount: number;\n /** Translated name */\n name: string;\n /** If category is toggled */\n onToggle: () => void;\n /** Number of adapters in category */\n count: number;\n t: Translate;\n}\n\nfunction AdapterCategoryRow(props: AdapterCategoryRowProps): JSX.Element {\n const { installedCount, name, categoryName } = props;\n\n return (\n <TableRow\n hover={false}\n sx={styles.category}\n >\n <TableCell>\n <Grid\n container\n spacing={1}\n alignItems=\"center\"\n style={styles.name}\n >\n <Grid component=\"div\">\n <IconButton\n size=\"small\"\n onClick={props.onToggle}\n >\n {props.expanded ? <ExpandMoreIcon /> : <ChevronRightIcon />}\n </IconButton>\n </Grid>\n </Grid>\n </TableCell>\n <TableCell onClick={props.onToggle}>\n <div style={{ ...styles.nameDiv, ...styles.categoryName }}>\n <MaterialDynamicIcon\n iconName={categoryName}\n style={styles.marginRight5}\n />\n {name}\n </div>\n </TableCell>\n <TableCell colSpan={props.descHidden ? 5 : 6}>\n <Typography\n component=\"span\"\n variant=\"body2\"\n style={styles.green}\n >\n {installedCount}\n </Typography>\n {` ${props.t('of')} `}\n <Typography\n component=\"span\"\n variant=\"body2\"\n style={styles.blue}\n >\n {props.count}\n </Typography>\n {` ${props.t('Adapters from this Group installed')}`}\n </TableCell>\n </TableRow>\n );\n}\n\nexport default AdapterCategoryRow;\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Dialog,\n DialogContent,\n DialogActions,\n DialogTitle,\n Rating,\n Button,\n IconButton,\n InputAdornment,\n TextField,\n List,\n ListItem,\n ListItemText,\n ListItemAvatar,\n InputLabel,\n MenuItem,\n FormControl,\n Select,\n Typography,\n Box,\n} from '@mui/material';\n\nimport { HowToVote as VoteIcon, Close as CloseIcon, Info as InfoIcon } from '@mui/icons-material';\n\nimport type { IobTheme, Translate } from '@iobroker/adapter-react-v5';\n\nconst styles: Record<string, any> = {\n rating: {\n marginBottom: 20,\n },\n listRating: {\n marginRight: 8,\n },\n listTime: {\n opacity: 0.5,\n fontStyle: 'italic',\n },\n list: {\n // maxHeight: 200,\n },\n listOwn: (theme: IobTheme) => ({\n backgroundColor:\n theme.name === 'colored' || theme.name === 'light' ? '#16516e2e' : theme.palette.secondary.dark,\n }),\n listTitle: (theme: IobTheme) => ({\n backgroundColor: theme.palette.primary.dark,\n pt: '4px',\n pb: '4px',\n mb: '4px',\n color: '#ffffff',\n textAlign: 'center',\n }),\n languageFilter: {\n width: 300,\n },\n ratingTextControl: {\n width: 'calc(100% - 138px)',\n marginRight: 8,\n },\n ratingLanguageControl: {\n width: 130,\n },\n noComments: {\n width: '100%',\n textAlign: 'center',\n marginTop: 16,\n },\n commentCount: {\n marginTop: 2,\n marginLeft: 8,\n opacity: 0.8,\n fontSize: 10,\n float: 'right',\n },\n infoText: {\n textAlign: 'left',\n fontSize: '14px',\n },\n infoTextContainer: {\n display: 'flex',\n paddingBottom: '10px',\n alignItems: 'center',\n gap: '10px',\n },\n};\n\nconst LANGUAGES = [\n {\n id: 'en',\n title: 'English',\n },\n {\n id: 'de',\n title: 'Deutsch',\n },\n {\n id: 'ru',\n title: 'русский',\n },\n {\n id: 'pt',\n title: 'Portugues',\n },\n {\n id: 'nl',\n title: 'Nederlands',\n },\n {\n id: 'fr',\n title: 'français',\n },\n {\n id: 'it',\n title: 'Italiano',\n },\n {\n id: 'es',\n title: 'Espanol',\n },\n {\n id: 'pl',\n title: 'Polski',\n },\n {\n id: 'uk',\n title: 'Українська',\n },\n {\n id: 'zh-ch',\n title: '简体中文',\n },\n];\n// {\n// \"adapter\": \"history\",\n// \"rating\": {\n// \"r\": 3.5,\n// \"c\": 20\n// },\n// \"3.0.1\": {\n// \"r\": 3.8,\n// \"c\": 5\n// }\n// }\nexport interface RatingDialogRepository {\n rating: {\n r: number;\n ts: number;\n };\n [version: string]: {\n r: number;\n ts: number;\n };\n}\n\ninterface RatingDialogVotings {\n rating?: Record<string, { r: number; ts: number }>;\n comments?: Array<{ comment: string; lang: string; rating: number; ts: number; uuid: string; version: string }>;\n}\n\ninterface RatingDialogProps {\n t: Translate;\n lang: string;\n uuid: string;\n version: string;\n currentRating: { rating?: { r: number; c: number }; title: string };\n adapter: string;\n onClose: (update?: RatingDialogRepository) => void;\n}\n\ninterface RatingDialogState {\n ratingNumber: number;\n ratingComment: string;\n votings: RatingDialogVotings;\n ratingLang: string;\n filterLang: string;\n commentsByLanguage: Record<string, number>;\n}\n\nclass RatingDialog extends Component<RatingDialogProps, RatingDialogState> {\n constructor(props: RatingDialogProps) {\n super(props);\n\n this.state = {\n ratingNumber: 0,\n ratingComment: '',\n votings: null,\n ratingLang: this.props.lang,\n filterLang:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('app.commentLang') ||\n this.props.lang,\n commentsByLanguage: {},\n };\n }\n\n componentDidMount(): void {\n void fetch(`https://rating.iobroker.net/adapter/${this.props.adapter}?uuid=${this.props.uuid}`)\n .then(res => res.json())\n .then((votings: RatingDialogVotings) => {\n votings = votings || {};\n votings.rating = votings.rating || {};\n const versions = Object.keys(votings.rating);\n versions.sort((a, b) =>\n votings.rating[a].ts > votings.rating[b].ts\n ? -1\n : votings.rating[a].ts < votings.rating[b].ts\n ? 1\n : 0,\n );\n const commentsByLanguage: Record<string, number> = {};\n\n if (votings.comments) {\n votings.comments.sort((a, b) => (a.ts > b.ts ? -1 : a.ts < b.ts ? 1 : 0));\n\n votings.comments.forEach(comment => {\n commentsByLanguage[comment.lang] = commentsByLanguage[comment.lang] || 0;\n commentsByLanguage[comment.lang]++;\n });\n }\n\n if (versions.length) {\n const item = votings.rating[versions[0]];\n this.setState({ votings, ratingNumber: item ? item.r : 0, commentsByLanguage });\n } else {\n this.setState({ votings, commentsByLanguage });\n }\n });\n }\n\n setAdapterRating(\n adapter: string,\n version: string,\n rating: number,\n comment: string,\n lang: string,\n ): Promise<RatingDialogRepository> {\n return fetch('https://rating.iobroker.net/vote', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n redirect: 'follow',\n body: JSON.stringify({\n uuid: this.props.uuid,\n adapter,\n version,\n rating,\n comment,\n lang,\n }),\n })\n .then(res => res.json())\n .then((update: RatingDialogRepository & { adapter: string }) => {\n window.alert(`${this.props.t('Vote:')} ${adapter}@${version}=${rating}`);\n delete update.adapter;\n return update;\n })\n .catch(e => {\n window.alert(`Cannot vote: ${e}`);\n return null;\n });\n }\n\n /**\n * Renders the info text component, which explains the rating section\n */\n renderInfoText(): JSX.Element {\n return (\n <div style={styles.infoTextContainer}>\n <InfoIcon />\n <Typography style={styles.infoText}>{this.props.t('use GitHub for issues')}</Typography>\n </div>\n );\n }\n\n renderComments(): JSX.Element {\n if (this.state.votings?.comments && this.state.votings.comments.length) {\n const found = this.state.votings.comments.find(\n comment =>\n !(this.state.filterLang && this.state.filterLang !== '_' && comment.lang !== this.state.filterLang),\n );\n\n return (\n <div style={{ width: '100%', textAlign: 'left' }}>\n <Box\n component=\"h3\"\n sx={styles.listTitle}\n >\n {this.props.t('Comments')}\n </Box>\n <FormControl\n variant=\"standard\"\n style={styles.languageFilter}\n >\n <InputLabel>{this.props.t('Show comments in language')}</InputLabel>\n <Select\n variant=\"standard\"\n value={this.state.filterLang}\n onChange={e => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'app.commentLang',\n e.target.value,\n );\n this.setState({ filterLang: e.target.value });\n }}\n >\n <MenuItem value=\"_\">\n {this.props.t('All')}{' '}\n <span style={styles.commentCount}>{this.state.votings.comments.length}</span>\n </MenuItem>\n {LANGUAGES.map(item => (\n <MenuItem\n key={item.id}\n value={item.id}\n >\n {item.title}{' '}\n {this.state.commentsByLanguage[item.id] ? (\n <span style={styles.commentCount}>\n {this.state.commentsByLanguage[item.id]}\n </span>\n ) : null}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <List\n style={styles.list}\n dense\n disablePadding\n >\n {found &&\n this.state.votings.comments.map((comment, i) => {\n if (\n this.state.filterLang &&\n this.state.filterLang !== '_' &&\n comment.lang !== this.state.filterLang\n ) {\n return null;\n }\n return comment ? (\n <ListItem\n key={i}\n title={comment.uuid ? this.props.t('Your comment') : ''}\n sx={{ '&.MuiListItem-root': comment.uuid ? styles.listOwn : undefined }}\n dense\n >\n <ListItemAvatar style={styles.listRating}>\n <Rating\n readOnly\n defaultValue={comment.rating}\n size=\"small\"\n />\n </ListItemAvatar>\n <ListItemText\n primary={comment.comment}\n secondary={`${new Date(comment.ts).toLocaleString()} / v${comment.version}`}\n sx={{ '& .MuiListItemText-secondary': styles.listTime }}\n />\n </ListItem>\n ) : null;\n })}\n {!found && (\n <div style={styles.noComments}>{this.props.t('No comments in selected language')}</div>\n )}\n </List>\n </div>\n );\n }\n return null;\n }\n\n render(): JSX.Element {\n let item: { r: number; ts: number };\n let versions: string[];\n if (this.state.votings) {\n const votings = this.state.votings.rating;\n versions = Object.keys(votings);\n versions.sort((a, b) => (votings[a].ts > votings[b].ts ? -1 : votings[a].ts < votings[b].ts ? 1 : 0));\n if (versions.length) {\n item = votings[versions[0]];\n }\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.props.onClose()}\n >\n <DialogTitle>{`${this.props.t('Review')} ${this.props.adapter}${this.props.version ? `@${this.props.version}` : ''}`}</DialogTitle>\n <DialogContent\n style={{ textAlign: 'center' }}\n title={this.props.currentRating?.title || ''}\n >\n {this.renderInfoText()}\n <Rating\n style={styles.rating}\n name={this.props.adapter}\n value={this.props.version ? this.state.ratingNumber : this.props.currentRating?.rating?.r}\n size=\"large\"\n readOnly={!this.props.version}\n onChange={(_event, newValue) => this.setState({ ratingNumber: newValue })}\n />\n {this.props.version ? (\n <div style={{ width: '100%', textAlign: 'left' }}>\n <TextField\n variant=\"standard\"\n style={styles.ratingTextControl}\n value={this.state.ratingComment}\n label={this.props.t('Comment to version')}\n helperText={this.props.t('Max length %s characters', 200)}\n onChange={e => this.setState({ ratingComment: e.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.ratingComment ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ ratingComment: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n htmlInput: {\n maxLength: 200,\n },\n }}\n />\n <FormControl\n variant=\"standard\"\n style={styles.ratingLanguageControl}\n >\n <InputLabel>{this.props.t('Language')}</InputLabel>\n <Select\n variant=\"standard\"\n value={this.state.ratingLang}\n onChange={e => this.setState({ ratingLang: e.target.value })}\n >\n {LANGUAGES.map(it => (\n <MenuItem\n key={it.id}\n value={it.id}\n >\n {it.title}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </div>\n ) : null}\n {this.props.version ? (\n <div style={{ paddingTop: 20, paddingBottom: 16 }}>\n {this.props.t(\n 'Rate how good this version of the adapter works on your system. You can vote for every new version.',\n )}\n </div>\n ) : null}\n\n {versions && item ? (\n <div>\n {this.props.t(\n 'You voted for %s on %s',\n versions[0],\n new Date(item.ts).toLocaleDateString(),\n )}\n </div>\n ) : null}\n {this.renderComments()}\n </DialogContent>\n <DialogActions>\n {this.props.version && (\n <Button\n variant=\"contained\"\n autoFocus\n color=\"primary\"\n disabled={!this.state.ratingNumber || this.state.votings === null}\n onClick={() => {\n if (this.state.ratingNumber !== item?.r || this.state.ratingComment) {\n void this.setAdapterRating(\n this.props.adapter,\n this.props.version,\n this.state.ratingNumber,\n this.state.ratingComment,\n this.state.ratingLang,\n ).then(update => this.props.onClose(update));\n } else {\n this.props.onClose();\n }\n }}\n startIcon={<VoteIcon />}\n >\n {this.props.t('Rate')}\n </Button>\n )}\n <Button\n autoFocus={!this.props.version}\n variant=\"contained\"\n onClick={() => this.props.onClose()}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nexport default RatingDialog;\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n FormControlLabel,\n Checkbox,\n} from '@mui/material';\n\nimport { Close as CloseIcon, Check as CheckIcon } from '@mui/icons-material';\n\nimport type { AdminConnection, IobTheme, Translate } from '@iobroker/adapter-react-v5';\n\nconst styles: Record<string, any> = {\n formControl: {\n marginTop: 24,\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n typography: {\n paddingRight: 30,\n },\n};\n\ninterface AdapterDeletionDialogProps {\n adapter: string;\n socket: AdminConnection;\n t: Translate;\n onClose: () => void;\n onClick: (deleteCustom: boolean) => void;\n}\n\ninterface AdapterDeletionDialogState {\n deleteCustom: boolean;\n deleteCustomSupported: boolean;\n}\n\nclass AdapterDeletionDialog extends Component<AdapterDeletionDialogProps, AdapterDeletionDialogState> {\n private readonly t: Translate;\n\n constructor(props: AdapterDeletionDialogProps) {\n super(props);\n\n this.state = {\n deleteCustom: false,\n deleteCustomSupported: false,\n };\n this.t = props.t;\n }\n\n componentDidMount(): void {\n void this.props.socket.checkFeatureSupported('DEL_INSTANCE_CUSTOM').then(deleteCustomSupported => {\n if (deleteCustomSupported) {\n return this.props.socket.getObject(`system.adapter.${this.props.adapter}`).then(obj => {\n if (obj?.common) {\n if (obj.common.supportCustoms) {\n this.setState({ deleteCustomSupported: obj.common.supportCustoms });\n }\n } else {\n this.setState({ deleteCustomSupported: true });\n }\n });\n }\n });\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={this.props.onClose}\n open={!0}\n >\n <DialogTitle>\n <Typography\n component=\"h2\"\n variant=\"h6\"\n sx={{ '&.MuiTypography-root': styles.typography }}\n >\n {this.t('Please confirm')}\n <IconButton\n size=\"large\"\n sx={styles.closeButton}\n onClick={this.props.onClose}\n >\n <CloseIcon />\n </IconButton>\n </Typography>\n </DialogTitle>\n <DialogContent dividers>\n <Typography gutterBottom>\n {this.t('Are you sure you want to delete adapter %s?', this.props.adapter)}\n </Typography>\n {this.state.deleteCustomSupported && (\n <FormControlLabel\n control={\n <Checkbox\n checked={this.state.deleteCustom}\n onChange={e => this.setState({ deleteCustom: e.target.checked })}\n />\n }\n label={this.t('Delete all custom object settings of this adapter too')}\n />\n )}\n </DialogContent>\n <DialogActions>\n <Button\n id=\"adapter-delete-dialog-ok\"\n variant=\"contained\"\n autoFocus\n onClick={() => {\n this.props.onClick(this.state.deleteCustom);\n this.props.onClose();\n }}\n color=\"primary\"\n startIcon={<CheckIcon />}\n >\n {this.t('Ok')}\n </Button>\n <Button\n id=\"adapter-delete-dialog-cancel\"\n variant=\"contained\"\n autoFocus\n onClick={() => this.props.onClose()}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {this.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nexport default AdapterDeletionDialog;\n","import React from 'react';\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, MenuItem, Select, Typography } from '@mui/material';\n\nimport { Close as CloseIcon } from '@mui/icons-material';\n\nimport { type AdminConnection, I18n, IconCopy as SaveIcon } from '@iobroker/adapter-react-v5';\nimport IsVisible from '@/components/IsVisible';\nimport { AUTO_UPGRADE_OPTIONS_MAPPING, AUTO_UPGRADE_SETTINGS } from '@/helpers/utils';\nimport { InfoBox } from '@foxriver76/iob-component-lib';\n\ninterface AutoUpgradeConfigDialogProps {\n /** Called when user closes dialog */\n onClose: () => void;\n /** The socket connection */\n socket: AdminConnection;\n /** The host id of the host to upgrade node.js on */\n hostId: string;\n /** Name of the adapter */\n adapter: string;\n}\n\ninterface AutoUpgradeConfigDialogState {\n /** Auto upgrade policy which is currently saved */\n currentSavedPolicy: ioBroker.AutoUpgradePolicy;\n /** The current configured auto upgrade policy */\n policy: ioBroker.AutoUpgradePolicy;\n /** The repositories the config applies for */\n repositories: string[];\n /** If the feature is supported */\n supported: boolean;\n}\n\nexport default class AutoUpgradeConfigDialog extends React.Component<\n AutoUpgradeConfigDialogProps,\n AutoUpgradeConfigDialogState\n> {\n constructor(props: AutoUpgradeConfigDialogProps) {\n super(props);\n\n this.state = {\n currentSavedPolicy: 'none',\n policy: 'none',\n repositories: [],\n supported: true,\n };\n }\n\n /**\n * Lifecycle hook called if component is mounted\n */\n async componentDidMount(): Promise<void> {\n await this.getConfiguredRepositories();\n await this.getCurrentAutoUpgradeSetting();\n }\n\n async getConfiguredRepositories(): Promise<void> {\n const sysConfig = await this.props.socket.getObject('system.config');\n\n if (!sysConfig?.common?.adapterAutoUpgrade) {\n return;\n }\n\n const activeRepos = Object.entries(sysConfig.common.adapterAutoUpgrade.repositories)\n .filter(([, active]) => active)\n .map(([repoName]) => repoName);\n\n this.setState({ repositories: activeRepos });\n }\n\n /**\n * Get id of the adapter object\n */\n private getAdapterId(): string {\n return `${this.props.hostId}.adapter.${this.props.adapter}`;\n }\n\n /**\n * Get the current auto upgrade setting\n */\n async getCurrentAutoUpgradeSetting(): Promise<void> {\n const obj = (await this.props.socket.getObject(this.getAdapterId())) as ioBroker.AdapterObject;\n\n if (!obj) {\n console.error('no adapter object existing');\n this.setState({ supported: false });\n return;\n }\n\n this.setState({\n policy: obj.common.automaticUpgrade || 'none',\n currentSavedPolicy: obj.common.automaticUpgrade || 'none',\n });\n }\n\n /**\n * Save the current setting to the adapter object\n */\n async save(): Promise<void> {\n const obj = (await this.props.socket.getObject(this.getAdapterId())) as ioBroker.AdapterObject;\n\n if (!obj) {\n console.error('no adapter object existing');\n this.setState({ supported: false });\n return;\n }\n\n obj.common.automaticUpgrade = this.state.policy;\n await this.props.socket.setObject(this.getAdapterId(), obj);\n this.setState({ currentSavedPolicy: this.state.policy });\n }\n\n /**\n * Render the element\n */\n render(): React.JSX.Element {\n return (\n <Dialog\n open={!0}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>{I18n.t('Auto upgrade policy for %s', this.props.adapter)}</DialogTitle>\n <DialogContent style={{ padding: '0 20px', overflow: 'hidden' }}>\n <IsVisible value={!this.state.supported}>\n <Typography>\n {I18n.t('This feature is supported up from js-controller Kiera (Version 6)!')}\n </Typography>\n </IsVisible>\n <IsVisible value={this.state.supported}>\n <Typography>\n {I18n.t('Allow only the following upgrades to be performed automatically:')}\n </Typography>\n <Select\n variant=\"standard\"\n style={{\n marginTop: 20,\n minWidth: 150,\n marginBottom: 8,\n }}\n value={this.state.policy}\n onChange={e => this.setState({ policy: e.target.value as ioBroker.AutoUpgradePolicy })}\n >\n {AUTO_UPGRADE_SETTINGS.map(option => (\n <MenuItem value={option}>{AUTO_UPGRADE_OPTIONS_MAPPING[option]}</MenuItem>\n ))}\n </Select>\n <IsVisible value={this.state.repositories.includes('beta') && this.state.policy !== 'none'}>\n <InfoBox type=\"warning\">{I18n.t('repo_update_hint')}</InfoBox>\n </IsVisible>\n <IsVisible value={this.state.policy === 'major'}>\n <InfoBox type=\"warning\">\n {I18n.t(\n 'The current selected configuration will allow to automatically pull in incompatible changes of this adapter!',\n )}\n </InfoBox>\n </IsVisible>\n </IsVisible>\n </DialogContent>\n <DialogActions>\n <Button\n disabled={this.state.currentSavedPolicy === this.state.policy}\n color=\"primary\"\n variant=\"contained\"\n startIcon={<SaveIcon />}\n onClick={() => this.save()}\n >\n {I18n.t('Save')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => {\n this.props.onClose();\n }}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {I18n.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n","import React, { type JSX } from 'react';\nimport semver from 'semver';\n\nimport { amber, green, red } from '@mui/material/colors';\n\nimport {\n CardMedia,\n IconButton,\n Tooltip,\n Typography,\n Rating,\n Grid2,\n Link,\n TextField,\n InputAdornment,\n Button,\n Card,\n CardContent,\n Box,\n} from '@mui/material';\n\nimport {\n Refresh as RefreshIcon,\n Add as AddIcon,\n Help as HelpIcon,\n KeyboardArrowUp as UpdateSettingsIcon,\n Cloud as CloudIcon,\n CloudOff as CloudOffIcon,\n ArrowUpward as ArrowUpwardIcon,\n ArrowDownward as ArrowDownwardIcon,\n Remove as RemoveIcon,\n GitHub as GitHubIcon,\n MonetizationOn,\n Close as CloseIcon,\n Link as LinkIcon,\n Publish as PublishIcon,\n DeleteForever as DeleteForeverIcon,\n AddToPhotos as AddToPhotosIcon,\n Build as BuildIcon,\n} from '@mui/icons-material';\n\nimport { type IobTheme, Utils } from '@iobroker/adapter-react-v5';\n\nimport AdapterUpdateDialog from '@/dialogs/AdapterUpdateDialog';\nimport CustomModal from '@/components/CustomModal';\nimport RatingDialog, { type RatingDialogRepository } from '@/dialogs/RatingDialog';\nimport AdapterDeletionDialog from '@/dialogs/AdapterDeletionDialog';\nimport AdminUtils from '@/AdminUtils';\nimport AdapterInstallDialog, {\n type AdapterInstallDialogState,\n type AdapterRating,\n type AdapterRatingInfo,\n type AdaptersContext,\n} from '@/components/Adapters/AdapterInstallDialog';\nimport AutoUpgradeConfigDialog from '@/dialogs/AutoUpgradeConfigDialog';\n\nimport IsVisible from '../IsVisible';\nimport { extractUrlLink } from './Utils';\nimport sentryIcon from '../../assets/sentry.svg';\n\nexport const genericStyles: Record<string, any> = {\n hidden: {\n display: 'none',\n },\n buttonUpdate: {\n border: '1px solid',\n padding: '0px 7px',\n borderRadius: 5,\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n transition: 'background 0.5s',\n '&:hover': {\n background: '#00800026',\n },\n },\n\n buttonUpdateIcon: {\n height: 20,\n width: 20,\n marginRight: 10,\n },\n\n classPoll: {\n color: 'orange',\n },\n classPush: {\n color: 'green',\n },\n classAssumption: {\n color: 'red',\n transform: 'rotate(90deg)',\n },\n marginLeft5: {\n marginLeft: 5,\n },\n ratingSet: {\n cursor: 'pointer',\n },\n sentry: {\n width: 21,\n height: 21,\n objectFit: 'fill',\n marginTop: 3,\n filter: 'invert(0%) sepia(90%) saturate(1267%) hue-rotate(-260deg) brightness(99%) contrast(97%)',\n },\n tooltip: {\n pointerEvents: 'none',\n },\n wrongDependencies: {\n color: red[700],\n },\n updateAvailable: {\n color: green[700],\n },\n currentVersion: (theme: IobTheme) => ({\n cursor: 'pointer',\n mb: '6px',\n mr: '8px',\n mt: '4px',\n '&:hover': {\n background: theme.palette.primary.dark,\n },\n }),\n header: (theme: IobTheme) => ({\n fontWeight: 'bold',\n background: theme.palette.secondary.main,\n p: '10px',\n }),\n modalDialog: {\n height: 'calc(100% - 64px)',\n overflowY: 'hidden',\n },\n currentVersionText: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#a3ffa3' : '#009800',\n fontWeight: 'bold',\n }),\n rating: {},\n containerVersion: {},\n containerSpecificVersion: {},\n versionWarn: {\n color: amber[500],\n },\n cardContentFlexBetween: {},\n cardContentFlex: {},\n};\n\nexport type Ratings = { [adapterName: string]: AdapterRating } & { uuid: string };\n\nexport type AdapterCacheEntry = {\n title: string;\n desc: string;\n image: string;\n connectionType: string;\n updateAvailable: boolean;\n rightDependencies: boolean;\n rightOs: boolean;\n sentry: boolean;\n daysAgo: number;\n stat: number;\n daysAgoText: string;\n};\n\nexport interface AdapterGenericProps {\n /** adapter name id without 'system.adapter.' */\n adapterName: string;\n /** Same information for every adapter */\n context: AdaptersContext;\n cached: AdapterCacheEntry;\n commandRunning: boolean;\n}\n\nexport interface AdapterGenericState extends AdapterInstallDialogState {\n autoUpgradeDialogOpen: boolean;\n showUpdateDialog: boolean;\n adapterDeletionDialog: boolean;\n adapterInstallSpecificVersion: string;\n showInstallVersion: boolean;\n showSetRating: {\n version: string;\n rating: AdapterRatingInfo;\n } | null;\n}\n\nexport interface ImageProps {\n alt: string;\n style: React.CSSProperties;\n [other: string]: any;\n}\n\nexport default abstract class AdapterGeneric<\n TProps extends AdapterGenericProps,\n TState extends AdapterGenericState,\n> extends AdapterInstallDialog<TProps, TState> {\n protected installedVersion: string = '';\n\n protected abstract styles: Record<string, any>;\n\n public constructor(props: TProps) {\n super(props);\n\n Object.assign(this.state, {\n autoUpgradeDialogOpen: false,\n showUpdateDialog: false,\n adapterDeletionDialog: false,\n adapterInstallSpecificVersion: '',\n showInstallVersion: false,\n showSetRating: null,\n } as TState);\n }\n\n static renderImage(imageProps: ImageProps): JSX.Element {\n const { style, alt, ...other } = imageProps;\n\n const img = style.backgroundImage.substring(5, style.backgroundImage.length - 2);\n\n return (\n <img\n {...other}\n alt={alt}\n src={img}\n onError={e => {\n if (e.target) {\n (e.target as HTMLImageElement).onerror = null;\n (e.target as HTMLImageElement).src = './img/no-image.png';\n }\n }}\n />\n );\n }\n\n renderAddInstanceButton(): JSX.Element {\n const allowAdapterInstall = this.props.context.repository[this.props.adapterName]\n ? this.props.context.repository[this.props.adapterName].allowAdapterInstall\n : true;\n\n return (\n <IsVisible value={allowAdapterInstall}>\n <Tooltip\n title={this.props.context.t('Add instance')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n disabled={this.props.commandRunning}\n style={!this.props.cached.rightOs ? this.styles.hidden : undefined}\n onClick={\n this.props.cached.rightOs\n ? () => this.onAddInstance(this.props.adapterName, this.props.context)\n : undefined\n }\n >\n <AddIcon />\n </IconButton>\n </Tooltip>\n </IsVisible>\n );\n }\n\n renderAutoUpgradeButton(): JSX.Element | null {\n if (!this.installedVersion) {\n return null;\n }\n return (\n <Tooltip\n title={this.props.context.t('Automatic Upgrade Policy')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ autoUpgradeDialogOpen: true, showDialog: true })}\n >\n <UpdateSettingsIcon />\n </IconButton>\n </Tooltip>\n );\n }\n\n renderReadmeButton(): JSX.Element {\n const allowAdapterReadme = this.props.context.repository[this.props.adapterName]\n ? this.props.context.repository[this.props.adapterName].allowAdapterReadme\n : true;\n\n return (\n <IsVisible value={allowAdapterReadme}>\n <Tooltip\n title={this.props.context.t('Readme')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n onClick={() => this.openInfoDialog()}\n >\n <HelpIcon />\n </IconButton>\n </Tooltip>\n </IsVisible>\n );\n }\n\n renderRating(): JSX.Element | null {\n const allowAdapterRating = this.props.context.repository[this.props.adapterName]\n ? this.props.context.repository[this.props.adapterName].allowAdapterRating\n : true;\n\n if (\n this.props.context.isTileView &&\n (this.props.context.sortPopularFirst || this.props.context.sortRecentlyUpdated)\n ) {\n return null;\n }\n\n const stat = this.props.context.repository[this.props.adapterName].stat;\n if (!stat || allowAdapterRating === false) {\n return null;\n }\n\n return (\n <div\n onClick={() =>\n this.setState({\n showSetRating: {\n version: this.installedVersion,\n rating: this.props.context.repository[this.props.adapterName].rating,\n },\n showDialog: true,\n })\n }\n style={{ ...this.styles.rating, ...this.styles.ratingSet }}\n title={this.props.context.repository[this.props.adapterName].rating?.title}\n >\n <Rating\n name={this.props.adapterName}\n precision={0.5}\n size=\"small\"\n readOnly\n value={this.props.context.repository[this.props.adapterName].rating?.rating?.r || 0}\n />\n </div>\n );\n }\n\n renderConnectionType(): JSX.Element {\n const connectionType = this.props.context.repository[this.props.adapterName]?.connectionType;\n return connectionType === 'cloud' ? (\n <Tooltip\n title={this.props.context.t('Adapter requires the specific cloud access for these devices/service')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <CloudIcon />\n </Tooltip>\n ) : connectionType === 'local' ? (\n <Tooltip\n title={this.props.context.t('Adapter does not use the cloud for these devices/service')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <CloudOffIcon />\n </Tooltip>\n ) : (\n <CloudOffIcon opacity={0} />\n );\n }\n\n renderDataSource(): JSX.Element | null {\n const dataSource = this.props.context.repository[this.props.adapterName]?.dataSource;\n return dataSource ? (\n <div style={this.styles.marginLeft5}>\n {dataSource === 'poll' ? (\n <Tooltip\n title={this.props.context.t('The device or service will be periodically asked')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <ArrowUpwardIcon style={this.styles.classPoll} />\n </Tooltip>\n ) : dataSource === 'push' ? (\n <Tooltip\n title={this.props.context.t('The device or service delivers the new state actively')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <ArrowDownwardIcon style={this.styles.classPush} />\n </Tooltip>\n ) : dataSource === 'assumption' ? (\n <Tooltip\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n title={this.props.context.t(\n 'Adapter cannot request the exactly device status and the status will be guessed on the last sent command',\n )}\n >\n <RemoveIcon style={this.styles.classAssumption} />\n </Tooltip>\n ) : null}\n </div>\n ) : null;\n }\n\n renderLicenseInfo(): JSX.Element {\n const adapter = this.props.context.repository[this.props.adapterName];\n const link = extractUrlLink(adapter);\n\n return (\n <Link\n href={link}\n target=\"_blank\"\n rel=\"noopener\"\n sx={{ color: 'black', '&:hover': { color: 'black' } }}\n >\n {adapter.licenseInformation?.type === 'paid' ? (\n <Tooltip\n title={this.props.context.t('The adapter requires a paid license.')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <MonetizationOn />\n </Tooltip>\n ) : adapter.licenseInformation?.type === 'commercial' ? (\n <Tooltip\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n title={this.props.context.t('The adapter requires a paid license for commercial use.')}\n >\n <MonetizationOn opacity={0.5} />\n </Tooltip>\n ) : adapter.licenseInformation?.type === 'limited' ? (\n <Tooltip\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n title={this.props.context.t('The adapter has a limited functionality without a paid license.')}\n >\n <MonetizationOn opacity={0.5} />\n </Tooltip>\n ) : (\n <MonetizationOn opacity={0} />\n )}\n </Link>\n );\n }\n\n renderSentryInfo(): JSX.Element | null {\n const sentry = this.props.context.repository[this.props.adapterName]?.plugins?.sentry;\n\n return sentry ? (\n <div style={this.styles.marginLeft5}>\n <Tooltip\n title=\"sentry\"\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <CardMedia\n style={this.styles.sentry}\n component=\"img\"\n image={sentryIcon}\n />\n </Tooltip>\n </div>\n ) : null;\n }\n\n renderVersion(): JSX.Element {\n const allowAdapterUpdate = this.props.context.repository[this.props.adapterName]\n ? this.props.context.repository[this.props.adapterName].allowAdapterUpdate\n : true;\n\n return !this.props.commandRunning && this.props.cached.updateAvailable && allowAdapterUpdate !== false ? (\n <Tooltip\n title={this.props.context.t('Update')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <div\n onClick={() => this.setState({ showUpdateDialog: true, showDialog: true })}\n style={{\n ...this.styles.buttonUpdate,\n ...(this.props.cached.rightDependencies ? this.styles.updateAvailable : undefined),\n }}\n >\n <IconButton\n style={this.styles.buttonUpdateIcon}\n size=\"small\"\n >\n <RefreshIcon />\n </IconButton>\n {this.props.context.repository[this.props.adapterName].version}\n </div>\n </Tooltip>\n ) : (\n <span style={this.props.cached.rightDependencies ? undefined : this.styles.wrongDependencies}>\n {this.props.context.repository[this.props.adapterName].version}\n </span>\n );\n }\n\n renderInstalledVersion(isRow?: boolean): JSX.Element | null {\n const installed = this.props.context.installed[this.props.adapterName];\n const installedFrom = installed?.installedFrom;\n const { adapterName } = this.props;\n\n if (isRow) {\n const enabledCount = installed?.enabled;\n const installedCount = installed?.count;\n\n return (\n <Grid2\n container\n wrap=\"nowrap\"\n alignItems=\"center\"\n spacing={1}\n >\n {this.installedVersion ? (\n <Grid2>\n {this.installedVersion +\n (installedCount\n ? ` (${installedCount}${installedCount !== enabledCount ? '~' : ''})`\n : '')}\n </Grid2>\n ) : null}\n {installedFrom && !installedFrom.startsWith(`iobroker.${adapterName}@`) && (\n <Grid2 container>\n <Tooltip\n title={this.props.context.t('Non-NPM-Version: ') + installedFrom}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <GitHubIcon\n fontSize=\"small\"\n style={this.styles.versionWarn}\n />\n </Tooltip>\n </Grid2>\n )}\n </Grid2>\n );\n }\n\n return this.installedVersion ? (\n <Typography\n component=\"span\"\n style={this.styles.cardContentFlexBetween}\n >\n <div>{this.props.context.t('Installed version')}:</div>\n <div style={this.styles.cardContentFlex}>\n {installedFrom && !installedFrom.startsWith(`iobroker.${adapterName}@`) && (\n <Tooltip\n title={this.props.context.t('Non-NPM-Version: ') + installedFrom}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <GitHubIcon\n fontSize=\"small\"\n style={this.styles.versionWarn}\n />\n </Tooltip>\n )}\n {this.installedVersion}\n </div>\n </Typography>\n ) : null;\n }\n\n renderUploadButton(): JSX.Element | null {\n return this.props.context.expertMode && this.installedVersion ? (\n <Tooltip\n title={this.props.context.t('Upload')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n disabled={this.props.commandRunning}\n onClick={() => this.onUpload()}\n >\n <PublishIcon />\n </IconButton>\n </Tooltip>\n ) : null;\n }\n\n renderDeleteButton(): JSX.Element {\n const allowAdapterDelete = this.props.context.repository[this.props.adapterName]\n ? this.props.context.repository[this.props.adapterName].allowAdapterDelete\n : true;\n\n return (\n <IsVisible value={!!this.installedVersion && allowAdapterDelete}>\n <Tooltip\n title={this.props.context.t('Delete adapter')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n disabled={this.props.commandRunning}\n onClick={() => this.setState({ adapterDeletionDialog: true, showDialog: true })}\n >\n <DeleteForeverIcon />\n </IconButton>\n </Tooltip>\n </IsVisible>\n );\n }\n\n renderInstallSpecificVersionButton(): JSX.Element | null {\n const allowAdapterUpdate = this.props.context.repository[this.props.adapterName]\n ? this.props.context.repository[this.props.adapterName].allowAdapterUpdate\n : true;\n\n return (\n this.props.context.expertMode &&\n allowAdapterUpdate !== false &&\n this.installedVersion && (\n <Tooltip\n title={this.props.context.t('Install a specific version')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <IconButton\n disabled={this.props.commandRunning}\n size=\"small\"\n onClick={() => this.setState({ showInstallVersion: true, showDialog: true })}\n >\n <AddToPhotosIcon />\n </IconButton>\n </Tooltip>\n )\n );\n }\n\n renderRebuildButton(): JSX.Element | null {\n if (!this.props.context.expertMode || !this.installedVersion) {\n return null;\n }\n return (\n <Tooltip title={this.props.context.t('Rebuild')}>\n <IconButton\n size=\"small\"\n disabled={this.props.commandRunning}\n onClick={() => this.rebuild()}\n >\n <BuildIcon />\n </IconButton>\n </Tooltip>\n );\n }\n\n renderAutoUpdateDialog(): JSX.Element | null {\n if (!this.state.autoUpgradeDialogOpen) {\n return null;\n }\n return (\n <AutoUpgradeConfigDialog\n onClose={() => this.setState({ autoUpgradeDialogOpen: false, showDialog: false })}\n adapter={this.props.adapterName}\n hostId={this.props.context.adminHost}\n socket={this.props.context.socket}\n />\n );\n }\n\n renderUpdateAdapterDialog(): JSX.Element | null {\n if (!this.state.showUpdateDialog) {\n return null;\n }\n\n this.installedVersion = this.props.context.installed[this.props.adapterName]?.version;\n\n return (\n <AdapterUpdateDialog\n adapter={this.props.adapterName}\n adapterObject={this.props.context.repository[this.props.adapterName]}\n t={this.props.context.t}\n dependencies={AdapterInstallDialog.getDependencies(this.props.adapterName, this.props.context)}\n rightDependencies={this.props.context.rightDependenciesFunc(this.props.adapterName)}\n news={this.getNews()}\n toggleTranslation={this.props.context.toggleTranslation}\n noTranslation={this.props.context.noTranslation}\n installedVersion={this.installedVersion}\n onUpdate={version =>\n this.setState({ showUpdateDialog: false, showDialog: false }, () => this.update(version))\n }\n onIgnore={ignoreVersion =>\n this.setState({ showUpdateDialog: false, showDialog: false }, () =>\n this.props.context.socket\n .getObject(`system.adapter.${this.props.adapterName}`)\n .then(obj => {\n if (obj?.common) {\n (obj.common as ioBroker.AdapterCommon).ignoreVersion = ignoreVersion;\n this.props.context.socket\n .setObject(obj._id, obj)\n .catch(error => window.alert(`Cannot write object: ${error}`));\n } else {\n window.alert(`Adapter \"${this.props.adapterName}\" does not exist!`);\n }\n })\n .then(() => this.props.context.removeUpdateAvailable(this.props.adapterName)),\n )\n }\n onClose={() => this.setState({ showUpdateDialog: false, showDialog: false })}\n instances={this.props.context.compactInstances}\n theme={this.props.context.theme}\n />\n );\n }\n\n static formatNews(news: string): JSX.Element[] {\n const lines = (news || '')\n .toString()\n .split('\\n')\n .map(line =>\n line.trim().replace(/^\\*+/, '').replace(/^-/, '').replace(/\\*+$/, '').replace(/\\r/g, '').trim(),\n )\n .filter(line => line);\n\n return lines.map((line, index) => (\n <div\n style={{}}\n key={index}\n >\n <span>- </span>\n {line}\n </div>\n ));\n }\n\n renderAdapterInstallVersion(): JSX.Element | null {\n if (!this.state.showInstallVersion) {\n return null;\n }\n\n return (\n <CustomModal\n title={this.props.context.t('Please select specific version of %s', this.props.adapterName)}\n applyButton={false}\n onClose={() =>\n this.setState({\n showInstallVersion: false,\n adapterInstallSpecificVersion: '',\n showDialog: false,\n })\n }\n theme={this.props.context.theme}\n toggleTranslation={this.props.context.toggleTranslation}\n noTranslation={this.props.context.noTranslation}\n >\n <div style={{ height: '100%', overflowY: 'hidden' }}>\n <div style={this.styles.containerSpecificVersion}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <TextField\n variant=\"standard\"\n style={{ flexGrow: 1 }}\n label={this.props.context.t('Enter version manually')}\n value={this.state.adapterInstallSpecificVersion}\n onChange={event => this.setState({ adapterInstallSpecificVersion: event.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.adapterInstallSpecificVersion ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ adapterInstallSpecificVersion: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n <Button\n color=\"primary\"\n variant=\"contained\"\n size=\"small\"\n disabled={!this.state.adapterInstallSpecificVersion}\n onClick={() => {\n if (this.state.adapterInstallSpecificVersion) {\n void this.update(this.state.adapterInstallSpecificVersion);\n this.setState({\n showInstallVersion: false,\n adapterInstallSpecificVersion: '',\n showDialog: false,\n });\n }\n }}\n >\n {this.props.context.t('Install')}\n </Button>\n </div>\n <Tooltip\n title={this.props.context.t('npmjs.com')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n onClick={() => {\n window\n .open(\n `https://www.npmjs.com/package/iobroker.${this.props.adapterName}?activeTab=versions`,\n this.props.adapterName,\n )\n .focus();\n }}\n >\n <LinkIcon />\n </IconButton>\n </Tooltip>\n </div>\n <Box\n component=\"div\"\n sx={this.styles.header}\n >\n {this.props.context.t('Or select from the list')}\n </Box>\n <div style={{ ...this.styles.containerVersion, height: 'calc(100% - 122px)', overflowY: 'auto' }}>\n {this.getNews(true).map(({ version, news }) => (\n <Card\n variant=\"outlined\"\n key={version}\n sx={this.styles.currentVersion}\n onClick={() => {\n void this.update(version);\n this.setState({ showInstallVersion: false, showDialog: false });\n }}\n >\n <CardContent>\n <Typography\n sx={Utils.getStyle(\n this.props.context.theme,\n this.installedVersion === version && this.styles.currentVersionText,\n { fontSize: 16, fontWeight: 'bold' },\n )}\n color=\"text.secondary\"\n gutterBottom\n >\n {version}\n {this.installedVersion === version ? (\n <Box\n component=\"span\"\n sx={this.styles.currentVersionText}\n >{`(${this.props.context.t('current')})`}</Box>\n ) : (\n ''\n )}\n </Typography>\n <Typography\n variant=\"body2\"\n style={{ opacity: 0.7 }}\n >\n {AdapterGeneric.formatNews(news)}\n </Typography>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </CustomModal>\n );\n }\n\n renderSetRatingDialog(): JSX.Element | null {\n if (!this.state.showSetRating) {\n return null;\n }\n return (\n <RatingDialog\n t={this.props.context.t}\n lang={this.props.context.lang}\n version={this.state.showSetRating.version}\n adapter={this.props.adapterName}\n currentRating={this.state.showSetRating.rating}\n onClose={(update: RatingDialogRepository) => {\n if (update) {\n this.props.context.updateRating(this.props.adapterName, update);\n }\n this.setState({ showSetRating: null, showDialog: false });\n }}\n uuid={this.props.context.uuid}\n />\n );\n }\n\n renderAdapterDeletionDialog(): JSX.Element | null {\n if (!this.state.adapterDeletionDialog) {\n return null;\n }\n return (\n <AdapterDeletionDialog\n adapter={this.props.adapterName}\n socket={this.props.context.socket}\n t={this.props.context.t}\n onClick={deleteCustom => this.delete(deleteCustom)}\n onClose={() => this.setState({ adapterDeletionDialog: false, showDialog: false })}\n />\n );\n }\n\n /**\n * Open adapter readme or docs\n */\n openInfoDialog(): void {\n const adapter = this.props.context.repository[this.props.adapterName];\n const lang = adapter.docs?.[this.props.context.lang] ? this.props.context.lang : 'en';\n\n window.open(AdminUtils.getDocsLinkForAdapter({ lang, adapterName: this.props.adapterName }), 'help');\n }\n\n getNews(all = false): { version: string; news: string }[] {\n const adapter = this.props.context.repository[this.props.adapterName];\n const installed = this.props.context.installed[this.props.adapterName];\n const news: { version: string; news: string }[] = [];\n\n if (installed && adapter?.news) {\n Object.keys(adapter.news).forEach(version => {\n try {\n if (semver.gt(version, installed.version) || all) {\n let text: string;\n if (typeof adapter.news[version] === 'object') {\n text = this.props.context.noTranslation\n ? adapter.news[version].en\n : adapter.news[version][this.props.context.lang] || adapter.news[version].en;\n } else {\n text = adapter.news[version] as any as string;\n }\n\n news.push({\n version,\n news: text,\n });\n }\n } catch {\n // ignore it\n console.warn(\n `[ADAPTERS] Cannot compare \"${version}\" and \"${installed.version}\" (${this.props.adapterName})`,\n );\n }\n });\n }\n\n return news;\n }\n\n onUpload(): void {\n const adapter = this.props.context.repository[this.props.adapterName];\n const url = extractUrlLink(adapter);\n const licenseType = adapter.licenseInformation?.license || adapter.license;\n\n if (licenseType !== 'MIT') {\n this.setState({\n showLicenseDialog: {\n url,\n upload: true,\n adapterName: this.props.adapterName,\n licenseType,\n },\n showDialog: true,\n });\n } else {\n AdapterInstallDialog.upload(this.props.adapterName, this.props.context);\n }\n }\n\n delete(deleteCustom?: boolean): void {\n this.props.context.executeCommand(\n `del ${this.props.adapterName}${deleteCustom ? ' --custom' : ''}${this.props.context.expertMode ? ' --debug' : ''}`,\n );\n }\n\n async update(version: string): Promise<void> {\n if (\n this.props.adapterName === 'admin' &&\n this.props.context.adminHost === this.props.context.currentHost &&\n (await this.props.context.socket.checkFeatureSupported('ADAPTER_WEBSERVER_UPGRADE'))\n ) {\n this.props.context.setAdminUpgradeTo(version);\n return;\n }\n\n this.props.context.executeCommand(\n `upgrade ${this.props.adapterName}@${version}${this.props.context.expertMode ? ' --debug' : ''}`,\n );\n }\n\n rebuild(): void {\n this.props.context.executeCommand(\n `rebuild ${this.props.adapterName}${this.props.context.expertMode ? ' --debug' : ''}`,\n );\n }\n\n renderDialogs(): JSX.Element | null {\n if (!this.state.showDialog) {\n return null;\n }\n\n return (\n <>\n {this.renderAddInstanceDialog(this.props.context)}\n {this.renderLicenseDialog(this.props.context)}\n {this.renderUpdateAdapterDialog()}\n {this.renderAdapterInstallVersion()}\n {this.renderSetRatingDialog()}\n {this.renderAdapterDeletionDialog()}\n {this.renderAutoUpdateDialog()}\n </>\n );\n }\n}\n","import React, { type JSX } from 'react';\n\nimport { Box, Card, CardContent, CardMedia, Fab, Tooltip, Typography } from '@mui/material';\n\nimport { MoreVert as MoreVertIcon } from '@mui/icons-material';\nimport { amber } from '@mui/material/colors';\n\nimport { type IobTheme, Utils } from '@iobroker/adapter-react-v5';\n\nimport IsVisible from '../IsVisible';\nimport AdapterGeneric, {\n type AdapterGenericProps,\n type AdapterGenericState,\n type ImageProps,\n genericStyles,\n} from './AdapterGeneric';\n\nconst boxShadow = '0 2px 2px 0 rgba(0, 0, 0, .14),0 3px 1px -2px rgba(0, 0, 0, .12),0 1px 5px 0 rgba(0, 0, 0, .2)';\nconst boxShadowHover = '0 8px 17px 0 rgba(0, 0, 0, .2),0 6px 20px 0 rgba(0, 0, 0, .19)';\n\nconst styles: Record<string, any> = {\n ...genericStyles,\n type: {\n color: 'tile',\n },\n root: (theme: IobTheme) => ({\n position: 'relative',\n m: '10px',\n width: 300,\n minHeight: 200,\n background: theme.palette.background.default,\n boxShadow,\n display: 'flex',\n flexDirection: 'column',\n transition: 'box-shadow 0.5s',\n '&:hover': {\n boxShadow: boxShadowHover,\n },\n }),\n imageBlock: (theme: IobTheme) => ({\n background: theme.palette.mode === 'dark' ? '#848484' : '#c0c0c0',\n minHeight: 60,\n display: 'flex',\n padding: '0 10px 0 10px',\n position: 'relative',\n justifyContent: 'space-between',\n color: '#000',\n }),\n img: {\n width: 45,\n height: 45,\n margin: 'auto 0',\n position: 'relative',\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n zIndex: 2,\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n background: 'url(\"img/no-image.png\") 100% 100% no-repeat',\n backgroundSize: 'cover',\n backgroundColor: '#fff',\n },\n },\n installed: {\n background: '#77c7ff8c',\n },\n update: {\n background: '#10ff006b',\n },\n fab: {\n position: 'absolute',\n bottom: -20,\n width: 40,\n height: 40,\n right: 20,\n },\n greenText: (theme: IobTheme) => ({\n color: theme.palette.success.dark,\n }),\n collapse: {\n height: '100%',\n backgroundColor: 'silver',\n position: 'absolute',\n width: '100%',\n zIndex: 3,\n marginTop: 'auto',\n bottom: 0,\n // transition: 'height 0.3s',\n justifyContent: 'space-between',\n display: 'flex',\n flexDirection: 'column',\n },\n close: {\n width: 20,\n height: 20,\n opacity: 0.9,\n cursor: 'pointer',\n position: 'relative',\n marginLeft: 'auto',\n mb: '10px',\n transition: 'all 0.6s ease',\n '&:hover': {\n transform: 'rotate(90deg)',\n },\n '&:before': {\n position: 'absolute',\n left: 9,\n content: '\"\"',\n height: 20,\n width: 3,\n backgroundColor: 'rgba(0, 0, 0, 0.54)',\n transform: 'rotate(45deg)',\n },\n '&:after': {\n position: 'absolute',\n left: 9,\n content: '\"\"',\n height: 20,\n width: 3,\n backgroundColor: 'rgba(0, 0, 0, 0.54)',\n transform: 'rotate(-45deg)',\n },\n },\n footerBlock: (theme: IobTheme) => ({\n background: theme.palette.background.default,\n p: '10px',\n display: 'flex',\n justifyContent: 'space-between',\n }),\n versionDate: {\n alignSelf: 'center',\n },\n adapter: (theme: IobTheme) => ({\n width: '100%',\n fontWeight: 'bold',\n fontSize: 16,\n verticalAlign: 'middle',\n pl: 1,\n pt: 2,\n color: theme.palette.mode === 'dark' ? '#333' : '#333',\n }),\n adapterWithAgo: {\n width: 'calc(100% - 145px)',\n },\n description: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#222' : 'inherit',\n }),\n\n cardContent: {\n overflow: 'auto',\n },\n cardContentDiv: {\n position: 'sticky',\n right: 0,\n top: 0,\n background: 'silver',\n },\n cardContentFlex: {\n display: 'flex',\n },\n cardContentFlexBetween: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n cardContent2: {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n },\n cardMargin10: {\n marginTop: 10,\n },\n availableVersion: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n curdContentFlexCenter: {\n display: 'flex',\n alignItems: 'center',\n },\n\n versionWarn: {\n color: amber[500],\n marginRight: 5,\n },\n rating: {\n marginTop: 20,\n },\n};\n\ninterface AdapterTileState extends AdapterGenericState {\n openCollapse: boolean;\n}\n\nclass AdapterTile extends AdapterGeneric<AdapterGenericProps, AdapterTileState> {\n protected styles: Record<string, any> = styles;\n\n constructor(props: AdapterGenericProps) {\n super(props);\n\n Object.assign(this.state, {\n openCollapse: false,\n });\n }\n\n renderInfoCard(): JSX.Element {\n return (\n <div style={this.styles.collapse}>\n <CardContent style={this.styles.cardContent}>\n <div style={this.styles.cardContentDiv}>\n <Box\n component=\"div\"\n sx={this.styles.close}\n onClick={() => this.setState({ openCollapse: !this.state.openCollapse })}\n />\n </div>\n <Typography\n gutterBottom\n component=\"span\"\n variant=\"body2\"\n sx={this.styles.description}\n >\n {this.props.cached.desc}\n </Typography>\n </CardContent>\n <Box\n component=\"div\"\n sx={this.styles.footerBlock}\n >\n {this.renderAddInstanceButton()}\n <div style={this.styles.cardContentFlex}>\n {this.renderAutoUpgradeButton()}\n {this.renderReadmeButton()}\n {this.renderUploadButton()}\n {this.renderDeleteButton()}\n {this.renderInstallSpecificVersionButton()}\n </div>\n </Box>\n </div>\n );\n }\n\n renderCardMedia(): JSX.Element {\n const available = this.props.context.repository[this.props.adapterName];\n const availableVersion = available?.version;\n\n return (\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.context.theme,\n this.styles.imageBlock,\n this.installedVersion && this.styles.installed,\n this.installedVersion &&\n availableVersion &&\n this.installedVersion !== availableVersion &&\n this.props.cached.updateAvailable &&\n this.styles.update,\n )}\n >\n <CardMedia\n sx={this.styles.img}\n component={(props: ImageProps) => AdapterGeneric.renderImage(props)}\n src={this.props.cached.image || 'img/no-image.png'}\n image={this.props.cached.image || 'img/no-image.png'}\n />\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.context.theme,\n this.styles.adapter,\n (available.stat || this.props.context.sortRecentlyUpdated) && this.styles.adapterWithAgo,\n )}\n >\n {this.props.adapterName}\n </Box>\n {this.props.context.sortPopularFirst ? (\n <div style={this.styles.versionDate}>{available.stat}</div>\n ) : null}\n {this.props.context.sortRecentlyUpdated ? (\n <div style={this.styles.versionDate}>{this.props.cached.daysAgoText}</div>\n ) : null}\n {!this.props.context.sortPopularFirst && !this.props.context.sortRecentlyUpdated\n ? this.renderRating()\n : null}\n {!this.state.openCollapse ? (\n <Tooltip\n title={this.props.context.t('Info')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <Fab\n onClick={() => this.setState({ openCollapse: !this.state.openCollapse })}\n style={this.styles.fab}\n color=\"primary\"\n aria-label=\"add\"\n >\n <MoreVertIcon />\n </Fab>\n </Tooltip>\n ) : null}\n </Box>\n );\n }\n\n renderCardContent(): JSX.Element {\n const allowAdapterUpdate = this.props.context.repository[this.props.adapterName]\n ? this.props.context.repository[this.props.adapterName].allowAdapterUpdate\n : true;\n const installed = this.props.context.installed[this.props.adapterName];\n\n return (\n <CardContent style={this.styles.cardContent2}>\n <Typography\n gutterBottom\n variant=\"h5\"\n component=\"h5\"\n >\n {this.props.cached.title}\n </Typography>\n <div style={this.styles.cardContentFlex}>\n {this.renderConnectionType()}\n {this.renderDataSource()}\n <div>{this.renderLicenseInfo()}</div>\n {this.renderSentryInfo()}\n </div>\n <div style={this.styles.cardMargin10}>\n {installed?.count ? (\n <Typography\n component=\"span\"\n style={this.styles.cardContentFlexBetween}\n >\n <div>{this.props.context.t('Installed instances')}:</div>\n <div>{installed.count}</div>\n </Typography>\n ) : null}\n <IsVisible value={allowAdapterUpdate}>\n <Typography\n component=\"span\"\n style={this.styles.availableVersion}\n >\n <div>{this.props.context.t('Available version:')}</div>\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.context.theme,\n this.props.cached.updateAvailable && this.styles.greenText,\n this.styles.curdContentFlexCenter,\n )}\n >\n {this.renderVersion()}\n </Box>\n </Typography>\n </IsVisible>\n {this.renderInstalledVersion()}\n </div>\n </CardContent>\n );\n }\n\n render(): JSX.Element {\n this.installedVersion = this.props.context.installed[this.props.adapterName]?.version;\n\n return (\n <Card sx={this.styles.root}>\n {this.state.openCollapse ? this.renderInfoCard() : null}\n {this.renderCardMedia()}\n {this.renderCardContent()}\n {this.renderDialogs()}\n </Card>\n );\n }\n}\n\nexport default AdapterTile;\n","import React, { type JSX } from 'react';\n\nimport { Avatar, Grid2, TableCell, TableRow, Tooltip } from '@mui/material';\n\nimport AdapterGeneric, {\n type AdapterGenericProps,\n type AdapterGenericState,\n genericStyles,\n} from '@/components/Adapters/AdapterGeneric';\n\nconst styles: Record<string, any> = {\n ...genericStyles,\n type: {\n color: 'line',\n },\n smallAvatar: {\n width: 32,\n height: 32,\n marginLeft: 4,\n },\n paddingNone: {\n padding: '0 !important',\n },\n name: {\n flexWrap: 'nowrap',\n width: 300,\n marginTop: 0,\n },\n flex: {\n display: 'flex',\n },\n nameCell: {\n paddingTop: '0 !important',\n paddingBottom: '0 !important',\n },\n};\n\nclass AdapterRow extends AdapterGeneric<AdapterGenericProps, AdapterGenericState> {\n protected styles: Record<string, any> = styles;\n\n render(): JSX.Element {\n const adapter = this.props.context.repository[this.props.adapterName];\n\n const allowAdapterRating = adapter ? adapter.allowAdapterRating : true;\n\n this.installedVersion = this.props.context.installed[this.props.adapterName]?.version;\n\n return (\n <TableRow hover>\n <TableCell />\n <TableCell>\n <Grid2\n container\n spacing={1}\n alignItems=\"center\"\n style={this.styles.name}\n >\n <Tooltip\n title={this.props.adapterName}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <Grid2 style={this.styles.paddingNone}>\n <Avatar\n variant=\"square\"\n alt={this.props.cached.title}\n src={this.props.cached.image}\n style={this.styles.smallAvatar}\n />\n </Grid2>\n </Tooltip>\n {allowAdapterRating !== false ? (\n <Grid2 style={this.styles.nameCell}>\n <div>{this.props.cached.title}</div>\n {this.renderRating()}\n </Grid2>\n ) : (\n <Grid2>{this.props.cached.title}</Grid2>\n )}\n </Grid2>\n </TableCell>\n {!this.props.context.descHidden && (\n <TableCell\n title={this.props.cached.desc}\n style={{ width: 20, wordWrap: 'break-word' }}\n >\n {this.props.cached.desc}\n </TableCell>\n )}\n <TableCell>\n <div style={this.styles.flex}>\n {this.renderConnectionType()}\n {this.renderDataSource()}\n <div>{this.renderLicenseInfo()}</div>\n {this.renderSentryInfo()}\n </div>\n </TableCell>\n <TableCell>{this.renderInstalledVersion(true)}</TableCell>\n <TableCell>\n <Grid2\n container\n alignItems=\"center\"\n >\n {this.renderVersion()}\n </Grid2>\n </TableCell>\n <TableCell style={{ fontSize: 'smaller' }}>\n {adapter?.licenseInformation?.license || adapter?.license}\n </TableCell>\n <TableCell>\n {this.renderAddInstanceButton()}\n {this.renderAutoUpgradeButton()}\n {this.renderReadmeButton()}\n {this.renderUploadButton()}\n {this.renderDeleteButton()}\n {this.renderInstallSpecificVersionButton()}\n {this.renderRebuildButton()}\n </TableCell>\n {this.renderDialogs()}\n </TableRow>\n );\n }\n}\n\nexport default AdapterRow;\n","import React, { Component, Fragment, type JSX } from 'react';\n\nimport {\n Box,\n LinearProgress,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material';\n\nimport { TabContent, type IobTheme } from '@iobroker/adapter-react-v5';\n\nimport type { AdaptersContext } from '@/components/Adapters/AdapterInstallDialog';\nimport AdapterCategoryRow from '@/components/Adapters/AdapterCategoryRow';\nimport AdapterTile from '@/components/Adapters/AdapterTile';\nimport AdapterRow from '@/components/Adapters/AdapterRow';\nimport type { AdapterCacheEntry } from '@/components/Adapters/AdapterGeneric';\n\nconst BUTTONS_WIDTH = 34 * 7 + 8;\nexport const WIDTHS: Record<string, number> = {\n emptyBlock: 50,\n name: 300,\n connectionType: 120,\n installed: 120,\n available: 120,\n update: 40,\n license: 80,\n install: BUTTONS_WIDTH,\n};\n\nexport const SUM = Object.keys(WIDTHS).reduce((s, i) => s + WIDTHS[i], 0);\n\nconst styles: Record<string, any> = {\n container: {\n height: '100%',\n width: '100%',\n },\n containerNotFullHeight: {\n height: 'calc(100% - 22px)',\n },\n containerFullHeight: {\n height: '100%',\n },\n table: {\n width: '100%',\n tableLayout: 'fixed',\n minWidth: 960,\n '& td': {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n pt: '2px',\n pb: '2px',\n pr: '4px',\n pl: '4px',\n },\n '& th': {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n pt: '2px',\n pb: '2px',\n pr: '4px',\n pl: '4px',\n },\n },\n name: {\n flexWrap: 'nowrap',\n width: WIDTHS.name,\n },\n emptyBlock: {\n flexWrap: 'nowrap',\n width: WIDTHS.emptyBlock,\n },\n description: {\n width: `calc(100% - ${SUM + 2}px)`,\n },\n connectionType: {\n width: WIDTHS.connectionType,\n },\n installed: {\n width: WIDTHS.installed,\n },\n available: {\n width: WIDTHS.available,\n paddingRight: 6,\n },\n update: {\n width: WIDTHS.update,\n padding: 0,\n },\n license: {\n width: WIDTHS.license,\n },\n install: {\n width: WIDTHS.install,\n },\n notStableRepo: (theme: IobTheme) => ({\n background: theme.palette.mode === 'dark' ? '#8a7e00' : '#fdee20',\n color: '#000',\n fontSize: 14,\n padding: '2px 8px',\n borderRadius: '5px',\n }),\n viewModeDiv: {\n display: 'flex',\n flexFlow: 'wrap',\n overflow: 'auto',\n justifyContent: 'center',\n },\n};\n\ninterface AdaptersListProps {\n stableRepo: boolean;\n repoName: string;\n context: AdaptersContext;\n systemConfig: ioBroker.SystemConfigObject;\n tableViewMode: boolean;\n listOfVisibleAdapter: string[] | null;\n categoriesExpanded: Record<string, boolean>;\n oneListView: boolean;\n cachedAdapters: { [adapterName: string]: AdapterCacheEntry } | null;\n categories: {\n name: string;\n translation: string;\n count: number;\n installed: number;\n adapters: string[];\n }[];\n toggleCategory: (category: string) => void;\n clearAllFilters: () => void;\n update: boolean;\n descWidth: number;\n sortByName: boolean;\n sortPopularFirst: boolean;\n sortRecentlyUpdated: boolean;\n commandRunning: boolean;\n}\n\ninterface AdaptersListState {\n descWidth: number;\n repoName: string;\n systemConfig: boolean;\n tableViewMode: boolean;\n oneListView: boolean;\n categoriesExpanded: string;\n cachedAdapters: number;\n listOfVisibleAdapter: string;\n update: boolean;\n sortByName: boolean;\n sortPopularFirst: boolean;\n sortRecentlyUpdated: boolean;\n renderCounter: number;\n expertMode: boolean;\n commandRunning: boolean;\n}\n\nclass AdaptersList extends Component<AdaptersListProps, AdaptersListState> {\n private lastRenderCounter: number = -1;\n\n constructor(props: AdaptersListProps) {\n super(props);\n\n this.state = {\n descWidth: props.descWidth,\n repoName: props.repoName,\n systemConfig: !!props.systemConfig,\n tableViewMode: props.tableViewMode,\n oneListView: props.oneListView,\n categoriesExpanded: JSON.stringify(props.categoriesExpanded),\n cachedAdapters: props.cachedAdapters ? Object.keys(props.cachedAdapters).length : 0,\n update: props.update,\n sortByName: props.sortByName,\n sortPopularFirst: props.sortPopularFirst,\n sortRecentlyUpdated: props.sortRecentlyUpdated,\n renderCounter: 0,\n listOfVisibleAdapter: JSON.stringify(props.listOfVisibleAdapter),\n expertMode: props.context.expertMode,\n commandRunning: props.commandRunning,\n };\n }\n\n getRow(adapterName: string, context: AdaptersContext): JSX.Element | null {\n const cached = this.props.cachedAdapters[adapterName];\n if (cached) {\n return (\n <AdapterRow\n context={context}\n key={`adapter-${adapterName}`}\n adapterName={adapterName}\n cached={cached}\n commandRunning={this.state.commandRunning}\n />\n );\n }\n return null;\n }\n\n getRows(context: AdaptersContext): JSX.Element | JSX.Element[] | null {\n if (!this.props.listOfVisibleAdapter) {\n return (\n <TableRow>\n <TableCell colSpan={8}>\n <LinearProgress />\n </TableCell>\n </TableRow>\n );\n }\n\n let count = 0;\n\n let rows: JSX.Element[] = [];\n\n if (this.props.oneListView) {\n for (let i = 0; i < this.props.listOfVisibleAdapter.length; i++) {\n const adapterName = this.props.listOfVisibleAdapter[i];\n\n if (rows.length > 50 && !this.props.context.installed[adapterName]?.version) {\n continue;\n }\n rows.push(this.getRow(adapterName, context));\n }\n count = rows.length;\n\n if (count && this.props.listOfVisibleAdapter.length > rows.length) {\n rows.push(\n <TableRow key=\"more\">\n <TableCell\n colSpan={8}\n style={{ fontSize: 20, padding: 20, textAlign: 'center' }}\n >\n {this.props.context.t(\n 'Filter adapters to see others. There is %s more',\n this.props.listOfVisibleAdapter.length - rows.length,\n )}\n </TableCell>\n </TableRow>,\n );\n }\n } else {\n rows = this.props.categories.map(category => {\n const showCategory = category.adapters.find(adapterName =>\n this.props.listOfVisibleAdapter.includes(adapterName),\n );\n if (!showCategory) {\n return null;\n }\n const categoryName = category.name;\n const expanded = this.props.categoriesExpanded[categoryName];\n count++;\n\n return (\n <Fragment key={`category-${categoryName} ${category.adapters.length}`}>\n <AdapterCategoryRow\n key={`category-${categoryName}${1}`}\n categoryName={categoryName}\n count={category.count}\n expanded={expanded}\n installedCount={category.installed}\n name={category.translation}\n descHidden={context.descHidden}\n onToggle={() => this.props.toggleCategory(categoryName)}\n t={this.props.context.t}\n />\n\n {expanded &&\n category.adapters.map(adapterName => {\n const item = this.getRow(adapterName, context);\n if (item) {\n count++;\n }\n return item;\n })}\n </Fragment>\n );\n });\n }\n\n if (!count) {\n return !this.props.update ? (\n <tr>\n <td\n colSpan={4}\n style={{\n padding: 16,\n fontSize: 18,\n cursor: 'pointer',\n }}\n title={this.props.context.t('Click to clear all filters')}\n onClick={() => this.props.clearAllFilters()}\n >\n {this.props.context.t('all items are filtered out')}\n </td>\n </tr>\n ) : null;\n }\n\n return rows;\n }\n\n getTiles(context: AdaptersContext): JSX.Element | JSX.Element[] {\n if (!this.props.listOfVisibleAdapter) {\n return <LinearProgress />;\n }\n\n if (!this.props.listOfVisibleAdapter.length) {\n return !this.props.update ? (\n <div\n style={{\n margin: 20,\n fontSize: 26,\n }}\n title={this.props.context.t('Click to clear all filters')}\n onClick={() => this.props.clearAllFilters()}\n >\n {this.props.context.t('all items are filtered out')}\n </div>\n ) : null;\n }\n const items: JSX.Element[] = [];\n\n for (let i = 0; i < this.props.listOfVisibleAdapter.length; i++) {\n const adapterName = this.props.listOfVisibleAdapter[i];\n const cached = this.props.cachedAdapters[adapterName];\n\n if (items.length > 50 && !this.props.context.installed[adapterName]?.version) {\n continue;\n }\n items.push(\n <AdapterTile\n key={`adapter-${adapterName}`}\n context={context}\n adapterName={adapterName}\n cached={cached}\n commandRunning={this.state.commandRunning}\n />,\n );\n }\n if (this.props.listOfVisibleAdapter.length > items.length) {\n items.push(\n <div\n key=\"newLine\"\n style={{\n flexBasis: '100%',\n height: 0,\n }}\n />,\n );\n items.push(\n <div\n key=\"more\"\n style={{ fontSize: 20, margin: 20 }}\n >\n {this.props.context.t(\n 'Filter adapters to see others. There is %s more',\n this.props.listOfVisibleAdapter.length - items.length,\n )}\n </div>,\n );\n }\n\n return items;\n }\n\n renderTileView(stableRepo: boolean, repoName: string, context: AdaptersContext): JSX.Element {\n return (\n <>\n {!stableRepo ? (\n <Box\n component=\"div\"\n sx={styles.notStableRepo}\n >\n {this.props.context.t('Active repo is \"%s\"', repoName)}\n </Box>\n ) : null}\n <div style={styles.viewModeDiv}>{this.getTiles(context)}</div>\n </>\n );\n }\n\n renderTableView(stableRepo: boolean, repoName: string, context: AdaptersContext): JSX.Element {\n return (\n <TabContent>\n {!stableRepo ? (\n <Box\n component=\"div\"\n sx={styles.notStableRepo}\n >\n {this.props.context.t('Active repo is \"%s\"', repoName)}\n </Box>\n ) : null}\n <TableContainer\n style={{\n ...styles.container,\n ...(!stableRepo ? styles.containerNotFullHeight : styles.containerFullHeight),\n }}\n >\n <Table\n stickyHeader\n size=\"small\"\n sx={styles.table}\n >\n <TableHead>\n <TableRow>\n <TableCell style={styles.emptyBlock}></TableCell>\n <TableCell style={styles.name}>\n <Typography>{this.props.context.t('Name')}</Typography>\n </TableCell>\n {!context.descHidden && (\n <TableCell style={{ ...styles.description, width: this.props.descWidth }}>\n <Typography>{this.props.context.t('Description')}</Typography>\n </TableCell>\n )}\n <TableCell style={styles.connectionType} />\n <TableCell style={styles.installed}>\n <Typography>{this.props.context.t('Installed')}</Typography>\n </TableCell>\n <TableCell style={styles.available}>\n <Typography>{this.props.context.t('Available')}</Typography>\n </TableCell>\n <TableCell style={styles.license}>\n <Typography>{this.props.context.t('License')}</Typography>\n </TableCell>\n <TableCell\n style={{\n ...styles.install,\n width: this.state.expertMode ? BUTTONS_WIDTH : BUTTONS_WIDTH - 34 * 2,\n }}\n >\n <Typography>{this.props.context.t('Install')}</Typography>\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>{this.getRows(context)}</TableBody>\n </Table>\n </TableContainer>\n </TabContent>\n );\n }\n\n static getDerivedStateFromProps(\n props: AdaptersListProps,\n state: AdaptersListState,\n ): Partial<AdaptersListState> | null {\n let changed = false;\n // rewrite only if view mode changed, count of adapters in the list\n if (props.descWidth !== state.descWidth) {\n console.log('Render because of descWidth');\n changed = true;\n }\n if (props.repoName !== state.repoName) {\n console.log('Render because of repoName');\n changed = true;\n }\n if (!!props.systemConfig !== state.systemConfig) {\n console.log('Render because of systemConfig');\n changed = true;\n }\n if (props.tableViewMode !== state.tableViewMode) {\n console.log('Render because of tableViewMode');\n changed = true;\n }\n if (props.oneListView !== state.oneListView) {\n console.log('Render because of oneListView');\n changed = true;\n }\n const categoriesExpanded = JSON.stringify(props.categoriesExpanded);\n if (categoriesExpanded !== state.categoriesExpanded) {\n console.log('Render because of categoriesExpanded');\n changed = true;\n }\n const cachedAdapters = props.cachedAdapters ? Object.keys(props.cachedAdapters).length : 0;\n if (cachedAdapters !== state.cachedAdapters) {\n console.log(`Render because of cachedAdapters ${cachedAdapters} <> ${state.cachedAdapters}`);\n changed = true;\n }\n if (props.update !== state.update) {\n console.log('Render because of update');\n changed = true;\n }\n if (props.sortByName !== state.sortByName) {\n console.log('Render because of sortByName');\n changed = true;\n }\n if (props.sortPopularFirst !== state.sortPopularFirst) {\n console.log('Render because of sortPopularFirst');\n changed = true;\n }\n if (props.sortRecentlyUpdated !== state.sortRecentlyUpdated) {\n console.log('Render because of sortRecentlyUpdated');\n changed = true;\n }\n if (props.context.expertMode !== state.expertMode) {\n console.log('Render because of expertMode');\n changed = true;\n }\n const listOfVisibleAdapter = JSON.stringify(props.listOfVisibleAdapter);\n if (listOfVisibleAdapter !== state.listOfVisibleAdapter) {\n console.log('Render because of listOfVisibleAdapter');\n changed = true;\n }\n if (props.commandRunning !== state.commandRunning) {\n console.log('Render because of commandRunning');\n changed = true;\n }\n if (changed) {\n return {\n descWidth: props.descWidth,\n repoName: props.repoName,\n systemConfig: !!props.systemConfig,\n tableViewMode: props.tableViewMode,\n oneListView: props.oneListView,\n categoriesExpanded,\n cachedAdapters,\n update: props.update,\n sortByName: props.sortByName,\n sortPopularFirst: props.sortPopularFirst,\n sortRecentlyUpdated: props.sortRecentlyUpdated,\n listOfVisibleAdapter,\n renderCounter: state.renderCounter + 1,\n expertMode: props.context.expertMode,\n commandRunning: props.commandRunning,\n };\n }\n\n return null;\n }\n\n shouldComponentUpdate(nextProps: Readonly<AdaptersListProps>, nextState: Readonly<AdaptersListState>): boolean {\n if (this.lastRenderCounter !== nextState.renderCounter) {\n this.lastRenderCounter = nextState.renderCounter;\n return true;\n }\n\n return false;\n }\n\n render(): JSX.Element {\n if (!this.props.systemConfig?.common?.activeRepo) {\n return <LinearProgress />;\n }\n\n if (this.props.tableViewMode) {\n return this.renderTableView(this.props.stableRepo, this.props.repoName, this.props.context);\n }\n return this.renderTileView(this.props.stableRepo, this.props.repoName, this.props.context);\n }\n}\n\nexport default AdaptersList;\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n CircularProgress,\n LinearProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n} from '@mui/material';\n\nimport { Close as CloseIcon, Refresh as ReloadIcon } from '@mui/icons-material';\n\nimport { I18n, type AdminConnection, type ThemeType } from '@iobroker/adapter-react-v5';\n\ninterface WebserverParameters {\n useHttps: boolean;\n port: number;\n certPrivateName?: string;\n certPublicName?: string;\n}\n\ninterface ServerResponse {\n running: boolean;\n stderr: string[];\n stdout: string[];\n success?: boolean;\n}\n\ninterface AdminUpdaterProps {\n socket: AdminConnection;\n host: string;\n onClose: () => void;\n version: string;\n adminInstance: string;\n onUpdating: (updating: boolean) => void;\n themeType: ThemeType;\n currentAdminVersion: string;\n}\n\ninterface AdminUpdaterState {\n response: ServerResponse | null;\n error: string | null;\n starting: boolean;\n upAgain: boolean;\n}\n\nclass AdminUpdater extends Component<AdminUpdaterProps, AdminUpdaterState> {\n private updating: boolean;\n\n private interval: ReturnType<typeof setInterval>;\n\n private startTimeout: ReturnType<typeof setTimeout>;\n\n private readonly textareaRef: React.RefObject<HTMLTextAreaElement>;\n\n private readonly link: string;\n\n private oldVersion?: string;\n\n constructor(props: AdminUpdaterProps) {\n super(props);\n\n this.state = {\n response: null,\n error: null,\n /** if upgrade is just starting, we ignore errors in the beginning */\n starting: true,\n /** if admin is up again after upgrade */\n upAgain: false,\n };\n\n this.updating = false;\n\n this.textareaRef = React.createRef();\n\n this.link = `${window.location.protocol}//${window.location.host}/`;\n }\n\n setUpdating(updating: boolean): void {\n if (this.updating !== updating) {\n this.updating = updating;\n this.props.onUpdating(updating);\n }\n }\n\n /**\n * Get the webserver configuration of the current admin instance\n */\n async getWebserverParams(): Promise<WebserverParameters> {\n const obj = await this.props.socket.getObject(`system.adapter.${this.props.adminInstance}`);\n\n return {\n useHttps: obj.native.secure,\n port: obj.native.port,\n certPrivateName: obj.native.certPrivate,\n certPublicName: obj.native.certPublic,\n };\n }\n\n async componentDidMount(): Promise<void> {\n const { certPrivateName, certPublicName, port, useHttps } = await this.getWebserverParams();\n\n // remember the current version\n this.oldVersion = this.props.currentAdminVersion;\n\n await this.props.socket.upgradeAdapterWithWebserver(this.props.host, {\n version: this.props.version,\n adapterName: 'admin',\n port,\n useHttps,\n certPublicName,\n certPrivateName,\n });\n\n this.setUpdating(true);\n this.interval = setInterval(() => this.checkStatus(), 1_000); // poll every second\n\n this.startTimeout = setTimeout(() => {\n this.startTimeout = null;\n this.setState({ starting: false });\n }, 10_000); // give 10 seconds to controller to start update\n }\n\n componentWillUnmount(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n\n if (this.startTimeout) {\n clearTimeout(this.startTimeout);\n this.startTimeout = null;\n }\n }\n\n async checkVersion(): Promise<boolean> {\n // Maybe the update already happened. Check the version of the admin\n try {\n const res = await fetch('./version');\n const version = await res.text();\n // if it looks like version \"x.xx.xxx-beta1\" and not equal to the old version\n if (version && version.length < 20 && version !== this.oldVersion) {\n // admin updated\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n this.setState(\n {\n response: {\n running: false,\n success: true,\n stderr: [],\n stdout: [I18n.t('Version updated to %s', version)],\n },\n upAgain: true,\n error: null,\n },\n () => this.setUpdating(false),\n );\n return true;\n }\n\n // if web server is up, and it sends us the old version number => no error\n return version === this.oldVersion;\n } catch {\n return false;\n }\n }\n\n async checkStatus(): Promise<void> {\n console.log(`Request update status from: ${this.link}`);\n try {\n const res = await fetch(this.link);\n\n // Just for logging purposes\n const plainBody = await res.text();\n console.log(`Received status: ${plainBody}`);\n\n if (plainBody.startsWith('{') && plainBody.endsWith('}')) {\n try {\n const response: ServerResponse = JSON.parse(plainBody) as ServerResponse;\n // sometimes stderr has only one empty string in it\n if (response?.stderr) {\n response.stderr = response.stderr.filter(line => line.trim());\n }\n if (response && !response.running && response.success && response.stdout) {\n response.stdout.push('');\n response.stdout.push('---------------------------------------------------');\n response.stdout.push(I18n.t('%s was successfully updated to %s', 'admin', this.props.version));\n } else if (response?.stdout) {\n response.stdout.unshift('');\n response.stdout.unshift('---------------------------------------------------');\n response.stdout.unshift(I18n.t('updating %s to %s...', 'admin', this.props.version));\n }\n this.setState({ response, error: null }, (): void => {\n if (response && !response.running) {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n this.waitForAdapterStart();\n } else if (response?.running) {\n this.setUpdating(true);\n }\n\n // scroll down\n if (this.textareaRef.current) {\n setTimeout(\n () => (this.textareaRef.current.scrollTop = this.textareaRef.current.scrollHeight),\n 100,\n );\n }\n });\n } catch (e) {\n console.error(`Cannot parse response: ${e}`);\n this.setState({ error: plainBody }, () => this.setUpdating(false));\n }\n } else if (!(await this.checkVersion())) {\n // Maybe the update already happened. Check the version of the admin\n console.error(`Response is not JSON: ${plainBody}`);\n }\n } catch (e) {\n if (!this.state.starting) {\n // after 10 seconds, show error\n this.setState({ error: e.toString() }, () => this.setUpdating(false));\n }\n }\n }\n\n /**\n * Wait until admin is up again\n */\n waitForAdapterStart(): void {\n this.interval = setInterval(async () => {\n try {\n await fetch(this.link);\n clearInterval(this.interval);\n this.interval = null;\n this.setState({ upAgain: true });\n } catch {\n // ignore, it will throw until admin is reachable\n }\n }, 1_000);\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={(e, reason) => {\n if (reason !== 'escapeKeyDown' && reason !== 'backdropClick') {\n this.props.onClose();\n }\n }}\n open={!0}\n maxWidth=\"lg\"\n fullWidth\n >\n <DialogTitle>{I18n.t('Updating %s...', 'admin')}</DialogTitle>\n <DialogContent style={{ height: 400, padding: '0 20px', overflow: 'hidden' }}>\n {(!this.state.response || this.state.response.running) && !this.state.error ? (\n <LinearProgress />\n ) : null}\n {this.state.response || this.state.error ? (\n <textarea\n ref={this.textareaRef}\n style={{\n width: '100%',\n height: '100%',\n resize: 'none',\n background: this.props.themeType === 'dark' ? '#000' : '#fff',\n color: this.props.themeType === 'dark' ? '#EEE' : '#111',\n boxSizing: 'border-box',\n fontFamily:\n 'Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace',\n border: this.state.response?.success\n ? '2px solid green'\n : this.state.error ||\n (this.state.response &&\n !this.state.response.running &&\n !this.state.response.success)\n ? '2px solid red'\n : undefined,\n }}\n value={\n this.state.error\n ? this.state.error\n : this.state.response.stderr && this.state.response.stderr.length\n ? this.state.response.stderr.join('\\n')\n : this.state.response.stdout.join('\\n')\n }\n readOnly\n />\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button\n // loading={this.state.response?.success && !this.state.upAgain}\n variant=\"contained\"\n disabled={this.state.starting || (!this.state.error && !this.state.upAgain)}\n onClick={() => {\n if (this.state.response?.success) {\n window.location.reload();\n }\n this.props.onClose();\n }}\n color={this.state.response?.success ? 'primary' : 'grey'}\n startIcon={this.state.response?.success ? <ReloadIcon /> : <CloseIcon />}\n >\n {this.state.response?.success && !this.state.upAgain ? (\n <CircularProgress />\n ) : this.state.response?.success ? (\n I18n.t('Reload')\n ) : (\n I18n.t('Close')\n )}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nexport default AdminUpdater;\n","import React, { createRef, type JSX } from 'react';\nimport semver from 'semver';\n\nimport {\n Grid2,\n Button,\n IconButton,\n LinearProgress,\n TextField,\n Tooltip,\n InputAdornment,\n DialogTitle,\n DialogContent,\n DialogActions,\n Dialog,\n Box,\n} from '@mui/material';\n\nimport {\n Folder as FolderIcon,\n FolderOpen as FolderOpenIcon,\n Refresh as RefreshIcon,\n List as ListIcon,\n ViewList as ViewListIcon,\n ViewModule as ViewModuleIcon,\n Update as UpdateIcon,\n Star as StarIcon,\n Close as CloseIcon,\n} from '@mui/icons-material';\nimport { FaGithub as GithubIcon } from 'react-icons/fa';\n\nimport CustomSelectButton from '@/components/CustomSelectButton';\nimport AdaptersUpdaterDialog from '@/dialogs/AdaptersUpdaterDialog';\nimport SlowConnectionWarningDialog, { SlowConnectionWarningDialogClass } from '@/dialogs/SlowConnectionWarningDialog';\nimport IsVisible from '@/components/IsVisible';\nimport AdminUtils from '@/AdminUtils';\nimport {\n TabHeader,\n type AdminConnection,\n type IobTheme,\n type ThemeType,\n type Translate,\n TabContainer,\n Utils,\n} from '@iobroker/adapter-react-v5';\nimport type AdaptersWorker from '@/Workers/AdaptersWorker';\nimport { type AdapterEvent } from '@/Workers/AdaptersWorker';\nimport type InstancesWorker from '@/Workers/InstancesWorker';\nimport type { InstanceEvent } from '@/Workers/InstancesWorker';\nimport type { CompactInstanceInfo } from '@/dialogs/AdapterUpdateDialog';\nimport type { RepoAdapterObject } from '@/components/Adapters/Utils';\n\nimport type { Ratings, AdapterCacheEntry } from '@/components/Adapters/AdapterGeneric';\nimport type HostsWorker from '@/Workers/HostsWorker';\nimport GitHubInstallDialog from '@/dialogs/GitHubInstallDialog';\nimport AdapterInstallDialog, {\n type AdapterRatingInfo,\n type InstalledInfo,\n type AdaptersContext,\n type AdapterInstallDialogState,\n} from '@/components/Adapters/AdapterInstallDialog';\nimport AdaptersList, { SUM } from '@/components/Adapters/AdaptersList';\nimport type { AdminGuiConfig } from '@/types';\nimport type { RatingDialogRepository } from '@/dialogs/RatingDialog';\nimport AdminUpdater from '@/dialogs/AdminUpdater';\n\ntype DockerInformation =\n | {\n /** If it is a Docker installation */\n isDocker: boolean;\n /** If it is the official Docker image */\n isOfficial: true;\n /** Semver string for official Docker image */\n officialVersion: string;\n }\n | {\n /** If it is a Docker installation */\n isDocker: boolean;\n /** If it is the official Docker image */\n isOfficial: false;\n };\ntype Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd';\n\ntype HostInfo = {\n /** Converted OS for human readability */\n Platform: Platform | 'docker' | 'Windows' | 'OSX';\n /** The underlying OS */\n os: Platform;\n /** Information about the docker installation */\n dockerInformation?: DockerInformation;\n /** Host architecture */\n Architecture: string;\n /** Number of CPUs */\n CPUs: number | null;\n /** CPU speed */\n Speed: number | null;\n /** CPU model */\n Model: string | null;\n /** Total RAM of host */\n RAM: number;\n /** System uptime in seconds */\n 'System uptime': number;\n /** Node.JS version */\n 'Node.js': string;\n /** Current time to compare to local time */\n time: number;\n /** Timezone offset to compare to local time */\n timeOffset: number;\n /** Number of available adapters */\n 'adapters count': number;\n /** NPM version */\n NPM: string;\n};\n\nexport type CompactSystemRepository = {\n _id: string;\n common: {\n name: string;\n dontDelete: boolean;\n };\n native: {\n repositories: Record<string, ioBroker.RepositoryInformation>;\n };\n};\n\nconst styles: Record<string, any> = {\n grow: {\n flexGrow: 1,\n },\n updateAllButton: (theme: IobTheme) => ({\n position: 'relative',\n '& .admin-update-second-icon': {\n position: 'absolute',\n top: 15,\n left: 15,\n opacity: 0.4,\n color: theme.palette.mode === 'dark' ? '#aad5ff' : '#007fff',\n },\n }),\n counters: {\n mr: '10px',\n minWidth: 120,\n display: 'flex',\n '& div': {\n ml: '3px',\n },\n },\n infoAdapters: (theme: IobTheme) => ({\n fontSize: 10,\n color: theme.palette.mode === 'dark' ? '#9c9c9c' : '#333',\n cursor: 'pointer',\n }),\n greenText: {\n color: '#00a005d1',\n },\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nconst FILTERS: { name: string; notByList?: boolean }[] = [\n { name: 'Description A-Z' },\n { name: 'Name A-Z' },\n { name: 'Popular first', notByList: true },\n { name: 'Recently updated', notByList: true },\n];\n\ninterface AdaptersProps {\n t: Translate;\n /** The host ID of the admin adapter, like system.host.test */\n adminHost: string;\n adminInstance: string;\n socket: AdminConnection;\n systemConfig: ioBroker.SystemConfigObject;\n lang: ioBroker.Languages;\n themeType: ThemeType;\n theme: IobTheme;\n /** Called when admin updates itself */\n onUpdating: (isUpdating: boolean) => void;\n ready: boolean;\n /** Current selected host */\n currentHost: string;\n forceUpdateAdapters: number;\n triggerUpdate: number;\n /** Like admin.0 */\n adminGuiConfig: AdminGuiConfig;\n adaptersWorker: AdaptersWorker;\n instancesWorker: InstancesWorker;\n hostsWorker: HostsWorker;\n expertMode: boolean;\n executeCommand: (cmd: string, host?: string, callback?: (exitCode: number) => void) => void;\n commandRunning: boolean;\n onSetCommandRunning: (commandRunning: boolean) => void;\n toggleTranslation: () => void;\n noTranslation: boolean;\n menuOpened: boolean;\n menuClosed: boolean;\n currentAdminVersion: string;\n}\n\ninterface AdaptersState extends AdapterInstallDialogState {\n lastUpdate: number;\n repository: Record<string, RepoAdapterObject & { rating?: AdapterRatingInfo }>;\n installed: InstalledInfo;\n installedGlobal: InstalledInfo;\n adapters: Record<string, ioBroker.AdapterObject>;\n compactInstances: Record<string, CompactInstanceInfo> | null;\n categories: {\n name: string;\n translation: string;\n count: number;\n installed: number;\n adapters: string[];\n }[];\n hostData: (HostInfo & { 'Active instances': number; location: string; Uptime: number }) | null;\n compactRepositories: CompactSystemRepository | null;\n hostOs: string;\n nodeJsVersion: string;\n init: boolean;\n update: boolean;\n filterConnectionType: boolean;\n search: string;\n oneListView: boolean;\n tableViewMode: boolean;\n updateList: boolean;\n installedList: number;\n categoriesTiles: string;\n filterTiles: string;\n gitHubInstallDialog: boolean;\n updateAvailable: string[];\n filteredList: any;\n showUpdater: boolean;\n descWidth: number;\n showStatistics: boolean;\n readTimeoutMs: number;\n showSlowConnectionWarning: boolean;\n currentHost: string;\n forceUpdateAdapters: number;\n triggerUpdate: number;\n ratings: Ratings | null;\n categoriesExpanded: { [categoryName: string]: boolean };\n adminUpgradeTo: string;\n}\n\nclass Adapters extends AdapterInstallDialog<AdaptersProps, AdaptersState> {\n private readonly inputRef: React.RefObject<HTMLInputElement>;\n\n private readonly countRef: React.RefObject<HTMLDivElement>;\n\n private readonly t: Translate;\n\n private readonly wordCache: Record<string, string> = {};\n\n private cache: {\n listOfVisibleAdapter: string[] | null;\n adapters: { [adapterName: string]: AdapterCacheEntry } | null;\n } = { listOfVisibleAdapter: null, adapters: null };\n\n private listOfVisibleAdapterLength: number = 0;\n\n private allAdapters: number = 0;\n\n private installedAdapters: number = 0;\n\n private recentUpdatedAdapters: number = 0;\n\n private uuid: string = '';\n\n private buildCacheTimer: ReturnType<typeof setTimeout> | null = null;\n\n private updateTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private typingTimer: ReturnType<typeof setTimeout> | null = null;\n\n private hostsTimer: ReturnType<typeof setTimeout> | null = null;\n\n private tempAdapters: Record<string, any> | null = null;\n\n private tempInstalled: InstalledInfo | null = null;\n\n private tempInstances: Record<string, CompactInstanceInfo> | null = null;\n\n constructor(props: AdaptersProps) {\n super(props);\n\n Object.assign(this.state, {\n lastUpdate: 0,\n repository: {},\n /** Adapters installed on the same host, without object changes installed just contains io-package information, not enriched information like installedFrom */\n installed: {},\n /** This contains the adapters installed on same and other hosts */\n installedGlobal: {},\n adapters: {},\n compactInstances: {},\n categories: [],\n hostData: null,\n compactRepositories: null,\n hostOs: '',\n nodeJsVersion: '',\n init: false,\n update: false,\n filterConnectionType: false,\n search: (((window as any)._localStorage as Storage) || window.localStorage).getItem('Adapter.search') || '',\n oneListView: false,\n tableViewMode: false,\n updateList: false,\n installedList: 0,\n categoriesTiles: 'All',\n filterTiles: 'Description A-Z',\n gitHubInstallDialog: false,\n updateAvailable: [],\n filteredList: null,\n showUpdater: false,\n descWidth: 300,\n showStatistics: false,\n readTimeoutMs: SlowConnectionWarningDialogClass.getReadTimeoutMs(),\n showSlowConnectionWarning: false,\n currentHost: props.currentHost,\n forceUpdateAdapters: props.forceUpdateAdapters,\n triggerUpdate: props.triggerUpdate,\n ratings: null,\n categoriesExpanded: {},\n adminUpgradeTo: '',\n } as AdaptersState);\n\n this.inputRef = createRef();\n this.countRef = createRef();\n\n this.t = this.translate;\n }\n\n translate = (word: string, arg1?: string | boolean | number, arg2?: string | boolean | number): string => {\n if (arg1 !== undefined) {\n return this.props.t(word, arg1, arg2);\n }\n\n if (!this.wordCache[word]) {\n this.wordCache[word] = this.props.t(word);\n }\n\n return this.wordCache[word];\n };\n\n renderSlowConnectionWarning(): JSX.Element | null {\n if (!this.state.showSlowConnectionWarning) {\n return null;\n }\n return (\n <SlowConnectionWarningDialog\n readTimeoutMs={this.state.readTimeoutMs}\n t={this.t}\n onClose={readTimeoutMs => {\n if (readTimeoutMs) {\n this.setState({ showSlowConnectionWarning: false, readTimeoutMs }, () => this.updateAll());\n } else {\n this.setState({ showSlowConnectionWarning: false });\n }\n }}\n />\n );\n }\n\n async componentDidMount(): Promise<void> {\n if (this.props.ready) {\n await this.updateAll();\n if (this.state.search) {\n this.filterAdapters();\n }\n this.props.adaptersWorker.registerHandler(this.onAdaptersChanged);\n this.props.instancesWorker.registerHandler(this.onAdaptersChanged);\n }\n }\n\n async updateAll(update?: boolean, bigUpdate?: boolean, indicateUpdate?: boolean): Promise<void> {\n await this.getAdapters(update, bigUpdate, indicateUpdate);\n await this.getAdaptersInfo(update, indicateUpdate);\n }\n\n componentDidUpdate(): void {\n const descWidth = this.getDescWidth();\n if (this.state.descWidth !== descWidth) {\n this.setState({ descWidth });\n }\n if (this.countRef.current) {\n this.countRef.current.innerHTML = this.listOfVisibleAdapterLength.toString();\n }\n }\n\n componentWillUnmount(): void {\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n this.updateTimeout = null;\n\n if (this.buildCacheTimer) {\n clearTimeout(this.buildCacheTimer);\n this.buildCacheTimer = null;\n }\n\n if (this.typingTimer) {\n clearTimeout(this.typingTimer);\n this.typingTimer = null;\n }\n\n if (this.hostsTimer) {\n clearTimeout(this.hostsTimer);\n this.hostsTimer = null;\n }\n\n this.props.adaptersWorker.unregisterHandler(this.onAdaptersChanged);\n this.props.instancesWorker.unregisterHandler(this.onAdaptersChanged);\n }\n\n onAdaptersChanged = (events: (AdapterEvent | InstanceEvent)[]): void => {\n this.tempAdapters = this.tempAdapters || JSON.parse(JSON.stringify(this.state.adapters || {}));\n this.tempInstalled = this.tempInstalled || JSON.parse(JSON.stringify(this.state.installed || {}));\n this.tempInstances = this.tempInstances || JSON.parse(JSON.stringify(this.state.compactInstances || {}));\n\n events.forEach(event => {\n // detect if adapter or instance\n const isInstance = !!event.id.match(/\\.\\d+$/);\n if (isInstance) {\n if (event.type === 'deleted' || !event.obj) {\n delete this.tempInstances[event.id];\n } else {\n this.tempInstances[event.id] = {\n enabled: event.obj.common.enabled,\n icon: event.obj.common.icon,\n name: event.obj.common.name,\n adminTab: event.obj.common.adminTab,\n version: event.obj.common.version,\n };\n }\n } else if (event.type === 'deleted' || !event.obj) {\n // extract name from id\n const p = event.id.split('.');\n\n // remove from installed\n delete this.tempInstalled[p[2]];\n delete this.tempAdapters[event.id];\n } else {\n const name = event.obj.common.name;\n if (this.tempInstalled[name]) {\n // Update attributes\n Object.keys(this.tempInstalled[name]).forEach(attr => {\n if ((event.obj.common as Record<string, any>)[attr] !== undefined && attr !== 'installedFrom') {\n (this.tempInstalled[name] as Record<string, any>)[attr] = (\n event.obj.common as Record<string, any>\n )[attr];\n }\n });\n } else {\n // new\n this.tempInstalled[event.id.split('.').pop()] = JSON.parse(JSON.stringify(event.obj.common));\n }\n this.tempAdapters[event.id] = event.obj;\n }\n });\n\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n this.updateTimeout = setTimeout(() => {\n const adapters = this.tempAdapters;\n this.tempAdapters = null;\n const installed = this.tempInstalled;\n this.tempInstalled = null;\n const compactInstances = this.tempInstances;\n this.tempInstances = null;\n\n this.analyseInstalled({\n adapters,\n installedLocal: installed,\n cb: () => this.calculateInfo(compactInstances),\n });\n }, 300);\n };\n\n /**\n * Enriches information of the installed adapters with those of the repository and sets them to the state\n */\n analyseInstalled(options: {\n adapters: Record<string, ioBroker.AdapterObject>;\n installedLocal: InstalledInfo;\n installedGlobal?: InstalledInfo;\n repository?: Record<string, RepoAdapterObject>;\n cb?: () => void;\n }): void {\n let { adapters, repository } = options;\n\n const { cb, installedLocal } = options;\n let { installedGlobal } = options;\n\n adapters = adapters || this.state.adapters;\n const installed = installedLocal || this.state.installed;\n installedGlobal = installedGlobal || this.state.installedGlobal;\n repository = repository || this.state.repository;\n\n const updateAvailable: string[] = [];\n\n Object.keys(installed).forEach(adapterName => {\n if (installed[adapterName]) {\n const version = installed[adapterName].version;\n const repositoryEntry = repository[adapterName];\n\n if (\n repositoryEntry &&\n repositoryEntry.version !== version &&\n AdminUtils.updateAvailable(version, repositoryEntry.version) &&\n !updateAvailable.includes(adapterName)\n ) {\n updateAvailable.push(adapterName);\n }\n }\n });\n\n this.cache.listOfVisibleAdapter = null;\n\n this.setState(\n {\n adapters,\n updateAvailable,\n installed,\n repository,\n installedGlobal,\n },\n () => cb && cb(),\n );\n }\n\n /**\n * Get the installed adapters, for current host and other hosts\n */\n async getInstalled(update?: boolean): Promise<{\n installedLocal: InstalledInfo;\n installedGlobal: InstalledInfo;\n }> {\n /** Installed adapters on the same host */\n let installedLocal: InstalledInfo;\n /** Installed adapters on any hosts */\n let installedGlobal: InstalledInfo = {};\n\n const hosts = await this.props.socket.getHosts(update);\n\n for (const host of hosts) {\n try {\n const alive = await this.props.socket.getState(`${host._id}.alive`);\n if (alive?.val) {\n const res = await this.props.socket.getInstalled(host._id, update, this.state.readTimeoutMs);\n\n if (host._id === this.state.currentHost) {\n installedLocal = res;\n }\n // TODO: handle cases where different versions of adapters are installed on different hosts\n installedGlobal = { ...installedGlobal, ...res };\n }\n } catch (e) {\n window.alert(`Cannot getInstalled from \"${host._id}\" (timeout ${this.state.readTimeoutMs}ms): ${e}`);\n if (e.toString().includes('timeout')) {\n this.setState({ showSlowConnectionWarning: true });\n }\n }\n }\n\n return { installedLocal, installedGlobal };\n }\n\n async getAdapters(update?: boolean, bigUpdate?: boolean, indicateUpdate?: boolean): Promise<void> {\n console.log('[ADAPTERS] getAdapters');\n\n const currentHost = this.state.currentHost;\n update = update || this.props.adaptersWorker.isForceUpdate();\n\n if (!this.state.update && (update || indicateUpdate)) {\n this.setState({ update: true });\n }\n\n let adapters: Record<string, ioBroker.AdapterObject>;\n\n try {\n adapters = (await this.props.adaptersWorker.getAdapters(update)) || {};\n } catch (e) {\n window.alert(`Cannot getAdapters: ${e}`);\n }\n\n const { installedLocal, installedGlobal } = await this.getInstalled(update);\n\n let repository: Record<string, RepoAdapterObject>;\n try {\n repository = await this.props.socket.getRepository(\n currentHost,\n { repo: this.props.systemConfig.common.activeRepo, update: bigUpdate || indicateUpdate },\n update,\n this.state.readTimeoutMs,\n );\n } catch (e) {\n window.alert(`Cannot getRepository: ${e}`);\n if (e.toString().includes('timeout')) {\n this.setState({ showSlowConnectionWarning: true });\n }\n }\n\n return this.analyseInstalled({\n adapters,\n installedLocal,\n repository,\n installedGlobal,\n });\n }\n\n getWordVotes(votes: number): string {\n if (votes === 1) {\n return this.t('vote');\n }\n if (votes >= 2 && votes <= 4) {\n return this.t('votes2');\n }\n if (votes >= 5 && votes <= 20) {\n return this.t('votes');\n }\n const v = votes % 10;\n if (v === 1) {\n return this.t('vote21');\n }\n if (v >= 2 && v <= 4) {\n return this.t('votes2');\n }\n return this.t('votes');\n }\n\n static getAdapterTitle(\n /** adapter name */\n adapterName: string,\n adapters: Record<string, ioBroker.AdapterCommon | AdapterCacheEntry>,\n lang: ioBroker.Languages,\n ): string {\n if (!adapters[adapterName]) {\n return adapterName;\n }\n const titleObj: ioBroker.StringOrTranslated =\n (adapters[adapterName] as ioBroker.AdapterCommon).titleLang || adapters[adapterName].title;\n let title: string;\n if (typeof titleObj === 'object') {\n title = titleObj[lang] || titleObj.en;\n } else {\n title = titleObj;\n }\n title = ((title || '').toString() || '').replace('ioBroker Visualisation - ', '');\n return title.toLowerCase();\n }\n\n static sortAdapters(\n list: string[],\n lang: ioBroker.Languages,\n installed: InstalledInfo,\n adapters: Record<string, RepoAdapterObject | AdapterCacheEntry>,\n sortByName: boolean,\n sortPopularFirst?: boolean,\n sortRecentlyUpdated?: boolean,\n ): void {\n const titles: { [adapterName: string]: string } = {};\n list.sort((a, b) => {\n if (sortPopularFirst) {\n if (adapters[b].stat === adapters[a].stat) {\n titles[a] = titles[a] || Adapters.getAdapterTitle(a, adapters, lang);\n titles[b] = titles[b] || Adapters.getAdapterTitle(b, adapters, lang);\n\n return titles[a] > titles[b] ? 1 : titles[a] < titles[b] ? -1 : 0;\n }\n return adapters[b].stat - adapters[a].stat;\n }\n if (sortRecentlyUpdated) {\n if (!adapters[a]) {\n return -1;\n }\n if (!adapters[b]) {\n return 1;\n }\n if ((adapters[a] as AdapterCacheEntry).daysAgo === (adapters[b] as AdapterCacheEntry).daysAgo) {\n titles[a] = titles[a] || Adapters.getAdapterTitle(a, adapters, lang);\n titles[b] = titles[b] || Adapters.getAdapterTitle(b, adapters, lang);\n\n return titles[a] > titles[b] ? 1 : titles[a] < titles[b] ? -1 : 0;\n }\n return (adapters[a] as AdapterCacheEntry).daysAgo - (adapters[b] as AdapterCacheEntry).daysAgo;\n }\n\n if (installed[a] && installed[b]) {\n if (sortByName) {\n return a > b ? 1 : a < b ? -1 : 0;\n }\n titles[a] = titles[a] || Adapters.getAdapterTitle(a, adapters, lang);\n titles[b] = titles[b] || Adapters.getAdapterTitle(b, adapters, lang);\n\n return titles[a] > titles[b] ? 1 : titles[a] < titles[b] ? -1 : 0;\n }\n if (installed[a]) {\n return -1;\n }\n if (installed[b]) {\n return 1;\n }\n\n if (sortByName) {\n return a > b ? 1 : a < b ? -1 : 0;\n }\n // sort by real language name and not by adapter name\n titles[a] = titles[a] || Adapters.getAdapterTitle(a, adapters, lang);\n titles[b] = titles[b] || Adapters.getAdapterTitle(b, adapters, lang);\n\n return titles[a] > titles[b] ? 1 : titles[a] < titles[b] ? -1 : 0;\n });\n }\n\n calculateInfo(\n compactInstances: Record<string, CompactInstanceInfo>,\n ratings?: Ratings | null,\n hostData?: (HostInfo & { 'Active instances': number; location: string; Uptime: number }) | null,\n compactRepositories?: CompactSystemRepository | null,\n ): Promise<void> {\n hostData = hostData || this.state.hostData;\n ratings = ratings || this.state.ratings;\n compactInstances = compactInstances || this.state.compactInstances;\n if (!compactRepositories?._id) {\n compactRepositories = this.state.compactRepositories;\n }\n\n const adapters = this.state.adapters;\n\n const installed: InstalledInfo = JSON.parse(JSON.stringify(this.state.installed));\n const repository: Record<string, RepoAdapterObject> = JSON.parse(JSON.stringify(this.state.repository));\n\n const nodeJsVersion = (hostData?.['Node.js'] || '').replace('v', '');\n const hostOs = hostData?.os || '';\n\n const categories: {\n [categoryType: string]: {\n name: string;\n translation: string;\n count: number;\n installed: number;\n adapters: string[];\n };\n } = {};\n const categoriesSorted: {\n name: string;\n translation: string;\n count: number;\n installed: number;\n adapters: string[];\n }[] = [];\n let categoriesExpanded: { [categoryName: string]: boolean } = {};\n try {\n categoriesExpanded =\n JSON.parse(\n (((window as any)._localStorage as Storage) || window.localStorage).getItem(\n 'Adapters.expandedCategories',\n ),\n ) || {};\n } catch {\n // ignore\n }\n\n Object.keys(installed).forEach(adapterName => {\n const adapter = installed[adapterName];\n if (adapters[adapterName]?.common?.ignoreVersion) {\n adapter.ignoreVersion = adapters[adapterName].common.ignoreVersion;\n }\n\n if (!adapter.controller && adapterName !== 'hosts') {\n if (!repository[adapterName]) {\n repository[adapterName] = JSON.parse(JSON.stringify(adapter));\n repository[adapterName].version = '';\n }\n }\n adapter.count = 0;\n adapter.enabled = 0;\n });\n\n Object.keys(compactInstances).forEach(id => {\n const adapterName = compactInstances[id].name;\n if (installed[adapterName]) {\n installed[adapterName].count++;\n }\n });\n\n const now = Date.now();\n this.recentUpdatedAdapters = 0;\n this.installedAdapters = 0;\n\n Object.keys(repository).forEach(adapterName => {\n if (adapterName === 'hosts') {\n return;\n }\n if (adapterName.startsWith('_')) {\n return;\n }\n const adapter: RepoAdapterObject & { rating?: AdapterRatingInfo } = repository[adapterName];\n if (adapter.keywords) {\n adapter.keywords = adapter.keywords.map(word => word.toLowerCase());\n }\n const _installed = installed[adapterName];\n\n adapter.rating = ratings?.[adapterName] as AdapterRatingInfo;\n\n if (adapter.rating?.rating) {\n adapter.rating.title = [\n `${this.t('Total rating:')} ${adapter.rating.rating.r} (${\n adapter.rating.rating.c\n } ${this.getWordVotes(adapter.rating.rating.c)})`,\n _installed && _installed.version && adapter.rating[_installed.version]\n ? `${this.t('Rating for')} v${_installed.version}: ${adapter.rating[_installed.version].r} (${\n adapter.rating[_installed.version].c\n } ${this.getWordVotes(adapter.rating.rating.c)})`\n : '',\n ]\n .filter(i => i)\n .join('\\n');\n } else {\n adapter.rating = { title: this.t('No rating or too few data') } as AdapterRatingInfo;\n }\n\n if (!adapter.controller) {\n const type: string = adapter.type;\n const installedInGroup = installed[adapterName];\n\n const daysAgo = Math.round((now - new Date(adapter.versionDate).getTime()) / 86400000);\n\n if (daysAgo <= 31) {\n this.recentUpdatedAdapters++;\n }\n if (installed[adapterName]) {\n this.installedAdapters++;\n }\n\n if (!categories[type]) {\n categories[type] = {\n name: type,\n translation: this.t(`${type}_group`),\n count: 1,\n installed: installedInGroup ? 1 : 0,\n adapters: [adapterName],\n };\n } else {\n categories[type].count++;\n categories[type].adapters.push(adapterName);\n if (installedInGroup) {\n categories[type].installed++;\n }\n }\n }\n });\n\n Object.keys(categories)\n .sort((a, b) => {\n if (a === 'general' && b !== 'general') {\n return -1;\n }\n if (a !== 'general' && b === 'general') {\n return 1;\n }\n if (categories[a].translation > categories[b].translation) {\n return 1;\n }\n if (categories[a].translation < categories[b].translation) {\n return -1;\n }\n return 0;\n })\n .forEach(categoryType => categoriesSorted.push(categories[categoryType]));\n\n // const _titles = {};\n const sortByName = this.state.filterTiles === 'Name A-Z';\n\n Object.keys(categories).forEach(type =>\n Adapters.sortAdapters(categories[type].adapters, this.props.lang, installed, repository, sortByName),\n );\n\n let installedList = 0;\n try {\n installedList = JSON.parse(\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Adapters.installedList'),\n );\n // @ts-expect-error back compatibility\n if (installedList === false) {\n installedList = 0;\n }\n } catch {\n // ignore\n }\n const oneListView =\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Adapters.list') === 'true';\n const tableViewMode =\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Adapters.viewMode') === 'true';\n const updateList =\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Adapters.updateList') ===\n 'true';\n const categoriesTiles =\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Adapters.categoriesTiles') ||\n 'All';\n let filterTiles =\n (((window as any)._localStorage as Storage) || window.localStorage).getItem('Adapters.filterTiles') ||\n 'Description A-Z';\n if (filterTiles === 'A-Z') {\n filterTiles = 'Description A-Z';\n }\n this.allAdapters = Object.keys(repository).length - 1;\n\n this.cache.listOfVisibleAdapter = null;\n\n return new Promise<void>(resolve => {\n this.setState(\n {\n repository,\n installed,\n ratings,\n filterTiles,\n categoriesTiles,\n compactRepositories,\n installedList,\n compactInstances,\n updateList,\n tableViewMode,\n oneListView,\n lastUpdate: Date.now(),\n hostData,\n hostOs,\n nodeJsVersion,\n categories: categoriesSorted,\n categoriesExpanded,\n init: true,\n update: false,\n },\n () => resolve(),\n );\n });\n }\n\n async getAdaptersInfo(update?: boolean, indicateUpdate?: boolean): Promise<void> {\n if (!this.state.currentHost) {\n return;\n }\n\n // Do not update too often\n if (Date.now() - this.state.lastUpdate > 1_000) {\n console.log('[ADAPTERS] getAdaptersInfo');\n\n const currentHost = this.state.currentHost;\n\n let ratings: Ratings | null;\n try {\n if (!this.state.update || indicateUpdate) {\n await new Promise<void>(resolve => {\n this.setState({ update: true }, () => resolve());\n });\n }\n const hostData: HostInfo & { 'Active instances': number; location: string; Uptime: number } =\n await this.props.socket.getHostInfo(currentHost, update, this.state.readTimeoutMs).catch(e => {\n window.alert(`Cannot getHostInfo for \"${currentHost}\": ${e}`);\n if (e.toString().includes('timeout')) {\n this.setState({ showSlowConnectionWarning: true });\n }\n });\n\n if (this.props.adminGuiConfig.admin.adapters?.allowAdapterRating !== false) {\n try {\n ratings = (await this.props.socket.getRatings(update)) as unknown as Ratings;\n } catch (e) {\n window.alert(`Cannot read ratings: ${e}`);\n }\n this.uuid = ratings?.uuid || null;\n } else {\n ratings = null;\n }\n\n const compactInstances = await this.props.socket.getCompactInstances(update).catch(e => {\n window.alert(`Cannot read countsOfInstances: ${e}`);\n return {};\n });\n\n const compactRepositoriesEx = await this.props.socket.getCompactSystemRepositories(update).catch(e => {\n window.alert(`Cannot read getCompactSystemRepositories: ${e}`);\n return {};\n });\n const compactRepositories: CompactSystemRepository = compactRepositoriesEx as CompactSystemRepository;\n\n await this.calculateInfo(compactInstances || {}, ratings, hostData, compactRepositories);\n } catch (error) {\n window.alert(`Cannot get adapters info: ${error}`);\n }\n }\n }\n\n toggleCategory(category: string): void {\n this.setState(oldState => {\n const categoriesExpanded = oldState.categoriesExpanded;\n categoriesExpanded[category] = !categoriesExpanded[category];\n\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.expandedCategories',\n JSON.stringify(categoriesExpanded),\n );\n\n return { categoriesExpanded };\n });\n }\n\n rightDependencies = (adapterName: string): boolean => {\n const adapter = this.state.repository[adapterName];\n let result = true;\n\n if (adapter) {\n const dependencies = adapter.dependencies;\n const nodeVersion = adapter.node;\n\n if (dependencies) {\n if (dependencies instanceof Array) {\n dependencies.forEach(dependency => {\n const checkVersion = typeof dependency !== 'string';\n const keys = Object.keys(dependency);\n const name = !checkVersion ? dependency : keys ? keys[0] : null;\n\n if (result && name) {\n const installed = this.state.installed[name];\n\n try {\n result = installed\n ? checkVersion\n ? semver.satisfies(installed.version, dependency[name], {\n includePrerelease: true,\n })\n : true\n : false;\n } catch {\n result = true;\n }\n }\n });\n } else if (typeof dependencies === 'object') {\n // back compatibility\n const _deps: { [_adapterName: string]: string } = dependencies as any as {\n [_adapterName: string]: string;\n };\n Object.keys(_deps).forEach(_adapterName => {\n if (_adapterName && _deps[_adapterName] !== undefined && result) {\n const installed = this.state.installed[_adapterName];\n const checkVersion = typeof _deps[_adapterName] === 'string';\n try {\n result = installed\n ? checkVersion\n ? semver.satisfies(installed.version, _deps[_adapterName], {\n includePrerelease: true,\n })\n : true\n : false;\n } catch {\n result = true;\n }\n }\n });\n } else {\n console.error(\n `[ADAPTERS] Invalid dependencies for ${adapterName}: ${JSON.stringify(dependencies)}`,\n );\n }\n }\n\n if (result && nodeVersion) {\n try {\n result = semver.satisfies(this.state.nodeJsVersion, nodeVersion);\n } catch {\n result = true;\n }\n }\n }\n\n return result;\n };\n\n rightOs(adapterName: string): boolean {\n const adapter = this.state.repository[adapterName];\n\n if (adapter?.os) {\n if (Array.isArray(adapter.os)) {\n return !!adapter.os.find(hostOs => this.state.hostOs === hostOs);\n }\n return this.state.hostOs === adapter.os;\n }\n\n return true;\n }\n\n handleFilterChange(event: React.ChangeEvent<HTMLInputElement>): void {\n if (this.typingTimer) {\n clearTimeout(this.typingTimer);\n }\n\n this.typingTimer = setTimeout(\n value => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapter.search',\n value || '',\n );\n this.typingTimer = null;\n this.filterAdapters(value);\n },\n 300,\n event.target.value,\n );\n }\n\n // toggleConnectionTypeFilter() {\n // this.setState({ filterConnectionType: !this.state.filterConnectionType });\n // }\n\n expandAll(): void {\n this.setState(oldState => {\n const categories = oldState.categories;\n const categoriesExpanded = oldState.categoriesExpanded;\n\n categories.forEach(category => (categoriesExpanded[category.name] = true));\n\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.expandedCategories',\n JSON.stringify(categoriesExpanded),\n );\n\n return { categoriesExpanded };\n });\n }\n\n collapseAll(): void {\n const categoriesExpanded = {};\n\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.expandedCategories',\n JSON.stringify(categoriesExpanded),\n );\n\n this.setState({ categoriesExpanded });\n }\n\n listTable(): void {\n const oneListView = !this.state.oneListView;\n if (oneListView) {\n this.expandAll();\n }\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.list',\n oneListView ? 'true' : 'false',\n );\n this.setState({ oneListView });\n }\n\n changeViewMode(): void {\n this.cache.listOfVisibleAdapter = null;\n const tableViewMode = !this.state.tableViewMode;\n\n // By the list view, the filterTiles can be only 'Description A-Z' or 'Name A-Z'\n let filterTiles = this.state.filterTiles;\n if (tableViewMode && filterTiles !== 'Description A-Z' && filterTiles !== 'Name A-Z') {\n filterTiles = 'Description A-Z';\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.filterTiles',\n filterTiles,\n );\n }\n\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.viewMode',\n tableViewMode ? 'true' : 'false',\n );\n this.setState({ tableViewMode, filterTiles });\n }\n\n changeUpdateList(): void {\n this.cache.listOfVisibleAdapter = null;\n const updateList = !this.state.updateList;\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.updateList',\n updateList ? 'true' : 'false',\n );\n this.setState({ updateList });\n }\n\n changeInstalledList(onlyInstalled?: boolean): void {\n this.cache.listOfVisibleAdapter = null;\n let installedList = !this.state.installedList ? 1 : this.state.installedList < 2 ? 2 : 0;\n if (!installedList && onlyInstalled) {\n installedList = 1;\n }\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.installedList',\n JSON.stringify(installedList),\n );\n this.setState({ installedList });\n }\n\n changeFilterTiles(filterTiles: string): void {\n this.cache.listOfVisibleAdapter = null; // rebuild cache\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.filterTiles',\n filterTiles,\n );\n this.setState({ filterTiles });\n }\n\n changeCategoriesTiles(categoriesTiles: string): void {\n this.cache.listOfVisibleAdapter = null;\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n 'Adapters.categoriesTiles',\n categoriesTiles,\n );\n this.setState({ categoriesTiles });\n }\n\n filterAdapters(search?: string): void {\n search = search === undefined ? this.state.search : search;\n search = (search || '').toLowerCase().trim();\n let filteredList: string[] = [];\n if (search) {\n this.state.categories.forEach(category =>\n category.adapters.forEach(name => {\n const adapter = this.state.repository[name];\n if (!adapter) {\n return;\n }\n\n let title = adapter.titleLang || adapter.title;\n if (typeof title === 'object') {\n title = title[this.props.lang] || title.en;\n }\n title = ((title || '').toString() || '').replace('ioBroker Visualisation - ', '');\n let desc: string;\n if (adapter.desc) {\n if (typeof adapter.desc === 'string') {\n desc = adapter.desc;\n } else {\n desc = adapter.desc[this.props.lang] || adapter.desc.en || '';\n }\n } else {\n desc = '';\n }\n\n if (name.includes(search)) {\n filteredList.push(name);\n } else if (title && typeof title === 'string' && title.toLowerCase().includes(search)) {\n filteredList.push(name);\n } else if (desc && typeof desc === 'string' && desc.toLowerCase().includes(search)) {\n filteredList.push(name);\n } else {\n adapter.keywords?.forEach(value => value.includes(search) && filteredList.push(name));\n }\n }),\n );\n } else {\n filteredList = null;\n }\n\n this.setState({ filteredList, search }, () => {\n this.cache.listOfVisibleAdapter = null;\n this.forceUpdate();\n });\n }\n\n clearAllFilters(): void {\n (((window as any)._localStorage as Storage) || window.localStorage).removeItem('Adapter.search');\n (((window as any)._localStorage as Storage) || window.localStorage).removeItem('Adapters.installedList');\n (((window as any)._localStorage as Storage) || window.localStorage).removeItem('Adapters.updateList');\n if (this.inputRef.current) {\n this.inputRef.current.value = '';\n }\n this.setState(\n {\n filteredList: null,\n updateList: false,\n filterConnectionType: false,\n installedList: 0,\n search: '',\n },\n () => this.filterAdapters(),\n );\n }\n\n getContext(descHidden: boolean): AdaptersContext {\n return {\n expertMode: this.props.expertMode,\n t: this.t,\n socket: this.props.socket,\n removeUpdateAvailable: (adapterName: string) => {\n const updateAvailable = [...this.state.updateAvailable];\n const pos = updateAvailable.indexOf(adapterName);\n if (pos !== -1) {\n updateAvailable.splice(pos, 1);\n this.setState({ updateAvailable });\n }\n },\n toggleTranslation: this.props.toggleTranslation,\n noTranslation: this.props.noTranslation,\n rightDependenciesFunc: this.rightDependencies,\n lang: this.props.lang,\n uuid: this.uuid,\n themeType: this.props.themeType,\n theme: this.props.theme,\n onUpdating: this.props.onUpdating,\n /** Information about ALL KNOWN adapters in the ioBroker infrastructure. Repo */\n repository: this.state.repository,\n /** Information about all installed adapters on this host */\n installed: this.state.installed,\n /** Information about all installed adapters on all hosts */\n installedGlobal: this.state.installedGlobal,\n /** very compact information about instances */\n compactInstances: this.state.compactInstances || {},\n /** Information about installed adapters */\n adapters: this.state.adapters,\n nodeJsVersion: this.state.nodeJsVersion,\n currentHost: this.state.currentHost,\n /** The host ID of the admin adapter, like system.host.test */\n adminHost: this.props.adminHost,\n adminInstance: this.props.adminInstance,\n /** Current selected host */\n instancesWorker: this.props.instancesWorker,\n hostsWorker: this.props.hostsWorker,\n executeCommand: this.props.executeCommand,\n /** node.js version of current host */\n categories: this.state.categories,\n descHidden,\n sortPopularFirst: !this.state.tableViewMode && this.state.filterTiles === 'Popular first',\n sortRecentlyUpdated: !this.state.tableViewMode && this.state.filterTiles === 'Recently updated',\n isTileView: !this.state.tableViewMode,\n updateRating: (adapter: string, rating: RatingDialogRepository) => {\n const repository = JSON.parse(JSON.stringify(this.state.repository));\n Object.assign(repository[adapter].rating, rating);\n this.setState({ repository });\n },\n setAdminUpgradeTo: this.setAdminUpgradeTo,\n } as AdaptersContext;\n }\n\n setAdminUpgradeTo = (version: string): void => this.setState({ adminUpgradeTo: version });\n\n buildCache(context: AdaptersContext): void {\n this.cache.listOfVisibleAdapter = [];\n this.cache.adapters = {};\n const now = Date.now();\n const textDaysAgo0 = this.t('0 %d days ago');\n const textDaysAgo1 = this.t('1 %d days ago');\n const textDaysAgo2 = this.t('2 %d days ago');\n const textDaysAgo = this.t('5 %d days ago');\n\n // get all visible adapters\n this.state.categories\n .filter(\n cat =>\n this.state.tableViewMode ||\n !this.state.categoriesTiles ||\n this.state.categoriesTiles === 'All' ||\n cat.name === this.state.categoriesTiles,\n )\n .forEach(category =>\n category.adapters.forEach(adapterName => {\n const adapter = this.state.repository[adapterName];\n\n if (adapter && !adapter.controller) {\n const connectionType = adapter.connectionType ? adapter.connectionType : '-';\n const updateAvailable = this.state.updateAvailable.includes(adapterName);\n const installed = this.state.installed[adapterName];\n\n let show = !this.state.filteredList || this.state.filteredList.includes(adapterName);\n if (show && this.state.filterConnectionType) {\n show = connectionType === 'local';\n }\n if (show && this.state.updateList) {\n show = updateAvailable;\n }\n if (show && this.state.installedList) {\n show =\n this.state.installedList < 2\n ? !!(installed && installed.version)\n : !!(installed && installed.version && !installed.count);\n }\n if (show) {\n this.cache.listOfVisibleAdapter.push(adapterName);\n const daysAgo10 = Math.round((now - new Date(adapter.versionDate).getTime()) / 8640000);\n const daysAgo = Math.round(daysAgo10 / 10);\n\n const titleObj = adapter.titleLang || adapter.title;\n let title: string;\n if (titleObj && typeof titleObj === 'object') {\n title = titleObj[this.props.lang] || titleObj.en;\n } else {\n title = (titleObj as string) || adapterName;\n }\n title = ((title || '').toString() || '').replace('ioBroker Visualisation - ', '');\n\n let desc;\n if (adapter.desc) {\n if (typeof adapter.desc === 'string') {\n desc = adapter.desc;\n } else {\n desc = adapter.desc[this.props.lang] || adapter.desc.en || '';\n }\n } else {\n desc = '';\n }\n\n const _daysAgo10 = daysAgo % 100 <= 10 || daysAgo % 100 >= 20 ? daysAgo % 10 : 5;\n\n this.cache.adapters[adapterName] = {\n title,\n desc,\n image:\n installed && this.state.adapters[`system.adapter.${adapterName}`]\n ? `.${installed.localIcon}`\n : adapter.extIcon,\n connectionType: adapter.connectionType ? adapter.connectionType : '-',\n updateAvailable: this.state.updateAvailable.includes(adapterName),\n rightDependencies: this.rightDependencies(adapterName),\n rightOs: this.rightOs(adapterName),\n sentry: !!adapter.plugins?.sentry,\n daysAgo: daysAgo10,\n stat: adapter.stat || 0,\n daysAgoText:\n daysAgo || daysAgo === 0\n ? daysAgo === 0\n ? textDaysAgo0\n : _daysAgo10 === 1\n ? textDaysAgo1.replace('%d', daysAgo.toString())\n : _daysAgo10 === 2 || _daysAgo10 === 3 || _daysAgo10 === 4\n ? textDaysAgo2.replace('%d', daysAgo.toString())\n : textDaysAgo.replace('%d', daysAgo.toString())\n : '',\n };\n }\n }\n }),\n );\n\n this.listOfVisibleAdapterLength = this.cache.listOfVisibleAdapter.length;\n\n const sortByName = this.state.filterTiles === 'Name A-Z';\n\n if (this.state.tableViewMode) {\n this.state.categories.forEach(category =>\n Adapters.sortAdapters(\n category.adapters,\n this.props.lang,\n this.state.installed,\n this.cache.adapters,\n sortByName,\n ),\n );\n }\n\n Adapters.sortAdapters(\n this.cache.listOfVisibleAdapter,\n this.props.lang,\n this.state.installed,\n this.cache.adapters,\n sortByName,\n context.sortPopularFirst,\n context.sortRecentlyUpdated,\n );\n\n console.log(`[ADAPTERS] ${new Date().toISOString()} Update cache!`);\n this.forceUpdate();\n }\n\n getUpdater(): JSX.Element | null {\n if (!this.state.showUpdater) {\n return null;\n }\n return (\n <AdaptersUpdaterDialog\n theme={this.props.theme}\n onSetCommandRunning={commandRunning => this.props.onSetCommandRunning(commandRunning)}\n t={this.props.t}\n currentHost={this.state.currentHost}\n lang={this.props.lang}\n installed={this.state.installed}\n repository={this.state.repository}\n toggleTranslation={this.props.toggleTranslation}\n noTranslation={this.props.noTranslation}\n onClose={reload => this.setState({ showUpdater: false }, () => reload && this.updateAll(true, false))}\n socket={this.props.socket}\n />\n );\n }\n\n getDescWidth(): number {\n if (this.props.menuOpened) {\n return document.body.scrollWidth - SUM - 180 + 13;\n }\n if (this.props.menuClosed) {\n return document.body.scrollWidth - SUM;\n }\n // if (this.props.menuCompact) {\n return document.body.scrollWidth - SUM - 50 + 13;\n }\n\n getStatistics(): JSX.Element | null {\n if (this.state.showStatistics) {\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showStatistics: false })}\n >\n <DialogTitle>{this.t('Statistics')}</DialogTitle>\n <DialogContent style={{ fontSize: 16 }}>\n <Box\n component=\"div\"\n sx={styles.counters}\n >\n {this.t('Total adapters')}:{' '}\n <span style={{ paddingLeft: 6, fontWeight: 'bold' }}>{this.allAdapters}</span>\n </Box>\n <Box\n component=\"div\"\n sx={styles.counters}\n >\n {this.t('Installed adapters')}:{' '}\n <span style={{ paddingLeft: 6, fontWeight: 'bold' }}>{this.installedAdapters}</span>\n </Box>\n <Box\n component=\"div\"\n sx={styles.counters}\n >\n {this.t('Last month updated adapters')}:{' '}\n <span style={{ paddingLeft: 6, fontWeight: 'bold' }}>{this.recentUpdatedAdapters}</span>\n </Box>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n onClick={() => this.setState({ showStatistics: false })}\n color=\"primary\"\n autoFocus\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n return null;\n }\n\n renderGitHubInstallDialog(context: AdaptersContext): JSX.Element | null {\n if (!this.state.gitHubInstallDialog) {\n return null;\n }\n\n return (\n <GitHubInstallDialog\n t={this.t}\n categories={this.state.categories}\n installed={this.state.installedGlobal}\n upload={adapterName =>\n this.props.executeCommand(`upload ${adapterName}${this.props.expertMode ? ' --debug' : ''}`)\n }\n installFromUrl={(adapterName, debug, customUrl) =>\n this.addInstance({\n adapterName,\n debug,\n customUrl,\n context,\n })\n }\n repository={this.state.repository}\n onClose={() => {\n this.setState({ gitHubInstallDialog: false });\n }}\n />\n );\n }\n\n renderHeader(): JSX.Element {\n let updateAllButtonAvailable =\n !this.props.commandRunning &&\n !!this.props.ready &&\n !!this.state.updateList &&\n this.state.updateAvailable.length > 1;\n\n // it is not possible to update admin in bulk\n if (\n updateAllButtonAvailable &&\n this.state.updateAvailable.length === 2 &&\n this.state.updateAvailable.includes('admin')\n ) {\n updateAllButtonAvailable = false;\n }\n\n return (\n <TabHeader>\n <Tooltip\n title={this.t('Change view mode')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.changeViewMode()}\n >\n {this.state.tableViewMode ? <ViewModuleIcon /> : <ViewListIcon />}\n </IconButton>\n </Tooltip>\n <Tooltip\n title={this.t('Check adapter for updates')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.updateAll(true, true)}\n >\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n {this.state.tableViewMode && !this.state.oneListView && (\n <Tooltip\n title={this.t('expand all')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.expandAll()}\n >\n <FolderOpenIcon />\n </IconButton>\n </Tooltip>\n )}\n {this.state.tableViewMode && !this.state.oneListView && (\n <Tooltip\n title={this.t('collapse all')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.collapseAll()}\n >\n <FolderIcon />\n </IconButton>\n </Tooltip>\n )}\n {this.state.tableViewMode && (\n <Tooltip\n title={this.t('list')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.listTable()}\n >\n <ListIcon color={this.state.oneListView ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n )}\n\n {/* <Tooltip title={this.t('Filter local connection type')} slotProps={{ popper: { sx: styles.tooltip } }}>\n <IconButton size=\"large\" onClick={() => this.toggleConnectionTypeFilter()}>\n <CloudOffIcon color={this.state.filterConnectionType ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip> */}\n {this.state.updateList ? (\n <IconButton\n size=\"large\"\n onClick={() => this.changeInstalledList(true)}\n >\n <StarIcon\n color=\"primary\"\n style={{ opacity: 0.3, color: this.state.installedList === 2 ? 'red' : undefined }}\n />\n </IconButton>\n ) : (\n <Tooltip\n slotProps={{ popper: { sx: styles.tooltip } }}\n title={this.t(\n !this.state.installedList\n ? 'Show only installed'\n : this.state.installedList === 1\n ? 'Showed only installed adapters'\n : 'Showed only installed adapters without instance.',\n )}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.changeInstalledList()}\n >\n <StarIcon\n style={this.state.installedList === 2 ? { color: 'red' } : null}\n color={this.state.installedList === 1 ? 'primary' : 'inherit'}\n />\n </IconButton>\n </Tooltip>\n )}\n <IsVisible\n config={this.props.adminGuiConfig.admin}\n name=\"admin.adapters.filterUpdates\"\n >\n <Tooltip\n title={this.t('Filter adapter with updates')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.changeUpdateList()}\n >\n <UpdateIcon color={this.state.updateList ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n </IsVisible>\n {updateAllButtonAvailable && (\n <Tooltip\n title={this.t('Update all adapters')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.setState({ showUpdater: true })}\n sx={styles.updateAllButton}\n >\n <UpdateIcon />\n <UpdateIcon className=\"admin-update-second-icon\" />\n </IconButton>\n </Tooltip>\n )}\n\n {this.props.expertMode && this.props.adminGuiConfig.admin?.adapters.gitHubInstall !== false && (\n <Tooltip\n title={this.t('Install from custom URL')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <IconButton\n size=\"large\"\n onClick={() => this.setState({ gitHubInstallDialog: true })}\n >\n <GithubIcon />\n </IconButton>\n </Tooltip>\n )}\n <div style={styles.grow} />\n <TextField\n variant=\"standard\"\n inputRef={this.inputRef}\n label={this.t('Filter by name')}\n defaultValue={this.state.search}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => this.handleFilterChange(event)}\n slotProps={{\n input: {\n endAdornment: this.state.search ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => {\n (\n ((window as any)._localStorage as Storage) || window.localStorage\n ).removeItem('Adapter.search');\n this.inputRef.current.value = '';\n this.setState({ search: '' }, () => this.filterAdapters());\n }}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n\n {!this.state.tableViewMode && (\n <CustomSelectButton\n t={this.t}\n icons\n contained={this.state.categoriesTiles !== 'All'}\n translateSuffix=\"_group\"\n arrayItem={[{ name: 'All' }, ...this.state.categories]}\n onClick={value => this.changeCategoriesTiles(value as string)}\n value={this.state.categoriesTiles}\n />\n )}\n <CustomSelectButton\n t={this.t}\n arrayItem={this.state.tableViewMode ? FILTERS.filter(item => !item.notByList) : FILTERS}\n onClick={value => this.changeFilterTiles(value as string)}\n value={this.state.filterTiles}\n />\n <div style={styles.grow} />\n <IsVisible\n config={this.props.adminGuiConfig.admin}\n name=\"admin.adapters.statistics\"\n >\n <Box\n component=\"div\"\n sx={Utils.getStyle(this.props.theme, styles.infoAdapters, {\n display: { sm: 'none', md: 'inline-block' },\n })}\n onClick={() => this.setState({ showStatistics: true })}\n >\n <Box\n component=\"div\"\n sx={{ ...styles.counters, ...styles.greenText }}\n >\n {this.t('Selected adapters')}\n <div ref={this.countRef} />\n </Box>\n <Box\n component=\"div\"\n sx={styles.counters}\n >\n {this.t('Total adapters')}:<div>{this.allAdapters}</div>\n </Box>\n <Box\n component=\"div\"\n sx={styles.counters}\n >\n {this.t('Installed adapters')}:<div>{this.installedAdapters}</div>\n </Box>\n <Box\n component=\"div\"\n sx={styles.counters}\n >\n {this.t('Last month updated adapters')}:<div>{this.recentUpdatedAdapters}</div>\n </Box>\n </Box>\n </IsVisible>\n </TabHeader>\n );\n }\n\n /**\n * Perform the Admin Upgrade via Webserver\n * This allows showing UI progress even admin is down\n */\n renderWebserverUpgrade(): JSX.Element | null {\n if (!this.state.adminUpgradeTo) {\n return null;\n }\n\n return (\n <AdminUpdater\n socket={this.props.socket}\n themeType={this.props.themeType}\n host={this.props.adminHost}\n onClose={() => {\n console.log('Close dialog');\n this.setState({ adminUpgradeTo: '', showDialog: false });\n }}\n version={this.state.adminUpgradeTo}\n adminInstance={this.props.adminInstance}\n onUpdating={isUpdating => {\n this.props.onUpdating(isUpdating);\n }}\n currentAdminVersion={this.props.currentAdminVersion}\n />\n );\n }\n\n render(): JSX.Element {\n if (!this.state.init) {\n return <LinearProgress />;\n }\n\n // update adapters because the repository could be changed\n if (this.state.triggerUpdate !== this.props.triggerUpdate) {\n setTimeout(() => {\n this.setState({ triggerUpdate: this.props.triggerUpdate }, () => this.updateAll(true));\n }, 100);\n }\n\n if (\n this.props.currentHost !== this.state.currentHost ||\n this.props.forceUpdateAdapters !== this.state.forceUpdateAdapters\n ) {\n this.hostsTimer =\n this.hostsTimer ||\n setTimeout(() => {\n this.hostsTimer = null;\n this.setState(\n {\n currentHost: this.props.currentHost,\n forceUpdateAdapters: this.props.forceUpdateAdapters,\n },\n () => this.updateAll(false, false, true),\n );\n }, 200);\n }\n\n // fast check if active repo is stable\n let stableRepo = Utils.isStableRepository(this.props.systemConfig.common.activeRepo);\n\n // if repositories are available\n const repositories: Record<string, ioBroker.RepositoryInformation> =\n this.state.compactRepositories?.native?.repositories;\n if (repositories) {\n // new style with multiple active repositories\n if (this.props.systemConfig.common.activeRepo) {\n if (Array.isArray(this.props.systemConfig.common.activeRepo)) {\n // if any active repo is not stable, show warning\n stableRepo = !this.props.systemConfig.common.activeRepo.find(\n repo =>\n !repo.toLowerCase().startsWith('stable') && !repositories[repo]?.json?._repoInfo?.stable,\n );\n } else if (typeof this.props.systemConfig.common.activeRepo === 'string') {\n // if active repo is not stable, show warning\n stableRepo =\n // @ts-expect-error deprecated, but could still come\n !this.props.systemConfig.common.activeRepo.toLowerCase().startsWith('stable') &&\n !repositories[this.props.systemConfig.common.activeRepo]?.json?._repoInfo?.stable;\n }\n }\n }\n\n let repoName: string;\n if (!stableRepo) {\n repoName = Array.isArray(this.props.systemConfig.common.activeRepo)\n ? this.props.systemConfig.common.activeRepo.join(', ')\n : this.props.systemConfig.common.activeRepo;\n\n // old style with just one active repository\n if (typeof this.props.systemConfig.common.activeRepo === 'string') {\n const repoInfo =\n repositories && repositories[this.props.systemConfig.common.activeRepo]?.json?._repoInfo;\n\n if (repoInfo?.name) {\n if (repoInfo.name && typeof repoInfo.name === 'object') {\n repoName = repoInfo.name[this.props.lang] || repoInfo.name.en;\n } else {\n // @ts-expect-error deprecated\n repoName = repoInfo.name as string;\n }\n }\n } else if (\n // new style with multiple active repositories\n this.props.systemConfig.common.activeRepo &&\n typeof this.props.systemConfig.common.activeRepo !== 'string'\n ) {\n repoName = this.props.systemConfig.common.activeRepo\n .map(repo => {\n const repoInfo = repositories && repositories[repo]?.json?._repoInfo;\n if (repoInfo?.name) {\n if (repoInfo.name && typeof repoInfo.name === 'object') {\n return repoInfo.name[this.props.lang] || repoInfo.name.en;\n }\n // @ts-expect-error deprecated\n return repoInfo.name as string;\n }\n return repo;\n })\n .join(', ');\n }\n }\n\n const context = this.getContext(this.state.descWidth < 50);\n\n if (!this.cache.listOfVisibleAdapter) {\n this.buildCacheTimer =\n this.buildCacheTimer ||\n setTimeout(() => {\n this.buildCacheTimer = null;\n this.buildCache(context);\n }, 0);\n }\n\n return (\n <TabContainer>\n {this.state.update && (\n <Grid2>\n <LinearProgress />\n </Grid2>\n )}\n\n {this.renderHeader()}\n\n <AdaptersList\n stableRepo={stableRepo}\n repoName={repoName}\n context={context}\n systemConfig={this.props.systemConfig}\n tableViewMode={this.state.tableViewMode}\n oneListView={this.state.oneListView}\n update={this.state.update}\n cachedAdapters={this.cache.adapters}\n categories={this.state.categories}\n categoriesExpanded={this.state.categoriesExpanded}\n listOfVisibleAdapter={this.cache.listOfVisibleAdapter}\n toggleCategory={category => this.toggleCategory(category)}\n clearAllFilters={() => this.clearAllFilters()}\n descWidth={this.state.descWidth}\n sortByName={this.state.filterTiles === 'Name A-Z'}\n sortPopularFirst={context.sortPopularFirst}\n sortRecentlyUpdated={context.sortRecentlyUpdated}\n commandRunning={this.props.commandRunning}\n />\n\n {this.getUpdater()}\n {this.getStatistics()}\n {this.renderSlowConnectionWarning()}\n {this.renderGitHubInstallDialog(context)}\n {this.renderWebserverUpgrade()}\n {this.renderDialogs(context)}\n </TabContainer>\n );\n }\n}\n\nexport default Adapters;\n"],"names":["styles","button","marginLeft","marginRight","icon","_ref","arrayItem","title","onClick","value","contained","buttonIcon","icons","t","translateSuffix","noTranslation","anchorEl","setAnchorEl","useState","_jsxs","_Fragment","children","_jsx","Tooltip","slotProps","popper","sx","pointerEvents","Button","style","variant","color","e","currentTarget","MaterialDynamicIcon","iconName","Menu","keepMounted","open","Boolean","onClose","map","_ref2","idx","name","MenuItem","selected","disabled","className","placeContent","ICON_CACHE","objIcon","All","AllInclusive","messaging","Message","communication","WifiTethering","general","Apps","logic","VpnKey","alarm","NotificationsActive","SystemUpdateAlt","EmojiSymbols","multimedia","PermMedia","network","SettingsEthernet","storage","Storage","visualization","Visibility","SettingsBrightness","DateRange","energy","BatteryChargingFull","garden","FilterVintage","geoposition","LocationOn","hardware","Phonelink","health","Favorite","household","House","infrastructure","Apartment","lighting","EmojiObjects","protocols","DialerSip","utility","PhonelinkSetup","vehicle","AirportShuttle","BubbleChart","Widgets","weather","Brightness6","metering","LinearScale","adapter","socket","url","setUrl","useEffect","Promise","getObject","then","obj","_obj$common","common","src","alt","Element","Help","smallAvatar","width","height","listItem","theme","mb","background","palette","pl","toVersion","mode","fontWeight","ml","updateDone","opacity","minWidthCss","minWidth","wrapperButton","typography","paddingRight","versions","display","closeButton","position","right","top","grey","languageButton","languageButtonActive","primary","main","versionHeader","borderRadius","AdaptersUpdater","Component","constructor","props","super","updateAvailable","initialVersions","currentRef","current","this","detectUpdates","forEach","installed","version","state","showNews","React","onUpdateSelected","isUpdateAvailable","options","oldVersion","newVersion","semver","console","warn","Object","keys","repository","_installed","ignoreVersion","checkCondition","messages","log","push","sort","getNews","adapterObj","news","en","lang","renderOneAdapter","checked","includes","finished","inProcess","image","localIcon","ListItem","dense","Utils","getStyle","updated","ref","secondaryAction","stopped","CircularProgress","Checkbox","edge","tabIndex","disableRipple","pos","indexOf","splice","ListItemIcon","Avatar","ListItemText","item","join","secondary","Box","component","IconButton","I18n","setState","fromVersion","size","InfoIcon","getReactNews","result","split","line","trim","replace","filter","Grid2","Typography","index","renderShowNews","Dialog","DialogTitle","CloseIcon","getLanguage","toggleTranslation","undefined","LanguageIcon","DialogContent","dividers","container","direction","spacing","wrap","length","gutterBottom","DialogActions","startIcon","render","setTimeout","_this$currentRef$curr","scrollIntoView","List","root","dialogRoot","wrapperHead","justifyContent","checkbox","appBar","flexWrap","bottom","overflow","content","p","AdaptersUpdaterDialog","onAdapterFinished","processList","debug","window","_localStorage","localStorage","getItem","stopOnError","closeOnFinished","currentVersion","updateAdapter","cb","onStartUpdate","onSetCommandRunning","_this$props$repositor","updateAdapters","shift","maxWidth","fullWidth","scroll","id","indeterminate","Command","noSpacing","ready","host","currentHost","cmd","onFinished","errorFunc","Toolbar","disableGutters","FormControlLabel","control","onChange","setItem","label","autoFocus","CheckIcon","CancelIcon","a11yProps","backgroundColor","paper","tabPaper","padding","mt","fontSize","warningText","noteText","marginTop","errorTextNoGit","listIcon","listIconWithMargin","tabSelected","contrastText","GitHubInstallDialog","autoCompleteValue","_localstorage","currentTab","renderNpm","Paper","alignItems","target","SmsIcon","Autocomplete","_","newValue","getList","getOptionLabel","option","_option$name","renderInput","params","_this$state$autoCompl","_params","InputProps","startAdornment","InputAdornment","Icon","TextField","renderOption","_option$name2","mr","flexShrink","renderGitHub","getOptionDisabled","nogit","_option$name3","_option$name4","_this$state$autoCompl2","renderCustom","helperText","event","onKeyUp","key","installFromUrl","input","endAdornment","adapters","arr","i","arrayFlat","categories","category","el","controller","parts","extIcon","meta","readme","toString","titleLang","pop","it","a","b","_this$state$autoCompl3","closeInit","AppBar","Tabs","_e","newTab","indicatorColor","Tab","wrapped","GithubIcon","UrlIcon","async","_this$state$autoCompl4","_url","_this$state$autoCompl5","fullAdapterName","adapterName","upload","error","message","formControl","pr","messageText","messageColor_warn","messageColor_error","messageColor_info","messageTitle_warn","messageTitle_error","messageTitle_info","deps","m","AddInstanceDialog","instanceNumbers","adapterObject","instances","componentDidMount","instancesWorker","getInstances","_instances$id","_instances$id$common","substring","lastIndexOf","getAvailableInstances","checkDependencies","dependencies","arguments","array","installedVersion","rightVersion","getText","text","renderOneMessage","level","link","focus","IconWeb","linkText","renderMessages","marginBottom","checkDeps","expertMode","HostSelectors","tooltip","hostsWorker","setCurrentHost","hostName","hostId","onHostChange","FormControl","InputLabel","Select","labelId","currentInstance","onInstanceChange","AddIcon","extractUrlLink","adapterRepo","_adapterRepo$licenseI","licenseInformation","licenseUrl","AdapterInstallDialog","showDialog","showLicenseDialog","addInstanceHostName","addInstanceId","addInstanceDialog","renderLicenseDialog","context","LicenseDialog","licenseType","addInstance","catch","alert","customUrl","compactInstances","instance","resolve","reject","executeCommand","exitCode","Error","getDependencies","_adapter$dependencies","_adapter$globalDepend","Array","isArray","globalDependencies","nodeVersion","node","dependency","entry","checkVersion","includePrerelease","installedGlobal","nodeJsVersion","renderAddInstanceDialog","onAddInstance","_adapter$licenseInfor","license","renderDialogs","nameDiv","categoryName","cursor","green","blue","marginRight5","installedCount","TableRow","hover","TableCell","Grid","onToggle","expanded","ExpandMoreIcon","ChevronRightIcon","colSpan","descHidden","count","rating","listRating","listTime","fontStyle","list","listOwn","dark","listTitle","pt","pb","textAlign","languageFilter","ratingTextControl","ratingLanguageControl","noComments","commentCount","float","infoText","infoTextContainer","paddingBottom","gap","LANGUAGES","RatingDialog","ratingNumber","ratingComment","votings","ratingLang","filterLang","commentsByLanguage","fetch","uuid","res","json","ts","comments","comment","r","setAdapterRating","method","headers","redirect","body","JSON","stringify","update","renderInfoText","renderComments","_this$state$votings","found","find","disablePadding","ListItemAvatar","Rating","readOnly","defaultValue","Date","toLocaleString","_this$props$currentRa","_this$props$currentRa2","_this$props$currentRa3","currentRating","_event","htmlInput","maxLength","paddingTop","toLocaleDateString","_item","VoteIcon","AdapterDeletionDialog","deleteCustom","deleteCustomSupported","checkFeatureSupported","supportCustoms","AutoUpgradeConfigDialog","currentSavedPolicy","policy","repositories","supported","getConfiguredRepositories","getCurrentAutoUpgradeSetting","_sysConfig$common","sysConfig","adapterAutoUpgrade","activeRepos","entries","active","repoName","getAdapterId","automaticUpgrade","save","setObject","IsVisible","AUTO_UPGRADE_SETTINGS","AUTO_UPGRADE_OPTIONS_MAPPING","InfoBox","type","SaveIcon","genericStyles","hidden","buttonUpdate","border","transition","buttonUpdateIcon","classPoll","classPush","classAssumption","transform","marginLeft5","ratingSet","sentry","objectFit","wrongDependencies","red","header","modalDialog","overflowY","currentVersionText","containerVersion","containerSpecificVersion","versionWarn","amber","cardContentFlexBetween","cardContentFlex","AdapterGeneric","assign","autoUpgradeDialogOpen","showUpdateDialog","adapterDeletionDialog","adapterInstallSpecificVersion","showInstallVersion","showSetRating","renderImage","imageProps","other","img","backgroundImage","onError","onerror","renderAddInstanceButton","allowAdapterInstall","commandRunning","cached","rightOs","renderAutoUpgradeButton","UpdateSettingsIcon","renderReadmeButton","allowAdapterReadme","openInfoDialog","HelpIcon","renderRating","_this$props$context$r","_this$props$context$r2","_this$props$context$r3","allowAdapterRating","isTileView","sortPopularFirst","sortRecentlyUpdated","stat","precision","renderConnectionType","_this$props$context$r4","connectionType","CloudIcon","CloudOffIcon","renderDataSource","_this$props$context$r5","dataSource","ArrowUpwardIcon","ArrowDownwardIcon","RemoveIcon","renderLicenseInfo","_adapter$licenseInfor2","_adapter$licenseInfor3","Link","href","rel","MonetizationOn","renderSentryInfo","_this$props$context$r6","_this$props$context$r7","plugins","CardMedia","sentryIcon","renderVersion","allowAdapterUpdate","rightDependencies","RefreshIcon","renderInstalledVersion","isRow","installedFrom","enabledCount","enabled","startsWith","GitHubIcon","renderUploadButton","onUpload","PublishIcon","renderDeleteButton","allowAdapterDelete","DeleteForeverIcon","renderInstallSpecificVersionButton","AddToPhotosIcon","renderRebuildButton","rebuild","BuildIcon","renderAutoUpdateDialog","adminHost","renderUpdateAdapterDialog","_this$props$context$i","AdapterUpdateDialog","rightDependenciesFunc","onUpdate","onIgnore","_id","removeUpdateAvailable","formatNews","renderAdapterInstallVersion","CustomModal","applyButton","flexGrow","LinkIcon","Card","CardContent","renderSetRatingDialog","updateRating","renderAdapterDeletionDialog","delete","_adapter$docs","docs","AdminUtils","getDocsLinkForAdapter","all","_adapter$licenseInfor4","setAdminUpgradeTo","minHeight","default","boxShadow","flexDirection","imageBlock","margin","zIndex","left","backgroundSize","fab","greenText","success","collapse","close","footerBlock","versionDate","alignSelf","verticalAlign","adapterWithAgo","description","cardContent","cardContentDiv","cardContent2","cardMargin10","availableVersion","curdContentFlexCenter","openCollapse","renderInfoCard","desc","renderCardMedia","available","daysAgoText","Fab","MoreVertIcon","renderCardContent","paddingNone","flex","nameCell","wordWrap","WIDTHS","emptyBlock","install","SUM","reduce","s","containerNotFullHeight","containerFullHeight","table","tableLayout","whiteSpace","textOverflow","notStableRepo","viewModeDiv","flexFlow","AdaptersList","lastRenderCounter","descWidth","systemConfig","tableViewMode","oneListView","categoriesExpanded","cachedAdapters","sortByName","renderCounter","listOfVisibleAdapter","getRow","AdapterRow","getRows","LinearProgress","rows","Fragment","AdapterCategoryRow","translation","toggleCategory","clearAllFilters","getTiles","items","_this$props$context$i2","AdapterTile","flexBasis","renderTileView","stableRepo","renderTableView","TabContent","TableContainer","Table","stickyHeader","TableHead","BUTTONS_WIDTH","TableBody","getDerivedStateFromProps","changed","shouldComponentUpdate","nextProps","nextState","_this$props$systemCon","_this$props$systemCon2","activeRepo","AdminUpdater","updating","interval","startTimeout","textareaRef","response","starting","upAgain","location","protocol","setUpdating","onUpdating","getWebserverParams","adminInstance","useHttps","native","secure","port","certPrivateName","certPrivate","certPublicName","certPublic","currentAdminVersion","upgradeAdapterWithWebserver","setInterval","checkStatus","componentWillUnmount","clearInterval","clearTimeout","running","stderr","stdout","plainBody","endsWith","parse","unshift","waitForAdapterStart","scrollTop","scrollHeight","_this$state$response","_this$state$response3","_this$state$response4","_this$state$response5","_this$state$response6","reason","resize","themeType","boxSizing","fontFamily","_this$state$response2","reload","ReloadIcon","grow","updateAllButton","counters","infoAdapters","FILTERS","notByList","Adapters","inputRef","countRef","wordCache","cache","listOfVisibleAdapterLength","allAdapters","installedAdapters","recentUpdatedAdapters","buildCacheTimer","updateTimeout","typingTimer","hostsTimer","tempAdapters","tempInstalled","tempInstances","translate","word","arg1","arg2","onAdaptersChanged","events","match","adminTab","attr","analyseInstalled","installedLocal","calculateInfo","_deps","_adapterName","adminUpgradeTo","lastUpdate","hostData","compactRepositories","hostOs","init","filterConnectionType","search","updateList","installedList","categoriesTiles","filterTiles","gitHubInstallDialog","filteredList","showUpdater","showStatistics","readTimeoutMs","SlowConnectionWarningDialogClass","getReadTimeoutMs","showSlowConnectionWarning","forceUpdateAdapters","triggerUpdate","ratings","createRef","renderSlowConnectionWarning","SlowConnectionWarningDialog","updateAll","filterAdapters","adaptersWorker","registerHandler","bigUpdate","indicateUpdate","getAdapters","getAdaptersInfo","componentDidUpdate","getDescWidth","innerHTML","unregisterHandler","repositoryEntry","getInstalled","hosts","getHosts","alive","getState","val","isForceUpdate","getRepository","repo","getWordVotes","votes","v","getAdapterTitle","titleObj","toLowerCase","sortAdapters","titles","daysAgo","_compactRepositories","_hostData","_hostData2","os","categoriesSorted","_adapters$adapterName","_adapters$adapterName2","now","_ratings","_adapter$rating","keywords","c","installedInGroup","Math","round","getTime","categoryType","_this$props$adminGuiC","getHostInfo","adminGuiConfig","admin","_ratings2","getRatings","getCompactInstances","getCompactSystemRepositories","oldState","handleFilterChange","expandAll","collapseAll","listTable","changeViewMode","changeUpdateList","changeInstalledList","onlyInstalled","changeFilterTiles","changeCategoriesTiles","_adapter$keywords","forceUpdate","removeItem","getContext","buildCache","textDaysAgo0","textDaysAgo1","textDaysAgo2","textDaysAgo","cat","show","_adapter$plugins","daysAgo10","_daysAgo10","toISOString","getUpdater","menuOpened","document","scrollWidth","menuClosed","getStatistics","paddingLeft","renderGitHubInstallDialog","renderHeader","_this$props$adminGuiC2","updateAllButtonAvailable","TabHeader","ViewModuleIcon","ViewListIcon","FolderOpenIcon","FolderIcon","ListIcon","StarIcon","config","UpdateIcon","gitHubInstall","CustomSelectButton","sm","md","renderWebserverUpgrade","isUpdating","_this$state$compactRe","_this$state$compactRe2","isStableRepository","_repositories$repo","_repositories$repo$js","_repositories$repo$js2","_repoInfo","stable","_repositories$this$pr","_repositories$this$pr2","_repositories$this$pr3","_repositories$this$pr4","_repositories$this$pr5","repoInfo","_repositories$repo2","_repositories$repo2$j","TabContainer"],"sourceRoot":""}