From 8c9f2f0c8bebd6a76c460d97cb74e00356956fae Mon Sep 17 00:00:00 2001 From: root Date: Fri, 16 Oct 2026 14:06:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E9=87=8D=E5=81=9A=EF=BC=88=E9=A1=B6=E6=A0=8F=E4=B8=A4?= =?UTF-8?q?=E8=A1=8C=E3=80=81=E5=AE=89=E5=85=A8=E5=8C=BA=E3=80=81=E6=9C=88?= =?UTF-8?q?=E5=8E=86=E7=B4=A7=E5=87=91=E3=80=81=E8=A1=A8=E5=8D=95=E5=8D=95?= =?UTF-8?q?=E5=88=97=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{index-B9GSzgPK.js => index-CocrpELo.js} | 6 +-- intern-log/dist/assets/index-egFbJdki.css | 1 - .../{index-BdeEta5K.js => index-mjAVYvQ7.js} | 4 +- intern-log/dist/assets/index-vDZJrZrZ.css | 1 + .../{web-DemcfbD8.js => web-C1N1mu_I.js} | 2 +- intern-log/dist/index.html | 4 +- intern-log/src/App.vue | 53 +++++++++++++------ intern-log/src/views/CalendarView.vue | 7 +++ intern-log/src/views/LedgerView.vue | 6 +++ intern-log/src/views/TodayView.vue | 6 +++ 10 files changed, 66 insertions(+), 24 deletions(-) rename intern-log/dist/assets/{index-B9GSzgPK.js => index-CocrpELo.js} (97%) delete mode 100644 intern-log/dist/assets/index-egFbJdki.css rename intern-log/dist/assets/{index-BdeEta5K.js => index-mjAVYvQ7.js} (69%) create mode 100644 intern-log/dist/assets/index-vDZJrZrZ.css rename intern-log/dist/assets/{web-DemcfbD8.js => web-C1N1mu_I.js} (98%) diff --git a/intern-log/dist/assets/index-B9GSzgPK.js b/intern-log/dist/assets/index-CocrpELo.js similarity index 97% rename from intern-log/dist/assets/index-B9GSzgPK.js rename to intern-log/dist/assets/index-CocrpELo.js index f5bc99e..eb52b26 100644 --- a/intern-log/dist/assets/index-B9GSzgPK.js +++ b/intern-log/dist/assets/index-CocrpELo.js @@ -17,8 +17,8 @@ **/let xa;const au=typeof window<"u"&&window.trustedTypes;if(au)try{xa=au.createPolicy("vue",{createHTML:e=>e})}catch{}const zc=xa?e=>xa.createHTML(e):e=>e,zp="http://www.w3.org/2000/svg",Gp="http://www.w3.org/1998/Math/MathML",jn=typeof document<"u"?document:null,lu=jn&&jn.createElement("template"),Yp={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?jn.createElementNS(zp,e):t==="mathml"?jn.createElementNS(Gp,e):n?jn.createElement(e,{is:n}):jn.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>jn.createTextNode(e),createComment:e=>jn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>jn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,a){const c=n?n.previousSibling:t.lastChild;if(o&&(o===a||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===a||!(o=o.nextSibling)););else{lu.innerHTML=zc(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const d=lu.content;if(s==="svg"||s==="mathml"){const h=d.firstChild;for(;h.firstChild;)d.appendChild(h.firstChild);d.removeChild(h)}t.insertBefore(d,n)}return[c?c.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Qn="transition",vs="animation",Jr=Symbol("_vtc"),Gc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Yc=Et({},gc,Gc),Jp=e=>(e.displayName="Transition",e.props=Yc,e),ns=Jp((e,{slots:t})=>Hp(Jd,Jc(e),t)),xr=(e,t=[])=>{Le(e)?e.forEach(n=>n(...t)):e&&e(...t)},uu=e=>e?Le(e)?e.some(t=>t.length>1):e.length>1:!1;function Jc(e){const t={};for(const J in e)J in Gc||(t[J]=e[J]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:a=`${n}-enter-from`,enterActiveClass:c=`${n}-enter-active`,enterToClass:d=`${n}-enter-to`,appearFromClass:h=a,appearActiveClass:y=c,appearToClass:m=d,leaveFromClass:k=`${n}-leave-from`,leaveActiveClass:D=`${n}-leave-active`,leaveToClass:T=`${n}-leave-to`}=e,L=Xp(o),X=L&&L[0],ce=L&&L[1],{onBeforeEnter:Q,onEnter:E,onEnterCancelled:N,onLeave:G,onLeaveCancelled:de,onBeforeAppear:ae=Q,onAppear:Z=E,onAppearCancelled:$=N}=t,x=(J,xe,Ve,nt)=>{J._enterCancelled=nt,er(J,xe?m:d),er(J,xe?y:c),Ve&&Ve()},le=(J,xe)=>{J._isLeaving=!1,er(J,k),er(J,T),er(J,D),xe&&xe()},ke=J=>(xe,Ve)=>{const nt=J?Z:E,qe=()=>x(xe,J,Ve);xr(nt,[xe,qe]),cu(()=>{er(xe,J?h:a),bn(xe,J?m:d),uu(nt)||fu(xe,s,X,qe)})};return Et(t,{onBeforeEnter(J){xr(Q,[J]),bn(J,a),bn(J,c)},onBeforeAppear(J){xr(ae,[J]),bn(J,h),bn(J,y)},onEnter:ke(!1),onAppear:ke(!0),onLeave(J,xe){J._isLeaving=!0;const Ve=()=>le(J,xe);bn(J,k),J._enterCancelled?(bn(J,D),Ca(J)):(Ca(J),bn(J,D)),cu(()=>{J._isLeaving&&(er(J,k),bn(J,T),uu(G)||fu(J,s,ce,Ve))}),xr(G,[J,Ve])},onEnterCancelled(J){x(J,!1,void 0,!0),xr(N,[J])},onAppearCancelled(J){x(J,!0,void 0,!0),xr($,[J])},onLeaveCancelled(J){le(J),xr(de,[J])}})}function Xp(e){if(e==null)return null;if(at(e))return[sa(e.enter),sa(e.leave)];{const t=sa(e);return[t,t]}}function sa(e){return nd(e)}function bn(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Jr]||(e[Jr]=new Set)).add(t)}function er(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Jr];n&&(n.delete(t),n.size||(e[Jr]=void 0))}function cu(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Qp=0;function fu(e,t,n,s){const o=e._endId=++Qp,a=()=>{o===e._endId&&s()};if(n!=null)return setTimeout(a,n);const{type:c,timeout:d,propCount:h}=Xc(e,t);if(!c)return s();const y=c+"end";let m=0;const k=()=>{e.removeEventListener(y,D),a()},D=T=>{T.target===e&&++m>=h&&k()};setTimeout(()=>{m(n[L]||"").split(", "),o=s(`${Qn}Delay`),a=s(`${Qn}Duration`),c=du(o,a),d=s(`${vs}Delay`),h=s(`${vs}Duration`),y=du(d,h);let m=null,k=0,D=0;t===Qn?c>0&&(m=Qn,k=c,D=a.length):t===vs?y>0&&(m=vs,k=y,D=h.length):(k=Math.max(c,y),m=k>0?c>y?Qn:vs:null,D=m?m===Qn?a.length:h.length:0);const T=m===Qn&&/\b(?:transform|all)(?:,|$)/.test(s(`${Qn}Property`).toString());return{type:m,timeout:k,propCount:D,hasTransform:T}}function du(e,t){for(;e.lengthpu(n)+pu(e[s])))}function pu(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ca(e){return(e?e.ownerDocument:document).body.offsetHeight}function Zp(e,t,n){const s=e[Jr];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const hu=Symbol("_vod"),Qc=Symbol("_vsh"),eh=Symbol(""),th=/(?:^|;)\s*display\s*:/;function nh(e,t,n){const s=e.style,o=bt(n);let a=!1;if(n&&!o){if(t)if(bt(t))for(const c of t.split(";")){const d=c.slice(0,c.indexOf(":")).trim();n[d]==null&&gs(s,d,"")}else for(const c in t)n[c]==null&&gs(s,c,"");for(const c in n){c==="display"&&(a=!0);const d=n[c];d!=null?sh(e,c,!bt(t)&&t?t[c]:void 0,d)||gs(s,c,d):gs(s,c,"")}}else if(o){if(t!==n){const c=s[eh];c&&(n+=";"+c),s.cssText=n,a=th.test(n)}}else t&&e.removeAttribute("style");hu in e&&((!o||t!==n)&&(e[hu]=a?s.display:""),e[Qc]&&(s.display="none"))}const ko=/\s*!important$/;function gs(e,t,n){if(Le(n))n.forEach(s=>gs(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))ko.test(n)?e.setProperty(t,n.replace(ko,""),"important"):e.setProperty(t,n);else{const s=rh(e,t);ko.test(n)?e.setProperty(cr(s),n.replace(ko,""),"important"):e[s]=n}}const vu=["Webkit","Moz","ms"],oa={};function rh(e,t){const n=oa[t];if(n)return n;let s=hn(t);if(s!=="filter"&&s in e)return oa[t]=s;s=Vu(s);for(let o=0;oia||(ch.then(()=>ia=0),ia=Date.now());function dh(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;const o=n.value;if(Le(o)){const a=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{a.call(s),s._stopped=!0};const c=o.slice(),d=[s];for(let h=0;he.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ph=(e,t,n,s,o,a)=>{const c=o==="svg";t==="class"?Zp(e,s,c):t==="style"?nh(e,n,s):Qo(t)?Zo(t)||ih(e,t,n,s,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):hh(e,t,s,c))?(gu(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&yu(e,t,s,c,a,t!=="value")):e._isVueCE&&(vh(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!bt(s)))?gu(e,hn(t),s,a,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),yu(e,t,s,c))};function hh(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&wu(t)&&Ge(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return wu(t)&&bt(n)?!1:t in e}function vh(e,t){const n=e._def.props;if(!n)return!1;const s=hn(t);return Array.isArray(n)?n.some(o=>hn(o)===s):Object.keys(n).some(o=>hn(o)===s)}const Zc=new WeakMap,ef=new WeakMap,Vo=Symbol("_moveCb"),_u=Symbol("_enterCb"),Sa=new WeakMap,mh=e=>(delete e.props.mode,e),yh=mh({name:"TransitionGroup",props:Et({},Yc,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Xa(),s=yc();let o,a,c,d;const h=()=>(d===void 0&&(d=o.length>0&&Sh(o[0].el,n.vnode.el,ku(e))),d);return xc(()=>{if(Sa.delete(n),!h()){o=[],c=void 0;return}const y=ku(e);o.forEach(bh);const m=c&&Ch(c,n.vnode.el);c=void 0,o.forEach(D=>wh(D,m));const k=o.filter(_h);Ca(n.vnode.el),k.forEach(D=>{const T=D.el,L=T.style;bn(T,y),L.transform=L.webkitTransform=L.transitionDuration="";const X=T[Vo]=ce=>{ce&&ce.target!==T||(!ce||ce.propertyName.endsWith("transform"))&&(T.removeEventListener("transitionend",X),T[Vo]=null,er(T,y))};T.addEventListener("transitionend",X)}),o=[]}),()=>{const y=st(e),m=Jc(y);let k=y.tag||Re;if(o=[],d=void 0,a)for(let D=0;Ds.willMove()&&s.item.contains(t));return n&&fi(n.item,n)}function Sh(e,t,n){const s=e.cloneNode(),o=e[Jr];o&&o.forEach(d=>{d.split(/\s+/).forEach(h=>h&&s.classList.remove(h))}),n.split(/\s+/).forEach(d=>d&&s.classList.add(d)),s.style.display="none";const a=t.nodeType===1?t:t.parentNode;a.appendChild(s);const{hasTransform:c}=Xc(s);return a.removeChild(s),c}const Xr=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Le(t)?n=>So(t,n):t};function Eh(e){e.target.composing=!0}function xu(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Sn=Symbol("_assign"),xo=Symbol("_initialValue");function aa(e,t,n){return t&&(e=e.trim()),n&&(e=ti(e)),e}const De={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e.parentNode&&(e.type==="text"?e[xo]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[xo]=e.defaultValue.replace(/\r\n?/g,` `))),e[Sn]=Xr(o);const a=s||o.props&&o.props.type==="number";nr(e,t?"change":"input",c=>{c.target.composing||e[Sn](aa(e.value,n,a))}),(n||a)&&nr(e,"change",()=>{e.value=aa(e.value,n,a)}),t||(nr(e,"compositionstart",Eh),nr(e,"compositionend",xu),nr(e,"change",xu))},mounted(e,{value:t,modifiers:{trim:n,number:s}}){const o=t??"",a=e[xo];delete e[xo],a!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==a?e[Sn](aa(e.value,n,s)):e.value=o},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:a}},c){if(e[Sn]=Xr(c),e.composing)return;const d=(a||e.type==="number")&&!/^0\d/.test(e.value)?ti(e.value):e.value,h=t??"";if(d===h)return;const y=e.getRootNode();(y instanceof Document||y instanceof ShadowRoot)&&y.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===h)||(e.value=h)}},$h={deep:!0,created(e,t,n){e[Sn]=Xr(n),nr(e,"change",()=>{const s=e._modelValue,o=Ls(e),a=e.checked,c=e[Sn];if(Le(s)){const d=La(s,o),h=d!==-1;if(a&&!h)c(s.concat(o));else if(!a&&h){const y=[...s];y.splice(d,1),c(y)}}else if(Bn(s)){const d=new Set(s);a?d.add(o):d.delete(o),c(d)}else c(tf(e,a))})},mounted:Cu,beforeUpdate(e,t,n){e[Sn]=Xr(n),Cu(e,t,n)}};function Cu(e,{value:t,oldValue:n},s){e._modelValue=t;let o;if(Le(t))o=La(t,s.props.value)>-1;else if(Bn(t))o=t.has(s.props.value);else{if(t===n)return;o=Un(t,tf(e,!0))}e.checked!==o&&(e.checked=o)}const Fn={deep:!0,created(e,{value:t,modifiers:{number:n}},s){e._modelValue=t,nr(e,"change",()=>{const o=Array.prototype.filter.call(e.options,h=>h.selected).map(h=>n?ti(Ls(h)):Ls(h)),a=e.multiple,c=a?Bn(e._modelValue)?new Set(o):o:o[0],d=e._pendingValue=[a,a?Le(c)?o.slice():o:c];try{e[Sn](c)}finally{ts(()=>{e._pendingValue===d&&(e._pendingValue=void 0)})}}),e[Sn]=Xr(s)},mounted(e,{value:t}){Su(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[Sn]=Xr(n)},updated(e,{value:t}){const n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Ah(t,n[1],n[0]))&&Su(e,t)}};function Ah(e,t,n){if(!n||Le(e))return Un(e,t);if(Bn(e)){if(e.size!==t.length)return!1;for(const s of t)if(!e.has(s))return!1;return!0}return!1}function Su(e,t){const n=e.multiple,s=Le(t);if(!(n&&!s&&!Bn(t))){for(let o=0,a=e.options.length;oString(y)===String(d)):c.selected=La(t,d)>-1}else c.selected=t.has(d);else if(Un(Ls(c),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Ls(e){return"_value"in e?e._value:e.value}function tf(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Ph=["ctrl","shift","alt","meta"],Th={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ph.some(n=>e[`${n}Key`]&&!t.includes(n))},Mr=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...a)=>{for(let c=0;c{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=o=>{if(!("key"in o))return;const a=cr(o.key);if(t.some(c=>c===a||Oh[c]===a))return e(o)})},Mh=Et({patchProp:ph},Yp);let Eu;function Ih(){return Eu||(Eu=Ap(Mh))}const jh=(...e)=>{const t=Ih().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=Rh(s);if(!o)return;const a=t._component;!Ge(a)&&!a.render&&!a.template&&(a.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const c=n(o,!1,Dh(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),c},t};function Dh(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Rh(e){return bt(e)?document.querySelector(e):e}function At(e){return''+e+""}const Lh={calendar:At(''),clock:At(''),"check-circle":At(''),edit:At(''),tag:At(''),star:At(''),close:At(''),flag:At(''),chart:At(''),export:At(''),"chevron-left":At(''),"chevron-right":At(''),"chevron-down":At(''),plus:At(''),search:At(''),settings:At(''),memo:At(''),lock:At(''),wallet:At('')},Kh=["innerHTML"],lt=Vt({__name:"Icon",props:{name:{},size:{default:16}},setup(e){const t=e,n=it(()=>Lh[t.name]||"");return(s,o)=>(K(),H("span",{class:"icon",style:sr({width:e.size+"px",height:e.size+"px"}),innerHTML:n.value},null,12,Kh))}}),Fh=["aria-label"],Nh={class:"dialog-title"},Vh={class:"dialog-msg"},Bh={class:"dialog-btns"},Uh=Vt({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},message:{},confirmText:{default:"确认"},cancelText:{default:"取消"},danger:{type:Boolean,default:!1}},emits:["cancel","confirm"],setup(e,{emit:t}){const n=e,s=t;function o(a){n.open&&a.key==="Escape"&&s("cancel")}return gt(()=>n.open,a=>{a?window.addEventListener("keydown",o):window.removeEventListener("keydown",o)}),dr(()=>window.removeEventListener("keydown",o)),(a,c)=>(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[e.open?(K(),H("div",{key:0,class:"mask",onClick:c[2]||(c[2]=Mr(d=>s("cancel"),["self"]))},[u("div",{class:"dialog",role:"dialog","aria-label":e.title},[u("div",Nh,re(e.title),1),u("div",Vh,re(e.message),1),u("div",Bh,[u("button",{class:"btn btn-sm",onClick:c[0]||(c[0]=d=>s("cancel"))},re(e.cancelText),1),u("button",{class:et(["btn btn-sm",e.danger?"btn-danger-solid":"btn-primary"]),onClick:c[1]||(c[1]=d=>s("confirm"))},re(e.confirmText),3)])],8,Fh)])):Se("",!0)]),_:1})]))}}),Gt=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},ur=Gt(Uh,[["__scopeId","data-v-f27041d4"]]);var $u=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function qh(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var nf={exports:{}};(function(e,t){((n,s)=>{e.exports=s()})($u,function(){var n=function(r,i){return(n=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(l,f){l.__proto__=f}:function(l,f){for(var p in f)Object.prototype.hasOwnProperty.call(f,p)&&(l[p]=f[p])}))(r,i)},s=function(){return(s=Object.assign||function(r){for(var i,l=1,f=arguments.length;l"u"||a.Promise||(a.Promise=Promise);var y=Object.getPrototypeOf,m={}.hasOwnProperty;function k(r,i){return m.call(r,i)}function D(r,i){typeof i=="function"&&(i=i(y(r))),(typeof Reflect>"u"?c:Reflect.ownKeys)(i).forEach(function(l){L(r,l,i[l])})}var T=Object.defineProperty;function L(r,i,l,f){T(r,i,h(l&&k(l,"get")&&typeof l.get=="function"?{get:l.get,set:l.set,configurable:!0}:{value:l,configurable:!0,writable:!0},f))}function X(r){return{from:function(i){return r.prototype=Object.create(i.prototype),L(r.prototype,"constructor",r),{extend:D.bind(null,r.prototype)}}}}var ce=Object.getOwnPropertyDescriptor,Q=[].slice;function E(r,i,l){return Q.call(r,i,l)}function N(r,i){return i(r)}function G(r){if(!r)throw new Error("Assertion Failed")}function de(r){a.setImmediate?setImmediate(r):setTimeout(r,0)}function ae(r,i){if(typeof i=="string"&&k(r,i))return r[i];if(!i)return r;if(typeof i!="string"){for(var l=[],f=0,p=i.length;f"u"?[]:(Je=Promise.resolve(),typeof crypto<"u"&&crypto.subtle?[Xe=crypto.subtle.digest("SHA-512",new Uint8Array([0])),y(Xe),Je]:[Je,y(Je),Je]),Je=Xe[0],Br=Xe[1],Br=Br&&Br.then,Qe=Je&&Je.constructor,vt=!!Xe[2],_t=function(r,i){Hn.push([r,i]),Bt&&(queueMicrotask(Af),Bt=!1)},Xt=!0,Bt=!0,Zt=[],pr=[],Ot=P,$t={id:"global",global:!0,ref:0,unhandleds:[],onunhandled:g,pgp:!1,env:{},finalize:g},Me=$t,Hn=[],hr=0,Ws=[];function Ce(r){if(typeof this!="object")throw new TypeError("Promises must be constructed via new");this._listeners=[],this._lib=!1;var i=this._PSD=Me;if(typeof r!="function"){if(r!==$e)throw new TypeError("Not a function");this._state=arguments[1],this._value=arguments[2],this._state===!1&&bi(this,this._value)}else this._state=null,this._value=null,++i.ref,function l(f,p){try{p(function(v){if(f._state===null){if(v===f)throw new TypeError("A promise cannot be resolved with itself.");var b=f._lib&&Rr();v&&typeof v.then=="function"?l(f,function(_,S){v instanceof Ce?v._then(_,S):v.then(_,S)}):(f._state=!0,f._value=v,ll(f)),b&&Lr()}},bi.bind(null,f))}catch(v){bi(f,v)}}(this,r)}var gi={get:function(){var r=Me,i=Js;function l(f,p){var v=this,b=!r.global&&(r!==Me||i!==Js),_=b&&!zn(),S=new Ce(function(B,O){wi(v,new al(cl(f,r,b,_),cl(p,r,b,_),B,O,r))});return this._consoleTask&&(S._consoleTask=this._consoleTask),S}return l.prototype=$e,l},set:function(r){L(this,"then",r&&r.prototype===$e?gi:{get:function(){return r},set:gi.set})}};function al(r,i,l,f,p){this.onFulfilled=typeof r=="function"?r:null,this.onRejected=typeof i=="function"?i:null,this.resolve=l,this.reject=f,this.psd=p}function bi(r,i){var l,f;pr.push(i),r._state===null&&(l=r._lib&&Rr(),i=Ot(i),r._state=!1,r._value=i,f=r,Zt.some(function(p){return p._value===f._value})||Zt.push(f),ll(r),l)&&Lr()}function ll(r){var i=r._listeners;r._listeners=[];for(var l=0,f=i.length;l{for(var b=Zt.length;b;)if(Zt[--b]._value===v._value)return Zt.splice(b,1)})(i),l.resolve(f)}catch(v){l.reject(v)}finally{--hr==0&&_i(),--l.psd.ref||l.psd.finalize()}}function Af(){vr($t,function(){Rr()&&Lr()})}function Rr(){var r=Xt;return Bt=Xt=!1,r}function Lr(){var r,i,l;do for(;0.",fl="String expected.",Qs="__dbnames",xi="readonly",Ci="readwrite";function yr(r,i){return r?i?function(){return r.apply(this,arguments)&&i.apply(this,arguments)}:r:i}var dl={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function Zs(r){return typeof r!="string"||/\./.test(r)?function(i){return i}:function(i){return i[r]===void 0&&r in i&&delete(i=xe(i))[r],i}}function pl(){throw Ie.Type("Entity instances must never be new:ed. Instances are generated by the framework bypassing the constructor.")}function tt(r,i){try{var l=hl(r),f=hl(i);if(l!==f)return l==="Array"?1:f==="Array"?-1:l==="binary"?1:f==="binary"?-1:l==="string"?1:f==="string"?-1:l==="Date"?1:f!=="Date"?NaN:-1;switch(l){case"number":case"Date":case"string":return i{var _=O,S=b;if(typeof S!="function"&&S!==null)throw new TypeError("Class extends value "+String(S)+" is not a constructor or null");function B(){this.constructor=_}function O(){return b!==null&&b.apply(this,arguments)||this}return n(_,S),_.prototype=S===null?Object.create(S):(B.prototype=S.prototype,new B),Object.defineProperty(O.prototype,"db",{get:function(){return i},enumerable:!1,configurable:!0}),O.prototype.table=function(){return l},O})(r)),new Set),p=r.prototype;p;p=y(p))Object.getOwnPropertyNames(p).forEach(function(b){return f.add(b)});function v(b){if(!b)return b;var _,S=Object.create(r.prototype);for(_ in b)if(!f.has(_))try{S[_]=b[_]}catch{}return S}return this.schema.readHook&&this.hook.reading.unsubscribe(this.schema.readHook),this.schema.readHook=v,this.hook("reading",v),r},dt.prototype.defineClass=function(){return this.mapToClass(function(r){h(this,r)})},dt.prototype.add=function(r,i){var l=this,f=this.schema.primKey,p=f.auto,v=f.keyPath,b=r;return v&&p&&(b=Zs(v)(r)),this._trans("readwrite",function(_){return l.core.mutate({trans:_,type:"add",keys:i!=null?[i]:null,values:[b]})}).then(function(_){return _.numFailures?Ce.reject(_.failures[0]):_.lastResult}).then(function(_){if(v)try{Z(r,v,_)}catch{}return _})},dt.prototype.upsert=function(r,i){var l=this,f=this.schema.primKey.keyPath;return this._trans("readwrite",function(p){return l.core.get({trans:p,key:r}).then(function(v){var b=v??{};return yl(b,i),f&&Z(b,f,r),l.core.mutate({trans:p,type:"put",values:[b],keys:[r],upsert:!0,updates:{keys:[r],changeSpecs:[i]}}).then(function(_){return _.numFailures?Ce.reject(_.failures[0]):!!v})})})},dt.prototype.update=function(r,i){return typeof r!="object"||d(r)?this.where(":id").equals(r).modify(i):(r=ae(r,this.schema.primKey.keyPath))===void 0?Ct(new Ie.InvalidArgument("Given object does not contain its primary key")):this.where(":id").equals(r).modify(i)},dt.prototype.put=function(r,i){var l=this,f=this.schema.primKey,p=f.auto,v=f.keyPath,b=r;return v&&p&&(b=Zs(v)(r)),this._trans("readwrite",function(_){return l.core.mutate({trans:_,type:"put",values:[b],keys:i!=null?[i]:null})}).then(function(_){return _.numFailures?Ce.reject(_.failures[0]):_.lastResult}).then(function(_){if(v)try{Z(r,v,_)}catch{}return _})},dt.prototype.delete=function(r){var i=this;return this._trans("readwrite",function(l){return i.core.mutate({trans:l,type:"delete",keys:[r]}).then(function(f){return eo(i,[r],f)}).then(function(f){return f.numFailures?Ce.reject(f.failures[0]):void 0})})},dt.prototype.clear=function(){var r=this;return this._trans("readwrite",function(i){return r.core.mutate({trans:i,type:"deleteRange",range:dl}).then(function(l){return eo(r,null,l)})}).then(function(i){return i.numFailures?Ce.reject(i.failures[0]):void 0})},dt.prototype.bulkGet=function(r){var i=this;return this._trans("readonly",function(l){return i.core.getMany({keys:r,trans:l}).then(function(f){return f.map(function(p){return i.hook.reading.fire(p)})})})},dt.prototype.bulkAdd=function(r,i,l){var f=this,p=Array.isArray(i)?i:void 0,v=(l=l||(p?void 0:i))?l.allKeys:void 0;return this._trans("readwrite",function(b){var _=f.schema.primKey,B=_.auto,_=_.keyPath;if(_&&p)throw new Ie.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys");if(p&&p.length!==r.length)throw new Ie.InvalidArgument("Arguments objects and keys must have the same length");var S=r.length,B=_&&B?r.map(Zs(_)):r;return f.core.mutate({trans:b,type:"add",keys:p,values:B,wantResults:v}).then(function(O){var C=O.numFailures,A=O.failures;if(C===0)return v?O.results:O.lastResult;throw new ht("".concat(f.name,".bulkAdd(): ").concat(C," of ").concat(S," operations failed"),A)})})},dt.prototype.bulkPut=function(r,i,l){var f=this,p=Array.isArray(i)?i:void 0,v=(l=l||(p?void 0:i))?l.allKeys:void 0;return this._trans("readwrite",function(b){var _=f.schema.primKey,B=_.auto,_=_.keyPath;if(_&&p)throw new Ie.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys");if(p&&p.length!==r.length)throw new Ie.InvalidArgument("Arguments objects and keys must have the same length");var S=r.length,B=_&&B?r.map(Zs(_)):r;return f.core.mutate({trans:b,type:"put",keys:p,values:B,wantResults:v}).then(function(O){var C=O.numFailures,A=O.failures;if(C===0)return v?O.results:O.lastResult;throw new ht("".concat(f.name,".bulkPut(): ").concat(C," of ").concat(S," operations failed"),A)})})},dt.prototype.bulkUpdate=function(r){var i=this,l=this.core,f=r.map(function(b){return b.key}),p=r.map(function(b){return b.changes}),v=[];return this._trans("readwrite",function(b){return l.getMany({trans:b,keys:f,cache:"clone"}).then(function(_){var S=[],B=[],O=(r.forEach(function(C,A){var R=C.key,I=C.changes,M=_[A];if(M){for(var j=0,z=Object.keys(I);jU+ee&&j(U+B)})})}var z=Fr(l)&&l.limit===1/0&&(typeof r!="function"||I)&&{index:l.index,range:l.range};return j(0).then(function(){if(0{for(var Ue=Math.min(me.length,Pe.length),Ye=-1,Ze=0;Ze=A})).length===0?Ce.resolve():(j.forEach(function(U){M.push(function(){var ee,pe,ve,_e=z,me=U._cfg.dbschema,Ae=(uo(C,_e,I),uo(C,me,I),z=C._dbSchema=me,Mi(_e,me)),be=(Ae.add.forEach(function(Pe){Ii(I,Pe[0],Pe[1].primKey,Pe[1].indexes)}),Ae.change.forEach(function(Pe){if(Pe.recreate)throw new Ie.Upgrade("Not yet support for changing primary key");var he=I.objectStore(Pe.name);Pe.add.forEach(function(Be){return ao(he,Be)}),Pe.change.forEach(function(Be){he.deleteIndex(Be.name),ao(he,Be)}),Pe.del.forEach(function(Be){return he.deleteIndex(Be)})}),U._cfg.contentUpgrade);if(be&&U._cfg.version>A)return oo(C,I),R._memoizedTables={},ee=$(me),Ae.del.forEach(function(Pe){ee[Pe]=_e[Pe]}),Oi(C,[C.Transaction.prototype]),io(C,[C.Transaction.prototype],c(ee),ee),R.schema=ee,(pe=je(be))&&Kr(),me=Ce.follow(function(){var Pe;(ve=be(R))&&pe&&(Pe=zn.bind(null,null),ve.then(Pe,Pe))}),ve&&typeof ve.then=="function"?Ce.resolve(ve):me.then(function(){return ve})}),M.push(function(ee){var pe,ve,_e=U._cfg.dbschema;pe=_e,ve=ee,[].slice.call(ve.db.objectStoreNames).forEach(function(me){return pe[me]==null&&ve.db.deleteObjectStore(me)}),Oi(C,[C.Transaction.prototype]),io(C,[C.Transaction.prototype],C._storeNames,C._dbSchema),R.schema=C._dbSchema}),M.push(function(ee){C.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(C.idbdb.version/10)===U._cfg.version?(C.idbdb.deleteObjectStore("$meta"),delete C._dbSchema.$meta,C._storeNames=C._storeNames.filter(function(pe){return pe!=="$meta"})):ee.objectStore("$meta").put(U._cfg.version,"version"))})}),function U(){return M.length?Ce.resolve(M.shift()(R.idbtrans)).then(U):Ce.resolve()}().then(function(){El(z,I)}))}).catch(b);var S,B;c(p).forEach(function(O){Ii(l,O,p[O].primKey,p[O].indexes)}),oo(r,l),Ce.follow(function(){return r.on.populate.fire(v)}).catch(b)})}function Vf(r,i){El(r._dbSchema,i),i.db.version%10!=0||i.objectStoreNames.contains("$meta")||i.db.createObjectStore("$meta").add(Math.ceil(i.db.version/10-1),"version");var l=lo(0,r.idbdb,i);uo(r,r._dbSchema,i);for(var f=0,p=Mi(l,r._dbSchema).change;f{if(b.change.length||b.recreate)return console.warn("Unable to patch indexes of table ".concat(b.name," because it has changes on the type of index or primary key.")),{value:void 0};var _=i.objectStore(b.name);b.add.forEach(function(S){q&&console.debug("Dexie upgrade patch: Creating missing index ".concat(b.name,".").concat(S.src)),ao(_,S)})})(p[f]);if(typeof v=="object")return v.value}}function Mi(r,i){var l,f={del:[],add:[],change:[]};for(l in r)i[l]||f.del.push(l);for(l in i){var p=r[l],v=i[l];if(p){var b={name:l,def:v,recreate:!1,del:[],add:[],change:[]};if(""+(p.primKey.keyPath||"")!=""+(v.primKey.keyPath||"")||p.primKey.auto!==v.primKey.auto)b.recreate=!0,f.change.push(b);else{var _=p.idxByName,S=v.idxByName,B=void 0;for(B in _)S[B]||b.del.push(B);for(B in S){var O=_[B],C=S[B];O?O.src!==C.src&&b.change.push(C):b.add.push(C)}(0{var r,i,l;return typeof FinalizationRegistry<"u"&&typeof WeakRef<"u"?(r=new Set,i=new FinalizationRegistry(function(f){r.delete(f)}),{toArray:function(){return Array.from(r).map(function(f){return f.deref()}).filter(function(f){return f!==void 0})},add:function(f){var p=new WeakRef(f._novip);r.add(p),i.register(f._novip,p,p),r.size>f._options.maxConnections&&(p=r.values().next().value,r.delete(p),i.unregister(p))},remove:function(f){if(f)for(var p=r.values(),v=p.next();!v.done;){var b=v.value;if(b.deref()===f._novip)return r.delete(b),void i.unregister(b);v=p.next()}}}):(l=[],{toArray:function(){return l},add:function(f){l.push(f._novip)},remove:function(f){f&&(f=l.indexOf(f._novip))!==-1&&l.splice(f,1)}})})();function ji(r,i){var l=r._dbNamesDB;return l||(l=r._dbNamesDB=new Mn(Qs,{addons:[],indexedDB:r,IDBKeyRange:i})).version(1).stores({dbnames:"name"}),l.table("dbnames")}function Di(r){return r&&typeof r.databases=="function"}function Ri(r){return Wn(function(){return Me.letThrough=!0,r()})}function Li(r){return!("from"in r)}var Dt=function(r,i){var l;if(!this)return l=new Dt,r&&"d"in r&&h(l,r),l;h(this,arguments.length?{d:1,from:r,to:1Math.pow(2,62)?0:j.oldVersion,C=z<1,r.idbdb=M.result,v&&Vf(r,O),Nf(r,z/10,O,R))},R),M.onsuccess=mt(function(){O=null;var j,z,U,ee,pe,ve,_e=r.idbdb=M.result,me=E(_e.objectStoreNames);if(0"u"?Ce.resolve():!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise(function(A){function R(){return indexedDB.databases().finally(A)}S=setInterval(R,100),R()}).finally(function(){return clearInterval(S)}):Promise.resolve()).then(_)]).then(function(){return b(),i.onReadyBeingFired=[],Ce.resolve(Ri(function(){return r.on.ready.fire(r.vip)})).then(function A(){var R;if(0i.limit?f.length=i.limit:r.length===i.limit&&f.length{if(l===void 0)return f!==void 0?-1:0;if(f===void 0)return 1;if((l=tt(l,f))===0){if(p&&v)return 0;if(p)return 1;if(v)return-1}return l})(r.lower,i.lower,r.lowerOpen,i.lowerOpen)<=0&&0<=((l,f,p,v)=>{if(l===void 0)return f!==void 0?1:0;if(f===void 0)return-1;if((l=tt(l,f))===0){if(p&&v)return 0;if(p)return-1;if(v)return 1}return l})(r.upper,i.upper,r.upperOpen,i.upperOpen)}function Yf(r,i,l,f){r.subscribers.add(l),f.addEventListener("abort",function(){var p,v;r.subscribers.delete(l),r.subscribers.size===0&&(p=r,v=i,setTimeout(function(){p.subscribers.size===0&&ge(v,p)},3e3))})}var Jf={stack:"dbcore",level:0,name:"Cache",create:function(r){var i=r.schema.name;return s(s({},r),{transaction:function(l,f,p){var v,b,_=r.transaction(l,f,p);return f==="readwrite"&&(p=(v=new AbortController).signal,_.addEventListener("abort",(b=function(S){return function(){if(v.abort(),f==="readwrite"){for(var B=new Set,O=0,C=l;O{var z=gr["idb://".concat(R,"/").concat(I)];if(!z)return[];if(!(R=z.queries[M]))return[null,!1,z,null];var U=R[(j.query?j.query.index.name:null)||""];if(!U)return[null,!1,z,null];switch(M){case"query":var ee=(pe=j.direction)!=null?pe:"next",pe=U.find(function(ve){var _e;return ve.req.limit===j.limit&&ve.req.values===j.values&&((_e=ve.req.direction)!=null?_e:"next")===ee&&Ll(ve.req.query.range,j.query.range)});return pe?[pe,!0,z,U]:[U.find(function(ve){var _e;return("limit"in ve.req?ve.req.limit:1/0)>=j.limit&&((_e=ve.req.direction)!=null?_e:"next")===ee&&(!j.values||ve.req.values)&&Gf(ve.req.query.range,j.query.range)}),!1,z,U];case"count":return pe=U.find(function(ve){return Ll(ve.req.query.range,j.query.range)}),[pe,!!pe,z,U]}})(i,l,"query",v),A=C[0],B=C[2],O=C[3],A&&C[1]?A.obsSet=v.obsSet:(C=f.query(v).then(function(R){var I=R.result;if(A&&(A.res=I),b){for(var M=0,j=I.length;M{var pe=Rr();try{v&&Kr();var ve=Wn(r,ee);return ve=v?ve.finally(zn):ve}finally{pe&&Lr()}})(z={subscr:j,signal:b.signal,requery:A,querier:r,trans:null}),C||(Jn.storagemutated.subscribe(I),C=!0),Promise.resolve(U).then(function(ee){l=!0,i=ee,_||z.signal.aborted||(R()||(B=j,R())?A():(S={},ki(function(){return!_&&p.next&&p.next(ee)})))},function(ee){l=!1,["DatabaseClosedError","AbortError"].includes(ee==null?void 0:ee.name)||_||ki(function(){_||p.error&&p.error(ee)})}))};return setTimeout(A,0),O});return f.hasValue=function(){return l},f.getValue=function(){return i},f}var br=Mn;function zi(r){var i=Xn;try{Xn=!0,Jn.storagemutated.fire(r),Vi(r,!0)}finally{Xn=i}}D(br,s(s({},ne),{delete:function(r){return new br(r,{addons:[]}).delete()},exists:function(r){return new br(r,{addons:[]}).open().then(function(i){return i.close(),!0}).catch("NoSuchDatabaseError",function(){return!1})},getDatabaseNames:function(r){try{return i=br.dependencies,l=i.indexedDB,i=i.IDBKeyRange,(Di(l)?Promise.resolve(l.databases()).then(function(f){return f.map(function(p){return p.name}).filter(function(p){return p!==Qs})}):ji(l,i).toCollection().primaryKeys()).then(r)}catch{return Ct(new Ie.MissingAPI)}var i,l},defineClass:function(){return function(r){h(this,r)}},ignoreTransaction:function(r){return Me.trans?vr(Me.transless||$t,r):r()},vip:Ri,async:function(r){return function(){try{var i=Bi(r.apply(this,arguments));return i&&typeof i.then=="function"?i:Ce.resolve(i)}catch(l){return Ct(l)}}},spawn:function(r,i,l){try{var f=Bi(r.apply(l,i||[]));return f&&typeof f.then=="function"?f:Ce.resolve(f)}catch(p){return Ct(p)}},currentTransaction:{get:function(){return Me.trans||null}},waitFor:function(r,i){return r=Ce.resolve(typeof r=="function"?br.ignoreTransaction(r):r).timeout(i||6e4),Me.trans?Me.trans.waitFor(r):r},Promise:Ce,debug:{get:function(){return q},set:function(r){Y(r)}},derive:X,extend:h,props:D,override:N,Events:os,on:Jn,liveQuery:Kl,extendObservabilitySet:fo,getByKeyPath:ae,setByKeyPath:Z,delByKeyPath:function(r,i){typeof i=="string"?Z(r,i,void 0):"length"in i&&[].map.call(i,function(l){Z(r,l,void 0)})},shallowClone:$,deepClone:xe,getObjectDiff:Ui,cmp:tt,asap:de,minKey:-1/0,addons:[],connections:{get:cs.toArray},errnames:Yt,dependencies:mo,cache:gr,semVer:"4.4.6",version:"4.4.6".split(".").map(function(r){return parseInt(r)}).reduce(function(r,i,l){return r+i/Math.pow(10,2*l)})})),br.maxKey=ls(br.dependencies.IDBKeyRange),typeof dispatchEvent<"u"&&typeof addEventListener<"u"&&(Jn(so,function(r){Xn||(r=new CustomEvent($i,{detail:r}),Xn=!0,dispatchEvent(r),Xn=!1)}),addEventListener($i,function(r){r=r.detail,Xn||zi(r)}));var Ur,Xn=!1,Fl=function(){};return typeof BroadcastChannel<"u"&&((Fl=function(){(Ur=new BroadcastChannel($i)).onmessage=function(r){return r.data&&zi(r.data)}})(),typeof Ur.unref=="function"&&Ur.unref(),Jn(so,function(r){Xn||Ur.postMessage(r)})),typeof addEventListener<"u"&&(addEventListener("pagehide",function(r){if(!Mn.disableBfCache&&r.persisted){q&&console.debug("Dexie: handling persisted pagehide"),Ur!=null&&Ur.close();for(var i=0,l=cs.toArray();in.key===e);return t?t.label:"其他"}const Yh={class:"dialog",role:"dialog","aria-label":"编辑工作记录"},Jh={class:"dialog-head"},Xh={key:0,class:"muted dialog-sub"},Qh={class:"dialog-body"},Zh={class:"form-grid"},ev={class:"field span2"},tv={key:0,class:"form-error"},nv={class:"field"},rv=["value"],sv={class:"field"},ov=["value"],iv={class:"field"},av={class:"field"},lv={class:"field span2"},uv={class:"field"},cv={class:"field"},fv={class:"dialog-btns"},dv=Vt({__name:"EditLogDialog",props:{open:{type:Boolean},item:{},projects:{},date:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,s=t,o=V(""),a=V(null),c=V("dev"),d=V(null),h=V(""),y=V(""),m=V(0),k=V(0),D=V(""),T=V(null),L=it(()=>{var N;const Q=n.projects.filter(G=>G.archived!==1),E=(N=n.item)==null?void 0:N.project_id;if(E&&!Q.some(G=>G.id===E)){const G=n.projects.find(ae=>ae.id===E),de=Q.slice();return G&&de.unshift({...G,name:G.name+"(已归档)"}),de}return Q});function X(Q){n.open&&Q.key==="Escape"&&s("cancel")}gt(()=>n.open,async Q=>{var E;if(Q){const N=n.item;o.value=(N==null?void 0:N.content)??"",a.value=(N==null?void 0:N.project_id)??null,c.value=(N==null?void 0:N.category)??"dev",d.value=(N==null?void 0:N.minutes)??null,h.value=(N==null?void 0:N.takeaway)??"",y.value=(N==null?void 0:N.remark)??"",m.value=(N==null?void 0:N.is_milestone)??0,k.value=(N==null?void 0:N.needs_followup)??0,D.value="",window.addEventListener("keydown",X),await ts(),(E=T.value)==null||E.focus()}else window.removeEventListener("keydown",X)}),dr(()=>window.removeEventListener("keydown",X)),gt(o,()=>{D.value&&(D.value="")});function ce(){const Q=o.value.trim();if(!Q){D.value="请填写工作内容";return}if(!n.item||!n.item.id){s("cancel");return}s("save",{id:n.item.id,content:Q,project_id:a.value,category:c.value,minutes:d.value&&d.value>0?d.value:null,takeaway:h.value.trim()||null,remark:y.value.trim()||null,is_milestone:m.value?1:0,needs_followup:k.value?1:0})}return(Q,E)=>(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[e.open?(K(),H("div",{key:0,class:"mask",onClick:E[10]||(E[10]=Mr(N=>s("cancel"),["self"]))},[u("div",Yh,[u("div",Jh,[u("div",null,[E[11]||(E[11]=u("div",{class:"dialog-title"},"编辑工作记录",-1)),e.date?(K(),H("div",Xh,re(e.date),1)):Se("",!0)]),u("button",{class:"icon-btn",title:"关闭",onClick:E[0]||(E[0]=N=>s("cancel"))},[Te(lt,{name:"close",size:16})])]),u("div",Qh,[u("div",Zh,[u("div",ev,[E[12]||(E[12]=u("label",null,"工作内容(必填)",-1)),Ee(u("input",{ref_key:"contentInput",ref:T,class:et(["input",{invalid:D.value}]),"onUpdate:modelValue":E[1]||(E[1]=N=>o.value=N),onKeydown:jt(ce,["enter"])},null,34),[[De,o.value]]),D.value?(K(),H("div",tv,re(D.value),1)):Se("",!0)]),u("div",nv,[E[14]||(E[14]=u("label",null,"所属项目",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":E[2]||(E[2]=N=>a.value=N)},[E[13]||(E[13]=u("option",{value:null},"无项目",-1)),(K(!0),H(Re,null,ut(L.value,N=>(K(),H("option",{key:N.id,value:N.id},re(N.name),9,rv))),128))],512),[[Fn,a.value]])]),u("div",sv,[E[15]||(E[15]=u("label",null,"工作分类",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":E[3]||(E[3]=N=>c.value=N)},[(K(!0),H(Re,null,ut(Qt(Us),N=>(K(),H("option",{key:N.key,value:N.key},re(N.label),9,ov))),128))],512),[[Fn,c.value]])]),u("div",iv,[E[16]||(E[16]=u("label",null,"耗时(分钟)",-1)),Ee(u("input",{class:"input",type:"number",min:"0","onUpdate:modelValue":E[4]||(E[4]=N=>d.value=N),placeholder:"选填"},null,512),[[De,d.value,void 0,{number:!0}]])]),u("div",av,[E[17]||(E[17]=u("label",null,"主要收获",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":E[5]||(E[5]=N=>h.value=N),placeholder:"一句话:学到了什么"},null,512),[[De,h.value]])]),u("div",lv,[E[18]||(E[18]=u("label",null,"备注",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":E[6]||(E[6]=N=>y.value=N),placeholder:"背景、链接、未决事项(选填)"},null,512),[[De,y.value]])]),u("div",uv,[E[19]||(E[19]=u("label",null,"成果标记",-1)),u("button",{class:et(["toggle-btn",{on:m.value===1}]),onClick:E[7]||(E[7]=N=>m.value=m.value===1?0:1)},re(m.value===1?"已标记为成果":"未标记"),3)]),u("div",cv,[E[20]||(E[20]=u("label",null,"待跟进",-1)),u("button",{class:et(["toggle-btn",{onwarn:k.value===1}]),onClick:E[8]||(E[8]=N=>k.value=k.value===1?0:1)},re(k.value===1?"需要跟进":"无需跟进"),3)])])]),u("div",fv,[u("button",{class:"btn btn-sm",onClick:E[9]||(E[9]=N=>s("cancel"))},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:ce},"保存修改")])])])):Se("",!0)]),_:1})]))}}),pv=Gt(dv,[["__scopeId","data-v-63bc0b48"]]);function Ss(e){return e<10?"0"+e:String(e)}function Nn(e){return e.getFullYear()+"-"+Ss(e.getMonth()+1)+"-"+Ss(e.getDate())}function xt(){return Nn(new Date)}function wt(){const e=new Date;return Nn(e)+"T"+Ss(e.getHours())+":"+Ss(e.getMinutes())+":"+Ss(e.getSeconds())}function Vn(e){if(!e)return"--:--";const t=e.indexOf("T");return t>=0?e.slice(t+1,t+6):e.slice(0,5)}function rs(e){const t=e.split("-").map(Number);return new Date(t[0],t[1]-1,t[2])}function Kn(e,t){const n=rs(e);return n.setDate(n.getDate()+t),Nn(n)}function Uo(e,t){const n=rs(e),s=n.getDate();n.setDate(1),n.setMonth(n.getMonth()+t);const o=new Date(n.getFullYear(),n.getMonth()+1,0).getDate();return n.setDate(Math.min(s,o)),Nn(n)}function Es(e){const t=rs(e),n=(t.getDay()+6)%7;return t.setDate(t.getDate()-n),Nn(t)}function hv(e){const t=rs(e).getDay();return t===0||t===6}function vv(e,t){return Math.round((new Date(t).getTime()-new Date(e).getTime())/6e4)}function of(e){const t=rs(e),n=["周日","周一","周二","周三","周四","周五","周六"];return t.getFullYear()+" 年 "+(t.getMonth()+1)+" 月 "+t.getDate()+" 日 "+n[t.getDay()]}async function yt(e,t){const n=await te.setting.get(e);return n?n.value:t}async function kt(e,t){await te.setting.put({key:e,value:t})}async function jr(){const e=await Promise.all([yt("work_start","09:00"),yt("work_end","18:00"),yt("grace_minutes","10"),yt("lunch_minutes","60"),yt("remind_weekly","friday")]);return{work_start:e[0],work_end:e[1],grace_minutes:Number(e[2])||0,lunch_minutes:Number(e[3])||0,remind_weekly:e[4]}}async function mv(){const e=await yt("last_project",""),t=await yt("last_category","dev");return{project_id:e?Number(e):null,category:t||"dev"}}async function yv(){return yt("last_location","")}async function gv(e,t){const n=t.trim();await kt("last_location",n),n&&await qo(n);const s=await mn(e);s&&s.id?await te.attendance.update(s.id,{location:n||null}):n&&await te.attendance.add({date:e,clock_in_at:null,clock_out_at:null,kind:"normal",note:null,location:n,created_at:wt()})}async function Za(){const e=await yt("location_presets","");if(!e)return Pu.slice();try{const t=JSON.parse(e);if(Array.isArray(t))return t.filter(n=>typeof n=="string"&&n.trim()).map(n=>n.trim())}catch{}return Pu.slice()}async function af(e){const t=Array.from(new Set(e.map(n=>n.trim()).filter(Boolean)));await kt("location_presets",JSON.stringify(t))}async function qo(e){const t=e.trim();if(!t)return;const n=await Za();n.includes(t)||await af([...n,t])}async function Ks(e=!1){const t=await te.project.orderBy("name").toArray();return e?t:t.filter(n=>n.archived!==1)}async function bv(e){await te.project.add({name:e.trim(),archived:0,created_at:wt()})}async function wv(e,t){await te.project.update(e,{name:t.trim()})}async function _v(e,t){await te.project.update(e,{archived:t?1:0})}async function mn(e){return te.attendance.where("date").equals(e).first()}async function lf(e,t){const n=((t===void 0?await yt("last_location",""):t)||"").trim(),s=await mn(e);if(s&&s.id){if(!s.clock_in_at){const o={clock_in_at:wt()};n&&(o.location=n),await te.attendance.update(s.id,o)}n&&(await kt("last_location",n),await qo(n));return}await te.attendance.add({date:e,clock_in_at:wt(),clock_out_at:null,kind:"normal",note:null,location:n||null,created_at:wt()}),n&&(await kt("last_location",n),await qo(n))}async function kv(e){const t=await mn(e);t&&t.id&&t.clock_in_at&&!t.clock_out_at&&await te.attendance.update(t.id,{clock_out_at:wt()})}async function xv(){const e=new Date,t=Nn(e);if(e.getHours()<4){const s=await mn(Kn(t,-1));if(s&&s.id&&s.clock_in_at&&!s.clock_out_at)return await te.attendance.update(s.id,{clock_out_at:wt()}),s.date}const n=await mn(t);if(n&&n.id&&n.clock_in_at&&!n.clock_out_at)return await te.attendance.update(n.id,{clock_out_at:wt()}),n.date;throw new Error("没有进行中的打卡")}async function Cv(e,t,n,s,o){(o||"").trim()&&await qo(o);const a=await mn(e),c={date:e,clock_in_at:t,clock_out_at:n,kind:"makeup",note:s||null,location:(o||"").trim()||null,created_at:wt()};a&&a.id?await te.attendance.update(a.id,c):await te.attendance.add(c)}async function Sv(e,t,n){const s=(n||"").trim();if(!s)return;const o=await mn(e);o&&o.id&&await te.attendance.update(o.id,{[t]:e+"T"+s+":00"})}async function di(e,t){return te.attendance.where("date").between(e,t,!0,!0).toArray()}async function Ev(e,t){const n=await mn(e);if(t){const s={date:e,kind:"leave",clock_in_at:null,clock_out_at:null,created_at:wt()};n&&n.id?await te.attendance.update(n.id,s):await te.attendance.add({...s,note:null,location:null})}else n&&n.id&&await te.attendance.update(n.id,{kind:"normal"})}async function $v(e){const t=await te.work_log.where("date").equals(e).first();return t||{id:await te.work_log.add({date:e,created_at:wt()}),date:e,created_at:wt()}}async function Av(e){return te.work_log.where("date").equals(e).first()}async function Pv(e){const t=await Av(e);return!t||!t.id?[]:(await te.log_item.where("work_log_id").equals(t.id).toArray()).sort((s,o)=>o.id-s.id)}async function Tv(e,t){const n=await $v(e);await te.log_item.add({work_log_id:n.id,content:t.content,project_id:t.project_id,category:t.category,minutes:t.minutes,is_milestone:0,needs_followup:0,takeaway:t.takeaway,remark:t.remark,sort_order:0,created_at:wt()}),await kt("last_project",t.project_id?String(t.project_id):""),await kt("last_category",t.category)}async function la(e,t){await te.log_item.update(e,t)}async function Ov(e){await te.log_item.delete(e)}async function pi(e,t){const n=await te.work_log.where("date").between(e,t,!0,!0).toArray();if(!n.length)return[];const s=new Map(n.map(a=>[a.id,a.date]));return(await te.log_item.where("work_log_id").anyOf(n.map(a=>a.id)).toArray()).map(a=>({...a,date:s.get(a.work_log_id)||""})).sort((a,c)=>a.date===c.date?a.id-c.id:a.datet.updated_at[c.id,c.date]));return(await te.log_item.toArray()).filter(c=>((c.content||"")+" "+(c.takeaway||"")+" "+(c.remark||"")).toLowerCase().includes(n)).sort((c,d)=>d.id-c.id).slice(0,t).map(c=>({...c,date:o.get(c.work_log_id)||""}))}async function Fv(e,t=4){const n=e.trim().toLowerCase();return n?(await te.memo.toArray()).filter(o=>((o.title||"")+" "+(o.content||"")).toLowerCase().includes(n)).sort((o,a)=>o.updated_at{await Promise.all([te.project.clear(),te.work_log.clear(),te.log_item.clear(),te.attendance.clear(),te.weekly_note.clear(),te.setting.clear(),te.memo.clear(),te.credential.clear(),te.table("transaction").clear()]),n.project&&n.project.length&&await te.project.bulkAdd(n.project),n.work_log&&n.work_log.length&&await te.work_log.bulkAdd(n.work_log),n.log_item&&n.log_item.length&&await te.log_item.bulkAdd(n.log_item),n.attendance&&n.attendance.length&&await te.attendance.bulkAdd(n.attendance),n.weekly_note&&n.weekly_note.length&&await te.weekly_note.bulkAdd(n.weekly_note),n.setting&&n.setting.length&&await te.setting.bulkAdd(n.setting),n.memo&&n.memo.length&&await te.memo.bulkAdd(n.memo),n.credential&&n.credential.length&&await te.credential.bulkAdd(n.credential),n.transaction&&n.transaction.length&&await te.table("transaction").bulkAdd(n.transaction)})}function Co(e){const t=e.split(":");return Number(t[0])*60+Number(t[1])}function qs(e,t,n,s){if(e&&e.kind==="leave")return{status:"leave",label:"请假",makeup:!1,workedMinutes:null};if(hv(t))return{status:"rest",label:"休息日",makeup:!1,workedMinutes:null};if(!e||!e.clock_in_at)return s?{status:"none",label:"未打卡",makeup:!1,workedMinutes:null}:{status:"absent",label:"缺勤",makeup:!!(e&&e.kind==="makeup"),workedMinutes:null};const o=e.kind==="makeup";if(!e.clock_out_at)return{status:"incomplete",label:s?"进行中":"未完成",makeup:o,workedMinutes:null};const a=Co(Vn(e.clock_in_at)),c=Co(Vn(e.clock_out_at)),d=Co(n.work_start),h=Co(n.work_end);let y="normal";!o&&a>d+n.grace_minutes?y="late":!o&&c{Po.value=Po.value.filter(n=>n.id!==t)},2e3)}function Gv(){return Po}const $a=V(null),Aa=V(null),Hs=V(0);function Sr(){Hs.value++}const Yv={class:"day-panel"},Jv={class:"dp-head"},Xv={class:"dp-date"},Qv={class:"card sec"},Zv={class:"att-grid"},em={class:"att-cell"},tm={key:0,class:"edit-row"},nm={key:1,class:"att-val"},rm={class:"att-cell"},sm={key:0,class:"edit-row"},om={key:1,class:"att-val"},im={class:"att-cell"},am=["list"],lm=["id"],um=["value"],cm={class:"att-cell"},fm={class:"att-val status-val"},dm={key:0,class:"tag"},pm={key:1,class:"muted"},hm={key:0,class:"att-note muted"},vm={class:"att-actions"},mm=["disabled"],ym=["disabled"],gm=["disabled"],bm=["disabled"],wm={key:0,class:"card sec makeup"},_m={class:"form-grid"},km={class:"field"},xm={class:"field"},Cm={class:"field span2"},Sm=["list"],Em={class:"field span2"},$m={key:0,class:"form-error"},Am={class:"form-footer"},Pm={class:"card sec"},Tm={class:"form-grid"},Om={class:"field span2"},Mm={key:0,class:"form-error"},Im={class:"field"},jm=["value"],Dm={class:"field"},Rm=["value"],Lm={class:"field"},Km={class:"field"},Fm={class:"field span2"},Nm={class:"form-footer"},Vm=["disabled"],Bm=["disabled"],Um={class:"list-sec"},qm={class:"sec-title"},Hm={key:0,class:"empty muted"},Wm={class:"item-main"},zm={class:"tag"},Gm=["onClick"],Ym={key:0,class:"muted item-meta"},Jm={key:1,class:"muted num item-meta"},Xm=["onClick"],Qm=["onClick"],Zm=["onClick"],ey=["onClick"],ty={key:0,class:"item-sub"},ny={key:0,class:"muted2"},ry={key:1,class:"muted"},sy={key:1,class:"dp-foot muted num"},oy=Vt({__name:"DayPanel",props:{date:{}},setup(e){const t=e,n=V(!0),s=V(null),o=V(void 0),a=V([]),c=V([]),d=V(""),h=V([]),y=it(()=>"loc-list-"+t.date),m=it(()=>t.date===xt());async function k(){n.value=!0,s.value=await jr(),o.value=await mn(t.date),a.value=await Pv(t.date),c.value=await Ks(!0),h.value=await Za(),d.value=o.value&&o.value.location||await yv(),n.value=!1}fn(k),gt(()=>t.date,k),gt(Hs,()=>{k()});const D=it(()=>c.value.filter(W=>W.archived!==1));function T(W){if(!W)return"";const q=c.value.find(Y=>Y.id===W);return q?q.name:"已删除项目"}const L=it(()=>s.value?qs(o.value,t.date,s.value,m.value):null),X=it(()=>a.value.reduce((W,q)=>W+(q.minutes||0),0)),ce=V(!1);async function Q(){ce.value||(ce.value=!0,await lf(t.date,d.value),await k(),Sr(),We("上班打卡成功"),ce.value=!1)}async function E(){ce.value||(ce.value=!0,await kv(t.date),await k(),Sr(),We("下班打卡成功"),ce.value=!1)}async function N(){await gv(t.date,d.value),Sr(),We("地点已更新")}const G=V(!1),de=it(()=>{var W;return((W=o.value)==null?void 0:W.kind)==="leave"});function ae(){if(o.value&&o.value.clock_in_at){G.value=!0;return}Z(!0)}async function Z(W){G.value=!1,await Ev(t.date,W),await k(),Sr(),We(W?"已标记为休假":"已取消休假")}const $=V(null),x=V(""),le=V(null);gt($,async W=>{var q;W&&(await ts(),(q=le.value)==null||q.focus())});function ke(W){var Y,$e;const q=W==="in"?(Y=o.value)==null?void 0:Y.clock_in_at:($e=o.value)==null?void 0:$e.clock_out_at;$.value=W,x.value=q?Vn(q):W==="in"?"09:00":"18:00"}function J(){$.value=null}async function xe(){const W=$.value;W&&($.value=null,x.value&&(await Sv(t.date,W==="in"?"clock_in_at":"clock_out_at",x.value),await k(),Sr(),We("打卡时间已修改")))}const Ve=V(!1),nt=V("09:00"),qe=V("18:00"),He=V(""),ge=V(""),Oe=V("");function Fe(){ge.value=d.value,Oe.value="",Ve.value=!Ve.value}async function je(){if(!nt.value||!qe.value){Oe.value="请填写上班与下班时间";return}await Cv(t.date,t.date+"T"+nt.value+":00",t.date+"T"+qe.value+":00",He.value.trim(),ge.value),Ve.value=!1,He.value="",Oe.value="",await k(),Sr(),We("补卡已保存")}const ne=V(""),F=V("");gt(ne,()=>{F.value&&(F.value="")});const fe=V(null),Ke=V("dev"),ct=V(null),ht=V(""),Yt=V(""),Jt=V(!1),Ie=it(()=>!!(ne.value.trim()||ct.value||ht.value.trim()||Yt.value.trim()));fn(async()=>{const W=await mv();fe.value=W.project_id,Ke.value=W.category});function w(){ne.value="",ct.value=null,ht.value="",Yt.value="",F.value=""}async function g(){const W=ne.value.trim();if(!W){F.value="请填写工作内容";return}Jt.value||(Jt.value=!0,await Tv(t.date,{content:W,project_id:fe.value,category:Ke.value,minutes:ct.value&&ct.value>0?ct.value:null,takeaway:ht.value.trim()||null,remark:Yt.value.trim()||null}),w(),await k(),We("记录已添加"),Jt.value=!1)}const P=V(null);function ie(W){P.value=W}async function se(W){const q=W.id,Y={content:W.content,project_id:W.project_id,category:W.category,minutes:W.minutes,takeaway:W.takeaway,remark:W.remark,is_milestone:W.is_milestone,needs_followup:W.needs_followup};await la(q,Y),P.value=null,await k(),We("修改已保存")}async function ue(W){await la(W.id,{is_milestone:W.is_milestone?0:1}),await k()}async function ye(W){await la(W.id,{needs_followup:W.needs_followup?0:1}),await k()}const oe=V(null);async function we(){oe.value&&oe.value.id&&await Ov(oe.value.id),oe.value=null,await k(),We("记录已删除")}return(W,q)=>(K(),H("div",Yv,[u("div",Jv,[u("div",Xv,re(Qt(of)(e.date)),1)]),u("div",Qv,[q[25]||(q[25]=u("div",{class:"sec-title"},"出勤信息",-1)),u("div",Zv,[u("div",em,[q[21]||(q[21]=u("label",null,"上班时间",-1)),$.value==="in"?(K(),H("div",tm,[Ee(u("input",{ref_key:"timeInput",ref:le,type:"time",class:"input time-input","onUpdate:modelValue":q[0]||(q[0]=Y=>x.value=Y),onKeydown:[jt(xe,["enter"]),jt(J,["esc"])]},null,544),[[De,x.value]]),u("button",{class:"btn btn-primary btn-sm",onClick:xe},"确认"),u("button",{class:"btn btn-sm",onClick:J},"取消")])):(K(),H("div",nm,[u("span",{class:et(["num",{"val-empty":!(o.value&&o.value.clock_in_at)}])},re(o.value&&o.value.clock_in_at?Qt(Vn)(o.value.clock_in_at):"未打卡"),3),o.value&&o.value.id?(K(),H("button",{key:0,class:"icon-btn",title:"修改上班时间",onClick:q[1]||(q[1]=Y=>ke("in"))},[Te(lt,{name:"edit",size:13})])):Se("",!0)]))]),u("div",rm,[q[22]||(q[22]=u("label",null,"下班时间",-1)),$.value==="out"?(K(),H("div",sm,[Ee(u("input",{ref_key:"timeInput",ref:le,type:"time",class:"input time-input","onUpdate:modelValue":q[2]||(q[2]=Y=>x.value=Y),onKeydown:[jt(xe,["enter"]),jt(J,["esc"])]},null,544),[[De,x.value]]),u("button",{class:"btn btn-primary btn-sm",onClick:xe},"确认"),u("button",{class:"btn btn-sm",onClick:J},"取消")])):(K(),H("div",om,[u("span",{class:et(["num",{"val-empty":!(o.value&&o.value.clock_out_at)}])},re(o.value&&o.value.clock_out_at?Qt(Vn)(o.value.clock_out_at):"未打卡"),3),o.value&&o.value.id?(K(),H("button",{key:0,class:"icon-btn",title:"修改下班时间",onClick:q[3]||(q[3]=Y=>ke("out"))},[Te(lt,{name:"edit",size:13})])):Se("",!0)]))]),u("div",im,[q[23]||(q[23]=u("label",null,"上班地点",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":q[4]||(q[4]=Y=>d.value=Y),list:y.value,placeholder:"可直接输入",title:"上班地点,可自由输入",onChange:N},null,40,am),[[De,d.value]]),u("datalist",{id:y.value},[(K(!0),H(Re,null,ut(h.value,Y=>(K(),H("option",{key:Y,value:Y},null,8,um))),128))],8,lm)]),u("div",cm,[q[24]||(q[24]=u("label",null,"考勤状态",-1)),u("div",fm,[L.value?(K(),H(Re,{key:0},[u("span",{class:et(["dot",L.value.status])},null,2),u("span",null,re(L.value.label),1),o.value&&o.value.kind==="makeup"?(K(),H("span",dm,"补卡")):Se("",!0)],64)):(K(),H("span",pm,"--"))])])]),o.value&&o.value.note?(K(),H("div",hm,"补卡说明:"+re(o.value.note),1)):Se("",!0),u("div",vm,[m.value&&(!o.value||!o.value.clock_in_at)?(K(),H("button",{key:0,class:"btn btn-primary btn-sm",disabled:ce.value,onClick:Q},"上班打卡",8,mm)):m.value&&o.value&&o.value.clock_in_at&&!o.value.clock_out_at?(K(),H("button",{key:1,class:"btn btn-primary btn-sm",disabled:ce.value,onClick:E},"下班打卡",8,ym)):Se("",!0),!m.value&&(!o.value||!o.value.clock_in_at)?(K(),H("button",{key:2,class:"btn btn-sm",onClick:Fe},"补卡")):Se("",!0),de.value?(K(),H("button",{key:4,class:"btn btn-sm",disabled:ce.value,onClick:q[5]||(q[5]=Y=>Z(!1))},"取消休假",8,bm)):(K(),H("button",{key:3,class:"btn btn-sm",disabled:ce.value,onClick:ae},"标记休假",8,gm))])]),Ve.value?(K(),H("div",wm,[q[30]||(q[30]=u("div",{class:"sec-title"},"补卡登记",-1)),u("div",_m,[u("div",km,[q[26]||(q[26]=u("label",null,"上班时间",-1)),Ee(u("input",{type:"time",class:"input","onUpdate:modelValue":q[6]||(q[6]=Y=>nt.value=Y)},null,512),[[De,nt.value]])]),u("div",xm,[q[27]||(q[27]=u("label",null,"下班时间",-1)),Ee(u("input",{type:"time",class:"input","onUpdate:modelValue":q[7]||(q[7]=Y=>qe.value=Y)},null,512),[[De,qe.value]])]),u("div",Cm,[q[28]||(q[28]=u("label",null,"上班地点",-1)),Ee(u("input",{class:"input",list:y.value,"onUpdate:modelValue":q[8]||(q[8]=Y=>ge.value=Y),placeholder:"可直接输入"},null,8,Sm),[[De,ge.value]])]),u("div",Em,[q[29]||(q[29]=u("label",null,"补卡原因",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":q[9]||(q[9]=Y=>He.value=Y),placeholder:"如:外出拜访客户忘记打卡"},null,512),[[De,He.value]])])]),Oe.value?(K(),H("div",$m,re(Oe.value),1)):Se("",!0),u("div",Am,[u("button",{class:"btn btn-sm",onClick:q[10]||(q[10]=Y=>Ve.value=!1)},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:je},"保存补卡")])])):Se("",!0),u("div",Pm,[q[38]||(q[38]=u("div",{class:"sec-head"},[u("span",{class:"sec-title"},"新增工作记录"),u("span",{class:"muted form-hint"},"内容必填,其余选填")],-1)),u("div",Tm,[u("div",Om,[q[31]||(q[31]=u("label",null,"工作内容(必填)",-1)),Ee(u("input",{class:et(["input",{invalid:F.value}]),"onUpdate:modelValue":q[11]||(q[11]=Y=>ne.value=Y),placeholder:"做了什么,一句话一条",onKeydown:jt(g,["enter"])},null,34),[[De,ne.value]]),F.value?(K(),H("div",Mm,re(F.value),1)):Se("",!0)]),u("div",Im,[q[33]||(q[33]=u("label",null,"所属项目",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":q[12]||(q[12]=Y=>fe.value=Y)},[q[32]||(q[32]=u("option",{value:null},"无项目",-1)),(K(!0),H(Re,null,ut(D.value,Y=>(K(),H("option",{key:Y.id,value:Y.id},re(Y.name),9,jm))),128))],512),[[Fn,fe.value]])]),u("div",Dm,[q[34]||(q[34]=u("label",null,"工作分类",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":q[13]||(q[13]=Y=>Ke.value=Y)},[(K(!0),H(Re,null,ut(Qt(Us),Y=>(K(),H("option",{key:Y.key,value:Y.key},re(Y.label),9,Rm))),128))],512),[[Fn,Ke.value]])]),u("div",Lm,[q[35]||(q[35]=u("label",null,"耗时(分钟)",-1)),Ee(u("input",{class:"input",type:"number",min:"0","onUpdate:modelValue":q[14]||(q[14]=Y=>ct.value=Y),placeholder:"选填"},null,512),[[De,ct.value,void 0,{number:!0}]])]),u("div",Km,[q[36]||(q[36]=u("label",null,"主要收获",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":q[15]||(q[15]=Y=>ht.value=Y),placeholder:"一句话:学到了什么"},null,512),[[De,ht.value]])]),u("div",Fm,[q[37]||(q[37]=u("label",null,"备注",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":q[16]||(q[16]=Y=>Yt.value=Y),placeholder:"背景、链接、未决事项(选填)"},null,512),[[De,Yt.value]])])]),u("div",Nm,[u("button",{class:"btn btn-sm",disabled:!Ie.value,onClick:w},"重置",8,Vm),u("button",{class:"btn btn-primary btn-sm",disabled:Jt.value,onClick:g},"添加记录",8,Bm)])]),u("div",Um,[u("div",qm,"工作记录("+re(a.value.length)+")",1),!a.value.length&&!n.value?(K(),H("div",Hm,"暂无记录")):Se("",!0),(K(!0),H(Re,null,ut(a.value,Y=>(K(),H("div",{key:Y.id,class:"item"},[u("div",Wm,[u("span",zm,re(Qt(Qa)(Y.category)),1),u("span",{class:"item-content",title:"点击编辑",onClick:$e=>ie(Y)},re(Y.content),9,Gm),Y.project_id?(K(),H("span",Ym,re(T(Y.project_id)),1)):Se("",!0),Y.minutes?(K(),H("span",Jm,re(Y.minutes)+" 分钟",1)):Se("",!0),q[39]||(q[39]=u("span",{class:"flex1"},null,-1)),u("button",{class:"icon-btn",title:"编辑完整信息",onClick:$e=>ie(Y)},[Te(lt,{name:"edit",size:14})],8,Xm),u("button",{class:et(["icon-btn",{active:Y.is_milestone===1}]),title:"成果标记",onClick:$e=>ue(Y)},[Te(lt,{name:"star",size:14})],10,Qm),u("button",{class:et(["icon-btn",{"active-warn":Y.needs_followup===1}]),title:"待跟进",onClick:$e=>ye(Y)},[Te(lt,{name:"flag",size:14})],10,Zm),u("button",{class:"icon-btn",title:"删除",onClick:$e=>oe.value=Y},[Te(lt,{name:"close",size:14})],8,ey)]),Y.takeaway||Y.remark?(K(),H("div",ty,[Y.takeaway?(K(),H("div",ny,"收获:"+re(Y.takeaway),1)):Se("",!0),Y.remark?(K(),H("div",ry,"备注:"+re(Y.remark),1)):Se("",!0)])):Se("",!0)]))),128)),a.value.length?(K(),H("div",sy,[nn(" 共 "+re(a.value.length)+" 条事项 ",1),X.value?(K(),H(Re,{key:0},[nn(" · "+re((X.value/60).toFixed(1))+" 小时",1)],64)):Se("",!0)])):Se("",!0)]),Te(ur,{open:!!oe.value,title:"删除确认",message:oe.value?"将删除工作记录「"+oe.value.content+"」。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:q[17]||(q[17]=Y=>oe.value=null),onConfirm:we},null,8,["open","message"]),Te(ur,{open:G.value,title:"标记休假确认",message:"该日已有打卡记录,标记休假将清空上下班时间。是否继续?","confirm-text":"标记休假",danger:"",onCancel:q[18]||(q[18]=Y=>G.value=!1),onConfirm:q[19]||(q[19]=Y=>Z(!0))},null,8,["open"]),Te(pv,{open:!!P.value,item:P.value,projects:c.value,date:e.date,onCancel:q[20]||(q[20]=Y=>P.value=null),onSave:se},null,8,["open","item","projects","date"])]))}}),uf=Gt(oy,[["__scopeId","data-v-2e90c9d8"]]),iy={class:"cal-page"},ay={class:"cal-toolbar"},ly={class:"cal-title num"},uy={class:"cal-head"},cy={class:"cal-grid"},fy=["title","onClick"],dy={class:"cal-marks"},py={key:0,class:"drawer"},hy={class:"drawer-head"},vy={class:"drawer-body"},my=Vt({__name:"CalendarView",setup(e){const t=V(xt()),n=it(()=>Number(t.value.slice(0,4))),s=it(()=>Number(t.value.slice(5,7))-1),o=it(()=>n.value+" 年 "+(s.value+1)+" 月"),a=["一","二","三","四","五","六","日"],c=it(()=>{const G=(new Date(n.value,s.value,1).getDay()+6)%7,de=new Date(n.value,s.value+1,0).getDate(),ae=[];for(let Z=0;Z[ke.date,ke])),$=de[2],x=new Map;for(const ke of c.value){if(!ke.inMonth)continue;const J=qs(Z.get(ke.date),ke.date,ae,ke.date===h),xe=$.filter(Ve=>Ve.date===ke.date);x.set(ke.date,{status:J.status,label:J.label,location:((le=Z.get(ke.date))==null?void 0:le.location)||"",hasLog:xe.length>0,hasMilestone:xe.some(Ve=>Ve.is_milestone===1)})}d.value=x}gt([n,s],y,{immediate:!0}),gt(Hs,()=>{y()});function m(N){var G;return((G=d.value.get(N))==null?void 0:G.status)??""}function k(N){const G=d.value.get(N);return G?N+" · "+G.label+(G.location?" · "+G.location:""):N}function D(N){var G;return!!((G=d.value.get(N))!=null&&G.hasLog)}function T(N){var G;return!!((G=d.value.get(N))!=null&&G.hasMilestone)}function L(){t.value=Uo(t.value,-1)}function X(){t.value=Uo(t.value,1)}function ce(){t.value=xt()}const Q=V(null);function E(N,G){G&&(Q.value=N)}return gt($a,N=>{N&&(t.value=N,Q.value=N,$a.value=null)},{immediate:!0}),(N,G)=>(K(),H("div",iy,[u("div",ay,[u("button",{class:"icon-btn",onClick:L},[Te(lt,{name:"chevron-left",size:16})]),u("span",ly,re(o.value),1),u("button",{class:"icon-btn",onClick:X},[Te(lt,{name:"chevron-right",size:16})]),u("button",{class:"btn btn-sm",onClick:ce},"回到今天")]),u("div",uy,[(K(),H(Re,null,ut(a,de=>u("span",{key:de,class:"cal-week muted"},re(de),1)),64))]),u("div",cy,[(K(!0),H(Re,null,ut(c.value,(de,ae)=>(K(),H("button",{key:ae,class:et(["cal-cell",{blank:!de.inMonth,weekend:de.weekend,selected:Q.value===de.date}]),title:de.inMonth?k(de.date):void 0,onClick:Z=>E(de.date,de.inMonth)},[de.inMonth?(K(),H(Re,{key:0},[u("span",{class:et(["daynum num",{today:de.date===Qt(h)}])},re(Number(de.date.slice(8,10))),3),u("span",dy,[m(de.date)?(K(),H("span",{key:0,class:et(["dot",m(de.date)])},null,2)):Se("",!0),D(de.date)?(K(),It(lt,{key:1,name:"check-circle",size:12,class:"mark-log"})):Se("",!0),T(de.date)?(K(),It(lt,{key:2,name:"star",size:12,class:"mark-star"})):Se("",!0)])],64)):Se("",!0)],10,fy))),128))]),Te(ns,{name:"drawer"},{default:fr(()=>[Q.value?(K(),H("aside",py,[u("div",hy,[G[1]||(G[1]=u("span",{class:"drawer-title"},"当日详情",-1)),u("button",{class:"icon-btn",onClick:G[0]||(G[0]=de=>Q.value=null)},[Te(lt,{name:"close",size:16})])]),u("div",vy,[Te(uf,{date:Q.value},null,8,["date"])])])):Se("",!0)]),_:1})]))}}),yy=Gt(my,[["__scopeId","data-v-6a6322fa"]]),gy={class:"detail-page"},by={class:"detail-toolbar"},wy=["value"],_y=["disabled"],ky=Vt({__name:"TodayView",setup(e){const t=V(xt()),n=it(()=>t.value===xt());function s(){t.value=Kn(t.value,-1)}function o(){t.value=Kn(t.value,1)}function a(){t.value=xt()}function c(d){const h=d.target.value;h&&(t.value=h)}return(d,h)=>(K(),H("div",gy,[u("div",by,[u("button",{class:"icon-btn",title:"前一天",onClick:s},[Te(lt,{name:"chevron-left",size:16})]),u("span",{class:et(["date-title num",{"is-today":n.value}])},re(Qt(of)(t.value)),3),u("button",{class:"icon-btn",title:"后一天",onClick:o},[Te(lt,{name:"chevron-right",size:16})]),u("input",{type:"date",class:"input w-date",value:t.value,onChange:c},null,40,wy),u("button",{class:"btn btn-sm",disabled:n.value,onClick:a},"回到今天",8,_y)]),Te(uf,{date:t.value},null,8,["date"])]))}}),xy=Gt(ky,[["__scopeId","data-v-ac366cf6"]]),Cy={class:"stats"},Sy={class:"cards"},Ey={class:"card stat-card"},$y={class:"stat-num num"},Ay={class:"card stat-card"},Py={class:"stat-num num"},Ty={class:"card stat-card"},Oy={class:"stat-num num"},My={class:"card stat-card"},Iy={class:"stat-num num"},jy={class:"card section"},Dy={class:"heat"},Ry=["title"],Ly={class:"two-col"},Ky={class:"card section"},Fy={class:"bar-label"},Ny={class:"bar-track"},Vy={class:"muted num bar-num"},By={key:0,class:"muted"},Uy={class:"card section"},qy={class:"bar-label"},Hy={class:"bar-track"},Wy={class:"muted num bar-num"},zy={key:0,class:"muted"},Gy={class:"card section"},Yy={class:"bar-label loc-label"},Jy={class:"bar-track"},Xy={class:"muted num bar-num"},Qy={key:0,class:"muted"},Zy=Vt({__name:"StatsView",setup(e){const t=V({attendDays:0,totalHours:"0",itemCount:0,streak:0}),n=V([]),s=V([]),o=V([]),a=V([]);async function c(){const y=xt(),m="2000-01-01",k=await Promise.all([jr(),di(m,y),pi(m,y),Ks(!0)]),D=k[0],T=k[1],L=k[2],X=k[3],ce=T.filter(J=>J.clock_in_at||J.kind==="makeup");let Q=0;for(const J of ce){const xe=qs(J,J.date,D,J.date===y);Q+=xe.workedMinutes??0}const E=new Set(L.map(J=>J.date));let N=0,G=y;for(E.has(G)||(G=Kn(y,-1));E.has(G);)N++,G=Kn(G,-1);t.value={attendDays:ce.length,totalHours:(Q/60).toFixed(1),itemCount:L.length,streak:N};const de=new Map;for(const J of ce){const xe=J.location||"未记录";de.set(xe,(de.get(xe)||0)+1)}a.value=Array.from(de.entries()).map(J=>({name:J[0],count:J[1],percent:Math.round(J[1]/(ce.length||1)*100)})).sort((J,xe)=>xe.count-J.count);const ae=L.length||1;s.value=Us.map(J=>{const xe=L.filter(Ve=>Ve.category===J.key).length;return{key:J.key,label:J.label,count:xe,percent:Math.round(xe/ae*100)}}).filter(J=>J.count>0).sort((J,xe)=>xe.count-J.count);const Z=new Map(X.map(J=>[J.id,J.name])),$=new Map;for(const J of L){const xe=J.project_id?Z.get(J.project_id)||"已删除项目":"无项目";$.set(xe,($.get(xe)||0)+1)}o.value=Array.from($.entries()).map(J=>({name:J[0],count:J[1],percent:Math.round(J[1]/ae*100)})).sort((J,xe)=>xe.count-J.count);const x=new Map;for(const J of L)x.set(J.date,(x.get(J.date)||0)+1);const le=Es(y),ke=[];for(let J=11;J>=0;J--){const xe=Kn(le,-7*J),Ve=[];for(let nt=0;nt<7;nt++){const qe=Kn(xe,nt);Ve.push({date:qe,count:x.get(qe)||0})}ke.push(Ve)}n.value=ke}fn(async()=>{await c()}),gt(Hs,()=>{c()});function d(y){return y===0?0:y===1?1:y<=3?2:y<=5?3:4}function h(y,m){return y+" · "+(m?m+" 条":"无记录")}return(y,m)=>(K(),H("div",Cy,[u("div",Sy,[u("div",Ey,[m[0]||(m[0]=u("div",{class:"muted"},"出勤天数",-1)),u("div",$y,re(t.value.attendDays),1)]),u("div",Ay,[m[1]||(m[1]=u("div",{class:"muted"},"累计工时(小时)",-1)),u("div",Py,re(t.value.totalHours),1)]),u("div",Ty,[m[2]||(m[2]=u("div",{class:"muted"},"记录条数",-1)),u("div",Oy,re(t.value.itemCount),1)]),u("div",My,[m[3]||(m[3]=u("div",{class:"muted"},"连续记录(天)",-1)),u("div",Iy,re(t.value.streak),1)])]),u("div",jy,[m[4]||(m[4]=u("div",{class:"section-title"},"记录热力图(近 12 周)",-1)),u("div",Dy,[(K(!0),H(Re,null,ut(n.value,(k,D)=>(K(),H("div",{key:D,class:"heat-col"},[(K(!0),H(Re,null,ut(k,T=>(K(),H("span",{key:T.date,class:et(["heat-cell","lv"+d(T.count)]),title:h(T.date,T.count)},null,10,Ry))),128))]))),128))]),m[5]||(m[5]=Dp('
少多
',1))]),u("div",Ly,[u("div",Ky,[m[6]||(m[6]=u("div",{class:"section-title"},"分类分布",-1)),(K(!0),H(Re,null,ut(s.value,k=>(K(),H("div",{key:k.key,class:"bar-row"},[u("span",Fy,re(k.label),1),u("span",Ny,[u("span",{class:"bar-fill",style:sr({width:k.percent+"%"})},null,4)]),u("span",Vy,re(k.count)+" 条 · "+re(k.percent)+"%",1)]))),128)),s.value.length?Se("",!0):(K(),H("div",By,"暂无数据"))]),u("div",Uy,[m[7]||(m[7]=u("div",{class:"section-title"},"项目投入",-1)),(K(!0),H(Re,null,ut(o.value,k=>(K(),H("div",{key:k.name,class:"bar-row"},[u("span",qy,re(k.name),1),u("span",Hy,[u("span",{class:"bar-fill",style:sr({width:k.percent+"%"})},null,4)]),u("span",Wy,re(k.count)+" 条 · "+re(k.percent)+"%",1)]))),128)),o.value.length?Se("",!0):(K(),H("div",zy,"暂无数据"))])]),u("div",Gy,[m[8]||(m[8]=u("div",{class:"section-title"},"地点分布(按出勤天)",-1)),(K(!0),H(Re,null,ut(a.value,k=>(K(),H("div",{key:k.name,class:"bar-row"},[u("span",Yy,re(k.name),1),u("span",Jy,[u("span",{class:"bar-fill",style:sr({width:k.percent+"%"})},null,4)]),u("span",Xy,re(k.count)+" 天 · "+re(k.percent)+"%",1)]))),128)),a.value.length?Se("",!0):(K(),H("div",Qy,"暂无数据"))])]))}}),eg=Gt(Zy,[["__scopeId","data-v-73e5ba49"]]);async function tg(e,t,n){const s=xt(),o=await Promise.all([jr(),di(e,t),pi(e,t),Ks(!0),Iv(e,t)]),a=o[0],c=o[1],d=o[2],h=o[3],y=o[4];let m=0,k=0,D=0;for(const $ of c){($.clock_in_at||$.kind==="makeup")&&m++,$.kind==="makeup"&&D++;const x=qs($,$.date,a,$.date===s);k+=x.workedMinutes??0}const T=new Map;for(const $ of c){if(!($.clock_in_at||$.kind==="makeup"))continue;const x=$.location||"未记录";T.set(x,(T.get(x)||0)+1)}const L=Array.from(T.entries()).map($=>({name:$[0],count:$[1]})).sort(($,x)=>x.count-$.count),X=d.length||1,ce=Us.map($=>{const x=d.filter(le=>le.category===$.key).length;return{key:$.key,label:$.label,count:x,percent:Math.round(x/X*100)}}).filter($=>$.count>0).sort(($,x)=>x.count-$.count),Q=new Map(h.map($=>[$.id,$.name])),E=new Map;for(const $ of d){const x=$.project_id?Q.get($.project_id)||"已删除项目":"无项目";E.set(x,(E.get(x)||0)+1)}const N=Array.from(E.entries()).map($=>({name:$[0],count:$[1]})).sort(($,x)=>x.count-$.count),G=d.filter($=>$.is_milestone===1).map($=>({date:$.date,content:$.content})),de=d.filter($=>$.needs_followup===1).map($=>({date:$.date,content:$.content,remark:$.remark||""})),ae=d.filter($=>!!$.takeaway).map($=>({date:$.date,text:$.takeaway})),Z=y.map($=>({weekStart:$.week_start,highlights:$.highlights||"",challenges:$.challenges||"",plan_next:$.plan_next||""}));return{range:{start:e,end:t,label:n},attendDays:m,totalHours:(k/60).toFixed(1),makeupCount:D,leaveCount:c.filter($=>$.kind==="leave").length,itemCount:d.length,categoryStats:ce,projectStats:N,locationStats:L,milestones:G,followups:de,takeaways:ae,weekNotes:Z}}function ng(e){const t=[];t.push("# 实习工作总结("+e.range.start+" ~ "+e.range.end+")"),t.push(""),t.push("## 一、考勤概况"),t.push(""),t.push("出勤 "+e.attendDays+" 天,累计工时 "+e.totalHours+" 小时,补卡 "+e.makeupCount+" 次"+(e.leaveCount?",请假 "+e.leaveCount+" 天":""));const n=e.locationStats.filter(s=>s.name!=="未记录");n.length&&t.push("其中:"+n.map(s=>s.name+" "+s.count+" 天").join(",")),t.push(""),t.push("## 二、工作内容分布"),t.push(""),t.push(e.categoryStats.length?e.categoryStats.map(s=>s.label+" "+s.percent+"%("+s.count+" 条)").join(","):"(无记录)"),t.push(""),t.push("## 三、项目投入"),t.push(""),t.push(e.projectStats.length?e.projectStats.map(s=>s.name+" "+s.count+" 条").join(","):"(无记录)"),t.push(""),t.push("## 四、主要成果"),t.push(""),e.milestones.length?e.milestones.forEach((s,o)=>t.push(o+1+". 【成果】"+s.content+"("+s.date+")")):t.push("(无)"),t.push(""),t.push("## 五、待跟进事项"),t.push(""),e.followups.length?e.followups.forEach(s=>t.push("- 【待跟进】"+s.content+(s.remark?"("+s.date+" 备注:"+s.remark+")":"("+s.date+")"))):t.push("(无)"),t.push(""),t.push("## 六、学习与成长"),t.push(""),e.takeaways.length?e.takeaways.forEach(s=>t.push("- "+s.text+"("+s.date+")")):t.push("(无)");for(const s of e.weekNotes)t.push(""),t.push("### 周记("+s.weekStart+" 起)"),t.push(""),t.push("- 本周亮点:"+(s.highlights||"(无)")),t.push("- 踩的坑:"+(s.challenges||"(无)")),t.push("- 下周计划:"+(s.plan_next||"(无)"));return t.push(""),t.join(` -`)}const rg="modulepreload",sg=function(e,t){return new URL(e,t).href},Tu={},cf=function(t,n,s){let o=Promise.resolve();if(n&&n.length>0){const c=document.getElementsByTagName("link"),d=document.querySelector("meta[property=csp-nonce]"),h=(d==null?void 0:d.nonce)||(d==null?void 0:d.getAttribute("nonce"));o=Promise.allSettled(n.map(y=>{if(y=sg(y,s),y in Tu)return;Tu[y]=!0;const m=y.endsWith(".css"),k=m?'[rel="stylesheet"]':"";if(!!s)for(let L=c.length-1;L>=0;L--){const X=c[L];if(X.href===y&&(!m||X.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${y}"]${k}`))return;const T=document.createElement("link");if(T.rel=m?"stylesheet":rg,m||(T.as="script"),T.crossOrigin="",T.href=y,h&&T.setAttribute("nonce",h),document.head.appendChild(T),m)return new Promise((L,X)=>{T.addEventListener("load",L),T.addEventListener("error",()=>X(new Error(`Unable to preload CSS for ${y}`)))})}))}function a(c){const d=new Event("vite:preloadError",{cancelable:!0});if(d.payload=c,window.dispatchEvent(d),!d.defaultPrevented)throw c}return o.then(c=>{for(const d of c||[])d.status==="rejected"&&a(d.reason);return t().catch(a)})};/*! Capacitor: https://capacitorjs.com/ - MIT License */const og=e=>{const t=new Map;t.set("web",{name:"web"});const n=e.CapacitorPlatforms||{currentPlatform:{name:"web"},platforms:t},s=(a,c)=>{n.platforms.set(a,c)},o=a=>{n.platforms.has(a)&&(n.currentPlatform=n.platforms.get(a))};return n.addPlatform=s,n.setPlatform=o,n},ig=e=>e.CapacitorPlatforms=og(e),ff=ig(typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});ff.addPlatform;ff.setPlatform;var Qr;(function(e){e.Unimplemented="UNIMPLEMENTED",e.Unavailable="UNAVAILABLE"})(Qr||(Qr={}));class ua extends Error{constructor(t,n,s){super(t),this.message=t,this.code=n,this.data=s}}const ag=e=>{var t,n;return e!=null&&e.androidBridge?"android":!((n=(t=e==null?void 0:e.webkit)===null||t===void 0?void 0:t.messageHandlers)===null||n===void 0)&&n.bridge?"ios":"web"},lg=e=>{var t,n,s,o,a;const c=e.CapacitorCustomPlatform||null,d=e.Capacitor||{},h=d.Plugins=d.Plugins||{},y=e.CapacitorPlatforms,m=()=>c!==null?c.name:ag(e),k=((t=y==null?void 0:y.currentPlatform)===null||t===void 0?void 0:t.getPlatform)||m,D=()=>k()!=="web",T=((n=y==null?void 0:y.currentPlatform)===null||n===void 0?void 0:n.isNativePlatform)||D,L=Z=>{const $=G.get(Z);return!!($!=null&&$.platforms.has(k())||Q(Z))},X=((s=y==null?void 0:y.currentPlatform)===null||s===void 0?void 0:s.isPluginAvailable)||L,ce=Z=>{var $;return($=d.PluginHeaders)===null||$===void 0?void 0:$.find(x=>x.name===Z)},Q=((o=y==null?void 0:y.currentPlatform)===null||o===void 0?void 0:o.getPluginHeader)||ce,E=Z=>e.console.error(Z),N=(Z,$,x)=>Promise.reject(`${x} does not have an implementation of "${$}".`),G=new Map,de=(Z,$={})=>{const x=G.get(Z);if(x)return console.warn(`Capacitor plugin "${Z}" already registered. Cannot register plugins twice.`),x.proxy;const le=k(),ke=Q(Z);let J;const xe=async()=>(!J&&le in $?J=typeof $[le]=="function"?J=await $[le]():J=$[le]:c!==null&&!J&&"web"in $&&(J=typeof $.web=="function"?J=await $.web():J=$.web),J),Ve=(Fe,je)=>{var ne,F;if(ke){const fe=ke==null?void 0:ke.methods.find(Ke=>je===Ke.name);if(fe)return fe.rtype==="promise"?Ke=>d.nativePromise(Z,je.toString(),Ke):(Ke,ct)=>d.nativeCallback(Z,je.toString(),Ke,ct);if(Fe)return(ne=Fe[je])===null||ne===void 0?void 0:ne.bind(Fe)}else{if(Fe)return(F=Fe[je])===null||F===void 0?void 0:F.bind(Fe);throw new ua(`"${Z}" plugin is not implemented on ${le}`,Qr.Unimplemented)}},nt=Fe=>{let je;const ne=(...F)=>{const fe=xe().then(Ke=>{const ct=Ve(Ke,Fe);if(ct){const ht=ct(...F);return je=ht==null?void 0:ht.remove,ht}else throw new ua(`"${Z}.${Fe}()" is not implemented on ${le}`,Qr.Unimplemented)});return Fe==="addListener"&&(fe.remove=async()=>je()),fe};return ne.toString=()=>`${Fe.toString()}() { [capacitor code] }`,Object.defineProperty(ne,"name",{value:Fe,writable:!1,configurable:!1}),ne},qe=nt("addListener"),He=nt("removeListener"),ge=(Fe,je)=>{const ne=qe({eventName:Fe},je),F=async()=>{const Ke=await ne;He({eventName:Fe,callbackId:Ke},je)},fe=new Promise(Ke=>ne.then(()=>Ke({remove:F})));return fe.remove=async()=>{console.warn("Using addListener() without 'await' is deprecated."),await F()},fe},Oe=new Proxy({},{get(Fe,je){switch(je){case"$$typeof":return;case"toJSON":return()=>({});case"addListener":return ke?ge:qe;case"removeListener":return He;default:return nt(je)}}});return h[Z]=Oe,G.set(Z,{name:Z,proxy:Oe,platforms:new Set([...Object.keys($),...ke?[le]:[]])}),Oe},ae=((a=y==null?void 0:y.currentPlatform)===null||a===void 0?void 0:a.registerPlugin)||de;return d.convertFileSrc||(d.convertFileSrc=Z=>Z),d.getPlatform=k,d.handleError=E,d.isNativePlatform=T,d.isPluginAvailable=X,d.pluginMethodNoop=N,d.registerPlugin=ae,d.Exception=ua,d.DEBUG=!!d.DEBUG,d.isLoggingEnabled=!!d.isLoggingEnabled,d.platform=d.getPlatform(),d.isNative=d.isNativePlatform(),d},ug=e=>e.Capacitor=lg(e),Zr=ug(typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),df=Zr.registerPlugin;Zr.Plugins;class pf{constructor(t){this.listeners={},this.retainedEventArguments={},this.windowListeners={},t&&(console.warn(`Capacitor WebPlugin "${t.name}" config object was deprecated in v3 and will be removed in v4.`),this.config=t)}addListener(t,n){let s=!1;this.listeners[t]||(this.listeners[t]=[],s=!0),this.listeners[t].push(n);const a=this.windowListeners[t];a&&!a.registered&&this.addWindowListener(a),s&&this.sendRetainedArgumentsForEvent(t);const c=async()=>this.removeListener(t,n);return Promise.resolve({remove:c})}async removeAllListeners(){this.listeners={};for(const t in this.windowListeners)this.removeWindowListener(this.windowListeners[t]);this.windowListeners={}}notifyListeners(t,n,s){const o=this.listeners[t];if(!o){if(s){let a=this.retainedEventArguments[t];a||(a=[]),a.push(n),this.retainedEventArguments[t]=a}return}o.forEach(a=>a(n))}hasListeners(t){return!!this.listeners[t].length}registerWindowListener(t,n){this.windowListeners[n]={registered:!1,windowEventName:t,pluginEventName:n,handler:s=>{this.notifyListeners(n,s)}}}unimplemented(t="not implemented"){return new Zr.Exception(t,Qr.Unimplemented)}unavailable(t="not available"){return new Zr.Exception(t,Qr.Unavailable)}async removeListener(t,n){const s=this.listeners[t];if(!s)return;const o=s.indexOf(n);this.listeners[t].splice(o,1),this.listeners[t].length||this.removeWindowListener(this.windowListeners[t])}addWindowListener(t){window.addEventListener(t.windowEventName,t.handler),t.registered=!0}removeWindowListener(t){t&&(window.removeEventListener(t.windowEventName,t.handler),t.registered=!1)}sendRetainedArgumentsForEvent(t){const n=this.retainedEventArguments[t];n&&(delete this.retainedEventArguments[t],n.forEach(s=>{this.notifyListeners(t,s)}))}}const Ou=e=>encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape),Mu=e=>e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent);class cg extends pf{async getCookies(){const t=document.cookie,n={};return t.split(";").forEach(s=>{if(s.length<=0)return;let[o,a]=s.replace(/=/,"CAP_COOKIE").split("CAP_COOKIE");o=Mu(o).trim(),a=Mu(a).trim(),n[o]=a}),n}async setCookie(t){try{const n=Ou(t.key),s=Ou(t.value),o=`; expires=${(t.expires||"").replace("expires=","")}`,a=(t.path||"/").replace("path=",""),c=t.url!=null&&t.url.length>0?`domain=${t.url}`:"";document.cookie=`${n}=${s||""}${o}; path=${a}; ${c};`}catch(n){return Promise.reject(n)}}async deleteCookie(t){try{document.cookie=`${t.key}=; Max-Age=0`}catch(n){return Promise.reject(n)}}async clearCookies(){try{const t=document.cookie.split(";")||[];for(const n of t)document.cookie=n.replace(/^ +/,"").replace(/=.*/,`=;expires=${new Date().toUTCString()};path=/`)}catch(t){return Promise.reject(t)}}async clearAllCookies(){try{await this.clearCookies()}catch(t){return Promise.reject(t)}}}df("CapacitorCookies",{web:()=>new cg});const fg=async e=>new Promise((t,n)=>{const s=new FileReader;s.onload=()=>{const o=s.result;t(o.indexOf(",")>=0?o.split(",")[1]:o)},s.onerror=o=>n(o),s.readAsDataURL(e)}),dg=(e={})=>{const t=Object.keys(e);return Object.keys(e).map(o=>o.toLocaleLowerCase()).reduce((o,a,c)=>(o[a]=e[t[c]],o),{})},pg=(e,t=!0)=>e?Object.entries(e).reduce((s,o)=>{const[a,c]=o;let d,h;return Array.isArray(c)?(h="",c.forEach(y=>{d=t?encodeURIComponent(y):y,h+=`${a}=${d}&`}),h.slice(0,-1)):(d=t?encodeURIComponent(c):c,h=`${a}=${d}`),`${s}&${h}`},"").substr(1):null,hg=(e,t={})=>{const n=Object.assign({method:e.method||"GET",headers:e.headers},t),o=dg(e.headers)["content-type"]||"";if(typeof e.data=="string")n.body=e.data;else if(o.includes("application/x-www-form-urlencoded")){const a=new URLSearchParams;for(const[c,d]of Object.entries(e.data||{}))a.set(c,d);n.body=a.toString()}else if(o.includes("multipart/form-data")||e.data instanceof FormData){const a=new FormData;if(e.data instanceof FormData)e.data.forEach((d,h)=>{a.append(h,d)});else for(const d of Object.keys(e.data))a.append(d,e.data[d]);n.body=a;const c=new Headers(n.headers);c.delete("content-type"),n.headers=c}else(o.includes("application/json")||typeof e.data=="object")&&(n.body=JSON.stringify(e.data));return n};class vg extends pf{async request(t){const n=hg(t,t.webFetchExtra),s=pg(t.params,t.shouldEncodeUrlParams),o=s?`${t.url}?${s}`:t.url,a=await fetch(o,n),c=a.headers.get("content-type")||"";let{responseType:d="text"}=a.ok?t:{};c.includes("application/json")&&(d="json");let h,y;switch(d){case"arraybuffer":case"blob":y=await a.blob(),h=await fg(y);break;case"json":h=await a.json();break;case"document":case"text":default:h=await a.text()}const m={};return a.headers.forEach((k,D)=>{m[D]=k}),{data:h,headers:m,status:a.status,url:a.url}}async get(t){return this.request(Object.assign(Object.assign({},t),{method:"GET"}))}async post(t){return this.request(Object.assign(Object.assign({},t),{method:"POST"}))}async put(t){return this.request(Object.assign(Object.assign({},t),{method:"PUT"}))}async patch(t){return this.request(Object.assign(Object.assign({},t),{method:"PATCH"}))}async delete(t){return this.request(Object.assign(Object.assign({},t),{method:"DELETE"}))}}df("CapacitorHttp",{web:()=>new vg});async function tl(e,t){const n=window;if(n.electronAPI&&n.electronAPI.saveFile){const c=await n.electronAPI.saveFile(e,t);return c&&c.saved?c.path:""}if(Zr.isNativePlatform()){const{Filesystem:c,Directory:d,Encoding:h}=await cf(async()=>{const{Filesystem:y,Directory:m,Encoding:k}=await import("./index-BdeEta5K.js");return{Filesystem:y,Directory:m,Encoding:k}},[],import.meta.url);try{return(await c.writeFile({path:e,data:t,directory:d.Documents,encoding:h.UTF8,recursive:!0})).uri}catch{return(await c.writeFile({path:e,data:t,directory:d.Cache,encoding:h.UTF8,recursive:!0})).uri}}const s=new Blob([t],{type:"text/plain;charset=utf-8"}),o=URL.createObjectURL(s),a=document.createElement("a");return a.href=o,a.download=e,a.click(),window.setTimeout(()=>URL.revokeObjectURL(o),1e4),""}const mg=Object.freeze(Object.defineProperty({__proto__:null,downloadText:tl},Symbol.toStringTag,{value:"Module"}));async function Pa(e){try{await navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}}async function yg(e){const t=await Promise.all([yt("ai_base_url",""),yt("ai_api_key",""),yt("ai_model","")]),n=t[0].trim().replace(/\/+$/,""),s=t[1].trim(),o=t[2].trim();if(!n||!o)throw new Error("请先在设置页配置 AI 接口地址与模型名称");const a=n+"/chat/completions",c={"Content-Type":"application/json"};s&&(c.Authorization="Bearer "+s);const h=JSON.stringify({model:o,messages:[{role:"system",content:"你是一名严谨的中文助理。请将用户提供的工作总结 Markdown 草稿润色为通顺、专业、简洁的工作总结。要求:保留原有章节结构与全部事实数据(数字、日期、条目),不得虚构或遗漏内容,只输出 Markdown 正文。"},{role:"user",content:e}],temperature:.3});let y;try{y=await fetch(a,{method:"POST",headers:c,body:h})}catch{throw new Error("无法访问 AI 接口:请检查地址是否正确、服务端是否允许浏览器跨域访问")}if(!y.ok){let D="接口返回 "+y.status;try{const T=await y.json();T&&T.error&&T.error.message&&(D+=":"+T.error.message)}catch{}throw new Error(D)}const m=await y.json(),k=m&&m.choices&&m.choices[0]&&m.choices[0].message&&m.choices[0].message.content;if(!k)throw new Error("接口未返回内容");return String(k)}const gg={class:"report"},bg={class:"report-toolbar"},wg={class:"seg"},_g=["onClick"],kg=["disabled"],xg=["disabled"],Cg={key:0,class:"ai-error"},Sg={class:"report-grid"},Eg={class:"report-left"},$g={class:"card section"},Ag={class:"section-title"},Pg={class:"muted note-saved"},Tg={class:"card section"},Og={class:"report-right"},Mg={key:0,class:"card section"},Ig={class:"sum-row"},jg={class:"num"},Dg={class:"sum-row"},Rg={class:"num"},Lg={class:"sum-row"},Kg={class:"num"},Fg={class:"sum-row"},Ng={class:"num"},Vg={class:"sum-row"},Bg={class:"num"},Ug={class:"muted"},qg={class:"num"},Hg={key:0,class:"muted sum-empty"},Wg={class:"muted"},zg={key:1,class:"muted sum-empty"},Gg={class:"muted"},Yg={key:2,class:"muted sum-empty"},Jg={class:"muted"},Xg={key:3,class:"muted sum-empty"},Qg=Vt({__name:"ReportView",setup(e){const t=[{key:"week",label:"本周"},{key:"month",label:"本月"},{key:"all",label:"全部"},{key:"custom",label:"自定义"}],n=V("week"),s=V(Es(xt())),o=V(xt()),a=V(null),c=V(""),d=V(!1),h=V(!1),y=V(null),m=V(""),k=V(Es(xt())),D=V(""),T=V(""),L=V(""),X=V(!1);async function ce(){const $=await el(k.value);D.value=($==null?void 0:$.highlights)||"",T.value=($==null?void 0:$.challenges)||"",L.value=($==null?void 0:$.plan_next)||"",X.value=!1}async function Q(){await Mv(k.value,{highlights:D.value.trim()||null,challenges:T.value.trim()||null,plan_next:L.value.trim()||null}),X.value=!0,await N()}function E($){const x=xt();if($==="week"){const le=Es(x);return{start:le,end:Kn(le,6),label:"本周"}}if($==="month"){const le=x.slice(0,7);return{start:le+"-01",end:x,label:le+" 本月"}}return $==="all"?{start:"2000-01-01",end:x,label:"全部实习期"}:{start:s.value,end:o.value,label:s.value+" ~ "+o.value}}async function N(){d.value=!0;const $=E(n.value),x=await tg($.start,$.end,$.label);a.value=x,c.value=ng(x),d.value=!1}gt(n,N),gt([s,o],()=>{n.value==="custom"&&N()}),fn(async()=>{await ce(),await N()});async function G(){const $=xt().replace(/-/g,""),x=await tl("实习工作总结_"+$+".md",c.value);We(x?"总结已导出到:"+x:"总结已导出到系统下载目录")}async function de(){await Pa(c.value),We("总结已复制到剪贴板")}async function ae(){if(h.value)return;m.value="";const $=c.value.trim();if(!$){m.value="当前草稿为空,无法润色";return}h.value=!0;try{y.value=c.value,c.value=await yg($),We("AI 润色完成")}catch(x){y.value=null,m.value=x instanceof Error?x.message:"润色失败"}h.value=!1}function Z(){y.value!==null&&(c.value=y.value),y.value=null}return($,x)=>(K(),H("div",gg,[u("div",bg,[u("div",wg,[(K(),H(Re,null,ut(t,le=>u("button",{key:le.key,class:et(["seg-btn",{active:n.value===le.key}]),onClick:ke=>n.value=le.key},re(le.label),11,_g)),64))]),n.value==="custom"?(K(),H(Re,{key:0},[Ee(u("input",{type:"date",class:"input w-date","onUpdate:modelValue":x[0]||(x[0]=le=>s.value=le)},null,512),[[De,s.value]]),x[6]||(x[6]=u("span",{class:"muted"},"至",-1)),Ee(u("input",{type:"date",class:"input w-date","onUpdate:modelValue":x[1]||(x[1]=le=>o.value=le)},null,512),[[De,o.value]])],64)):Se("",!0),x[10]||(x[10]=u("span",{class:"flex1"},null,-1)),u("button",{class:"btn btn-sm",disabled:h.value,onClick:ae},[Te(lt,{name:"edit",size:14}),x[7]||(x[7]=nn("AI 润色 ",-1))],8,kg),y.value!==null?(K(),H("button",{key:1,class:"btn btn-sm",onClick:Z},"还原润色前")):Se("",!0),u("button",{class:"btn btn-sm",disabled:d.value,onClick:N},[Te(lt,{name:"edit",size:14}),x[8]||(x[8]=nn("重新生成 ",-1))],8,xg),u("button",{class:"btn btn-sm",onClick:de},"复制"),u("button",{class:"btn btn-primary btn-sm",onClick:G},[Te(lt,{name:"export",size:14}),x[9]||(x[9]=nn("导出 Markdown ",-1))])]),m.value?(K(),H("div",Cg,re(m.value),1)):Se("",!0),u("div",Sg,[u("div",Eg,[u("div",$g,[u("div",Ag,"本周周记("+re(k.value)+" 起)",1),x[11]||(x[11]=u("label",{class:"note-label muted"},"本周亮点",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":x[2]||(x[2]=le=>D.value=le),placeholder:"本周最有价值的一件事",onBlur:Q},null,544),[[De,D.value]]),x[12]||(x[12]=u("label",{class:"note-label muted"},"踩的坑",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":x[3]||(x[3]=le=>T.value=le),placeholder:"遇到的问题与教训",onBlur:Q},null,544),[[De,T.value]]),x[13]||(x[13]=u("label",{class:"note-label muted"},"下周计划",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":x[4]||(x[4]=le=>L.value=le),placeholder:"下周准备做什么",onBlur:Q},null,544),[[De,L.value]]),u("div",Pg,re(X.value?"已保存":"失焦自动保存"),1)]),u("div",Tg,[x[14]||(x[14]=u("div",{class:"section-title"},"总结草稿(可编辑)",-1)),Ee(u("textarea",{class:"textarea md-editor","onUpdate:modelValue":x[5]||(x[5]=le=>c.value=le),spellcheck:"false"},null,512),[[De,c.value]])])]),u("div",Og,[a.value?(K(),H("div",Mg,[x[20]||(x[20]=u("div",{class:"section-title"},"数据摘要",-1)),u("div",Ig,[x[15]||(x[15]=u("span",{class:"muted"},"出勤",-1)),u("span",jg,re(a.value.attendDays)+" 天",1)]),u("div",Dg,[x[16]||(x[16]=u("span",{class:"muted"},"工时",-1)),u("span",Rg,re(a.value.totalHours)+" 小时",1)]),u("div",Lg,[x[17]||(x[17]=u("span",{class:"muted"},"补卡",-1)),u("span",Kg,re(a.value.makeupCount)+" 次",1)]),u("div",Fg,[x[18]||(x[18]=u("span",{class:"muted"},"请假",-1)),u("span",Ng,re(a.value.leaveCount)+" 天",1)]),u("div",Vg,[x[19]||(x[19]=u("span",{class:"muted"},"记录",-1)),u("span",Bg,re(a.value.itemCount)+" 条",1)]),x[21]||(x[21]=u("div",{class:"section-sub"},"分类分布",-1)),(K(!0),H(Re,null,ut(a.value.categoryStats,le=>(K(),H("div",{key:le.key,class:"sum-row"},[u("span",Ug,re(le.label),1),u("span",qg,re(le.count)+" 条 · "+re(le.percent)+"%",1)]))),128)),a.value.categoryStats.length?Se("",!0):(K(),H("div",Hg,"(无)")),x[22]||(x[22]=u("div",{class:"section-sub"},"主要成果",-1)),(K(!0),H(Re,null,ut(a.value.milestones,(le,ke)=>(K(),H("div",{key:"m"+ke,class:"sum-item"},[nn(re(le.content),1),u("span",Wg,"("+re(le.date)+")",1)]))),128)),a.value.milestones.length?Se("",!0):(K(),H("div",zg,"(无)")),x[23]||(x[23]=u("div",{class:"section-sub"},"待跟进",-1)),(K(!0),H(Re,null,ut(a.value.followups,(le,ke)=>(K(),H("div",{key:"f"+ke,class:"sum-item"},[nn(re(le.content),1),u("span",Gg,"("+re(le.date)+")",1)]))),128)),a.value.followups.length?Se("",!0):(K(),H("div",Yg,"(无)")),x[24]||(x[24]=u("div",{class:"section-sub"},"学习与成长",-1)),(K(!0),H(Re,null,ut(a.value.takeaways,(le,ke)=>(K(),H("div",{key:"t"+ke,class:"sum-item"},[nn(re(le.text),1),u("span",Jg,"("+re(le.date)+")",1)]))),128)),a.value.takeaways.length?Se("",!0):(K(),H("div",Xg,"(无)"))])):Se("",!0)])])]))}}),Zg=Gt(Qg,[["__scopeId","data-v-43f9c59b"]]),eb=["aria-label"],tb={class:"dialog-head"},nb={class:"dialog-title"},rb={class:"dialog-body"},sb={class:"form-grid"},ob={class:"field span2"},ib={class:"seg"},ab={class:"field"},lb={class:"field"},ub={class:"field"},cb=["value"],fb={key:0,class:"field"},db={class:"seg"},pb={class:"field span2"},hb={key:0,class:"form-error"},vb={class:"dialog-btns"},mb=Vt({__name:"TransactionDialog",props:{open:{type:Boolean},title:{},initial:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,s=t,o=V("expense"),a=V("餐饮"),c=V(""),d=V(""),h=V(""),y=V(!1),m=V(!1),k=V(""),D=V(null);function T(Q){n.open&&Q.key==="Escape"&&s("cancel")}gt(()=>n.open,async Q=>{var E;Q?(o.value=n.initial.type==="income"?"income":"expense",a.value=n.initial.category,c.value=n.initial.amountYuan,d.value=n.initial.date,h.value=n.initial.note,y.value=n.initial.reimbursable===1,m.value=n.initial.reimbursed===1,k.value="",window.addEventListener("keydown",T),await ts(),(E=D.value)==null||E.focus()):window.removeEventListener("keydown",T)}),dr(()=>window.removeEventListener("keydown",T)),gt(o,Q=>{a.value=Q==="expense"?Wr[0]:Bo[0]});const L=it(()=>o.value==="expense"?Wr:Bo);function X(){return a.value&&L.value.includes(a.value)?a.value:L.value[0]}function ce(){const Q=Number(c.value);if(!c.value.trim()||!isFinite(Q)||Q<=0){k.value="请填写大于 0 的金额";return}if(!d.value){k.value="请选择日期";return}const E=o.value==="expense"&&y.value?1:0;s("save",{type:o.value,category:X(),amount:Math.round(Q*100),date:d.value,note:h.value.trim(),reimbursable:E,reimbursed:E&&m.value?1:0})}return(Q,E)=>(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[e.open?(K(),H("div",{key:0,class:"mask",onClick:E[11]||(E[11]=Mr(N=>s("cancel"),["self"]))},[u("div",{class:"dialog",role:"dialog","aria-label":e.title},[u("div",tb,[u("span",nb,re(e.title),1),u("button",{class:"icon-btn",title:"关闭",onClick:E[0]||(E[0]=N=>s("cancel"))},[Te(lt,{name:"close",size:16})])]),u("div",rb,[u("div",sb,[u("div",ob,[E[12]||(E[12]=u("label",null,"类型",-1)),u("div",ib,[u("button",{class:et(["seg-btn",{active:o.value==="expense"}]),onClick:E[1]||(E[1]=N=>o.value="expense")},"支出",2),u("button",{class:et(["seg-btn",{active:o.value==="income"}]),onClick:E[2]||(E[2]=N=>o.value="income")},"收入",2)])]),u("div",ab,[E[13]||(E[13]=u("label",null,"金额(元,必填)",-1)),Ee(u("input",{ref_key:"amountInput",ref:D,class:et(["input",{invalid:k.value}]),"onUpdate:modelValue":E[3]||(E[3]=N=>c.value=N),type:"number",min:"0",step:"0.01",placeholder:"0.00"},null,2),[[De,c.value]])]),u("div",lb,[E[14]||(E[14]=u("label",null,"日期(必填)",-1)),Ee(u("input",{class:"input",type:"date","onUpdate:modelValue":E[4]||(E[4]=N=>d.value=N)},null,512),[[De,d.value]])]),u("div",ub,[E[15]||(E[15]=u("label",null,"分类",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":E[5]||(E[5]=N=>a.value=N)},[(K(!0),H(Re,null,ut(L.value,N=>(K(),H("option",{key:N,value:N},re(N),9,cb))),128))],512),[[Fn,a.value]])]),o.value==="expense"?(K(),H("div",fb,[E[16]||(E[16]=u("label",null,"报销状态",-1)),u("div",db,[u("button",{class:et(["seg-btn",{active:!y.value}]),onClick:E[6]||(E[6]=N=>{y.value=!1,m.value=!1})},"无需报销",2),u("button",{class:et(["seg-btn",{active:y.value&&!m.value}]),onClick:E[7]||(E[7]=N=>{y.value=!0,m.value=!1})},"待报销",2),u("button",{class:et(["seg-btn",{active:y.value&&m.value}]),onClick:E[8]||(E[8]=N=>{y.value=!0,m.value=!0})},"已报销",2)])])):Se("",!0),u("div",pb,[E[17]||(E[17]=u("label",null,"备注",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":E[9]||(E[9]=N=>h.value=N),placeholder:"选填"},null,512),[[De,h.value]])])]),k.value?(K(),H("div",hb,re(k.value),1)):Se("",!0)]),u("div",vb,[u("button",{class:"btn btn-sm",onClick:E[10]||(E[10]=N=>s("cancel"))},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:ce},"保存")])],8,eb)])):Se("",!0)]),_:1})]))}}),yb=Gt(mb,[["__scopeId","data-v-e3568c0d"]]),gb={class:"ledger-page"},bb={class:"ledger-toolbar"},wb={class:"month-title num"},_b={class:"cards"},kb={class:"card stat-card"},xb={class:"stat-num num amt-income"},Cb={class:"card stat-card"},Sb={class:"stat-num num"},Eb={class:"card stat-card"},$b={class:"card stat-card"},Ab={class:"stat-num num amt-warn"},Pb={class:"card sec"},Tb={class:"form-grid"},Ob={class:"field span2"},Mb={class:"seg"},Ib={class:"field"},jb={class:"field"},Db={class:"field"},Rb=["value"],Lb={key:0,class:"field"},Kb={class:"field span2"},Fb={key:0,class:"form-error"},Nb={class:"form-footer"},Vb=["disabled"],Bb=["disabled"],Ub={key:0,class:"card sec"},qb={class:"bar-label"},Hb={class:"bar-track"},Wb={class:"muted num bar-num"},zb={key:1,class:"card section"},Gb={class:"form-error"},Yb={class:"card table-card"},Jb={class:"tx-table"},Xb={class:"num"},Qb={class:"tag"},Zb={class:"td-note"},ew={key:0,class:"muted"},tw={key:1,class:"tx-done"},nw={key:2,class:"tx-pending"},rw={class:"ops"},sw=["onClick"],ow=["onClick"],iw=["onClick"],aw={key:0},lw={class:"muted vault-note num"},uw=Vt({__name:"LedgerView",setup(e){const t=V(xt()),n=V([]),s=V(!0),o=V("expense"),a=V(""),c=V(Wr[0]),d=V(xt()),h=V(""),y=V(!1),m=V(""),k=V(""),D=V(!1),T=V(!1),L=V(null),X=V({type:"expense",category:Wr[0],amountYuan:"",date:xt(),note:"",reimbursable:0,reimbursed:0}),ce=V(null),Q=it(()=>t.value.slice(0,7)+"-01"),E=it(()=>{const ne=Number(t.value.slice(0,4)),F=Number(t.value.slice(5,7))-1,fe=new Date(ne,F+1,0).getDate();return t.value.slice(0,7)+"-"+(fe<10?"0"+fe:String(fe))}),N=it(()=>Number(t.value.slice(0,4))+" 年 "+Number(t.value.slice(5,7))+" 月");async function G(){s.value=!0;try{n.value=await Nv(Q.value,E.value),k.value=""}catch(ne){k.value="账目加载失败:"+(ne instanceof Error?ne.stack||ne.message:String(ne)),We("账目加载失败")}s.value=!1}fn(G),gt(t,G),gt(o,ne=>{c.value=ne==="expense"?Wr[0]:Bo[0]});const de=it(()=>n.value.slice().sort((ne,F)=>ne.date===F.date?F.id-ne.id:ne.date{let ne=0,F=0,fe=0;for(const Ke of n.value)Ke.type==="income"?ne+=Ke.amount:(F+=Ke.amount,Ke.reimbursable===1&&Ke.reimbursed!==1&&(fe+=Ke.amount));return{income:ne,expense:F,pending:fe,balance:ne-F}}),Z=V("all"),$=V("all"),x=it(()=>de.value.filter(ne=>!(Z.value!=="all"&&ne.type!==Z.value||$.value==="pending"&&!(ne.type==="expense"&&ne.reimbursable===1&&ne.reimbursed!==1)||$.value==="done"&&!(ne.reimbursable===1&&ne.reimbursed===1)))),le=it(()=>{const ne=new Map;let F=0;for(const Ke of n.value)Ke.type==="expense"&&(ne.set(Ke.category,(ne.get(Ke.category)||0)+Ke.amount),F+=Ke.amount);const fe=F||1;return Array.from(ne.entries()).map(Ke=>({name:Ke[0],amount:Ke[1],percent:Math.round(Ke[1]/fe*100)})).sort((Ke,ct)=>ct.amount-Ke.amount)});function ke(ne){return(ne/100).toFixed(2)}function J(ne){return(ne.type==="income"?"+":"-")+ke(ne.amount)}function xe(){t.value=Uo(t.value,-1)}function Ve(){t.value=Uo(t.value,1)}function nt(){t.value=xt()}gt(a,()=>{m.value&&(m.value="")});async function qe(){const ne=Number(a.value);if(!a.value.trim()||!isFinite(ne)||ne<=0){m.value="请填写大于 0 的金额";return}if(!d.value){m.value="请选择日期";return}if(!D.value){D.value=!0;try{await Vv({type:o.value,category:c.value,amount:Math.round(ne*100),date:d.value,note:h.value.trim(),reimbursable:o.value==="expense"&&y.value?1:0,reimbursed:0})}catch(F){We("添加失败:"+(F instanceof Error?F.message:String(F))),D.value=!1;return}a.value="",h.value="",y.value=!1,m.value="",await G(),We("记账已添加"),D.value=!1}}function He(){a.value="",h.value="",y.value=!1,m.value=""}async function ge(ne){await qv(ne.id),await G(),We("已标记为已报销")}function Oe(ne){L.value=ne.id,X.value={type:ne.type,category:ne.category,amountYuan:ke(ne.amount),date:ne.date,note:ne.note||"",reimbursable:ne.reimbursable,reimbursed:ne.reimbursed},T.value=!0}async function Fe(ne){const F=L.value;await Bv(F,ne),T.value=!1,await G(),We("账目已更新")}async function je(){ce.value&&ce.value.id&&await Uv(ce.value.id),ce.value=null,await G(),We("账目已删除")}return(ne,F)=>(K(),H("div",gb,[u("div",bb,[u("button",{class:"icon-btn",onClick:xe},[Te(lt,{name:"chevron-left",size:16})]),u("span",wb,re(N.value),1),u("button",{class:"icon-btn",onClick:Ve},[Te(lt,{name:"chevron-right",size:16})]),u("button",{class:"btn btn-sm",onClick:nt},"回到本月"),F[13]||(F[13]=u("span",{class:"flex1"},null,-1)),Ee(u("select",{class:"select w-filter","onUpdate:modelValue":F[0]||(F[0]=fe=>Z.value=fe)},[...F[11]||(F[11]=[u("option",{value:"all"},"全部类型",-1),u("option",{value:"expense"},"仅支出",-1),u("option",{value:"income"},"仅收入",-1)])],512),[[Fn,Z.value]]),Ee(u("select",{class:"select w-filter","onUpdate:modelValue":F[1]||(F[1]=fe=>$.value=fe)},[...F[12]||(F[12]=[u("option",{value:"all"},"全部报销",-1),u("option",{value:"pending"},"待报销",-1),u("option",{value:"done"},"已报销",-1)])],512),[[Fn,$.value]])]),u("div",_b,[u("div",kb,[F[14]||(F[14]=u("div",{class:"muted"},"本月收入(元)",-1)),u("div",xb,re(ke(ae.value.income)),1)]),u("div",Cb,[F[15]||(F[15]=u("div",{class:"muted"},"本月支出(元)",-1)),u("div",Sb,re(ke(ae.value.expense)),1)]),u("div",Eb,[F[16]||(F[16]=u("div",{class:"muted"},"本月结余(元)",-1)),u("div",{class:et(["stat-num num",{"amt-income":ae.value.balance>=0,"amt-expense":ae.value.balance<0}])},re(ke(ae.value.balance)),3)]),u("div",$b,[F[17]||(F[17]=u("div",{class:"muted"},"待报销(元)",-1)),u("div",Ab,re(ke(ae.value.pending)),1)])]),u("div",Pb,[F[24]||(F[24]=u("div",{class:"sec-head"},[u("span",{class:"sec-title"},"新增一笔"),u("span",{class:"muted form-hint"},"金额必填,回车快速添加")],-1)),u("div",Tb,[u("div",Ob,[F[18]||(F[18]=u("label",null,"类型",-1)),u("div",Mb,[u("button",{class:et(["seg-btn",{active:o.value==="expense"}]),onClick:F[2]||(F[2]=fe=>o.value="expense")},"支出",2),u("button",{class:et(["seg-btn",{active:o.value==="income"}]),onClick:F[3]||(F[3]=fe=>o.value="income")},"收入",2)])]),u("div",Ib,[F[19]||(F[19]=u("label",null,"金额(元,必填)",-1)),Ee(u("input",{class:et(["input",{invalid:m.value}]),"onUpdate:modelValue":F[4]||(F[4]=fe=>a.value=fe),type:"number",min:"0",step:"0.01",placeholder:"0.00",onKeydown:jt(qe,["enter"])},null,34),[[De,a.value]])]),u("div",jb,[F[20]||(F[20]=u("label",null,"日期",-1)),Ee(u("input",{class:"input",type:"date","onUpdate:modelValue":F[5]||(F[5]=fe=>d.value=fe)},null,512),[[De,d.value]])]),u("div",Db,[F[21]||(F[21]=u("label",null,"分类",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":F[6]||(F[6]=fe=>c.value=fe)},[(K(!0),H(Re,null,ut(o.value==="expense"?Qt(Wr):Qt(Bo),fe=>(K(),H("option",{key:fe,value:fe},re(fe),9,Rb))),128))],512),[[Fn,c.value]])]),o.value==="expense"?(K(),H("div",Lb,[F[22]||(F[22]=u("label",null,"报销",-1)),u("button",{class:et(["toggle-btn",{on:y.value}]),onClick:F[7]||(F[7]=fe=>y.value=!y.value)},re(y.value?"需要报销":"无需报销"),3)])):Se("",!0),u("div",Kb,[F[23]||(F[23]=u("label",null,"备注",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":F[8]||(F[8]=fe=>h.value=fe),placeholder:"选填,如:客户现场午餐",onKeydown:jt(qe,["enter"])},null,544),[[De,h.value]])])]),m.value?(K(),H("div",Fb,re(m.value),1)):Se("",!0),u("div",Nb,[u("button",{class:"btn btn-sm",disabled:!(a.value.trim()||h.value.trim()),onClick:He},"重置",8,Vb),u("button",{class:"btn btn-primary btn-sm",disabled:D.value,onClick:qe},"添加记录",8,Bb)])]),le.value.length?(K(),H("div",Ub,[F[25]||(F[25]=u("div",{class:"sec-title"},"本月支出分类",-1)),(K(!0),H(Re,null,ut(le.value,fe=>(K(),H("div",{key:fe.name,class:"bar-row"},[u("span",qb,re(fe.name),1),u("span",Hb,[u("span",{class:"bar-fill",style:sr({width:fe.percent+"%"})},null,4)]),u("span",Wb,re(ke(fe.amount))+" 元 · "+re(fe.percent)+"%",1)]))),128))])):Se("",!0),k.value?(K(),H("div",zb,[u("div",Gb,re(k.value),1),F[26]||(F[26]=u("div",{class:"muted loc-note"},"请将上方完整错误文字发送给开发者",-1))])):Se("",!0),u("div",Yb,[u("table",Jb,[F[28]||(F[28]=u("thead",null,[u("tr",null,[u("th",null,"日期"),u("th",null,"分类"),u("th",null,"金额(元)"),u("th",null,"备注"),u("th",null,"报销"),u("th",{class:"th-ops"},"操作")])],-1)),u("tbody",null,[(K(!0),H(Re,null,ut(x.value,fe=>(K(),H("tr",{key:fe.id},[u("td",Xb,re(fe.date),1),u("td",null,[u("span",Qb,re(fe.category),1)]),u("td",{class:et(["num",fe.type==="income"?"amt-income":"amt-expense"])},re(J(fe)),3),u("td",Zb,re(fe.note||"--"),1),u("td",null,[fe.type!=="expense"||fe.reimbursable!==1?(K(),H("span",ew,"--")):fe.reimbursed===1?(K(),H("span",tw,"已报销")):(K(),H("span",nw,"待报销"))]),u("td",null,[u("div",rw,[fe.type==="expense"&&fe.reimbursable===1&&fe.reimbursed!==1?(K(),H("button",{key:0,class:"btn btn-xs",onClick:Ke=>ge(fe)},"标记已报销",8,sw)):Se("",!0),u("button",{class:"btn btn-xs",onClick:Ke=>Oe(fe)},"编辑",8,ow),u("button",{class:"btn btn-xs",onClick:Ke=>ce.value=fe},"删除",8,iw)])])]))),128)),!x.value.length&&!s.value?(K(),H("tr",aw,[...F[27]||(F[27]=[u("td",{colspan:"6",class:"empty muted"},"本月暂无账目",-1)])])):Se("",!0)])])]),u("div",lw,"筛选结果 "+re(x.value.length)+" 条 / 本月共 "+re(n.value.length)+" 条",1),Te(yb,{open:T.value,title:(L.value,"编辑账目"),initial:X.value,onCancel:F[9]||(F[9]=fe=>T.value=!1),onSave:Fe},null,8,["open","title","initial"]),Te(ur,{open:!!ce.value,title:"删除确认",message:ce.value?"将删除 "+ce.value.date+" 的账目("+ce.value.category+" "+ke(ce.value.amount)+" 元)。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:F[10]||(F[10]=fe=>ce.value=null),onConfirm:je},null,8,["open","message"])]))}}),cw=Gt(uw,[["__scopeId","data-v-d0c263fa"]]),fw={class:"memo-page"},dw={class:"card memo-list"},pw={class:"pane-head"},hw={class:"pane-title"},vw={class:"memo-scroll"},mw=["onClick"],yw={class:"memo-item-title"},gw={class:"muted memo-item-sub"},bw={class:"muted num memo-item-time"},ww={key:0,class:"muted empty"},_w={class:"card memo-editor"},kw={class:"editor-foot"},xw={class:"muted foot-info"},Cw=["disabled"],Sw=["disabled"],Ew={key:1,class:"empty muted editor-empty"},$w=Vt({__name:"MemoView",setup(e){const t=V([]),n=V(null),s=V(!1),o=V(""),a=V(""),c=V(null),d=V(null);async function h(){if(t.value=await jv(),n.value&&n.value.id){const ae=t.value.find(Z=>Z.id===n.value.id);ae&&(n.value=ae)}}fn(async()=>{await h(),t.value.length&&k(t.value[0]),window.addEventListener("keydown",y)}),dr(()=>window.removeEventListener("keydown",y)),gt(Aa,async ae=>{if(!ae)return;t.value.length||await h();const Z=t.value.find($=>$.id===ae);Aa.value=null,Z&&D(Z)},{immediate:!0});function y(ae){(ae.ctrlKey||ae.metaKey)&&ae.key.toLowerCase()==="s"&&s.value&&m.value&&(ae.preventDefault(),ce())}const m=it(()=>{if(!s.value)return!1;const ae=n.value?n.value.title:"",Z=n.value?n.value.content:"";return o.value!==ae||a.value!==Z});function k(ae){n.value=ae,s.value=!0,o.value=ae.title,a.value=ae.content}function D(ae){if(!(s.value&&n.value&&n.value.id===ae.id)){if(m.value){d.value={type:"select",memo:ae};return}k(ae)}}function T(){if(m.value){d.value={type:"new"};return}L()}function L(){n.value=null,s.value=!0,o.value="",a.value=""}function X(){n.value?k(n.value):L()}async function ce(){if(!o.value.trim()&&!a.value.trim()){We("标题与内容不能都为空");return}if(n.value&&n.value.id)await Rv(n.value.id,o.value,a.value),We("备忘已保存");else{const ae=await Dv(o.value,a.value);n.value=ae,o.value=ae.title,a.value=ae.content,We("备忘已创建")}await h()}function Q(){n.value&&n.value.id&&(c.value=n.value)}async function E(){c.value&&c.value.id&&(await Lv(c.value.id),We("备忘已删除")),c.value=null,await h(),L()}function N(){const ae=d.value;d.value=null,ae&&(ae.type==="select"?k(ae.memo):L())}function G(ae){return(ae.content||"").replace(/\s+/g," ").slice(0,30)}function de(ae){return ae.replace("T"," ").slice(0,16)}return(ae,Z)=>(K(),H("div",fw,[u("aside",dw,[u("div",pw,[u("span",hw,"备忘录("+re(t.value.length)+")",1),u("button",{class:"btn btn-primary btn-sm",onClick:T},"新建")]),u("div",vw,[(K(!0),H(Re,null,ut(t.value,$=>(K(),H("div",{key:$.id,class:et(["memo-item",{active:s.value&&n.value&&n.value.id===$.id}]),onClick:x=>D($)},[u("div",yw,re($.title||"无标题"),1),u("div",gw,re(G($)||"空"),1),u("div",bw,re(de($.updated_at)),1)],10,mw))),128)),t.value.length?Se("",!0):(K(),H("div",ww,"暂无备忘"))])]),u("section",_w,[s.value?(K(),H(Re,{key:0},[Ee(u("input",{class:"input title-input","onUpdate:modelValue":Z[0]||(Z[0]=$=>o.value=$),placeholder:"标题"},null,512),[[De,o.value]]),Ee(u("textarea",{class:"textarea content-textarea","onUpdate:modelValue":Z[1]||(Z[1]=$=>a.value=$),placeholder:"内容"},null,512),[[De,a.value]]),u("div",kw,[u("span",xw,[m.value?(K(),H(Re,{key:0},[nn("有未保存修改")],64)):n.value&&n.value.id?(K(),H(Re,{key:1},[nn("更新于 "+re(de(n.value.updated_at)),1)],64)):(K(),H(Re,{key:2},[nn("新备忘")],64))]),Z[4]||(Z[4]=u("span",{class:"flex1"},null,-1)),n.value&&n.value.id?(K(),H("button",{key:0,class:"btn btn-sm",onClick:Q},"删除")):Se("",!0),u("button",{class:"btn btn-sm",disabled:!m.value,onClick:X},"放弃修改",8,Cw),u("button",{class:"btn btn-primary btn-sm",disabled:!m.value,onClick:ce},"保存",8,Sw)])],64)):(K(),H("div",Ew,"选择左侧备忘,或点击右上角新建"))]),Te(ur,{open:!!c.value,title:"删除确认",message:c.value?"将删除备忘「"+(c.value.title||"无标题")+"」。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:Z[2]||(Z[2]=$=>c.value=null),onConfirm:E},null,8,["open","message"]),Te(ur,{open:!!d.value,title:"未保存提示",message:"当前备忘有未保存的修改,继续操作将丢失这些修改。","confirm-text":"放弃修改并继续",onCancel:Z[3]||(Z[3]=$=>d.value=null),onConfirm:N},null,8,["open"])]))}}),Aw=Gt($w,[["__scopeId","data-v-74d60dba"]]),Pw=["aria-label"],Tw={class:"dialog-head"},Ow={class:"dialog-title"},Mw={class:"dialog-body"},Iw={class:"form-grid"},jw={class:"field span2"},Dw={class:"field span2"},Rw={class:"field span2"},Lw={class:"pwd-row"},Kw={class:"field span2"},Fw={key:0,class:"form-error"},Nw={class:"dialog-btns"},Vw=Vt({__name:"CredentialDialog",props:{open:{type:Boolean},title:{},initial:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,s=t,o=V(""),a=V(""),c=V(""),d=V(""),h=V(""),y=V(null);function m(T){n.open&&T.key==="Escape"&&s("cancel")}gt(()=>n.open,async T=>{var L;T?(o.value=n.initial.system,a.value=n.initial.account,c.value=n.initial.password,d.value=n.initial.remark,h.value="",window.addEventListener("keydown",m),await ts(),(L=y.value)==null||L.focus()):window.removeEventListener("keydown",m)}),dr(()=>window.removeEventListener("keydown",m));function k(){const T="ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789",L="!@#$%^&*",X=crypto.getRandomValues(new Uint8Array(14));let ce="";for(let Q=0;Q(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[e.open?(K(),H("div",{key:0,class:"mask",onClick:L[6]||(L[6]=Mr(X=>s("cancel"),["self"]))},[u("div",{class:"dialog",role:"dialog","aria-label":e.title},[u("div",Tw,[u("span",Ow,re(e.title),1),u("button",{class:"icon-btn",title:"关闭",onClick:L[0]||(L[0]=X=>s("cancel"))},[Te(lt,{name:"close",size:16})])]),u("div",Mw,[u("div",Iw,[u("div",jw,[L[7]||(L[7]=u("label",null,"系统名称(必填)",-1)),Ee(u("input",{ref_key:"systemInput",ref:y,class:"input","onUpdate:modelValue":L[1]||(L[1]=X=>o.value=X),placeholder:"如:企业邮箱 / OA / VPN"},null,512),[[De,o.value]])]),u("div",Dw,[L[8]||(L[8]=u("label",null,"账号(必填)",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":L[2]||(L[2]=X=>a.value=X),placeholder:"用户名、工号或邮箱"},null,512),[[De,a.value]])]),u("div",Rw,[L[9]||(L[9]=u("label",null,"密码(必填)",-1)),u("div",Lw,[Ee(u("input",{class:"input","onUpdate:modelValue":L[3]||(L[3]=X=>c.value=X),placeholder:"输入或点击生成"},null,512),[[De,c.value]]),u("button",{class:"btn btn-sm",onClick:k},"生成")])]),u("div",Kw,[L[10]||(L[10]=u("label",null,"备注",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":L[4]||(L[4]=X=>d.value=X),placeholder:"用途、到期时间、负责人等(选填)"},null,512),[[De,d.value]])])]),h.value?(K(),H("div",Fw,re(h.value),1)):Se("",!0)]),u("div",Nw,[u("button",{class:"btn btn-sm",onClick:L[5]||(L[5]=X=>s("cancel"))},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:D},"保存")])],8,Pw)])):Se("",!0)]),_:1})]))}}),Bw=Gt(Vw,[["__scopeId","data-v-f383b0a6"]]),hf=15e4;function Ho(e){const t=new Uint8Array(e);let n="";for(let s=0;s{n.value&&(Jo(),n.value=!1,y.value=[],k.value={},We("长时间未操作,密码库已自动锁定"))},O_)}function $(){n.value&&Z()}fn(async()=>{t.value=await mf(),window.addEventListener("click",$),window.addEventListener("keydown",$),n.value&&Z()}),dr(()=>{window.removeEventListener("click",$),window.removeEventListener("keydown",$),ae!==null&&window.clearTimeout(ae)});const x=it(()=>{const ne=m.value.trim().toLowerCase();return ne?y.value.filter(F=>(F.system+" "+F.account+" "+(F.remark||"")).toLowerCase().includes(ne)):y.value});async function le(){if(!s.value){if(c.value="",!o.value){c.value="请输入主密码";return}if(o.value.length<6){c.value="主密码至少 6 位";return}if(o.value!==a.value){c.value="两次输入的主密码不一致";return}s.value=!0;try{await qw(o.value),o.value="",a.value="",n.value=!0,Z(),await de(),We("主密码已设置,密码库已解锁")}catch(ne){c.value=ne instanceof Error?ne.message:"设置失败"}s.value=!1}}async function ke(){if(!s.value){if(h.value="",!d.value){h.value="请输入主密码";return}s.value=!0;try{await Hw(d.value),d.value="",n.value=!0,Z(),await de()}catch(ne){h.value=ne instanceof Error?ne.message:"解锁失败"}s.value=!1}}function J(){Jo(),n.value=!1,y.value=[],k.value={},ae!==null&&window.clearTimeout(ae),We("密码库已锁定")}async function xe(ne){const F=ne.id;if(k.value[F]){k.value[F]=!1;return}try{ne.passwordPlain=await ca(F),k.value[F]=!0}catch(fe){We(fe instanceof Error?fe.message:"解密失败")}}async function Ve(ne){try{const F=await ca(ne.id);await Pa(F),We("密码已复制")}catch(F){We(F instanceof Error?F.message:"复制失败")}}async function nt(ne){await Pa(ne.account),We("账号已复制")}function qe(){T.value=null,L.value={system:"",account:"",password:"",remark:""},D.value=!0}async function He(ne){try{const F=await ca(ne.id);T.value=ne.id,L.value={system:ne.system,account:ne.account,password:F,remark:ne.remark||""},D.value=!0}catch(F){We(F instanceof Error?F.message:"解密失败")}}async function ge(ne){const F=T.value??void 0;await Yw(ne,F),D.value=!1,await de(),We(F?"账号已更新":"账号已添加")}async function Oe(){X.value&&X.value.id&&(await Jw(X.value.id),We("账号已删除")),X.value=null,await de()}function Fe(){Q.value="",E.value="",N.value="",G.value="",ce.value=!0}async function je(){G.value="";try{const ne=await Xw(Q.value,E.value);ce.value=!1,Q.value="",E.value="",N.value="",We("主密码已修改,"+ne+" 条账号密码已重新加密")}catch(ne){G.value=ne instanceof Error?ne.message:"修改失败"}}return(ne,F)=>(K(),H("div",Zw,[t.value===null?(K(),H("div",e_,"加载中")):n.value?(K(),H(Re,{key:2},[u("div",a_,[u("div",l_,[Te(lt,{name:"search",size:14,class:"search-icon"}),Ee(u("input",{class:"input","onUpdate:modelValue":F[3]||(F[3]=fe=>m.value=fe),placeholder:"搜索系统名称、账号或备注"},null,512),[[De,m.value]])]),F[16]||(F[16]=u("span",{class:"flex1"},null,-1)),u("button",{class:"btn btn-sm",onClick:Fe},"修改主密码"),u("button",{class:"btn btn-sm",onClick:J},"锁定"),u("button",{class:"btn btn-primary btn-sm",onClick:qe},"新增账号")]),u("div",u_,[u("table",c_,[F[18]||(F[18]=u("thead",null,[u("tr",null,[u("th",null,"系统名称"),u("th",null,"账号"),u("th",null,"密码"),u("th",null,"备注"),u("th",{class:"th-ops"},"操作")])],-1)),u("tbody",null,[(K(!0),H(Re,null,ut(x.value,fe=>(K(),H("tr",{key:fe.id},[u("td",f_,re(fe.system),1),u("td",null,[u("span",{class:"copyable",title:"点击复制账号",onClick:Ke=>nt(fe)},re(fe.account),9,d_)]),u("td",null,[u("div",p_,[u("span",h_,re(k.value[fe.id]?fe.passwordPlain:"........"),1),u("button",{class:"btn btn-xs",onClick:Ke=>xe(fe)},re(k.value[fe.id]?"隐藏":"显示"),9,v_),u("button",{class:"btn btn-xs",onClick:Ke=>Ve(fe)},"复制",8,m_)])]),u("td",y_,re(fe.remark||"--"),1),u("td",null,[u("div",g_,[u("button",{class:"btn btn-xs",onClick:Ke=>He(fe)},"编辑",8,b_),u("button",{class:"btn btn-xs",onClick:Ke=>X.value=fe},"删除",8,w_)])])]))),128)),x.value.length?Se("",!0):(K(),H("tr",__,[...F[17]||(F[17]=[u("td",{colspan:"5",class:"empty muted"},"暂无账号,点击右上角新增",-1)])]))])])]),u("div",k_,"共 "+re(y.value.length)+" 条账号记录 · 密码以 AES-256-GCM 加密存储于本机",1)],64)):(K(),H("div",t_,[u("div",n_,[Te(lt,{name:"lock",size:26})]),t.value===!1?(K(),H(Re,{key:0},[F[12]||(F[12]=u("div",{class:"lock-title"},"设置主密码",-1)),F[13]||(F[13]=u("div",{class:"muted lock-tip"},"主密码用于加密保存在本机的账号密码,遗忘后无法找回,请务必牢记",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[0]||(F[0]=fe=>o.value=fe),placeholder:"设置主密码(至少 6 位)",onKeydown:jt(le,["enter"])},null,544),[[De,o.value]]),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[1]||(F[1]=fe=>a.value=fe),placeholder:"再次输入主密码",onKeydown:jt(le,["enter"])},null,544),[[De,a.value]]),c.value?(K(),H("div",r_,re(c.value),1)):Se("",!0),u("button",{class:"btn btn-primary lock-btn",disabled:s.value,onClick:le},"完成设置并解锁",8,s_)],64)):(K(),H(Re,{key:1},[F[14]||(F[14]=u("div",{class:"lock-title"},"密码库已锁定",-1)),F[15]||(F[15]=u("div",{class:"muted lock-tip"},"输入主密码解锁后查看与复制密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[2]||(F[2]=fe=>d.value=fe),placeholder:"主密码",onKeydown:jt(ke,["enter"])},null,544),[[De,d.value]]),h.value?(K(),H("div",o_,re(h.value),1)):Se("",!0),u("button",{class:"btn btn-primary lock-btn",disabled:s.value,onClick:ke},"解锁",8,i_)],64))])),Te(Bw,{open:D.value,title:T.value?"编辑账号":"新增账号",initial:L.value,onCancel:F[4]||(F[4]=fe=>D.value=!1),onSave:ge},null,8,["open","title","initial"]),Te(ur,{open:!!X.value,title:"删除确认",message:X.value?"将删除系统「"+X.value.system+"」的账号记录。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:F[5]||(F[5]=fe=>X.value=null),onConfirm:Oe},null,8,["open","message"]),(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[ce.value?(K(),H("div",{key:0,class:"mask",onClick:F[11]||(F[11]=Mr(fe=>ce.value=!1,["self"]))},[u("div",x_,[u("div",C_,[F[19]||(F[19]=u("span",{class:"dialog-title"},"修改主密码",-1)),u("button",{class:"icon-btn",title:"关闭",onClick:F[6]||(F[6]=fe=>ce.value=!1)},[Te(lt,{name:"close",size:16})])]),u("div",S_,[u("div",E_,[F[20]||(F[20]=u("label",null,"旧主密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[7]||(F[7]=fe=>Q.value=fe)},null,512),[[De,Q.value]])]),u("div",$_,[F[21]||(F[21]=u("label",null,"新主密码(至少 6 位)",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[8]||(F[8]=fe=>E.value=fe)},null,512),[[De,E.value]])]),u("div",A_,[F[22]||(F[22]=u("label",null,"确认新主密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[9]||(F[9]=fe=>N.value=fe)},null,512),[[De,N.value]])]),G.value?(K(),H("div",P_,re(G.value),1)):Se("",!0),F[23]||(F[23]=u("div",{class:"muted vp-tip"},"确认后所有账号密码将使用新主密码重新加密",-1))]),u("div",T_,[u("button",{class:"btn btn-sm",onClick:F[10]||(F[10]=fe=>ce.value=!1)},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:je},"确认修改")])])])):Se("",!0)]),_:1})]))]))}}),I_=Gt(M_,[["__scopeId","data-v-6820bc9c"]]);function j_(e){return'"'+(e==null?"":String(e)).replace(/"/g,'""')+'"'}async function Iu(e,t){const s="\uFEFF"+t.map(d=>d.map(j_).join(",")).join(`\r + `+v:""),this.inner=v||null):typeof p=="object"&&(this.message="".concat(p.name," ").concat(p.message),this.inner=p):(this.message=F[i]||l,this.inner=null)}return X(f).from(Jt),r[i]=f,r},{}),w=(Ie.Syntax=SyntaxError,Ie.Type=TypeError,Ie.Range=RangeError,ne.reduce(function(r,i){return r[i+"Error"]=Ie[i],r},{}));ne=Je.reduce(function(r,i){return["Syntax","Type","Range"].indexOf(i)===-1&&(r[i+"Error"]=Ie[i]),r},{});function g(){}function P(r){return r}function ie(r,i){return r==null||r===P?i:function(l){return i(r(l))}}function se(r,i){return function(){r.apply(this,arguments),i.apply(this,arguments)}}function ue(r,i){return r===g?i:function(){var l=r.apply(this,arguments),f=(l!==void 0&&(arguments[0]=l),this.onsuccess),p=this.onerror,v=(this.onsuccess=null,this.onerror=null,i.apply(this,arguments));return f&&(this.onsuccess=this.onsuccess?se(f,this.onsuccess):f),p&&(this.onerror=this.onerror?se(p,this.onerror):p),v!==void 0?v:l}}function ye(r,i){return r===g?i:function(){r.apply(this,arguments);var l=this.onsuccess,f=this.onerror;this.onsuccess=this.onerror=null,i.apply(this,arguments),l&&(this.onsuccess=this.onsuccess?se(l,this.onsuccess):l),f&&(this.onerror=this.onerror?se(f,this.onerror):f)}}function oe(r,i){return r===g?i:function(){var l=r.apply(this,arguments),f=(h(arguments[0],l),this.onsuccess),p=this.onerror,v=(this.onsuccess=null,this.onerror=null,i.apply(this,arguments));return f&&(this.onsuccess=this.onsuccess?se(f,this.onsuccess):f),p&&(this.onerror=this.onerror?se(p,this.onerror):p),l===void 0?v===void 0?void 0:v:h(l,v)}}function we(r,i){return r===g?i:function(){return i.apply(this,arguments)!==!1&&r.apply(this,arguments)}}function W(r,i){return r===g?i:function(){var l=r.apply(this,arguments);if(l&&typeof l.then=="function"){for(var f=this,p=arguments.length,v=new Array(p);p--;)v[p]=arguments[p];return l.then(function(){return i.apply(f,v)})}return i.apply(this,arguments)}}ne.ModifyError=ct,ne.DexieError=fe,ne.BulkError=ht;var q=typeof location<"u"&&/^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href);function Y(r){q=r}var $e={},Ne=100,Xe=typeof Promise>"u"?[]:(Je=Promise.resolve(),typeof crypto<"u"&&crypto.subtle?[Xe=crypto.subtle.digest("SHA-512",new Uint8Array([0])),y(Xe),Je]:[Je,y(Je),Je]),Je=Xe[0],Br=Xe[1],Br=Br&&Br.then,Qe=Je&&Je.constructor,vt=!!Xe[2],_t=function(r,i){Hn.push([r,i]),Bt&&(queueMicrotask(Af),Bt=!1)},Xt=!0,Bt=!0,Zt=[],pr=[],Ot=P,$t={id:"global",global:!0,ref:0,unhandleds:[],onunhandled:g,pgp:!1,env:{},finalize:g},Me=$t,Hn=[],hr=0,Ws=[];function Ce(r){if(typeof this!="object")throw new TypeError("Promises must be constructed via new");this._listeners=[],this._lib=!1;var i=this._PSD=Me;if(typeof r!="function"){if(r!==$e)throw new TypeError("Not a function");this._state=arguments[1],this._value=arguments[2],this._state===!1&&bi(this,this._value)}else this._state=null,this._value=null,++i.ref,function l(f,p){try{p(function(v){if(f._state===null){if(v===f)throw new TypeError("A promise cannot be resolved with itself.");var b=f._lib&&Rr();v&&typeof v.then=="function"?l(f,function(_,S){v instanceof Ce?v._then(_,S):v.then(_,S)}):(f._state=!0,f._value=v,ll(f)),b&&Lr()}},bi.bind(null,f))}catch(v){bi(f,v)}}(this,r)}var gi={get:function(){var r=Me,i=Js;function l(f,p){var v=this,b=!r.global&&(r!==Me||i!==Js),_=b&&!zn(),S=new Ce(function(B,O){wi(v,new al(cl(f,r,b,_),cl(p,r,b,_),B,O,r))});return this._consoleTask&&(S._consoleTask=this._consoleTask),S}return l.prototype=$e,l},set:function(r){L(this,"then",r&&r.prototype===$e?gi:{get:function(){return r},set:gi.set})}};function al(r,i,l,f,p){this.onFulfilled=typeof r=="function"?r:null,this.onRejected=typeof i=="function"?i:null,this.resolve=l,this.reject=f,this.psd=p}function bi(r,i){var l,f;pr.push(i),r._state===null&&(l=r._lib&&Rr(),i=Ot(i),r._state=!1,r._value=i,f=r,Zt.some(function(p){return p._value===f._value})||Zt.push(f),ll(r),l)&&Lr()}function ll(r){var i=r._listeners;r._listeners=[];for(var l=0,f=i.length;l{for(var b=Zt.length;b;)if(Zt[--b]._value===v._value)return Zt.splice(b,1)})(i),l.resolve(f)}catch(v){l.reject(v)}finally{--hr==0&&_i(),--l.psd.ref||l.psd.finalize()}}function Af(){vr($t,function(){Rr()&&Lr()})}function Rr(){var r=Xt;return Bt=Xt=!1,r}function Lr(){var r,i,l;do for(;0.",fl="String expected.",Qs="__dbnames",xi="readonly",Ci="readwrite";function yr(r,i){return r?i?function(){return r.apply(this,arguments)&&i.apply(this,arguments)}:r:i}var dl={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function Zs(r){return typeof r!="string"||/\./.test(r)?function(i){return i}:function(i){return i[r]===void 0&&r in i&&delete(i=xe(i))[r],i}}function pl(){throw Ie.Type("Entity instances must never be new:ed. Instances are generated by the framework bypassing the constructor.")}function tt(r,i){try{var l=hl(r),f=hl(i);if(l!==f)return l==="Array"?1:f==="Array"?-1:l==="binary"?1:f==="binary"?-1:l==="string"?1:f==="string"?-1:l==="Date"?1:f!=="Date"?NaN:-1;switch(l){case"number":case"Date":case"string":return i{var _=O,S=b;if(typeof S!="function"&&S!==null)throw new TypeError("Class extends value "+String(S)+" is not a constructor or null");function B(){this.constructor=_}function O(){return b!==null&&b.apply(this,arguments)||this}return n(_,S),_.prototype=S===null?Object.create(S):(B.prototype=S.prototype,new B),Object.defineProperty(O.prototype,"db",{get:function(){return i},enumerable:!1,configurable:!0}),O.prototype.table=function(){return l},O})(r)),new Set),p=r.prototype;p;p=y(p))Object.getOwnPropertyNames(p).forEach(function(b){return f.add(b)});function v(b){if(!b)return b;var _,S=Object.create(r.prototype);for(_ in b)if(!f.has(_))try{S[_]=b[_]}catch{}return S}return this.schema.readHook&&this.hook.reading.unsubscribe(this.schema.readHook),this.schema.readHook=v,this.hook("reading",v),r},dt.prototype.defineClass=function(){return this.mapToClass(function(r){h(this,r)})},dt.prototype.add=function(r,i){var l=this,f=this.schema.primKey,p=f.auto,v=f.keyPath,b=r;return v&&p&&(b=Zs(v)(r)),this._trans("readwrite",function(_){return l.core.mutate({trans:_,type:"add",keys:i!=null?[i]:null,values:[b]})}).then(function(_){return _.numFailures?Ce.reject(_.failures[0]):_.lastResult}).then(function(_){if(v)try{Z(r,v,_)}catch{}return _})},dt.prototype.upsert=function(r,i){var l=this,f=this.schema.primKey.keyPath;return this._trans("readwrite",function(p){return l.core.get({trans:p,key:r}).then(function(v){var b=v??{};return yl(b,i),f&&Z(b,f,r),l.core.mutate({trans:p,type:"put",values:[b],keys:[r],upsert:!0,updates:{keys:[r],changeSpecs:[i]}}).then(function(_){return _.numFailures?Ce.reject(_.failures[0]):!!v})})})},dt.prototype.update=function(r,i){return typeof r!="object"||d(r)?this.where(":id").equals(r).modify(i):(r=ae(r,this.schema.primKey.keyPath))===void 0?Ct(new Ie.InvalidArgument("Given object does not contain its primary key")):this.where(":id").equals(r).modify(i)},dt.prototype.put=function(r,i){var l=this,f=this.schema.primKey,p=f.auto,v=f.keyPath,b=r;return v&&p&&(b=Zs(v)(r)),this._trans("readwrite",function(_){return l.core.mutate({trans:_,type:"put",values:[b],keys:i!=null?[i]:null})}).then(function(_){return _.numFailures?Ce.reject(_.failures[0]):_.lastResult}).then(function(_){if(v)try{Z(r,v,_)}catch{}return _})},dt.prototype.delete=function(r){var i=this;return this._trans("readwrite",function(l){return i.core.mutate({trans:l,type:"delete",keys:[r]}).then(function(f){return eo(i,[r],f)}).then(function(f){return f.numFailures?Ce.reject(f.failures[0]):void 0})})},dt.prototype.clear=function(){var r=this;return this._trans("readwrite",function(i){return r.core.mutate({trans:i,type:"deleteRange",range:dl}).then(function(l){return eo(r,null,l)})}).then(function(i){return i.numFailures?Ce.reject(i.failures[0]):void 0})},dt.prototype.bulkGet=function(r){var i=this;return this._trans("readonly",function(l){return i.core.getMany({keys:r,trans:l}).then(function(f){return f.map(function(p){return i.hook.reading.fire(p)})})})},dt.prototype.bulkAdd=function(r,i,l){var f=this,p=Array.isArray(i)?i:void 0,v=(l=l||(p?void 0:i))?l.allKeys:void 0;return this._trans("readwrite",function(b){var _=f.schema.primKey,B=_.auto,_=_.keyPath;if(_&&p)throw new Ie.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys");if(p&&p.length!==r.length)throw new Ie.InvalidArgument("Arguments objects and keys must have the same length");var S=r.length,B=_&&B?r.map(Zs(_)):r;return f.core.mutate({trans:b,type:"add",keys:p,values:B,wantResults:v}).then(function(O){var C=O.numFailures,A=O.failures;if(C===0)return v?O.results:O.lastResult;throw new ht("".concat(f.name,".bulkAdd(): ").concat(C," of ").concat(S," operations failed"),A)})})},dt.prototype.bulkPut=function(r,i,l){var f=this,p=Array.isArray(i)?i:void 0,v=(l=l||(p?void 0:i))?l.allKeys:void 0;return this._trans("readwrite",function(b){var _=f.schema.primKey,B=_.auto,_=_.keyPath;if(_&&p)throw new Ie.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys");if(p&&p.length!==r.length)throw new Ie.InvalidArgument("Arguments objects and keys must have the same length");var S=r.length,B=_&&B?r.map(Zs(_)):r;return f.core.mutate({trans:b,type:"put",keys:p,values:B,wantResults:v}).then(function(O){var C=O.numFailures,A=O.failures;if(C===0)return v?O.results:O.lastResult;throw new ht("".concat(f.name,".bulkPut(): ").concat(C," of ").concat(S," operations failed"),A)})})},dt.prototype.bulkUpdate=function(r){var i=this,l=this.core,f=r.map(function(b){return b.key}),p=r.map(function(b){return b.changes}),v=[];return this._trans("readwrite",function(b){return l.getMany({trans:b,keys:f,cache:"clone"}).then(function(_){var S=[],B=[],O=(r.forEach(function(C,A){var R=C.key,I=C.changes,M=_[A];if(M){for(var j=0,z=Object.keys(I);jU+ee&&j(U+B)})})}var z=Fr(l)&&l.limit===1/0&&(typeof r!="function"||I)&&{index:l.index,range:l.range};return j(0).then(function(){if(0{for(var Ue=Math.min(me.length,Pe.length),Ye=-1,Ze=0;Ze=A})).length===0?Ce.resolve():(j.forEach(function(U){M.push(function(){var ee,pe,ve,_e=z,me=U._cfg.dbschema,Ae=(uo(C,_e,I),uo(C,me,I),z=C._dbSchema=me,Mi(_e,me)),be=(Ae.add.forEach(function(Pe){Ii(I,Pe[0],Pe[1].primKey,Pe[1].indexes)}),Ae.change.forEach(function(Pe){if(Pe.recreate)throw new Ie.Upgrade("Not yet support for changing primary key");var he=I.objectStore(Pe.name);Pe.add.forEach(function(Be){return ao(he,Be)}),Pe.change.forEach(function(Be){he.deleteIndex(Be.name),ao(he,Be)}),Pe.del.forEach(function(Be){return he.deleteIndex(Be)})}),U._cfg.contentUpgrade);if(be&&U._cfg.version>A)return oo(C,I),R._memoizedTables={},ee=$(me),Ae.del.forEach(function(Pe){ee[Pe]=_e[Pe]}),Oi(C,[C.Transaction.prototype]),io(C,[C.Transaction.prototype],c(ee),ee),R.schema=ee,(pe=je(be))&&Kr(),me=Ce.follow(function(){var Pe;(ve=be(R))&&pe&&(Pe=zn.bind(null,null),ve.then(Pe,Pe))}),ve&&typeof ve.then=="function"?Ce.resolve(ve):me.then(function(){return ve})}),M.push(function(ee){var pe,ve,_e=U._cfg.dbschema;pe=_e,ve=ee,[].slice.call(ve.db.objectStoreNames).forEach(function(me){return pe[me]==null&&ve.db.deleteObjectStore(me)}),Oi(C,[C.Transaction.prototype]),io(C,[C.Transaction.prototype],C._storeNames,C._dbSchema),R.schema=C._dbSchema}),M.push(function(ee){C.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(C.idbdb.version/10)===U._cfg.version?(C.idbdb.deleteObjectStore("$meta"),delete C._dbSchema.$meta,C._storeNames=C._storeNames.filter(function(pe){return pe!=="$meta"})):ee.objectStore("$meta").put(U._cfg.version,"version"))})}),function U(){return M.length?Ce.resolve(M.shift()(R.idbtrans)).then(U):Ce.resolve()}().then(function(){El(z,I)}))}).catch(b);var S,B;c(p).forEach(function(O){Ii(l,O,p[O].primKey,p[O].indexes)}),oo(r,l),Ce.follow(function(){return r.on.populate.fire(v)}).catch(b)})}function Vf(r,i){El(r._dbSchema,i),i.db.version%10!=0||i.objectStoreNames.contains("$meta")||i.db.createObjectStore("$meta").add(Math.ceil(i.db.version/10-1),"version");var l=lo(0,r.idbdb,i);uo(r,r._dbSchema,i);for(var f=0,p=Mi(l,r._dbSchema).change;f{if(b.change.length||b.recreate)return console.warn("Unable to patch indexes of table ".concat(b.name," because it has changes on the type of index or primary key.")),{value:void 0};var _=i.objectStore(b.name);b.add.forEach(function(S){q&&console.debug("Dexie upgrade patch: Creating missing index ".concat(b.name,".").concat(S.src)),ao(_,S)})})(p[f]);if(typeof v=="object")return v.value}}function Mi(r,i){var l,f={del:[],add:[],change:[]};for(l in r)i[l]||f.del.push(l);for(l in i){var p=r[l],v=i[l];if(p){var b={name:l,def:v,recreate:!1,del:[],add:[],change:[]};if(""+(p.primKey.keyPath||"")!=""+(v.primKey.keyPath||"")||p.primKey.auto!==v.primKey.auto)b.recreate=!0,f.change.push(b);else{var _=p.idxByName,S=v.idxByName,B=void 0;for(B in _)S[B]||b.del.push(B);for(B in S){var O=_[B],C=S[B];O?O.src!==C.src&&b.change.push(C):b.add.push(C)}(0{var r,i,l;return typeof FinalizationRegistry<"u"&&typeof WeakRef<"u"?(r=new Set,i=new FinalizationRegistry(function(f){r.delete(f)}),{toArray:function(){return Array.from(r).map(function(f){return f.deref()}).filter(function(f){return f!==void 0})},add:function(f){var p=new WeakRef(f._novip);r.add(p),i.register(f._novip,p,p),r.size>f._options.maxConnections&&(p=r.values().next().value,r.delete(p),i.unregister(p))},remove:function(f){if(f)for(var p=r.values(),v=p.next();!v.done;){var b=v.value;if(b.deref()===f._novip)return r.delete(b),void i.unregister(b);v=p.next()}}}):(l=[],{toArray:function(){return l},add:function(f){l.push(f._novip)},remove:function(f){f&&(f=l.indexOf(f._novip))!==-1&&l.splice(f,1)}})})();function ji(r,i){var l=r._dbNamesDB;return l||(l=r._dbNamesDB=new Mn(Qs,{addons:[],indexedDB:r,IDBKeyRange:i})).version(1).stores({dbnames:"name"}),l.table("dbnames")}function Di(r){return r&&typeof r.databases=="function"}function Ri(r){return Wn(function(){return Me.letThrough=!0,r()})}function Li(r){return!("from"in r)}var Dt=function(r,i){var l;if(!this)return l=new Dt,r&&"d"in r&&h(l,r),l;h(this,arguments.length?{d:1,from:r,to:1Math.pow(2,62)?0:j.oldVersion,C=z<1,r.idbdb=M.result,v&&Vf(r,O),Nf(r,z/10,O,R))},R),M.onsuccess=mt(function(){O=null;var j,z,U,ee,pe,ve,_e=r.idbdb=M.result,me=E(_e.objectStoreNames);if(0"u"?Ce.resolve():!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise(function(A){function R(){return indexedDB.databases().finally(A)}S=setInterval(R,100),R()}).finally(function(){return clearInterval(S)}):Promise.resolve()).then(_)]).then(function(){return b(),i.onReadyBeingFired=[],Ce.resolve(Ri(function(){return r.on.ready.fire(r.vip)})).then(function A(){var R;if(0i.limit?f.length=i.limit:r.length===i.limit&&f.length{if(l===void 0)return f!==void 0?-1:0;if(f===void 0)return 1;if((l=tt(l,f))===0){if(p&&v)return 0;if(p)return 1;if(v)return-1}return l})(r.lower,i.lower,r.lowerOpen,i.lowerOpen)<=0&&0<=((l,f,p,v)=>{if(l===void 0)return f!==void 0?1:0;if(f===void 0)return-1;if((l=tt(l,f))===0){if(p&&v)return 0;if(p)return-1;if(v)return 1}return l})(r.upper,i.upper,r.upperOpen,i.upperOpen)}function Yf(r,i,l,f){r.subscribers.add(l),f.addEventListener("abort",function(){var p,v;r.subscribers.delete(l),r.subscribers.size===0&&(p=r,v=i,setTimeout(function(){p.subscribers.size===0&&ge(v,p)},3e3))})}var Jf={stack:"dbcore",level:0,name:"Cache",create:function(r){var i=r.schema.name;return s(s({},r),{transaction:function(l,f,p){var v,b,_=r.transaction(l,f,p);return f==="readwrite"&&(p=(v=new AbortController).signal,_.addEventListener("abort",(b=function(S){return function(){if(v.abort(),f==="readwrite"){for(var B=new Set,O=0,C=l;O{var z=gr["idb://".concat(R,"/").concat(I)];if(!z)return[];if(!(R=z.queries[M]))return[null,!1,z,null];var U=R[(j.query?j.query.index.name:null)||""];if(!U)return[null,!1,z,null];switch(M){case"query":var ee=(pe=j.direction)!=null?pe:"next",pe=U.find(function(ve){var _e;return ve.req.limit===j.limit&&ve.req.values===j.values&&((_e=ve.req.direction)!=null?_e:"next")===ee&&Ll(ve.req.query.range,j.query.range)});return pe?[pe,!0,z,U]:[U.find(function(ve){var _e;return("limit"in ve.req?ve.req.limit:1/0)>=j.limit&&((_e=ve.req.direction)!=null?_e:"next")===ee&&(!j.values||ve.req.values)&&Gf(ve.req.query.range,j.query.range)}),!1,z,U];case"count":return pe=U.find(function(ve){return Ll(ve.req.query.range,j.query.range)}),[pe,!!pe,z,U]}})(i,l,"query",v),A=C[0],B=C[2],O=C[3],A&&C[1]?A.obsSet=v.obsSet:(C=f.query(v).then(function(R){var I=R.result;if(A&&(A.res=I),b){for(var M=0,j=I.length;M{var pe=Rr();try{v&&Kr();var ve=Wn(r,ee);return ve=v?ve.finally(zn):ve}finally{pe&&Lr()}})(z={subscr:j,signal:b.signal,requery:A,querier:r,trans:null}),C||(Jn.storagemutated.subscribe(I),C=!0),Promise.resolve(U).then(function(ee){l=!0,i=ee,_||z.signal.aborted||(R()||(B=j,R())?A():(S={},ki(function(){return!_&&p.next&&p.next(ee)})))},function(ee){l=!1,["DatabaseClosedError","AbortError"].includes(ee==null?void 0:ee.name)||_||ki(function(){_||p.error&&p.error(ee)})}))};return setTimeout(A,0),O});return f.hasValue=function(){return l},f.getValue=function(){return i},f}var br=Mn;function zi(r){var i=Xn;try{Xn=!0,Jn.storagemutated.fire(r),Vi(r,!0)}finally{Xn=i}}D(br,s(s({},ne),{delete:function(r){return new br(r,{addons:[]}).delete()},exists:function(r){return new br(r,{addons:[]}).open().then(function(i){return i.close(),!0}).catch("NoSuchDatabaseError",function(){return!1})},getDatabaseNames:function(r){try{return i=br.dependencies,l=i.indexedDB,i=i.IDBKeyRange,(Di(l)?Promise.resolve(l.databases()).then(function(f){return f.map(function(p){return p.name}).filter(function(p){return p!==Qs})}):ji(l,i).toCollection().primaryKeys()).then(r)}catch{return Ct(new Ie.MissingAPI)}var i,l},defineClass:function(){return function(r){h(this,r)}},ignoreTransaction:function(r){return Me.trans?vr(Me.transless||$t,r):r()},vip:Ri,async:function(r){return function(){try{var i=Bi(r.apply(this,arguments));return i&&typeof i.then=="function"?i:Ce.resolve(i)}catch(l){return Ct(l)}}},spawn:function(r,i,l){try{var f=Bi(r.apply(l,i||[]));return f&&typeof f.then=="function"?f:Ce.resolve(f)}catch(p){return Ct(p)}},currentTransaction:{get:function(){return Me.trans||null}},waitFor:function(r,i){return r=Ce.resolve(typeof r=="function"?br.ignoreTransaction(r):r).timeout(i||6e4),Me.trans?Me.trans.waitFor(r):r},Promise:Ce,debug:{get:function(){return q},set:function(r){Y(r)}},derive:X,extend:h,props:D,override:N,Events:os,on:Jn,liveQuery:Kl,extendObservabilitySet:fo,getByKeyPath:ae,setByKeyPath:Z,delByKeyPath:function(r,i){typeof i=="string"?Z(r,i,void 0):"length"in i&&[].map.call(i,function(l){Z(r,l,void 0)})},shallowClone:$,deepClone:xe,getObjectDiff:Ui,cmp:tt,asap:de,minKey:-1/0,addons:[],connections:{get:cs.toArray},errnames:Yt,dependencies:mo,cache:gr,semVer:"4.4.6",version:"4.4.6".split(".").map(function(r){return parseInt(r)}).reduce(function(r,i,l){return r+i/Math.pow(10,2*l)})})),br.maxKey=ls(br.dependencies.IDBKeyRange),typeof dispatchEvent<"u"&&typeof addEventListener<"u"&&(Jn(so,function(r){Xn||(r=new CustomEvent($i,{detail:r}),Xn=!0,dispatchEvent(r),Xn=!1)}),addEventListener($i,function(r){r=r.detail,Xn||zi(r)}));var Ur,Xn=!1,Fl=function(){};return typeof BroadcastChannel<"u"&&((Fl=function(){(Ur=new BroadcastChannel($i)).onmessage=function(r){return r.data&&zi(r.data)}})(),typeof Ur.unref=="function"&&Ur.unref(),Jn(so,function(r){Xn||Ur.postMessage(r)})),typeof addEventListener<"u"&&(addEventListener("pagehide",function(r){if(!Mn.disableBfCache&&r.persisted){q&&console.debug("Dexie: handling persisted pagehide"),Ur!=null&&Ur.close();for(var i=0,l=cs.toArray();in.key===e);return t?t.label:"其他"}const Yh={class:"dialog",role:"dialog","aria-label":"编辑工作记录"},Jh={class:"dialog-head"},Xh={key:0,class:"muted dialog-sub"},Qh={class:"dialog-body"},Zh={class:"form-grid"},ev={class:"field span2"},tv={key:0,class:"form-error"},nv={class:"field"},rv=["value"],sv={class:"field"},ov=["value"],iv={class:"field"},av={class:"field"},lv={class:"field span2"},uv={class:"field"},cv={class:"field"},fv={class:"dialog-btns"},dv=Vt({__name:"EditLogDialog",props:{open:{type:Boolean},item:{},projects:{},date:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,s=t,o=V(""),a=V(null),c=V("dev"),d=V(null),h=V(""),y=V(""),m=V(0),k=V(0),D=V(""),T=V(null),L=it(()=>{var N;const Q=n.projects.filter(G=>G.archived!==1),E=(N=n.item)==null?void 0:N.project_id;if(E&&!Q.some(G=>G.id===E)){const G=n.projects.find(ae=>ae.id===E),de=Q.slice();return G&&de.unshift({...G,name:G.name+"(已归档)"}),de}return Q});function X(Q){n.open&&Q.key==="Escape"&&s("cancel")}gt(()=>n.open,async Q=>{var E;if(Q){const N=n.item;o.value=(N==null?void 0:N.content)??"",a.value=(N==null?void 0:N.project_id)??null,c.value=(N==null?void 0:N.category)??"dev",d.value=(N==null?void 0:N.minutes)??null,h.value=(N==null?void 0:N.takeaway)??"",y.value=(N==null?void 0:N.remark)??"",m.value=(N==null?void 0:N.is_milestone)??0,k.value=(N==null?void 0:N.needs_followup)??0,D.value="",window.addEventListener("keydown",X),await ts(),(E=T.value)==null||E.focus()}else window.removeEventListener("keydown",X)}),dr(()=>window.removeEventListener("keydown",X)),gt(o,()=>{D.value&&(D.value="")});function ce(){const Q=o.value.trim();if(!Q){D.value="请填写工作内容";return}if(!n.item||!n.item.id){s("cancel");return}s("save",{id:n.item.id,content:Q,project_id:a.value,category:c.value,minutes:d.value&&d.value>0?d.value:null,takeaway:h.value.trim()||null,remark:y.value.trim()||null,is_milestone:m.value?1:0,needs_followup:k.value?1:0})}return(Q,E)=>(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[e.open?(K(),H("div",{key:0,class:"mask",onClick:E[10]||(E[10]=Mr(N=>s("cancel"),["self"]))},[u("div",Yh,[u("div",Jh,[u("div",null,[E[11]||(E[11]=u("div",{class:"dialog-title"},"编辑工作记录",-1)),e.date?(K(),H("div",Xh,re(e.date),1)):Se("",!0)]),u("button",{class:"icon-btn",title:"关闭",onClick:E[0]||(E[0]=N=>s("cancel"))},[Te(lt,{name:"close",size:16})])]),u("div",Qh,[u("div",Zh,[u("div",ev,[E[12]||(E[12]=u("label",null,"工作内容(必填)",-1)),Ee(u("input",{ref_key:"contentInput",ref:T,class:et(["input",{invalid:D.value}]),"onUpdate:modelValue":E[1]||(E[1]=N=>o.value=N),onKeydown:jt(ce,["enter"])},null,34),[[De,o.value]]),D.value?(K(),H("div",tv,re(D.value),1)):Se("",!0)]),u("div",nv,[E[14]||(E[14]=u("label",null,"所属项目",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":E[2]||(E[2]=N=>a.value=N)},[E[13]||(E[13]=u("option",{value:null},"无项目",-1)),(K(!0),H(Re,null,ut(L.value,N=>(K(),H("option",{key:N.id,value:N.id},re(N.name),9,rv))),128))],512),[[Fn,a.value]])]),u("div",sv,[E[15]||(E[15]=u("label",null,"工作分类",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":E[3]||(E[3]=N=>c.value=N)},[(K(!0),H(Re,null,ut(Qt(Us),N=>(K(),H("option",{key:N.key,value:N.key},re(N.label),9,ov))),128))],512),[[Fn,c.value]])]),u("div",iv,[E[16]||(E[16]=u("label",null,"耗时(分钟)",-1)),Ee(u("input",{class:"input",type:"number",min:"0","onUpdate:modelValue":E[4]||(E[4]=N=>d.value=N),placeholder:"选填"},null,512),[[De,d.value,void 0,{number:!0}]])]),u("div",av,[E[17]||(E[17]=u("label",null,"主要收获",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":E[5]||(E[5]=N=>h.value=N),placeholder:"一句话:学到了什么"},null,512),[[De,h.value]])]),u("div",lv,[E[18]||(E[18]=u("label",null,"备注",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":E[6]||(E[6]=N=>y.value=N),placeholder:"背景、链接、未决事项(选填)"},null,512),[[De,y.value]])]),u("div",uv,[E[19]||(E[19]=u("label",null,"成果标记",-1)),u("button",{class:et(["toggle-btn",{on:m.value===1}]),onClick:E[7]||(E[7]=N=>m.value=m.value===1?0:1)},re(m.value===1?"已标记为成果":"未标记"),3)]),u("div",cv,[E[20]||(E[20]=u("label",null,"待跟进",-1)),u("button",{class:et(["toggle-btn",{onwarn:k.value===1}]),onClick:E[8]||(E[8]=N=>k.value=k.value===1?0:1)},re(k.value===1?"需要跟进":"无需跟进"),3)])])]),u("div",fv,[u("button",{class:"btn btn-sm",onClick:E[9]||(E[9]=N=>s("cancel"))},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:ce},"保存修改")])])])):Se("",!0)]),_:1})]))}}),pv=Gt(dv,[["__scopeId","data-v-63bc0b48"]]);function Ss(e){return e<10?"0"+e:String(e)}function Nn(e){return e.getFullYear()+"-"+Ss(e.getMonth()+1)+"-"+Ss(e.getDate())}function xt(){return Nn(new Date)}function wt(){const e=new Date;return Nn(e)+"T"+Ss(e.getHours())+":"+Ss(e.getMinutes())+":"+Ss(e.getSeconds())}function Vn(e){if(!e)return"--:--";const t=e.indexOf("T");return t>=0?e.slice(t+1,t+6):e.slice(0,5)}function rs(e){const t=e.split("-").map(Number);return new Date(t[0],t[1]-1,t[2])}function Kn(e,t){const n=rs(e);return n.setDate(n.getDate()+t),Nn(n)}function Uo(e,t){const n=rs(e),s=n.getDate();n.setDate(1),n.setMonth(n.getMonth()+t);const o=new Date(n.getFullYear(),n.getMonth()+1,0).getDate();return n.setDate(Math.min(s,o)),Nn(n)}function Es(e){const t=rs(e),n=(t.getDay()+6)%7;return t.setDate(t.getDate()-n),Nn(t)}function hv(e){const t=rs(e).getDay();return t===0||t===6}function vv(e,t){return Math.round((new Date(t).getTime()-new Date(e).getTime())/6e4)}function of(e){const t=rs(e),n=["周日","周一","周二","周三","周四","周五","周六"];return t.getFullYear()+" 年 "+(t.getMonth()+1)+" 月 "+t.getDate()+" 日 "+n[t.getDay()]}async function yt(e,t){const n=await te.setting.get(e);return n?n.value:t}async function kt(e,t){await te.setting.put({key:e,value:t})}async function jr(){const e=await Promise.all([yt("work_start","09:00"),yt("work_end","18:00"),yt("grace_minutes","10"),yt("lunch_minutes","60"),yt("remind_weekly","friday")]);return{work_start:e[0],work_end:e[1],grace_minutes:Number(e[2])||0,lunch_minutes:Number(e[3])||0,remind_weekly:e[4]}}async function mv(){const e=await yt("last_project",""),t=await yt("last_category","dev");return{project_id:e?Number(e):null,category:t||"dev"}}async function yv(){return yt("last_location","")}async function gv(e,t){const n=t.trim();await kt("last_location",n),n&&await qo(n);const s=await mn(e);s&&s.id?await te.attendance.update(s.id,{location:n||null}):n&&await te.attendance.add({date:e,clock_in_at:null,clock_out_at:null,kind:"normal",note:null,location:n,created_at:wt()})}async function Za(){const e=await yt("location_presets","");if(!e)return Pu.slice();try{const t=JSON.parse(e);if(Array.isArray(t))return t.filter(n=>typeof n=="string"&&n.trim()).map(n=>n.trim())}catch{}return Pu.slice()}async function af(e){const t=Array.from(new Set(e.map(n=>n.trim()).filter(Boolean)));await kt("location_presets",JSON.stringify(t))}async function qo(e){const t=e.trim();if(!t)return;const n=await Za();n.includes(t)||await af([...n,t])}async function Ks(e=!1){const t=await te.project.orderBy("name").toArray();return e?t:t.filter(n=>n.archived!==1)}async function bv(e){await te.project.add({name:e.trim(),archived:0,created_at:wt()})}async function wv(e,t){await te.project.update(e,{name:t.trim()})}async function _v(e,t){await te.project.update(e,{archived:t?1:0})}async function mn(e){return te.attendance.where("date").equals(e).first()}async function lf(e,t){const n=((t===void 0?await yt("last_location",""):t)||"").trim(),s=await mn(e);if(s&&s.id){if(!s.clock_in_at){const o={clock_in_at:wt()};n&&(o.location=n),await te.attendance.update(s.id,o)}n&&(await kt("last_location",n),await qo(n));return}await te.attendance.add({date:e,clock_in_at:wt(),clock_out_at:null,kind:"normal",note:null,location:n||null,created_at:wt()}),n&&(await kt("last_location",n),await qo(n))}async function kv(e){const t=await mn(e);t&&t.id&&t.clock_in_at&&!t.clock_out_at&&await te.attendance.update(t.id,{clock_out_at:wt()})}async function xv(){const e=new Date,t=Nn(e);if(e.getHours()<4){const s=await mn(Kn(t,-1));if(s&&s.id&&s.clock_in_at&&!s.clock_out_at)return await te.attendance.update(s.id,{clock_out_at:wt()}),s.date}const n=await mn(t);if(n&&n.id&&n.clock_in_at&&!n.clock_out_at)return await te.attendance.update(n.id,{clock_out_at:wt()}),n.date;throw new Error("没有进行中的打卡")}async function Cv(e,t,n,s,o){(o||"").trim()&&await qo(o);const a=await mn(e),c={date:e,clock_in_at:t,clock_out_at:n,kind:"makeup",note:s||null,location:(o||"").trim()||null,created_at:wt()};a&&a.id?await te.attendance.update(a.id,c):await te.attendance.add(c)}async function Sv(e,t,n){const s=(n||"").trim();if(!s)return;const o=await mn(e);o&&o.id&&await te.attendance.update(o.id,{[t]:e+"T"+s+":00"})}async function di(e,t){return te.attendance.where("date").between(e,t,!0,!0).toArray()}async function Ev(e,t){const n=await mn(e);if(t){const s={date:e,kind:"leave",clock_in_at:null,clock_out_at:null,created_at:wt()};n&&n.id?await te.attendance.update(n.id,s):await te.attendance.add({...s,note:null,location:null})}else n&&n.id&&await te.attendance.update(n.id,{kind:"normal"})}async function $v(e){const t=await te.work_log.where("date").equals(e).first();return t||{id:await te.work_log.add({date:e,created_at:wt()}),date:e,created_at:wt()}}async function Av(e){return te.work_log.where("date").equals(e).first()}async function Pv(e){const t=await Av(e);return!t||!t.id?[]:(await te.log_item.where("work_log_id").equals(t.id).toArray()).sort((s,o)=>o.id-s.id)}async function Tv(e,t){const n=await $v(e);await te.log_item.add({work_log_id:n.id,content:t.content,project_id:t.project_id,category:t.category,minutes:t.minutes,is_milestone:0,needs_followup:0,takeaway:t.takeaway,remark:t.remark,sort_order:0,created_at:wt()}),await kt("last_project",t.project_id?String(t.project_id):""),await kt("last_category",t.category)}async function la(e,t){await te.log_item.update(e,t)}async function Ov(e){await te.log_item.delete(e)}async function pi(e,t){const n=await te.work_log.where("date").between(e,t,!0,!0).toArray();if(!n.length)return[];const s=new Map(n.map(a=>[a.id,a.date]));return(await te.log_item.where("work_log_id").anyOf(n.map(a=>a.id)).toArray()).map(a=>({...a,date:s.get(a.work_log_id)||""})).sort((a,c)=>a.date===c.date?a.id-c.id:a.datet.updated_at[c.id,c.date]));return(await te.log_item.toArray()).filter(c=>((c.content||"")+" "+(c.takeaway||"")+" "+(c.remark||"")).toLowerCase().includes(n)).sort((c,d)=>d.id-c.id).slice(0,t).map(c=>({...c,date:o.get(c.work_log_id)||""}))}async function Fv(e,t=4){const n=e.trim().toLowerCase();return n?(await te.memo.toArray()).filter(o=>((o.title||"")+" "+(o.content||"")).toLowerCase().includes(n)).sort((o,a)=>o.updated_at{await Promise.all([te.project.clear(),te.work_log.clear(),te.log_item.clear(),te.attendance.clear(),te.weekly_note.clear(),te.setting.clear(),te.memo.clear(),te.credential.clear(),te.table("transaction").clear()]),n.project&&n.project.length&&await te.project.bulkAdd(n.project),n.work_log&&n.work_log.length&&await te.work_log.bulkAdd(n.work_log),n.log_item&&n.log_item.length&&await te.log_item.bulkAdd(n.log_item),n.attendance&&n.attendance.length&&await te.attendance.bulkAdd(n.attendance),n.weekly_note&&n.weekly_note.length&&await te.weekly_note.bulkAdd(n.weekly_note),n.setting&&n.setting.length&&await te.setting.bulkAdd(n.setting),n.memo&&n.memo.length&&await te.memo.bulkAdd(n.memo),n.credential&&n.credential.length&&await te.credential.bulkAdd(n.credential),n.transaction&&n.transaction.length&&await te.table("transaction").bulkAdd(n.transaction)})}function Co(e){const t=e.split(":");return Number(t[0])*60+Number(t[1])}function qs(e,t,n,s){if(e&&e.kind==="leave")return{status:"leave",label:"请假",makeup:!1,workedMinutes:null};if(hv(t))return{status:"rest",label:"休息日",makeup:!1,workedMinutes:null};if(!e||!e.clock_in_at)return s?{status:"none",label:"未打卡",makeup:!1,workedMinutes:null}:{status:"absent",label:"缺勤",makeup:!!(e&&e.kind==="makeup"),workedMinutes:null};const o=e.kind==="makeup";if(!e.clock_out_at)return{status:"incomplete",label:s?"进行中":"未完成",makeup:o,workedMinutes:null};const a=Co(Vn(e.clock_in_at)),c=Co(Vn(e.clock_out_at)),d=Co(n.work_start),h=Co(n.work_end);let y="normal";!o&&a>d+n.grace_minutes?y="late":!o&&c{Po.value=Po.value.filter(n=>n.id!==t)},2e3)}function Gv(){return Po}const $a=V(null),Aa=V(null),Hs=V(0);function Sr(){Hs.value++}const Yv={class:"day-panel"},Jv={class:"dp-head"},Xv={class:"dp-date"},Qv={class:"card sec"},Zv={class:"att-grid"},em={class:"att-cell"},tm={key:0,class:"edit-row"},nm={key:1,class:"att-val"},rm={class:"att-cell"},sm={key:0,class:"edit-row"},om={key:1,class:"att-val"},im={class:"att-cell"},am=["list"],lm=["id"],um=["value"],cm={class:"att-cell"},fm={class:"att-val status-val"},dm={key:0,class:"tag"},pm={key:1,class:"muted"},hm={key:0,class:"att-note muted"},vm={class:"att-actions"},mm=["disabled"],ym=["disabled"],gm=["disabled"],bm=["disabled"],wm={key:0,class:"card sec makeup"},_m={class:"form-grid"},km={class:"field"},xm={class:"field"},Cm={class:"field span2"},Sm=["list"],Em={class:"field span2"},$m={key:0,class:"form-error"},Am={class:"form-footer"},Pm={class:"card sec"},Tm={class:"form-grid"},Om={class:"field span2"},Mm={key:0,class:"form-error"},Im={class:"field"},jm=["value"],Dm={class:"field"},Rm=["value"],Lm={class:"field"},Km={class:"field"},Fm={class:"field span2"},Nm={class:"form-footer"},Vm=["disabled"],Bm=["disabled"],Um={class:"list-sec"},qm={class:"sec-title"},Hm={key:0,class:"empty muted"},Wm={class:"item-main"},zm={class:"tag"},Gm=["onClick"],Ym={key:0,class:"muted item-meta"},Jm={key:1,class:"muted num item-meta"},Xm=["onClick"],Qm=["onClick"],Zm=["onClick"],ey=["onClick"],ty={key:0,class:"item-sub"},ny={key:0,class:"muted2"},ry={key:1,class:"muted"},sy={key:1,class:"dp-foot muted num"},oy=Vt({__name:"DayPanel",props:{date:{}},setup(e){const t=e,n=V(!0),s=V(null),o=V(void 0),a=V([]),c=V([]),d=V(""),h=V([]),y=it(()=>"loc-list-"+t.date),m=it(()=>t.date===xt());async function k(){n.value=!0,s.value=await jr(),o.value=await mn(t.date),a.value=await Pv(t.date),c.value=await Ks(!0),h.value=await Za(),d.value=o.value&&o.value.location||await yv(),n.value=!1}fn(k),gt(()=>t.date,k),gt(Hs,()=>{k()});const D=it(()=>c.value.filter(W=>W.archived!==1));function T(W){if(!W)return"";const q=c.value.find(Y=>Y.id===W);return q?q.name:"已删除项目"}const L=it(()=>s.value?qs(o.value,t.date,s.value,m.value):null),X=it(()=>a.value.reduce((W,q)=>W+(q.minutes||0),0)),ce=V(!1);async function Q(){ce.value||(ce.value=!0,await lf(t.date,d.value),await k(),Sr(),We("上班打卡成功"),ce.value=!1)}async function E(){ce.value||(ce.value=!0,await kv(t.date),await k(),Sr(),We("下班打卡成功"),ce.value=!1)}async function N(){await gv(t.date,d.value),Sr(),We("地点已更新")}const G=V(!1),de=it(()=>{var W;return((W=o.value)==null?void 0:W.kind)==="leave"});function ae(){if(o.value&&o.value.clock_in_at){G.value=!0;return}Z(!0)}async function Z(W){G.value=!1,await Ev(t.date,W),await k(),Sr(),We(W?"已标记为休假":"已取消休假")}const $=V(null),x=V(""),le=V(null);gt($,async W=>{var q;W&&(await ts(),(q=le.value)==null||q.focus())});function ke(W){var Y,$e;const q=W==="in"?(Y=o.value)==null?void 0:Y.clock_in_at:($e=o.value)==null?void 0:$e.clock_out_at;$.value=W,x.value=q?Vn(q):W==="in"?"09:00":"18:00"}function J(){$.value=null}async function xe(){const W=$.value;W&&($.value=null,x.value&&(await Sv(t.date,W==="in"?"clock_in_at":"clock_out_at",x.value),await k(),Sr(),We("打卡时间已修改")))}const Ve=V(!1),nt=V("09:00"),qe=V("18:00"),He=V(""),ge=V(""),Oe=V("");function Fe(){ge.value=d.value,Oe.value="",Ve.value=!Ve.value}async function je(){if(!nt.value||!qe.value){Oe.value="请填写上班与下班时间";return}await Cv(t.date,t.date+"T"+nt.value+":00",t.date+"T"+qe.value+":00",He.value.trim(),ge.value),Ve.value=!1,He.value="",Oe.value="",await k(),Sr(),We("补卡已保存")}const ne=V(""),F=V("");gt(ne,()=>{F.value&&(F.value="")});const fe=V(null),Ke=V("dev"),ct=V(null),ht=V(""),Yt=V(""),Jt=V(!1),Ie=it(()=>!!(ne.value.trim()||ct.value||ht.value.trim()||Yt.value.trim()));fn(async()=>{const W=await mv();fe.value=W.project_id,Ke.value=W.category});function w(){ne.value="",ct.value=null,ht.value="",Yt.value="",F.value=""}async function g(){const W=ne.value.trim();if(!W){F.value="请填写工作内容";return}Jt.value||(Jt.value=!0,await Tv(t.date,{content:W,project_id:fe.value,category:Ke.value,minutes:ct.value&&ct.value>0?ct.value:null,takeaway:ht.value.trim()||null,remark:Yt.value.trim()||null}),w(),await k(),We("记录已添加"),Jt.value=!1)}const P=V(null);function ie(W){P.value=W}async function se(W){const q=W.id,Y={content:W.content,project_id:W.project_id,category:W.category,minutes:W.minutes,takeaway:W.takeaway,remark:W.remark,is_milestone:W.is_milestone,needs_followup:W.needs_followup};await la(q,Y),P.value=null,await k(),We("修改已保存")}async function ue(W){await la(W.id,{is_milestone:W.is_milestone?0:1}),await k()}async function ye(W){await la(W.id,{needs_followup:W.needs_followup?0:1}),await k()}const oe=V(null);async function we(){oe.value&&oe.value.id&&await Ov(oe.value.id),oe.value=null,await k(),We("记录已删除")}return(W,q)=>(K(),H("div",Yv,[u("div",Jv,[u("div",Xv,re(Qt(of)(e.date)),1)]),u("div",Qv,[q[25]||(q[25]=u("div",{class:"sec-title"},"出勤信息",-1)),u("div",Zv,[u("div",em,[q[21]||(q[21]=u("label",null,"上班时间",-1)),$.value==="in"?(K(),H("div",tm,[Ee(u("input",{ref_key:"timeInput",ref:le,type:"time",class:"input time-input","onUpdate:modelValue":q[0]||(q[0]=Y=>x.value=Y),onKeydown:[jt(xe,["enter"]),jt(J,["esc"])]},null,544),[[De,x.value]]),u("button",{class:"btn btn-primary btn-sm",onClick:xe},"确认"),u("button",{class:"btn btn-sm",onClick:J},"取消")])):(K(),H("div",nm,[u("span",{class:et(["num",{"val-empty":!(o.value&&o.value.clock_in_at)}])},re(o.value&&o.value.clock_in_at?Qt(Vn)(o.value.clock_in_at):"未打卡"),3),o.value&&o.value.id?(K(),H("button",{key:0,class:"icon-btn",title:"修改上班时间",onClick:q[1]||(q[1]=Y=>ke("in"))},[Te(lt,{name:"edit",size:13})])):Se("",!0)]))]),u("div",rm,[q[22]||(q[22]=u("label",null,"下班时间",-1)),$.value==="out"?(K(),H("div",sm,[Ee(u("input",{ref_key:"timeInput",ref:le,type:"time",class:"input time-input","onUpdate:modelValue":q[2]||(q[2]=Y=>x.value=Y),onKeydown:[jt(xe,["enter"]),jt(J,["esc"])]},null,544),[[De,x.value]]),u("button",{class:"btn btn-primary btn-sm",onClick:xe},"确认"),u("button",{class:"btn btn-sm",onClick:J},"取消")])):(K(),H("div",om,[u("span",{class:et(["num",{"val-empty":!(o.value&&o.value.clock_out_at)}])},re(o.value&&o.value.clock_out_at?Qt(Vn)(o.value.clock_out_at):"未打卡"),3),o.value&&o.value.id?(K(),H("button",{key:0,class:"icon-btn",title:"修改下班时间",onClick:q[3]||(q[3]=Y=>ke("out"))},[Te(lt,{name:"edit",size:13})])):Se("",!0)]))]),u("div",im,[q[23]||(q[23]=u("label",null,"上班地点",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":q[4]||(q[4]=Y=>d.value=Y),list:y.value,placeholder:"可直接输入",title:"上班地点,可自由输入",onChange:N},null,40,am),[[De,d.value]]),u("datalist",{id:y.value},[(K(!0),H(Re,null,ut(h.value,Y=>(K(),H("option",{key:Y,value:Y},null,8,um))),128))],8,lm)]),u("div",cm,[q[24]||(q[24]=u("label",null,"考勤状态",-1)),u("div",fm,[L.value?(K(),H(Re,{key:0},[u("span",{class:et(["dot",L.value.status])},null,2),u("span",null,re(L.value.label),1),o.value&&o.value.kind==="makeup"?(K(),H("span",dm,"补卡")):Se("",!0)],64)):(K(),H("span",pm,"--"))])])]),o.value&&o.value.note?(K(),H("div",hm,"补卡说明:"+re(o.value.note),1)):Se("",!0),u("div",vm,[m.value&&(!o.value||!o.value.clock_in_at)?(K(),H("button",{key:0,class:"btn btn-primary btn-sm",disabled:ce.value,onClick:Q},"上班打卡",8,mm)):m.value&&o.value&&o.value.clock_in_at&&!o.value.clock_out_at?(K(),H("button",{key:1,class:"btn btn-primary btn-sm",disabled:ce.value,onClick:E},"下班打卡",8,ym)):Se("",!0),!m.value&&(!o.value||!o.value.clock_in_at)?(K(),H("button",{key:2,class:"btn btn-sm",onClick:Fe},"补卡")):Se("",!0),de.value?(K(),H("button",{key:4,class:"btn btn-sm",disabled:ce.value,onClick:q[5]||(q[5]=Y=>Z(!1))},"取消休假",8,bm)):(K(),H("button",{key:3,class:"btn btn-sm",disabled:ce.value,onClick:ae},"标记休假",8,gm))])]),Ve.value?(K(),H("div",wm,[q[30]||(q[30]=u("div",{class:"sec-title"},"补卡登记",-1)),u("div",_m,[u("div",km,[q[26]||(q[26]=u("label",null,"上班时间",-1)),Ee(u("input",{type:"time",class:"input","onUpdate:modelValue":q[6]||(q[6]=Y=>nt.value=Y)},null,512),[[De,nt.value]])]),u("div",xm,[q[27]||(q[27]=u("label",null,"下班时间",-1)),Ee(u("input",{type:"time",class:"input","onUpdate:modelValue":q[7]||(q[7]=Y=>qe.value=Y)},null,512),[[De,qe.value]])]),u("div",Cm,[q[28]||(q[28]=u("label",null,"上班地点",-1)),Ee(u("input",{class:"input",list:y.value,"onUpdate:modelValue":q[8]||(q[8]=Y=>ge.value=Y),placeholder:"可直接输入"},null,8,Sm),[[De,ge.value]])]),u("div",Em,[q[29]||(q[29]=u("label",null,"补卡原因",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":q[9]||(q[9]=Y=>He.value=Y),placeholder:"如:外出拜访客户忘记打卡"},null,512),[[De,He.value]])])]),Oe.value?(K(),H("div",$m,re(Oe.value),1)):Se("",!0),u("div",Am,[u("button",{class:"btn btn-sm",onClick:q[10]||(q[10]=Y=>Ve.value=!1)},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:je},"保存补卡")])])):Se("",!0),u("div",Pm,[q[38]||(q[38]=u("div",{class:"sec-head"},[u("span",{class:"sec-title"},"新增工作记录"),u("span",{class:"muted form-hint"},"内容必填,其余选填")],-1)),u("div",Tm,[u("div",Om,[q[31]||(q[31]=u("label",null,"工作内容(必填)",-1)),Ee(u("input",{class:et(["input",{invalid:F.value}]),"onUpdate:modelValue":q[11]||(q[11]=Y=>ne.value=Y),placeholder:"做了什么,一句话一条",onKeydown:jt(g,["enter"])},null,34),[[De,ne.value]]),F.value?(K(),H("div",Mm,re(F.value),1)):Se("",!0)]),u("div",Im,[q[33]||(q[33]=u("label",null,"所属项目",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":q[12]||(q[12]=Y=>fe.value=Y)},[q[32]||(q[32]=u("option",{value:null},"无项目",-1)),(K(!0),H(Re,null,ut(D.value,Y=>(K(),H("option",{key:Y.id,value:Y.id},re(Y.name),9,jm))),128))],512),[[Fn,fe.value]])]),u("div",Dm,[q[34]||(q[34]=u("label",null,"工作分类",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":q[13]||(q[13]=Y=>Ke.value=Y)},[(K(!0),H(Re,null,ut(Qt(Us),Y=>(K(),H("option",{key:Y.key,value:Y.key},re(Y.label),9,Rm))),128))],512),[[Fn,Ke.value]])]),u("div",Lm,[q[35]||(q[35]=u("label",null,"耗时(分钟)",-1)),Ee(u("input",{class:"input",type:"number",min:"0","onUpdate:modelValue":q[14]||(q[14]=Y=>ct.value=Y),placeholder:"选填"},null,512),[[De,ct.value,void 0,{number:!0}]])]),u("div",Km,[q[36]||(q[36]=u("label",null,"主要收获",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":q[15]||(q[15]=Y=>ht.value=Y),placeholder:"一句话:学到了什么"},null,512),[[De,ht.value]])]),u("div",Fm,[q[37]||(q[37]=u("label",null,"备注",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":q[16]||(q[16]=Y=>Yt.value=Y),placeholder:"背景、链接、未决事项(选填)"},null,512),[[De,Yt.value]])])]),u("div",Nm,[u("button",{class:"btn btn-sm",disabled:!Ie.value,onClick:w},"重置",8,Vm),u("button",{class:"btn btn-primary btn-sm",disabled:Jt.value,onClick:g},"添加记录",8,Bm)])]),u("div",Um,[u("div",qm,"工作记录("+re(a.value.length)+")",1),!a.value.length&&!n.value?(K(),H("div",Hm,"暂无记录")):Se("",!0),(K(!0),H(Re,null,ut(a.value,Y=>(K(),H("div",{key:Y.id,class:"item"},[u("div",Wm,[u("span",zm,re(Qt(Qa)(Y.category)),1),u("span",{class:"item-content",title:"点击编辑",onClick:$e=>ie(Y)},re(Y.content),9,Gm),Y.project_id?(K(),H("span",Ym,re(T(Y.project_id)),1)):Se("",!0),Y.minutes?(K(),H("span",Jm,re(Y.minutes)+" 分钟",1)):Se("",!0),q[39]||(q[39]=u("span",{class:"flex1"},null,-1)),u("button",{class:"icon-btn",title:"编辑完整信息",onClick:$e=>ie(Y)},[Te(lt,{name:"edit",size:14})],8,Xm),u("button",{class:et(["icon-btn",{active:Y.is_milestone===1}]),title:"成果标记",onClick:$e=>ue(Y)},[Te(lt,{name:"star",size:14})],10,Qm),u("button",{class:et(["icon-btn",{"active-warn":Y.needs_followup===1}]),title:"待跟进",onClick:$e=>ye(Y)},[Te(lt,{name:"flag",size:14})],10,Zm),u("button",{class:"icon-btn",title:"删除",onClick:$e=>oe.value=Y},[Te(lt,{name:"close",size:14})],8,ey)]),Y.takeaway||Y.remark?(K(),H("div",ty,[Y.takeaway?(K(),H("div",ny,"收获:"+re(Y.takeaway),1)):Se("",!0),Y.remark?(K(),H("div",ry,"备注:"+re(Y.remark),1)):Se("",!0)])):Se("",!0)]))),128)),a.value.length?(K(),H("div",sy,[nn(" 共 "+re(a.value.length)+" 条事项 ",1),X.value?(K(),H(Re,{key:0},[nn(" · "+re((X.value/60).toFixed(1))+" 小时",1)],64)):Se("",!0)])):Se("",!0)]),Te(ur,{open:!!oe.value,title:"删除确认",message:oe.value?"将删除工作记录「"+oe.value.content+"」。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:q[17]||(q[17]=Y=>oe.value=null),onConfirm:we},null,8,["open","message"]),Te(ur,{open:G.value,title:"标记休假确认",message:"该日已有打卡记录,标记休假将清空上下班时间。是否继续?","confirm-text":"标记休假",danger:"",onCancel:q[18]||(q[18]=Y=>G.value=!1),onConfirm:q[19]||(q[19]=Y=>Z(!0))},null,8,["open"]),Te(pv,{open:!!P.value,item:P.value,projects:c.value,date:e.date,onCancel:q[20]||(q[20]=Y=>P.value=null),onSave:se},null,8,["open","item","projects","date"])]))}}),uf=Gt(oy,[["__scopeId","data-v-2e90c9d8"]]),iy={class:"cal-page"},ay={class:"cal-toolbar"},ly={class:"cal-title num"},uy={class:"cal-head"},cy={class:"cal-grid"},fy=["title","onClick"],dy={class:"cal-marks"},py={key:0,class:"drawer"},hy={class:"drawer-head"},vy={class:"drawer-body"},my=Vt({__name:"CalendarView",setup(e){const t=V(xt()),n=it(()=>Number(t.value.slice(0,4))),s=it(()=>Number(t.value.slice(5,7))-1),o=it(()=>n.value+" 年 "+(s.value+1)+" 月"),a=["一","二","三","四","五","六","日"],c=it(()=>{const G=(new Date(n.value,s.value,1).getDay()+6)%7,de=new Date(n.value,s.value+1,0).getDate(),ae=[];for(let Z=0;Z[ke.date,ke])),$=de[2],x=new Map;for(const ke of c.value){if(!ke.inMonth)continue;const J=qs(Z.get(ke.date),ke.date,ae,ke.date===h),xe=$.filter(Ve=>Ve.date===ke.date);x.set(ke.date,{status:J.status,label:J.label,location:((le=Z.get(ke.date))==null?void 0:le.location)||"",hasLog:xe.length>0,hasMilestone:xe.some(Ve=>Ve.is_milestone===1)})}d.value=x}gt([n,s],y,{immediate:!0}),gt(Hs,()=>{y()});function m(N){var G;return((G=d.value.get(N))==null?void 0:G.status)??""}function k(N){const G=d.value.get(N);return G?N+" · "+G.label+(G.location?" · "+G.location:""):N}function D(N){var G;return!!((G=d.value.get(N))!=null&&G.hasLog)}function T(N){var G;return!!((G=d.value.get(N))!=null&&G.hasMilestone)}function L(){t.value=Uo(t.value,-1)}function X(){t.value=Uo(t.value,1)}function ce(){t.value=xt()}const Q=V(null);function E(N,G){G&&(Q.value=N)}return gt($a,N=>{N&&(t.value=N,Q.value=N,$a.value=null)},{immediate:!0}),(N,G)=>(K(),H("div",iy,[u("div",ay,[u("button",{class:"icon-btn",onClick:L},[Te(lt,{name:"chevron-left",size:16})]),u("span",ly,re(o.value),1),u("button",{class:"icon-btn",onClick:X},[Te(lt,{name:"chevron-right",size:16})]),u("button",{class:"btn btn-sm",onClick:ce},"回到今天")]),u("div",uy,[(K(),H(Re,null,ut(a,de=>u("span",{key:de,class:"cal-week muted"},re(de),1)),64))]),u("div",cy,[(K(!0),H(Re,null,ut(c.value,(de,ae)=>(K(),H("button",{key:ae,class:et(["cal-cell",{blank:!de.inMonth,weekend:de.weekend,selected:Q.value===de.date}]),title:de.inMonth?k(de.date):void 0,onClick:Z=>E(de.date,de.inMonth)},[de.inMonth?(K(),H(Re,{key:0},[u("span",{class:et(["daynum num",{today:de.date===Qt(h)}])},re(Number(de.date.slice(8,10))),3),u("span",dy,[m(de.date)?(K(),H("span",{key:0,class:et(["dot",m(de.date)])},null,2)):Se("",!0),D(de.date)?(K(),It(lt,{key:1,name:"check-circle",size:12,class:"mark-log"})):Se("",!0),T(de.date)?(K(),It(lt,{key:2,name:"star",size:12,class:"mark-star"})):Se("",!0)])],64)):Se("",!0)],10,fy))),128))]),Te(ns,{name:"drawer"},{default:fr(()=>[Q.value?(K(),H("aside",py,[u("div",hy,[G[1]||(G[1]=u("span",{class:"drawer-title"},"当日详情",-1)),u("button",{class:"icon-btn",onClick:G[0]||(G[0]=de=>Q.value=null)},[Te(lt,{name:"close",size:16})])]),u("div",vy,[Te(uf,{date:Q.value},null,8,["date"])])])):Se("",!0)]),_:1})]))}}),yy=Gt(my,[["__scopeId","data-v-2404dfbe"]]),gy={class:"detail-page"},by={class:"detail-toolbar"},wy=["value"],_y=["disabled"],ky=Vt({__name:"TodayView",setup(e){const t=V(xt()),n=it(()=>t.value===xt());function s(){t.value=Kn(t.value,-1)}function o(){t.value=Kn(t.value,1)}function a(){t.value=xt()}function c(d){const h=d.target.value;h&&(t.value=h)}return(d,h)=>(K(),H("div",gy,[u("div",by,[u("button",{class:"icon-btn",title:"前一天",onClick:s},[Te(lt,{name:"chevron-left",size:16})]),u("span",{class:et(["date-title num",{"is-today":n.value}])},re(Qt(of)(t.value)),3),u("button",{class:"icon-btn",title:"后一天",onClick:o},[Te(lt,{name:"chevron-right",size:16})]),u("input",{type:"date",class:"input w-date",value:t.value,onChange:c},null,40,wy),u("button",{class:"btn btn-sm",disabled:n.value,onClick:a},"回到今天",8,_y)]),Te(uf,{date:t.value},null,8,["date"])]))}}),xy=Gt(ky,[["__scopeId","data-v-76243d98"]]),Cy={class:"stats"},Sy={class:"cards"},Ey={class:"card stat-card"},$y={class:"stat-num num"},Ay={class:"card stat-card"},Py={class:"stat-num num"},Ty={class:"card stat-card"},Oy={class:"stat-num num"},My={class:"card stat-card"},Iy={class:"stat-num num"},jy={class:"card section"},Dy={class:"heat"},Ry=["title"],Ly={class:"two-col"},Ky={class:"card section"},Fy={class:"bar-label"},Ny={class:"bar-track"},Vy={class:"muted num bar-num"},By={key:0,class:"muted"},Uy={class:"card section"},qy={class:"bar-label"},Hy={class:"bar-track"},Wy={class:"muted num bar-num"},zy={key:0,class:"muted"},Gy={class:"card section"},Yy={class:"bar-label loc-label"},Jy={class:"bar-track"},Xy={class:"muted num bar-num"},Qy={key:0,class:"muted"},Zy=Vt({__name:"StatsView",setup(e){const t=V({attendDays:0,totalHours:"0",itemCount:0,streak:0}),n=V([]),s=V([]),o=V([]),a=V([]);async function c(){const y=xt(),m="2000-01-01",k=await Promise.all([jr(),di(m,y),pi(m,y),Ks(!0)]),D=k[0],T=k[1],L=k[2],X=k[3],ce=T.filter(J=>J.clock_in_at||J.kind==="makeup");let Q=0;for(const J of ce){const xe=qs(J,J.date,D,J.date===y);Q+=xe.workedMinutes??0}const E=new Set(L.map(J=>J.date));let N=0,G=y;for(E.has(G)||(G=Kn(y,-1));E.has(G);)N++,G=Kn(G,-1);t.value={attendDays:ce.length,totalHours:(Q/60).toFixed(1),itemCount:L.length,streak:N};const de=new Map;for(const J of ce){const xe=J.location||"未记录";de.set(xe,(de.get(xe)||0)+1)}a.value=Array.from(de.entries()).map(J=>({name:J[0],count:J[1],percent:Math.round(J[1]/(ce.length||1)*100)})).sort((J,xe)=>xe.count-J.count);const ae=L.length||1;s.value=Us.map(J=>{const xe=L.filter(Ve=>Ve.category===J.key).length;return{key:J.key,label:J.label,count:xe,percent:Math.round(xe/ae*100)}}).filter(J=>J.count>0).sort((J,xe)=>xe.count-J.count);const Z=new Map(X.map(J=>[J.id,J.name])),$=new Map;for(const J of L){const xe=J.project_id?Z.get(J.project_id)||"已删除项目":"无项目";$.set(xe,($.get(xe)||0)+1)}o.value=Array.from($.entries()).map(J=>({name:J[0],count:J[1],percent:Math.round(J[1]/ae*100)})).sort((J,xe)=>xe.count-J.count);const x=new Map;for(const J of L)x.set(J.date,(x.get(J.date)||0)+1);const le=Es(y),ke=[];for(let J=11;J>=0;J--){const xe=Kn(le,-7*J),Ve=[];for(let nt=0;nt<7;nt++){const qe=Kn(xe,nt);Ve.push({date:qe,count:x.get(qe)||0})}ke.push(Ve)}n.value=ke}fn(async()=>{await c()}),gt(Hs,()=>{c()});function d(y){return y===0?0:y===1?1:y<=3?2:y<=5?3:4}function h(y,m){return y+" · "+(m?m+" 条":"无记录")}return(y,m)=>(K(),H("div",Cy,[u("div",Sy,[u("div",Ey,[m[0]||(m[0]=u("div",{class:"muted"},"出勤天数",-1)),u("div",$y,re(t.value.attendDays),1)]),u("div",Ay,[m[1]||(m[1]=u("div",{class:"muted"},"累计工时(小时)",-1)),u("div",Py,re(t.value.totalHours),1)]),u("div",Ty,[m[2]||(m[2]=u("div",{class:"muted"},"记录条数",-1)),u("div",Oy,re(t.value.itemCount),1)]),u("div",My,[m[3]||(m[3]=u("div",{class:"muted"},"连续记录(天)",-1)),u("div",Iy,re(t.value.streak),1)])]),u("div",jy,[m[4]||(m[4]=u("div",{class:"section-title"},"记录热力图(近 12 周)",-1)),u("div",Dy,[(K(!0),H(Re,null,ut(n.value,(k,D)=>(K(),H("div",{key:D,class:"heat-col"},[(K(!0),H(Re,null,ut(k,T=>(K(),H("span",{key:T.date,class:et(["heat-cell","lv"+d(T.count)]),title:h(T.date,T.count)},null,10,Ry))),128))]))),128))]),m[5]||(m[5]=Dp('
少多
',1))]),u("div",Ly,[u("div",Ky,[m[6]||(m[6]=u("div",{class:"section-title"},"分类分布",-1)),(K(!0),H(Re,null,ut(s.value,k=>(K(),H("div",{key:k.key,class:"bar-row"},[u("span",Fy,re(k.label),1),u("span",Ny,[u("span",{class:"bar-fill",style:sr({width:k.percent+"%"})},null,4)]),u("span",Vy,re(k.count)+" 条 · "+re(k.percent)+"%",1)]))),128)),s.value.length?Se("",!0):(K(),H("div",By,"暂无数据"))]),u("div",Uy,[m[7]||(m[7]=u("div",{class:"section-title"},"项目投入",-1)),(K(!0),H(Re,null,ut(o.value,k=>(K(),H("div",{key:k.name,class:"bar-row"},[u("span",qy,re(k.name),1),u("span",Hy,[u("span",{class:"bar-fill",style:sr({width:k.percent+"%"})},null,4)]),u("span",Wy,re(k.count)+" 条 · "+re(k.percent)+"%",1)]))),128)),o.value.length?Se("",!0):(K(),H("div",zy,"暂无数据"))])]),u("div",Gy,[m[8]||(m[8]=u("div",{class:"section-title"},"地点分布(按出勤天)",-1)),(K(!0),H(Re,null,ut(a.value,k=>(K(),H("div",{key:k.name,class:"bar-row"},[u("span",Yy,re(k.name),1),u("span",Jy,[u("span",{class:"bar-fill",style:sr({width:k.percent+"%"})},null,4)]),u("span",Xy,re(k.count)+" 天 · "+re(k.percent)+"%",1)]))),128)),a.value.length?Se("",!0):(K(),H("div",Qy,"暂无数据"))])]))}}),eg=Gt(Zy,[["__scopeId","data-v-73e5ba49"]]);async function tg(e,t,n){const s=xt(),o=await Promise.all([jr(),di(e,t),pi(e,t),Ks(!0),Iv(e,t)]),a=o[0],c=o[1],d=o[2],h=o[3],y=o[4];let m=0,k=0,D=0;for(const $ of c){($.clock_in_at||$.kind==="makeup")&&m++,$.kind==="makeup"&&D++;const x=qs($,$.date,a,$.date===s);k+=x.workedMinutes??0}const T=new Map;for(const $ of c){if(!($.clock_in_at||$.kind==="makeup"))continue;const x=$.location||"未记录";T.set(x,(T.get(x)||0)+1)}const L=Array.from(T.entries()).map($=>({name:$[0],count:$[1]})).sort(($,x)=>x.count-$.count),X=d.length||1,ce=Us.map($=>{const x=d.filter(le=>le.category===$.key).length;return{key:$.key,label:$.label,count:x,percent:Math.round(x/X*100)}}).filter($=>$.count>0).sort(($,x)=>x.count-$.count),Q=new Map(h.map($=>[$.id,$.name])),E=new Map;for(const $ of d){const x=$.project_id?Q.get($.project_id)||"已删除项目":"无项目";E.set(x,(E.get(x)||0)+1)}const N=Array.from(E.entries()).map($=>({name:$[0],count:$[1]})).sort(($,x)=>x.count-$.count),G=d.filter($=>$.is_milestone===1).map($=>({date:$.date,content:$.content})),de=d.filter($=>$.needs_followup===1).map($=>({date:$.date,content:$.content,remark:$.remark||""})),ae=d.filter($=>!!$.takeaway).map($=>({date:$.date,text:$.takeaway})),Z=y.map($=>({weekStart:$.week_start,highlights:$.highlights||"",challenges:$.challenges||"",plan_next:$.plan_next||""}));return{range:{start:e,end:t,label:n},attendDays:m,totalHours:(k/60).toFixed(1),makeupCount:D,leaveCount:c.filter($=>$.kind==="leave").length,itemCount:d.length,categoryStats:ce,projectStats:N,locationStats:L,milestones:G,followups:de,takeaways:ae,weekNotes:Z}}function ng(e){const t=[];t.push("# 实习工作总结("+e.range.start+" ~ "+e.range.end+")"),t.push(""),t.push("## 一、考勤概况"),t.push(""),t.push("出勤 "+e.attendDays+" 天,累计工时 "+e.totalHours+" 小时,补卡 "+e.makeupCount+" 次"+(e.leaveCount?",请假 "+e.leaveCount+" 天":""));const n=e.locationStats.filter(s=>s.name!=="未记录");n.length&&t.push("其中:"+n.map(s=>s.name+" "+s.count+" 天").join(",")),t.push(""),t.push("## 二、工作内容分布"),t.push(""),t.push(e.categoryStats.length?e.categoryStats.map(s=>s.label+" "+s.percent+"%("+s.count+" 条)").join(","):"(无记录)"),t.push(""),t.push("## 三、项目投入"),t.push(""),t.push(e.projectStats.length?e.projectStats.map(s=>s.name+" "+s.count+" 条").join(","):"(无记录)"),t.push(""),t.push("## 四、主要成果"),t.push(""),e.milestones.length?e.milestones.forEach((s,o)=>t.push(o+1+". 【成果】"+s.content+"("+s.date+")")):t.push("(无)"),t.push(""),t.push("## 五、待跟进事项"),t.push(""),e.followups.length?e.followups.forEach(s=>t.push("- 【待跟进】"+s.content+(s.remark?"("+s.date+" 备注:"+s.remark+")":"("+s.date+")"))):t.push("(无)"),t.push(""),t.push("## 六、学习与成长"),t.push(""),e.takeaways.length?e.takeaways.forEach(s=>t.push("- "+s.text+"("+s.date+")")):t.push("(无)");for(const s of e.weekNotes)t.push(""),t.push("### 周记("+s.weekStart+" 起)"),t.push(""),t.push("- 本周亮点:"+(s.highlights||"(无)")),t.push("- 踩的坑:"+(s.challenges||"(无)")),t.push("- 下周计划:"+(s.plan_next||"(无)"));return t.push(""),t.join(` +`)}const rg="modulepreload",sg=function(e,t){return new URL(e,t).href},Tu={},cf=function(t,n,s){let o=Promise.resolve();if(n&&n.length>0){const c=document.getElementsByTagName("link"),d=document.querySelector("meta[property=csp-nonce]"),h=(d==null?void 0:d.nonce)||(d==null?void 0:d.getAttribute("nonce"));o=Promise.allSettled(n.map(y=>{if(y=sg(y,s),y in Tu)return;Tu[y]=!0;const m=y.endsWith(".css"),k=m?'[rel="stylesheet"]':"";if(!!s)for(let L=c.length-1;L>=0;L--){const X=c[L];if(X.href===y&&(!m||X.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${y}"]${k}`))return;const T=document.createElement("link");if(T.rel=m?"stylesheet":rg,m||(T.as="script"),T.crossOrigin="",T.href=y,h&&T.setAttribute("nonce",h),document.head.appendChild(T),m)return new Promise((L,X)=>{T.addEventListener("load",L),T.addEventListener("error",()=>X(new Error(`Unable to preload CSS for ${y}`)))})}))}function a(c){const d=new Event("vite:preloadError",{cancelable:!0});if(d.payload=c,window.dispatchEvent(d),!d.defaultPrevented)throw c}return o.then(c=>{for(const d of c||[])d.status==="rejected"&&a(d.reason);return t().catch(a)})};/*! Capacitor: https://capacitorjs.com/ - MIT License */const og=e=>{const t=new Map;t.set("web",{name:"web"});const n=e.CapacitorPlatforms||{currentPlatform:{name:"web"},platforms:t},s=(a,c)=>{n.platforms.set(a,c)},o=a=>{n.platforms.has(a)&&(n.currentPlatform=n.platforms.get(a))};return n.addPlatform=s,n.setPlatform=o,n},ig=e=>e.CapacitorPlatforms=og(e),ff=ig(typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});ff.addPlatform;ff.setPlatform;var Qr;(function(e){e.Unimplemented="UNIMPLEMENTED",e.Unavailable="UNAVAILABLE"})(Qr||(Qr={}));class ua extends Error{constructor(t,n,s){super(t),this.message=t,this.code=n,this.data=s}}const ag=e=>{var t,n;return e!=null&&e.androidBridge?"android":!((n=(t=e==null?void 0:e.webkit)===null||t===void 0?void 0:t.messageHandlers)===null||n===void 0)&&n.bridge?"ios":"web"},lg=e=>{var t,n,s,o,a;const c=e.CapacitorCustomPlatform||null,d=e.Capacitor||{},h=d.Plugins=d.Plugins||{},y=e.CapacitorPlatforms,m=()=>c!==null?c.name:ag(e),k=((t=y==null?void 0:y.currentPlatform)===null||t===void 0?void 0:t.getPlatform)||m,D=()=>k()!=="web",T=((n=y==null?void 0:y.currentPlatform)===null||n===void 0?void 0:n.isNativePlatform)||D,L=Z=>{const $=G.get(Z);return!!($!=null&&$.platforms.has(k())||Q(Z))},X=((s=y==null?void 0:y.currentPlatform)===null||s===void 0?void 0:s.isPluginAvailable)||L,ce=Z=>{var $;return($=d.PluginHeaders)===null||$===void 0?void 0:$.find(x=>x.name===Z)},Q=((o=y==null?void 0:y.currentPlatform)===null||o===void 0?void 0:o.getPluginHeader)||ce,E=Z=>e.console.error(Z),N=(Z,$,x)=>Promise.reject(`${x} does not have an implementation of "${$}".`),G=new Map,de=(Z,$={})=>{const x=G.get(Z);if(x)return console.warn(`Capacitor plugin "${Z}" already registered. Cannot register plugins twice.`),x.proxy;const le=k(),ke=Q(Z);let J;const xe=async()=>(!J&&le in $?J=typeof $[le]=="function"?J=await $[le]():J=$[le]:c!==null&&!J&&"web"in $&&(J=typeof $.web=="function"?J=await $.web():J=$.web),J),Ve=(Fe,je)=>{var ne,F;if(ke){const fe=ke==null?void 0:ke.methods.find(Ke=>je===Ke.name);if(fe)return fe.rtype==="promise"?Ke=>d.nativePromise(Z,je.toString(),Ke):(Ke,ct)=>d.nativeCallback(Z,je.toString(),Ke,ct);if(Fe)return(ne=Fe[je])===null||ne===void 0?void 0:ne.bind(Fe)}else{if(Fe)return(F=Fe[je])===null||F===void 0?void 0:F.bind(Fe);throw new ua(`"${Z}" plugin is not implemented on ${le}`,Qr.Unimplemented)}},nt=Fe=>{let je;const ne=(...F)=>{const fe=xe().then(Ke=>{const ct=Ve(Ke,Fe);if(ct){const ht=ct(...F);return je=ht==null?void 0:ht.remove,ht}else throw new ua(`"${Z}.${Fe}()" is not implemented on ${le}`,Qr.Unimplemented)});return Fe==="addListener"&&(fe.remove=async()=>je()),fe};return ne.toString=()=>`${Fe.toString()}() { [capacitor code] }`,Object.defineProperty(ne,"name",{value:Fe,writable:!1,configurable:!1}),ne},qe=nt("addListener"),He=nt("removeListener"),ge=(Fe,je)=>{const ne=qe({eventName:Fe},je),F=async()=>{const Ke=await ne;He({eventName:Fe,callbackId:Ke},je)},fe=new Promise(Ke=>ne.then(()=>Ke({remove:F})));return fe.remove=async()=>{console.warn("Using addListener() without 'await' is deprecated."),await F()},fe},Oe=new Proxy({},{get(Fe,je){switch(je){case"$$typeof":return;case"toJSON":return()=>({});case"addListener":return ke?ge:qe;case"removeListener":return He;default:return nt(je)}}});return h[Z]=Oe,G.set(Z,{name:Z,proxy:Oe,platforms:new Set([...Object.keys($),...ke?[le]:[]])}),Oe},ae=((a=y==null?void 0:y.currentPlatform)===null||a===void 0?void 0:a.registerPlugin)||de;return d.convertFileSrc||(d.convertFileSrc=Z=>Z),d.getPlatform=k,d.handleError=E,d.isNativePlatform=T,d.isPluginAvailable=X,d.pluginMethodNoop=N,d.registerPlugin=ae,d.Exception=ua,d.DEBUG=!!d.DEBUG,d.isLoggingEnabled=!!d.isLoggingEnabled,d.platform=d.getPlatform(),d.isNative=d.isNativePlatform(),d},ug=e=>e.Capacitor=lg(e),Zr=ug(typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),df=Zr.registerPlugin;Zr.Plugins;class pf{constructor(t){this.listeners={},this.retainedEventArguments={},this.windowListeners={},t&&(console.warn(`Capacitor WebPlugin "${t.name}" config object was deprecated in v3 and will be removed in v4.`),this.config=t)}addListener(t,n){let s=!1;this.listeners[t]||(this.listeners[t]=[],s=!0),this.listeners[t].push(n);const a=this.windowListeners[t];a&&!a.registered&&this.addWindowListener(a),s&&this.sendRetainedArgumentsForEvent(t);const c=async()=>this.removeListener(t,n);return Promise.resolve({remove:c})}async removeAllListeners(){this.listeners={};for(const t in this.windowListeners)this.removeWindowListener(this.windowListeners[t]);this.windowListeners={}}notifyListeners(t,n,s){const o=this.listeners[t];if(!o){if(s){let a=this.retainedEventArguments[t];a||(a=[]),a.push(n),this.retainedEventArguments[t]=a}return}o.forEach(a=>a(n))}hasListeners(t){return!!this.listeners[t].length}registerWindowListener(t,n){this.windowListeners[n]={registered:!1,windowEventName:t,pluginEventName:n,handler:s=>{this.notifyListeners(n,s)}}}unimplemented(t="not implemented"){return new Zr.Exception(t,Qr.Unimplemented)}unavailable(t="not available"){return new Zr.Exception(t,Qr.Unavailable)}async removeListener(t,n){const s=this.listeners[t];if(!s)return;const o=s.indexOf(n);this.listeners[t].splice(o,1),this.listeners[t].length||this.removeWindowListener(this.windowListeners[t])}addWindowListener(t){window.addEventListener(t.windowEventName,t.handler),t.registered=!0}removeWindowListener(t){t&&(window.removeEventListener(t.windowEventName,t.handler),t.registered=!1)}sendRetainedArgumentsForEvent(t){const n=this.retainedEventArguments[t];n&&(delete this.retainedEventArguments[t],n.forEach(s=>{this.notifyListeners(t,s)}))}}const Ou=e=>encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape),Mu=e=>e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent);class cg extends pf{async getCookies(){const t=document.cookie,n={};return t.split(";").forEach(s=>{if(s.length<=0)return;let[o,a]=s.replace(/=/,"CAP_COOKIE").split("CAP_COOKIE");o=Mu(o).trim(),a=Mu(a).trim(),n[o]=a}),n}async setCookie(t){try{const n=Ou(t.key),s=Ou(t.value),o=`; expires=${(t.expires||"").replace("expires=","")}`,a=(t.path||"/").replace("path=",""),c=t.url!=null&&t.url.length>0?`domain=${t.url}`:"";document.cookie=`${n}=${s||""}${o}; path=${a}; ${c};`}catch(n){return Promise.reject(n)}}async deleteCookie(t){try{document.cookie=`${t.key}=; Max-Age=0`}catch(n){return Promise.reject(n)}}async clearCookies(){try{const t=document.cookie.split(";")||[];for(const n of t)document.cookie=n.replace(/^ +/,"").replace(/=.*/,`=;expires=${new Date().toUTCString()};path=/`)}catch(t){return Promise.reject(t)}}async clearAllCookies(){try{await this.clearCookies()}catch(t){return Promise.reject(t)}}}df("CapacitorCookies",{web:()=>new cg});const fg=async e=>new Promise((t,n)=>{const s=new FileReader;s.onload=()=>{const o=s.result;t(o.indexOf(",")>=0?o.split(",")[1]:o)},s.onerror=o=>n(o),s.readAsDataURL(e)}),dg=(e={})=>{const t=Object.keys(e);return Object.keys(e).map(o=>o.toLocaleLowerCase()).reduce((o,a,c)=>(o[a]=e[t[c]],o),{})},pg=(e,t=!0)=>e?Object.entries(e).reduce((s,o)=>{const[a,c]=o;let d,h;return Array.isArray(c)?(h="",c.forEach(y=>{d=t?encodeURIComponent(y):y,h+=`${a}=${d}&`}),h.slice(0,-1)):(d=t?encodeURIComponent(c):c,h=`${a}=${d}`),`${s}&${h}`},"").substr(1):null,hg=(e,t={})=>{const n=Object.assign({method:e.method||"GET",headers:e.headers},t),o=dg(e.headers)["content-type"]||"";if(typeof e.data=="string")n.body=e.data;else if(o.includes("application/x-www-form-urlencoded")){const a=new URLSearchParams;for(const[c,d]of Object.entries(e.data||{}))a.set(c,d);n.body=a.toString()}else if(o.includes("multipart/form-data")||e.data instanceof FormData){const a=new FormData;if(e.data instanceof FormData)e.data.forEach((d,h)=>{a.append(h,d)});else for(const d of Object.keys(e.data))a.append(d,e.data[d]);n.body=a;const c=new Headers(n.headers);c.delete("content-type"),n.headers=c}else(o.includes("application/json")||typeof e.data=="object")&&(n.body=JSON.stringify(e.data));return n};class vg extends pf{async request(t){const n=hg(t,t.webFetchExtra),s=pg(t.params,t.shouldEncodeUrlParams),o=s?`${t.url}?${s}`:t.url,a=await fetch(o,n),c=a.headers.get("content-type")||"";let{responseType:d="text"}=a.ok?t:{};c.includes("application/json")&&(d="json");let h,y;switch(d){case"arraybuffer":case"blob":y=await a.blob(),h=await fg(y);break;case"json":h=await a.json();break;case"document":case"text":default:h=await a.text()}const m={};return a.headers.forEach((k,D)=>{m[D]=k}),{data:h,headers:m,status:a.status,url:a.url}}async get(t){return this.request(Object.assign(Object.assign({},t),{method:"GET"}))}async post(t){return this.request(Object.assign(Object.assign({},t),{method:"POST"}))}async put(t){return this.request(Object.assign(Object.assign({},t),{method:"PUT"}))}async patch(t){return this.request(Object.assign(Object.assign({},t),{method:"PATCH"}))}async delete(t){return this.request(Object.assign(Object.assign({},t),{method:"DELETE"}))}}df("CapacitorHttp",{web:()=>new vg});async function tl(e,t){const n=window;if(n.electronAPI&&n.electronAPI.saveFile){const c=await n.electronAPI.saveFile(e,t);return c&&c.saved?c.path:""}if(Zr.isNativePlatform()){const{Filesystem:c,Directory:d,Encoding:h}=await cf(async()=>{const{Filesystem:y,Directory:m,Encoding:k}=await import("./index-mjAVYvQ7.js");return{Filesystem:y,Directory:m,Encoding:k}},[],import.meta.url);try{return(await c.writeFile({path:e,data:t,directory:d.Documents,encoding:h.UTF8,recursive:!0})).uri}catch{return(await c.writeFile({path:e,data:t,directory:d.Cache,encoding:h.UTF8,recursive:!0})).uri}}const s=new Blob([t],{type:"text/plain;charset=utf-8"}),o=URL.createObjectURL(s),a=document.createElement("a");return a.href=o,a.download=e,a.click(),window.setTimeout(()=>URL.revokeObjectURL(o),1e4),""}const mg=Object.freeze(Object.defineProperty({__proto__:null,downloadText:tl},Symbol.toStringTag,{value:"Module"}));async function Pa(e){try{await navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}}async function yg(e){const t=await Promise.all([yt("ai_base_url",""),yt("ai_api_key",""),yt("ai_model","")]),n=t[0].trim().replace(/\/+$/,""),s=t[1].trim(),o=t[2].trim();if(!n||!o)throw new Error("请先在设置页配置 AI 接口地址与模型名称");const a=n+"/chat/completions",c={"Content-Type":"application/json"};s&&(c.Authorization="Bearer "+s);const h=JSON.stringify({model:o,messages:[{role:"system",content:"你是一名严谨的中文助理。请将用户提供的工作总结 Markdown 草稿润色为通顺、专业、简洁的工作总结。要求:保留原有章节结构与全部事实数据(数字、日期、条目),不得虚构或遗漏内容,只输出 Markdown 正文。"},{role:"user",content:e}],temperature:.3});let y;try{y=await fetch(a,{method:"POST",headers:c,body:h})}catch{throw new Error("无法访问 AI 接口:请检查地址是否正确、服务端是否允许浏览器跨域访问")}if(!y.ok){let D="接口返回 "+y.status;try{const T=await y.json();T&&T.error&&T.error.message&&(D+=":"+T.error.message)}catch{}throw new Error(D)}const m=await y.json(),k=m&&m.choices&&m.choices[0]&&m.choices[0].message&&m.choices[0].message.content;if(!k)throw new Error("接口未返回内容");return String(k)}const gg={class:"report"},bg={class:"report-toolbar"},wg={class:"seg"},_g=["onClick"],kg=["disabled"],xg=["disabled"],Cg={key:0,class:"ai-error"},Sg={class:"report-grid"},Eg={class:"report-left"},$g={class:"card section"},Ag={class:"section-title"},Pg={class:"muted note-saved"},Tg={class:"card section"},Og={class:"report-right"},Mg={key:0,class:"card section"},Ig={class:"sum-row"},jg={class:"num"},Dg={class:"sum-row"},Rg={class:"num"},Lg={class:"sum-row"},Kg={class:"num"},Fg={class:"sum-row"},Ng={class:"num"},Vg={class:"sum-row"},Bg={class:"num"},Ug={class:"muted"},qg={class:"num"},Hg={key:0,class:"muted sum-empty"},Wg={class:"muted"},zg={key:1,class:"muted sum-empty"},Gg={class:"muted"},Yg={key:2,class:"muted sum-empty"},Jg={class:"muted"},Xg={key:3,class:"muted sum-empty"},Qg=Vt({__name:"ReportView",setup(e){const t=[{key:"week",label:"本周"},{key:"month",label:"本月"},{key:"all",label:"全部"},{key:"custom",label:"自定义"}],n=V("week"),s=V(Es(xt())),o=V(xt()),a=V(null),c=V(""),d=V(!1),h=V(!1),y=V(null),m=V(""),k=V(Es(xt())),D=V(""),T=V(""),L=V(""),X=V(!1);async function ce(){const $=await el(k.value);D.value=($==null?void 0:$.highlights)||"",T.value=($==null?void 0:$.challenges)||"",L.value=($==null?void 0:$.plan_next)||"",X.value=!1}async function Q(){await Mv(k.value,{highlights:D.value.trim()||null,challenges:T.value.trim()||null,plan_next:L.value.trim()||null}),X.value=!0,await N()}function E($){const x=xt();if($==="week"){const le=Es(x);return{start:le,end:Kn(le,6),label:"本周"}}if($==="month"){const le=x.slice(0,7);return{start:le+"-01",end:x,label:le+" 本月"}}return $==="all"?{start:"2000-01-01",end:x,label:"全部实习期"}:{start:s.value,end:o.value,label:s.value+" ~ "+o.value}}async function N(){d.value=!0;const $=E(n.value),x=await tg($.start,$.end,$.label);a.value=x,c.value=ng(x),d.value=!1}gt(n,N),gt([s,o],()=>{n.value==="custom"&&N()}),fn(async()=>{await ce(),await N()});async function G(){const $=xt().replace(/-/g,""),x=await tl("实习工作总结_"+$+".md",c.value);We(x?"总结已导出到:"+x:"总结已导出到系统下载目录")}async function de(){await Pa(c.value),We("总结已复制到剪贴板")}async function ae(){if(h.value)return;m.value="";const $=c.value.trim();if(!$){m.value="当前草稿为空,无法润色";return}h.value=!0;try{y.value=c.value,c.value=await yg($),We("AI 润色完成")}catch(x){y.value=null,m.value=x instanceof Error?x.message:"润色失败"}h.value=!1}function Z(){y.value!==null&&(c.value=y.value),y.value=null}return($,x)=>(K(),H("div",gg,[u("div",bg,[u("div",wg,[(K(),H(Re,null,ut(t,le=>u("button",{key:le.key,class:et(["seg-btn",{active:n.value===le.key}]),onClick:ke=>n.value=le.key},re(le.label),11,_g)),64))]),n.value==="custom"?(K(),H(Re,{key:0},[Ee(u("input",{type:"date",class:"input w-date","onUpdate:modelValue":x[0]||(x[0]=le=>s.value=le)},null,512),[[De,s.value]]),x[6]||(x[6]=u("span",{class:"muted"},"至",-1)),Ee(u("input",{type:"date",class:"input w-date","onUpdate:modelValue":x[1]||(x[1]=le=>o.value=le)},null,512),[[De,o.value]])],64)):Se("",!0),x[10]||(x[10]=u("span",{class:"flex1"},null,-1)),u("button",{class:"btn btn-sm",disabled:h.value,onClick:ae},[Te(lt,{name:"edit",size:14}),x[7]||(x[7]=nn("AI 润色 ",-1))],8,kg),y.value!==null?(K(),H("button",{key:1,class:"btn btn-sm",onClick:Z},"还原润色前")):Se("",!0),u("button",{class:"btn btn-sm",disabled:d.value,onClick:N},[Te(lt,{name:"edit",size:14}),x[8]||(x[8]=nn("重新生成 ",-1))],8,xg),u("button",{class:"btn btn-sm",onClick:de},"复制"),u("button",{class:"btn btn-primary btn-sm",onClick:G},[Te(lt,{name:"export",size:14}),x[9]||(x[9]=nn("导出 Markdown ",-1))])]),m.value?(K(),H("div",Cg,re(m.value),1)):Se("",!0),u("div",Sg,[u("div",Eg,[u("div",$g,[u("div",Ag,"本周周记("+re(k.value)+" 起)",1),x[11]||(x[11]=u("label",{class:"note-label muted"},"本周亮点",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":x[2]||(x[2]=le=>D.value=le),placeholder:"本周最有价值的一件事",onBlur:Q},null,544),[[De,D.value]]),x[12]||(x[12]=u("label",{class:"note-label muted"},"踩的坑",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":x[3]||(x[3]=le=>T.value=le),placeholder:"遇到的问题与教训",onBlur:Q},null,544),[[De,T.value]]),x[13]||(x[13]=u("label",{class:"note-label muted"},"下周计划",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":x[4]||(x[4]=le=>L.value=le),placeholder:"下周准备做什么",onBlur:Q},null,544),[[De,L.value]]),u("div",Pg,re(X.value?"已保存":"失焦自动保存"),1)]),u("div",Tg,[x[14]||(x[14]=u("div",{class:"section-title"},"总结草稿(可编辑)",-1)),Ee(u("textarea",{class:"textarea md-editor","onUpdate:modelValue":x[5]||(x[5]=le=>c.value=le),spellcheck:"false"},null,512),[[De,c.value]])])]),u("div",Og,[a.value?(K(),H("div",Mg,[x[20]||(x[20]=u("div",{class:"section-title"},"数据摘要",-1)),u("div",Ig,[x[15]||(x[15]=u("span",{class:"muted"},"出勤",-1)),u("span",jg,re(a.value.attendDays)+" 天",1)]),u("div",Dg,[x[16]||(x[16]=u("span",{class:"muted"},"工时",-1)),u("span",Rg,re(a.value.totalHours)+" 小时",1)]),u("div",Lg,[x[17]||(x[17]=u("span",{class:"muted"},"补卡",-1)),u("span",Kg,re(a.value.makeupCount)+" 次",1)]),u("div",Fg,[x[18]||(x[18]=u("span",{class:"muted"},"请假",-1)),u("span",Ng,re(a.value.leaveCount)+" 天",1)]),u("div",Vg,[x[19]||(x[19]=u("span",{class:"muted"},"记录",-1)),u("span",Bg,re(a.value.itemCount)+" 条",1)]),x[21]||(x[21]=u("div",{class:"section-sub"},"分类分布",-1)),(K(!0),H(Re,null,ut(a.value.categoryStats,le=>(K(),H("div",{key:le.key,class:"sum-row"},[u("span",Ug,re(le.label),1),u("span",qg,re(le.count)+" 条 · "+re(le.percent)+"%",1)]))),128)),a.value.categoryStats.length?Se("",!0):(K(),H("div",Hg,"(无)")),x[22]||(x[22]=u("div",{class:"section-sub"},"主要成果",-1)),(K(!0),H(Re,null,ut(a.value.milestones,(le,ke)=>(K(),H("div",{key:"m"+ke,class:"sum-item"},[nn(re(le.content),1),u("span",Wg,"("+re(le.date)+")",1)]))),128)),a.value.milestones.length?Se("",!0):(K(),H("div",zg,"(无)")),x[23]||(x[23]=u("div",{class:"section-sub"},"待跟进",-1)),(K(!0),H(Re,null,ut(a.value.followups,(le,ke)=>(K(),H("div",{key:"f"+ke,class:"sum-item"},[nn(re(le.content),1),u("span",Gg,"("+re(le.date)+")",1)]))),128)),a.value.followups.length?Se("",!0):(K(),H("div",Yg,"(无)")),x[24]||(x[24]=u("div",{class:"section-sub"},"学习与成长",-1)),(K(!0),H(Re,null,ut(a.value.takeaways,(le,ke)=>(K(),H("div",{key:"t"+ke,class:"sum-item"},[nn(re(le.text),1),u("span",Jg,"("+re(le.date)+")",1)]))),128)),a.value.takeaways.length?Se("",!0):(K(),H("div",Xg,"(无)"))])):Se("",!0)])])]))}}),Zg=Gt(Qg,[["__scopeId","data-v-43f9c59b"]]),eb=["aria-label"],tb={class:"dialog-head"},nb={class:"dialog-title"},rb={class:"dialog-body"},sb={class:"form-grid"},ob={class:"field span2"},ib={class:"seg"},ab={class:"field"},lb={class:"field"},ub={class:"field"},cb=["value"],fb={key:0,class:"field"},db={class:"seg"},pb={class:"field span2"},hb={key:0,class:"form-error"},vb={class:"dialog-btns"},mb=Vt({__name:"TransactionDialog",props:{open:{type:Boolean},title:{},initial:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,s=t,o=V("expense"),a=V("餐饮"),c=V(""),d=V(""),h=V(""),y=V(!1),m=V(!1),k=V(""),D=V(null);function T(Q){n.open&&Q.key==="Escape"&&s("cancel")}gt(()=>n.open,async Q=>{var E;Q?(o.value=n.initial.type==="income"?"income":"expense",a.value=n.initial.category,c.value=n.initial.amountYuan,d.value=n.initial.date,h.value=n.initial.note,y.value=n.initial.reimbursable===1,m.value=n.initial.reimbursed===1,k.value="",window.addEventListener("keydown",T),await ts(),(E=D.value)==null||E.focus()):window.removeEventListener("keydown",T)}),dr(()=>window.removeEventListener("keydown",T)),gt(o,Q=>{a.value=Q==="expense"?Wr[0]:Bo[0]});const L=it(()=>o.value==="expense"?Wr:Bo);function X(){return a.value&&L.value.includes(a.value)?a.value:L.value[0]}function ce(){const Q=Number(c.value);if(!c.value.trim()||!isFinite(Q)||Q<=0){k.value="请填写大于 0 的金额";return}if(!d.value){k.value="请选择日期";return}const E=o.value==="expense"&&y.value?1:0;s("save",{type:o.value,category:X(),amount:Math.round(Q*100),date:d.value,note:h.value.trim(),reimbursable:E,reimbursed:E&&m.value?1:0})}return(Q,E)=>(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[e.open?(K(),H("div",{key:0,class:"mask",onClick:E[11]||(E[11]=Mr(N=>s("cancel"),["self"]))},[u("div",{class:"dialog",role:"dialog","aria-label":e.title},[u("div",tb,[u("span",nb,re(e.title),1),u("button",{class:"icon-btn",title:"关闭",onClick:E[0]||(E[0]=N=>s("cancel"))},[Te(lt,{name:"close",size:16})])]),u("div",rb,[u("div",sb,[u("div",ob,[E[12]||(E[12]=u("label",null,"类型",-1)),u("div",ib,[u("button",{class:et(["seg-btn",{active:o.value==="expense"}]),onClick:E[1]||(E[1]=N=>o.value="expense")},"支出",2),u("button",{class:et(["seg-btn",{active:o.value==="income"}]),onClick:E[2]||(E[2]=N=>o.value="income")},"收入",2)])]),u("div",ab,[E[13]||(E[13]=u("label",null,"金额(元,必填)",-1)),Ee(u("input",{ref_key:"amountInput",ref:D,class:et(["input",{invalid:k.value}]),"onUpdate:modelValue":E[3]||(E[3]=N=>c.value=N),type:"number",min:"0",step:"0.01",placeholder:"0.00"},null,2),[[De,c.value]])]),u("div",lb,[E[14]||(E[14]=u("label",null,"日期(必填)",-1)),Ee(u("input",{class:"input",type:"date","onUpdate:modelValue":E[4]||(E[4]=N=>d.value=N)},null,512),[[De,d.value]])]),u("div",ub,[E[15]||(E[15]=u("label",null,"分类",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":E[5]||(E[5]=N=>a.value=N)},[(K(!0),H(Re,null,ut(L.value,N=>(K(),H("option",{key:N,value:N},re(N),9,cb))),128))],512),[[Fn,a.value]])]),o.value==="expense"?(K(),H("div",fb,[E[16]||(E[16]=u("label",null,"报销状态",-1)),u("div",db,[u("button",{class:et(["seg-btn",{active:!y.value}]),onClick:E[6]||(E[6]=N=>{y.value=!1,m.value=!1})},"无需报销",2),u("button",{class:et(["seg-btn",{active:y.value&&!m.value}]),onClick:E[7]||(E[7]=N=>{y.value=!0,m.value=!1})},"待报销",2),u("button",{class:et(["seg-btn",{active:y.value&&m.value}]),onClick:E[8]||(E[8]=N=>{y.value=!0,m.value=!0})},"已报销",2)])])):Se("",!0),u("div",pb,[E[17]||(E[17]=u("label",null,"备注",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":E[9]||(E[9]=N=>h.value=N),placeholder:"选填"},null,512),[[De,h.value]])])]),k.value?(K(),H("div",hb,re(k.value),1)):Se("",!0)]),u("div",vb,[u("button",{class:"btn btn-sm",onClick:E[10]||(E[10]=N=>s("cancel"))},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:ce},"保存")])],8,eb)])):Se("",!0)]),_:1})]))}}),yb=Gt(mb,[["__scopeId","data-v-e3568c0d"]]),gb={class:"ledger-page"},bb={class:"ledger-toolbar"},wb={class:"month-title num"},_b={class:"cards"},kb={class:"card stat-card"},xb={class:"stat-num num amt-income"},Cb={class:"card stat-card"},Sb={class:"stat-num num"},Eb={class:"card stat-card"},$b={class:"card stat-card"},Ab={class:"stat-num num amt-warn"},Pb={class:"card sec"},Tb={class:"form-grid"},Ob={class:"field span2"},Mb={class:"seg"},Ib={class:"field"},jb={class:"field"},Db={class:"field"},Rb=["value"],Lb={key:0,class:"field"},Kb={class:"field span2"},Fb={key:0,class:"form-error"},Nb={class:"form-footer"},Vb=["disabled"],Bb=["disabled"],Ub={key:0,class:"card sec"},qb={class:"bar-label"},Hb={class:"bar-track"},Wb={class:"muted num bar-num"},zb={key:1,class:"card section"},Gb={class:"form-error"},Yb={class:"card table-card"},Jb={class:"tx-table"},Xb={class:"num"},Qb={class:"tag"},Zb={class:"td-note"},ew={key:0,class:"muted"},tw={key:1,class:"tx-done"},nw={key:2,class:"tx-pending"},rw={class:"ops"},sw=["onClick"],ow=["onClick"],iw=["onClick"],aw={key:0},lw={class:"muted vault-note num"},uw=Vt({__name:"LedgerView",setup(e){const t=V(xt()),n=V([]),s=V(!0),o=V("expense"),a=V(""),c=V(Wr[0]),d=V(xt()),h=V(""),y=V(!1),m=V(""),k=V(""),D=V(!1),T=V(!1),L=V(null),X=V({type:"expense",category:Wr[0],amountYuan:"",date:xt(),note:"",reimbursable:0,reimbursed:0}),ce=V(null),Q=it(()=>t.value.slice(0,7)+"-01"),E=it(()=>{const ne=Number(t.value.slice(0,4)),F=Number(t.value.slice(5,7))-1,fe=new Date(ne,F+1,0).getDate();return t.value.slice(0,7)+"-"+(fe<10?"0"+fe:String(fe))}),N=it(()=>Number(t.value.slice(0,4))+" 年 "+Number(t.value.slice(5,7))+" 月");async function G(){s.value=!0;try{n.value=await Nv(Q.value,E.value),k.value=""}catch(ne){k.value="账目加载失败:"+(ne instanceof Error?ne.stack||ne.message:String(ne)),We("账目加载失败")}s.value=!1}fn(G),gt(t,G),gt(o,ne=>{c.value=ne==="expense"?Wr[0]:Bo[0]});const de=it(()=>n.value.slice().sort((ne,F)=>ne.date===F.date?F.id-ne.id:ne.date{let ne=0,F=0,fe=0;for(const Ke of n.value)Ke.type==="income"?ne+=Ke.amount:(F+=Ke.amount,Ke.reimbursable===1&&Ke.reimbursed!==1&&(fe+=Ke.amount));return{income:ne,expense:F,pending:fe,balance:ne-F}}),Z=V("all"),$=V("all"),x=it(()=>de.value.filter(ne=>!(Z.value!=="all"&&ne.type!==Z.value||$.value==="pending"&&!(ne.type==="expense"&&ne.reimbursable===1&&ne.reimbursed!==1)||$.value==="done"&&!(ne.reimbursable===1&&ne.reimbursed===1)))),le=it(()=>{const ne=new Map;let F=0;for(const Ke of n.value)Ke.type==="expense"&&(ne.set(Ke.category,(ne.get(Ke.category)||0)+Ke.amount),F+=Ke.amount);const fe=F||1;return Array.from(ne.entries()).map(Ke=>({name:Ke[0],amount:Ke[1],percent:Math.round(Ke[1]/fe*100)})).sort((Ke,ct)=>ct.amount-Ke.amount)});function ke(ne){return(ne/100).toFixed(2)}function J(ne){return(ne.type==="income"?"+":"-")+ke(ne.amount)}function xe(){t.value=Uo(t.value,-1)}function Ve(){t.value=Uo(t.value,1)}function nt(){t.value=xt()}gt(a,()=>{m.value&&(m.value="")});async function qe(){const ne=Number(a.value);if(!a.value.trim()||!isFinite(ne)||ne<=0){m.value="请填写大于 0 的金额";return}if(!d.value){m.value="请选择日期";return}if(!D.value){D.value=!0;try{await Vv({type:o.value,category:c.value,amount:Math.round(ne*100),date:d.value,note:h.value.trim(),reimbursable:o.value==="expense"&&y.value?1:0,reimbursed:0})}catch(F){We("添加失败:"+(F instanceof Error?F.message:String(F))),D.value=!1;return}a.value="",h.value="",y.value=!1,m.value="",await G(),We("记账已添加"),D.value=!1}}function He(){a.value="",h.value="",y.value=!1,m.value=""}async function ge(ne){await qv(ne.id),await G(),We("已标记为已报销")}function Oe(ne){L.value=ne.id,X.value={type:ne.type,category:ne.category,amountYuan:ke(ne.amount),date:ne.date,note:ne.note||"",reimbursable:ne.reimbursable,reimbursed:ne.reimbursed},T.value=!0}async function Fe(ne){const F=L.value;await Bv(F,ne),T.value=!1,await G(),We("账目已更新")}async function je(){ce.value&&ce.value.id&&await Uv(ce.value.id),ce.value=null,await G(),We("账目已删除")}return(ne,F)=>(K(),H("div",gb,[u("div",bb,[u("button",{class:"icon-btn",onClick:xe},[Te(lt,{name:"chevron-left",size:16})]),u("span",wb,re(N.value),1),u("button",{class:"icon-btn",onClick:Ve},[Te(lt,{name:"chevron-right",size:16})]),u("button",{class:"btn btn-sm",onClick:nt},"回到本月"),F[13]||(F[13]=u("span",{class:"flex1"},null,-1)),Ee(u("select",{class:"select w-filter","onUpdate:modelValue":F[0]||(F[0]=fe=>Z.value=fe)},[...F[11]||(F[11]=[u("option",{value:"all"},"全部类型",-1),u("option",{value:"expense"},"仅支出",-1),u("option",{value:"income"},"仅收入",-1)])],512),[[Fn,Z.value]]),Ee(u("select",{class:"select w-filter","onUpdate:modelValue":F[1]||(F[1]=fe=>$.value=fe)},[...F[12]||(F[12]=[u("option",{value:"all"},"全部报销",-1),u("option",{value:"pending"},"待报销",-1),u("option",{value:"done"},"已报销",-1)])],512),[[Fn,$.value]])]),u("div",_b,[u("div",kb,[F[14]||(F[14]=u("div",{class:"muted"},"本月收入(元)",-1)),u("div",xb,re(ke(ae.value.income)),1)]),u("div",Cb,[F[15]||(F[15]=u("div",{class:"muted"},"本月支出(元)",-1)),u("div",Sb,re(ke(ae.value.expense)),1)]),u("div",Eb,[F[16]||(F[16]=u("div",{class:"muted"},"本月结余(元)",-1)),u("div",{class:et(["stat-num num",{"amt-income":ae.value.balance>=0,"amt-expense":ae.value.balance<0}])},re(ke(ae.value.balance)),3)]),u("div",$b,[F[17]||(F[17]=u("div",{class:"muted"},"待报销(元)",-1)),u("div",Ab,re(ke(ae.value.pending)),1)])]),u("div",Pb,[F[24]||(F[24]=u("div",{class:"sec-head"},[u("span",{class:"sec-title"},"新增一笔"),u("span",{class:"muted form-hint"},"金额必填,回车快速添加")],-1)),u("div",Tb,[u("div",Ob,[F[18]||(F[18]=u("label",null,"类型",-1)),u("div",Mb,[u("button",{class:et(["seg-btn",{active:o.value==="expense"}]),onClick:F[2]||(F[2]=fe=>o.value="expense")},"支出",2),u("button",{class:et(["seg-btn",{active:o.value==="income"}]),onClick:F[3]||(F[3]=fe=>o.value="income")},"收入",2)])]),u("div",Ib,[F[19]||(F[19]=u("label",null,"金额(元,必填)",-1)),Ee(u("input",{class:et(["input",{invalid:m.value}]),"onUpdate:modelValue":F[4]||(F[4]=fe=>a.value=fe),type:"number",min:"0",step:"0.01",placeholder:"0.00",onKeydown:jt(qe,["enter"])},null,34),[[De,a.value]])]),u("div",jb,[F[20]||(F[20]=u("label",null,"日期",-1)),Ee(u("input",{class:"input",type:"date","onUpdate:modelValue":F[5]||(F[5]=fe=>d.value=fe)},null,512),[[De,d.value]])]),u("div",Db,[F[21]||(F[21]=u("label",null,"分类",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":F[6]||(F[6]=fe=>c.value=fe)},[(K(!0),H(Re,null,ut(o.value==="expense"?Qt(Wr):Qt(Bo),fe=>(K(),H("option",{key:fe,value:fe},re(fe),9,Rb))),128))],512),[[Fn,c.value]])]),o.value==="expense"?(K(),H("div",Lb,[F[22]||(F[22]=u("label",null,"报销",-1)),u("button",{class:et(["toggle-btn",{on:y.value}]),onClick:F[7]||(F[7]=fe=>y.value=!y.value)},re(y.value?"需要报销":"无需报销"),3)])):Se("",!0),u("div",Kb,[F[23]||(F[23]=u("label",null,"备注",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":F[8]||(F[8]=fe=>h.value=fe),placeholder:"选填,如:客户现场午餐",onKeydown:jt(qe,["enter"])},null,544),[[De,h.value]])])]),m.value?(K(),H("div",Fb,re(m.value),1)):Se("",!0),u("div",Nb,[u("button",{class:"btn btn-sm",disabled:!(a.value.trim()||h.value.trim()),onClick:He},"重置",8,Vb),u("button",{class:"btn btn-primary btn-sm",disabled:D.value,onClick:qe},"添加记录",8,Bb)])]),le.value.length?(K(),H("div",Ub,[F[25]||(F[25]=u("div",{class:"sec-title"},"本月支出分类",-1)),(K(!0),H(Re,null,ut(le.value,fe=>(K(),H("div",{key:fe.name,class:"bar-row"},[u("span",qb,re(fe.name),1),u("span",Hb,[u("span",{class:"bar-fill",style:sr({width:fe.percent+"%"})},null,4)]),u("span",Wb,re(ke(fe.amount))+" 元 · "+re(fe.percent)+"%",1)]))),128))])):Se("",!0),k.value?(K(),H("div",zb,[u("div",Gb,re(k.value),1),F[26]||(F[26]=u("div",{class:"muted loc-note"},"请将上方完整错误文字发送给开发者",-1))])):Se("",!0),u("div",Yb,[u("table",Jb,[F[28]||(F[28]=u("thead",null,[u("tr",null,[u("th",null,"日期"),u("th",null,"分类"),u("th",null,"金额(元)"),u("th",null,"备注"),u("th",null,"报销"),u("th",{class:"th-ops"},"操作")])],-1)),u("tbody",null,[(K(!0),H(Re,null,ut(x.value,fe=>(K(),H("tr",{key:fe.id},[u("td",Xb,re(fe.date),1),u("td",null,[u("span",Qb,re(fe.category),1)]),u("td",{class:et(["num",fe.type==="income"?"amt-income":"amt-expense"])},re(J(fe)),3),u("td",Zb,re(fe.note||"--"),1),u("td",null,[fe.type!=="expense"||fe.reimbursable!==1?(K(),H("span",ew,"--")):fe.reimbursed===1?(K(),H("span",tw,"已报销")):(K(),H("span",nw,"待报销"))]),u("td",null,[u("div",rw,[fe.type==="expense"&&fe.reimbursable===1&&fe.reimbursed!==1?(K(),H("button",{key:0,class:"btn btn-xs",onClick:Ke=>ge(fe)},"标记已报销",8,sw)):Se("",!0),u("button",{class:"btn btn-xs",onClick:Ke=>Oe(fe)},"编辑",8,ow),u("button",{class:"btn btn-xs",onClick:Ke=>ce.value=fe},"删除",8,iw)])])]))),128)),!x.value.length&&!s.value?(K(),H("tr",aw,[...F[27]||(F[27]=[u("td",{colspan:"6",class:"empty muted"},"本月暂无账目",-1)])])):Se("",!0)])])]),u("div",lw,"筛选结果 "+re(x.value.length)+" 条 / 本月共 "+re(n.value.length)+" 条",1),Te(yb,{open:T.value,title:(L.value,"编辑账目"),initial:X.value,onCancel:F[9]||(F[9]=fe=>T.value=!1),onSave:Fe},null,8,["open","title","initial"]),Te(ur,{open:!!ce.value,title:"删除确认",message:ce.value?"将删除 "+ce.value.date+" 的账目("+ce.value.category+" "+ke(ce.value.amount)+" 元)。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:F[10]||(F[10]=fe=>ce.value=null),onConfirm:je},null,8,["open","message"])]))}}),cw=Gt(uw,[["__scopeId","data-v-2b678001"]]),fw={class:"memo-page"},dw={class:"card memo-list"},pw={class:"pane-head"},hw={class:"pane-title"},vw={class:"memo-scroll"},mw=["onClick"],yw={class:"memo-item-title"},gw={class:"muted memo-item-sub"},bw={class:"muted num memo-item-time"},ww={key:0,class:"muted empty"},_w={class:"card memo-editor"},kw={class:"editor-foot"},xw={class:"muted foot-info"},Cw=["disabled"],Sw=["disabled"],Ew={key:1,class:"empty muted editor-empty"},$w=Vt({__name:"MemoView",setup(e){const t=V([]),n=V(null),s=V(!1),o=V(""),a=V(""),c=V(null),d=V(null);async function h(){if(t.value=await jv(),n.value&&n.value.id){const ae=t.value.find(Z=>Z.id===n.value.id);ae&&(n.value=ae)}}fn(async()=>{await h(),t.value.length&&k(t.value[0]),window.addEventListener("keydown",y)}),dr(()=>window.removeEventListener("keydown",y)),gt(Aa,async ae=>{if(!ae)return;t.value.length||await h();const Z=t.value.find($=>$.id===ae);Aa.value=null,Z&&D(Z)},{immediate:!0});function y(ae){(ae.ctrlKey||ae.metaKey)&&ae.key.toLowerCase()==="s"&&s.value&&m.value&&(ae.preventDefault(),ce())}const m=it(()=>{if(!s.value)return!1;const ae=n.value?n.value.title:"",Z=n.value?n.value.content:"";return o.value!==ae||a.value!==Z});function k(ae){n.value=ae,s.value=!0,o.value=ae.title,a.value=ae.content}function D(ae){if(!(s.value&&n.value&&n.value.id===ae.id)){if(m.value){d.value={type:"select",memo:ae};return}k(ae)}}function T(){if(m.value){d.value={type:"new"};return}L()}function L(){n.value=null,s.value=!0,o.value="",a.value=""}function X(){n.value?k(n.value):L()}async function ce(){if(!o.value.trim()&&!a.value.trim()){We("标题与内容不能都为空");return}if(n.value&&n.value.id)await Rv(n.value.id,o.value,a.value),We("备忘已保存");else{const ae=await Dv(o.value,a.value);n.value=ae,o.value=ae.title,a.value=ae.content,We("备忘已创建")}await h()}function Q(){n.value&&n.value.id&&(c.value=n.value)}async function E(){c.value&&c.value.id&&(await Lv(c.value.id),We("备忘已删除")),c.value=null,await h(),L()}function N(){const ae=d.value;d.value=null,ae&&(ae.type==="select"?k(ae.memo):L())}function G(ae){return(ae.content||"").replace(/\s+/g," ").slice(0,30)}function de(ae){return ae.replace("T"," ").slice(0,16)}return(ae,Z)=>(K(),H("div",fw,[u("aside",dw,[u("div",pw,[u("span",hw,"备忘录("+re(t.value.length)+")",1),u("button",{class:"btn btn-primary btn-sm",onClick:T},"新建")]),u("div",vw,[(K(!0),H(Re,null,ut(t.value,$=>(K(),H("div",{key:$.id,class:et(["memo-item",{active:s.value&&n.value&&n.value.id===$.id}]),onClick:x=>D($)},[u("div",yw,re($.title||"无标题"),1),u("div",gw,re(G($)||"空"),1),u("div",bw,re(de($.updated_at)),1)],10,mw))),128)),t.value.length?Se("",!0):(K(),H("div",ww,"暂无备忘"))])]),u("section",_w,[s.value?(K(),H(Re,{key:0},[Ee(u("input",{class:"input title-input","onUpdate:modelValue":Z[0]||(Z[0]=$=>o.value=$),placeholder:"标题"},null,512),[[De,o.value]]),Ee(u("textarea",{class:"textarea content-textarea","onUpdate:modelValue":Z[1]||(Z[1]=$=>a.value=$),placeholder:"内容"},null,512),[[De,a.value]]),u("div",kw,[u("span",xw,[m.value?(K(),H(Re,{key:0},[nn("有未保存修改")],64)):n.value&&n.value.id?(K(),H(Re,{key:1},[nn("更新于 "+re(de(n.value.updated_at)),1)],64)):(K(),H(Re,{key:2},[nn("新备忘")],64))]),Z[4]||(Z[4]=u("span",{class:"flex1"},null,-1)),n.value&&n.value.id?(K(),H("button",{key:0,class:"btn btn-sm",onClick:Q},"删除")):Se("",!0),u("button",{class:"btn btn-sm",disabled:!m.value,onClick:X},"放弃修改",8,Cw),u("button",{class:"btn btn-primary btn-sm",disabled:!m.value,onClick:ce},"保存",8,Sw)])],64)):(K(),H("div",Ew,"选择左侧备忘,或点击右上角新建"))]),Te(ur,{open:!!c.value,title:"删除确认",message:c.value?"将删除备忘「"+(c.value.title||"无标题")+"」。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:Z[2]||(Z[2]=$=>c.value=null),onConfirm:E},null,8,["open","message"]),Te(ur,{open:!!d.value,title:"未保存提示",message:"当前备忘有未保存的修改,继续操作将丢失这些修改。","confirm-text":"放弃修改并继续",onCancel:Z[3]||(Z[3]=$=>d.value=null),onConfirm:N},null,8,["open"])]))}}),Aw=Gt($w,[["__scopeId","data-v-74d60dba"]]),Pw=["aria-label"],Tw={class:"dialog-head"},Ow={class:"dialog-title"},Mw={class:"dialog-body"},Iw={class:"form-grid"},jw={class:"field span2"},Dw={class:"field span2"},Rw={class:"field span2"},Lw={class:"pwd-row"},Kw={class:"field span2"},Fw={key:0,class:"form-error"},Nw={class:"dialog-btns"},Vw=Vt({__name:"CredentialDialog",props:{open:{type:Boolean},title:{},initial:{}},emits:["cancel","save"],setup(e,{emit:t}){const n=e,s=t,o=V(""),a=V(""),c=V(""),d=V(""),h=V(""),y=V(null);function m(T){n.open&&T.key==="Escape"&&s("cancel")}gt(()=>n.open,async T=>{var L;T?(o.value=n.initial.system,a.value=n.initial.account,c.value=n.initial.password,d.value=n.initial.remark,h.value="",window.addEventListener("keydown",m),await ts(),(L=y.value)==null||L.focus()):window.removeEventListener("keydown",m)}),dr(()=>window.removeEventListener("keydown",m));function k(){const T="ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789",L="!@#$%^&*",X=crypto.getRandomValues(new Uint8Array(14));let ce="";for(let Q=0;Q(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[e.open?(K(),H("div",{key:0,class:"mask",onClick:L[6]||(L[6]=Mr(X=>s("cancel"),["self"]))},[u("div",{class:"dialog",role:"dialog","aria-label":e.title},[u("div",Tw,[u("span",Ow,re(e.title),1),u("button",{class:"icon-btn",title:"关闭",onClick:L[0]||(L[0]=X=>s("cancel"))},[Te(lt,{name:"close",size:16})])]),u("div",Mw,[u("div",Iw,[u("div",jw,[L[7]||(L[7]=u("label",null,"系统名称(必填)",-1)),Ee(u("input",{ref_key:"systemInput",ref:y,class:"input","onUpdate:modelValue":L[1]||(L[1]=X=>o.value=X),placeholder:"如:企业邮箱 / OA / VPN"},null,512),[[De,o.value]])]),u("div",Dw,[L[8]||(L[8]=u("label",null,"账号(必填)",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":L[2]||(L[2]=X=>a.value=X),placeholder:"用户名、工号或邮箱"},null,512),[[De,a.value]])]),u("div",Rw,[L[9]||(L[9]=u("label",null,"密码(必填)",-1)),u("div",Lw,[Ee(u("input",{class:"input","onUpdate:modelValue":L[3]||(L[3]=X=>c.value=X),placeholder:"输入或点击生成"},null,512),[[De,c.value]]),u("button",{class:"btn btn-sm",onClick:k},"生成")])]),u("div",Kw,[L[10]||(L[10]=u("label",null,"备注",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":L[4]||(L[4]=X=>d.value=X),placeholder:"用途、到期时间、负责人等(选填)"},null,512),[[De,d.value]])])]),h.value?(K(),H("div",Fw,re(h.value),1)):Se("",!0)]),u("div",Nw,[u("button",{class:"btn btn-sm",onClick:L[5]||(L[5]=X=>s("cancel"))},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:D},"保存")])],8,Pw)])):Se("",!0)]),_:1})]))}}),Bw=Gt(Vw,[["__scopeId","data-v-f383b0a6"]]),hf=15e4;function Ho(e){const t=new Uint8Array(e);let n="";for(let s=0;s{n.value&&(Jo(),n.value=!1,y.value=[],k.value={},We("长时间未操作,密码库已自动锁定"))},O_)}function $(){n.value&&Z()}fn(async()=>{t.value=await mf(),window.addEventListener("click",$),window.addEventListener("keydown",$),n.value&&Z()}),dr(()=>{window.removeEventListener("click",$),window.removeEventListener("keydown",$),ae!==null&&window.clearTimeout(ae)});const x=it(()=>{const ne=m.value.trim().toLowerCase();return ne?y.value.filter(F=>(F.system+" "+F.account+" "+(F.remark||"")).toLowerCase().includes(ne)):y.value});async function le(){if(!s.value){if(c.value="",!o.value){c.value="请输入主密码";return}if(o.value.length<6){c.value="主密码至少 6 位";return}if(o.value!==a.value){c.value="两次输入的主密码不一致";return}s.value=!0;try{await qw(o.value),o.value="",a.value="",n.value=!0,Z(),await de(),We("主密码已设置,密码库已解锁")}catch(ne){c.value=ne instanceof Error?ne.message:"设置失败"}s.value=!1}}async function ke(){if(!s.value){if(h.value="",!d.value){h.value="请输入主密码";return}s.value=!0;try{await Hw(d.value),d.value="",n.value=!0,Z(),await de()}catch(ne){h.value=ne instanceof Error?ne.message:"解锁失败"}s.value=!1}}function J(){Jo(),n.value=!1,y.value=[],k.value={},ae!==null&&window.clearTimeout(ae),We("密码库已锁定")}async function xe(ne){const F=ne.id;if(k.value[F]){k.value[F]=!1;return}try{ne.passwordPlain=await ca(F),k.value[F]=!0}catch(fe){We(fe instanceof Error?fe.message:"解密失败")}}async function Ve(ne){try{const F=await ca(ne.id);await Pa(F),We("密码已复制")}catch(F){We(F instanceof Error?F.message:"复制失败")}}async function nt(ne){await Pa(ne.account),We("账号已复制")}function qe(){T.value=null,L.value={system:"",account:"",password:"",remark:""},D.value=!0}async function He(ne){try{const F=await ca(ne.id);T.value=ne.id,L.value={system:ne.system,account:ne.account,password:F,remark:ne.remark||""},D.value=!0}catch(F){We(F instanceof Error?F.message:"解密失败")}}async function ge(ne){const F=T.value??void 0;await Yw(ne,F),D.value=!1,await de(),We(F?"账号已更新":"账号已添加")}async function Oe(){X.value&&X.value.id&&(await Jw(X.value.id),We("账号已删除")),X.value=null,await de()}function Fe(){Q.value="",E.value="",N.value="",G.value="",ce.value=!0}async function je(){G.value="";try{const ne=await Xw(Q.value,E.value);ce.value=!1,Q.value="",E.value="",N.value="",We("主密码已修改,"+ne+" 条账号密码已重新加密")}catch(ne){G.value=ne instanceof Error?ne.message:"修改失败"}}return(ne,F)=>(K(),H("div",Zw,[t.value===null?(K(),H("div",e_,"加载中")):n.value?(K(),H(Re,{key:2},[u("div",a_,[u("div",l_,[Te(lt,{name:"search",size:14,class:"search-icon"}),Ee(u("input",{class:"input","onUpdate:modelValue":F[3]||(F[3]=fe=>m.value=fe),placeholder:"搜索系统名称、账号或备注"},null,512),[[De,m.value]])]),F[16]||(F[16]=u("span",{class:"flex1"},null,-1)),u("button",{class:"btn btn-sm",onClick:Fe},"修改主密码"),u("button",{class:"btn btn-sm",onClick:J},"锁定"),u("button",{class:"btn btn-primary btn-sm",onClick:qe},"新增账号")]),u("div",u_,[u("table",c_,[F[18]||(F[18]=u("thead",null,[u("tr",null,[u("th",null,"系统名称"),u("th",null,"账号"),u("th",null,"密码"),u("th",null,"备注"),u("th",{class:"th-ops"},"操作")])],-1)),u("tbody",null,[(K(!0),H(Re,null,ut(x.value,fe=>(K(),H("tr",{key:fe.id},[u("td",f_,re(fe.system),1),u("td",null,[u("span",{class:"copyable",title:"点击复制账号",onClick:Ke=>nt(fe)},re(fe.account),9,d_)]),u("td",null,[u("div",p_,[u("span",h_,re(k.value[fe.id]?fe.passwordPlain:"........"),1),u("button",{class:"btn btn-xs",onClick:Ke=>xe(fe)},re(k.value[fe.id]?"隐藏":"显示"),9,v_),u("button",{class:"btn btn-xs",onClick:Ke=>Ve(fe)},"复制",8,m_)])]),u("td",y_,re(fe.remark||"--"),1),u("td",null,[u("div",g_,[u("button",{class:"btn btn-xs",onClick:Ke=>He(fe)},"编辑",8,b_),u("button",{class:"btn btn-xs",onClick:Ke=>X.value=fe},"删除",8,w_)])])]))),128)),x.value.length?Se("",!0):(K(),H("tr",__,[...F[17]||(F[17]=[u("td",{colspan:"5",class:"empty muted"},"暂无账号,点击右上角新增",-1)])]))])])]),u("div",k_,"共 "+re(y.value.length)+" 条账号记录 · 密码以 AES-256-GCM 加密存储于本机",1)],64)):(K(),H("div",t_,[u("div",n_,[Te(lt,{name:"lock",size:26})]),t.value===!1?(K(),H(Re,{key:0},[F[12]||(F[12]=u("div",{class:"lock-title"},"设置主密码",-1)),F[13]||(F[13]=u("div",{class:"muted lock-tip"},"主密码用于加密保存在本机的账号密码,遗忘后无法找回,请务必牢记",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[0]||(F[0]=fe=>o.value=fe),placeholder:"设置主密码(至少 6 位)",onKeydown:jt(le,["enter"])},null,544),[[De,o.value]]),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[1]||(F[1]=fe=>a.value=fe),placeholder:"再次输入主密码",onKeydown:jt(le,["enter"])},null,544),[[De,a.value]]),c.value?(K(),H("div",r_,re(c.value),1)):Se("",!0),u("button",{class:"btn btn-primary lock-btn",disabled:s.value,onClick:le},"完成设置并解锁",8,s_)],64)):(K(),H(Re,{key:1},[F[14]||(F[14]=u("div",{class:"lock-title"},"密码库已锁定",-1)),F[15]||(F[15]=u("div",{class:"muted lock-tip"},"输入主密码解锁后查看与复制密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[2]||(F[2]=fe=>d.value=fe),placeholder:"主密码",onKeydown:jt(ke,["enter"])},null,544),[[De,d.value]]),h.value?(K(),H("div",o_,re(h.value),1)):Se("",!0),u("button",{class:"btn btn-primary lock-btn",disabled:s.value,onClick:ke},"解锁",8,i_)],64))])),Te(Bw,{open:D.value,title:T.value?"编辑账号":"新增账号",initial:L.value,onCancel:F[4]||(F[4]=fe=>D.value=!1),onSave:ge},null,8,["open","title","initial"]),Te(ur,{open:!!X.value,title:"删除确认",message:X.value?"将删除系统「"+X.value.system+"」的账号记录。删除后不可恢复。":"","confirm-text":"删除",danger:"",onCancel:F[5]||(F[5]=fe=>X.value=null),onConfirm:Oe},null,8,["open","message"]),(K(),It(Vs,{to:"body"},[Te(ns,{name:"modal"},{default:fr(()=>[ce.value?(K(),H("div",{key:0,class:"mask",onClick:F[11]||(F[11]=Mr(fe=>ce.value=!1,["self"]))},[u("div",x_,[u("div",C_,[F[19]||(F[19]=u("span",{class:"dialog-title"},"修改主密码",-1)),u("button",{class:"icon-btn",title:"关闭",onClick:F[6]||(F[6]=fe=>ce.value=!1)},[Te(lt,{name:"close",size:16})])]),u("div",S_,[u("div",E_,[F[20]||(F[20]=u("label",null,"旧主密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[7]||(F[7]=fe=>Q.value=fe)},null,512),[[De,Q.value]])]),u("div",$_,[F[21]||(F[21]=u("label",null,"新主密码(至少 6 位)",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[8]||(F[8]=fe=>E.value=fe)},null,512),[[De,E.value]])]),u("div",A_,[F[22]||(F[22]=u("label",null,"确认新主密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":F[9]||(F[9]=fe=>N.value=fe)},null,512),[[De,N.value]])]),G.value?(K(),H("div",P_,re(G.value),1)):Se("",!0),F[23]||(F[23]=u("div",{class:"muted vp-tip"},"确认后所有账号密码将使用新主密码重新加密",-1))]),u("div",T_,[u("button",{class:"btn btn-sm",onClick:F[10]||(F[10]=fe=>ce.value=!1)},"取消"),u("button",{class:"btn btn-primary btn-sm",onClick:je},"确认修改")])])])):Se("",!0)]),_:1})]))]))}}),I_=Gt(M_,[["__scopeId","data-v-6820bc9c"]]);function j_(e){return'"'+(e==null?"":String(e)).replace(/"/g,'""')+'"'}async function Iu(e,t){const s="\uFEFF"+t.map(d=>d.map(j_).join(",")).join(`\r `);if(Zr.isNativePlatform()){const{downloadText:d}=await cf(async()=>{const{downloadText:h}=await Promise.resolve().then(()=>mg);return{downloadText:h}},void 0,import.meta.url);return d(e,s)}const o=new Blob([s],{type:"text/csv;charset=utf-8"}),a=URL.createObjectURL(o),c=document.createElement("a");return c.href=a,c.download=e,c.click(),window.setTimeout(()=>URL.revokeObjectURL(a),1e4),""}class D_ extends Ir{constructor(){super("intern_worklog_users"),this.version(1).stores({user:"id, &username"})}}const Or=new D_,vi="intern_worklog",rl="dsh_session_user";function mi(){try{const e=localStorage.getItem(rl);if(!e)return null;const t=JSON.parse(e);if(t&&t.userId&&t.username)return t}catch{}return null}function gf(e){localStorage.setItem(rl,JSON.stringify(e))}function bf(){localStorage.removeItem(rl)}const sl="dsh_cloud_creds";function wf(e,t){localStorage.setItem(sl,JSON.stringify({username:e,password:t}))}function yi(){try{const e=localStorage.getItem(sl);if(!e)return null;const t=JSON.parse(e);if(t&&t.username&&t.password)return t}catch{}return null}function _f(){localStorage.removeItem(sl)}function ol(e){zh(new rf(vi+"_"+e))}async function R_(e,t,n){const s=e.trim();if(s.length<2||s.length>20)throw new Error("用户名需 2 到 20 个字符");if(t.length<6)throw new Error("登录密码至少 6 位");if(await Or.user.where("username").equals(s).first())throw new Error("用户名已存在");const a=nl(),c=await zo(t,a),d="u_"+Date.now().toString(36)+"_"+Math.random().toString(36).slice(2,6);await Or.user.add({id:d,username:s,pwd_hash:c,pwd_salt:a,created_at:new Date().toISOString()}),ol(d);let h=0;n&&await kf()&&(h=await V_(),await Or.user.update(d,{legacy_imported_at:new Date().toISOString()}));const y={userId:d,username:s};return gf(y),wf(y.username,t),h&&B_(h),y}async function L_(e,t){const n=e.trim(),s=await Or.user.where("username").equals(n).first();if(!s)throw new Error("用户不存在");if(await zo(t,s.pwd_salt)!==s.pwd_hash)throw new Error("密码不正确");ol(s.id);const a={userId:s.id,username:s.username};return gf(a),wf(a.username,t),a}async function K_(){Jo(),sf(),bf(),_f()}async function F_(e,t){const n=mi();if(!n)throw new Error("未登录");if(t.length<6)throw new Error("新密码至少 6 位");const s=await Or.user.get(n.userId);if(!s)throw new Error("用户不存在");if(await zo(e,s.pwd_salt)!==s.pwd_hash)throw new Error("旧密码不正确");const a=nl(),c=await zo(t,a);await Or.user.update(s.id,{pwd_hash:c,pwd_salt:a})}async function N_(){const e=mi();if(!e)throw new Error("未登录");Jo(),sf(),await Ir.delete(vi+"_"+e.userId),await Or.user.delete(e.userId),bf(),_f()}async function kf(){return Ir.exists(vi)}async function V_(){if(!te)throw new Error("用户数据库未就绪");const e=new rf(vi),t=await Promise.all([e.project.toArray(),e.work_log.toArray(),e.log_item.toArray(),e.attendance.toArray(),e.weekly_note.toArray(),e.setting.toArray(),e.memo.toArray(),e.credential.toArray()]);await te.transaction("rw",[te.project,te.work_log,te.log_item,te.attendance,te.weekly_note,te.setting,te.memo,te.credential],async()=>{await Promise.all([te.project.clear(),te.work_log.clear(),te.log_item.clear(),te.attendance.clear(),te.weekly_note.clear(),te.setting.clear(),te.memo.clear(),te.credential.clear()]),t[0].length&&await te.project.bulkAdd(t[0]),t[1].length&&await te.work_log.bulkAdd(t[1]),t[2].length&&await te.log_item.bulkAdd(t[2]),t[3].length&&await te.attendance.bulkAdd(t[3]),t[4].length&&await te.weekly_note.bulkAdd(t[4]),t[5].length&&await te.setting.bulkAdd(t[5]),t[6].length&&await te.memo.bulkAdd(t[6]),t[7].length&&await te.credential.bulkAdd(t[7])});const n=t[0].length+t[1].length+t[2].length+t[3].length+t[4].length+t[6].length+t[7].length;return e.close(),n}function B_(e){try{sessionStorage.setItem("dsh_migrate_toast",String(e))}catch{}}const U_="https://daywk.linyux.cn",Xo=["project","work_log","log_item","attendance","weekly_note","setting","memo","credential","transaction"],Ta=new Set(["sync_cursor","sync_last_time","sync_token","last_project","last_category"]);function q_(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}function ju(e){const t={...e};return delete t.id,t}function Du(e){return JSON.stringify(e)}async function H_(e){return te.table(e).toArray()}function Oa(e,t){return e==="setting"?t.key:t.id}async function W_(){for(const e of Xo){const t=te.table(e),n=await t.toArray();for(const s of n){if(e==="setting"&&Ta.has(s.key))continue;const o={};s.uuid||(o.uuid=q_()),s.updated_at||(o.updated_at=s.created_at||wt()),Object.keys(o).length&&await t.update(Oa(e,s),o)}}}async function il(){return await yt("sync_base_url","")||U_}async function xf(){const e=yi();if(!e)throw new Error("未登录,无法同步");return{baseUrl:await il(),username:e.username,password:e.password}}async function z_(){return Ef(await xf())}async function Cf(){const e=yi();if(!e)throw new Error("未登录");const t=await il(),n={"Content-Type":"application/json"},s=JSON.stringify({username:e.username,password:e.password});let o=await fetch(t+"/api/auth/register",{method:"POST",headers:n,body:s});if(o.status===409){if(o=await fetch(t+"/api/auth/login",{method:"POST",headers:n,body:s}),!o.ok)throw new Error("云端已存在同名账号且密码不一致,请检查")}else if(!o.ok)throw new Error("云端绑定失败:"+o.status)}async function G_(){return yi()!=null}async function Y_(){return yt("sync_last_time","")}async function Sf(e,t){const n=await fetch(e+"/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t.username.trim(),password:t.password})});if(!n.ok)throw new Error("云端账号或密码不正确");const s=await n.json();if(!s||!s.token)throw new Error("云端登录异常");return String(s.token)}async function J_(e,t){let n=await yt("sync_token","");return n||(n=await Sf(e,t),await kt("sync_token",n),n)}let $s=!1,To=!1,Ma=!1,Gr=null,wn=null,Ia="",Ru=!1,Oo=null;async function Yr(){if($s){To=!0;return}try{if(!await G_())return;await Ef(await xf())}catch{}}function X_(){if(Ru)return;Ru=!0,Oo=Wh(async()=>{const t={};for(const n of Xo)t[n]=await te.table(n).count();return t}).subscribe({next:()=>{Ma||$s||(Gr&&globalThis.clearTimeout(Gr),Gr=globalThis.setTimeout(()=>{Yr()},3e3))},error:()=>{}})}function Q_(){Oo&&(Oo.unsubscribe(),Oo=null),wn&&(wn.close(),wn=null,Ia=""),Gr&&(globalThis.clearTimeout(Gr),Gr=null)}function Z_(e,t){const n=e+"|"+t;if(!(wn&&Ia===n)){wn&&(wn.close(),wn=null);try{wn=new EventSource(e+"/api/events?token="+encodeURIComponent(t)),Ia=n,wn.onmessage=()=>{Yr()}}catch{wn=null}}}async function Ef(e){if($s)return To=!0,{pushed:0,pulled:0,removed:0,at:""};$s=!0,Ma=!0;try{const t=await e1(e);return To&&(To=!1,globalThis.setTimeout(()=>{Yr()},800)),t}finally{$s=!1,Ma=!1}}async function e1(e){const t=e.baseUrl.trim().replace(/\/+$/,"");if(!t)throw new Error("请先配置同步服务地址");await W_();const n=await te.sync_mirror.toArray(),s=new Map;for(const Q of n)s.set(Q.table+"|"+Q.uuid,Q);const o={},a=[];let c=0;for(const Q of Xo){let E=await H_(Q);Q==="setting"&&(E=E.filter(G=>!Ta.has(G.key)));const N=new Map;for(const G of E)N.set(G.uuid,G);for(const[G,de]of N){const ae=ju(de),Z=Du(ae),$=s.get(Q+"|"+G);(!$||$.hash!==Z)&&(o[Q]=o[Q]||[],o[Q].push(ae),c++)}for(const[G,de]of s)G.startsWith(Q+"|")&&!N.has(de.uuid)&&a.push({table:Q,uuid:de.uuid,deleted_at:wt()});o[Q]=o[Q]||[]}const d=await J_(t,e),h=Q=>fetch(t+"/api/sync",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+Q},body:JSON.stringify({device:"client",tables:o,tombstones:a})});let y=await h(d);if(y.status===401){await kt("sync_token","");const Q=await Sf(t,e);await kt("sync_token",Q),y=await h(Q)}if(!y.ok)throw new Error("同步服务返回 "+y.status);const m=await y.json(),k=m.tables||{},D=m.tombstones||[];let T=0,L=0;const X=[];for(const Q of Xo){const E=te.table(Q),N=await E.toArray(),G=new Map;for(const x of N)G.set(x.uuid,x);const de=k[Q]||[],ae=new Map;for(const x of de)ae.set(x.uuid,x);const Z=new Set(D.filter(x=>x.table===Q).map(x=>x.uuid));for(const[x,le]of G)Z.has(x)&&(await E.delete(Oa(Q,le)),L++);for(const x of de){if(Z.has(x.uuid))continue;const le=G.get(x.uuid);if(!le)await E.add({...x}),T++;else{const ke=String(le.updated_at||"");if(String(x.updated_at||"")>ke){const xe={...x};Q==="setting"&&delete xe.key,await E.update(Oa(Q,le),xe),T++}}}const $=await E.toArray();for(const x of $)Q==="setting"&&Ta.has(x.key)||X.push({table:Q,uuid:x.uuid,hash:Du(ju(x))})}await te.sync_mirror.clear(),X.length&&await te.sync_mirror.bulkAdd(X.map(Q=>({...Q}))),Z_(t,d);const ce=wt();return await kt("sync_last_time",ce),{pushed:c,pulled:T,removed:L,at:ce}}const t1={class:"settings"},n1={class:"card section"},r1={class:"muted acc-line"},s1={class:"ai-grid"},o1={class:"rule-item"},i1={class:"rule-item"},a1={class:"rule-item"},l1={key:0,class:"form-error"},u1={class:"rule-save"},c1={class:"card section"},f1={class:"rule-grid"},d1={class:"rule-item"},p1={class:"rule-item"},h1={class:"rule-item"},v1={class:"rule-item"},m1={class:"rule-item"},y1={class:"card section"},g1={class:"proj-add"},b1={key:0,class:"muted proj-tip"},w1=["onKeydown"],_1=["onClick"],k1=["onClick"],x1=["onClick"],C1={key:1,class:"muted"},S1={class:"card section"},E1={class:"card section"},$1={class:"muted acc-line"},A1={class:"rule-item"},P1={class:"rule-save"},T1=["disabled"],O1={key:0,class:"muted acc-line"},M1={key:1,class:"form-error"},I1={class:"card section"},j1={class:"ai-grid"},D1={class:"rule-item"},R1={class:"rule-item"},L1={class:"rule-item"},K1={class:"card section"},F1={class:"backup-row"},N1={key:0,class:"import-error"},V1=Vt({__name:"SettingsView",setup(e){var Ie;const t=V({work_start:"09:00",work_end:"18:00",grace_minutes:10,lunch_minutes:60,remind_weekly:"friday"}),n=V([]),s=V(""),o=V(""),a=V(""),c=V(""),d=V(""),h=V(""),y=V(null),m=V(""),k=V(null),D=V(null),T=V(""),L=V(((Ie=mi())==null?void 0:Ie.username)||""),X=V(""),ce=V(""),Q=V(""),E=V(""),N=V(!1),G="0.2.0",de=V(""),ae=V(""),Z=V(""),$=V(""),x=V(!1),le=V("");async function ke(){var w;de.value=await il(),ae.value=((w=yi())==null?void 0:w.username)||"",le.value=await Y_()}async function J(){await kt("sync_base_url",de.value.trim()),We("同步地址已保存")}async function xe(){$.value="";try{await Cf(),We("云端绑定已重建")}catch(w){$.value=w instanceof Error?w.message:"绑定失败"}}async function Ve(){if(!x.value){$.value="",x.value=!0;try{await J();const w=await z_();le.value=w.at,Z.value="推送 "+w.pushed+" 条 · 拉取 "+w.pulled+" 条 · 删除 "+w.removed+" 条",We("同步完成")}catch(w){$.value=w instanceof Error?w.message:"同步失败"}x.value=!1}}async function nt(){if(E.value="",ce.value!==Q.value){E.value="两次输入的新密码不一致";return}try{await F_(X.value,ce.value),X.value="",ce.value="",Q.value="",We("登录密码已修改")}catch(w){E.value=w instanceof Error?w.message:"修改失败"}}async function qe(){await N_(),window.location.reload()}async function He(){t.value=await jr(),n.value=await Ks(!0),a.value=(await Za()).join(` `),c.value=await yt("ai_base_url",""),d.value=await yt("ai_api_key",""),h.value=await yt("ai_model",""),await ke()}async function ge(){await kt("ai_base_url",c.value.trim()),await kt("ai_api_key",d.value.trim()),await kt("ai_model",h.value.trim()),We("AI 配置已保存")}async function Oe(){const w=xt(),g=await Promise.all([pi("2000-01-01",w),Ks(!0)]),P=g[0],ie=g[1],se=new Map(ie.map(oe=>[oe.id,oe.name])),ue=[["日期","分类","项目","内容","耗时(分钟)","成果","待跟进","收获","备注"]];for(const oe of P)ue.push([oe.date,Qa(oe.category),oe.project_id&&se.get(oe.project_id)||"",oe.content,oe.minutes==null?"":oe.minutes,oe.is_milestone?"是":"",oe.needs_followup?"是":"",oe.takeaway||"",oe.remark||""]);const ye=await Iu("工作记录_"+w.replace(/-/g,"")+".csv",ue);We(ye?"CSV 已导出到:"+ye:"CSV 已导出到系统下载目录")}async function Fe(){const w=xt(),g=await Promise.all([jr(),di("2000-01-01",w)]),P=g[0],ie=g[1],se=["周日","周一","周二","周三","周四","周五","周六"],ue=[["日期","星期","状态","上班时间","下班时间","地点","类型","说明"]];for(const oe of ie){const we=qs(oe,oe.date,P,oe.date===w);ue.push([oe.date,se[rs(oe.date).getDay()],we.label,oe.clock_in_at?Vn(oe.clock_in_at):"",oe.clock_out_at?Vn(oe.clock_out_at):"",oe.location||"",oe.kind==="makeup"?"补卡":oe.kind==="leave"?"休假":"正常",oe.note||""])}const ye=await Iu("考勤记录_"+w.replace(/-/g,"")+".csv",ue);We(ye?"CSV 已导出到:"+ye:"CSV 已导出到系统下载目录")}fn(He);async function je(){await kt("work_start",t.value.work_start),await kt("work_end",t.value.work_end),await kt("grace_minutes",String(t.value.grace_minutes)),await kt("lunch_minutes",String(t.value.lunch_minutes)),await kt("remind_weekly",t.value.remind_weekly),We("打卡规则已保存")}async function ne(){await af(a.value.split(` -`)),We("常用地点已保存")}async function F(){const w=s.value.trim();if(w){try{await bv(w),o.value="",s.value=""}catch{o.value="项目名已存在"}await He()}}function fe(w){y.value=w.id,m.value=w.name}async function Ke(w){const g=m.value.trim();if(g)try{await wv(w.id,g),o.value=""}catch{o.value="项目名已存在"}y.value=null,await He()}async function ct(w){await _v(w.id,w.archived!==1),await He()}async function ht(){try{const w=await Hv(),g=await tl("实习日志备份_"+xt().replace(/-/g,"")+".json",w);We(g?"备份已导出到:"+g:"备份已导出到系统下载目录")}catch(w){We("导出失败:"+(w instanceof Error?w.message:String(w)))}}function Yt(w){const g=w.target,P=g.files&&g.files[0];if(T.value="",!P)return;const ie=P.name;P.text().then(se=>{D.value={name:ie,text:se}}),g.value=""}async function Jt(){if(D.value)try{await Wv(D.value.text),D.value=null,T.value="",await He(),We("数据导入完成")}catch(w){D.value=null,T.value=w instanceof Error?w.message:"导入失败"}}return(w,g)=>(K(),H("div",t1,[u("div",n1,[g[23]||(g[23]=u("div",{class:"section-title"},"账号与隐私",-1)),u("div",r1,"版本 v"+re(Qt(G))+" · 当前用户:"+re(L.value)+" · 每位用户独立数据库隔离存储于本机 · 登录密码仅保存 PBKDF2 哈希",1),u("div",s1,[u("div",o1,[g[20]||(g[20]=u("label",null,"旧登录密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":g[0]||(g[0]=P=>X.value=P)},null,512),[[De,X.value]])]),u("div",i1,[g[21]||(g[21]=u("label",null,"新登录密码(至少 6 位)",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":g[1]||(g[1]=P=>ce.value=P)},null,512),[[De,ce.value]])]),u("div",a1,[g[22]||(g[22]=u("label",null,"确认新登录密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":g[2]||(g[2]=P=>Q.value=P)},null,512),[[De,Q.value]])])]),E.value?(K(),H("div",l1,re(E.value),1)):Se("",!0),u("div",u1,[u("button",{class:"btn btn-primary btn-sm",onClick:nt},"修改登录密码"),u("button",{class:"btn btn-sm btn-danger",onClick:g[3]||(g[3]=P=>N.value=!0)},"删除此用户及全部数据")])]),u("div",c1,[g[30]||(g[30]=u("div",{class:"section-title"},"打卡规则",-1)),u("div",f1,[u("div",d1,[g[24]||(g[24]=u("label",null,"上班时间",-1)),Ee(u("input",{type:"time",class:"input","onUpdate:modelValue":g[4]||(g[4]=P=>t.value.work_start=P)},null,512),[[De,t.value.work_start]])]),u("div",p1,[g[25]||(g[25]=u("label",null,"下班时间",-1)),Ee(u("input",{type:"time",class:"input","onUpdate:modelValue":g[5]||(g[5]=P=>t.value.work_end=P)},null,512),[[De,t.value.work_end]])]),u("div",h1,[g[26]||(g[26]=u("label",null,"迟到宽限(分钟)",-1)),Ee(u("input",{type:"number",class:"input",min:"0","onUpdate:modelValue":g[6]||(g[6]=P=>t.value.grace_minutes=P)},null,512),[[De,t.value.grace_minutes,void 0,{number:!0}]])]),u("div",v1,[g[27]||(g[27]=u("label",null,"午休扣除(分钟)",-1)),Ee(u("input",{type:"number",class:"input",min:"0","onUpdate:modelValue":g[7]||(g[7]=P=>t.value.lunch_minutes=P)},null,512),[[De,t.value.lunch_minutes,void 0,{number:!0}]])]),u("div",m1,[g[29]||(g[29]=u("label",null,"周记提醒",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":g[8]||(g[8]=P=>t.value.remind_weekly=P)},[...g[28]||(g[28]=[u("option",{value:"friday"},"每周五提醒",-1),u("option",{value:"off"},"关闭",-1)])],512),[[Fn,t.value.remind_weekly]])])]),u("div",{class:"rule-save"},[u("button",{class:"btn btn-primary btn-sm",onClick:je},"保存规则")])]),u("div",y1,[g[31]||(g[31]=u("div",{class:"section-title"},"项目管理",-1)),u("div",g1,[Ee(u("input",{class:"input","onUpdate:modelValue":g[9]||(g[9]=P=>s.value=P),placeholder:"新项目名称",onKeydown:jt(F,["enter"])},null,544),[[De,s.value]]),u("button",{class:"btn btn-sm",onClick:F},"添加")]),o.value?(K(),H("div",b1,re(o.value),1)):Se("",!0),(K(!0),H(Re,null,ut(n.value,P=>(K(),H("div",{key:P.id,class:"proj-row"},[y.value===P.id?(K(),H(Re,{key:0},[Ee(u("input",{class:"input","onUpdate:modelValue":g[10]||(g[10]=ie=>m.value=ie),onKeydown:jt(ie=>Ke(P),["enter"])},null,40,w1),[[De,m.value]]),u("button",{class:"btn btn-sm",onClick:ie=>Ke(P)},"保存",8,_1),u("button",{class:"btn btn-sm",onClick:g[11]||(g[11]=ie=>y.value=null)},"取消")],64)):(K(),H(Re,{key:1},[u("span",{class:et(["proj-name",{archived:P.archived===1}])},re(P.name),3),u("button",{class:"icon-btn",title:"重命名",onClick:ie=>fe(P)},[Te(lt,{name:"edit",size:14})],8,k1),u("button",{class:"btn btn-sm",onClick:ie=>ct(P)},re(P.archived===1?"恢复":"归档"),9,x1)],64))]))),128)),n.value.length?Se("",!0):(K(),H("div",C1,"暂无项目,先添加一个"))]),u("div",S1,[g[33]||(g[33]=u("div",{class:"section-title"},"常用地点",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":g[12]||(g[12]=P=>a.value=P),placeholder:"每行一个地点,如:公司、客户现场、出差、居家办公"},null,512),[[De,a.value]]),u("div",{class:"rule-save"},[u("button",{class:"btn btn-primary btn-sm",onClick:ne},"保存地点"),g[32]||(g[32]=u("span",{class:"muted loc-note"},"打卡时可直接输入新地点,保存后自动加入列表",-1))])]),u("div",E1,[g[35]||(g[35]=u("div",{class:"section-title"},"多端数据同步",-1)),u("div",$1,"云端账号:"+re(ae.value||"未绑定")+" · 登录即自动绑定并同步(变更实时推送 + 每 5 分钟兜底);密码库以密文同步,主密码永不出本机",1),u("div",A1,[g[34]||(g[34]=u("label",null,"同步服务地址(默认即可)",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":g[13]||(g[13]=P=>de.value=P),placeholder:"https://daywk.linyux.cn"},null,512),[[De,de.value]])]),u("div",P1,[u("button",{class:"btn btn-sm",onClick:J},"保存地址"),u("button",{class:"btn btn-primary btn-sm",disabled:x.value,onClick:Ve},re(x.value?"同步中":"立即同步"),9,T1),u("button",{class:"btn btn-sm",onClick:xe},"重建云端绑定")]),Z.value?(K(),H("div",O1,"上次同步:"+re(le.value||"--")+" · "+re(Z.value),1)):Se("",!0),$.value?(K(),H("div",M1,re($.value),1)):Se("",!0)]),u("div",I1,[g[40]||(g[40]=u("div",{class:"section-title"},"AI 润色配置(可选)",-1)),u("div",j1,[u("div",D1,[g[36]||(g[36]=u("label",null,"接口地址(OpenAI 兼容,到 /v1 为止)",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":g[14]||(g[14]=P=>c.value=P),placeholder:"https://api.example.com/v1"},null,512),[[De,c.value]])]),u("div",R1,[g[37]||(g[37]=u("label",null,"API Key",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":g[15]||(g[15]=P=>d.value=P),placeholder:"sk-..."},null,512),[[De,d.value]])]),u("div",L1,[g[38]||(g[38]=u("label",null,"模型名称",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":g[16]||(g[16]=P=>h.value=P),placeholder:"如:deepseek-chat"},null,512),[[De,h.value]])])]),u("div",{class:"rule-save"},[u("button",{class:"btn btn-primary btn-sm",onClick:ge},"保存 AI 配置"),g[39]||(g[39]=u("span",{class:"muted loc-note"},"配置仅保存在本机浏览器;总结页可用 AI 润色草稿,需服务端允许浏览器跨域",-1))])]),u("div",K1,[g[41]||(g[41]=u("div",{class:"section-title"},"数据备份",-1)),u("div",F1,[u("button",{class:"btn btn-sm",onClick:ht},"导出 JSON 备份"),u("button",{class:"btn btn-sm",onClick:g[17]||(g[17]=P=>{var ie;return(ie=k.value)==null?void 0:ie.click()})},"导入 JSON 备份"),u("button",{class:"btn btn-sm",onClick:Oe},"导出工作记录 CSV"),u("button",{class:"btn btn-sm",onClick:Fe},"导出考勤 CSV"),u("input",{ref_key:"fileInput",ref:k,type:"file",accept:"application/json,.json",style:{display:"none"},onChange:Yt},null,544)]),T.value?(K(),H("div",N1,re(T.value),1)):Se("",!0),g[42]||(g[42]=u("div",{class:"muted backup-note"},"数据保存在浏览器 IndexedDB 中,建议定期导出 JSON 备份。",-1))]),Te(ur,{open:!!D.value,title:"导入确认",message:D.value?"将从文件「"+D.value.name+"」导入备份。现有全部数据将被覆盖,且不可恢复,请先确认已导出当前备份。":"","confirm-text":"覆盖导入",danger:"",onCancel:g[18]||(g[18]=P=>D.value=null),onConfirm:Jt},null,8,["open","message"]),Te(ur,{open:N.value,title:"删除用户确认",message:"将永久删除用户「"+L.value+"」及其全部数据:工作日志、考勤、备忘录、账号密码库都将被清除,且不可恢复。请确认。","confirm-text":"永久删除",danger:"",onCancel:g[19]||(g[19]=P=>N.value=!1),onConfirm:qe},null,8,["open","message"])]))}}),B1=Gt(V1,[["__scopeId","data-v-81598f02"]]),U1={class:"login-page"},q1={class:"card login-card"},H1={class:"login-brand"},W1={class:"brand-icon"},z1={class:"seg"},G1=["placeholder"],Y1={key:1,class:"mig-row"},J1={key:2,class:"form-error"},X1=["disabled"],Q1=Vt({__name:"LoginView",emits:["login"],setup(e,{emit:t}){const n=t,s=V("login"),o=V(""),a=V(""),c=V(""),d=V(!0),h=V(!1),y=V(""),m=V(!1);fn(async()=>{h.value=await kf()});function k(T){s.value=T,y.value="",c.value=""}async function D(){if(!m.value){y.value="",m.value=!0;try{let T;if(s.value==="login")T=await L_(o.value,a.value);else{if(a.value.length<6){y.value="登录密码至少 6 位",m.value=!1;return}if(a.value!==c.value){y.value="两次输入的密码不一致",m.value=!1;return}T=await R_(o.value,a.value,d.value)}n("login",T)}catch(T){y.value=T instanceof Error?T.message:"操作失败"}m.value=!1}}return(T,L)=>(K(),H("div",U1,[u("div",q1,[u("div",H1,[u("div",W1,[Te(lt,{name:"calendar",size:22})]),L[6]||(L[6]=u("div",{class:"login-title"},"实习工作日志",-1)),L[7]||(L[7]=u("div",{class:"muted login-sub"},"打卡 · 记录 · 总结 · 备忘录 · 密码库",-1)),L[8]||(L[8]=u("div",{class:"muted login-sub"},"每位用户独立数据库,数据彼此隔离并保存在本机",-1))]),u("div",z1,[u("button",{class:et(["seg-btn",{active:s.value==="login"}]),onClick:L[0]||(L[0]=X=>k("login"))},"登录",2),u("button",{class:et(["seg-btn",{active:s.value==="create"}]),onClick:L[1]||(L[1]=X=>k("create"))},"创建用户",2)]),Ee(u("input",{class:"input","onUpdate:modelValue":L[2]||(L[2]=X=>o.value=X),placeholder:"用户名(2 到 20 个字符)",onKeydown:jt(D,["enter"])},null,544),[[De,o.value]]),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":L[3]||(L[3]=X=>a.value=X),placeholder:s.value==="login"?"登录密码":"设置登录密码(至少 6 位)",onKeydown:jt(D,["enter"])},null,40,G1),[[De,a.value]]),s.value==="create"?Ee((K(),H("input",{key:0,type:"password",class:"input","onUpdate:modelValue":L[4]||(L[4]=X=>c.value=X),placeholder:"再次输入密码",onKeydown:jt(D,["enter"])},null,544)),[[De,c.value]]):Se("",!0),s.value==="create"&&h.value?(K(),H("label",Y1,[Ee(u("input",{type:"checkbox","onUpdate:modelValue":L[5]||(L[5]=X=>d.value=X)},null,512),[[$h,d.value]]),L[9]||(L[9]=u("span",null,"导入本机原有工作日志数据到此用户(原数据保留不删除)",-1))])):Se("",!0),y.value?(K(),H("div",J1,re(y.value),1)):Se("",!0),u("button",{class:"btn btn-primary login-btn",disabled:m.value,onClick:D},re(s.value==="login"?"登录":"创建并进入"),9,X1),L[10]||(L[10]=u("div",{class:"muted login-note"}," 登录后自动开启云端同步(密码会保存在本机用于云同步);系统只保存密码哈希,忘记密码将无法访问该用户数据 ",-1))])]))}}),Z1=Gt(Q1,[["__scopeId","data-v-d3d6c8cb"]]),e0={key:1,class:"app"},t0={class:"side"},n0=["data-tip","onClick"],r0={class:"main"},s0={class:"topbar"},o0={class:"title"},i0={class:"gsearch"},a0={key:0,class:"gs-panel"},l0={key:0,class:"gs-group muted"},u0=["onMousedown"],c0={class:"tag"},f0={class:"gs-text"},d0={class:"muted num gs-date"},p0={key:1,class:"gs-group muted"},h0=["onMousedown"],v0={class:"gs-text"},m0={class:"muted gs-sub"},y0={key:1,class:"gs-empty muted"},g0={class:"user-chip num"},b0=["disabled"],w0={class:"num"},_0={class:"content"},k0={class:"content-inner"},x0={class:"toast-wrap"},C0=Vt({__name:"App",setup(e){const t=Gv(),n=V(mi());async function s(ge){n.value=ge,location.hash="#/calendar",de.value="calendar",await ke(),await He(),c();try{await Cf(),await Yr()}catch{}showToast("欢迎,"+ge.username);const Oe=sessionStorage.getItem("dsh_migrate_toast");Oe&&(sessionStorage.removeItem("dsh_migrate_toast"),showToast("已迁移原有数据 "+Oe+" 条"))}async function o(){Q_(),a!==null&&(window.clearInterval(a),a=null),await K_(),n.value=null,de.value="calendar",location.hash="#/calendar",showToast("已退出登录")}let a=null;function c(){X_(),a!==null&&window.clearInterval(a),a=window.setInterval(()=>{Yr()},60*1e3),Yr()}const d=V(null),h=V(""),y=V(!1),m=V({logs:[],memos:[]});let k=null;const D=it(()=>!!(m.value.logs.length||m.value.memos.length));function T(){k&&window.clearTimeout(k);const ge=h.value;k=window.setTimeout(async()=>{const Oe=ge.trim();if(!Oe){m.value={logs:[],memos:[]};return}const Fe=await Promise.all([Kv(Oe,8),Fv(Oe,4)]);m.value={logs:Fe[0],memos:Fe[1]}},200)}function L(){h.value="",m.value={logs:[],memos:[]},y.value=!1}function X(ge){$a.value=ge.date,ae("calendar"),L()}function ce(ge){Aa.value=ge.id,ae("memo"),L()}function Q(){window.setTimeout(()=>{y.value=!1},150)}function E(ge){var Oe;(ge.ctrlKey||ge.metaKey)&&ge.key.toLowerCase()==="k"&&(ge.preventDefault(),(Oe=d.value)==null||Oe.focus())}const N=[{key:"calendar",name:"日历",icon:"calendar"},{key:"today",name:"详情",icon:"edit"},{key:"stats",name:"统计",icon:"chart"},{key:"report",name:"总结",icon:"export"},{key:"ledger",name:"记账",icon:"wallet"},{key:"memo",name:"备忘录",icon:"memo"},{key:"vault",name:"密码库",icon:"lock"},{key:"settings",name:"设置",icon:"settings"}];function G(){const ge=(location.hash||"").replace("#/","");return N.some(Oe=>Oe.key===ge)?ge:"calendar"}const de=V(G());window.addEventListener("hashchange",()=>{de.value=G()});function ae(ge){location.hash="#/"+ge}const Z=it(()=>N.find(ge=>ge.key===de.value)||N[0]),$=V(xt()),x=V(void 0),le=V(!1);async function ke(){if(x.value=await mn($.value),le.value=!1,new Date().getHours()<4){const Oe=await mn(Kn($.value,-1));le.value=!!(Oe&&Oe.clock_in_at&&!Oe.clock_out_at)}}const J=it(()=>{const ge=x.value;return ge&&ge.clock_in_at&&!ge.clock_out_at?!0:le.value&&!(ge&&ge.clock_in_at)}),xe=it(()=>{const ge=x.value;return!!(ge&&ge.clock_in_at&&ge.clock_out_at)}),Ve=it(()=>{const ge=x.value;return J.value?"下班打卡":xe.value?"已打卡 "+Vn(ge==null?void 0:ge.clock_in_at)+" - "+Vn(ge==null?void 0:ge.clock_out_at):"上班打卡"});async function nt(){if(J.value)try{await xv()}catch{}else await lf($.value);await ke(),Sr()}gt(Hs,()=>{n.value&&ke()});const qe=V(!1);async function He(){if((await jr()).remind_weekly==="off"){qe.value=!1;return}const Oe=new Date().getDay();if(Oe===5||Oe===6||Oe===0){const Fe=await el(Es($.value));qe.value=!Fe||!Fe.highlights&&!Fe.challenges&&!Fe.plan_next}else qe.value=!1}return fn(async()=>{window.addEventListener("keydown",E),n.value&&(ol(n.value.userId),await ke(),await He(),c())}),(ge,Oe)=>{var Fe;return n.value?(K(),H("div",e0,[u("nav",t0,[(K(),H(Re,null,ut(N,je=>u("button",{key:je.key,class:et(["nav-btn",{active:de.value===je.key}]),"data-tip":je.name,onClick:ne=>ae(je.key)},[Te(lt,{name:je.icon,size:18},null,8,["name"])],10,n0)),64))]),u("div",r0,[u("header",s0,[u("span",o0,re(Z.value.name),1),u("div",i0,[Te(lt,{name:"search",size:14,class:"gs-icon"}),Ee(u("input",{ref_key:"gsInput",ref:d,class:"input gs-input","onUpdate:modelValue":Oe[0]||(Oe[0]=je=>h.value=je),placeholder:"搜索工作记录与备忘录(Ctrl+K)",onInput:T,onFocus:Oe[1]||(Oe[1]=je=>y.value=!0),onBlur:Q,onKeydown:jt(L,["esc"])},null,544),[[De,h.value]]),y.value&&h.value.trim()?(K(),H("div",a0,[D.value?(K(),H(Re,{key:0},[m.value.logs.length?(K(),H("div",l0,"工作记录")):Se("",!0),(K(!0),H(Re,null,ut(m.value.logs,je=>(K(),H("div",{key:"l"+je.id,class:"gs-item",onMousedown:Mr(ne=>X(je),["prevent"])},[u("span",c0,re(Qt(Qa)(je.category)),1),u("span",f0,re(je.content),1),u("span",d0,re(je.date),1)],40,u0))),128)),m.value.memos.length?(K(),H("div",p0,"备忘录")):Se("",!0),(K(!0),H(Re,null,ut(m.value.memos,je=>(K(),H("div",{key:"m"+je.id,class:"gs-item",onMousedown:Mr(ne=>ce(je),["prevent"])},[u("span",v0,re(je.title||"无标题"),1),u("span",m0,re(je.content),1)],40,h0))),128))],64)):(K(),H("div",y0,"无匹配结果"))])):Se("",!0)]),Oe[4]||(Oe[4]=u("span",{class:"flex1"},null,-1)),qe.value?(K(),H("button",{key:0,class:"week-tip",onClick:Oe[2]||(Oe[2]=je=>ae("report"))},[...Oe[3]||(Oe[3]=[u("span",{class:"dot",style:{background:"var(--warn)"}},null,-1),nn(" 填写本周周记 ",-1)])])):Se("",!0),u("span",g0,re((Fe=n.value)==null?void 0:Fe.username),1),u("button",{class:"btn btn-sm",onClick:o},"退出"),u("button",{class:"btn btn-primary btn-sm",disabled:xe.value,onClick:nt},[Te(lt,{name:xe.value?"check-circle":"clock",size:14},null,8,["name"]),u("span",w0,re(Ve.value),1)],8,b0)]),u("main",_0,[u("div",k0,[de.value==="calendar"?(K(),It(yy,{key:0})):de.value==="today"?(K(),It(xy,{key:1})):de.value==="stats"?(K(),It(eg,{key:2})):de.value==="report"?(K(),It(Zg,{key:3})):de.value==="ledger"?(K(),It(cw,{key:4})):de.value==="memo"?(K(),It(Aw,{key:5})):de.value==="vault"?(K(),It(I_,{key:6})):(K(),It(B1,{key:7}))])])]),u("div",x0,[Te(gh,{name:"toast"},{default:fr(()=>[(K(!0),H(Re,null,ut(Qt(t),je=>(K(),H("div",{key:je.id,class:"toast"},re(je.text),1))),128))]),_:1})])])):(K(),It(Z1,{key:0,onLogin:s}))}}}),S0=Gt(C0,[["__scopeId","data-v-219a8436"]]);jh(S0).mount("#app");"serviceWorker"in navigator&&location.protocol.startsWith("http")&&window.addEventListener("load",()=>{navigator.serviceWorker.register("sw.js").catch(()=>{})});export{pf as W,cf as _,hg as b,df as r}; +`)),We("常用地点已保存")}async function F(){const w=s.value.trim();if(w){try{await bv(w),o.value="",s.value=""}catch{o.value="项目名已存在"}await He()}}function fe(w){y.value=w.id,m.value=w.name}async function Ke(w){const g=m.value.trim();if(g)try{await wv(w.id,g),o.value=""}catch{o.value="项目名已存在"}y.value=null,await He()}async function ct(w){await _v(w.id,w.archived!==1),await He()}async function ht(){try{const w=await Hv(),g=await tl("实习日志备份_"+xt().replace(/-/g,"")+".json",w);We(g?"备份已导出到:"+g:"备份已导出到系统下载目录")}catch(w){We("导出失败:"+(w instanceof Error?w.message:String(w)))}}function Yt(w){const g=w.target,P=g.files&&g.files[0];if(T.value="",!P)return;const ie=P.name;P.text().then(se=>{D.value={name:ie,text:se}}),g.value=""}async function Jt(){if(D.value)try{await Wv(D.value.text),D.value=null,T.value="",await He(),We("数据导入完成")}catch(w){D.value=null,T.value=w instanceof Error?w.message:"导入失败"}}return(w,g)=>(K(),H("div",t1,[u("div",n1,[g[23]||(g[23]=u("div",{class:"section-title"},"账号与隐私",-1)),u("div",r1,"版本 v"+re(Qt(G))+" · 当前用户:"+re(L.value)+" · 每位用户独立数据库隔离存储于本机 · 登录密码仅保存 PBKDF2 哈希",1),u("div",s1,[u("div",o1,[g[20]||(g[20]=u("label",null,"旧登录密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":g[0]||(g[0]=P=>X.value=P)},null,512),[[De,X.value]])]),u("div",i1,[g[21]||(g[21]=u("label",null,"新登录密码(至少 6 位)",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":g[1]||(g[1]=P=>ce.value=P)},null,512),[[De,ce.value]])]),u("div",a1,[g[22]||(g[22]=u("label",null,"确认新登录密码",-1)),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":g[2]||(g[2]=P=>Q.value=P)},null,512),[[De,Q.value]])])]),E.value?(K(),H("div",l1,re(E.value),1)):Se("",!0),u("div",u1,[u("button",{class:"btn btn-primary btn-sm",onClick:nt},"修改登录密码"),u("button",{class:"btn btn-sm btn-danger",onClick:g[3]||(g[3]=P=>N.value=!0)},"删除此用户及全部数据")])]),u("div",c1,[g[30]||(g[30]=u("div",{class:"section-title"},"打卡规则",-1)),u("div",f1,[u("div",d1,[g[24]||(g[24]=u("label",null,"上班时间",-1)),Ee(u("input",{type:"time",class:"input","onUpdate:modelValue":g[4]||(g[4]=P=>t.value.work_start=P)},null,512),[[De,t.value.work_start]])]),u("div",p1,[g[25]||(g[25]=u("label",null,"下班时间",-1)),Ee(u("input",{type:"time",class:"input","onUpdate:modelValue":g[5]||(g[5]=P=>t.value.work_end=P)},null,512),[[De,t.value.work_end]])]),u("div",h1,[g[26]||(g[26]=u("label",null,"迟到宽限(分钟)",-1)),Ee(u("input",{type:"number",class:"input",min:"0","onUpdate:modelValue":g[6]||(g[6]=P=>t.value.grace_minutes=P)},null,512),[[De,t.value.grace_minutes,void 0,{number:!0}]])]),u("div",v1,[g[27]||(g[27]=u("label",null,"午休扣除(分钟)",-1)),Ee(u("input",{type:"number",class:"input",min:"0","onUpdate:modelValue":g[7]||(g[7]=P=>t.value.lunch_minutes=P)},null,512),[[De,t.value.lunch_minutes,void 0,{number:!0}]])]),u("div",m1,[g[29]||(g[29]=u("label",null,"周记提醒",-1)),Ee(u("select",{class:"select","onUpdate:modelValue":g[8]||(g[8]=P=>t.value.remind_weekly=P)},[...g[28]||(g[28]=[u("option",{value:"friday"},"每周五提醒",-1),u("option",{value:"off"},"关闭",-1)])],512),[[Fn,t.value.remind_weekly]])])]),u("div",{class:"rule-save"},[u("button",{class:"btn btn-primary btn-sm",onClick:je},"保存规则")])]),u("div",y1,[g[31]||(g[31]=u("div",{class:"section-title"},"项目管理",-1)),u("div",g1,[Ee(u("input",{class:"input","onUpdate:modelValue":g[9]||(g[9]=P=>s.value=P),placeholder:"新项目名称",onKeydown:jt(F,["enter"])},null,544),[[De,s.value]]),u("button",{class:"btn btn-sm",onClick:F},"添加")]),o.value?(K(),H("div",b1,re(o.value),1)):Se("",!0),(K(!0),H(Re,null,ut(n.value,P=>(K(),H("div",{key:P.id,class:"proj-row"},[y.value===P.id?(K(),H(Re,{key:0},[Ee(u("input",{class:"input","onUpdate:modelValue":g[10]||(g[10]=ie=>m.value=ie),onKeydown:jt(ie=>Ke(P),["enter"])},null,40,w1),[[De,m.value]]),u("button",{class:"btn btn-sm",onClick:ie=>Ke(P)},"保存",8,_1),u("button",{class:"btn btn-sm",onClick:g[11]||(g[11]=ie=>y.value=null)},"取消")],64)):(K(),H(Re,{key:1},[u("span",{class:et(["proj-name",{archived:P.archived===1}])},re(P.name),3),u("button",{class:"icon-btn",title:"重命名",onClick:ie=>fe(P)},[Te(lt,{name:"edit",size:14})],8,k1),u("button",{class:"btn btn-sm",onClick:ie=>ct(P)},re(P.archived===1?"恢复":"归档"),9,x1)],64))]))),128)),n.value.length?Se("",!0):(K(),H("div",C1,"暂无项目,先添加一个"))]),u("div",S1,[g[33]||(g[33]=u("div",{class:"section-title"},"常用地点",-1)),Ee(u("textarea",{class:"textarea","onUpdate:modelValue":g[12]||(g[12]=P=>a.value=P),placeholder:"每行一个地点,如:公司、客户现场、出差、居家办公"},null,512),[[De,a.value]]),u("div",{class:"rule-save"},[u("button",{class:"btn btn-primary btn-sm",onClick:ne},"保存地点"),g[32]||(g[32]=u("span",{class:"muted loc-note"},"打卡时可直接输入新地点,保存后自动加入列表",-1))])]),u("div",E1,[g[35]||(g[35]=u("div",{class:"section-title"},"多端数据同步",-1)),u("div",$1,"云端账号:"+re(ae.value||"未绑定")+" · 登录即自动绑定并同步(变更实时推送 + 每 5 分钟兜底);密码库以密文同步,主密码永不出本机",1),u("div",A1,[g[34]||(g[34]=u("label",null,"同步服务地址(默认即可)",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":g[13]||(g[13]=P=>de.value=P),placeholder:"https://daywk.linyux.cn"},null,512),[[De,de.value]])]),u("div",P1,[u("button",{class:"btn btn-sm",onClick:J},"保存地址"),u("button",{class:"btn btn-primary btn-sm",disabled:x.value,onClick:Ve},re(x.value?"同步中":"立即同步"),9,T1),u("button",{class:"btn btn-sm",onClick:xe},"重建云端绑定")]),Z.value?(K(),H("div",O1,"上次同步:"+re(le.value||"--")+" · "+re(Z.value),1)):Se("",!0),$.value?(K(),H("div",M1,re($.value),1)):Se("",!0)]),u("div",I1,[g[40]||(g[40]=u("div",{class:"section-title"},"AI 润色配置(可选)",-1)),u("div",j1,[u("div",D1,[g[36]||(g[36]=u("label",null,"接口地址(OpenAI 兼容,到 /v1 为止)",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":g[14]||(g[14]=P=>c.value=P),placeholder:"https://api.example.com/v1"},null,512),[[De,c.value]])]),u("div",R1,[g[37]||(g[37]=u("label",null,"API Key",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":g[15]||(g[15]=P=>d.value=P),placeholder:"sk-..."},null,512),[[De,d.value]])]),u("div",L1,[g[38]||(g[38]=u("label",null,"模型名称",-1)),Ee(u("input",{class:"input","onUpdate:modelValue":g[16]||(g[16]=P=>h.value=P),placeholder:"如:deepseek-chat"},null,512),[[De,h.value]])])]),u("div",{class:"rule-save"},[u("button",{class:"btn btn-primary btn-sm",onClick:ge},"保存 AI 配置"),g[39]||(g[39]=u("span",{class:"muted loc-note"},"配置仅保存在本机浏览器;总结页可用 AI 润色草稿,需服务端允许浏览器跨域",-1))])]),u("div",K1,[g[41]||(g[41]=u("div",{class:"section-title"},"数据备份",-1)),u("div",F1,[u("button",{class:"btn btn-sm",onClick:ht},"导出 JSON 备份"),u("button",{class:"btn btn-sm",onClick:g[17]||(g[17]=P=>{var ie;return(ie=k.value)==null?void 0:ie.click()})},"导入 JSON 备份"),u("button",{class:"btn btn-sm",onClick:Oe},"导出工作记录 CSV"),u("button",{class:"btn btn-sm",onClick:Fe},"导出考勤 CSV"),u("input",{ref_key:"fileInput",ref:k,type:"file",accept:"application/json,.json",style:{display:"none"},onChange:Yt},null,544)]),T.value?(K(),H("div",N1,re(T.value),1)):Se("",!0),g[42]||(g[42]=u("div",{class:"muted backup-note"},"数据保存在浏览器 IndexedDB 中,建议定期导出 JSON 备份。",-1))]),Te(ur,{open:!!D.value,title:"导入确认",message:D.value?"将从文件「"+D.value.name+"」导入备份。现有全部数据将被覆盖,且不可恢复,请先确认已导出当前备份。":"","confirm-text":"覆盖导入",danger:"",onCancel:g[18]||(g[18]=P=>D.value=null),onConfirm:Jt},null,8,["open","message"]),Te(ur,{open:N.value,title:"删除用户确认",message:"将永久删除用户「"+L.value+"」及其全部数据:工作日志、考勤、备忘录、账号密码库都将被清除,且不可恢复。请确认。","confirm-text":"永久删除",danger:"",onCancel:g[19]||(g[19]=P=>N.value=!1),onConfirm:qe},null,8,["open","message"])]))}}),B1=Gt(V1,[["__scopeId","data-v-81598f02"]]),U1={class:"login-page"},q1={class:"card login-card"},H1={class:"login-brand"},W1={class:"brand-icon"},z1={class:"seg"},G1=["placeholder"],Y1={key:1,class:"mig-row"},J1={key:2,class:"form-error"},X1=["disabled"],Q1=Vt({__name:"LoginView",emits:["login"],setup(e,{emit:t}){const n=t,s=V("login"),o=V(""),a=V(""),c=V(""),d=V(!0),h=V(!1),y=V(""),m=V(!1);fn(async()=>{h.value=await kf()});function k(T){s.value=T,y.value="",c.value=""}async function D(){if(!m.value){y.value="",m.value=!0;try{let T;if(s.value==="login")T=await L_(o.value,a.value);else{if(a.value.length<6){y.value="登录密码至少 6 位",m.value=!1;return}if(a.value!==c.value){y.value="两次输入的密码不一致",m.value=!1;return}T=await R_(o.value,a.value,d.value)}n("login",T)}catch(T){y.value=T instanceof Error?T.message:"操作失败"}m.value=!1}}return(T,L)=>(K(),H("div",U1,[u("div",q1,[u("div",H1,[u("div",W1,[Te(lt,{name:"calendar",size:22})]),L[6]||(L[6]=u("div",{class:"login-title"},"实习工作日志",-1)),L[7]||(L[7]=u("div",{class:"muted login-sub"},"打卡 · 记录 · 总结 · 备忘录 · 密码库",-1)),L[8]||(L[8]=u("div",{class:"muted login-sub"},"每位用户独立数据库,数据彼此隔离并保存在本机",-1))]),u("div",z1,[u("button",{class:et(["seg-btn",{active:s.value==="login"}]),onClick:L[0]||(L[0]=X=>k("login"))},"登录",2),u("button",{class:et(["seg-btn",{active:s.value==="create"}]),onClick:L[1]||(L[1]=X=>k("create"))},"创建用户",2)]),Ee(u("input",{class:"input","onUpdate:modelValue":L[2]||(L[2]=X=>o.value=X),placeholder:"用户名(2 到 20 个字符)",onKeydown:jt(D,["enter"])},null,544),[[De,o.value]]),Ee(u("input",{type:"password",class:"input","onUpdate:modelValue":L[3]||(L[3]=X=>a.value=X),placeholder:s.value==="login"?"登录密码":"设置登录密码(至少 6 位)",onKeydown:jt(D,["enter"])},null,40,G1),[[De,a.value]]),s.value==="create"?Ee((K(),H("input",{key:0,type:"password",class:"input","onUpdate:modelValue":L[4]||(L[4]=X=>c.value=X),placeholder:"再次输入密码",onKeydown:jt(D,["enter"])},null,544)),[[De,c.value]]):Se("",!0),s.value==="create"&&h.value?(K(),H("label",Y1,[Ee(u("input",{type:"checkbox","onUpdate:modelValue":L[5]||(L[5]=X=>d.value=X)},null,512),[[$h,d.value]]),L[9]||(L[9]=u("span",null,"导入本机原有工作日志数据到此用户(原数据保留不删除)",-1))])):Se("",!0),y.value?(K(),H("div",J1,re(y.value),1)):Se("",!0),u("button",{class:"btn btn-primary login-btn",disabled:m.value,onClick:D},re(s.value==="login"?"登录":"创建并进入"),9,X1),L[10]||(L[10]=u("div",{class:"muted login-note"}," 登录后自动开启云端同步(密码会保存在本机用于云同步);系统只保存密码哈希,忘记密码将无法访问该用户数据 ",-1))])]))}}),Z1=Gt(Q1,[["__scopeId","data-v-d3d6c8cb"]]),e0={key:1,class:"app"},t0={class:"side"},n0=["data-tip","onClick"],r0={class:"main"},s0={class:"topbar"},o0={class:"title"},i0={class:"gsearch"},a0={key:0,class:"gs-panel"},l0={key:0,class:"gs-group muted"},u0=["onMousedown"],c0={class:"tag"},f0={class:"gs-text"},d0={class:"muted num gs-date"},p0={key:1,class:"gs-group muted"},h0=["onMousedown"],v0={class:"gs-text"},m0={class:"muted gs-sub"},y0={key:1,class:"gs-empty muted"},g0={class:"topbar-actions"},b0={class:"user-chip num"},w0=["disabled"],_0={class:"num"},k0={class:"content"},x0={class:"content-inner"},C0={class:"toast-wrap"},S0=Vt({__name:"App",setup(e){const t=Gv(),n=V(mi());async function s(ge){n.value=ge,location.hash="#/calendar",de.value="calendar",await ke(),await He(),c();try{await Cf(),await Yr()}catch{}showToast("欢迎,"+ge.username);const Oe=sessionStorage.getItem("dsh_migrate_toast");Oe&&(sessionStorage.removeItem("dsh_migrate_toast"),showToast("已迁移原有数据 "+Oe+" 条"))}async function o(){Q_(),a!==null&&(window.clearInterval(a),a=null),await K_(),n.value=null,de.value="calendar",location.hash="#/calendar",showToast("已退出登录")}let a=null;function c(){X_(),a!==null&&window.clearInterval(a),a=window.setInterval(()=>{Yr()},60*1e3),Yr()}const d=V(null),h=V(""),y=V(!1),m=V({logs:[],memos:[]});let k=null;const D=it(()=>!!(m.value.logs.length||m.value.memos.length));function T(){k&&window.clearTimeout(k);const ge=h.value;k=window.setTimeout(async()=>{const Oe=ge.trim();if(!Oe){m.value={logs:[],memos:[]};return}const Fe=await Promise.all([Kv(Oe,8),Fv(Oe,4)]);m.value={logs:Fe[0],memos:Fe[1]}},200)}function L(){h.value="",m.value={logs:[],memos:[]},y.value=!1}function X(ge){$a.value=ge.date,ae("calendar"),L()}function ce(ge){Aa.value=ge.id,ae("memo"),L()}function Q(){window.setTimeout(()=>{y.value=!1},150)}function E(ge){var Oe;(ge.ctrlKey||ge.metaKey)&&ge.key.toLowerCase()==="k"&&(ge.preventDefault(),(Oe=d.value)==null||Oe.focus())}const N=[{key:"calendar",name:"日历",icon:"calendar"},{key:"today",name:"详情",icon:"edit"},{key:"stats",name:"统计",icon:"chart"},{key:"report",name:"总结",icon:"export"},{key:"ledger",name:"记账",icon:"wallet"},{key:"memo",name:"备忘录",icon:"memo"},{key:"vault",name:"密码库",icon:"lock"},{key:"settings",name:"设置",icon:"settings"}];function G(){const ge=(location.hash||"").replace("#/","");return N.some(Oe=>Oe.key===ge)?ge:"calendar"}const de=V(G());window.addEventListener("hashchange",()=>{de.value=G()});function ae(ge){location.hash="#/"+ge}const Z=it(()=>N.find(ge=>ge.key===de.value)||N[0]),$=V(xt()),x=V(void 0),le=V(!1);async function ke(){if(x.value=await mn($.value),le.value=!1,new Date().getHours()<4){const Oe=await mn(Kn($.value,-1));le.value=!!(Oe&&Oe.clock_in_at&&!Oe.clock_out_at)}}const J=it(()=>{const ge=x.value;return ge&&ge.clock_in_at&&!ge.clock_out_at?!0:le.value&&!(ge&&ge.clock_in_at)}),xe=it(()=>{const ge=x.value;return!!(ge&&ge.clock_in_at&&ge.clock_out_at)}),Ve=it(()=>{const ge=x.value;return J.value?"下班打卡":xe.value?"已打卡 "+Vn(ge==null?void 0:ge.clock_in_at)+" - "+Vn(ge==null?void 0:ge.clock_out_at):"上班打卡"});async function nt(){if(J.value)try{await xv()}catch{}else await lf($.value);await ke(),Sr()}gt(Hs,()=>{n.value&&ke()});const qe=V(!1);async function He(){if((await jr()).remind_weekly==="off"){qe.value=!1;return}const Oe=new Date().getDay();if(Oe===5||Oe===6||Oe===0){const Fe=await el(Es($.value));qe.value=!Fe||!Fe.highlights&&!Fe.challenges&&!Fe.plan_next}else qe.value=!1}return fn(async()=>{window.addEventListener("keydown",E),n.value&&(ol(n.value.userId),await ke(),await He(),c())}),(ge,Oe)=>{var Fe;return n.value?(K(),H("div",e0,[u("nav",t0,[(K(),H(Re,null,ut(N,je=>u("button",{key:je.key,class:et(["nav-btn",{active:de.value===je.key}]),"data-tip":je.name,onClick:ne=>ae(je.key)},[Te(lt,{name:je.icon,size:18},null,8,["name"])],10,n0)),64))]),u("div",r0,[u("header",s0,[u("span",o0,re(Z.value.name),1),u("div",i0,[Te(lt,{name:"search",size:14,class:"gs-icon"}),Ee(u("input",{ref_key:"gsInput",ref:d,class:"input gs-input","onUpdate:modelValue":Oe[0]||(Oe[0]=je=>h.value=je),placeholder:"搜索工作记录与备忘录(Ctrl+K)",onInput:T,onFocus:Oe[1]||(Oe[1]=je=>y.value=!0),onBlur:Q,onKeydown:jt(L,["esc"])},null,544),[[De,h.value]]),y.value&&h.value.trim()?(K(),H("div",a0,[D.value?(K(),H(Re,{key:0},[m.value.logs.length?(K(),H("div",l0,"工作记录")):Se("",!0),(K(!0),H(Re,null,ut(m.value.logs,je=>(K(),H("div",{key:"l"+je.id,class:"gs-item",onMousedown:Mr(ne=>X(je),["prevent"])},[u("span",c0,re(Qt(Qa)(je.category)),1),u("span",f0,re(je.content),1),u("span",d0,re(je.date),1)],40,u0))),128)),m.value.memos.length?(K(),H("div",p0,"备忘录")):Se("",!0),(K(!0),H(Re,null,ut(m.value.memos,je=>(K(),H("div",{key:"m"+je.id,class:"gs-item",onMousedown:Mr(ne=>ce(je),["prevent"])},[u("span",v0,re(je.title||"无标题"),1),u("span",m0,re(je.content),1)],40,h0))),128))],64)):(K(),H("div",y0,"无匹配结果"))])):Se("",!0)]),Oe[4]||(Oe[4]=u("span",{class:"flex1"},null,-1)),u("div",g0,[qe.value?(K(),H("button",{key:0,class:"week-tip",onClick:Oe[2]||(Oe[2]=je=>ae("report"))},[...Oe[3]||(Oe[3]=[u("span",{class:"dot",style:{background:"var(--warn)"}},null,-1),nn(" 填写本周周记 ",-1)])])):Se("",!0),u("span",b0,re((Fe=n.value)==null?void 0:Fe.username),1),u("button",{class:"btn btn-sm",onClick:o},"退出"),u("button",{class:"btn btn-primary btn-sm",disabled:xe.value,onClick:nt},[Te(lt,{name:xe.value?"check-circle":"clock",size:14},null,8,["name"]),u("span",_0,re(Ve.value),1)],8,w0)])]),u("main",k0,[u("div",x0,[de.value==="calendar"?(K(),It(yy,{key:0})):de.value==="today"?(K(),It(xy,{key:1})):de.value==="stats"?(K(),It(eg,{key:2})):de.value==="report"?(K(),It(Zg,{key:3})):de.value==="ledger"?(K(),It(cw,{key:4})):de.value==="memo"?(K(),It(Aw,{key:5})):de.value==="vault"?(K(),It(I_,{key:6})):(K(),It(B1,{key:7}))])])]),u("div",C0,[Te(gh,{name:"toast"},{default:fr(()=>[(K(!0),H(Re,null,ut(Qt(t),je=>(K(),H("div",{key:je.id,class:"toast"},re(je.text),1))),128))]),_:1})])])):(K(),It(Z1,{key:0,onLogin:s}))}}}),E0=Gt(S0,[["__scopeId","data-v-57e72b29"]]);jh(E0).mount("#app");"serviceWorker"in navigator&&location.protocol.startsWith("http")&&window.addEventListener("load",()=>{navigator.serviceWorker.register("sw.js").catch(()=>{})});export{pf as W,cf as _,hg as b,df as r}; diff --git a/intern-log/dist/assets/index-egFbJdki.css b/intern-log/dist/assets/index-egFbJdki.css deleted file mode 100644 index 5a71811..0000000 --- a/intern-log/dist/assets/index-egFbJdki.css +++ /dev/null @@ -1 +0,0 @@ -.mask[data-v-f27041d4]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:100}.dialog[data-v-f27041d4]{width:380px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float);padding:20px}.dialog-title[data-v-f27041d4]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-msg[data-v-f27041d4]{margin-top:8px;color:var(--text-2);font-size:13px;line-height:1.7;word-break:break-all}.dialog-btns[data-v-f27041d4]{margin-top:20px;display:flex;justify-content:flex-end;gap:8px}.btn-danger-solid[data-v-f27041d4]{background:var(--danger);border-color:var(--danger);color:#fff}.btn-danger-solid[data-v-f27041d4]:hover{background:#d13a3f}.modal-enter-active[data-v-f27041d4],.modal-leave-active[data-v-f27041d4]{transition:opacity .15s ease}.modal-enter-from[data-v-f27041d4],.modal-leave-to[data-v-f27041d4]{opacity:0}.mask[data-v-63bc0b48]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-63bc0b48]{width:560px;max-width:calc(100vw - 32px);max-height:85vh;background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float);display:flex;flex-direction:column}.dialog-head[data-v-63bc0b48]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border);flex:none}.dialog-title[data-v-63bc0b48]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-sub[data-v-63bc0b48]{font-size:12px;margin-top:2px}.dialog-body[data-v-63bc0b48]{padding:16px 20px;overflow:auto}.dialog-btns[data-v-63bc0b48]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border);flex:none}.form-grid[data-v-63bc0b48]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-63bc0b48]{grid-column:span 2}.field label[data-v-63bc0b48]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.form-error[data-v-63bc0b48]{color:var(--danger);font-size:12px;margin-top:4px}.input.invalid[data-v-63bc0b48],.input.invalid[data-v-63bc0b48]:focus{border-color:var(--danger)}.toggle-btn[data-v-63bc0b48]{height:32px;width:100%;border:1px solid var(--border-strong);background:var(--bg-page);border-radius:var(--radius-sm);cursor:pointer;font-size:13px;color:var(--text-2)}.toggle-btn[data-v-63bc0b48]:hover{background:var(--bg-hover)}.toggle-btn.on[data-v-63bc0b48]{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.toggle-btn.onwarn[data-v-63bc0b48]{color:var(--warn);border-color:var(--warn)}.modal-enter-active[data-v-63bc0b48],.modal-leave-active[data-v-63bc0b48]{transition:opacity .15s ease}.modal-enter-from[data-v-63bc0b48],.modal-leave-to[data-v-63bc0b48]{opacity:0}.dp-head[data-v-2e90c9d8]{margin-bottom:12px}.dp-date[data-v-2e90c9d8]{font-size:14px;font-weight:600}.sec[data-v-2e90c9d8]{padding:14px 16px;margin-bottom:12px}.sec-title[data-v-2e90c9d8]{font-size:13px;font-weight:600;margin-bottom:10px;color:var(--text-1)}.sec-head[data-v-2e90c9d8]{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.sec-head .sec-title[data-v-2e90c9d8]{margin-bottom:0}.form-hint[data-v-2e90c9d8]{font-size:12px}.att-grid[data-v-2e90c9d8]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.att-cell label[data-v-2e90c9d8],.field label[data-v-2e90c9d8]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.att-val[data-v-2e90c9d8]{display:flex;align-items:center;gap:6px;min-height:32px;font-size:13px}.status-val[data-v-2e90c9d8]{min-height:32px}.val-empty[data-v-2e90c9d8]{color:var(--text-3)}.edit-row[data-v-2e90c9d8]{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.time-input[data-v-2e90c9d8]{width:104px}.att-note[data-v-2e90c9d8]{margin-top:10px;font-size:12px}.att-actions[data-v-2e90c9d8]{display:flex;gap:8px;margin-top:12px}.form-grid[data-v-2e90c9d8]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-2e90c9d8]{grid-column:span 2}.form-footer[data-v-2e90c9d8]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.form-error[data-v-2e90c9d8]{color:var(--danger);font-size:12px;margin-top:4px}.input.invalid[data-v-2e90c9d8]{border-color:var(--danger)}.input.invalid[data-v-2e90c9d8]:focus{border-color:var(--danger)}.list-sec[data-v-2e90c9d8]{margin-bottom:4px}.item[data-v-2e90c9d8]{border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 10px;margin-bottom:6px;background:var(--bg-page)}.item-main[data-v-2e90c9d8]{display:flex;align-items:center;gap:8px;min-height:26px;flex-wrap:wrap}.item-content[data-v-2e90c9d8]{cursor:text;word-break:break-all}.item-meta[data-v-2e90c9d8]{font-size:12px}.item-sub[data-v-2e90c9d8]{margin-top:6px;padding-top:6px;border-top:1px dashed var(--border);font-size:12px;display:flex;flex-direction:column;gap:2px}.empty[data-v-2e90c9d8]{text-align:center;padding:24px 0}.dp-foot[data-v-2e90c9d8]{margin-top:10px;font-size:12px;text-align:right}@media (max-width: 560px){.att-grid[data-v-2e90c9d8],.form-grid[data-v-2e90c9d8]{grid-template-columns:1fr}.field.span2[data-v-2e90c9d8]{grid-column:auto}}.cal-toolbar[data-v-6a6322fa]{display:flex;align-items:center;gap:10px;margin-bottom:12px}.cal-title[data-v-6a6322fa]{font-size:14px;font-weight:600;min-width:96px;text-align:center}.cal-head[data-v-6a6322fa]{display:grid;grid-template-columns:repeat(7,1fr);border-top:1px solid var(--border);border-left:1px solid var(--border)}.cal-week[data-v-6a6322fa]{text-align:center;padding:6px 0;font-size:12px;border-right:1px solid var(--border);border-bottom:1px solid var(--border)}.cal-grid[data-v-6a6322fa]{display:grid;grid-template-columns:repeat(7,1fr);border-top:1px solid var(--border);border-left:1px solid var(--border)}.cal-cell[data-v-6a6322fa]{min-height:92px;padding:6px 8px;text-align:left;background:var(--bg-page);border:none;border-right:1px solid var(--border);border-bottom:1px solid var(--border);cursor:pointer;display:block;font-size:13px}.cal-cell[data-v-6a6322fa]:hover{background:var(--bg-subtle)}.cal-cell.blank[data-v-6a6322fa]{cursor:default}.cal-cell.blank[data-v-6a6322fa]:hover{background:var(--bg-page)}.cal-cell.selected[data-v-6a6322fa]{background:var(--accent-bg)}.daynum.today[data-v-6a6322fa]{color:var(--accent);font-weight:600}.cal-cell.weekend .daynum[data-v-6a6322fa]{color:var(--text-3)}.cal-marks[data-v-6a6322fa]{display:flex;align-items:center;gap:4px;margin-top:8px;height:14px}.mark-log[data-v-6a6322fa]{color:var(--text-3)}.mark-star[data-v-6a6322fa]{color:var(--accent)}.drawer[data-v-6a6322fa]{position:fixed;top:0;right:0;bottom:0;width:min(420px,100%);background:var(--bg-page);border-left:1px solid var(--border);box-shadow:var(--shadow-float);z-index:20;display:flex;flex-direction:column}.drawer-head[data-v-6a6322fa]{height:48px;flex:none;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid var(--border)}.drawer-title[data-v-6a6322fa]{font-weight:600}.drawer-body[data-v-6a6322fa]{flex:1;overflow:auto;padding:16px}.drawer-enter-active[data-v-6a6322fa],.drawer-leave-active[data-v-6a6322fa]{transition:opacity .15s ease}.drawer-enter-from[data-v-6a6322fa],.drawer-leave-to[data-v-6a6322fa]{opacity:0}.detail-toolbar[data-v-ac366cf6]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.date-title[data-v-ac366cf6]{font-size:14px;font-weight:600;min-width:170px;text-align:center}.date-title.is-today[data-v-ac366cf6]{color:var(--accent)}.w-date[data-v-ac366cf6]{width:150px}.cards[data-v-73e5ba49]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-card[data-v-73e5ba49]{padding:14px 16px}.stat-num[data-v-73e5ba49]{font-size:20px;font-weight:600;margin-top:4px}.section[data-v-73e5ba49]{padding:14px 16px;margin-top:12px}.section-title[data-v-73e5ba49]{font-weight:600;margin-bottom:10px;font-size:13px}.heat[data-v-73e5ba49]{display:flex;gap:3px;overflow-x:auto;padding-bottom:4px}.heat-col[data-v-73e5ba49]{display:flex;flex-direction:column;gap:3px}.heat-cell[data-v-73e5ba49]{width:12px;height:12px;border-radius:2px;display:inline-block}.lv0[data-v-73e5ba49]{background:var(--bg-subtle);border:1px solid var(--border)}.lv1[data-v-73e5ba49]{background:#d8ecdf}.lv2[data-v-73e5ba49]{background:#a9d8bc}.lv3[data-v-73e5ba49]{background:#6fbf92}.lv4[data-v-73e5ba49]{background:var(--ok)}.heat-legend[data-v-73e5ba49]{display:flex;align-items:center;gap:3px;margin-top:8px;font-size:12px}.two-col[data-v-73e5ba49]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.bar-row[data-v-73e5ba49]{display:flex;align-items:center;gap:10px;margin:6px 0}.bar-label[data-v-73e5ba49]{width:72px;flex:none;color:var(--text-2);font-size:12px;text-align:right}.bar-track[data-v-73e5ba49]{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}.bar-fill[data-v-73e5ba49]{display:block;height:100%;background:var(--accent);border-radius:4px}.bar-num[data-v-73e5ba49]{font-size:12px;width:92px;flex:none}.loc-label[data-v-73e5ba49]{width:110px;text-align:left}@media (max-width: 720px){.cards[data-v-73e5ba49]{grid-template-columns:repeat(2,1fr)}.two-col[data-v-73e5ba49]{grid-template-columns:1fr}}.report-toolbar[data-v-43f9c59b]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.ai-error[data-v-43f9c59b]{color:var(--danger);font-size:12px;margin:0 0 8px}.seg[data-v-43f9c59b]{display:inline-flex;border:1px solid var(--border-strong);border-radius:6px;overflow:hidden}.seg-btn[data-v-43f9c59b]{height:28px;padding:0 12px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:12px;border-right:1px solid var(--border)}.seg-btn[data-v-43f9c59b]:last-child{border-right:none}.seg-btn[data-v-43f9c59b]:hover{background:var(--bg-hover)}.seg-btn.active[data-v-43f9c59b]{background:var(--accent-bg);color:var(--accent)}.w-date[data-v-43f9c59b]{width:140px}.report-grid[data-v-43f9c59b]{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:12px;align-items:start}.section[data-v-43f9c59b]{padding:14px 16px}.section-title[data-v-43f9c59b]{font-weight:600;margin-bottom:8px;font-size:13px}.section+.section[data-v-43f9c59b]{margin-top:12px}.note-label[data-v-43f9c59b]{display:block;font-size:12px;margin:8px 0 4px}.note-saved[data-v-43f9c59b]{font-size:12px;margin-top:6px}.md-editor[data-v-43f9c59b]{min-height:420px;line-height:1.7}.sum-row[data-v-43f9c59b]{display:flex;justify-content:space-between;padding:3px 0;font-size:12px}.section-sub[data-v-43f9c59b]{font-weight:600;margin:10px 0 4px;font-size:12px}.sum-item[data-v-43f9c59b]{font-size:12px;padding:2px 0;word-break:break-all}.sum-empty[data-v-43f9c59b]{font-size:12px}@media (max-width: 960px){.report-grid[data-v-43f9c59b]{grid-template-columns:1fr}}.mask[data-v-e3568c0d]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-e3568c0d]{width:480px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-e3568c0d]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-e3568c0d]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-body[data-v-e3568c0d]{padding:16px 20px}.dialog-btns[data-v-e3568c0d]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.form-grid[data-v-e3568c0d]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-e3568c0d]{grid-column:span 2}.field label[data-v-e3568c0d]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.seg[data-v-e3568c0d]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-e3568c0d]{height:30px;padding:0 14px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-e3568c0d]{border-left:1px solid var(--border)}.seg-btn.active[data-v-e3568c0d]{background:var(--accent-bg);color:var(--accent)}.form-error[data-v-e3568c0d]{color:var(--danger);font-size:12px;margin-top:8px}.input.invalid[data-v-e3568c0d],.input.invalid[data-v-e3568c0d]:focus{border-color:var(--danger)}.modal-enter-active[data-v-e3568c0d],.modal-leave-active[data-v-e3568c0d]{transition:opacity .15s ease}.modal-enter-from[data-v-e3568c0d],.modal-leave-to[data-v-e3568c0d]{opacity:0}.ledger-toolbar[data-v-d0c263fa]{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}.month-title[data-v-d0c263fa]{font-size:14px;font-weight:600;min-width:88px;text-align:center}.w-filter[data-v-d0c263fa]{width:110px;flex:none}.cards[data-v-d0c263fa]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}.stat-card[data-v-d0c263fa]{padding:14px 16px}.stat-num[data-v-d0c263fa]{font-size:20px;font-weight:600;margin-top:4px}.amt-income[data-v-d0c263fa]{color:var(--ok)}.amt-expense[data-v-d0c263fa]{color:var(--text-1)}.amt-warn[data-v-d0c263fa]{color:var(--warn)}.sec[data-v-d0c263fa]{padding:14px 16px;margin-top:12px}.sec-title[data-v-d0c263fa]{font-size:13px;font-weight:600;margin-bottom:10px}.sec-head[data-v-d0c263fa]{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.sec-head .sec-title[data-v-d0c263fa]{margin-bottom:0}.form-hint[data-v-d0c263fa]{font-size:12px}.form-grid[data-v-d0c263fa]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-d0c263fa]{grid-column:span 2}.field label[data-v-d0c263fa]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.form-error[data-v-d0c263fa]{color:var(--danger);font-size:12px;margin-top:8px}.form-footer[data-v-d0c263fa]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.seg[data-v-d0c263fa]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-d0c263fa]{height:30px;padding:0 14px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-d0c263fa]{border-left:1px solid var(--border)}.seg-btn.active[data-v-d0c263fa]{background:var(--accent-bg);color:var(--accent)}.toggle-btn[data-v-d0c263fa]{height:32px;width:100%;border:1px solid var(--border-strong);background:var(--bg-page);border-radius:var(--radius-sm);cursor:pointer;font-size:13px;color:var(--text-2)}.toggle-btn[data-v-d0c263fa]:hover{background:var(--bg-hover)}.toggle-btn.on[data-v-d0c263fa]{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.bar-row[data-v-d0c263fa]{display:flex;align-items:center;gap:10px;margin:6px 0}.bar-label[data-v-d0c263fa]{width:56px;flex:none;color:var(--text-2);font-size:12px;text-align:right}.bar-track[data-v-d0c263fa]{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}.bar-fill[data-v-d0c263fa]{display:block;height:100%;background:var(--accent);border-radius:4px}.bar-num[data-v-d0c263fa]{font-size:12px;width:110px;flex:none}.table-card[data-v-d0c263fa]{overflow-x:auto}.tx-table[data-v-d0c263fa]{width:100%;border-collapse:collapse;font-size:13px}.tx-table th[data-v-d0c263fa]{text-align:left;font-weight:500;color:var(--text-2);background:var(--bg-subtle);padding:10px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.tx-table td[data-v-d0c263fa]{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top;word-break:break-all}.tx-table tbody tr[data-v-d0c263fa]:hover{background:var(--bg-subtle)}.tx-table tbody tr:last-child td[data-v-d0c263fa]{border-bottom:none}.td-note[data-v-d0c263fa]{color:var(--text-2)}.tx-pending[data-v-d0c263fa]{color:var(--warn);font-size:12px}.tx-done[data-v-d0c263fa]{color:var(--ok);font-size:12px}.th-ops[data-v-d0c263fa]{width:220px}.ops[data-v-d0c263fa]{display:flex;gap:4px;flex-wrap:wrap}.empty[data-v-d0c263fa]{text-align:center;padding:24px 0}.vault-note[data-v-d0c263fa]{margin-top:10px;font-size:12px;text-align:right}.memo-page[data-v-74d60dba]{display:grid;grid-template-columns:280px minmax(0,1fr);gap:12px;align-items:stretch}.memo-list[data-v-74d60dba]{display:flex;flex-direction:column;max-height:calc(100vh - 140px)}.pane-head[data-v-74d60dba]{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 8px;border-bottom:1px solid var(--border);flex:none}.pane-title[data-v-74d60dba]{font-size:13px;font-weight:600}.memo-scroll[data-v-74d60dba]{overflow:auto;padding:6px}.memo-item[data-v-74d60dba]{padding:8px 10px;border-radius:var(--radius-sm);cursor:pointer;margin-bottom:2px}.memo-item[data-v-74d60dba]:hover{background:var(--bg-hover)}.memo-item.active[data-v-74d60dba]{background:var(--accent-bg)}.memo-item.active .memo-item-title[data-v-74d60dba]{color:var(--accent)}.memo-item-title[data-v-74d60dba]{font-size:13px;font-weight:500;word-break:break-all}.memo-item-sub[data-v-74d60dba]{font-size:12px;margin-top:2px;word-break:break-all}.memo-item-time[data-v-74d60dba]{font-size:11px;margin-top:2px}.memo-editor[data-v-74d60dba]{padding:16px;min-height:420px;display:flex;flex-direction:column}.title-input[data-v-74d60dba]{font-size:14px;font-weight:500;margin-bottom:10px}.content-textarea[data-v-74d60dba]{flex:1;min-height:340px;line-height:1.8}.editor-foot[data-v-74d60dba]{display:flex;align-items:center;gap:8px;margin-top:10px;padding-top:10px;border-top:1px solid var(--border)}.foot-info[data-v-74d60dba]{font-size:12px}.editor-empty[data-v-74d60dba]{display:flex;align-items:center;justify-content:center;flex:1;padding:60px 0}@media (max-width: 800px){.memo-page[data-v-74d60dba]{grid-template-columns:1fr}.memo-list[data-v-74d60dba]{max-height:240px}.content-textarea[data-v-74d60dba]{min-height:240px}}.mask[data-v-f383b0a6]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-f383b0a6]{width:480px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-f383b0a6]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-f383b0a6]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-body[data-v-f383b0a6]{padding:16px 20px}.dialog-btns[data-v-f383b0a6]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.form-grid[data-v-f383b0a6]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-f383b0a6]{grid-column:span 2}.field label[data-v-f383b0a6]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.pwd-row[data-v-f383b0a6]{display:flex;gap:8px}.pwd-row .input[data-v-f383b0a6]{flex:1}.form-error[data-v-f383b0a6]{color:var(--danger);font-size:12px;margin-top:8px}.modal-enter-active[data-v-f383b0a6],.modal-leave-active[data-v-f383b0a6]{transition:opacity .15s ease}.modal-enter-from[data-v-f383b0a6],.modal-leave-to[data-v-f383b0a6]{opacity:0}.lock-card[data-v-6820bc9c]{max-width:380px;margin:60px auto 0;padding:28px 24px;text-align:center;display:flex;flex-direction:column;gap:10px}.lock-badge[data-v-6820bc9c]{width:52px;height:52px;margin:0 auto;border-radius:50%;background:var(--bg-subtle);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;color:var(--text-2)}.lock-title[data-v-6820bc9c]{font-size:14px;font-weight:600}.lock-tip[data-v-6820bc9c]{font-size:12px;line-height:1.7}.lock-btn[data-v-6820bc9c]{margin-top:4px}.form-error[data-v-6820bc9c]{color:var(--danger);font-size:12px}.empty[data-v-6820bc9c]{text-align:center;padding:24px 0}.vault-toolbar[data-v-6820bc9c]{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}.search-wrap[data-v-6820bc9c]{position:relative;width:280px;max-width:100%}.search-wrap .input[data-v-6820bc9c]{padding-left:30px}.search-icon[data-v-6820bc9c]{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3)}.table-card[data-v-6820bc9c]{overflow-x:auto}.cred-table[data-v-6820bc9c]{width:100%;border-collapse:collapse;font-size:13px}.cred-table th[data-v-6820bc9c]{text-align:left;font-weight:500;color:var(--text-2);background:var(--bg-subtle);padding:10px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.cred-table td[data-v-6820bc9c]{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top;word-break:break-all}.cred-table tbody tr[data-v-6820bc9c]:hover{background:var(--bg-subtle)}.cred-table tbody tr:last-child td[data-v-6820bc9c]{border-bottom:none}.td-system[data-v-6820bc9c]{font-weight:500}.th-ops[data-v-6820bc9c]{width:150px}.pwd-cell[data-v-6820bc9c]{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.pwd-text[data-v-6820bc9c]{letter-spacing:1px}.copyable[data-v-6820bc9c]{cursor:pointer}.copyable[data-v-6820bc9c]:hover{color:var(--accent)}.ops[data-v-6820bc9c]{display:flex;gap:4px;flex-wrap:wrap}.vault-note[data-v-6820bc9c]{margin-top:10px;font-size:12px;text-align:right}.mask[data-v-6820bc9c]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-6820bc9c]{width:440px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-6820bc9c]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-6820bc9c]{font-size:14px;font-weight:600}.dialog-body[data-v-6820bc9c]{padding:16px 20px}.dialog-btns[data-v-6820bc9c]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.vp-field[data-v-6820bc9c]{margin-bottom:10px}.vp-field label[data-v-6820bc9c]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.vp-tip[data-v-6820bc9c]{font-size:12px;margin-top:8px}.modal-enter-active[data-v-6820bc9c],.modal-leave-active[data-v-6820bc9c]{transition:opacity .15s ease}.modal-enter-from[data-v-6820bc9c],.modal-leave-to[data-v-6820bc9c]{opacity:0}.settings[data-v-81598f02]{display:flex;flex-direction:column;gap:12px;max-width:640px}.acc-line[data-v-81598f02]{font-size:12px;margin-bottom:10px;line-height:1.7}.section[data-v-81598f02]{padding:14px 16px}.section-title[data-v-81598f02]{font-weight:600;margin-bottom:10px;font-size:13px}.rule-grid[data-v-81598f02]{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px}.rule-item label[data-v-81598f02]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.rule-save[data-v-81598f02]{display:flex;align-items:center;gap:10px;margin-top:12px}.proj-add[data-v-81598f02]{display:flex;gap:8px}.proj-tip[data-v-81598f02]{font-size:12px;margin-top:6px}.proj-row[data-v-81598f02]{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}.proj-row[data-v-81598f02]:last-child{border-bottom:none}.proj-name[data-v-81598f02]{flex:1;word-break:break-all}.proj-name.archived[data-v-81598f02]{color:var(--text-3);text-decoration:line-through}.loc-note[data-v-81598f02]{font-size:12px}.ai-grid[data-v-81598f02]{display:flex;flex-direction:column;gap:10px}.backup-row[data-v-81598f02]{display:flex;gap:8px}.import-error[data-v-81598f02]{color:var(--danger);font-size:12px;margin-top:8px}.backup-note[data-v-81598f02]{font-size:12px;margin-top:10px}.login-page[data-v-d3d6c8cb]{min-height:100vh;background:var(--bg-subtle);display:flex;align-items:center;justify-content:center;padding:20px}.login-card[data-v-d3d6c8cb]{width:400px;max-width:100%;padding:28px 26px;display:flex;flex-direction:column;gap:12px;background:var(--bg-page)}.login-brand[data-v-d3d6c8cb]{text-align:center;margin-bottom:6px}.brand-icon[data-v-d3d6c8cb]{width:46px;height:46px;margin:0 auto 10px;border-radius:var(--radius-md);background:var(--accent-bg);color:var(--accent);display:flex;align-items:center;justify-content:center}.login-title[data-v-d3d6c8cb]{font-size:18px;font-weight:600;color:var(--text-1)}.login-sub[data-v-d3d6c8cb]{font-size:12px;margin-top:4px;line-height:1.7}.seg[data-v-d3d6c8cb]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-d3d6c8cb]{flex:1;height:30px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-d3d6c8cb]{border-left:1px solid var(--border)}.seg-btn.active[data-v-d3d6c8cb]{background:var(--accent-bg);color:var(--accent)}.mig-row[data-v-d3d6c8cb]{display:flex;align-items:flex-start;gap:8px;font-size:12px;color:var(--text-2);cursor:pointer;line-height:1.6}.mig-row input[data-v-d3d6c8cb]{margin-top:3px}.form-error[data-v-d3d6c8cb]{color:var(--danger);font-size:12px}.login-btn[data-v-d3d6c8cb]{margin-top:2px}.login-note[data-v-d3d6c8cb]{font-size:12px;text-align:center;line-height:1.7}.app[data-v-219a8436]{display:flex;height:100vh;overflow:hidden}.side[data-v-219a8436]{width:56px;flex:none;border-right:1px solid var(--border);display:flex;flex-direction:column;align-items:center;padding-top:10px;gap:4px;background:var(--bg-page)}.nav-btn[data-v-219a8436]{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--text-3);cursor:pointer;border:none;background:transparent;position:relative}.nav-btn[data-v-219a8436]:hover{background:var(--bg-hover);color:var(--text-1)}.nav-btn.active[data-v-219a8436]{background:var(--accent-bg);color:var(--accent)}.nav-btn[data-v-219a8436]:after{content:attr(data-tip);position:absolute;left:46px;top:50%;transform:translateY(-50%);background:var(--text-1);color:#fff;font-size:12px;line-height:1.4;padding:2px 8px;border-radius:4px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s}.nav-btn[data-v-219a8436]:hover:after{opacity:1}.main[data-v-219a8436]{flex:1;display:flex;flex-direction:column;min-width:0}.topbar[data-v-219a8436]{height:56px;flex:none;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:12px;padding:0 20px}.title[data-v-219a8436]{font-size:14px;font-weight:600}.gsearch[data-v-219a8436]{position:relative;width:300px;max-width:38vw}.gs-icon[data-v-219a8436]{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3)}.gs-input[data-v-219a8436]{height:30px;padding-left:30px}.gs-panel[data-v-219a8436]{position:absolute;top:36px;left:0;right:0;background:var(--bg-page);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-float);z-index:50;max-height:420px;overflow:auto;padding:6px}.gs-group[data-v-219a8436]{font-size:12px;padding:6px 8px 2px}.gs-item[data-v-219a8436]{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--radius-sm);cursor:pointer}.gs-item[data-v-219a8436]:hover{background:var(--bg-hover)}.gs-text[data-v-219a8436],.gs-sub[data-v-219a8436]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gs-text[data-v-219a8436]{font-size:13px}.gs-sub[data-v-219a8436]{font-size:12px}.gs-date[data-v-219a8436]{font-size:12px;flex:none}.gs-empty[data-v-219a8436]{padding:10px;font-size:12px;text-align:center}.user-chip[data-v-219a8436]{font-size:12px;color:var(--text-2);padding:0 4px}.week-tip[data-v-219a8436]{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--warn);color:var(--warn);background:var(--bg-page);border-radius:999px;height:26px;padding:0 10px;font-size:12px;cursor:pointer}.week-tip[data-v-219a8436]:hover{background:var(--bg-subtle)}.content[data-v-219a8436]{flex:1;overflow:auto}.content-inner[data-v-219a8436]{max-width:1200px;margin:0 auto;padding:20px}.toast-wrap[data-v-219a8436]{position:fixed;top:68px;right:20px;z-index:60;display:flex;flex-direction:column;gap:8px;align-items:flex-end;pointer-events:none}.toast[data-v-219a8436]{background:var(--bg-page);border:1px solid var(--border);box-shadow:var(--shadow-float);border-radius:var(--radius-sm);padding:8px 14px;font-size:13px;color:var(--text-1)}.toast-enter-from[data-v-219a8436],.toast-leave-to[data-v-219a8436]{opacity:0;transform:translateY(-4px)}.toast-enter-active[data-v-219a8436],.toast-leave-active[data-v-219a8436]{transition:all .15s ease}@media (max-width: 720px){.app[data-v-219a8436]{flex-direction:column}.side[data-v-219a8436]{order:2;width:100%;height:56px;flex-direction:row;justify-content:center;border-right:none;border-top:1px solid var(--border);padding-top:0}.main[data-v-219a8436]{order:1;height:calc(100vh - 56px)}.nav-btn[data-v-219a8436]:after{display:none}}:root{--bg-page: #FFFFFF;--bg-subtle: #F7F8FA;--bg-hover: #F2F3F5;--border: #EBEDF0;--border-strong: #DCDEE3;--text-1: #1D2129;--text-2: #4E5969;--text-3: #86909C;--accent: #3370FF;--accent-bg: #F0F5FF;--ok: #23A757;--warn: #E8842C;--danger: #E5484D;--dot-empty: #C9CDD4;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--shadow-float: 0 4px 16px rgba(29, 33, 41, .08)}*{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--bg-page);color:var(--text-1);font-family:-apple-system,PingFang SC,Microsoft YaHei,system-ui,sans-serif;font-size:13px;line-height:1.6;-webkit-font-smoothing:antialiased}button,input,select,textarea{font:inherit;color:inherit}.num{font-variant-numeric:tabular-nums}.flex1{flex:1}.muted{color:var(--text-3)}.muted2{color:var(--text-2)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 12px;height:32px;border-radius:var(--radius-sm);border:1px solid var(--border-strong);background:var(--bg-page);color:var(--text-1);cursor:pointer;white-space:nowrap}.btn:hover{background:var(--bg-hover)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn-primary:hover{background:#2b5fd9}.btn-danger{color:var(--danger);border-color:var(--danger)}.btn-sm{height:26px;padding:0 10px;font-size:12px}.btn-xs{height:22px;padding:0 8px;font-size:12px}.input,.select,.textarea{height:32px;padding:0 10px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-page);outline:none;width:100%}.textarea{height:auto;min-height:56px;padding:8px 10px;resize:vertical}.input:focus,.select:focus,.textarea:focus{border-color:var(--accent)}.input::placeholder,.textarea::placeholder{color:var(--text-3)}.card{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-page)}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;flex:none;border:none;background:transparent;border-radius:var(--radius-sm);color:var(--text-3);cursor:pointer}.icon-btn:hover{background:var(--bg-hover);color:var(--text-1)}.icon-btn.active{color:var(--accent)}.icon-btn.active-warn{color:var(--warn)}.tag{display:inline-block;padding:0 8px;height:22px;line-height:20px;border-radius:4px;font-size:12px;background:var(--bg-subtle);color:var(--text-2);border:1px solid var(--border);white-space:nowrap}.dot{width:6px;height:6px;border-radius:50%;display:inline-block;flex:none}.dot.normal{background:var(--ok)}.dot.late,.dot.early,.dot.incomplete{background:var(--warn)}.dot.absent{background:var(--danger)}.dot.none,.dot.leave{background:var(--dot-empty)}@media (max-width: 720px){input,select,textarea{font-size:16px!important}input[type=checkbox]{font-size:initial}}.dot.rest{background:var(--border)}.icon{display:inline-flex;align-items:center;justify-content:center;flex:none}.icon svg{width:100%;height:100%;display:block} diff --git a/intern-log/dist/assets/index-BdeEta5K.js b/intern-log/dist/assets/index-mjAVYvQ7.js similarity index 69% rename from intern-log/dist/assets/index-BdeEta5K.js rename to intern-log/dist/assets/index-mjAVYvQ7.js index 6c3d84e..21b5583 100644 --- a/intern-log/dist/assets/index-BdeEta5K.js +++ b/intern-log/dist/assets/index-mjAVYvQ7.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./web-DemcfbD8.js","./index-B9GSzgPK.js","./index-egFbJdki.css"])))=>i.map(i=>d[i]); -import{r as s,_ as i}from"./index-B9GSzgPK.js";var t;(function(e){e.Documents="DOCUMENTS",e.Data="DATA",e.Library="LIBRARY",e.Cache="CACHE",e.External="EXTERNAL",e.ExternalStorage="EXTERNAL_STORAGE"})(t||(t={}));var a;(function(e){e.UTF8="utf8",e.ASCII="ascii",e.UTF16="utf16"})(a||(a={}));const E=s("Filesystem",{web:()=>i(()=>import("./web-DemcfbD8.js"),__vite__mapDeps([0,1,2]),import.meta.url).then(e=>new e.FilesystemWeb)});export{t as Directory,a as Encoding,E as Filesystem}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./web-C1N1mu_I.js","./index-CocrpELo.js","./index-vDZJrZrZ.css"])))=>i.map(i=>d[i]); +import{r as s,_ as i}from"./index-CocrpELo.js";var t;(function(e){e.Documents="DOCUMENTS",e.Data="DATA",e.Library="LIBRARY",e.Cache="CACHE",e.External="EXTERNAL",e.ExternalStorage="EXTERNAL_STORAGE"})(t||(t={}));var a;(function(e){e.UTF8="utf8",e.ASCII="ascii",e.UTF16="utf16"})(a||(a={}));const E=s("Filesystem",{web:()=>i(()=>import("./web-C1N1mu_I.js"),__vite__mapDeps([0,1,2]),import.meta.url).then(e=>new e.FilesystemWeb)});export{t as Directory,a as Encoding,E as Filesystem}; diff --git a/intern-log/dist/assets/index-vDZJrZrZ.css b/intern-log/dist/assets/index-vDZJrZrZ.css new file mode 100644 index 0000000..5c6961f --- /dev/null +++ b/intern-log/dist/assets/index-vDZJrZrZ.css @@ -0,0 +1 @@ +.mask[data-v-f27041d4]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:100}.dialog[data-v-f27041d4]{width:380px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float);padding:20px}.dialog-title[data-v-f27041d4]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-msg[data-v-f27041d4]{margin-top:8px;color:var(--text-2);font-size:13px;line-height:1.7;word-break:break-all}.dialog-btns[data-v-f27041d4]{margin-top:20px;display:flex;justify-content:flex-end;gap:8px}.btn-danger-solid[data-v-f27041d4]{background:var(--danger);border-color:var(--danger);color:#fff}.btn-danger-solid[data-v-f27041d4]:hover{background:#d13a3f}.modal-enter-active[data-v-f27041d4],.modal-leave-active[data-v-f27041d4]{transition:opacity .15s ease}.modal-enter-from[data-v-f27041d4],.modal-leave-to[data-v-f27041d4]{opacity:0}.mask[data-v-63bc0b48]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-63bc0b48]{width:560px;max-width:calc(100vw - 32px);max-height:85vh;background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float);display:flex;flex-direction:column}.dialog-head[data-v-63bc0b48]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border);flex:none}.dialog-title[data-v-63bc0b48]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-sub[data-v-63bc0b48]{font-size:12px;margin-top:2px}.dialog-body[data-v-63bc0b48]{padding:16px 20px;overflow:auto}.dialog-btns[data-v-63bc0b48]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border);flex:none}.form-grid[data-v-63bc0b48]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-63bc0b48]{grid-column:span 2}.field label[data-v-63bc0b48]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.form-error[data-v-63bc0b48]{color:var(--danger);font-size:12px;margin-top:4px}.input.invalid[data-v-63bc0b48],.input.invalid[data-v-63bc0b48]:focus{border-color:var(--danger)}.toggle-btn[data-v-63bc0b48]{height:32px;width:100%;border:1px solid var(--border-strong);background:var(--bg-page);border-radius:var(--radius-sm);cursor:pointer;font-size:13px;color:var(--text-2)}.toggle-btn[data-v-63bc0b48]:hover{background:var(--bg-hover)}.toggle-btn.on[data-v-63bc0b48]{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.toggle-btn.onwarn[data-v-63bc0b48]{color:var(--warn);border-color:var(--warn)}.modal-enter-active[data-v-63bc0b48],.modal-leave-active[data-v-63bc0b48]{transition:opacity .15s ease}.modal-enter-from[data-v-63bc0b48],.modal-leave-to[data-v-63bc0b48]{opacity:0}.dp-head[data-v-2e90c9d8]{margin-bottom:12px}.dp-date[data-v-2e90c9d8]{font-size:14px;font-weight:600}.sec[data-v-2e90c9d8]{padding:14px 16px;margin-bottom:12px}.sec-title[data-v-2e90c9d8]{font-size:13px;font-weight:600;margin-bottom:10px;color:var(--text-1)}.sec-head[data-v-2e90c9d8]{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.sec-head .sec-title[data-v-2e90c9d8]{margin-bottom:0}.form-hint[data-v-2e90c9d8]{font-size:12px}.att-grid[data-v-2e90c9d8]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.att-cell label[data-v-2e90c9d8],.field label[data-v-2e90c9d8]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.att-val[data-v-2e90c9d8]{display:flex;align-items:center;gap:6px;min-height:32px;font-size:13px}.status-val[data-v-2e90c9d8]{min-height:32px}.val-empty[data-v-2e90c9d8]{color:var(--text-3)}.edit-row[data-v-2e90c9d8]{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.time-input[data-v-2e90c9d8]{width:104px}.att-note[data-v-2e90c9d8]{margin-top:10px;font-size:12px}.att-actions[data-v-2e90c9d8]{display:flex;gap:8px;margin-top:12px}.form-grid[data-v-2e90c9d8]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-2e90c9d8]{grid-column:span 2}.form-footer[data-v-2e90c9d8]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.form-error[data-v-2e90c9d8]{color:var(--danger);font-size:12px;margin-top:4px}.input.invalid[data-v-2e90c9d8]{border-color:var(--danger)}.input.invalid[data-v-2e90c9d8]:focus{border-color:var(--danger)}.list-sec[data-v-2e90c9d8]{margin-bottom:4px}.item[data-v-2e90c9d8]{border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 10px;margin-bottom:6px;background:var(--bg-page)}.item-main[data-v-2e90c9d8]{display:flex;align-items:center;gap:8px;min-height:26px;flex-wrap:wrap}.item-content[data-v-2e90c9d8]{cursor:text;word-break:break-all}.item-meta[data-v-2e90c9d8]{font-size:12px}.item-sub[data-v-2e90c9d8]{margin-top:6px;padding-top:6px;border-top:1px dashed var(--border);font-size:12px;display:flex;flex-direction:column;gap:2px}.empty[data-v-2e90c9d8]{text-align:center;padding:24px 0}.dp-foot[data-v-2e90c9d8]{margin-top:10px;font-size:12px;text-align:right}@media (max-width: 560px){.att-grid[data-v-2e90c9d8],.form-grid[data-v-2e90c9d8]{grid-template-columns:1fr}.field.span2[data-v-2e90c9d8]{grid-column:auto}}.cal-toolbar[data-v-2404dfbe]{display:flex;align-items:center;gap:10px;margin-bottom:12px}.cal-title[data-v-2404dfbe]{font-size:14px;font-weight:600;min-width:96px;text-align:center}.cal-head[data-v-2404dfbe]{display:grid;grid-template-columns:repeat(7,1fr);border-top:1px solid var(--border);border-left:1px solid var(--border)}.cal-week[data-v-2404dfbe]{text-align:center;padding:6px 0;font-size:12px;border-right:1px solid var(--border);border-bottom:1px solid var(--border)}.cal-grid[data-v-2404dfbe]{display:grid;grid-template-columns:repeat(7,1fr);border-top:1px solid var(--border);border-left:1px solid var(--border)}.cal-cell[data-v-2404dfbe]{min-height:92px;padding:6px 8px;text-align:left;background:var(--bg-page);border:none;border-right:1px solid var(--border);border-bottom:1px solid var(--border);cursor:pointer;display:block;font-size:13px}.cal-cell[data-v-2404dfbe]:hover{background:var(--bg-subtle)}.cal-cell.blank[data-v-2404dfbe]{cursor:default}.cal-cell.blank[data-v-2404dfbe]:hover{background:var(--bg-page)}.cal-cell.selected[data-v-2404dfbe]{background:var(--accent-bg)}.daynum.today[data-v-2404dfbe]{color:var(--accent);font-weight:600}.cal-cell.weekend .daynum[data-v-2404dfbe]{color:var(--text-3)}.cal-marks[data-v-2404dfbe]{display:flex;align-items:center;gap:4px;margin-top:8px;height:14px}.mark-log[data-v-2404dfbe]{color:var(--text-3)}.mark-star[data-v-2404dfbe]{color:var(--accent)}.drawer[data-v-2404dfbe]{position:fixed;top:0;right:0;bottom:0;width:min(420px,100%);background:var(--bg-page);border-left:1px solid var(--border);box-shadow:var(--shadow-float);z-index:20;display:flex;flex-direction:column}.drawer-head[data-v-2404dfbe]{height:48px;flex:none;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid var(--border)}.drawer-title[data-v-2404dfbe]{font-weight:600}.drawer-body[data-v-2404dfbe]{flex:1;overflow:auto;padding:16px}.drawer-enter-active[data-v-2404dfbe],.drawer-leave-active[data-v-2404dfbe]{transition:opacity .15s ease}.drawer-enter-from[data-v-2404dfbe],.drawer-leave-to[data-v-2404dfbe]{opacity:0}@media (max-width: 720px){.cal-cell[data-v-2404dfbe]{min-height:60px;padding:4px 5px}.cal-title[data-v-2404dfbe]{min-width:76px;font-size:13px}.cal-marks[data-v-2404dfbe]{gap:3px;margin-top:4px;height:12px}.drawer[data-v-2404dfbe]{width:100%}}.detail-toolbar[data-v-76243d98]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.date-title[data-v-76243d98]{font-size:14px;font-weight:600;min-width:170px;text-align:center}.date-title.is-today[data-v-76243d98]{color:var(--accent)}.w-date[data-v-76243d98]{width:150px}@media (max-width: 720px){.detail-toolbar[data-v-76243d98]{gap:8px}.date-title[data-v-76243d98]{min-width:0;flex:1;text-align:left}.w-date[data-v-76243d98]{flex:1;min-width:120px;width:auto}}.cards[data-v-73e5ba49]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-card[data-v-73e5ba49]{padding:14px 16px}.stat-num[data-v-73e5ba49]{font-size:20px;font-weight:600;margin-top:4px}.section[data-v-73e5ba49]{padding:14px 16px;margin-top:12px}.section-title[data-v-73e5ba49]{font-weight:600;margin-bottom:10px;font-size:13px}.heat[data-v-73e5ba49]{display:flex;gap:3px;overflow-x:auto;padding-bottom:4px}.heat-col[data-v-73e5ba49]{display:flex;flex-direction:column;gap:3px}.heat-cell[data-v-73e5ba49]{width:12px;height:12px;border-radius:2px;display:inline-block}.lv0[data-v-73e5ba49]{background:var(--bg-subtle);border:1px solid var(--border)}.lv1[data-v-73e5ba49]{background:#d8ecdf}.lv2[data-v-73e5ba49]{background:#a9d8bc}.lv3[data-v-73e5ba49]{background:#6fbf92}.lv4[data-v-73e5ba49]{background:var(--ok)}.heat-legend[data-v-73e5ba49]{display:flex;align-items:center;gap:3px;margin-top:8px;font-size:12px}.two-col[data-v-73e5ba49]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.bar-row[data-v-73e5ba49]{display:flex;align-items:center;gap:10px;margin:6px 0}.bar-label[data-v-73e5ba49]{width:72px;flex:none;color:var(--text-2);font-size:12px;text-align:right}.bar-track[data-v-73e5ba49]{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}.bar-fill[data-v-73e5ba49]{display:block;height:100%;background:var(--accent);border-radius:4px}.bar-num[data-v-73e5ba49]{font-size:12px;width:92px;flex:none}.loc-label[data-v-73e5ba49]{width:110px;text-align:left}@media (max-width: 720px){.cards[data-v-73e5ba49]{grid-template-columns:repeat(2,1fr)}.two-col[data-v-73e5ba49]{grid-template-columns:1fr}}.report-toolbar[data-v-43f9c59b]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.ai-error[data-v-43f9c59b]{color:var(--danger);font-size:12px;margin:0 0 8px}.seg[data-v-43f9c59b]{display:inline-flex;border:1px solid var(--border-strong);border-radius:6px;overflow:hidden}.seg-btn[data-v-43f9c59b]{height:28px;padding:0 12px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:12px;border-right:1px solid var(--border)}.seg-btn[data-v-43f9c59b]:last-child{border-right:none}.seg-btn[data-v-43f9c59b]:hover{background:var(--bg-hover)}.seg-btn.active[data-v-43f9c59b]{background:var(--accent-bg);color:var(--accent)}.w-date[data-v-43f9c59b]{width:140px}.report-grid[data-v-43f9c59b]{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:12px;align-items:start}.section[data-v-43f9c59b]{padding:14px 16px}.section-title[data-v-43f9c59b]{font-weight:600;margin-bottom:8px;font-size:13px}.section+.section[data-v-43f9c59b]{margin-top:12px}.note-label[data-v-43f9c59b]{display:block;font-size:12px;margin:8px 0 4px}.note-saved[data-v-43f9c59b]{font-size:12px;margin-top:6px}.md-editor[data-v-43f9c59b]{min-height:420px;line-height:1.7}.sum-row[data-v-43f9c59b]{display:flex;justify-content:space-between;padding:3px 0;font-size:12px}.section-sub[data-v-43f9c59b]{font-weight:600;margin:10px 0 4px;font-size:12px}.sum-item[data-v-43f9c59b]{font-size:12px;padding:2px 0;word-break:break-all}.sum-empty[data-v-43f9c59b]{font-size:12px}@media (max-width: 960px){.report-grid[data-v-43f9c59b]{grid-template-columns:1fr}}.mask[data-v-e3568c0d]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-e3568c0d]{width:480px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-e3568c0d]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-e3568c0d]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-body[data-v-e3568c0d]{padding:16px 20px}.dialog-btns[data-v-e3568c0d]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.form-grid[data-v-e3568c0d]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-e3568c0d]{grid-column:span 2}.field label[data-v-e3568c0d]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.seg[data-v-e3568c0d]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-e3568c0d]{height:30px;padding:0 14px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-e3568c0d]{border-left:1px solid var(--border)}.seg-btn.active[data-v-e3568c0d]{background:var(--accent-bg);color:var(--accent)}.form-error[data-v-e3568c0d]{color:var(--danger);font-size:12px;margin-top:8px}.input.invalid[data-v-e3568c0d],.input.invalid[data-v-e3568c0d]:focus{border-color:var(--danger)}.modal-enter-active[data-v-e3568c0d],.modal-leave-active[data-v-e3568c0d]{transition:opacity .15s ease}.modal-enter-from[data-v-e3568c0d],.modal-leave-to[data-v-e3568c0d]{opacity:0}.ledger-toolbar[data-v-2b678001]{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}.month-title[data-v-2b678001]{font-size:14px;font-weight:600;min-width:88px;text-align:center}.w-filter[data-v-2b678001]{width:110px;flex:none}.cards[data-v-2b678001]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}.stat-card[data-v-2b678001]{padding:14px 16px}.stat-num[data-v-2b678001]{font-size:20px;font-weight:600;margin-top:4px}.amt-income[data-v-2b678001]{color:var(--ok)}.amt-expense[data-v-2b678001]{color:var(--text-1)}.amt-warn[data-v-2b678001]{color:var(--warn)}.sec[data-v-2b678001]{padding:14px 16px;margin-top:12px}.sec-title[data-v-2b678001]{font-size:13px;font-weight:600;margin-bottom:10px}.sec-head[data-v-2b678001]{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.sec-head .sec-title[data-v-2b678001]{margin-bottom:0}.form-hint[data-v-2b678001]{font-size:12px}.form-grid[data-v-2b678001]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-2b678001]{grid-column:span 2}.field label[data-v-2b678001]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.form-error[data-v-2b678001]{color:var(--danger);font-size:12px;margin-top:8px}.form-footer[data-v-2b678001]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.seg[data-v-2b678001]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-2b678001]{height:30px;padding:0 14px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-2b678001]{border-left:1px solid var(--border)}.seg-btn.active[data-v-2b678001]{background:var(--accent-bg);color:var(--accent)}.toggle-btn[data-v-2b678001]{height:32px;width:100%;border:1px solid var(--border-strong);background:var(--bg-page);border-radius:var(--radius-sm);cursor:pointer;font-size:13px;color:var(--text-2)}.toggle-btn[data-v-2b678001]:hover{background:var(--bg-hover)}.toggle-btn.on[data-v-2b678001]{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.bar-row[data-v-2b678001]{display:flex;align-items:center;gap:10px;margin:6px 0}.bar-label[data-v-2b678001]{width:56px;flex:none;color:var(--text-2);font-size:12px;text-align:right}.bar-track[data-v-2b678001]{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}.bar-fill[data-v-2b678001]{display:block;height:100%;background:var(--accent);border-radius:4px}.bar-num[data-v-2b678001]{font-size:12px;width:110px;flex:none}.table-card[data-v-2b678001]{overflow-x:auto}.tx-table[data-v-2b678001]{width:100%;border-collapse:collapse;font-size:13px}.tx-table th[data-v-2b678001]{text-align:left;font-weight:500;color:var(--text-2);background:var(--bg-subtle);padding:10px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.tx-table td[data-v-2b678001]{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top;word-break:break-all}.tx-table tbody tr[data-v-2b678001]:hover{background:var(--bg-subtle)}.tx-table tbody tr:last-child td[data-v-2b678001]{border-bottom:none}.td-note[data-v-2b678001]{color:var(--text-2)}.tx-pending[data-v-2b678001]{color:var(--warn);font-size:12px}.tx-done[data-v-2b678001]{color:var(--ok);font-size:12px}.th-ops[data-v-2b678001]{width:220px}.ops[data-v-2b678001]{display:flex;gap:4px;flex-wrap:wrap}.empty[data-v-2b678001]{text-align:center;padding:24px 0}.vault-note[data-v-2b678001]{margin-top:10px;font-size:12px;text-align:right}@media (max-width: 560px){.form-grid[data-v-2b678001]{grid-template-columns:1fr}.field.span2[data-v-2b678001]{grid-column:auto}.ledger-toolbar .w-filter[data-v-2b678001]{flex:1;min-width:0;width:auto}}.memo-page[data-v-74d60dba]{display:grid;grid-template-columns:280px minmax(0,1fr);gap:12px;align-items:stretch}.memo-list[data-v-74d60dba]{display:flex;flex-direction:column;max-height:calc(100vh - 140px)}.pane-head[data-v-74d60dba]{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 8px;border-bottom:1px solid var(--border);flex:none}.pane-title[data-v-74d60dba]{font-size:13px;font-weight:600}.memo-scroll[data-v-74d60dba]{overflow:auto;padding:6px}.memo-item[data-v-74d60dba]{padding:8px 10px;border-radius:var(--radius-sm);cursor:pointer;margin-bottom:2px}.memo-item[data-v-74d60dba]:hover{background:var(--bg-hover)}.memo-item.active[data-v-74d60dba]{background:var(--accent-bg)}.memo-item.active .memo-item-title[data-v-74d60dba]{color:var(--accent)}.memo-item-title[data-v-74d60dba]{font-size:13px;font-weight:500;word-break:break-all}.memo-item-sub[data-v-74d60dba]{font-size:12px;margin-top:2px;word-break:break-all}.memo-item-time[data-v-74d60dba]{font-size:11px;margin-top:2px}.memo-editor[data-v-74d60dba]{padding:16px;min-height:420px;display:flex;flex-direction:column}.title-input[data-v-74d60dba]{font-size:14px;font-weight:500;margin-bottom:10px}.content-textarea[data-v-74d60dba]{flex:1;min-height:340px;line-height:1.8}.editor-foot[data-v-74d60dba]{display:flex;align-items:center;gap:8px;margin-top:10px;padding-top:10px;border-top:1px solid var(--border)}.foot-info[data-v-74d60dba]{font-size:12px}.editor-empty[data-v-74d60dba]{display:flex;align-items:center;justify-content:center;flex:1;padding:60px 0}@media (max-width: 800px){.memo-page[data-v-74d60dba]{grid-template-columns:1fr}.memo-list[data-v-74d60dba]{max-height:240px}.content-textarea[data-v-74d60dba]{min-height:240px}}.mask[data-v-f383b0a6]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-f383b0a6]{width:480px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-f383b0a6]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-f383b0a6]{font-size:14px;font-weight:600;color:var(--text-1)}.dialog-body[data-v-f383b0a6]{padding:16px 20px}.dialog-btns[data-v-f383b0a6]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.form-grid[data-v-f383b0a6]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}.field.span2[data-v-f383b0a6]{grid-column:span 2}.field label[data-v-f383b0a6]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.pwd-row[data-v-f383b0a6]{display:flex;gap:8px}.pwd-row .input[data-v-f383b0a6]{flex:1}.form-error[data-v-f383b0a6]{color:var(--danger);font-size:12px;margin-top:8px}.modal-enter-active[data-v-f383b0a6],.modal-leave-active[data-v-f383b0a6]{transition:opacity .15s ease}.modal-enter-from[data-v-f383b0a6],.modal-leave-to[data-v-f383b0a6]{opacity:0}.lock-card[data-v-6820bc9c]{max-width:380px;margin:60px auto 0;padding:28px 24px;text-align:center;display:flex;flex-direction:column;gap:10px}.lock-badge[data-v-6820bc9c]{width:52px;height:52px;margin:0 auto;border-radius:50%;background:var(--bg-subtle);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;color:var(--text-2)}.lock-title[data-v-6820bc9c]{font-size:14px;font-weight:600}.lock-tip[data-v-6820bc9c]{font-size:12px;line-height:1.7}.lock-btn[data-v-6820bc9c]{margin-top:4px}.form-error[data-v-6820bc9c]{color:var(--danger);font-size:12px}.empty[data-v-6820bc9c]{text-align:center;padding:24px 0}.vault-toolbar[data-v-6820bc9c]{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}.search-wrap[data-v-6820bc9c]{position:relative;width:280px;max-width:100%}.search-wrap .input[data-v-6820bc9c]{padding-left:30px}.search-icon[data-v-6820bc9c]{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3)}.table-card[data-v-6820bc9c]{overflow-x:auto}.cred-table[data-v-6820bc9c]{width:100%;border-collapse:collapse;font-size:13px}.cred-table th[data-v-6820bc9c]{text-align:left;font-weight:500;color:var(--text-2);background:var(--bg-subtle);padding:10px 12px;border-bottom:1px solid var(--border);white-space:nowrap}.cred-table td[data-v-6820bc9c]{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top;word-break:break-all}.cred-table tbody tr[data-v-6820bc9c]:hover{background:var(--bg-subtle)}.cred-table tbody tr:last-child td[data-v-6820bc9c]{border-bottom:none}.td-system[data-v-6820bc9c]{font-weight:500}.th-ops[data-v-6820bc9c]{width:150px}.pwd-cell[data-v-6820bc9c]{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.pwd-text[data-v-6820bc9c]{letter-spacing:1px}.copyable[data-v-6820bc9c]{cursor:pointer}.copyable[data-v-6820bc9c]:hover{color:var(--accent)}.ops[data-v-6820bc9c]{display:flex;gap:4px;flex-wrap:wrap}.vault-note[data-v-6820bc9c]{margin-top:10px;font-size:12px;text-align:right}.mask[data-v-6820bc9c]{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d212966;display:flex;align-items:center;justify-content:center;z-index:90}.dialog[data-v-6820bc9c]{width:440px;max-width:calc(100vw - 32px);background:var(--bg-page);border-radius:var(--radius-lg);box-shadow:var(--shadow-float)}.dialog-head[data-v-6820bc9c]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border)}.dialog-title[data-v-6820bc9c]{font-size:14px;font-weight:600}.dialog-body[data-v-6820bc9c]{padding:16px 20px}.dialog-btns[data-v-6820bc9c]{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px 16px;border-top:1px solid var(--border)}.vp-field[data-v-6820bc9c]{margin-bottom:10px}.vp-field label[data-v-6820bc9c]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.vp-tip[data-v-6820bc9c]{font-size:12px;margin-top:8px}.modal-enter-active[data-v-6820bc9c],.modal-leave-active[data-v-6820bc9c]{transition:opacity .15s ease}.modal-enter-from[data-v-6820bc9c],.modal-leave-to[data-v-6820bc9c]{opacity:0}.settings[data-v-81598f02]{display:flex;flex-direction:column;gap:12px;max-width:640px}.acc-line[data-v-81598f02]{font-size:12px;margin-bottom:10px;line-height:1.7}.section[data-v-81598f02]{padding:14px 16px}.section-title[data-v-81598f02]{font-weight:600;margin-bottom:10px;font-size:13px}.rule-grid[data-v-81598f02]{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px}.rule-item label[data-v-81598f02]{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}.rule-save[data-v-81598f02]{display:flex;align-items:center;gap:10px;margin-top:12px}.proj-add[data-v-81598f02]{display:flex;gap:8px}.proj-tip[data-v-81598f02]{font-size:12px;margin-top:6px}.proj-row[data-v-81598f02]{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}.proj-row[data-v-81598f02]:last-child{border-bottom:none}.proj-name[data-v-81598f02]{flex:1;word-break:break-all}.proj-name.archived[data-v-81598f02]{color:var(--text-3);text-decoration:line-through}.loc-note[data-v-81598f02]{font-size:12px}.ai-grid[data-v-81598f02]{display:flex;flex-direction:column;gap:10px}.backup-row[data-v-81598f02]{display:flex;gap:8px}.import-error[data-v-81598f02]{color:var(--danger);font-size:12px;margin-top:8px}.backup-note[data-v-81598f02]{font-size:12px;margin-top:10px}.login-page[data-v-d3d6c8cb]{min-height:100vh;background:var(--bg-subtle);display:flex;align-items:center;justify-content:center;padding:20px}.login-card[data-v-d3d6c8cb]{width:400px;max-width:100%;padding:28px 26px;display:flex;flex-direction:column;gap:12px;background:var(--bg-page)}.login-brand[data-v-d3d6c8cb]{text-align:center;margin-bottom:6px}.brand-icon[data-v-d3d6c8cb]{width:46px;height:46px;margin:0 auto 10px;border-radius:var(--radius-md);background:var(--accent-bg);color:var(--accent);display:flex;align-items:center;justify-content:center}.login-title[data-v-d3d6c8cb]{font-size:18px;font-weight:600;color:var(--text-1)}.login-sub[data-v-d3d6c8cb]{font-size:12px;margin-top:4px;line-height:1.7}.seg[data-v-d3d6c8cb]{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden}.seg-btn[data-v-d3d6c8cb]{flex:1;height:30px;border:none;background:var(--bg-page);color:var(--text-2);cursor:pointer;font-size:13px}.seg-btn+.seg-btn[data-v-d3d6c8cb]{border-left:1px solid var(--border)}.seg-btn.active[data-v-d3d6c8cb]{background:var(--accent-bg);color:var(--accent)}.mig-row[data-v-d3d6c8cb]{display:flex;align-items:flex-start;gap:8px;font-size:12px;color:var(--text-2);cursor:pointer;line-height:1.6}.mig-row input[data-v-d3d6c8cb]{margin-top:3px}.form-error[data-v-d3d6c8cb]{color:var(--danger);font-size:12px}.login-btn[data-v-d3d6c8cb]{margin-top:2px}.login-note[data-v-d3d6c8cb]{font-size:12px;text-align:center;line-height:1.7}.app[data-v-57e72b29]{display:flex;height:100vh;height:100dvh;overflow:hidden}.side[data-v-57e72b29]{width:56px;flex:none;border-right:1px solid var(--border);display:flex;flex-direction:column;align-items:center;padding-top:10px;gap:4px;background:var(--bg-page)}.nav-btn[data-v-57e72b29]{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--text-3);cursor:pointer;border:none;background:transparent;position:relative}.nav-btn[data-v-57e72b29]:hover{background:var(--bg-hover);color:var(--text-1)}.nav-btn.active[data-v-57e72b29]{background:var(--accent-bg);color:var(--accent)}.nav-btn[data-v-57e72b29]:after{content:attr(data-tip);position:absolute;left:46px;top:50%;transform:translateY(-50%);background:var(--text-1);color:#fff;font-size:12px;line-height:1.4;padding:2px 8px;border-radius:4px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s}.nav-btn[data-v-57e72b29]:hover:after{opacity:1}.main[data-v-57e72b29]{flex:1;display:flex;flex-direction:column;min-width:0}.topbar[data-v-57e72b29]{height:56px;flex:none;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:12px;padding:0 20px}.title[data-v-57e72b29]{font-size:14px;font-weight:600}.topbar-actions[data-v-57e72b29]{display:flex;align-items:center;gap:8px}.gsearch[data-v-57e72b29]{position:relative;width:300px;max-width:38vw}.gs-icon[data-v-57e72b29]{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-3)}.gs-input[data-v-57e72b29]{height:30px;padding-left:30px}.gs-panel[data-v-57e72b29]{position:absolute;top:36px;left:0;right:0;background:var(--bg-page);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-float);z-index:50;max-height:420px;overflow:auto;padding:6px}.gs-group[data-v-57e72b29]{font-size:12px;padding:6px 8px 2px}.gs-item[data-v-57e72b29]{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--radius-sm);cursor:pointer}.gs-item[data-v-57e72b29]:hover{background:var(--bg-hover)}.gs-text[data-v-57e72b29],.gs-sub[data-v-57e72b29]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gs-text[data-v-57e72b29]{font-size:13px}.gs-sub[data-v-57e72b29]{font-size:12px}.gs-date[data-v-57e72b29]{font-size:12px;flex:none}.gs-empty[data-v-57e72b29]{padding:10px;font-size:12px;text-align:center}.user-chip[data-v-57e72b29]{font-size:12px;color:var(--text-2);padding:0 4px}.week-tip[data-v-57e72b29]{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--warn);color:var(--warn);background:var(--bg-page);border-radius:999px;height:26px;padding:0 10px;font-size:12px;cursor:pointer}.week-tip[data-v-57e72b29]:hover{background:var(--bg-subtle)}.content[data-v-57e72b29]{flex:1;overflow:auto}.content-inner[data-v-57e72b29]{max-width:1200px;margin:0 auto;padding:20px}.toast-wrap[data-v-57e72b29]{position:fixed;top:68px;right:20px;z-index:60;display:flex;flex-direction:column;gap:8px;align-items:flex-end;pointer-events:none}.toast[data-v-57e72b29]{background:var(--bg-page);border:1px solid var(--border);box-shadow:var(--shadow-float);border-radius:var(--radius-sm);padding:8px 14px;font-size:13px;color:var(--text-1)}.toast-enter-from[data-v-57e72b29],.toast-leave-to[data-v-57e72b29]{opacity:0;transform:translateY(-4px)}.toast-enter-active[data-v-57e72b29],.toast-leave-active[data-v-57e72b29]{transition:all .15s ease}@media (max-width: 720px){.app[data-v-57e72b29]{flex-direction:column;height:100dvh}.side[data-v-57e72b29]{order:2;width:100%;height:calc(54px + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom);flex-direction:row;justify-content:space-around;border-right:none;border-top:1px solid var(--border);padding-top:0}.main[data-v-57e72b29]{order:1;flex:1;min-height:0}.nav-btn[data-v-57e72b29]{width:44px;height:42px}.nav-btn[data-v-57e72b29]:after{display:none}.topbar[data-v-57e72b29]{flex-wrap:wrap;height:auto;min-height:52px;padding:8px 12px;row-gap:8px}.topbar>.flex1[data-v-57e72b29]{display:none}.gsearch[data-v-57e72b29]{order:10;width:100%;max-width:100%}.gs-input[data-v-57e72b29]{height:34px}.gs-panel[data-v-57e72b29]{top:100%}.topbar-actions[data-v-57e72b29]{margin-left:auto}.user-chip[data-v-57e72b29]{max-width:72px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content-inner[data-v-57e72b29]{padding:12px}.toast-wrap[data-v-57e72b29]{top:8px;right:12px;left:12px;align-items:flex-end}}:root{--bg-page: #FFFFFF;--bg-subtle: #F7F8FA;--bg-hover: #F2F3F5;--border: #EBEDF0;--border-strong: #DCDEE3;--text-1: #1D2129;--text-2: #4E5969;--text-3: #86909C;--accent: #3370FF;--accent-bg: #F0F5FF;--ok: #23A757;--warn: #E8842C;--danger: #E5484D;--dot-empty: #C9CDD4;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--shadow-float: 0 4px 16px rgba(29, 33, 41, .08)}*{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--bg-page);color:var(--text-1);font-family:-apple-system,PingFang SC,Microsoft YaHei,system-ui,sans-serif;font-size:13px;line-height:1.6;-webkit-font-smoothing:antialiased}button,input,select,textarea{font:inherit;color:inherit}.num{font-variant-numeric:tabular-nums}.flex1{flex:1}.muted{color:var(--text-3)}.muted2{color:var(--text-2)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 12px;height:32px;border-radius:var(--radius-sm);border:1px solid var(--border-strong);background:var(--bg-page);color:var(--text-1);cursor:pointer;white-space:nowrap}.btn:hover{background:var(--bg-hover)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn-primary:hover{background:#2b5fd9}.btn-danger{color:var(--danger);border-color:var(--danger)}.btn-sm{height:26px;padding:0 10px;font-size:12px}.btn-xs{height:22px;padding:0 8px;font-size:12px}.input,.select,.textarea{height:32px;padding:0 10px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-page);outline:none;width:100%}.textarea{height:auto;min-height:56px;padding:8px 10px;resize:vertical}.input:focus,.select:focus,.textarea:focus{border-color:var(--accent)}.input::placeholder,.textarea::placeholder{color:var(--text-3)}.card{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-page)}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;flex:none;border:none;background:transparent;border-radius:var(--radius-sm);color:var(--text-3);cursor:pointer}.icon-btn:hover{background:var(--bg-hover);color:var(--text-1)}.icon-btn.active{color:var(--accent)}.icon-btn.active-warn{color:var(--warn)}.tag{display:inline-block;padding:0 8px;height:22px;line-height:20px;border-radius:4px;font-size:12px;background:var(--bg-subtle);color:var(--text-2);border:1px solid var(--border);white-space:nowrap}.dot{width:6px;height:6px;border-radius:50%;display:inline-block;flex:none}.dot.normal{background:var(--ok)}.dot.late,.dot.early,.dot.incomplete{background:var(--warn)}.dot.absent{background:var(--danger)}.dot.none,.dot.leave{background:var(--dot-empty)}@media (max-width: 720px){input,select,textarea{font-size:16px!important}input[type=checkbox]{font-size:initial}}.dot.rest{background:var(--border)}.icon{display:inline-flex;align-items:center;justify-content:center;flex:none}.icon svg{width:100%;height:100%;display:block} diff --git a/intern-log/dist/assets/web-DemcfbD8.js b/intern-log/dist/assets/web-C1N1mu_I.js similarity index 98% rename from intern-log/dist/assets/web-DemcfbD8.js rename to intern-log/dist/assets/web-C1N1mu_I.js index 03cc14b..0ad88cb 100644 --- a/intern-log/dist/assets/web-DemcfbD8.js +++ b/intern-log/dist/assets/web-C1N1mu_I.js @@ -1 +1 @@ -import{W as P,b as x}from"./index-B9GSzgPK.js";import{Encoding as E}from"./index-BdeEta5K.js";function m(w){const e=w.split("/").filter(t=>t!=="."),r=[];return e.forEach(t=>{t===".."&&r.length>0&&r[r.length-1]!==".."?r.pop():r.push(t)}),r.join("/")}function R(w,e){w=m(w),e=m(e);const r=w.split("/"),t=e.split("/");return w!==e&&r.every((i,n)=>i===t[n])}class g extends P{constructor(){super(...arguments),this.DB_VERSION=1,this.DB_NAME="Disc",this._writeCmds=["add","put","delete"],this.downloadFile=async e=>{var r,t;const i=x(e,e.webFetchExtra),n=await fetch(e.url,i);let s;if(!e.progress)s=await n.blob();else if(!(n!=null&&n.body))s=new Blob;else{const c=n.body.getReader();let o=0;const d=[],h=n.headers.get("content-type"),y=parseInt(n.headers.get("content-length")||"0",10);for(;;){const{done:f,value:p}=await c.read();if(f)break;d.push(p),o+=(p==null?void 0:p.length)||0;const b={url:e.url,bytes:o,contentLength:y};this.notifyListeners("progress",b)}const u=new Uint8Array(o);let l=0;for(const f of d)typeof f>"u"||(u.set(f,l),l+=f.length);s=new Blob([u.buffer],{type:h||void 0})}return{path:(await this.writeFile({path:e.path,directory:(r=e.directory)!==null&&r!==void 0?r:void 0,recursive:(t=e.recursive)!==null&&t!==void 0?t:!1,data:s})).uri,blob:s}}}async initDb(){if(this._db!==void 0)return this._db;if(!("indexedDB"in window))throw this.unavailable("This browser doesn't support IndexedDB");return new Promise((e,r)=>{const t=indexedDB.open(this.DB_NAME,this.DB_VERSION);t.onupgradeneeded=g.doUpgrade,t.onsuccess=()=>{this._db=t.result,e(t.result)},t.onerror=()=>r(t.error),t.onblocked=()=>{console.warn("db blocked")}})}static doUpgrade(e){const t=e.target.result;switch(e.oldVersion){case 0:case 1:default:t.objectStoreNames.contains("FileStorage")&&t.deleteObjectStore("FileStorage"),t.createObjectStore("FileStorage",{keyPath:"path"}).createIndex("by_folder","folder")}}async dbRequest(e,r){const t=this._writeCmds.indexOf(e)!==-1?"readwrite":"readonly";return this.initDb().then(i=>new Promise((n,s)=>{const o=i.transaction(["FileStorage"],t).objectStore("FileStorage")[e](...r);o.onsuccess=()=>n(o.result),o.onerror=()=>s(o.error)}))}async dbIndexRequest(e,r,t){const i=this._writeCmds.indexOf(r)!==-1?"readwrite":"readonly";return this.initDb().then(n=>new Promise((s,a)=>{const h=n.transaction(["FileStorage"],i).objectStore("FileStorage").index(e)[r](...t);h.onsuccess=()=>s(h.result),h.onerror=()=>a(h.error)}))}getPath(e,r){const t=r!==void 0?r.replace(/^[/]+|[/]+$/g,""):"";let i="";return e!==void 0&&(i+="/"+e),r!==""&&(i+="/"+t),i}async clear(){(await this.initDb()).transaction(["FileStorage"],"readwrite").objectStore("FileStorage").clear()}async readFile(e){const r=this.getPath(e.directory,e.path),t=await this.dbRequest("get",[r]);if(t===void 0)throw Error("File does not exist.");return{data:t.content?t.content:""}}async writeFile(e){const r=this.getPath(e.directory,e.path);let t=e.data;const i=e.encoding,n=e.recursive,s=await this.dbRequest("get",[r]);if(s&&s.type==="directory")throw Error("The supplied path is a directory.");const a=r.substr(0,r.lastIndexOf("/"));if(await this.dbRequest("get",[a])===void 0){const h=a.indexOf("/",1);if(h!==-1){const y=a.substr(h);await this.mkdir({path:y,directory:e.directory,recursive:n})}}if(!i&&!(t instanceof Blob)&&(t=t.indexOf(",")>=0?t.split(",")[1]:t,!this.isBase64String(t)))throw Error("The supplied data is not valid base64 content.");const o=Date.now(),d={path:r,folder:a,type:"file",size:t instanceof Blob?t.size:t.length,ctime:o,mtime:o,content:t};return await this.dbRequest("put",[d]),{uri:d.path}}async appendFile(e){const r=this.getPath(e.directory,e.path);let t=e.data;const i=e.encoding,n=r.substr(0,r.lastIndexOf("/")),s=Date.now();let a=s;const c=await this.dbRequest("get",[r]);if(c&&c.type==="directory")throw Error("The supplied path is a directory.");if(await this.dbRequest("get",[n])===void 0){const h=n.indexOf("/",1);if(h!==-1){const y=n.substr(h);await this.mkdir({path:y,directory:e.directory,recursive:!0})}}if(!i&&!this.isBase64String(t))throw Error("The supplied data is not valid base64 content.");if(c!==void 0){if(c.content instanceof Blob)throw Error("The occupied entry contains a Blob object which cannot be appended to.");c.content!==void 0&&!i?t=btoa(atob(c.content)+atob(t)):t=c.content+t,a=c.ctime}const d={path:r,folder:n,type:"file",size:t.length,ctime:a,mtime:s,content:t};await this.dbRequest("put",[d])}async deleteFile(e){const r=this.getPath(e.directory,e.path);if(await this.dbRequest("get",[r])===void 0)throw Error("File does not exist.");if((await this.dbIndexRequest("by_folder","getAllKeys",[IDBKeyRange.only(r)])).length!==0)throw Error("Folder is not empty.");await this.dbRequest("delete",[r])}async mkdir(e){const r=this.getPath(e.directory,e.path),t=e.recursive,i=r.substr(0,r.lastIndexOf("/")),n=(r.match(/\//g)||[]).length,s=await this.dbRequest("get",[i]),a=await this.dbRequest("get",[r]);if(n===1)throw Error("Cannot create Root directory");if(a!==void 0)throw Error("Current directory does already exist.");if(!t&&n!==2&&s===void 0)throw Error("Parent directory must exist");if(t&&n!==2&&s===void 0){const d=i.substr(i.indexOf("/",1));await this.mkdir({path:d,directory:e.directory,recursive:t})}const c=Date.now(),o={path:r,folder:i,type:"directory",size:0,ctime:c,mtime:c};await this.dbRequest("put",[o])}async rmdir(e){const{path:r,directory:t,recursive:i}=e,n=this.getPath(t,r),s=await this.dbRequest("get",[n]);if(s===void 0)throw Error("Folder does not exist.");if(s.type!=="directory")throw Error("Requested path is not a directory");const a=await this.readdir({path:r,directory:t});if(a.files.length!==0&&!i)throw Error("Folder is not empty");for(const c of a.files){const o=`${r}/${c.name}`;(await this.stat({path:o,directory:t})).type==="file"?await this.deleteFile({path:o,directory:t}):await this.rmdir({path:o,directory:t,recursive:i})}await this.dbRequest("delete",[n])}async readdir(e){const r=this.getPath(e.directory,e.path),t=await this.dbRequest("get",[r]);if(e.path!==""&&t===void 0)throw Error("Folder does not exist.");const i=await this.dbIndexRequest("by_folder","getAllKeys",[IDBKeyRange.only(r)]);return{files:await Promise.all(i.map(async s=>{let a=await this.dbRequest("get",[s]);return a===void 0&&(a=await this.dbRequest("get",[s+"/"])),{name:s.substring(r.length+1),type:a.type,size:a.size,ctime:a.ctime,mtime:a.mtime,uri:a.path}}))}}async getUri(e){const r=this.getPath(e.directory,e.path);let t=await this.dbRequest("get",[r]);return t===void 0&&(t=await this.dbRequest("get",[r+"/"])),{uri:(t==null?void 0:t.path)||r}}async stat(e){const r=this.getPath(e.directory,e.path);let t=await this.dbRequest("get",[r]);if(t===void 0&&(t=await this.dbRequest("get",[r+"/"])),t===void 0)throw Error("Entry does not exist.");return{type:t.type,size:t.size,ctime:t.ctime,mtime:t.mtime,uri:t.path}}async rename(e){await this._copy(e,!0)}async copy(e){return this._copy(e,!1)}async requestPermissions(){return{publicStorage:"granted"}}async checkPermissions(){return{publicStorage:"granted"}}async _copy(e,r=!1){let{toDirectory:t}=e;const{to:i,from:n,directory:s}=e;if(!i||!n)throw Error("Both to and from must be provided");t||(t=s);const a=this.getPath(s,n),c=this.getPath(t,i);if(a===c)return{uri:c};if(R(a,c))throw Error("To path cannot contain the from path");let o;try{o=await this.stat({path:i,directory:t})}catch{const l=i.split("/");l.pop();const f=l.join("/");if(l.length>0&&(await this.stat({path:f,directory:t})).type!=="directory")throw new Error("Parent directory of the to path is a file")}if(o&&o.type==="directory")throw new Error("Cannot overwrite a directory with a file");const d=await this.stat({path:n,directory:s}),h=async(u,l,f)=>{const p=this.getPath(t,u),b=await this.dbRequest("get",[p]);b.ctime=l,b.mtime=f,await this.dbRequest("put",[b])},y=d.ctime?d.ctime:Date.now();switch(d.type){case"file":{const u=await this.readFile({path:n,directory:s});r&&await this.deleteFile({path:n,directory:s});let l;!(u.data instanceof Blob)&&!this.isBase64String(u.data)&&(l=E.UTF8);const f=await this.writeFile({path:i,directory:t,data:u.data,encoding:l});return r&&await h(i,y,d.mtime),f}case"directory":{if(o)throw Error("Cannot move a directory over an existing object");try{await this.mkdir({path:i,directory:t,recursive:!1}),r&&await h(i,y,d.mtime)}catch{}const u=(await this.readdir({path:n,directory:s})).files;for(const l of u)await this._copy({from:`${n}/${l.name}`,to:`${i}/${l.name}`,directory:s,toDirectory:t},r);r&&await this.rmdir({path:n,directory:s})}}return{uri:c}}isBase64String(e){try{return btoa(atob(e))==e}catch{return!1}}}g._debug=!0;export{g as FilesystemWeb}; +import{W as P,b as x}from"./index-CocrpELo.js";import{Encoding as E}from"./index-mjAVYvQ7.js";function m(w){const e=w.split("/").filter(t=>t!=="."),r=[];return e.forEach(t=>{t===".."&&r.length>0&&r[r.length-1]!==".."?r.pop():r.push(t)}),r.join("/")}function R(w,e){w=m(w),e=m(e);const r=w.split("/"),t=e.split("/");return w!==e&&r.every((i,n)=>i===t[n])}class g extends P{constructor(){super(...arguments),this.DB_VERSION=1,this.DB_NAME="Disc",this._writeCmds=["add","put","delete"],this.downloadFile=async e=>{var r,t;const i=x(e,e.webFetchExtra),n=await fetch(e.url,i);let s;if(!e.progress)s=await n.blob();else if(!(n!=null&&n.body))s=new Blob;else{const c=n.body.getReader();let o=0;const d=[],h=n.headers.get("content-type"),y=parseInt(n.headers.get("content-length")||"0",10);for(;;){const{done:f,value:p}=await c.read();if(f)break;d.push(p),o+=(p==null?void 0:p.length)||0;const b={url:e.url,bytes:o,contentLength:y};this.notifyListeners("progress",b)}const u=new Uint8Array(o);let l=0;for(const f of d)typeof f>"u"||(u.set(f,l),l+=f.length);s=new Blob([u.buffer],{type:h||void 0})}return{path:(await this.writeFile({path:e.path,directory:(r=e.directory)!==null&&r!==void 0?r:void 0,recursive:(t=e.recursive)!==null&&t!==void 0?t:!1,data:s})).uri,blob:s}}}async initDb(){if(this._db!==void 0)return this._db;if(!("indexedDB"in window))throw this.unavailable("This browser doesn't support IndexedDB");return new Promise((e,r)=>{const t=indexedDB.open(this.DB_NAME,this.DB_VERSION);t.onupgradeneeded=g.doUpgrade,t.onsuccess=()=>{this._db=t.result,e(t.result)},t.onerror=()=>r(t.error),t.onblocked=()=>{console.warn("db blocked")}})}static doUpgrade(e){const t=e.target.result;switch(e.oldVersion){case 0:case 1:default:t.objectStoreNames.contains("FileStorage")&&t.deleteObjectStore("FileStorage"),t.createObjectStore("FileStorage",{keyPath:"path"}).createIndex("by_folder","folder")}}async dbRequest(e,r){const t=this._writeCmds.indexOf(e)!==-1?"readwrite":"readonly";return this.initDb().then(i=>new Promise((n,s)=>{const o=i.transaction(["FileStorage"],t).objectStore("FileStorage")[e](...r);o.onsuccess=()=>n(o.result),o.onerror=()=>s(o.error)}))}async dbIndexRequest(e,r,t){const i=this._writeCmds.indexOf(r)!==-1?"readwrite":"readonly";return this.initDb().then(n=>new Promise((s,a)=>{const h=n.transaction(["FileStorage"],i).objectStore("FileStorage").index(e)[r](...t);h.onsuccess=()=>s(h.result),h.onerror=()=>a(h.error)}))}getPath(e,r){const t=r!==void 0?r.replace(/^[/]+|[/]+$/g,""):"";let i="";return e!==void 0&&(i+="/"+e),r!==""&&(i+="/"+t),i}async clear(){(await this.initDb()).transaction(["FileStorage"],"readwrite").objectStore("FileStorage").clear()}async readFile(e){const r=this.getPath(e.directory,e.path),t=await this.dbRequest("get",[r]);if(t===void 0)throw Error("File does not exist.");return{data:t.content?t.content:""}}async writeFile(e){const r=this.getPath(e.directory,e.path);let t=e.data;const i=e.encoding,n=e.recursive,s=await this.dbRequest("get",[r]);if(s&&s.type==="directory")throw Error("The supplied path is a directory.");const a=r.substr(0,r.lastIndexOf("/"));if(await this.dbRequest("get",[a])===void 0){const h=a.indexOf("/",1);if(h!==-1){const y=a.substr(h);await this.mkdir({path:y,directory:e.directory,recursive:n})}}if(!i&&!(t instanceof Blob)&&(t=t.indexOf(",")>=0?t.split(",")[1]:t,!this.isBase64String(t)))throw Error("The supplied data is not valid base64 content.");const o=Date.now(),d={path:r,folder:a,type:"file",size:t instanceof Blob?t.size:t.length,ctime:o,mtime:o,content:t};return await this.dbRequest("put",[d]),{uri:d.path}}async appendFile(e){const r=this.getPath(e.directory,e.path);let t=e.data;const i=e.encoding,n=r.substr(0,r.lastIndexOf("/")),s=Date.now();let a=s;const c=await this.dbRequest("get",[r]);if(c&&c.type==="directory")throw Error("The supplied path is a directory.");if(await this.dbRequest("get",[n])===void 0){const h=n.indexOf("/",1);if(h!==-1){const y=n.substr(h);await this.mkdir({path:y,directory:e.directory,recursive:!0})}}if(!i&&!this.isBase64String(t))throw Error("The supplied data is not valid base64 content.");if(c!==void 0){if(c.content instanceof Blob)throw Error("The occupied entry contains a Blob object which cannot be appended to.");c.content!==void 0&&!i?t=btoa(atob(c.content)+atob(t)):t=c.content+t,a=c.ctime}const d={path:r,folder:n,type:"file",size:t.length,ctime:a,mtime:s,content:t};await this.dbRequest("put",[d])}async deleteFile(e){const r=this.getPath(e.directory,e.path);if(await this.dbRequest("get",[r])===void 0)throw Error("File does not exist.");if((await this.dbIndexRequest("by_folder","getAllKeys",[IDBKeyRange.only(r)])).length!==0)throw Error("Folder is not empty.");await this.dbRequest("delete",[r])}async mkdir(e){const r=this.getPath(e.directory,e.path),t=e.recursive,i=r.substr(0,r.lastIndexOf("/")),n=(r.match(/\//g)||[]).length,s=await this.dbRequest("get",[i]),a=await this.dbRequest("get",[r]);if(n===1)throw Error("Cannot create Root directory");if(a!==void 0)throw Error("Current directory does already exist.");if(!t&&n!==2&&s===void 0)throw Error("Parent directory must exist");if(t&&n!==2&&s===void 0){const d=i.substr(i.indexOf("/",1));await this.mkdir({path:d,directory:e.directory,recursive:t})}const c=Date.now(),o={path:r,folder:i,type:"directory",size:0,ctime:c,mtime:c};await this.dbRequest("put",[o])}async rmdir(e){const{path:r,directory:t,recursive:i}=e,n=this.getPath(t,r),s=await this.dbRequest("get",[n]);if(s===void 0)throw Error("Folder does not exist.");if(s.type!=="directory")throw Error("Requested path is not a directory");const a=await this.readdir({path:r,directory:t});if(a.files.length!==0&&!i)throw Error("Folder is not empty");for(const c of a.files){const o=`${r}/${c.name}`;(await this.stat({path:o,directory:t})).type==="file"?await this.deleteFile({path:o,directory:t}):await this.rmdir({path:o,directory:t,recursive:i})}await this.dbRequest("delete",[n])}async readdir(e){const r=this.getPath(e.directory,e.path),t=await this.dbRequest("get",[r]);if(e.path!==""&&t===void 0)throw Error("Folder does not exist.");const i=await this.dbIndexRequest("by_folder","getAllKeys",[IDBKeyRange.only(r)]);return{files:await Promise.all(i.map(async s=>{let a=await this.dbRequest("get",[s]);return a===void 0&&(a=await this.dbRequest("get",[s+"/"])),{name:s.substring(r.length+1),type:a.type,size:a.size,ctime:a.ctime,mtime:a.mtime,uri:a.path}}))}}async getUri(e){const r=this.getPath(e.directory,e.path);let t=await this.dbRequest("get",[r]);return t===void 0&&(t=await this.dbRequest("get",[r+"/"])),{uri:(t==null?void 0:t.path)||r}}async stat(e){const r=this.getPath(e.directory,e.path);let t=await this.dbRequest("get",[r]);if(t===void 0&&(t=await this.dbRequest("get",[r+"/"])),t===void 0)throw Error("Entry does not exist.");return{type:t.type,size:t.size,ctime:t.ctime,mtime:t.mtime,uri:t.path}}async rename(e){await this._copy(e,!0)}async copy(e){return this._copy(e,!1)}async requestPermissions(){return{publicStorage:"granted"}}async checkPermissions(){return{publicStorage:"granted"}}async _copy(e,r=!1){let{toDirectory:t}=e;const{to:i,from:n,directory:s}=e;if(!i||!n)throw Error("Both to and from must be provided");t||(t=s);const a=this.getPath(s,n),c=this.getPath(t,i);if(a===c)return{uri:c};if(R(a,c))throw Error("To path cannot contain the from path");let o;try{o=await this.stat({path:i,directory:t})}catch{const l=i.split("/");l.pop();const f=l.join("/");if(l.length>0&&(await this.stat({path:f,directory:t})).type!=="directory")throw new Error("Parent directory of the to path is a file")}if(o&&o.type==="directory")throw new Error("Cannot overwrite a directory with a file");const d=await this.stat({path:n,directory:s}),h=async(u,l,f)=>{const p=this.getPath(t,u),b=await this.dbRequest("get",[p]);b.ctime=l,b.mtime=f,await this.dbRequest("put",[b])},y=d.ctime?d.ctime:Date.now();switch(d.type){case"file":{const u=await this.readFile({path:n,directory:s});r&&await this.deleteFile({path:n,directory:s});let l;!(u.data instanceof Blob)&&!this.isBase64String(u.data)&&(l=E.UTF8);const f=await this.writeFile({path:i,directory:t,data:u.data,encoding:l});return r&&await h(i,y,d.mtime),f}case"directory":{if(o)throw Error("Cannot move a directory over an existing object");try{await this.mkdir({path:i,directory:t,recursive:!1}),r&&await h(i,y,d.mtime)}catch{}const u=(await this.readdir({path:n,directory:s})).files;for(const l of u)await this._copy({from:`${n}/${l.name}`,to:`${i}/${l.name}`,directory:s,toDirectory:t},r);r&&await this.rmdir({path:n,directory:s})}}return{uri:c}}isBase64String(e){try{return btoa(atob(e))==e}catch{return!1}}}g._debug=!0;export{g as FilesystemWeb}; diff --git a/intern-log/dist/index.html b/intern-log/dist/index.html index 00e7546..83bb598 100644 --- a/intern-log/dist/index.html +++ b/intern-log/dist/index.html @@ -8,8 +8,8 @@ 实习工作日志 - - + +
diff --git a/intern-log/src/App.vue b/intern-log/src/App.vue index 76e05aa..698776f 100644 --- a/intern-log/src/App.vue +++ b/intern-log/src/App.vue @@ -236,16 +236,18 @@ onMounted(async () => { - - {{ session?.username }} - - +
+ + {{ session?.username }} + + +
@@ -269,7 +271,7 @@ onMounted(async () => { diff --git a/intern-log/src/views/CalendarView.vue b/intern-log/src/views/CalendarView.vue index 76ac9e7..9e223af 100644 --- a/intern-log/src/views/CalendarView.vue +++ b/intern-log/src/views/CalendarView.vue @@ -206,4 +206,11 @@ watch(focusDate, d => { .drawer-enter-active, .drawer-leave-active { transition: opacity 0.15s ease; } .drawer-enter-from, .drawer-leave-to { opacity: 0; } + +@media (max-width: 720px) { + .cal-cell { min-height: 60px; padding: 4px 5px; } + .cal-title { min-width: 76px; font-size: 13px; } + .cal-marks { gap: 3px; margin-top: 4px; height: 12px; } + .drawer { width: 100%; } +} diff --git a/intern-log/src/views/LedgerView.vue b/intern-log/src/views/LedgerView.vue index 46500aa..796c03f 100644 --- a/intern-log/src/views/LedgerView.vue +++ b/intern-log/src/views/LedgerView.vue @@ -403,4 +403,10 @@ async function confirmDelete() { .ops { display: flex; gap: 4px; flex-wrap: wrap; } .empty { text-align: center; padding: 24px 0; } .vault-note { margin-top: 10px; font-size: 12px; text-align: right; } + +@media (max-width: 560px) { + .form-grid { grid-template-columns: 1fr; } + .field.span2 { grid-column: auto; } + .ledger-toolbar .w-filter { flex: 1; min-width: 0; width: auto; } +} diff --git a/intern-log/src/views/TodayView.vue b/intern-log/src/views/TodayView.vue index 328227f..175ca64 100644 --- a/intern-log/src/views/TodayView.vue +++ b/intern-log/src/views/TodayView.vue @@ -41,4 +41,10 @@ function onDateInput(e: Event) { .date-title { font-size: 14px; font-weight: 600; min-width: 170px; text-align: center; } .date-title.is-today { color: var(--accent); } .w-date { width: 150px; } + +@media (max-width: 720px) { + .detail-toolbar { gap: 8px; } + .date-title { min-width: 0; flex: 1; text-align: left; } + .w-date { flex: 1; min-width: 120px; width: auto; } +}