Files
FootPrint/sync-server/www/assets/GradesPage-Ij8UzdbZ.js
T

7 lines
20 KiB
JavaScript

import{c as R,f as I,j as e,E as O,w as $,u as N,d as f,r as u,g as v,x as H,y as W,B as b,P as q,C as L,z as J,A as T,D as U,m as k,l as F,T as z,I as g,F as Y,H as S,J as E,K as V}from"./index-CSVqyJB0.js";import{C,a as M,b as _}from"./card-BcMbz03g.js";import{u as X,i as Q,a as K}from"./useChart-CUy-j464.js";import{u as Z,i as ee,b as se,a as te,c as ae,d as re,e as ne,f as le}from"./echarts-BIWefrIc.js";/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ie=[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["line",{x1:"8",x2:"16",y1:"6",y2:"6",key:"x4nwl0"}],["line",{x1:"16",x2:"16",y1:"14",y2:"18",key:"wjye3r"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M8 18h.01",key:"lrp35t"}]],A=R("Calculator",ie);Z([ee,se,te,ae,re,ne,le]);function de(r){const s=/^(\d{4})-(\d{4})/.exec(r);return s?s[1]+"~"+s[2]+" 学年":"其他学期"}function oe(r){const s=r.filter(d=>d.grade_point!=null&&d.credit>0);if(!s.length)return null;const t=s.reduce((d,o)=>d+o.credit,0),i=s.reduce((d,o)=>d+o.grade_point*o.credit,0);return Math.round(i/t*100)/100}function fe(){const r=X(),s=I({queryKey:["grades"],queryFn:V}),t=s.data,i=Q("2"),d=Q("3"),o=K(()=>{const l=((t==null?void 0:t.overall.tier_dist)??[]).filter(a=>a.count>0);return{tooltip:{trigger:"item"},legend:{orient:"vertical",right:8,top:"middle",itemGap:10,textStyle:{color:i,fontSize:11},itemWidth:10,itemHeight:10},series:[{type:"pie",radius:["48%","72%"],center:["34%","50%"],label:{show:!1},data:l.map(a=>({name:a.label,value:a.count,itemStyle:{color:a.color}}))}]}},[t,r]),m=K(()=>{const l=(t==null?void 0:t.overall.gpa_trend)??[];return{grid:{left:8,right:8,top:36,bottom:6,containLabel:!0},tooltip:{trigger:"axis"},legend:{top:0,left:"center",itemGap:16,textStyle:{color:i,fontSize:11},itemWidth:14,itemHeight:8},xAxis:{type:"category",data:l.map(a=>a.term),axisLine:{lineStyle:{color:d}},axisTick:{show:!1},axisLabel:{color:d,fontSize:10}},yAxis:[{type:"value",min:0,max:100,splitLine:{lineStyle:{color:"rgba(128,138,155,0.15)"}},axisLabel:{color:d,fontSize:10}},{type:"value",min:0,max:5,splitLine:{show:!1},axisLabel:{color:d,fontSize:10}}],series:[{name:"加权平均分",type:"bar",barMaxWidth:18,itemStyle:{color:"#3056d3",borderRadius:[3,3,0,0]},data:l.map(a=>a.avg)},{name:"绩点",type:"line",yAxisIndex:1,smooth:!0,symbolSize:6,itemStyle:{color:"#d97706"},lineStyle:{width:2},data:l.map(a=>a.gpa)}]}},[t,r]);if(s.isLoading)return e.jsx("div",{className:"py-16 text-center text-[13px] text-ink-3",children:"加载中…"});const p=[...(t==null?void 0:t.semesters)??[]].sort((l,a)=>a.term.localeCompare(l.term));return e.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[e.jsxs("div",{className:"mb-4 flex flex-wrap gap-3",children:[e.jsx(w,{label:"总学分",value:(t==null?void 0:t.overall.credits)??0}),e.jsx(w,{label:"加权平均分",value:(t==null?void 0:t.overall.avg)!=null?t.overall.avg:"—"}),e.jsx(w,{label:"已录课程",value:(t==null?void 0:t.overall.courses)??0}),e.jsx(w,{label:"学期数",value:(t==null?void 0:t.semesters.length)??0})]}),e.jsxs("div",{className:"mb-4 grid grid-cols-1 lg:grid-cols-2 gap-4",children:[e.jsxs(C,{children:[e.jsx(M,{title:"单科成绩等级分布"}),e.jsx(_,{children:e.jsx("div",{ref:o,className:"h-[220px]"})})]}),e.jsxs(C,{children:[e.jsx(M,{title:"学期趋势(加权平均分 / 绩点)"}),e.jsx(_,{children:e.jsx("div",{ref:m,className:"h-[220px]"})})]})]}),e.jsx(xe,{bands:(t==null?void 0:t.bands)??[]}),e.jsxs("div",{className:"mb-3 mt-5 flex items-center justify-between",children:[e.jsx("h2",{className:"text-[14px] font-semibold text-ink-1",children:"学年学科成绩"}),e.jsx(je,{})]}),p.length?e.jsx("div",{className:"flex flex-col gap-5",children:ce(p).map(([l,a])=>e.jsxs("section",{children:[e.jsx("div",{className:"mb-2 text-[12px] font-medium text-ink-3",children:l}),e.jsx("div",{className:"flex flex-col gap-3",children:a.map(h=>e.jsx(ue,{sem:h},h.id))})]},l))}):e.jsx(C,{children:e.jsx(O,{icon:e.jsx($,{size:36,strokeWidth:1.5}),title:"暂无学期成绩",description:"新增一个学期(如 2024-2025-1),再录入各科成绩。"})})]})}function ce(r){const s=new Map;for(const t of r){const i=de(t.term);s.has(i)||s.set(i,[]),s.get(i).push(t)}return[...s.entries()]}function w({label:r,value:s}){return e.jsxs("div",{className:"min-w-[128px] flex-1 max-w-[220px] rounded-lg border border-line bg-surface px-4 py-3 shadow-card",children:[e.jsx("div",{className:"text-[12px] text-ink-3",children:r}),e.jsx("div",{className:"num mt-0.5 text-[22px] font-semibold leading-tight text-ink-1",children:s})]})}function xe({bands:r}){const s=N(),t=f(),[i,d]=u.useState(null),[o,m]=u.useState(null),p=v({mutationFn:H,onSuccess:()=>{t("success","梯度已保存"),s.invalidateQueries({queryKey:["grades"]})},onError:a=>t("error",a.message)}),l=v({mutationFn:W,onSuccess:()=>{s.invalidateQueries({queryKey:["grades"]}),m(null)}});return e.jsxs(C,{children:[e.jsx(M,{title:"成绩梯度",extra:e.jsx("span",{className:"text-[11px] text-ink-3",children:"按 分数 ≥ min 且 < max 定级,满分档含上限"})}),e.jsxs(_,{className:"p-0",children:[e.jsx("div",{className:"divide-y divide-line",children:r.map(a=>e.jsx(P,{band:a,onSave:h=>p.mutate(h),onDelete:()=>m(a)},a.id))}),e.jsx("div",{className:"border-t border-line px-4 py-2.5",children:i?e.jsx(P,{band:i,isNew:!0,onChange:d,onSave:()=>{p.mutate(i),d(null)},onCancel:()=>d(null)}):e.jsxs(b,{size:"sm",variant:"secondary",onClick:()=>{var a;return d({id:0,label:"",color:"#3056d3",min:0,max:60,sort:(((a=r.at(-1))==null?void 0:a.sort)??0)+10})},children:[e.jsx(q,{size:13})," 添加等级"]})})]}),e.jsx(L,{open:!!o,title:"删除等级",content:o?"确定删除「"+o.label+"」吗?已录成绩将不再显示该等级。":"",onCancel:()=>m(null),onOk:()=>o&&l.mutate(o.id)})]})}function P({band:r,onSave:s,onDelete:t,onChange:i,onCancel:d,isNew:o}){const[m,p]=u.useState(r),l=o&&i?m:r,a=x=>{const c={...l,...x};i?i(c):p(c)},h=o||JSON.stringify({...l,id:0})!==JSON.stringify({...r,id:0});return e.jsx("div",{className:"px-4 py-3",children:e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-2.5",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"color",value:l.color,onChange:x=>a({color:x.target.value}),className:"size-6 shrink-0 cursor-pointer rounded border border-line bg-surface","aria-label":"颜色"}),e.jsx(g,{className:"min-w-0 flex-1 sm:w-[96px] sm:flex-none",value:l.label,onChange:x=>a({label:x.target.value}),placeholder:"等级名"})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-1.5 rounded-md border border-line bg-surface-2 px-2.5 py-1",children:[e.jsx("span",{className:"text-[11px] text-ink-3",children:"分数"}),e.jsx(g,{type:"number",className:"num h-6 w-[64px] border-0 bg-transparent p-0 text-right",value:String(l.min),onChange:x=>a({min:Number(x.target.value)})}),e.jsx("span",{className:"text-[11.5px] text-ink-3",children:"—"}),e.jsx(g,{type:"number",className:"num h-6 w-[64px] border-0 bg-transparent p-0",value:String(l.max),onChange:x=>a({max:Number(x.target.value)})})]}),e.jsx("div",{className:"flex items-center gap-1.5 sm:ml-auto",children:o?e.jsxs(e.Fragment,{children:[e.jsx(b,{size:"sm",variant:"primary",onClick:()=>s==null?void 0:s(l),children:"添加"}),e.jsx(b,{size:"sm",variant:"ghost",onClick:()=>d==null?void 0:d(),children:"取消"})]}):e.jsxs(e.Fragment,{children:[e.jsx(b,{size:"sm",variant:h?"primary":"secondary",disabled:!h,onClick:()=>s==null?void 0:s(l),children:"保存"}),e.jsx(b,{size:"icon-sm",variant:"ghost","aria-label":"删除等级",onClick:()=>t==null?void 0:t(),children:e.jsx(z,{size:13})})]})})]})})}function ue({sem:r}){const s=N(),t=f(),[i,d]=u.useState(null),[o,m]=u.useState(null),[p,l]=u.useState(!1),a=()=>void s.invalidateQueries({queryKey:["grades"]}),h=v({mutationFn:J,onSuccess:()=>{a(),m(null)}}),x=v({mutationFn:()=>{const n=oe(r.courses);if(n==null)throw new Error("请先为课程填写绩点");return T({id:r.id,term:r.term,gpa:n,rank:r.rank??null,total_students:r.total_students??null})},onSuccess:()=>{t("success","绩点已按课程自动计算"),a()},onError:n=>t("error",n.message)}),c=v({mutationFn:()=>U(r.id),onSuccess:()=>{a(),l(!1),t("success","学期已删除")}});return e.jsxs(C,{children:[e.jsxs("div",{className:"flex min-h-11 flex-col items-start justify-center gap-1.5 border-b border-line px-4 py-2 sm:flex-row sm:items-center sm:justify-between sm:gap-2",children:[e.jsx("h3",{className:"text-[13px] font-semibold text-ink-1",children:r.term}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[e.jsxs(k,{color:"var(--brand-text)",children:["绩点 ",r.gpa??"—"]}),r.rank!=null&&e.jsxs(k,{color:"var(--success)",children:["排名 ",r.rank,"/",r.total_students??"—"]}),e.jsxs(k,{color:"var(--text-3)",children:["均分 ",r.stats.avg??"—"]}),e.jsxs(k,{color:"var(--text-3)",children:[r.stats.credits," 学分"]}),e.jsxs(b,{size:"sm",variant:"ghost",onClick:()=>x.mutate(),disabled:x.isPending,children:[e.jsx(A,{size:13})," 自动绩点"]}),e.jsx(b,{size:"icon-sm",variant:"ghost","aria-label":"编辑学期",onClick:()=>l(!0),children:e.jsx(F,{size:13})})]})]}),e.jsx(_,{className:"p-0",children:e.jsx("div",{className:"hidden overflow-x-auto md:block",children:e.jsx("div",{className:"-mx-1 overflow-x-auto px-1",children:e.jsxs("table",{className:"w-full border-collapse text-[13px]",children:[e.jsx("thead",{children:e.jsx("tr",{children:["课程","学分","分数","等级","绩点",""].map(n=>e.jsx("th",{className:"border-b border-line bg-surface-2 px-3 py-2 text-left text-[12px] font-semibold text-ink-3",children:n},n))})}),e.jsxs("tbody",{children:[r.courses.map(n=>i===n.id?e.jsx(pe,{sem:r,course:n,onDone:()=>d(null)},n.id):e.jsxs("tr",{className:"transition-colors hover:bg-surface-2",children:[e.jsx("td",{className:"border-b border-line px-3 py-2 font-medium text-ink-1",children:n.course_name}),e.jsx("td",{className:"num border-b border-line px-3 py-2 text-ink-2",children:n.credit}),e.jsx("td",{className:"num border-b border-line px-3 py-2",children:n.score!=null?e.jsx("span",{className:"font-medium",children:n.score}):e.jsx("span",{className:"text-ink-3",children:"未录入"})}),e.jsx("td",{className:"border-b border-line px-3 py-2",children:n.band?e.jsx(k,{color:n.band.color,children:n.band.label}):e.jsx("span",{className:"text-ink-3",children:"—"})}),e.jsx("td",{className:"num border-b border-line px-3 py-2 text-ink-2",children:n.grade_point??"—"}),e.jsx("td",{className:"border-b border-line px-3 py-2",children:e.jsxs("div",{className:"flex justify-end gap-1",children:[e.jsx(b,{size:"icon-sm",variant:"ghost","aria-label":"编辑课程",onClick:()=>d(n.id),children:e.jsx(F,{size:13})}),e.jsx(b,{size:"icon-sm",variant:"ghost","aria-label":"删除课程",className:"text-ink-3 hover:text-danger",onClick:()=>m(n),children:e.jsx(z,{size:13})})]})})]},n.id)),e.jsx(me,{sem:r})]})]})})})}),e.jsxs("div",{className:"divide-y divide-line border-t border-line md:hidden",children:[r.courses.map(n=>i===n.id?e.jsx(ge,{sem:r,course:n,onDone:()=>d(null)},"e"+n.id):e.jsxs("div",{className:"p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"min-w-0 flex-1 truncate text-[13px] font-medium text-ink-1",children:n.course_name}),n.band&&e.jsx(k,{color:n.band.color,children:n.band.label})]}),e.jsxs("div",{className:"num mt-1 flex flex-wrap gap-x-3 text-[11.5px] text-ink-3",children:[e.jsxs("span",{children:["学分 ",n.credit]}),e.jsxs("span",{children:["分数 ",n.score??"—"]}),e.jsxs("span",{children:["绩点 ",n.grade_point??"—"]})]}),e.jsxs("div",{className:"mt-2 flex gap-1.5",children:[e.jsxs(b,{size:"sm",variant:"secondary",onClick:()=>d(n.id),children:[e.jsx(F,{size:12})," 编辑"]}),e.jsxs(b,{size:"sm",variant:"ghost",className:"text-ink-3 hover:text-danger",onClick:()=>m(n),children:[e.jsx(z,{size:12})," 删除"]})]})]},n.id)),e.jsx(he,{sem:r})]}),e.jsx(L,{open:!!o,title:"删除课程",content:o?"确定删除「"+o.course_name+"」吗?":"",onCancel:()=>m(null),onOk:()=>o&&h.mutate(o.id)}),e.jsx(B,{open:p,sem:r,onClose:()=>l(!1),deleteMut:c})]})}function me({sem:r}){const s=N(),t=f(),[i,d]=u.useState(""),[o,m]=u.useState(""),[p,l]=u.useState(""),[a,h]=u.useState(""),x=v({mutationFn:()=>E({semester_id:r.id,course_name:i,credit:Number(o)||0,score:p===""?null:Number(p),grade_point:a===""?null:Number(a)}),onSuccess:()=>{d(""),m(""),l(""),h(""),s.invalidateQueries({queryKey:["grades"]})},onError:c=>t("error",c.message)});return e.jsxs("tr",{className:"bg-surface-2",children:[e.jsx("td",{className:"px-3 py-2",children:e.jsx(g,{className:"h-7 w-[160px]",placeholder:"课程名称",value:i,onChange:c=>d(c.target.value)})}),e.jsx("td",{className:"px-3 py-2",children:e.jsx(g,{type:"number",step:"0.5",className:"num h-7 w-[64px]",placeholder:"0",value:o,onChange:c=>m(c.target.value)})}),e.jsx("td",{className:"px-3 py-2",children:e.jsx(g,{type:"number",className:"num h-7 w-[72px]",placeholder:"0-100",value:p,onChange:c=>l(c.target.value)})}),e.jsx("td",{className:"px-3 py-2 text-ink-3",children:"—"}),e.jsx("td",{className:"px-3 py-2",children:e.jsx(g,{type:"number",step:"0.1",className:"num h-7 w-[64px]",placeholder:"选填",value:a,onChange:c=>h(c.target.value)})}),e.jsx("td",{className:"px-3 py-2",children:e.jsxs(b,{size:"sm",variant:"secondary",disabled:!i.trim()||x.isPending,onClick:()=>x.mutate(),children:[e.jsx(q,{size:13})," 添加"]})})]})}function pe({sem:r,course:s,onDone:t}){const i=N(),d=f(),[o,m]=u.useState(s.course_name),[p,l]=u.useState(String(s.credit)),[a,h]=u.useState(s.score!=null?String(s.score):""),[x,c]=u.useState(s.grade_point!=null?String(s.grade_point):""),n=v({mutationFn:()=>E({id:s.id,semester_id:r.id,course_name:o,credit:Number(p)||0,score:a===""?null:Number(a),grade_point:x===""?null:Number(x)}),onSuccess:()=>{i.invalidateQueries({queryKey:["grades"]}),t()},onError:j=>d("error",j.message)});return e.jsxs("tr",{className:"bg-brand-subtle/40",children:[e.jsx("td",{className:"border-b border-line px-3 py-2",children:e.jsx(g,{className:"h-7 w-[160px]",value:o,onChange:j=>m(j.target.value)})}),e.jsx("td",{className:"border-b border-line px-3 py-2",children:e.jsx(g,{type:"number",step:"0.5",className:"num h-7 w-[64px]",value:p,onChange:j=>l(j.target.value)})}),e.jsx("td",{className:"border-b border-line px-3 py-2",children:e.jsx(g,{type:"number",className:"num h-7 w-[72px]",value:a,onChange:j=>h(j.target.value)})}),e.jsx("td",{className:"border-b border-line px-3 py-2 text-[12px] text-ink-3",children:"保存后按梯度定级"}),e.jsx("td",{className:"border-b border-line px-3 py-2",children:e.jsx(g,{type:"number",step:"0.1",className:"num h-7 w-[64px]",value:x,onChange:j=>c(j.target.value)})}),e.jsx("td",{className:"border-b border-line px-3 py-2",children:e.jsxs("div",{className:"flex justify-end gap-1.5",children:[e.jsx(b,{size:"sm",variant:"primary",onClick:()=>n.mutate(),disabled:n.isPending,children:"保存"}),e.jsx(b,{size:"sm",variant:"ghost",onClick:t,children:"取消"})]})})]})}function he({sem:r}){const s=N(),t=f(),[i,d]=u.useState(""),[o,m]=u.useState(""),[p,l]=u.useState(""),[a,h]=u.useState(""),x=v({mutationFn:()=>E({semester_id:r.id,course_name:i,credit:Number(o)||0,score:p===""?null:Number(p),grade_point:a===""?null:Number(a)}),onSuccess:()=>{d(""),m(""),l(""),h(""),s.invalidateQueries({queryKey:["grades"]}),t("success","课程已添加")},onError:c=>t("error",c.message)});return e.jsxs("div",{className:"p-3",children:[e.jsx(g,{className:"mb-2",placeholder:"课程名称",value:i,onChange:c=>d(c.target.value)}),e.jsxs("div",{className:"mb-2 grid grid-cols-3 gap-2",children:[e.jsx(g,{type:"number",step:"0.5",placeholder:"学分",value:o,onChange:c=>m(c.target.value)}),e.jsx(g,{type:"number",placeholder:"分数",value:p,onChange:c=>l(c.target.value)}),e.jsx(g,{type:"number",step:"0.1",placeholder:"绩点",value:a,onChange:c=>h(c.target.value)})]}),e.jsxs(b,{size:"sm",variant:"primary",disabled:!i.trim()||x.isPending,onClick:()=>x.mutate(),children:[e.jsx(q,{size:13})," 添加课程"]})]})}function ge({sem:r,course:s,onDone:t}){const i=N(),d=f(),[o,m]=u.useState(s.course_name),[p,l]=u.useState(String(s.credit)),[a,h]=u.useState(s.score!=null?String(s.score):""),[x,c]=u.useState(s.grade_point!=null?String(s.grade_point):""),n=v({mutationFn:()=>E({id:s.id,semester_id:r.id,course_name:o,credit:Number(p)||0,score:a===""?null:Number(a),grade_point:x===""?null:Number(x)}),onSuccess:()=>{i.invalidateQueries({queryKey:["grades"]}),t()},onError:j=>d("error",j.message)});return e.jsxs("div",{className:"bg-brand-subtle/40 p-3",children:[e.jsx(g,{className:"mb-2",placeholder:"课程名称",value:o,onChange:j=>m(j.target.value)}),e.jsxs("div",{className:"mb-2 grid grid-cols-3 gap-2",children:[e.jsx(g,{type:"number",step:"0.5",placeholder:"学分",value:p,onChange:j=>l(j.target.value)}),e.jsx(g,{type:"number",placeholder:"分数",value:a,onChange:j=>h(j.target.value)}),e.jsx(g,{type:"number",step:"0.1",placeholder:"绩点",value:x,onChange:j=>c(j.target.value)})]}),e.jsxs("div",{className:"flex gap-1.5",children:[e.jsx(b,{size:"sm",variant:"primary",onClick:()=>n.mutate(),children:"保存"}),e.jsx(b,{size:"sm",variant:"ghost",onClick:t,children:"取消"})]})]})}function je(){const[r,s]=u.useState(!1);return e.jsxs(e.Fragment,{children:[e.jsxs(b,{variant:"primary",size:"md",onClick:()=>s(!0),children:[e.jsx(q,{size:14})," 新增学期"]}),e.jsx(B,{open:r,sem:null,onClose:()=>s(!1)})]})}function B({open:r,sem:s,onClose:t,deleteMut:i}){const d=N(),o=f(),[m,p]=u.useState((s==null?void 0:s.term)??""),[l,a]=u.useState((s==null?void 0:s.gpa)!=null?String(s.gpa):""),[h,x]=u.useState((s==null?void 0:s.rank)!=null?String(s.rank):""),[c,n]=u.useState((s==null?void 0:s.total_students)!=null?String(s.total_students):""),[j,D]=u.useState(""),G=v({mutationFn:()=>T({id:s==null?void 0:s.id,term:m,gpa:l===""?null:Number(l),rank:h===""?null:Number(h),total_students:c===""?null:Number(c)}),onSuccess:()=>{o("success",s?"学期已更新":"学期已新增"),d.invalidateQueries({queryKey:["grades"]}),t()},onError:y=>D(y.message)});return e.jsx(Y,{open:r,onClose:t,width:480,title:s?"编辑学期 · "+s.term:"新增学期",footer:e.jsxs(e.Fragment,{children:[j&&e.jsx("span",{className:"mr-auto text-[12px] text-danger",children:j}),s&&e.jsxs(b,{variant:"danger-ghost",className:"mr-auto",onClick:()=>i==null?void 0:i.mutate(),disabled:i==null?void 0:i.isPending,children:[e.jsx(z,{size:13})," 删除学期"]}),e.jsx(b,{variant:"secondary",onClick:t,children:"取消"}),e.jsx(b,{variant:"primary",onClick:()=>G.mutate(),disabled:G.isPending,children:"保存"})]}),children:e.jsxs("div",{className:"flex flex-col gap-3.5",children:[e.jsx(S,{label:"学期名称",required:!0,hint:"如 2024-2025-1",children:e.jsx(g,{value:m,onChange:y=>p(y.target.value),placeholder:"2024-2025-1"})}),e.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[e.jsx(S,{label:"绩点",children:e.jsx(g,{type:"number",step:"0.01",className:"num",value:l,onChange:y=>a(y.target.value),placeholder:"选填"})}),e.jsx(S,{label:"排名",children:e.jsx(g,{type:"number",className:"num",value:h,onChange:y=>x(y.target.value),placeholder:"选填"})}),e.jsx(S,{label:"年级人数",children:e.jsx(g,{type:"number",className:"num",value:c,onChange:y=>n(y.target.value),placeholder:"选填"})})]}),e.jsxs("p",{className:"flex items-start gap-1.5 rounded-md bg-surface-2 px-3 py-2 text-[12px] text-ink-3",children:[e.jsx(A,{size:13,className:"mt-0.5 shrink-0"}),"绩点可手动填写,也可在卡片上点「自动绩点」按课程学分加权计算。"]})]})})}export{fe as GradesPage};