openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
139 lines • 11.3 kB
JavaScript
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