iobroker.admin 7.4.4 → 7.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -8
- package/adminWww/asset-manifest.json +37 -37
- package/adminWww/index.html +1 -1
- package/adminWww/static/js/1737.08641cc2.chunk.js +3 -0
- package/adminWww/static/js/1737.08641cc2.chunk.js.map +1 -0
- package/adminWww/static/js/1892.3c30ecff.chunk.js.map +1 -1
- package/adminWww/static/js/{288.20da45b9.chunk.js → 288.23e8413f.chunk.js} +2 -2
- package/adminWww/static/js/288.23e8413f.chunk.js.map +1 -0
- package/adminWww/static/js/2930.8e88fcf2.chunk.js.LICENSE.txt +1 -1
- package/adminWww/static/js/2930.8e88fcf2.chunk.js.map +1 -1
- package/adminWww/static/js/3363.a4c36649.chunk.js.map +1 -1
- package/adminWww/static/js/3834.d81ffc60.chunk.js +2 -0
- package/adminWww/static/js/3834.d81ffc60.chunk.js.map +1 -0
- package/adminWww/static/js/4289.cbde8e52.chunk.js +2 -0
- package/adminWww/static/js/4289.cbde8e52.chunk.js.map +1 -0
- package/adminWww/static/js/471.8a82d825.chunk.js.map +1 -1
- package/adminWww/static/js/4720.6112531a.chunk.js +2 -0
- package/adminWww/static/js/4720.6112531a.chunk.js.map +1 -0
- package/adminWww/static/js/5503.a4ce73d8.chunk.js +3 -0
- package/adminWww/static/js/5503.a4ce73d8.chunk.js.map +1 -0
- package/adminWww/static/js/5687.d7fa0a4e.chunk.js +2 -0
- package/adminWww/static/js/5687.d7fa0a4e.chunk.js.map +1 -0
- package/adminWww/static/js/{6361.48a28196.chunk.js → 6361.ec86271d.chunk.js} +2 -2
- package/adminWww/static/js/6361.ec86271d.chunk.js.map +1 -0
- package/adminWww/static/js/6603.ee9b0df5.chunk.js +3 -0
- package/adminWww/static/js/6603.ee9b0df5.chunk.js.map +1 -0
- package/adminWww/static/js/6853.ff130602.chunk.js +2 -0
- package/adminWww/static/js/6853.ff130602.chunk.js.map +1 -0
- package/adminWww/static/js/7137.7b5ca6b5.chunk.js.map +1 -1
- package/adminWww/static/js/7424.223daaa3.chunk.js +2 -0
- package/adminWww/static/js/7424.223daaa3.chunk.js.map +1 -0
- package/adminWww/static/js/{8144.ae502bba.chunk.js → 8144.5989b02c.chunk.js} +3 -3
- package/adminWww/static/js/8144.5989b02c.chunk.js.map +1 -0
- package/adminWww/static/js/8387.2cb15163.chunk.js.map +1 -1
- package/adminWww/static/js/9072.4505ce12.chunk.js +2 -0
- package/adminWww/static/js/9072.4505ce12.chunk.js.map +1 -0
- package/adminWww/static/js/9086.a4fdc813.chunk.js +2 -0
- package/adminWww/static/js/9086.a4fdc813.chunk.js.map +1 -0
- package/adminWww/static/js/9228.cf388444.chunk.js +3 -0
- package/adminWww/static/js/9228.cf388444.chunk.js.map +1 -0
- package/adminWww/static/js/9701.2178b9bd.chunk.js +2 -0
- package/adminWww/static/js/9701.2178b9bd.chunk.js.map +1 -0
- package/adminWww/static/js/9731.b09a7023.chunk.js +3 -0
- package/adminWww/static/js/{9731.f67b583c.chunk.js.LICENSE.txt → 9731.b09a7023.chunk.js.LICENSE.txt} +1 -1
- package/adminWww/static/js/9731.b09a7023.chunk.js.map +1 -0
- package/adminWww/static/js/main.a833ed54.js +2 -0
- package/adminWww/static/js/main.a833ed54.js.map +1 -0
- package/build-backend/main.js +1 -1
- package/build-backend/main.js.map +1 -1
- package/io-package.json +27 -27
- package/package.json +5 -5
- package/adminWww/static/js/288.20da45b9.chunk.js.map +0 -1
- package/adminWww/static/js/38.e125c16b.chunk.js +0 -3
- package/adminWww/static/js/38.e125c16b.chunk.js.map +0 -1
- package/adminWww/static/js/3834.2e04eb51.chunk.js +0 -2
- package/adminWww/static/js/3834.2e04eb51.chunk.js.map +0 -1
- package/adminWww/static/js/4289.e9a5790f.chunk.js +0 -2
- package/adminWww/static/js/4289.e9a5790f.chunk.js.map +0 -1
- package/adminWww/static/js/4720.4bbc23ec.chunk.js +0 -2
- package/adminWww/static/js/4720.4bbc23ec.chunk.js.map +0 -1
- package/adminWww/static/js/5503.751d48e4.chunk.js +0 -3
- package/adminWww/static/js/5503.751d48e4.chunk.js.map +0 -1
- package/adminWww/static/js/5687.c249e41f.chunk.js +0 -2
- package/adminWww/static/js/5687.c249e41f.chunk.js.map +0 -1
- package/adminWww/static/js/6361.48a28196.chunk.js.map +0 -1
- package/adminWww/static/js/6603.614b4df4.chunk.js +0 -3
- package/adminWww/static/js/6603.614b4df4.chunk.js.map +0 -1
- package/adminWww/static/js/6853.f9170a75.chunk.js +0 -2
- package/adminWww/static/js/6853.f9170a75.chunk.js.map +0 -1
- package/adminWww/static/js/7424.98e61818.chunk.js +0 -2
- package/adminWww/static/js/7424.98e61818.chunk.js.map +0 -1
- package/adminWww/static/js/7863.92e61020.chunk.js +0 -2
- package/adminWww/static/js/7863.92e61020.chunk.js.map +0 -1
- package/adminWww/static/js/8144.ae502bba.chunk.js.map +0 -1
- package/adminWww/static/js/9072.4eaaedc2.chunk.js +0 -2
- package/adminWww/static/js/9072.4eaaedc2.chunk.js.map +0 -1
- package/adminWww/static/js/9228.3ce3911c.chunk.js +0 -3
- package/adminWww/static/js/9228.3ce3911c.chunk.js.map +0 -1
- package/adminWww/static/js/9701.b2813984.chunk.js +0 -2
- package/adminWww/static/js/9701.b2813984.chunk.js.map +0 -1
- package/adminWww/static/js/9731.f67b583c.chunk.js +0 -3
- package/adminWww/static/js/9731.f67b583c.chunk.js.map +0 -1
- package/adminWww/static/js/main.11639e29.js +0 -2
- package/adminWww/static/js/main.11639e29.js.map +0 -1
- /package/adminWww/static/js/{38.e125c16b.chunk.js.LICENSE.txt → 1737.08641cc2.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{5503.751d48e4.chunk.js.LICENSE.txt → 5503.a4ce73d8.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{6603.614b4df4.chunk.js.LICENSE.txt → 6603.ee9b0df5.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{8144.ae502bba.chunk.js.LICENSE.txt → 8144.5989b02c.chunk.js.LICENSE.txt} +0 -0
- /package/adminWww/static/js/{9228.3ce3911c.chunk.js.LICENSE.txt → 9228.cf388444.chunk.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/4289.e9a5790f.chunk.js","mappings":"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","sources":["assets/sentry.svg","components/CustomSelectButton.tsx","helpers/MaterialDynamicIcon.tsx","components/Adapters/AdaptersUpdater.tsx","dialogs/AdaptersUpdaterDialog.tsx","Workers/HostAdapterWorker.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;\nconst _excluded = [\"title\", \"titleId\"];\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); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }\nimport * as React from \"react\";\nfunction SvgSentry(_ref, svgRef) {\n let {\n title,\n titleId\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\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 { type AdminConnection } from '@iobroker/adapter-react-v5';\nimport GenericWorker, { type EventType, type GenericEvent } from './GenericWorker';\n\nexport type HostAdapterEventType = EventType;\n\nexport type HostAdapterEvent = GenericEvent<'adapter'>;\n\nexport default class HostAdapterWorker extends GenericWorker<'adapter'> {\n private readonly host: string;\n private readonly prefix: string;\n\n constructor(socket: AdminConnection, host: string) {\n super(socket, `${host}.adapter`, 'adapter');\n this.prefix = `${host}.adapter.`;\n this.host = host;\n }\n\n getObject(adapterName: string): ioBroker.AdapterObject | null {\n if (!this.objects) {\n return null;\n }\n return this.objects[this.prefix + adapterName] || null;\n }\n\n getHost(): string {\n return this.host;\n }\n}\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 {\n Language as UrlIcon,\n Sms as SmsIcon,\n Close as CloseIcon,\n Check as CheckIcon,\n Delete,\n} 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 /** History of custom commands */\n customHistory: string[];\n}\n\nconst MAX_HISTORY_LENGTH = 10;\n\nclass GitHubInstallDialog extends React.Component<GitHubInstallDialogProps, GitHubInstallDialogState> {\n constructor(props: GitHubInstallDialogProps) {\n super(props);\n\n let customHistory = [];\n const customHistoryStr = ((window as any)._localstorage || window.localStorage).getItem('App.npmHistory');\n if (customHistoryStr) {\n try {\n customHistory = JSON.parse(customHistoryStr);\n } catch {\n // ignore\n }\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 customHistory,\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 <Autocomplete\n fullWidth\n value={this.state.url || ''}\n onInputChange={(_, newValue) => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.userUrl',\n newValue || '',\n );\n this.setState({ url: newValue });\n }}\n onChange={(_, newValue) => {\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.userUrl',\n newValue || '',\n );\n this.setState({ url: newValue });\n }}\n renderOption={(props, option) => (\n <Box\n component=\"li\"\n {...props}\n style={{ display: 'flex', alignItems: 'left' }}\n >\n {option}\n <div style={{ flexGrow: 1 }} />\n <IconButton\n size=\"small\"\n onClick={e => {\n e.stopPropagation();\n const customHistory = this.state.customHistory.filter(it => it !== option);\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.npmHistory',\n JSON.stringify(customHistory),\n );\n this.setState({ customHistory });\n }}\n >\n <Delete />\n </IconButton>\n </Box>\n )}\n freeSolo\n options={this.state.customHistory}\n renderInput={params => (\n <TextField\n variant=\"standard\"\n {...params}\n onKeyUp={event => {\n if (event.key === 'Enter' && this.state.url) {\n const customHistory = [...this.state.customHistory];\n customHistory.unshift(this.state.url);\n if (customHistory.length > MAX_HISTORY_LENGTH) {\n customHistory.pop();\n }\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.npmHistory',\n JSON.stringify(customHistory),\n );\n\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 this.setState({ autoCompleteValue: null, url: '' });\n this.props.onClose();\n }\n }}\n helperText={this.props.t('URL or file path')}\n label={this.props.t('URL')}\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 const customHistory = [...this.state.customHistory];\n customHistory.unshift(this.state.url);\n if (customHistory.length > MAX_HISTORY_LENGTH) {\n customHistory.pop();\n }\n ((window as any)._localstorage || window.localStorage).setItem(\n 'App.npmHistory',\n JSON.stringify(customHistory),\n );\n\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.getObjects().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 <= 100; i++) {\n if (!this.state.instanceNumbers.includes(i.toString())) {\n result.push(\n <MenuItem\n value={i.toString()}\n key={i}\n >\n {i}\n </MenuItem>,\n );\n }\n if (result.length > 11) {\n break;\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(this.props.t('No version of %s', adapter.name, adapter.name));\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 || JSON.stringify(adapterRepo)}`);\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, I18n } 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 type HostAdapterWorker from '@/Workers/HostAdapterWorker';\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 hostAdapterWorker: HostAdapterWorker;\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.getObjects();\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 try {\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 } catch (e) {\n window.alert(`${I18n.t('Cannot install')}: ${e}`);\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 try {\n void this.addInstance({\n adapterName: addInstanceDialog,\n instance: addInstanceId,\n context,\n });\n } catch (e) {\n window.alert(`Cannot add instance: ${e}`);\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.toString() })}\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 | null> {\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: unknown): null => {\n window.alert(`Cannot vote: ${e as Error}`);\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 {\n Close as CloseIcon,\n HorizontalRule,\n KeyboardDoubleArrowUp,\n North,\n VerticalAlignTop,\n Save,\n} from '@mui/icons-material';\n\nimport { type AdminConnection, I18n } from '@iobroker/adapter-react-v5';\nimport { InfoBox } from '@foxriver76/iob-component-lib';\nimport IsVisible from '@/components/IsVisible';\nimport { AUTO_UPGRADE_OPTIONS_MAPPING, AUTO_UPGRADE_SETTINGS } from '@/helpers/utils';\n\nexport const ICONS: Record<string, React.JSX.Element> = {\n none: <HorizontalRule />,\n patch: <KeyboardDoubleArrowUp style={{ color: 'green' }} />,\n minor: <North style={{ color: 'orange' }} />,\n major: <VerticalAlignTop style={{ color: 'red' }} />,\n};\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 apply 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 }, () => this.props.onClose());\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\n key={option}\n value={option}\n >\n <div style={{ display: 'flex', gap: 8 }}>\n {ICONS[option]}\n {AUTO_UPGRADE_OPTIONS_MAPPING[option]}\n </div>\n </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={<Save />}\n onClick={() => this.save()}\n >\n {I18n.t('Save')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.props.onClose()}\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,\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 '@/helpers/AdminUtils';\nimport AdapterInstallDialog, {\n type AdapterInstallDialogState,\n type AdapterRating,\n type AdapterRatingInfo,\n type AdaptersContext,\n} from '@/components/Adapters/AdapterInstallDialog';\nimport AutoUpgradeConfigDialog, { ICONS } 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 marginLeft: '4px',\n }),\n repoVersionText: (theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? '#a3fcff' : '#005498',\n fontWeight: 'bold',\n marginLeft: '4px',\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 const adapterObj = this.props.context.hostAdapterWorker.getObject(this.props.adapterName);\n if (!adapterObj) {\n return <div style={{ width: 34, height: 34, display: 'inline-block' }} />;\n }\n\n // 'none' | 'patch' | 'minor' | 'major'\n const autoUpgrade: ioBroker.AutoUpgradePolicy = adapterObj.common?.automaticUpgrade;\n\n return (\n <Tooltip\n title={this.props.context.t('Automatic Upgrade Policy') + (autoUpgrade ? `: ${autoUpgrade}` : '')}\n slotProps={{ popper: { sx: this.styles.tooltip } }}\n >\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ autoUpgradeDialogOpen: true, showDialog: true })}\n >\n {!autoUpgrade || autoUpgrade === 'none' ? <KeyboardArrowUp /> : ICONS[autoUpgrade]}\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 ) : null;\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 adapter.licenseInformation?.type ? (\n <Link\n href={link}\n target=\"_blank\"\n rel=\"noopener\"\n sx={(theme: IobTheme) => ({\n color: theme.palette.mode === 'dark' ? 'white' : 'black',\n '&:hover': { color: theme.palette.mode === 'dark' ? 'white' : 'black' },\n })}\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 ) : null}\n </Link>\n ) : null;\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 any).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 const repoVersion = this.props.context.repository[this.props.adapterName]?.version;\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 ) : null}\n {repoVersion === version ? (\n <Box\n component=\"span\"\n sx={this.styles.repoVersionText}\n >{`(${this.props.context.t('repository')})`}</Box>\n ) : null}\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() || <div style={{ marginLeft: 5, width: 24, height: 24 }} />}\n {this.renderDataSource() || <div style={{ width: 24, height: 24 }} />}\n {this.renderSentryInfo() || <div style={{ width: 24, height: 24 }} />}\n {this.renderLicenseInfo()}\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 Button,\n LinearProgress,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Tooltip,\n Typography,\n} from '@mui/material';\n\nimport { Update as UpdateIcon } from '@mui/icons-material';\n\nimport { TabContent } 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';\nimport { InfoBox } from '@foxriver76/iob-component-lib';\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% - 50px)',\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 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: (onlyUpdate?: boolean) => void;\n update: boolean;\n descWidth: number;\n sortByName: boolean;\n sortPopularFirst: boolean;\n sortRecentlyUpdated: boolean;\n commandRunning: boolean;\n updateListFilter: 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 const rest = this.props.listOfVisibleAdapter.length - rows.length;\n const text =\n rest === 1\n ? this.props.context.t('Filter adapters to see others. There is %s more', 1)\n : this.props.context.t('Filter adapters to see others. There are %s more', rest);\n\n rows.push(\n <TableRow key=\"more\">\n <TableCell\n colSpan={8}\n style={{ fontSize: 20, padding: 20, textAlign: 'center' }}\n >\n {text}\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={8}\n style={{ textAlign: 'center' }}\n >\n <Button\n variant=\"outlined\"\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 </Button>\n {this.props.updateListFilter ? <br /> : null}\n {this.props.updateListFilter ? (\n <Button\n style={{ marginTop: 16 }}\n variant=\"outlined\"\n onClick={() => this.props.clearAllFilters(true)}\n startIcon={<UpdateIcon />}\n >\n {this.props.context.t('Remove filter for updatable adapters')}\n </Button>\n ) : null}\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 width: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 16,\n }}\n >\n <Tooltip\n title={this.props.context.t('Click to clear all filters')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <Button\n variant=\"outlined\"\n onClick={() => this.props.clearAllFilters()}\n >\n {this.props.context.t('all items are filtered out')}\n </Button>\n </Tooltip>\n {this.props.updateListFilter ? (\n <Button\n variant=\"outlined\"\n onClick={() => this.props.clearAllFilters(true)}\n startIcon={<UpdateIcon />}\n >\n {this.props.context.t('Remove filter for updatable adapters')}\n </Button>\n ) : null}\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 sx={{ marginX: 2, marginTop: 1, width: 'calc(100% - 32px)' }}>\n <InfoBox type={'warning'}>{this.props.context.t('Active repo is \"%s\"', repoName)}</InfoBox>\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 sx={{ marginX: 2, marginTop: 1, width: 'calc(100% - 32px)' }}>\n <InfoBox type={'warning'}>{this.props.context.t('Active repo is \"%s\"', repoName)}</InfoBox>\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 '@/helpers/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 HostAdapterWorker, { type HostAdapterEvent } from '@/Workers/HostAdapterWorker';\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: {\n [adapterName: string]: { exact: boolean; type: 'name' | 'desc' | 'title' | 'keywords'; start?: boolean };\n } | null;\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 onHostAdapterTimer: 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 private hostAdapterWorker: HostAdapterWorker | 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 this.hostAdapterWorker = new HostAdapterWorker(this.props.socket, this.props.currentHost);\n this.hostAdapterWorker.registerHandler(this.onHostAdapterChanged);\n // wait till data is loaded\n await this.hostAdapterWorker.getObjects();\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 this.updateTimeout = null;\n }\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 if (this.onHostAdapterTimer) {\n clearTimeout(this.onHostAdapterTimer);\n this.onHostAdapterTimer = null;\n }\n\n this.props.adaptersWorker.unregisterHandler(this.onAdaptersChanged);\n this.props.instancesWorker.unregisterHandler(this.onAdaptersChanged);\n this.hostAdapterWorker.destroy();\n this.hostAdapterWorker = null;\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 this.updateTimeout = null;\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.getObjects(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 filteredList?: {\n [adapterName: string]: { exact: boolean; type: 'name' | 'desc' | 'title' | 'keywords'; start?: boolean };\n } | null,\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 (filteredList) {\n if (filteredList[a].exact && !filteredList[b].exact) {\n return -1;\n }\n if (!filteredList[a].exact && filteredList[b].exact) {\n return 1;\n }\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\n .getHostInfo(currentHost, update, this.state.readTimeoutMs)\n .catch((e: unknown): void => {\n window.alert(`Cannot getHostInfo for \"${currentHost}\": ${e as Error}`);\n if ((e as Error).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\n .getCompactInstances(update)\n .catch((e: unknown): Record<string, CompactInstanceInfo> => {\n window.alert(`Cannot read countsOfInstances: ${e as Error}`);\n return {};\n });\n\n const compactRepositoriesEx = await this.props.socket\n .getCompactSystemRepositories(update)\n .catch((e: unknown): Record<string, CompactSystemRepository> => {\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: {\n [adapterName: string]: { exact: boolean; type: 'name' | 'desc' | 'title' | 'keywords'; start?: boolean };\n } = {};\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 let title: string | undefined;\n let desc: string | undefined;\n const titleM = adapter.titleLang || adapter.title;\n if (typeof titleM === 'object') {\n title = titleM[this.props.lang] || titleM.en;\n } else {\n title = titleM;\n }\n title = ((title || '').toString() || '').replace('ioBroker Visualisation - ', '');\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[name] = { exact: name === search, type: 'name', start: name.startsWith(search) };\n } else if (title && typeof title === 'string' && title.toLowerCase().includes(search)) {\n filteredList[name] = { exact: false, type: 'title' };\n } else if (desc && typeof desc === 'string' && desc.toLowerCase().includes(search)) {\n filteredList[name] = { exact: false, type: 'desc' };\n } else if (adapter.keywords?.find(value => value.includes(search))) {\n filteredList[name] = { exact: false, type: 'keywords' };\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 onHostAdapterChanged = (_events: HostAdapterEvent[]): void => {\n // redraw\n this.onHostAdapterTimer && clearTimeout(this.onHostAdapterTimer);\n this.onHostAdapterTimer = setTimeout(() => {\n this.onHostAdapterTimer = null;\n this.cache.listOfVisibleAdapter = null;\n this.forceUpdate();\n }, 200);\n };\n\n clearAllFilters(onlyUpdate?: boolean): void {\n if (onlyUpdate) {\n (((window as any)._localStorage as Storage) || window.localStorage).removeItem('Adapters.updateList');\n this.setState(\n {\n updateList: false,\n },\n () => this.filterAdapters(),\n );\n } else {\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 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\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 hostAdapterWorker: this.hostAdapterWorker,\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: boolean = !this.state.filteredList || !!this.state.filteredList[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 this.state.filteredList,\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 the current host changed\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 async () => {\n if (this.hostAdapterWorker.getHost() !== this.props.currentHost) {\n this.hostAdapterWorker.destroy();\n this.hostAdapterWorker = new HostAdapterWorker(\n this.props.socket,\n this.props.currentHost,\n );\n this.hostAdapterWorker.registerHandler(this.onHostAdapterChanged);\n await this.hostAdapterWorker.getObjects();\n }\n await this.updateAll(false, false, true);\n },\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.every(\n repo => 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 updateListFilter={this.state.updateList}\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={(onlyUpdate?: boolean) => this.clearAllFilters(onlyUpdate)}\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","concat","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","_unused","console","warn","Object","keys","repository","_installed","ignoreVersion","checkCondition","messages","log","push","sort","getNews","adapterObj","news","en","lang","_unused2","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","_unused3","renderShowNews","Dialog","DialogTitle","CloseIcon","getLanguage","toggleTranslation","_objectSpread","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","HostAdapterWorker","GenericWorker","prefix","adapterName","objects","getHost","a11yProps","backgroundColor","paper","tabPaper","padding","mt","fontSize","warningText","noteText","marginTop","errorTextNoGit","listIcon","listIconWithMargin","tabSelected","contrastText","GitHubInstallDialog","customHistory","customHistoryStr","_localstorage","JSON","parse","autoCompleteValue","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","onInputChange","flexGrow","stopPropagation","it","stringify","Delete","freeSolo","onKeyUp","event","key","unshift","pop","installFromUrl","helperText","adapters","arr","i","arrayFlat","categories","category","el","controller","parts","extIcon","meta","readme","toString","titleLang","a","b","_this$state$autoCompl3","closeInit","AppBar","Tabs","_e","newTab","indicatorColor","Tab","wrapped","GithubIcon","UrlIcon","async","_this$state$autoCompl4","_url","_this$state$autoCompl5","fullAdapterName","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","getObjects","_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","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","input","endAdornment","htmlInput","maxLength","paddingTop","toLocaleDateString","_item","VoteIcon","AdapterDeletionDialog","deleteCustom","deleteCustomSupported","checkFeatureSupported","supportCustoms","ICONS","none","HorizontalRule","patch","KeyboardDoubleArrowUp","minor","North","major","VerticalAlignTop","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","Save","genericStyles","hidden","buttonUpdate","border","transition","buttonUpdateIcon","classPoll","classPush","classAssumption","transform","marginLeft5","ratingSet","sentry","objectFit","wrongDependencies","red","header","modalDialog","overflowY","currentVersionText","repoVersionText","containerVersion","containerSpecificVersion","versionWarn","amber","cardContentFlexBetween","cardContentFlex","AdapterGeneric","assign","autoUpgradeDialogOpen","showUpdateDialog","adapterDeletionDialog","adapterInstallSpecificVersion","showInstallVersion","showSetRating","renderImage","imageProps","other","_objectWithoutProperties","_excluded","img","backgroundImage","onError","onerror","renderAddInstanceButton","allowAdapterInstall","commandRunning","cached","rightOs","renderAutoUpgradeButton","_adapterObj$common","hostAdapterWorker","autoUpgrade","KeyboardArrowUp","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","_adapter$licenseInfor4","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","_this$props$context$r8","repoVersion","CustomModal","applyButton","LinkIcon","Card","CardContent","renderSetRatingDialog","updateRating","renderAdapterDeletionDialog","delete","_adapter$docs","docs","AdminUtils","getDocsLinkForAdapter","all","_adapter$licenseInfor5","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","viewModeDiv","flexFlow","AdaptersList","lastRenderCounter","descWidth","systemConfig","tableViewMode","oneListView","categoriesExpanded","cachedAdapters","sortByName","renderCounter","listOfVisibleAdapter","getRow","AdapterRow","getRows","LinearProgress","rows","rest","Fragment","AdapterCategoryRow","translation","toggleCategory","clearAllFilters","updateListFilter","UpdateIcon","getTiles","items","_this$props$context$i2","AdapterTile","flexBasis","renderTileView","stableRepo","marginX","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","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","onHostAdapterTimer","tempAdapters","tempInstalled","tempInstances","translate","word","arg1","arg2","onAdaptersChanged","events","match","adminTab","attr","analyseInstalled","installedLocal","calculateInfo","_deps","_adapterName","onHostAdapterChanged","_events","forceUpdate","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","registerHandler","filterAdapters","adaptersWorker","bigUpdate","indicateUpdate","getAdapters","getAdaptersInfo","componentDidUpdate","getDescWidth","innerHTML","unregisterHandler","destroy","repositoryEntry","getInstalled","hosts","getHosts","alive","getState","val","isForceUpdate","getRepository","repo","getWordVotes","votes","v","getAdapterTitle","titleObj","toLowerCase","sortAdapters","titles","daysAgo","exact","_compactRepositories","_hostData","_hostData2","os","categoriesSorted","_unused4","_adapters$adapterName","_adapters$adapterName2","now","_ratings","_adapter$rating","keywords","c","installedInGroup","Math","round","getTime","categoryType","_unused5","_this$props$adminGuiC","getHostInfo","adminGuiConfig","admin","_ratings2","getRatings","getCompactInstances","getCompactSystemRepositories","oldState","handleFilterChange","expandAll","collapseAll","listTable","changeViewMode","changeUpdateList","changeInstalledList","onlyInstalled","changeFilterTiles","changeCategoriesTiles","_adapter$keywords","titleM","start","onlyUpdate","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","gitHubInstall","CustomSelectButton","sm","md","renderWebserverUpgrade","isUpdating","_this$state$compactRe","_this$state$compactRe2","isStableRepository","every","_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":""}
|