iobroker.admin 7.4.7 → 7.4.9
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 -9
- package/adminWww/asset-manifest.json +27 -27
- package/adminWww/index.html +1 -1
- package/adminWww/static/js/1892.3c30ecff.chunk.js.map +1 -1
- package/adminWww/static/js/{288.12201160.chunk.js → 288.18e82468.chunk.js} +2 -2
- package/adminWww/static/js/288.18e82468.chunk.js.map +1 -0
- 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.a5fc8b2e.chunk.js +2 -0
- package/adminWww/static/js/4289.a5fc8b2e.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/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.6655ed69.chunk.js +2 -0
- package/adminWww/static/js/6853.6655ed69.chunk.js.map +1 -0
- package/adminWww/static/js/{7137.7b5ca6b5.chunk.js → 7137.c988b7e1.chunk.js} +2 -2
- package/adminWww/static/js/7137.c988b7e1.chunk.js.map +1 -0
- package/adminWww/static/js/{7424.223daaa3.chunk.js → 7424.5cf79afc.chunk.js} +2 -2
- package/adminWww/static/js/7424.5cf79afc.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/9823.8a42dea5.chunk.js +3 -0
- package/adminWww/static/js/9823.8a42dea5.chunk.js.map +1 -0
- package/adminWww/static/js/{main.d26a969d.js → main.dbb63dc9.js} +2 -2
- package/adminWww/static/js/{main.d26a969d.js.map → main.dbb63dc9.js.map} +1 -1
- package/build-backend/main.js +6 -1
- package/build-backend/main.js.map +1 -1
- package/io-package.json +27 -27
- package/package.json +4 -4
- package/adminWww/static/js/288.12201160.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.72b71322.chunk.js +0 -2
- package/adminWww/static/js/4720.72b71322.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.cfc24286.chunk.js +0 -2
- package/adminWww/static/js/6853.cfc24286.chunk.js.map +0 -1
- package/adminWww/static/js/7137.7b5ca6b5.chunk.js.map +0 -1
- package/adminWww/static/js/7424.223daaa3.chunk.js.map +0 -1
- package/adminWww/static/js/8144.ae502bba.chunk.js.map +0 -1
- package/adminWww/static/js/9823.f3f5cd8c.chunk.js +0 -3
- package/adminWww/static/js/9823.f3f5cd8c.chunk.js.map +0 -1
- /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/{9823.f3f5cd8c.chunk.js.LICENSE.txt → 9823.8a42dea5.chunk.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/3363.a4c36649.chunk.js","mappings":"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","sources":["components/Intro/IntroCard.tsx","components/Intro/CameraIntroDialog.tsx","components/Intro/IntroCardCamera.tsx","components/Intro/EditIntroLinkDialog.tsx","dialogs/NodeUpdateDialog.tsx","tabs/Intro.tsx","../node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseBase.js","../node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseKey.js"],"sourcesContent":["import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Card,\n CardActions,\n CardContent,\n CardMedia,\n Collapse,\n Divider,\n Grid2,\n IconButton,\n Link,\n Typography,\n Tooltip,\n Box,\n} from '@mui/material';\n\nimport {\n Check as CheckIcon,\n Create as EditIcon,\n Close as CloseIcon,\n Delete as DeleteIcon,\n Warning as WarningIcon,\n} from '@mui/icons-material';\n\nimport { blue, grey, red } from '@mui/material/colors';\n\nimport { Utils, IconCopy as SaveIcon, type IobTheme, type Translate } from '@iobroker/adapter-react-v5';\n\nimport AdminUtils from '../../helpers/AdminUtils';\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\nexport const styles: Record<string, any> = {\n root: (theme: IobTheme) => ({\n padding: '.75rem',\n [theme.breakpoints.up('xl')]: {\n flex: '0 1 20%',\n },\n }),\n card: {\n display: 'flex',\n minHeight: '235px',\n position: 'relative',\n overflow: 'hidden',\n maxHeight: '235p',\n '&:hover': {\n overflowY: 'auto',\n boxShadow: boxShadowHover,\n },\n },\n cardInfo: {\n display: 'flex',\n minHeight: '235px',\n position: 'relative',\n overflow: 'initial',\n maxHeight: '235p',\n flexDirection: 'column',\n '&:hover': {\n // overflowY: 'auto',\n boxShadow: boxShadowHover,\n },\n },\n cardInfoHead: (theme: IobTheme) => ({\n position: 'sticky',\n top: 0,\n background: theme.palette.background.default,\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n borderBottom: '1px solid',\n padding: '5px 5px 0px 5px',\n }),\n edit: {\n opacity: 0.6,\n userSelect: 'none',\n pointerEvents: 'none',\n },\n media: (theme: IobTheme) => ({\n backgroundColor: theme.palette.mode === 'dark' ? '#535353' : '#e2e2e2',\n maxWidth: '30%',\n }),\n img: {\n width: 120,\n height: 'auto',\n padding: '2rem .5rem',\n maxWidth: '100%',\n },\n contentContainer: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n content: {\n height: '170px',\n flexGrow: 1,\n overflowY: 'hidden',\n },\n action: {\n minHeight: '49px',\n padding: '16px 24px',\n },\n expand: {\n position: 'absolute',\n right: '10px',\n bottom: '10px',\n },\n collapse: {\n minHeight: '100%',\n backgroundColor: '#ffffff',\n position: 'absolute',\n width: '100%',\n // '& button': {\n // position: 'absolute',\n // top: '10px',\n // color: '#000000',\n // '&:focus': {\n // color: '#ffffff',\n // backgroundColor: blue[500]\n // }\n // }\n },\n close: {\n right: '10px',\n },\n save: {\n right: '50px',\n },\n enabled: {\n color: '#ffffff',\n backgroundColor: blue[500],\n position: 'absolute',\n top: 8,\n right: 8,\n boxShadow,\n '&:hover': {\n backgroundColor: blue[300],\n },\n '&:focus': {\n backgroundColor: blue[500],\n },\n },\n disabled: {\n color: '#ffffff',\n backgroundColor: grey[500],\n position: 'absolute',\n top: 8,\n right: 8,\n boxShadow,\n '&:hover': {\n backgroundColor: grey[300],\n },\n '&:focus': {\n backgroundColor: grey[500],\n },\n },\n editButton: {\n color: '#ffffff',\n backgroundColor: grey[500],\n position: 'absolute',\n top: 16 + 48, // 48 is the height of button\n right: 8,\n boxShadow,\n '&:hover': {\n backgroundColor: grey[300],\n },\n '&:focus': {\n backgroundColor: grey[500],\n },\n },\n deleteButton: {\n color: '#ffffff',\n backgroundColor: red[500],\n position: 'absolute',\n top: 24 + 48 + 48, // 48 is the height of button\n right: 8,\n boxShadow,\n '&:hover': {\n backgroundColor: red[300],\n },\n '&:focus': {\n backgroundColor: red[500],\n },\n },\n contentGrid: {\n height: '100%',\n },\n colorOrange: {\n color: '#ffcc80',\n },\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nexport interface IntroCardProps {\n disabled?: boolean;\n onEdit?: () => void;\n offline?: boolean;\n t: Translate;\n lang: ioBroker.Languages;\n /** Shows a warning on the card with given text if configured */\n warning?: string;\n edit?: boolean;\n toggleActivation?: () => void;\n enabled: boolean;\n onRemove?: () => void;\n action: {\n text: ioBroker.StringOrTranslated;\n link: string;\n };\n color: string;\n image: string;\n children?: JSX.Element | JSX.Element[] | string | string[] | null | undefined;\n title: string | JSX.Element;\n showInfo?: boolean;\n getHostDescriptionAll?: () => { el: JSX.Element; text: string };\n openSnackBarFunc?: () => void;\n style?: React.CSSProperties;\n theme: IobTheme;\n}\n\nexport interface IntroCardState {\n expanded: boolean;\n}\n\nclass IntroCard<TProps extends IntroCardProps, TState extends IntroCardState> extends Component<TProps, TState> {\n constructor(props: TProps) {\n super(props);\n\n this.state = {\n expanded: false,\n } as TState;\n }\n\n static getDerivedStateFromProps(props: IntroCardProps): Partial<IntroCardState> | null {\n if (props.edit) {\n return { expanded: false };\n }\n return null;\n }\n\n handleExpandClick(): void {\n this.setState({ expanded: !this.state.expanded });\n }\n\n renderContent(): JSX.Element | JSX.Element[] | string | string[] | null | undefined {\n return this.props.children;\n }\n\n // eslint-disable-next-line class-methods-use-this\n openDialog(): void {\n // do nothing\n }\n\n // eslint-disable-next-line class-methods-use-this\n renderDialogs(): JSX.Element | null {\n return null;\n }\n\n render(): JSX.Element {\n const editClass = this.props.edit ? styles.edit : undefined;\n\n let buttonTitle: ioBroker.StringOrTranslated = this.props.action.text || this.props.t('Link');\n if (typeof buttonTitle === 'object') {\n buttonTitle = buttonTitle[this.props.lang] || buttonTitle.en;\n }\n\n return (\n <Grid2\n size={{\n xs: 12,\n sm: 6,\n md: 4,\n lg: 3,\n }}\n sx={Utils.getStyle(this.props.theme, styles.root, this.props.style)}\n >\n <Link\n href={\n !this.props.edit && this.props.action && this.props.action.link ? this.props.action.link : null\n }\n underline=\"none\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Card\n sx={styles.card}\n onClick={e => {\n e.stopPropagation();\n this.openDialog();\n }}\n >\n {this.props.showInfo && !this.props.offline && (\n <Button\n style={{ ...styles.expand, ...editClass }}\n variant=\"contained\"\n size=\"small\"\n disabled={this.props.disabled}\n onClick={() => this.handleExpandClick()}\n color=\"primary\"\n >\n {this.props.t('Info')}\n </Button>\n )}\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.theme,\n styles.media,\n editClass,\n this.props.color && { backgroundColor: this.props.color },\n { display: 'flex', flexDirection: 'column' },\n )}\n >\n <CardMedia\n style={styles.img}\n component=\"img\"\n image={this.props.image}\n ></CardMedia>\n <div\n style={{\n flex: 1,\n display: 'flex',\n paddingBottom: '5px',\n paddingLeft: '5px',\n }}\n >\n {this.props.warning ? (\n <Tooltip\n title={this.props.warning}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <WarningIcon\n style={{\n alignSelf: 'end',\n fontSize: 36,\n }}\n />\n </Tooltip>\n ) : null}\n </div>\n </Box>\n <div style={{ ...styles.contentContainer, ...editClass }}>\n <CardContent style={styles.content}>\n <Grid2\n container\n direction=\"column\"\n wrap=\"nowrap\"\n style={styles.contentGrid}\n >\n <Typography\n gutterBottom\n variant=\"h5\"\n component=\"h5\"\n >\n {this.props.title}\n </Typography>\n {this.renderContent()}\n </Grid2>\n </CardContent>\n {this.props.action?.link && <Divider />}\n {this.props.action?.link && (\n <CardActions style={styles.action}>\n <div style={styles.colorOrange}>\n {AdminUtils.getText(buttonTitle, this.props.lang)}\n </div>\n </CardActions>\n )}\n </div>\n {this.props.showInfo && (\n <Collapse\n style={styles.collapse}\n in={this.state.expanded}\n timeout=\"auto\"\n unmountOnExit\n >\n <Card sx={styles.cardInfo}>\n <Box\n component=\"div\"\n sx={styles.cardInfoHead}\n >\n <Typography\n gutterBottom\n variant=\"h5\"\n component=\"h5\"\n >\n {this.props.t('Info')}\n </Typography>\n <div>\n <IconButton\n size=\"small\"\n onClick={() => {\n if (this.props.getHostDescriptionAll) {\n Utils.copyToClipboard(this.props.getHostDescriptionAll().text);\n }\n if (this.props.openSnackBarFunc) {\n this.props.openSnackBarFunc();\n }\n }}\n >\n <SaveIcon />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={() => this.handleExpandClick()}\n >\n <CloseIcon />\n </IconButton>\n </div>\n </Box>\n <CardContent>{this.props.getHostDescriptionAll().el}</CardContent>\n </Card>\n </Collapse>\n )}\n {this.props.edit && this.props.toggleActivation && (\n <IconButton\n size=\"large\"\n sx={this.props.enabled ? styles.enabled : styles.disabled}\n onClick={() => this.props.toggleActivation()}\n >\n <CheckIcon />\n </IconButton>\n )}\n {this.props.edit && this.props.onEdit && (\n <IconButton\n size=\"large\"\n sx={styles.editButton}\n onClick={() => this.props.onEdit()}\n >\n <EditIcon />\n </IconButton>\n )}\n {this.props.edit && this.props.onRemove && (\n <IconButton\n size=\"large\"\n sx={styles.deleteButton}\n onClick={() => this.props.onRemove()}\n >\n <DeleteIcon />\n </IconButton>\n )}\n {this.renderDialogs()}\n </Card>\n </Link>\n </Grid2>\n );\n }\n}\n\nexport default IntroCard;\n","import React, { createRef, Component, type JSX } from 'react';\n\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Typography } from '@mui/material';\n\nimport { Close as CloseIcon } from '@mui/icons-material';\n\nimport type { IobTheme, Translate, AdminConnection } from '@iobroker/adapter-react-v5';\n\nconst styles: Record<string, any> = {\n rootGrid: {\n flexGrow: 1,\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n paper: {\n // minWidth: 600\n },\n typography: {\n paddingRight: 30,\n },\n img: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n};\n\ninterface CameraIntroLinkDialogProps {\n t: Translate;\n camera: string;\n socket: AdminConnection;\n interval?: string;\n onClose: () => void;\n name: string | JSX.Element;\n addTs?: boolean;\n cameraUrl: string;\n}\n\nclass CameraIntroLinkDialog extends Component<CameraIntroLinkDialogProps> {\n cameraUpdateTimer: ReturnType<typeof setInterval>;\n\n cameraRef: React.RefObject<HTMLImageElement>;\n\n constructor(props: CameraIntroLinkDialogProps) {\n super(props);\n\n this.cameraUpdateTimer = null;\n this.cameraRef = createRef();\n }\n\n componentDidMount(): void {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer = setInterval(\n () => this.updateCamera(),\n Math.max(parseInt(this.props.interval, 10), 500),\n );\n this.updateCamera();\n }\n }\n\n componentWillUnmount(): void {\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n }\n\n updateCamera(): void {\n if (this.cameraRef.current) {\n if (this.props.camera === 'custom') {\n let url = this.props.cameraUrl;\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += `&ts=${Date.now()}`;\n } else {\n url += `?ts=${Date.now()}`;\n }\n }\n this.cameraRef.current.src = url;\n } else {\n const parts = this.props.camera.split('.');\n const adapter = parts.shift();\n const instance = parts.shift();\n void this.props.socket\n .sendTo(`${adapter}.${instance}`, 'image', {\n name: parts.pop(),\n width: this.cameraRef.current.width,\n })\n .then(result => {\n if (result && result.data && this.cameraRef.current) {\n this.cameraRef.current.src = `data:image/jpeg;base64,${result.data}`;\n }\n });\n }\n }\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={() => this.props.onClose()}\n open={!0}\n maxWidth=\"xl\"\n fullWidth\n fullScreen\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.props.name}\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 <img\n style={styles.img}\n src=\"\"\n alt=\"camera\"\n ref={this.cameraRef}\n />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n autoFocus\n onClick={e => {\n e.stopPropagation();\n this.props.onClose();\n }}\n color=\"primary\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nexport default CameraIntroLinkDialog;\n","import React, { createRef, type JSX } from 'react';\n\nimport { Grid2, Skeleton } from '@mui/material';\n\nimport { Error as ErrorIcon } from '@mui/icons-material';\n\nimport { type AdminConnection } from '@iobroker/adapter-react-v5';\n\nimport IntroCard, { type IntroCardProps, type IntroCardState } from '@/components/Intro/IntroCard';\nimport CameraIntroDialog from './CameraIntroDialog';\n\nconst styles: Record<string, any> = {\n cameraImg: {\n width: '100%',\n height: '100%',\n maxWidth: 200,\n maxHeight: 200,\n objectFit: 'contain',\n },\n imgContainer: {\n height: '100%',\n },\n hidden: {\n display: 'none',\n },\n imgSkeleton: {\n transform: 'initial',\n },\n};\n\ninterface IntroCardCameraProps extends IntroCardProps {\n camera?: string;\n addTs?: boolean;\n interval?: number;\n cameraUrl?: string;\n socket: AdminConnection;\n}\n\ninterface IntroCardCameraState extends IntroCardState {\n error: boolean;\n dialog: boolean;\n loaded: boolean;\n}\n\nclass IntroCardCamera extends IntroCard<IntroCardCameraProps, IntroCardCameraState> {\n private readonly cameraRef: React.RefObject<HTMLImageElement>;\n\n private cameraUpdateTimer: ReturnType<typeof setTimeout> | null;\n\n private interval: number;\n\n constructor(props: IntroCardCameraProps) {\n super(props);\n\n Object.assign(this.state, {\n error: false,\n dialog: false,\n loaded: false,\n });\n\n this.cameraRef = createRef<HTMLImageElement>();\n this.cameraUpdateTimer = null;\n\n this.interval = props.interval;\n }\n\n updateCamera(): void {\n if (this.cameraRef.current) {\n if (this.props.camera === 'custom') {\n let url = this.props.cameraUrl;\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += `&ts=${Date.now()}`;\n } else {\n url += `?ts=${Date.now()}`;\n }\n }\n this.cameraRef.current.src = url;\n } else {\n const parts = this.props.camera.split('.');\n const adapter = parts.shift();\n const instance = parts.shift();\n this.props.socket\n .sendTo(`${adapter}.${instance}`, 'image', {\n name: parts.pop(),\n width: this.cameraRef.current.width,\n })\n .then((result: { data?: string }) => {\n if (result?.data && this.cameraRef.current) {\n this.cameraRef.current.src = `data:image/jpeg;base64,${result.data}`;\n }\n })\n .catch((e: string) => window.alert(`Cannot send to instance: ${e}`));\n }\n }\n }\n\n componentDidMount(): void {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer = setInterval(\n () => this.updateCamera(),\n Math.max(parseInt(this.props.interval as any as string, 10), 500),\n );\n this.updateCamera();\n }\n }\n\n componentWillUnmount(): void {\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n }\n\n renderDialogs(): JSX.Element | null {\n if (!this.state.dialog) {\n return null;\n }\n return (\n <CameraIntroDialog\n socket={this.props.socket}\n camera={this.props.camera}\n name={this.props.title}\n t={this.props.t}\n onClose={() => {\n if (this.props.camera && this.props.camera !== 'text') {\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n }\n this.cameraUpdateTimer = setInterval(\n () => this.updateCamera(),\n Math.max(parseInt(this.props.interval as any as string, 10), 500),\n );\n this.updateCamera();\n }\n\n this.setState({ dialog: false });\n }}\n cameraUrl={this.props.cameraUrl}\n />\n );\n }\n\n handleImageLoad(): void {\n if (!this.state.loaded) {\n this.setState({\n loaded: true,\n error: false,\n });\n }\n }\n\n handleImageError(): void {\n if (!this.state.error) {\n this.setState({\n loaded: false,\n error: true,\n });\n }\n }\n\n renderContent(): JSX.Element | null {\n if (this.props.camera === 'custom') {\n let url = this.props.cameraUrl;\n\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += `&ts=${Date.now()}`;\n } else {\n url += `?ts=${Date.now()}`;\n }\n }\n\n return (\n <Grid2\n container\n style={styles.imgContainer}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <img\n ref={this.cameraRef}\n src={url}\n alt=\"Camera\"\n style={this.state.loaded && !this.state.error ? styles.cameraImg : styles.hidden}\n onLoad={() => this.handleImageLoad()}\n onError={() => this.handleImageError()}\n />\n {!this.state.loaded && !this.state.error && (\n <Skeleton\n height=\"100%\"\n width=\"100%\"\n animation=\"wave\"\n style={styles.imgSkeleton}\n />\n )}\n {this.state.error && <ErrorIcon fontSize=\"large\" />}\n </Grid2>\n );\n }\n\n if (this.props.camera.startsWith('cameras.')) {\n return (\n <img\n ref={this.cameraRef}\n src=\"\"\n alt=\"camera\"\n style={styles.cameraImg}\n />\n );\n }\n\n return null;\n }\n\n render(): JSX.Element {\n if (this.props.camera && this.props.camera !== 'text') {\n if (this.interval !== this.props.interval) {\n this.interval = this.props.interval;\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n }\n this.cameraUpdateTimer = setInterval(\n () => this.updateCamera(),\n Math.max(parseInt(this.props.interval as any as string, 10), 500),\n );\n }\n } else if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n\n return super.render();\n }\n}\n\nexport default IntroCardCamera;\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n TextField,\n Grid2,\n IconButton,\n Typography,\n FormControlLabel,\n Checkbox,\n Slider,\n InputLabel,\n MenuItem,\n FormControl,\n Select,\n InputAdornment,\n} from '@mui/material';\n\n// icons\nimport { Add as AddIcon, Check as CheckIcon, Close as CloseIcon } from '@mui/icons-material';\n\nimport { UploadImage, type AdminConnection, type IobTheme, type Translate } from '@iobroker/adapter-react-v5';\n\nimport IntroCardCamera from '@/components/Intro/IntroCardCamera';\nimport IntroCard from './IntroCard';\n\nconst styles: Record<string, any> = {\n formControl: {\n marginTop: 32,\n },\n rootGrid: {\n flexGrow: 1,\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n paper: {\n // minWidth: 600\n },\n typography: {\n paddingRight: 30,\n },\n editItem: {\n marginTop: 8,\n },\n editItemSlider: {\n marginTop: 24,\n },\n labelSlider: {\n marginTop: 16,\n fontSize: '1rem',\n },\n editColor: {\n width: '100%',\n },\n dropZone: {\n width: '100%',\n height: 100,\n position: 'relative',\n },\n dropZoneEmpty: {},\n image: {\n height: '100%',\n width: 'auto',\n objectFir: 'contain',\n },\n\n uploadDiv: {\n position: 'relative',\n width: '100%',\n height: 100,\n opacity: 0.9,\n },\n uploadDivDragging: {\n opacity: 1,\n },\n\n uploadCenterDiv: {\n margin: 5,\n border: '3px dashed grey',\n borderRadius: 5,\n width: 'calc(100% - 10px)',\n height: 'calc(100% - 10px)',\n position: 'relative',\n },\n uploadCenterIcon: {\n paddingTop: 10,\n width: 48,\n height: 48,\n },\n uploadCenterText: {\n fontSize: 16,\n },\n uploadCenterTextAndIcon: {\n textAlign: 'center',\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n};\n\ninterface EditIntroLinkDialogProps {\n t: Translate;\n lang: ioBroker.Languages;\n socket: AdminConnection;\n link: Record<string, any>;\n onClose: (link?: Record<string, any>) => void;\n isNew: boolean;\n theme: IobTheme;\n}\n\ninterface EditIntroLinkDialogState {\n image: string;\n name: string;\n link: string;\n linkName: string;\n color: string;\n desc: string;\n addTs: boolean;\n interval: number;\n camera: string;\n cameraList: { id: string; name: string }[];\n}\n\nclass EditIntroLinkDialog extends Component<EditIntroLinkDialogProps, EditIntroLinkDialogState> {\n constructor(props: EditIntroLinkDialogProps) {\n super(props);\n\n this.state = {\n image: '',\n name: props.t('New link'),\n link: 'http://',\n linkName: '',\n color: '',\n desc: '',\n addTs: true,\n interval: 5000,\n camera: 'text',\n cameraList: [],\n ...props.link,\n };\n }\n\n componentDidMount(): void {\n this.getCamerasInstances();\n }\n\n getCamerasInstances(): void {\n void this.props.socket.getAdapterInstances('cameras', true).then(list => {\n const cameraList: { id: string; name: string }[] = [];\n const promises: Promise<{ id: string; name: string }>[] = [];\n list.forEach(obj => {\n const instance = obj._id.replace('system.adapter.', '');\n\n if (obj.common && obj.common.enabled) {\n promises.push(\n // if instance is alive\n this.props.socket\n .getState(`${obj._id}.alive`)\n // get the list of cameras\n .then(state => state && state.val && this.props.socket.sendTo(instance, 'list', null))\n .then(\n result =>\n result &&\n result.list &&\n result.list.forEach((cam: { id: string; name: string; desc: string }) =>\n cameraList.push({ id: cam.id, name: `${cam.desc} [${instance}/${cam.name}]` }),\n ),\n ),\n );\n }\n });\n\n void Promise.all(promises).then(() => this.setState({ cameraList }));\n });\n }\n\n static getLinkNameFromLink(link: string): string {\n const m = link.trim().match(/^https?:\\/\\/([^/:]+)(:\\d+)?/);\n if (m) {\n return m[1] + (m[2] || '');\n }\n return '';\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={() => this.props.onClose()}\n open={!0}\n maxWidth=\"md\"\n fullWidth\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.props.isNew ? this.props.t('Add new link: ') : this.props.t('Edit link')}\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 <Grid2\n style={styles.rootGrid}\n container\n direction=\"row\"\n >\n <Grid2\n size={{\n xs: 12,\n sm: 6,\n md: 8,\n lg: 9,\n }}\n >\n <Grid2\n container\n direction=\"column\"\n >\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <InputLabel id=\"select-helper-label\">{this.props.t('Link type')}</InputLabel>\n <Select\n variant=\"standard\"\n labelId=\"select-helper-label\"\n value={this.state.camera}\n onChange={e => this.setState({ camera: e.target.value })}\n >\n <MenuItem\n value=\"text\"\n key=\"desc\"\n >\n <em>{this.props.t('Description')}</em>\n </MenuItem>\n {this.state.cameraList.map(cam => (\n <MenuItem\n key={cam.id}\n value={cam.id}\n >\n {cam.name}\n </MenuItem>\n ))}\n <MenuItem\n value=\"custom\"\n key=\"custom\"\n >\n {this.props.t('Custom camera URL')}\n </MenuItem>\n </Select>\n </FormControl>\n\n <TextField\n variant=\"standard\"\n label={this.props.t('URL')}\n value={this.state.link}\n style={styles.editItem}\n onChange={e => {\n const oldLinkName = EditIntroLinkDialog.getLinkNameFromLink(this.state.link);\n if (\n oldLinkName &&\n (!this.state.linkName || oldLinkName === this.state.linkName)\n ) {\n this.setState({\n link: e.target.value,\n linkName: EditIntroLinkDialog.getLinkNameFromLink(e.target.value),\n });\n } else {\n this.setState({ link: e.target.value });\n }\n }}\n slotProps={{\n input: {\n endAdornment: this.state.link ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ link: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n\n <TextField\n variant=\"standard\"\n style={styles.editItem}\n label={this.props.t('Name')}\n value={this.state.name || ''}\n onChange={e => this.setState({ name: e.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.name ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ name: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n\n {this.state.link ? (\n <TextField\n variant=\"standard\"\n style={styles.editItem}\n label={this.props.t('Link name')}\n value={this.state.linkName || ''}\n onChange={e => this.setState({ linkName: e.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.linkName ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ linkName: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n ) : null}\n\n {this.state.camera === 'custom' || this.state.camera === 'text' ? (\n <TextField\n variant=\"standard\"\n style={styles.editItem}\n label={\n this.state.camera === 'custom'\n ? this.props.t('Camera URL')\n : this.props.t('Description')\n }\n value={this.state.desc || ''}\n onChange={e => this.setState({ desc: e.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.desc ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ desc: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n ) : null}\n\n {this.state.camera === 'custom' ? (\n <FormControlLabel\n style={styles.editItem}\n control={\n <Checkbox\n checked={this.state.addTs}\n onChange={e => this.setState({ addTs: e.target.checked })}\n />\n }\n label={this.props.t('Add timestamp to URL')}\n />\n ) : null}\n\n {this.state.camera !== 'text' ? (\n <Typography\n style={styles.labelSlider}\n gutterBottom\n >\n Polling interval in ms\n </Typography>\n ) : null}\n {this.state.camera !== 'text' ? (\n <Slider\n style={styles.editItemSlider}\n value={this.state.interval}\n getAriaValueText={() => `${this.state.interval}ms`}\n onChange={(e, interval) => this.setState({ interval: interval as number })}\n step={100}\n min={500}\n max={60000}\n valueLabelDisplay=\"on\"\n />\n ) : null}\n\n <div style={{ ...styles.editItem, width: 50 }}>\n <TextField\n variant=\"standard\"\n fullWidth\n label={this.props.t('Color')}\n style={styles.editColor}\n type=\"color\"\n value={this.state.color}\n onChange={e => this.setState({ color: e.target.value })}\n />\n </div>\n <UploadImage\n disabled={false}\n crop\n maxSize={256 * 1024}\n icon={this.state.image}\n removeIconFunc={() => this.setState({ image: '' })}\n onChange={base64 => this.setState({ image: base64 })}\n // t={this.props.t}\n />\n </Grid2>\n </Grid2>\n <Grid2\n size={{\n xs: 12,\n sm: 6,\n md: 4,\n lg: 3,\n }}\n >\n {this.state.camera === 'text' ? (\n <IntroCard\n image={this.state.image}\n title={this.state.name}\n action={{ link: this.state.link, text: this.state.linkName }}\n t={this.props.t}\n lang={this.props.lang}\n style={{ width: '100% !important', maxWidth: '100% !important', marginLeft: '8px' }}\n color={this.state.color}\n enabled\n theme={this.props.theme}\n >\n {this.state.desc}\n </IntroCard>\n ) : (\n <IntroCardCamera\n interval={this.state.interval}\n camera={this.state.camera}\n addTs={this.state.addTs}\n style={{ width: '100% !important', maxWidth: '100% !important', marginLeft: '8px' }}\n image={this.state.image}\n title={this.state.name}\n socket={this.props.socket}\n action={{ link: this.state.link, text: this.state.linkName }}\n t={this.props.t}\n lang={this.props.lang}\n color={this.state.color}\n enabled\n cameraUrl={this.state.desc}\n theme={this.props.theme}\n />\n )}\n </Grid2>\n </Grid2>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n autoFocus\n onClick={() => {\n this.props.onClose({\n link: this.state.link,\n name: this.state.name,\n desc: this.state.desc,\n linkName: this.state.linkName,\n color: this.state.color,\n image: this.state.image,\n addTs: this.state.addTs,\n camera: this.state.camera,\n interval: this.state.interval,\n });\n }}\n color=\"primary\"\n startIcon={this.props.isNew ? <AddIcon /> : <CheckIcon />}\n >\n {this.props.isNew ? this.props.t('Add') : this.props.t('Save')}\n </Button>\n <Button\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 EditIntroLinkDialog;\n","import React, { type JSX } from 'react';\nimport {\n Box,\n Button,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Typography,\n} from '@mui/material';\nimport { Close as CloseIcon, Refresh as RefreshIcon } from '@mui/icons-material';\n\nimport { type AdminConnection, I18n } from '@iobroker/adapter-react-v5';\n\ninterface NodeUpdateDialogProps {\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 /** The node.js version to upgrade to */\n // version: string;\n}\n\ninterface NodeUpdateDialogState {\n /** If update is in progress */\n inProgress: boolean;\n /** Result from controller */\n success: boolean;\n /** Error from controller */\n error: string;\n /** If execution finished */\n finished: boolean;\n}\n\nexport default class NodeUpdateDialog extends React.Component<NodeUpdateDialogProps, NodeUpdateDialogState> {\n constructor(props: NodeUpdateDialogProps) {\n super(props);\n\n this.state = {\n inProgress: false,\n success: false,\n error: '',\n finished: false,\n };\n }\n\n /**\n * Render the element\n */\n render(): JSX.Element {\n return (\n <Dialog\n open={!0}\n maxWidth=\"lg\"\n fullWidth\n >\n <DialogTitle>{I18n.t('Node.js upgrade')}</DialogTitle>\n <DialogContent style={{ height: 100, padding: '0 20px', overflow: 'hidden' }}>\n {!this.state.finished ? (\n <Typography>\n {I18n.t('Performing this update will restart the js-controller afterwards!')}\n </Typography>\n ) : null}\n {this.state.inProgress ? (\n <Box sx={{ display: 'flex', justifyContent: 'center' }}>\n <CircularProgress />\n </Box>\n ) : null}\n {this.state.success ? (\n <Typography>{I18n.t('Node.js update successful, restarting controller now!')}</Typography>\n ) : null}\n {this.state.error ? (\n <Typography sx={{ color: 'red' }}>\n {I18n.t('Node.js update failed: %s', this.state.error)}\n </Typography>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button\n disabled={this.state.inProgress || this.state.finished}\n color=\"primary\"\n variant=\"contained\"\n startIcon={<RefreshIcon />}\n onClick={() => this.updateNodeJsVersion()}\n >\n {I18n.t('Upgrade')}\n </Button>\n <Button\n disabled={this.state.inProgress}\n variant=\"contained\"\n onClick={() => {\n this.props.onClose();\n }}\n color=\"primary\"\n startIcon={<CloseIcon />}\n >\n {I18n.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n /**\n * Update Node.js to given version and restart the controller afterward\n */\n async updateNodeJsVersion(): Promise<void> {\n this.setState({ inProgress: true });\n const res = await this.props.socket.upgradeOsPackages(\n this.props.hostId,\n [\n {\n name: 'nodejs',\n // For apt updates we need to be precise about the version, e.g. `18.20.2-1nodesource1`, thus we simply upgrade to the newest version instead\n // version: this.props.version,\n },\n ],\n // restart the controller after the Node.js update\n true,\n );\n\n this.setState({\n inProgress: false,\n success: res.success,\n error: res.error,\n finished: true,\n });\n }\n}\n","import React, { type JSX } from 'react';\n\nimport semver from 'semver';\n\nimport { Fab, Snackbar, Tooltip, Grid2, LinearProgress, Skeleton } from '@mui/material';\n\nimport {\n Add as AddIcon,\n Check as CheckIcon,\n Close as CloseIcon,\n Create as CreateIcon,\n Refresh as RefreshIcon,\n} from '@mui/icons-material';\n\nimport {\n type AdminConnection,\n Utils as UtilsCommon,\n type IobTheme,\n type Translate,\n TabContainer,\n TabContent,\n} from '@iobroker/adapter-react-v5';\n\nimport type InstancesWorker from '@/Workers/InstancesWorker';\nimport type HostsWorker from '@/Workers/HostsWorker';\nimport { type HostAliveEvent, type HostEvent } from '@/Workers/HostsWorker';\nimport AdminUtils from '@/helpers/AdminUtils';\nimport { replaceLink } from '@/helpers/utils';\nimport IntroCard from '@/components/Intro/IntroCard';\nimport EditIntroLinkDialog from '@/components/Intro/EditIntroLinkDialog';\n\nimport { type InstanceEvent } from '@/Workers/InstancesWorker';\nimport NodeUpdateDialog from '@/dialogs/NodeUpdateDialog';\nimport IntroCardCamera from '@/components/Intro/IntroCardCamera';\n\ntype OldLinkStructure = {\n link: string;\n color?: string;\n order?: number | string;\n icon?: string;\n img?: string;\n description?: ioBroker.StringOrTranslated;\n pro?: string | boolean;\n cloud?: string;\n intro?: boolean;\n name?: ioBroker.StringOrTranslated;\n localLinks?: string;\n};\n\nexport type CompactHost = {\n _id: `system.host.${string}`;\n common: {\n name: string;\n icon?: string;\n color?: string;\n installedVersion?: string;\n };\n native: {\n hardware: {\n networkInterfaces?: ioBroker.HostNative['hardware']['networkInterfaces'];\n };\n };\n};\n\nconst styles: Record<string, any> = {\n root: {\n width: '100%',\n height: '100%',\n },\n button: {\n position: 'absolute',\n bottom: 16,\n right: 16,\n },\n saveButton: (theme: IobTheme) => ({\n backgroundColor: theme.palette.success.main,\n right: 80,\n '&:hover': {\n backgroundColor: theme.palette.success.dark,\n },\n }),\n addButton: (theme: IobTheme) => ({\n backgroundColor: theme.palette.secondary.main,\n right: 144,\n '&:hover': {\n backgroundColor: theme.palette.secondary.dark,\n },\n }),\n closeButton: (theme: IobTheme) => ({\n backgroundColor: theme.palette.error.main,\n '&:hover': {\n backgroundColor: theme.palette.error.dark,\n },\n }),\n bold: {\n fontWeight: 'bold',\n },\n container: {\n overflowY: 'auto',\n },\n hostOffline: {\n color: '#bb0000',\n },\n updateExists: {\n color: '#c28700',\n marginRight: 4,\n },\n updateNo: {\n color: '#00b204',\n marginRight: 4,\n },\n nodeUpdate: {\n opacity: 0.6,\n },\n instanceNumber: {\n opacity: 0.7,\n fontSize: 16,\n },\n updateIcon: {\n cursor: 'pointer',\n fontSize: 16,\n },\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\ninterface ReverseProxyItem {\n globalPath: string;\n paths: { path: string; instance: string }[];\n}\n\ninterface LinkItem {\n id: string;\n link: string;\n name: string;\n description: string;\n order: number;\n\n color?: string;\n icon: string;\n cloud?: string;\n pro?: string;\n intro?: boolean;\n /** Is this link should be first */\n default?: boolean;\n}\n\ninterface IntroInstanceItem {\n id: string;\n name?: string;\n color?: string;\n description?: string;\n image?: string;\n link?: string;\n linkName?: string;\n order?: number;\n info: string;\n port?: number;\n}\n\ninterface HostData {\n alive: boolean;\n time?: number;\n _nodeNewest?: string;\n _nodeNewestNext?: string;\n 'Node.js'?: string;\n _npmNewest?: string;\n NPM?: string;\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n Platform?: 'win32' | 'linux' | 'darwin' | 'freebsd' | 'sunos' | string;\n RAM?: number;\n _npmNewestNext?: string;\n _versions?: Record<string, string>;\n dockerInformation?: {\n isDocker: boolean;\n isOfficial: boolean;\n officialVersion: string;\n };\n [key: string]: string | boolean | number | Record<string, string | boolean>;\n}\n\nconst formatInfo: Record<string, (seconds: number, t?: Translate) => string> = {\n Uptime: AdminUtils.formatSeconds,\n 'System uptime': AdminUtils.formatSeconds,\n RAM: AdminUtils.formatRam,\n Speed: AdminUtils.formatSpeed,\n 'Disk size': AdminUtils.formatBytes,\n 'Disk free': AdminUtils.formatBytes,\n};\n\ninterface IntroProps {\n showAlert: (message: string, type?: 'error' | 'warning' | 'info' | 'success') => void;\n socket: AdminConnection;\n t: Translate;\n lang: ioBroker.Languages;\n instancesWorker: InstancesWorker;\n hostsWorker: HostsWorker;\n hostname: string;\n adminInstance: string;\n theme: IobTheme;\n}\n\ninterface NodeUpdateDialogInfo {\n /** The host id of the host to upgrade node.js on */\n hostId: string;\n /** The node.js version to upgrade to */\n version: string;\n}\n\ntype ItemCamera = {\n camera: 'custom';\n enabled: boolean;\n link: string;\n name: string;\n /** Title of the link */\n linkName: string;\n /** Camera URL */\n desc: string;\n /** Add timestamp on the image */\n addTs: boolean;\n /** Polling interval in milliseconds */\n interval: number;\n color: string;\n /** base64 image */\n image: string;\n};\n\ntype ItemLink = {\n camera: 'text';\n enabled: boolean;\n link: string;\n name: string;\n /** Title of the link */\n linkName: string;\n /** Camera URL */\n desc: string;\n color: string;\n /** base64 image */\n image: string;\n};\n\ntype ItemElement = ItemCamera | ItemLink;\n\ninterface IntroState {\n /** Difference between client and host time in ms */\n hostTimeDiffMap: Map<string, number>;\n hostsData: Record<string, HostData>;\n alive: Record<string, boolean>;\n reverseProxy: null | ReverseProxyItem[];\n hasUnsavedChanges: boolean;\n openSnackBar: boolean;\n editLinkIndex: number;\n editLink: boolean;\n link: null | ItemElement;\n introLinks: ItemElement[] | null;\n edit: boolean;\n deactivated: string[] | null;\n instances: null | IntroInstanceItem[];\n hosts: CompactHost[] | null;\n /** If controller supports upgrade of nodejs */\n nodeUpdateSupported: boolean;\n /** If node update dialog should be shown */\n nodeUpdateDialog: null | NodeUpdateDialogInfo;\n}\n\nclass Intro extends React.Component<IntroProps, IntroState> {\n /** If server time differs more than MS from client time, show a warning */\n #THRESHOLD_TIME_DIFF_MS = 30 * 60 * 1_000;\n\n #ONE_MINUTE_MS = 60 * 1_000;\n\n /** // e.g. /admin/; */\n private readonly currentProxyPath = window.location.pathname;\n\n private introLinksOriginal?: string;\n\n private deactivatedOriginal?: string[];\n\n private readonly t: Translate;\n\n private getDataTimeout?: ReturnType<typeof setTimeout>;\n\n constructor(props: IntroProps) {\n super(props);\n\n this.state = {\n instances: null,\n deactivated: [],\n edit: false,\n link: null,\n introLinks: [],\n editLink: false,\n editLinkIndex: -1,\n openSnackBar: false,\n hasUnsavedChanges: false,\n reverseProxy: null,\n alive: {},\n hostsData: {},\n hosts: null,\n /** Difference between client and host time in ms */\n hostTimeDiffMap: new Map(),\n nodeUpdateSupported: false,\n nodeUpdateDialog: null,\n };\n\n this.t = props.t;\n }\n\n /**\n * Compares the backend time with the frontend time\n */\n checkBackendTime(): void {\n const timeDiffMap = this.state.hostTimeDiffMap;\n\n for (const [hostId, hostData] of Object.entries(this.state.hostsData)) {\n const currDate = new Date();\n const diff = Math.abs(hostData.time - currDate.getTime());\n\n timeDiffMap.set(hostId, diff);\n }\n\n this.setState({ hostTimeDiffMap: timeDiffMap });\n }\n\n /**\n * React lifecycle hook called when component did mount\n */\n async componentDidMount(): Promise<void> {\n await this.getData();\n this.props.instancesWorker.registerHandler(this.getDataDelayed);\n this.props.hostsWorker.registerHandler(this.updateHosts);\n this.props.hostsWorker.registerAliveHandler(this.updateHostsAlive);\n\n const nodeUpdateSupported = await this.props.socket.checkFeatureSupported('CONTROLLER_OS_PACKAGE_UPGRADE');\n\n // read reverse proxy settings\n const obj = await this.props.socket.getObject(`system.adapter.${this.props.adminInstance}`);\n this.setState({ nodeUpdateSupported, reverseProxy: obj?.native?.reverseProxy || [] });\n this.checkBackendTime();\n }\n\n componentWillUnmount(): void {\n if (this.getDataTimeout) {\n clearTimeout(this.getDataTimeout);\n this.getDataTimeout = undefined;\n }\n\n this.props.instancesWorker.unregisterHandler(this.getDataDelayed);\n this.props.hostsWorker.unregisterHandler(this.updateHosts);\n this.props.hostsWorker.unregisterAliveHandler(this.updateHostsAlive);\n }\n\n updateHostsAlive = async (events: HostAliveEvent[]): Promise<void> => {\n const alive: Record<string, boolean> = JSON.parse(JSON.stringify(this.state.alive));\n const hostsId: string[] = [];\n\n // if some host deleted\n if (events.find(event => event.type === 'deleted')) {\n // get all information anew\n this.getDataDelayed();\n return;\n }\n // update alive status\n events.forEach(event => {\n if (!!alive[event.id] !== !!event.alive) {\n alive[event.id] = event.alive;\n hostsId.push(event.id);\n }\n });\n\n if (hostsId.length) {\n const hostsData: Record<string, HostData> = JSON.parse(JSON.stringify(this.state.hostsData));\n\n const results = await Promise.all(hostsId.map(id => this.getHostData(id, alive[id])));\n results.forEach(res => (hostsData[res.id] = Intro.preprocessHostData(res.data)));\n this.setState({ alive, hostsData }, () => this.checkBackendTime());\n }\n };\n\n updateHosts = (events: HostEvent[]): void => {\n let hostsId = [];\n\n // if host deleted\n if (events.find(event => !event.obj)) {\n this.getDataDelayed();\n return;\n }\n hostsId = events.map(event => event.id);\n\n if (hostsId.length) {\n const hostsData: Record<string, HostData> = JSON.parse(JSON.stringify(this.state.hostsData));\n\n void Promise.all(hostsId.map(id => this.getHostData(id))).then(results => {\n results.forEach(res => (hostsData[res.id] = Intro.preprocessHostData(res.data)));\n this.setState({ hostsData });\n });\n }\n };\n\n async activateEditMode(): Promise<void> {\n const systemConfig: ioBroker.SystemConfigObject = await this.props.socket.getSystemConfig(true);\n const data: { instances: IntroInstanceItem[]; deactivated: string[] } = await this.getInstances(\n true,\n null,\n systemConfig,\n );\n const introLinks = systemConfig?.native?.introLinks ? (systemConfig.native.introLinks as ItemElement[]) : [];\n\n this.introLinksOriginal = JSON.stringify(introLinks);\n this.deactivatedOriginal = JSON.parse(JSON.stringify(data.deactivated));\n\n this.setState({\n instances: data.instances,\n deactivated: data.deactivated,\n edit: true,\n introLinks,\n hasUnsavedChanges: false,\n });\n }\n\n deactivateEditMode(): void {\n if (!this.state.hasUnsavedChanges) {\n // todo: implement confirmation dialog\n }\n\n // restore old state\n this.setState(\n {\n deactivated: this.deactivatedOriginal,\n introLinks: JSON.parse(this.introLinksOriginal),\n hasUnsavedChanges: false,\n edit: false,\n },\n () => {\n this.deactivatedOriginal = null;\n this.introLinksOriginal = null;\n },\n );\n }\n\n toggleCard(id: string, linkName: string): void {\n if (!this.state.instances || !this.state.instances.length) {\n return;\n }\n\n const deactivated = JSON.parse(JSON.stringify(this.state.deactivated));\n\n const pos = deactivated.indexOf(`${id}_${linkName}`);\n\n if (pos !== -1) {\n deactivated.splice(pos, 1);\n } else {\n deactivated.push(`${id}_${linkName}`);\n deactivated.sort();\n }\n\n const hasUnsavedChanges =\n JSON.stringify(deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(this.state.introLinks) !== this.introLinksOriginal;\n\n this.setState({ deactivated, hasUnsavedChanges });\n }\n\n getInstancesCards(): (JSX.Element | null)[] {\n return this.state.instances?.map(instance => {\n const enabled = !this.state.deactivated?.includes(`${instance.id}_${instance.linkName}`);\n if (enabled || this.state.edit) {\n let linkText = instance.link ? instance.link.replace(/^https?:\\/\\//, '') : '';\n linkText = linkText.split('/')[0];\n\n // ignore own admin instance\n if (instance.id === this.props.adminInstance) {\n return null;\n }\n\n let isShowInstance = window.isFinite(instance.id.split('.').pop() as any);\n if (isShowInstance) {\n // try to find second instance of a same type\n isShowInstance = !!this.state.instances?.find(\n inst =>\n inst.id !== instance.id &&\n instance.name === inst.name &&\n instance.id.split('.')[0] === inst.id.split('.')[0],\n );\n }\n\n const hostData = this.state.hostsData ? this.state.hostsData[instance.id] : null;\n const timeDiff = this.state.hostTimeDiffMap.get(instance.id) ?? 0;\n return (\n <IntroCard\n key={`${instance.id}_${instance.link}`}\n image={instance.image}\n title={\n <>\n <span\n style={\n instance.name && instance.name.length > 12 ? { fontSize: '1rem' } : undefined\n }\n >\n {instance.name}\n </span>\n {isShowInstance ? (\n <span style={styles.instanceNumber}>.{instance.id.split('.').pop()}</span>\n ) : null}\n </>\n }\n action={{ link: instance.link, text: linkText }}\n t={this.props.t}\n lang={this.props.lang}\n color={instance.color}\n showInfo={!!instance.info}\n edit={this.state.edit}\n offline={hostData && hostData.alive === false}\n warning={\n timeDiff > this.#THRESHOLD_TIME_DIFF_MS\n ? this.t(\n 'Backend time differs by %s minutes',\n Math.round(timeDiff / this.#ONE_MINUTE_MS).toString(),\n )\n : null\n }\n enabled={enabled}\n disabled={!hostData || typeof hostData !== 'object'}\n getHostDescriptionAll={() => this.getHostDescriptionAll(instance.id)}\n toggleActivation={() => this.toggleCard(instance.id, instance.linkName)}\n openSnackBarFunc={() => this.setState({ openSnackBar: true })}\n theme={this.props.theme}\n >\n {instance.description || this.getHostDescription(instance.id)}\n </IntroCard>\n );\n }\n return null;\n });\n }\n\n toggleLinkCard(i: number): void {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n\n introLinks[i].enabled = !introLinks[i].enabled;\n\n const hasUnsavedChanges =\n JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== this.introLinksOriginal;\n\n this.setState({ introLinks, hasUnsavedChanges });\n }\n\n getLinkCards(): (JSX.Element | null)[] {\n return this.state.introLinks?.map((item, i) => {\n if (!item.enabled && !this.state.edit) {\n return null;\n }\n\n if (item.camera === 'custom') {\n return (\n <IntroCardCamera\n key={`link${i}`}\n image={item.image}\n title={item.name}\n action={{ link: item.link, text: item.linkName }}\n t={this.props.t}\n socket={this.props.socket}\n color={item.color}\n edit={this.state.edit}\n interval={item.interval}\n camera={item.camera}\n addTs={item.addTs}\n onEdit={() =>\n this.setState({\n editLink: true,\n editLinkIndex: i,\n link: JSON.parse(JSON.stringify(this.state.introLinks?.[i])),\n })\n }\n onRemove={() => {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n introLinks.splice(i, 1);\n const hasUnsavedChanges =\n JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== this.introLinksOriginal;\n this.setState({ introLinks, hasUnsavedChanges });\n }}\n enabled={item.enabled}\n lang={this.props.lang}\n toggleActivation={() => this.toggleLinkCard(i)}\n cameraUrl={item.desc}\n theme={this.props.theme}\n />\n );\n }\n\n return (\n <IntroCard\n key={`link${i}`}\n image={item.image}\n title={item.name}\n action={{ link: item.link, text: item.linkName }}\n t={this.props.t}\n color={item.color}\n edit={this.state.edit}\n onEdit={() =>\n this.setState({\n editLink: true,\n editLinkIndex: i,\n link: JSON.parse(JSON.stringify(this.state.introLinks?.[i])),\n })\n }\n onRemove={() => {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n introLinks.splice(i, 1);\n const hasUnsavedChanges =\n JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== this.introLinksOriginal;\n this.setState({ introLinks, hasUnsavedChanges });\n }}\n enabled={item.enabled}\n lang={this.props.lang}\n toggleActivation={() => this.toggleLinkCard(i)}\n theme={this.props.theme}\n >\n {item.desc || ''}\n </IntroCard>\n );\n });\n }\n\n editLinkCard(): JSX.Element | null {\n if (this.state.editLink) {\n return (\n <EditIntroLinkDialog\n link={this.state.link}\n socket={this.props.socket}\n isNew={this.state.editLinkIndex === -1}\n t={this.props.t}\n lang={this.props.lang}\n theme={this.props.theme}\n onClose={link => {\n if (link) {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n if (this.state.editLinkIndex === -1) {\n link.enabled = true;\n introLinks.push(link);\n } else {\n link.enabled = introLinks[this.state.editLinkIndex].enabled;\n introLinks[this.state.editLinkIndex] = link;\n }\n const hasUnsavedChanges =\n JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== this.introLinksOriginal;\n\n this.setState({\n introLinks,\n editLink: false,\n hasUnsavedChanges,\n link: null,\n });\n } else {\n this.setState({ editLink: false });\n }\n }}\n />\n );\n }\n\n return null;\n }\n\n getButtons(): JSX.Element[] {\n const buttons = [];\n\n if (this.state.edit) {\n buttons.push(\n <Fab\n key=\"add\"\n color=\"primary\"\n size=\"small\"\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.addButton)}\n onClick={() =>\n this.setState({\n editLink: true,\n editLinkIndex: -1,\n link: {} as ItemCamera | ItemLink,\n })\n }\n >\n <AddIcon />\n </Fab>,\n );\n\n buttons.push(\n <Fab\n key=\"save\"\n size=\"small\"\n color=\"primary\"\n disabled={!this.state.hasUnsavedChanges}\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.saveButton)}\n onClick={() => this.saveCards()}\n >\n <CheckIcon />\n </Fab>,\n );\n\n buttons.push(\n <Fab\n key=\"close\"\n size=\"small\"\n color=\"primary\"\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.closeButton)}\n onClick={() => this.deactivateEditMode()}\n >\n <CloseIcon />\n </Fab>,\n );\n } else {\n buttons.push(\n <Fab\n color=\"primary\"\n size=\"small\"\n key=\"edit\"\n style={styles.button}\n onClick={() => this.activateEditMode()}\n >\n <CreateIcon />\n </Fab>,\n );\n }\n\n return buttons;\n }\n\n async saveCards(): Promise<void> {\n const systemConfig = await this.props.socket.getSystemConfig(true);\n let changed = false;\n if (JSON.stringify(systemConfig.common.intro) !== JSON.stringify(this.state.deactivated)) {\n systemConfig.common.intro = this.state.deactivated;\n changed = true;\n }\n if (!changed && JSON.stringify(systemConfig.native.introLinks) !== JSON.stringify(this.state.introLinks)) {\n changed = true;\n systemConfig.native.introLinks = this.state.introLinks;\n }\n if (changed) {\n void this.props.socket\n .setSystemConfig(systemConfig)\n .then(() => this.props.showAlert('Updated', 'success'))\n .catch((error: any) => {\n console.log(error);\n this.props.showAlert(error, 'error');\n })\n .then(() => this.setState({ edit: false }));\n } else {\n this.setState({ edit: false });\n }\n }\n\n async getHostData(hostId: string, isAlive?: boolean): Promise<{ id: string; data: HostData }> {\n let alive;\n if (isAlive !== undefined) {\n alive = { val: isAlive };\n } else {\n try {\n alive = await this.props.socket.getState(`${hostId}.alive`);\n } catch (e) {\n console.error(`Cannot get state ${hostId}.alive: ${e}`);\n alive = { val: false };\n }\n }\n\n let data: HostData = { alive: false };\n if (alive?.val) {\n try {\n data = await this.props.socket.getHostInfo(hostId, false, 10000);\n if (data && typeof data === 'object' && data.alive !== false) {\n data.alive = true;\n }\n } catch (e) {\n console.error(`Cannot get host info for ${hostId}: ${e}`);\n data = { alive: false };\n }\n } else {\n data = { alive: false };\n }\n\n const states = await this.props.socket.getForeignStates(`${hostId}.versions.*`);\n\n Object.keys(states).forEach(id => (data[`_${id.split('.').pop()}`] = states[id].val));\n\n return { id: hostId, data };\n }\n\n async getHostsData(\n hosts: CompactHost[],\n ): Promise<{ hostsData: Record<string, HostData>; alive: Record<string, boolean> }> {\n const promises = hosts.map(obj => this.getHostData(obj._id));\n\n const results = await Promise.all(promises);\n const hostsData: Record<string, HostData> = {};\n const alive: Record<string, boolean> = {};\n results.forEach(res => {\n hostsData[res.id] = Intro.preprocessHostData(res.data);\n alive[res.id] = res.data.alive;\n });\n return { hostsData, alive };\n }\n\n static applyReverseProxy(\n webReverseProxyPath: ReverseProxyItem,\n instances: Record<string, ioBroker.InstanceObject>,\n instance: IntroInstanceItem,\n ): void {\n webReverseProxyPath?.paths.forEach(item => {\n if (item.instance === instance.id) {\n instance.link = item.path;\n } else if (item.instance.startsWith('web.')) {\n // if this is a web instance, check if it is the same as the current instance\n const _obj = instances[`system.adapter.${item.instance}`];\n if (_obj?.native?.port && instance.link.includes(`:${_obj.native.port}`)) {\n // replace\n const regExp = new RegExp(`^.*:${_obj.native.port}/`);\n if (instance.link) {\n instance.link = instance.link.replace(regExp, item.path);\n }\n console.log(instance.link);\n }\n }\n });\n }\n\n addLinks(\n linkItem: LinkItem,\n common: ioBroker.InstanceCommon,\n instanceId: number,\n instances: Record<string, ioBroker.InstanceObject>,\n hosts: Record<string, ioBroker.HostObject>,\n introInstances: IntroInstanceItem[],\n ): void {\n const instance: IntroInstanceItem = {\n id: linkItem.id,\n name: linkItem.name,\n description: linkItem.description,\n color: linkItem.color,\n image: linkItem.icon,\n info: '',\n };\n\n const _urls: {\n url: string;\n port: number;\n instance?: string;\n }[] = replaceLink(linkItem.link, common.name, instanceId, {\n instances,\n hostname: this.props.hostname,\n adminInstance: this.props.adminInstance,\n hosts,\n });\n\n let webReverseProxyPath: ReverseProxyItem | null = null;\n if (this.state.reverseProxy?.length) {\n webReverseProxyPath = this.state.reverseProxy.find(item => item.globalPath === this.currentProxyPath);\n }\n if (_urls.length === 1) {\n instance.link = _urls[0].url;\n instance.port = _urls[0].port;\n\n Intro.applyReverseProxy(webReverseProxyPath, instances, instance);\n\n // if a link already exists => ignore\n const lll = introInstances.find(item => item.link === instance.link);\n if (!lll) {\n introInstances.push(instance);\n } else {\n console.log(`Double links: \"${instance.id}\" and \"${lll.id}\"`);\n }\n } else if (_urls.length > 1) {\n _urls.forEach(url => {\n const lll = introInstances.find(item => item.link === url.url);\n\n if (!lll) {\n const item = { ...instance, link: url.url, port: url.port };\n Intro.applyReverseProxy(webReverseProxyPath, instances, item);\n introInstances.push(item);\n } else {\n console.log(`Double links: \"${instance.id}\" and \"${lll.id}\"`);\n }\n });\n }\n }\n\n static getText(text: ioBroker.StringOrTranslated, lang: ioBroker.Languages): string {\n if (!text) {\n return '';\n }\n if (typeof text === 'object') {\n return text[lang] || text.en || '';\n }\n return text || '';\n }\n\n static normalizeLinks(\n instance: ioBroker.InstanceObject,\n language: ioBroker.Languages,\n filterDuplicates?: boolean,\n ): LinkItem[] | null {\n if (\n !instance.common.localLinks &&\n !instance.common.localLink &&\n !instance.common.welcomeScreen &&\n !instance.common.welcomeScreenPro\n ) {\n return null;\n }\n const defaultLink: LinkItem = {\n id: instance._id.replace('system.adapter.', ''),\n link: '',\n name: Intro.getText(instance.common.titleLang || instance.common.title || instance.common.name, language),\n // @ts-expect-error order in common is deprecated, but could happen\n order: instance.common.order || 1000,\n intro: true,\n description: Intro.getText(instance.common.desc, language),\n icon: instance.common.icon ? `adapter/${instance.common.name}/${instance.common.icon}` : 'img/no-image.png',\n };\n let result: LinkItem[] = [];\n if (instance.common.localLink) {\n if (typeof instance.common.localLink === 'string') {\n result.push({\n ...defaultLink,\n link: instance.common.localLink,\n });\n } else {\n // localLink is an object\n /*\n {\n link: string;\n color: string;\n order: number;\n icon: string;\n }\n */\n const compatibilityStructure: OldLinkStructure = instance.common.localLink as OldLinkStructure;\n if (compatibilityStructure.link) {\n const item: LinkItem = {\n ...defaultLink,\n link: compatibilityStructure.link,\n };\n if (compatibilityStructure.color) {\n item.color = compatibilityStructure.color;\n }\n if (\n compatibilityStructure.order !== undefined &&\n typeof compatibilityStructure.order === 'number'\n ) {\n item.order = compatibilityStructure.order;\n }\n if (compatibilityStructure.icon && compatibilityStructure.img) {\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\n }\n\n result.push(item);\n } else {\n console.warn(`Unknown localLink structure: ${JSON.stringify(instance.common.localLink)}`);\n }\n }\n }\n\n if (instance.common.localLinks && typeof instance.common.localLinks === 'object') {\n Object.keys(instance.common.localLinks).forEach((linkName: string) => {\n const linkItem: unknown = instance.common.localLinks[linkName];\n if (typeof linkItem === 'string') {\n result.push({\n ...defaultLink,\n link: linkItem,\n });\n } else {\n const compatibilityStructure: OldLinkStructure = linkItem as OldLinkStructure;\n\n if (compatibilityStructure.link) {\n const item: LinkItem = {\n ...defaultLink,\n id:\n instance._id.replace('system.adapter.', '') +\n (linkName === '_default' ? '' : ` ${linkName}`),\n link: compatibilityStructure.link,\n name: defaultLink.name + (linkName === '_default' ? '' : ` ${linkName}`),\n };\n if (compatibilityStructure.color) {\n item.color = compatibilityStructure.color;\n }\n if (compatibilityStructure.order !== undefined) {\n item.order = parseInt(compatibilityStructure.order as string, 10) || 1000;\n }\n if (compatibilityStructure.icon && compatibilityStructure.img) {\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\n }\n if (compatibilityStructure.description) {\n item.description = Intro.getText(compatibilityStructure.description, language);\n }\n if (compatibilityStructure.pro !== undefined) {\n if (typeof compatibilityStructure.pro === 'string') {\n item.pro = compatibilityStructure.pro;\n } else {\n item.pro = `${instance.common.name}/index.html`;\n }\n }\n if (compatibilityStructure.cloud !== undefined) {\n item.cloud = compatibilityStructure.cloud;\n }\n if (compatibilityStructure.intro !== undefined) {\n item.intro = compatibilityStructure.intro === true;\n }\n\n if (compatibilityStructure.name) {\n item.name = Intro.getText(compatibilityStructure.name, language);\n }\n if (linkName === '_default') {\n item.default = true;\n }\n\n result.push(item);\n } else {\n console.warn(`Unknown localLinks structure: ${JSON.stringify(linkItem)}`);\n }\n }\n });\n }\n\n if (instance.common.welcomeScreen && typeof instance.common.welcomeScreen === 'object') {\n const compatibilityStructureArr: OldLinkStructure[] = Array.isArray(instance.common.welcomeScreen)\n ? (instance.common.welcomeScreen as OldLinkStructure[])\n : [instance.common.welcomeScreen as OldLinkStructure];\n\n compatibilityStructureArr.forEach(compatibilityStructure => {\n if (compatibilityStructure.link) {\n const item: LinkItem = {\n ...defaultLink,\n id: `${instance._id.replace('system.adapter.', '')} cloud`,\n link: `%web_protocol%://%web_bind%:%web_port%/${compatibilityStructure.link}`,\n cloud: compatibilityStructure.link,\n };\n if (compatibilityStructure.color) {\n item.color = compatibilityStructure.color;\n }\n if (\n compatibilityStructure.order !== undefined &&\n typeof compatibilityStructure.order === 'number'\n ) {\n item.order = compatibilityStructure.order;\n }\n if (compatibilityStructure.icon && compatibilityStructure.img) {\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\n }\n\n if (compatibilityStructure.localLinks) {\n const link: unknown = instance.common.localLinks[compatibilityStructure.localLinks];\n if (link && typeof link === 'string') {\n item.link = link;\n } else if (link && typeof link === 'object' && (link as any).link) {\n item.link = (link as any).link;\n }\n }\n\n if (compatibilityStructure.name) {\n item.name = Intro.getText(compatibilityStructure.name, language);\n }\n\n result.push(item);\n }\n });\n\n if (instance.common.welcomeScreenPro && typeof instance.common.welcomeScreenPro === 'object') {\n const _compatibilityStructureArr: OldLinkStructure[] = Array.isArray(instance.common.welcomeScreenPro)\n ? (instance.common.welcomeScreenPro as OldLinkStructure[])\n : [instance.common.welcomeScreenPro as OldLinkStructure];\n\n _compatibilityStructureArr.forEach(compatibilityStructure => {\n if (compatibilityStructure.link) {\n const item: LinkItem = {\n ...defaultLink,\n id: `${instance._id.replace('system.adapter.', '')} pro`,\n link: `%web_protocol%://%web_bind%:%web_port%/${compatibilityStructure.link}`,\n pro: compatibilityStructure.link,\n };\n if (compatibilityStructure.color) {\n item.color = compatibilityStructure.color;\n }\n if (\n compatibilityStructure.order !== undefined &&\n typeof compatibilityStructure.order === 'number'\n ) {\n item.order = compatibilityStructure.order;\n }\n if (compatibilityStructure.icon && compatibilityStructure.img) {\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\n }\n\n if (compatibilityStructure.localLinks) {\n const link: unknown = instance.common.localLinks[compatibilityStructure.localLinks];\n if (link && typeof link === 'string') {\n item.link = link;\n } else if (link && typeof link === 'object' && (link as any).link) {\n item.link = (link as any).link;\n }\n }\n\n if (compatibilityStructure.name) {\n item.name = Intro.getText(compatibilityStructure.name, language);\n }\n\n result.push(item);\n }\n });\n }\n }\n\n result.forEach(item => {\n if (\n !item.icon.startsWith('adapter/') &&\n !item.icon.startsWith('data:image/') &&\n !item.icon.startsWith('http://') &&\n !item.icon.startsWith('https://') &&\n item.icon !== 'img/no-image.png'\n ) {\n // normalize icon\n item.icon = `adapter/${instance.common.name}/${item.icon}`;\n }\n });\n\n if (filterDuplicates) {\n // filter all links with the same \"link\"\n const links: Record<string, LinkItem> = {};\n result.forEach(item => {\n if (!links[item.link]) {\n links[item.link] = item;\n } else {\n // merge\n if (item.color) {\n links[item.link].color = item.color;\n }\n if (item.icon) {\n links[item.link].icon = item.icon;\n }\n if (item.cloud) {\n links[item.link].cloud = item.cloud;\n }\n if (item.pro) {\n links[item.link].pro = item.pro;\n }\n if (item.intro !== undefined) {\n links[item.link].intro = item.intro;\n }\n if (item.name && typeof item.name === 'object') {\n links[item.link].name = item.name;\n }\n if (item.order !== undefined) {\n links[item.link].order = item.order;\n }\n if (item.default) {\n links[item.link].default = item.default;\n }\n }\n });\n result = Object.values(links);\n }\n\n result.sort((a: LinkItem, b: LinkItem) => {\n if (a.default === undefined && b.default === undefined) {\n if (a.order === undefined && b.order === undefined) {\n return 0;\n }\n if (a.order === undefined) {\n return -1;\n }\n if (b.order === undefined) {\n return 1;\n }\n return a.order - b.order;\n }\n if (a.default === undefined) {\n return -1;\n }\n if (b.default === undefined) {\n return 1;\n }\n\n if (a.order === undefined && b.order === undefined) {\n return 0;\n }\n if (a.order === undefined) {\n return -1;\n }\n if (b.order === undefined) {\n return 1;\n }\n return a.order - b.order;\n });\n\n return result;\n }\n\n async getInstances(\n update: boolean | undefined,\n hosts: CompactHost[] | null,\n systemConfig: ioBroker.SystemConfigObject,\n ): Promise<{ instances: IntroInstanceItem[]; deactivated: string[] }> {\n hosts = hosts || this.state.hosts;\n\n const oHosts: Record<string, ioBroker.HostObject> = {};\n hosts.forEach(obj => (oHosts[obj._id] = obj as ioBroker.HostObject));\n\n try {\n const objects = await this.props.socket.getAdapterInstances('', update);\n let deactivated: string[] = systemConfig.common.intro || [];\n if (!Array.isArray(deactivated)) {\n deactivated = Object.keys(deactivated);\n deactivated.sort();\n }\n const introInstances: IntroInstanceItem[] = [];\n const instances: Record<string, ioBroker.InstanceObject> = {};\n // Array to the mapped object\n objects.forEach(obj => (instances[obj._id] = obj));\n\n objects.forEach(obj => {\n if (!obj) {\n return;\n }\n const common = obj.common || null;\n const objId = obj._id.split('.');\n const instanceId: number = parseInt(objId.pop(), 10);\n let name: string;\n if (common?.name && typeof common.name === 'object') {\n const commonName: ioBroker.Translated = common?.name;\n name = commonName[this.props.lang] || commonName.en;\n } else {\n name = common?.name || '';\n }\n\n if (name === 'admin' && common.localLink === (this.props.hostname || '')) {\n return;\n }\n if (name === 'web') {\n return;\n }\n\n if (name && name !== 'vis-web-admin' && name.match(/^vis-/) && name !== 'vis-2') {\n return;\n }\n if (name?.match(/^icons-/)) {\n return;\n }\n if (common && (common.enabled || common.onlyWWW)) {\n const links = Intro.normalizeLinks(obj, this.props.lang, true);\n\n if (links) {\n links.forEach(link =>\n this.addLinks(link, common, instanceId, instances, oHosts, introInstances),\n );\n }\n }\n });\n\n introInstances.forEach(instance => {\n if (instance.link) {\n instance.linkName = instance.link\n .replace('https://', '')\n .replace('http://', '')\n .replace(/^[^_]+:/, '');\n }\n });\n\n introInstances.sort((a, b) => {\n if (a.order !== undefined || b.order !== undefined) {\n a.order = a.order === undefined ? 1000 : a.order;\n b.order = b.order === undefined ? 1000 : b.order;\n if (a.order < b.order) {\n return -1;\n }\n if (a.order > b.order) {\n return 1;\n }\n }\n\n if (a.id > b.id) {\n return 1;\n }\n if (a.id < b.id) {\n return -1;\n }\n return 0;\n });\n\n hosts?.forEach(obj => {\n const common = obj?.common;\n let name: ioBroker.StringOrTranslated = common?.name;\n if (typeof name === 'object') {\n if (name) {\n name = (name as ioBroker.Translated)[this.props.lang] || (name as ioBroker.Translated).en;\n }\n }\n\n if (common) {\n const instance: IntroInstanceItem = {\n id: obj._id,\n name: name || '',\n color: '',\n image: common.icon || 'img/no-image.png',\n info: this.t('Info'),\n linkName: '',\n };\n\n introInstances.push(instance);\n }\n });\n\n const _deactivated: string[] = [];\n deactivated.forEach(id => {\n if (introInstances.find(instance => id === `${instance.id}_${instance.linkName}`)) {\n _deactivated.push(id);\n }\n });\n deactivated = _deactivated;\n\n return {\n instances: introInstances,\n deactivated,\n };\n } catch (error) {\n console.log(error);\n return { instances: [], deactivated: [] };\n }\n }\n\n getHostDescription(id: string): JSX.Element {\n const hostData = this.state.hostsData ? this.state.hostsData[id] : null;\n\n if (hostData && hostData.alive === false) {\n return <div style={styles.hostOffline}>{this.props.t('Offline')}</div>;\n }\n\n let nodeUpdate: string | JSX.Element = '';\n let npmUpdate: string | JSX.Element = '';\n if (hostData) {\n try {\n if (\n hostData._nodeNewest &&\n hostData['Node.js'] &&\n semver.gt(hostData._nodeNewest, hostData['Node.js'].replace(/^v/, ''))\n ) {\n nodeUpdate = hostData._nodeNewest;\n }\n } catch {\n // ignore\n }\n try {\n if (\n hostData._nodeNewest !== hostData._nodeNewestNext &&\n hostData._nodeNewestNext &&\n hostData['Node.js'] &&\n hostData._nodeNewest &&\n semver.gt(hostData._nodeNewestNext, hostData['Node.js'].replace(/^v/, '')) &&\n semver.gt(hostData._nodeNewestNext, hostData._nodeNewest)\n ) {\n nodeUpdate += (nodeUpdate ? ' / ' : '') + hostData._nodeNewestNext;\n }\n } catch {\n // ignore\n }\n\n if (nodeUpdate) {\n const updateSupported = this.state.nodeUpdateSupported && hostData.Platform === 'linux';\n\n nodeUpdate = (\n <Tooltip\n title={this.props.t('Some updates available')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <span style={{ ...styles.nodeUpdate, display: 'inline-flex' }}>\n ({nodeUpdate})\n {updateSupported ? (\n <RefreshIcon\n style={styles.updateIcon}\n onClick={() =>\n this.setState({\n nodeUpdateDialog: { hostId: id, version: hostData._nodeNewestNext },\n })\n }\n />\n ) : null}\n </span>\n </Tooltip>\n );\n }\n\n try {\n if (hostData._npmNewest && hostData.NPM && semver.gt(hostData._npmNewest, hostData.NPM)) {\n npmUpdate = hostData._npmNewest;\n }\n } catch {\n // ignore\n }\n try {\n if (\n hostData._npmNewest !== hostData._npmNewestNext &&\n hostData._npmNewestNext &&\n hostData.NPM &&\n hostData._npmNewest &&\n semver.gt(hostData._npmNewestNext, hostData.NPM) &&\n semver.gt(hostData._npmNewestNext, hostData._npmNewest)\n ) {\n npmUpdate += (npmUpdate ? ' / ' : '') + hostData._npmNewestNext;\n }\n } catch {\n // ignore\n }\n if (npmUpdate) {\n npmUpdate = (\n <Tooltip\n title={this.props.t('Some updates available')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <span style={styles.nodeUpdate}>({npmUpdate})</span>\n </Tooltip>\n );\n }\n }\n\n return hostData && typeof hostData === 'object' ? (\n <ul style={{ textTransform: 'none' }}>\n <li>\n <span>\n <span style={styles.bold}>{this.t('Platform')}: </span>\n {hostData.Platform || '--'}\n </span>\n </li>\n <li>\n <span>\n <span style={styles.bold}>{this.t('RAM')}: </span>\n {formatInfo.RAM(hostData.RAM)}\n </span>\n </li>\n <li>\n <span>\n <span style={styles.bold}>{this.t('Node.js')}: </span>\n <span style={nodeUpdate ? styles.updateExists : styles.updateNo}>\n {hostData['Node.js'] || '--'}\n </span>\n {nodeUpdate}\n </span>\n </li>\n <li>\n <span>\n <span style={styles.bold}>{this.t('NPM')}: </span>\n <span className={npmUpdate ? styles.updateExists : styles.updateNo}>\n {hostData.NPM || '--'}\n </span>\n {npmUpdate}\n </span>\n </li>\n </ul>\n ) : (\n <ul>\n <Skeleton />\n <Skeleton />\n <Skeleton />\n <Skeleton />\n </ul>\n );\n }\n\n getHostDescriptionAll(id: string): { el: JSX.Element; text: string } {\n const hostData = this.state.hostsData ? this.state.hostsData[id] : null;\n\n return {\n el: (\n <ul style={{ textTransform: 'none' }}>\n {hostData &&\n typeof hostData === 'object' &&\n Object.keys(hostData)\n .filter(\n _id => !_id.startsWith('_') && hostData[_id] !== null && hostData[_id] !== undefined,\n )\n .map(value => (\n <li key={value}>\n {hostData && typeof hostData === 'object' ? (\n <span>\n <span style={styles.bold}>{this.t(value)}: </span>\n {formatInfo[value]\n ? formatInfo[value](hostData[value] as number, this.t)\n : (typeof hostData[value] === 'object'\n ? JSON.stringify(hostData[value])\n : (hostData[value] as any).toString()) || '--'}\n </span>\n ) : (\n <Skeleton />\n )}\n </li>\n ))}\n </ul>\n ),\n\n text:\n hostData && typeof hostData === 'object'\n ? Object.keys(hostData).reduce(\n (acom: string, item: string) =>\n `${acom}${this.t(item)}:${formatInfo[item] ? formatInfo[item](hostData[item] as number, this.t) : (typeof hostData[item] === 'object' ? JSON.stringify(hostData[item]) : hostData[item] as string) || '--'}\\n`,\n )\n : '',\n };\n }\n\n getDataDelayed = (_events?: InstanceEvent[]): void => {\n if (this.getDataTimeout) {\n clearTimeout(this.getDataTimeout);\n }\n this.getDataTimeout = setTimeout(() => {\n this.getDataTimeout = undefined;\n void this.getData(true).catch(e => console.error(`Cannot get data: ${e}`));\n }, 300);\n };\n\n async getData(update?: boolean): Promise<void> {\n try {\n const systemConfig: ioBroker.SystemConfigObject = await this.props.socket.getSystemConfig(update);\n const hosts: CompactHost[] = await this.props.socket.getCompactHosts(update);\n const data: { instances: IntroInstanceItem[]; deactivated: string[] } = await this.getInstances(\n update,\n hosts,\n systemConfig,\n );\n this.setState({\n instances: data.instances,\n hosts,\n deactivated: data.deactivated,\n introLinks:\n systemConfig && systemConfig.native && systemConfig.native.introLinks\n ? systemConfig.native.introLinks\n : [],\n });\n // hosts data could last a long time, so show some results to user now and then get the info about hosts\n const newState: Partial<IntroState> = await this.getHostsData(hosts);\n await new Promise<void>(resolve => {\n this.setState(newState as IntroState, () => resolve());\n });\n } catch (error: any) {\n window.alert(`Cannot get data: ${error}`);\n }\n }\n\n /**\n * Render toast if content has been copied\n */\n renderCopiedToast(): JSX.Element {\n return (\n <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={this.state.openSnackBar}\n autoHideDuration={3_000}\n onClose={() => this.setState({ openSnackBar: false })}\n message={this.t('copied')}\n />\n );\n }\n\n render(): JSX.Element {\n if (!this.state.instances) {\n return <LinearProgress />;\n }\n\n return (\n <TabContainer\n elevation={0}\n overflow=\"visible\"\n >\n {this.renderCopiedToast()}\n {this.state.nodeUpdateDialog ? (\n <NodeUpdateDialog\n onClose={() => this.setState({ nodeUpdateDialog: null })}\n socket={this.props.socket}\n {...this.state.nodeUpdateDialog}\n />\n ) : null}\n <TabContent style={styles.container}>\n {/* This fragment is required here\n to split directives of Grid2 in TabContent and Grid2 directives in Intro */}\n <>\n <Grid2\n container\n spacing={2}\n >\n {this.getInstancesCards()}\n {this.getLinkCards()}\n </Grid2>\n </>\n {this.getButtons()}\n {this.editLinkCard()}\n </TabContent>\n </TabContainer>\n );\n }\n\n /**\n * Preprocess host data to harmonize information\n *\n * @param hostData Host data from controller\n */\n static preprocessHostData(hostData: HostData): HostData {\n if (hostData.dockerInformation?.isDocker) {\n let dockerString = hostData.dockerInformation.isOfficial ? 'official image' : 'unofficial image';\n\n if (hostData.dockerInformation.isOfficial) {\n dockerString += ` - ${hostData.dockerInformation.officialVersion}`;\n }\n\n hostData.Platform = `${hostData.Platform} (${dockerString})`;\n }\n\n delete hostData.dockerInformation;\n return hostData;\n }\n}\n\nexport default Intro;\n","function _classPrivateFieldBase(e, t) {\n if (!{}.hasOwnProperty.call(e, t)) throw new TypeError(\"attempted to use private field on non-instance\");\n return e;\n}\nexport { _classPrivateFieldBase as default };","var id = 0;\nfunction _classPrivateFieldKey(e) {\n return \"__private_\" + id++ + \"_\" + e;\n}\nexport { _classPrivateFieldKey as default };"],"names":["boxShadow","boxShadowHover","styles","root","theme","padding","breakpoints","up","flex","card","display","minHeight","position","overflow","maxHeight","overflowY","cardInfo","flexDirection","cardInfoHead","top","background","palette","default","width","justifyContent","borderBottom","edit","opacity","userSelect","pointerEvents","media","backgroundColor","mode","maxWidth","img","height","contentContainer","content","flexGrow","action","expand","right","bottom","collapse","close","save","enabled","color","blue","disabled","grey","editButton","deleteButton","red","contentGrid","colorOrange","tooltip","IntroCard","Component","constructor","props","super","this","state","expanded","getDerivedStateFromProps","handleExpandClick","setState","renderContent","children","openDialog","renderDialogs","render","_this$props$action","_this$props$action2","editClass","undefined","buttonTitle","text","t","lang","en","_jsx","Grid2","size","xs","sm","md","lg","sx","Utils","getStyle","style","Link","href","link","underline","target","rel","_jsxs","Card","onClick","e","stopPropagation","showInfo","offline","Button","_objectSpread","variant","Box","component","CardMedia","image","paddingBottom","paddingLeft","warning","Tooltip","title","slotProps","popper","WarningIcon","alignSelf","fontSize","CardContent","container","direction","wrap","Typography","gutterBottom","Divider","CardActions","AdminUtils","getText","Collapse","in","timeout","unmountOnExit","IconButton","getHostDescriptionAll","copyToClipboard","openSnackBarFunc","SaveIcon","CloseIcon","el","toggleActivation","CheckIcon","onEdit","EditIcon","onRemove","DeleteIcon","rootGrid","closeButton","paper","typography","paddingRight","objectFit","CameraIntroLinkDialog","cameraUpdateTimer","cameraRef","createRef","componentDidMount","camera","setInterval","updateCamera","Math","max","parseInt","interval","componentWillUnmount","clearInterval","current","url","cameraUrl","addTs","includes","concat","Date","now","src","parts","split","adapter","shift","instance","socket","sendTo","name","pop","then","result","data","Dialog","onClose","open","fullWidth","fullScreen","DialogTitle","DialogContent","dividers","alt","ref","DialogActions","autoFocus","startIcon","cameraImg","imgContainer","hidden","imgSkeleton","transform","Object","assign","error","dialog","loaded","catch","window","alert","CameraIntroDialog","handleImageLoad","handleImageError","alignItems","onLoad","onError","Skeleton","animation","ErrorIcon","startsWith","formControl","marginTop","editItem","editItemSlider","labelSlider","editColor","dropZone","dropZoneEmpty","objectFir","uploadDiv","uploadDivDragging","uploadCenterDiv","margin","border","borderRadius","uploadCenterIcon","paddingTop","uploadCenterText","uploadCenterTextAndIcon","textAlign","left","EditIntroLinkDialog","linkName","desc","cameraList","getCamerasInstances","getAdapterInstances","list","promises","forEach","obj","_id","replace","common","push","getState","val","cam","id","Promise","all","getLinkNameFromLink","m","trim","match","isNew","FormControl","InputLabel","Select","labelId","value","onChange","MenuItem","map","TextField","label","oldLinkName","input","endAdornment","InputAdornment","FormControlLabel","control","Checkbox","checked","Slider","getAriaValueText","step","min","valueLabelDisplay","type","UploadImage","crop","maxSize","icon","removeIconFunc","base64","marginLeft","IntroCardCamera","AddIcon","NodeUpdateDialog","React","inProgress","success","finished","I18n","CircularProgress","RefreshIcon","updateNodeJsVersion","res","upgradeOsPackages","hostId","button","saveButton","main","dark","addButton","secondary","bold","fontWeight","hostOffline","updateExists","marginRight","updateNo","nodeUpdate","instanceNumber","updateIcon","cursor","formatInfo","Uptime","formatSeconds","RAM","formatRam","Speed","formatSpeed","formatBytes","_THRESHOLD_TIME_DIFF_MS","_classPrivateFieldLooseKey","_ONE_MINUTE_MS","Intro","defineProperty","writable","currentProxyPath","location","pathname","introLinksOriginal","deactivatedOriginal","getDataTimeout","updateHostsAlive","async","alive","JSON","parse","stringify","hostsId","events","find","event","getDataDelayed","length","hostsData","getHostData","preprocessHostData","checkBackendTime","updateHosts","results","_events","clearTimeout","setTimeout","getData","console","instances","deactivated","introLinks","editLink","editLinkIndex","openSnackBar","hasUnsavedChanges","reverseProxy","hosts","hostTimeDiffMap","Map","nodeUpdateSupported","nodeUpdateDialog","timeDiffMap","hostData","entries","currDate","diff","abs","time","getTime","set","_obj$native","instancesWorker","registerHandler","hostsWorker","registerAliveHandler","checkFeatureSupported","getObject","adminInstance","native","unregisterHandler","unregisterAliveHandler","activateEditMode","_systemConfig$native","systemConfig","getSystemConfig","getInstances","deactivateEditMode","toggleCard","pos","indexOf","splice","sort","getInstancesCards","_this$state$instances","_this$state$deactivat","_this$state$hostTimeD","linkText","isShowInstance","isFinite","_this$state$instances2","inst","timeDiff","get","_Fragment","info","_classPrivateFieldLooseBase","round","toString","description","getHostDescription","toggleLinkCard","i","getLinkCards","_this$state$introLink","item","_this$state$introLink2","_this$state$introLink3","editLinkCard","getButtons","buttons","Fab","UtilsCommon","saveCards","CreateIcon","changed","intro","setSystemConfig","showAlert","log","isAlive","_alive","getHostInfo","states","getForeignStates","keys","getHostsData","applyReverseProxy","webReverseProxyPath","paths","path","_obj$native2","_obj","port","regExp","RegExp","addLinks","linkItem","instanceId","introInstances","_this$state$reversePr","_urls","replaceLink","hostname","globalPath","lll","normalizeLinks","language","filterDuplicates","localLinks","localLink","welcomeScreen","welcomeScreenPro","defaultLink","titleLang","order","compatibilityStructure","warn","pro","cloud","Array","isArray","links","values","a","b","update","oHosts","_hosts","objects","_name","objId","commonName","onlyWWW","_deactivated","npmUpdate","_nodeNewest","semver","_unused","_nodeNewestNext","_unused2","updateSupported","Platform","version","_npmNewest","NPM","_unused3","_npmNewestNext","_unused4","textTransform","className","filter","reduce","acom","getCompactHosts","newState","resolve","renderCopiedToast","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","message","TabContainer","elevation","TabContent","spacing","LinearProgress","_hostData$dockerInfor","dockerInformation","isDocker","dockerString","isOfficial","officialVersion","_classPrivateFieldBase","hasOwnProperty","call","TypeError","_classPrivateFieldKey"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/js/3363.a4c36649.chunk.js","mappings":"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","sources":["components/Intro/IntroCard.tsx","components/Intro/CameraIntroDialog.tsx","components/Intro/IntroCardCamera.tsx","components/Intro/EditIntroLinkDialog.tsx","dialogs/NodeUpdateDialog.tsx","tabs/Intro.tsx","../node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseBase.js","../node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseKey.js"],"sourcesContent":["import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Card,\n CardActions,\n CardContent,\n CardMedia,\n Collapse,\n Divider,\n Grid2,\n IconButton,\n Link,\n Typography,\n Tooltip,\n Box,\n} from '@mui/material';\n\nimport {\n Check as CheckIcon,\n Create as EditIcon,\n Close as CloseIcon,\n Delete as DeleteIcon,\n Warning as WarningIcon,\n} from '@mui/icons-material';\n\nimport { blue, grey, red } from '@mui/material/colors';\n\nimport { Utils, IconCopy as SaveIcon, type IobTheme, type Translate } from '@iobroker/adapter-react-v5';\n\nimport AdminUtils from '../../helpers/AdminUtils';\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\nexport const styles: Record<string, any> = {\n root: (theme: IobTheme) => ({\n padding: '.75rem',\n [theme.breakpoints.up('xl')]: {\n flex: '0 1 20%',\n },\n }),\n card: {\n display: 'flex',\n minHeight: '235px',\n position: 'relative',\n overflow: 'hidden',\n maxHeight: '235p',\n '&:hover': {\n overflowY: 'auto',\n boxShadow: boxShadowHover,\n },\n },\n cardInfo: {\n display: 'flex',\n minHeight: '235px',\n position: 'relative',\n overflow: 'initial',\n maxHeight: '235p',\n flexDirection: 'column',\n '&:hover': {\n // overflowY: 'auto',\n boxShadow: boxShadowHover,\n },\n },\n cardInfoHead: (theme: IobTheme) => ({\n position: 'sticky',\n top: 0,\n background: theme.palette.background.default,\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n borderBottom: '1px solid',\n padding: '5px 5px 0px 5px',\n }),\n edit: {\n opacity: 0.6,\n userSelect: 'none',\n pointerEvents: 'none',\n },\n media: (theme: IobTheme) => ({\n backgroundColor: theme.palette.mode === 'dark' ? '#535353' : '#e2e2e2',\n maxWidth: '30%',\n }),\n img: {\n width: 120,\n height: 'auto',\n padding: '2rem .5rem',\n maxWidth: '100%',\n },\n contentContainer: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n content: {\n height: '170px',\n flexGrow: 1,\n overflowY: 'hidden',\n },\n action: {\n minHeight: '49px',\n padding: '16px 24px',\n },\n expand: {\n position: 'absolute',\n right: '10px',\n bottom: '10px',\n },\n collapse: {\n minHeight: '100%',\n backgroundColor: '#ffffff',\n position: 'absolute',\n width: '100%',\n // '& button': {\n // position: 'absolute',\n // top: '10px',\n // color: '#000000',\n // '&:focus': {\n // color: '#ffffff',\n // backgroundColor: blue[500]\n // }\n // }\n },\n close: {\n right: '10px',\n },\n save: {\n right: '50px',\n },\n enabled: {\n color: '#ffffff',\n backgroundColor: blue[500],\n position: 'absolute',\n top: 8,\n right: 8,\n boxShadow,\n '&:hover': {\n backgroundColor: blue[300],\n },\n '&:focus': {\n backgroundColor: blue[500],\n },\n },\n disabled: {\n color: '#ffffff',\n backgroundColor: grey[500],\n position: 'absolute',\n top: 8,\n right: 8,\n boxShadow,\n '&:hover': {\n backgroundColor: grey[300],\n },\n '&:focus': {\n backgroundColor: grey[500],\n },\n },\n editButton: {\n color: '#ffffff',\n backgroundColor: grey[500],\n position: 'absolute',\n top: 16 + 48, // 48 is the height of button\n right: 8,\n boxShadow,\n '&:hover': {\n backgroundColor: grey[300],\n },\n '&:focus': {\n backgroundColor: grey[500],\n },\n },\n deleteButton: {\n color: '#ffffff',\n backgroundColor: red[500],\n position: 'absolute',\n top: 24 + 48 + 48, // 48 is the height of button\n right: 8,\n boxShadow,\n '&:hover': {\n backgroundColor: red[300],\n },\n '&:focus': {\n backgroundColor: red[500],\n },\n },\n contentGrid: {\n height: '100%',\n },\n colorOrange: {\n color: '#ffcc80',\n },\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nexport interface IntroCardProps {\n disabled?: boolean;\n onEdit?: () => void;\n offline?: boolean;\n t: Translate;\n lang: ioBroker.Languages;\n /** Shows a warning on the card with given text if configured */\n warning?: string;\n edit?: boolean;\n toggleActivation?: () => void;\n enabled: boolean;\n onRemove?: () => void;\n action: {\n text: ioBroker.StringOrTranslated;\n link: string;\n };\n color: string;\n image: string;\n children?: JSX.Element | JSX.Element[] | string | string[] | null | undefined;\n title: string | JSX.Element;\n showInfo?: boolean;\n getHostDescriptionAll?: () => { el: JSX.Element; text: string };\n openSnackBarFunc?: () => void;\n style?: React.CSSProperties;\n theme: IobTheme;\n}\n\nexport interface IntroCardState {\n expanded: boolean;\n}\n\nclass IntroCard<TProps extends IntroCardProps, TState extends IntroCardState> extends Component<TProps, TState> {\n constructor(props: TProps) {\n super(props);\n\n this.state = {\n expanded: false,\n } as TState;\n }\n\n static getDerivedStateFromProps(props: IntroCardProps): Partial<IntroCardState> | null {\n if (props.edit) {\n return { expanded: false };\n }\n return null;\n }\n\n handleExpandClick(): void {\n this.setState({ expanded: !this.state.expanded });\n }\n\n renderContent(): JSX.Element | JSX.Element[] | string | string[] | null | undefined {\n return this.props.children;\n }\n\n // eslint-disable-next-line class-methods-use-this\n openDialog(): void {\n // do nothing\n }\n\n // eslint-disable-next-line class-methods-use-this\n renderDialogs(): JSX.Element | null {\n return null;\n }\n\n render(): JSX.Element {\n const editClass = this.props.edit ? styles.edit : undefined;\n\n let buttonTitle: ioBroker.StringOrTranslated = this.props.action.text || this.props.t('Link');\n if (typeof buttonTitle === 'object') {\n buttonTitle = buttonTitle[this.props.lang] || buttonTitle.en;\n }\n\n return (\n <Grid2\n size={{\n xs: 12,\n sm: 6,\n md: 4,\n lg: 3,\n }}\n sx={Utils.getStyle(this.props.theme, styles.root, this.props.style)}\n >\n <Link\n href={\n !this.props.edit && this.props.action && this.props.action.link ? this.props.action.link : null\n }\n underline=\"none\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Card\n sx={styles.card}\n onClick={e => {\n e.stopPropagation();\n this.openDialog();\n }}\n >\n {this.props.showInfo && !this.props.offline && (\n <Button\n style={{ ...styles.expand, ...editClass }}\n variant=\"contained\"\n size=\"small\"\n disabled={this.props.disabled}\n onClick={() => this.handleExpandClick()}\n color=\"primary\"\n >\n {this.props.t('Info')}\n </Button>\n )}\n <Box\n component=\"div\"\n sx={Utils.getStyle(\n this.props.theme,\n styles.media,\n editClass,\n this.props.color && { backgroundColor: this.props.color },\n { display: 'flex', flexDirection: 'column' },\n )}\n >\n <CardMedia\n style={styles.img}\n component=\"img\"\n image={this.props.image}\n ></CardMedia>\n <div\n style={{\n flex: 1,\n display: 'flex',\n paddingBottom: '5px',\n paddingLeft: '5px',\n }}\n >\n {this.props.warning ? (\n <Tooltip\n title={this.props.warning}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <WarningIcon\n style={{\n alignSelf: 'end',\n fontSize: 36,\n }}\n />\n </Tooltip>\n ) : null}\n </div>\n </Box>\n <div style={{ ...styles.contentContainer, ...editClass }}>\n <CardContent style={styles.content}>\n <Grid2\n container\n direction=\"column\"\n wrap=\"nowrap\"\n style={styles.contentGrid}\n >\n <Typography\n gutterBottom\n variant=\"h5\"\n component=\"h5\"\n >\n {this.props.title}\n </Typography>\n {this.renderContent()}\n </Grid2>\n </CardContent>\n {this.props.action?.link && <Divider />}\n {this.props.action?.link && (\n <CardActions style={styles.action}>\n <div style={styles.colorOrange}>\n {AdminUtils.getText(buttonTitle, this.props.lang)}\n </div>\n </CardActions>\n )}\n </div>\n {this.props.showInfo && (\n <Collapse\n style={styles.collapse}\n in={this.state.expanded}\n timeout=\"auto\"\n unmountOnExit\n >\n <Card sx={styles.cardInfo}>\n <Box\n component=\"div\"\n sx={styles.cardInfoHead}\n >\n <Typography\n gutterBottom\n variant=\"h5\"\n component=\"h5\"\n >\n {this.props.t('Info')}\n </Typography>\n <div>\n <IconButton\n size=\"small\"\n onClick={() => {\n if (this.props.getHostDescriptionAll) {\n Utils.copyToClipboard(this.props.getHostDescriptionAll().text);\n }\n if (this.props.openSnackBarFunc) {\n this.props.openSnackBarFunc();\n }\n }}\n >\n <SaveIcon />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={() => this.handleExpandClick()}\n >\n <CloseIcon />\n </IconButton>\n </div>\n </Box>\n <CardContent>{this.props.getHostDescriptionAll().el}</CardContent>\n </Card>\n </Collapse>\n )}\n {this.props.edit && this.props.toggleActivation && (\n <IconButton\n size=\"large\"\n sx={this.props.enabled ? styles.enabled : styles.disabled}\n onClick={() => this.props.toggleActivation()}\n >\n <CheckIcon />\n </IconButton>\n )}\n {this.props.edit && this.props.onEdit && (\n <IconButton\n size=\"large\"\n sx={styles.editButton}\n onClick={() => this.props.onEdit()}\n >\n <EditIcon />\n </IconButton>\n )}\n {this.props.edit && this.props.onRemove && (\n <IconButton\n size=\"large\"\n sx={styles.deleteButton}\n onClick={() => this.props.onRemove()}\n >\n <DeleteIcon />\n </IconButton>\n )}\n {this.renderDialogs()}\n </Card>\n </Link>\n </Grid2>\n );\n }\n}\n\nexport default IntroCard;\n","import React, { createRef, Component, type JSX } from 'react';\n\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Typography } from '@mui/material';\n\nimport { Close as CloseIcon } from '@mui/icons-material';\n\nimport type { IobTheme, Translate, AdminConnection } from '@iobroker/adapter-react-v5';\n\nconst styles: Record<string, any> = {\n rootGrid: {\n flexGrow: 1,\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n paper: {\n // minWidth: 600\n },\n typography: {\n paddingRight: 30,\n },\n img: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n },\n};\n\ninterface CameraIntroLinkDialogProps {\n t: Translate;\n camera: string;\n socket: AdminConnection;\n interval?: string;\n onClose: () => void;\n name: string | JSX.Element;\n addTs?: boolean;\n cameraUrl: string;\n}\n\nclass CameraIntroLinkDialog extends Component<CameraIntroLinkDialogProps> {\n cameraUpdateTimer: ReturnType<typeof setInterval>;\n\n cameraRef: React.RefObject<HTMLImageElement>;\n\n constructor(props: CameraIntroLinkDialogProps) {\n super(props);\n\n this.cameraUpdateTimer = null;\n this.cameraRef = createRef();\n }\n\n componentDidMount(): void {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer = setInterval(\n () => this.updateCamera(),\n Math.max(parseInt(this.props.interval, 10), 500),\n );\n this.updateCamera();\n }\n }\n\n componentWillUnmount(): void {\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n }\n\n updateCamera(): void {\n if (this.cameraRef.current) {\n if (this.props.camera === 'custom') {\n let url = this.props.cameraUrl;\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += `&ts=${Date.now()}`;\n } else {\n url += `?ts=${Date.now()}`;\n }\n }\n this.cameraRef.current.src = url;\n } else {\n const parts = this.props.camera.split('.');\n const adapter = parts.shift();\n const instance = parts.shift();\n void this.props.socket\n .sendTo(`${adapter}.${instance}`, 'image', {\n name: parts.pop(),\n width: this.cameraRef.current.width,\n })\n .then(result => {\n if (result && result.data && this.cameraRef.current) {\n this.cameraRef.current.src = `data:image/jpeg;base64,${result.data}`;\n }\n });\n }\n }\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={() => this.props.onClose()}\n open={!0}\n maxWidth=\"xl\"\n fullWidth\n fullScreen\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.props.name}\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 <img\n style={styles.img}\n src=\"\"\n alt=\"camera\"\n ref={this.cameraRef}\n />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n autoFocus\n onClick={e => {\n e.stopPropagation();\n this.props.onClose();\n }}\n color=\"primary\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nexport default CameraIntroLinkDialog;\n","import React, { createRef, type JSX } from 'react';\n\nimport { Grid2, Skeleton } from '@mui/material';\n\nimport { Error as ErrorIcon } from '@mui/icons-material';\n\nimport { type AdminConnection } from '@iobroker/adapter-react-v5';\n\nimport IntroCard, { type IntroCardProps, type IntroCardState } from '@/components/Intro/IntroCard';\nimport CameraIntroDialog from './CameraIntroDialog';\n\nconst styles: Record<string, any> = {\n cameraImg: {\n width: '100%',\n height: '100%',\n maxWidth: 200,\n maxHeight: 200,\n objectFit: 'contain',\n },\n imgContainer: {\n height: '100%',\n },\n hidden: {\n display: 'none',\n },\n imgSkeleton: {\n transform: 'initial',\n },\n};\n\ninterface IntroCardCameraProps extends IntroCardProps {\n camera?: string;\n addTs?: boolean;\n interval?: number;\n cameraUrl?: string;\n socket: AdminConnection;\n}\n\ninterface IntroCardCameraState extends IntroCardState {\n error: boolean;\n dialog: boolean;\n loaded: boolean;\n}\n\nclass IntroCardCamera extends IntroCard<IntroCardCameraProps, IntroCardCameraState> {\n private readonly cameraRef: React.RefObject<HTMLImageElement>;\n\n private cameraUpdateTimer: ReturnType<typeof setTimeout> | null;\n\n private interval: number;\n\n constructor(props: IntroCardCameraProps) {\n super(props);\n\n Object.assign(this.state, {\n error: false,\n dialog: false,\n loaded: false,\n });\n\n this.cameraRef = createRef<HTMLImageElement>();\n this.cameraUpdateTimer = null;\n\n this.interval = props.interval;\n }\n\n updateCamera(): void {\n if (this.cameraRef.current) {\n if (this.props.camera === 'custom') {\n let url = this.props.cameraUrl;\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += `&ts=${Date.now()}`;\n } else {\n url += `?ts=${Date.now()}`;\n }\n }\n this.cameraRef.current.src = url;\n } else {\n const parts = this.props.camera.split('.');\n const adapter = parts.shift();\n const instance = parts.shift();\n this.props.socket\n .sendTo(`${adapter}.${instance}`, 'image', {\n name: parts.pop(),\n width: this.cameraRef.current.width,\n })\n .then((result: { data?: string }) => {\n if (result?.data && this.cameraRef.current) {\n this.cameraRef.current.src = `data:image/jpeg;base64,${result.data}`;\n }\n })\n .catch((e: string) => window.alert(`Cannot send to instance: ${e}`));\n }\n }\n }\n\n componentDidMount(): void {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer = setInterval(\n () => this.updateCamera(),\n Math.max(parseInt(this.props.interval as any as string, 10), 500),\n );\n this.updateCamera();\n }\n }\n\n componentWillUnmount(): void {\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n }\n\n renderDialogs(): JSX.Element | null {\n if (!this.state.dialog) {\n return null;\n }\n return (\n <CameraIntroDialog\n socket={this.props.socket}\n camera={this.props.camera}\n name={this.props.title}\n t={this.props.t}\n onClose={() => {\n if (this.props.camera && this.props.camera !== 'text') {\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n }\n this.cameraUpdateTimer = setInterval(\n () => this.updateCamera(),\n Math.max(parseInt(this.props.interval as any as string, 10), 500),\n );\n this.updateCamera();\n }\n\n this.setState({ dialog: false });\n }}\n cameraUrl={this.props.cameraUrl}\n />\n );\n }\n\n handleImageLoad(): void {\n if (!this.state.loaded) {\n this.setState({\n loaded: true,\n error: false,\n });\n }\n }\n\n handleImageError(): void {\n if (!this.state.error) {\n this.setState({\n loaded: false,\n error: true,\n });\n }\n }\n\n renderContent(): JSX.Element | null {\n if (this.props.camera === 'custom') {\n let url = this.props.cameraUrl;\n\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += `&ts=${Date.now()}`;\n } else {\n url += `?ts=${Date.now()}`;\n }\n }\n\n return (\n <Grid2\n container\n style={styles.imgContainer}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <img\n ref={this.cameraRef}\n src={url}\n alt=\"Camera\"\n style={this.state.loaded && !this.state.error ? styles.cameraImg : styles.hidden}\n onLoad={() => this.handleImageLoad()}\n onError={() => this.handleImageError()}\n />\n {!this.state.loaded && !this.state.error && (\n <Skeleton\n height=\"100%\"\n width=\"100%\"\n animation=\"wave\"\n style={styles.imgSkeleton}\n />\n )}\n {this.state.error && <ErrorIcon fontSize=\"large\" />}\n </Grid2>\n );\n }\n\n if (this.props.camera.startsWith('cameras.')) {\n return (\n <img\n ref={this.cameraRef}\n src=\"\"\n alt=\"camera\"\n style={styles.cameraImg}\n />\n );\n }\n\n return null;\n }\n\n render(): JSX.Element {\n if (this.props.camera && this.props.camera !== 'text') {\n if (this.interval !== this.props.interval) {\n this.interval = this.props.interval;\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n }\n this.cameraUpdateTimer = setInterval(\n () => this.updateCamera(),\n Math.max(parseInt(this.props.interval as any as string, 10), 500),\n );\n }\n } else if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n\n return super.render();\n }\n}\n\nexport default IntroCardCamera;\n","import React, { Component, type JSX } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n TextField,\n Grid2,\n IconButton,\n Typography,\n FormControlLabel,\n Checkbox,\n Slider,\n InputLabel,\n MenuItem,\n FormControl,\n Select,\n InputAdornment,\n} from '@mui/material';\n\n// icons\nimport { Add as AddIcon, Check as CheckIcon, Close as CloseIcon } from '@mui/icons-material';\n\nimport { UploadImage, type AdminConnection, type IobTheme, type Translate } from '@iobroker/adapter-react-v5';\n\nimport IntroCardCamera from '@/components/Intro/IntroCardCamera';\nimport IntroCard from './IntroCard';\n\nconst styles: Record<string, any> = {\n formControl: {\n marginTop: 32,\n },\n rootGrid: {\n flexGrow: 1,\n },\n closeButton: (theme: IobTheme) => ({\n position: 'absolute',\n right: 8,\n top: 8,\n color: theme.palette.grey[500],\n }),\n paper: {\n // minWidth: 600\n },\n typography: {\n paddingRight: 30,\n },\n editItem: {\n marginTop: 8,\n },\n editItemSlider: {\n marginTop: 24,\n },\n labelSlider: {\n marginTop: 16,\n fontSize: '1rem',\n },\n editColor: {\n width: '100%',\n },\n dropZone: {\n width: '100%',\n height: 100,\n position: 'relative',\n },\n dropZoneEmpty: {},\n image: {\n height: '100%',\n width: 'auto',\n objectFir: 'contain',\n },\n\n uploadDiv: {\n position: 'relative',\n width: '100%',\n height: 100,\n opacity: 0.9,\n },\n uploadDivDragging: {\n opacity: 1,\n },\n\n uploadCenterDiv: {\n margin: 5,\n border: '3px dashed grey',\n borderRadius: 5,\n width: 'calc(100% - 10px)',\n height: 'calc(100% - 10px)',\n position: 'relative',\n },\n uploadCenterIcon: {\n paddingTop: 10,\n width: 48,\n height: 48,\n },\n uploadCenterText: {\n fontSize: 16,\n },\n uploadCenterTextAndIcon: {\n textAlign: 'center',\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n};\n\ninterface EditIntroLinkDialogProps {\n t: Translate;\n lang: ioBroker.Languages;\n socket: AdminConnection;\n link: Record<string, any>;\n onClose: (link?: Record<string, any>) => void;\n isNew: boolean;\n theme: IobTheme;\n}\n\ninterface EditIntroLinkDialogState {\n image: string;\n name: string;\n link: string;\n linkName: string;\n color: string;\n desc: string;\n addTs: boolean;\n interval: number;\n camera: string;\n cameraList: { id: string; name: string }[];\n}\n\nclass EditIntroLinkDialog extends Component<EditIntroLinkDialogProps, EditIntroLinkDialogState> {\n constructor(props: EditIntroLinkDialogProps) {\n super(props);\n\n this.state = {\n image: '',\n name: props.t('New link'),\n link: 'http://',\n linkName: '',\n color: '',\n desc: '',\n addTs: true,\n interval: 5000,\n camera: 'text',\n cameraList: [],\n ...props.link,\n };\n }\n\n componentDidMount(): void {\n this.getCamerasInstances();\n }\n\n getCamerasInstances(): void {\n void this.props.socket.getAdapterInstances('cameras', true).then(list => {\n const cameraList: { id: string; name: string }[] = [];\n const promises: Promise<{ id: string; name: string }>[] = [];\n list.forEach(obj => {\n const instance = obj._id.replace('system.adapter.', '');\n\n if (obj.common && obj.common.enabled) {\n promises.push(\n // if instance is alive\n this.props.socket\n .getState(`${obj._id}.alive`)\n // get the list of cameras\n .then(state => state && state.val && this.props.socket.sendTo(instance, 'list', null))\n .then(\n result =>\n result &&\n result.list &&\n result.list.forEach((cam: { id: string; name: string; desc: string }) =>\n cameraList.push({ id: cam.id, name: `${cam.desc} [${instance}/${cam.name}]` }),\n ),\n ),\n );\n }\n });\n\n void Promise.all(promises).then(() => this.setState({ cameraList }));\n });\n }\n\n static getLinkNameFromLink(link: string): string {\n const m = link.trim().match(/^https?:\\/\\/([^/:]+)(:\\d+)?/);\n if (m) {\n return m[1] + (m[2] || '');\n }\n return '';\n }\n\n render(): JSX.Element {\n return (\n <Dialog\n onClose={() => this.props.onClose()}\n open={!0}\n maxWidth=\"md\"\n fullWidth\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.props.isNew ? this.props.t('Add new link: ') : this.props.t('Edit link')}\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 <Grid2\n style={styles.rootGrid}\n container\n direction=\"row\"\n >\n <Grid2\n size={{\n xs: 12,\n sm: 6,\n md: 8,\n lg: 9,\n }}\n >\n <Grid2\n container\n direction=\"column\"\n >\n <FormControl\n variant=\"standard\"\n style={styles.formControl}\n >\n <InputLabel id=\"select-helper-label\">{this.props.t('Link type')}</InputLabel>\n <Select\n variant=\"standard\"\n labelId=\"select-helper-label\"\n value={this.state.camera}\n onChange={e => this.setState({ camera: e.target.value })}\n >\n <MenuItem\n value=\"text\"\n key=\"desc\"\n >\n <em>{this.props.t('Description')}</em>\n </MenuItem>\n {this.state.cameraList.map(cam => (\n <MenuItem\n key={cam.id}\n value={cam.id}\n >\n {cam.name}\n </MenuItem>\n ))}\n <MenuItem\n value=\"custom\"\n key=\"custom\"\n >\n {this.props.t('Custom camera URL')}\n </MenuItem>\n </Select>\n </FormControl>\n\n <TextField\n variant=\"standard\"\n label={this.props.t('URL')}\n value={this.state.link}\n style={styles.editItem}\n onChange={e => {\n const oldLinkName = EditIntroLinkDialog.getLinkNameFromLink(this.state.link);\n if (\n oldLinkName &&\n (!this.state.linkName || oldLinkName === this.state.linkName)\n ) {\n this.setState({\n link: e.target.value,\n linkName: EditIntroLinkDialog.getLinkNameFromLink(e.target.value),\n });\n } else {\n this.setState({ link: e.target.value });\n }\n }}\n slotProps={{\n input: {\n endAdornment: this.state.link ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ link: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n\n <TextField\n variant=\"standard\"\n style={styles.editItem}\n label={this.props.t('Name')}\n value={this.state.name || ''}\n onChange={e => this.setState({ name: e.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.name ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ name: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n\n {this.state.link ? (\n <TextField\n variant=\"standard\"\n style={styles.editItem}\n label={this.props.t('Link name')}\n value={this.state.linkName || ''}\n onChange={e => this.setState({ linkName: e.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.linkName ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ linkName: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n ) : null}\n\n {this.state.camera === 'custom' || this.state.camera === 'text' ? (\n <TextField\n variant=\"standard\"\n style={styles.editItem}\n label={\n this.state.camera === 'custom'\n ? this.props.t('Camera URL')\n : this.props.t('Description')\n }\n value={this.state.desc || ''}\n onChange={e => this.setState({ desc: e.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.desc ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ desc: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n ) : null}\n\n {this.state.camera === 'custom' ? (\n <FormControlLabel\n style={styles.editItem}\n control={\n <Checkbox\n checked={this.state.addTs}\n onChange={e => this.setState({ addTs: e.target.checked })}\n />\n }\n label={this.props.t('Add timestamp to URL')}\n />\n ) : null}\n\n {this.state.camera !== 'text' ? (\n <Typography\n style={styles.labelSlider}\n gutterBottom\n >\n Polling interval in ms\n </Typography>\n ) : null}\n {this.state.camera !== 'text' ? (\n <Slider\n style={styles.editItemSlider}\n value={this.state.interval}\n getAriaValueText={() => `${this.state.interval}ms`}\n onChange={(e, interval) => this.setState({ interval: interval as number })}\n step={100}\n min={500}\n max={60000}\n valueLabelDisplay=\"on\"\n />\n ) : null}\n\n <div style={{ ...styles.editItem, width: 50 }}>\n <TextField\n variant=\"standard\"\n fullWidth\n label={this.props.t('Color')}\n style={styles.editColor}\n type=\"color\"\n value={this.state.color}\n onChange={e => this.setState({ color: e.target.value })}\n />\n </div>\n <UploadImage\n disabled={false}\n crop\n maxSize={256 * 1024}\n icon={this.state.image}\n removeIconFunc={() => this.setState({ image: '' })}\n onChange={base64 => this.setState({ image: base64 })}\n // t={this.props.t}\n />\n </Grid2>\n </Grid2>\n <Grid2\n size={{\n xs: 12,\n sm: 6,\n md: 4,\n lg: 3,\n }}\n >\n {this.state.camera === 'text' ? (\n <IntroCard\n image={this.state.image}\n title={this.state.name}\n action={{ link: this.state.link, text: this.state.linkName }}\n t={this.props.t}\n lang={this.props.lang}\n style={{ width: '100% !important', maxWidth: '100% !important', marginLeft: '8px' }}\n color={this.state.color}\n enabled\n theme={this.props.theme}\n >\n {this.state.desc}\n </IntroCard>\n ) : (\n <IntroCardCamera\n interval={this.state.interval}\n camera={this.state.camera}\n addTs={this.state.addTs}\n style={{ width: '100% !important', maxWidth: '100% !important', marginLeft: '8px' }}\n image={this.state.image}\n title={this.state.name}\n socket={this.props.socket}\n action={{ link: this.state.link, text: this.state.linkName }}\n t={this.props.t}\n lang={this.props.lang}\n color={this.state.color}\n enabled\n cameraUrl={this.state.desc}\n theme={this.props.theme}\n />\n )}\n </Grid2>\n </Grid2>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n autoFocus\n onClick={() => {\n this.props.onClose({\n link: this.state.link,\n name: this.state.name,\n desc: this.state.desc,\n linkName: this.state.linkName,\n color: this.state.color,\n image: this.state.image,\n addTs: this.state.addTs,\n camera: this.state.camera,\n interval: this.state.interval,\n });\n }}\n color=\"primary\"\n startIcon={this.props.isNew ? <AddIcon /> : <CheckIcon />}\n >\n {this.props.isNew ? this.props.t('Add') : this.props.t('Save')}\n </Button>\n <Button\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 EditIntroLinkDialog;\n","import React, { type JSX } from 'react';\nimport {\n Box,\n Button,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Typography,\n} from '@mui/material';\nimport { Close as CloseIcon, Refresh as RefreshIcon } from '@mui/icons-material';\n\nimport { type AdminConnection, I18n } from '@iobroker/adapter-react-v5';\n\ninterface NodeUpdateDialogProps {\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 /** The node.js version to upgrade to */\n // version: string;\n}\n\ninterface NodeUpdateDialogState {\n /** If update is in progress */\n inProgress: boolean;\n /** Result from controller */\n success: boolean;\n /** Error from controller */\n error: string;\n /** If execution finished */\n finished: boolean;\n}\n\nexport default class NodeUpdateDialog extends React.Component<NodeUpdateDialogProps, NodeUpdateDialogState> {\n constructor(props: NodeUpdateDialogProps) {\n super(props);\n\n this.state = {\n inProgress: false,\n success: false,\n error: '',\n finished: false,\n };\n }\n\n /**\n * Render the element\n */\n render(): JSX.Element {\n return (\n <Dialog\n open={!0}\n maxWidth=\"lg\"\n fullWidth\n >\n <DialogTitle>{I18n.t('Node.js upgrade')}</DialogTitle>\n <DialogContent style={{ height: 100, padding: '0 20px', overflow: 'hidden' }}>\n {!this.state.finished ? (\n <Typography>\n {I18n.t('Performing this update will restart the js-controller afterwards!')}\n </Typography>\n ) : null}\n {this.state.inProgress ? (\n <Box sx={{ display: 'flex', justifyContent: 'center' }}>\n <CircularProgress />\n </Box>\n ) : null}\n {this.state.success ? (\n <Typography>{I18n.t('Node.js update successful, restarting controller now!')}</Typography>\n ) : null}\n {this.state.error ? (\n <Typography sx={{ color: 'red' }}>\n {I18n.t('Node.js update failed: %s', this.state.error)}\n </Typography>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button\n disabled={this.state.inProgress || this.state.finished}\n color=\"primary\"\n variant=\"contained\"\n startIcon={<RefreshIcon />}\n onClick={() => this.updateNodeJsVersion()}\n >\n {I18n.t('Upgrade')}\n </Button>\n <Button\n disabled={this.state.inProgress}\n variant=\"contained\"\n onClick={() => {\n this.props.onClose();\n }}\n color=\"primary\"\n startIcon={<CloseIcon />}\n >\n {I18n.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n /**\n * Update Node.js to given version and restart the controller afterward\n */\n async updateNodeJsVersion(): Promise<void> {\n this.setState({ inProgress: true });\n const res = await this.props.socket.upgradeOsPackages(\n this.props.hostId,\n [\n {\n name: 'nodejs',\n // For apt updates we need to be precise about the version, e.g. `18.20.2-1nodesource1`, thus we simply upgrade to the newest version instead\n // version: this.props.version,\n },\n ],\n // restart the controller after the Node.js update\n true,\n );\n\n this.setState({\n inProgress: false,\n success: res.success,\n error: res.error,\n finished: true,\n });\n }\n}\n","import React, { type JSX } from 'react';\n\nimport semver from 'semver';\n\nimport { Fab, Snackbar, Tooltip, Grid2, LinearProgress, Skeleton } from '@mui/material';\n\nimport {\n Add as AddIcon,\n Check as CheckIcon,\n Close as CloseIcon,\n Create as CreateIcon,\n Refresh as RefreshIcon,\n} from '@mui/icons-material';\n\nimport {\n type AdminConnection,\n Utils as UtilsCommon,\n type IobTheme,\n type Translate,\n TabContainer,\n TabContent,\n} from '@iobroker/adapter-react-v5';\n\nimport type { InstancesWorker, InstanceEvent } from '@/Workers/InstancesWorker';\nimport type { HostsWorker, HostAliveEvent, HostEvent } from '@/Workers/HostsWorker';\nimport AdminUtils from '@/helpers/AdminUtils';\nimport { replaceLink } from '@/helpers/utils';\nimport IntroCard from '@/components/Intro/IntroCard';\nimport EditIntroLinkDialog from '@/components/Intro/EditIntroLinkDialog';\n\nimport NodeUpdateDialog from '@/dialogs/NodeUpdateDialog';\nimport IntroCardCamera from '@/components/Intro/IntroCardCamera';\n\ntype OldLinkStructure = {\n link: string;\n color?: string;\n order?: number | string;\n icon?: string;\n img?: string;\n description?: ioBroker.StringOrTranslated;\n pro?: string | boolean;\n cloud?: string;\n intro?: boolean;\n name?: ioBroker.StringOrTranslated;\n localLinks?: string;\n};\n\nexport type CompactHost = {\n _id: `system.host.${string}`;\n common: {\n name: string;\n icon?: string;\n color?: string;\n installedVersion?: string;\n };\n native: {\n hardware: {\n networkInterfaces?: ioBroker.HostNative['hardware']['networkInterfaces'];\n };\n };\n};\n\nconst styles: Record<string, any> = {\n root: {\n width: '100%',\n height: '100%',\n },\n button: {\n position: 'absolute',\n bottom: 16,\n right: 16,\n },\n saveButton: (theme: IobTheme) => ({\n backgroundColor: theme.palette.success.main,\n right: 80,\n '&:hover': {\n backgroundColor: theme.palette.success.dark,\n },\n }),\n addButton: (theme: IobTheme) => ({\n backgroundColor: theme.palette.secondary.main,\n right: 144,\n '&:hover': {\n backgroundColor: theme.palette.secondary.dark,\n },\n }),\n closeButton: (theme: IobTheme) => ({\n backgroundColor: theme.palette.error.main,\n '&:hover': {\n backgroundColor: theme.palette.error.dark,\n },\n }),\n bold: {\n fontWeight: 'bold',\n },\n container: {\n overflowY: 'auto',\n },\n hostOffline: {\n color: '#bb0000',\n },\n updateExists: {\n color: '#c28700',\n marginRight: 4,\n },\n updateNo: {\n color: '#00b204',\n marginRight: 4,\n },\n nodeUpdate: {\n opacity: 0.6,\n },\n instanceNumber: {\n opacity: 0.7,\n fontSize: 16,\n },\n updateIcon: {\n cursor: 'pointer',\n fontSize: 16,\n },\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\ninterface ReverseProxyItem {\n globalPath: string;\n paths: { path: string; instance: string }[];\n}\n\ninterface LinkItem {\n id: string;\n link: string;\n name: string;\n description: string;\n order: number;\n\n color?: string;\n icon: string;\n cloud?: string;\n pro?: string;\n intro?: boolean;\n /** Is this link should be first */\n default?: boolean;\n}\n\ninterface IntroInstanceItem {\n id: string;\n name?: string;\n color?: string;\n description?: string;\n image?: string;\n link?: string;\n linkName?: string;\n order?: number;\n info: string;\n port?: number;\n}\n\ninterface HostData {\n alive: boolean;\n time?: number;\n _nodeNewest?: string;\n _nodeNewestNext?: string;\n 'Node.js'?: string;\n _npmNewest?: string;\n NPM?: string;\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n Platform?: 'win32' | 'linux' | 'darwin' | 'freebsd' | 'sunos' | string;\n RAM?: number;\n _npmNewestNext?: string;\n _versions?: Record<string, string>;\n dockerInformation?: {\n isDocker: boolean;\n isOfficial: boolean;\n officialVersion: string;\n };\n [key: string]: string | boolean | number | Record<string, string | boolean>;\n}\n\nconst formatInfo: Record<string, (seconds: number, t?: Translate) => string> = {\n Uptime: AdminUtils.formatSeconds,\n 'System uptime': AdminUtils.formatSeconds,\n RAM: AdminUtils.formatRam,\n Speed: AdminUtils.formatSpeed,\n 'Disk size': AdminUtils.formatBytes,\n 'Disk free': AdminUtils.formatBytes,\n};\n\ninterface IntroProps {\n showAlert: (message: string, type?: 'error' | 'warning' | 'info' | 'success') => void;\n socket: AdminConnection;\n t: Translate;\n lang: ioBroker.Languages;\n instancesWorker: InstancesWorker;\n hostsWorker: HostsWorker;\n hostname: string;\n adminInstance: string;\n theme: IobTheme;\n}\n\ninterface NodeUpdateDialogInfo {\n /** The host id of the host to upgrade node.js on */\n hostId: string;\n /** The node.js version to upgrade to */\n version: string;\n}\n\ntype ItemCamera = {\n camera: 'custom';\n enabled: boolean;\n link: string;\n name: string;\n /** Title of the link */\n linkName: string;\n /** Camera URL */\n desc: string;\n /** Add timestamp on the image */\n addTs: boolean;\n /** Polling interval in milliseconds */\n interval: number;\n color: string;\n /** base64 image */\n image: string;\n};\n\ntype ItemLink = {\n camera: 'text';\n enabled: boolean;\n link: string;\n name: string;\n /** Title of the link */\n linkName: string;\n /** Camera URL */\n desc: string;\n color: string;\n /** base64 image */\n image: string;\n};\n\ntype ItemElement = ItemCamera | ItemLink;\n\ninterface IntroState {\n /** Difference between client and host time in ms */\n hostTimeDiffMap: Map<string, number>;\n hostsData: Record<string, HostData>;\n alive: Record<string, boolean>;\n reverseProxy: null | ReverseProxyItem[];\n hasUnsavedChanges: boolean;\n openSnackBar: boolean;\n editLinkIndex: number;\n editLink: boolean;\n link: null | ItemElement;\n introLinks: ItemElement[] | null;\n edit: boolean;\n deactivated: string[] | null;\n instances: null | IntroInstanceItem[];\n hosts: CompactHost[] | null;\n /** If controller supports upgrade of nodejs */\n nodeUpdateSupported: boolean;\n /** If node update dialog should be shown */\n nodeUpdateDialog: null | NodeUpdateDialogInfo;\n}\n\nclass Intro extends React.Component<IntroProps, IntroState> {\n /** If server time differs more than MS from client time, show a warning */\n #THRESHOLD_TIME_DIFF_MS = 30 * 60 * 1_000;\n\n #ONE_MINUTE_MS = 60 * 1_000;\n\n /** // e.g. /admin/; */\n private readonly currentProxyPath = window.location.pathname;\n\n private introLinksOriginal?: string;\n\n private deactivatedOriginal?: string[];\n\n private readonly t: Translate;\n\n private getDataTimeout?: ReturnType<typeof setTimeout>;\n\n constructor(props: IntroProps) {\n super(props);\n\n this.state = {\n instances: null,\n deactivated: [],\n edit: false,\n link: null,\n introLinks: [],\n editLink: false,\n editLinkIndex: -1,\n openSnackBar: false,\n hasUnsavedChanges: false,\n reverseProxy: null,\n alive: {},\n hostsData: {},\n hosts: null,\n /** Difference between client and host time in ms */\n hostTimeDiffMap: new Map(),\n nodeUpdateSupported: false,\n nodeUpdateDialog: null,\n };\n\n this.t = props.t;\n }\n\n /**\n * Compares the backend time with the frontend time\n */\n checkBackendTime(): void {\n const timeDiffMap = this.state.hostTimeDiffMap;\n\n for (const [hostId, hostData] of Object.entries(this.state.hostsData)) {\n const currDate = new Date();\n const diff = Math.abs(hostData.time - currDate.getTime());\n\n timeDiffMap.set(hostId, diff);\n }\n\n this.setState({ hostTimeDiffMap: timeDiffMap });\n }\n\n /**\n * React lifecycle hook called when component did mount\n */\n async componentDidMount(): Promise<void> {\n await this.getData();\n this.props.instancesWorker.registerHandler(this.getDataDelayed);\n this.props.hostsWorker.registerHandler(this.updateHosts);\n this.props.hostsWorker.registerAliveHandler(this.updateHostsAlive);\n\n const nodeUpdateSupported = await this.props.socket.checkFeatureSupported('CONTROLLER_OS_PACKAGE_UPGRADE');\n\n // read reverse proxy settings\n const obj = await this.props.socket.getObject(`system.adapter.${this.props.adminInstance}`);\n this.setState({ nodeUpdateSupported, reverseProxy: obj?.native?.reverseProxy || [] });\n this.checkBackendTime();\n }\n\n componentWillUnmount(): void {\n if (this.getDataTimeout) {\n clearTimeout(this.getDataTimeout);\n this.getDataTimeout = undefined;\n }\n\n this.props.instancesWorker.unregisterHandler(this.getDataDelayed);\n this.props.hostsWorker.unregisterHandler(this.updateHosts);\n this.props.hostsWorker.unregisterAliveHandler(this.updateHostsAlive);\n }\n\n updateHostsAlive = async (events: HostAliveEvent[]): Promise<void> => {\n const alive: Record<string, boolean> = JSON.parse(JSON.stringify(this.state.alive));\n const hostsId: string[] = [];\n\n // if some host deleted\n if (events.find(event => event.type === 'deleted')) {\n // get all information anew\n this.getDataDelayed();\n return;\n }\n // update alive status\n events.forEach(event => {\n if (!!alive[event.id] !== !!event.alive) {\n alive[event.id] = event.alive;\n hostsId.push(event.id);\n }\n });\n\n if (hostsId.length) {\n const hostsData: Record<string, HostData> = JSON.parse(JSON.stringify(this.state.hostsData));\n\n const results = await Promise.all(hostsId.map(id => this.getHostData(id, alive[id])));\n results.forEach(res => (hostsData[res.id] = Intro.preprocessHostData(res.data)));\n this.setState({ alive, hostsData }, () => this.checkBackendTime());\n }\n };\n\n updateHosts = (events: HostEvent[]): void => {\n let hostsId = [];\n\n // if host deleted\n if (events.find(event => !event.obj)) {\n this.getDataDelayed();\n return;\n }\n hostsId = events.map(event => event.id);\n\n if (hostsId.length) {\n const hostsData: Record<string, HostData> = JSON.parse(JSON.stringify(this.state.hostsData));\n\n void Promise.all(hostsId.map(id => this.getHostData(id))).then(results => {\n results.forEach(res => (hostsData[res.id] = Intro.preprocessHostData(res.data)));\n this.setState({ hostsData });\n });\n }\n };\n\n async activateEditMode(): Promise<void> {\n const systemConfig: ioBroker.SystemConfigObject = await this.props.socket.getSystemConfig(true);\n const data: { instances: IntroInstanceItem[]; deactivated: string[] } = await this.getInstances(\n true,\n null,\n systemConfig,\n );\n const introLinks = systemConfig?.native?.introLinks ? (systemConfig.native.introLinks as ItemElement[]) : [];\n\n this.introLinksOriginal = JSON.stringify(introLinks);\n this.deactivatedOriginal = JSON.parse(JSON.stringify(data.deactivated));\n\n this.setState({\n instances: data.instances,\n deactivated: data.deactivated,\n edit: true,\n introLinks,\n hasUnsavedChanges: false,\n });\n }\n\n deactivateEditMode(): void {\n if (!this.state.hasUnsavedChanges) {\n // todo: implement confirmation dialog\n }\n\n // restore old state\n this.setState(\n {\n deactivated: this.deactivatedOriginal,\n introLinks: JSON.parse(this.introLinksOriginal),\n hasUnsavedChanges: false,\n edit: false,\n },\n () => {\n this.deactivatedOriginal = null;\n this.introLinksOriginal = null;\n },\n );\n }\n\n toggleCard(id: string, linkName: string): void {\n if (!this.state.instances || !this.state.instances.length) {\n return;\n }\n\n const deactivated = JSON.parse(JSON.stringify(this.state.deactivated));\n\n const pos = deactivated.indexOf(`${id}_${linkName}`);\n\n if (pos !== -1) {\n deactivated.splice(pos, 1);\n } else {\n deactivated.push(`${id}_${linkName}`);\n deactivated.sort();\n }\n\n const hasUnsavedChanges =\n JSON.stringify(deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(this.state.introLinks) !== this.introLinksOriginal;\n\n this.setState({ deactivated, hasUnsavedChanges });\n }\n\n getInstancesCards(): (JSX.Element | null)[] {\n return this.state.instances?.map(instance => {\n const enabled = !this.state.deactivated?.includes(`${instance.id}_${instance.linkName}`);\n if (enabled || this.state.edit) {\n let linkText = instance.link ? instance.link.replace(/^https?:\\/\\//, '') : '';\n linkText = linkText.split('/')[0];\n\n // ignore own admin instance\n if (instance.id === this.props.adminInstance) {\n return null;\n }\n\n let isShowInstance = window.isFinite(instance.id.split('.').pop() as any);\n if (isShowInstance) {\n // try to find second instance of a same type\n isShowInstance = !!this.state.instances?.find(\n inst =>\n inst.id !== instance.id &&\n instance.name === inst.name &&\n instance.id.split('.')[0] === inst.id.split('.')[0],\n );\n }\n\n const hostData = this.state.hostsData ? this.state.hostsData[instance.id] : null;\n const timeDiff = this.state.hostTimeDiffMap.get(instance.id) ?? 0;\n return (\n <IntroCard\n key={`${instance.id}_${instance.link}`}\n image={instance.image}\n title={\n <>\n <span\n style={\n instance.name && instance.name.length > 12 ? { fontSize: '1rem' } : undefined\n }\n >\n {instance.name}\n </span>\n {isShowInstance ? (\n <span style={styles.instanceNumber}>.{instance.id.split('.').pop()}</span>\n ) : null}\n </>\n }\n action={{ link: instance.link, text: linkText }}\n t={this.props.t}\n lang={this.props.lang}\n color={instance.color}\n showInfo={!!instance.info}\n edit={this.state.edit}\n offline={hostData && hostData.alive === false}\n warning={\n timeDiff > this.#THRESHOLD_TIME_DIFF_MS\n ? this.t(\n 'Backend time differs by %s minutes',\n Math.round(timeDiff / this.#ONE_MINUTE_MS).toString(),\n )\n : null\n }\n enabled={enabled}\n disabled={!hostData || typeof hostData !== 'object'}\n getHostDescriptionAll={() => this.getHostDescriptionAll(instance.id)}\n toggleActivation={() => this.toggleCard(instance.id, instance.linkName)}\n openSnackBarFunc={() => this.setState({ openSnackBar: true })}\n theme={this.props.theme}\n >\n {instance.description || this.getHostDescription(instance.id)}\n </IntroCard>\n );\n }\n return null;\n });\n }\n\n toggleLinkCard(i: number): void {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n\n introLinks[i].enabled = !introLinks[i].enabled;\n\n const hasUnsavedChanges =\n JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== this.introLinksOriginal;\n\n this.setState({ introLinks, hasUnsavedChanges });\n }\n\n getLinkCards(): (JSX.Element | null)[] {\n return this.state.introLinks?.map((item, i) => {\n if (!item.enabled && !this.state.edit) {\n return null;\n }\n\n if (item.camera === 'custom') {\n return (\n <IntroCardCamera\n key={`link${i}`}\n image={item.image}\n title={item.name}\n action={{ link: item.link, text: item.linkName }}\n t={this.props.t}\n socket={this.props.socket}\n color={item.color}\n edit={this.state.edit}\n interval={item.interval}\n camera={item.camera}\n addTs={item.addTs}\n onEdit={() =>\n this.setState({\n editLink: true,\n editLinkIndex: i,\n link: JSON.parse(JSON.stringify(this.state.introLinks?.[i])),\n })\n }\n onRemove={() => {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n introLinks.splice(i, 1);\n const hasUnsavedChanges =\n JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== this.introLinksOriginal;\n this.setState({ introLinks, hasUnsavedChanges });\n }}\n enabled={item.enabled}\n lang={this.props.lang}\n toggleActivation={() => this.toggleLinkCard(i)}\n cameraUrl={item.desc}\n theme={this.props.theme}\n />\n );\n }\n\n return (\n <IntroCard\n key={`link${i}`}\n image={item.image}\n title={item.name}\n action={{ link: item.link, text: item.linkName }}\n t={this.props.t}\n color={item.color}\n edit={this.state.edit}\n onEdit={() =>\n this.setState({\n editLink: true,\n editLinkIndex: i,\n link: JSON.parse(JSON.stringify(this.state.introLinks?.[i])),\n })\n }\n onRemove={() => {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n introLinks.splice(i, 1);\n const hasUnsavedChanges =\n JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== this.introLinksOriginal;\n this.setState({ introLinks, hasUnsavedChanges });\n }}\n enabled={item.enabled}\n lang={this.props.lang}\n toggleActivation={() => this.toggleLinkCard(i)}\n theme={this.props.theme}\n >\n {item.desc || ''}\n </IntroCard>\n );\n });\n }\n\n editLinkCard(): JSX.Element | null {\n if (this.state.editLink) {\n return (\n <EditIntroLinkDialog\n link={this.state.link}\n socket={this.props.socket}\n isNew={this.state.editLinkIndex === -1}\n t={this.props.t}\n lang={this.props.lang}\n theme={this.props.theme}\n onClose={link => {\n if (link) {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n if (this.state.editLinkIndex === -1) {\n link.enabled = true;\n introLinks.push(link);\n } else {\n link.enabled = introLinks[this.state.editLinkIndex].enabled;\n introLinks[this.state.editLinkIndex] = link;\n }\n const hasUnsavedChanges =\n JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== this.introLinksOriginal;\n\n this.setState({\n introLinks,\n editLink: false,\n hasUnsavedChanges,\n link: null,\n });\n } else {\n this.setState({ editLink: false });\n }\n }}\n />\n );\n }\n\n return null;\n }\n\n getButtons(): JSX.Element[] {\n const buttons = [];\n\n if (this.state.edit) {\n buttons.push(\n <Fab\n key=\"add\"\n color=\"primary\"\n size=\"small\"\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.addButton)}\n onClick={() =>\n this.setState({\n editLink: true,\n editLinkIndex: -1,\n link: {} as ItemCamera | ItemLink,\n })\n }\n >\n <AddIcon />\n </Fab>,\n );\n\n buttons.push(\n <Fab\n key=\"save\"\n size=\"small\"\n color=\"primary\"\n disabled={!this.state.hasUnsavedChanges}\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.saveButton)}\n onClick={() => this.saveCards()}\n >\n <CheckIcon />\n </Fab>,\n );\n\n buttons.push(\n <Fab\n key=\"close\"\n size=\"small\"\n color=\"primary\"\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.closeButton)}\n onClick={() => this.deactivateEditMode()}\n >\n <CloseIcon />\n </Fab>,\n );\n } else {\n buttons.push(\n <Fab\n color=\"primary\"\n size=\"small\"\n key=\"edit\"\n style={styles.button}\n onClick={() => this.activateEditMode()}\n >\n <CreateIcon />\n </Fab>,\n );\n }\n\n return buttons;\n }\n\n async saveCards(): Promise<void> {\n const systemConfig = await this.props.socket.getSystemConfig(true);\n let changed = false;\n if (JSON.stringify(systemConfig.common.intro) !== JSON.stringify(this.state.deactivated)) {\n systemConfig.common.intro = this.state.deactivated;\n changed = true;\n }\n if (!changed && JSON.stringify(systemConfig.native.introLinks) !== JSON.stringify(this.state.introLinks)) {\n changed = true;\n systemConfig.native.introLinks = this.state.introLinks;\n }\n if (changed) {\n void this.props.socket\n .setSystemConfig(systemConfig)\n .then(() => this.props.showAlert('Updated', 'success'))\n .catch((error: any) => {\n console.log(error);\n this.props.showAlert(error, 'error');\n })\n .then(() => this.setState({ edit: false }));\n } else {\n this.setState({ edit: false });\n }\n }\n\n async getHostData(hostId: string, isAlive?: boolean): Promise<{ id: string; data: HostData }> {\n let alive;\n if (isAlive !== undefined) {\n alive = { val: isAlive };\n } else {\n try {\n alive = await this.props.socket.getState(`${hostId}.alive`);\n } catch (e) {\n console.error(`Cannot get state ${hostId}.alive: ${e}`);\n alive = { val: false };\n }\n }\n\n let data: HostData = { alive: false };\n if (alive?.val) {\n try {\n data = await this.props.socket.getHostInfo(hostId, false, 10000);\n if (data && typeof data === 'object' && data.alive !== false) {\n data.alive = true;\n }\n } catch (e) {\n console.error(`Cannot get host info for ${hostId}: ${e}`);\n data = { alive: false };\n }\n } else {\n data = { alive: false };\n }\n\n const states = await this.props.socket.getForeignStates(`${hostId}.versions.*`);\n\n Object.keys(states).forEach(id => (data[`_${id.split('.').pop()}`] = states[id].val));\n\n return { id: hostId, data };\n }\n\n async getHostsData(\n hosts: CompactHost[],\n ): Promise<{ hostsData: Record<string, HostData>; alive: Record<string, boolean> }> {\n const promises = hosts.map(obj => this.getHostData(obj._id));\n\n const results = await Promise.all(promises);\n const hostsData: Record<string, HostData> = {};\n const alive: Record<string, boolean> = {};\n results.forEach(res => {\n hostsData[res.id] = Intro.preprocessHostData(res.data);\n alive[res.id] = res.data.alive;\n });\n return { hostsData, alive };\n }\n\n static applyReverseProxy(\n webReverseProxyPath: ReverseProxyItem,\n instances: Record<string, ioBroker.InstanceObject>,\n instance: IntroInstanceItem,\n ): void {\n webReverseProxyPath?.paths.forEach(item => {\n if (item.instance === instance.id) {\n instance.link = item.path;\n } else if (item.instance.startsWith('web.')) {\n // if this is a web instance, check if it is the same as the current instance\n const _obj = instances[`system.adapter.${item.instance}`];\n if (_obj?.native?.port && instance.link.includes(`:${_obj.native.port}`)) {\n // replace\n const regExp = new RegExp(`^.*:${_obj.native.port}/`);\n if (instance.link) {\n instance.link = instance.link.replace(regExp, item.path);\n }\n console.log(instance.link);\n }\n }\n });\n }\n\n addLinks(\n linkItem: LinkItem,\n common: ioBroker.InstanceCommon,\n instanceId: number,\n instances: Record<string, ioBroker.InstanceObject>,\n hosts: Record<string, ioBroker.HostObject>,\n introInstances: IntroInstanceItem[],\n ): void {\n const instance: IntroInstanceItem = {\n id: linkItem.id,\n name: linkItem.name,\n description: linkItem.description,\n color: linkItem.color,\n image: linkItem.icon,\n info: '',\n };\n\n const _urls: {\n url: string;\n port: number;\n instance?: string;\n }[] = replaceLink(linkItem.link, common.name, instanceId, {\n instances,\n hostname: this.props.hostname,\n adminInstance: this.props.adminInstance,\n hosts,\n });\n\n let webReverseProxyPath: ReverseProxyItem | null = null;\n if (this.state.reverseProxy?.length) {\n webReverseProxyPath = this.state.reverseProxy.find(item => item.globalPath === this.currentProxyPath);\n }\n if (_urls.length === 1) {\n instance.link = _urls[0].url;\n instance.port = _urls[0].port;\n\n Intro.applyReverseProxy(webReverseProxyPath, instances, instance);\n\n // if a link already exists => ignore\n const lll = introInstances.find(item => item.link === instance.link);\n if (!lll) {\n introInstances.push(instance);\n } else {\n console.log(`Double links: \"${instance.id}\" and \"${lll.id}\"`);\n }\n } else if (_urls.length > 1) {\n _urls.forEach(url => {\n const lll = introInstances.find(item => item.link === url.url);\n\n if (!lll) {\n const item = { ...instance, link: url.url, port: url.port };\n Intro.applyReverseProxy(webReverseProxyPath, instances, item);\n introInstances.push(item);\n } else {\n console.log(`Double links: \"${instance.id}\" and \"${lll.id}\"`);\n }\n });\n }\n }\n\n static getText(text: ioBroker.StringOrTranslated, lang: ioBroker.Languages): string {\n if (!text) {\n return '';\n }\n if (typeof text === 'object') {\n return text[lang] || text.en || '';\n }\n return text || '';\n }\n\n static normalizeLinks(\n instance: ioBroker.InstanceObject,\n language: ioBroker.Languages,\n filterDuplicates?: boolean,\n ): LinkItem[] | null {\n if (\n !instance.common.localLinks &&\n !instance.common.localLink &&\n !instance.common.welcomeScreen &&\n !instance.common.welcomeScreenPro\n ) {\n return null;\n }\n const defaultLink: LinkItem = {\n id: instance._id.replace('system.adapter.', ''),\n link: '',\n name: Intro.getText(instance.common.titleLang || instance.common.title || instance.common.name, language),\n // @ts-expect-error order in common is deprecated, but could happen\n order: instance.common.order || 1000,\n intro: true,\n description: Intro.getText(instance.common.desc, language),\n icon: instance.common.icon ? `adapter/${instance.common.name}/${instance.common.icon}` : 'img/no-image.png',\n };\n let result: LinkItem[] = [];\n if (instance.common.localLink) {\n if (typeof instance.common.localLink === 'string') {\n result.push({\n ...defaultLink,\n link: instance.common.localLink,\n });\n } else {\n // localLink is an object\n /*\n {\n link: string;\n color: string;\n order: number;\n icon: string;\n }\n */\n const compatibilityStructure: OldLinkStructure = instance.common.localLink as OldLinkStructure;\n if (compatibilityStructure.link) {\n const item: LinkItem = {\n ...defaultLink,\n link: compatibilityStructure.link,\n };\n if (compatibilityStructure.color) {\n item.color = compatibilityStructure.color;\n }\n if (\n compatibilityStructure.order !== undefined &&\n typeof compatibilityStructure.order === 'number'\n ) {\n item.order = compatibilityStructure.order;\n }\n if (compatibilityStructure.icon && compatibilityStructure.img) {\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\n }\n\n result.push(item);\n } else {\n console.warn(`Unknown localLink structure: ${JSON.stringify(instance.common.localLink)}`);\n }\n }\n }\n\n if (instance.common.localLinks && typeof instance.common.localLinks === 'object') {\n Object.keys(instance.common.localLinks).forEach((linkName: string) => {\n const linkItem: unknown = instance.common.localLinks[linkName];\n if (typeof linkItem === 'string') {\n result.push({\n ...defaultLink,\n link: linkItem,\n });\n } else {\n const compatibilityStructure: OldLinkStructure = linkItem as OldLinkStructure;\n\n if (compatibilityStructure.link) {\n const item: LinkItem = {\n ...defaultLink,\n id:\n instance._id.replace('system.adapter.', '') +\n (linkName === '_default' ? '' : ` ${linkName}`),\n link: compatibilityStructure.link,\n name: defaultLink.name + (linkName === '_default' ? '' : ` ${linkName}`),\n };\n if (compatibilityStructure.color) {\n item.color = compatibilityStructure.color;\n }\n if (compatibilityStructure.order !== undefined) {\n item.order = parseInt(compatibilityStructure.order as string, 10) || 1000;\n }\n if (compatibilityStructure.icon && compatibilityStructure.img) {\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\n }\n if (compatibilityStructure.description) {\n item.description = Intro.getText(compatibilityStructure.description, language);\n }\n if (compatibilityStructure.pro !== undefined) {\n if (typeof compatibilityStructure.pro === 'string') {\n item.pro = compatibilityStructure.pro;\n } else {\n item.pro = `${instance.common.name}/index.html`;\n }\n }\n if (compatibilityStructure.cloud !== undefined) {\n item.cloud = compatibilityStructure.cloud;\n }\n if (compatibilityStructure.intro !== undefined) {\n item.intro = compatibilityStructure.intro === true;\n }\n\n if (compatibilityStructure.name) {\n item.name = Intro.getText(compatibilityStructure.name, language);\n }\n if (linkName === '_default') {\n item.default = true;\n }\n\n result.push(item);\n } else {\n console.warn(`Unknown localLinks structure: ${JSON.stringify(linkItem)}`);\n }\n }\n });\n }\n\n if (instance.common.welcomeScreen && typeof instance.common.welcomeScreen === 'object') {\n const compatibilityStructureArr: OldLinkStructure[] = Array.isArray(instance.common.welcomeScreen)\n ? (instance.common.welcomeScreen as OldLinkStructure[])\n : [instance.common.welcomeScreen as OldLinkStructure];\n\n compatibilityStructureArr.forEach(compatibilityStructure => {\n if (compatibilityStructure.link) {\n const item: LinkItem = {\n ...defaultLink,\n id: `${instance._id.replace('system.adapter.', '')} cloud`,\n link: `%web_protocol%://%web_bind%:%web_port%/${compatibilityStructure.link}`,\n cloud: compatibilityStructure.link,\n };\n if (compatibilityStructure.color) {\n item.color = compatibilityStructure.color;\n }\n if (\n compatibilityStructure.order !== undefined &&\n typeof compatibilityStructure.order === 'number'\n ) {\n item.order = compatibilityStructure.order;\n }\n if (compatibilityStructure.icon && compatibilityStructure.img) {\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\n }\n\n if (compatibilityStructure.localLinks) {\n const link: unknown = instance.common.localLinks[compatibilityStructure.localLinks];\n if (link && typeof link === 'string') {\n item.link = link;\n } else if (link && typeof link === 'object' && (link as any).link) {\n item.link = (link as any).link;\n }\n }\n\n if (compatibilityStructure.name) {\n item.name = Intro.getText(compatibilityStructure.name, language);\n }\n\n result.push(item);\n }\n });\n\n if (instance.common.welcomeScreenPro && typeof instance.common.welcomeScreenPro === 'object') {\n const _compatibilityStructureArr: OldLinkStructure[] = Array.isArray(instance.common.welcomeScreenPro)\n ? (instance.common.welcomeScreenPro as OldLinkStructure[])\n : [instance.common.welcomeScreenPro as OldLinkStructure];\n\n _compatibilityStructureArr.forEach(compatibilityStructure => {\n if (compatibilityStructure.link) {\n const item: LinkItem = {\n ...defaultLink,\n id: `${instance._id.replace('system.adapter.', '')} pro`,\n link: `%web_protocol%://%web_bind%:%web_port%/${compatibilityStructure.link}`,\n pro: compatibilityStructure.link,\n };\n if (compatibilityStructure.color) {\n item.color = compatibilityStructure.color;\n }\n if (\n compatibilityStructure.order !== undefined &&\n typeof compatibilityStructure.order === 'number'\n ) {\n item.order = compatibilityStructure.order;\n }\n if (compatibilityStructure.icon && compatibilityStructure.img) {\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\n }\n\n if (compatibilityStructure.localLinks) {\n const link: unknown = instance.common.localLinks[compatibilityStructure.localLinks];\n if (link && typeof link === 'string') {\n item.link = link;\n } else if (link && typeof link === 'object' && (link as any).link) {\n item.link = (link as any).link;\n }\n }\n\n if (compatibilityStructure.name) {\n item.name = Intro.getText(compatibilityStructure.name, language);\n }\n\n result.push(item);\n }\n });\n }\n }\n\n result.forEach(item => {\n if (\n !item.icon.startsWith('adapter/') &&\n !item.icon.startsWith('data:image/') &&\n !item.icon.startsWith('http://') &&\n !item.icon.startsWith('https://') &&\n item.icon !== 'img/no-image.png'\n ) {\n // normalize icon\n item.icon = `adapter/${instance.common.name}/${item.icon}`;\n }\n });\n\n if (filterDuplicates) {\n // filter all links with the same \"link\"\n const links: Record<string, LinkItem> = {};\n result.forEach(item => {\n if (!links[item.link]) {\n links[item.link] = item;\n } else {\n // merge\n if (item.color) {\n links[item.link].color = item.color;\n }\n if (item.icon) {\n links[item.link].icon = item.icon;\n }\n if (item.cloud) {\n links[item.link].cloud = item.cloud;\n }\n if (item.pro) {\n links[item.link].pro = item.pro;\n }\n if (item.intro !== undefined) {\n links[item.link].intro = item.intro;\n }\n if (item.name && typeof item.name === 'object') {\n links[item.link].name = item.name;\n }\n if (item.order !== undefined) {\n links[item.link].order = item.order;\n }\n if (item.default) {\n links[item.link].default = item.default;\n }\n }\n });\n result = Object.values(links);\n }\n\n result.sort((a: LinkItem, b: LinkItem) => {\n if (a.default === undefined && b.default === undefined) {\n if (a.order === undefined && b.order === undefined) {\n return 0;\n }\n if (a.order === undefined) {\n return -1;\n }\n if (b.order === undefined) {\n return 1;\n }\n return a.order - b.order;\n }\n if (a.default === undefined) {\n return -1;\n }\n if (b.default === undefined) {\n return 1;\n }\n\n if (a.order === undefined && b.order === undefined) {\n return 0;\n }\n if (a.order === undefined) {\n return -1;\n }\n if (b.order === undefined) {\n return 1;\n }\n return a.order - b.order;\n });\n\n return result;\n }\n\n async getInstances(\n update: boolean | undefined,\n hosts: CompactHost[] | null,\n systemConfig: ioBroker.SystemConfigObject,\n ): Promise<{ instances: IntroInstanceItem[]; deactivated: string[] }> {\n hosts = hosts || this.state.hosts;\n\n const oHosts: Record<string, ioBroker.HostObject> = {};\n hosts.forEach(obj => (oHosts[obj._id] = obj as ioBroker.HostObject));\n\n try {\n const objects = await this.props.socket.getAdapterInstances('', update);\n let deactivated: string[] = systemConfig.common.intro || [];\n if (!Array.isArray(deactivated)) {\n deactivated = Object.keys(deactivated);\n deactivated.sort();\n }\n const introInstances: IntroInstanceItem[] = [];\n const instances: Record<string, ioBroker.InstanceObject> = {};\n // Array to the mapped object\n objects.forEach(obj => (instances[obj._id] = obj));\n\n objects.forEach(obj => {\n if (!obj) {\n return;\n }\n const common = obj.common || null;\n const objId = obj._id.split('.');\n const instanceId: number = parseInt(objId.pop(), 10);\n let name: string;\n if (common?.name && typeof common.name === 'object') {\n const commonName: ioBroker.Translated = common?.name;\n name = commonName[this.props.lang] || commonName.en;\n } else {\n name = common?.name || '';\n }\n\n if (name === 'admin' && common.localLink === (this.props.hostname || '')) {\n return;\n }\n if (name === 'web') {\n return;\n }\n\n if (name && name !== 'vis-web-admin' && name.match(/^vis-/) && name !== 'vis-2') {\n return;\n }\n if (name?.match(/^icons-/)) {\n return;\n }\n if (common && (common.enabled || common.onlyWWW)) {\n const links = Intro.normalizeLinks(obj, this.props.lang, true);\n\n if (links) {\n links.forEach(link =>\n this.addLinks(link, common, instanceId, instances, oHosts, introInstances),\n );\n }\n }\n });\n\n introInstances.forEach(instance => {\n if (instance.link) {\n instance.linkName = instance.link\n .replace('https://', '')\n .replace('http://', '')\n .replace(/^[^_]+:/, '');\n }\n });\n\n introInstances.sort((a, b) => {\n if (a.order !== undefined || b.order !== undefined) {\n a.order = a.order === undefined ? 1000 : a.order;\n b.order = b.order === undefined ? 1000 : b.order;\n if (a.order < b.order) {\n return -1;\n }\n if (a.order > b.order) {\n return 1;\n }\n }\n\n if (a.id > b.id) {\n return 1;\n }\n if (a.id < b.id) {\n return -1;\n }\n return 0;\n });\n\n hosts?.forEach(obj => {\n const common = obj?.common;\n let name: ioBroker.StringOrTranslated = common?.name;\n if (typeof name === 'object') {\n if (name) {\n name = (name as ioBroker.Translated)[this.props.lang] || (name as ioBroker.Translated).en;\n }\n }\n\n if (common) {\n const instance: IntroInstanceItem = {\n id: obj._id,\n name: name || '',\n color: '',\n image: common.icon || 'img/no-image.png',\n info: this.t('Info'),\n linkName: '',\n };\n\n introInstances.push(instance);\n }\n });\n\n const _deactivated: string[] = [];\n deactivated.forEach(id => {\n if (introInstances.find(instance => id === `${instance.id}_${instance.linkName}`)) {\n _deactivated.push(id);\n }\n });\n deactivated = _deactivated;\n\n return {\n instances: introInstances,\n deactivated,\n };\n } catch (error) {\n console.log(error);\n return { instances: [], deactivated: [] };\n }\n }\n\n getHostDescription(id: string): JSX.Element {\n const hostData = this.state.hostsData ? this.state.hostsData[id] : null;\n\n if (hostData && hostData.alive === false) {\n return <div style={styles.hostOffline}>{this.props.t('Offline')}</div>;\n }\n\n let nodeUpdate: string | JSX.Element = '';\n let npmUpdate: string | JSX.Element = '';\n if (hostData) {\n try {\n if (\n hostData._nodeNewest &&\n hostData['Node.js'] &&\n semver.gt(hostData._nodeNewest, hostData['Node.js'].replace(/^v/, ''))\n ) {\n nodeUpdate = hostData._nodeNewest;\n }\n } catch {\n // ignore\n }\n try {\n if (\n hostData._nodeNewest !== hostData._nodeNewestNext &&\n hostData._nodeNewestNext &&\n hostData['Node.js'] &&\n hostData._nodeNewest &&\n semver.gt(hostData._nodeNewestNext, hostData['Node.js'].replace(/^v/, '')) &&\n semver.gt(hostData._nodeNewestNext, hostData._nodeNewest)\n ) {\n nodeUpdate += (nodeUpdate ? ' / ' : '') + hostData._nodeNewestNext;\n }\n } catch {\n // ignore\n }\n\n if (nodeUpdate) {\n const updateSupported = this.state.nodeUpdateSupported && hostData.Platform === 'linux';\n\n nodeUpdate = (\n <Tooltip\n title={this.props.t('Some updates available')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <span style={{ ...styles.nodeUpdate, display: 'inline-flex' }}>\n ({nodeUpdate})\n {updateSupported ? (\n <RefreshIcon\n style={styles.updateIcon}\n onClick={() =>\n this.setState({\n nodeUpdateDialog: { hostId: id, version: hostData._nodeNewestNext },\n })\n }\n />\n ) : null}\n </span>\n </Tooltip>\n );\n }\n\n try {\n if (hostData._npmNewest && hostData.NPM && semver.gt(hostData._npmNewest, hostData.NPM)) {\n npmUpdate = hostData._npmNewest;\n }\n } catch {\n // ignore\n }\n try {\n if (\n hostData._npmNewest !== hostData._npmNewestNext &&\n hostData._npmNewestNext &&\n hostData.NPM &&\n hostData._npmNewest &&\n semver.gt(hostData._npmNewestNext, hostData.NPM) &&\n semver.gt(hostData._npmNewestNext, hostData._npmNewest)\n ) {\n npmUpdate += (npmUpdate ? ' / ' : '') + hostData._npmNewestNext;\n }\n } catch {\n // ignore\n }\n if (npmUpdate) {\n npmUpdate = (\n <Tooltip\n title={this.props.t('Some updates available')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <span style={styles.nodeUpdate}>({npmUpdate})</span>\n </Tooltip>\n );\n }\n }\n\n return hostData && typeof hostData === 'object' ? (\n <ul style={{ textTransform: 'none' }}>\n <li>\n <span>\n <span style={styles.bold}>{this.t('Platform')}: </span>\n {hostData.Platform || '--'}\n </span>\n </li>\n <li>\n <span>\n <span style={styles.bold}>{this.t('RAM')}: </span>\n {formatInfo.RAM(hostData.RAM)}\n </span>\n </li>\n <li>\n <span>\n <span style={styles.bold}>{this.t('Node.js')}: </span>\n <span style={nodeUpdate ? styles.updateExists : styles.updateNo}>\n {hostData['Node.js'] || '--'}\n </span>\n {nodeUpdate}\n </span>\n </li>\n <li>\n <span>\n <span style={styles.bold}>{this.t('NPM')}: </span>\n <span className={npmUpdate ? styles.updateExists : styles.updateNo}>\n {hostData.NPM || '--'}\n </span>\n {npmUpdate}\n </span>\n </li>\n </ul>\n ) : (\n <ul>\n <Skeleton />\n <Skeleton />\n <Skeleton />\n <Skeleton />\n </ul>\n );\n }\n\n getHostDescriptionAll(id: string): { el: JSX.Element; text: string } {\n const hostData = this.state.hostsData ? this.state.hostsData[id] : null;\n\n return {\n el: (\n <ul style={{ textTransform: 'none' }}>\n {hostData &&\n typeof hostData === 'object' &&\n Object.keys(hostData)\n .filter(\n _id => !_id.startsWith('_') && hostData[_id] !== null && hostData[_id] !== undefined,\n )\n .map(value => (\n <li key={value}>\n {hostData && typeof hostData === 'object' ? (\n <span>\n <span style={styles.bold}>{this.t(value)}: </span>\n {formatInfo[value]\n ? formatInfo[value](hostData[value] as number, this.t)\n : (typeof hostData[value] === 'object'\n ? JSON.stringify(hostData[value])\n : (hostData[value] as any).toString()) || '--'}\n </span>\n ) : (\n <Skeleton />\n )}\n </li>\n ))}\n </ul>\n ),\n\n text:\n hostData && typeof hostData === 'object'\n ? Object.keys(hostData).reduce(\n (acom: string, item: string) =>\n `${acom}${this.t(item)}:${formatInfo[item] ? formatInfo[item](hostData[item] as number, this.t) : (typeof hostData[item] === 'object' ? JSON.stringify(hostData[item]) : hostData[item] as string) || '--'}\\n`,\n )\n : '',\n };\n }\n\n getDataDelayed = (_events?: InstanceEvent[]): void => {\n if (this.getDataTimeout) {\n clearTimeout(this.getDataTimeout);\n }\n this.getDataTimeout = setTimeout(() => {\n this.getDataTimeout = undefined;\n void this.getData(true).catch(e => console.error(`Cannot get data: ${e}`));\n }, 300);\n };\n\n async getData(update?: boolean): Promise<void> {\n try {\n const systemConfig: ioBroker.SystemConfigObject = await this.props.socket.getSystemConfig(update);\n const hosts: CompactHost[] = await this.props.socket.getCompactHosts(update);\n const data: { instances: IntroInstanceItem[]; deactivated: string[] } = await this.getInstances(\n update,\n hosts,\n systemConfig,\n );\n this.setState({\n instances: data.instances,\n hosts,\n deactivated: data.deactivated,\n introLinks:\n systemConfig && systemConfig.native && systemConfig.native.introLinks\n ? systemConfig.native.introLinks\n : [],\n });\n // hosts data could last a long time, so show some results to user now and then get the info about hosts\n const newState: Partial<IntroState> = await this.getHostsData(hosts);\n await new Promise<void>(resolve => {\n this.setState(newState as IntroState, () => resolve());\n });\n } catch (error: any) {\n window.alert(`Cannot get data: ${error}`);\n }\n }\n\n /**\n * Render toast if content has been copied\n */\n renderCopiedToast(): JSX.Element {\n return (\n <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={this.state.openSnackBar}\n autoHideDuration={3_000}\n onClose={() => this.setState({ openSnackBar: false })}\n message={this.t('copied')}\n />\n );\n }\n\n render(): JSX.Element {\n if (!this.state.instances) {\n return <LinearProgress />;\n }\n\n return (\n <TabContainer\n elevation={0}\n overflow=\"visible\"\n >\n {this.renderCopiedToast()}\n {this.state.nodeUpdateDialog ? (\n <NodeUpdateDialog\n onClose={() => this.setState({ nodeUpdateDialog: null })}\n socket={this.props.socket}\n {...this.state.nodeUpdateDialog}\n />\n ) : null}\n <TabContent style={styles.container}>\n {/* This fragment is required here\n to split directives of Grid2 in TabContent and Grid2 directives in Intro */}\n <>\n <Grid2\n container\n spacing={2}\n >\n {this.getInstancesCards()}\n {this.getLinkCards()}\n </Grid2>\n </>\n {this.getButtons()}\n {this.editLinkCard()}\n </TabContent>\n </TabContainer>\n );\n }\n\n /**\n * Preprocess host data to harmonize information\n *\n * @param hostData Host data from controller\n */\n static preprocessHostData(hostData: HostData): HostData {\n if (hostData.dockerInformation?.isDocker) {\n let dockerString = hostData.dockerInformation.isOfficial ? 'official image' : 'unofficial image';\n\n if (hostData.dockerInformation.isOfficial) {\n dockerString += ` - ${hostData.dockerInformation.officialVersion}`;\n }\n\n hostData.Platform = `${hostData.Platform} (${dockerString})`;\n }\n\n delete hostData.dockerInformation;\n return hostData;\n }\n}\n\nexport default Intro;\n","function _classPrivateFieldBase(e, t) {\n if (!{}.hasOwnProperty.call(e, t)) throw new TypeError(\"attempted to use private field on non-instance\");\n return e;\n}\nexport { _classPrivateFieldBase as default };","var id = 0;\nfunction _classPrivateFieldKey(e) {\n return \"__private_\" + id++ + \"_\" + e;\n}\nexport { _classPrivateFieldKey as default };"],"names":["boxShadow","boxShadowHover","styles","root","theme","padding","breakpoints","up","flex","card","display","minHeight","position","overflow","maxHeight","overflowY","cardInfo","flexDirection","cardInfoHead","top","background","palette","default","width","justifyContent","borderBottom","edit","opacity","userSelect","pointerEvents","media","backgroundColor","mode","maxWidth","img","height","contentContainer","content","flexGrow","action","expand","right","bottom","collapse","close","save","enabled","color","blue","disabled","grey","editButton","deleteButton","red","contentGrid","colorOrange","tooltip","IntroCard","Component","constructor","props","super","this","state","expanded","getDerivedStateFromProps","handleExpandClick","setState","renderContent","children","openDialog","renderDialogs","render","_this$props$action","_this$props$action2","editClass","undefined","buttonTitle","text","t","lang","en","_jsx","Grid2","size","xs","sm","md","lg","sx","Utils","getStyle","style","Link","href","link","underline","target","rel","_jsxs","Card","onClick","e","stopPropagation","showInfo","offline","Button","_objectSpread","variant","Box","component","CardMedia","image","paddingBottom","paddingLeft","warning","Tooltip","title","slotProps","popper","WarningIcon","alignSelf","fontSize","CardContent","container","direction","wrap","Typography","gutterBottom","Divider","CardActions","AdminUtils","getText","Collapse","in","timeout","unmountOnExit","IconButton","getHostDescriptionAll","copyToClipboard","openSnackBarFunc","SaveIcon","CloseIcon","el","toggleActivation","CheckIcon","onEdit","EditIcon","onRemove","DeleteIcon","rootGrid","closeButton","paper","typography","paddingRight","objectFit","CameraIntroLinkDialog","cameraUpdateTimer","cameraRef","createRef","componentDidMount","camera","setInterval","updateCamera","Math","max","parseInt","interval","componentWillUnmount","clearInterval","current","url","cameraUrl","addTs","includes","concat","Date","now","src","parts","split","adapter","shift","instance","socket","sendTo","name","pop","then","result","data","Dialog","onClose","open","fullWidth","fullScreen","DialogTitle","DialogContent","dividers","alt","ref","DialogActions","autoFocus","startIcon","cameraImg","imgContainer","hidden","imgSkeleton","transform","Object","assign","error","dialog","loaded","catch","window","alert","CameraIntroDialog","handleImageLoad","handleImageError","alignItems","onLoad","onError","Skeleton","animation","ErrorIcon","startsWith","formControl","marginTop","editItem","editItemSlider","labelSlider","editColor","dropZone","dropZoneEmpty","objectFir","uploadDiv","uploadDivDragging","uploadCenterDiv","margin","border","borderRadius","uploadCenterIcon","paddingTop","uploadCenterText","uploadCenterTextAndIcon","textAlign","left","EditIntroLinkDialog","linkName","desc","cameraList","getCamerasInstances","getAdapterInstances","list","promises","forEach","obj","_id","replace","common","push","getState","val","cam","id","Promise","all","getLinkNameFromLink","m","trim","match","isNew","FormControl","InputLabel","Select","labelId","value","onChange","MenuItem","map","TextField","label","oldLinkName","input","endAdornment","InputAdornment","FormControlLabel","control","Checkbox","checked","Slider","getAriaValueText","step","min","valueLabelDisplay","type","UploadImage","crop","maxSize","icon","removeIconFunc","base64","marginLeft","IntroCardCamera","AddIcon","NodeUpdateDialog","React","inProgress","success","finished","I18n","CircularProgress","RefreshIcon","updateNodeJsVersion","res","upgradeOsPackages","hostId","button","saveButton","main","dark","addButton","secondary","bold","fontWeight","hostOffline","updateExists","marginRight","updateNo","nodeUpdate","instanceNumber","updateIcon","cursor","formatInfo","Uptime","formatSeconds","RAM","formatRam","Speed","formatSpeed","formatBytes","_THRESHOLD_TIME_DIFF_MS","_classPrivateFieldLooseKey","_ONE_MINUTE_MS","Intro","defineProperty","writable","currentProxyPath","location","pathname","introLinksOriginal","deactivatedOriginal","getDataTimeout","updateHostsAlive","async","alive","JSON","parse","stringify","hostsId","events","find","event","getDataDelayed","length","hostsData","getHostData","preprocessHostData","checkBackendTime","updateHosts","results","_events","clearTimeout","setTimeout","getData","console","instances","deactivated","introLinks","editLink","editLinkIndex","openSnackBar","hasUnsavedChanges","reverseProxy","hosts","hostTimeDiffMap","Map","nodeUpdateSupported","nodeUpdateDialog","timeDiffMap","hostData","entries","currDate","diff","abs","time","getTime","set","_obj$native","instancesWorker","registerHandler","hostsWorker","registerAliveHandler","checkFeatureSupported","getObject","adminInstance","native","unregisterHandler","unregisterAliveHandler","activateEditMode","_systemConfig$native","systemConfig","getSystemConfig","getInstances","deactivateEditMode","toggleCard","pos","indexOf","splice","sort","getInstancesCards","_this$state$instances","_this$state$deactivat","_this$state$hostTimeD","linkText","isShowInstance","isFinite","_this$state$instances2","inst","timeDiff","get","_Fragment","info","_classPrivateFieldLooseBase","round","toString","description","getHostDescription","toggleLinkCard","i","getLinkCards","_this$state$introLink","item","_this$state$introLink2","_this$state$introLink3","editLinkCard","getButtons","buttons","Fab","UtilsCommon","saveCards","CreateIcon","changed","intro","setSystemConfig","showAlert","log","isAlive","_alive","getHostInfo","states","getForeignStates","keys","getHostsData","applyReverseProxy","webReverseProxyPath","paths","path","_obj$native2","_obj","port","regExp","RegExp","addLinks","linkItem","instanceId","introInstances","_this$state$reversePr","_urls","replaceLink","hostname","globalPath","lll","normalizeLinks","language","filterDuplicates","localLinks","localLink","welcomeScreen","welcomeScreenPro","defaultLink","titleLang","order","compatibilityStructure","warn","pro","cloud","Array","isArray","links","values","a","b","update","oHosts","_hosts","objects","_name","objId","commonName","onlyWWW","_deactivated","npmUpdate","_nodeNewest","semver","_unused","_nodeNewestNext","_unused2","updateSupported","Platform","version","_npmNewest","NPM","_unused3","_npmNewestNext","_unused4","textTransform","className","filter","reduce","acom","getCompactHosts","newState","resolve","renderCopiedToast","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","message","TabContainer","elevation","TabContent","spacing","LinearProgress","_hostData$dockerInfor","dockerInformation","isDocker","dockerString","isOfficial","officialVersion","_classPrivateFieldBase","hasOwnProperty","call","TypeError","_classPrivateFieldKey"],"sourceRoot":""}
|