PageSourceSearch

https://ifou.org/assets/js/Management-DBGDHFM1.js

js ifou.org collected 2026-10-02 10:30:18 UTC 12,599 bytes, 1 lines download raw bytes

1import{d as ae,a as $,r as D,c as le,H as oe,o as ie,O as V,n as ne,b as re,e as n,h as t,j as _,B as o,u as v,x as y,l as p,D as b,J as I,v as O,y as N,P as T,F,E as L,w as z,k as J,f as r,i as de,Q as R,_ as ue}from"./index-Cm0vBBJt.js";import{S as ce}from"./Searchbar-CY3yfapv.js";import{B as pe}from"./BottomFooter-C1mm2OWJ.js";import{z as me}from"./zhangye-Bl8efja4.js";import{t as ve}from"./thu-b6l7Fstr.js";import{u as fe,a as ge}from"./content-CsHua6Vq.js";import"./YA2024S501-DMeqSgJh.js";import"./tudelft-C6oR4_VF.js";const De={class:"management-container"},he={class:"search-container"},_e={class:"management-header"},ye={class:"user-info"},be=["src"],we={class:"user-details"},Se={class:"display-name"},ke={class:"email"},Pe={class:"tab-section"},Ce={class:"view-toggle"},Me={class:"publish-section"},Ve={class:"publish-content"},Fe={class:"form-group"},Ue={key:0,class:"error-message"},Ee={class:"form-group"},Ie={class:"date-range"},Oe={class:"date-input"},Ne={key:0,class:"error-message"},Le={class:"date-input"},Ye={key:0,class:"error-message"},xe={class:"form-group"},Ae={class:"form-group"},Be={class:"file-upload"},$e={class:"custom-file-upload"},Te={key:0,class:"file-list"},ze=["onClick"],Je={class:"preview-section"},Re={class:"preview-card"},Qe={class:"preview-image"},je=["src"],qe={class:"preview-content"},He={class:"preview-date"},Ge={class:"preview-description"},Ke={key:0,class:"preview-files"},We={class:"published-list"},Xe={class:"list-container"},Ze={class:"item-preview"},et=["src","alt"],tt={class:"item-info"},st={class:"date"},at={class:"description"},lt={key:0,class:"preview-files"},ot=["onClick"],it={class:"item-actions"},nt=["onClick"],rt=["onClick"],dt={class:"opportunity-management"},ut={class:"opportunity-list"},ct={class:"opportunity-preview"},pt={class:"opportunity-image"},mt=["src","alt"],vt={class:"opportunity-info"},ft={class:"institution"},gt={key:0,class:"department"},Dt={key:1,class:"date"},ht={key:2,class:"date"},_t={class:"description"},yt={class:"opportunity-actions"},bt={key:0,class:"empty-state"},wt={class:"pdf-container"},St=["src"],kt=ae({__name:"Management",setup(Pt){const Q=ne(),m=fe(),S=ge(),l=$({title:"",startDate:"",endDate:"",description:"",files:[],url:""}),k=D(""),Y=D(null),c=D([]),u=D("publish"),x=D(""),P=D(!1),h=D(""),d=$({title:"",image:"",startDate:"",endDate:""}),j=a=>{var e;return m.isAdmin?!0:a.createdBy===((e=m.currentUser)==null?void 0:e.username)},A=()=>{d.title="",d.image="",d.startDate="",d.endDate=""},q=()=>{A();let a=!0;return l.title.trim()||(d.title="Please enter a title",a=!1),k.value||(d.image="Please upload a cover image",a=!1),l.startDate||(d.startDate="Please select a start date",a=!1),l.endDate||(d.endDate="Please select an end date",a=!1),a},H=()=>{var e;if(!q())return;const a={id:`opp_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,title:l.title,startDate:l.startDate,endDate:l.endDate,description:l.description,image:k.value,files:l.files.map(i=>({name:i.name,type:i.type,size:i.size})),createdBy:((e=m.currentUser)==null?void 0:e.username)||"unknown",createdAt:new Date().toISOString()};try{c.value.unshift(a),localStorage.setItem("opportunities",JSON.stringify(c.value)),window.dispatchEvent(new StorageEvent("storage",{key:"opportunities",newValue:JSON.stringify(c.value),oldValue:localStorage.getItem("opportunities"),storageArea:localStorage})),l.title="",l.startDate="",l.endDate="",l.description="",l.files=[],k.value="",Y.value&&(Y.value.value=""),A(),u.value="published"}catch(i){i instanceof Error&&i.name==="QuotaExceededError"?alert("Storage space insufficient, please delete some old content and try again"):alert("Save failed. Please try again.")}},G=a=>{const e=c.value[a];l.title=e.title,l.startDate=e.startDate,l.endDate=e.endDate,l.description=e.description,k.value=e.image,l.files=e.files.map(i=>new File([],i.name,{type:i.type})),c.value.splice(a,1),localStorage.setItem("opportunities",JSON.stringify(c.value)),window.dispatchEvent(new StorageEvent("storage",{key:"opportunities",newValue:JSON.stringify(c.value),oldValue:localStorage.getItem("opportunities"),storageArea:localStorage})),u.value="publish"},K=a=>{R.confirm("Are you sure you want to delete this item?","Delete Confirmation",{confirmButtonText:"Delete",cancelButtonText:"Cancel",type:"warning"}).then(()=>{c.value.splice(a,1),localStorage.setItem("opportunities",JSON.stringify(c.value)),window.dispatchEvent(new StorageEvent("storage",{key:"opportunities",newValue:JSON.stringify(c.value),oldValue:localStorage.getItem("opportunities"),storageArea:localStorage}))}).catch(()=>{})},g=a=>{const e={year:"numeric",month:"long",day:"numeric"};return new Date(a).toLocaleDateString("en-US",e)},B=a=>{if(a.type==="application/pdf"){const e=localStorage.getItem(`pdf_${a.name}`);e?(h.value=e,P.value=!0):alert("PDF file not found")}},W=()=>{P.value=!1,h.value=""},X=a=>{const e=a.target;if(e.files){const i=e.files[0];if(i)if(i.type==="application/pdf"){if(i.size>5*1024*1024){alert("The size of the PDF file must not exceed 5MB."),e&&(e.value="");return}const w=new FileReader;w.onload=C=>{var s;const M=(s=C.target)==null?void 0:s.result;try{localStorage.setItem(`pdf_${i.name}`,M),l.files=[{name:i.name,type:i.type,size:i.size}]}catch{alert("Failed to save PDF file. Please try again.")}},w.onerror=()=>{alert("Failed to read PDF file. Please try again.")},w.readAsDataURL(i)}else alert("Please select a PDF file"),e&&(e.value="")}},Z=a=>{l.files.splice(a,1)},ee=a=>a.logoPreview?a.logoPreview:a.logo,U=a=>a?/^\d{4}-\d{2}-\d{2}$/.test(a):!1,te=async a=>{try{await R.confirm("Are you sure you want to delete this opportunity?","Delete Confirmation",{confirmButtonText:"Delete",cancelButtonText:"Cancel",type:"warning"}),S.removeOpportunity(a),V.success("Opportunity deleted successfully")}catch{}},se=le(()=>{if(!x.value)return c.value;const a=x.value.toLowerCase();return c.value.filter(e=>e.title.toLowerCase().includes(a)||e.description.toLowerCase().includes(a))});return oe(u,a=>{a==="opportunities"&&!m.isAdmin&&(u.value="publish",V.warning("Opportunity Management is only available for administrators"))}),ie(()=>{if(!m.isLoggedIn){V.error("Please login first"),Q.push("/");return}u.value==="opportunities"&&!m.isAdmin&&(u.value="publish",V.warning("Opportunity Management is only available for administrators")),S.loadData();const a=localStorage.getItem("opportunities");if(a)try{c.value=JSON.parse(a)}catch{localStorage.removeItem("opportunities"),c.value=[]}}),re(()=>{h.value&&URL.revokeObjectURL(h.value)}),(a,e)=>{var C,M;const i=J("el-button"),w=J("el-dialog");return r(),n(F,null,[t("div",De,[t("div",he,[_(ce)]),t("div",_e,[t("h1",
1null,o(v(m).isAdmin?"Management":"Opportunity Publishing"),1),t("div",ye,[t("img",{src:v(me),alt:"User Avatar",class:"user-avatar"},null,8,be),t("div",we,[t("span",Se,o(((C=v(m).currentUser)==null?void 0:C.displayName)||"User"),1),t("span",ke,o(((M=v(m).currentUser)==null?void 0:M.email)||"[email protected]"),1)])])]),t("div",Pe,[t("div",Ce,[t("button",{class:b(["toggle-btn",{active:u.value==="publish"}]),onClick:e[0]||(e[0]=s=>u.value="publish")},e[10]||(e[10]=[t("h4",null,"Publish New",-1)]),2),t("button",{class:b(["toggle-btn",{active:u.value==="published"}]),onClick:e[1]||(e[1]=s=>u.value="published")},e[11]||(e[11]=[t("h4",null,"Published List",-1)]),2),v(m).isAdmin?(r(),n("button",{key:0,class:b(["toggle-btn",{active:u.value==="opportunities"}]),onClick:e[2]||(e[2]=s=>u.value="opportunities")},e[12]||(e[12]=[t("h4",null,"Opportunity Management",-1)]),2)):p("",!0)]),y(t("div",Me,[e[23]||(e[23]=t("h2",null,"Publish New Opportunity",-1)),t("div",Ve,[t("form",{onSubmit:O(H,["prevent"]),class:"publish-form",novalidate:""},[t("div",Fe,[e[13]||(e[13]=t("label",null,"Title *",-1)),y(t("input",{type:"text","onUpdate:modelValue":e[3]||(e[3]=s=>l.title=s),placeholder:"Enter title",class:b({error:d.title}),novalidate:""},null,2),[[N,l.title]]),d.title?(r(),n("span",Ue,o(d.title),1)):p("",!0)]),t("div",Ee,[e[16]||(e[16]=t("label",null,"Time *",-1)),t("div",Ie,[t("div",Oe,[e[14]||(e[14]=t("label",null,"Start Date",-1)),_(v(T),{modelValue:l.startDate,"onUpdate:modelValue":e[4]||(e[4]=s=>l.startDate=s),type:"date",placeholder:"Select start date",format:"MMMM D, YYYY","value-format":"YYYY-MM-DD",clearable:!1,class:b({error:d.startDate}),novalidate:""},null,8,["modelValue","class"]),d.startDate?(r(),n("span",Ne,o(d.startDate),1)):p("",!0)]),t("div",Le,[e[15]||(e[15]=t("label",null,"End Date",-1)),_(v(T),{modelValue:l.endDate,"onUpdate:modelValue":e[5]||(e[5]=s=>l.endDate=s),type:"date",placeholder:"Select end date",format:"MMMM D, YYYY","value-format":"YYYY-MM-DD",clearable:!1,class:b({error:d.endDate}),novalidate:""},null,8,["modelValue","class"]),d.endDate?(r(),n("span",Ye,o(d.endDate),1)):p("",!0)])])]),t("div",xe,[e[17]||(e[17]=t("label",null,"Description",-1)),y(t("textarea",{"onUpdate:modelValue":e[6]||(e[6]=s=>l.description=s),placeholder:"Enter detailed description",rows:"4"},null,512),[[N,l.description]])]),t("div",Ae,[e[20]||(e[20]=t("label",null,"Related File or URL address",-1)),y(t("input",{type:"url","onUpdate:modelValue":e[7]||(e[7]=s=>l.url=s),placeholder:"Enter URL (e.g. https://example.com)",class:"url-input"},null,512),[[N,l.url]]),t("div",Be,[t("div",$e,[t("input",{type:"file",onChange:X,ref:"fileInput",accept:".pdf",class:"file-input",id:"related-files"},null,544),e[18]||(e[18]=t("label",{for:"related-files",class:"file-label"},[t("span",{class:"file-text"},"Choose PDF File")],-1))]),l.files.length?(r(),n("div",Te,[(r(!0),n(F,null,L(l.files,(s,f)=>(r(),n("div",{key:f,class:"file-item"},[t("span",null,o(s.name),1),t("button",{type:"button",onClick:E=>Z(f),class:"remove-btn"},"×",8,ze)]))),128))])):p("",!0),e[19]||(e[19]=t("p",{class:"file-hint"},"Only PDF files are allowed",-1))])]),e[21]||(e[21]=t("button",{type:"submit",class:"submit-btn"},"Publish",-1))],32),t("div",Je,[e[22]||(e[22]=t("h3",null,"Preview",-1)),t("div",Re,[t("div",Qe,[t("img",{src:v(ve),alt:"Preview"},null,8,je)]),t("div",qe,[t("h4",null,o(l.title||"Title"),1),t("p",He,o(l.startDate?g(l.startDate):"Start Date")+" - "+o(l.endDate?g(l.endDate):"End Date"),1),t("p",Ge,o(l.description||"Description will appear here..."),1),l.files.length?(r(),n("div",Ke,[t("a",{href:"#",class:"learn-more",onClick:e[8]||(e[8]=O(()=>B(l.files[0]),["prevent"]))},"Learn More →")])):p("",!0)])])])])],512),[[I,u.value==="publish"]]),y(t("div",We,[e[24]||(e[24]=t("h2",null,"Published Opportunities",-1)),t("div",Xe,[(r(!0),n(F,null,L(se.value,(s,f)=>(r(),n("div",{key:f,class:"list-item"},[t("div",Ze,[t("img",{src:s.image,alt:s.title},null,8,et),t("div",tt,[t("h3",null,o(s.title),1),t("p",st,o(g(s.startDate))+" - "+o(g(s.endDate)),1),t("p",at,o(s.description||"No description available"),1),s.files&&s.files.length?(r(),n("div",lt,[t("a",{href:"#",class:"learn-more",onClick:O(()=>B(s.files[0]),["prevent"])},"Learn More →",8,ot)])):p("",!0)])]),t("div",it,[t("button",{onClick:E=>G(f),class:"edit-btn"},"Edit",8,nt),j(s)?(r(),n("button",{key:0,onClick:E=>K(f),class:"delete-btn"}," Delete ",8,rt)):p("",!0)])]))),128))])],512),[[I,u.value==="published"]]),y(t("div",dt,[e[27]||(e[27]=t("h2",null,"Opportunity Information Management",-1)),e[28]||(e[28]=t("p",{class:"section-description"},"Manage opportunities displayed on the homepage",-1)),t("div",ut,[(r(!0),n(F,null,L(v(S).opportunitiesData,(s,f)=>(r(),n("div",{key:f,class:"opportunity-item"},[t("div",ct,[t("div",pt,[t("img",{src:ee(s),alt:s.title},null,8,mt)]),t("div",vt,[t("h4",null,o(s.title),1),t("p",ft,o(s.institution),1),s.department?(r(),n("p",gt,o(s.department),1)):p("",!0),s.startDate&&s.endDate?(r(),n("p",Dt,o(U(s.startDate)?g(s.startDate):s.startDate)+" - "+o(U(s.endDate)?g(s.endDate):s.endDate),1)):s.startDate?(r(),n("p",ht,o(U(s.startDate)?g(s.startDate):s.startDate),1)):p("",!0),t("p",_t,o(s.description||"No description available"),1)])]),t("div",yt,[_(i,{type:"danger",size:"small",onClick:E=>te(f)},{default:z(()=>e[25]||(e[25]=[de(" Delete ")])),_:2},1032,["onClick"])])]))),128)),v(S).opportunitiesData.length===0?(r(),n("div",bt,e[26]||(e[26]=[t("p",null,"No opportunities available",-1)]))):p("",!0)])],512),[[I,u.value==="opportunities"]])])]),_(w,{modelValue:P.value,"onUpdate:modelValue":e[9]||(e[9]=s=>P.value=s),title:"Document Preview",fullscreen:!0,"show-close":!0,"before-close":W},{default:z(()=>[t("div",wt,[h.value?(r(),n("iframe",{key:0,src:h.value,width:"100%",height:"100%",frameborder:"0"},null,8,St)):p("",!0)])]),_:1},8,["modelValue"]),_(pe)],64)}}}),Nt=ue(kt,[["__scopeId","data-v-f62509d0"]]);export{Nt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.