diff --git a/src/static/assets/AdminView-CBzT_n85.js b/src/static/assets/AdminView-CBzT_n85.js new file mode 100644 index 0000000..4371166 --- /dev/null +++ b/src/static/assets/AdminView-CBzT_n85.js @@ -0,0 +1 @@ +import{d as _,u as y,A as h,c as r,a as t,e as n,k as v,w as d,f as g,s as m,o as s,F as b,r as k,t as a,q as u,h as A}from"./index-BiYpJJoC.js";import{a as w}from"./admin-BG8iXstk.js";import{_ as B,a as S}from"./CardContent.vue_vue_type_script_setup_true_lang-BwqudhrR.js";import{_ as f}from"./Badge.vue_vue_type_script_setup_true_lang-DE_UXwEf.js";import{_ as V}from"./Spinner.vue_vue_type_script_setup_true_lang-CvE8XLn7.js";import{a as $}from"./utils-7WVCegLb.js";const N={class:"p-6 space-y-8"},C={key:0,class:"flex items-center justify-center h-20"},D={class:"w-full"},E={class:"px-4 py-3"},F={class:"text-sm font-medium text-foreground"},R={class:"px-4 py-3 text-sm text-muted-foreground"},U={class:"px-4 py-3"},j={class:"px-4 py-3"},q={class:"px-4 py-3 text-xs text-muted-foreground"},H=_({__name:"AdminView",setup(I){const x=y(),p=g(),i=m([]),l=m(!1);return h(async()=>{if(!x.isAdmin){p.push("/");return}l.value=!0;try{const c=await w.users();i.value=c.data}finally{l.value=!1}}),(c,o)=>(s(),r("div",N,[o[1]||(o[1]=t("h2",{class:"text-lg font-semibold text-foreground"},"Admin — Users",-1)),l.value?(s(),r("div",C,[n(V,{class:"text-primary"})])):(s(),v(B,{key:1},{default:d(()=>[n(S,{class:"p-0"},{default:d(()=>[t("table",D,[o[0]||(o[0]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"User"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Email"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Role"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Status"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Joined")])],-1)),t("tbody",null,[(s(!0),r(b,null,k(i.value,e=>(s(),r("tr",{key:e.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",E,[t("p",F,a(e.username),1)]),t("td",R,a(e.email),1),t("td",U,[n(f,{variant:e.role==="admin"?"default":"secondary",class:"text-xs"},{default:d(()=>[u(a(e.role),1)]),_:2},1032,["variant"])]),t("td",j,[n(f,{variant:e.is_active?"success":"outline",class:"text-xs"},{default:d(()=>[u(a(e.is_active?"Active":"Inactive"),1)]),_:2},1032,["variant"])]),t("td",q,a(A($)(e.created_at)),1)]))),128))])])]),_:1})]),_:1}))]))}});export{H as default}; diff --git a/src/static/assets/AdminView-CRFaWZRG.js b/src/static/assets/AdminView-CRFaWZRG.js deleted file mode 100644 index d8b8980..0000000 --- a/src/static/assets/AdminView-CRFaWZRG.js +++ /dev/null @@ -1 +0,0 @@ -import{d as p,u as y,y as h,c as r,a as t,e as n,k as v,w as d,f as b,s as m,o as s,F as g,r as k,t as a,q as u,h as A}from"./index-DMlmI4VG.js";import{a as w}from"./admin-DvZ7jcBF.js";import{_ as B,a as S}from"./CardContent.vue_vue_type_script_setup_true_lang-B5oRrbOE.js";import{_ as f}from"./Badge.vue_vue_type_script_setup_true_lang-B0XCy3Qk.js";import{_ as V}from"./Spinner.vue_vue_type_script_setup_true_lang-CxhsEqE4.js";import{a as $}from"./utils-7WVCegLb.js";const N={class:"p-6"},C={key:0,class:"flex items-center justify-center h-20"},D={class:"w-full"},E={class:"px-4 py-3"},F={class:"text-sm font-medium text-foreground"},R={class:"px-4 py-3 text-sm text-muted-foreground"},U={class:"px-4 py-3"},j={class:"px-4 py-3"},q={class:"px-4 py-3 text-xs text-muted-foreground"},H=p({__name:"AdminView",setup(I){const x=y(),_=b(),i=m([]),l=m(!1);return h(async()=>{if(!x.isAdmin){_.push("/");return}l.value=!0;try{const c=await w.users();i.value=c.data}finally{l.value=!1}}),(c,o)=>(s(),r("div",N,[o[1]||(o[1]=t("h2",{class:"text-lg font-semibold text-foreground mb-6"},"Admin — Users",-1)),l.value?(s(),r("div",C,[n(V,{class:"text-primary"})])):(s(),v(B,{key:1},{default:d(()=>[n(S,{class:"p-0"},{default:d(()=>[t("table",D,[o[0]||(o[0]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"User"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Email"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Role"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Status"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Joined")])],-1)),t("tbody",null,[(s(!0),r(g,null,k(i.value,e=>(s(),r("tr",{key:e.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",E,[t("p",F,a(e.username),1)]),t("td",R,a(e.email),1),t("td",U,[n(f,{variant:e.role==="admin"?"default":"secondary",class:"text-xs"},{default:d(()=>[u(a(e.role),1)]),_:2},1032,["variant"])]),t("td",j,[n(f,{variant:e.is_active?"success":"outline",class:"text-xs"},{default:d(()=>[u(a(e.is_active?"Active":"Inactive"),1)]),_:2},1032,["variant"])]),t("td",q,a(A($)(e.created_at)),1)]))),128))])])]),_:1})]),_:1}))]))}});export{H as default}; diff --git a/src/static/assets/AppLayout-B0UoMuf7.js b/src/static/assets/AppLayout-CNLTau4W.js similarity index 99% rename from src/static/assets/AppLayout-B0UoMuf7.js rename to src/static/assets/AppLayout-CNLTau4W.js index d39aa4b..8e1d36c 100644 --- a/src/static/assets/AppLayout-B0UoMuf7.js +++ b/src/static/assets/AppLayout-CNLTau4W.js @@ -1 +1 @@ -import{d as C,u as M,c as n,b as B,a as e,F as V,r as _,t as g,h as p,j as b,o as r,k as $,w as j,i as y,n as d,m as A,l as H,R as D,g as z,p as S,q as T,K as L,f as O,e as m,T as R,s as I,v as N}from"./index-DMlmI4VG.js";const P={class:"flex flex-col h-full bg-white border-r border-slate-200/80"},F={class:"flex-1 px-3 py-4 space-y-0.5 overflow-y-auto"},K={key:0,class:"absolute left-0 top-1/2 -translate-y-1/2 w-1 h-6 bg-orange-500 rounded-r-full"},q={class:"text-sm"},E={class:"p-4 border-t border-slate-100 shrink-0"},G={class:"flex items-center gap-3 px-2 py-2 rounded-xl bg-slate-50"},U={class:"h-8 w-8 rounded-full bg-gradient-to-br from-orange-400 to-orange-600 flex items-center justify-center text-[11px] font-bold text-white shrink-0 shadow-sm shadow-orange-200"},W={class:"flex-1 min-w-0"},J={class:"text-xs font-semibold text-slate-700 truncate"},Q=C({__name:"Sidebar",emits:["close"],setup(w,{emit:v}){const a=z(),l=M(),k=v,u=[{name:"Dashboard",path:"/",icon:"grid"},{name:"Calendar",path:"/calendar",icon:"calendar"},{name:"Tasks",path:"/tasks",icon:"check-square"},{name:"OMG",path:"/omg",icon:"omg"},{name:"Projects",path:"/projects",icon:"folder"},{name:"Live Feed",path:"/live",icon:"activity"},{name:"Reports",path:"/reports",icon:"file-text"},{name:"Keys",path:"/keys",icon:"key"},{name:"DevOps",path:"/devops",icon:"devops"},{name:"Settings",path:"/settings",icon:"settings"},{name:"Admin",path:"/admin",icon:"shield",adminOnly:!0}],x=b(()=>u.filter(h=>!h.adminOnly||l.isAdmin));function s(h){return h==="/"?a.path==="/":a.path.startsWith(h)}const i=b(()=>{var t,c;return(((t=l.user)==null?void 0:t.username)??((c=l.user)==null?void 0:c.email)??"?").slice(0,2).toUpperCase()});return(h,t)=>{var c,f;return r(),n("aside",P,[t[13]||(t[13]=B('
CC Dashboard
Oliver Agency
CC Dashboard
Oliver Agency
Corporate Planning Hub
Corporate Planning Hub
'+(n?t:w(t,!0))+`
-`:""+(n?t:w(t,!0))+`
-`}blockquote(t){return`-${t}-`}html(t,e){return t}heading(t,e,n){return`
${t}
-`}table(t,e){return e&&(e=`${e}`),`${t}`}br(){return"An error occurred:
"+w(n.message+"",!0)+"";return e?Promise.resolve(i):i}if(e)return Promise.reject(n);throw n}};const v=new vt;function d(a,t){return v.parse(a,t)}d.options=d.setOptions=function(a){return v.setOptions(a),d.defaults=v.defaults,we(d.defaults),d};d.getDefaults=Y;d.defaults=I;d.use=function(...a){return v.use(...a),d.defaults=v.defaults,we(d.defaults),d};d.walkTokens=function(a,t){return v.walkTokens(a,t)};d.parseInline=v.parseInline;d.Parser=_;d.parser=_.parse;d.Renderer=H;d.TextRenderer=re;d.Lexer=$;d.lexer=$.lex;d.Tokenizer=O;d.Hooks=B;d.parse=d;d.options;d.setOptions;d.use;d.walkTokens;d.parseInline;_.parse;$.lex;const St={class:"p-6"},It={class:"flex items-center gap-3 mb-6 flex-wrap"},At={class:"flex items-center gap-2"},Ct={class:"flex items-center rounded-md border border-border overflow-hidden"},Et={key:0,class:"flex items-center justify-center h-20"},Lt={key:1,class:"text-center text-muted-foreground py-12 text-sm"},Bt={key:2,class:"space-y-3"},qt=["onClick"],Zt={class:"flex items-center gap-2 flex-wrap"},Pt={class:"text-sm font-medium text-foreground"},Mt={class:"flex items-center gap-2 shrink-0"},Dt={class:"text-xs text-muted-foreground"},Qt={key:0,class:"mt-4 pt-4 border-t border-border"},jt={class:"flex gap-2 mb-3"},Ot=["onClick"],Nt=["onClick"],Ht=["innerHTML"],Ut=Be({__name:"ReportsView",setup(a){const t=qe(),e=C([]),n=C(!1),i=C(!1),r=C(null),s=C("daily");Ze(()=>o());async function o(){n.value=!0;try{const c=await de.list();e.value=c.data}finally{n.value=!1}}async function l(){i.value=!0;try{await de.generate({type:s.value,period_date:Ue(new Date)}),D.success("Report generated"),await o()}catch{D.error("Failed to generate report")}finally{i.value=!1}}function u(c){r.value=r.value===c?null:c}function p(c){return d(c)}async function f(c,h){try{const k=await fetch(`/cc-dashboard/api/reports/${c.id}/export?format=${h}`,{headers:{Authorization:`Bearer ${t.token}`}});if(!k.ok){D.error("Export failed");return}const m=await k.blob(),y=URL.createObjectURL(m),z=document.createElement("a");z.href=y,z.download=`report-${c.period_date}-${c.type}.${h}`,z.click(),URL.revokeObjectURL(y)}catch{D.error("Export failed")}}return(c,h)=>(T(),R("div",St,[b("div",It,[h[3]||(h[3]=b("h2",{class:"text-lg font-semibold text-foreground flex-1"},"AI Reports",-1)),b("div",At,[b("div",Ct,[b("button",{class:G(["px-3 py-1.5 text-xs font-medium transition-colors",s.value==="daily"?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-muted"]),onClick:h[0]||(h[0]=k=>s.value="daily")},"Daily",2),b("button",{class:G(["px-3 py-1.5 text-xs font-medium transition-colors",s.value==="weekly"?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-muted"]),onClick:h[1]||(h[1]=k=>s.value="weekly")},"Weekly",2)]),M(Oe,{size:"sm",loading:i.value,onClick:l},{default:A(()=>[...h[2]||(h[2]=[W(" Generate Now ",-1)])]),_:1},8,["loading"])])]),n.value?(T(),R("div",Et,[M(Ne,{class:"text-primary"})])):e.value.length===0?(T(),R("div",Lt," No reports generated yet ")):(T(),R("div",Bt,[(T(!0),R(Pe,null,Me(e.value,k=>(T(),ue(je,{key:k.id},{default:A(()=>[M(Qe,{class:"p-4"},{default:A(()=>[b("div",{class:"flex items-start justify-between gap-3 cursor-pointer",onClick:m=>u(k.id)},[b("div",Zt,[M(fe,{variant:k.type==="daily"?"default":"secondary",class:"text-xs"},{default:A(()=>[W(X(k.type),1)]),_:2},1032,["variant"]),b("span",Pt,X(De(He)(k.period_date)),1),k.email_sent?(T(),ue(fe,{key:0,variant:"success",class:"text-xs"},{default:A(()=>[...h[4]||(h[4]=[W(" Email sent ",-1)])]),_:1})):he("",!0)]),b("div",Mt,[b("span",Dt,X(new Date(k.generated_at).toLocaleString()),1),(T(),R("svg",{class:G(["h-4 w-4 text-muted-foreground transition-transform",r.value===k.id?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...h[5]||(h[5]=[b("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))])],8,qt),r.value===k.id?(T(),R("div",Qt,[b("div",jt,[b("button",{class:"text-xs px-2.5 py-1 rounded-lg border border-border text-muted-foreground hover:text-foreground hover:border-foreground/30 transition-colors",onClick:m=>f(k,"md")},"↓ Markdown",8,Ot),b("button",{class:"text-xs px-2.5 py-1 rounded-lg border border-border text-muted-foreground hover:text-foreground hover:border-foreground/30 transition-colors",onClick:m=>f(k,"html")},"↓ HTML",8,Nt)]),b("div",{class:"prose prose-sm prose-invert max-w-none text-sm text-foreground break-words",innerHTML:p(k.content_markdown)},null,8,Ht)])):he("",!0)]),_:2},1024)]),_:2},1024))),128))]))]))}}),en=Fe(Ut,[["__scopeId","data-v-beecdbb2"]]);export{en as default}; diff --git a/src/static/assets/ReportsView-b-OOza6x.js b/src/static/assets/ReportsView-b-OOza6x.js new file mode 100644 index 0000000..8d299f0 --- /dev/null +++ b/src/static/assets/ReportsView-b-OOza6x.js @@ -0,0 +1,46 @@ +var Ee=Object.defineProperty;var pe=a=>{throw TypeError(a)};var Le=(a,t,e)=>t in a?Ee(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e;var x=(a,t,e)=>Le(a,typeof t!="symbol"?t+"":t,e),Be=(a,t,e)=>t.has(a)||pe("Cannot "+e);var he=(a,t,e)=>t.has(a)?pe("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(a):t.set(a,e);var D=(a,t,e)=>(Be(a,t,"access private method"),e);import{D as G,d as qe,u as Ze,A as Pe,c as v,a as w,e as z,w as S,h as W,F as Me,r as De,s as E,o as T,q as L,k as ue,t as X,i as fe,n as Qe,K as Q}from"./index-BiYpJJoC.js";import{a as je,_ as Oe}from"./CardContent.vue_vue_type_script_setup_true_lang-BwqudhrR.js";import{_ as de}from"./Badge.vue_vue_type_script_setup_true_lang-DE_UXwEf.js";import{_ as K}from"./Button.vue_vue_type_script_setup_true_lang-XB9h72-Z.js";import{_ as Ne}from"./Spinner.vue_vue_type_script_setup_true_lang-CvE8XLn7.js";import{_ as Fe}from"./SegmentedControl.vue_vue_type_script_setup_true_lang-DN09G_1E.js";import{_ as He}from"./EmptyState.vue_vue_type_script_setup_true_lang-jNal0qhs.js";import{a as Ue,i as Ve}from"./utils-7WVCegLb.js";import{F as Ge}from"./file-text-C0mXX88J.js";import{C as We}from"./calendar-C9xlMu6k.js";import{_ as Xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./createLucideIcon-D7qP-VdO.js";const ge={list:()=>G.get("/api/reports"),get:a=>G.get(`/api/reports/${a}`),generate:a=>G.post("/api/reports/generate",a)};function ee(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}let C=ee();function ye(a){C=a}const $e=/[&<>"']/,Ke=new RegExp($e.source,"g"),_e=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Je=new RegExp(_e.source,"g"),Ye={"&":"&","<":"<",">":">",'"':""","'":"'"},ke=a=>Ye[a];function b(a,t){if(t){if($e.test(a))return a.replace(Ke,ke)}else if(_e.test(a))return a.replace(Je,ke);return a}const et=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function tt(a){return a.replace(et,(t,e)=>(e=e.toLowerCase(),e==="colon"?":":e.charAt(0)==="#"?e.charAt(1)==="x"?String.fromCharCode(parseInt(e.substring(2),16)):String.fromCharCode(+e.substring(1)):""))}const nt=/(^|[^\[])\^/g;function g(a,t){let e=typeof a=="string"?a:a.source;t=t||"";const n={replace:(i,r)=>{let s=typeof r=="string"?r:r.source;return s=s.replace(nt,"$1"),e=e.replace(i,s),n},getRegex:()=>new RegExp(e,t)};return n}function xe(a){try{a=encodeURI(a).replace(/%25/g,"%")}catch{return null}return a}const q={exec:()=>null};function me(a,t){const e=a.replace(/\|/g,(r,s,l)=>{let o=!1,u=s;for(;--u>=0&&l[u]==="\\";)o=!o;return o?"|":" |"}),n=e.split(/ \|/);let i=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length
'+(n?t:b(t,!0))+`
+`:""+(n?t:b(t,!0))+`
+`}blockquote(t){return`+${t}+`}html(t,e){return t}heading(t,e,n){return`
${t}
+`}table(t,e){return e&&(e=`${e}`),`${t}`}br(){return"An error occurred:
"+b(n.message+"",!0)+"";return e?Promise.resolve(i):i}if(e)return Promise.reject(n);throw n}};const A=new Ct;function d(a,t){return A.parse(a,t)}d.options=d.setOptions=function(a){return A.setOptions(a),d.defaults=A.defaults,ye(d.defaults),d};d.getDefaults=ee;d.defaults=C;d.use=function(...a){return A.use(...a),d.defaults=A.defaults,ye(d.defaults),d};d.walkTokens=function(a,t){return A.walkTokens(a,t)};d.parseInline=A.parseInline;d.Parser=_;d.parser=_.parse;d.Renderer=H;d.TextRenderer=le;d.Lexer=$;d.lexer=$.lex;d.Tokenizer=N;d.Hooks=Z;d.parse=d;d.options;d.setOptions;d.use;d.walkTokens;d.parseInline;_.parse;$.lex;const Et={class:"p-6"},Lt={class:"flex items-center gap-3 mb-6 flex-wrap"},Bt={class:"flex items-center gap-2"},qt={key:0,class:"flex items-center justify-center h-20"},Zt={key:1,class:"py-12"},Pt={key:2,class:"space-y-3"},Mt=["onClick"],Dt={class:"flex items-center gap-2 flex-wrap"},Qt={class:"text-sm font-medium text-foreground"},jt={class:"flex items-center gap-2 shrink-0"},Ot={class:"text-xs text-muted-foreground"},Nt={key:0,class:"mt-4 pt-4 border-t border-border"},Ft={class:"flex gap-2 mb-3"},Ht=["innerHTML"],Ut=qe({__name:"ReportsView",setup(a){const t=Ze(),e=E([]),n=E(!1),i=E(!1),r=E(null),s=E("daily");Pe(()=>l());async function l(){n.value=!0;try{const c=await ge.list();e.value=c.data}finally{n.value=!1}}async function o(){i.value=!0;try{await ge.generate({type:s.value,period_date:Ve(new Date)}),Q.success("Report generated"),await l()}catch{Q.error("Failed to generate report")}finally{i.value=!1}}function u(c){r.value=r.value===c?null:c}function p(c){return d(c)}async function f(c,h){try{const k=await fetch(`/cc-dashboard/api/reports/${c.id}/export?format=${h}`,{headers:{Authorization:`Bearer ${t.token}`}});if(!k.ok){Q.error("Export failed");return}const m=await k.blob(),y=URL.createObjectURL(m),R=document.createElement("a");R.href=y,R.download=`report-${c.period_date}-${c.type}.${h}`,R.click(),URL.revokeObjectURL(y)}catch{Q.error("Export failed")}}return(c,h)=>(T(),v("div",Et,[w("div",Lt,[h[2]||(h[2]=w("h2",{class:"text-lg font-semibold text-foreground flex-1"},"AI Reports",-1)),w("div",Bt,[z(Fe,{modelValue:s.value,"onUpdate:modelValue":h[0]||(h[0]=k=>s.value=k),options:[{value:"daily",label:"Daily"},{value:"weekly",label:"Weekly"}],"aria-label":"Report type"},null,8,["modelValue"]),z(K,{size:"sm",loading:i.value,onClick:o},{default:S(()=>[...h[1]||(h[1]=[L(" Generate Now ",-1)])]),_:1},8,["loading"])])]),n.value?(T(),v("div",qt,[z(Ne,{class:"text-primary"})])):e.value.length===0?(T(),v("div",Zt,[z(He,{title:"No reports yet",description:"Reports are generated automatically after sessions.",icons:[W(Ge),W(We)]},null,8,["icons"])])):(T(),v("div",Pt,[(T(!0),v(Me,null,De(e.value,k=>(T(),ue(Oe,{key:k.id},{default:S(()=>[z(je,{class:"p-4"},{default:S(()=>[w("div",{class:"flex items-start justify-between gap-3 cursor-pointer",onClick:m=>u(k.id)},[w("div",Dt,[z(de,{variant:k.type==="daily"?"default":"secondary",class:"text-xs"},{default:S(()=>[L(X(k.type),1)]),_:2},1032,["variant"]),w("span",Qt,X(W(Ue)(k.period_date)),1),k.email_sent?(T(),ue(de,{key:0,variant:"success",class:"text-xs"},{default:S(()=>[...h[3]||(h[3]=[L(" Email sent ",-1)])]),_:1})):fe("",!0)]),w("div",jt,[w("span",Ot,X(new Date(k.generated_at).toLocaleString()),1),(T(),v("svg",{class:Qe(["h-4 w-4 text-muted-foreground transition-transform",r.value===k.id?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...h[4]||(h[4]=[w("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))])],8,Mt),r.value===k.id?(T(),v("div",Nt,[w("div",Ft,[z(K,{variant:"outline",size:"sm",onClick:m=>f(k,"md")},{default:S(()=>[...h[5]||(h[5]=[L("↓ Markdown",-1)])]),_:1},8,["onClick"]),z(K,{variant:"outline",size:"sm",onClick:m=>f(k,"html")},{default:S(()=>[...h[6]||(h[6]=[L("↓ HTML",-1)])]),_:1},8,["onClick"])]),w("div",{class:"prose prose-sm prose-invert max-w-none text-sm text-foreground break-words",innerHTML:p(k.content_markdown)},null,8,Ht)])):fe("",!0)]),_:2},1024)]),_:2},1024))),128))]))]))}}),on=Xe(Ut,[["__scopeId","data-v-9d1b7e2d"]]);export{on as default}; diff --git a/src/static/assets/SegmentedControl.vue_vue_type_script_setup_true_lang-DN09G_1E.js b/src/static/assets/SegmentedControl.vue_vue_type_script_setup_true_lang-DN09G_1E.js new file mode 100644 index 0000000..692f605 --- /dev/null +++ b/src/static/assets/SegmentedControl.vue_vue_type_script_setup_true_lang-DN09G_1E.js @@ -0,0 +1 @@ +import{c as d}from"./utils-7WVCegLb.js";import{d as c,c as s,F as m,r as f,o as a,n as p,h as g,k as v,l as b,i as x,q as h,t as k}from"./index-BiYpJJoC.js";const y=["aria-label"],V=["aria-pressed","onClick"],A=c({__name:"SegmentedControl",props:{modelValue:{},options:{},ariaLabel:{}},emits:["update:modelValue"],setup(t,{emit:i}){const o=t,l=i;function u(n){const r=o.options.findIndex(e=>e.value===o.modelValue);if(n.key==="ArrowRight"||n.key==="ArrowDown"){n.preventDefault();const e=o.options[(r+1)%o.options.length];l("update:modelValue",e.value)}else if(n.key==="ArrowLeft"||n.key==="ArrowUp"){n.preventDefault();const e=o.options[(r-1+o.options.length)%o.options.length];l("update:modelValue",e.value)}}return(n,r)=>(a(),s("div",{class:"inline-flex items-center rounded-lg border border-border bg-muted/40 p-1",role:"group","aria-label":t.ariaLabel,onKeydown:u},[(a(!0),s(m,null,f(t.options,e=>(a(),s("button",{key:e.value,type:"button","aria-pressed":t.modelValue===e.value,class:p(g(d)("inline-flex items-center gap-1.5 rounded-md px-3 h-8 text-xs font-medium transition-all","focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none",t.modelValue===e.value?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground")),onClick:w=>l("update:modelValue",e.value)},[e.icon?(a(),v(b(e.icon),{key:0,class:"h-3.5 w-3.5"})):x("",!0),h(" "+k(e.label),1)],10,V))),128))],40,y))}});export{A as _}; diff --git a/src/static/assets/SettingsView-BxaKLvvc.js b/src/static/assets/SettingsView-BxaKLvvc.js deleted file mode 100644 index 003b67f..0000000 --- a/src/static/assets/SettingsView-BxaKLvvc.js +++ /dev/null @@ -1 +0,0 @@ -import{d as N,u as E,y as P,c as U,a,e as t,w as s,s as f,o as k,q as u,h as c,k as z,i as B,E as I,K as x}from"./index-DMlmI4VG.js";import{u as F}from"./devops-roMxSiNP.js";import{_ as w,a as V}from"./CardContent.vue_vue_type_script_setup_true_lang-B5oRrbOE.js";import{_ as $,a as S}from"./CardTitle.vue_vue_type_script_setup_true_lang-DTHgMm4V.js";import{_ as y}from"./Input.vue_vue_type_script_setup_true_lang-TcALPBvs.js";import{_}from"./Button.vue_vue_type_script_setup_true_lang-B00Be5tl.js";import{_ as O}from"./DevopsConnectForm.vue_vue_type_script_setup_true_lang-BvWJzMSh.js";import{i as C}from"./utils-7WVCegLb.js";import"./Spinner.vue_vue_type_script_setup_true_lang-CxhsEqE4.js";function T(i,l){const n=`/cc-dashboard/api/export/timesheet.csv?from=${i}&to=${l}`,o=document.createElement("a");o.href=n,o.download=`timesheet-${i}-${l}.csv`,o.click()}function A(i,l){const n=`/cc-dashboard/api/export/timesheet.ics?from=${i}&to=${l}`,o=document.createElement("a");o.href=n,o.download=`timesheet-${i}-${l}.ics`,o.click()}const H={class:"p-6 space-y-6 max-w-2xl"},K={class:"space-y-1.5"},M={class:"space-y-1.5"},j={class:"flex items-center justify-between"},q={class:"flex items-center gap-3 flex-wrap"},h={class:"space-y-1.5"},G={class:"space-y-1.5"},J={class:"flex items-center gap-2"},se=N({__name:"SettingsView",setup(i){const l=E(),n=F(),o=f(""),p=f(0),g=f(!1),d=f(""),m=f("");P(()=>{l.user&&(o.value=l.user.username,p.value=l.user.daily_overhead_hours??0),n.fetchIntegration();const v=new Date;m.value=C(v);const e=new Date(v);e.setDate(v.getDate()-30),d.value=C(e)});async function D(){g.value=!0;try{await I.patch("/api/auth/me",{username:o.value,daily_overhead_hours:p.value}),await l.fetchMe(),x.success("Profile saved")}catch{x.error("Failed to save profile")}finally{g.value=!1}}async function b(){try{await n.sync(),x.success("Sync complete")}catch{x.error(n.error??"Sync failed")}}return(v,e)=>(k(),U("div",H,[e[18]||(e[18]=a("h2",{class:"text-lg font-semibold text-foreground"},"Settings",-1)),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[t(S,{class:"text-sm"},{default:s(()=>[...e[6]||(e[6]=[u("Profile",-1)])]),_:1})]),_:1}),t(V,{class:"space-y-4"},{default:s(()=>[a("div",K,[e[7]||(e[7]=a("label",{class:"text-sm font-medium text-foreground"},"Username",-1)),t(y,{modelValue:o.value,"onUpdate:modelValue":e[0]||(e[0]=r=>o.value=r),placeholder:"username"},null,8,["modelValue"])]),a("div",M,[e[8]||(e[8]=a("label",{class:"text-sm font-medium text-foreground"},"Daily Overhead Hours",-1)),t(y,{modelValue:p.value,"onUpdate:modelValue":e[1]||(e[1]=r=>p.value=r),type:"number",min:"0",max:"8",step:"0.25",class:"w-32"},null,8,["modelValue"]),e[9]||(e[9]=a("p",{class:"text-xs text-muted-foreground"}," Hours per day to add for overhead / meetings ",-1))]),t(_,{loading:g.value,onClick:D},{default:s(()=>[...e[10]||(e[10]=[u("Save Profile",-1)])]),_:1},8,["loading"])]),_:1})]),_:1}),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[a("div",j,[t(S,{class:"text-sm"},{default:s(()=>[...e[11]||(e[11]=[u("Azure DevOps Integration",-1)])]),_:1}),c(n).integration?(k(),z(_,{key:0,variant:"outline",size:"sm",loading:c(n).syncing,onClick:b},{default:s(()=>[...e[12]||(e[12]=[u(" Sync Now ",-1)])]),_:1},8,["loading"])):B("",!0)])]),_:1}),t(V,null,{default:s(()=>[t(O)]),_:1})]),_:1}),t(w,null,{default:s(()=>[t($,null,{default:s(()=>[t(S,{class:"text-sm"},{default:s(()=>[...e[13]||(e[13]=[u("Export",-1)])]),_:1})]),_:1}),t(V,{class:"space-y-4"},{default:s(()=>[a("div",q,[a("div",h,[e[14]||(e[14]=a("label",{class:"text-xs text-muted-foreground"},"From",-1)),t(y,{modelValue:d.value,"onUpdate:modelValue":e[2]||(e[2]=r=>d.value=r),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])]),a("div",G,[e[15]||(e[15]=a("label",{class:"text-xs text-muted-foreground"},"To",-1)),t(y,{modelValue:m.value,"onUpdate:modelValue":e[3]||(e[3]=r=>m.value=r),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])])]),a("div",J,[t(_,{variant:"outline",size:"sm",onClick:e[4]||(e[4]=r=>c(T)(d.value,m.value))},{default:s(()=>[...e[16]||(e[16]=[u(" Download CSV ",-1)])]),_:1}),t(_,{variant:"outline",size:"sm",onClick:e[5]||(e[5]=r=>c(A)(d.value,m.value))},{default:s(()=>[...e[17]||(e[17]=[u(" Download ICS ",-1)])]),_:1})])]),_:1})]),_:1})]))}});export{se as default}; diff --git a/src/static/assets/SettingsView-Dx5EOob_.js b/src/static/assets/SettingsView-Dx5EOob_.js new file mode 100644 index 0000000..1e2619d --- /dev/null +++ b/src/static/assets/SettingsView-Dx5EOob_.js @@ -0,0 +1 @@ +import{d as G,s as x,o as h,c as _,a as f,e as d,h as v,t as S,F as j,r as L,n as W,j as V,x as re,k as se,w as c,M as ue,N as ie,S as de,i as le,q as w,O as fe,u as ce,A as me,D as ve,K as R}from"./index-BiYpJJoC.js";import{u as pe}from"./devops-y1AYKG_U.js";import{_ as B,a as H}from"./CardContent.vue_vue_type_script_setup_true_lang-BwqudhrR.js";import{_ as Y,a as K}from"./CardTitle.vue_vue_type_script_setup_true_lang-D80NEgX4.js";import{_ as Q}from"./Input.vue_vue_type_script_setup_true_lang-He-JgvL3.js";import{_ as k}from"./Button.vue_vue_type_script_setup_true_lang-XB9h72-Z.js";import{c as q,i as X}from"./utils-7WVCegLb.js";import{t as b,c as U,s as Z,C as ge,a as be,f as $}from"./format-WqwOLoqz.js";import{C as ye}from"./calendar-C9xlMu6k.js";import{_ as he}from"./DevopsConnectForm.vue_vue_type_script_setup_true_lang-DfDWa0N1.js";import"./Spinner.vue_vue_type_script_setup_true_lang-CvE8XLn7.js";import"./createLucideIcon-D7qP-VdO.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang-PZ912WSn.js";function _e(l,s){const o=b(l);return isNaN(s)?U(l,NaN):(s&&o.setDate(o.getDate()+s),o)}function ae(l,s){const o=b(l);if(isNaN(s))return U(l,NaN);if(!s)return o;const r=o.getDate(),u=U(l,o.getTime());u.setMonth(o.getMonth()+s+1,0);const i=u.getDate();return r>=i?u:(o.setFullYear(u.getFullYear(),u.getMonth(),r),o)}function xe(l){return U(l,Date.now())}function I(l,s){const o=Z(l),r=Z(s);return+o==+r}function Me(l){const s=b(l),o=s.getMonth();return s.setFullYear(s.getFullYear(),o+1,0),s.setHours(23,59,59,999),s}function we(l,s){const o=b(l.start),r=b(l.end);let u=+o>+r;const i=u?+o:+r,m=u?r:o;m.setHours(0,0,0,0);let g=1;const M=[];for(;+m<=i;)M.push(b(m)),m.setDate(m.getDate()+g),m.setHours(0,0,0,0);return u?M.reverse():M}function A(l){const s=b(l);return s.setDate(1),s.setHours(0,0,0,0),s}function De(l){return b(l).getDay()}function ee(l,s){const o=b(l),r=b(s);return+o<+r}function Ve(l){return I(l,xe(l))}function te(l,s){const o=+b(l),[r,u]=[+b(s.start),+b(s.end)].sort((i,m)=>i-m);return o>=r&&o<=u}function oe(l,s){return _e(l,-s)}function $e(l,s){return ae(l,-1)}const Ce={class:"p-3 select-none"},ke={class:"mb-3 flex items-center justify-between"},Se={class:"text-sm font-medium"},Ne={class:"mb-1 grid grid-cols-7 gap-1"},Te={class:"grid grid-cols-7 gap-1"},Ee=["onClick","onMouseenter","aria-label","aria-pressed"],ne=G({__name:"Calendar",props:{modelValue:{default:()=>({from:null,to:null})},mode:{default:"range"},initialMonth:{}},emits:["update:modelValue"],setup(l,{emit:s}){const o=l,r=s,u=x(o.initialMonth??new Date),i=x(null),m=["Mo","Tu","We","Th","Fr","Sa","Su"],g=V(()=>$(u.value,"MMMM yyyy")),M=V(()=>{const e=A(u.value),n=Me(u.value);return we({start:e,end:n})}),z=V(()=>{const e=De(A(u.value));return e===0?6:e-1});function D(){u.value=$e(u.value)}function a(){u.value=ae(u.value,1)}function p(e){return e.getMonth()!==u.value.getMonth()}function N(e){return Ve(e)}function C(e){return T(e)||E(e)}function T(e){var n;return(n=o.modelValue)!=null&&n.from?I(e,o.modelValue.from):!1}function E(e){var n;return(n=o.modelValue)!=null&&n.to?I(e,o.modelValue.to):!1}function O(e){const{from:n,to:t}=o.modelValue??{};return!n||!t?!1:te(e,{start:n,end:t})&&!I(e,n)&&!I(e,t)}function P(e){var y,J;const n=(y=o.modelValue)==null?void 0:y.from;if(!n||(J=o.modelValue)!=null&&J.to||!i.value)return!1;const t=i.value;return ee(t,n)?!1:te(e,{start:n,end:t})}function F(e){if(o.mode==="single"){r("update:modelValue",{from:e,to:e});return}const{from:n,to:t}=o.modelValue??{};!n||n&&t?r("update:modelValue",{from:e,to:null}):ee(e,n)?r("update:modelValue",{from:e,to:n}):r("update:modelValue",{from:n,to:e})}return(e,n)=>(h(),_("div",Ce,[f("div",ke,[f("button",{type:"button",class:"flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none",onClick:D,"aria-label":"Previous month"},[d(v(ge),{class:"h-4 w-4"})]),f("span",Se,S(g.value),1),f("button",{type:"button",class:"flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none",onClick:a,"aria-label":"Next month"},[d(v(be),{class:"h-4 w-4"})])]),f("div",Ne,[(h(),_(j,null,L(m,t=>f("div",{key:t,class:"flex h-8 items-center justify-center text-[11px] font-medium uppercase tracking-wide text-muted-foreground"},S(t),1)),64))]),f("div",Te,[(h(!0),_(j,null,L(z.value,t=>(h(),_("div",{key:"blank-"+t}))),128)),(h(!0),_(j,null,L(M.value,t=>(h(),_("button",{key:t.toISOString(),type:"button",class:W(v(q)("flex h-9 w-9 items-center justify-center rounded-md text-sm transition-colors","focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none",p(t)&&"text-muted-foreground/40",N(t)&&!C(t)&&"ring-1 ring-primary",T(t)&&"rounded-l-md bg-primary text-primary-foreground",E(t)&&"rounded-r-md bg-primary text-primary-foreground",O(t)&&!T(t)&&!E(t)&&"bg-primary/15 rounded-none",P(t)&&!O(t)&&!C(t)&&"bg-primary/10",!C(t)&&!O(t)&&!P(t)&&"hover:bg-accent")),onClick:y=>F(t),onMouseenter:y=>i.value=t,onMouseleave:n[0]||(n[0]=y=>i.value=null),"aria-label":v($)(t,"EEEE, MMMM d, yyyy"),"aria-pressed":C(t)},S(v($)(t,"d")),43,Ee))),128))])]))}}),Oe={class:"flex"},Pe={class:"flex w-36 flex-col border-r border-border p-2 gap-1"},Ie=["onClick"],ze={class:"flex flex-col"},Fe={class:"flex"},Re={class:"border-l border-border"},je={key:0,class:"px-4 pb-2 text-xs text-destructive"},Le={class:"flex items-center justify-end gap-2 border-t border-border px-4 py-3"},Ue=G({__name:"DateRangePicker",props:{modelValue:{default:()=>({from:null,to:null})}},emits:["update:modelValue"],setup(l,{emit:s}){var P,F;const o=l,r=s,u=x(!1),i=x({from:((P=o.modelValue)==null?void 0:P.from)??null,to:((F=o.modelValue)==null?void 0:F.to)??null}),m=new Date,g=V(()=>A(i.value.from??m)),M=V(()=>{const e=new Date(g.value);return e.setMonth(e.getMonth()+1),e}),D=[{value:"today",label:"Today"},{value:"last7",label:"Last 7 days"},{value:"last30",label:"Last 30 days"},{value:"thisMonth",label:"This month"},{value:"custom",label:"Custom"}],a=x("custom");function p(e){if(a.value=e,e==="custom")return;const n=new Date;let t,y;if(e==="today")t=n,y=n;else if(e==="last7")t=oe(n,6),y=n;else if(e==="last30")t=oe(n,29),y=n;else if(e==="thisMonth")t=A(n),y=n;else return;i.value={from:t,to:y}}const N=V(()=>i.value.from&&i.value.to&&i.value.from>i.value.to?"End date must be after start date":null),C=V(()=>i.value.from!==null&&i.value.to!==null&&!N.value),T=V(()=>{const{from:e,to:n}=o.modelValue??{};return e?!n||e.getTime()===n.getTime()?$(e,"MMM d, yyyy"):`${$(e,"MMM d")} – ${$(n,"MMM d, yyyy")}`:"Pick a date range"});function E(){C.value&&(r("update:modelValue",{from:i.value.from,to:i.value.to}),u.value=!1)}function O(){var e,n;i.value={from:((e=o.modelValue)==null?void 0:e.from)??null,to:((n=o.modelValue)==null?void 0:n.to)??null},u.value=!1}return re(()=>o.modelValue,e=>{i.value={from:(e==null?void 0:e.from)??null,to:(e==null?void 0:e.to)??null}},{deep:!0}),(e,n)=>(h(),se(v(fe),{open:u.value,"onUpdate:open":n[2]||(n[2]=t=>u.value=t)},{default:c(()=>[d(v(ue),{"as-child":""},{default:c(()=>{var t;return[d(k,{variant:"outline",class:W(v(q)("w-full justify-start gap-2 text-left font-normal",!((t=l.modelValue)!=null&&t.from)&&"text-muted-foreground"))},{default:c(()=>[d(v(ye),{class:"h-4 w-4 shrink-0"}),f("span",null,S(T.value),1)]),_:1},8,["class"])]}),_:1}),d(v(ie),null,{default:c(()=>[d(v(de),{"side-offset":8,class:"z-50 w-auto rounded-xl border border-border bg-popover p-0 shadow-xl animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95"},{default:c(()=>[f("div",Oe,[f("div",Pe,[(h(!0),_(j,null,L(v(D),t=>(h(),_("button",{key:t.value,type:"button",class:W(v(q)("rounded-md px-3 py-2 text-left text-sm transition-colors","hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none",a.value===t.value&&"bg-primary/10 font-medium text-primary")),onClick:y=>p(t.value)},S(t.label),11,Ie))),128))]),f("div",ze,[f("div",Fe,[d(ne,{modelValue:i.value,"onUpdate:modelValue":n[0]||(n[0]=t=>i.value=t),"initial-month":g.value,mode:"range"},null,8,["modelValue","initial-month"]),f("div",Re,[d(ne,{modelValue:i.value,"onUpdate:modelValue":n[1]||(n[1]=t=>i.value=t),"initial-month":M.value,mode:"range"},null,8,["modelValue","initial-month"])])]),N.value?(h(),_("p",je,S(N.value),1)):le("",!0),f("div",Le,[d(k,{variant:"ghost",size:"sm",onClick:O},{default:c(()=>[...n[3]||(n[3]=[w("Cancel",-1)])]),_:1}),d(k,{size:"sm",disabled:!C.value,onClick:E},{default:c(()=>[...n[4]||(n[4]=[w("Apply",-1)])]),_:1},8,["disabled"])])])])]),_:1})]),_:1})]),_:1},8,["open"]))}});function Ae(l,s){const o=`/cc-dashboard/api/export/timesheet.csv?from=${l}&to=${s}`,r=document.createElement("a");r.href=o,r.download=`timesheet-${l}-${s}.csv`,r.click()}function Be(l,s){const o=`/cc-dashboard/api/export/timesheet.ics?from=${l}&to=${s}`,r=document.createElement("a");r.href=o,r.download=`timesheet-${l}-${s}.ics`,r.click()}const He={class:"p-6 space-y-8 max-w-2xl"},Ye={class:"space-y-2"},Ke={class:"space-y-2"},We={class:"flex items-center justify-between"},qe={class:"space-y-2"},Ge={class:"flex items-center gap-2"},it=G({__name:"SettingsView",setup(l){const s=ce(),o=pe(),r=x(""),u=x(0),i=x(!1),m=x(""),g=x("");me(()=>{s.user&&(r.value=s.user.username,u.value=s.user.daily_overhead_hours??0),o.fetchIntegration();const D=new Date;g.value=X(D);const a=new Date(D);a.setDate(D.getDate()-30),m.value=X(a)});async function M(){i.value=!0;try{await ve.patch("/api/auth/me",{username:r.value,daily_overhead_hours:u.value}),await s.fetchMe(),R.success("Profile saved")}catch{R.error("Failed to save profile")}finally{i.value=!1}}async function z(){try{await o.sync(),R.success("Sync complete")}catch{R.error(o.error??"Sync failed")}}return(D,a)=>(h(),_("div",He,[a[16]||(a[16]=f("h2",{class:"text-lg font-semibold text-foreground"},"Settings",-1)),d(B,null,{default:c(()=>[d(Y,null,{default:c(()=>[d(K,{class:"text-sm"},{default:c(()=>[...a[5]||(a[5]=[w("Profile",-1)])]),_:1})]),_:1}),d(H,{class:"space-y-6"},{default:c(()=>[f("div",Ye,[a[6]||(a[6]=f("label",{class:"text-sm font-medium text-foreground"},"Username",-1)),d(Q,{modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=p=>r.value=p),placeholder:"username"},null,8,["modelValue"])]),f("div",Ke,[a[7]||(a[7]=f("label",{class:"text-sm font-medium text-foreground"},"Daily Overhead Hours",-1)),d(Q,{modelValue:u.value,"onUpdate:modelValue":a[1]||(a[1]=p=>u.value=p),type:"number",min:"0",max:"8",step:"0.25",class:"w-32"},null,8,["modelValue"]),a[8]||(a[8]=f("p",{class:"text-xs text-muted-foreground"}," Hours per day to add for overhead / meetings ",-1))]),d(k,{loading:i.value,class:"focus-visible:ring-2 focus-visible:ring-ring",onClick:M},{default:c(()=>[...a[9]||(a[9]=[w("Save Profile",-1)])]),_:1},8,["loading"])]),_:1})]),_:1}),d(B,null,{default:c(()=>[d(Y,null,{default:c(()=>[f("div",We,[d(K,{class:"text-sm"},{default:c(()=>[...a[10]||(a[10]=[w("Azure DevOps Integration",-1)])]),_:1}),v(o).integration?(h(),se(k,{key:0,variant:"outline",size:"sm",loading:v(o).syncing,class:"focus-visible:ring-2 focus-visible:ring-ring",onClick:z},{default:c(()=>[...a[11]||(a[11]=[w(" Sync Now ",-1)])]),_:1},8,["loading"])):le("",!0)])]),_:1}),d(H,null,{default:c(()=>[d(he)]),_:1})]),_:1}),d(B,null,{default:c(()=>[d(Y,null,{default:c(()=>[d(K,{class:"text-sm"},{default:c(()=>[...a[12]||(a[12]=[w("Export",-1)])]),_:1})]),_:1}),d(H,{class:"space-y-6"},{default:c(()=>[f("div",qe,[a[13]||(a[13]=f("label",{class:"text-sm font-medium text-foreground"},"Date range",-1)),d(Ue,{"model-value":{from:m.value?new Date(m.value):null,to:g.value?new Date(g.value):null},"onUpdate:modelValue":a[2]||(a[2]=p=>{m.value=p.from?v($)(p.from,"yyyy-MM-dd"):"",g.value=p.to?v($)(p.to,"yyyy-MM-dd"):""})},null,8,["model-value"])]),f("div",Ge,[d(k,{variant:"outline",size:"sm",class:"focus-visible:ring-2 focus-visible:ring-ring",onClick:a[3]||(a[3]=p=>v(Ae)(m.value,g.value))},{default:c(()=>[...a[14]||(a[14]=[w(" Download CSV ",-1)])]),_:1}),d(k,{variant:"outline",size:"sm",class:"focus-visible:ring-2 focus-visible:ring-ring",onClick:a[4]||(a[4]=p=>v(Be)(m.value,g.value))},{default:c(()=>[...a[15]||(a[15]=[w(" Download ICS ",-1)])]),_:1})])]),_:1})]),_:1})]))}});export{it as default}; diff --git a/src/static/assets/Skeleton.vue_vue_type_script_setup_true_lang-DEDpXUzf.js b/src/static/assets/Skeleton.vue_vue_type_script_setup_true_lang-DEDpXUzf.js new file mode 100644 index 0000000..05894c1 --- /dev/null +++ b/src/static/assets/Skeleton.vue_vue_type_script_setup_true_lang-DEDpXUzf.js @@ -0,0 +1 @@ +import{c as s}from"./utils-7WVCegLb.js";import{d as r,o as t,c as n,m as o,h as a}from"./index-BiYpJJoC.js";const i=r({inheritAttrs:!1,__name:"Skeleton",setup(m){return(e,c)=>(t(),n("div",o(e.$attrs,{class:a(s)("skeleton-shimmer rounded-md",e.$attrs.class)}),null,16))}});export{i as _}; diff --git a/src/static/assets/Spinner.vue_vue_type_script_setup_true_lang-CxhsEqE4.js b/src/static/assets/Spinner.vue_vue_type_script_setup_true_lang-CvE8XLn7.js similarity index 90% rename from src/static/assets/Spinner.vue_vue_type_script_setup_true_lang-CxhsEqE4.js rename to src/static/assets/Spinner.vue_vue_type_script_setup_true_lang-CvE8XLn7.js index 62a1617..db14e6c 100644 --- a/src/static/assets/Spinner.vue_vue_type_script_setup_true_lang-CxhsEqE4.js +++ b/src/static/assets/Spinner.vue_vue_type_script_setup_true_lang-CvE8XLn7.js @@ -1 +1 @@ -import{d as l,o as n,c as o,n as t,a as r}from"./index-DMlmI4VG.js";const i=l({__name:"Spinner",props:{size:{},class:{}},setup(s){return(a,e)=>(n(),o("svg",{class:t(["animate-spin text-current",s.size==="sm"?"h-3 w-3":s.size==="lg"?"h-6 w-6":"h-4 w-4",a.$props.class]),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[...e[0]||(e[0]=[r("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),r("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])],2))}});export{i as _}; +import{d as l,o as n,c as o,n as t,a as r}from"./index-BiYpJJoC.js";const i=l({__name:"Spinner",props:{size:{},class:{}},setup(s){return(a,e)=>(n(),o("svg",{class:t(["animate-spin text-current",s.size==="sm"?"h-3 w-3":s.size==="lg"?"h-6 w-6":"h-4 w-4",a.$props.class]),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[...e[0]||(e[0]=[r("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),r("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])],2))}});export{i as _}; diff --git a/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-BoqpXAj3.js b/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-BoqpXAj3.js deleted file mode 100644 index b6073a8..0000000 --- a/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-BoqpXAj3.js +++ /dev/null @@ -1 +0,0 @@ -import{d as C,c as r,n as D,h as b,t as _,i as x,p as U,o as n,E as z,C as T,s as y,y as N,x as I,k as B,w as u,a as l,e as i,q as V,F as j,r as S,D as P}from"./index-DMlmI4VG.js";import{_ as E}from"./Dialog.vue_vue_type_script_setup_true_lang-C0H3A6cL.js";import{_ as c}from"./Input.vue_vue_type_script_setup_true_lang-TcALPBvs.js";import{_ as A}from"./Textarea.vue_vue_type_script_setup_true_lang-C35Jie1W.js";import{c as F}from"./utils-7WVCegLb.js";import{_ as $}from"./Button.vue_vue_type_script_setup_true_lang-B00Be5tl.js";import{u as L}from"./devops-roMxSiNP.js";const M=["id","value","disabled"],O=["selected"],k=C({__name:"Select",props:{modelValue:{},disabled:{type:Boolean},class:{},id:{},placeholder:{}},emits:["update:modelValue","change"],setup(o,{emit:m}){const s=o,p=m;return(v,f)=>(n(),r("select",{id:o.id,value:o.modelValue,disabled:o.disabled,class:D(b(F)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",s.class)),onChange:f[0]||(f[0]=t=>p("update:modelValue",t.target.value))},[o.placeholder?(n(),r("option",{key:0,value:"",disabled:"",selected:!o.modelValue},_(o.placeholder),9,O)):x("",!0),U(v.$slots,"default")],42,M))}}),W={list:()=>z.get("/api/projects")},q=T("projects",()=>{const o=y([]),m=y(!1);async function s(){if(!(o.value.length>0)){m.value=!0;try{const p=await W.list();o.value=p.data}catch{o.value=[]}finally{m.value=!1}}}return{projects:o,loading:m,fetchProjects:s}}),H={class:"space-y-1.5"},G={class:"space-y-1.5"},J={class:"grid grid-cols-2 gap-3"},K={class:"space-y-1.5"},Q={class:"space-y-1.5"},R={class:"grid grid-cols-2 gap-3"},X={class:"space-y-1.5"},Y={class:"space-y-1.5"},Z={class:"grid grid-cols-2 gap-3"},h={class:"space-y-1.5"},ee={class:"space-y-1.5"},te={key:0,class:"space-y-1.5"},le=["value"],ae={key:1,class:"space-y-1.5"},oe=["value"],pe=C({__name:"TaskForm",props:{open:{type:Boolean},task:{default:null},defaultDate:{}},emits:["close","save"],setup(o,{emit:m}){const s=o,p=m,v=L(),f=q();N(()=>{f.fetchProjects()});const t=y({title:"",notes:"",planned_date:"",start_time:"",end_time:"",estimate_hours:1,status:"todo",priority:3,project_id:void 0,azure_work_item_id:void 0});I(()=>s.open,g=>{g&&(s.task?t.value={title:s.task.title,notes:s.task.notes??"",planned_date:s.task.planned_date??"",start_time:"",end_time:"",estimate_hours:s.task.estimate_hours??1,status:s.task.status,priority:s.task.priority,project_id:s.task.project_id??void 0,azure_work_item_id:s.task.azure_work_item_id??void 0}:t.value={title:"",notes:"",planned_date:s.defaultDate??"",start_time:"",end_time:"",estimate_hours:1,status:"todo",priority:3,project_id:void 0,azure_work_item_id:void 0},v.integration&&!v.workItems.length&&v.fetchWorkItems("open"))},{immediate:!0});const d=y(!1);async function w(){if(t.value.title.trim()){d.value=!0;try{const g={title:t.value.title,notes:t.value.notes||void 0,planned_date:t.value.planned_date,estimate_hours:t.value.estimate_hours,status:t.value.status,priority:t.value.priority,project_id:t.value.project_id||null,azure_work_item_id:t.value.azure_work_item_id||null};let e;t.value.planned_date&&t.value.start_time&&t.value.end_time&&(e={start_at:new Date(`${t.value.planned_date}T${t.value.start_time}:00`).toISOString(),end_at:new Date(`${t.value.planned_date}T${t.value.end_time}:00`).toISOString()}),p("save",g,e)}finally{d.value=!1}}}return(g,e)=>(n(),B(E,{open:o.open,title:o.task?"Edit Task":"New Task","max-width":"max-w-md",onClose:e[11]||(e[11]=a=>p("close"))},{footer:u(()=>[i($,{variant:"outline",disabled:d.value,onClick:e[10]||(e[10]=a=>p("close"))},{default:u(()=>[...e[25]||(e[25]=[V("Cancel",-1)])]),_:1},8,["disabled"]),i($,{loading:d.value,onClick:w},{default:u(()=>[V(_(o.task?"Update":"Create"),1)]),_:1},8,["loading"])]),default:u(()=>[l("form",{class:"space-y-4",onSubmit:P(w,["prevent"])},[l("div",H,[e[12]||(e[12]=l("label",{class:"text-sm font-medium text-foreground"},"Title *",-1)),i(c,{modelValue:t.value.title,"onUpdate:modelValue":e[0]||(e[0]=a=>t.value.title=a),placeholder:"Task title...",disabled:d.value},null,8,["modelValue","disabled"])]),l("div",G,[e[13]||(e[13]=l("label",{class:"text-sm font-medium text-foreground"},"Notes",-1)),i(A,{modelValue:t.value.notes,"onUpdate:modelValue":e[1]||(e[1]=a=>t.value.notes=a),placeholder:"Additional notes...",disabled:d.value},null,8,["modelValue","disabled"])]),l("div",J,[l("div",K,[e[14]||(e[14]=l("label",{class:"text-sm font-medium text-foreground"},"Planned Date",-1)),i(c,{modelValue:t.value.planned_date,"onUpdate:modelValue":e[2]||(e[2]=a=>t.value.planned_date=a),type:"date",disabled:d.value},null,8,["modelValue","disabled"])]),l("div",Q,[e[15]||(e[15]=l("label",{class:"text-sm font-medium text-foreground"},"Estimate (h)",-1)),i(c,{modelValue:t.value.estimate_hours,"onUpdate:modelValue":e[3]||(e[3]=a=>t.value.estimate_hours=a),type:"number",min:"0.25",max:"24",step:"0.25",disabled:d.value},null,8,["modelValue","disabled"])])]),l("div",R,[l("div",X,[e[16]||(e[16]=l("label",{class:"text-sm font-medium text-foreground"},[V("Start time "),l("span",{class:"text-muted-foreground font-normal"},"(optional)")],-1)),i(c,{modelValue:t.value.start_time,"onUpdate:modelValue":e[4]||(e[4]=a=>t.value.start_time=a),type:"time",disabled:d.value},null,8,["modelValue","disabled"])]),l("div",Y,[e[17]||(e[17]=l("label",{class:"text-sm font-medium text-foreground"},"End time",-1)),i(c,{modelValue:t.value.end_time,"onUpdate:modelValue":e[5]||(e[5]=a=>t.value.end_time=a),type:"time",disabled:d.value},null,8,["modelValue","disabled"])])]),l("div",Z,[l("div",h,[e[19]||(e[19]=l("label",{class:"text-sm font-medium text-foreground"},"Status",-1)),i(k,{modelValue:t.value.status,"onUpdate:modelValue":e[6]||(e[6]=a=>t.value.status=a),disabled:d.value},{default:u(()=>[...e[18]||(e[18]=[l("option",{value:"todo"},"Todo",-1),l("option",{value:"doing"},"Doing",-1),l("option",{value:"testing"},"Testing",-1),l("option",{value:"done"},"Done",-1),l("option",{value:"cancelled"},"Cancelled",-1)])]),_:1},8,["modelValue","disabled"])]),l("div",ee,[e[21]||(e[21]=l("label",{class:"text-sm font-medium text-foreground"},"Priority",-1)),i(k,{modelValue:t.value.priority,"onUpdate:modelValue":e[7]||(e[7]=a=>t.value.priority=a),disabled:d.value},{default:u(()=>[...e[20]||(e[20]=[l("option",{value:"1"},"1 - Low",-1),l("option",{value:"2"},"2 - Normal",-1),l("option",{value:"3"},"3 - Medium",-1),l("option",{value:"4"},"4 - High",-1),l("option",{value:"5"},"5 - Critical",-1)])]),_:1},8,["modelValue","disabled"])])]),b(f).projects.length?(n(),r("div",te,[e[23]||(e[23]=l("label",{class:"text-sm font-medium text-foreground"},"Project",-1)),i(k,{modelValue:t.value.project_id,"onUpdate:modelValue":e[8]||(e[8]=a=>t.value.project_id=a),disabled:d.value,placeholder:"Select project..."},{default:u(()=>[e[22]||(e[22]=l("option",{value:""},"None",-1)),(n(!0),r(j,null,S(b(f).projects,a=>(n(),r("option",{key:a.id,value:a.id},_(a.display_name)+_(a.job_number?` (${a.job_number})`:""),9,le))),128))]),_:1},8,["modelValue","disabled"])])):x("",!0),b(v).workItems.length?(n(),r("div",ae,[e[24]||(e[24]=l("label",{class:"text-sm font-medium text-foreground"},"Azure DevOps Work Item",-1)),i(k,{modelValue:t.value.azure_work_item_id,"onUpdate:modelValue":e[9]||(e[9]=a=>t.value.azure_work_item_id=a),disabled:d.value,placeholder:"Link work item..."},{default:u(()=>[(n(!0),r(j,null,S(b(v).workItems,a=>(n(),r("option",{key:a.id,value:a.id}," #"+_(a.ado_id)+" – "+_(a.title),9,oe))),128))]),_:1},8,["modelValue","disabled"])])):x("",!0)],32)]),_:1},8,["open","title"]))}});export{pe as _,k as a,q as u}; diff --git a/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-BvqRdc1Q.js b/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-BvqRdc1Q.js new file mode 100644 index 0000000..0926ac8 --- /dev/null +++ b/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-BvqRdc1Q.js @@ -0,0 +1 @@ +import{d as C,c as r,n as D,h as c,t as _,i as x,p as U,o as n,D as z,B as T,s as y,A as N,x as B,k as I,w as u,a as l,e as i,q as V,F as j,r as S,C as P}from"./index-BiYpJJoC.js";import{_ as A}from"./Dialog.vue_vue_type_script_setup_true_lang-DB9Ws8sP.js";import{_ as b}from"./Input.vue_vue_type_script_setup_true_lang-He-JgvL3.js";import{_ as E}from"./Textarea.vue_vue_type_script_setup_true_lang-Caf3IAh-.js";import{c as F}from"./utils-7WVCegLb.js";import{_ as $}from"./Button.vue_vue_type_script_setup_true_lang-XB9h72-Z.js";import{u as L}from"./devops-y1AYKG_U.js";const M=["id","value","disabled"],O=["selected"],k=C({__name:"Select",props:{modelValue:{},disabled:{type:Boolean},class:{},id:{},placeholder:{}},emits:["update:modelValue","change"],setup(o,{emit:m}){const s=o,p=m;return(v,f)=>(n(),r("select",{id:o.id,value:o.modelValue,disabled:o.disabled,class:D(c(F)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",s.class)),onChange:f[0]||(f[0]=t=>p("update:modelValue",t.target.value))},[o.placeholder?(n(),r("option",{key:0,value:"",disabled:"",selected:!o.modelValue},_(o.placeholder),9,O)):x("",!0),U(v.$slots,"default")],42,M))}}),W={list:()=>z.get("/api/projects")},q=T("projects",()=>{const o=y([]),m=y(!1);async function s(){if(!(o.value.length>0)){m.value=!0;try{const p=await W.list();o.value=p.data}catch{o.value=[]}finally{m.value=!1}}}return{projects:o,loading:m,fetchProjects:s}}),H={class:"space-y-1.5"},G={class:"space-y-1.5"},J={class:"grid grid-cols-2 gap-3"},K={class:"space-y-1.5"},Q={class:"space-y-1.5"},R={class:"grid grid-cols-2 gap-3"},X={class:"space-y-1.5"},Y={class:"space-y-1.5"},Z={class:"grid grid-cols-2 gap-3"},h={class:"space-y-1.5"},ee={class:"space-y-1.5"},te={key:0,class:"space-y-1.5"},le=["value"],ae={key:1,class:"space-y-1.5"},oe=["value"],pe=C({__name:"TaskForm",props:{open:{type:Boolean},task:{default:null},defaultDate:{}},emits:["close","save"],setup(o,{emit:m}){const s=o,p=m,v=L(),f=q();N(()=>{f.fetchProjects()});const t=y({title:"",notes:"",planned_date:"",start_time:"",end_time:"",estimate_hours:1,status:"todo",priority:3,project_id:void 0,azure_work_item_id:void 0});B(()=>s.open,g=>{g&&(s.task?t.value={title:s.task.title,notes:s.task.notes??"",planned_date:s.task.planned_date??"",start_time:"",end_time:"",estimate_hours:s.task.estimate_hours??1,status:s.task.status,priority:s.task.priority,project_id:s.task.project_id??void 0,azure_work_item_id:s.task.azure_work_item_id??void 0}:t.value={title:"",notes:"",planned_date:s.defaultDate??"",start_time:"",end_time:"",estimate_hours:1,status:"todo",priority:3,project_id:void 0,azure_work_item_id:void 0},v.integration&&!v.workItems.length&&v.fetchWorkItems("open"))},{immediate:!0});const d=y(!1);async function w(){if(t.value.title.trim()){d.value=!0;try{const g={title:t.value.title,notes:t.value.notes||void 0,planned_date:t.value.planned_date,estimate_hours:t.value.estimate_hours,status:t.value.status,priority:t.value.priority,project_id:t.value.project_id||null,azure_work_item_id:t.value.azure_work_item_id||null};let e;t.value.planned_date&&t.value.start_time&&t.value.end_time&&(e={start_at:new Date(`${t.value.planned_date}T${t.value.start_time}:00`).toISOString(),end_at:new Date(`${t.value.planned_date}T${t.value.end_time}:00`).toISOString()}),p("save",g,e)}finally{d.value=!1}}}return(g,e)=>(n(),I(A,{open:o.open,title:o.task?"Edit Task":"New Task","max-width":"max-w-md",onClose:e[11]||(e[11]=a=>p("close"))},{footer:u(()=>[i($,{variant:"outline",disabled:d.value,onClick:e[10]||(e[10]=a=>p("close"))},{default:u(()=>[...e[25]||(e[25]=[V("Cancel",-1)])]),_:1},8,["disabled"]),i($,{loading:d.value,onClick:w},{default:u(()=>[V(_(o.task?"Update":"Create"),1)]),_:1},8,["loading"])]),default:u(()=>[l("form",{class:"space-y-4",onSubmit:P(w,["prevent"])},[l("div",H,[e[12]||(e[12]=l("label",{class:"text-sm font-medium text-foreground"},"Title *",-1)),i(b,{modelValue:t.value.title,"onUpdate:modelValue":e[0]||(e[0]=a=>t.value.title=a),placeholder:"Task title...",disabled:d.value},null,8,["modelValue","disabled"])]),l("div",G,[e[13]||(e[13]=l("label",{class:"text-sm font-medium text-foreground"},"Notes",-1)),i(E,{modelValue:t.value.notes,"onUpdate:modelValue":e[1]||(e[1]=a=>t.value.notes=a),placeholder:"Additional notes...",disabled:d.value},null,8,["modelValue","disabled"])]),l("div",J,[l("div",K,[e[14]||(e[14]=l("label",{class:"text-sm font-medium text-foreground"},"Planned Date",-1)),i(b,{modelValue:t.value.planned_date,"onUpdate:modelValue":e[2]||(e[2]=a=>t.value.planned_date=a),type:"date",disabled:d.value},null,8,["modelValue","disabled"])]),l("div",Q,[e[15]||(e[15]=l("label",{class:"text-sm font-medium text-foreground"},"Estimate (h)",-1)),i(b,{modelValue:t.value.estimate_hours,"onUpdate:modelValue":e[3]||(e[3]=a=>t.value.estimate_hours=a),type:"number",min:"0.25",max:"24",step:"0.25",disabled:d.value},null,8,["modelValue","disabled"])])]),l("div",R,[l("div",X,[e[16]||(e[16]=l("label",{class:"text-sm font-medium text-foreground"},[V("Start time "),l("span",{class:"text-muted-foreground font-normal"},"(optional)")],-1)),i(b,{modelValue:t.value.start_time,"onUpdate:modelValue":e[4]||(e[4]=a=>t.value.start_time=a),type:"time",disabled:d.value},null,8,["modelValue","disabled"])]),l("div",Y,[e[17]||(e[17]=l("label",{class:"text-sm font-medium text-foreground"},"End time",-1)),i(b,{modelValue:t.value.end_time,"onUpdate:modelValue":e[5]||(e[5]=a=>t.value.end_time=a),type:"time",disabled:d.value},null,8,["modelValue","disabled"])])]),l("div",Z,[l("div",h,[e[19]||(e[19]=l("label",{class:"text-sm font-medium text-foreground"},"Status",-1)),i(k,{modelValue:t.value.status,"onUpdate:modelValue":e[6]||(e[6]=a=>t.value.status=a),disabled:d.value},{default:u(()=>[...e[18]||(e[18]=[l("option",{value:"todo"},"Todo",-1),l("option",{value:"doing"},"Doing",-1),l("option",{value:"testing"},"Testing",-1),l("option",{value:"done"},"Done",-1),l("option",{value:"cancelled"},"Cancelled",-1)])]),_:1},8,["modelValue","disabled"])]),l("div",ee,[e[21]||(e[21]=l("label",{class:"text-sm font-medium text-foreground"},"Priority",-1)),i(k,{modelValue:t.value.priority,"onUpdate:modelValue":e[7]||(e[7]=a=>t.value.priority=a),disabled:d.value},{default:u(()=>[...e[20]||(e[20]=[l("option",{value:"1"},"1 - Low",-1),l("option",{value:"2"},"2 - Normal",-1),l("option",{value:"3"},"3 - Medium",-1),l("option",{value:"4"},"4 - High",-1),l("option",{value:"5"},"5 - Critical",-1)])]),_:1},8,["modelValue","disabled"])])]),c(f).projects.length?(n(),r("div",te,[e[23]||(e[23]=l("label",{class:"text-sm font-medium text-foreground"},"Project",-1)),i(k,{modelValue:t.value.project_id,"onUpdate:modelValue":e[8]||(e[8]=a=>t.value.project_id=a),disabled:d.value,placeholder:"Select project..."},{default:u(()=>[e[22]||(e[22]=l("option",{value:""},"None",-1)),(n(!0),r(j,null,S(c(f).projects,a=>(n(),r("option",{key:a.id,value:a.id},_(a.display_name)+_(a.job_number?` (${a.job_number})`:""),9,le))),128))]),_:1},8,["modelValue","disabled"])])):x("",!0),c(v).workItems.length?(n(),r("div",ae,[e[24]||(e[24]=l("label",{class:"text-sm font-medium text-foreground"},"Azure DevOps Work Item",-1)),i(k,{modelValue:t.value.azure_work_item_id,"onUpdate:modelValue":e[9]||(e[9]=a=>t.value.azure_work_item_id=a),disabled:d.value,placeholder:"Link work item..."},{default:u(()=>[(n(!0),r(j,null,S(c(v).workItems,a=>(n(),r("option",{key:a.id,value:a.id}," #"+_(a.ado_id)+" – "+_(a.title),9,oe))),128))]),_:1},8,["modelValue","disabled"])])):x("",!0)],32)]),_:1},8,["open","title"]))}});export{pe as _,k as a,q as u}; diff --git a/src/static/assets/TasksView-BcEx816y.js b/src/static/assets/TasksView-BcEx816y.js deleted file mode 100644 index c629a80..0000000 --- a/src/static/assets/TasksView-BcEx816y.js +++ /dev/null @@ -1 +0,0 @@ -import{u as B}from"./tasks-DzAUejbm.js";import{u as N,a as A,_ as K}from"./TaskForm.vue_vue_type_script_setup_true_lang-BoqpXAj3.js";import{s as p,d as j,o as d,c,n as _,a as n,t as D,i as $,F as S,r as C,k as P,y as I,e as w,w as E,h as f,q as z,K as T,j as F}from"./index-DMlmI4VG.js";import{_ as M}from"./Button.vue_vue_type_script_setup_true_lang-B00Be5tl.js";import{_ as H}from"./Spinner.vue_vue_type_script_setup_true_lang-CxhsEqE4.js";import"./Dialog.vue_vue_type_script_setup_true_lang-C0H3A6cL.js";import"./Input.vue_vue_type_script_setup_true_lang-TcALPBvs.js";import"./utils-7WVCegLb.js";import"./Textarea.vue_vue_type_script_setup_true_lang-C35Jie1W.js";import"./devops-roMxSiNP.js";function U(){const t=B(),l=p(null),r=p(null);function u(x,g){var k;l.value=x.id,(k=g.dataTransfer)==null||k.setData("task_id",x.id),g.dataTransfer&&(g.dataTransfer.effectAllowed="move")}function v(){l.value=null,r.value=null}function a(x,g){g.preventDefault(),r.value=x,g.dataTransfer&&(g.dataTransfer.dropEffect="move")}function s(){r.value=null}async function m(x,g,k){var h;k.preventDefault(),r.value=null;const b=(h=k.dataTransfer)==null?void 0:h.getData("task_id");b&&(l.value=null,await t.update(b,{status:x,sort_index:g}))}return{draggingId:l,dragOverColumn:r,onDragStart:u,onDragEnd:v,onDragOver:a,onDragLeave:s,onDrop:m}}const q={class:"flex items-start gap-2"},G=["title"],J={class:"flex-1 min-w-0"},Q={class:"text-sm font-medium text-slate-800 leading-snug line-clamp-2"},R={class:"flex flex-wrap items-center gap-1.5 mt-1.5"},W=["title"],X={key:1,class:"text-[10px] px-1.5 py-0.5 rounded-md bg-blue-50 text-blue-500 font-medium shrink-0"},Y={key:2,class:"text-[10px] text-slate-400 shrink-0"},Z=j({__name:"KanbanCard",props:{task:{},dragging:{type:Boolean}},emits:["edit"],setup(t,{emit:l}){const r=l,u={1:"bg-red-500",2:"bg-orange-400",3:"bg-slate-300",4:"bg-slate-300",5:"bg-slate-300"};return(v,a)=>(d(),c("div",{class:_(["group relative bg-white rounded-xl border border-slate-200/80 px-3 py-2.5 cursor-grab active:cursor-grabbing shadow-sm hover:shadow-md hover:border-orange-200 transition-all duration-150 select-none",t.dragging?"opacity-40 scale-95":"opacity-100"]),draggable:"true",onClick:a[0]||(a[0]=s=>r("edit",t.task))},[n("div",q,[n("span",{class:_(["mt-1.5 h-2 w-2 rounded-full shrink-0",u[t.task.priority]??"bg-slate-300"]),title:`Priority ${t.task.priority}`},null,10,G),n("div",J,[n("p",Q,D(t.task.title),1),n("div",R,[t.task.project_name?(d(),c("span",{key:0,class:"text-[10px] px-1.5 py-0.5 rounded-md bg-slate-100 text-slate-500 font-medium truncate max-w-[100px]",title:t.task.project_name},D(t.task.project_name),9,W)):$("",!0),t.task.azure_work_item_id?(d(),c("span",X," ADO ")):$("",!0),t.task.planned_date?(d(),c("span",Y,D(t.task.planned_date),1)):$("",!0)])])])],2))}}),tt={class:"flex flex-col min-h-0 w-full"},et={class:"flex items-center justify-between px-1 mb-2"},at={class:"flex items-center gap-2"},st={class:"text-xs font-semibold uppercase tracking-wider text-slate-500"},nt={class:"text-[10px] font-semibold bg-slate-100 text-slate-400 px-1.5 py-0.5 rounded-full leading-none"},ot={key:0,class:"flex items-center justify-center h-16 text-[11px] text-slate-300 select-none"},rt=j({__name:"KanbanColumn",props:{status:{},title:{},tasks:{},draggingId:{},isDragOver:{type:Boolean}},emits:["dragStart","dragEnd","dragOver","dragLeave","drop","editTask","addTask"],setup(t,{emit:l}){const r=l,u={todo:"border-t-slate-300",doing:"border-t-orange-400",testing:"border-t-blue-400",done:"border-t-emerald-400"};return(v,a)=>(d(),c("div",tt,[n("div",et,[n("div",at,[n("h3",st,D(t.title),1),n("span",nt,D(t.tasks.length),1)]),n("button",{class:"h-5 w-5 rounded flex items-center justify-center text-slate-400 hover:text-orange-500 hover:bg-orange-50 transition-colors",title:"Add task",onClick:a[0]||(a[0]=s=>r("addTask",t.status))},[...a[5]||(a[5]=[n("svg",{class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M12 4v16m8-8H4"})],-1)])])]),n("div",{class:_(["flex-1 rounded-xl border-2 border-dashed transition-all duration-150 p-2 space-y-2 min-h-[120px]",`border-t-4 ${u[t.status]??"border-t-slate-300"}`,t.isDragOver?"border-orange-300 bg-orange-50/60":"border-transparent bg-slate-50/60"]),onDragover:a[2]||(a[2]=s=>r("dragOver",t.status,s)),onDragleave:a[3]||(a[3]=s=>r("dragLeave")),onDrop:a[4]||(a[4]=s=>r("drop",t.status,t.tasks.length,s))},[(d(!0),c(S,null,C(t.tasks,s=>(d(),P(Z,{key:s.id,task:s,dragging:t.draggingId===s.id,onDragstart:m=>r("dragStart",s,m),onDragend:a[1]||(a[1]=m=>r("dragEnd")),onEdit:m=>r("editTask",s)},null,8,["task","dragging","onDragstart","onEdit"]))),128)),t.tasks.length===0&&!t.isDragOver?(d(),c("div",ot," Drop here ")):$("",!0)],34)]))}}),lt={class:"flex flex-col h-full overflow-hidden"},it={class:"flex items-center gap-3 px-6 py-4 border-b border-slate-100 bg-white/60 shrink-0"},dt=["value"],ut={key:0,class:"flex items-center justify-center flex-1"},ct={key:1,class:"flex-1 overflow-x-auto overflow-y-hidden"},gt={class:"grid grid-cols-4 gap-4 p-6 h-full min-w-[700px]"},yt=j({__name:"TasksView",setup(t){const l=B(),r=N(),u=U(),v=p(""),a=p(!1),s=p(null),m=p("todo"),x=[{status:"todo",title:"To Do"},{status:"doing",title:"Doing"},{status:"testing",title:"Testing"},{status:"done",title:"Done"}];I(async()=>{await Promise.all([l.fetchAll(),r.fetchProjects()])});const g=F(()=>{const i=l.tasks.filter(e=>e.status!=="cancelled");return v.value?i.filter(e=>e.project_id===v.value):i});function k(i){let e=g.value.filter(o=>o.status===i);return e=[...e].sort((o,y)=>o.sort_index-y.sort_index||o.created_at.localeCompare(y.created_at)),i==="done"&&(e=e.slice(-30)),e}function b(i){m.value=i,s.value=null,a.value=!0}function h(i){s.value=i,a.value=!0}function O(){a.value=!1,s.value=null}async function L(i,e){try{if(s.value)await l.update(s.value.id,i),e&&await l.createBlock(s.value.id,e),T.success("Task updated");else{const o={...i,status:i.status||m.value},y=await l.create(o);e&&await l.createBlock(y.id,e),T.success("Task created")}}catch{T.error("Failed to save task")}O()}const V=new Date().toISOString().split("T")[0];return(i,e)=>(d(),c("div",lt,[n("div",it,[e[4]||(e[4]=n("h2",{class:"text-sm font-semibold text-slate-800 mr-2"},"Kanban",-1)),w(A,{modelValue:v.value,"onUpdate:modelValue":e[0]||(e[0]=o=>v.value=o),class:"w-44 text-xs"},{default:E(()=>[e[2]||(e[2]=n("option",{value:""},"All projects",-1)),(d(!0),c(S,null,C(f(r).projects,o=>(d(),c("option",{key:o.id,value:o.id},D(o.display_name),9,dt))),128))]),_:1},8,["modelValue"]),e[5]||(e[5]=n("div",{class:"flex-1"},null,-1)),w(M,{size:"sm",onClick:e[1]||(e[1]=o=>b("todo"))},{default:E(()=>[...e[3]||(e[3]=[n("svg",{class:"h-3.5 w-3.5 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M12 4v16m8-8H4"})],-1),z(" New task ",-1)])]),_:1})]),f(l).loading?(d(),c("div",ut,[w(H,{size:"lg",class:"text-primary"})])):(d(),c("div",ct,[n("div",gt,[(d(),c(S,null,C(x,o=>n("div",{key:o.status,class:"flex flex-col min-h-0 overflow-y-auto"},[w(rt,{status:o.status,title:o.title,tasks:k(o.status),"dragging-id":f(u).draggingId.value,"is-drag-over":f(u).dragOverColumn.value===o.status,onDragStart:f(u).onDragStart,onDragEnd:f(u).onDragEnd,onDragOver:f(u).onDragOver,onDragLeave:f(u).onDragLeave,onDrop:f(u).onDrop,onEditTask:h,onAddTask:b},null,8,["status","title","tasks","dragging-id","is-drag-over","onDragStart","onDragEnd","onDragOver","onDragLeave","onDrop"])])),64))])])),w(K,{open:a.value,task:s.value,"default-date":f(V),onClose:O,onSave:L},null,8,["open","task","default-date"])]))}});export{yt as default}; diff --git a/src/static/assets/TasksView-D8TRKoOC.js b/src/static/assets/TasksView-D8TRKoOC.js new file mode 100644 index 0000000..0b788d5 --- /dev/null +++ b/src/static/assets/TasksView-D8TRKoOC.js @@ -0,0 +1 @@ +import{u as L}from"./tasks-DwSuZPNM.js";import{u as A,a as K,_ as P}from"./TaskForm.vue_vue_type_script_setup_true_lang-BvqRdc1Q.js";import{s as b,d as j,o as d,c,n as T,a as n,e as p,w as S,t as D,i as $,F as C,r as O,k as B,A as z,h as f,q as I,j as F,K as _}from"./index-BiYpJJoC.js";import{_ as M}from"./Tooltip.vue_vue_type_script_setup_true_lang-BRjliJat.js";import{_ as H}from"./EmptyState.vue_vue_type_script_setup_true_lang-jNal0qhs.js";import{_ as U}from"./Button.vue_vue_type_script_setup_true_lang-XB9h72-Z.js";import{_ as q}from"./Spinner.vue_vue_type_script_setup_true_lang-CvE8XLn7.js";import"./Dialog.vue_vue_type_script_setup_true_lang-DB9Ws8sP.js";import"./Input.vue_vue_type_script_setup_true_lang-He-JgvL3.js";import"./utils-7WVCegLb.js";import"./Textarea.vue_vue_type_script_setup_true_lang-Caf3IAh-.js";import"./devops-y1AYKG_U.js";function G(){const t=L(),l=b(null),o=b(null);function u(k,g){var x;l.value=k.id,(x=g.dataTransfer)==null||x.setData("task_id",k.id),g.dataTransfer&&(g.dataTransfer.effectAllowed="move")}function m(){l.value=null,o.value=null}function a(k,g){g.preventDefault(),o.value=k,g.dataTransfer&&(g.dataTransfer.dropEffect="move")}function s(){o.value=null}async function v(k,g,x){var h;x.preventDefault(),o.value=null;const w=(h=x.dataTransfer)==null?void 0:h.getData("task_id");w&&(l.value=null,await t.update(w,{status:k,sort_index:g}))}return{draggingId:l,dragOverColumn:o,onDragStart:u,onDragEnd:m,onDragOver:a,onDragLeave:s,onDrop:v}}const J={class:"flex items-start gap-2"},Q={class:"flex-1 min-w-0"},R={class:"text-sm font-medium text-slate-800 leading-snug line-clamp-2"},W={class:"flex flex-wrap items-center gap-1.5 mt-1.5"},X=["title"],Y={key:1,class:"text-[10px] px-1.5 py-0.5 rounded-md bg-blue-50 text-blue-500 font-medium shrink-0"},Z={key:2,class:"text-[10px] text-slate-400 shrink-0"},tt=j({__name:"KanbanCard",props:{task:{},dragging:{type:Boolean}},emits:["edit"],setup(t,{emit:l}){const o=l,u={1:"bg-red-500",2:"bg-orange-400",3:"bg-slate-300",4:"bg-slate-300",5:"bg-slate-300"};return(m,a)=>(d(),c("div",{class:T(["group relative bg-white rounded-xl border border-slate-200/80 px-3 py-2.5 cursor-grab active:cursor-grabbing shadow-sm hover:shadow-md hover:border-orange-200 transition-all duration-150 select-none",t.dragging?"opacity-40 scale-95":"opacity-100"]),draggable:"true",onClick:a[0]||(a[0]=s=>o("edit",t.task))},[n("div",J,[p(M,{content:`Priority ${t.task.priority}`},{default:S(()=>[n("span",{class:T(["mt-1.5 h-2 w-2 rounded-full shrink-0",u[t.task.priority]??"bg-slate-300"])},null,2)]),_:1},8,["content"]),n("div",Q,[n("p",R,D(t.task.title),1),n("div",W,[t.task.project_name?(d(),c("span",{key:0,class:"text-[10px] px-1.5 py-0.5 rounded-md bg-slate-100 text-slate-500 font-medium truncate max-w-[100px]",title:t.task.project_name},D(t.task.project_name),9,X)):$("",!0),t.task.azure_work_item_id?(d(),c("span",Y," ADO ")):$("",!0),t.task.planned_date?(d(),c("span",Z,D(t.task.planned_date),1)):$("",!0)])])])],2))}}),et={class:"flex flex-col min-h-0 w-full"},at={class:"flex items-center justify-between px-1 mb-2"},st={class:"flex items-center gap-2"},nt={class:"text-xs font-semibold uppercase tracking-wider text-slate-500"},rt={class:"text-[10px] font-semibold bg-slate-100 text-slate-400 px-1.5 py-0.5 rounded-full leading-none"},ot=j({__name:"KanbanColumn",props:{status:{},title:{},tasks:{},draggingId:{},isDragOver:{type:Boolean}},emits:["dragStart","dragEnd","dragOver","dragLeave","drop","editTask","addTask"],setup(t,{emit:l}){const o=l,u={todo:"border-t-slate-300",doing:"border-t-orange-400",testing:"border-t-blue-400",done:"border-t-emerald-400"};return(m,a)=>(d(),c("div",et,[n("div",at,[n("div",st,[n("h3",nt,D(t.title),1),n("span",rt,D(t.tasks.length),1)]),n("button",{class:"h-5 w-5 rounded flex items-center justify-center text-slate-400 hover:text-orange-500 hover:bg-orange-50 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring","aria-label":"Add task",onClick:a[0]||(a[0]=s=>o("addTask",t.status))},[...a[5]||(a[5]=[n("svg",{class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M12 4v16m8-8H4"})],-1)])])]),n("div",{class:T(["flex-1 rounded-xl border-2 border-dashed transition-all duration-150 p-2 space-y-2 min-h-[120px]",`border-t-4 ${u[t.status]??"border-t-slate-300"}`,t.isDragOver?"border-orange-300 bg-orange-50/60":"border-transparent bg-slate-50/60"]),onDragover:a[2]||(a[2]=s=>o("dragOver",t.status,s)),onDragleave:a[3]||(a[3]=s=>o("dragLeave")),onDrop:a[4]||(a[4]=s=>o("drop",t.status,t.tasks.length,s))},[(d(!0),c(C,null,O(t.tasks,s=>(d(),B(tt,{key:s.id,task:s,dragging:t.draggingId===s.id,onDragstart:v=>o("dragStart",s,v),onDragend:a[1]||(a[1]=v=>o("dragEnd")),onEdit:v=>o("editTask",s)},null,8,["task","dragging","onDragstart","onEdit"]))),128)),t.tasks.length===0&&!t.isDragOver?(d(),B(H,{key:0,size:"sm",title:"No tasks here",description:"Drag a card here or click + to add"})):$("",!0)],34)]))}}),lt={class:"flex flex-col h-full overflow-hidden"},it={class:"flex items-center gap-3 px-6 py-4 border-b border-slate-100 bg-white/60 shrink-0"},dt=["value"],ut={key:0,class:"flex items-center justify-center flex-1"},ct={key:1,class:"flex-1 overflow-x-auto overflow-y-hidden"},gt={class:"grid grid-cols-4 gap-4 p-6 h-full min-w-[700px]"},_t=j({__name:"TasksView",setup(t){const l=L(),o=A(),u=G(),m=b(""),a=b(!1),s=b(null),v=b("todo"),k=[{status:"todo",title:"To Do"},{status:"doing",title:"Doing"},{status:"testing",title:"Testing"},{status:"done",title:"Done"}];z(async()=>{await Promise.all([l.fetchAll(),o.fetchProjects()])});const g=F(()=>{const i=l.tasks.filter(e=>e.status!=="cancelled");return m.value?i.filter(e=>e.project_id===m.value):i});function x(i){let e=g.value.filter(r=>r.status===i);return e=[...e].sort((r,y)=>r.sort_index-y.sort_index||r.created_at.localeCompare(y.created_at)),i==="done"&&(e=e.slice(-30)),e}function w(i){v.value=i,s.value=null,a.value=!0}function h(i){s.value=i,a.value=!0}function E(){a.value=!1,s.value=null}async function N(i,e){try{if(s.value)await l.update(s.value.id,i),e&&await l.createBlock(s.value.id,e),_.success("Task updated");else{const r={...i,status:i.status||v.value},y=await l.create(r);e&&await l.createBlock(y.id,e),_.success("Task created")}}catch{_.error("Failed to save task")}E()}const V=new Date().toISOString().split("T")[0];return(i,e)=>(d(),c("div",lt,[n("div",it,[e[4]||(e[4]=n("h2",{class:"text-sm font-semibold text-slate-800 mr-2"},"Kanban",-1)),p(K,{modelValue:m.value,"onUpdate:modelValue":e[0]||(e[0]=r=>m.value=r),class:"w-44 text-xs"},{default:S(()=>[e[2]||(e[2]=n("option",{value:""},"All projects",-1)),(d(!0),c(C,null,O(f(o).projects,r=>(d(),c("option",{key:r.id,value:r.id},D(r.display_name),9,dt))),128))]),_:1},8,["modelValue"]),e[5]||(e[5]=n("div",{class:"flex-1"},null,-1)),p(U,{size:"sm",onClick:e[1]||(e[1]=r=>w("todo"))},{default:S(()=>[...e[3]||(e[3]=[n("svg",{class:"h-3.5 w-3.5 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M12 4v16m8-8H4"})],-1),I(" New task ",-1)])]),_:1})]),f(l).loading?(d(),c("div",ut,[p(q,{size:"lg",class:"text-primary"})])):(d(),c("div",ct,[n("div",gt,[(d(),c(C,null,O(k,r=>n("div",{key:r.status,class:"flex flex-col min-h-0 overflow-y-auto"},[p(ot,{status:r.status,title:r.title,tasks:x(r.status),"dragging-id":f(u).draggingId.value,"is-drag-over":f(u).dragOverColumn.value===r.status,onDragStart:f(u).onDragStart,onDragEnd:f(u).onDragEnd,onDragOver:f(u).onDragOver,onDragLeave:f(u).onDragLeave,onDrop:f(u).onDrop,onEditTask:h,onAddTask:w},null,8,["status","title","tasks","dragging-id","is-drag-over","onDragStart","onDragEnd","onDragOver","onDragLeave","onDrop"])])),64))])])),p(P,{open:a.value,task:s.value,"default-date":f(V),onClose:E,onSave:N},null,8,["open","task","default-date"])]))}});export{_t as default}; diff --git a/src/static/assets/Textarea.vue_vue_type_script_setup_true_lang-C35Jie1W.js b/src/static/assets/Textarea.vue_vue_type_script_setup_true_lang-Caf3IAh-.js similarity index 92% rename from src/static/assets/Textarea.vue_vue_type_script_setup_true_lang-C35Jie1W.js rename to src/static/assets/Textarea.vue_vue_type_script_setup_true_lang-Caf3IAh-.js index f52e56d..4d491f3 100644 --- a/src/static/assets/Textarea.vue_vue_type_script_setup_true_lang-C35Jie1W.js +++ b/src/static/assets/Textarea.vue_vue_type_script_setup_true_lang-Caf3IAh-.js @@ -1 +1 @@ -import{c as r}from"./utils-7WVCegLb.js";import{d as t,o as n,c as i,n as u,h as c}from"./index-DMlmI4VG.js";const m=["id","value","placeholder","disabled","rows"],g=t({__name:"Textarea",props:{modelValue:{},placeholder:{},disabled:{type:Boolean},rows:{},class:{},id:{}},emits:["update:modelValue"],setup(e,{emit:l}){const a=e,s=l;return(f,o)=>(n(),i("textarea",{id:e.id,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,rows:e.rows??3,class:u(c(r)("flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50 resize-none",a.class)),onInput:o[0]||(o[0]=d=>s("update:modelValue",d.target.value))},null,42,m))}});export{g as _}; +import{c as r}from"./utils-7WVCegLb.js";import{d as t,o as n,c as i,n as u,h as c}from"./index-BiYpJJoC.js";const m=["id","value","placeholder","disabled","rows"],g=t({__name:"Textarea",props:{modelValue:{},placeholder:{},disabled:{type:Boolean},rows:{},class:{},id:{}},emits:["update:modelValue"],setup(e,{emit:l}){const a=e,s=l;return(f,o)=>(n(),i("textarea",{id:e.id,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,rows:e.rows??3,class:u(c(r)("flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50 resize-none",a.class)),onInput:o[0]||(o[0]=d=>s("update:modelValue",d.target.value))},null,42,m))}});export{g as _}; diff --git a/src/static/assets/Tooltip.vue_vue_type_script_setup_true_lang-BRjliJat.js b/src/static/assets/Tooltip.vue_vue_type_script_setup_true_lang-BRjliJat.js new file mode 100644 index 0000000..5bd7c95 --- /dev/null +++ b/src/static/assets/Tooltip.vue_vue_type_script_setup_true_lang-BRjliJat.js @@ -0,0 +1 @@ +import{d,k as i,w as t,h as e,W as r,o as l,e as s,p as n,J as f,U as m,n as c,q as u,t as p,L as g}from"./index-BiYpJJoC.js";import{c as x}from"./utils-7WVCegLb.js";const w=d({__name:"Tooltip",props:{content:{},side:{default:"top"},sideOffset:{default:6}},setup(a){return(o,h)=>(l(),i(e(r),null,{default:t(()=>[s(e(f),{"as-child":""},{default:t(()=>[n(o.$slots,"default")]),_:3}),s(e(g),null,{default:t(()=>[s(e(m),{side:a.side,"side-offset":a.sideOffset,class:c(e(x)("z-50 max-w-[280px] rounded-lg border border-border bg-popover px-3 py-1.5","text-xs text-popover-foreground shadow-md","animate-in fade-in-0 zoom-in-95","data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95","data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"))},{default:t(()=>[u(p(a.content),1)]),_:1},8,["side","side-offset","class"])]),_:1})]),_:3}))}});export{w as _}; diff --git a/src/static/assets/admin-DvZ7jcBF.js b/src/static/assets/admin-BG8iXstk.js similarity index 68% rename from src/static/assets/admin-DvZ7jcBF.js rename to src/static/assets/admin-BG8iXstk.js index 0d5761a..c0d467d 100644 --- a/src/static/assets/admin-DvZ7jcBF.js +++ b/src/static/assets/admin-BG8iXstk.js @@ -1 +1 @@ -import{E as e}from"./index-DMlmI4VG.js";const i={users:()=>e.get("/api/admin/users"),keys:()=>e.get("/api/keys"),createKey:s=>e.post("/api/keys",s),revokeKey:s=>e.delete(`/api/keys/${s}`)};export{i as a}; +import{D as e}from"./index-BiYpJJoC.js";const i={users:()=>e.get("/api/admin/users"),keys:()=>e.get("/api/keys"),createKey:s=>e.post("/api/keys",s),revokeKey:s=>e.delete(`/api/keys/${s}`)};export{i as a}; diff --git a/src/static/assets/calendar-C9xlMu6k.js b/src/static/assets/calendar-C9xlMu6k.js new file mode 100644 index 0000000..69da99f --- /dev/null +++ b/src/static/assets/calendar-C9xlMu6k.js @@ -0,0 +1,6 @@ +import{c as e}from"./createLucideIcon-D7qP-VdO.js";/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const a=e("CalendarIcon",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);export{a as C}; diff --git a/src/static/assets/calendar-days-DjiBFm4u.js b/src/static/assets/calendar-days-DjiBFm4u.js new file mode 100644 index 0000000..ef96367 --- /dev/null +++ b/src/static/assets/calendar-days-DjiBFm4u.js @@ -0,0 +1,6 @@ +import{c as h}from"./createLucideIcon-D7qP-VdO.js";/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const t=h("CalendarDaysIcon",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M16 14h.01",key:"1gbofw"}],["path",{d:"M8 18h.01",key:"lrp35t"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M16 18h.01",key:"kzsmim"}]]);export{t as C}; diff --git a/src/static/assets/createLucideIcon-D7qP-VdO.js b/src/static/assets/createLucideIcon-D7qP-VdO.js new file mode 100644 index 0000000..5172b39 --- /dev/null +++ b/src/static/assets/createLucideIcon-D7qP-VdO.js @@ -0,0 +1,21 @@ +import{a1 as a}from"./index-BiYpJJoC.js";/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const d=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var o={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const h=({size:e,strokeWidth:t=2,absoluteStrokeWidth:r,color:s,iconNode:n,name:i,class:w,...l},{slots:c})=>a("svg",{...o,width:e||o.width,height:e||o.height,stroke:s||o.stroke,"stroke-width":r?Number(t)*24/Number(e):t,class:["lucide",`lucide-${d(i??"icon")}`],...l},[...n.map(u=>a(...u)),...c.default?[c.default()]:[]]);/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const m=(e,t)=>(r,{slots:s})=>a(h,{...r,iconNode:t,name:e},s);export{m as c}; diff --git a/src/static/assets/dashboard-BOPmT7C3.js b/src/static/assets/dashboard-Ca6WcfdV.js similarity index 88% rename from src/static/assets/dashboard-BOPmT7C3.js rename to src/static/assets/dashboard-Ca6WcfdV.js index 37852d5..234f56f 100644 --- a/src/static/assets/dashboard-BOPmT7C3.js +++ b/src/static/assets/dashboard-Ca6WcfdV.js @@ -1 +1 @@ -import{E as t}from"./index-DMlmI4VG.js";const e={summary:a=>t.get("/api/dashboard/summary",{params:a}),projects:a=>t.get("/api/dashboard/projects",{params:a}),timeline:a=>t.get("/api/dashboard/timeline",{params:a}),monthly:a=>t.get("/api/dashboard/monthly",{params:a}),dow:a=>t.get("/api/dashboard/dow",{params:a}),tools:a=>t.get("/api/dashboard/tools",{params:a}),activity:a=>t.get("/api/dashboard/activity",{params:a}),calendar:a=>t.get("/api/dashboard/calendar",{params:a}),project:(a,o)=>t.get("/api/dashboard/project/"+a,{params:o})};export{e as d}; +import{D as t}from"./index-BiYpJJoC.js";const e={summary:a=>t.get("/api/dashboard/summary",{params:a}),projects:a=>t.get("/api/dashboard/projects",{params:a}),timeline:a=>t.get("/api/dashboard/timeline",{params:a}),monthly:a=>t.get("/api/dashboard/monthly",{params:a}),dow:a=>t.get("/api/dashboard/dow",{params:a}),tools:a=>t.get("/api/dashboard/tools",{params:a}),activity:a=>t.get("/api/dashboard/activity",{params:a}),calendar:a=>t.get("/api/dashboard/calendar",{params:a}),project:(a,o)=>t.get("/api/dashboard/project/"+a,{params:o})};export{e as d}; diff --git a/src/static/assets/devops-roMxSiNP.js b/src/static/assets/devops-y1AYKG_U.js similarity index 94% rename from src/static/assets/devops-roMxSiNP.js rename to src/static/assets/devops-y1AYKG_U.js index dcd8188..a527f4b 100644 --- a/src/static/assets/devops-roMxSiNP.js +++ b/src/static/assets/devops-y1AYKG_U.js @@ -1 +1 @@ -import{E as n,C as I,s as o}from"./index-DMlmI4VG.js";const i={getIntegration:()=>n.get("/api/devops/integration"),saveIntegration:e=>n.put("/api/devops/integration",e),deleteIntegration:()=>n.delete("/api/devops/integration"),sync:()=>n.post("/api/devops/sync"),workItems:e=>n.get("/api/devops/work-items",{params:e?{state:e}:void 0}),cloneWorkItem:e=>n.post(`/api/devops/work-items/${e}/clone`)},m=I("devops",()=>{const e=o(null),l=o([]),r=o(!1),s=o(!1),c=o(null);async function u(){s.value=!0;try{const t=await i.getIntegration();e.value=t.data}catch{e.value=null}finally{s.value=!1}}async function d(t){const a=await i.saveIntegration(t);e.value=a.data}async function g(){await i.deleteIntegration(),e.value=null}async function f(){var t,a;r.value=!0,c.value=null;try{await i.sync(),await u()}catch(v){const p=v;throw c.value=((a=(t=p.response)==null?void 0:t.data)==null?void 0:a.detail)??p.message??"Sync failed",v}finally{r.value=!1}}async function y(t){s.value=!0;try{const a=await i.workItems(t);l.value=a.data}catch{l.value=[]}finally{s.value=!1}}return{integration:e,workItems:l,syncing:r,loading:s,error:c,fetchIntegration:u,saveIntegration:d,deleteIntegration:g,sync:f,fetchWorkItems:y}});export{i as d,m as u}; +import{D as n,B as I,s as o}from"./index-BiYpJJoC.js";const i={getIntegration:()=>n.get("/api/devops/integration"),saveIntegration:e=>n.put("/api/devops/integration",e),deleteIntegration:()=>n.delete("/api/devops/integration"),sync:()=>n.post("/api/devops/sync"),workItems:e=>n.get("/api/devops/work-items",{params:e?{state:e}:void 0}),cloneWorkItem:e=>n.post(`/api/devops/work-items/${e}/clone`)},m=I("devops",()=>{const e=o(null),l=o([]),r=o(!1),s=o(!1),c=o(null);async function u(){s.value=!0;try{const t=await i.getIntegration();e.value=t.data}catch{e.value=null}finally{s.value=!1}}async function d(t){const a=await i.saveIntegration(t);e.value=a.data}async function g(){await i.deleteIntegration(),e.value=null}async function f(){var t,a;r.value=!0,c.value=null;try{await i.sync(),await u()}catch(v){const p=v;throw c.value=((a=(t=p.response)==null?void 0:t.data)==null?void 0:a.detail)??p.message??"Sync failed",v}finally{r.value=!1}}async function y(t){s.value=!0;try{const a=await i.workItems(t);l.value=a.data}catch{l.value=[]}finally{s.value=!1}}return{integration:e,workItems:l,syncing:r,loading:s,error:c,fetchIntegration:u,saveIntegration:d,deleteIntegration:g,sync:f,fetchWorkItems:y}});export{i as d,m as u}; diff --git a/src/static/assets/file-text-C0mXX88J.js b/src/static/assets/file-text-C0mXX88J.js new file mode 100644 index 0000000..7ca4c58 --- /dev/null +++ b/src/static/assets/file-text-C0mXX88J.js @@ -0,0 +1,6 @@ +import{c as e}from"./createLucideIcon-D7qP-VdO.js";/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const t=e("FileTextIcon",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);export{t as F}; diff --git a/src/static/assets/format-WqwOLoqz.js b/src/static/assets/format-WqwOLoqz.js new file mode 100644 index 0000000..ee5afd4 --- /dev/null +++ b/src/static/assets/format-WqwOLoqz.js @@ -0,0 +1,11 @@ +import{c as X}from"./createLucideIcon-D7qP-VdO.js";/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ut=X("ChevronLeftIcon",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** + * @license lucide-vue-next v0.427.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zt=X("ChevronRightIcon",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);function l(t){const n=Object.prototype.toString.call(t);return t instanceof Date||typeof t=="object"&&n==="[object Date]"?new t.constructor(+t):typeof t=="number"||n==="[object Number]"||typeof t=="string"||n==="[object String]"?new Date(t):new Date(NaN)}function b(t,n){return t instanceof Date?new t.constructor(n):new Date(n)}const j=6048e5,B=864e5;let A={};function D(){return A}function x(t,n){var u,c,d,h;const e=D(),r=(n==null?void 0:n.weekStartsOn)??((c=(u=n==null?void 0:n.locale)==null?void 0:u.options)==null?void 0:c.weekStartsOn)??e.weekStartsOn??((h=(d=e.locale)==null?void 0:d.options)==null?void 0:h.weekStartsOn)??0,a=l(t),i=a.getDay(),s=(i