iobroker.admin 7.1.1 → 7.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +5 -8
  2. package/adminWww/asset-manifest.json +33 -33
  3. package/adminWww/index.html +1 -1
  4. package/adminWww/static/css/3210.f6c8a5fc.chunk.css.map +1 -1
  5. package/adminWww/static/js/2534.d8fd195b.chunk.js +2 -0
  6. package/adminWww/static/js/2534.d8fd195b.chunk.js.map +1 -0
  7. package/adminWww/static/js/2544.047df092.chunk.js +2 -0
  8. package/adminWww/static/js/2544.047df092.chunk.js.map +1 -0
  9. package/adminWww/static/js/2816.f7bf6ba0.chunk.js +2 -0
  10. package/adminWww/static/js/2816.f7bf6ba0.chunk.js.map +1 -0
  11. package/adminWww/static/js/3210.1be726e7.chunk.js +2 -0
  12. package/adminWww/static/js/3210.1be726e7.chunk.js.map +1 -0
  13. package/adminWww/static/js/4112.9b241792.chunk.js +2 -0
  14. package/adminWww/static/js/4112.9b241792.chunk.js.map +1 -0
  15. package/adminWww/static/js/4579.014de1f1.chunk.js +2 -0
  16. package/adminWww/static/js/4579.014de1f1.chunk.js.map +1 -0
  17. package/adminWww/static/js/{5174.60f22386.chunk.js → 5174.f5aa1074.chunk.js} +2 -2
  18. package/adminWww/static/js/5174.f5aa1074.chunk.js.map +1 -0
  19. package/adminWww/static/js/530.cb8dbcf9.chunk.js +2 -0
  20. package/adminWww/static/js/530.cb8dbcf9.chunk.js.map +1 -0
  21. package/adminWww/static/js/6552.0a447e18.chunk.js +2 -0
  22. package/adminWww/static/js/6552.0a447e18.chunk.js.map +1 -0
  23. package/adminWww/static/js/6938.af058182.chunk.js +2 -0
  24. package/adminWww/static/js/6938.af058182.chunk.js.map +1 -0
  25. package/adminWww/static/js/{8038.cacab580.chunk.js → 8038.ae8b7862.chunk.js} +2 -2
  26. package/adminWww/static/js/8038.ae8b7862.chunk.js.map +1 -0
  27. package/adminWww/static/js/858.f34ea2c6.chunk.js +2 -0
  28. package/adminWww/static/js/858.f34ea2c6.chunk.js.map +1 -0
  29. package/adminWww/static/js/9399.5852b7e7.chunk.js +2 -0
  30. package/adminWww/static/js/9399.5852b7e7.chunk.js.map +1 -0
  31. package/adminWww/static/js/9534.2af54084.chunk.js +2 -0
  32. package/adminWww/static/js/9534.2af54084.chunk.js.map +1 -0
  33. package/adminWww/static/js/9917.3662a807.chunk.js +2 -0
  34. package/adminWww/static/js/9917.3662a807.chunk.js.map +1 -0
  35. package/adminWww/static/js/{main.c1384a82.js → main.423e60b6.js} +2 -2
  36. package/adminWww/static/js/main.423e60b6.js.map +1 -0
  37. package/build-backend/lib/passportSocket.js +8 -10
  38. package/build-backend/lib/translations.js +0 -1
  39. package/build-backend/lib/web.js +101 -81
  40. package/build-backend/main.js +173 -184
  41. package/io-package.json +14 -14
  42. package/package.json +97 -96
  43. package/adminWww/static/js/2534.0bc9912f.chunk.js +0 -2
  44. package/adminWww/static/js/2534.0bc9912f.chunk.js.map +0 -1
  45. package/adminWww/static/js/2544.4fa1eef5.chunk.js +0 -2
  46. package/adminWww/static/js/2544.4fa1eef5.chunk.js.map +0 -1
  47. package/adminWww/static/js/2816.cfab0128.chunk.js +0 -2
  48. package/adminWww/static/js/2816.cfab0128.chunk.js.map +0 -1
  49. package/adminWww/static/js/3210.4c1ccdc2.chunk.js +0 -2
  50. package/adminWww/static/js/3210.4c1ccdc2.chunk.js.map +0 -1
  51. package/adminWww/static/js/4112.8c6e6dae.chunk.js +0 -2
  52. package/adminWww/static/js/4112.8c6e6dae.chunk.js.map +0 -1
  53. package/adminWww/static/js/4579.cd86a1cb.chunk.js +0 -2
  54. package/adminWww/static/js/4579.cd86a1cb.chunk.js.map +0 -1
  55. package/adminWww/static/js/5174.60f22386.chunk.js.map +0 -1
  56. package/adminWww/static/js/530.8eed62a7.chunk.js +0 -2
  57. package/adminWww/static/js/530.8eed62a7.chunk.js.map +0 -1
  58. package/adminWww/static/js/6552.29112fa0.chunk.js +0 -2
  59. package/adminWww/static/js/6552.29112fa0.chunk.js.map +0 -1
  60. package/adminWww/static/js/6938.f4331126.chunk.js +0 -2
  61. package/adminWww/static/js/6938.f4331126.chunk.js.map +0 -1
  62. package/adminWww/static/js/8038.cacab580.chunk.js.map +0 -1
  63. package/adminWww/static/js/858.3a130f69.chunk.js +0 -2
  64. package/adminWww/static/js/858.3a130f69.chunk.js.map +0 -1
  65. package/adminWww/static/js/9399.c959c5de.chunk.js +0 -2
  66. package/adminWww/static/js/9399.c959c5de.chunk.js.map +0 -1
  67. package/adminWww/static/js/9534.68ac37f7.chunk.js +0 -2
  68. package/adminWww/static/js/9534.68ac37f7.chunk.js.map +0 -1
  69. package/adminWww/static/js/9917.28c0dbc2.chunk.js +0 -2
  70. package/adminWww/static/js/9917.28c0dbc2.chunk.js.map +0 -1
  71. package/adminWww/static/js/main.c1384a82.js.map +0 -1
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunksrc_rx=self.webpackChunksrc_rx||[]).push([[2816],{72816:(t,e,i)=>{i.r(e),i.d(e,{default:()=>P});var s=i(78269),o=i(39697),n=i(29183),a=i.n(n),r=i(84929),l=i.n(r),d=i(89303),c=i(32075),h=i(26699),p=i(78884),m=i(61204),g=i(34779),u=i(20501),f=i(99277);const x="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)",k="0 8px 17px 0 rgba(0, 0, 0, .2),0 6px 20px 0 rgba(0, 0, 0, .19)",v={root:t=>({padding:".75rem",[t.breakpoints.up("xl")]:{flex:"0 1 20%"}}),card:{display:"flex",minHeight:"235px",position:"relative",overflow:"hidden",maxHeight:"235p","&:hover":{overflowY:"auto",boxShadow:k}},cardInfo:{display:"flex",minHeight:"235px",position:"relative",overflow:"initial",maxHeight:"235p",flexDirection:"column","&:hover":{boxShadow:k}},cardInfoHead:t=>({position:"sticky",top:0,background:t.palette.background.default,display:"flex",width:"100%",justifyContent:"space-between",borderBottom:"1px solid",padding:"5px 5px 0px 5px"}),edit:{opacity:.6,userSelect:"none",pointerEvents:"none"},media:t=>({backgroundColor:"dark"===t.palette.mode?"#535353":"#e2e2e2",maxWidth:"30%"}),img:{width:120,height:"auto",padding:"2rem .5rem",maxWidth:"100%"},contentContainer:{display:"flex",flexDirection:"column",flex:1},content:{height:"170px",flexGrow:1,overflowY:"hidden"},action:{minHeight:"49px",padding:"16px 24px"},expand:{position:"absolute",right:"10px",bottom:"10px"},collapse:{minHeight:"100%",backgroundColor:"#ffffff",position:"absolute",width:"100%"},close:{right:"10px"},save:{right:"50px"},enabled:{color:"#ffffff",backgroundColor:m.A[500],position:"absolute",top:8,right:8,boxShadow:x,"&:hover":{backgroundColor:m.A[300]},"&:focus":{backgroundColor:m.A[500]}},disabled:{color:"#ffffff",backgroundColor:g.A[500],position:"absolute",top:8,right:8,boxShadow:x,"&:hover":{backgroundColor:g.A[300]},"&:focus":{backgroundColor:g.A[500]}},editButton:{color:"#ffffff",backgroundColor:g.A[500],position:"absolute",top:64,right:8,boxShadow:x,"&:hover":{backgroundColor:g.A[300]},"&:focus":{backgroundColor:g.A[500]}},deleteButton:{color:"#ffffff",backgroundColor:u.A[500],position:"absolute",top:120,right:8,boxShadow:x,"&:hover":{backgroundColor:u.A[300]},"&:focus":{backgroundColor:u.A[500]}},contentGrid:{height:"100%"},colorOrange:{color:"#ffcc80"},tooltip:{pointerEvents:"none"}};class y extends n.Component{constructor(t){super(t),this.state={expanded:!1}}static getDerivedStateFromProps(t){return t.edit?{expanded:!1}:null}handleExpandClick(){this.setState({expanded:!this.state.expanded})}renderContent(){return this.props.children}openDialog(){}renderDialogs(){return null}render(){var t,e;const i=this.props.edit?v.edit:void 0;let s=this.props.action.text||this.props.t("Link");return"object"===typeof s&&(s=s[this.props.lang]||s.en),(0,f.jsx)(d.Grid2,{size:{xs:12,sm:6,md:4,lg:3},sx:h.Utils.getStyle(this.props.theme,v.root,this.props.style),children:(0,f.jsx)(d.Link,{href:!this.props.edit&&this.props.action&&this.props.action.link?this.props.action.link:null,underline:"none",target:"_blank",rel:"noopener noreferrer",children:(0,f.jsxs)(d.Card,{sx:v.card,onClick:t=>{t.stopPropagation(),this.openDialog()},children:[this.props.showInfo&&!this.props.offline&&(0,f.jsx)(d.Button,{style:{...v.expand,...i},variant:"contained",size:"small",disabled:this.props.disabled,onClick:()=>this.handleExpandClick(),color:"primary",children:this.props.t("Info")}),(0,f.jsxs)(d.Box,{component:"div",sx:h.Utils.getStyle(this.props.theme,v.media,i,this.props.color&&{backgroundColor:this.props.color},{display:"flex",flexDirection:"column"}),children:[(0,f.jsx)(d.CardMedia,{style:v.img,component:"img",image:this.props.image}),(0,f.jsx)("div",{style:{flex:1,display:"flex",paddingBottom:"5px",paddingLeft:"5px"},children:this.props.warning?(0,f.jsx)(d.Tooltip,{title:this.props.warning,slotProps:{popper:{sx:v.tooltip}},children:(0,f.jsx)(c.Warning,{style:{alignSelf:"end",fontSize:36}})}):null})]}),(0,f.jsxs)("div",{style:{...v.contentContainer,...i},children:[(0,f.jsx)(d.CardContent,{style:v.content,children:(0,f.jsxs)(d.Grid2,{container:!0,direction:"column",wrap:"nowrap",style:v.contentGrid,children:[(0,f.jsx)(d.Typography,{gutterBottom:!0,variant:"h5",component:"h5",children:this.props.title}),this.renderContent()]})}),(null===(t=this.props.action)||void 0===t?void 0:t.link)&&(0,f.jsx)(d.Divider,{}),(null===(e=this.props.action)||void 0===e?void 0:e.link)&&(0,f.jsx)(d.CardActions,{style:v.action,children:(0,f.jsx)("div",{style:v.colorOrange,children:p.A.getText(s,this.props.lang)})})]}),this.props.showInfo&&(0,f.jsx)(d.Collapse,{style:v.collapse,in:this.state.expanded,timeout:"auto",unmountOnExit:!0,children:(0,f.jsxs)(d.Card,{sx:v.cardInfo,children:[(0,f.jsxs)(d.Box,{component:"div",sx:v.cardInfoHead,children:[(0,f.jsx)(d.Typography,{gutterBottom:!0,variant:"h5",component:"h5",children:this.props.t("Info")}),(0,f.jsxs)("div",{children:[(0,f.jsx)(d.IconButton,{size:"small",onClick:()=>{this.props.getHostDescriptionAll&&h.Utils.copyToClipboard(this.props.getHostDescriptionAll().text),this.props.openSnackBarFunc&&this.props.openSnackBarFunc()},children:(0,f.jsx)(h.IconCopy,{})}),(0,f.jsx)(d.IconButton,{size:"small",onClick:()=>this.handleExpandClick(),children:(0,f.jsx)(c.Close,{})})]})]}),(0,f.jsx)(d.CardContent,{children:this.props.getHostDescriptionAll().el})]})}),this.props.edit&&this.props.toggleActivation&&(0,f.jsx)(d.IconButton,{size:"large",sx:this.props.enabled?v.enabled:v.disabled,onClick:()=>this.props.toggleActivation(),children:(0,f.jsx)(c.Check,{})}),this.props.edit&&this.props.onEdit&&(0,f.jsx)(d.IconButton,{size:"large",sx:v.editButton,onClick:()=>this.props.onEdit(),children:(0,f.jsx)(c.Create,{})}),this.props.edit&&this.props.onRemove&&(0,f.jsx)(d.IconButton,{size:"large",sx:v.deleteButton,onClick:()=>this.props.onRemove(),children:(0,f.jsx)(c.Delete,{})}),this.renderDialogs()]})})})}}const j=y,C={rootGrid:{flexGrow:1},closeButton:t=>({position:"absolute",right:8,top:8,color:t.palette.grey[500]}),paper:{},typography:{paddingRight:30},img:{width:"100%",height:"100%",objectFit:"contain"}};class b extends n.Component{constructor(t){super(t),this.cameraUpdateTimer=void 0,this.cameraRef=void 0,this.cameraUpdateTimer=null,this.cameraRef=(0,n.createRef)()}componentDidMount(){this.props.camera&&"text"!==this.props.camera&&(this.cameraUpdateTimer=setInterval((()=>this.updateCamera()),Math.max(parseInt(this.props.interval,10),500)),this.updateCamera())}componentWillUnmount(){this.cameraUpdateTimer&&(clearInterval(this.cameraUpdateTimer),this.cameraUpdateTimer=null)}updateCamera(){if(this.cameraRef.current)if("custom"===this.props.camera){let t=this.props.cameraUrl;this.props.addTs&&(t.includes("?")?t+=`&ts=${Date.now()}`:t+=`?ts=${Date.now()}`),this.cameraRef.current.src=t}else{const t=this.props.camera.split("."),e=t.shift(),i=t.shift();this.props.socket.sendTo(`${e}.${i}`,"image",{name:t.pop(),width:this.cameraRef.current.width}).then((t=>{t&&t.data&&this.cameraRef.current&&(this.cameraRef.current.src=`data:image/jpeg;base64,${t.data}`)}))}}render(){return(0,f.jsxs)(d.Dialog,{onClose:()=>this.props.onClose(),open:!0,maxWidth:"xl",fullWidth:!0,fullScreen:!0,sx:{"& .MuiDialog-paper":C.paper},children:[(0,f.jsx)(d.DialogTitle,{children:(0,f.jsxs)(d.Typography,{component:"h2",variant:"h6",sx:{"&.MuiTypography-root":C.typography},children:[this.props.name,(0,f.jsx)(d.IconButton,{size:"large",sx:C.closeButton,onClick:()=>this.props.onClose(),children:(0,f.jsx)(c.Close,{})})]})}),(0,f.jsx)(d.DialogContent,{dividers:!0,children:(0,f.jsx)("img",{style:C.img,src:"",alt:"camera",ref:this.cameraRef})}),(0,f.jsx)(d.DialogActions,{children:(0,f.jsx)(d.Button,{variant:"contained",autoFocus:!0,onClick:t=>{t.stopPropagation(),this.props.onClose()},color:"primary",startIcon:(0,f.jsx)(c.Close,{}),children:this.props.t("Close")})})]})}}const S=b,w={cameraImg:{width:"100%",height:"100%",maxWidth:200,maxHeight:200,objectFit:"contain"},imgContainer:{height:"100%"},hidden:{display:"none"},imgSkeleton:{transform:"initial"}};const N=class extends j{constructor(t){super(t),this.cameraRef=void 0,this.cameraUpdateTimer=void 0,this.interval=void 0,Object.assign(this.state,{error:!1,dialog:!1,loaded:!1}),this.cameraRef=(0,n.createRef)(),this.cameraUpdateTimer=null,this.interval=t.interval}updateCamera(){if(this.cameraRef.current)if("custom"===this.props.camera){let t=this.props.cameraUrl;this.props.addTs&&(t.includes("?")?t+=`&ts=${Date.now()}`:t+=`?ts=${Date.now()}`),this.cameraRef.current.src=t}else{const t=this.props.camera.split("."),e=t.shift(),i=t.shift();this.props.socket.sendTo(`${e}.${i}`,"image",{name:t.pop(),width:this.cameraRef.current.width}).then((t=>{null!==t&&void 0!==t&&t.data&&this.cameraRef.current&&(this.cameraRef.current.src=`data:image/jpeg;base64,${t.data}`)})).catch((t=>window.alert(`Cannot send to instance: ${t}`)))}}componentDidMount(){this.props.camera&&"text"!==this.props.camera&&(this.cameraUpdateTimer=setInterval((()=>this.updateCamera()),Math.max(parseInt(this.props.interval,10),500)),this.updateCamera())}componentWillUnmount(){this.cameraUpdateTimer&&(clearInterval(this.cameraUpdateTimer),this.cameraUpdateTimer=null)}renderDialogs(){return this.state.dialog?(0,f.jsx)(S,{socket:this.props.socket,camera:this.props.camera,name:this.props.title,t:this.props.t,onClose:()=>{this.props.camera&&"text"!==this.props.camera&&(this.cameraUpdateTimer&&clearInterval(this.cameraUpdateTimer),this.cameraUpdateTimer=setInterval((()=>this.updateCamera()),Math.max(parseInt(this.props.interval,10),500)),this.updateCamera()),this.setState({dialog:!1})},cameraUrl:this.props.cameraUrl}):null}handleImageLoad(){this.state.loaded||this.setState({loaded:!0,error:!1})}handleImageError(){this.state.error||this.setState({loaded:!1,error:!0})}renderContent(){if("custom"===this.props.camera){let t=this.props.cameraUrl;return this.props.addTs&&(t.includes("?")?t+=`&ts=${Date.now()}`:t+=`?ts=${Date.now()}`),(0,f.jsxs)(d.Grid2,{container:!0,style:w.imgContainer,justifyContent:"center",alignItems:"center",children:[(0,f.jsx)("img",{ref:this.cameraRef,src:t,alt:"Camera",style:this.state.loaded&&!this.state.error?w.cameraImg:w.hidden,onLoad:()=>this.handleImageLoad(),onError:()=>this.handleImageError()}),!this.state.loaded&&!this.state.error&&(0,f.jsx)(d.Skeleton,{height:"100%",width:"100%",animation:"wave",style:w.imgSkeleton}),this.state.error&&(0,f.jsx)(c.Error,{fontSize:"large"})]})}return this.props.camera.startsWith("cameras.")?(0,f.jsx)("img",{ref:this.cameraRef,src:"",alt:"camera",style:w.cameraImg}):null}render(){return this.props.camera&&"text"!==this.props.camera?this.interval!==this.props.interval&&(this.interval=this.props.interval,this.cameraUpdateTimer&&clearInterval(this.cameraUpdateTimer),this.cameraUpdateTimer=setInterval((()=>this.updateCamera()),Math.max(parseInt(this.props.interval,10),500))):this.cameraUpdateTimer&&(clearInterval(this.cameraUpdateTimer),this.cameraUpdateTimer=null),super.render()}},L={formControl:{marginTop:32},rootGrid:{flexGrow:1},closeButton:t=>({position:"absolute",right:8,top:8,color:t.palette.grey[500]}),paper:{},typography:{paddingRight:30},editItem:{marginTop:8},editItemSlider:{marginTop:24},labelSlider:{marginTop:16,fontSize:"1rem"},editColor:{width:"100%"},dropZone:{width:"100%",height:100,position:"relative"},dropZoneEmpty:{},image:{height:"100%",width:"auto",objectFir:"contain"},uploadDiv:{position:"relative",width:"100%",height:100,opacity:.9},uploadDivDragging:{opacity:1},uploadCenterDiv:{margin:5,border:"3px dashed grey",borderRadius:5,width:"calc(100% - 10px)",height:"calc(100% - 10px)",position:"relative"},uploadCenterIcon:{paddingTop:10,width:48,height:48},uploadCenterText:{fontSize:16},uploadCenterTextAndIcon:{textAlign:"center",position:"absolute",top:0,bottom:0,left:0,right:0}};class D extends n.Component{constructor(t){super(t),this.state={image:"",name:t.t("New link"),link:"http://",linkName:"",color:"",desc:"",addTs:!0,interval:5e3,camera:"text",cameraList:[],...t.link}}componentDidMount(){this.getCamerasInstances()}getCamerasInstances(){this.props.socket.getAdapterInstances("cameras",!0).then((t=>{const e=[],i=[];t.forEach((t=>{const s=t._id.replace("system.adapter.","");t.common&&t.common.enabled&&i.push(this.props.socket.getState(`${t._id}.alive`).then((t=>t&&t.val&&this.props.socket.sendTo(s,"list",null))).then((t=>t&&t.list&&t.list.forEach((t=>e.push({id:t.id,name:`${t.desc} [${s}/${t.name}]`}))))))})),Promise.all(i).then((()=>this.setState({cameraList:e})))}))}static getLinkNameFromLink(t){const e=t.trim().match(/^https?:\/\/([^/:]+)(:\d+)?/);return e?e[1]+(e[2]||""):""}render(){return(0,f.jsxs)(d.Dialog,{onClose:()=>this.props.onClose(),open:!0,maxWidth:"md",fullWidth:!0,sx:{"& .MuiDialog-paper":L.paper},children:[(0,f.jsx)(d.DialogTitle,{children:(0,f.jsxs)(d.Typography,{component:"h2",variant:"h6",sx:{"&.MuiTypography-root":L.typography},children:[this.props.isNew?this.props.t("Add new link: "):this.props.t("Edit link"),(0,f.jsx)(d.IconButton,{size:"large",sx:L.closeButton,onClick:()=>this.props.onClose(),children:(0,f.jsx)(c.Close,{})})]})}),(0,f.jsx)(d.DialogContent,{dividers:!0,children:(0,f.jsxs)(d.Grid2,{style:L.rootGrid,container:!0,direction:"row",children:[(0,f.jsx)(d.Grid2,{size:{xs:12,sm:6,md:8,lg:9},children:(0,f.jsxs)(d.Grid2,{container:!0,direction:"column",children:[(0,f.jsxs)(d.FormControl,{variant:"standard",style:L.formControl,children:[(0,f.jsx)(d.InputLabel,{id:"select-helper-label",children:this.props.t("Link type")}),(0,f.jsxs)(d.Select,{variant:"standard",labelId:"select-helper-label",value:this.state.camera,onChange:t=>this.setState({camera:t.target.value}),children:[(0,f.jsx)(d.MenuItem,{value:"text",children:(0,f.jsx)("em",{children:this.props.t("Description")})},"desc"),this.state.cameraList.map((t=>(0,f.jsx)(d.MenuItem,{value:t.id,children:t.name},t.id))),(0,f.jsx)(d.MenuItem,{value:"custom",children:this.props.t("Custom camera URL")},"custom")]})]}),(0,f.jsx)(d.TextField,{variant:"standard",label:this.props.t("URL"),value:this.state.link,style:L.editItem,onChange:t=>{const e=D.getLinkNameFromLink(this.state.link);!e||this.state.linkName&&e!==this.state.linkName?this.setState({link:t.target.value}):this.setState({link:t.target.value,linkName:D.getLinkNameFromLink(t.target.value)})},slotProps:{input:{endAdornment:this.state.link?(0,f.jsx)(d.InputAdornment,{position:"end",children:(0,f.jsx)(d.IconButton,{size:"small",onClick:()=>this.setState({link:""}),children:(0,f.jsx)(c.Close,{})})}):null}}}),(0,f.jsx)(d.TextField,{variant:"standard",style:L.editItem,label:this.props.t("Name"),value:this.state.name||"",onChange:t=>this.setState({name:t.target.value}),slotProps:{input:{endAdornment:this.state.name?(0,f.jsx)(d.InputAdornment,{position:"end",children:(0,f.jsx)(d.IconButton,{size:"small",onClick:()=>this.setState({name:""}),children:(0,f.jsx)(c.Close,{})})}):null}}}),this.state.link?(0,f.jsx)(d.TextField,{variant:"standard",style:L.editItem,label:this.props.t("Link name"),value:this.state.linkName||"",onChange:t=>this.setState({linkName:t.target.value}),slotProps:{input:{endAdornment:this.state.linkName?(0,f.jsx)(d.InputAdornment,{position:"end",children:(0,f.jsx)(d.IconButton,{size:"small",onClick:()=>this.setState({linkName:""}),children:(0,f.jsx)(c.Close,{})})}):null}}}):null,"custom"===this.state.camera||"text"===this.state.camera?(0,f.jsx)(d.TextField,{variant:"standard",style:L.editItem,label:"custom"===this.state.camera?this.props.t("Camera URL"):this.props.t("Description"),value:this.state.desc||"",onChange:t=>this.setState({desc:t.target.value}),slotProps:{input:{endAdornment:this.state.desc?(0,f.jsx)(d.InputAdornment,{position:"end",children:(0,f.jsx)(d.IconButton,{size:"small",onClick:()=>this.setState({desc:""}),children:(0,f.jsx)(c.Close,{})})}):null}}}):null,"custom"===this.state.camera?(0,f.jsx)(d.FormControlLabel,{style:L.editItem,control:(0,f.jsx)(d.Checkbox,{checked:this.state.addTs,onChange:t=>this.setState({addTs:t.target.checked})}),label:this.props.t("Add timestamp to URL")}):null,"text"!==this.state.camera?(0,f.jsx)(d.Typography,{style:L.labelSlider,gutterBottom:!0,children:"Polling interval in ms"}):null,"text"!==this.state.camera?(0,f.jsx)(d.Slider,{style:L.editItemSlider,value:this.state.interval,getAriaValueText:()=>`${this.state.interval}ms`,onChange:(t,e)=>this.setState({interval:e}),step:100,min:500,max:6e4,valueLabelDisplay:"on"}):null,(0,f.jsx)("div",{style:{...L.editItem,width:50},children:(0,f.jsx)(d.TextField,{variant:"standard",fullWidth:!0,label:this.props.t("Color"),style:L.editColor,type:"color",value:this.state.color,onChange:t=>this.setState({color:t.target.value})})}),(0,f.jsx)(h.UploadImage,{disabled:!1,crop:!0,maxSize:262144,icon:this.state.image,removeIconFunc:()=>this.setState({image:""}),onChange:t=>this.setState({image:t})})]})}),(0,f.jsx)(d.Grid2,{size:{xs:12,sm:6,md:4,lg:3},children:"text"===this.state.camera?(0,f.jsx)(j,{image:this.state.image,title:this.state.name,action:{link:this.state.link,text:this.state.linkName},t:this.props.t,lang:this.props.lang,style:{width:"100% !important",maxWidth:"100% !important",marginLeft:"8px"},color:this.state.color,enabled:!0,theme:this.props.theme,children:this.state.desc}):(0,f.jsx)(N,{interval:this.state.interval,camera:this.state.camera,addTs:this.state.addTs,style:{width:"100% !important",maxWidth:"100% !important",marginLeft:"8px"},image:this.state.image,title:this.state.name,socket:this.props.socket,action:{link:this.state.link,text:this.state.linkName},t:this.props.t,lang:this.props.lang,color:this.state.color,enabled:!0,cameraUrl:this.state.desc,theme:this.props.theme})})]})}),(0,f.jsxs)(d.DialogActions,{children:[(0,f.jsx)(d.Button,{variant:"contained",autoFocus:!0,onClick:()=>{this.props.onClose({link:this.state.link,name:this.state.name,desc:this.state.desc,linkName:this.state.linkName,color:this.state.color,image:this.state.image,addTs:this.state.addTs,camera:this.state.camera,interval:this.state.interval})},color:"primary",startIcon:this.props.isNew?(0,f.jsx)(c.Add,{}):(0,f.jsx)(c.Check,{}),children:this.props.isNew?this.props.t("Add"):this.props.t("Save")}),(0,f.jsx)(d.Button,{variant:"contained",onClick:()=>this.props.onClose(),color:"grey",startIcon:(0,f.jsx)(c.Close,{}),children:this.props.t("Close")})]})]})}}const I=D;class T extends a().Component{constructor(t){super(t),this.state={inProgress:!1,success:!1,error:"",finished:!1}}render(){return(0,f.jsxs)(d.Dialog,{open:!0,maxWidth:"lg",fullWidth:!0,children:[(0,f.jsx)(d.DialogTitle,{children:h.I18n.t("Node.js upgrade")}),(0,f.jsxs)(d.DialogContent,{style:{height:100,padding:"0 20px",overflow:"hidden"},children:[this.state.finished?null:(0,f.jsx)(d.Typography,{children:h.I18n.t("Performing this update will restart the js-controller afterwards!")}),this.state.inProgress?(0,f.jsx)(d.Box,{sx:{display:"flex",justifyContent:"center"},children:(0,f.jsx)(d.CircularProgress,{})}):null,this.state.success?(0,f.jsx)(d.Typography,{children:h.I18n.t("Node.js update successful, restarting controller now!")}):null,this.state.error?(0,f.jsx)(d.Typography,{sx:{color:"red"},children:h.I18n.t("Node.js update failed: %s",this.state.error)}):null]}),(0,f.jsxs)(d.DialogActions,{children:[(0,f.jsx)(d.Button,{disabled:this.state.inProgress||this.state.finished,color:"primary",variant:"contained",startIcon:(0,f.jsx)(c.Refresh,{}),onClick:()=>this.updateNodeJsVersion(),children:h.I18n.t("Upgrade")}),(0,f.jsx)(d.Button,{disabled:this.state.inProgress,variant:"contained",onClick:()=>{this.props.onClose()},color:"primary",startIcon:(0,f.jsx)(c.Close,{}),children:h.I18n.t("Close")})]})]})}async updateNodeJsVersion(){this.setState({inProgress:!0});const t=await this.props.socket.upgradeOsPackages(this.props.hostId,[{name:"nodejs"}],!0);this.setState({inProgress:!1,success:t.success,error:t.error,finished:!0})}}const O={root:{width:"100%",height:"100%"},button:{position:"absolute",bottom:16,right:16},saveButton:t=>({backgroundColor:t.palette.success.main,right:80,"&:hover":{backgroundColor:t.palette.success.dark}}),addButton:t=>({backgroundColor:t.palette.secondary.main,right:144,"&:hover":{backgroundColor:t.palette.secondary.dark}}),closeButton:t=>({backgroundColor:t.palette.error.main,"&:hover":{backgroundColor:t.palette.error.dark}}),bold:{fontWeight:"bold"},container:{overflowY:"auto"},hostOffline:{color:"#bb0000"},updateExists:{color:"#c28700",marginRight:4},updateNo:{color:"#00b204",marginRight:4},nodeUpdate:{opacity:.6},instanceNumber:{opacity:.7,fontSize:16},updateIcon:{cursor:"pointer",fontSize:16},tooltip:{pointerEvents:"none"}},A={Uptime:p.A.formatSeconds,"System uptime":p.A.formatSeconds,RAM:p.A.formatRam,Speed:p.A.formatSpeed,"Disk size":p.A.formatBytes,"Disk free":p.A.formatBytes};var U=(0,o.A)("THRESHOLD_TIME_DIFF_MS"),_=(0,o.A)("ONE_MINUTE_MS");class $ extends a().Component{constructor(t){super(t),Object.defineProperty(this,U,{writable:!0,value:18e5}),Object.defineProperty(this,_,{writable:!0,value:6e4}),this.currentProxyPath=window.location.pathname,this.introLinksOriginal=void 0,this.deactivatedOriginal=void 0,this.t=void 0,this.getDataTimeout=void 0,this.updateHostsAlive=async t=>{const e=JSON.parse(JSON.stringify(this.state.alive)),i=[];if(t.find((t=>"deleted"===t.type)))this.getDataDelayed();else if(t.forEach((t=>{!!e[t.id]!==!!t.alive&&(e[t.id]=t.alive,i.push(t.id))})),i.length){const t=JSON.parse(JSON.stringify(this.state.hostsData));(await Promise.all(i.map((t=>this.getHostData(t,e[t]))))).forEach((e=>t[e.id]=this.preprocessHostData(e.data))),this.setState({alive:e,hostsData:t},(()=>this.checkBackendTime()))}},this.updateHosts=t=>{let e=[];if(t.find((t=>!t.obj)))this.getDataDelayed();else if(e=t.map((t=>t.id)),e.length){const t=JSON.parse(JSON.stringify(this.state.hostsData));Promise.all(e.map((t=>this.getHostData(t)))).then((e=>{e.forEach((e=>t[e.id]=this.preprocessHostData(e.data))),this.setState({hostsData:t})}))}},this.getDataDelayed=t=>{this.getDataTimeout&&clearTimeout(this.getDataTimeout),this.getDataTimeout=setTimeout((()=>{this.getDataTimeout=void 0,this.getData(!0)}),300)},this.state={instances:null,deactivated:[],edit:!1,link:null,introLinks:[],editLink:!1,editLinkIndex:-1,openSnackBar:!1,hasUnsavedChanges:!1,reverseProxy:null,alive:{},hostsData:{},hosts:null,hostTimeDiffMap:new Map,nodeUpdateSupported:!1,nodeUpdateDialog:null},this.t=t.t}async checkBackendTime(){const t=this.state.hostTimeDiffMap;for(const[e,i]of Object.entries(this.state.hostsData)){const s=new Date,o=Math.abs(i.time-s.getTime());t.set(e,o)}this.setState({hostTimeDiffMap:t})}async componentDidMount(){var t;await this.getData(),this.props.instancesWorker.registerHandler(this.getDataDelayed),this.props.hostsWorker.registerHandler(this.updateHosts),this.props.hostsWorker.registerAliveHandler(this.updateHostsAlive);const e=await this.props.socket.checkFeatureSupported("CONTROLLER_OS_PACKAGE_UPGRADE"),i=await this.props.socket.getObject(`system.adapter.${this.props.adminInstance}`);this.setState({nodeUpdateSupported:e,reverseProxy:(null===i||void 0===i||null===(t=i.native)||void 0===t?void 0:t.reverseProxy)||[]}),await this.checkBackendTime()}componentWillUnmount(){this.getDataTimeout&&(clearTimeout(this.getDataTimeout),this.getDataTimeout=void 0),this.props.instancesWorker.unregisterHandler(this.getDataDelayed),this.props.hostsWorker.unregisterHandler(this.updateHosts),this.props.hostsWorker.unregisterAliveHandler(this.updateHostsAlive)}async activateEditMode(){var t;const e=await this.props.socket.getSystemConfig(!0),i=await this.getInstances(!0,null,e),s=null!==e&&void 0!==e&&null!==(t=e.native)&&void 0!==t&&t.introLinks?e.native.introLinks:[];this.introLinksOriginal=JSON.stringify(s),this.deactivatedOriginal=JSON.parse(JSON.stringify(i.deactivated)),this.setState({instances:i.instances,deactivated:i.deactivated,edit:!0,introLinks:s,hasUnsavedChanges:!1})}deactivateEditMode(){this.state.hasUnsavedChanges,this.setState({deactivated:this.deactivatedOriginal,introLinks:JSON.parse(this.introLinksOriginal),hasUnsavedChanges:!1,edit:!1},(()=>{this.deactivatedOriginal=null,this.introLinksOriginal=null}))}toggleCard(t,e){if(!this.state.instances||!this.state.instances.length)return;const i=JSON.parse(JSON.stringify(this.state.deactivated)),s=i.indexOf(`${t}_${e}`);-1!==s?i.splice(s,1):(i.push(`${t}_${e}`),i.sort());const o=JSON.stringify(i)!==JSON.stringify(this.deactivatedOriginal)||JSON.stringify(this.state.introLinks)!==this.introLinksOriginal;this.setState({deactivated:i,hasUnsavedChanges:o})}getInstancesCards(){var t;return null===(t=this.state.instances)||void 0===t?void 0:t.map((t=>{var e;const i=!(null!==(e=this.state.deactivated)&&void 0!==e&&e.includes(`${t.id}_${t.linkName}`));if(i||this.state.edit){var o;let e=t.link?t.link.replace(/^https?:\/\//,""):"";if(e=e.split("/")[0],t.id===this.props.adminInstance)return null;let a=window.isFinite(t.id.split(".").pop());var n;if(a)a=!(null===(n=this.state.instances)||void 0===n||!n.find((e=>e.id!==t.id&&t.name===e.name&&t.id.split(".")[0]===e.id.split(".")[0])));const r=this.state.hostsData?this.state.hostsData[t.id]:null,l=null!==(o=this.state.hostTimeDiffMap.get(t.id))&&void 0!==o?o:0;return(0,f.jsx)(j,{image:t.image,title:(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)("span",{style:t.name&&t.name.length>12?{fontSize:"1rem"}:void 0,children:t.name}),a?(0,f.jsxs)("span",{style:O.instanceNumber,children:[".",t.id.split(".").pop()]}):null]}),action:{link:t.link,text:e},t:this.props.t,lang:this.props.lang,color:t.color,showInfo:!!t.info,edit:this.state.edit,offline:r&&!1===r.alive,warning:l>(0,s.A)(this,U)[U]?this.t("Backend time differs by %s minutes",Math.round(l/(0,s.A)(this,_)[_]).toString()):null,enabled:i,disabled:!r||"object"!==typeof r,getHostDescriptionAll:()=>this.getHostDescriptionAll(t.id),toggleActivation:()=>this.toggleCard(t.id,t.linkName),openSnackBarFunc:()=>this.setState({openSnackBar:!0}),theme:this.props.theme,children:t.description||this.getHostDescription(t.id)},`${t.id}_${t.link}`)}return null}))}toggleLinkCard(t){const e=JSON.parse(JSON.stringify(this.state.introLinks));e[t].enabled=!e[t].enabled;const i=JSON.stringify(this.state.deactivated)!==JSON.stringify(this.deactivatedOriginal)||JSON.stringify(e)!==this.introLinksOriginal;this.setState({introLinks:e,hasUnsavedChanges:i})}getLinkCards(){var t;return null===(t=this.state.introLinks)||void 0===t?void 0:t.map(((t,e)=>t.enabled||this.state.edit?"custom"===t.camera?(0,f.jsx)(N,{image:t.image,title:t.name,action:{link:t.link,text:t.linkName},t:this.props.t,socket:this.props.socket,color:t.color,edit:this.state.edit,interval:t.interval,camera:t.camera,addTs:t.addTs,onEdit:()=>{var t;return this.setState({editLink:!0,editLinkIndex:e,link:JSON.parse(JSON.stringify(null===(t=this.state.introLinks)||void 0===t?void 0:t[e]))})},onRemove:()=>{const t=JSON.parse(JSON.stringify(this.state.introLinks));t.splice(e,1);const i=JSON.stringify(this.state.deactivated)!==JSON.stringify(this.deactivatedOriginal)||JSON.stringify(t)!==this.introLinksOriginal;this.setState({introLinks:t,hasUnsavedChanges:i})},enabled:t.enabled,lang:this.props.lang,toggleActivation:()=>this.toggleLinkCard(e),cameraUrl:t.desc,theme:this.props.theme},`link${e}`):(0,f.jsx)(j,{image:t.image,title:t.name,action:{link:t.link,text:t.linkName},t:this.props.t,color:t.color,edit:this.state.edit,onEdit:()=>{var t;return this.setState({editLink:!0,editLinkIndex:e,link:JSON.parse(JSON.stringify(null===(t=this.state.introLinks)||void 0===t?void 0:t[e]))})},onRemove:()=>{const t=JSON.parse(JSON.stringify(this.state.introLinks));t.splice(e,1);const i=JSON.stringify(this.state.deactivated)!==JSON.stringify(this.deactivatedOriginal)||JSON.stringify(t)!==this.introLinksOriginal;this.setState({introLinks:t,hasUnsavedChanges:i})},enabled:t.enabled,lang:this.props.lang,toggleActivation:()=>this.toggleLinkCard(e),theme:this.props.theme,children:t.desc||""},`link${e}`):null))}editLinkCard(){return this.state.editLink?(0,f.jsx)(I,{link:this.state.link,socket:this.props.socket,isNew:-1===this.state.editLinkIndex,t:this.props.t,lang:this.props.lang,theme:this.props.theme,onClose:t=>{if(t){const e=JSON.parse(JSON.stringify(this.state.introLinks));-1===this.state.editLinkIndex?(t.enabled=!0,e.push(t)):(t.enabled=e[this.state.editLinkIndex].enabled,e[this.state.editLinkIndex]=t);const i=JSON.stringify(this.state.deactivated)!==JSON.stringify(this.deactivatedOriginal)||JSON.stringify(e)!==this.introLinksOriginal;this.setState({introLinks:e,editLink:!1,hasUnsavedChanges:i,link:null})}else this.setState({editLink:!1})}}):null}getButtons(){const t=[];return this.state.edit?(t.push((0,f.jsx)(d.Fab,{color:"primary",size:"small",sx:h.Utils.getStyle(this.props.theme,O.button,O.addButton),onClick:()=>this.setState({editLink:!0,editLinkIndex:-1,link:{}}),children:(0,f.jsx)(c.Add,{})},"add")),t.push((0,f.jsx)(d.Fab,{size:"small",color:"primary",disabled:!this.state.hasUnsavedChanges,sx:h.Utils.getStyle(this.props.theme,O.button,O.saveButton),onClick:()=>this.saveCards(),children:(0,f.jsx)(c.Check,{})},"save")),t.push((0,f.jsx)(d.Fab,{size:"small",color:"primary",sx:h.Utils.getStyle(this.props.theme,O.button,O.closeButton),onClick:()=>this.deactivateEditMode(),children:(0,f.jsx)(c.Close,{})},"close"))):t.push((0,f.jsx)(d.Fab,{color:"primary",size:"small",style:O.button,onClick:()=>this.activateEditMode(),children:(0,f.jsx)(c.Create,{})},"edit")),t}async saveCards(){const t=await this.props.socket.getSystemConfig(!0);let e=!1;JSON.stringify(t.common.intro)!==JSON.stringify(this.state.deactivated)&&(t.common.intro=this.state.deactivated,e=!0),e||JSON.stringify(t.native.introLinks)===JSON.stringify(this.state.introLinks)||(e=!0,t.native.introLinks=this.state.introLinks),e?this.props.socket.setSystemConfig(t).then((()=>this.props.showAlert("Updated","success"))).catch((t=>{console.log(t),this.props.showAlert(t,"error")})).then((()=>this.setState({edit:!1}))):this.setState({edit:!1})}async getHostData(t,e){var i;let s;if(void 0!==e)s={val:e};else try{s=await this.props.socket.getState(`${t}.alive`)}catch(a){console.error(`Cannot get state ${t}.alive: ${a}`),s={val:!1}}let o={alive:!1};if(null!==(i=s)&&void 0!==i&&i.val)try{o=await this.props.socket.getHostInfo(t,!1,1e4),o&&"object"===typeof o&&!1!==o.alive&&(o.alive=!0)}catch(a){console.error(`Cannot get host info for ${t}: ${a}`),o={alive:!1}}else o={alive:!1};const n=await this.props.socket.getForeignStates(`${t}.versions.*`);return Object.keys(n).forEach((t=>o[`_${t.split(".").pop()}`]=n[t].val)),{id:t,data:o}}async getHostsData(t){const e=t.map((t=>this.getHostData(t._id))),i=await Promise.all(e),s={},o={};return i.forEach((t=>{s[t.id]=this.preprocessHostData(t.data),o[t.id]=t.data.alive})),{hostsData:s,alive:o}}static applyReverseProxy(t,e,i){null===t||void 0===t||t.paths.forEach((t=>{if(t.instance===i.id)i.link=t.path;else if(t.instance.startsWith("web.")){var s;const o=e[`system.adapter.${t.instance}`];if(null!==o&&void 0!==o&&null!==(s=o.native)&&void 0!==s&&s.port&&i.link.includes(`:${o.native.port}`)){const e=new RegExp(`^.*:${o.native.port}/`);i.link&&(i.link=i.link.replace(e,t.path)),console.log(i.link)}}}))}addLinks(t,e,i,s,o,n){var a;const r={id:t.id,name:t.name,description:t.description,color:t.color,image:t.icon,info:""},l=p.A.replaceLink(t.link,e.name,i,{instances:s,hostname:this.props.hostname,adminInstance:this.props.adminInstance,hosts:o});let d=null;if(null!==(a=this.state.reverseProxy)&&void 0!==a&&a.length&&(d=this.state.reverseProxy.find((t=>t.globalPath===this.currentProxyPath))),1===l.length){r.link=l[0].url,r.port=l[0].port,$.applyReverseProxy(d,s,r);const t=n.find((t=>t.link===r.link));t?console.log(`Double links: "${r.id}" and "${t.id}"`):n.push(r)}else l.length>1&&l.forEach((t=>{const e=n.find((e=>e.link===t.url));if(e)console.log(`Double links: "${r.id}" and "${e.id}"`);else{const e={...r,link:t.url,port:t.port};$.applyReverseProxy(d,s,e),n.push(e)}}))}static getText(t,e){return t?"object"===typeof t?t[e]||t.en||"":t||"":""}static normalizeLinks(t,e,i){if(!t.common.localLinks&&!t.common.localLink&&!t.common.welcomeScreen&&!t.common.welcomeScreenPro)return null;const s={id:t._id.replace("system.adapter.",""),link:"",name:$.getText(t.common.titleLang||t.common.title||t.common.name,e),order:1e3,intro:!0,description:$.getText(t.common.desc,e),icon:t.common.icon?`adapter/${t.common.name}/${t.common.icon}`:"img/no-image.png"};let o=[];if(t.common.localLink)if("string"===typeof t.common.localLink)o.push({...s,link:t.common.localLink});else{const e=t.common.localLink;if(e.link){const t={...s,link:e.link};e.color&&(t.color=e.color),void 0!==e.order&&"number"===typeof e.order&&(t.order=e.order),e.icon&&e.img&&(t.icon=e.icon||e.img),o.push(t)}else console.warn(`Unknown localLink structure: ${JSON.stringify(t.common.localLink)}`)}if(t.common.localLinks&&"object"===typeof t.common.localLinks&&Object.keys(t.common.localLinks).forEach((i=>{const n=t.common.localLinks[i];if("string"===typeof n)o.push({...s,link:n});else{const a=n;if(a.link){const n={...s,id:t._id.replace("system.adapter.","")+("_default"===i?"":` ${i}`),link:a.link,name:s.name+("_default"===i?"":` ${i}`)};a.color&&(n.color=a.color),void 0!==a.order&&(n.order=parseInt(a.order,10)||1e3),a.icon&&a.img&&(n.icon=a.icon||a.img),a.description&&(n.description=$.getText(a.description,e)),void 0!==a.pro&&("string"===typeof a.pro?n.pro=a.pro:n.pro=`${t.common.name}/index.html`),void 0!==a.cloud&&(n.cloud=a.cloud),void 0!==a.intro&&(n.intro=!0===a.intro),a.name&&(n.name=$.getText(a.name,e)),"_default"===i&&(n.default=!0),o.push(n)}else console.warn(`Unknown localLinks structure: ${JSON.stringify(n)}`)}})),t.common.welcomeScreen&&"object"===typeof t.common.welcomeScreen){if((Array.isArray(t.common.welcomeScreen)?t.common.welcomeScreen:[t.common.welcomeScreen]).forEach((i=>{if(i.link){const n={...s,id:`${t._id.replace("system.adapter.","")} cloud`,link:`%web_protocol%://%web_bind%:%web_port%/${i.link}`,cloud:i.link};if(i.color&&(n.color=i.color),void 0!==i.order&&"number"===typeof i.order&&(n.order=i.order),i.icon&&i.img&&(n.icon=i.icon||i.img),i.localLinks){const e=t.common.localLinks[i.localLinks];e&&"string"===typeof e?n.link=e:e&&"object"===typeof e&&e.link&&(n.link=e.link)}i.name&&(n.name=$.getText(i.name,e)),o.push(n)}})),t.common.welcomeScreenPro&&"object"===typeof t.common.welcomeScreenPro){(Array.isArray(t.common.welcomeScreenPro)?t.common.welcomeScreenPro:[t.common.welcomeScreenPro]).forEach((i=>{if(i.link){const n={...s,id:`${t._id.replace("system.adapter.","")} pro`,link:`%web_protocol%://%web_bind%:%web_port%/${i.link}`,pro:i.link};if(i.color&&(n.color=i.color),void 0!==i.order&&"number"===typeof i.order&&(n.order=i.order),i.icon&&i.img&&(n.icon=i.icon||i.img),i.localLinks){const e=t.common.localLinks[i.localLinks];e&&"string"===typeof e?n.link=e:e&&"object"===typeof e&&e.link&&(n.link=e.link)}i.name&&(n.name=$.getText(i.name,e)),o.push(n)}}))}}if(o.forEach((e=>{e.icon.startsWith("adapter/")||e.icon.startsWith("data:image/")||e.icon.startsWith("http://")||e.icon.startsWith("https://")||"img/no-image.png"===e.icon||(e.icon=`adapter/${t.common.name}/${e.icon}`),e.link=e.link.replace(/%ip%/g,"%web_bind%")})),i){const t={};o.forEach((e=>{t[e.link]?(e.color&&(t[e.link].color=e.color),e.icon&&(t[e.link].icon=e.icon),e.cloud&&(t[e.link].cloud=e.cloud),e.pro&&(t[e.link].pro=e.pro),void 0!==e.intro&&(t[e.link].intro=e.intro),e.name&&"object"===typeof e.name&&(t[e.link].name=e.name),void 0!==e.order&&(t[e.link].order=e.order),e.default&&(t[e.link].default=e.default)):t[e.link]=e})),o=Object.values(t)}return o.sort(((t,e)=>void 0===t.default&&void 0===e.default?void 0===t.order&&void 0===e.order?0:void 0===t.order?-1:void 0===e.order?1:t.order-e.order:void 0===t.default?-1:void 0===e.default?1:void 0===t.order&&void 0===e.order?0:void 0===t.order?-1:void 0===e.order?1:t.order-e.order)),o}async getInstances(t,e,i){e=e||this.state.hosts;const s={};e.forEach((t=>s[t._id]=t));try{var o;const n=await this.props.socket.getAdapterInstances("",t);let a=i.common.intro||[];Array.isArray(a)||(a=Object.keys(a),a.sort());const r=[],l={};n.forEach((t=>l[t._id]=t)),n.sort(((t,e)=>{var i,s;const o=null!==(i=null===t||void 0===t?void 0:t.common)&&void 0!==i?i:{},n=null!==(s=null===e||void 0===e?void 0:e.common)&&void 0!==s?s:{};if(void 0===o.order&&void 0===n.order){let t,e;if("object"===typeof o.name){const e=o.name;t=e[this.props.lang]||e.en}else t=o.name||"";if("object"===typeof n.name){const t=n.name;e=t[this.props.lang]||t.en}else e=n.name||"";return t.toLowerCase()>e.toLowerCase()?1:t.toLowerCase()<e.toLowerCase()?-1:0}if(void 0===o.order)return-1;if(void 0===n.order)return 1;if(o.order>n.order)return 1;if(o.order<n.order)return-1;let a,r;if("object"===typeof o.name){const t=o.name;a=t[this.props.lang]||t.en}else a=o.name||"";if("object"===typeof n.name){const t=n.name;r=t[this.props.lang]||t.en}else r=n.name||"";return a.toLowerCase()>r.toLowerCase()?1:a.toLowerCase()<r.toLowerCase()?-1:0})),n.forEach((t=>{if(!t)return;const e=t.common||null,i=t._id.split("."),o=parseInt(i.pop(),10);let n;if(null!==e&&void 0!==e&&e.name&&"object"===typeof e.name){const t=null===e||void 0===e?void 0:e.name;n=t[this.props.lang]||t.en}else n=(null===e||void 0===e?void 0:e.name)||"";if(("admin"!==n||e.localLink!==(this.props.hostname||""))&&"web"!==n&&(!n||"vis-web-admin"===n||!n.match(/^vis-/)||"vis-2"===n)&&(!n||!n.match(/^icons-/))&&e&&(e.enabled||e.onlyWWW)){const i=$.normalizeLinks(t,this.props.lang,!0);i&&i.forEach((t=>this.addLinks(t,e,o,l,s,r)))}})),r.forEach((t=>{t.link&&(t.linkName=t.link.replace("https://","").replace("http://","").replace(/^[^_]+:/,""))})),r.sort(((t,e)=>{if(void 0!==t.order||void 0!==e.order){if(t.order=void 0===t.order?1e3:t.order,e.order=void 0===e.order?1e3:e.order,t.order<e.order)return-1;if(t.order>e.order)return 1}return t.id>e.id?1:t.id<e.id?-1:0})),null===(o=e)||void 0===o||o.forEach((t=>{const e=null===t||void 0===t?void 0:t.common;let i=null===e||void 0===e?void 0:e.name;if("object"===typeof i&&i&&(i=i[this.props.lang]||i.en),e){const s={id:t._id,name:i||"",color:"",image:e.icon||"img/no-image.png",info:this.t("Info"),linkName:""};r.push(s)}}));const d=[];return a.forEach((t=>{r.find((e=>t===`${e.id}_${e.linkName}`))&&d.push(t)})),a=d,{instances:r,deactivated:a}}catch(n){return console.log(n),{instances:[],deactivated:[]}}}getHostDescription(t){const e=this.state.hostsData?this.state.hostsData[t]:null;if(e&&!1===e.alive)return(0,f.jsx)("div",{style:O.hostOffline,children:this.props.t("Offline")});let i="",s="";if(e){try{e._nodeNewest&&e["Node.js"]&&l().gt(e._nodeNewest,e["Node.js"].replace(/^v/,""))&&(i=e._nodeNewest)}catch{}try{e._nodeNewest!==e._nodeNewestNext&&e._nodeNewestNext&&e["Node.js"]&&e._nodeNewest&&l().gt(e._nodeNewestNext,e["Node.js"].replace(/^v/,""))&&l().gt(e._nodeNewestNext,e._nodeNewest)&&(i+=(i?" / ":"")+e._nodeNewestNext)}catch{}if(i){const s=this.state.nodeUpdateSupported&&"linux"===e.Platform;i=(0,f.jsx)(d.Tooltip,{title:this.props.t("Some updates available"),slotProps:{popper:{sx:O.tooltip}},children:(0,f.jsxs)("span",{style:{...O.nodeUpdate,display:"inline-flex"},children:["(",i,")",s?(0,f.jsx)(c.Refresh,{style:O.updateIcon,onClick:()=>this.setState({nodeUpdateDialog:{hostId:t,version:e._nodeNewestNext}})}):null]})})}try{e._npmNewest&&e.NPM&&l().gt(e._npmNewest,e.NPM)&&(s=e._npmNewest)}catch{}try{e._npmNewest!==e._npmNewestNext&&e._npmNewestNext&&e.NPM&&e._npmNewest&&l().gt(e._npmNewestNext,e.NPM)&&l().gt(e._npmNewestNext,e._npmNewest)&&(s+=(s?" / ":"")+e._npmNewestNext)}catch{}s&&(s=(0,f.jsx)(d.Tooltip,{title:this.props.t("Some updates available"),slotProps:{popper:{sx:O.tooltip}},children:(0,f.jsxs)("span",{style:O.nodeUpdate,children:["(",s,")"]})}))}return e&&"object"===typeof e?(0,f.jsxs)("ul",{style:{textTransform:"none"},children:[(0,f.jsx)("li",{children:(0,f.jsxs)("span",{children:[(0,f.jsxs)("span",{style:O.bold,children:[this.t("Platform"),":"," "]}),e.Platform||"--"]})}),(0,f.jsx)("li",{children:(0,f.jsxs)("span",{children:[(0,f.jsxs)("span",{style:O.bold,children:[this.t("RAM"),":"," "]}),A.RAM(e.RAM)]})}),(0,f.jsx)("li",{children:(0,f.jsxs)("span",{children:[(0,f.jsxs)("span",{style:O.bold,children:[this.t("Node.js"),":"," "]}),(0,f.jsx)("span",{style:i?O.updateExists:O.updateNo,children:e["Node.js"]||"--"}),i]})}),(0,f.jsx)("li",{children:(0,f.jsxs)("span",{children:[(0,f.jsxs)("span",{style:O.bold,children:[this.t("NPM"),":"," "]}),(0,f.jsx)("span",{className:s?O.updateExists:O.updateNo,children:e.NPM||"--"}),s]})})]}):(0,f.jsxs)("ul",{children:[(0,f.jsx)(d.Skeleton,{}),(0,f.jsx)(d.Skeleton,{}),(0,f.jsx)(d.Skeleton,{}),(0,f.jsx)(d.Skeleton,{})]})}getHostDescriptionAll(t){const e=this.state.hostsData?this.state.hostsData[t]:null;return{el:(0,f.jsx)("ul",{style:{textTransform:"none"},children:e&&"object"===typeof e&&Object.keys(e).filter((t=>!t.startsWith("_")&&null!==e[t]&&void 0!==e[t])).map((t=>(0,f.jsx)("li",{children:e&&"object"===typeof e?(0,f.jsxs)("span",{children:[(0,f.jsxs)("span",{style:O.bold,children:[this.t(t),":"," "]}),A[t]?A[t](e[t],this.t):("object"===typeof e[t]?JSON.stringify(e[t]):e[t].toString())||"--"]}):(0,f.jsx)(d.Skeleton,{})},t)))}),text:e&&"object"===typeof e?Object.keys(e).reduce(((t,i)=>`${t}${this.t(i)}:${A[i]?A[i](e[i],this.t):e[i]||"--"}\n`)):""}}async getData(t){try{const e=await this.props.socket.getSystemConfig(t),i=await this.props.socket.getCompactHosts(t),s=await this.getInstances(t,i,e);this.setState({instances:s.instances,hosts:i,deactivated:s.deactivated,introLinks:e&&e.native&&e.native.introLinks?e.native.introLinks:[]});const o=await this.getHostsData(i);await new Promise((t=>{this.setState(o,(()=>t()))}))}catch(e){window.alert(`Cannot get data: ${e}`)}}renderCopiedToast(){return(0,f.jsx)(d.Snackbar,{anchorOrigin:{vertical:"bottom",horizontal:"left"},open:this.state.openSnackBar,autoHideDuration:3e3,onClose:()=>this.setState({openSnackBar:!1}),message:this.t("copied")})}render(){return this.state.instances?(0,f.jsxs)(h.TabContainer,{elevation:0,overflow:"visible",children:[this.renderCopiedToast(),this.state.nodeUpdateDialog?(0,f.jsx)(T,{onClose:()=>this.setState({nodeUpdateDialog:null}),socket:this.props.socket,...this.state.nodeUpdateDialog}):null,(0,f.jsxs)(h.TabContent,{style:O.container,children:[(0,f.jsx)(f.Fragment,{children:(0,f.jsxs)(d.Grid2,{className:"denis",container:!0,spacing:1,columns:{xs:12,md:12,lg:12,sm:12},children:[this.getInstancesCards(),this.getLinkCards()]})}),this.getButtons(),this.editLinkCard()]})]}):(0,f.jsx)(d.LinearProgress,{})}preprocessHostData(t){var e;if(null!==(e=t.dockerInformation)&&void 0!==e&&e.isDocker){let e=t.dockerInformation.isOfficial?"official image":"unofficial image";t.dockerInformation.isOfficial&&(e+=` - ${t.dockerInformation.officialVersion}`),t.Platform=`${t.Platform} (${e})`}return delete t.dockerInformation,t}}const P=$},78269:(t,e,i)=>{function s(t,e){if(!{}.hasOwnProperty.call(t,e))throw new TypeError("attempted to use private field on non-instance");return t}i.d(e,{A:()=>s})},39697:(t,e,i)=>{i.d(e,{A:()=>o});var s=0;function o(t){return"__private_"+s+++"_"+t}}}]);
2
- //# sourceMappingURL=2816.cfab0128.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/js/2816.cfab0128.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 } from 'react';\r\n\r\nimport {\r\n Button, Card, CardActions, CardContent,\r\n CardMedia, Collapse, Divider,\r\n Grid2, IconButton, Link, Typography,\r\n Tooltip, Box,\r\n} from '@mui/material';\r\n\r\nimport {\r\n Check as CheckIcon,\r\n Create as EditIcon,\r\n Close as CloseIcon,\r\n Delete as DeleteIcon,\r\n Warning as WarningIcon,\r\n} from '@mui/icons-material';\r\n\r\nimport { blue, grey, red } from '@mui/material/colors';\r\n\r\nimport {\r\n Utils,\r\n IconCopy as SaveIcon,\r\n type IobTheme,\r\n type Translate,\r\n} from '@iobroker/adapter-react-v5';\r\n\r\nimport AdminUtils from '../../AdminUtils';\r\n\r\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)';\r\nconst boxShadowHover = '0 8px 17px 0 rgba(0, 0, 0, .2),0 6px 20px 0 rgba(0, 0, 0, .19)';\r\n\r\nexport const styles: Record<string, any> = {\r\n root: (theme: IobTheme) => ({\r\n padding: '.75rem',\r\n [theme.breakpoints.up('xl')]: {\r\n flex: '0 1 20%',\r\n },\r\n }),\r\n card: {\r\n display: 'flex',\r\n minHeight: '235px',\r\n position: 'relative',\r\n overflow: 'hidden',\r\n maxHeight: '235p',\r\n '&:hover': {\r\n overflowY: 'auto',\r\n boxShadow: boxShadowHover,\r\n },\r\n },\r\n cardInfo: {\r\n display: 'flex',\r\n minHeight: '235px',\r\n position: 'relative',\r\n overflow: 'initial',\r\n maxHeight: '235p',\r\n flexDirection: 'column',\r\n '&:hover': {\r\n // overflowY: 'auto',\r\n boxShadow: boxShadowHover,\r\n },\r\n },\r\n cardInfoHead: (theme: IobTheme) => ({\r\n position: 'sticky',\r\n top: 0,\r\n background: theme.palette.background.default,\r\n display: 'flex',\r\n width: '100%',\r\n justifyContent: 'space-between',\r\n borderBottom: '1px solid',\r\n padding: '5px 5px 0px 5px',\r\n }),\r\n edit: {\r\n opacity: 0.6,\r\n userSelect: 'none',\r\n pointerEvents: 'none',\r\n },\r\n media: (theme: IobTheme) => ({\r\n backgroundColor: theme.palette.mode === 'dark' ? '#535353' : '#e2e2e2',\r\n maxWidth: '30%',\r\n }),\r\n img: {\r\n width: 120,\r\n height: 'auto',\r\n padding: '2rem .5rem',\r\n maxWidth: '100%',\r\n },\r\n contentContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: 1,\r\n },\r\n content: {\r\n height: '170px',\r\n flexGrow: 1,\r\n overflowY: 'hidden',\r\n },\r\n action: {\r\n minHeight: '49px',\r\n padding: '16px 24px',\r\n },\r\n expand: {\r\n position: 'absolute',\r\n right: '10px',\r\n bottom: '10px',\r\n },\r\n collapse: {\r\n minHeight: '100%',\r\n backgroundColor: '#ffffff',\r\n position: 'absolute',\r\n width: '100%',\r\n // '& button': {\r\n // position: 'absolute',\r\n // top: '10px',\r\n // color: '#000000',\r\n // '&:focus': {\r\n // color: '#ffffff',\r\n // backgroundColor: blue[500]\r\n // }\r\n // }\r\n },\r\n close: {\r\n right: '10px',\r\n },\r\n save: {\r\n right: '50px',\r\n },\r\n enabled: {\r\n color: '#ffffff',\r\n backgroundColor: blue[500],\r\n position: 'absolute',\r\n top: 8,\r\n right: 8,\r\n boxShadow,\r\n '&:hover': {\r\n backgroundColor: blue[300],\r\n },\r\n '&:focus': {\r\n backgroundColor: blue[500],\r\n },\r\n },\r\n disabled: {\r\n color: '#ffffff',\r\n backgroundColor: grey[500],\r\n position: 'absolute',\r\n top: 8,\r\n right: 8,\r\n boxShadow,\r\n '&:hover': {\r\n backgroundColor: grey[300],\r\n },\r\n '&:focus': {\r\n backgroundColor: grey[500],\r\n },\r\n },\r\n editButton: {\r\n color: '#ffffff',\r\n backgroundColor: grey[500],\r\n position: 'absolute',\r\n top: 16 + 48, // 48 is the height of button\r\n right: 8,\r\n boxShadow,\r\n '&:hover': {\r\n backgroundColor: grey[300],\r\n },\r\n '&:focus': {\r\n backgroundColor: grey[500],\r\n },\r\n },\r\n deleteButton: {\r\n color: '#ffffff',\r\n backgroundColor: red[500],\r\n position: 'absolute',\r\n top: 24 + 48 + 48, // 48 is the height of button\r\n right: 8,\r\n boxShadow,\r\n '&:hover': {\r\n backgroundColor: red[300],\r\n },\r\n '&:focus': {\r\n backgroundColor: red[500],\r\n },\r\n },\r\n contentGrid: {\r\n height: '100%',\r\n },\r\n colorOrange: {\r\n color: '#ffcc80',\r\n },\r\n tooltip: {\r\n pointerEvents: 'none',\r\n },\r\n};\r\n\r\nexport interface IntroCardProps {\r\n disabled?: boolean;\r\n onEdit?: () => void;\r\n offline?: boolean;\r\n t: Translate;\r\n lang: ioBroker.Languages;\r\n /** Shows a warning on the card with given text if configured */\r\n warning?: string;\r\n edit?: boolean;\r\n toggleActivation?: () => void;\r\n enabled: boolean;\r\n onRemove?: () => void;\r\n action: {\r\n text: ioBroker.StringOrTranslated;\r\n link: string;\r\n };\r\n color: string;\r\n image: string;\r\n children?: React.JSX.Element | React.JSX.Element[] | string | string[] | null | undefined;\r\n title: string | React.JSX.Element;\r\n showInfo?: boolean;\r\n getHostDescriptionAll?: () => { el: React.JSX.Element; text: string };\r\n openSnackBarFunc?: () => void;\r\n style?: React.CSSProperties;\r\n theme: IobTheme;\r\n}\r\n\r\nexport interface IntroCardState {\r\n expanded: boolean;\r\n}\r\n\r\nclass IntroCard<TProps extends IntroCardProps, TState extends IntroCardState> extends Component<TProps, TState> {\r\n constructor(props: TProps) {\r\n super(props);\r\n\r\n this.state = {\r\n expanded: false,\r\n } as TState;\r\n }\r\n\r\n static getDerivedStateFromProps(props: IntroCardProps): Partial<IntroCardState> | null {\r\n if (props.edit) {\r\n return { expanded: false };\r\n }\r\n return null;\r\n }\r\n\r\n handleExpandClick() {\r\n this.setState({ expanded: !this.state.expanded });\r\n }\r\n\r\n renderContent(): React.JSX.Element | React.JSX.Element[] | string | string[] | null | undefined {\r\n return this.props.children;\r\n }\r\n\r\n openDialog(): void {\r\n // do nothing\r\n }\r\n\r\n renderDialogs(): React.JSX.Element | null {\r\n return null;\r\n }\r\n\r\n render() {\r\n const editClass = this.props.edit ? styles.edit : undefined;\r\n\r\n let buttonTitle: ioBroker.StringOrTranslated = this.props.action.text || this.props.t('Link');\r\n if (typeof buttonTitle === 'object') {\r\n buttonTitle = (buttonTitle as ioBroker.Translated)[this.props.lang] || (buttonTitle as ioBroker.Translated).en;\r\n }\r\n\r\n return <Grid2\r\n size={{\r\n xs: 12,\r\n sm: 6,\r\n md: 4,\r\n lg: 3,\r\n }}\r\n sx={Utils.getStyle(this.props.theme, styles.root, this.props.style)}\r\n >\r\n {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}\r\n <Link\r\n href={!this.props.edit && this.props.action && this.props.action.link ? this.props.action.link : null}\r\n underline=\"none\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n <Card\r\n sx={styles.card}\r\n onClick={e => {\r\n e.stopPropagation();\r\n this.openDialog();\r\n }}\r\n >\r\n {this.props.showInfo && !this.props.offline &&\r\n <Button\r\n style={{ ...styles.expand, ...editClass }}\r\n variant=\"contained\"\r\n size=\"small\"\r\n disabled={this.props.disabled}\r\n onClick={() => this.handleExpandClick()}\r\n color=\"primary\"\r\n >\r\n {this.props.t('Info')}\r\n </Button>}\r\n <Box\r\n component=\"div\"\r\n sx={Utils.getStyle(\r\n this.props.theme,\r\n styles.media,\r\n editClass,\r\n this.props.color && { backgroundColor: this.props.color },\r\n { display: 'flex', flexDirection: 'column' },\r\n )}\r\n >\r\n <CardMedia\r\n style={styles.img}\r\n component=\"img\"\r\n image={this.props.image}\r\n >\r\n </CardMedia>\r\n <div style={{\r\n flex: 1, display: 'flex', paddingBottom: '5px', paddingLeft: '5px',\r\n }}\r\n >\r\n {this.props.warning ? <Tooltip title={this.props.warning} slotProps={{ popper: { sx: styles.tooltip } }}>\r\n <WarningIcon style={{\r\n alignSelf: 'end',\r\n fontSize: 36,\r\n }}\r\n />\r\n </Tooltip> : null}\r\n </div>\r\n </Box>\r\n <div style={{ ...styles.contentContainer, ...editClass }}>\r\n <CardContent style={styles.content}>\r\n <Grid2\r\n container\r\n direction=\"column\"\r\n wrap=\"nowrap\"\r\n style={styles.contentGrid}\r\n >\r\n <Typography gutterBottom variant=\"h5\" component=\"h5\">\r\n {this.props.title}\r\n </Typography>\r\n {this.renderContent()}\r\n </Grid2>\r\n </CardContent>\r\n {this.props.action?.link && <Divider />}\r\n {this.props.action?.link && <CardActions style={styles.action}>\r\n <div style={styles.colorOrange}>\r\n {AdminUtils.getText(buttonTitle, this.props.lang)}\r\n </div>\r\n </CardActions>}\r\n </div>\r\n {this.props.showInfo && <Collapse\r\n style={styles.collapse}\r\n in={this.state.expanded}\r\n timeout=\"auto\"\r\n unmountOnExit\r\n >\r\n <Card sx={styles.cardInfo}>\r\n <Box component=\"div\" sx={styles.cardInfoHead}>\r\n <Typography gutterBottom variant=\"h5\" component=\"h5\">\r\n {this.props.t('Info')}\r\n </Typography>\r\n <div>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n if (this.props.getHostDescriptionAll) {\r\n Utils.copyToClipboard(this.props.getHostDescriptionAll().text);\r\n }\r\n if (this.props.openSnackBarFunc) {\r\n this.props.openSnackBarFunc();\r\n }\r\n }}\r\n >\r\n <SaveIcon />\r\n </IconButton>\r\n <IconButton size=\"small\" onClick={() => this.handleExpandClick()}>\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </Box>\r\n <CardContent>\r\n {this.props.getHostDescriptionAll().el}\r\n </CardContent>\r\n </Card>\r\n </Collapse>}\r\n {this.props.edit && this.props.toggleActivation && <IconButton\r\n size=\"large\"\r\n sx={this.props.enabled ? styles.enabled : styles.disabled}\r\n onClick={() => this.props.toggleActivation()}\r\n >\r\n <CheckIcon />\r\n </IconButton>}\r\n {this.props.edit && this.props.onEdit && <IconButton\r\n size=\"large\"\r\n sx={styles.editButton}\r\n onClick={() => this.props.onEdit()}\r\n >\r\n <EditIcon />\r\n </IconButton>}\r\n {this.props.edit && this.props.onRemove && <IconButton\r\n size=\"large\"\r\n sx={styles.deleteButton}\r\n onClick={() => this.props.onRemove()}\r\n >\r\n <DeleteIcon />\r\n </IconButton>}\r\n {this.renderDialogs()}\r\n </Card>\r\n </Link>\r\n </Grid2>;\r\n }\r\n}\r\n\r\nexport default IntroCard;\r\n","import React, { createRef, Component } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n} from '@mui/material';\n\nimport {\n Close as CloseIcon,\n} 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 | React.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() {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer = setInterval(() => this.updateCamera(), Math.max(parseInt(this.props.interval, 10), 500));\n this.updateCamera();\n }\n }\n\n componentWillUnmount() {\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n }\n\n updateCamera() {\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.sendTo(`${adapter}.${instance}`, 'image', { name: parts.pop(), width: this.cameraRef.current.width })\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() {\n return <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 component=\"h2\" variant=\"h6\" sx={{ '&.MuiTypography-root': styles.typography }}>\n {this.props.name}\n <IconButton size=\"large\" sx={styles.closeButton} onClick={() => this.props.onClose()}>\n <CloseIcon />\n </IconButton>\n </Typography>\n </DialogTitle>\n <DialogContent dividers>\n <img style={styles.img} src=\"\" alt=\"camera\" ref={this.cameraRef} />\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\nexport default CameraIntroLinkDialog;\n","import React, { createRef } from 'react';\n\nimport {\n Grid2, Skeleton,\n} from '@mui/material';\n\nimport {\n Error as ErrorIcon,\n} from '@mui/icons-material';\n\nimport {\n type AdminConnection,\n} 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() {\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.sendTo(`${adapter}.${instance}`, 'image', { name: parts.pop(), width: this.cameraRef.current.width })\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() {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer = setInterval(() => this.updateCamera(), Math.max(parseInt(this.props.interval as any as string, 10), 500));\n this.updateCamera();\n }\n }\n\n componentWillUnmount() {\n if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n }\n\n renderDialogs() {\n if (!this.state.dialog) {\n return null;\n }\n return <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(() => this.updateCamera(), Math.max(parseInt(this.props.interval as any as string, 10), 500));\n this.updateCamera();\n }\n\n this.setState({ dialog: false });\n }}\n cameraUrl={this.props.cameraUrl}\n />;\n }\n\n handleImageLoad() {\n if (!this.state.loaded) {\n this.setState({\n loaded: true,\n error: false,\n });\n }\n }\n\n handleImageError() {\n if (!this.state.error) {\n this.setState({\n loaded: false,\n error: true,\n });\n }\n }\n\n renderContent() {\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 <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 {this.state.error &&\n <ErrorIcon fontSize=\"large\" />}\n </Grid2>;\n }\n\n if (this.props.camera.startsWith('cameras.')) {\n return <img ref={this.cameraRef} src=\"\" alt=\"camera\" style={styles.cameraImg} />;\n }\n\n return null;\n }\n\n render() {\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(() => this.updateCamera(), Math.max(parseInt(this.props.interval as any as string, 10), 500));\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 } 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, InputAdornment,\n} from '@mui/material';\n\n// icons\nimport {\n Add as AddIcon,\n Check as CheckIcon,\n Close as CloseIcon,\n} from '@mui/icons-material';\n\nimport {\n UploadImage, type AdminConnection,\n type IobTheme, type Translate,\n} 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\n },\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() {\n this.getCamerasInstances();\n }\n\n getCamerasInstances() {\n this.props.socket.getAdapterInstances('cameras', true)\n .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.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(result =>\n result && result.list && 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 Promise.all(promises)\n .then(() =>\n this.setState({ cameraList }));\n });\n }\n\n static getLinkNameFromLink(link: 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() {\n return <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 component=\"h2\" variant=\"h6\" sx={{ '&.MuiTypography-root': styles.typography }}>\n {this.props.isNew ? this.props.t('Add new link: ') : this.props.t('Edit link')}\n <IconButton size=\"large\" sx={styles.closeButton} onClick={() => this.props.onClose()}>\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 variant=\"standard\" style={styles.formControl}>\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 value=\"text\" key=\"desc\"><em>{this.props.t('Description')}</em></MenuItem>\n {this.state.cameraList.map(cam => <MenuItem key={cam.id} value={cam.id}>{cam.name}</MenuItem>)}\n <MenuItem value=\"custom\" key=\"custom\">{this.props.t('Custom camera URL')}</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 (oldLinkName && (!this.state.linkName || oldLinkName === this.state.linkName)) {\n this.setState({ link: e.target.value, linkName: EditIntroLinkDialog.getLinkNameFromLink(e.target.value) });\n } else {\n this.setState({ link: e.target.value });\n }\n }}\n slotProps={{\n input: {\n endAdornment: this.state.link ? <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ link: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment> : 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 ? <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ name: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment> : null,\n },\n }}\n />\n\n {this.state.link ? <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 ? <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ linkName: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment> : null,\n },\n }}\n /> : null}\n\n {this.state.camera === 'custom' || this.state.camera === 'text' ? <TextField\n variant=\"standard\"\n style={styles.editItem}\n label={this.state.camera === 'custom' ? this.props.t('Camera URL') : this.props.t('Description')}\n value={this.state.desc || ''}\n onChange={e => this.setState({ desc: e.target.value })}\n slotProps={{\n input: {\n endAdornment: this.state.desc ? <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={() => this.setState({ desc: '' })}\n >\n <CloseIcon />\n </IconButton>\n </InputAdornment> : null,\n },\n }}\n /> : null}\n\n {this.state.camera === 'custom' ? <FormControlLabel\n style={styles.editItem}\n control={<Checkbox checked={this.state.addTs} onChange={e => this.setState({ addTs: e.target.checked })} />}\n label={this.props.t('Add timestamp to URL')}\n /> : null}\n\n {this.state.camera !== 'text' ? <Typography style={styles.labelSlider} gutterBottom>\n Polling interval in ms\n </Typography> : null}\n {this.state.camera !== 'text' ? <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 /> : 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' ? <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 <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 </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\nexport default EditIntroLinkDialog;\n","import React from 'react';\nimport {\n Box,\n Button, CircularProgress,\n Dialog, DialogActions, DialogContent,\n DialogTitle, 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(): React.JSX.Element {\n return (\n <Dialog open={!0} maxWidth=\"lg\" fullWidth>\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 from 'react';\r\n\r\nimport semver from 'semver';\r\n\r\nimport {\r\n Fab, Snackbar, Tooltip, Grid2, LinearProgress,\r\n Skeleton,\r\n} from '@mui/material';\r\n\r\nimport {\r\n Add as AddIcon,\r\n Check as CheckIcon,\r\n Close as CloseIcon,\r\n Create as CreateIcon,\r\n Refresh as RefreshIcon,\r\n} from '@mui/icons-material';\r\n\r\nimport {\r\n type AdminConnection, Utils as UtilsCommon,\r\n type IobTheme, type Translate,\r\n TabContainer,\r\n TabContent,\r\n} from '@iobroker/adapter-react-v5';\r\n\r\nimport type InstancesWorker from '@/Workers/InstancesWorker';\r\nimport type HostsWorker from '@/Workers/HostsWorker';\r\nimport { type HostAliveEvent, type HostEvent } from '@/Workers/HostsWorker';\r\nimport AdminUtils from '@/AdminUtils';\r\nimport IntroCard from '@/components/Intro/IntroCard';\r\nimport EditIntroLinkDialog from '@/components/Intro/EditIntroLinkDialog';\r\n\r\nimport { type InstanceEvent } from '@/Workers/InstancesWorker';\r\nimport NodeUpdateDialog from '@/dialogs/NodeUpdateDialog';\r\nimport IntroCardCamera from '@/components/Intro/IntroCardCamera';\r\n\r\nexport type CompactHost = {\r\n _id: `system.host.${string}`;\r\n common: {\r\n name: string;\r\n icon?: string;\r\n color?: string;\r\n installedVersion?: string;\r\n };\r\n native: {\r\n hardware: {\r\n networkInterfaces?: ioBroker.HostNative['hardware']['networkInterfaces'];\r\n };\r\n };\r\n};\r\n\r\nconst styles: Record<string, any> = {\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n },\r\n button: {\r\n position: 'absolute',\r\n bottom: 16,\r\n right: 16,\r\n },\r\n saveButton: (theme: IobTheme) => ({\r\n backgroundColor: theme.palette.success.main,\r\n right: 80,\r\n '&:hover': {\r\n backgroundColor: theme.palette.success.dark,\r\n },\r\n }),\r\n addButton: (theme: IobTheme) => ({\r\n backgroundColor: theme.palette.secondary.main,\r\n right: 144,\r\n '&:hover': {\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n }),\r\n closeButton: (theme: IobTheme) => ({\r\n backgroundColor: theme.palette.error.main,\r\n '&:hover': {\r\n backgroundColor: theme.palette.error.dark,\r\n },\r\n }),\r\n bold: {\r\n fontWeight: 'bold',\r\n },\r\n container: {\r\n overflowY: 'auto',\r\n },\r\n hostOffline: {\r\n color: '#bb0000',\r\n },\r\n updateExists: {\r\n color: '#c28700',\r\n marginRight: 4,\r\n },\r\n updateNo: {\r\n color: '#00b204',\r\n marginRight: 4,\r\n },\r\n nodeUpdate: {\r\n opacity: 0.6,\r\n },\r\n instanceNumber: {\r\n opacity: 0.7,\r\n fontSize: 16,\r\n },\r\n updateIcon: {\r\n cursor: 'pointer',\r\n fontSize: 16,\r\n },\r\n tooltip: {\r\n pointerEvents: 'none',\r\n },\r\n};\r\n\r\ninterface ReverseProxyItem {\r\n globalPath: string;\r\n paths: { path: string; instance: string }[];\r\n}\r\n\r\ninterface LinkItem {\r\n id: string;\r\n link: string;\r\n name: string;\r\n description: string;\r\n order: number;\r\n\r\n color?: string;\r\n icon: string;\r\n cloud?: string;\r\n pro?: string;\r\n intro?: boolean;\r\n /** Is this link should be first */\r\n default?: boolean;\r\n}\r\n\r\ninterface IntroInstanceItem {\r\n id: string;\r\n name?: string;\r\n color?: string;\r\n description?: string;\r\n image?: string;\r\n link?: string;\r\n linkName?: string;\r\n order?: number;\r\n info: string;\r\n port?: number;\r\n}\r\n\r\ninterface HostData {\r\n alive: boolean;\r\n time?: number;\r\n _nodeNewest?: string;\r\n _nodeNewestNext?: string;\r\n 'Node.js'?: string;\r\n _npmNewest?: string;\r\n NPM?: string;\r\n Platform?: 'win32' | 'linux' | 'darwin' | 'freebsd' | 'sunos' | string;\r\n RAM?: number;\r\n _npmNewestNext?: string;\r\n _versions?: Record<string, string>;\r\n dockerInformation?: {\r\n isDocker: boolean;\r\n isOfficial: boolean;\r\n officialVersion: string;\r\n };\r\n [key: string]: string | boolean | number | Record<string, string | boolean>;\r\n}\r\n\r\nconst formatInfo: Record<string, (seconds: number, t?: Translate) => string> = {\r\n Uptime: AdminUtils.formatSeconds,\r\n 'System uptime': AdminUtils.formatSeconds,\r\n RAM: AdminUtils.formatRam,\r\n Speed: AdminUtils.formatSpeed,\r\n 'Disk size': AdminUtils.formatBytes,\r\n 'Disk free': AdminUtils.formatBytes,\r\n};\r\n\r\ninterface IntroProps {\r\n showAlert: (message: string, type?: 'error' | 'warning' | 'info' | 'success') => void;\r\n socket: AdminConnection;\r\n t: Translate;\r\n lang: ioBroker.Languages;\r\n instancesWorker: InstancesWorker;\r\n hostsWorker: HostsWorker;\r\n hostname: string;\r\n adminInstance: string;\r\n theme: IobTheme;\r\n}\r\n\r\ninterface NodeUpdateDialogInfo {\r\n /** The host id of the host to upgrade node.js on */\r\n hostId: string;\r\n /** The node.js version to upgrade to */\r\n version: string;\r\n}\r\n\r\ntype ItemCamera = {\r\n camera: 'custom';\r\n enabled: boolean;\r\n link: string;\r\n name: string;\r\n /** Title of the link */\r\n linkName: string;\r\n /** Camera URL */\r\n desc: string;\r\n /** Add timestamp on the image */\r\n addTs: boolean;\r\n /** Polling interval in milliseconds */\r\n interval: number;\r\n color: string;\r\n /** base64 image */\r\n image: string;\r\n}\r\n\r\ntype ItemLink = {\r\n camera: 'text';\r\n enabled: boolean;\r\n link: string;\r\n name: string;\r\n /** Title of the link */\r\n linkName: string;\r\n /** Camera URL */\r\n desc: string;\r\n color: string;\r\n /** base64 image */\r\n image: string;\r\n}\r\n\r\ntype ItemElement = ItemCamera | ItemLink;\r\n\r\ninterface IntroState {\r\n /** Difference between client and host time in ms */\r\n hostTimeDiffMap: Map<string, number>;\r\n hostsData: Record<string, HostData>;\r\n alive: Record<string, boolean>;\r\n reverseProxy: null | ReverseProxyItem[];\r\n hasUnsavedChanges: boolean;\r\n openSnackBar: boolean;\r\n editLinkIndex: number;\r\n editLink: boolean;\r\n link: null | ItemElement;\r\n introLinks: ItemElement[] | null;\r\n edit: boolean;\r\n deactivated: string[] | null;\r\n instances: null | IntroInstanceItem[];\r\n hosts: CompactHost[] | null;\r\n /** If controller supports upgrade of nodejs */\r\n nodeUpdateSupported: boolean;\r\n /** If node update dialog should be shown */\r\n nodeUpdateDialog: null | NodeUpdateDialogInfo;\r\n}\r\n\r\nclass Intro extends React.Component<IntroProps, IntroState> {\r\n /** If server time differs more than MS from client time, show a warning */\r\n #THRESHOLD_TIME_DIFF_MS = 30 * 60 * 1_000;\r\n\r\n #ONE_MINUTE_MS = 60 * 1_000;\r\n\r\n /** // e.g. /admin/; */\r\n private readonly currentProxyPath = window.location.pathname;\r\n\r\n private introLinksOriginal?: string;\r\n\r\n private deactivatedOriginal?: string[];\r\n\r\n private readonly t: Translate;\r\n\r\n private getDataTimeout?: ReturnType<typeof setTimeout>;\r\n\r\n constructor(props: IntroProps) {\r\n super(props);\r\n\r\n this.state = {\r\n instances: null,\r\n deactivated: [],\r\n edit: false,\r\n link: null,\r\n introLinks: [],\r\n editLink: false,\r\n editLinkIndex: -1,\r\n openSnackBar: false,\r\n hasUnsavedChanges: false,\r\n reverseProxy: null,\r\n alive: {},\r\n hostsData: {},\r\n hosts: null,\r\n /** Difference between client and host time in ms */\r\n hostTimeDiffMap: new Map(),\r\n nodeUpdateSupported: false,\r\n nodeUpdateDialog: null,\r\n };\r\n\r\n this.t = props.t;\r\n }\r\n\r\n /**\r\n * Compares the backend time with the frontend time\r\n */\r\n async checkBackendTime(): Promise<void> {\r\n const timeDiffMap = this.state.hostTimeDiffMap;\r\n\r\n for (const [hostId, hostData] of Object.entries(this.state.hostsData)) {\r\n const currDate = new Date();\r\n const diff = Math.abs(hostData.time - currDate.getTime());\r\n\r\n timeDiffMap.set(hostId, diff);\r\n }\r\n\r\n this.setState({ hostTimeDiffMap: timeDiffMap });\r\n }\r\n\r\n /**\r\n * React lifecycle hook called when component did mount\r\n */\r\n async componentDidMount(): Promise<void> {\r\n await this.getData();\r\n this.props.instancesWorker.registerHandler(this.getDataDelayed);\r\n this.props.hostsWorker.registerHandler(this.updateHosts);\r\n this.props.hostsWorker.registerAliveHandler(this.updateHostsAlive);\r\n\r\n const nodeUpdateSupported = await this.props.socket.checkFeatureSupported('CONTROLLER_OS_PACKAGE_UPGRADE');\r\n\r\n // read reverse proxy settings\r\n const obj = await this.props.socket.getObject(`system.adapter.${this.props.adminInstance}`);\r\n this.setState({ nodeUpdateSupported, reverseProxy: obj?.native?.reverseProxy || [] });\r\n await this.checkBackendTime();\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.getDataTimeout) {\r\n clearTimeout(this.getDataTimeout);\r\n this.getDataTimeout = undefined;\r\n }\r\n\r\n this.props.instancesWorker.unregisterHandler(this.getDataDelayed);\r\n this.props.hostsWorker.unregisterHandler(this.updateHosts);\r\n this.props.hostsWorker.unregisterAliveHandler(this.updateHostsAlive);\r\n }\r\n\r\n updateHostsAlive = async (events: HostAliveEvent[]) => {\r\n const alive: Record<string, boolean> = JSON.parse(JSON.stringify(this.state.alive));\r\n const hostsId: string[] = [];\r\n\r\n // if some host deleted\r\n if (events.find(event => event.type === 'deleted')) {\r\n // get all information anew\r\n this.getDataDelayed();\r\n return;\r\n }\r\n // update alive status\r\n events.forEach(event => {\r\n if ((!!alive[event.id]) !== (!!event.alive)) {\r\n alive[event.id] = event.alive;\r\n hostsId.push(event.id);\r\n }\r\n });\r\n\r\n if (hostsId.length) {\r\n const hostsData: Record<string, HostData> = JSON.parse(JSON.stringify(this.state.hostsData));\r\n\r\n const results = await Promise.all(hostsId.map(id => this.getHostData(id, alive[id])));\r\n results.forEach(res => hostsData[res.id] = this.preprocessHostData(res.data));\r\n this.setState({ alive, hostsData }, () => this.checkBackendTime());\r\n }\r\n };\r\n\r\n updateHosts = (events: HostEvent[]) => {\r\n let hostsId = [];\r\n\r\n // if host deleted\r\n if (events.find(event => !event.obj)) {\r\n this.getDataDelayed();\r\n return;\r\n }\r\n hostsId = events.map(event => event.id);\r\n\r\n if (hostsId.length) {\r\n const hostsData: Record<string, HostData> = JSON.parse(JSON.stringify(this.state.hostsData));\r\n\r\n Promise.all(hostsId.map(id => this.getHostData(id)))\r\n .then(results => {\r\n results.forEach(res => hostsData[res.id] = this.preprocessHostData(res.data));\r\n this.setState({ hostsData });\r\n });\r\n }\r\n };\r\n\r\n async activateEditMode() {\r\n const systemConfig: ioBroker.SystemConfigObject = await this.props.socket.getSystemConfig(true);\r\n const data: { instances: IntroInstanceItem[]; deactivated: string[] } = await this.getInstances(true, null, systemConfig);\r\n const introLinks = systemConfig?.native?.introLinks ? systemConfig.native.introLinks as ItemElement[] : [];\r\n\r\n this.introLinksOriginal = JSON.stringify(introLinks);\r\n this.deactivatedOriginal = JSON.parse(JSON.stringify(data.deactivated));\r\n\r\n this.setState({\r\n instances: data.instances,\r\n deactivated: data.deactivated,\r\n edit: true,\r\n introLinks,\r\n hasUnsavedChanges: false,\r\n });\r\n }\r\n\r\n deactivateEditMode() {\r\n if (!this.state.hasUnsavedChanges) {\r\n // todo: implement confirmation dialog\r\n }\r\n\r\n // restore old state\r\n this.setState({\r\n deactivated: this.deactivatedOriginal,\r\n introLinks: JSON.parse(this.introLinksOriginal),\r\n hasUnsavedChanges: false,\r\n edit: false,\r\n }, () => {\r\n this.deactivatedOriginal = null;\r\n this.introLinksOriginal = null;\r\n });\r\n }\r\n\r\n toggleCard(id: string, linkName: string) {\r\n if (!this.state.instances || !this.state.instances.length) {\r\n return;\r\n }\r\n\r\n const deactivated = JSON.parse(JSON.stringify(this.state.deactivated));\r\n\r\n const pos = deactivated.indexOf(`${id}_${linkName}`);\r\n\r\n if (pos !== -1) {\r\n deactivated.splice(pos, 1);\r\n } else {\r\n deactivated.push(`${id}_${linkName}`);\r\n deactivated.sort();\r\n }\r\n\r\n const hasUnsavedChanges = JSON.stringify(deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\r\n JSON.stringify(this.state.introLinks) !== this.introLinksOriginal;\r\n\r\n this.setState({ deactivated, hasUnsavedChanges });\r\n }\r\n\r\n getInstancesCards() {\r\n return this.state.instances?.map(instance => {\r\n const enabled = !this.state.deactivated?.includes(`${instance.id}_${instance.linkName}`);\r\n if (enabled || this.state.edit) {\r\n let linkText = instance.link ? instance.link.replace(/^https?:\\/\\//, '') : '';\r\n linkText = linkText.split('/')[0];\r\n\r\n // ignore own admin instance\r\n if (instance.id === this.props.adminInstance) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-properties\r\n let isShowInstance = window.isFinite(\r\n instance.id.split('.').pop() as any,\r\n );\r\n if (isShowInstance) {\r\n // try to find second instance of a same type\r\n isShowInstance = !!this.state.instances?.find(inst =>\r\n inst.id !== instance.id && instance.name === inst.name && instance.id.split('.')[0] === inst.id.split('.')[0]);\r\n }\r\n\r\n const hostData = this.state.hostsData ? this.state.hostsData[instance.id] : null;\r\n const timeDiff = this.state.hostTimeDiffMap.get(instance.id) ?? 0;\r\n return <IntroCard\r\n key={`${instance.id}_${instance.link}`}\r\n image={instance.image}\r\n title={<>\r\n <span style={instance.name && instance.name.length > 12 ? { fontSize: '1rem' } : undefined}>\r\n {instance.name}\r\n </span>\r\n {isShowInstance ? <span style={styles.instanceNumber}>\r\n .\r\n {instance.id.split('.').pop()}\r\n </span> : null}\r\n </>}\r\n action={{ link: instance.link, text: linkText }}\r\n t={this.props.t}\r\n lang={this.props.lang}\r\n color={instance.color}\r\n showInfo={!!instance.info}\r\n edit={this.state.edit}\r\n offline={hostData && hostData.alive === false}\r\n warning={timeDiff > this.#THRESHOLD_TIME_DIFF_MS ? this.t('Backend time differs by %s minutes', Math.round(timeDiff / this.#ONE_MINUTE_MS).toString()) : null}\r\n enabled={enabled}\r\n disabled={!hostData || typeof hostData !== 'object'}\r\n getHostDescriptionAll={() => this.getHostDescriptionAll(instance.id)}\r\n toggleActivation={() => this.toggleCard(instance.id, instance.linkName)}\r\n openSnackBarFunc={() => this.setState({ openSnackBar: true })}\r\n theme={this.props.theme}\r\n >\r\n {instance.description || this.getHostDescription(instance.id)}\r\n </IntroCard>;\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n toggleLinkCard(i: number): void {\r\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\r\n\r\n introLinks[i].enabled = !introLinks[i].enabled;\r\n\r\n const hasUnsavedChanges = JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\r\n JSON.stringify(introLinks) !== this.introLinksOriginal;\r\n\r\n this.setState({ introLinks, hasUnsavedChanges });\r\n }\r\n\r\n getLinkCards() {\r\n return this.state.introLinks?.map((item, i) => {\r\n if (!item.enabled && !this.state.edit) {\r\n return null;\r\n }\r\n\r\n if (item.camera === 'custom') {\r\n return <IntroCardCamera\r\n key={`link${i}`}\r\n image={item.image}\r\n title={item.name}\r\n action={{ link: item.link, text: item.linkName }}\r\n t={this.props.t}\r\n socket={this.props.socket}\r\n color={item.color}\r\n edit={this.state.edit}\r\n interval={item.interval}\r\n camera={item.camera}\r\n addTs={item.addTs}\r\n onEdit={() => this.setState({\r\n editLink: true,\r\n editLinkIndex: i,\r\n link: JSON.parse(JSON.stringify(this.state.introLinks?.[i])),\r\n })}\r\n onRemove={() => {\r\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\r\n introLinks.splice(i, 1);\r\n const hasUnsavedChanges = JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\r\n JSON.stringify(introLinks) !== this.introLinksOriginal;\r\n this.setState({ introLinks, hasUnsavedChanges });\r\n }}\r\n enabled={item.enabled}\r\n lang={this.props.lang}\r\n toggleActivation={() => this.toggleLinkCard(i)}\r\n cameraUrl={item.desc}\r\n theme={this.props.theme}\r\n />;\r\n }\r\n\r\n return <IntroCard\r\n key={`link${i}`}\r\n image={item.image}\r\n title={item.name}\r\n action={{ link: item.link, text: item.linkName }}\r\n t={this.props.t}\r\n color={item.color}\r\n edit={this.state.edit}\r\n onEdit={() => this.setState({\r\n editLink: true,\r\n editLinkIndex: i,\r\n link: JSON.parse(JSON.stringify(this.state.introLinks?.[i])),\r\n })}\r\n onRemove={() => {\r\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\r\n introLinks.splice(i, 1);\r\n const hasUnsavedChanges = JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\r\n JSON.stringify(introLinks) !== this.introLinksOriginal;\r\n this.setState({ introLinks, hasUnsavedChanges });\r\n }}\r\n enabled={item.enabled}\r\n lang={this.props.lang}\r\n toggleActivation={() => this.toggleLinkCard(i)}\r\n theme={this.props.theme}\r\n >\r\n {item.desc || ''}\r\n </IntroCard>;\r\n });\r\n }\r\n\r\n editLinkCard(): React.JSX.Element | null {\r\n if (this.state.editLink) {\r\n return <EditIntroLinkDialog\r\n link={this.state.link}\r\n socket={this.props.socket}\r\n isNew={this.state.editLinkIndex === -1}\r\n t={this.props.t}\r\n lang={this.props.lang}\r\n theme={this.props.theme}\r\n onClose={link => {\r\n if (link) {\r\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\r\n if (this.state.editLinkIndex === -1) {\r\n link.enabled = true;\r\n introLinks.push(link);\r\n } else {\r\n link.enabled = introLinks[this.state.editLinkIndex].enabled;\r\n introLinks[this.state.editLinkIndex] = link;\r\n }\r\n const hasUnsavedChanges = JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\r\n JSON.stringify(introLinks) !== this.introLinksOriginal;\r\n\r\n this.setState({\r\n introLinks, editLink: false, hasUnsavedChanges, link: null,\r\n });\r\n } else {\r\n this.setState({ editLink: false });\r\n }\r\n }}\r\n />;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getButtons(): React.JSX.Element[] {\r\n const buttons = [];\r\n\r\n if (this.state.edit) {\r\n buttons.push(<Fab\r\n key=\"add\"\r\n color=\"primary\"\r\n size=\"small\"\r\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.addButton)}\r\n onClick={() =>\r\n this.setState({\r\n editLink: true,\r\n editLinkIndex: -1,\r\n link: {} as ItemCamera | ItemLink,\r\n })}\r\n >\r\n <AddIcon />\r\n </Fab>);\r\n\r\n buttons.push(<Fab\r\n key=\"save\"\r\n size=\"small\"\r\n color=\"primary\"\r\n disabled={!this.state.hasUnsavedChanges}\r\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.saveButton)}\r\n onClick={() => this.saveCards()}\r\n >\r\n <CheckIcon />\r\n </Fab>);\r\n\r\n buttons.push(<Fab\r\n key=\"close\"\r\n size=\"small\"\r\n color=\"primary\"\r\n sx={UtilsCommon.getStyle(this.props.theme, styles.button, styles.closeButton)}\r\n onClick={() => this.deactivateEditMode()}\r\n >\r\n <CloseIcon />\r\n </Fab>);\r\n } else {\r\n buttons.push(<Fab\r\n color=\"primary\"\r\n size=\"small\"\r\n key=\"edit\"\r\n style={styles.button}\r\n onClick={() => this.activateEditMode()}\r\n >\r\n <CreateIcon />\r\n </Fab>);\r\n }\r\n\r\n return buttons;\r\n }\r\n\r\n async saveCards() {\r\n const systemConfig = await this.props.socket.getSystemConfig(true);\r\n let changed = false;\r\n if (JSON.stringify(systemConfig.common.intro) !== JSON.stringify(this.state.deactivated)) {\r\n systemConfig.common.intro = this.state.deactivated;\r\n changed = true;\r\n }\r\n if (!changed && JSON.stringify(systemConfig.native.introLinks) !== JSON.stringify(this.state.introLinks)) {\r\n changed = true;\r\n systemConfig.native.introLinks = this.state.introLinks;\r\n }\r\n if (changed) {\r\n this.props.socket.setSystemConfig(systemConfig)\r\n .then(() => this.props.showAlert('Updated', 'success'))\r\n .catch((error: any) => {\r\n console.log(error);\r\n this.props.showAlert(error, 'error');\r\n })\r\n .then(() => this.setState({ edit: false }));\r\n } else {\r\n this.setState({ edit: false });\r\n }\r\n }\r\n\r\n async getHostData(hostId: string, isAlive?: boolean): Promise<{ id: string; data: HostData }> {\r\n let alive;\r\n if (isAlive !== undefined) {\r\n alive = { val: isAlive };\r\n } else {\r\n try {\r\n alive = await this.props.socket.getState(`${hostId}.alive`);\r\n } catch (e) {\r\n console.error(`Cannot get state ${hostId}.alive: ${e}`);\r\n alive = { val: false };\r\n }\r\n }\r\n\r\n let data: HostData = { alive: false };\r\n if (alive?.val) {\r\n try {\r\n data = await this.props.socket.getHostInfo(hostId, false, 10000);\r\n if (data && typeof data === 'object' && data.alive !== false) {\r\n data.alive = true;\r\n }\r\n } catch (e) {\r\n console.error(`Cannot get host info for ${hostId}: ${e}`);\r\n data = { alive: false };\r\n }\r\n } else {\r\n data = { alive: false };\r\n }\r\n\r\n const states = await this.props.socket.getForeignStates(`${hostId}.versions.*`);\r\n\r\n Object.keys(states).forEach(id =>\r\n data[`_${id.split('.').pop()}`] = states[id].val);\r\n\r\n return { id: hostId, data };\r\n }\r\n\r\n async getHostsData(hosts: CompactHost[]) {\r\n const promises = hosts.map(obj => this.getHostData(obj._id));\r\n\r\n const results = await Promise.all(promises);\r\n const hostsData: Record<string, HostData> = {};\r\n const alive: Record<string, boolean> = {};\r\n results.forEach(res => {\r\n hostsData[res.id] = this.preprocessHostData(res.data);\r\n alive[res.id] = res.data.alive;\r\n });\r\n return { hostsData, alive };\r\n }\r\n\r\n static applyReverseProxy(\r\n webReverseProxyPath: ReverseProxyItem,\r\n instances: Record<string, ioBroker.InstanceObject>,\r\n instance: IntroInstanceItem,\r\n ) {\r\n webReverseProxyPath?.paths.forEach(item => {\r\n if (item.instance === instance.id) {\r\n instance.link = item.path;\r\n } else if (item.instance.startsWith('web.')) {\r\n // if this is a web instance, check if it is the same as the current instance\r\n const _obj = instances[`system.adapter.${item.instance}`];\r\n if (_obj?.native?.port && (instance.link).includes(`:${_obj.native.port}`)) {\r\n // replace\r\n const regExp = new RegExp(`^.*:${_obj.native.port}/`);\r\n if (instance.link) {\r\n instance.link = instance.link.replace(regExp, item.path);\r\n }\r\n console.log(instance.link);\r\n }\r\n }\r\n });\r\n }\r\n\r\n addLinks(\r\n linkItem: LinkItem,\r\n common: ioBroker.InstanceCommon,\r\n instanceId: number,\r\n instances: Record<string, ioBroker.InstanceObject>,\r\n hosts: Record<string, ioBroker.HostObject>,\r\n introInstances: IntroInstanceItem[],\r\n ) {\r\n const instance: IntroInstanceItem = {\r\n id: linkItem.id,\r\n name: linkItem.name,\r\n description: linkItem.description,\r\n color: linkItem.color,\r\n image: linkItem.icon,\r\n info: '',\r\n };\r\n\r\n const _urls: {\r\n url: string;\r\n port: number;\r\n instance?: string;\r\n }[] = AdminUtils.replaceLink(\r\n linkItem.link,\r\n common.name,\r\n instanceId,\r\n {\r\n instances,\r\n hostname: this.props.hostname,\r\n adminInstance: this.props.adminInstance,\r\n hosts,\r\n },\r\n );\r\n\r\n let webReverseProxyPath: ReverseProxyItem | null = null;\r\n if (this.state.reverseProxy?.length) {\r\n webReverseProxyPath = this.state.reverseProxy.find(item => item.globalPath === this.currentProxyPath);\r\n }\r\n if (_urls.length === 1) {\r\n instance.link = _urls[0].url;\r\n instance.port = _urls[0].port;\r\n\r\n Intro.applyReverseProxy(webReverseProxyPath, instances, instance);\r\n\r\n // if a link already exists => ignore\r\n const lll = introInstances.find(item => item.link === instance.link);\r\n if (!lll) {\r\n introInstances.push(instance);\r\n } else {\r\n console.log(`Double links: \"${instance.id}\" and \"${lll.id}\"`);\r\n }\r\n } else if (_urls.length > 1) {\r\n _urls.forEach(url => {\r\n const lll = introInstances.find(item => item.link === url.url);\r\n\r\n if (!lll) {\r\n const item = { ...instance, link: url.url, port: url.port };\r\n Intro.applyReverseProxy(webReverseProxyPath, instances, item);\r\n introInstances.push(item);\r\n } else {\r\n console.log(`Double links: \"${instance.id}\" and \"${lll.id}\"`);\r\n }\r\n });\r\n }\r\n }\r\n\r\n static getText(text: ioBroker.StringOrTranslated, lang: ioBroker.Languages): string {\r\n if (!text) {\r\n return '';\r\n }\r\n if (typeof text === 'object') {\r\n return text[lang] || text.en || '';\r\n }\r\n return text || '';\r\n }\r\n\r\n static normalizeLinks(\r\n instance: ioBroker.InstanceObject,\r\n language: ioBroker.Languages,\r\n filterDuplicates?: boolean,\r\n ): LinkItem[] | null {\r\n if (!instance.common.localLinks &&\r\n !instance.common.localLink &&\r\n !instance.common.welcomeScreen &&\r\n !instance.common.welcomeScreenPro\r\n ) {\r\n return null;\r\n }\r\n const defaultLink: LinkItem = {\r\n id: instance._id.replace('system.adapter.', ''),\r\n link: '',\r\n name: Intro.getText(instance.common.titleLang || instance.common.title || instance.common.name, language),\r\n order: 1000,\r\n intro: true,\r\n description: Intro.getText(instance.common.desc, language),\r\n icon: instance.common.icon ? `adapter/${instance.common.name}/${instance.common.icon}` : 'img/no-image.png',\r\n };\r\n let result: LinkItem[] = [];\r\n if (instance.common.localLink) {\r\n if (typeof instance.common.localLink === 'string') {\r\n result.push({\r\n ...defaultLink,\r\n link: instance.common.localLink,\r\n });\r\n } else {\r\n const compatibilityStructure: Record<string, any> =\r\n instance.common.localLink as unknown as Record<string, any>;\r\n if (compatibilityStructure.link) {\r\n const item: LinkItem = {\r\n ...defaultLink,\r\n link: compatibilityStructure.link,\r\n };\r\n if (compatibilityStructure.color) {\r\n item.color = compatibilityStructure.color;\r\n }\r\n if (compatibilityStructure.order !== undefined && typeof compatibilityStructure.order === 'number') {\r\n item.order = compatibilityStructure.order;\r\n }\r\n if (compatibilityStructure.icon && compatibilityStructure.img) {\r\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\r\n }\r\n\r\n result.push(item);\r\n } else {\r\n console.warn(`Unknown localLink structure: ${JSON.stringify(instance.common.localLink)}`);\r\n }\r\n }\r\n }\r\n\r\n if (instance.common.localLinks && typeof instance.common.localLinks === 'object') {\r\n Object.keys(instance.common.localLinks).forEach((linkName: string) => {\r\n const linkItem: unknown = instance.common.localLinks[linkName];\r\n if (typeof linkItem === 'string') {\r\n result.push({\r\n ...defaultLink,\r\n link: linkItem,\r\n });\r\n } else {\r\n const compatibilityStructure: Record<string, any> =\r\n linkItem as Record<string, any>;\r\n\r\n if (compatibilityStructure.link) {\r\n const item: LinkItem = {\r\n ...defaultLink,\r\n id: instance._id.replace('system.adapter.', '') + (linkName === '_default' ? '' : ` ${linkName}`),\r\n link: compatibilityStructure.link,\r\n name: defaultLink.name + (linkName === '_default' ? '' : ` ${linkName}`),\r\n };\r\n if (compatibilityStructure.color) {\r\n item.color = compatibilityStructure.color as string;\r\n }\r\n if (compatibilityStructure.order !== undefined) {\r\n item.order = parseInt(compatibilityStructure.order as string, 10) || 1000;\r\n }\r\n if (compatibilityStructure.icon && compatibilityStructure.img) {\r\n item.icon = (compatibilityStructure.icon || compatibilityStructure.img) as string;\r\n }\r\n if (compatibilityStructure.description) {\r\n item.description = Intro.getText(compatibilityStructure.description as ioBroker.StringOrTranslated, language);\r\n }\r\n if (compatibilityStructure.pro !== undefined) {\r\n if (typeof compatibilityStructure.pro === 'string') {\r\n item.pro = compatibilityStructure.pro as string;\r\n } else {\r\n item.pro = `${instance.common.name}/index.html`;\r\n }\r\n }\r\n if (compatibilityStructure.cloud !== undefined) {\r\n item.cloud = compatibilityStructure.cloud as string;\r\n }\r\n if (compatibilityStructure.intro !== undefined) {\r\n item.intro = compatibilityStructure.intro === true;\r\n }\r\n\r\n if (compatibilityStructure.name) {\r\n item.name = Intro.getText(compatibilityStructure.name as ioBroker.StringOrTranslated, language);\r\n }\r\n if (linkName === '_default') {\r\n item.default = true;\r\n }\r\n\r\n result.push(item);\r\n } else {\r\n console.warn(`Unknown localLinks structure: ${JSON.stringify(linkItem)}`);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (instance.common.welcomeScreen && typeof instance.common.welcomeScreen === 'object') {\r\n const compatibilityStructureArr: Record<string, any>[] =\r\n Array.isArray(instance.common.welcomeScreen) ? instance.common.welcomeScreen as Record<string, any>[] : [instance.common.welcomeScreen as Record<string, any>];\r\n compatibilityStructureArr.forEach(compatibilityStructure => {\r\n if (compatibilityStructure.link) {\r\n const item: LinkItem = {\r\n ...defaultLink,\r\n id: `${instance._id.replace('system.adapter.', '')} cloud`,\r\n link: `%web_protocol%://%web_bind%:%web_port%/${compatibilityStructure.link}`,\r\n cloud: compatibilityStructure.link,\r\n };\r\n if (compatibilityStructure.color) {\r\n item.color = compatibilityStructure.color;\r\n }\r\n if (compatibilityStructure.order !== undefined && typeof compatibilityStructure.order === 'number') {\r\n item.order = compatibilityStructure.order;\r\n }\r\n if (compatibilityStructure.icon && compatibilityStructure.img) {\r\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\r\n }\r\n\r\n if (compatibilityStructure.localLinks) {\r\n const link: unknown = instance.common.localLinks[compatibilityStructure.localLinks];\r\n if (link && typeof link === 'string') {\r\n item.link = link;\r\n } else if (link && typeof link === 'object' && (link as any).link) {\r\n item.link = (link as any).link;\r\n }\r\n }\r\n\r\n if (compatibilityStructure.name) {\r\n item.name = Intro.getText(compatibilityStructure.name as ioBroker.StringOrTranslated, language);\r\n }\r\n\r\n result.push(item);\r\n }\r\n });\r\n\r\n if (instance.common.welcomeScreenPro && typeof instance.common.welcomeScreenPro === 'object') {\r\n const _compatibilityStructureArr: Record<string, any>[] =\r\n Array.isArray(instance.common.welcomeScreenPro) ? instance.common.welcomeScreenPro as Record<string, any>[] : [instance.common.welcomeScreenPro as Record<string, any>];\r\n\r\n _compatibilityStructureArr.forEach(compatibilityStructure => {\r\n if (compatibilityStructure.link) {\r\n const item: LinkItem = {\r\n ...defaultLink,\r\n id: `${instance._id.replace('system.adapter.', '')} pro`,\r\n link: `%web_protocol%://%web_bind%:%web_port%/${compatibilityStructure.link}`,\r\n pro: compatibilityStructure.link,\r\n };\r\n if (compatibilityStructure.color) {\r\n item.color = compatibilityStructure.color;\r\n }\r\n if (compatibilityStructure.order !== undefined && typeof compatibilityStructure.order === 'number') {\r\n item.order = compatibilityStructure.order;\r\n }\r\n if (compatibilityStructure.icon && compatibilityStructure.img) {\r\n item.icon = compatibilityStructure.icon || compatibilityStructure.img;\r\n }\r\n\r\n if (compatibilityStructure.localLinks) {\r\n const link: unknown = instance.common.localLinks[compatibilityStructure.localLinks];\r\n if (link && typeof link === 'string') {\r\n item.link = link;\r\n } else if (link && typeof link === 'object' && (link as any).link) {\r\n item.link = (link as any).link;\r\n }\r\n }\r\n\r\n if (compatibilityStructure.name) {\r\n item.name = Intro.getText(compatibilityStructure.name as ioBroker.StringOrTranslated, language);\r\n }\r\n\r\n result.push(item);\r\n }\r\n });\r\n }\r\n }\r\n\r\n result.forEach(item => {\r\n if (!item.icon.startsWith('adapter/') &&\r\n !item.icon.startsWith('data:image/') &&\r\n !item.icon.startsWith('http://') &&\r\n !item.icon.startsWith('https://') &&\r\n item.icon !== 'img/no-image.png'\r\n ) {\r\n // normalize icon\r\n item.icon = `adapter/${instance.common.name}/${item.icon}`;\r\n }\r\n item.link = item.link.replace(/%ip%/g, '%web_bind%');\r\n });\r\n\r\n if (filterDuplicates) {\r\n // filter all links with the same \"link\"\r\n const links: Record<string, LinkItem> = {};\r\n result.forEach(item => {\r\n if (!links[item.link]) {\r\n links[item.link] = item;\r\n } else {\r\n // merge\r\n if (item.color) {\r\n links[item.link].color = item.color;\r\n }\r\n if (item.icon) {\r\n links[item.link].icon = item.icon;\r\n }\r\n if (item.cloud) {\r\n links[item.link].cloud = item.cloud;\r\n }\r\n if (item.pro) {\r\n links[item.link].pro = item.pro;\r\n }\r\n if (item.intro !== undefined) {\r\n links[item.link].intro = item.intro;\r\n }\r\n if (item.name && typeof item.name === 'object') {\r\n links[item.link].name = item.name;\r\n }\r\n if (item.order !== undefined) {\r\n links[item.link].order = item.order;\r\n }\r\n if (item.default) {\r\n links[item.link].default = item.default;\r\n }\r\n }\r\n });\r\n result = Object.values(links);\r\n }\r\n\r\n result.sort((a: LinkItem, b: LinkItem) => {\r\n if (a.default === undefined && b.default === undefined) {\r\n if (a.order === undefined && b.order === undefined) {\r\n return 0;\r\n }\r\n if (a.order === undefined) {\r\n return -1;\r\n }\r\n if (b.order === undefined) {\r\n return 1;\r\n }\r\n return a.order - b.order;\r\n }\r\n if (a.default === undefined) {\r\n return -1;\r\n }\r\n if (b.default === undefined) {\r\n return 1;\r\n }\r\n\r\n if (a.order === undefined && b.order === undefined) {\r\n return 0;\r\n }\r\n if (a.order === undefined) {\r\n return -1;\r\n }\r\n if (b.order === undefined) {\r\n return 1;\r\n }\r\n return a.order - b.order;\r\n });\r\n\r\n return result;\r\n }\r\n\r\n async getInstances(\r\n update: boolean | undefined,\r\n hosts: CompactHost[] | null,\r\n systemConfig: ioBroker.SystemConfigObject,\r\n ): Promise<{ instances: IntroInstanceItem[]; deactivated: string[] }> {\r\n hosts = hosts || this.state.hosts;\r\n\r\n const oHosts: Record<string, ioBroker.HostObject> = {};\r\n hosts.forEach(obj => oHosts[obj._id] = obj as ioBroker.HostObject);\r\n\r\n try {\r\n const objects = await this.props.socket.getAdapterInstances('', update);\r\n let deactivated: string[] = systemConfig.common.intro || [];\r\n if (!Array.isArray(deactivated)) {\r\n deactivated = Object.keys(deactivated);\r\n deactivated.sort();\r\n }\r\n const introInstances: IntroInstanceItem[] = [];\r\n const instances: Record<string, ioBroker.InstanceObject> = {};\r\n objects.forEach(obj => instances[obj._id] = obj);\r\n\r\n objects.sort((_a, _b) => {\r\n const a: Partial<ioBroker.InstanceCommon> = _a?.common ?? {};\r\n const b: Partial<ioBroker.InstanceCommon> = _b?.common ?? {};\r\n\r\n // @ts-expect-error need to be added to types if this can exist\r\n if (a.order === undefined && b.order === undefined) {\r\n let aName;\r\n let bName;\r\n if (typeof a.name === 'object') {\r\n const commonNameA: ioBroker.Translated = a.name;\r\n aName = commonNameA[this.props.lang] || commonNameA.en;\r\n } else {\r\n aName = a.name as string || '';\r\n }\r\n if (typeof b.name === 'object') {\r\n const commonNameB: ioBroker.Translated = b.name;\r\n bName = commonNameB[this.props.lang] || commonNameB.en;\r\n } else {\r\n bName = b.name as string || '';\r\n }\r\n if (aName.toLowerCase() > bName.toLowerCase()) {\r\n return 1;\r\n }\r\n if (aName.toLowerCase() < bName.toLowerCase()) {\r\n return -1;\r\n }\r\n return 0;\r\n }\r\n // @ts-expect-error need to be added to types if this can exist\r\n if (a.order === undefined) {\r\n return -1;\r\n }\r\n // @ts-expect-error need to be added to types if this can exist\r\n if (b.order === undefined) {\r\n return 1;\r\n }\r\n // @ts-expect-error need to be added to types if this can exist\r\n if (a.order > b.order) {\r\n return 1;\r\n }\r\n // @ts-expect-error need to be added to types if this can exist\r\n if (a.order < b.order) {\r\n return -1;\r\n }\r\n let aName: string;\r\n if (typeof a.name === 'object') {\r\n const commonNameA: ioBroker.Translated = a.name;\r\n aName = commonNameA[this.props.lang] || commonNameA.en;\r\n } else {\r\n aName = a.name as string || '';\r\n }\r\n\r\n let bName;\r\n if (typeof b.name === 'object') {\r\n const commonNameB: ioBroker.Translated = b.name;\r\n bName = commonNameB[this.props.lang] || commonNameB.en;\r\n } else {\r\n bName = b.name as string || '';\r\n }\r\n if (aName.toLowerCase() > bName.toLowerCase()) {\r\n return 1;\r\n }\r\n if (aName.toLowerCase() < bName.toLowerCase()) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n\r\n objects.forEach(obj => {\r\n if (!obj) {\r\n return;\r\n }\r\n const common = obj.common || null;\r\n const objId = obj._id.split('.');\r\n const instanceId: number = parseInt(objId.pop(), 10);\r\n let name: string;\r\n if (common?.name && typeof common.name === 'object') {\r\n const commonName: ioBroker.Translated = common?.name;\r\n name = commonName[this.props.lang] || commonName.en;\r\n } else {\r\n name = common?.name as string || '';\r\n }\r\n\r\n if (name === 'admin' && common.localLink === (this.props.hostname || '')) {\r\n return;\r\n }\r\n if (name === 'web') {\r\n return;\r\n }\r\n\r\n if (name && name !== 'vis-web-admin' && name.match(/^vis-/) && name !== 'vis-2') {\r\n return;\r\n }\r\n if (name && name.match(/^icons-/)) {\r\n return;\r\n }\r\n if (common && (common.enabled || common.onlyWWW)) {\r\n const links = Intro.normalizeLinks(obj, this.props.lang, true);\r\n\r\n if (links) {\r\n links.forEach(link => this.addLinks(\r\n link,\r\n common,\r\n instanceId,\r\n instances,\r\n oHosts,\r\n introInstances,\r\n ));\r\n }\r\n }\r\n });\r\n\r\n introInstances.forEach(instance => {\r\n if (instance.link) {\r\n instance.linkName = instance.link\r\n .replace('https://', '')\r\n .replace('http://', '')\r\n .replace(/^[^_]+:/, '');\r\n }\r\n });\r\n\r\n introInstances.sort((a, b) => {\r\n if (a.order !== undefined || b.order !== undefined) {\r\n a.order = a.order === undefined ? 1000 : a.order;\r\n b.order = b.order === undefined ? 1000 : b.order;\r\n if (a.order < b.order) {\r\n return -1;\r\n }\r\n if (a.order > b.order) {\r\n return 1;\r\n }\r\n }\r\n\r\n if (a.id > b.id) {\r\n return 1;\r\n }\r\n if (a.id < b.id) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n\r\n hosts?.forEach(obj => {\r\n const common = obj?.common;\r\n let name: ioBroker.StringOrTranslated = common?.name;\r\n if (typeof name === 'object') {\r\n if (name) {\r\n name = (name as ioBroker.Translated)[this.props.lang] || (name as ioBroker.Translated).en;\r\n }\r\n }\r\n\r\n if (common) {\r\n const instance: IntroInstanceItem = {\r\n id: obj._id,\r\n name: name || '',\r\n color: '',\r\n image: common.icon || 'img/no-image.png',\r\n info: this.t('Info'),\r\n linkName: '',\r\n };\r\n\r\n introInstances.push(instance);\r\n }\r\n });\r\n\r\n const _deactivated: string[] = [];\r\n deactivated.forEach(id => {\r\n if (introInstances.find(instance => id === `${instance.id}_${instance.linkName}`)) {\r\n _deactivated.push(id);\r\n }\r\n });\r\n deactivated = _deactivated;\r\n\r\n return {\r\n instances: introInstances,\r\n deactivated,\r\n };\r\n } catch (error) {\r\n console.log(error);\r\n return { instances: [], deactivated: [] };\r\n }\r\n }\r\n\r\n getHostDescription(id: string): React.JSX.Element {\r\n const hostData = this.state.hostsData ? this.state.hostsData[id] : null;\r\n\r\n if (hostData && hostData.alive === false) {\r\n return <div style={styles.hostOffline}>{this.props.t('Offline')}</div>;\r\n }\r\n\r\n let nodeUpdate: string | React.JSX.Element = '';\r\n let npmUpdate: string | React.JSX.Element = '';\r\n if (hostData) {\r\n try {\r\n if (hostData._nodeNewest && hostData['Node.js'] && semver.gt(hostData._nodeNewest, hostData['Node.js'].replace(/^v/, ''))) {\r\n nodeUpdate = hostData._nodeNewest;\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n try {\r\n if (hostData._nodeNewest !== hostData._nodeNewestNext &&\r\n hostData._nodeNewestNext &&\r\n hostData['Node.js'] &&\r\n hostData._nodeNewest &&\r\n semver.gt(hostData._nodeNewestNext, hostData['Node.js'].replace(/^v/, '')) &&\r\n semver.gt(hostData._nodeNewestNext, hostData._nodeNewest)\r\n ) {\r\n nodeUpdate += (nodeUpdate ? ' / ' : '') + hostData._nodeNewestNext;\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n\r\n if (nodeUpdate) {\r\n const updateSupported = this.state.nodeUpdateSupported && hostData.Platform === 'linux';\r\n\r\n nodeUpdate =\r\n <Tooltip title={this.props.t('Some updates available')} slotProps={{ popper: { sx: styles.tooltip } }}>\r\n <span style={{ ...styles.nodeUpdate, display: 'inline-flex' }}>\r\n(\r\n {nodeUpdate}\r\n)\r\n {updateSupported ? <RefreshIcon style={styles.updateIcon} onClick={() => this.setState({ nodeUpdateDialog: { hostId: id, version: hostData._nodeNewestNext } })} /> : null}\r\n </span>\r\n </Tooltip>;\r\n }\r\n\r\n try {\r\n if (hostData._npmNewest && hostData.NPM && semver.gt(hostData._npmNewest, hostData.NPM)) {\r\n npmUpdate = hostData._npmNewest;\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n try {\r\n if (hostData._npmNewest !== hostData._npmNewestNext &&\r\n hostData._npmNewestNext &&\r\n hostData.NPM &&\r\n hostData._npmNewest &&\r\n semver.gt(hostData._npmNewestNext, hostData.NPM) &&\r\n semver.gt(hostData._npmNewestNext, hostData._npmNewest)\r\n ) {\r\n npmUpdate += (npmUpdate ? ' / ' : '') + hostData._npmNewestNext;\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n if (npmUpdate) {\r\n npmUpdate = <Tooltip title={this.props.t('Some updates available')} slotProps={{ popper: { sx: styles.tooltip } }}>\r\n <span style={styles.nodeUpdate}>\r\n (\r\n {npmUpdate}\r\n )\r\n </span>\r\n </Tooltip>;\r\n }\r\n }\r\n\r\n return hostData && typeof hostData === 'object' ?\r\n <ul style={{ textTransform: 'none' }}>\r\n <li>\r\n <span>\r\n <span style={styles.bold}>\r\n {this.t('Platform')}\r\n:\r\n {' '}\r\n </span>\r\n {hostData.Platform || '--'}\r\n </span>\r\n </li>\r\n <li>\r\n <span>\r\n <span style={styles.bold}>\r\n {this.t('RAM')}\r\n:\r\n {' '}\r\n </span>\r\n {formatInfo.RAM(hostData.RAM)}\r\n </span>\r\n </li>\r\n <li>\r\n <span>\r\n <span style={styles.bold}>\r\n {this.t('Node.js')}\r\n:\r\n {' '}\r\n </span>\r\n <span style={nodeUpdate ? styles.updateExists : styles.updateNo}>{hostData['Node.js'] || '--'}</span>\r\n {nodeUpdate}\r\n </span>\r\n </li>\r\n <li>\r\n <span>\r\n <span style={styles.bold}>\r\n {this.t('NPM')}\r\n:\r\n {' '}\r\n </span>\r\n <span className={npmUpdate ? styles.updateExists : styles.updateNo}>{hostData.NPM || '--'}</span>\r\n {npmUpdate}\r\n </span>\r\n </li>\r\n </ul>\r\n :\r\n <ul>\r\n <Skeleton />\r\n <Skeleton />\r\n <Skeleton />\r\n <Skeleton />\r\n </ul>;\r\n }\r\n\r\n getHostDescriptionAll(id: string): { el: React.JSX.Element; text: string } {\r\n const hostData = this.state.hostsData ? this.state.hostsData[id] : null;\r\n\r\n return {\r\n el: <ul style={{ textTransform: 'none' }}>\r\n {hostData && typeof hostData === 'object' && Object.keys(hostData)\r\n .filter(_id => !_id.startsWith('_') && hostData[_id] !== null && hostData[_id] !== undefined)\r\n .map(value => <li key={value}>\r\n {hostData && typeof hostData === 'object' ?\r\n <span>\r\n <span style={styles.bold}>\r\n {this.t(value)}\r\n :\r\n {' '}\r\n </span>\r\n {(formatInfo[value] ? formatInfo[value](hostData[value] as number, this.t) : (typeof hostData[value] === 'object' ? JSON.stringify(hostData[value]) : hostData[value].toString()) || '--')}\r\n </span>\r\n :\r\n <Skeleton />}\r\n </li>)}\r\n </ul>,\r\n\r\n text: hostData && typeof hostData === 'object' ? Object.keys(hostData)\r\n .reduce((acom, item) => `${acom}${this.t(item)}:${(formatInfo[item] ? formatInfo[item](hostData[item] as number, this.t) : hostData[item] || '--')}\\n`) : '',\r\n };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n getDataDelayed = (_events?: InstanceEvent[]) => {\r\n if (this.getDataTimeout) {\r\n clearTimeout(this.getDataTimeout);\r\n }\r\n this.getDataTimeout = setTimeout(() => {\r\n this.getDataTimeout = undefined;\r\n this.getData(true);\r\n }, 300);\r\n };\r\n\r\n async getData(update?: boolean) {\r\n try {\r\n const systemConfig: ioBroker.SystemConfigObject = await this.props.socket.getSystemConfig(update);\r\n const hosts: CompactHost[] = await this.props.socket.getCompactHosts(update);\r\n const data: { instances: IntroInstanceItem[]; deactivated: string[] } = await this.getInstances(update, hosts, systemConfig);\r\n this.setState({\r\n instances: data.instances,\r\n hosts,\r\n deactivated: data.deactivated,\r\n introLinks: systemConfig && systemConfig.native && systemConfig.native.introLinks ? systemConfig.native.introLinks : [],\r\n });\r\n // hosts data could last a long time, so show some results to user now and then get the info about hosts\r\n const newState: Partial<IntroState> = await this.getHostsData(hosts);\r\n await new Promise<void>(resolve => {\r\n this.setState(newState as IntroState, () =>\r\n resolve());\r\n });\r\n } catch (error: any) {\r\n window.alert(`Cannot get data: ${error}`);\r\n }\r\n }\r\n\r\n /**\r\n * Render toast if content has been copied\r\n */\r\n renderCopiedToast(): React.JSX.Element {\r\n return <Snackbar\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n }}\r\n open={this.state.openSnackBar}\r\n autoHideDuration={3_000}\r\n onClose={() => this.setState({ openSnackBar: false })}\r\n message={this.t('copied')}\r\n />;\r\n }\r\n\r\n render(): React.JSX.Element {\r\n if (!this.state.instances) {\r\n return <LinearProgress />;\r\n }\r\n\r\n return <TabContainer\r\n elevation={0}\r\n overflow=\"visible\"\r\n >\r\n {this.renderCopiedToast()}\r\n {this.state.nodeUpdateDialog ? <NodeUpdateDialog onClose={() => this.setState({ nodeUpdateDialog: null })} socket={this.props.socket} {...this.state.nodeUpdateDialog} /> : null}\r\n <TabContent style={styles.container}>\r\n {/* This fragment is required here\r\n to split directives of Grid2 in TabContent and Grid2 directives in Intro */}\r\n {/* eslint-disable-next-line react/jsx-no-useless-fragment */}\r\n <>\r\n <Grid2\r\n className=\"denis\"\r\n container\r\n spacing={1}\r\n columns={{\r\n xs: 12,\r\n md: 12,\r\n lg: 12,\r\n sm: 12,\r\n }}\r\n >\r\n {this.getInstancesCards()}\r\n {this.getLinkCards()}\r\n </Grid2>\r\n </>\r\n {this.getButtons()}\r\n {this.editLinkCard()}\r\n </TabContent>\r\n </TabContainer>;\r\n }\r\n\r\n /**\r\n * Preprocess host data to harmonize information\r\n *\r\n * @param hostData Host data from controller\r\n */\r\n preprocessHostData(hostData: HostData): HostData {\r\n if (hostData.dockerInformation?.isDocker) {\r\n let dockerString = hostData.dockerInformation.isOfficial ? 'official image' : 'unofficial image';\r\n\r\n if (hostData.dockerInformation.isOfficial) {\r\n dockerString += ` - ${hostData.dockerInformation.officialVersion}`;\r\n }\r\n\r\n hostData.Platform = `${hostData.Platform} (${dockerString})` as string;\r\n }\r\n\r\n delete hostData.dockerInformation;\r\n return hostData;\r\n }\r\n}\r\n\r\nexport default Intro;\r\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","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","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","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","console","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","_a","_b","_a$common","_b$common","aName","bName","commonNameA","commonNameB","toLowerCase","objId","commonName","onlyWWW","_deactivated","npmUpdate","_nodeNewest","semver","_nodeNewestNext","updateSupported","Platform","version","_npmNewest","NPM","_npmNewestNext","textTransform","className","filter","reduce","acom","getCompactHosts","newState","resolve","renderCopiedToast","Snackbar","anchorOrigin","vertical","horizontal","autoHideDuration","message","TabContainer","elevation","TabContent","spacing","columns","LinearProgress","_hostData$dockerInfor","dockerInformation","isDocker","dockerString","isOfficial","officialVersion","_classPrivateFieldBase","hasOwnProperty","call","TypeError","_classPrivateFieldKey"],"sourceRoot":""}