@yuku123/z-task-frontend-component 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -3040,9 +3040,7 @@ const { Header: Ms, Sider: zs, Content: qs } = er, { Text: $s } = J, { Title: Hs
|
|
|
3040
3040
|
Object.fromEntries(is.map((e) => [e.type, e]));
|
|
3041
3041
|
const { Option: Xs } = me;
|
|
3042
3042
|
ne.TextArea, ne.TextArea;
|
|
3043
|
-
const { Text: Ks, Paragraph: Ys } = J, { TextArea: Gs } = ne, { TextArea: Zs } = ne, { Text: Qs, Paragraph: ea } = J, { TextArea: ta } = ne, { Text: ra, Paragraph: na } = J, { Text: oa } = J, { Text: sa } = J, { TextArea: aa } = ne, { Text: ia, Paragraph: la } = J, { Text: ca } = J, { Text: ua } = J, { Text: fa } = J, { Text: da } = J
|
|
3044
|
-
common;
|
|
3045
|
-
const he = St("task"), ee = {
|
|
3043
|
+
const { Text: Ks, Paragraph: Ys } = J, { TextArea: Gs } = ne, { TextArea: Zs } = ne, { Text: Qs, Paragraph: ea } = J, { TextArea: ta } = ne, { Text: ra, Paragraph: na } = J, { Text: oa } = J, { Text: sa } = J, { TextArea: aa } = ne, { Text: ia, Paragraph: la } = J, { Text: ca } = J, { Text: ua } = J, { Text: fa } = J, { Text: da } = J, he = St("task"), ee = {
|
|
3046
3044
|
// === 项目 ===
|
|
3047
3045
|
listMyProjects: () => os.get("/project/user/list").then((e) => e.data),
|
|
3048
3046
|
createProject: (e) => he.post("/project", e).then((t) => t.data),
|
|
@@ -48,4 +48,4 @@ React keys must be passed directly to JSX without using spread:
|
|
|
48
48
|
`);return s===-1?"":n.stack.slice(s+1)})();try{if(!r.stack)r.stack=o;else if(o){const s=o.indexOf(`
|
|
49
49
|
`),a=s===-1?-1:o.indexOf(`
|
|
50
50
|
`,s+1),c=a===-1?"":o.slice(a+1);String(r.stack).endsWith(c)||(r.stack+=`
|
|
51
|
-
`+o)}}catch{}}throw r}}_request(e,t){typeof e=="string"?(t=t||{},t.url=e):t=e||{},t=he(this.defaults,t);const{transitional:r,paramsSerializer:n,headers:o}=t;r!==void 0&&We.assertOptions(r,{silentJSONParsing:q.transitional(q.boolean),forcedJSONParsing:q.transitional(q.boolean),clarifyTimeoutError:q.transitional(q.boolean),legacyInterceptorReqResOrdering:q.transitional(q.boolean),advertiseZstdAcceptEncoding:q.transitional(q.boolean),validateStatusUndefinedResolves:q.transitional(q.boolean)},!1),n!=null&&(l.isFunction(n)?t.paramsSerializer={serialize:n}:We.assertOptions(n,{encode:q.function,serialize:q.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),We.assertOptions(t,{baseUrl:q.spelling("baseURL"),withXsrfToken:q.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let s=o&&l.merge(o.common,o[t.method]);o&&l.forEach(["delete","get","head","post","put","patch","query","common"],R=>{delete o[R]}),t.headers=z.concat(s,o);const a=[];let c=!0;this.interceptors.request.forEach(function(R){if(typeof R.runWhen=="function"&&R.runWhen(t)===!1)return;c=c&&R.synchronous;const C=t.transitional||tt;C&&C.legacyInterceptorReqResOrdering?a.unshift(R.fulfilled,R.rejected):a.push(R.fulfilled,R.rejected)});const f=[];this.interceptors.response.forEach(function(R){f.push(R.fulfilled,R.rejected)});let p,m=0,b;if(!c){const R=[nr.bind(this),void 0];for(R.unshift(...a),R.push(...f),b=R.length,p=Promise.resolve(t);m<b;)p=p.then(R[m++],R[m++]);return p}b=a.length;let S=t;for(;m<b;){const R=a[m++],C=a[m++];try{S=R(S)}catch(x){C.call(this,x);break}}try{p=nr.call(this,S)}catch(R){return Promise.reject(R)}for(m=0,b=f.length;m<b;)p=p.then(f[m++],f[m++]);return p}getUri(e){e=he(this.defaults,e);const t=Jt(e.baseURL,e.url,e.allowAbsoluteUrls,e);return Lt(t,e.params,e.paramsSerializer)}};l.forEach(["delete","get","head","options"],function(e){me.prototype[e]=function(t,r){return this.request(he(r||{},{method:e,url:t,data:r&&l.hasOwnProp(r,"data")?r.data:void 0}))}}),l.forEach(["post","put","patch","query"],function(e){function t(r){return function(n,o,s){return this.request(he(s||{},{method:e,headers:r?{"Content-Type":"multipart/form-data"}:{},url:n,data:o}))}}me.prototype[e]=t(),e!=="query"&&(me.prototype[e+"Form"]=t(!0))});let To=class fr{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let r;this.promise=new Promise(function(o){r=o});const n=this;this.promise.then(o=>{if(!n._listeners)return;let s=n._listeners.length;for(;s-- >0;)n._listeners[s](o);n._listeners=null}),this.promise.then=o=>{let s;const a=new Promise(c=>{n.subscribe(c),s=c}).then(o);return a.cancel=function(){n.unsubscribe(s)},a},t(function(o,s,a){n.reason||(n.reason=new Ce(o,s,a),r(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const r=this._listeners.indexOf(t);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){const t=new AbortController,r=n=>{t.abort(n)};return this.subscribe(r),t.signal.unsubscribe=()=>this.unsubscribe(r),t.signal}static source(){let t;return{token:new fr(function(r){t=r}),cancel:t}}};function vo(e){return function(t){return e.apply(null,t)}}function jo(e){return l.isObject(e)&&e.isAxiosError===!0}const lt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(lt).forEach(([e,t])=>{lt[t]=e});function sr(e){const t=new me(e),r=wt(me.prototype.request,t);return l.extend(r,me.prototype,t,{allOwnKeys:!0}),l.extend(r,t,null,{allOwnKeys:!0}),r.create=function(n){return sr(he(e,n))},r}const I=sr(Pe);I.Axios=me,I.CanceledError=Ce,I.CancelToken=To,I.isCancel=qt,I.VERSION=st,I.toFormData=ze,I.AxiosError=w,I.Cancel=I.CanceledError,I.all=function(e){return Promise.all(e)},I.spread=vo,I.isAxiosError=jo,I.mergeConfig=he,I.AxiosHeaders=z,I.formToJSON=e=>zt(l.isHTMLForm(e)?new FormData(e):e),I.getAdapter=rr.getAdapter,I.HttpStatusCode=lt,I.default=I;const{Axios:Uo,AxiosError:Mo,CanceledError:zo,isCancel:qo,CancelToken:$o,VERSION:Ho,all:Vo,Cancel:Wo,isAxiosError:Jo,spread:Xo,toFormData:Ko,AxiosHeaders:Yo,HttpStatusCode:Go,formToJSON:Zo,getAdapter:Qo,mergeConfig:es,create:ts}=I;function _o(e){if(e&&typeof e=="object"&&"code"in e&&"data"in e){const t=e;return t.code!==200?Promise.reject(new Error(t.message||"请求失败")):t.data}return e}function Ao(e,t={}){const{tokenKey:r="token",userInfoKey:n="userInfo",unauthorizedRedirect:o="/login"}=t;e.interceptors.request.use(s=>{const a=localStorage.getItem(r);return a&&(s.headers.Authorization=`Bearer ${a}`),s}),e.interceptors.response.use(s=>_o(s.data),s=>{var a,c,f;return((a=s.response)==null?void 0:a.status)===401?(localStorage.removeItem(r),localStorage.removeItem(n),window.location.href=o):((c=s.response)==null?void 0:c.status)===403?console.error("没有权限访问该资源"):((f=s.response)==null?void 0:f.status)===500&&console.error("服务器内部错误"),Promise.reject(s)})}function ct(e={}){const t=I.create({baseURL:e.baseURL??"/api",timeout:e.timeout??1e4});return Ao(t,{tokenKey:e.tokenKey,userInfoKey:e.userInfoKey,unauthorizedRedirect:e.unauthorizedRedirect}),t}ct();const ko=ct();class rs extends N.Component{constructor(t){super(t),Sr(this,"handleReset",()=>{this.setState({hasError:!1,error:null,errorInfo:null}),typeof this.props.onReset=="function"&&this.props.onReset()}),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,r){console.error("[ErrorBoundary] caught error:",t,r),this.setState({errorInfo:r})}render(){if(!this.state.hasError)return this.props.children;const{fallbackTitle:t="组件加载失败",fallbackDescription:r,showReload:n=!0}=this.props,o=this.state.error&&(this.state.error.message||String(this.state.error))||"未知错误";return Y.jsxs("div",{style:{padding:24,background:"#fff2f0",border:"1px solid #ffccc7",borderRadius:8,minHeight:200},children:[Y.jsx(u.Alert,{type:"error",showIcon:!0,icon:Y.jsx(L.BugOutlined,{}),message:t,description:Y.jsxs("div",{children:[Y.jsx("div",{style:{marginBottom:8},children:r||"当前组件发生了异常,已被错误边界捕获。其他功能仍可正常使用。"}),Y.jsx("div",{style:{fontFamily:"Menlo, Monaco, Consolas, monospace",fontSize:12,color:"#cf1322",background:"#fff",padding:8,borderRadius:4,border:"1px solid #ffccc7",wordBreak:"break-word",whiteSpace:"pre-wrap"},children:o})]})}),n&&Y.jsx(u.Space,{style:{marginTop:16},children:Y.jsx(u.Button,{icon:Y.jsx(L.ReloadOutlined,{}),onClick:this.handleReset,children:"重试"})})]})}}const{Title:ns,Text:os,Paragraph:ss}=u.Typography;let Po="/api";function ar(){return I.create({baseURL:Po,timeout:15e3})}const Co=ar();ar(),Co.interceptors.request.use(e=>{const t=localStorage.getItem("token");return t&&(e.headers.Authorization=`Bearer ${t}`),e});const{Header:as,Sider:is,Content:ls}=u.Layout,{Text:cs}=u.Typography,{Title:us,Text:fs}=u.Typography,{Option:ds}=u.Select,{TextArea:ps}=u.Input,No=[{type:"STRING",label:"字符串",icon:Y.jsx(L.FileTextOutlined,{}),color:"#1677ff",desc:"短文本 (默认 VARCHAR 255)"},{type:"TEXT",label:"长文本",icon:Y.jsx(L.FileTextOutlined,{}),color:"#13c2c2",desc:"TEXT 类型, 无长度限制"},{type:"INT",label:"整数",icon:"#",color:"#722ed1",desc:"INT 整数"},{type:"LONG",label:"长整数",icon:"#",color:"#722ed1",desc:"BIGINT 长整数"},{type:"DECIMAL",label:"小数",icon:"0.00",color:"#eb2f96",desc:"DECIMAL 精确小数"},{type:"BOOLEAN",label:"布尔",icon:Y.jsx(L.CheckCircleOutlined,{}),color:"#52c41a",desc:"TINYINT(1) 是/否"},{type:"DATE",label:"日期",icon:"📅",color:"#fa8c16",desc:"DATE yyyy-MM-dd"},{type:"DATETIME",label:"日期时间",icon:"🕐",color:"#fa8c16",desc:"DATETIME yyyy-MM-dd HH:mm:ss"},{type:"JSON",label:"JSON",icon:"{}",color:"#2f54eb",desc:"JSON 字符串"},{type:"REF",label:"引用",icon:"🔗",color:"#8c8c8c",desc:"外键引用 BIGINT"}];Object.fromEntries(No.map(e=>[e.type,e]));const{Option:hs}=u.Select;u.Input.TextArea,u.Input.TextArea;const{Text:ms,Paragraph:ys}=u.Typography,{TextArea:gs}=u.Input,{TextArea:bs}=u.Input,{Text:Es,Paragraph:ws}=u.Typography,{TextArea:Os}=u.Input,{Text:Rs,Paragraph:xs}=u.Typography,{Text:Ss}=u.Typography,{Text:Ts}=u.Typography,{TextArea:vs}=u.Input,{Text:js,Paragraph:_s}=u.Typography,{Text:As}=u.Typography,{Text:ks}=u.Typography,{Text:Ps}=u.Typography,{Text:Cs}=u.Typography;common;const ie=ct("task"),J={listMyProjects:()=>ko.get("/project/user/list").then(e=>e.data),createProject:e=>ie.post("/project",e).then(t=>t.data),updateProject:(e,t)=>ie.put(`/project/${e}`,t).then(r=>r.data),archiveProject:e=>ie.put(`/project/${e}/archive`).then(t=>t.data),listTasksByProject:e=>ie.get("/task/project/list",{params:{projectId:e}}).then(t=>t.data),listTasksByList:e=>ie.get("/task/list",{params:{listId:e}}).then(t=>t.data),createTask:e=>ie.post("/task",e).then(t=>t.data),completeTask:e=>ie.post("/task/complete",null,{params:{taskId:e}}).then(t=>t.data),moveTask:(e,t,r)=>ie.put("/task/move",null,{params:{taskId:e,targetListId:t,position:r}}).then(n=>n.data)},ut=e=>{if(!e)return"-";const t=String(e),r=t.match(/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})/);return r?r[1]:t};function ft({apiBaseURL:e}){const[t,r]=N.useState([]),[n,o]=N.useState(!1),[s,a]=N.useState(!1),[c,f]=N.useState(null),[p,m]=N.useState(null),[b,S]=N.useState([]),[R,C]=N.useState(!1),[x]=u.Form.useForm(),F=async()=>{o(!0);try{const E=await J.listMyProjects();r((E==null?void 0:E.data)||E||[])}catch(E){u.message.error("加载项目失败: "+((E==null?void 0:E.message)||E))}finally{o(!1)}};N.useEffect(()=>{F()},[]);const y=async E=>{m(E),C(!0);try{const A=await J.listTasksByProject(E.id);S((A==null?void 0:A.data)||A||[])}catch(A){u.message.error("加载任务失败: "+((A==null?void 0:A.message)||A))}finally{C(!1)}},h=async()=>{if(p)try{const E=await J.listTasksByProject(p.id);S((E==null?void 0:E.data)||E||[])}catch(E){u.message.error("刷新任务失败: "+((E==null?void 0:E.message)||E))}},O=()=>{f(null),x.resetFields(),x.setFieldsValue({status:1}),a(!0)},k=E=>{f(E),x.setFieldsValue({name:E.name,description:E.description,status:E.status??1}),a(!0)},D=async()=>{try{const E=await x.validateFields();c?(await J.updateProject(c.id,E),u.message.success("项目已更新")):(await J.createProject(E),u.message.success("项目已创建")),a(!1),F()}catch(E){if(E!=null&&E.errorFields)return;u.message.error("保存失败: "+((E==null?void 0:E.message)||E))}},te=async E=>{try{await J.archiveProject(E),u.message.success("项目已归档"),F(),(p==null?void 0:p.id)===E&&(m(null),S([]))}catch(A){u.message.error("归档失败: "+((A==null?void 0:A.message)||A))}},ye=async E=>{try{await J.completeTask(E),u.message.success("任务已完成"),h()}catch(A){u.message.error("操作失败: "+((A==null?void 0:A.message)||A))}},ne=[{title:"项目名称",dataIndex:"name",render:(E,A)=>d.jsx("a",{onClick:()=>y(A),style:{fontWeight:(p==null?void 0:p.id)===A.id?600:400},children:E})},{title:"状态",dataIndex:"status",width:80,render:E=>E===1?d.jsx(u.Tag,{color:"green",children:"进行中"}):d.jsx(u.Tag,{children:"已归档"})},{title:"创建时间",dataIndex:"createdAt",width:170,render:ut},{title:"操作",width:160,fixed:"right",render:(E,A)=>d.jsxs(u.Space,{children:[d.jsx(u.Button,{size:"small",icon:d.jsx(L.EditOutlined,{}),onClick:()=>k(A),children:"编辑"}),d.jsx(u.Popconfirm,{title:"确定归档该项目?",onConfirm:()=>te(A.id),children:d.jsx(u.Button,{size:"small",danger:!0,icon:d.jsx(L.DeleteOutlined,{}),children:"归档"})})]})}],X=E=>{const $={0:{text:"待办",color:"default"},1:{text:"进行中",color:"blue"},2:{text:"已完成",color:"green"}}[E]||{text:String(E),color:"default"};return d.jsx(u.Tag,{color:$.color,children:$.text})};return d.jsxs("div",{children:[d.jsx("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:12},children:d.jsx(u.Button,{type:"primary",icon:d.jsx(L.PlusOutlined,{}),onClick:O,children:"新建项目"})}),d.jsxs("div",{style:{display:"flex",gap:16,height:"calc(100vh - 220px)"},children:[d.jsx(u.Card,{size:"small",title:d.jsxs(u.Space,{children:[d.jsx(L.InboxOutlined,{}),"项目管理"]}),style:{width:520,flexShrink:0},styles:{body:{padding:8,overflow:"auto",height:"calc(100% - 40px)"}},children:d.jsx(u.Table,{rowKey:"id",columns:ne,dataSource:t,loading:n,pagination:{pageSize:10,size:"small"},size:"small",rowClassName:E=>(p==null?void 0:p.id)===E.id?"ant-table-row-selected":"",onRow:E=>({onClick:()=>y(E),style:{cursor:"pointer"}}),locale:{emptyText:"暂无项目"}})}),d.jsx(u.Card,{size:"small",style:{flex:1,overflow:"auto"},styles:{body:{padding:16}},title:p?d.jsxs(u.Space,{children:[d.jsx(L.UnorderedListOutlined,{}),p.name," · 任务列表"]}):"项目详情",children:p?d.jsxs(u.Spin,{spinning:R,children:[d.jsxs(u.Descriptions,{size:"small",bordered:!0,column:2,style:{marginBottom:16},children:[d.jsx(u.Descriptions.Item,{label:"项目名称",span:2,children:p.name}),d.jsx(u.Descriptions.Item,{label:"描述",span:2,children:p.description||"无"}),d.jsx(u.Descriptions.Item,{label:"负责人",children:p.ownerId||"未指定"}),d.jsx(u.Descriptions.Item,{label:"状态",children:p.status===1?d.jsx(u.Tag,{color:"green",children:"进行中"}):d.jsx(u.Tag,{children:"已归档"})}),d.jsx(u.Descriptions.Item,{label:"创建时间",children:ut(p.createdAt)}),d.jsx(u.Descriptions.Item,{label:"项目ID",children:p.id})]}),d.jsx(u.List,{size:"small",header:d.jsxs("b",{children:["任务项 (",b.length,")"]}),bordered:!0,dataSource:b,locale:{emptyText:"该项目下暂无任务"},renderItem:E=>d.jsx(u.List.Item,{actions:[d.jsx(u.Button,{size:"small",type:"primary",icon:d.jsx(L.CheckOutlined,{}),disabled:E.status===2,onClick:()=>ye(E.id),children:"完成"},"complete")],children:d.jsx(u.List.Item.Meta,{title:d.jsxs(u.Space,{children:[E.title,X(E.status),d.jsxs(u.Tag,{children:["优先级 ",E.priority??"-"]})]}),description:d.jsxs("span",{style:{color:"#888",fontSize:12},children:["截止: ",ut(E.dueDate)," · ID: ",E.id]})})})})]}):d.jsx(u.Empty,{description:"请从左侧选择一个项目",style:{marginTop:80}})})]}),d.jsx(u.Drawer,{title:c?`编辑项目 - ${c.name}`:"新建项目",width:480,open:s,onClose:()=>a(!1),destroyOnHidden:!0,extra:d.jsxs(u.Space,{children:[d.jsx(u.Button,{onClick:()=>a(!1),children:"取消"}),d.jsx(u.Button,{type:"primary",onClick:D,children:"保存"})]}),children:d.jsxs(u.Form,{form:x,layout:"vertical",preserve:!1,children:[d.jsx(u.Form.Item,{name:"name",label:"项目名称",rules:[{required:!0,message:"请输入项目名称"}],children:d.jsx(u.Input,{placeholder:"例如: 一人公司"})}),d.jsx(u.Form.Item,{name:"description",label:"项目描述",children:d.jsx(u.Input.TextArea,{rows:3,placeholder:"可选"})}),d.jsx(u.Form.Item,{name:"status",label:"状态",initialValue:1,children:d.jsx(u.Select,{options:[{label:"进行中",value:1},{label:"已归档",value:0}]})})]})})]})}function dt({apiBaseURL:e}){const[t,r]=N.useState([]),[n,o]=N.useState(null),[s,a]=N.useState([]),[c,f]=N.useState(!1),[p,m]=N.useState(!1),[b]=u.Form.useForm(),S=async()=>{try{const h=await J.listMyProjects(),O=(h==null?void 0:h.data)||h||[];r(O),O.length>0&&!n&&o(O[0].id)}catch(h){u.message.error("加载项目失败: "+((h==null?void 0:h.message)||h))}},R=async h=>{if(!h){a([]);return}f(!0);try{const O=await J.listTasksByProject(h);a((O==null?void 0:O.data)||O||[])}catch(O){u.message.error("加载任务失败: "+((O==null?void 0:O.message)||O))}finally{f(!1)}};N.useEffect(()=>{S()},[]),N.useEffect(()=>{R(n)},[n]);const C=()=>{if(!n){u.message.warning("请先选择项目");return}b.resetFields(),b.setFieldsValue({projectId:n,listId:1,status:1,priority:1}),m(!0)},x=async()=>{try{const h=await b.validateFields();await J.createTask(h),u.message.success("任务已创建"),m(!1),R(n)}catch(h){if(h!=null&&h.errorFields)return;u.message.error("创建失败: "+((h==null?void 0:h.message)||h))}},F=async h=>{try{await J.completeTask(h),u.message.success("任务已完成"),R(n)}catch(O){u.message.error("操作失败: "+((O==null?void 0:O.message)||O))}},y=[{title:"ID",dataIndex:"id",width:60},{title:"标题",dataIndex:"title"},{title:"项目ID",dataIndex:"projectId",width:80},{title:"状态",dataIndex:"status",width:100,render:h=>{const O={0:"待办",1:"进行中",2:"已完成"},k={0:"default",1:"blue",2:"green"}[h]||"default";return d.jsx(u.Tag,{color:k,children:O[h]||h})}},{title:"优先级",dataIndex:"priority",width:80},{title:"截止时间",dataIndex:"dueDate",width:180},{title:"操作",width:200,fixed:"right",render:(h,O)=>d.jsx(u.Space,{children:d.jsx(u.Button,{size:"small",type:"primary",icon:d.jsx(L.CheckOutlined,{}),onClick:()=>F(O.id),disabled:O.status===2,children:"完成"})})}];return d.jsxs("div",{children:[d.jsx(u.Card,{title:"任务管理",extra:d.jsxs(u.Space,{children:[d.jsx("span",{children:"项目:"}),d.jsx(u.Select,{value:n,onChange:o,style:{width:240},placeholder:"选择项目",options:t.map(h=>({label:h.name,value:h.id}))}),d.jsx(u.Button,{type:"primary",icon:d.jsx(L.PlusOutlined,{}),onClick:C,children:"新建任务"})]}),children:d.jsx(u.Table,{rowKey:"id",columns:y,dataSource:s,loading:c,pagination:{pageSize:10}})}),d.jsx(u.Modal,{title:"新建任务",open:p,onCancel:()=>m(!1),onOk:x,destroyOnHidden:!0,children:d.jsxs(u.Form,{form:b,layout:"vertical",preserve:!1,children:[d.jsx(u.Form.Item,{name:"title",label:"任务标题",rules:[{required:!0,message:"请输入任务标题"}],children:d.jsx(u.Input,{placeholder:"例如: 实现 xx 功能"})}),d.jsx(u.Form.Item,{name:"projectId",label:"所属项目",rules:[{required:!0}],children:d.jsx(u.Select,{options:t.map(h=>({label:h.name,value:h.id})),placeholder:"从数据库捞出的项目列表"})}),d.jsx(u.Form.Item,{name:"listId",label:"列表ID",rules:[{required:!0}],children:d.jsx(u.Input,{type:"number",placeholder:"默认 1"})}),d.jsx(u.Form.Item,{name:"priority",label:"优先级",initialValue:1,children:d.jsx(u.Select,{options:[{label:"低",value:1},{label:"中",value:2},{label:"高",value:3}]})})]})})]})}function Io(){return d.jsxs(fe.Routes,{children:[d.jsx(fe.Route,{index:!0,element:d.jsx(fe.Navigate,{to:"project",replace:!0})}),d.jsx(fe.Route,{path:"project",element:d.jsx(ft,{})}),d.jsx(fe.Route,{path:"project/*",element:d.jsx(ft,{})}),d.jsx(fe.Route,{path:"task",element:d.jsx(dt,{})}),d.jsx(fe.Route,{path:"task/*",element:d.jsx(dt,{})})]})}U.ProjectList=ft,U.ProjectSelect=Or,U.TaskApp=Io,U.TaskCard=gr,U.TaskList=dt,U.TaskTable=wr,U.api=J,U.taskApi=J,Object.defineProperty(U,Symbol.toStringTag,{value:"Module"})}));
|
|
51
|
+
`+o)}}catch{}}throw r}}_request(e,t){typeof e=="string"?(t=t||{},t.url=e):t=e||{},t=he(this.defaults,t);const{transitional:r,paramsSerializer:n,headers:o}=t;r!==void 0&&We.assertOptions(r,{silentJSONParsing:q.transitional(q.boolean),forcedJSONParsing:q.transitional(q.boolean),clarifyTimeoutError:q.transitional(q.boolean),legacyInterceptorReqResOrdering:q.transitional(q.boolean),advertiseZstdAcceptEncoding:q.transitional(q.boolean),validateStatusUndefinedResolves:q.transitional(q.boolean)},!1),n!=null&&(l.isFunction(n)?t.paramsSerializer={serialize:n}:We.assertOptions(n,{encode:q.function,serialize:q.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),We.assertOptions(t,{baseUrl:q.spelling("baseURL"),withXsrfToken:q.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let s=o&&l.merge(o.common,o[t.method]);o&&l.forEach(["delete","get","head","post","put","patch","query","common"],R=>{delete o[R]}),t.headers=z.concat(s,o);const a=[];let c=!0;this.interceptors.request.forEach(function(R){if(typeof R.runWhen=="function"&&R.runWhen(t)===!1)return;c=c&&R.synchronous;const C=t.transitional||tt;C&&C.legacyInterceptorReqResOrdering?a.unshift(R.fulfilled,R.rejected):a.push(R.fulfilled,R.rejected)});const f=[];this.interceptors.response.forEach(function(R){f.push(R.fulfilled,R.rejected)});let p,m=0,b;if(!c){const R=[nr.bind(this),void 0];for(R.unshift(...a),R.push(...f),b=R.length,p=Promise.resolve(t);m<b;)p=p.then(R[m++],R[m++]);return p}b=a.length;let S=t;for(;m<b;){const R=a[m++],C=a[m++];try{S=R(S)}catch(x){C.call(this,x);break}}try{p=nr.call(this,S)}catch(R){return Promise.reject(R)}for(m=0,b=f.length;m<b;)p=p.then(f[m++],f[m++]);return p}getUri(e){e=he(this.defaults,e);const t=Jt(e.baseURL,e.url,e.allowAbsoluteUrls,e);return Lt(t,e.params,e.paramsSerializer)}};l.forEach(["delete","get","head","options"],function(e){me.prototype[e]=function(t,r){return this.request(he(r||{},{method:e,url:t,data:r&&l.hasOwnProp(r,"data")?r.data:void 0}))}}),l.forEach(["post","put","patch","query"],function(e){function t(r){return function(n,o,s){return this.request(he(s||{},{method:e,headers:r?{"Content-Type":"multipart/form-data"}:{},url:n,data:o}))}}me.prototype[e]=t(),e!=="query"&&(me.prototype[e+"Form"]=t(!0))});let To=class fr{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let r;this.promise=new Promise(function(o){r=o});const n=this;this.promise.then(o=>{if(!n._listeners)return;let s=n._listeners.length;for(;s-- >0;)n._listeners[s](o);n._listeners=null}),this.promise.then=o=>{let s;const a=new Promise(c=>{n.subscribe(c),s=c}).then(o);return a.cancel=function(){n.unsubscribe(s)},a},t(function(o,s,a){n.reason||(n.reason=new Ce(o,s,a),r(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const r=this._listeners.indexOf(t);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){const t=new AbortController,r=n=>{t.abort(n)};return this.subscribe(r),t.signal.unsubscribe=()=>this.unsubscribe(r),t.signal}static source(){let t;return{token:new fr(function(r){t=r}),cancel:t}}};function vo(e){return function(t){return e.apply(null,t)}}function jo(e){return l.isObject(e)&&e.isAxiosError===!0}const lt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(lt).forEach(([e,t])=>{lt[t]=e});function sr(e){const t=new me(e),r=wt(me.prototype.request,t);return l.extend(r,me.prototype,t,{allOwnKeys:!0}),l.extend(r,t,null,{allOwnKeys:!0}),r.create=function(n){return sr(he(e,n))},r}const I=sr(Pe);I.Axios=me,I.CanceledError=Ce,I.CancelToken=To,I.isCancel=qt,I.VERSION=st,I.toFormData=ze,I.AxiosError=w,I.Cancel=I.CanceledError,I.all=function(e){return Promise.all(e)},I.spread=vo,I.isAxiosError=jo,I.mergeConfig=he,I.AxiosHeaders=z,I.formToJSON=e=>zt(l.isHTMLForm(e)?new FormData(e):e),I.getAdapter=rr.getAdapter,I.HttpStatusCode=lt,I.default=I;const{Axios:Uo,AxiosError:Mo,CanceledError:zo,isCancel:qo,CancelToken:$o,VERSION:Ho,all:Vo,Cancel:Wo,isAxiosError:Jo,spread:Xo,toFormData:Ko,AxiosHeaders:Yo,HttpStatusCode:Go,formToJSON:Zo,getAdapter:Qo,mergeConfig:es,create:ts}=I;function _o(e){if(e&&typeof e=="object"&&"code"in e&&"data"in e){const t=e;return t.code!==200?Promise.reject(new Error(t.message||"请求失败")):t.data}return e}function Ao(e,t={}){const{tokenKey:r="token",userInfoKey:n="userInfo",unauthorizedRedirect:o="/login"}=t;e.interceptors.request.use(s=>{const a=localStorage.getItem(r);return a&&(s.headers.Authorization=`Bearer ${a}`),s}),e.interceptors.response.use(s=>_o(s.data),s=>{var a,c,f;return((a=s.response)==null?void 0:a.status)===401?(localStorage.removeItem(r),localStorage.removeItem(n),window.location.href=o):((c=s.response)==null?void 0:c.status)===403?console.error("没有权限访问该资源"):((f=s.response)==null?void 0:f.status)===500&&console.error("服务器内部错误"),Promise.reject(s)})}function ct(e={}){const t=I.create({baseURL:e.baseURL??"/api",timeout:e.timeout??1e4});return Ao(t,{tokenKey:e.tokenKey,userInfoKey:e.userInfoKey,unauthorizedRedirect:e.unauthorizedRedirect}),t}ct();const ko=ct();class rs extends N.Component{constructor(t){super(t),Sr(this,"handleReset",()=>{this.setState({hasError:!1,error:null,errorInfo:null}),typeof this.props.onReset=="function"&&this.props.onReset()}),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,r){console.error("[ErrorBoundary] caught error:",t,r),this.setState({errorInfo:r})}render(){if(!this.state.hasError)return this.props.children;const{fallbackTitle:t="组件加载失败",fallbackDescription:r,showReload:n=!0}=this.props,o=this.state.error&&(this.state.error.message||String(this.state.error))||"未知错误";return Y.jsxs("div",{style:{padding:24,background:"#fff2f0",border:"1px solid #ffccc7",borderRadius:8,minHeight:200},children:[Y.jsx(u.Alert,{type:"error",showIcon:!0,icon:Y.jsx(L.BugOutlined,{}),message:t,description:Y.jsxs("div",{children:[Y.jsx("div",{style:{marginBottom:8},children:r||"当前组件发生了异常,已被错误边界捕获。其他功能仍可正常使用。"}),Y.jsx("div",{style:{fontFamily:"Menlo, Monaco, Consolas, monospace",fontSize:12,color:"#cf1322",background:"#fff",padding:8,borderRadius:4,border:"1px solid #ffccc7",wordBreak:"break-word",whiteSpace:"pre-wrap"},children:o})]})}),n&&Y.jsx(u.Space,{style:{marginTop:16},children:Y.jsx(u.Button,{icon:Y.jsx(L.ReloadOutlined,{}),onClick:this.handleReset,children:"重试"})})]})}}const{Title:ns,Text:os,Paragraph:ss}=u.Typography;let Po="/api";function ar(){return I.create({baseURL:Po,timeout:15e3})}const Co=ar();ar(),Co.interceptors.request.use(e=>{const t=localStorage.getItem("token");return t&&(e.headers.Authorization=`Bearer ${t}`),e});const{Header:as,Sider:is,Content:ls}=u.Layout,{Text:cs}=u.Typography,{Title:us,Text:fs}=u.Typography,{Option:ds}=u.Select,{TextArea:ps}=u.Input,No=[{type:"STRING",label:"字符串",icon:Y.jsx(L.FileTextOutlined,{}),color:"#1677ff",desc:"短文本 (默认 VARCHAR 255)"},{type:"TEXT",label:"长文本",icon:Y.jsx(L.FileTextOutlined,{}),color:"#13c2c2",desc:"TEXT 类型, 无长度限制"},{type:"INT",label:"整数",icon:"#",color:"#722ed1",desc:"INT 整数"},{type:"LONG",label:"长整数",icon:"#",color:"#722ed1",desc:"BIGINT 长整数"},{type:"DECIMAL",label:"小数",icon:"0.00",color:"#eb2f96",desc:"DECIMAL 精确小数"},{type:"BOOLEAN",label:"布尔",icon:Y.jsx(L.CheckCircleOutlined,{}),color:"#52c41a",desc:"TINYINT(1) 是/否"},{type:"DATE",label:"日期",icon:"📅",color:"#fa8c16",desc:"DATE yyyy-MM-dd"},{type:"DATETIME",label:"日期时间",icon:"🕐",color:"#fa8c16",desc:"DATETIME yyyy-MM-dd HH:mm:ss"},{type:"JSON",label:"JSON",icon:"{}",color:"#2f54eb",desc:"JSON 字符串"},{type:"REF",label:"引用",icon:"🔗",color:"#8c8c8c",desc:"外键引用 BIGINT"}];Object.fromEntries(No.map(e=>[e.type,e]));const{Option:hs}=u.Select;u.Input.TextArea,u.Input.TextArea;const{Text:ms,Paragraph:ys}=u.Typography,{TextArea:gs}=u.Input,{TextArea:bs}=u.Input,{Text:Es,Paragraph:ws}=u.Typography,{TextArea:Os}=u.Input,{Text:Rs,Paragraph:xs}=u.Typography,{Text:Ss}=u.Typography,{Text:Ts}=u.Typography,{TextArea:vs}=u.Input,{Text:js,Paragraph:_s}=u.Typography,{Text:As}=u.Typography,{Text:ks}=u.Typography,{Text:Ps}=u.Typography,{Text:Cs}=u.Typography,ie=ct("task"),J={listMyProjects:()=>ko.get("/project/user/list").then(e=>e.data),createProject:e=>ie.post("/project",e).then(t=>t.data),updateProject:(e,t)=>ie.put(`/project/${e}`,t).then(r=>r.data),archiveProject:e=>ie.put(`/project/${e}/archive`).then(t=>t.data),listTasksByProject:e=>ie.get("/task/project/list",{params:{projectId:e}}).then(t=>t.data),listTasksByList:e=>ie.get("/task/list",{params:{listId:e}}).then(t=>t.data),createTask:e=>ie.post("/task",e).then(t=>t.data),completeTask:e=>ie.post("/task/complete",null,{params:{taskId:e}}).then(t=>t.data),moveTask:(e,t,r)=>ie.put("/task/move",null,{params:{taskId:e,targetListId:t,position:r}}).then(n=>n.data)},ut=e=>{if(!e)return"-";const t=String(e),r=t.match(/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})/);return r?r[1]:t};function ft({apiBaseURL:e}){const[t,r]=N.useState([]),[n,o]=N.useState(!1),[s,a]=N.useState(!1),[c,f]=N.useState(null),[p,m]=N.useState(null),[b,S]=N.useState([]),[R,C]=N.useState(!1),[x]=u.Form.useForm(),F=async()=>{o(!0);try{const E=await J.listMyProjects();r((E==null?void 0:E.data)||E||[])}catch(E){u.message.error("加载项目失败: "+((E==null?void 0:E.message)||E))}finally{o(!1)}};N.useEffect(()=>{F()},[]);const y=async E=>{m(E),C(!0);try{const A=await J.listTasksByProject(E.id);S((A==null?void 0:A.data)||A||[])}catch(A){u.message.error("加载任务失败: "+((A==null?void 0:A.message)||A))}finally{C(!1)}},h=async()=>{if(p)try{const E=await J.listTasksByProject(p.id);S((E==null?void 0:E.data)||E||[])}catch(E){u.message.error("刷新任务失败: "+((E==null?void 0:E.message)||E))}},O=()=>{f(null),x.resetFields(),x.setFieldsValue({status:1}),a(!0)},k=E=>{f(E),x.setFieldsValue({name:E.name,description:E.description,status:E.status??1}),a(!0)},D=async()=>{try{const E=await x.validateFields();c?(await J.updateProject(c.id,E),u.message.success("项目已更新")):(await J.createProject(E),u.message.success("项目已创建")),a(!1),F()}catch(E){if(E!=null&&E.errorFields)return;u.message.error("保存失败: "+((E==null?void 0:E.message)||E))}},te=async E=>{try{await J.archiveProject(E),u.message.success("项目已归档"),F(),(p==null?void 0:p.id)===E&&(m(null),S([]))}catch(A){u.message.error("归档失败: "+((A==null?void 0:A.message)||A))}},ye=async E=>{try{await J.completeTask(E),u.message.success("任务已完成"),h()}catch(A){u.message.error("操作失败: "+((A==null?void 0:A.message)||A))}},ne=[{title:"项目名称",dataIndex:"name",render:(E,A)=>d.jsx("a",{onClick:()=>y(A),style:{fontWeight:(p==null?void 0:p.id)===A.id?600:400},children:E})},{title:"状态",dataIndex:"status",width:80,render:E=>E===1?d.jsx(u.Tag,{color:"green",children:"进行中"}):d.jsx(u.Tag,{children:"已归档"})},{title:"创建时间",dataIndex:"createdAt",width:170,render:ut},{title:"操作",width:160,fixed:"right",render:(E,A)=>d.jsxs(u.Space,{children:[d.jsx(u.Button,{size:"small",icon:d.jsx(L.EditOutlined,{}),onClick:()=>k(A),children:"编辑"}),d.jsx(u.Popconfirm,{title:"确定归档该项目?",onConfirm:()=>te(A.id),children:d.jsx(u.Button,{size:"small",danger:!0,icon:d.jsx(L.DeleteOutlined,{}),children:"归档"})})]})}],X=E=>{const $={0:{text:"待办",color:"default"},1:{text:"进行中",color:"blue"},2:{text:"已完成",color:"green"}}[E]||{text:String(E),color:"default"};return d.jsx(u.Tag,{color:$.color,children:$.text})};return d.jsxs("div",{children:[d.jsx("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:12},children:d.jsx(u.Button,{type:"primary",icon:d.jsx(L.PlusOutlined,{}),onClick:O,children:"新建项目"})}),d.jsxs("div",{style:{display:"flex",gap:16,height:"calc(100vh - 220px)"},children:[d.jsx(u.Card,{size:"small",title:d.jsxs(u.Space,{children:[d.jsx(L.InboxOutlined,{}),"项目管理"]}),style:{width:520,flexShrink:0},styles:{body:{padding:8,overflow:"auto",height:"calc(100% - 40px)"}},children:d.jsx(u.Table,{rowKey:"id",columns:ne,dataSource:t,loading:n,pagination:{pageSize:10,size:"small"},size:"small",rowClassName:E=>(p==null?void 0:p.id)===E.id?"ant-table-row-selected":"",onRow:E=>({onClick:()=>y(E),style:{cursor:"pointer"}}),locale:{emptyText:"暂无项目"}})}),d.jsx(u.Card,{size:"small",style:{flex:1,overflow:"auto"},styles:{body:{padding:16}},title:p?d.jsxs(u.Space,{children:[d.jsx(L.UnorderedListOutlined,{}),p.name," · 任务列表"]}):"项目详情",children:p?d.jsxs(u.Spin,{spinning:R,children:[d.jsxs(u.Descriptions,{size:"small",bordered:!0,column:2,style:{marginBottom:16},children:[d.jsx(u.Descriptions.Item,{label:"项目名称",span:2,children:p.name}),d.jsx(u.Descriptions.Item,{label:"描述",span:2,children:p.description||"无"}),d.jsx(u.Descriptions.Item,{label:"负责人",children:p.ownerId||"未指定"}),d.jsx(u.Descriptions.Item,{label:"状态",children:p.status===1?d.jsx(u.Tag,{color:"green",children:"进行中"}):d.jsx(u.Tag,{children:"已归档"})}),d.jsx(u.Descriptions.Item,{label:"创建时间",children:ut(p.createdAt)}),d.jsx(u.Descriptions.Item,{label:"项目ID",children:p.id})]}),d.jsx(u.List,{size:"small",header:d.jsxs("b",{children:["任务项 (",b.length,")"]}),bordered:!0,dataSource:b,locale:{emptyText:"该项目下暂无任务"},renderItem:E=>d.jsx(u.List.Item,{actions:[d.jsx(u.Button,{size:"small",type:"primary",icon:d.jsx(L.CheckOutlined,{}),disabled:E.status===2,onClick:()=>ye(E.id),children:"完成"},"complete")],children:d.jsx(u.List.Item.Meta,{title:d.jsxs(u.Space,{children:[E.title,X(E.status),d.jsxs(u.Tag,{children:["优先级 ",E.priority??"-"]})]}),description:d.jsxs("span",{style:{color:"#888",fontSize:12},children:["截止: ",ut(E.dueDate)," · ID: ",E.id]})})})})]}):d.jsx(u.Empty,{description:"请从左侧选择一个项目",style:{marginTop:80}})})]}),d.jsx(u.Drawer,{title:c?`编辑项目 - ${c.name}`:"新建项目",width:480,open:s,onClose:()=>a(!1),destroyOnHidden:!0,extra:d.jsxs(u.Space,{children:[d.jsx(u.Button,{onClick:()=>a(!1),children:"取消"}),d.jsx(u.Button,{type:"primary",onClick:D,children:"保存"})]}),children:d.jsxs(u.Form,{form:x,layout:"vertical",preserve:!1,children:[d.jsx(u.Form.Item,{name:"name",label:"项目名称",rules:[{required:!0,message:"请输入项目名称"}],children:d.jsx(u.Input,{placeholder:"例如: 一人公司"})}),d.jsx(u.Form.Item,{name:"description",label:"项目描述",children:d.jsx(u.Input.TextArea,{rows:3,placeholder:"可选"})}),d.jsx(u.Form.Item,{name:"status",label:"状态",initialValue:1,children:d.jsx(u.Select,{options:[{label:"进行中",value:1},{label:"已归档",value:0}]})})]})})]})}function dt({apiBaseURL:e}){const[t,r]=N.useState([]),[n,o]=N.useState(null),[s,a]=N.useState([]),[c,f]=N.useState(!1),[p,m]=N.useState(!1),[b]=u.Form.useForm(),S=async()=>{try{const h=await J.listMyProjects(),O=(h==null?void 0:h.data)||h||[];r(O),O.length>0&&!n&&o(O[0].id)}catch(h){u.message.error("加载项目失败: "+((h==null?void 0:h.message)||h))}},R=async h=>{if(!h){a([]);return}f(!0);try{const O=await J.listTasksByProject(h);a((O==null?void 0:O.data)||O||[])}catch(O){u.message.error("加载任务失败: "+((O==null?void 0:O.message)||O))}finally{f(!1)}};N.useEffect(()=>{S()},[]),N.useEffect(()=>{R(n)},[n]);const C=()=>{if(!n){u.message.warning("请先选择项目");return}b.resetFields(),b.setFieldsValue({projectId:n,listId:1,status:1,priority:1}),m(!0)},x=async()=>{try{const h=await b.validateFields();await J.createTask(h),u.message.success("任务已创建"),m(!1),R(n)}catch(h){if(h!=null&&h.errorFields)return;u.message.error("创建失败: "+((h==null?void 0:h.message)||h))}},F=async h=>{try{await J.completeTask(h),u.message.success("任务已完成"),R(n)}catch(O){u.message.error("操作失败: "+((O==null?void 0:O.message)||O))}},y=[{title:"ID",dataIndex:"id",width:60},{title:"标题",dataIndex:"title"},{title:"项目ID",dataIndex:"projectId",width:80},{title:"状态",dataIndex:"status",width:100,render:h=>{const O={0:"待办",1:"进行中",2:"已完成"},k={0:"default",1:"blue",2:"green"}[h]||"default";return d.jsx(u.Tag,{color:k,children:O[h]||h})}},{title:"优先级",dataIndex:"priority",width:80},{title:"截止时间",dataIndex:"dueDate",width:180},{title:"操作",width:200,fixed:"right",render:(h,O)=>d.jsx(u.Space,{children:d.jsx(u.Button,{size:"small",type:"primary",icon:d.jsx(L.CheckOutlined,{}),onClick:()=>F(O.id),disabled:O.status===2,children:"完成"})})}];return d.jsxs("div",{children:[d.jsx(u.Card,{title:"任务管理",extra:d.jsxs(u.Space,{children:[d.jsx("span",{children:"项目:"}),d.jsx(u.Select,{value:n,onChange:o,style:{width:240},placeholder:"选择项目",options:t.map(h=>({label:h.name,value:h.id}))}),d.jsx(u.Button,{type:"primary",icon:d.jsx(L.PlusOutlined,{}),onClick:C,children:"新建任务"})]}),children:d.jsx(u.Table,{rowKey:"id",columns:y,dataSource:s,loading:c,pagination:{pageSize:10}})}),d.jsx(u.Modal,{title:"新建任务",open:p,onCancel:()=>m(!1),onOk:x,destroyOnHidden:!0,children:d.jsxs(u.Form,{form:b,layout:"vertical",preserve:!1,children:[d.jsx(u.Form.Item,{name:"title",label:"任务标题",rules:[{required:!0,message:"请输入任务标题"}],children:d.jsx(u.Input,{placeholder:"例如: 实现 xx 功能"})}),d.jsx(u.Form.Item,{name:"projectId",label:"所属项目",rules:[{required:!0}],children:d.jsx(u.Select,{options:t.map(h=>({label:h.name,value:h.id})),placeholder:"从数据库捞出的项目列表"})}),d.jsx(u.Form.Item,{name:"listId",label:"列表ID",rules:[{required:!0}],children:d.jsx(u.Input,{type:"number",placeholder:"默认 1"})}),d.jsx(u.Form.Item,{name:"priority",label:"优先级",initialValue:1,children:d.jsx(u.Select,{options:[{label:"低",value:1},{label:"中",value:2},{label:"高",value:3}]})})]})})]})}function Io(){return d.jsxs(fe.Routes,{children:[d.jsx(fe.Route,{index:!0,element:d.jsx(fe.Navigate,{to:"project",replace:!0})}),d.jsx(fe.Route,{path:"project",element:d.jsx(ft,{})}),d.jsx(fe.Route,{path:"project/*",element:d.jsx(ft,{})}),d.jsx(fe.Route,{path:"task",element:d.jsx(dt,{})}),d.jsx(fe.Route,{path:"task/*",element:d.jsx(dt,{})})]})}U.ProjectList=ft,U.ProjectSelect=Or,U.TaskApp=Io,U.TaskCard=gr,U.TaskList=dt,U.TaskTable=wr,U.api=J,U.taskApi=J,Object.defineProperty(U,Symbol.toStringTag,{value:"Module"})}));
|