UNPKG

iobroker.nspanel-lovelace-ui

Version:

NsPanel Lovelace UI is a Firmware for the nextion screen inside of NSPanel in the Design of Lovelace UI Design.

1 lines 76 kB
import{A as E,b as P,c as D,S as G,C as z,w as H,d as Y,a as Z,I as ee,W as te}from"./NavigationView-BGLEMtxw.js";import{j as e}from"./createSvgIcon-Debf11BA.js";import{A as t}from"./AdminComponentEasyAccessSet__loadShare___mf_0_mui_mf_1_material__loadShare__-EKOPJIKX.js";import{R as k}from"./AdminComponentEasyAccessSet__loadShare__react__loadShare__-CJmceRyn.js";import{N as se,S as ae,E as ie,D as Q,V as ne,a as oe}from"./VisibilityOff-Dem2oC7P.js";import{g as re}from"./_commonjsHelpers-CE1G-McA.js";import{_ as le,A as M}from"./_baseIsEqual-BiOdebYq.js";import{A as v}from"./AdminComponentEasyAccessSet__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__-BJiKjF1c.js";import{T as J}from"./Tooltip-BHlkKxQm.js";import"./index-BTwTI1Tk.js";import"./AdminComponentEasyAccessSet__mf_v__runtimeInit__mf_v__-9o5tLcPN.js";import"./Clear-CZb6d-di.js";import"./useTheme-Y4z6S2UP.js";import"./defaultTheme-B6DpRwGi.js";import"./Grow-DnKMqB40.js";var de=le;function he(N,s){return de(N,s)}var ce=he;const pe=re(ce);class K extends E.ConfigGeneric{static defaultProps={widthPercent:30};constructor(s){super(s),this.state={...this.state,available:[],selectedTopic:"",added:[],assignments:s.currentAssignments||[],pagesMap:{},alive:!1,isCollapsed:!s.uniqueName,isLoading:{},lastLoadTime:{},focusReceived:{},retryCount:{},activeTab:0}}componentWillUnmount(){if(this.props.oContext&&this.props.oContext.socket){const s=this.props.oContext.instance??"0";this.props.oContext.socket.unsubscribeState(`system.adapter.${P}.${s}.alive`,this.onAliveChanged)}}async componentDidMount(){if(super.componentDidMount(),this.props.oContext&&this.props.oContext.socket){const s=this.props.oContext.instance??"0",n=`system.adapter.${P}.${s}.alive`;try{const i=await this.props.oContext.socket.getState(n),a=!!(i!=null&&i.val);this.setState({alive:a}),await this.props.oContext.socket.subscribeState(n,this.onAliveChanged)}catch(i){console.error("[NavigationAssignmentPanel] Failed to get alive state or subscribe:",i),this.setState({alive:!1})}}await this.loadPanels(!1),await this.applyAssignmentsFromProps(this.props.currentAssignments||[])}onAliveChanged=(s,n)=>{const i=this.state.alive,a=n?!!n.val:!1;i!==a&&(this.setState({alive:a}),!i&&a&&this.state.assignments.length>0&&this.retryLoadingPagesForAssignments())};async applyAssignmentsFromProps(s){var d;const n=(s||[]).map(m=>this.state.available.find(c=>c.panelTopic===m.topic)||{panelTopic:m.topic,friendlyName:m.topic}).sort((m,l)=>m.friendlyName.localeCompare(l.friendlyName));console.log(`[NavigationAssignmentPanel] applyAssignmentsFromProps: available=${JSON.stringify(this.state.available)}, added=${JSON.stringify(n)}`);const i=this.state.selectedAddedTopic,r=n.find(m=>m.panelTopic===i)?i:(d=n[0])==null?void 0:d.panelTopic;this.setState({assignments:s,added:n,selectedAddedTopic:r,selectedTopic:""});const o=n.map(m=>this.loadPagesForPanel(m.panelTopic,!0));await Promise.all(o)}componentDidUpdate(s){if(s.uniqueName!==this.props.uniqueName){const n=this.props.currentAssignments||[];this.props.uniqueName?this.setState(i=>({focusReceived:{...i.focusReceived,[this.props.uniqueName]:!0},isCollapsed:!1})):this.setState({isCollapsed:!0}),this.loadPanels(!1).then(()=>{this.applyAssignmentsFromProps(n)})}else if(this.props.currentAssignments&&!pe(s.currentAssignments||{},this.props.currentAssignments||{})){const n=this.props.currentAssignments||[];this.applyAssignmentsFromProps(n)}}async loadPanels(s=!0){var n;try{let i=[];this.props.fetchPanels?i=await this.props.fetchPanels():(n=this.props.data)!=null&&n.panels&&(i=(this.props.data.panels||[]).map(a=>({panelTopic:a.topic,friendlyName:a.name||a.topic}))),await new Promise(a=>this.setState({available:i,selectedTopic:""},()=>a()))}catch{this.setState({available:[],selectedTopic:""})}}doAddSelected=()=>{const{selectedTopic:s,available:n,added:i}=this.state;if(!s)return;let a=n.find(d=>d.panelTopic===s);if(!a&&s===D&&(a={panelTopic:D,friendlyName:`(${v.I18n.t("all")||"All"})`}),!a||i.find(d=>d.panelTopic===a.panelTopic))return;const r=[...i,a],o=[...this.state.assignments,{topic:a.panelTopic}];this.setState({added:r,assignments:o,selectedTopic:""}),this.loadPagesForPanel(a.panelTopic),this.props.onAssign&&this.props.uniqueName&&this.props.onAssign(this.props.uniqueName,o)};doRemoveSelected=()=>{const{added:s,selectedAddedTopic:n}=this.state;if(s.length)if(n){const i=s.filter(d=>d.panelTopic!==n),a=this.state.assignments.filter(d=>d.topic!==n),r=s.findIndex(d=>d.panelTopic===n);let o;if(i.length>0){const d=i[r]??i[r-1]??i[0];o=d==null?void 0:d.panelTopic}else o=void 0;this.setState({added:i,assignments:a,selectedAddedTopic:o}),this.props.onAssign&&this.props.uniqueName&&this.props.onAssign(this.props.uniqueName,a)}else{const i=s.slice(0,-1),a=this.state.assignments.slice(0,-1),r=i.length?i[i.length-1].panelTopic:void 0;this.setState({added:i,assignments:a,selectedAddedTopic:r}),this.props.onAssign&&this.props.uniqueName&&this.props.onAssign(this.props.uniqueName,a)}};selectAdded=s=>{this.setState({selectedAddedTopic:s}),this.loadPagesForPanel(s,!0)};retryLoadingPagesForAssignments(){const s=this.state.assignments.map(n=>n.topic);for(const n of s)this.loadPagesForPanel(n,!0)}async loadPagesForPanel(s,n=!1){var m,l;if(!s)return;if(!this.state.alive){console.log(`[NavigationAssignmentPanel] Adapter not alive, skipping pages load for ${s}`);return}const i=Date.now(),a=this.state.lastLoadTime[s]||0,r=this.state.isLoading[s],o=!!this.state.pagesMap[s],d=n||!o||i-a>6e4;if(!(r||!d&&o)){this.setState(c=>({isLoading:{...c.isLoading,[s]:!0},lastLoadTime:{...c.lastLoadTime,[s]:i}}));try{let c=[],p=!1;if((m=this.props.oContext)!=null&&m.socket){const f=this.props.oContext.instance??"0",g=`${P}.${f}`,S={panelTopic:s};try{const w=new Promise(($,R)=>{setTimeout(()=>R(new Error("sendTo timeout after 2 seconds")),2e3)}),q=this.props.oContext.socket.sendTo(g,G,S),I=await Promise.race([q,w]);Array.isArray(I)?(c=I,p=!0):I&&Array.isArray(I.result)&&(c=I.result,p=!0),console.log("[NavigationAssignmentPanel] sendTo successful",{topic:s,pages:c})}catch(w){console.warn("[NavigationAssignmentPanel] sendTo failed or timed out",{target:g,cmd:G,payload:S,error:w})}}if(p&&c.length===0){const f=this.state.retryCount[s]||0,g=3,S=2e3;if(f<g){console.log(`[NavigationAssignmentPanel] Got empty array for ${s}, retrying in ${S}ms (attempt ${f+1}/${g})`),this.setState(w=>({retryCount:{...w.retryCount,[s]:f+1}})),setTimeout(()=>{this.setState(w=>({isLoading:{...w.isLoading,[s]:!1}})),this.loadPagesForPanel(s,!0)},S);return}console.log(`[NavigationAssignmentPanel] Max retries reached for ${s}, accepting empty result`),this.setState(w=>({retryCount:{...w.retryCount,[s]:0}}))}else p&&c.length>0&&this.setState(f=>({retryCount:{...f.retryCount,[s]:0}}));if(!p&&!((l=this.props.oContext)!=null&&l.socket)&&(await new Promise(f=>setTimeout(f,1e3)),this.setState(f=>({isLoading:{...f.isLoading,[s]:!1}})),!this.state.focusReceived[s]))return this.setState(f=>({focusReceived:{...f.focusReceived,[s]:!0}})),this.loadPagesForPanel(s,!0);const T=this.state.pagesMap?this.state.pagesMap[s]:void 0,b=!!(this.state.isLoading&&this.state.isLoading[s]);(!(Array.isArray(T)&&T.length===c.length&&T.every((f,g)=>f===c[g]))||b!==!1)&&this.setState(f=>({pagesMap:{...f.pagesMap,[s]:c},isLoading:{...f.isLoading,[s]:!1}}))}catch(c){console.error("[NavigationAssignmentPanel] loadPagesForPanel error",{topic:s,error:c}),this.setState(p=>({isLoading:{...p.isLoading,[s]:!1}}))}}}setNavigationForSelected=s=>{const{selectedAddedTopic:n,assignments:i}=this.state;if(!n)return;const a=i.findIndex(m=>m.topic===n),r=[...i],o=i[a],d={topic:n,navigation:{...o==null?void 0:o.navigation,...s}};a>=0?r[a]=d:r.push(d),this.setState({assignments:r}),this.props.onAssign&&this.props.uniqueName&&this.props.onAssign(this.props.uniqueName,r)};getNavValue=(s,n)=>{var r;if(!s)return"";const i=this.state.assignments.find(o=>o.topic===s);return((r=i==null?void 0:i.navigation)==null?void 0:r[n])||""};togglePanel=()=>{const s=this.state.isCollapsed;this.setState(n=>({isCollapsed:!n.isCollapsed})),s&&this.applyAssignmentsFromProps(this.props.currentAssignments||[])};handleTabChange=(s,n)=>{this.setState({activeTab:n})};handleCommonFieldChange(s,n){this.props.onCommonFieldsChange&&this.props.onCommonFieldsChange({[s]:n})}renderCommonFields(){const{commonFields:s}=this.props;return s?e.jsxs(t.Box,{sx:{mt:2,pt:2,borderTop:"1px solid",borderColor:"divider"},children:[e.jsx(t.Box,{sx:{mb:2},children:e.jsx(t.FormControlLabel,{control:e.jsx(t.Checkbox,{checked:!!s.hidden,onChange:(n,i)=>{this.handleCommonFieldChange("hidden",i)}}),label:v.I18n.t("hidden")})}),e.jsx(t.Box,{sx:{mt:2},children:e.jsxs(t.FormControl,{component:"fieldset",children:[e.jsx(t.Typography,{variant:"subtitle2",sx:{mb:1},children:v.I18n.t("alwaysOn")}),e.jsxs(t.RadioGroup,{row:!0,value:s.alwaysOn||"none",onChange:(n,i)=>{this.handleCommonFieldChange("alwaysOn",i)},children:[e.jsx(t.FormControlLabel,{value:"none",control:e.jsx(t.Radio,{}),label:v.I18n.t("alwaysOn_none")}),e.jsx(t.FormControlLabel,{value:"always",control:e.jsx(t.Radio,{}),label:v.I18n.t("alwaysOn_always")}),e.jsx(t.FormControlLabel,{value:"ignore",control:e.jsx(t.Radio,{}),label:v.I18n.t("alwaysOn_ignore")})]})]})})]}):e.jsx(t.Box,{sx:{mt:2},children:e.jsx(t.Typography,{variant:"body2",color:"text.secondary",children:this.getText("select_description")})})}renderItem(s,n,i){const{widthPercent:a}=this.props,{isCollapsed:r,activeTab:o}=this.state,d=this.state.selectedAddedTopic?this.state.pagesMap[this.state.selectedAddedTopic]??[]:[],m=r||!this.props.uniqueName;return e.jsxs(t.Box,{sx:{position:{xs:"static",md:"absolute"},right:{xs:"auto",md:0},top:{xs:"auto",md:0},height:{xs:"auto",md:"100%"},width:{xs:"100%",md:m?"10px":`${a}%`},minHeight:{xs:m?"50px":"auto",md:"auto"},transition:"width 240ms ease, min-height 240ms ease",backgroundColor:"background.default",border:{xs:"2px solid",md:"none"},borderLeft:{xs:"none",md:"2px solid"},borderTop:{xs:"none",md:"2px solid"},borderColor:"secondary.main",borderRadius:{xs:1,md:0},overflow:{xs:"hidden",md:"visible"},display:"flex",flexDirection:"column",zIndex:20,mt:{xs:2,md:0}},children:[e.jsx(t.Box,{sx:{display:{xs:"none",md:"flex"},position:"absolute",left:"-20px",top:"50%",transform:"translateY(-50%)",width:"20px",height:"60px",backgroundColor:"secondary.main",borderRadius:"4px 0 0 4px",alignItems:"center",justifyContent:"center",cursor:this.props.uniqueName?"pointer":"not-allowed",opacity:this.props.uniqueName?1:.5,zIndex:21,"&:hover":{backgroundColor:"secondary.dark"}},onClick:()=>{this.props.uniqueName&&this.togglePanel()},children:e.jsx(t.Typography,{sx:{color:"secondary.contrastText",fontSize:"14px",fontWeight:"bold",transform:"rotate(-90deg)",whiteSpace:"nowrap"},children:m?"⏶":"⏷"})}),e.jsx(t.Box,{sx:{display:{xs:"flex",md:"none"},alignItems:"center",justifyContent:"center",p:1,backgroundColor:"secondary.main",color:"secondary.contrastText",borderRadius:"4px 4px 0 0"},children:e.jsx(t.Typography,{variant:"subtitle2",sx:{fontWeight:600},children:v.I18n.t("navigation_panel")})}),e.jsxs(t.Box,{sx:{p:1,height:"100%",display:{xs:"flex",md:m?"none":"flex"},flexDirection:"column",width:{xs:"100%",md:m?"0%":"100%"},overflow:"hidden",transition:{xs:"none",md:"width 240ms ease"}},children:[e.jsx(t.Typography,{variant:"h6",sx:{mb:1,fontWeight:600,color:"primary.main",fontSize:"1rem",display:{xs:"none",md:"block"}},children:v.I18n.t("navigation_panel")}),e.jsxs(t.Tabs,{value:o??0,onChange:this.handleTabChange,variant:"scrollable",scrollButtons:!1,sx:{mb:1,minHeight:{xs:36,md:48},"& .MuiTab-root":{minHeight:{xs:36,md:48},py:{xs:.5,md:1.5},fontSize:{xs:"0.75rem",md:"0.875rem"}}},"aria-label":"Navigation assignment tabs",children:[e.jsx(t.Tab,{icon:e.jsx(se,{sx:{fontSize:{xs:18,md:20}}}),iconPosition:"start",label:e.jsxs(e.Fragment,{children:[e.jsx(t.Box,{component:"span",sx:{display:{xs:"inline",md:"none"}},children:v.I18n.t("nav")||"Nav"}),e.jsx(t.Box,{component:"span",sx:{display:{xs:"none",md:"inline"}},children:v.I18n.t("navigation")||"Navigation"})]}),sx:{minWidth:{xs:"auto",md:90},px:{xs:1,md:2}}}),e.jsx(t.Tab,{icon:e.jsx(ae,{sx:{fontSize:{xs:18,md:20}}}),iconPosition:"start",label:e.jsxs(e.Fragment,{children:[e.jsx(t.Box,{component:"span",sx:{display:{xs:"inline",md:"none"}},children:v.I18n.t("details")||"Details"}),e.jsx(t.Box,{component:"span",sx:{display:{xs:"none",md:"inline"}},children:v.I18n.t("pagedetails")||"Page Details"})]}),sx:{minWidth:{xs:"auto",md:90},px:{xs:1,md:2}}}),e.jsx(t.Tab,{icon:e.jsx(ie,{sx:{fontSize:{xs:18,md:20}}}),iconPosition:"start",label:e.jsxs(e.Fragment,{children:[e.jsx(t.Box,{component:"span",sx:{display:{xs:"inline",md:"none"}},children:v.I18n.t("free")||"Free"}),e.jsx(t.Box,{component:"span",sx:{display:{xs:"none",md:"inline"}},children:v.I18n.t("placeholder")||"Placeholder"})]}),sx:{minWidth:{xs:"auto",md:90},px:{xs:1,md:2}}})]}),o===0&&e.jsxs(e.Fragment,{children:[e.jsxs(t.Box,{sx:{display:"flex",gap:1,alignItems:"center",mb:1},children:[e.jsxs(t.Select,{size:"small",variant:"standard",value:this.state.selectedTopic,onOpen:()=>{this.loadPanels()},onChange:l=>this.setState({selectedTopic:String(l.target.value)}),disabled:!this.state.alive,sx:{flex:1,backgroundColor:"transparent",minHeight:40,"& .MuiSelect-select":{backgroundColor:"transparent",display:"flex",alignItems:"center",height:40}},displayEmpty:!0,children:[e.jsx(t.MenuItem,{value:"",children:e.jsx("em",{children:"—"})}),!this.state.added.some(l=>l.panelTopic===D)&&e.jsx(t.MenuItem,{value:D,children:`(${v.I18n.t("all")||"All"})`}),this.state.available.filter(l=>!this.state.added.some(c=>c.panelTopic===l.panelTopic)).map(l=>e.jsx(t.MenuItem,{value:l.panelTopic,children:l.friendlyName},l.panelTopic))]}),e.jsx(t.Button,{size:"small",variant:"contained",sx:{minWidth:32,padding:"4px 8px"},onClick:this.doAddSelected,disabled:!this.state.selectedTopic||!this.state.alive,children:"+"})]}),e.jsx(t.Box,{children:this.state.added.length===0?e.jsx(t.Typography,{variant:"body1",color:"text.secondary",children:v.I18n.t("No panels added")}):e.jsx("div",{style:{overflow:"auto"},children:e.jsx(t.List,{dense:!0,children:this.state.added.map(l=>{const c=l.panelTopic,p=this.state.pendingDelete===c;return e.jsx(k.Fragment,{children:e.jsx(t.ListItem,{component:"div",disablePadding:!0,sx:{"&:hover .delete-icon":{opacity:1}},secondaryAction:e.jsx(t.IconButton,{className:"delete-icon",edge:"end","aria-label":"delete",size:"small",onClick:T=>{var b;if(T.stopPropagation(),!p)this.setState({pendingDelete:c}),setTimeout(()=>{this.state.pendingDelete===c&&this.setState({pendingDelete:void 0})},3e3);else{const F=this.state.added.filter(S=>S.panelTopic!==c),f=this.state.assignments.filter(S=>S.topic!==c),g=F.length>0?(b=F[0])==null?void 0:b.panelTopic:void 0;this.setState({added:F,assignments:f,selectedAddedTopic:g,pendingDelete:void 0}),this.props.onAssign&&this.props.uniqueName&&this.props.onAssign(this.props.uniqueName,f)}},sx:{color:p?"error.dark":"error.main",opacity:{xs:1,md:0},transition:"opacity 0.2s",backgroundColor:p?"error.main":"transparent","&:hover":{backgroundColor:p?"error.dark":"action.hover"}},children:e.jsx(Q,{fontSize:"small"})}),children:e.jsx(t.ListItemButton,{selected:this.state.selectedAddedTopic===c,onClick:()=>{this.selectAdded(c),this.setState({pendingDelete:void 0})},sx:{pr:6},children:e.jsx(t.ListItemText,{primary:c===D?`(${v.I18n.t("all")||"All"})`:l.friendlyName,slotProps:{primary:{sx:{fontSize:"1.05rem",lineHeight:1.2}}},sx:{flex:1,overflow:"hidden",textOverflow:"ellipsis"}})})})},c)})})})}),e.jsx(t.Divider,{sx:{my:1}}),!this.props.hideNavigationFields&&e.jsxs(t.Box,{sx:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:1,mt:1},children:[e.jsxs(t.Box,{children:[e.jsx(t.Box,{sx:{display:"flex",alignItems:"center",mb:.5},children:e.jsx(J,{title:v.I18n.t("nav_prev_tooltip"),children:e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{mr:.5},children:"prev"})})}),e.jsxs(t.Select,{size:"small",displayEmpty:!0,"aria-label":"prev",value:this.getNavValue(this.state.selectedAddedTopic,"prev")||"",onOpen:()=>{this.state.selectedAddedTopic&&this.loadPagesForPanel(this.state.selectedAddedTopic,!0)},onChange:l=>this.setNavigationForSelected({prev:String(l.target.value)||void 0}),sx:{width:"100%"},disabled:!this.state.alive||this.state.selectedAddedTopic&&this.state.isLoading[this.state.selectedAddedTopic]||!1,endAdornment:this.state.selectedAddedTopic&&this.state.isLoading[this.state.selectedAddedTopic]?e.jsx(t.Box,{sx:{display:"flex",alignItems:"center",pr:1},children:e.jsx(t.CircularProgress,{size:16})}):null,children:[e.jsx(t.MenuItem,{value:"",children:this.state.selectedAddedTopic?e.jsx("em",{children:"—"}):e.jsx("em",{children:v.I18n.t("select_panel_first")})}),d.filter(l=>l!==this.props.uniqueName).map(l=>e.jsx(t.MenuItem,{value:l,children:l},`prev-${l}`))]})]}),e.jsxs(t.Box,{children:[e.jsx(t.Box,{sx:{display:"flex",alignItems:"center",mb:.5},children:e.jsx(J,{title:v.I18n.t("nav_next_tooltip"),children:e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{mr:.5},children:"next"})})}),e.jsxs(t.Select,{size:"small",displayEmpty:!0,"aria-label":"next",value:this.getNavValue(this.state.selectedAddedTopic,"next")||"",onOpen:()=>{this.state.selectedAddedTopic&&this.loadPagesForPanel(this.state.selectedAddedTopic,!0)},onChange:l=>this.setNavigationForSelected({next:String(l.target.value)||void 0}),sx:{width:"100%"},disabled:!this.state.alive||this.state.selectedAddedTopic&&this.state.isLoading[this.state.selectedAddedTopic]||!1,endAdornment:this.state.selectedAddedTopic&&this.state.isLoading[this.state.selectedAddedTopic]?e.jsx(t.Box,{sx:{display:"flex",alignItems:"center",pr:1},children:e.jsx(t.CircularProgress,{size:16})}):null,children:[e.jsx(t.MenuItem,{value:"",children:this.state.selectedAddedTopic?e.jsx("em",{children:"—"}):e.jsx("em",{children:v.I18n.t("select_panel_first")})}),d.filter(l=>l!==this.props.uniqueName&&!l.startsWith("///")).map(l=>e.jsx(t.MenuItem,{value:l,children:l},`next-${l}`))]})]}),e.jsxs(t.Box,{children:[e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{mb:.5,display:"block"},children:"home"}),e.jsxs(t.Select,{size:"small",displayEmpty:!0,"aria-label":"home",value:this.getNavValue(this.state.selectedAddedTopic,"home")||"",onOpen:()=>{this.state.selectedAddedTopic&&this.loadPagesForPanel(this.state.selectedAddedTopic,!0)},onChange:l=>this.setNavigationForSelected({home:String(l.target.value)||void 0}),sx:{width:"100%"},disabled:!this.state.alive||this.state.selectedAddedTopic&&this.state.isLoading[this.state.selectedAddedTopic]||!1,endAdornment:this.state.selectedAddedTopic&&this.state.isLoading[this.state.selectedAddedTopic]?e.jsx(t.Box,{sx:{display:"flex",alignItems:"center",pr:1},children:e.jsx(t.CircularProgress,{size:16})}):null,children:[e.jsx(t.MenuItem,{value:"",children:e.jsx("em",{children:"—"})}),d.filter(l=>l!==this.props.uniqueName).map(l=>e.jsx(t.MenuItem,{value:l,children:l},`home-${l}`))]})]}),e.jsxs(t.Box,{children:[e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{mb:.5,display:"block"},children:"parent"}),e.jsxs(t.Select,{size:"small",displayEmpty:!0,"aria-label":"parent",value:this.getNavValue(this.state.selectedAddedTopic,"parent")||"",onOpen:()=>{this.state.selectedAddedTopic&&this.loadPagesForPanel(this.state.selectedAddedTopic,!0)},onChange:l=>this.setNavigationForSelected({parent:String(l.target.value)||void 0}),sx:{width:"100%"},disabled:!this.state.alive||this.state.selectedAddedTopic&&this.state.isLoading[this.state.selectedAddedTopic]||!1,endAdornment:this.state.selectedAddedTopic&&this.state.isLoading[this.state.selectedAddedTopic]?e.jsx(t.Box,{sx:{display:"flex",alignItems:"center",pr:1},children:e.jsx(t.CircularProgress,{size:16})}):null,children:[e.jsx(t.MenuItem,{value:"",children:e.jsx("em",{children:"—"})}),d.filter(l=>l!==this.props.uniqueName).map(l=>e.jsx(t.MenuItem,{value:l,children:l},`parent-${l}`))]})]}),e.jsx(t.Divider,{sx:{my:1}})]}),this.state.added.length>0?this.state.added.map(l=>{const c=l.panelTopic,p=this.state.added.some(I=>I.panelTopic===D),T=this.getNavValue(c,"next"),b=this.getNavValue(c,"prev"),F=this.getNavValue(c,"home"),f=this.getNavValue(c,"parent"),g=!!(T||b||F||f),S=c===D,w=!T&&!b,q=S?"nav_all_requires_prev_next":p?"nav_remove_from_all_notice":"nav_target_only_notice";return e.jsxs(t.Box,{"data-has-all":p,sx:{mt:2,mb:1},children:[e.jsxs(t.Box,{sx:{display:"flex",alignItems:"center",gap:1,mb:.5},children:[e.jsx(t.Box,{sx:{width:10,height:10,borderRadius:"50%",bgcolor:g?"success.main":"error.main"}}),e.jsx(t.Typography,{variant:"subtitle2",sx:{fontWeight:600},children:c===D?`(${v.I18n.t("all")||"All"})`:l.friendlyName||c})]}),e.jsx(t.Box,{sx:{display:"flex",alignItems:"center",gap:1,flexWrap:"wrap"},children:["next","prev","parent","home"].map((I,$)=>{const R=this.getNavValue(c,I);return e.jsxs(k.Fragment,{children:[e.jsxs(t.Box,{sx:{display:"flex",alignItems:"center",gap:.5},children:[e.jsx(t.Typography,{variant:"caption",color:"text.secondary",children:v.I18n.t(I)||I}),e.jsx(t.Typography,{variant:"body2",children:R||e.jsx("em",{children:"—"})})]}),$<3&&e.jsx(t.Divider,{orientation:"vertical",flexItem:!0,sx:{height:18,mx:1}})]},`${c}-${I}`)})}),w?e.jsx(t.Box,{sx:{mt:1},children:e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{fontStyle:"italic"},children:v.I18n.t(q)})}):null]},`panel-summary-${c}`)}):null]}),o===1&&e.jsx(e.Fragment,{children:this.renderCommonFields()}),o===2&&e.jsx(e.Fragment,{children:e.jsx(t.Typography,{variant:"body1",color:"text.secondary",children:v.I18n.t("Placeholder content for this tab.")})})]})]})}}class me extends k.Component{constructor(s){super(s),this.state={newName:"",confirmDeleteOpen:!1,confirmDeleteName:null}}getText(s){return this.props.getText(s)}handleAdd=()=>{const s=this.state.newName.trim();!s||this.props.selectedCardType==="all"||(this.props.onAdd(s,this.props.selectedCardType),this.setState({newName:""}),this.props.onSelectedChange(s))};handleDeleteClick=s=>{this.setState({confirmDeleteOpen:!0,confirmDeleteName:s})};handleDeleteConfirm=()=>{const s=this.state.confirmDeleteName;if(!s){this.setState({confirmDeleteOpen:!1,confirmDeleteName:null});return}this.props.onDelete(s),this.setState({confirmDeleteOpen:!1,confirmDeleteName:null})};handleDeleteCancel=()=>{this.setState({confirmDeleteOpen:!1,confirmDeleteName:null})};render(){const{entries:s,selected:n,selectedCardType:i,onSelectedChange:a,onCardTypeChange:r,onAssign:o,children:d,oContext:m,navigationPanelProps:l}=this.props,c=Array.from(new Set(s.map(g=>g.uniqueName))).filter(Boolean),p=i==="all"?s:s.filter(g=>g.card===i),T=Array.from(new Set(p.map(g=>g.uniqueName))).filter(Boolean),b=s.find(g=>g.uniqueName===n),F=(b==null?void 0:b.navigationAssignment)||[],f=`https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki/${encodeURIComponent(i==="all"?b!=null&&b.card?b.card:"PageConfig":i)}`;return e.jsxs(t.Box,{sx:{height:"calc(100vh - 64px)",display:"flex",flexDirection:{xs:"column",md:"row"},p:1},children:[e.jsxs(t.Box,{sx:{width:{xs:"100%",md:"20%"},pr:{xs:0,md:1},display:"flex",flexDirection:"column",gap:1},children:[e.jsx(t.Paper,{sx:{p:0,mb:1,backgroundColor:"transparent"},elevation:0,children:e.jsxs(t.FormControl,{fullWidth:!0,variant:"standard",children:[e.jsx(t.Typography,{variant:"h6",sx:{mb:1,fontWeight:600,color:"primary.main",fontSize:"1rem"},children:this.getText("page_type")}),e.jsxs(t.Select,{value:i,onChange:g=>{r(g.target.value)},sx:{backgroundColor:"transparent",px:1},children:[e.jsx(t.MenuItem,{value:"all",children:this.getText("page_type_all")}),e.jsx(t.MenuItem,{value:"cardAlarm",children:this.getText("page_type_alarm")}),e.jsx(t.MenuItem,{value:"cardQR",children:this.getText("page_type_qr")}),e.jsx(t.MenuItem,{value:"cardTrash",children:this.getText("page_type_trash")})]})]})}),e.jsx(t.Typography,{variant:"h6",sx:{mt:1,fontWeight:600,color:"primary.main",fontSize:"1rem"},children:this.getText("pages")}),i!=="all"&&e.jsx(t.Paper,{sx:{p:0,backgroundColor:"transparent"},elevation:0,children:e.jsxs(t.Box,{sx:{display:"flex",gap:1},children:[e.jsx(t.TextField,{"aria-label":"new-name",label:this.getText("new_page"),value:this.state.newName,onChange:g=>{this.setState({newName:g.target.value})},variant:"standard",placeholder:this.getText("New item"),InputProps:{sx:{backgroundColor:"transparent",px:1}},sx:{flex:1,"& .MuiInput-underline:before":{borderBottomColor:"primary.main"},"& .MuiInput-underline:hover:before":{borderBottomColor:"primary.main"},"& .MuiInput-underline:after":{borderBottomColor:"primary.main"},"& .MuiInputLabel-root":{color:"primary.main"},"& .MuiInputLabel-root.Mui-focused":{color:"primary.main"}}}),e.jsx(t.Button,{size:"small",variant:"contained",onClick:this.handleAdd,disabled:!this.state.newName.trim()||c.includes(this.state.newName.trim()),children:"+"})]})}),e.jsx(t.Paper,{sx:{overflow:"auto",p:0,backgroundColor:"transparent"},elevation:0,children:T.length===0?e.jsx(t.Typography,{variant:"body2",color:"text.secondary",children:this.getText("No items")}):T.map(g=>e.jsxs(t.Box,{onClick:()=>{a(g)},sx:{p:1,borderRadius:1,cursor:"pointer",backgroundColor:n===g?"action.selected":"transparent",mb:.5,display:"flex",justifyContent:"space-between",alignItems:"center","&:hover .delete-icon":{opacity:1}},children:[e.jsx(t.Typography,{variant:"body2",sx:{flex:1,overflow:"hidden",textOverflow:"ellipsis"},children:g}),e.jsx(t.IconButton,{className:"delete-icon",edge:"end","aria-label":"delete",size:"small",onClick:S=>{S.stopPropagation(),this.handleDeleteClick(g)},sx:{color:"error.main",opacity:{xs:1,md:0},transition:"opacity 0.2s"},children:e.jsx(Q,{fontSize:"small"})})]},g))}),e.jsx(t.Divider,{sx:{my:1}}),f&&e.jsx(t.Box,{sx:{mb:2},children:e.jsx("a",{href:f,target:"_blank",rel:"noopener noreferrer",style:{textDecoration:"none",color:"inherit",fontSize:"0.875rem"},children:e.jsx(t.Typography,{variant:"body2",sx:{color:"primary.main",textDecoration:"underline",cursor:"pointer","&:hover":{opacity:.8}},children:this.getText("documentation")})})})]}),e.jsx(z,{open:this.state.confirmDeleteOpen,onClose:this.handleDeleteCancel,onConfirm:this.handleDeleteConfirm,title:this.getText("delete_confirm_title"),description:this.getText("delete_confirm_text")+(this.state.confirmDeleteName?`: ${this.state.confirmDeleteName}`:""),cancelText:this.getText("Cancel1"),confirmText:this.getText("Delete"),ariaTitleId:"unlock-delete-confirm-title",ariaDescId:"unlock-delete-confirm-description"}),e.jsxs(t.Box,{sx:{width:{xs:"100%",md:"90%"},pl:{xs:0,md:2},mt:{xs:2,md:0},display:"flex",flexDirection:{xs:"column",md:"row"},gap:1,position:"relative"},children:[e.jsx(t.Box,{sx:{width:{xs:"100%",md:"95%"},borderLeft:{xs:"none",md:"1px solid"},borderColor:"divider",overflow:"hidden",display:"flex",flexDirection:"column"},children:e.jsx(t.Paper,{sx:{height:"100%",p:2,overflow:"auto",display:"flex",flexDirection:"column"},elevation:1,children:d})}),e.jsx(K,{...l,widthPercent:30,uniqueName:n,currentAssignments:F,oContext:m,onAssign:o})]})]})}}class xe extends k.Component{constructor(s){super(s),this.state={showPin:!1}}getText(s){return this.props.getText(s)}handleFieldChange(s,n){const i={...this.props.entry,[s]:n};this.props.onEntryChange(i)}render(){const{entry:s,pagesList:n}=this.props;return e.jsxs(t.Box,{children:[e.jsx(t.Box,{sx:{mb:1,p:1,borderRadius:1,backgroundColor:"action.hover"},children:e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:"text",label:this.getText("unique_label"),value:s.uniqueName,onChange:i=>{const a=i.target.value;a.trim()&&this.props.onUniqueNameChange(s.uniqueName,a)},InputProps:{sx:{backgroundColor:"transparent",px:1,fontWeight:600,width:"50%"}}})}),e.jsx(t.Box,{sx:{mb:1},children:e.jsxs(t.FormControl,{component:"fieldset",children:[e.jsx(t.Typography,{variant:"subtitle2",sx:{mb:1},children:this.getText("unlock_type")}),e.jsxs(t.RadioGroup,{row:!0,value:s.alarmType||"",onChange:(i,a)=>{this.handleFieldChange("alarmType",a)},children:[e.jsx(t.FormControlLabel,{value:"alarm",control:e.jsx(t.Radio,{}),label:this.getText("unlock_alarm")}),e.jsx(t.FormControlLabel,{value:"unlock",control:e.jsx(t.Radio,{}),label:this.getText("unlock_unlock")})]})]})}),e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:"text",autoComplete:"off",label:this.getText("headline"),value:s.headline??"",onChange:i=>{this.handleFieldChange("headline",i.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1,width:"50%"}},sx:{mb:2}}),e.jsx(t.Box,{sx:{mt:2},children:e.jsx(t.TextField,{variant:"standard",label:this.getText("unlock_pin"),type:this.state.showPin?"text":"password",value:s.pin!==void 0&&s.pin!==null?String(s.pin):"",onChange:i=>{const r=i.target.value.replace(/[^0-9]/g,""),o=r?parseInt(r,10):0;this.handleFieldChange("pin",o)},InputProps:{sx:{backgroundColor:"transparent",px:1},endAdornment:e.jsx(t.InputAdornment,{position:"end",children:e.jsx(t.IconButton,{"aria-label":this.state.showPin?"hide-pin":"show-pin",onClick:()=>{this.setState({showPin:!this.state.showPin})},edge:"end",size:"small",children:this.state.showPin?e.jsx(ne,{fontSize:"small"}):e.jsx(oe,{fontSize:"small"})})})}})}),s.alarmType==="alarm"&&e.jsxs(t.Box,{sx:{mt:2},children:[e.jsxs(t.Box,{sx:{display:"grid",gridTemplateColumns:{xs:"1fr",md:"1fr 1fr"},gap:2},children:[e.jsxs(t.Box,{children:[e.jsx(t.Typography,{variant:"subtitle2",sx:{mb:1},children:this.getText("unlock_armed_header")}),e.jsx(t.Box,{sx:{display:"grid",gap:2},children:[1,2,3,4].map(i=>{const a=`button${i}`,r=(i-1)%4+1;return e.jsxs(t.Box,{children:[e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{mb:.5},children:this.getText(`unlock_button${r}_label`)}),e.jsx(t.TextField,{fullWidth:!0,variant:"standard",placeholder:this.getText(`unlock_button${r}_placeholder`),value:s[a]??"",onChange:o=>{this.handleFieldChange(a,o.target.value)},InputProps:{disableUnderline:!0,sx:{backgroundColor:"transparent",px:1,"& input::placeholder":{color:"text.disabled"}}}})]},i)})})]}),e.jsxs(t.Box,{children:[e.jsx(t.Typography,{variant:"subtitle2",sx:{mb:1},children:this.getText("unlock_disarmed_header")}),e.jsx(t.Box,{sx:{display:"grid",gap:2},children:[5,6,7,8].map(i=>{const a=`button${i}`,r=(i-1)%4+1;return e.jsxs(t.Box,{children:[e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{mb:.5},children:this.getText(`unlock_button${r}_label`)}),e.jsx(t.TextField,{fullWidth:!0,variant:"standard",placeholder:this.getText(`unlock_button${r}_placeholder`),value:s[a]??"",onChange:o=>{this.handleFieldChange(a,o.target.value)},InputProps:{disableUnderline:!0,sx:{backgroundColor:"transparent",px:1,"& input::placeholder":{color:"text.disabled"}}}})]},i)})})]})]}),e.jsx(t.Box,{sx:{mt:1},children:e.jsx(t.FormControlLabel,{control:e.jsx(t.Checkbox,{checked:!!s.approved,onChange:(i,a)=>{this.handleFieldChange("approved",a)}}),label:this.getText("unlock_approved")})}),e.jsx(t.Box,{sx:{mt:1},children:e.jsx(t.FormControlLabel,{control:e.jsx(t.Checkbox,{checked:!!s.global,onChange:(i,a)=>{this.handleFieldChange("global",a)}}),label:this.getText("unlock_global")})})]}),s.alarmType==="unlock"&&e.jsxs(t.Box,{sx:{mt:2},children:[e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{mb:.5},children:this.getText("unlock_setnavi_hint")}),e.jsxs(t.Select,{variant:"standard",displayEmpty:!0,value:s.setNavi??"",onChange:i=>{this.handleFieldChange("setNavi",String(i.target.value))},sx:{backgroundColor:"transparent",px:1,width:"60%"},children:[e.jsx(t.MenuItem,{value:"",children:e.jsx("em",{children:this.getText("unlock_setnavi_placeholder")})}),n.filter(i=>typeof i=="string"&&!i.startsWith("///")&&i!==s.uniqueName).map(i=>e.jsx(t.MenuItem,{value:i,children:i},i)),s.setNavi&&s.setNavi!==s.uniqueName&&!n.includes(s.setNavi)&&e.jsx(t.MenuItem,{value:s.setNavi,children:s.setNavi},`custom-${s.setNavi}`)]})]})]})}}class O extends k.Component{constructor(s){super(s),this.state={showSelectDialog:!1}}render(){const{label:s,value:n,onChange:i,socket:a,theme:r,themeType:o,dialogName:d,filterFunc:m,disabled:l}=this.props,{showSelectDialog:c}=this.state;return e.jsxs(t.Box,{sx:{mb:1},children:[e.jsx(t.Typography,{variant:"body2",sx:{mb:.5,color:"text.secondary",fontSize:"0.875rem"},children:s}),e.jsxs(t.Box,{sx:{display:"flex",gap:1,alignItems:"center"},children:[e.jsx(t.TextField,{fullWidth:!0,variant:"standard",value:n||"",onChange:p=>i(p.target.value),disabled:l}),e.jsx(t.Button,{variant:"outlined",onClick:()=>this.setState({showSelectDialog:!0}),sx:{minWidth:48},disabled:l,children:"..."}),c&&e.jsx(v.SelectID,{socket:a,selected:n||"",onOk:p=>{const T=Array.isArray(p)?p[0]:p;i(T||""),this.setState({showSelectDialog:!1})},onClose:()=>this.setState({showSelectDialog:!1}),filterFunc:m||(p=>(p==null?void 0:p.type)==="state"),dialogName:d,theme:r,themeType:o})]})]})}}class ue extends k.Component{constructor(s){super(s),this.state={showPassword:!1}}getText(s){return this.props.getText(s)}handleFieldChange(s,n){const i={...this.props.entry,[s]:n};this.props.onEntryChange(i)}render(){var a;const{entry:s,oContext:n,theme:i}=this.props;return e.jsxs(t.Box,{children:[e.jsx(t.Box,{sx:{mb:1,p:1,borderRadius:1,backgroundColor:"action.hover"},children:e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:"text",label:this.getText("unique_label"),value:s.uniqueName,onChange:r=>{const o=r.target.value;o.trim()&&this.props.onUniqueNameChange(s.uniqueName,o)},InputProps:{sx:{backgroundColor:"transparent",px:1,fontWeight:600,width:"50%"}}})}),e.jsx(t.Box,{sx:{mb:2},children:e.jsxs(t.FormControl,{component:"fieldset",children:[e.jsx(t.FormLabel,{component:"legend",children:this.getText("qr_type")}),e.jsxs(t.RadioGroup,{row:!0,value:s.selType??0,onChange:r=>{const o=parseInt(r.target.value,10);this.handleFieldChange("selType",o)},children:[e.jsx(t.FormControlLabel,{value:0,control:e.jsx(t.Radio,{}),label:this.getText("qr_type_free")}),e.jsx(t.FormControlLabel,{value:1,control:e.jsx(t.Radio,{}),label:this.getText("qr_type_wifi")}),e.jsx(t.FormControlLabel,{value:2,control:e.jsx(t.Radio,{}),label:this.getText("qr_type_url")}),e.jsx(t.FormControlLabel,{value:3,control:e.jsx(t.Radio,{}),label:this.getText("qr_type_tel")})]})]})}),e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:"text",autoComplete:"off",label:this.getText("headline"),value:s.headline??"",onChange:r=>{this.handleFieldChange("headline",r.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1,width:"50%"}},sx:{mb:2}}),e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:"text",autoComplete:"off",label:(()=>{switch(s.selType){case 0:return this.getText("qr_content_free");case 1:return this.getText("qr_content_wifi");case 2:return this.getText("qr_content_url");case 3:return this.getText("qr_content_tel");default:return this.getText("qr_content")}})(),value:s.ssidUrlTel??"",onChange:r=>{this.handleFieldChange("ssidUrlTel",r.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1}},sx:{mb:2}}),s.selType===1&&e.jsxs(t.Box,{sx:{mb:2},children:[e.jsxs(t.FormControl,{variant:"standard",sx:{mb:2,minWidth:240},children:[e.jsx(t.InputLabel,{children:this.getText("qr_wlan_type")}),e.jsxs(t.Select,{value:s.wlantype??"WPA2",onChange:r=>{const o=r.target.value;this.handleFieldChange("wlantype",o)},children:[e.jsx(t.MenuItem,{value:"nopass",children:"No Password"}),e.jsx(t.MenuItem,{value:"WPA",children:"WPA"}),e.jsx(t.MenuItem,{value:"WPA2",children:"WPA2"}),e.jsx(t.MenuItem,{value:"WPA3",children:"WPA3"}),e.jsx(t.MenuItem,{value:"WEP",children:"WEP"})]})]}),s.wlantype!=="nopass"&&e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:this.state.showPassword?"text":"password",label:this.getText("qr_password"),value:s.qrPass??"",onChange:r=>{this.handleFieldChange("qrPass",r.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1},endAdornment:e.jsx(t.InputAdornment,{position:"end",children:e.jsx(t.IconButton,{"aria-label":"toggle password visibility",onClick:()=>{this.setState({showPassword:!this.state.showPassword})},edge:"end",children:this.state.showPassword?e.jsx(M.VisibilityOff,{}):e.jsx(M.Visibility,{})})})},sx:{mb:2}}),e.jsxs(t.Box,{sx:{display:"flex",gap:2},children:[e.jsx(t.FormControlLabel,{control:e.jsx(t.Checkbox,{checked:!!s.wlanhidden,onChange:(r,o)=>{this.handleFieldChange("wlanhidden",o)}}),label:this.getText("qr_wlan_hidden")}),e.jsx(t.FormControlLabel,{control:e.jsx(t.Checkbox,{checked:!!s.pwdhidden,onChange:(r,o)=>{this.handleFieldChange("pwdhidden",o)}}),label:this.getText("qr_pwd_hidden")})]}),e.jsx(t.Box,{sx:{mb:2},children:e.jsx(O,{label:this.getText("qr_set_state"),value:s.setState??void 0,onChange:r=>{this.handleFieldChange("setState",r)},socket:n.socket,theme:i,themeType:((a=i==null?void 0:i.palette)==null?void 0:a.mode)||"light",dialogName:"selectState",filterFunc:r=>!!(r&&r.type==="state"&&r.common&&r.common.type==="boolean"&&r.common.write&&r.common.read)})})]})]})}}class ge extends k.Component{fileInputRef=k.createRef();constructor(s){super(s),this.state={uploadedEvents:[],selectedEvents:[],alive:!1}}async componentDidMount(){const{oContext:s}=this.props,n=s.instance??"0",i=`system.adapter.${s.adapterName}.${n}.alive`;try{const a=await s.socket.getState(i),r=!!(a!=null&&a.val);this.setState({alive:r}),await s.socket.subscribeState(i,this.onAliveChanged)}catch(a){console.error("[PageTrashEditor] Failed to get alive state:",a),this.setState({alive:!1})}}componentWillUnmount(){const{oContext:s}=this.props,n=s.instance??"0";s.socket.unsubscribeState(`system.adapter.${s.adapterName}.${n}.alive`,this.onAliveChanged)}onAliveChanged=(s,n)=>{const i=n?!!n.val:!1;this.setState({alive:i})};getText(s){return this.props.getText(s)}handleFieldChange(s,n){const i={...this.props.entry,[s]:n};this.props.onEntryChange(i)}handleFileSelect=s=>{var i;const n=(i=s.target.files)==null?void 0:i[0];if(n)try{const{oContext:a}=this.props,r=new FileReader;r.onload=async o=>{var m;const d=(m=o.target)==null?void 0:m.result;if(!d){alert("Upload failed: No content");return}try{const l=await a.socket.sendTo(`${a.adapterName}.${a.instance}`,"uploadIcs",{filename:n.name,content:d});if(l!=null&&l.success)console.log("ICS-Datei erfolgreich hochgeladen:",l.path),this.handleFieldChange("trashFile",l.path),l.events&&Array.isArray(l.events)&&this.setState({uploadedEvents:l.events});else throw new Error(l==null?void 0:l.error);this.fileInputRef.current&&(this.fileInputRef.current.value="")}catch(l){console.error("File upload failed:",l),alert(`Upload failed: ${l.message}`)}},r.onerror=()=>{console.error("File reading failed"),alert("Failed to read file")},r.readAsText(n)}catch(a){console.error("File upload failed:",a),alert(`Upload failed: ${a.message}`)}};handleUploadClick=()=>{var s;(s=this.fileInputRef.current)==null||s.click()};handleToggleEvent=s=>{const{selectedEvents:n}=this.state,i=n.indexOf(s),a=[...n];i===-1?a.length<6&&a.push(s):a.splice(i,1),this.setState({selectedEvents:a})};handleApplySelection=()=>{const{selectedEvents:s}=this.state,{entry:n}=this.props,i={...n};i.items=n.items.map((a,r)=>({...a,textTrash:s[r]||""})),this.props.onEntryChange(i),this.setState({selectedEvents:[],uploadedEvents:[]})};handleItemChange(s,n,i){const a={...this.props.entry};a.items=[...a.items],a.items[s]={...a.items[s],[n]:i},this.props.onEntryChange(a)}handleSearchClick=async()=>{const{entry:s,oContext:n}=this.props;if(!s.trashState){alert("Bitte wählen Sie zuerst einen State aus");return}try{const i=await n.socket.getState(s.trashState);if(!i||!i.val){alert("State enthält keine Daten");return}const a=typeof i.val=="string"?JSON.parse(i.val):i.val;if(!Array.isArray(a)){alert("State enthält kein Array");return}const r=new Set;a.forEach(d=>{d.event&&typeof d.event=="string"&&r.add(d.event)});const o=Array.from(r).map(d=>({summary:d}));this.setState({uploadedEvents:o})}catch(i){console.error("Fehler beim Lesen des States:",i),alert(`Fehler: ${i.message}`)}};render(){var r;const{entry:s,oContext:n,theme:i}=this.props,{alive:a}=this.state;return e.jsxs(t.Box,{children:[e.jsx(t.Box,{sx:{mb:1,p:1,borderRadius:1,backgroundColor:"action.hover"},children:e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:"text",label:this.getText("unique_label"),value:s.uniqueName,disabled:!a,onChange:o=>{const d=o.target.value;d.trim()&&this.props.onUniqueNameChange(s.uniqueName,d)},InputProps:{sx:{backgroundColor:"transparent",px:1,fontWeight:600,width:"50%"}}})}),e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:"text",autoComplete:"off",label:this.getText("headline"),value:s.headline??"",disabled:!a,onChange:o=>{this.handleFieldChange("headline",o.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1,width:"50%"}},sx:{mb:2}}),e.jsxs(t.Box,{sx:{mb:2},children:[e.jsx(t.Box,{sx:{display:"flex",alignItems:"center",mb:.5},children:e.jsx(t.Tooltip,{title:this.getText("trash_number_of_entities"),children:e.jsx(t.Typography,{variant:"caption",color:"text.secondary",sx:{mr:.5},children:"Layout"})})}),e.jsxs(t.Select,{size:"small",value:s.countItems||4,disabled:!a,onChange:o=>{this.handleFieldChange("countItems",o.target.value)},sx:{backgroundColor:"transparent",px:1},children:[e.jsx(t.MenuItem,{value:4,children:this.getText("trash_4_entities")}),e.jsx(t.MenuItem,{value:6,children:this.getText("trash_6_entities")})]})]}),e.jsx(t.Box,{sx:{mb:2},children:e.jsxs(t.FormControl,{component:"fieldset",children:[e.jsx(t.FormLabel,{component:"legend",children:this.getText("trash_import_type")}),e.jsxs(t.RadioGroup,{row:!0,value:s.trashImport,onChange:o=>{const d=o.target.value==="true";this.handleFieldChange("trashImport",d),this.setState({uploadedEvents:[]})},children:[e.jsx(t.FormControlLabel,{value:!0,control:e.jsx(t.Radio,{}),label:this.getText("trash_import_state"),disabled:!a}),e.jsx(t.FormControlLabel,{value:!1,control:e.jsx(t.Radio,{}),label:this.getText("trash_import_ics_file"),disabled:!a})]})]})}),s.trashImport&&e.jsxs(t.Box,{sx:{mb:2},children:[e.jsx(O,{label:this.getText("trash_state"),value:s.trashState??"",onChange:o=>{this.handleFieldChange("trashState",o)},socket:n.socket,theme:i,themeType:((r=i==null?void 0:i.palette)==null?void 0:r.mode)||"light",dialogName:"selectTrashState",filterFunc:o=>!!(o&&o.type==="state"&&o._id&&o._id.startsWith("ical.")),disabled:!a}),e.jsx(t.Button,{variant:"text",startIcon:e.jsx(M.SearchOutlined,{}),onClick:this.handleSearchClick,disabled:!a,sx:{minWidth:120,mt:1},children:this.getText("trash_search_events")}),this.state.uploadedEvents.length>0&&e.jsxs(t.Box,{sx:{mt:2},children:[e.jsx(t.FormLabel,{children:this.getText("trash_found_events")}),e.jsx(t.List,{sx:{maxHeight:300,overflow:"auto",border:1,borderColor:"divider",borderRadius:1,mt:1},children:this.state.uploadedEvents.map(o=>e.jsx(t.ListItem,{disablePadding:!0,children:e.jsxs(t.ListItemButton,{onClick:()=>this.handleToggleEvent(o.summary),disabled:!this.state.selectedEvents.includes(o.summary)&&this.state.selectedEvents.length>=6,children:[e.jsx(t.ListItemIcon,{children:e.jsx(t.Checkbox,{checked:this.state.selectedEvents.includes(o.summary),edge:"start"})}),e.jsx(t.ListItemText,{primary:o.summary})]})},o.summary))}),e.jsx(t.Button,{variant:"contained",onClick:this.handleApplySelection,disabled:!a||this.state.selectedEvents.length===0,sx:{mt:1},children:this.getText("trash_apply_selection")})]})]}),!s.trashImport&&e.jsxs(t.Box,{sx:{mb:2},children:[e.jsxs(t.Box,{sx:{display:"flex",gap:2,alignItems:"flex-end"},children:[e.jsx(t.TextField,{fullWidth:!0,variant:"standard",type:"text",autoComplete:"off",label:this.getText("trash_ics_file_path"),value:s.trashFile??"",disabled:!a,onChange:o=>{this.handleFieldChange("trashFile",o.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1}},helperText:this.getText("trash_ics_file_path_help")}),e.jsx(t.Button,{variant:"text",startIcon:e.jsx(M.Upload,{}),onClick:this.handleUploadClick,disabled:!a,sx:{minWidth:120,mb:.5},children:this.getText("upload_file")})]}),e.jsx("input",{ref:this.fileInputRef,type:"file",accept:".ics",style:{display:"none"},onChange:this.handleFileSelect}),this.state.uploadedEvents.length>0&&e.jsxs(t.Box,{sx:{mt:2},children:[e.jsx(t.FormLabel,{children:this.getText("trash_select_events")}),e.jsx(t.List,{sx:{maxHeight:300,overflow:"auto",border:1,borderColor:"divider",borderRadius:1,mt:1},children:this.state.uploadedEvents.map(o=>e.jsx(t.ListItem,{disablePadding:!0,children:e.jsxs(t.ListItemButton,{onClick:()=>this.handleToggleEvent(o.summary),disabled:!this.state.selectedEvents.includes(o.summary)&&this.state.selectedEvents.length>=6,children:[e.jsx(t.ListItemIcon,{children:e.jsx(t.Checkbox,{checked:this.state.selectedEvents.includes(o.summary),edge:"start"})}),e.jsx(t.ListItemText,{primary:o.summary})]})},o.summary))}),e.jsx(t.Button,{variant:"contained",onClick:this.handleApplySelection,disabled:!a||this.state.selectedEvents.length===0,sx:{mt:1},children:this.getText("trash_apply_selection")})]})]}),e.jsx(t.Box,{sx:{mb:2},children:s.items.map((o,d)=>e.jsxs(t.Box,{sx:{display:"flex",gap:2,mb:2,flexWrap:"wrap",alignItems:"flex-end",p:2,border:1,borderColor:"divider",borderRadius:1},children:[e.jsx(t.TextField,{variant:"standard",type:"color",label:this.getText(`trash_color_field_${d+1}`),value:o.iconColor||"#d2d2d2",disabled:!a,onChange:m=>{this.handleItemChange(d,"iconColor",m.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1}},sx:{minWidth:100,flexShrink:0}}),e.jsx(t.TextField,{variant:"standard",type:"text",autoComplete:"off",label:this.getText(`trash_text_field_${d+1}`),value:o.textTrash||"",disabled:!a,onChange:m=>{this.handleItemChange(d,"textTrash",m.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1}},sx:{flex:1,minWidth:200}}),e.jsx(t.TextField,{variant:"standard",type:"text",autoComplete:"off",label:this.getText(`trash_custom_text_field_${d+1}`),value:o.customTrash||"",disabled:!a,onChange:m=>{this.handleItemChange(d,"customTrash",m.target.value)},InputProps:{sx:{backgroundColor:"transparent",px:1}},sx:{flex:1,minWidth:200}})]},d))})]})}}class fe extends E.ConfigGeneric{pagesRetryTimeout;constructor(s){super(s);const n=E.ConfigGeneric.getValue(s.data,s.attr);this.state={...this.state,entries:Array.isArray(n)?n:[],selected:"",selectedCardType:"all",pagesList:[],alive:!1,pagesRetryCount:0}}componentWillUnmount(){this.pagesRetryTimeout&&clearTimeout(this.pagesRetryTimeout);const s=this.props.oContext.instance??"0";this.props.oContext.socket.unsubscribeState(`system.adapter.${P}.${s}.alive`,this.onAliveChanged)}async componentDidMount(){super.componentDidMount();const s=this.props.oContext.instance??"0",n=`system.adapter.${P}.${s}.alive`;try{const i=await this.props.oContext.socket.getState(n),a=!!(i!=null&&i.val);this.setState({alive:a}),await this.props.oContext.socket.subscribeState(n,this.onAliveChanged),a&&await this.loadPagesList()}catch(i){console.error("[PageConfig] Failed to get alive state or subscribe:",i),this.setState({alive:!1})}}onAliveChanged=(s,n)=>{const i=this.state.alive,a=n?!!n.val:!1;i!==a&&(this.setState({alive:a}),!i&&a&&(!this.state.pagesList||this.state.pagesList.length===0)&&this.loadPagesList(),i&&!a&&this.pagesRetryTimeout&&(clearTimeout(this.pagesRetryTimeout),this.pagesRetryTimeout=void 0))};async loadPagesList(){if(!this.state.alive){console.log("[PageConfig] Adapter not alive, skipping pages load");return}const s=[];if(this.props.oContext&&this.props.oContext.socket){const n=this.props.oContext.instance??"0",i=`${P}.${n}`;try{const a=await this.props.oContext.socket.sendTo(i,Y,null);let r=[];Array.isArray(a)?r=a:a&&Array.isArray(a.result)&&(r=a.result);for(const o of r)s.push(o);if(r.length===0){const o=this.state.pagesRetryCount||0,d=3e3;console.log(`[PageConfig] Got empty pages array, retrying in ${d}ms (attempt ${o+1})`),this.setState({pagesRetryCount:o+1}),this.pagesRetryTimeout&&clearTimeout(this.pagesRetryTimeout),this.pagesRetryTimeout=setTimeout(()=>{this.state.alive?this.loadPagesList():console.log("[PageConfig] Adapter went offline, cancelling pages retry")},d);return}else r.length>0&&(console.log(`[PageConfig] Successfully loaded ${r.length} pages after ${this.state.pagesRetryCount||0} retries`),this.setState({pagesRetryCount:0}),this.pagesRetryTimeout&&(clearTimeout(this.pagesRetryTimeout),this.pagesRetryTimeout=void 0))}catch(a){const r=this.state.pagesRetryCount||0,o=3e3;console.log(`[PageConfig] Error loading pages, retrying in ${o}ms (attempt ${r+1}): ${String(a)}`),this.setState({pagesRetryCount:r+1}),this.pagesRetryTimeout&&clearTimeout(this.pagesRetryTimeout),this.pagesRetryTimeout=setTimeout(()=>{this.state.alive?this.loadPagesList():console.log("[PageConfig] Adapter went offline, cancelling pages retry after error")},o);return}}else{console.log("[PageConfig] No socket available for sendTo");return}this.setState({pagesList:Array.from(new Set(s))})}handleAdd=(s,n)=>{if(n==="all")return;let i;if(n==="cardAlarm")i={card:"cardAlarm",uniqueName:s,headline:s,button1:"",button2:"",button3:"",button4:"",button5:"",button6:"",button7:"",button8:"",pin:0};else if(n==="cardQR")i={card:"cardQR",uniqueName:s,headline:s,ssidUrlTel:"",wlanhidden:!1,pwdhidden:!1,setState:"",selType:0};else if(n==="cardTrash")i={card:"cardTrash",uniqueName:s,headline:s,countItems:4,trashImport:!0,trashState:"",trashFile:"",items:[{textTrash:"",customTrash:"",iconColor:"#3c3fff"},{textTrash:"",customTrash:"",iconColor:"#fffd77"},{textTrash:"",customTrash:"",iconColor:"#d2d2d2"},{textTrash:"",customTrash:"",iconColor:"#de8900"},{textTrash:"",customTrash:"",iconColor:"#d2d2d2"},{textTrash:"",customTrash:"",iconColor:"#d2d2d2"}]};else return;const a=[...this.state.entries,i];this.setState({entries:a}),this.onChange(this.props.attr,a)};handleDelete=s=>{const n=this.state.entries.filter(a=>a.uniqueName!==s);this.setState({entries:n}),this.onChange(this.props.attr,n);const i=Array.from(new Set(n.map(a=>a.uniqueName))).filter(Boolean);this.setState({selected:i[0]||""})};handleAssign=(s,n)=>{const i=this.stat