1import{p as Ge,B as rt,aQ as ot,T as H,M as d,F as h,ah as k,I as e,U as lt,i as Qe,r as c,G as n,H as o,h as b,u,Z as N,C as y,_ as g,j as a,J as K,E as Ye,k as Xe,a5 as Ke,aq as he,a6 as Ne,f as Ae,g as se,X as ne,K as je,Y as _e,aO as it,ai as nt,aL as vt}from"./index-DGEe77UE.js";import{B as qe}from"./Button-BeTpqUHs.js";import{I as dt}from"./Input-k1_ntdA2.js";import{c as ct}from"./input-DUXsThiQ.js";import{C as ze}from"./CardMessage-CuXDmjiB.js";import{A as ut}from"./AdminSidebar-Bm2fWpGK.js";import"./misc-C0wTEIxB.js";/* empty css */import"./errorIcon-B9s7J4Bn.js";import"./checkCircle-Cb6rUYFn.js";import"./warningIcon-CbEvDpTd.js";import"./InfoCircle-DRX4idOf.js";import"./Sidebar-CaQHuzk2.js";import"./index-CIWC3FMs.js";import"./size-BLnJE__5.js";import"./Paper-C_c9GJQg.js";import"./ListItem-Dr5ZxBYp.js";import"./snippet-DAGvpLOf.js";import"./transitions-AqZ7z4IF.js";import"./index-D1837lHi.js";import"./cancel-quZop3Ko.js";var ft=c('<span class="badge db svelte-1s41je1"> </span>'),pt=c("<strong>Cannot merge automatically:</strong> Two or more registered schools share the URL <strong> </strong>. Please change one school's URL manually, then re-run this tool.",1),_t=c("<strong> </strong> <!>",1),ht=c('<div class="note svelte-1s41je1">Some entries reference an institution that no longer exists â those entries will simply be removed.</div>'),gt=c('<th><!> <span class="sub svelte-1s41je1"> </span></th>'),mt=c('<span class="empty svelte-1s41je1">â</span>'),bt=c("<td><!></td>"),xt=c('<tr><td class="field svelte-1s41je1"> </td><!></tr>'),$t=c('<table class="svelte-1s41je1"><thead><tr><th class="field svelte-1s41je1">Field</th><!></tr></thead><tbody></tbody></table>'),jt=c('<th class="svelte-1s41je1"></th>'),yt=c('<span class="pick-hint svelte-1s41je1">pick one</span>'),kt=c('<span class="empty svelte-1s41je1">omit (not present)</span>'),Dt=c('<td class="svelte-1s41je1"><label><input type="radio" class="svelte-1s41je1"/> <!></label></td>'),wt=c('<span class="empty svelte-1s41je1">â</span>'),Et=c('<td class="svelte-1s41je1"><!></td>'),Ct=c('<tr><td class="field svelte-1s41je1"> <!></td><!></tr>'),Mt=c('<table class="svelte-1s41je1"><thead><tr><th class="field svelte-1s41je1">Field</th><!></tr></thead><tbody></tbody></table>'),Lt=c('<div class="dup svelte-1s41je1"><div class="head svelte-1s41je1"><div class="url svelte-1s41je1"> </div> <div class="badges svelte-1s41je1"><span class="badge svelte-1s41je1"> </span> <!></div></div> <!> <!> <div class="table-scroll svelte-1s41je1"><!></div> <div class="actions svelte-1s41je1"><!></div></div>');function Rt(Re,ye){Ge(ye,!1);const A=h(),E=h(),M=h(),L=h(),R=h(),I=h(),V=h(),C=h(),ve=h(),ge=h(),Pe=[];let s=rt(ye,"group",8);const W=ot();let q=h(!1);const me=["iid"],Ie=t=>(t??"").replace(/^https?:\/\//i,""),ke=t=>/^https:\/\//i.test(t??""),Se="<absent>",ae=t=>t===void 0?Se:JSON.stringify(t);function Ue(t){let r={};for(const i of t){let v=Ie(i.dbData.url);(r[v]??(r[v]=[])).push(i)}return r}let S=h({});function De(t){let r=new Set;for(const i of t){for(const v of Object.keys(i.source))me.includes(v)||r.add(v);if(i.dbData)for(const v of Object.keys(i.dbData))me.includes(v)||r.add(v)}return[...r].sort()}function we(t){let r=ae(s().entries[0].source[t]);return s().entries.every(i=>ae(i.source[t])===r)}function Be(t){let r={...e(S)},i=!1;for(const v of t)if(r[v]===void 0){let P=s().entries.findIndex(m=>m.source[v]!==void 0);if(v==="url"){let m=s().entries.findIndex(_=>ke(_.source.url));m!==-1&&(P=m)}r[v]=P===-1?0:P,i=!0}for(const v of Object.keys(r))t.includes(v)||(delete r[v],i=!0);i&&d(S,r)}function Fe(t,r,i,v){var m;let P={};for(const _ of t){let l=v.entries[0].source[_];l!==void 0&&(P[_]=l)}for(const _ of r){let l=(m=v.entries[i[_]??0])==null?void 0:m.source[_];l!==void 0&&(P[_]=l)}return P}async function Te(){if(e(q)||!e(ge))return;d(q,!0);let t=s().entries.map(i=>i.esId),r=e(E)?e(R):[e(ve)];try{await Ke.post("api/v1/institutions/schoolListErrors/merge",{deleteIds:t,create:r}),he.success("Duplicate resolved."),W("resolved",{url:s().url})}
1catch(i){he.error("Failed to resolve the duplicate.",Ne.getErrorMessage(i))}finally{d(q,!1)}}H(()=>k(s()),()=>{d(A,s().entries.filter(t=>t.dbData))}),H(()=>e(A),()=>{d(E,e(A).length>0)}),H(()=>e(A),()=>{d(M,Ue(e(A)))}),H(()=>e(M),()=>{d(L,Object.values(e(M)).some(t=>t.length>1))}),H(()=>e(M),()=>{d(R,Object.values(e(M)).map(t=>t[0].dbData))}),H(()=>k(s()),()=>{d(I,De(s().entries))}),H(()=>e(I),()=>{d(V,e(I).filter(t=>we(t)))}),H(()=>e(I),()=>{d(C,e(I).filter(t=>!we(t)))}),H(()=>e(C),()=>{Be(e(C))}),H(()=>(e(V),e(C),e(S),k(s())),()=>{d(ve,Fe(e(V),e(C),e(S),s()))}),H(()=>(e(E),e(L),e(C),e(S)),()=>{d(ge,e(E)?!e(L):e(C).every(t=>e(S)[t]!==void 0))}),lt(),Qe();var f=Lt(),D=o(f),w=o(D),U=o(w),J=n(w,2),x=o(J),Y=o(x),re=n(x,2);{var be=t=>{var r=ft(),i=o(r);y(()=>g(i,`${e(R),u(()=>e(R).length)??""} registered`)),a(t,r)};b(re,t=>{e(E)&&t(be)})}var B=n(D,2);{var oe=t=>{var r=Ae(),i=se(r);{var v=m=>{ze(m,{type:"error",children:(_,l)=>{var $=pt(),j=n(se($),2),F=o(j);y(()=>g(F,(k(s()),u(()=>s().url)))),a(_,$)},$$slots:{default:!0}})},P=m=>{ze(m,{type:"info",children:(_,l)=>{var $=_t(),j=se($),F=o(j),X=n(j,2);{var Z=T=>{var p=N("The database version below will be kept and all other duplicate entries removed.");a(T,p)},ee=T=>{var p=N("These are different registered schools (different URLs in the database), so each is kept and the remaining duplicate entries removed.");a(T,p)};b(X,T=>{e(R),u(()=>e(R).length===1)?T(Z):T(ee,!1)})}y(()=>g(F,`Registered school${e(R),u(()=>e(R).length===1?"":"s")??""} found:`)),a(_,$)},$$slots:{default:!0}})};b(i,m=>{e(L)?m(v):m(P,!1)})}a(t,r)};b(B,t=>{e(E)&&t(oe)})}var de=n(B,2);{var Oe=t=>{var r=ht();a(t,r)};b(de,t=>{k(s()),u(()=>s().entries.some(r=>r.dbMissing))&&t(Oe)})}var Je=n(de,2),Ze=o(Je);{var Ve=t=>{var r=$t(),i=o(r),v=o(i),P=n(o(v));ne(P,1,()=>(k(s()),u(()=>s().entries)),_e,(_,l)=>{var $=gt();let j;var F=o($);{var X=p=>{var z=N("From DB");a(p,z)},Z=p=>{var z=N("List entry");a(p,z)};b(F,p=>{e(l),u(()=>e(l).dbData)?p(X):p(Z,!1)})}var ee=n(F,2),T=o(ee);y(p=>{j=je($,1,"svelte-1s41je1",null,j,p),g(T,`${e(l),u(()=>e(l).iid?`iid ${e(l).iid}`:"no iid")??""}${e(l),u(()=>e(l).dbMissing?" · missing":"")??""}`)},[()=>({authoritative:!!e(l).dbData})],K),a(_,$)});var m=n(i);ne(m,5,()=>e(I),_e,(_,l)=>{var $=xt();const j=K(()=>(k(s()),e(l),u(()=>ae((s().entries[0].dbData??s().entries[0].source)[e(l)])))),F=K(()=>(k(s()),e(l),k(e(j)),u(()=>s().entries.some(p=>ae((p.dbData??p.source)[e(l)])!==e(j)))));let X;var Z=o($),ee=o(Z),T=n(Z);ne(T,1,()=>(k(s()),u(()=>s().entries)),_e,(p,z)=>{var O=bt();const le=K(()=>(e(z),e(l),u(()=>(e(z).dbData??e(z).source)[e(l)])));let xe;var Ee=o(O);{var ce=G=>{var ue=mt();a(G,ue)},He=G=>{var ue=N();y(()=>g(ue,e(le))),a(G,ue)};b(Ee,G=>{e(le)===void 0?G(ce):G(He,!1)})}y(G=>xe=je(O,1,"svelte-1s41je1",null,xe,G),[()=>({authoritative:!!e(z).dbData})],K),a(p,O)}),y(p=>{X=je($,1,"svelte-1s41je1",null,X,p),g(ee,e(l))},[()=>({diff:e(F)})],K),a(_,$)}),a(t,r)},We=t=>{var r=Mt(),i=o(r),v=o(i),P=n(o(v));ne(P,1,()=>(k(s()),u(()=>s().entries)),_e,(_,l,$)=>{var j=jt();j.textContent=`Entry ${$+1}`,a(_,j)});var m=n(i);ne(m,5,()=>e(I),_e,(_,l,$)=>{var j=Ct();const F=K(()=>(e(C),e(l),u(()=>e(C).includes(e(l)))));let X;var Z=o(j),ee=o(Z),T=n(ee);{var p=O=>{var le=yt();a(O,le)};b(T,O=>{e(F)&&O(p)})}var z=n(Z);ne(z,1,()=>(k(s()),u(()=>s().entries)),_e,(O,le,xe)=>{var Ee=Ae();const ce=K(()=>(e(le),e(l),u(()=>e(le).source[e(l)])));var He=se(Ee);{var G=fe=>{var $e=Dt(),Ce=o($e);let Me;var ie=o(Ce);ie.value=ie.__value=xe;var te=n(ie,2);{var pe=Q=>{var Le=kt();a(Q,Le)},at=Q=>{var Le=N();y(()=>g(Le,e(ce))),a(Q,Le)};b(te,Q=>{e(ce)===void 0?Q(pe):Q(at,!1)})}y(Q=>{Me=je(Ce,1,"choice svelte-1s41je1",null,Me,Q),Ye(ie,"name",(k(s()),e(l),u(()=>`${s().url}::${e(l)}`)))},[()=>({selected:e(S)[e(l)]===xe})],K),ct(Pe,[$],ie,()=>e(S)[e(l)],Q=>it(S,e(S)[e(l)]=Q)),a(fe,$e)},ue=fe=>{var $e=Et(),Ce=o($e);{var Me=te=>{var pe=wt();a(te,pe)},ie=te=>{var pe=N();y(()=>g(pe,e(ce))),a(te,pe)};b(Ce,te=>{e(ce)===void 0?te(Me):te(ie,!1)})}a(fe,$e)};b(He,fe=>{e(F)?fe(G):fe(ue,!1)})}a(O,Ee)}),y(O=>{X=je(j,1,"svelte-1s41je1",null,X,O),g(ee,`${e(l)??""} `)},[()=>({diff:e(F)})],K),a(_,j)}),a(t,r)};b(Ze,t=>{e(E)?t(Ve):t(We,!1)})}var et=n(Je,2),tt=o(et);const st=K(()=>!e(ge));qe(tt,{get loading(){return e(q)},get disabled(){return e(st)},$$events:{click:Te},children:(t,r)=>{var i=N();y(()=>g(i,e(E)?"Keep database version & remove duplicates":"Merge & remove duplicates")),a(t,i)},$$slots:{default:!0}}),y(()=>{Ye(w,"title",(k(s()),u(()=>s().url))),g(U,(k(s()),u(()=>s().url))),g(Y,`${k(s()),u(()=>s().entries.length)??""} entries`)}),a(Re,f),Xe()}var Pt=c("· <strong> </strong> resolved this session",1),It=c('<div class="stats svelte-16hkvsm"><strong> </strong> <strong> </strong> <!></div>'),St=c("No more groups in this batch. Press <strong>Reload</strong> ",1),Ut=c('<div class="empty-state svelte-16hkvsm"><!></div>'),Bt=c('<div class="muted small svelte-16hkvsm">Tip: resolve the duplicate groups above first â entries that would clash with an existing https entry are skipped.</div>'),Ft=c('<div class="http-panel svelte-16hkvsm"><div class="http-info svelte-16hkvsm"><strong> </strong> <code class="svelte-16hkvsm">http://</code>. These should all be <code class="svelte-16hkvsm">https://</code>. <!></div> <!></div>'),Tt=c(`<div class="header svelte-16hkvsm"><h2>School List Errors</h2> <p class="muted svelte-16hkvsm">
1Duplicate schools in the search list (entries that share the same URL). Resolve them one at a time â each merge deletes the duplicate list entries and re-creates a single, clean one. Registered 2 schools (those with a database record) are always kept as-is.</p> <div class="controls svelte-16hkvsm"><div class="limit svelte-16hkvsm"><!></div> <!> <!></div></div> <!> <!>`,1);function ls(Re,ye){Ge(ye,!1);let A=h(!1),E=h(!1),M=h(0),L=h([]),R=h(25),I=h(0),V=h(0),C=h(!1);nt(ve);async function ve(){if(!e(A)){d(A,!0);try{let s=await Ke.get(`api/v1/institutions/schoolListErrors/duplicates?limit=${e(R)}`);d(M,s.data.total),d(L,s.data.groups),d(V,s.data.httpCount),d(I,0),d(E,!0)}catch(s){he.error("Failed to load duplicate schools.",Ne.getErrorMessage(s))}finally{d(A,!1)}}}function ge(s){d(L,e(L).filter(W=>W.url!==s)),d(M,Math.max(0,e(M)-1)),vt(I)}async function Pe(){if(!e(C)){d(C,!0);try{let s=await Ke.post("api/v1/institutions/schoolListErrors/convertHttpToHttps"),{converted:W,skipped:q}=s.data;q?he.info(`Converted ${W} to https. ${q} were skipped because they still clash with another entry â resolve those duplicates first.`):he.success(`Converted ${W} entr${W===1?"y":"ies"} to https.`),await ve()}catch(s){he.error("Failed to convert http URLs.",Ne.getErrorMessage(s))}finally{d(C,!1)}}}Qe(),ut(Re,{children:(s,W)=>{var q=Tt(),me=se(q),Ie=n(o(me),4),ke=o(Ie),Se=o(ke);dt(Se,{title:"Batch size",type:"number",margin:!1,get value(){return e(R)},set value(f){d(R,f)},$$legacy:!0});var ae=n(ke,2);qe(ae,{get loading(){return e(A)},$$events:{click:ve},children:(f,D)=>{var w=N("Reload");a(f,w)},$$slots:{default:!0}});var Ue=n(ae,2);{var S=f=>{var D=It(),w=o(D),U=o(w),J=n(w),x=n(J),Y=o(x),re=n(x,2);{var be=B=>{var oe=Pt(),de=n(se(oe)),Oe=o(de);y(()=>g(Oe,e(I))),a(B,oe)};b(re,B=>{e(I)&&B(be)})}y(()=>{g(U,e(M)),g(J,` duplicate group${e(M)===1?"":"s"} remaining 3 · showing `),g(Y,(e(L),u(()=>e(L).length)))}),a(f,D)};b(Ue,f=>{e(E)&&f(S)})}var De=n(me,2);{var we=f=>{var D=Ut(),w=o(D);{var U=x=>{var Y=N("ð No duplicate schools found.");a(x,Y)},J=x=>{var Y=St(),re=n(se(Y),2);y(()=>g(re,` to fetch the next ${e(R)??""}.`)),a(x,Y)};b(w,x=>{e(M)===0?x(U):x(J,!1)})}a(f,D)},Be=f=>{var D=Ae(),w=se(D);ne(w,1,()=>e(L),U=>U.url,(U,J)=>{Rt(U,{get group(){return e(J)},$$events:{resolved:x=>ge(x.detail.url)}})}),a(f,D)};b(De,f=>{e(E),e(L),u(()=>e(E)&&e(L).length===0)?f(we):f(Be,!1)})}var Fe=n(De,2);{var Te=f=>{var D=Ft(),w=o(D),U=o(w),J=o(U),x=n(U),Y=n(x,5);{var re=B=>{var oe=Bt();a(B,oe)};b(Y,B=>{e(M)>0&&B(re)})}var be=n(w,2);qe(be,{get loading(){return e(C)},$$events:{click:Pe},children:(B,oe)=>{var de=N("Convert all to https");a(B,de)},$$slots:{default:!0}}),y(()=>{g(J,e(V)),g(x,` list entr${e(V)===1?"y is":"ies are"} still served over `)}),a(f,D)};b(Fe,f=>{e(E)&&e(V)>0&&f(Te)})}a(s,q)},$$slots:{default:!0}}),Xe()}export{ls 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.