@coffer-org/web 1.8.1 → 1.9.0

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.
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-n93t21jb.js";import{i as n,t as r,w as i}from"./button-Dlm2GmQs.js";import{c as a,l as o}from"./chunk-KS7C4IRE-B1_Zk64s.js";import{t as s}from"./jsx-dev-runtime-CSfA-jUb.js";import{t as c}from"./json-2IEVhd4i.js";import{n as l,s as u,t as d}from"./ExtendReasonInfo-CEbvUMoP.js";import{f,l as p,m,n as h,o as g,r as _,s as v,t as y,u as b,y as x}from"./Toolbar-CVjgIOri.js";import{S,f as C,g as w,m as T}from"./fields-B4fdbc1_.js";import{a as E,h as D,m as O,n as k,o as A,t as j}from"./shelf-e7xL1R3N.js";import{T as M,o as N}from"./api-B7hHeZsv.js";var P=e(t(),1),F=s(),I=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/fields-form.tsx`;function L({shelf:e,record:t,onSubmit:n,onCancel:a,submitLabel:o,busy:s,children:c,hiddenFields:l,onValuesChange:u,errorSink:d,extraValidate:f}){let{t:m}=i(),g=p(m),y=!!t,b=(0,P.useMemo)(()=>A(e.fields),[e]),{values:x,errors:C,setErrors:w,setTouched:T,bridge:E}=h({fm:b,mode:y?`edit`:`create`,recordCtx:{library:e.library,shelf:e.shelf,recordId:t?String(t.id):null},initial:()=>z(e,t),hiddenFields:l}),[D,O]=(0,P.useState)(),[M,N]=(0,P.useState)(!1);(0,P.useEffect)(()=>{u?.(x)},[x,u]),(0,P.useEffect)(()=>{d?.({setErrors:w,setTouched:T})},[d,w,T]);async function L(t){t.preventDefault(),O(void 0);let r=Object.keys(b),i={};for(let e of r)e in x&&(i[e]=x[e]);let a=B(i),o=(y?k(e):j(e)).safeParse(a),s={};if(!o.success)for(let e of o.error.issues){let t=String(e.path[0]??``);if(!r.includes(t)||s[t])continue;let{code:n,params:i}=S(e.message);s[t]=g(n,i)}if(Object.assign(s,f?.(x)??{}),Object.keys(s).length){w(s),T(new Set(Object.keys(s)));return}N(!0);let c=await n(a);N(!1),c&&O(c)}return(0,F.jsxDEV)(`form`,{onSubmit:L,noValidate:!0,className:`flex flex-col gap-5 min-w-0`,children:[(0,F.jsxDEV)(v.Provider,{value:e=>C[e.join(`.`)],children:(0,F.jsxDEV)(_,{items:e.fields,ctx:{bridge:E}},void 0,!1,{fileName:I,lineNumber:118,columnNumber:9},this)},void 0,!1,{fileName:I,lineNumber:117,columnNumber:7},this),c,D&&(0,F.jsxDEV)(`p`,{className:`text-sm text-danger`,children:D},void 0,!1,{fileName:I,lineNumber:121,columnNumber:21},this),(0,F.jsxDEV)(`div`,{className:`flex gap-3 pt-2 border-t border-border`,children:[(0,F.jsxDEV)(r,{type:`submit`,disabled:s||M,size:`lg`,className:`flex-1`,children:o??m(`actions.save`)},void 0,!1,{fileName:I,lineNumber:123,columnNumber:9},this),a&&(0,F.jsxDEV)(r,{type:`button`,variant:`secondary`,size:`lg`,onClick:a,className:`flex-1`,children:m(`actions.cancel`)},void 0,!1,{fileName:I,lineNumber:127,columnNumber:11},this)]},void 0,!0,{fileName:I,lineNumber:122,columnNumber:7},this)]},void 0,!0,{fileName:I,lineNumber:116,columnNumber:5},this)}var R=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/form.tsx`;function z(e,t){let n={};n.name=t?.name==null?``:String(t.name);for(let[r,i]of E(e.fields))if(!i.virtual)if(t){let e=t[r];e==null?n[r]=i.prim!==`checkbox`&&``:i.prim===`checkbox`?n[r]=e===1||e===!0||e===`1`:T(i)?n[r]=e===``?``:c(e,i.hints.multiple===!0?[]:{}):n[r]=e}else n[r]=i.prim===`checkbox`?!1:T(i)&&i.hints.multiple===!0?[]:``;for(let r of e.fields){if(!C(r)||!w(r))continue;let e=r.key;t?n[e]=t[e]??(r.multiple?[]:{}):n[e]=r.multiple?[]:{}}return n}function B(e){let t={};for(let[n,r]of Object.entries(e))r===``||r===void 0||Array.isArray(r)&&r.length===0||typeof r==`object`&&r&&!Array.isArray(r)&&Object.keys(r).length===0||(t[n]=r);return t}function V({ext:e,values:t,onChange:r,recordId:a,fieldLabel:o}){let{t:s}=i();return(0,F.jsxDEV)(`fieldset`,{className:`border border-accent/30 rounded-xl p-4 pt-2 flex flex-col min-w-0 gap-4`,children:[(0,F.jsxDEV)(`legend`,{className:`px-2 inline-flex items-center gap-1.5 text-sm font-semibold text-accent`,children:[(0,F.jsxDEV)(n,{name:e.icon,size:14,className:`shrink-0`},void 0,!1,{fileName:R,lineNumber:114,columnNumber:9},this),` `,s(e.label),(0,F.jsxDEV)(d,{ext:e,fieldLabel:o},void 0,!1,{fileName:R,lineNumber:115,columnNumber:9},this)]},void 0,!0,{fileName:R,lineNumber:113,columnNumber:7},this),(0,F.jsxDEV)(_,{items:e.fields,ctx:{renderField:(n,i)=>D(i.hidden,t)?null:(0,F.jsxDEV)(u,{mode:`create`,field:i,label:i.label?s(i.label):void 0,required:D(i.required,t),value:t[n]??``,recordCtx:{library:``,shelf:e.id,recordId:a},onChange:t=>r(e.id,n,t)},void 0,!1,{fileName:R,lineNumber:100,columnNumber:9},this)}},void 0,!1,{fileName:R,lineNumber:117,columnNumber:7},this)]},void 0,!0,{fileName:R,lineNumber:112,columnNumber:5},this)}function H(e,t,n){let[r]=(0,P.useState)(()=>{let n={};for(let r of e){let e=t?._extends?.[r.id];n[r.id]={};for(let[t,i]of E(r.fields)){let a=e?.[t];a==null?n[r.id][t]=i.prim===`checkbox`?!1:T(i)&&i.hints.multiple===!0?[]:``:i.prim===`checkbox`?n[r.id][t]=a===1||a===!0||a===`1`:T(i)?n[r.id][t]=a===``?``:c(a,i.hints.multiple===!0?[]:{}):n[r.id][t]=a}}return n}),[i,a]=(0,P.useState)(r),o=(0,P.useMemo)(()=>e.filter(e=>O(e.showWhen,n)),[e,n]);function s(e,t,n){a(r=>({...r,[e]:{...r[e],[t]:n}}))}function l(e){let t={};for(let n of o){let a=i[n.id]??{};if(e){let e=r[n.id]??{},i=Object.fromEntries(Object.entries(a).filter(([t,n])=>n!==e[t]));Object.keys(i).length>0&&(t[`_extend_${n.id}`]=i)}else{let e=Object.fromEntries(Object.entries(a).filter(([,e])=>e!==``&&e!==!1));t[`_extend_${n.id}`]=e}}return t}return{extValues:i,setExtValue:s,activeExts:o,buildExtendPatch:l}}function U({shelf:e,record:t,defaults:n,hiddenFields:r,onSuccess:a,onCancel:o}){let{t:s}=i(),c=p(s),l=!!t,u=(0,P.useMemo)(()=>A(e.fields),[e]),[d,m]=(0,P.useState)([]),[h,g]=(0,P.useState)(!1),[_,v]=(0,P.useState)(()=>z(e,t)),y=(0,P.useRef)(null),{extValues:x,setExtValue:S,activeExts:C,buildExtendPatch:w}=H((0,P.useMemo)(()=>f().filter(t=>t.attachTo.some(t=>t.library===e.library&&(!t.shelf||t.shelf===e.shelf))),[e]),t,_);function T(e){return l||String(e.name??``).trim()?{}:{name:s(`validation.required`)}}async function E(n){m([]),g(!0);let r={...n,...w()},i=String(t?.id??``),o=l?await M(e.library,e.shelf,i,r):await N(e.library,e.shelf,r);if(g(!1),o.ok){a(o.row);return}let s=o.issues??[],d={},f=[];for(let e of s)e.field&&u[e.field]?d[e.field]=c(e.code,e.params):f.push(e);let p=b(s,c);(Object.keys(d).length||Object.keys(p).length)&&(y.current?.setErrors(e=>({...e,...d,...p})),y.current?.setTouched(e=>new Set([...e,...Object.keys(d)]))),m(f)}return(0,F.jsxDEV)(`div`,{children:(0,F.jsxDEV)(L,{shelf:e,record:t,onSubmit:E,onCancel:o,submitLabel:s(h?`common.saving`:l?`actions.save`:`actions.create`),busy:h,hiddenFields:r,onValuesChange:v,errorSink:e=>{y.current=e},extraValidate:T,children:[C.map(e=>(0,F.jsxDEV)(V,{ext:e,values:x[e.id]??{},onChange:S,recordId:t?String(t.id):null,fieldLabel:e=>u[e]?.label?s(u[e].label):e},e.id,!1,{fileName:R,lineNumber:318,columnNumber:11},this)),d.length>0&&(0,F.jsxDEV)(`div`,{className:`bg-danger/10 border border-danger/30 rounded-xl p-3.5 text-sm`,children:[(0,F.jsxDEV)(`p`,{className:`font-semibold text-danger mb-2`,children:s(`form.serverRejected`)},void 0,!1,{fileName:R,lineNumber:330,columnNumber:13},this),(0,F.jsxDEV)(`ul`,{className:`space-y-1 text-text/80`,children:d.map((e,t)=>{let n=u[e.field],r=n?s(n.label):e.field,i=e.code===`pattern`&&e.params?.messageKey?s(String(e.params.messageKey)):s(`validation.${e.code}`,e.params);return(0,F.jsxDEV)(`li`,{className:`flex gap-1.5`,children:[r&&(0,F.jsxDEV)(`span`,{className:`text-muted font-medium`,children:[r,`:`]},void 0,!0,{fileName:R,lineNumber:341,columnNumber:31},this),i]},t,!0,{fileName:R,lineNumber:340,columnNumber:19},this)})},void 0,!1,{fileName:R,lineNumber:331,columnNumber:13},this)]},void 0,!0,{fileName:R,lineNumber:329,columnNumber:11},this)]},`${e.library}/${e.shelf}/${t?t.id:`new`}`,!0,{fileName:R,lineNumber:301,columnNumber:7},this)},void 0,!1,{fileName:R,lineNumber:293,columnNumber:5},this)}var W=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/app/record/NewRecordView.tsx`;function G(){let{t:e}=i(),{library:t,type:n}=o(),s=a(),c=m().flatMap(e=>e.shelves).find(e=>e.library===t&&e.shelf===n);return!c||c.standalone===!1?(0,F.jsxDEV)(`div`,{className:`p-6 text-muted`,children:e(`common.notFound`)},void 0,!1,{fileName:W,lineNumber:20,columnNumber:44},this):(0,F.jsxDEV)(`div`,{className:`flex flex-col`,children:[(0,F.jsxDEV)(y,{children:(0,F.jsxDEV)(r,{variant:`ghost`,size:`sm`,className:`px-2`,onClick:()=>s(`/${t}/${n}`),children:[(0,F.jsxDEV)(x,{size:18},void 0,!1,{fileName:W,lineNumber:26,columnNumber:11},this),(0,F.jsxDEV)(`span`,{className:`text-sm`,children:e(c.label)},void 0,!1,{fileName:W,lineNumber:27,columnNumber:11},this)]},void 0,!0,{fileName:W,lineNumber:25,columnNumber:9},this)},void 0,!1,{fileName:W,lineNumber:24,columnNumber:7},this),(0,F.jsxDEV)(`div`,{className:`flex-1 min-w-0`,children:(0,F.jsxDEV)(`div`,{className:`max-w-2xl mx-auto px-6 py-6`,children:(0,F.jsxDEV)(g,{library:c.library,shelf:c.shelf,children:(0,F.jsxDEV)(U,{shelf:c,onSuccess:e=>{l(`${c.library}/${c.shelf}`),e?.id?s(`/${t}/${n}/${e.id}`):s(`/${t}/${n}`)},onCancel:()=>s(`/${t}/${n}`)},void 0,!1,{fileName:W,lineNumber:33,columnNumber:13},this)},void 0,!1,{fileName:W,lineNumber:32,columnNumber:11},this)},void 0,!1,{fileName:W,lineNumber:31,columnNumber:9},this)},void 0,!1,{fileName:W,lineNumber:30,columnNumber:7},this)]},void 0,!0,{fileName:W,lineNumber:23,columnNumber:5},this)}export{G as NewRecordView};
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-n93t21jb.js";import{i as n,t as r,w as i}from"./button-Dlm2GmQs.js";import{c as a,l as o}from"./chunk-KS7C4IRE-B1_Zk64s.js";import{t as s}from"./jsx-dev-runtime-CSfA-jUb.js";import{t as c}from"./json-2IEVhd4i.js";import{n as l,s as u,t as d}from"./ExtendReasonInfo-CEbvUMoP.js";import{f,l as p,m,n as h,o as g,r as _,s as v,t as y,u as b,y as x}from"./Toolbar-CVjgIOri.js";import{S,f as C,g as w,m as T}from"./fields-B4fdbc1_.js";import{a as E,h as D,m as O,n as k,o as A,t as j}from"./shelf-e7xL1R3N.js";import{T as M,o as N}from"./api-CZDF0K_X.js";var P=e(t(),1),F=s(),I=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/fields-form.tsx`;function L({shelf:e,record:t,onSubmit:n,onCancel:a,submitLabel:o,busy:s,children:c,hiddenFields:l,onValuesChange:u,errorSink:d,extraValidate:f}){let{t:m}=i(),g=p(m),y=!!t,b=(0,P.useMemo)(()=>A(e.fields),[e]),{values:x,errors:C,setErrors:w,setTouched:T,bridge:E}=h({fm:b,mode:y?`edit`:`create`,recordCtx:{library:e.library,shelf:e.shelf,recordId:t?String(t.id):null},initial:()=>z(e,t),hiddenFields:l}),[D,O]=(0,P.useState)(),[M,N]=(0,P.useState)(!1);(0,P.useEffect)(()=>{u?.(x)},[x,u]),(0,P.useEffect)(()=>{d?.({setErrors:w,setTouched:T})},[d,w,T]);async function L(t){t.preventDefault(),O(void 0);let r=Object.keys(b),i={};for(let e of r)e in x&&(i[e]=x[e]);let a=B(i),o=(y?k(e):j(e)).safeParse(a),s={};if(!o.success)for(let e of o.error.issues){let t=String(e.path[0]??``);if(!r.includes(t)||s[t])continue;let{code:n,params:i}=S(e.message);s[t]=g(n,i)}if(Object.assign(s,f?.(x)??{}),Object.keys(s).length){w(s),T(new Set(Object.keys(s)));return}N(!0);let c=await n(a);N(!1),c&&O(c)}return(0,F.jsxDEV)(`form`,{onSubmit:L,noValidate:!0,className:`flex flex-col gap-5 min-w-0`,children:[(0,F.jsxDEV)(v.Provider,{value:e=>C[e.join(`.`)],children:(0,F.jsxDEV)(_,{items:e.fields,ctx:{bridge:E}},void 0,!1,{fileName:I,lineNumber:118,columnNumber:9},this)},void 0,!1,{fileName:I,lineNumber:117,columnNumber:7},this),c,D&&(0,F.jsxDEV)(`p`,{className:`text-sm text-danger`,children:D},void 0,!1,{fileName:I,lineNumber:121,columnNumber:21},this),(0,F.jsxDEV)(`div`,{className:`flex gap-3 pt-2 border-t border-border`,children:[(0,F.jsxDEV)(r,{type:`submit`,disabled:s||M,size:`lg`,className:`flex-1`,children:o??m(`actions.save`)},void 0,!1,{fileName:I,lineNumber:123,columnNumber:9},this),a&&(0,F.jsxDEV)(r,{type:`button`,variant:`secondary`,size:`lg`,onClick:a,className:`flex-1`,children:m(`actions.cancel`)},void 0,!1,{fileName:I,lineNumber:127,columnNumber:11},this)]},void 0,!0,{fileName:I,lineNumber:122,columnNumber:7},this)]},void 0,!0,{fileName:I,lineNumber:116,columnNumber:5},this)}var R=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/form.tsx`;function z(e,t){let n={};n.name=t?.name==null?``:String(t.name);for(let[r,i]of E(e.fields))if(!i.virtual)if(t){let e=t[r];e==null?n[r]=i.prim!==`checkbox`&&``:i.prim===`checkbox`?n[r]=e===1||e===!0||e===`1`:T(i)?n[r]=e===``?``:c(e,i.hints.multiple===!0?[]:{}):n[r]=e}else n[r]=i.prim===`checkbox`?!1:T(i)&&i.hints.multiple===!0?[]:``;for(let r of e.fields){if(!C(r)||!w(r))continue;let e=r.key;t?n[e]=t[e]??(r.multiple?[]:{}):n[e]=r.multiple?[]:{}}return n}function B(e){let t={};for(let[n,r]of Object.entries(e))r===``||r===void 0||Array.isArray(r)&&r.length===0||typeof r==`object`&&r&&!Array.isArray(r)&&Object.keys(r).length===0||(t[n]=r);return t}function V({ext:e,values:t,onChange:r,recordId:a,fieldLabel:o}){let{t:s}=i();return(0,F.jsxDEV)(`fieldset`,{className:`border border-accent/30 rounded-xl p-4 pt-2 flex flex-col min-w-0 gap-4`,children:[(0,F.jsxDEV)(`legend`,{className:`px-2 inline-flex items-center gap-1.5 text-sm font-semibold text-accent`,children:[(0,F.jsxDEV)(n,{name:e.icon,size:14,className:`shrink-0`},void 0,!1,{fileName:R,lineNumber:114,columnNumber:9},this),` `,s(e.label),(0,F.jsxDEV)(d,{ext:e,fieldLabel:o},void 0,!1,{fileName:R,lineNumber:115,columnNumber:9},this)]},void 0,!0,{fileName:R,lineNumber:113,columnNumber:7},this),(0,F.jsxDEV)(_,{items:e.fields,ctx:{renderField:(n,i)=>D(i.hidden,t)?null:(0,F.jsxDEV)(u,{mode:`create`,field:i,label:i.label?s(i.label):void 0,required:D(i.required,t),value:t[n]??``,recordCtx:{library:``,shelf:e.id,recordId:a},onChange:t=>r(e.id,n,t)},void 0,!1,{fileName:R,lineNumber:100,columnNumber:9},this)}},void 0,!1,{fileName:R,lineNumber:117,columnNumber:7},this)]},void 0,!0,{fileName:R,lineNumber:112,columnNumber:5},this)}function H(e,t,n){let[r]=(0,P.useState)(()=>{let n={};for(let r of e){let e=t?._extends?.[r.id];n[r.id]={};for(let[t,i]of E(r.fields)){let a=e?.[t];a==null?n[r.id][t]=i.prim===`checkbox`?!1:T(i)&&i.hints.multiple===!0?[]:``:i.prim===`checkbox`?n[r.id][t]=a===1||a===!0||a===`1`:T(i)?n[r.id][t]=a===``?``:c(a,i.hints.multiple===!0?[]:{}):n[r.id][t]=a}}return n}),[i,a]=(0,P.useState)(r),o=(0,P.useMemo)(()=>e.filter(e=>O(e.showWhen,n)),[e,n]);function s(e,t,n){a(r=>({...r,[e]:{...r[e],[t]:n}}))}function l(e){let t={};for(let n of o){let a=i[n.id]??{};if(e){let e=r[n.id]??{},i=Object.fromEntries(Object.entries(a).filter(([t,n])=>n!==e[t]));Object.keys(i).length>0&&(t[`_extend_${n.id}`]=i)}else{let e=Object.fromEntries(Object.entries(a).filter(([,e])=>e!==``&&e!==!1));t[`_extend_${n.id}`]=e}}return t}return{extValues:i,setExtValue:s,activeExts:o,buildExtendPatch:l}}function U({shelf:e,record:t,defaults:n,hiddenFields:r,onSuccess:a,onCancel:o}){let{t:s}=i(),c=p(s),l=!!t,u=(0,P.useMemo)(()=>A(e.fields),[e]),[d,m]=(0,P.useState)([]),[h,g]=(0,P.useState)(!1),[_,v]=(0,P.useState)(()=>z(e,t)),y=(0,P.useRef)(null),{extValues:x,setExtValue:S,activeExts:C,buildExtendPatch:w}=H((0,P.useMemo)(()=>f().filter(t=>t.attachTo.some(t=>t.library===e.library&&(!t.shelf||t.shelf===e.shelf))),[e]),t,_);function T(e){return l||String(e.name??``).trim()?{}:{name:s(`validation.required`)}}async function E(n){m([]),g(!0);let r={...n,...w()},i=String(t?.id??``),o=l?await M(e.library,e.shelf,i,r):await N(e.library,e.shelf,r);if(g(!1),o.ok){a(o.row);return}let s=o.issues??[],d={},f=[];for(let e of s)e.field&&u[e.field]?d[e.field]=c(e.code,e.params):f.push(e);let p=b(s,c);(Object.keys(d).length||Object.keys(p).length)&&(y.current?.setErrors(e=>({...e,...d,...p})),y.current?.setTouched(e=>new Set([...e,...Object.keys(d)]))),m(f)}return(0,F.jsxDEV)(`div`,{children:(0,F.jsxDEV)(L,{shelf:e,record:t,onSubmit:E,onCancel:o,submitLabel:s(h?`common.saving`:l?`actions.save`:`actions.create`),busy:h,hiddenFields:r,onValuesChange:v,errorSink:e=>{y.current=e},extraValidate:T,children:[C.map(e=>(0,F.jsxDEV)(V,{ext:e,values:x[e.id]??{},onChange:S,recordId:t?String(t.id):null,fieldLabel:e=>u[e]?.label?s(u[e].label):e},e.id,!1,{fileName:R,lineNumber:318,columnNumber:11},this)),d.length>0&&(0,F.jsxDEV)(`div`,{className:`bg-danger/10 border border-danger/30 rounded-xl p-3.5 text-sm`,children:[(0,F.jsxDEV)(`p`,{className:`font-semibold text-danger mb-2`,children:s(`form.serverRejected`)},void 0,!1,{fileName:R,lineNumber:330,columnNumber:13},this),(0,F.jsxDEV)(`ul`,{className:`space-y-1 text-text/80`,children:d.map((e,t)=>{let n=u[e.field],r=n?s(n.label):e.field,i=e.code===`pattern`&&e.params?.messageKey?s(String(e.params.messageKey)):s(`validation.${e.code}`,e.params);return(0,F.jsxDEV)(`li`,{className:`flex gap-1.5`,children:[r&&(0,F.jsxDEV)(`span`,{className:`text-muted font-medium`,children:[r,`:`]},void 0,!0,{fileName:R,lineNumber:341,columnNumber:31},this),i]},t,!0,{fileName:R,lineNumber:340,columnNumber:19},this)})},void 0,!1,{fileName:R,lineNumber:331,columnNumber:13},this)]},void 0,!0,{fileName:R,lineNumber:329,columnNumber:11},this)]},`${e.library}/${e.shelf}/${t?t.id:`new`}`,!0,{fileName:R,lineNumber:301,columnNumber:7},this)},void 0,!1,{fileName:R,lineNumber:293,columnNumber:5},this)}var W=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/app/record/NewRecordView.tsx`;function G(){let{t:e}=i(),{library:t,type:n}=o(),s=a(),c=m().flatMap(e=>e.shelves).find(e=>e.library===t&&e.shelf===n);return!c||c.standalone===!1?(0,F.jsxDEV)(`div`,{className:`p-6 text-muted`,children:e(`common.notFound`)},void 0,!1,{fileName:W,lineNumber:20,columnNumber:44},this):(0,F.jsxDEV)(`div`,{className:`flex flex-col`,children:[(0,F.jsxDEV)(y,{children:(0,F.jsxDEV)(r,{variant:`ghost`,size:`sm`,className:`px-2`,onClick:()=>s(`/${t}/${n}`),children:[(0,F.jsxDEV)(x,{size:18},void 0,!1,{fileName:W,lineNumber:26,columnNumber:11},this),(0,F.jsxDEV)(`span`,{className:`text-sm`,children:e(c.label)},void 0,!1,{fileName:W,lineNumber:27,columnNumber:11},this)]},void 0,!0,{fileName:W,lineNumber:25,columnNumber:9},this)},void 0,!1,{fileName:W,lineNumber:24,columnNumber:7},this),(0,F.jsxDEV)(`div`,{className:`flex-1 min-w-0`,children:(0,F.jsxDEV)(`div`,{className:`max-w-2xl mx-auto px-6 py-6`,children:(0,F.jsxDEV)(g,{library:c.library,shelf:c.shelf,children:(0,F.jsxDEV)(U,{shelf:c,onSuccess:e=>{l(`${c.library}/${c.shelf}`),e?.id?s(`/${t}/${n}/${e.id}`):s(`/${t}/${n}`)},onCancel:()=>s(`/${t}/${n}`)},void 0,!1,{fileName:W,lineNumber:33,columnNumber:13},this)},void 0,!1,{fileName:W,lineNumber:32,columnNumber:11},this)},void 0,!1,{fileName:W,lineNumber:31,columnNumber:9},this)},void 0,!1,{fileName:W,lineNumber:30,columnNumber:7},this)]},void 0,!0,{fileName:W,lineNumber:23,columnNumber:5},this)}export{G as NewRecordView};
@@ -0,0 +1,3 @@
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-n93t21jb.js";import{C as n,S as r,i,r as a,t as o,w as s}from"./button-Dlm2GmQs.js";import{n as c}from"./chunk-KS7C4IRE-B1_Zk64s.js";import{t as l}from"./jsx-dev-runtime-CSfA-jUb.js";import{i as u,n as d,o as f,s as p,t as m}from"./dist-DkJnaE0X.js";import{t as h}from"./jsx-runtime-JUshM5qe.js";import{t as g}from"./dist-CdqdWApy.js";import{C as _,E as v,S as y,f as b,m as x,w as S}from"./api-CZDF0K_X.js";import{n as C,r as w}from"./auth-context-FZy55T86.js";import{t as T}from"./PageBody-CvuReTKD.js";var E=e(t(),1),D=h(),O=`Switch`,[k,A]=f(O),[j,M]=k(O);function N(e){let{__scopeSwitch:t,checked:n,children:r,defaultChecked:i,disabled:a,form:o,name:s,onCheckedChange:c,required:l,value:u=`on`,internal_do_not_use_render:d}=e,[f,p]=m({prop:n,defaultProp:i??!1,onChange:c,caller:O}),[h,g]=E.useState(null),[_,v]=E.useState(null),y={checked:f,setChecked:p,disabled:a,control:h,setControl:g,name:s,form:o,value:u,hasConsumerStoppedPropagationRef:E.useRef(!1),required:l,defaultChecked:i,isFormControl:!h||!!o||!!h.closest(`form`),bubbleInput:_,setBubbleInput:v};return(0,D.jsx)(j,{scope:t,...y,children:V(d)?d(y):r})}var P=`SwitchTrigger`,F=E.forwardRef(({__scopeSwitch:e,onClick:t,...n},i)=>{let{control:a,form:o,value:s,disabled:c,checked:l,required:d,setControl:f,setChecked:m,hasConsumerStoppedPropagationRef:h,isFormControl:g,bubbleInput:_}=M(P,e),v=r(i,f),y=E.useRef(l);return E.useEffect(()=>{let e=o?a?.ownerDocument.getElementById(o):a?.form;if(e instanceof HTMLFormElement){let t=()=>m(y.current);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[a,o,m]),(0,D.jsx)(u.button,{type:`button`,role:`switch`,"aria-checked":l,"aria-required":d,"data-state":H(l),"data-disabled":c?``:void 0,disabled:c,value:s,...n,ref:v,onClick:p(t,e=>{m(e=>!e),_&&g&&(h.current=e.isPropagationStopped(),h.current||e.stopPropagation())})})});F.displayName=P;var I=E.forwardRef((e,t)=>{let{__scopeSwitch:n,name:r,checked:i,defaultChecked:a,required:o,disabled:s,value:c,onCheckedChange:l,form:u,...d}=e;return(0,D.jsx)(N,{__scopeSwitch:n,checked:i,defaultChecked:a,disabled:s,required:o,onCheckedChange:l,name:r,form:u,value:c,internal_do_not_use_render:({isFormControl:e})=>(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(F,{...d,ref:t,__scopeSwitch:n}),e&&(0,D.jsx)(B,{__scopeSwitch:n})]})})});I.displayName=O;var L=`SwitchThumb`,R=E.forwardRef((e,t)=>{let{__scopeSwitch:n,...r}=e,i=M(L,n);return(0,D.jsx)(u.span,{"data-state":H(i.checked),"data-disabled":i.disabled?``:void 0,...r,ref:t})});R.displayName=L;var z=`SwitchBubbleInput`,B=E.forwardRef(({__scopeSwitch:e,...t},n)=>{let{control:i,hasConsumerStoppedPropagationRef:a,checked:o,defaultChecked:s,required:c,disabled:l,name:f,value:p,form:m,bubbleInput:h,setBubbleInput:_}=M(z,e),v=r(n,_),y=g(o),b=d(i);E.useEffect(()=>{let e=h;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=!a.current;if(y!==o&&n){let t=new Event(`click`,{bubbles:r});n.call(e,o),e.dispatchEvent(t)}},[h,y,o,a]);let x=E.useRef(o);return(0,D.jsx)(u.input,{type:`checkbox`,"aria-hidden":!0,defaultChecked:s??x.current,required:c,disabled:l,name:f,value:p,form:m,...t,tabIndex:-1,ref:v,style:{...t.style,...b,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})});B.displayName=z;function V(e){return typeof e==`function`}function H(e){return e?`checked`:`unchecked`}var U=l(),W=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/components/ui/switch.tsx`,G=E.forwardRef(({className:e,...t},r)=>(0,U.jsxDEV)(I,{ref:r,className:n(`peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background`,`disabled:cursor-not-allowed disabled:opacity-50`,`data-[state=checked]:bg-primary data-[state=unchecked]:bg-border`,e),...t,children:(0,U.jsxDEV)(R,{className:n(`pointer-events-none block h-5 w-5 rounded-full bg-white shadow-lg ring-0 transition-transform`,`data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0`)},void 0,!1,{fileName:W,lineNumber:20,columnNumber:5},void 0)},void 0,!1,{fileName:W,lineNumber:9,columnNumber:3},void 0));G.displayName=I.displayName;var K=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/components/ui/badge.tsx`,q=a(`inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-semibold transition-colors`,{variants:{variant:{default:`border-transparent bg-primary text-primary-foreground`,secondary:`border-transparent bg-secondary text-secondary-foreground`,destructive:`border-transparent bg-destructive text-destructive-foreground`,outline:`border-border text-text`,accent:`border-accent/30 bg-accent/15 text-accent`}},defaultVariants:{variant:`default`}});function J({className:e,variant:t,...r}){return(0,U.jsxDEV)(`div`,{className:n(q({variant:t}),e),...r},void 0,!1,{fileName:K,lineNumber:24,columnNumber:10},this)}var Y=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/app/SettingsPage.tsx`;async function X(){let e=Date.now();for(;Date.now()-e<3e4;){await new Promise(e=>setTimeout(e,1e3));try{if((await fetch(`/health`)).ok)return!0}catch{}}return!1}function Z(){let{t:e}=s(),{role:t}=C(),n=t===`admin`,[r,a]=(0,E.useState)([]),[l,u]=(0,E.useState)(!0),[d,f]=(0,E.useState)(null),p=e=>d===e||d===`*`,[m,h]=(0,E.useState)(null),g=r.filter(e=>e.latestVersion&&e.latestVersion!==e.installedVersion),D=!!(m?.latestVersion&&m.latestVersion!==m.installedVersion),O=g.length+ +!!D,[k,A]=(0,E.useState)(null),[j,M]=(0,E.useState)(!1),N=t=>e(`${t}.plugin.label`,{defaultValue:t}),P=t=>e(`${t}.plugin.description`,{defaultValue:``}),F=t=>e(`${t}.library.label`,{defaultValue:t}),I=(t,n)=>e(`${t}.${n}.label`,{defaultValue:n}),L={core_required:()=>e(`plugins.errors.core_required`),has_dependents:t=>e(`plugins.errors.has_dependents`,{list:t.dependents.join(`, `)}),missing_deps:t=>e(`plugins.errors.missing_deps`,{list:t.deps.join(`, `)}),unknown_plugin:()=>e(`plugins.errors.unknown_plugin`)},R=()=>Promise.all([x(),b()]).then(([e,t])=>{a(e),h(t),u(!1)});(0,E.useEffect)(()=>{R()},[]);async function z(t){if(!window.confirm(e(`plugins.confirmPurge`,{id:t.id})))return;f(t.id),A(null);let n=await fetch(`/api/plugins/${t.id}/data`,{method:`DELETE`}),r=await n.json().catch(()=>({}));if(f(null),!n.ok){A(L[r.error]?.(r)??e(`plugins.genericError`,{code:r.error??n.status}));return}M(!0),await R()}async function B(t){f(t.id),A(null);let n=await y(t.id,!t.enabled);if(!n.ok){f(null),A(L[n.error]?.(n.data??{})??e(`plugins.genericError`,{code:n.error}));return}window.location.reload()}async function V(t){if(!t.latestVersion||!window.confirm(e(`plugins.confirmUpdate`,{id:t.id,from:t.installedVersion,to:t.latestVersion})))return;f(t.id),A(null);let n=await S(t.id);if(!n.ok){f(null),A(n.stderr?`${e(`plugins.updateError`)}: ${n.stderr}`:e(`plugins.genericError`,{code:n.error}));return}M(!0),await X()&&window.location.reload()}async function H(){if(O===0)return;let t=g.map(e=>`${N(e.id)}: v${e.installedVersion} → v${e.latestVersion}`);D&&t.push(`${e(`plugins.runtimeLabel`)}: v${m.installedVersion} → v${m.latestVersion}`);let n=t.join(`
2
+ `);if(!window.confirm(e(`plugins.confirmUpdateAll`,{count:O,list:n})))return;f(`*`),A(null);let r=await _();if(!r.ok){f(null),A(r.stderr?`${e(`plugins.updateError`)}: ${r.stderr}`:e(`plugins.genericError`,{code:r.error}));return}M(!0),await X()&&window.location.reload()}let W=r.find(e=>e.id===`core`),K=!!(W?.latestVersion&&W.latestVersion!==W.installedVersion),q=K||D;async function Z(){let t=[];if(W&&K&&t.push(`${e(`core.settings.label`)}: v${W.installedVersion} → v${W.latestVersion}`),D&&t.push(`${e(`plugins.runtimeLabel`)}: v${m.installedVersion} → v${m.latestVersion}`),t.length===0||!window.confirm(e(`plugins.confirmUpdateAll`,{count:t.length,list:t.join(`
3
+ `)})))return;f(`*`),A(null);let n=await v();if(!n.ok){f(null),A(n.stderr?`${e(`plugins.updateError`)}: ${n.stderr}`:e(`plugins.genericError`,{code:n.error}));return}M(!0),await X()&&window.location.reload()}return(0,U.jsxDEV)(T,{children:[(0,U.jsxDEV)(`h1`,{className:`mb-6 text-[28px] font-bold text-text`,children:e(`settings.title`)},void 0,!1,{fileName:Y,lineNumber:185,columnNumber:7},this),(0,U.jsxDEV)(`section`,{className:`mb-6`,children:[(0,U.jsxDEV)(`h2`,{className:`mb-1 text-sm font-semibold uppercase tracking-wide text-muted`,children:e(`settings.personalTitle`)},void 0,!1,{fileName:Y,lineNumber:189,columnNumber:9},this),(0,U.jsxDEV)(w,{className:`flex items-center gap-4 px-4 py-3`,children:[(0,U.jsxDEV)(`div`,{className:`min-w-0 flex-1`,children:(0,U.jsxDEV)(`span`,{className:`font-semibold text-text`,children:e(`auth.accountTitle`)},void 0,!1,{fileName:Y,lineNumber:192,columnNumber:13},this)},void 0,!1,{fileName:Y,lineNumber:191,columnNumber:11},this),(0,U.jsxDEV)(o,{variant:`ghost`,size:`sm`,type:`button`,className:`shrink-0 border border-border`,asChild:!0,children:(0,U.jsxDEV)(c,{to:`/settings/account`,title:e(`auth.accountTitle`),"aria-label":e(`auth.accountTitle`),children:(0,U.jsxDEV)(i,{name:`lucide:settings`,size:16},void 0,!1,{fileName:Y,lineNumber:196,columnNumber:15},this)},void 0,!1,{fileName:Y,lineNumber:195,columnNumber:13},this)},void 0,!1,{fileName:Y,lineNumber:194,columnNumber:11},this)]},void 0,!0,{fileName:Y,lineNumber:190,columnNumber:9},this)]},void 0,!0,{fileName:Y,lineNumber:188,columnNumber:7},this),n&&(0,U.jsxDEV)(U.Fragment,{children:[(0,U.jsxDEV)(`section`,{className:`mb-6`,children:[(0,U.jsxDEV)(`h2`,{className:`mb-1 text-sm font-semibold uppercase tracking-wide text-muted`,children:e(`settings.usersTitle`)},void 0,!1,{fileName:Y,lineNumber:206,columnNumber:13},this),(0,U.jsxDEV)(`p`,{className:`mb-3 text-sm text-muted`,children:e(`settings.usersDescription`)},void 0,!1,{fileName:Y,lineNumber:207,columnNumber:13},this),(0,U.jsxDEV)(w,{className:`flex items-center gap-4 px-4 py-3`,children:[(0,U.jsxDEV)(`div`,{className:`min-w-0 flex-1`,children:(0,U.jsxDEV)(`span`,{className:`font-semibold text-text`,children:e(`settings.usersTitle`)},void 0,!1,{fileName:Y,lineNumber:210,columnNumber:17},this)},void 0,!1,{fileName:Y,lineNumber:209,columnNumber:15},this),(0,U.jsxDEV)(o,{variant:`ghost`,size:`sm`,type:`button`,className:`shrink-0 border border-border`,asChild:!0,children:(0,U.jsxDEV)(c,{to:`/settings/users`,title:e(`settings.usersTitle`),"aria-label":e(`settings.usersTitle`),children:(0,U.jsxDEV)(i,{name:`lucide:settings`,size:16},void 0,!1,{fileName:Y,lineNumber:214,columnNumber:19},this)},void 0,!1,{fileName:Y,lineNumber:213,columnNumber:17},this)},void 0,!1,{fileName:Y,lineNumber:212,columnNumber:15},this)]},void 0,!0,{fileName:Y,lineNumber:208,columnNumber:13},this)]},void 0,!0,{fileName:Y,lineNumber:205,columnNumber:11},this),(0,U.jsxDEV)(`section`,{children:[(0,U.jsxDEV)(`div`,{className:`mb-1 flex items-center gap-3`,children:[(0,U.jsxDEV)(`h2`,{className:`text-sm font-semibold uppercase tracking-wide text-muted`,children:e(`settings.componentsTitle`)},void 0,!1,{fileName:Y,lineNumber:223,columnNumber:15},this),O>0&&(0,U.jsxDEV)(o,{variant:`ghost`,size:`sm`,type:`button`,disabled:d!==null,onClick:H,className:`shrink-0 border border-accent/40 text-accent hover:bg-accent/10 hover:text-accent`,children:e(`plugins.updateAllButton`,{count:O})},void 0,!1,{fileName:Y,lineNumber:225,columnNumber:17},this)]},void 0,!0,{fileName:Y,lineNumber:222,columnNumber:13},this),(0,U.jsxDEV)(`p`,{className:`mb-3 text-sm text-muted`,children:e(`settings.componentsDescription`)},void 0,!1,{fileName:Y,lineNumber:237,columnNumber:13},this),l?(0,U.jsxDEV)(`p`,{className:`text-muted`,children:e(`plugins.loading`)},void 0,!1,{fileName:Y,lineNumber:240,columnNumber:15},this):(0,U.jsxDEV)(U.Fragment,{children:[j&&(0,U.jsxDEV)(`div`,{className:`mb-5 rounded-xl border border-accent/40 bg-accent/10 px-4 py-3 text-sm text-accent`,children:[e(`plugins.restartBannerBefore`),(0,U.jsxDEV)(`b`,{children:e(`plugins.restartBannerBold`)},void 0,!1,{fileName:Y,lineNumber:246,columnNumber:21},this),e(`plugins.restartBannerAfter`)]},void 0,!0,{fileName:Y,lineNumber:244,columnNumber:19},this),k&&(0,U.jsxDEV)(`div`,{className:`mb-5 rounded-xl border border-danger/40 bg-danger/10 px-4 py-3 text-sm text-danger`,children:k},void 0,!1,{fileName:Y,lineNumber:251,columnNumber:19},this),(0,U.jsxDEV)(`div`,{className:`flex flex-col gap-2`,children:[(0,U.jsxDEV)(w,{className:`flex items-center gap-4 px-4 py-3`,children:[(0,U.jsxDEV)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsxDEV)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsxDEV)(`span`,{className:`font-semibold text-text`,children:e(`core.settings.label`)},void 0,!1,{fileName:Y,lineNumber:261,columnNumber:25},this),W&&(0,U.jsxDEV)(J,{variant:`secondary`,className:`text-[10px] font-medium`,children:[`v`,W.installedVersion]},void 0,!0,{fileName:Y,lineNumber:263,columnNumber:27},this),q&&(0,U.jsxDEV)(o,{variant:`ghost`,size:`sm`,type:`button`,disabled:d!==null,onClick:Z,title:e(`settings.systemUpdateTitle`),className:`shrink-0 border border-accent/40 text-accent hover:bg-accent/10 hover:text-accent`,children:e(`plugins.updateButton`)},void 0,!1,{fileName:Y,lineNumber:268,columnNumber:27},this)]},void 0,!0,{fileName:Y,lineNumber:260,columnNumber:23},this),(0,U.jsxDEV)(`div`,{className:`text-xs text-muted mt-0.5 truncate`,children:e(`settings.systemDescription`)},void 0,!1,{fileName:Y,lineNumber:281,columnNumber:23},this)]},void 0,!0,{fileName:Y,lineNumber:259,columnNumber:21},this),(0,U.jsxDEV)(o,{variant:`ghost`,size:`sm`,type:`button`,className:`shrink-0 border border-border`,asChild:!0,children:(0,U.jsxDEV)(c,{to:`/settings/core`,title:e(`core.settings.label`),"aria-label":e(`core.settings.label`),children:(0,U.jsxDEV)(i,{name:`lucide:settings`,size:16},void 0,!1,{fileName:Y,lineNumber:285,columnNumber:25},this)},void 0,!1,{fileName:Y,lineNumber:284,columnNumber:23},this)},void 0,!1,{fileName:Y,lineNumber:283,columnNumber:21},this)]},void 0,!0,{fileName:Y,lineNumber:258,columnNumber:19},this),r.filter(e=>e.id!==`core`).map(t=>{let n=P(t.id),a=t.enabled?r.filter(e=>e.enabled&&e.id!==t.id&&e.dependsOn.includes(t.id)):[],s=a.length>0,l=s?e(`plugins.blockedByDependents`,{list:a.map(e=>N(e.id)).join(`, `)}):t.enabled?e(`plugins.switchDisable`):e(`plugins.switchEnable`),u=[t.dependsOn.length>0&&`${e(`plugins.metaDepends`)} ${t.dependsOn.map(N).join(`, `)}`,t.libraries.length>0&&`${e(`plugins.metaLibraries`)} ${t.libraries.map(F).join(`, `)}`,t.extends.length>0&&`${e(`plugins.metaExtends`)} ${t.extends.map(e=>I(t.id,e)).join(`, `)}`].filter(Boolean).join(` · `)||`—`;return(0,U.jsxDEV)(w,{className:`flex items-center gap-4 px-4 py-3`,children:[(0,U.jsxDEV)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsxDEV)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsxDEV)(`span`,{className:`font-semibold text-text`,children:N(t.id)},void 0,!1,{fileName:Y,lineNumber:320,columnNumber:31},this),(0,U.jsxDEV)(Q,{plugin:t,busy:p(t.id),onUpdate:()=>V(t)},void 0,!1,{fileName:Y,lineNumber:321,columnNumber:31},this)]},void 0,!0,{fileName:Y,lineNumber:319,columnNumber:29},this),n&&(0,U.jsxDEV)(`div`,{className:`text-xs text-muted mt-0.5 truncate`,children:n},void 0,!1,{fileName:Y,lineNumber:323,columnNumber:45},this),(0,U.jsxDEV)(`div`,{className:`text-xs text-muted mt-0.5 truncate`,children:u},void 0,!1,{fileName:Y,lineNumber:324,columnNumber:29},this)]},void 0,!0,{fileName:Y,lineNumber:318,columnNumber:27},this),t.hasSettings&&(0,U.jsxDEV)(o,{variant:`ghost`,size:`sm`,type:`button`,className:`shrink-0 border border-border`,asChild:!0,children:(0,U.jsxDEV)(c,{to:`/settings/${t.id}`,title:e(`plugins.settingsTitle`,{defaultValue:`Налаштування`}),"aria-label":e(`plugins.settingsTitle`,{defaultValue:`Налаштування`}),children:(0,U.jsxDEV)(i,{name:`lucide:settings`,size:16},void 0,!1,{fileName:Y,lineNumber:339,columnNumber:33},this)},void 0,!1,{fileName:Y,lineNumber:334,columnNumber:31},this)},void 0,!1,{fileName:Y,lineNumber:327,columnNumber:29},this),(0,U.jsxDEV)(o,{variant:`ghost`,size:`sm`,type:`button`,disabled:p(t.id),onClick:()=>z(t),title:e(`plugins.purgeTitle`),className:`shrink-0 border border-danger/40 text-danger hover:bg-danger/10 hover:text-danger`,children:e(`plugins.purgeButton`)},void 0,!1,{fileName:Y,lineNumber:343,columnNumber:27},this),(0,U.jsxDEV)(`span`,{title:l,className:`shrink-0`,children:(0,U.jsxDEV)(G,{checked:t.enabled,disabled:p(t.id)||s,onCheckedChange:()=>B(t),title:l},void 0,!1,{fileName:Y,lineNumber:357,columnNumber:29},this)},void 0,!1,{fileName:Y,lineNumber:356,columnNumber:27},this)]},t.id,!0,{fileName:Y,lineNumber:317,columnNumber:25},this)})]},void 0,!0,{fileName:Y,lineNumber:256,columnNumber:17},this)]},void 0,!0,{fileName:Y,lineNumber:242,columnNumber:15},this)]},void 0,!0,{fileName:Y,lineNumber:221,columnNumber:11},this)]},void 0,!0,{fileName:Y,lineNumber:203,columnNumber:9},this)]},void 0,!0,{fileName:Y,lineNumber:184,columnNumber:5},this)}function Q({plugin:e,busy:t,onUpdate:n}){let{t:r}=s(),i=!!e.latestVersion&&e.latestVersion!==e.installedVersion;return(0,U.jsxDEV)(U.Fragment,{children:[(0,U.jsxDEV)(J,{variant:`secondary`,className:`text-[10px] font-medium`,children:[`v`,e.installedVersion]},void 0,!0,{fileName:Y,lineNumber:390,columnNumber:7},this),i&&(0,U.jsxDEV)(o,{variant:`ghost`,size:`sm`,type:`button`,disabled:t,onClick:n,title:r(`plugins.updateTitle`,{from:e.installedVersion,to:e.latestVersion}),className:`shrink-0 border border-accent/40 text-accent hover:bg-accent/10 hover:text-accent`,children:r(`plugins.updateButton`)},void 0,!1,{fileName:Y,lineNumber:394,columnNumber:9},this)]},void 0,!0,{fileName:Y,lineNumber:389,columnNumber:5},this)}export{Z as SettingsPage};
@@ -1 +1 @@
1
- async function e(e){let t=new FormData;t.append(`file`,e);let n=await fetch(`/api/upload`,{method:`POST`,body:t});return n.ok?(await n.json()).filename:null}function t(e){return`/uploads/${e}`}async function n(e){let t=await fetch(`/api/embed`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({url:e})});return t.ok?await t.json():null}var r=new Map;function i(e){let t=r.get(e);if(t)return t;let n=fetch(e).then(t=>{if(!t.ok)throw Error(`GET ${e} → ${t.status}`);return t.json()}).finally(()=>{r.delete(e)});return r.set(e,n),n}function a(e,t,n){return i(`/api/${e}/${t}${n&&Object.keys(n).length?`?`+new URLSearchParams(n).toString():``}`)}async function o(e,t,n){let r=await fetch(`/api/${e}/${t}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n)});return r.status===201?{ok:!0,row:await r.json()}:r.status===422?{ok:!1,issues:(await r.json()).issues}:{ok:!1,issues:[{field:``,code:`server`,path:[]}]}}async function s(e,t,n,r){let i=await fetch(`/api/${e}/${t}/${n}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(r)});return i.ok?{ok:!0,row:await i.json()}:i.status===422?{ok:!1,issues:(await i.json()).issues}:{ok:!1,issues:[{field:``,code:`server`,path:[]}]}}async function c(e,t,n){return(await fetch(`/api/${e}/${t}/${n}`,{method:`DELETE`})).status===204}async function l(){let e=await fetch(`/api/plugins?updates=1`);if(!e.ok)throw Error(`plugins`);return e.json()}async function u(e,t){let n=await fetch(`/api/plugins/${e}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:t})}),r=await n.json().catch(()=>({}));return n.ok?{ok:!0}:{ok:!1,error:r.error??String(n.status),data:r}}async function d(e){let t=await fetch(`/api/plugins/${e}/update`,{method:`POST`}),n=await t.json().catch(()=>({}));return t.ok?{ok:!0}:{ok:!1,error:n.error??String(t.status),stderr:n.stderr}}async function f(){let e=await fetch(`/api/plugins/update-all`,{method:`POST`}),t=await e.json().catch(()=>({}));return e.ok?{ok:!0,updated:t.updated}:{ok:!1,error:t.error??String(e.status),stderr:t.stderr}}async function p(){let e=await fetch(`/api/runtime`);return e.ok?await e.json():{installedVersion:null,latestVersion:null}}async function m(e,t){let n=await fetch(e,{headers:{"content-type":`application/json`},...t}),r=await n.json().catch(()=>({}));return n.ok?{ok:!0,data:r}:{ok:!1,status:n.status,data:r}}function h(){return i(`/api/auth/status`)}function g(e,t,n){return m(`/api/auth/setup`,{method:`POST`,body:JSON.stringify({login:e,password:t,displayName:n})})}function _(e,t){return m(`/api/auth/login`,{method:`POST`,body:JSON.stringify({login:e,password:t})})}async function v(){let e=await fetch(`/api/auth/me`);return e.ok?e.json():null}function y(e){return m(`/api/auth/me`,{method:`PATCH`,body:JSON.stringify(e)})}function b(e){return m(`/api/auth/users${e?`?q=${encodeURIComponent(e)}`:``}`)}function x(e){return m(`/api/auth/users`,{method:`POST`,body:JSON.stringify(e)})}function S(e,t){return m(`/api/auth/users/${e}`,{method:`PATCH`,body:JSON.stringify(t)})}function C(e){return m(`/api/auth/users/${e}`,{method:`DELETE`})}function w(){return m(`/api/auth/tokens`)}function T(e,t){return m(`/api/auth/tokens`,{method:`POST`,body:JSON.stringify({name:e,token:t})})}function E(e){return m(`/api/auth/tokens/${e}`,{method:`DELETE`})}function D(){return m(`/api/oauth/grants`)}function O(e){return m(`/api/oauth/grants/${encodeURIComponent(e)}`,{method:`DELETE`})}export{f as C,e as D,S as E,u as S,s as T,b as _,y as a,O as b,x as c,i as d,p as f,w as g,a as h,h as i,c as l,l as m,v as n,o,D as p,g as r,T as s,_ as t,C as u,t as v,d as w,E as x,n as y};
1
+ async function e(e){let t=new FormData;t.append(`file`,e);let n=await fetch(`/api/upload`,{method:`POST`,body:t});return n.ok?(await n.json()).filename:null}function t(e){return`/uploads/${e}`}async function n(e){let t=await fetch(`/api/embed`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({url:e})});return t.ok?await t.json():null}var r=new Map;function i(e){let t=r.get(e);if(t)return t;let n=fetch(e).then(t=>{if(!t.ok)throw Error(`GET ${e} → ${t.status}`);return t.json()}).finally(()=>{r.delete(e)});return r.set(e,n),n}function a(e,t,n){return i(`/api/${e}/${t}${n&&Object.keys(n).length?`?`+new URLSearchParams(n).toString():``}`)}async function o(e,t,n){let r=await fetch(`/api/${e}/${t}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n)});return r.status===201?{ok:!0,row:await r.json()}:r.status===422?{ok:!1,issues:(await r.json()).issues}:{ok:!1,issues:[{field:``,code:`server`,path:[]}]}}async function s(e,t,n,r){let i=await fetch(`/api/${e}/${t}/${n}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(r)});return i.ok?{ok:!0,row:await i.json()}:i.status===422?{ok:!1,issues:(await i.json()).issues}:{ok:!1,issues:[{field:``,code:`server`,path:[]}]}}async function c(e,t,n){return(await fetch(`/api/${e}/${t}/${n}`,{method:`DELETE`})).status===204}async function l(){let e=await fetch(`/api/plugins?updates=1`);if(!e.ok)throw Error(`plugins`);return e.json()}async function u(e,t){let n=await fetch(`/api/plugins/${e}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:t})}),r=await n.json().catch(()=>({}));return n.ok?{ok:!0}:{ok:!1,error:r.error??String(n.status),data:r}}async function d(e){let t=await fetch(`/api/plugins/${e}/update`,{method:`POST`}),n=await t.json().catch(()=>({}));return t.ok?{ok:!0}:{ok:!1,error:n.error??String(t.status),stderr:n.stderr}}async function f(){let e=await fetch(`/api/plugins/update-all`,{method:`POST`}),t=await e.json().catch(()=>({}));return e.ok?{ok:!0,updated:t.updated}:{ok:!1,error:t.error??String(e.status),stderr:t.stderr}}async function p(){let e=await fetch(`/api/system/update`,{method:`POST`}),t=await e.json().catch(()=>({}));return e.ok?{ok:!0,updated:t.updated}:{ok:!1,error:t.error??String(e.status),stderr:t.stderr}}async function m(){let e=await fetch(`/api/runtime`);return e.ok?await e.json():{installedVersion:null,latestVersion:null}}async function h(e,t){let n=await fetch(e,{headers:{"content-type":`application/json`},...t}),r=await n.json().catch(()=>({}));return n.ok?{ok:!0,data:r}:{ok:!1,status:n.status,data:r}}function g(){return i(`/api/auth/status`)}function _(e,t,n){return h(`/api/auth/setup`,{method:`POST`,body:JSON.stringify({login:e,password:t,displayName:n})})}function v(e,t){return h(`/api/auth/login`,{method:`POST`,body:JSON.stringify({login:e,password:t})})}async function y(){let e=await fetch(`/api/auth/me`);return e.ok?e.json():null}function b(e){return h(`/api/auth/me`,{method:`PATCH`,body:JSON.stringify(e)})}function x(e){return h(`/api/auth/users${e?`?q=${encodeURIComponent(e)}`:``}`)}function S(e){return h(`/api/auth/users`,{method:`POST`,body:JSON.stringify(e)})}function C(e,t){return h(`/api/auth/users/${e}`,{method:`PATCH`,body:JSON.stringify(t)})}function w(e){return h(`/api/auth/users/${e}`,{method:`DELETE`})}function T(){return h(`/api/auth/tokens`)}function E(e,t){return h(`/api/auth/tokens`,{method:`POST`,body:JSON.stringify({name:e,token:t})})}function D(e){return h(`/api/auth/tokens/${e}`,{method:`DELETE`})}function O(){return h(`/api/oauth/grants`)}function k(e){return h(`/api/oauth/grants/${encodeURIComponent(e)}`,{method:`DELETE`})}export{f as C,C as D,p as E,e as O,u as S,s as T,x as _,b as a,k as b,S as c,i as d,m as f,T as g,a as h,g as i,c as l,l as m,y as n,o,O as p,_ as r,E as s,v as t,w as u,t as v,d as w,D as x,n as y};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-n93t21jb.js";import{C as n}from"./button-Dlm2GmQs.js";import{i as r,s as i}from"./chunk-KS7C4IRE-B1_Zk64s.js";import{t as a}from"./jsx-dev-runtime-CSfA-jUb.js";import{i as o,n as s}from"./api-B7hHeZsv.js";var c=e(t(),1),l=a(),u=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/components/ui/card.tsx`,d=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`rounded-xl border border-border bg-card text-card-foreground`,e),...t},void 0,!1,{fileName:u,lineNumber:5,columnNumber:3},void 0));d.displayName=`Card`;var f=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`flex flex-col gap-1.5 p-5`,e),...t},void 0,!1,{fileName:u,lineNumber:10,columnNumber:37},void 0));f.displayName=`CardHeader`;var p=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`font-semibold leading-none text-text`,e),...t},void 0,!1,{fileName:u,lineNumber:16,columnNumber:5},void 0));p.displayName=`CardTitle`;var m=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`text-sm text-muted-foreground`,e),...t},void 0,!1,{fileName:u,lineNumber:23,columnNumber:5},void 0));m.displayName=`CardDescription`;var h=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`p-5 pt-0`,e),...t},void 0,!1,{fileName:u,lineNumber:29,columnNumber:37},void 0));h.displayName=`CardContent`;var g=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`flex items-center p-5 pt-0`,e),...t},void 0,!1,{fileName:u,lineNumber:35,columnNumber:5},void 0));g.displayName=`CardFooter`;var _=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/auth-context.tsx`,v=(0,c.createContext)(null);function y(){let e=(0,c.useContext)(v);if(!e)throw Error(`useAuth() called outside <AuthGate>`);return e}function b({children:e}){let[t,n]=(0,c.useState)({kind:`loading`});return(0,c.useEffect)(()=>{if(t.kind===`ready`)return;let e=!1;return(async()=>{try{let t=await o();if(e)return;if(t.needsSetup)return n({kind:`needsSetup`});let r=await s();if(e)return;n(r?{kind:`ready`,user:r}:{kind:`needsLogin`})}catch{e||n({kind:`error`})}})(),()=>{e=!0}},[i().pathname,t.kind]),(0,c.useEffect)(()=>{if(t.kind!==`ready`)return;let e=()=>{document.visibilityState===`visible`&&s().then(e=>{e||n({kind:`needsLogin`})}).catch(()=>{})};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[t.kind]),t.kind===`loading`?null:t.kind===`needsSetup`?(0,l.jsxDEV)(r,{to:`/setup`,replace:!0},void 0,!1,{fileName:_,lineNumber:61,columnNumber:44},this):t.kind===`needsLogin`?(0,l.jsxDEV)(r,{to:`/login`,replace:!0},void 0,!1,{fileName:_,lineNumber:62,columnNumber:44},this):t.kind===`error`?(0,l.jsxDEV)(`div`,{style:{display:`flex`,minHeight:`100dvh`,alignItems:`center`,justifyContent:`center`,flexDirection:`column`,gap:`1rem`},children:[(0,l.jsxDEV)(`p`,{children:`Could not check your session.`},void 0,!1,{fileName:_,lineNumber:66,columnNumber:9},this),(0,l.jsxDEV)(`button`,{onClick:()=>window.location.reload(),children:`Reload`},void 0,!1,{fileName:_,lineNumber:67,columnNumber:9},this)]},void 0,!0,{fileName:_,lineNumber:65,columnNumber:7},this):(0,l.jsxDEV)(v.Provider,{value:t.user,children:e},void 0,!1,{fileName:_,lineNumber:71,columnNumber:10},this)}export{y as n,d as r,b as t};
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-n93t21jb.js";import{C as n}from"./button-Dlm2GmQs.js";import{i as r,s as i}from"./chunk-KS7C4IRE-B1_Zk64s.js";import{t as a}from"./jsx-dev-runtime-CSfA-jUb.js";import{i as o,n as s}from"./api-CZDF0K_X.js";var c=e(t(),1),l=a(),u=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/components/ui/card.tsx`,d=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`rounded-xl border border-border bg-card text-card-foreground`,e),...t},void 0,!1,{fileName:u,lineNumber:5,columnNumber:3},void 0));d.displayName=`Card`;var f=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`flex flex-col gap-1.5 p-5`,e),...t},void 0,!1,{fileName:u,lineNumber:10,columnNumber:37},void 0));f.displayName=`CardHeader`;var p=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`font-semibold leading-none text-text`,e),...t},void 0,!1,{fileName:u,lineNumber:16,columnNumber:5},void 0));p.displayName=`CardTitle`;var m=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`text-sm text-muted-foreground`,e),...t},void 0,!1,{fileName:u,lineNumber:23,columnNumber:5},void 0));m.displayName=`CardDescription`;var h=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`p-5 pt-0`,e),...t},void 0,!1,{fileName:u,lineNumber:29,columnNumber:37},void 0));h.displayName=`CardContent`;var g=c.forwardRef(({className:e,...t},r)=>(0,l.jsxDEV)(`div`,{ref:r,className:n(`flex items-center p-5 pt-0`,e),...t},void 0,!1,{fileName:u,lineNumber:35,columnNumber:5},void 0));g.displayName=`CardFooter`;var _=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/web/auth-context.tsx`,v=(0,c.createContext)(null);function y(){let e=(0,c.useContext)(v);if(!e)throw Error(`useAuth() called outside <AuthGate>`);return e}function b({children:e}){let[t,n]=(0,c.useState)({kind:`loading`});return(0,c.useEffect)(()=>{if(t.kind===`ready`)return;let e=!1;return(async()=>{try{let t=await o();if(e)return;if(t.needsSetup)return n({kind:`needsSetup`});let r=await s();if(e)return;n(r?{kind:`ready`,user:r}:{kind:`needsLogin`})}catch{e||n({kind:`error`})}})(),()=>{e=!0}},[i().pathname,t.kind]),(0,c.useEffect)(()=>{if(t.kind!==`ready`)return;let e=()=>{document.visibilityState===`visible`&&s().then(e=>{e||n({kind:`needsLogin`})}).catch(()=>{})};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[t.kind]),t.kind===`loading`?null:t.kind===`needsSetup`?(0,l.jsxDEV)(r,{to:`/setup`,replace:!0},void 0,!1,{fileName:_,lineNumber:61,columnNumber:44},this):t.kind===`needsLogin`?(0,l.jsxDEV)(r,{to:`/login`,replace:!0},void 0,!1,{fileName:_,lineNumber:62,columnNumber:44},this):t.kind===`error`?(0,l.jsxDEV)(`div`,{style:{display:`flex`,minHeight:`100dvh`,alignItems:`center`,justifyContent:`center`,flexDirection:`column`,gap:`1rem`},children:[(0,l.jsxDEV)(`p`,{children:`Could not check your session.`},void 0,!1,{fileName:_,lineNumber:66,columnNumber:9},this),(0,l.jsxDEV)(`button`,{onClick:()=>window.location.reload(),children:`Reload`},void 0,!1,{fileName:_,lineNumber:67,columnNumber:9},this)]},void 0,!0,{fileName:_,lineNumber:65,columnNumber:7},this):(0,l.jsxDEV)(v.Provider,{value:t.user,children:e},void 0,!1,{fileName:_,lineNumber:71,columnNumber:10},this)}export{y as n,d as r,b as t};