You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1 line
8.3 KiB

4 weeks ago
import{$t as e,C as t,D as n,Et as r,O as i,Q as a,S as o,T as s,Y as c,Z as l,_ as u,_t as d,at as f,ct as p,in as m,k as h,q as g,st as _,w as v,x as y}from"./vue.runtime.esm-bundler-CACvpnko.js";import{C as b,h as x,m as S}from"./index-D5exsJys.js";import{t as C}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{s as w}from"./competitions-Cv_Vb4Fy.js";import{t as T}from"./adminCompetition-D_kJwSx5.js";import{a as E,c as D,i as O,n as k,o as ee,s as te,t as ne}from"./reviewerScopes-CAv40o5e.js";var re={class:`proto-reviewer-page admin-desktop-page`},ie={key:1,class:`reviewer-manage-shell`},ae={class:`reviewer-track-panel`},oe={class:`reviewer-track-tabs`},se=[`onClick`],ce={class:`reviewer-track-tab-name`},le={class:`reviewer-track-tab-count`},ue={class:`reviewer-editor-panel`},de={class:`reviewer-editor-head`},A={class:`reviewer-track-title`},j={class:`reviewer-track-meta mb-0`},M={class:`reviewer-editor-actions`},N=[`disabled`],P={class:`table-responsive`},F={key:0,class:`table table-sm align-middle mb-0 reviewer-manage-table`},I={class:`text-end reviewer-row-actions`},L=[`onClick`],R=[`onClick`],z={key:1,class:`empty-hint`},B=C(h({__name:`ReviewerManageView`,setup(h){let{selectedCompetitionId:C}=b(T()),B=d([]),V=d({}),H=d(null),U=d([]),W=d(!1),G=d(!1),K=d(!1),q=d(`create`),J=d(!1),Y=d(null),X=d(),Z=d({name:``,mobile:``,username:``,password:``}),fe={name:[{required:!0,message:`请填写姓名`,trigger:`blur`}],username:[{required:!0,message:`请填写账户`,trigger:`blur`},{pattern:/^[A-Za-z0-9._-]+$/,message:`仅字母、数字、点、横线或下划线`,trigger:`blur`}],password:[{validator:(e,t,n)=>{if(q.value===`create`&&(!t||String(t).trim()===``)){n(Error(`请填写密码`));return}if(t&&String(t).trim().length>0&&String(t).length<6){n(Error(`密码不少于 6 位`));return}n()},trigger:`blur`}]},pe=y(()=>B.value.find(e=>e.track_code===H.value)?.title??``),me=y(()=>`已配置 ${H.value?V.value[H.value]??0:0} 名评审员`);async function he(){let e=C.value;if(W.value=!0,!e){B.value=[],V.value={},H.value=null,W.value=!1;return}try{if(B.value=(await w(e)).filter(e=>e.is_enabled).sort((e,t)=>e.sort-t.sort),!B.value.length){H.value=null,V.value={};return}(!H.value||!B.value.some(e=>e.track_code===H.value))&&(H.value=B.value[0]?.track_code??null),V.value=await O(e)}catch(e){B.value=[],x.warning(e instanceof Error?e.message:`赛道加载失败`)}finally{W.value=!1}}async function Q(){let e=C.value,t=H.value;if(!e||!t){U.value=[];return}G.value=!0;try{U.value=(await E({competition_id:e,track_code:t,page:1,per_page:500})).data,V.value=await O(e)}catch(e){U.value=[],x.error(e instanceof Error?e.message:`加载失败`)}finally{G.value=!1}}function ge(e){H.value=e}f(C,()=>{H.value=null,he().then(()=>Q())},{immediate:!0}),f(H,()=>{Q()});function $(e){return e.reviewer?.password_display??`—`}function _e(e){let t=e.reviewer?.mobile;return t&&String(t).trim()!==``?String(t):`—`}function ve(){q.value=`create`,Y.value=null,Z.value={name:``,mobile:``,username:``,password:``},K.value=!0}function ye(e){q.value=`edit`,Y.value=e.reviewer_id;let t=e.reviewer;Z.value={name:t?.name??``,mobile:t?.mobile??``,username:t?.username??``,password:``},K.value=!0}async function be(){if(!X.value)return;let e=C.value,t=H.value;!e||!t||await X.value.validate(async n=>{if(n){J.value=!0;try{if(q.value===`create`){let n=0;try{n=(await ee({name:Z.value.name.trim(),username:Z.value.username.trim(),password:Z.value.password,mobile:Z.value.mobile.trim()||null})).id}catch(e){x.error(e instanceof Error?e.message:`创建评审员失败`),J.value=!1;return}try{await ne({reviewer_id:n,competition_id:e,track_code:t})}catch(e){try{await te(n)}catch{}x.error(e instanceof Error?e.message:`绑定赛道失败`),J.value=!1;return}x.success(`评审员信息已保存`)}else{let e=Y.value;await D(e,{name:Z.value.name.trim(),username:Z.value.username.trim(),mobile:Z.value.mobile.trim()||null,...Z.value.password.trim()?{password:Z.value.password.trim()}:{}}),x.success(`评审员信息已更新`)}K.value=!1,await Q(),e&&(V.value=await O(e))}catch(e){x.error(e ins