UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

139 lines 11.3 kB
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Qi as t,la as n,wr as r}from"./control-ui-foundation-Cydpkyqa.js";import{J as i,So as a,_t as o,ht as s,vo as c}from"./control-ui-core-Rwzhj6nO.js";import{$ as l,K as u,X as d,at as f,q as p,st as m}from"./lit-runtime-CV_MH99K.js";import{An as ee,Dn as h,En as g,Mn as te,On as _,Sn as ne,Yn as v,_n as y,er as b,gn as x,jn as S,mn as C,nr as w,wn as T,xn as E}from"./control-ui-core-YphAl4aM.js";import{Gt as D,Wt as O,Yt as k,en as A}from"./control-ui-core-vvcQQV2m.js";import{_ as re,_a as ie,va as ae,ya as oe}from"./control-ui-boot-shared-DfZ39Yj9.js";import{n as j,t as M}from"./en-settings-D_ebb5Hk.js";import{a as N,c as P,g as F,h as I,i as L,n as R,t as z}from"./config-form.tiers-DFD3a4dS.js";import{_ as B,h as V,i as H,r as U,s as W,u as G}from"./setup-schema-BzY-uJ6H.js";import{a as se,i as K}from"./settings-targets-BmloFKW8.js";function ce(e){let t=A(e.labelKey);return{routeId:e.routeId,...e.search===void 0?{}:{search:e.search},hash:e.hash,label:t,searchText:[t,...e.searchKeys.map(e=>A(e)),e.aliases??``].join(` `)}}function le(e,t){let n=J[e],r=t.properties;if(!n||!r)return t;let i=new Set(n());return{...t,properties:Object.fromEntries(Object.entries(r).filter(([e])=>i.has(e)))}}function ue(e){if(!e.query.trim())return[];let t=P(e.query),n=t.tags.length===0&&t.text?q.filter(t=>(e.identityAvailable||!t.requiresIdentity)&&E(t.routeId,e.canAdmin!==!1,e.nativeDeviceSettings)).map(ce).filter(e=>_(e.searchText,t.text)):[],r=e.schema&&typeof e.schema==`object`&&!Array.isArray(e.schema)?e.schema:null;if(!r||a(r)!==`object`||!r.properties)return n;let i=e.value??{};for(let[t,a]of Object.entries(r.properties)){let r=V(t);if(!E(r,e.canAdmin!==!1,e.nativeDeviceSettings))continue;let o=t===`wizard`?H(a):le(r,a),s=I[t],c=R({schema:o,path:[t],hints:e.uiHints}),l=n=>!!(n&&N({key:t,schema:n,value:i[t],hints:e.uiHints,query:e.query,label:s?.label,description:s?.description,textMatcher:_})),u=l(c.common),d=l(c.advanced);if(!u&&!d)continue;let f=encodeURIComponent(t),p={search:``,hash:`#config-section-${f}`};n.push(r===`memory`?{routeId:r,label:s?.label??o.title??t,pathname:b(`settings`,e.basePath),hash:p.hash}:{routeId:r,label:s?.label??o.title??t,search:`?section=${f}${d||t===`wizard`?`&advanced=1`:``}`,hash:p.hash})}return n}var q,J;function Y(){return(Y=e((()=>{y(),v(),F(),L(),z(),k(),M(),c(),B(),W(),se(),U(),j(),q=Object.values(K),J={memory:G,updates:()=>[`channel`,`checkOnStart`,`auto`]}})))()}var X,Z;function Q(){return(Q=e((()=>{u(),l(),k(),D(),X=2e3,Z=class extends n{constructor(...e){super(...e),this.savedVisible=!1}createRenderRoot(){return this}willUpdate(){let e=this.props?.status;this.previousStatus===`saving`&&e===`saved`?(this.clearSavedTimer(),this.savedVisible=!0,this.savedTimer=globalThis.setTimeout(()=>{this.savedTimer=void 0,this.savedVisible=!1},X)):e!==`saved`&&(this.clearSavedTimer(),this.savedVisible=!1),this.previousStatus=e}disconnectedCallback(){this.clearSavedTimer(),super.disconnectedCallback()}clearSavedTimer(){globalThis.clearTimeout(this.savedTimer),this.savedTimer=void 0}renderClaw(e){return d`<span class="settings-save-indicator__claw ${e}" aria-hidden="true" >${O.claw}</span >`}render(){let e=this.props;if(!e)return p;let t,n=``,r=``,i=``;if(e.applying)t=d` <span class="settings-save-indicator__spinner" aria-hidden="true" >${O.loader}</span > <span>${A(`configView.applying`)}</span>`;else if(e.status===`saving`)t=d` ${this.renderClaw(`settings-save-indicator__claw--saving`)} <span>${A(`configView.autoSaveSaving`)}</span>`;else if(e.status===`error`)i=e.lastError?.trim()??``,r=i?`${A(`configView.autoSaveFailed`)}: ${i}`:``,n=` settings-save-indicator--danger`,t=d` <span>${A(`configView.autoSaveFailed`)}</span> <button class="btn btn--xs settings-save-indicator__action" type="button" @click=${e.onRetry} > ${A(`configView.retry`)} </button>`;else if(e.status===`paused`)t=d` <span>${A(`configView.autoSavePaused`)}</span> <button class="btn btn--xs settings-save-indicator__action" type="button" @click=${e.onRetry} > ${A(`configView.saveNow`)} </button>`;else if(e.status===`conflict`)n=` settings-save-indicator--danger`,t=d` <span>${A(`configView.autoSaveConflict`)}</span> <button class="btn btn--xs settings-save-indicator__action" type="button" @click=${e.onReload} > ${A(`common.reload`)} </button>`;else if(this.savedVisible)n=` settings-save-indicator--saved`,t=d` ${this.renderClaw(`settings-save-indicator__claw--saved`)} <span class="settings-save-indicator__check" aria-hidden="true">${O.check}</span> <span>${A(`configView.autoSaveSaved`)}</span>`;else if(e.needsApply)t=d` <button class="btn btn--xs settings-save-indicator__apply" type="button" ?disabled=${e.applyDisabled} @click=${e.onApply} > ${A(`configView.applyChanges`)} </button>`;else return p;return d`<div class="settings-save-indicator${n}" role="status" aria-live="polite" aria-label=${r||p} title=${i||p} > ${t} </div>`}},r([m({attribute:!1})],Z.prototype,`props`,void 0),r([f()],Z.prototype,`savedVisible`,void 0),customElements.get(`openclaw-settings-save-indicator`)||customElements.define(`openclaw-settings-save-indicator`,Z)})))()}function de(e,n){if(n.pathname)return!1;let r=t(n.label);return[g(e),S(e)].some(e=>t(e)===r)}function fe(e,n,r,i){let a=te(r,i),o=n.filter(e=>E(e.routeId,r,i)),s=t(e);if(!s)return a.map(e=>({labelKey:e.labelKey,items:e.routes.map(e=>({routeId:e,blocks:[]}))}));let c=a.flatMap(e=>e.routes),l=[...new Set([...c,...C.filter(e=>E(e,r,i)),...o.map(e=>e.routeId)])],u=l.filter(e=>[g(e),S(e),ee(e)].some(e=>_(e,s))),d=new Set(u),f=a.flatMap(e=>e.labelKey&&_(A(e.labelKey),s)?e.routes.filter(e=>!d.has(e)&&(d.add(e),!0)):[]),p=new Map,m=new Set;for(let e of o){let t=`${e.routeId}\u0000${e.pathname??``}\u0000${e.search??``}\u0000${e.hash}`;if(m.has(t))continue;m.add(t);let n=p.get(e.routeId)??[];n.push(e),p.set(e.routeId,n)}let h=[...u,...f];return[...h.length>0?[{labelKey:null,items:h.map(e=>({routeId:e,blocks:(p.get(e)??[]).filter(t=>!de(e,t))}))}]:[],...l.filter(e=>!d.has(e)&&p.has(e)).map(e=>({labelKey:null,items:[{routeId:e,blocks:p.get(e)??[]}]}))]}function pe(e,t,n){let r=h(e.activeRouteId)===t;return d` <a href=${w(t,e.basePath)} class="settings-sidebar__item ${r?`settings-sidebar__item--active`:``}" aria-current=${r?`page`:p} @focus=${n=>T(e.preloadTimers,t,n,e.onPreload,r)} @blur=${t=>x(e.preloadTimers,t)} @pointerenter=${n=>T(e.preloadTimers,t,n,e.onPreload,r)} @pointerleave=${t=>x(e.preloadTimers,t)} @touchstart=${n=>T(e.preloadTimers,t,n,e.onPreload,r,!0)} @click=${n=>{i(n)&&(n.preventDefault(),e.onNavigate(t))}} > <span class="settings-sidebar__item-icon" aria-hidden="true" >${O[ne(t)]}</span > <span class="settings-sidebar__item-label" >${n??g(t)}</span > </a> `}function me(e,t){let n=(t.pathname??w(t.routeId,e.basePath))+(t.search??``)+t.hash,r=e.activeRouteId===t.routeId&&(t.pathname===void 0||e.activePathname===t.pathname)&&e.activeHash===t.hash&&(t.search===void 0||e.activeSearch===t.search);return d` <a href=${n} class="settings-sidebar__subitem ${r?`settings-sidebar__subitem--active`:``}" aria-current=${r?`location`:p} @click=${n=>{i(n)&&(n.preventDefault(),e.onNavigate(t.routeId,{...t.pathname?{pathname:t.pathname}:{},...t.search?{search:t.search}:{},hash:t.hash}))}} > <span class="settings-sidebar__subitem-label">${t.label}</span> </a> `}function he(e){e.closest(`.settings-sidebar`)?.querySelector(`.settings-sidebar__search`)?.classList.toggle(`settings-sidebar__search--scrolled`,e.scrollTop>0)}function ge(e){let t=oe(e),n=A(`connection.reconnecting`),r=e.searchBlockMatches??(e.searchParams?ue(e.searchParams):[]),i=fe(e.searchQuery,r,e.canAdmin!==!1,e.nativeDeviceSettings??null);return d` <aside class="settings-sidebar"> <header class="settings-sidebar__header"> <button type="button" class="settings-sidebar__back" @click=${()=>e.onExit()}> <span class="settings-sidebar__back-icon" aria-hidden="true">${O.arrowLeft}</span> ${A(`nav.exitSettings`)} <kbd class="settings-sidebar__esc" aria-hidden="true">esc</kbd> </button> <h1 class="settings-sidebar__title">${A(`nav.settings`)}</h1> </header> <div class="settings-sidebar__search" role="search"> <span class="settings-sidebar__search-icon" aria-hidden="true">${O.search}</span> <input class="settings-sidebar__search-input" type="search" autocomplete="off" spellcheck="false" aria-label=${A(`nav.settingsSearchLabel`)} placeholder=${A(`nav.settingsSearchPlaceholder`)} .value=${e.searchQuery} @input=${t=>e.onSearchQueryChange(t.currentTarget.value)} @keydown=${t=>{if(t.key===`Escape`){if(t.preventDefault(),e.searchQuery){e.onSearchQueryChange(``);return}e.onExit()}}} /> ${e.searchQuery?d` <button type="button" class="settings-sidebar__search-clear" aria-label=${A(`nav.settingsSearchClear`)} @click=${t=>{let n=t.currentTarget.parentElement?.querySelector(`input`);e.onSearchQueryChange(``),n?.focus()}} > ${O.x} </button> `:p} </div> <nav class="settings-sidebar__nav" aria-label=${A(`common.settingsSections`)} @scroll=${e=>he(e.currentTarget)} > ${i.length===0?d`<p class="settings-sidebar__empty" role="status"> ${A(`nav.settingsSearchNoResults`)} </p>`:i.map(t=>d` <div class="settings-sidebar__group"> ${t.labelKey?d`<div class="settings-sidebar__group-label"> ${A(t.labelKey)} </div>`:p} ${t.items.map(t=>d` ${pe(e,t.routeId)} ${t.blocks.map(t=>me(e,t))} `)} </div> `)} </nav> <footer class="settings-sidebar__footer"> ${t?ae({kind:t,queuedOutboxCount:e.queuedOutboxCount??0,title:e.lastError?o(e.lastError):n,onRetry:e.onRetryConnect}):d`<openclaw-settings-save-indicator .props=${e.saveIndicator} ></openclaw-settings-save-indicator>`} <openclaw-sidebar-build-chip .basePath=${e.basePath} .gatewayVersion=${e.gatewayVersion||null} .variant=${`settings`} .onNavigate=${()=>e.onNavigate(`about`)} ></openclaw-sidebar-build-chip> </footer> </aside> `}function $(){return($=e((()=>{u(),y(),v(),k(),s(),Y(),D(),ie(),Q(),re()})))()}$();export{ge as renderSettingsSidebar}; //# sourceMappingURL=settings-sidebar-UFxCOjch.js.map