ose-app 0.2.5__py3-none-any.whl
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.
- ose_app/AppModule.py +98 -0
- ose_app/OntologyDataStore.py +464 -0
- ose_app/PermissionManager.py +78 -0
- ose_app/SpreadsheetSearcher.py +197 -0
- ose_app/__init__.py +130 -0
- ose_app/app.py +10 -0
- ose_app/constants.py +1 -0
- ose_app/custom_json.py +23 -0
- ose_app/default_config.py +39 -0
- ose_app/gh.py +60 -0
- ose_app/guards/__init__.py +0 -0
- ose_app/guards/verify_login.py +20 -0
- ose_app/guards/with_permission.py +54 -0
- ose_app/jinja_extensions/__init__.py +42 -0
- ose_app/routes/__init__.py +24 -0
- ose_app/routes/admin.py +108 -0
- ose_app/routes/api/__init__.py +23 -0
- ose_app/routes/api/edit.py +162 -0
- ose_app/routes/api/external.py +198 -0
- ose_app/routes/api/plugins.py +22 -0
- ose_app/routes/api/release.py +380 -0
- ose_app/routes/api/repos.py +55 -0
- ose_app/routes/api/scripts.py +49 -0
- ose_app/routes/api/search.py +19 -0
- ose_app/routes/api/settings.py +115 -0
- ose_app/routes/api/validate.py +264 -0
- ose_app/routes/api/visualise.py +228 -0
- ose_app/routes/auth.py +44 -0
- ose_app/routes/edit.py +690 -0
- ose_app/routes/main.py +100 -0
- ose_app/routes/search.py +42 -0
- ose_app/routes/status.py +10 -0
- ose_app/routes/visualize.py +108 -0
- ose_app/static/addicto.release.json +129 -0
- ose_app/static/bcio.release.json +321 -0
- ose_app/static/example.json +134 -0
- ose_app/static/excel-bootstrap-table-filter-bundle.js +326 -0
- ose_app/static/excel-bootstrap-table-filter-bundle.js.map +1 -0
- ose_app/static/excel-bootstrap-table-filter-bundle.min.js +2 -0
- ose_app/static/excel-bootstrap-table-filter-bundle.min.js.map +1 -0
- ose_app/static/excel-bootstrap-table-filter-style.css +78 -0
- ose_app/static/gmho.release.json +139 -0
- ose_app/static/js/admin.js +2 -0
- ose_app/static/js/admin.js.map +1 -0
- ose_app/static/js/assets/CollapsibleCard.css +1 -0
- ose_app/static/js/assets/editor.css +1 -0
- ose_app/static/js/assets/release.css +1 -0
- ose_app/static/js/assets/settings.css +1 -0
- ose_app/static/js/assets/visualise.css +1 -0
- ose_app/static/js/chunks/BToastOrchestrator.vue_vue_type_style_index_0_lang-CgGO-ddH-BDr_frBe.js +2 -0
- ose_app/static/js/chunks/BToastOrchestrator.vue_vue_type_style_index_0_lang-CgGO-ddH-BDr_frBe.js.map +1 -0
- ose_app/static/js/chunks/BToastOrchestrator.vue_vue_type_style_index_0_lang-CgGO-ddH-MonxH8xj.js +2 -0
- ose_app/static/js/chunks/BToastOrchestrator.vue_vue_type_style_index_0_lang-CgGO-ddH-MonxH8xj.js.map +1 -0
- ose_app/static/js/chunks/BToastOrchestrator.vue_vue_type_style_index_0_lang-DKAZyKKr-DTksKjtf.js +2 -0
- ose_app/static/js/chunks/BToastOrchestrator.vue_vue_type_style_index_0_lang-DKAZyKKr-DTksKjtf.js.map +1 -0
- ose_app/static/js/chunks/CollapsibleCard-BQR8R54V.js +2 -0
- ose_app/static/js/chunks/CollapsibleCard-BQR8R54V.js.map +1 -0
- ose_app/static/js/chunks/CollapsibleCard-DgwkQKDg.js +2 -0
- ose_app/static/js/chunks/CollapsibleCard-DgwkQKDg.js.map +1 -0
- ose_app/static/js/chunks/CollapsibleCard-DoX0kPCZ.js +2 -0
- ose_app/static/js/chunks/CollapsibleCard-DoX0kPCZ.js.map +1 -0
- ose_app/static/js/chunks/Diagnostic.vue_vue_type_script_setup_true_lang-CBzsmnqW.js +43 -0
- ose_app/static/js/chunks/Diagnostic.vue_vue_type_script_setup_true_lang-CBzsmnqW.js.map +1 -0
- ose_app/static/js/chunks/Diagnostic.vue_vue_type_script_setup_true_lang-EcINi797.js +43 -0
- ose_app/static/js/chunks/Diagnostic.vue_vue_type_script_setup_true_lang-EcINi797.js.map +1 -0
- ose_app/static/js/chunks/Diagnostic.vue_vue_type_script_setup_true_lang-bumDOBqD.js +43 -0
- ose_app/static/js/chunks/Diagnostic.vue_vue_type_script_setup_true_lang-bumDOBqD.js.map +1 -0
- ose_app/static/js/chunks/_plugin-vue_export-helper-DlAUqK2U.js +2 -0
- ose_app/static/js/chunks/_plugin-vue_export-helper-DlAUqK2U.js.map +1 -0
- ose_app/static/js/chunks/bootbox-D3SJ_Fwv.js +2 -0
- ose_app/static/js/chunks/bootbox-D3SJ_Fwv.js.map +1 -0
- ose_app/static/js/chunks/constants-CzBHF1EN.js +2 -0
- ose_app/static/js/chunks/constants-CzBHF1EN.js.map +1 -0
- ose_app/static/js/chunks/constants-DL6Hx3V0.js +2 -0
- ose_app/static/js/chunks/constants-DL6Hx3V0.js.map +1 -0
- ose_app/static/js/chunks/constants-DPgwRV4l.js +2 -0
- ose_app/static/js/chunks/constants-DPgwRV4l.js.map +1 -0
- ose_app/static/js/chunks/filter-Bx-PU1OL.js +18 -0
- ose_app/static/js/chunks/filter-Bx-PU1OL.js.map +1 -0
- ose_app/static/js/chunks/filter-CdAXK93b.js +18 -0
- ose_app/static/js/chunks/filter-CdAXK93b.js.map +1 -0
- ose_app/static/js/chunks/filter-CiYqP1_r.js +2 -0
- ose_app/static/js/chunks/filter-CiYqP1_r.js.map +1 -0
- ose_app/static/js/chunks/index-sLCKmIWG-B5BYNF2N.js +2 -0
- ose_app/static/js/chunks/index-sLCKmIWG-B5BYNF2N.js.map +1 -0
- ose_app/static/js/chunks/index-sLCKmIWG-Cb9lQq-c.js +9 -0
- ose_app/static/js/chunks/index-sLCKmIWG-Cb9lQq-c.js.map +1 -0
- ose_app/static/js/chunks/index-sLCKmIWG-umQeu_-w.js +3 -0
- ose_app/static/js/chunks/index-sLCKmIWG-umQeu_-w.js.map +1 -0
- ose_app/static/js/editor.js +36 -0
- ose_app/static/js/editor.js.map +1 -0
- ose_app/static/js/release.js +6 -0
- ose_app/static/js/release.js.map +1 -0
- ose_app/static/js/settings.js +2 -0
- ose_app/static/js/settings.js.map +1 -0
- ose_app/static/js/visualise.js +3 -0
- ose_app/static/js/visualise.js.map +1 -0
- ose_app/static/main.css +1 -0
- ose_app/static/main.css.map +7 -0
- ose_app/static/main.scss +147 -0
- ose_app/static/mindmup-editabletable.js +131 -0
- ose_app/static/schema/release_script.json +215 -0
- ose_app/static/schema/req_body_edit.json +35 -0
- ose_app/static/schema/req_body_guess_parent.json +38 -0
- ose_app/static/schema/req_body_import.json +47 -0
- ose_app/static/schema/req_body_release_start.json +9 -0
- ose_app/static/schema/req_body_visualise.json +18 -0
- ose_app/static/test.dot +190 -0
- ose_app/static/workflows/externals.yaml.jinja2 +44 -0
- ose_app/templates/access_show_visualisation_for_ids.html +120 -0
- ose_app/templates/admin/dashboard.html +18 -0
- ose_app/templates/admin/rebuild_index.html +85 -0
- ose_app/templates/admin/release.html +46 -0
- ose_app/templates/admin/settings.html +23 -0
- ose_app/templates/base.html +151 -0
- ose_app/templates/edit.html +21 -0
- ose_app/templates/edit_external.html +491 -0
- ose_app/templates/forbidden.html +9 -0
- ose_app/templates/index.html +33 -0
- ose_app/templates/loggedout.html +21 -0
- ose_app/templates/repo.html +294 -0
- ose_app/templates/testgeneratedbyapi.html +294 -0
- ose_app/templates/visualise.html +17 -0
- ose_app-0.2.5.dist-info/METADATA +27 -0
- ose_app-0.2.5.dist-info/RECORD +127 -0
- ose_app-0.2.5.dist-info/WHEEL +5 -0
- ose_app-0.2.5.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{d as E,c as n,f as _,a as l,F as g,e,v as q,t as d,J as me,l as N,g as D,q as O,s as C,D as V,Z as B,L as J,_ as ge,h as b,w as te,r as R,o as se,x as L,u as F,b as S,C as be,y as ye,a0 as he,a1 as ve,O as ke,j as _e,$ as $e}from"./chunks/filter-CiYqP1_r.js";import{C as xe}from"./chunks/CollapsibleCard-DoX0kPCZ.js";import{_ as le}from"./chunks/_plugin-vue_export-helper-DlAUqK2U.js";import{c as we,p as Se}from"./chunks/bootbox-D3SJ_Fwv.js";import{_ as I}from"./chunks/Diagnostic.vue_vue_type_script_setup_true_lang-CBzsmnqW.js";const Ce={class:"text-secondary mb-3"},Oe={class:"progress",role:"progressbar"},Ae={key:1,class:"d-flex justify-content-center mt-5"},z=E({__name:"ProgressIndicator",props:{release:{},details:{}},setup(a){const p=a,o=N(()=>Math.round((p.details?.__progress?.progress??0)*100));return(r,c)=>a.release?.state=="running"?(l(),n(g,{key:0},[e("p",null,[q(r.$slots,"default")]),a.details&&"__progress"in a.details&&a.details?.__progress?(l(),n(g,{key:0},[e("p",Ce,d(a.details.__progress.message??"Working on")+" "+d(a.details.__progress.current_item)+" ("+d(a.details.__progress?.position?.[0])+"/"+d(a.details.__progress?.position?.[1])+") ",1),e("div",Oe,[e("div",{class:"progress-bar progress-bar-striped progress-bar-animated",style:me({width:`${o.value}%`})},d(o.value)+"% ",5)])],64)):(l(),n("div",Ae,[...c[0]||(c[0]=[e("div",{class:"spinner-border text-primary",role:"status",style:{width:"5rem",height:"5rem"}},[e("span",{class:"visually-hidden"},"Waiting...")],-1)])]))],64)):_("",!0)}}),Te={class:"files"},Ne={class:"badge text-bg-secondary"},je={key:0,class:"badge text-bg-secondary ms-1"},Ie=["onClick"],Re=["onClick"],De={class:"release-file-settings"},Pe={class:"form-check form-switch mb-3"},Ee=["onUpdate:modelValue"],Ue={class:"input-group input-group-sm mb-3"},Ve=["onUpdate:modelValue"],Le={class:"input-group input-group-sm mb-3"},We=["onUpdate:modelValue"],Fe={class:"input-group input-group-sm mb-3"},Me=["value","onChange"],Je={class:"input-group input-group-sm mb-3"},Be=["onUpdate:modelValue"],Ge=["onUpdate:modelValue"],He=["onClick"],qe=["onClick"],ze={class:"input-group input-group-sm mb-3"},Ke=["value"],Xe=["onClick"],Ze=["onClick"],Qe={class:"header"},Ye=["onClick"],et={class:"input-group input-group-sm mb-1"},tt=["onUpdate:modelValue"],st={class:"input-group input-group-sm mb-3"},lt=["value","onChange"],nt=["onClick"],at={class:"d-flex gap-2"},ot=E({__name:"ReleaseScriptViewer",props:{releaseScript:{}},setup(a){const p=a;function o(f,s){p.releaseScript.files[f].target.ontology_annotations=Object.fromEntries(s.split(`
|
|
2
|
+
`).map(i=>i.split(": ")))}function r(f,s){p.releaseScript.steps[f].args=Object.fromEntries(s.split(`
|
|
3
|
+
`).map(i=>i.split(": ")).map(([i,t])=>t==="true"?[i,!0]:t==="false"?[i,!1]:isNaN(Number(t))?[i,t]:[i,Number(t)]))}function c(f){bootbox.prompt({title:`Add dependency for ${f}`,inputType:"select",inputOptions:Object.entries(p.releaseScript.files).filter(([s,i])=>s!=f).map(([s,i])=>({text:i.target.file,value:s})),callback(s){s&&p.releaseScript.files[f].needs.push(s)}})}function y(f,s){p.releaseScript.files[f].needs=p.releaseScript.files[f].needs.filter(i=>i!=s)}function w(){bootbox.prompt({title:"What is the name of the file?",inputType:"text",callback(f){f&&(f=f.trim().replace(/[ ,./\-!?=]/,"_"),p.releaseScript.files[f]={target:{file:"",iri:"",ontology_annotations:{}},sources:[],needs:[]})}})}function v(f,s){f.preventDefault(),bootbox.prompt({title:"What is the name of the file?",inputType:"text",value:s,callback(i){i&&(i=i.trim().replace(/[ ,./\-!?=]/,"_"),p.releaseScript.files[i]=p.releaseScript.files[s],delete p.releaseScript.files[s])}})}function k(f,s){f.preventDefault(),p.releaseScript.steps.splice(s,0,{args:{},name:"NEW_STEP"})}function A(f,s){f.preventDefault();const i=p.releaseScript.steps[s];bootbox.confirm({title:`Delete step '${i.name}'`,message:`Do you want to remove the release step '${i.name}'?`,buttons:{confirm:{label:`Delete ${i.name}`,className:"btn-danger"},cancel:{label:"Keep it",className:"btn-success"}},callback(t){t&&p.releaseScript.steps.splice(s,1)}})}function U(f,s){f.preventDefault(),bootbox.confirm({title:`Delete '${s}'`,message:`Do you want to delete the file '${s}'? It will remove the file ${p.releaseScript.files[s].target.file} from the release.`,buttons:{confirm:{label:`Delete ${s}`,className:"btn-danger"},cancel:{label:"Keep it",className:"btn-success"}},callback(i){i&&delete p.releaseScript.files[s]}})}return(f,s)=>(l(),n(g,null,[e("div",Te,[s[22]||(s[22]=e("h3",null,"Files",-1)),(l(!0),n(g,null,D(a.releaseScript.files,(i,t)=>(l(),O(xe,null,{title:C(()=>[b(d(t)+" - "+d(i.target.file)+" ",1),e("span",Ne,d(i.sources.length)+" sources",1),i.needs.length>0?(l(),n("span",je,d(i.needs.length)+" dependencies",1)):_("",!0)]),buttons:C(()=>[e("button",{class:"btn btn-primary btn-sm btn-circle",onClick:u=>v(u,t)},[...s[1]||(s[1]=[e("i",{class:"fa fa-edit"},null,-1)])],8,Ie),e("button",{class:"btn btn-danger btn-sm btn-circle",onClick:u=>U(u,t)},[...s[2]||(s[2]=[e("i",{class:"fa fa-trash"},null,-1)])],8,Re)]),body:C(()=>[e("div",De,[s[15]||(s[15]=e("h6",null,"Target settings",-1)),s[16]||(s[16]=e("p",{class:"text-body-secondary"},"Define the location of the target file in the repository and define the IRI of the resulting ontology.",-1)),e("div",Pe,[V(e("input",{"onUpdate:modelValue":u=>i.target.publish=u,class:"form-check-input",role:"switch",type:"checkbox"},null,8,Ee),[[B,i.target.publish]]),s[3]||(s[3]=e("span",{class:"form-check-label"},"Publish the file to GitHub",-1))]),e("div",Ue,[s[4]||(s[4]=e("span",{class:"input-group-text"},"Path",-1)),V(e("input",{"onUpdate:modelValue":u=>i.target.file=u,class:"form-control",type:"text"},null,8,Ve),[[J,i.target.file]])]),e("div",Le,[s[5]||(s[5]=e("span",{class:"input-group-text"},"IRI",-1)),V(e("input",{"onUpdate:modelValue":u=>i.target.iri=u,class:"form-control",type:"text"},null,8,We),[[J,i.target.iri]])]),e("div",Fe,[s[6]||(s[6]=e("span",{class:"input-group-text"},"Annotations",-1)),e("textarea",{value:Object.entries(i.target.ontology_annotations).map(([u,j])=>`${u}: ${j}`).join(`
|
|
4
|
+
`),class:"form-control",onChange:u=>o(t,u.target?.value)}," ",40,Me)]),s[17]||(s[17]=e("h6",null,"Source settings",-1)),s[18]||(s[18]=e("p",{class:"text-body-secondary"}," Add files that contain terms, individuals, and relations which should be included in the OWL ontology. Alternatively, add previously built owl files which should be merged to built the target ontology. ",-1)),(l(!0),n(g,null,D(i.sources,u=>(l(),n("div",Je,[s[9]||(s[9]=e("span",{class:"input-group-text"},"Source",-1)),V(e("input",{"onUpdate:modelValue":j=>u.file=j,class:"form-control",type:"text"},null,8,Be),[[J,u.file]]),s[10]||(s[10]=e("span",{class:"input-group-text"},"Type",-1)),V(e("select",{"onUpdate:modelValue":j=>u.type=j,class:"form-select",style:{flex:"unset",width:"auto"}},[...s[7]||(s[7]=[e("option",{value:"classes"},"Classes",-1),e("option",{value:"relations"},"Relations",-1),e("option",{value:"individuals"},"Individuals",-1),e("option",{value:"owl"},"OWL",-1)])],8,Ge),[[ge,u.type]]),e("button",{class:"btn btn-danger",onClick:j=>i.sources=i.sources.filter(M=>M!=u)},[...s[8]||(s[8]=[e("i",{class:"fa fa-trash"},null,-1)])],8,He)]))),256)),e("button",{class:"mb-3 btn btn-sm btn-primary add-dependency",onClick:u=>i.sources.push({file:"",type:"classes"})},[...s[11]||(s[11]=[e("i",{class:"fa fa-add"},null,-1),b(" Add source ",-1)])],8,qe),s[19]||(s[19]=e("h6",null,"Dependency settings",-1)),s[20]||(s[20]=e("p",{class:"text-body-secondary"}," Specify which other files have to be loaded when building this file. ",-1)),(l(!0),n(g,null,D(i.needs,u=>(l(),n("div",ze,[s[13]||(s[13]=e("span",{class:"input-group-text"},"Dependency",-1)),e("input",{value:a.releaseScript.files[u]?.target.file??u,class:"form-control",disabled:"",type:"text"},null,8,Ke),e("button",{class:"btn btn-danger",onClick:j=>y(t,u)},[...s[12]||(s[12]=[e("i",{class:"fa fa-trash"},null,-1)])],8,Xe)]))),256)),e("button",{class:"mb-3 btn btn-sm btn-primary add-dependency",onClick:u=>c(t)},[...s[14]||(s[14]=[e("i",{class:"fa fa-add"},null,-1),b(" Add dependency ",-1)])],8,Ze)])]),_:2},1024))),256)),e("div",{class:"d-flex gap-2"},[e("button",{class:"mb-3 btn btn-sm btn-primary add-file",onClick:w},[...s[21]||(s[21]=[e("i",{class:"fa fa-add"},null,-1),b(" Add file ",-1)])])])]),s[29]||(s[29]=e("h3",null,"Steps",-1)),e("button",{class:"btn btn-outline-primary add-step mb-3",onClick:s[0]||(s[0]=i=>k(i,0))},[...s[23]||(s[23]=[e("i",{class:"fa fa-plus-square"},null,-1),b(" Add step here ",-1)])]),(l(!0),n(g,null,D(a.releaseScript.steps,(i,t)=>(l(),n(g,null,[e("div",Qe,[e("h6",null,d(i.name),1),s[25]||(s[25]=e("span",null,null,-1)),e("button",{class:"btn btn-danger btn-sm btn-circle",style:{"margin-bottom":".5rem"},onClick:u=>A(u,t)},[...s[24]||(s[24]=[e("i",{class:"fa fa-trash"},null,-1)])],8,Ye)]),e("div",et,[s[26]||(s[26]=e("span",{class:"input-group-text"},"Release step",-1)),V(e("input",{"onUpdate:modelValue":u=>i.name=u,class:"form-control",type:"text"},null,8,tt),[[J,i.name]])]),e("div",st,[s[27]||(s[27]=e("span",{class:"input-group-text"},"Arguments",-1)),e("textarea",{value:Object.entries(i.args).map(([u,j])=>`${u}: ${j}`).join(`
|
|
5
|
+
`),class:"form-control",onChange:u=>r(t,u.target?.value)}," ",40,lt)]),e("button",{class:"btn btn-outline-primary add-step mb-3",onClick:u=>k(u,t+1)},[...s[28]||(s[28]=[e("i",{class:"fa fa-plus-square"},null,-1),b(" Add step here ",-1)])],8,nt)],64))),256)),e("div",at,[q(f.$slots,"buttons",{},void 0,!0)])],64))}}),it=le(ot,[["__scopeId","data-v-7cac764c"]]),rt={class:"preparation"},ut={key:0,class:"placeholder",style:{width:"400px"}},dt={class:"btn-group w-100"},ct=["disabled"],pt=["disabled"],ft={class:"dropdown-menu"},mt={class:"list-group mt-2"},gt={class:"list-group-item"},bt=["href"],yt={class:"ms-2 me-auto"},ht={class:"fw-bold"},vt={key:0,class:"fa fa-save"},kt={key:1,class:"fa fa-spin fa-spinner"},_t={key:2,class:"fa fa-check"},$t={key:3,class:"fa fa-xmark"},xt=E({__name:"Setup",props:{repo:{}},emits:["settingsConfirmed"],setup(a){const p=R(),o=R(null),r=URLS.prefix,c=R("idle"),y=a,w=R(null),v=N(()=>w.value===null),k=N(()=>w.value?.find(i=>i.state==="completed")??null),A=N(()=>w.value?.[0]??null);te(y,(i,t)=>i.repo!==t.repo&&U());async function U(){if(y.repo){o.value=null,o.value=await(await fetch(`${r}/api/release/${y.repo}/release_script`)).json();const i=await(await fetch(`${r}/api/release/${y.repo}`)).json();i.sort((t,u)=>new Date(t.start).getTime()-new Date(u.start).getTime()),w.value=i}}let f=null;async function s(i){i.preventDefault(),f!==null&&clearTimeout(f),c.value="saving";try{(await fetch(`${r}/api/release/${y.repo}/release_script`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(o.value)})).ok?c.value="success":c.value="error"}catch{c.value="error"}f=setTimeout(()=>{c.value="idle",f=null},5e3)}return se(()=>U()),(i,t)=>(l(),n("div",rt,[t[5]||(t[5]=e("h3",null,"Release setup",-1)),e("p",null,[b(" Currently, there is no release running for "+d(a.repo)+". ",1),v.value?(l(),n("span",ut)):k.value?(l(),n(g,{key:1},[b(d(k.value.started_by)+" started the last successful release on "+d(i.$filters.formatDate(k.value.start)),1)],64)):A.value?(l(),n(g,{key:2},[b(d(A.value.started_by)+" started the last release on "+d(i.$filters.formatDate(A.value.start))+". But it did not complete. ",1)],64)):(l(),n(g,{key:3},[b(" There have been no releases in the near past. ")],64))]),e("div",dt,[e("button",{disabled:!o.value,class:"btn btn-success",onClick:t[0]||(t[0]=u=>i.$emit("settingsConfirmed",o.value))},[...t[2]||(t[2]=[e("i",{class:"fa fa-play"},null,-1),b(" Start a release ",-1)])],8,ct),e("button",{disabled:!o.value,class:"btn btn-success dropdown-toggle dropdown-toggle-split flex-grow-0","data-bs-toggle":"dropdown",type:"button"},null,8,pt),e("ul",ft,[e("li",null,[e("a",{class:"dropdown-item",href:"#",onClick:t[1]||(t[1]=u=>p.value=!p.value)},[e("i",{class:L([[p.value?"fa-check-square":"fa-square"],"fa-regular"])},null,2),t[3]||(t[3]=b(" Show advanced configuration ",-1))])])])]),e("ul",mt,[(l(!0),n(g,null,D(w.value,u=>(l(),n("li",gt,[e("a",{class:"d-flex justify-content-between align-items-start",style:{"text-decoration":"none",color:"inherit"},href:`${u.id}`},[e("div",yt,[e("div",ht,d(i.$filters.formatDate(u.start)),1),b(" "+d(u.started_by),1)]),e("span",{class:L(["badge rounded-pill",{"text-bg-primary":["running","waiting-for-user"].indexOf(u.state)>=0,"text-bg-success":u.state==="success","text-bg-error":u.state==="errored","text-bg-secondary":u.state==="canceled"}])},d(u.state),3)],8,bt)]))),256))]),o.value&&p.value?(l(),O(it,{key:0,"release-script":o.value,class:"mt-2"},{buttons:C(()=>[e("button",{class:L([{"btn-primary":c.value==="idle"||c.value==="saving","btn-success":c.value==="success","btn-danger":c.value==="error"},"mb-3 btn btn-sm btn-primary"]),onClick:s},[c.value==="idle"?(l(),n("i",vt)):_("",!0),c.value==="saving"?(l(),n("i",kt)):_("",!0),c.value==="success"?(l(),n("i",_t)):_("",!0),c.value==="error"?(l(),n("i",$t)):_("",!0),t[4]||(t[4]=b(" Save release script ",-1))],2)]),_:1},8,["release-script"])):_("",!0)]))}}),wt=["href"],T=E({__name:"ErrorLink",props:{short_repository_name:{},error:{},term:{}},setup(a){const p=a,o=N(()=>p.term?p.term:p.error),r=URLS.prefix;return(c,y)=>o.value.hasOwnProperty("origin")&&o.value.origin?(l(),n("a",{key:0,target:"_blank",href:`${F(r)}/edit/${a.short_repository_name}/${o.value.origin[0]}?row=${o.value.origin[1]}`},[q(c.$slots,"default",{},()=>[e("i",null,[y[3]||(y[3]=b(" at ",-1)),e("b",null,d(o.value.origin[0]),1),a.error&&"row"in a.error?(l(),n(g,{key:0},[y[0]||(y[0]=b(" row ",-1)),e("b",null,d(a.error.row),1)],64)):_("",!0),a.error&&"column"in a.error?(l(),n(g,{key:1},[y[1]||(y[1]=b(" column ",-1)),e("b",null,d(a.error.column),1)],64)):_("",!0),!a.error&&o.value.origin[1]>=0?(l(),n(g,{key:2},[y[2]||(y[2]=b(" row ",-1)),e("b",null,d(o.value.origin[1]),1)],64)):_("",!0)])])],8,wt)):_("",!0)}}),K=URLS.prefix;async function St(a,p,o){try{const c=await(await fetch(`${K}/api/external/guess-parent`,{method:"post",body:JSON.stringify({term:{id:a.id??void 0,label:a.label??void 0},parent:{id:o?.id??void 0,label:o?.label??void 0}}),headers:{"Content-Type":"application/json"}})).json();if(c)return c.map(y=>({...y,kind:"external"}))}catch{}return null}async function Ct(a,p,o){const r=o.term;if(await we({title:"Found an external parent",message:`An external parent <code>${r.label}</code> (<code>${r.id}</code>) of <code>${a.term.label}</code> (<code>${a.term.id}</code>) was found. Import the term?`,buttons:{confirm:{label:`Import ${r.id}`,className:"btn-success"},cancel:{label:"Cancel",className:"btn-warning"}}}))try{if((await fetch(`${K}/api/external/${p}/import`,{method:"post",body:JSON.stringify({terms:[{id:r.id,label:r.label}],ontologyId:o.ontology_id}),headers:{"Content-Type":"application/json"}})).ok)return"fixed"}catch{return"impossible"}return"loaded"}async function Ot(a,p,o){const r=await Se({title:"Found possible external parents",message:`Found ${a.length} possible external terms for <code>${p.parent.label}</code>. Select the correct parent term of <code>${p.term.label}</code> (<code>${p.term.id}</code>) if it is in the list.`,inputType:"select",inputOptions:a.map((c,y)=>({value:y.toString(),text:`${c.term.label} (${c.term.id})`})),buttons:{confirm:{label:"Import the selected term",className:"btn-success"},cancel:{label:"Cancel",className:"btn-warning"}}});if(r!==null){const c=a[+r],y=c.term;try{return(await fetch(`${K}/api/external/${o}/import`,{method:"post",body:JSON.stringify({terms:[{id:y.id,label:y.label}],ontologyId:c.ontology_id}),headers:{"Content-Type":"application/json"}})).ok?"fixed":"impossible"}catch{return"impossible"}}return"loaded"}async function At(a,p){const o=await St(a.term,p,a.parent);return o!==null&&o.length>0?o.length===1?await Ct(a,p,o[0]):await Ot(o,a,p):"impossible"}const Tt={key:0,class:"alert alert-success"},Nt={key:1},jt={class:"text-danger bg-danger-subtle rounded ps-1 pe-1"},It={class:"text-warning bg-warning-subtle rounded ps-1 pe-1"},Rt=["onClick"],Dt={key:0,class:"fa fa-spin fa-spinner"},Pt={key:1,class:"fa fa-check"},Et={key:2,class:"fa fa-close"},Ut={style:{"text-transform":"capitalize"}},Vt={key:0},Lt={key:1},Wt={key:2},Ft={key:3},Mt={class:"alert alert-warning val val-warning val-warning-type-{{ warning.type }} val-warning-source-{{ source }}",role:"alert"},Jt=["onClick"],Bt={key:0,class:"fa fa-spin fa-spinner"},Gt={key:1,class:"fa fa-check"},Ht={key:2,class:"fa fa-close"},qt=["onClick"],zt={key:0,class:"fa fa-spin fa-spinner"},Kt={key:1,class:"fa fa-check"},Xt={key:2,class:"fa fa-close"},Zt=E({__name:"Validation",props:{data:{},release:{},selectedSubStep:{}},emits:["release-control"],setup(a){const p=URLS.prefix,o=a,r=R({});function c(f){const s=JSON.stringify(f);return r.value[s]??null}const y=N(()=>o.data?Object.values(o.data).flatMap(f=>f.errors):null),w=N(()=>o.data?Object.values(o.data).flatMap(f=>f.warnings):null),v=N(()=>o.release.release_script.short_repository_name);async function k(f,s,i){const t=o.release.release_script.short_repository_name;try{return(await fetch(`${p}/api/edit/${t}/${f}`,{method:"PATCH",body:JSON.stringify({id:s,term:{id:i.id,parent:i.sub_class_of[0]?.label,label:i.label}}),headers:{"Content-Type":"application/json"}})).ok?"fixed":"impossible"}catch{return"impossible"}}async function A(f,s,i,t){const u=JSON.stringify(f);u in r.value&&r.value[u]!=="loaded"||(r.value[u]=await k(f?.term?.origin?.[0]??i?.origin?.[0],s,i))}async function U(f){let s=JSON.stringify(f);if(s in r.value&&r.value[s]!=="loaded")return;const i=o.release.release_script.short_repository_name;if(r.value[s]="loading",f.type==="unknown-parent")r.value[s]=await At(f,i);else if(f.type==="missing-import")try{(await fetch(`${p}/api/external/${i}/import`,{method:"post",body:JSON.stringify({terms:[{id:f.term.id,label:f.term.label}],ontologyId:f.term.id.split(":")[0]}),headers:{"Content-Type":"application/json"}})).ok&&(r.value[s]="fixed")}catch(t){r.value[s]="impossible",console.error(t)}else r.value[s]="impossible";r.value[s]=="loading"&&(r.value[s]="loaded")}return(f,s)=>(l(),n(g,null,[s[18]||(s[18]=e("h3",null,"Validation",-1)),!a.data||Object.keys(a.data).length===1&&"__progress"in a.data?(l(),O(F(z),{key:0,release:a.release,details:a.data||{}},{default:C(()=>[...s[0]||(s[0]=[b(" All excel files are now being validated. The results will be presented here soon. ",-1)])]),_:1},8,["release","details"])):(l(),n(g,{key:1},[y.value?.length==0&&w.value?.length==0?(l(),n("div",Tt,[...s[1]||(s[1]=[e("h5",null,"Everything ok",-1),b(" Good work! All files are valid. The release process will continue. ",-1)])])):(l(),n("p",Nt,[e("span",jt,d(y.value?.length??0)+" "+d(f.$filters.pluralise("error",y.value)),1),s[2]||(s[2]=b(" and ",-1)),e("span",It,d(w.value?.length??0)+" "+d(f.$filters.pluralise("warning",w.value)),1),s[3]||(s[3]=b(" were found during the validation. Please fix the errors and save the spreadsheets. Errors are problems which prevent the release from continuing. Warnings hint at possible problems, but the release might continue without solving them. When you fixed all errors, restart the release. If you just want to rerun the validation, restart the release as well. ",-1))])),(l(!0),n(g,null,D(a.data?Object.keys(a.data):[],i=>(l(),n(g,null,[a.selectedSubStep===null||a.selectedSubStep===i?(l(),n(g,{key:0},[(l(!0),n(g,null,D(a.data?.[i].errors,t=>(l(),n("div",{class:L([[`val-error-type-${t.type}`,`val-error-source-${i}`],"alert alert-danger val val-error"]),role:"alert"},[t.type==="unknown-parent"?(l(),n(g,{key:0},[S(I,{diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"]),a.release.release_script.short_repository_name.toLowerCase()!=="addicto"?(l(),n("button",{key:0,class:L([{"btn-success":c(t)==="fixed","btn-danger":c(t)==="impossible"},"btn btn-primary"]),onClick:u=>U(t)},[c(t)==="loading"?(l(),n("i",Dt)):_("",!0),c(t)==="fixed"?(l(),n("i",Pt)):_("",!0),c(t)==="impossible"?(l(),n("i",Et)):_("",!0),s[4]||(s[4]=b(" Try auto fix ",-1))],10,Rt)):_("",!0)],64)):t.type==="missing-parent"?(l(),O(I,{key:1,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="no-parent"?(l(),O(I,{key:2,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="ignored-parent"?(l(),O(I,{key:3,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="missing-label"?(l(),O(I,{key:4,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="missing-id"?(l(),O(I,{key:5,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="unknown-disjoint"?(l(),O(I,{key:6,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="unknown-relation-value"?(l(),O(I,{key:7,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="ignored-relation-value"?(l(),O(I,{key:8,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term??t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="unknown-range"?(l(),O(I,{key:9,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="unknown-domain"?(l(),O(I,{key:10,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="unknown-relation"?(l(),O(I,{key:11,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.relation},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"])):t.type==="duplicate"?(l(),n(g,{key:12},[s[11]||(s[11]=e("h5",null,"Conflicting entries (duplicates)",-1)),e("p",null,[b(" There are multiple terms for the "+d(t.duplicate_field)+" ",1),e("code",null,d(t.duplicate_value),1),s[5]||(s[5]=b(": ",-1))]),e("ul",null,[(l(!0),n(g,null,D(t.mismatches,u=>(l(),n("li",null,[e("p",null,[e("span",Ut,d(u.field),1),s[6]||(s[6]=b(" is ",-1)),["definition","curation status"].indexOf(u.field)>=0?(l(),n("code",Vt,d(u.a.relations.find(j=>j[0]?.label?.endsWith(u.field))?.[1]),1)):(l(),n("code",Lt,d(u.a[u.field]),1)),s[7]||(s[7]=e("br",null,null,-1)),S(T,{short_repository_name:v.value,term:u.a},null,8,["short_repository_name","term"]),s[8]||(s[8]=e("br",null,null,-1)),s[9]||(s[9]=b(" and ",-1)),["definition","curation status"].indexOf(u.field)>=0?(l(),n("code",Wt,d(u.b.relations.find(j=>j[0]?.label?.endsWith(u.field))?.[1]),1)):(l(),n("code",Ft,d(u.b[u.field]),1)),s[10]||(s[10]=e("br",null,null,-1)),S(T,{short_repository_name:v.value,term:u.b},null,8,["short_repository_name","term"])])]))),256))])],64)):(l(),n(g,{key:13},[e("h5",null,d(t.type.replace("-"," ")),1),e("p",null,[b(d(t.msg),1),s[12]||(s[12]=e("br",null,null,-1)),S(T,{error:t,short_repository_name:v.value},null,8,["error","short_repository_name"])]),e("pre",null,d(JSON.stringify(t,void 0,2)),1)],64))],2))),256)),(l(!0),n(g,null,D(a.data?.[i].warnings,t=>(l(),n("div",Mt,[t.type=="incomplete-term"?(l(),O(I,{key:0,diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value},null,8,["error","short_repository_name"])]),_:2},1032,["diagnostic"])):t.type==="unknown-column"?(l(),O(I,{key:1,diagnostic:t},null,8,["diagnostic"])):t.type==="missing-import"?(l(),n(g,{key:2},[S(I,{diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"]),e("button",{class:L([{"btn-success":c(t)==="fixed","btn-danger":c(t)==="impossible"},"btn btn-primary"]),onClick:u=>U(t)},[c(t)==="loading"?(l(),n("i",Bt)):_("",!0),c(t)==="fixed"?(l(),n("i",Gt)):_("",!0),c(t)==="impossible"?(l(),n("i",Ht)):_("",!0),s[13]||(s[13]=b(" Import ",-1))],10,Jt)],64)):t.type==="inconsistent-import"?(l(),n(g,{key:3},[S(I,{diagnostic:t},{default:C(()=>[S(T,{error:t,short_repository_name:v.value,term:t.term},null,8,["error","short_repository_name","term"])]),_:2},1032,["diagnostic"]),e("button",{class:L([{"btn-success":c(t)==="fixed","btn-danger":c(t)==="impossible"},"btn btn-primary"]),onClick:u=>A(t,t.term.id,{...t.term.id,label:t.term.label,id:t.term.id})},[c(t)==="loading"?(l(),n("i",zt)):_("",!0),c(t)==="fixed"?(l(),n("i",Kt)):_("",!0),c(t)==="impossible"?(l(),n("i",Xt)):_("",!0),s[16]||(s[16]=b(" Change ",-1)),t.term.id!==t.imported_term.id?(l(),n(g,{key:3},[s[14]||(s[14]=b(" ID to ",-1)),e("code",null,d(t.imported_term.id),1)],64)):(l(),n(g,{key:4},[s[15]||(s[15]=b("label to ",-1)),e("code",null,d(t.imported_term.label),1)],64))],10,qt)],64)):(l(),n(g,{key:4},[e("h5",null,d(t.type.replace("-"," ")),1),e("p",null,[b(d(t.msg),1),s[17]||(s[17]=e("br",null,null,-1)),S(T,{error:t,short_repository_name:v.value},null,8,["error","short_repository_name"])]),e("pre",null,d(JSON.stringify(t,void 0,2)),1)],64))]))),256))],64)):_("",!0)],64))),256))],64))],64))}}),Qt=["href","download"],Yt={class:"list-unstyled"},es={class:"ms-4"},ts={class:"form-check"},ss=["disabled"],ls={class:"ms-4"},ns={class:"form-check"},as=["disabled"],os={key:0,class:"ms-4"},is={class:"form-check"},rs=["disabled"],us=["disabled"],ds=E({__name:"HumanVerification",props:{data:{},release:{},selectedSubStep:{}},emits:["release-control"],setup(a){const p=a,o=R(p.release.state==="completed"),r=R(p.release.state==="completed"),c=R(p.release.state==="completed"),y=N(()=>!!p.data?.files?.find(v=>v.name.endsWith(".xlsx"))),w=N(()=>[r.value,o.value,!y.value||c.value].reduce((v,k)=>v&&k,!0));return(v,k)=>(l(),n(g,null,[k[7]||(k[7]=e("h3",null,"Verify the built ontologies",-1)),k[8]||(k[8]=e("p",null,[b(" Please download the built files and ontologies and open them in Protégé (download "),e("a",{href:"https://protege.stanford.edu/software.php#desktop-protege"},"here"),b(" or use "),e("a",{href:"https://webprotege.stanford.edu/"},"Web protege"),b("). ")],-1)),e("ul",null,[(l(!0),n(g,null,D(a.data?.files,A=>(l(),n("li",null,[e("a",{href:A.link,download:A.name},d(A.name),9,Qt)]))),256))]),k[9]||(k[9]=e("p",null," Check the following things: ",-1)),e("ul",Yt,[e("li",es,[e("div",ts,[V(e("input",{"onUpdate:modelValue":k[0]||(k[0]=A=>o.value=A),disabled:a.release.state!=="waiting-for-user",class:"form-check-input checklist",type:"checkbox",value:"",id:"chk-inferred"},null,8,ss),[[B,o.value]]),k[4]||(k[4]=e("label",{class:"form-check-label",for:"chk-inferred"}," Start the reasoner. Does the inferred hierarchy look alright? ",-1))])]),e("li",ls,[e("div",ns,[V(e("input",{"onUpdate:modelValue":k[1]||(k[1]=A=>r.value=A),disabled:a.release.state!=="waiting-for-user",class:"form-check-input checklist",type:"checkbox",value:"",id:"chk-labels"},null,8,as),[[B,r.value]]),k[5]||(k[5]=e("label",{class:"form-check-label",for:"chk-labels"}," Do the labels look alright? ",-1))])]),y.value?(l(),n("li",os,[e("div",is,[V(e("input",{"onUpdate:modelValue":k[2]||(k[2]=A=>c.value=A),disabled:a.release.state!=="waiting-for-user",class:"form-check-input checklist",type:"checkbox",value:"",id:"chk-hierarchical-spreadsheets"},null,8,rs),[[B,c.value]]),k[6]||(k[6]=e("label",{class:"form-check-label",for:"chk-hierarchical-spreadsheets"}," Do the hierarchy, labels, and other fields in the hierarchical spreadsheets look alright? ",-1))])])):_("",!0)]),e("button",{class:"btn btn-success w-100",id:"btn-publish-release",disabled:!w.value||a.release.state!=="waiting-for-user",onClick:k[3]||(k[3]=A=>v.$emit("release-control","continue"))}," Everything looks alright. Publish the release! ",8,us)],64))}}),cs={class:"alert alert-danger"},ps={key:1},ne=E({__name:"TechnicalError",props:{release:{},details:{}},setup(a){return(p,o)=>(l(),n(g,null,[o[4]||(o[4]=e("div",{class:"alert alert-danger"},[e("h4",null,"An error occurred while building the file"),e("p",null," A technical error occurred. Please contact an administrator. ")],-1)),(l(!0),n(g,null,D(a.details.errors,r=>(l(),n("div",cs,["code"in r?(l(),n(g,{key:0},[o[0]||(o[0]=e("h6",null,"Command",-1)),e("pre",null,d(r.command),1),o[1]||(o[1]=e("h6",null,"Return code",-1)),e("p",null,d(r.code),1),o[2]||(o[2]=e("h6",null,"Standard out",-1)),e("pre",null,d(r.out),1),o[3]||(o[3]=e("h6",null,"Standard error",-1)),e("pre",null,d(r.err),1)],64)):(l(),n("pre",ps,d(JSON.stringify(r,void 0,2)),1))]))),256))],64))}}),fs=E({__name:"GithubPublish",props:{data:{},release:{},selectedSubStep:{}},emits:["release-control"],setup(a){return(p,o)=>(l(),n(g,null,[o[3]||(o[3]=e("h3",null,"Publishing the release",-1)),a.release.state=="waiting-for-user"&&a.data&&(a.data.errors?.length??0)>0?(l(),O(ne,{key:0,release:a.release,details:a.data},null,8,["release","details"])):a.release.state==="completed"?(l(),n(g,{key:1},[o[0]||(o[0]=e("p",null," The ontologies are now published to github and the release is completed. ",-1)),o[1]||(o[1]=e("div",{class:"text-center w-100 text-success",style:{"font-size":"100px"}},[e("i",{class:"fa fa-check-double"})],-1))],64)):(l(),O(F(z),{key:2,details:a.data,release:a.release},{default:C(()=>[...o[2]||(o[2]=[b(" The ontologies are being published to github. ",-1)])]),_:1},8,["details","release"]))],64))}}),ms={key:2},gs=E({__name:"Generic",props:{data:{},release:{},step:{}},emits:["release-control"],setup(a){const p={PREPARATION:{title:"Preparation",running_text:"Excel files are downloaded to the server and prepared.",finished_text:"Excel files were downloaded to the server."},IMPORT_EXTERNAL:{title:"Building external dependencies",running_text:"External ontologies are now downloaded and converted. This might take a few minutes.",finished_text:"External ontologies were successfully downloaded and converted."},BUILD:{title:"Building OWL files",running_text:"OWL files are now build.",finished_text:"OWL files were successfully built."},MERGE:{title:"Merging files",running_text:"Multiple OWL files are being combined into one.",finished_text:"Multiple OWL files were combined into one."}},o=a;function r(v){return v.replace("_"," ").replace(/\w\S*/g,k=>k.charAt(0).toUpperCase()+k.substring(1).toLowerCase())}const c=N(()=>p[o.step.name]?.title??r(o.step.name??"<MISSING>")),y=N(()=>p[o.step.name]?.running_text??""),w=N(()=>p[o.step.name]?.finished_text??"");return(v,k)=>(l(),n(g,null,[e("h3",null,d(c.value),1),a.release.state=="waiting-for-user"&&a.data&&(a.data.errors?.length??0)>0?(l(),O(ne,{key:0,release:a.release,details:a.data},null,8,["release","details"])):(l(),O(F(z),{key:1,details:a.data,release:a.release},{default:C(()=>[b(d(y.value),1)]),_:1},8,["details","release"])),a.release.state==="completed"?(l(),n("p",ms,d(w.value),1)):_("",!0)],64))}}),bs={class:"release"},ys={class:"d-flex gap-2 align-items-center"},hs={id:"lbl-release-title"},vs={key:0,id:"release-info",class:"align-self-end mb-2 text-muted"},ks={key:0,class:"alert alert-danger"},_s={key:1,style:{display:"grid","grid-template-columns":"240px 1fr","grid-gap":"50px"},class:"text-start w-100",id:"release-core"},$s={class:"sidebar border",style:{"grid-column":"1"}},xs={class:"list-unstyled ps-2"},ws={class:"mb-1"},Ss={class:"d-flex align-items-center"},Cs=["onClick"],Os={key:0},As={key:0,class:"list-unstyled ms-4"},Ts={style:{display:"flex","align-items":"center"}},Ns={key:0,class:"fa fa-circle-exclamation text-danger"},js={key:1,class:"fa fa-triangle-exclamation text-warning"},Is={key:2,class:"fa fa-check-circle text-success"},Rs=["onClick"],Ds={key:0},Ps={class:"main",style:{"grid-column":"2"}},Es={key:0,class:"alert alert-danger"},Us={key:1,class:"alert alert-danger"},Vs={key:0,class:"loading"},Ls=E({__name:"Release",setup(a){const p=SERVER_DATA.repo,o=URLS.prefix,r=R(null),c=R(!1),y=R(null),w=R(null),v=R(null),k={VALIDATION:Zt,HUMAN_VERIFICATION:ds,GITHUB_PUBLISH:fs},A=ke({}),U=N(()=>({...k,...A.value}));async function f(){try{const h=await fetch(`${o}/api/plugins/`);if(!h.ok)return;const m=await h.json(),$={};for(const x of m)if(!(!x.has_static||!x.js_module||x.components.length===0))for(const P of x.components){const W=x.id,Y=x.js_module,fe=P.component_name;$[P.step_name]=he(ve(async()=>{const ee=await import(`${o}/api/plugins/${W}/static/${Y}`);return ee[fe]||ee.default}))}A.value=$}catch(h){console.error("Failed to load plugins:",h)}}const s=N(()=>r.value?.release_script.steps[w.value??r.value.step]??null),i=N(()=>U.value[s.value?.name]??gs),t=N(()=>{const h={data:u.value,release:r.value,selectedSubStep:v.value,step:s.value},m=i.value;if(m){const $=Object.keys(m.props);return Object.fromEntries(Object.entries(h).filter(([x,P])=>$.indexOf(x)>=0))}return null}),u=N(()=>r.value?.details[(w.value??r.value.step).toString()]);function j(h){if(h instanceof Object){const $=Object.entries(h).filter(([x,P])=>!x.startsWith("_")&&["warnings","errors","infos"].indexOf(x)<0&&Array.isArray(P?.warnings)&&Array.isArray(P?.errors));return $.length>0?Object.fromEntries($):null}return null}async function M(h=!1){const m=r.value?.id??`${p}/running`;c.value=h;try{let $=await fetch(`${o}/api/release/${m}`);$.ok?r.value=await $.json():r.value=null}catch{}finally{c.value=!1}}se(async()=>{await f();const h=window.location.pathname.split("/").slice(-1)[0],m=parseInt(h);isNaN(m)?await M(!0):r.value=await H(()=>fetch(`${o}/api/release/${m}`))??null});let G=null;function X(){G===null&&(G=setInterval(M,2e3))}const oe=te(r,(h,m)=>{m===null&&h!==null&&G===null&&h.state==="running"&&(oe(),X())}),ie=N(()=>{switch(r.value?.state){case void 0:case null:return["fa-regular","fa-file","text-black-50"];case"canceled":return["fa-regular","fa-circle-xmark","text-danger"];case"waiting-for-user":return["fa-solid","fa-user-clock","text-warning"];case"errored":return["fa-solid","fa-triangle-exclamation","text-danger"];case"completed":return["fa-regular","fa-circle-check","text-success"];default:return["fa-spinner","fa-spin","text-black-50"]}});async function H(h,m=null){try{c.value=!0;const $=await h();if($.ok){const x=await $.json();return m!==null?await m(x):x}else{const x=await $.json();y.value=x.error}c.value=!1}catch($){$ instanceof Error?y.value=$.message:y.value=`An unknown error occurred: ${$}`}finally{c.value=!1}}async function Z(h){const m=await H(()=>fetch(o+"/api/release/start",{method:"post",body:JSON.stringify(h),headers:{"Content-Type":"application/json"}}));m&&(r.value=m,window.location.pathname=`${o}/admin/release/${m.id}`)}async function Q(){r.value=await H(()=>fetch(`${o}/api/release/${p}/cancel`,{method:"post"}))??null}async function re(){const h=r.value?.release_script;h&&(await Q(),await Z(h))}function ue(h){const m=r.value?.details[h.toString()];if(m?.hasOwnProperty("errors")&&Array.isArray(m.errors))return m.errors.length;if(Array.isArray(m))return m.map($=>$.errors?.length).reduce(($,x)=>x+$,0)}function de(h){const m=r.value?.details[h.toString()];if(m?.hasOwnProperty("warnings")&&Array.isArray(m.warnings))return m.warnings.length;if(m)return Object.values(m).map($=>$.warnings?.length).reduce(($,x)=>x+$,0)}function ce(h){return(r.value?.step??0)>=h?ue(h)>0?"fa fa-triangle-exclamation text-danger".split(" "):de(h)>0?"fa fa-triangle-exclamation text-warning".split(" "):r.value?.step===h&&r.value.state!=="completed"?"fa-regular fa-circle text-primary".split(" "):"fa-regular fa-check-circle text-success".split(" "):"fa-regular fa-clock text-warning".split(" ")}async function pe(h){h==="continue"?(await fetch(`${o}/api/release/${p}/continue`),X()):console.warn(`No such release control type: '${h}'`)}return(h,m)=>(l(),n(g,null,[e("div",bs,[e("div",ys,[e("h1",hs,[e("i",{id:"icon-release",class:L(["fa",ie.value])},null,2),b(" Release "+d(F(p)),1)]),r.value?(l(),n("span",vs," started by "+d(r.value.started_by)+" on "+d(h.$filters.formatDate(r.value.start)),1)):_("",!0),m[3]||(m[3]=e("span",{class:"flex-fill"},null,-1)),r.value&&["running","waiting-for-user","errored"].indexOf(r.value.state)>=0?(l(),n(g,{key:1},[e("button",{class:"btn btn-warning",id:"btn-release-restart",onClick:re},[...m[1]||(m[1]=[e("i",{class:"fa fa-rotate-left"},null,-1),b(" Restart ",-1)])]),e("button",{class:"btn btn-danger",id:"btn-release-cancel",onClick:Q},[...m[2]||(m[2]=[e("i",{class:"fa fa-cancel"},null,-1),b(" Cancel ",-1)])])],64)):_("",!0)]),!r.value&&!c.value?(l(),n(g,{key:0},[y.value!==null?(l(),n("div",ks,[m[4]||(m[4]=e("h4",null,"An error occurred",-1)),b(" "+d(y.value),1)])):_("",!0),r.value?_("",!0):(l(),O(xt,{key:1,style:{"max-width":"1080px",margin:"0 auto"},repo:F(p),onSettingsConfirmed:m[0]||(m[0]=$=>Z($))},null,8,["repo"]))],64)):_("",!0),r.value!==null?(l(),n("div",_s,[e("div",$s,[e("ul",xs,[(l(!0),n(g,null,D(r.value.release_script.steps,($,x)=>(l(),n("li",ws,[e("div",Ss,[e("i",{class:L(ce(x))},null,2),e("a",{class:"btn border-0",onClick:P=>{w.value=x,v.value=null}},[(w.value!==null?w.value==x:r.value.step==x)?(l(),n("strong",Os,d(h.$filters.formatText($.name)),1)):(l(),n(g,{key:1},[b(d(h.$filters.formatText($.name)),1)],64))],8,Cs)]),j?(l(),n("ul",As,[(l(!0),n(g,null,D(j(r.value.details[x]),(P,W)=>(l(),n("li",Ts,[(P.errors?.length??0)>0?(l(),n("i",Ns)):(P.warnings?.length??0)>0?(l(),n("i",js)):(l(),n("i",Is)),e("a",{class:"btn border-0 text-truncate",onClick:Y=>v.value=v.value===W?null:W},[v.value===W?(l(),n("strong",Ds,d(W),1)):(l(),n(g,{key:1},[b(d(W),1)],64))],8,Rs)]))),256))])):_("",!0)]))),256))])]),e("div",Ps,[y.value!==null?(l(),n("div",Es,[m[5]||(m[5]=e("h4",null,"An error occurred",-1)),b(" "+d(y.value),1)])):_("",!0),u.value?.error?(l(),n("div",Us,[e("h4",null,"An error occurred: "+d(u.value.error.short),1),e("pre",null,d(u.value.error.long),1)])):_("",!0),(l(),O(ye(i.value),be(t.value,{onReleaseControl:pe}),null,16))])])):_("",!0)]),c.value?(l(),n("div",Vs,[...m[6]||(m[6]=[e("div",{class:"inner text-light"},[e("div",{class:"spinner-border",style:{width:"5rem",height:"5rem"},role:"status"}),e("h5",null,"Loading...")],-1)])])):_("",!0)],64))}}),Ws=le(Ls,[["__scopeId","data-v-41cdb91b"]]),ae=_e(Ws);ae.config.globalProperties.$filters=$e;ae.mount("#vue-app-release");
|
|
6
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sources":["../../../../../ose-js-core/src/release/ProgressIndicator.vue","../../../../../ose-js-app/src/release/ReleaseScriptViewer.vue","../../../../../ose-js-app/src/release/Setup.vue","../../../../../ose-js-app/src/release/ErrorLink.vue","../../../../../ose-js-app/src/release/autofix/guessParent.ts","../../../../../ose-js-app/src/release/steps/Validation.vue","../../../../../ose-js-app/src/release/steps/HumanVerification.vue","../../../../../ose-js-app/src/release/TechnicalError.vue","../../../../../ose-js-app/src/release/steps/GithubPublish.vue","../../../../../ose-js-app/src/release/steps/Generic.vue","../../../../../ose-js-app/src/release/Release.vue","../../../../../ose-js-app/src/release/main.ts"],"sourcesContent":["<script setup lang=\"ts\">\n\nimport type { Release } from \"../model\";\nimport {computed} from \"vue\";\n\nconst props = defineProps<{\n release?: Release\n details?: {\n [key: string]: any,\n __progress?: {\n position?: [number, number]\n progress: number\n current_item?: string\n message?: string\n }\n }\n}>()\n\nconst percent = computed(() => Math.round((props.details?.__progress?.progress ?? 0) * 100))\n\n</script>\n\n<template>\n <template v-if=\"release?.state == 'running'\">\n <p>\n <slot></slot>\n </p>\n\n <template v-if=\"details && '__progress' in details && details?.__progress\">\n <p class=\"text-secondary mb-3\">\n {{ details.__progress.message ?? \"Working on\" }} {{ details.__progress.current_item }}\n ({{ details.__progress?.position?.[0] }}/{{ details.__progress?.position?.[1] }})\n </p>\n <div class=\"progress\" role=\"progressbar\">\n <div class=\"progress-bar progress-bar-striped progress-bar-animated\"\n :style=\"{width: `${percent}%`}\">{{ percent }}%\n </div>\n </div>\n </template>\n <div v-else class=\"d-flex justify-content-center mt-5\">\n <div class=\"spinner-border text-primary\" role=\"status\" style=\"width: 5rem; height: 5rem\">\n <span class=\"visually-hidden\">Waiting...</span>\n </div>\n </div>\n </template>\n</template>\n\n<style scoped lang=\"scss\">\n\n</style>\n","<script lang=\"ts\" setup>\nimport {ReleaseScript} from \"@ose/js-core\";\nimport CollapsibleCard from \"../common/CollapsibleCard.vue\";\n\nconst props = defineProps<{\n releaseScript: ReleaseScript\n}>()\n\nfunction setAnnotations(name: string, annotations: string) {\n props.releaseScript.files[name].target.ontology_annotations =\n Object.fromEntries(annotations.split(\"\\n\").map(l => l.split(\": \")))\n}\n\nfunction setArgs(step: number, args: string) {\n props.releaseScript.steps[step].args = Object.fromEntries(args\n .split(\"\\n\")\n .map(l => l.split(\": \"))\n .map(([k, v]) => {\n if (v === \"true\") {\n return [k, true]\n } else if (v === \"false\") {\n return [k, false]\n } else if (!isNaN(Number(v))) {\n return [k, Number(v)]\n } else {\n return [k, v]\n }\n }))\n}\n\nfunction addDependency(name: string) {\n bootbox.prompt({\n title: `Add dependency for ${name}`,\n inputType: \"select\",\n inputOptions: Object.entries(props.releaseScript.files)\n .filter(([k, _]) => k != name)\n .map(([k, v]) => ({\n text: v.target.file,\n value: k\n })),\n callback(value: string) {\n if (value) {\n props.releaseScript.files[name].needs.push(value)\n }\n }\n })\n}\n\nfunction deleteDependency(name: string, dependency: string) {\n props.releaseScript.files[name].needs = props.releaseScript.files[name].needs.filter(x => x != dependency)\n}\n\nfunction addFile() {\n bootbox.prompt({\n title: `What is the name of the file?`,\n inputType: \"text\",\n callback(value: string) {\n if (value) {\n value = value.trim().replace(/[ ,./\\-!?=]/, \"_\")\n props.releaseScript.files[value] = {\n target: {\n file: \"\",\n iri: \"\",\n ontology_annotations: {}\n },\n sources: [],\n needs: []\n }\n }\n }\n })\n}\n\nfunction renameFile(event: MouseEvent, name: string) {\n event.preventDefault();\n\n bootbox.prompt({\n title: `What is the name of the file?`,\n inputType: \"text\",\n value: name,\n callback(value: string) {\n if (value) {\n value = value.trim().replace(/[ ,./\\-!?=]/, \"_\")\n props.releaseScript.files[value] = props.releaseScript.files[name]\n delete props.releaseScript.files[name]\n }\n }\n })\n}\n\nfunction addStep(event: MouseEvent, before: number) {\n event.preventDefault()\n\n props.releaseScript.steps.splice(before, 0, {args: {}, name: \"NEW_STEP\"})\n}\n\nfunction deleteStep(event: MouseEvent, index: number) {\n event.preventDefault()\n\n const step = props.releaseScript.steps[index]\n\n bootbox.confirm({\n title: `Delete step '${step.name}'`,\n message: `Do you want to remove the release step '${step.name}'?`,\n buttons: {\n confirm: {\n label: `Delete ${step.name}`,\n className: \"btn-danger\",\n },\n cancel: {\n label: \"Keep it\",\n className: \"btn-success\"\n }\n },\n callback(result: boolean) {\n if (result) {\n props.releaseScript.steps.splice(index, 1)\n }\n }\n })\n}\n\nfunction deleteFile(event: MouseEvent, name: string) {\n\n event.preventDefault();\n bootbox.confirm({\n title: `Delete '${name}'`,\n message: `Do you want to delete the file '${name}'? It will remove the file ${props.releaseScript.files[name].target.file} from the release.`,\n buttons: {\n confirm: {\n label: `Delete ${name}`,\n className: \"btn-danger\",\n },\n cancel: {\n label: \"Keep it\",\n className: \"btn-success\"\n }\n },\n callback(result: boolean) {\n if (result) {\n delete props.releaseScript.files[name]\n }\n }\n })\n}\n\n</script>\n\n<template>\n\n <div class=\"files\">\n <h3>Files</h3>\n <CollapsibleCard v-for=\"(file, name) in releaseScript.files\">\n <template #title>\n {{ name }} - {{ file.target.file }}\n <span class=\"badge text-bg-secondary\">{{ file.sources.length }} sources</span>\n <span v-if=\"file.needs.length > 0\" class=\"badge text-bg-secondary ms-1\">{{\n file.needs.length\n }} dependencies</span>\n </template>\n <template #buttons>\n <button class=\"btn btn-primary btn-sm btn-circle\" @click=\"renameFile($event, name)\"><i class=\"fa fa-edit\"></i>\n </button>\n <button class=\"btn btn-danger btn-sm btn-circle\" @click=\"deleteFile($event, name)\"><i class=\"fa fa-trash\"></i>\n </button>\n </template>\n <template #body>\n <div class=\"release-file-settings\">\n <h6>Target settings</h6>\n <p class=\"text-body-secondary\">Define the location of the target file in the repository and define the IRI of\n the resulting ontology.</p>\n <div class=\"form-check form-switch mb-3\">\n <input v-model=\"file.target.publish\" class=\"form-check-input\" role=\"switch\" type=\"checkbox\">\n <span class=\"form-check-label\">Publish the file to GitHub</span>\n </div>\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Path</span>\n <input v-model=\"file.target.file\" class=\"form-control\" type=\"text\">\n </div>\n\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">IRI</span>\n <input v-model=\"file.target.iri\" class=\"form-control\" type=\"text\">\n </div>\n\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Annotations</span>\n <textarea :value=\"Object.entries(file.target.ontology_annotations).map(([k,v]) => `${k}: ${v}`).join('\\n')\"\n class=\"form-control\"\n @change=\"setAnnotations(name, $event.target?.value)\">\n </textarea>\n </div>\n\n\n <h6>Source settings</h6>\n <p class=\"text-body-secondary\">\n Add files that contain terms, individuals, and relations which should be\n included in the OWL ontology. Alternatively, add previously built owl files which should be merged to built\n the target ontology.\n </p>\n <template v-for=\"source in file.sources\">\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Source</span>\n <input v-model=\"source.file\" class=\"form-control\" type=\"text\">\n\n <span class=\"input-group-text\">Type</span>\n <select v-model=\"source.type\" class=\"form-select\" style=\"flex: unset; width: auto\">\n <option value=\"classes\">Classes</option>\n <option value=\"relations\">Relations</option>\n <option value=\"individuals\">Individuals</option>\n <option value=\"owl\">OWL</option>\n </select>\n <button class=\"btn btn-danger\" @click=\"file.sources = file.sources.filter(x => x != source)\">\n <i class=\"fa fa-trash\"></i>\n </button>\n </div>\n </template>\n <button class=\"mb-3 btn btn-sm btn-primary add-dependency\"\n @click=\"file.sources.push({file: '', type: 'classes'})\">\n <i class=\"fa fa-add\"></i>\n Add source\n </button>\n\n\n <h6>Dependency settings</h6>\n <p class=\"text-body-secondary\">\n Specify which other files have to be loaded when building this file.\n </p>\n\n <template v-for=\"need in file.needs\">\n\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Dependency</span>\n <input :value=\"releaseScript.files[need]?.target.file ?? need\" class=\"form-control\"\n disabled type=\"text\">\n <button class=\"btn btn-danger\" @click=\"deleteDependency(name, need)\">\n <i class=\"fa fa-trash\"></i>\n </button>\n </div>\n </template>\n <button class=\"mb-3 btn btn-sm btn-primary add-dependency\" @click=\"addDependency(name)\">\n <i class=\"fa fa-add\"></i>\n Add dependency\n </button>\n </div>\n </template>\n </CollapsibleCard>\n <div class=\"d-flex gap-2\">\n <button class=\"mb-3 btn btn-sm btn-primary add-file\" @click=\"addFile\">\n <i class=\"fa fa-add\"></i>\n Add file\n </button>\n </div>\n </div>\n\n\n <h3>Steps</h3>\n <button class=\"btn btn-outline-primary add-step mb-3\" @click=\"addStep($event, 0)\">\n <i class=\"fa fa-plus-square\"></i> Add step here\n </button>\n <template v-for=\"(step, index) in releaseScript.steps\">\n <div class=\"header\">\n <h6> {{ step.name }}</h6>\n <span></span>\n <button class=\"btn btn-danger btn-sm btn-circle\" style=\"margin-bottom: .5rem\" @click=\"deleteStep($event, index)\">\n <i class=\"fa fa-trash\"></i>\n </button>\n </div>\n <div class=\"input-group input-group-sm mb-1\">\n <span class=\"input-group-text\">Release step</span>\n <input v-model=\"step.name\" class=\"form-control\" type=\"text\">\n </div>\n\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Arguments</span>\n <textarea :value=\"Object.entries(step.args).map(([k,v]) => `${k}: ${v}`).join('\\n')\"\n class=\"form-control\"\n @change=\"setArgs(index, $event.target?.value)\">\n </textarea>\n </div>\n <button class=\"btn btn-outline-primary add-step mb-3\" @click=\"addStep($event, index + 1)\">\n <i class=\"fa fa-plus-square\"></i> Add step here\n </button>\n </template>\n\n\n <div class=\"d-flex gap-2\">\n <slot name=\"buttons\"></slot>\n </div>\n\n\n</template>\n\n<style lang=\"scss\" scoped>\n\n.release-file-settings {\n display: grid;\n grid-template-columns: 1fr auto;\n grid-gap: 0 16px;\n\n & > h6, & > p {\n grid-column: 1/3\n }\n\n & > .input-group {\n grid-column: 1;\n }\n\n & > label {\n grid-column: 1;\n }\n\n & > .btn {\n width: fit-content;\n justify-self: start;\n grid-column: 1;\n }\n}\n\n.files {\n display: flex;\n flex-direction: column;\n gap: 14px\n}\n\n.btn.add-file {\n width: fit-content;\n}\n\n.header {\n display: flex;\n gap: 14px;\n\n .title {\n font-size: large;\n }\n\n span {\n flex-grow: 1;\n }\n\n i {\n align-self: center;\n transition: transform 1s;\n }\n}\n\n.btn.add-step {\n width: 100%;\n border-style: dashed;\n}\n\n</style>\n","<script lang=\"ts\" setup>\nimport {computed, onMounted, Ref, ref, watch} from \"vue\";\nimport {Release, ReleaseScript} from \"@ose/js-core\"\nimport ReleaseScriptViewer from \"./ReleaseScriptViewer.vue\";\n\nconst showAdvanced = ref<boolean>()\nconst releaseScript: Ref<ReleaseScript | null> = ref(null);\ndeclare var URLS: { [key: string]: any }\nconst prefix_url = URLS.prefix\n\nconst saving = ref<\"idle\" | \"saving\" | \"error\" | \"success\">(\"idle\")\n\nconst props = defineProps<{ repo?: string }>()\n\nconst lastReleases = ref<Release[] | null>(null)\n\nconst loading = computed(() => lastReleases.value === null)\nconst lastSuccessfulRelease = computed(() => lastReleases.value?.find(x => x.state === \"completed\") ?? null)\nconst lastRelease = computed(() => lastReleases.value?.[0] ?? null)\n\ndefineEmits<{\n (e: 'settingsConfirmed', script: ReleaseScript): void\n}>()\n\nwatch(props, (value, oldValue) => value.repo !== oldValue.repo && update())\n\nasync function update() {\n if (props.repo) {\n releaseScript.value = null\n releaseScript.value = await (await fetch(`${prefix_url}/api/release/${props.repo}/release_script`)).json()\n\n const releases: Release[] = await (await fetch(`${prefix_url}/api/release/${props.repo}`)).json()\n releases.sort((a, b) => new Date(a.start).getTime() - new Date(b.start).getTime())\n lastReleases.value = releases\n }\n}\n\nlet _saveFileAnimationTimeout: number | null = null;\n\nasync function saveFile($event: MouseEvent) {\n $event.preventDefault()\n\n if (_saveFileAnimationTimeout !== null) {\n clearTimeout(_saveFileAnimationTimeout)\n }\n\n saving.value = \"saving\"\n\n try {\n const response = await fetch(`${prefix_url}/api/release/${props.repo}/release_script`, {\n method: \"PUT\",\n headers: {\n 'Content-Type': \"application/json\"\n },\n body: JSON.stringify(releaseScript.value)\n })\n\n if (response.ok) {\n saving.value = \"success\";\n } else {\n saving.value = \"error\"\n }\n } catch (e) {\n saving.value = \"error\"\n }\n\n _saveFileAnimationTimeout = setTimeout(() => {\n saving.value = \"idle\";\n _saveFileAnimationTimeout = null\n }, 5000)\n}\n\nonMounted(() => update())\n\n</script>\n\n<template>\n\n <div class=\"preparation\">\n\n <h3>Release setup</h3>\n <p>\n Currently, there is no release running for {{ repo }}.\n <template v-if=\"loading\">\n <span class=\"placeholder\" style=\"width: 400px\"></span>\n </template>\n <template v-else-if=\"lastSuccessfulRelease\">\n {{ lastSuccessfulRelease.started_by }} started the last successful release on\n {{ $filters.formatDate(lastSuccessfulRelease.start) }}\n </template>\n <template v-else-if=\"lastRelease\">\n {{ lastRelease.started_by }} started the last release on {{ $filters.formatDate(lastRelease.start) }}. But it\n did not complete.\n </template>\n <template v-else>\n There have been no releases in the near past.\n </template>\n </p>\n\n <div class=\"btn-group w-100\">\n\n <button :disabled=\"!releaseScript\" class=\"btn btn-success\"\n @click=\"$emit('settingsConfirmed', releaseScript)\">\n <i class=\"fa fa-play\"></i>\n Start a release\n </button>\n <button :disabled=\"!releaseScript\" class=\"btn btn-success dropdown-toggle dropdown-toggle-split flex-grow-0\"\n data-bs-toggle=\"dropdown\"\n type=\"button\">\n </button>\n\n <ul class=\"dropdown-menu\">\n <li><a class=\"dropdown-item\" href=\"#\" @click=\"showAdvanced = !showAdvanced\">\n <i :class=\"[showAdvanced ? 'fa-check-square' : 'fa-square']\" class=\"fa-regular\"></i> Show advanced\n configuration\n </a></li>\n </ul>\n </div>\n <ul class=\"list-group mt-2\">\n <li v-for=\"release in lastReleases\" class=\"list-group-item \">\n <a class=\" d-flex justify-content-between align-items-start\" style=\"text-decoration: none; color: inherit\" :href=\"`${release.id}`\">\n <div class=\"ms-2 me-auto\">\n <div class=\"fw-bold\">{{ $filters.formatDate(release.start) }}</div>\n {{ release.started_by }}\n </div>\n <span class=\"badge rounded-pill\" :class=\"{\n 'text-bg-primary': ['running', 'waiting-for-user'].indexOf(release.state) >=0,\n 'text-bg-success': release.state === 'success',\n 'text-bg-error': release.state === 'errored',\n 'text-bg-secondary': release.state === 'canceled',\n }\">{{ release.state }}</span>\n </a>\n </li>\n </ul>\n\n\n <ReleaseScriptViewer v-if=\"!!releaseScript && showAdvanced\" :release-script=\"releaseScript\"\n class=\"mt-2\">\n <template v-slot:buttons>\n <button :class=\"({\n 'btn-primary': saving === 'idle' || saving === 'saving',\n 'btn-success': saving === 'success',\n 'btn-danger': saving === 'error'\n })\"\n class=\"mb-3 btn btn-sm btn-primary\"\n @click=\"saveFile\">\n <i v-if=\"saving === 'idle'\" class=\"fa fa-save\"></i>\n <i v-if=\"saving === 'saving'\" class=\"fa fa-spin fa-spinner\"></i>\n <i v-if=\"saving === 'success'\" class=\"fa fa-check\"></i>\n <i v-if=\"saving === 'error'\" class=\"fa fa-xmark\"></i>\n Save release script\n </button>\n </template>\n </ReleaseScriptViewer>\n </div>\n</template>\n\n<style scoped>\n\n</style>\n","<script setup lang=\"ts\">\n\nimport {computed} from \"vue\";\nimport {Diagnostic, Term} from \"@ose/js-core\";\n\nconst props = defineProps<{\n short_repository_name: string,\n error?: Diagnostic,\n term: Term\n} | {\n short_repository_name: string,\n error: Diagnostic,\n term?: Term\n}>()\ndeclare var URLS: { [key: string]: any }\nconst item = computed(() => (!!props.term ? props.term : props.error)!)\nconst prefix_url = URLS.prefix\n</script>\n\n<template>\n <template v-if=\"item.hasOwnProperty('origin') && item.origin\">\n <a target=\"_blank\"\n :href=\"`${prefix_url}/edit/${short_repository_name}/${item.origin[0]}?row=${item.origin[1]}`\">\n <slot>\n <i>\n at <b>{{ item.origin[0] }}</b>\n <template v-if=\"error && 'row' in error\"> row <b>{{ error['row'] }}</b></template>\n <template v-if=\"error && 'column' in error\"> column <b>{{ error.column }}</b></template>\n <template v-if=\"!error && item.origin[1] >= 0\"> row <b>{{ item.origin[1] }}</b></template>\n </i>\n </slot>\n </a>\n </template>\n</template>\n\n<style scoped lang=\"scss\">\n\n</style>\n","import {AutoFixState, Diagnostic, Term, TermIdentifier} from \"@ose/js-core\";\nimport {confirmDialog, promptDialog} from \"../../common/bootbox\";\n\nexport interface ParentGuess {\n ontology_id: string,\n term: TermIdentifier,\n kind: \"internal\" | \"external\"\n}\n\ndeclare var URLS: { [key: string]: any }\nconst prefix_url = URLS.prefix\n\n// async function guessInternal(_: Term, repo: string, defined_parent?: TermIdentifier): Promise<ParentGuess[] | null> {\n// if (!defined_parent || !defined_parent.label) {\n// return null\n// }\n//\n// try {\n// const response = await fetch(`${prefix_url}/api/search/${repo}?` + new URLSearchParams({\n// label: defined_parent.label\n// }))\n//\n// const data: any[] = await response.json()\n// return data.flatMap((x: any) => x[\"label\"] && x[\"class_id\"] ? [{\n// term: {\n// label: x[\"label\"],\n// id: x[\"class_id\"]\n// },\n// ontology_id: repo,\n// kind: \"internal\"\n// }] : [])\n// }catch {}\n//\n// return null\n// }\n\nexport async function guessExternal(term: Term, _: string, defined_parent?: TermIdentifier): Promise<ParentGuess[] | null> {\n try {\n const response = await fetch(`${prefix_url}/api/external/guess-parent`, {\n method: \"post\",\n body: JSON.stringify({\n term: {\n id: term.id ?? undefined,\n label: term.label ?? undefined\n },\n parent: {\n id: defined_parent?.id ?? undefined,\n label: defined_parent?.label ?? undefined\n },\n }),\n headers: {\n \"Content-Type\": \"application/json\"\n }\n })\n\n const parent: ParentGuess[] = await response.json()\n if (parent) {\n return parent.map(x => ({...x, kind: \"external\"}))\n }\n } catch {\n }\n\n return null\n}\n\n\nasync function singleExternalGuess(error: Diagnostic, repo: string, guess: ParentGuess): Promise<AutoFixState> {\n const parent = guess.term\n const result = await confirmDialog({\n title: \"Found an external parent\",\n message:\n `An external parent <code>${parent.label}</code> (<code>${parent.id}</code>) of ` +\n `<code>${error.term.label}</code> (<code>${error.term.id}</code>) was found. Import the term?`,\n buttons: {\n confirm: {\n label: `Import ${parent.id}`,\n className: \"btn-success\",\n },\n cancel: {\n label: \"Cancel\",\n className: \"btn-warning\"\n }\n }\n })\n\n if (result) {\n try {\n const response = await fetch(`${prefix_url}/api/external/${repo}/import`, {\n method: \"post\",\n body: JSON.stringify({\n terms: [{id: parent.id, label: parent.label}],\n ontologyId: guess.ontology_id\n }),\n headers: {\"Content-Type\": \"application/json\"}\n })\n\n if (response.ok) {\n return \"fixed\"\n }\n } catch {\n return \"impossible\"\n }\n }\n\n return \"loaded\"\n}\n\nasync function multipleExternalGuesses(guesses: ParentGuess[], error: Diagnostic, repo: string): Promise<AutoFixState> {\n const index = await promptDialog({\n title: \"Found possible external parents\",\n message:\n `Found ${guesses.length} possible external terms for <code>${error.parent.label}</code>. ` +\n `Select the correct parent term of <code>${error.term.label}</code> (<code>${error.term.id}</code>) ` +\n `if it is in the list.`,\n inputType: \"select\",\n inputOptions: guesses.map((g, i) => ({value: i.toString(), text: `${g.term.label} (${g.term.id})`})),\n buttons: {\n confirm: {\n label: `Import the selected term`,\n className: \"btn-success\",\n },\n cancel: {\n label: \"Cancel\",\n className: \"btn-warning\"\n }\n }\n })\n\n if (index !== null) {\n const guess = guesses[+index]\n const parent = guess.term;\n try {\n const response = await fetch(`${prefix_url}/api/external/${repo}/import`, {\n method: \"post\",\n body: JSON.stringify({\n terms: [{\n id: parent.id,\n label: parent.label\n }],\n ontologyId: guess.ontology_id\n }),\n headers: {\"Content-Type\": \"application/json\"}\n })\n\n if (response.ok) {\n return \"fixed\"\n } else {\n return \"impossible\"\n }\n } catch {\n return \"impossible\"\n }\n }\n\n return \"loaded\"\n}\n\n\n// async function multipleInternalGuesses(guesses: ParentGuess[], error: Diagnostic, repo: string): Promise<AutoFixState> {\n// const index = await promptDialog({\n// title: `Found possible parent in ${repo}`,\n// message:\n// `Found ${guesses.length} possible terms for <code>${error.parent.label}</code> in ${repo}. ` +\n// `Select the correct parent term of <code>${error.term.label}</code> (<code>${error.term.id}</code>) ` +\n// `if it is in the list or search for external terms.`,\n// inputType: \"select\",\n// inputOptions: guesses.map((g, i) => ({value: i.toString(), text: `${g.term.label} (${g.term.id})`})),\n// buttons: {\n// confirm: {\n// label: `Set as parent`,\n// className: \"btn-success\",\n// },\n// cancel: {\n// label: \"Search for external term\",\n// className: \"btn-primary\"\n// }\n// }\n// })\n//\n// if (index !== null) {\n// const guess = guesses[+index]\n// const parent = guess.term;\n// try {\n// const response = await fetch(`${prefix_url}/api/edit/${repo}/${error.term.origin[0]}`, {\n// method: \"PATCH\",\n// body: JSON.stringify({\n// id: error.term.id,\n// term: {\n// id: error.term.id,\n// parent: parent.label\n// }\n// }),\n// headers: {\"Content-Type\": \"application/json\"}\n// })\n//\n// if (response.ok) {\n// return \"fixed\"\n// } else {\n// return \"impossible\"\n// }\n// } catch {\n// return \"impossible\"\n// }\n// }\n//\n// return \"loaded\"\n// }\n\nexport async function guessParent(error: Diagnostic, repo: string): Promise<AutoFixState> {\n // let guesses = await guessInternal(error.term, repo, error.parent)\n // if (guesses !== null && guesses.length > 0) {\n // const response = await multipleInternalGuesses(guesses, error, repo)\n // if (response !== \"loaded\") {\n // return response\n // }\n // }\n\n const guesses = await guessExternal(error.term, repo, error.parent)\n if (guesses !== null && guesses.length > 0) {\n if (guesses.length === 1) {\n return await singleExternalGuess(error, repo, guesses[0])\n } else {\n return await multipleExternalGuesses(guesses, error, repo);\n }\n }\n\n return \"impossible\"\n}\n","<script setup lang=\"ts\">\nimport {computed, ref} from \"vue\";\nimport {AutoFixState, Diagnostic as DiagnosticM, Release, Term, ProgressIndicator} from \"@ose/js-core\";\nimport ErrorLink from \"../ErrorLink.vue\";\nimport {guessParent} from \"../autofix/guessParent\"\nimport Diagnostic from \"../../common/Diagnostic.vue\";\n\ndeclare var URLS: { [key: string]: any }\nconst prefix_url = URLS.prefix\n\nconst props = defineProps<{\n data: {\n [K: string]: {\n errors: DiagnosticM[],\n warnings: DiagnosticM[],\n info: DiagnosticM[]\n }\n } | null,\n release: Release,\n selectedSubStep: string | null\n}>()\n\ndefineEmits<{\n (e: 'release-control', type: string, ...args: any[]): void\n}>()\n\nconst autoFixStates = ref<{ [k: string]: AutoFixState }>({})\n\nfunction autoFixState(diag: DiagnosticM): AutoFixState | null {\n const id = JSON.stringify(diag)\n return autoFixStates.value[id] ?? null\n}\n\nconst errors = computed<DiagnosticM[] | null>(() => {\n if (!props.data) {\n return null\n }\n\n return Object.values(props.data).flatMap((v) => v.errors)\n})\nconst warnings = computed<any[] | null>(() => {\n if (!props.data) {\n return null\n }\n\n return Object.values(props.data).flatMap((v) => v.warnings)\n})\n\nconst shortRepoName = computed(() => props.release.release_script.short_repository_name)\n\nasync function updateTerm(path: string, id: Term, term: Term): Promise<AutoFixState> {\n const repo = props.release.release_script.short_repository_name\n\n try {\n const response = await fetch(`${prefix_url}/api/edit/${repo}/${path}`, {\n method: \"PATCH\",\n body: JSON.stringify({\n id: id,\n term: {\n id: term.id,\n parent: term.sub_class_of[0]?.label,\n label: term.label\n }\n }),\n headers: {\"Content-Type\": \"application/json\"}\n })\n\n if (response.ok) {\n return \"fixed\"\n } else {\n return \"impossible\"\n }\n } catch {\n return \"impossible\"\n }\n}\n\nasync function autofixUpdateTerm(error: DiagnosticM, id: string, term: Term, path?: string) {\n const wid = JSON.stringify(error)\n if (wid in autoFixStates.value && autoFixStates.value[wid] !== \"loaded\") {\n return\n }\n\n autoFixStates.value[wid] = await updateTerm(path ?? error?.term?.origin?.[0] ?? term?.origin?.[0], id, term)\n}\n\nasync function autofix(error: DiagnosticM) {\n let id = JSON.stringify(error)\n if (id in autoFixStates.value && autoFixStates.value[id] !== \"loaded\") {\n return\n }\n\n const repo = props.release.release_script.short_repository_name;\n autoFixStates.value[id] = \"loading\"\n if (error.type === \"unknown-parent\") {\n autoFixStates.value[id] = await guessParent(error, repo)\n } else if (error.type === \"missing-import\") {\n try {\n const response = await fetch(`${prefix_url}/api/external/${repo}/import`, {\n method: \"post\",\n body: JSON.stringify({\n terms: [{id: error.term.id, label: error.term.label}],\n ontologyId: error.term.id.split(\":\")[0]\n }),\n headers: {\"Content-Type\": \"application/json\"}\n })\n\n if (response.ok) {\n autoFixStates.value[id] = \"fixed\"\n }\n } catch (e) {\n autoFixStates.value[id] = \"impossible\"\n console.error(e)\n }\n } else {\n autoFixStates.value[id] = \"impossible\"\n }\n\n if (autoFixStates.value[id] == \"loading\") {\n autoFixStates.value[id] = \"loaded\"\n }\n}\n\n</script>\n\n<template>\n <h3>Validation</h3>\n\n <template v-if=\"!data || Object.keys(data).length === 1 && '__progress' in data\">\n <ProgressIndicator :release=\"release\" :details=\"data || {}\">\n All excel files are now being validated. The results will be presented here soon.\n </ProgressIndicator>\n </template>\n <template v-else>\n <div class=\"alert alert-success\" v-if=\"errors?.length == 0 && warnings?.length == 0\">\n <h5>Everything ok</h5>\n Good work! All files are valid. The release process will continue.\n </div>\n <p v-else>\n <span class=\"text-danger bg-danger-subtle rounded ps-1 pe-1\">{{\n errors?.length ?? 0\n }} {{ $filters.pluralise(\"error\", errors) }}</span> and\n <span class=\"text-warning bg-warning-subtle rounded ps-1 pe-1\">{{\n warnings?.length ?? 0\n }} {{ $filters.pluralise(\"warning\", warnings) }}</span>\n were found during the validation. Please fix the errors and save the spreadsheets. Errors are problems which\n prevent\n the release from continuing. Warnings hint at possible problems, but the release might continue without solving\n them.\n When you fixed all errors, restart the release. If you just want to rerun the\n validation, restart the release as well.\n </p>\n\n <template v-for=\"source in data ? Object.keys(data) : []\">\n <template v-if=\"selectedSubStep === null || selectedSubStep === source\">\n <div v-for=\"error in data?.[source].errors\"\n :class=\"[`val-error-type-${error.type}`, `val-error-source-${source}`]\"\n class=\"alert alert-danger val val-error\"\n role=\"alert\">\n\n <template v-if=\"error.type === 'unknown-parent'\">\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n\n <button v-if=\"release.release_script.short_repository_name.toLowerCase() !== 'addicto'\"\n :class=\"{'btn-success': autoFixState(error) === 'fixed', 'btn-danger': autoFixState(error) === 'impossible'}\"\n class=\"btn btn-primary\"\n @click=\"autofix(error)\">\n <i v-if=\"autoFixState(error) === 'loading'\" class=\"fa fa-spin fa-spinner\"></i>\n <i v-if=\"autoFixState(error) === 'fixed'\" class=\"fa fa-check\"></i>\n <i v-if=\"autoFixState(error) === 'impossible'\" class=\"fa fa-close\"></i>\n Try auto fix\n </button>\n\n\n </template>\n <template v-else-if=\"error.type === 'missing-parent'\">\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'no-parent'\">\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'ignored-parent'\">\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'missing-label'\">\n\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'missing-id'\">\n\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'unknown-disjoint'\">\n\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'unknown-relation-value'\">\n\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'ignored-relation-value'\">\n\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.term ?? error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'unknown-range'\">\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'unknown-domain'\">\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'unknown-relation'\">\n\n <Diagnostic :diagnostic=\"error\">\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"\n :term=\"error.relation\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"error.type === 'duplicate'\">\n <h5>Conflicting entries (duplicates)</h5>\n <p>\n There are multiple terms for the {{ error.duplicate_field }} <code>{{ error.duplicate_value }}</code>:\n </p>\n <ul>\n <li v-for=\"mismatch in error.mismatches\">\n <p>\n <span style=\"text-transform: capitalize\">{{ mismatch.field }}</span> is\n <code v-if=\"['definition', 'curation status'].indexOf(mismatch.field) >= 0\">\n {{\n mismatch.a.relations.find(x => x[0]?.label?.endsWith(mismatch.field))?.[1]\n }}\n </code>\n <code v-else>{{ mismatch.a[mismatch.field] }}</code>\n <br>\n <ErrorLink :short_repository_name=\"shortRepoName\" :term=\"mismatch.a\"></ErrorLink>\n <br>\n and\n <code v-if=\"['definition', 'curation status'].indexOf(mismatch.field) >= 0\">\n {{\n mismatch.b.relations.find(x => x[0]?.label?.endsWith(mismatch.field))?.[1]\n }}\n </code>\n <code v-else>{{ mismatch.b[mismatch.field] }}</code>\n <br>\n <ErrorLink :short_repository_name=\"shortRepoName\" :term=\"mismatch.b\"></ErrorLink>\n </p>\n </li>\n </ul>\n </template>\n <template v-else>\n <h5>{{ error.type.replace(\"-\", \" \") }}</h5>\n <p>\n {{ error.msg }}<br>\n\n <ErrorLink :error=\"error\" :short_repository_name=\"shortRepoName\"></ErrorLink>\n </p>\n <pre>{{ JSON.stringify(error, undefined, 2) }}</pre>\n </template>\n </div>\n\n\n <div v-for=\"warning in data?.[source].warnings\"\n class=\"alert alert-warning val val-warning val-warning-type-{{ warning.type }} val-warning-source-{{ source }}\"\n role=\"alert\">\n <template v-if=\"warning.type == 'incomplete-term'\">\n <Diagnostic :diagnostic=\"warning\">\n <ErrorLink :error=\"warning\" :short_repository_name=\"shortRepoName\"></ErrorLink>\n </Diagnostic>\n </template>\n <template v-else-if=\"warning.type === 'unknown-column'\">\n <Diagnostic :diagnostic=\"warning\" />\n </template>\n <template v-else-if=\"warning.type === 'missing-import'\">\n <Diagnostic :diagnostic=\"warning\">\n <ErrorLink :error=\"warning\" :short_repository_name=\"shortRepoName\" :term=\"warning.term\"></ErrorLink>\n </Diagnostic>\n\n <button\n :class=\"{'btn-success': autoFixState(warning) === 'fixed', 'btn-danger': autoFixState(warning) === 'impossible'}\"\n class=\"btn btn-primary\"\n @click=\"autofix(warning)\">\n <i v-if=\"autoFixState(warning) === 'loading'\" class=\"fa fa-spin fa-spinner\"></i>\n <i v-if=\"autoFixState(warning) === 'fixed'\" class=\"fa fa-check\"></i>\n <i v-if=\"autoFixState(warning) === 'impossible'\" class=\"fa fa-close\"></i>\n Import\n </button>\n </template>\n <template v-else-if=\"warning.type === 'inconsistent-import'\">\n\n <Diagnostic :diagnostic=\"warning\">\n <ErrorLink :error=\"warning\" :short_repository_name=\"shortRepoName\" :term=\"warning.term\"></ErrorLink>\n </Diagnostic>\n\n <button\n :class=\"{'btn-success': autoFixState(warning) === 'fixed', 'btn-danger': autoFixState(warning) === 'impossible'}\"\n class=\"btn btn-primary\"\n @click=\"autofixUpdateTerm(warning, warning.term.id, {\n ...warning.term.id,\n label: warning.term.label,\n id: warning.term.id\n })\">\n <i v-if=\"autoFixState(warning) === 'loading'\" class=\"fa fa-spin fa-spinner\"></i>\n <i v-if=\"autoFixState(warning) === 'fixed'\" class=\"fa fa-check\"></i>\n <i v-if=\"autoFixState(warning) === 'impossible'\" class=\"fa fa-close\"></i>\n Change\n <template v-if=\"warning.term.id !== warning.imported_term.id\">\n ID to\n <code>{{ warning.imported_term.id }}</code>\n </template>\n <template v-else>label to <code>{{ warning.imported_term.label }}</code></template>\n </button>\n </template>\n <template v-else>\n <h5>{{ warning.type.replace(\"-\", \" \") }}</h5>\n <p>\n {{ warning.msg }}<br>\n\n <ErrorLink :error=\"warning\" :short_repository_name=\"shortRepoName\"></ErrorLink>\n </p>\n <pre>{{ JSON.stringify(warning, undefined, 2) }}</pre>\n </template>\n </div>\n </template>\n </template>\n </template>\n</template>\n\n<style scoped lang=\"scss\">\n\n</style>\n","<script setup lang=\"ts\">\nimport {Release} from \"@ose/js-core\";\nimport {computed, ref} from \"vue\";\n\nconst props = defineProps<{\n data?: {\n files: {\n link: string,\n name: string\n }[]\n },\n release: Release,\n selectedSubStep: string | null\n}>()\n\ndefineEmits<{\n (e: 'release-control', type: string, ...args: any[]): void\n}>()\n\nconst checkHierarchy = ref<boolean>(props.release.state === \"completed\")\nconst checkLabels = ref<boolean>(props.release.state === \"completed\")\nconst checkHierarchicalSpreadsheets = ref<boolean>(props.release.state === \"completed\")\n\nconst hasHierarchicalSpreadsheets = computed(() => !!props.data?.files?.find(x => x.name.endsWith(\".xlsx\")))\n\nconst allChecked = computed(() => [\n checkLabels.value,\n checkHierarchy.value,\n !hasHierarchicalSpreadsheets.value || checkHierarchicalSpreadsheets.value\n].reduce((p, v) => p && v, true))\n\n</script>\n\n<template>\n <h3>Verify the built ontologies</h3>\n\n <p>\n Please download the built files and ontologies and open them in Protégé (download\n <a href=\"https://protege.stanford.edu/software.php#desktop-protege\">here</a> or use\n <a href=\"https://webprotege.stanford.edu/\">Web protege</a>).\n </p>\n <ul>\n <li v-for=\"file in data?.files\"><a :href=\"file.link\" :download=\"file.name\">{{ file.name }}</a></li>\n\n </ul>\n <p>\n Check the following things:\n </p>\n\n <ul class=\"list-unstyled\">\n <li class=\"ms-4\">\n <div class=\"form-check\">\n <input v-model=\"checkHierarchy\" :disabled=\"release.state !== 'waiting-for-user'\"\n class=\"form-check-input checklist\" type=\"checkbox\" value=\"\" id=\"chk-inferred\">\n <label class=\"form-check-label\" for=\"chk-inferred\">\n Start the reasoner. Does the inferred hierarchy look alright?\n </label>\n </div>\n </li>\n <li class=\"ms-4\">\n <div class=\"form-check\">\n <input v-model=\"checkLabels\" :disabled=\"release.state !== 'waiting-for-user'\"\n class=\"form-check-input checklist\" type=\"checkbox\" value=\"\" id=\"chk-labels\">\n <label class=\"form-check-label\" for=\"chk-labels\">\n Do the labels look alright?\n </label>\n </div>\n </li>\n <li class=\"ms-4\" v-if=\"hasHierarchicalSpreadsheets\">\n <div class=\"form-check\">\n <input v-model=\"checkHierarchicalSpreadsheets\" :disabled=\"release.state !== 'waiting-for-user'\"\n class=\"form-check-input checklist\" type=\"checkbox\" value=\"\" id=\"chk-hierarchical-spreadsheets\">\n <label class=\"form-check-label\" for=\"chk-hierarchical-spreadsheets\">\n Do the hierarchy, labels, and other fields in the hierarchical spreadsheets look alright?\n </label>\n </div>\n </li>\n </ul>\n\n <button class=\"btn btn-success w-100\" id=\"btn-publish-release\"\n :disabled=\"!allChecked || release.state !== 'waiting-for-user'\" @click=\"$emit('release-control', 'continue')\">\n Everything looks alright. Publish the release!\n </button>\n\n\n</template>\n\n<style scoped lang=\"scss\">\n\n</style>\n","<script setup lang=\"ts\">\nimport {Release} from \"@ose/js-core\";\n\nconst props = defineProps<{\n release: Release,\n details: {\n [key: string]: any,\n errors: {\n command: string,\n code: number,\n out: string,\n err: string\n\n }[]\n }\n}>()\n\n</script>\n\n<template>\n <div class=\"alert alert-danger\">\n <h4>An error occurred while building the file</h4>\n <p>\n A technical error occurred. Please contact an administrator.\n </p>\n </div>\n <div class=\"alert alert-danger\" v-for=\"error in details.errors\">\n <template v-if=\"'code' in error\">\n <h6>Command</h6>\n <pre>{{ error.command }}</pre>\n <h6>Return code</h6>\n <p>{{ error.code }}</p>\n <h6>Standard out</h6>\n <pre>{{ error.out }}</pre>\n <h6>Standard error</h6>\n <pre>{{ error.err }}</pre>\n </template>\n <template v-else>\n <pre>{{ JSON.stringify(error, undefined, 2) }}</pre>\n </template>\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n\n</style>\n","<script setup lang=\"ts\">\nimport {Release, ProgressIndicator} from \"@ose/js-core\";\nimport TechnicalError from \"../TechnicalError.vue\";\n\ndefineProps<{\n data: any,\n release: Release,\n selectedSubStep: string | null\n}>()\n\ndefineEmits<{\n (e: 'release-control', type: string, ...args: any[]): void\n}>()\n\n</script>\n\n<template>\n <h3>Publishing the release</h3>\n\n <TechnicalError v-if=\"release.state == 'waiting-for-user' && data && (data.errors?.length ?? 0) > 0\"\n :release=\"release\"\n :details=\"data\"></TechnicalError>\n <template v-else-if=\"release.state === 'completed'\">\n\n <p>\n The ontologies are now published to github and the release is completed.\n </p>\n <div class=\"text-center w-100 text-success\" style=\"font-size: 100px\">\n <i class=\"fa fa-check-double\"></i>\n </div>\n </template>\n <ProgressIndicator v-else :details=\"data\" :release=\"release\">\n The ontologies are being published to github.\n </ProgressIndicator>\n</template>\n\n<style scoped lang=\"scss\">\n\n</style>\n","<script setup lang=\"ts\">\nimport {Release, ProgressIndicator} from \"@ose/js-core\";\nimport TechnicalError from \"../TechnicalError.vue\";\nimport {computed} from \"vue\";\n\nconst STEPS = {\n PREPARATION: {\n title: \"Preparation\",\n running_text: \"Excel files are downloaded to the server and prepared.\",\n finished_text: \"Excel files were downloaded to the server.\"\n },\n IMPORT_EXTERNAL: {\n title: \"Building external dependencies\",\n running_text: \"External ontologies are now downloaded and converted. This might take a few minutes.\",\n finished_text: \"External ontologies were successfully downloaded and converted.\"\n },\n BUILD: {\n title: \"Building OWL files\",\n running_text: \"OWL files are now build.\",\n finished_text: \"OWL files were successfully built.\"\n },\n MERGE: {\n title: \"Merging files\",\n running_text: \"Multiple OWL files are being combined into one.\",\n finished_text: \"Multiple OWL files were combined into one.\"\n }\n}\n\nconst props = defineProps<{\n data: any,\n release: Release\n step: {\n args: any,\n name: string\n }\n}>()\n\ndefineEmits<{\n (e: 'release-control', type: string, ...args: any[]): void\n}>()\n\nfunction titleCase(str: string): string {\n return str.replace(\"_\", \" \").replace(\n /\\w\\S*/g,\n text => text.charAt(0).toUpperCase() + text.substring(1).toLowerCase()\n );\n}\n\nconst title = computed(() => STEPS[props.step.name]?.title ?? titleCase(props.step.name ?? \"<MISSING>\"))\nconst running_text = computed(() => STEPS[props.step.name]?.running_text ?? \"\")\nconst finished_text = computed(() => STEPS[props.step.name]?.finished_text ?? \"\")\n</script>\n\n<template>\n <h3>{{ title }}</h3>\n\n <TechnicalError v-if=\"release.state == 'waiting-for-user' && data && (data.errors?.length ?? 0) > 0\"\n :release=\"release\"\n :details=\"data\"></TechnicalError>\n\n <ProgressIndicator v-else :details=\"data\" :release=\"release\">\n {{ running_text }}\n </ProgressIndicator>\n <template v-if=\"release.state === 'completed'\">\n <p>\n {{ finished_text }}\n </p>\n </template>\n</template>\n\n<style scoped lang=\"scss\">\n\n</style>\n","<script setup lang=\"ts\">\nimport {computed, defineAsyncComponent, onMounted, ref, watch, shallowRef, markRaw, type Component} from \"vue\";\nimport {Diagnostic, Release, ReleaseScript} from \"@ose/js-core\";\nimport Setup from \"./Setup.vue\";\nimport Validation from \"./steps/Validation.vue\";\nimport HumanVerification from \"./steps/HumanVerification.vue\";\nimport GithubPublish from \"./steps/GithubPublish.vue\";\nimport Generic from \"./steps/Generic.vue\";\n\ndeclare var SERVER_DATA: { [key: string]: any }\ndeclare var URLS: { [key: string]: any }\n\ninterface PluginInfo {\n id: string;\n name: string;\n version: string;\n description: string;\n components: { step_name: string; component_name: string }[];\n has_static: boolean;\n js_module: string | null;\n}\n\nconst repo = SERVER_DATA.repo\nconst prefix_url = URLS.prefix\nconst release = ref<Release | null>(null);\n\nconst loading = ref<boolean>(false)\nconst error = ref<string | null>(null)\n\nconst selected_step = ref<number | null>(null)\nconst selected_sub_step = ref<string | null>(null)\n\n// Built-in step components\nconst builtInSteps: { [k: string]: Component } = {\n \"VALIDATION\": Validation,\n \"HUMAN_VERIFICATION\": HumanVerification,\n \"GITHUB_PUBLISH\": GithubPublish,\n}\n\n// Dynamic plugin components - will be populated from API\nconst pluginSteps = shallowRef<{ [k: string]: Component }>({})\n\n// Combined steps registry\nconst _steps = computed(() => ({\n ...builtInSteps,\n ...pluginSteps.value\n}))\n\n// Load plugins from API\nasync function loadPlugins() {\n try {\n const response = await fetch(`${prefix_url}/api/plugins/`);\n if (!response.ok) return;\n \n const plugins: PluginInfo[] = await response.json();\n const newPluginSteps: { [k: string]: Component } = {};\n \n for (const plugin of plugins) {\n if (!plugin.has_static || !plugin.js_module || plugin.components.length === 0) continue;\n \n for (const comp of plugin.components) {\n // Create async component that loads from plugin's static folder\n const pluginId = plugin.id;\n const jsModule = plugin.js_module;\n const componentName = comp.component_name;\n \n newPluginSteps[comp.step_name] = markRaw(defineAsyncComponent(async () => {\n const moduleUrl = `${prefix_url}/api/plugins/${pluginId}/static/${jsModule}`;\n const module = await import(/* @vite-ignore */ moduleUrl);\n return module[componentName] || module.default;\n }));\n }\n }\n \n pluginSteps.value = newPluginSteps;\n } catch (e) {\n console.error(\"Failed to load plugins:\", e);\n }\n}\n\nconst currentStep = computed<{\n args: any,\n name: string\n} | null>(() => release.value?.release_script.steps[selected_step.value ?? release.value.step] ?? null)\nconst stepComponent = computed(() => _steps.value[currentStep.value?.name] ?? Generic)\n\nconst stepProps = computed(() => {\n const possibleProps = {\n data: details.value,\n release: release.value,\n selectedSubStep: selected_sub_step.value,\n step: currentStep.value\n }\n\n const component = stepComponent.value;\n\n if (component) {\n const required = Object.keys(component.props)\n return Object.fromEntries(Object.entries(possibleProps).filter(([k, _]) => required.indexOf(k) >= 0))\n }\n\n return null;\n})\n\nconst details = computed(() => release.value?.details[(selected_step.value ?? release.value.step).toString()])\n\ntype SubStepContent = { errors: Diagnostic[], warnings: Diagnostic[] };\n\nfunction subSteps(data?: any): null | { [k: string]: SubStepContent } {\n if (data instanceof Object) {\n const val = data as { [key: string]: Partial<SubStepContent> }\n const steps = Object.entries(val)\n .filter(([k, v]) =>\n !k.startsWith(\"_\") &&\n [\"warnings\", \"errors\", \"infos\"].indexOf(k) < 0 &&\n Array.isArray(v?.warnings) && Array.isArray(v?.errors)\n ) as unknown as [string, SubStepContent][]\n return steps.length > 0 ? Object.fromEntries(steps) : null;\n }\n\n return null\n}\n\nasync function poll(withLoading: boolean = false) {\n const id = release.value?.id ?? `${repo}/running`\n loading.value = withLoading;\n try {\n let response = await fetch(`${prefix_url}/api/release/${id}`);\n if (response.ok) {\n release.value = await response.json()\n } else {\n release.value = null\n }\n } catch (e) {\n } finally {\n loading.value = false;\n }\n}\n\nonMounted(async () => {\n // Load plugins first\n await loadPlugins();\n \n const lastPathSegment = window.location.pathname.split(\"/\").slice(-1)[0]\n const releaseId = parseInt(lastPathSegment)\n\n if (!isNaN(releaseId)) {\n release.value = await _request<Release>(() => fetch(`${prefix_url}/api/release/${releaseId}`)) ?? null\n } else {\n await poll(true)\n }\n})\n\nlet pollInterval: number | null = null\n\nfunction startPolling() {\n if (pollInterval === null) {\n pollInterval = setInterval(poll, 2000)\n }\n}\n\nconst stopWaitingForReleaseStart = watch(release, (value, oldValue) => {\n if (oldValue === null && value !== null && pollInterval === null && value.state === \"running\") {\n stopWaitingForReleaseStart()\n startPolling()\n }\n})\n\nconst icon_classes = computed(() => {\n switch (release.value?.state) {\n case undefined:\n case null:\n return [\"fa-regular\", \"fa-file\", \"text-black-50\"]\n case \"canceled\":\n return [\"fa-regular\", \"fa-circle-xmark\", \"text-danger\"]\n case \"waiting-for-user\":\n return [\"fa-solid\", \"fa-user-clock\", \"text-warning\"]\n case \"errored\":\n return [\"fa-solid\", \"fa-triangle-exclamation\", \"text-danger\"]\n case \"completed\":\n return [\"fa-regular\", \"fa-circle-check\", \"text-success\"]\n default:\n return [\"fa-spinner\", \"fa-spin\", \"text-black-50\"]\n }\n})\n\nasync function _request<T = any, S = T>(request: () => Promise<Response>): Promise<T | undefined>\n\nasync function _request<T = any, S = T>(request: () => Promise<Response>, post: ((json: T) => Promise<S>)): Promise<S | undefined>\nasync function _request<T = any, S = T>(request: () => Promise<Response>, post: ((json: T) => Promise<S>) | null = null): Promise<S | T | undefined> {\n try {\n loading.value = true;\n const response = await request()\n\n if (response.ok) {\n const value = await response.json() as T\n if (post !== null) {\n return await post(value)\n } else {\n return value\n }\n } else {\n const e = await response.json()\n error.value = e.error\n }\n\n loading.value = false;\n } catch (e) {\n if (e instanceof Error) {\n error.value = e.message\n } else {\n error.value = `An unknown error occurred: ${e}`\n }\n } finally {\n loading.value = false;\n }\n}\n\nasync function startRelease(releaseScript: ReleaseScript) {\n const r = await _request<Release>(() =>\n fetch(prefix_url + \"/api/release/start\", {\n method: \"post\",\n body: JSON.stringify(releaseScript),\n headers: {\n \"Content-Type\": \"application/json\"\n }\n }))\n\n if (r) {\n release.value = r\n window.location.pathname = `${prefix_url}/admin/release/${r.id}`\n }\n}\n\nasync function cancelRelease() {\n release.value = await _request<Release>(() => fetch(`${prefix_url}/api/release/${repo}/cancel`, {\n method: \"post\"\n })) ?? null\n}\n\nasync function restartRelease() {\n const script = release.value?.release_script\n if (script) {\n await cancelRelease()\n await startRelease(script)\n }\n}\n\nfunction errorsOfStep(step: number) {\n const details = release.value?.details[step.toString()]\n if (details?.hasOwnProperty(\"errors\") && Array.isArray(details[\"errors\"])) {\n return details[\"errors\"].length\n } else if (Array.isArray(details)) {\n return details.map(x => x[\"errors\"]?.length).reduce((p, c) => c + p, 0)\n }\n}\n\nfunction warningsOfStep(step: number) {\n const details = release.value?.details[step.toString()]\n if (details?.hasOwnProperty(\"warnings\") && Array.isArray(details[\"warnings\"])) {\n return details[\"warnings\"].length\n } else if (details) {\n return Object.values(details).map((x: any) => x[\"warnings\"]?.length).reduce((p, c) => c + p, 0)\n }\n}\n\nfunction stepIconClasses(step: number): string[] {\n if ((release.value?.step ?? 0) >= step) {\n if (errorsOfStep(step) > 0) {\n return \"fa fa-triangle-exclamation text-danger\".split(\" \")\n } else if (warningsOfStep(step) > 0) {\n return \"fa fa-triangle-exclamation text-warning\".split(\" \")\n } else if (release.value?.step === step && release.value.state !== 'completed') {\n return \"fa-regular fa-circle text-primary\".split(\" \")\n } else {\n return \"fa-regular fa-check-circle text-success\".split(\" \")\n }\n } else {\n return \"fa-regular fa-clock text-warning\".split(\" \")\n }\n}\n\nasync function doReleaseControl(type: string) {\n switch (type) {\n case \"continue\":\n await fetch(`${prefix_url}/api/release/${repo}/continue`)\n startPolling()\n break;\n default:\n console.warn(`No such release control type: '${type}'`)\n }\n}\n</script>\n\n<template>\n <div class=\"release\">\n <div class=\"d-flex gap-2 align-items-center\">\n <h1 id=\"lbl-release-title\">\n <i id=\"icon-release\" class=\"fa\" :class=\"icon_classes\"></i>\n Release {{ repo }}\n </h1>\n <span id=\"release-info\" class=\"align-self-end mb-2 text-muted\" v-if=\"release\">\n started by {{ release.started_by }} on {{ $filters.formatDate(release.start) }}\n </span>\n <span class=\"flex-fill\"></span>\n\n <template v-if=\"release && (['running', 'waiting-for-user', 'errored'].indexOf(release.state) >= 0)\">\n <button class=\"btn btn-warning\" id=\"btn-release-restart\" @click=\"restartRelease\">\n <i class=\"fa fa-rotate-left\"></i> Restart\n </button>\n <button class=\"btn btn-danger\" id=\"btn-release-cancel\" @click=\"cancelRelease\">\n <i class=\"fa fa-cancel\"></i>\n Cancel\n </button>\n </template>\n </div>\n\n <template v-if=\"!release && !loading\">\n <div class=\"alert alert-danger\" v-if=\"error !== null\">\n <h4>An error occurred</h4>\n {{ error }}\n </div>\n <Setup v-if=\"!release\" style=\"max-width: 1080px; margin: 0 auto\"\n :repo=\"repo\"\n @settingsConfirmed=\"startRelease($event)\"></Setup>\n </template>\n\n\n <template v-if=\"release !== null\">\n <div style=\"display: grid;grid-template-columns: 240px 1fr;grid-gap: 50px\" class=\"text-start w-100\"\n id=\"release-core\">\n <div class=\"sidebar border\" style=\"grid-column: 1\">\n <ul class=\"list-unstyled ps-2\">\n <li class=\"mb-1\" v-for=\"(step, i) in release.release_script.steps\">\n <div class=\"d-flex align-items-center\">\n <i :class=\"stepIconClasses(i)\"></i>\n <a class=\"btn border-0\" @click=\"selected_step = i; selected_sub_step = null\">\n <strong v-if=\"selected_step !== null ? selected_step == i : release.step == i\">\n {{ $filters.formatText(step.name) }}\n </strong>\n <template v-else>{{ $filters.formatText(step.name) }}</template>\n </a>\n </div>\n <ul class=\"list-unstyled ms-4\" v-if=\"subSteps\">\n <li v-for=\"(val, key) in subSteps(release.details[i])\" style=\"display: flex; align-items: center\">\n <i v-if=\"(val.errors?.length ?? 0) > 0\" class=\"fa fa-circle-exclamation text-danger\"></i>\n <i v-else-if=\"(val.warnings?.length ?? 0) > 0\" class=\"fa fa-triangle-exclamation text-warning\"></i>\n <i v-else class=\"fa fa-check-circle text-success\"></i>\n <a class=\"btn border-0 text-truncate\"\n @click=\"selected_sub_step = selected_sub_step === key ? null : key\">\n <strong v-if=\"selected_sub_step === key\">{{ key }}</strong>\n <template v-else>{{ key }}</template>\n </a>\n </li>\n </ul>\n </li>\n </ul>\n </div>\n <div class=\"main\" style=\"grid-column: 2\">\n <div class=\"alert alert-danger\" v-if=\"error !== null\">\n <h4>An error occurred</h4>\n {{ error }}\n </div>\n\n <div class=\"alert alert-danger\" v-if=\"details?.error\">\n <h4>An error occurred: {{ details.error.short }}</h4>\n <pre>{{ details.error.long }}</pre>\n </div>\n\n <component :is=\"stepComponent\" v-bind=\"stepProps\"\n @release-control=\"doReleaseControl\"></component>\n </div>\n </div>\n </template>\n </div>\n\n <div class=\"loading\" v-if=\"loading\">\n <div class=\"inner text-light\">\n <div class=\"spinner-border\" style=\"width: 5rem; height: 5rem;\" role=\"status\">\n </div>\n <h5>Loading...</h5>\n </div>\n </div>\n</template>\n\n\n<style scoped lang=\"scss\">\n.loading {\n z-index: 1;\n background: rgba(0, 0, 0, .4);\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n display: grid;\n\n .inner {\n margin: auto;\n justify-self: center;\n align-self: center;\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 14px;\n\n .spinner-border {\n border-width: 10px;\n }\n }\n}\n\n#release-core .sidebar .btn {\n text-align: start !important;\n}\n</style>\n","import {createApp} from \"vue\";\nimport Release from \"./Release.vue\";\nimport {$filters} from \"@ose/js-core\";\n\n\nconst app = createApp(Release)\n\n\napp.config.globalProperties.$filters = $filters\n\napp.mount(\"#vue-app-release\")\n"],"names":["props","__props","percent","computed","_createElementBlock","_Fragment","_createElementVNode","_renderSlot","_ctx","_hoisted_1","_toDisplayString","_hoisted_2","_openBlock","_hoisted_3","_cache","setAnnotations","name","annotations","l","setArgs","step","args","k","v","addDependency","_","value","deleteDependency","dependency","x","addFile","renameFile","event","addStep","before","deleteStep","index","result","deleteFile","file","_createBlock","CollapsibleCard","$event","_hoisted_6","_hoisted_7","_hoisted_9","_hoisted_11","_hoisted_13","_hoisted_14","_renderList","source","_hoisted_15","_vModelText","_vModelSelect","need","_hoisted_20","_hoisted_24","_hoisted_26","_hoisted_28","_hoisted_29","_hoisted_31","showAdvanced","ref","releaseScript","prefix_url","saving","lastReleases","loading","lastSuccessfulRelease","lastRelease","watch","oldValue","update","releases","a","b","_saveFileAnimationTimeout","saveFile","onMounted","$filters","_createTextVNode","$emit","_normalizeClass","release","_hoisted_8","_hoisted_10","ReleaseScriptViewer","_hoisted_12","item","_unref","guessExternal","term","defined_parent","parent","singleExternalGuess","error","repo","guess","confirmDialog","multipleExternalGuesses","guesses","promptDialog","g","i","guessParent","autoFixStates","autoFixState","diag","id","errors","warnings","shortRepoName","updateTerm","path","autofixUpdateTerm","wid","autofix","e","ProgressIndicator","_hoisted_4","_createVNode","Diagnostic","ErrorLink","mismatch","warning","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_21","_hoisted_22","checkHierarchy","checkLabels","checkHierarchicalSpreadsheets","hasHierarchicalSpreadsheets","allChecked","p","TechnicalError","STEPS","titleCase","str","text","title","running_text","finished_text","selected_step","selected_sub_step","builtInSteps","Validation","HumanVerification","GithubPublish","pluginSteps","shallowRef","_steps","loadPlugins","response","plugins","newPluginSteps","plugin","comp","pluginId","jsModule","componentName","markRaw","defineAsyncComponent","module","currentStep","stepComponent","Generic","stepProps","possibleProps","details","component","required","subSteps","data","steps","poll","withLoading","lastPathSegment","releaseId","_request","pollInterval","startPolling","stopWaitingForReleaseStart","icon_classes","request","post","startRelease","r","cancelRelease","restartRelease","script","errorsOfStep","c","warningsOfStep","stepIconClasses","doReleaseControl","type","_hoisted_5","Setup","val","key","_resolveDynamicComponent","_mergeProps","_hoisted_23","app","createApp","Release"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as P,r as g,c as r,a as i,e as s,F as k,g as U,q as W,s as $,D as b,L as y,u as o,l as A,x as v,f as x,h as _,t as V,v as B,j as I,$ as q}from"./chunks/filter-CiYqP1_r.js";import{C as E}from"./chunks/CollapsibleCard-DoX0kPCZ.js";import{a as f,p as F}from"./chunks/bootbox-D3SJ_Fwv.js";import{_ as J}from"./chunks/_plugin-vue_export-helper-DlAUqK2U.js";const M={class:"settings"},z=["disabled","onClick"],G=["disabled","onClick"],H={class:"input-group input-group-sm mb-3"},K=["onUpdate:modelValue"],Q={class:"input-group input-group-sm mb-3"},X=["onUpdate:modelValue"],Y={class:"input-group input-group-sm mb-3"},Z=["onUpdate:modelValue"],ee={class:"input-group input-group-sm mb-3"},se=["onUpdate:modelValue"],te={class:"input-group input-group-sm mb-3"},le=["onUpdate:modelValue"],ae=["onUpdate:modelValue"],oe=["disabled","onClick"],ne=["disabled","onClick"],ie={key:0,class:"fa fa-spin fa-spinner"},re={key:1,class:"fa fa-check"},ue={key:2,class:"fa fa-close"},de={key:3,class:"fa fa-file-import"},pe={class:"d-flex gap-2"},fe=["disabled"],ce=["disabled"],me=P({__name:"Settings",setup(be){const c=URLS.prefix,n=g(SETTINGS);let w=g(!1),h=g(null),C=g(null),u=g(null),m=A(()=>w.value||h.value!==null||C.value!==null||u.value==="busy"),d=g({reload:null}),T={};async function O(a){C.value=a.full_name;const e=n.value.startup_repositories.indexOf(a.full_name)>=0;(await(await fetch(`${c}/api/settings/repositories/${e?"remove":"add"}_startup`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({full_name:a.full_name})})).json()).success?n.value.startup_repositories=e?n.value.startup_repositories.filter(p=>p!==a.full_name):[...n.value.startup_repositories,a.full_name]:await f({title:"Unsetting as startup failed",message:"The current configuration probably does not allow setting startup repositories."}),C.value=null}async function R(a){h.value=a.full_name,(await(await fetch(`${c}/api/settings/repositories/unload`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({full_name:a.full_name})})).json()).success?n.value.repositories=n.value.repositories.filter(t=>t!==a):await f({title:"Unloading failed",message:"The repository was probably already unloaded. Try refreshing the page."}),h.value=null}async function N(){w.value=!0;let a=await(await fetch(`${c}/api/settings/repositories/possibilities`)).json();if(a.success){const e=a.repositories,t=await F({title:"Found possible external parents",message:"Chose one of your repositories to load.",inputType:"select",inputOptions:e.map(({short_name:l,full_name:p},S)=>({value:S,text:`${l} (${p})`})),buttons:{confirm:{label:"Load repository",className:"btn-success"},cancel:{label:"Cancel",className:"btn-warning"}}});if(t!==null){const l=await(await fetch(`${c}/api/settings/repositories/load`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e[t])})).json();l.success?n.value.repositories=[...n.value.repositories,l.repo]:await f({title:"Loading failed",message:l.error})}}else await f({title:"Unloading failed",message:"The repository was probably already unloaded. Try refreshing the page."});w.value=!1}async function L(a,e){u.value="busy";try{const t=await(await fetch(`${c}/api/repo/${e.short_name}/install_workflow/${a}`,{method:"POST",headers:{"Content-Type":"application/json"}})).json();t.success||await f({title:"Workflow installation failed",message:t.msg}),u.value="success"}catch{await f({title:"Workflow installation failed",message:"An error occurred while installing the workflow."}),u.value="error"}}async function D(){d.value.reload="loading";try{const a=await(await fetch(`${c}/api/settings/repositories/reload`,{method:"post"})).json();a.success?(n.value.repositories=a.repositories,d.value.reload="success"):(await f({title:"Reloading settings failed",message:a.error}),d.value.reload="error")}catch{await f({title:"Reloading settings failed",message:"An error occurred while reloading the settings."}),d.value.reload="error"}T.reload&&clearTimeout(T.reload),T.reload=setTimeout(()=>d.value.reload=null,2e3)}return(a,e)=>(i(),r("div",M,[e[21]||(e[21]=s("h1",null,"Settings",-1)),e[22]||(e[22]=s("h3",null,"Repositories",-1)),(i(!0),r(k,null,U(n.value.repositories,t=>(i(),W(E,null,{title:$(()=>[_(V(t.short_name)+" ("+V(t.full_name)+") ",1)]),buttons:$(()=>[s("button",{disabled:o(m)||!n.value.changing_startup_allowed,class:"btn btn-primary btn-sm",onClick:l=>O(t)},[n.value.startup_repositories.indexOf(t.full_name)>=0?(i(),r(k,{key:0},[e[1]||(e[1]=s("i",{class:"fa fa-square-check"},null,-1)),e[2]||(e[2]=_(" Loaded on startup ",-1))],64)):(i(),r(k,{key:1},[e[3]||(e[3]=s("i",{class:"fa fa-square"},null,-1)),e[4]||(e[4]=_(" Not loaded on startup ",-1))],64))],8,z),n.value.loading_new_allowed?(i(),r("button",{key:0,disabled:o(m),class:"btn btn-danger btn-sm btn-circle",onClick:l=>{l.stopPropagation(),R(t)}},[s("i",{class:v([o(h)===t.full_name?["fa-spinner","fa-spin"]:["fa-trash"],"fa"])},null,2)],8,G)):x("",!0)]),body:$(()=>[e[13]||(e[13]=s("h6",null,"Core settings",-1)),s("div",H,[e[5]||(e[5]=s("span",{class:"input-group-text"},"ID Length",-1)),b(s("input",{"onUpdate:modelValue":l=>t.id_digits=l,class:"form-control",type:"number"},null,8,K),[[y,t.id_digits]])]),s("div",Q,[e[6]||(e[6]=s("span",{class:"input-group-text"},"Main branch",-1)),b(s("input",{"onUpdate:modelValue":l=>t.main_branch=l,class:"form-control",type:"text"},null,8,X),[[y,t.main_branch]])]),e[14]||(e[14]=s("h6",null,"Release",-1)),s("div",Y,[e[7]||(e[7]=s("span",{class:"input-group-text"},"Released OWL file",-1)),b(s("input",{"onUpdate:modelValue":l=>t.release_file=l,class:"form-control",type:"text"},null,8,Z),[[y,t.release_file]])]),s("div",ee,[e[8]||(e[8]=s("span",{class:"input-group-text"},"Released script",-1)),b(s("input",{"onUpdate:modelValue":l=>t.release_script_path=l,class:"form-control",type:"text"},null,8,se),[[y,t.release_script_path]])]),e[15]||(e[15]=s("h6",null,"Subontologies",-1)),e[16]||(e[16]=s("p",{class:"text-body-secondary"}," To generate hierarchical spreadsheets ",-1)),(i(!0),r(k,null,U(t.subontologies,l=>(i(),r("div",te,[e[10]||(e[10]=s("span",{class:"input-group-text"},"Excel",-1)),b(s("input",{"onUpdate:modelValue":p=>l.excel_file=p,class:"form-control",type:"text"},null,8,le),[[y,l.excel_file]]),e[11]||(e[11]=s("span",{class:"input-group-text"},"Released",-1)),b(s("input",{"onUpdate:modelValue":p=>l.release_file=p,class:"form-control",type:"text"},null,8,ae),[[y,l.release_file]]),s("button",{disabled:o(m),class:"btn btn-danger",onClick:p=>t.subontology=t.subontologies.filter(S=>S!=l)},[...e[9]||(e[9]=[s("i",{class:"fa fa-trash"},null,-1)])],8,oe)]))),256)),e[17]||(e[17]=s("h6",null,"Workflows",-1)),e[18]||(e[18]=s("p",{class:"text-body-secondary"}," Install github workflows in this repository ",-1)),s("button",{class:v([{"btn-success":o(u)==="success","btn-danger":o(u)==="error"},"btn btn-primary btn-sm"]),disabled:o(m),onClick:l=>L("externals",t)},[o(u)==="busy"?(i(),r("i",ie)):x("",!0),o(u)==="success"?(i(),r("i",re)):x("",!0),o(u)==="error"?(i(),r("i",ue)):(i(),r("i",de)),e[12]||(e[12]=_(" Automatically build externals owl file ",-1))],10,ne)]),_:2},1024))),256)),s("div",pe,[n.value.loading_new_allowed?(i(),r("button",{key:0,disabled:o(m),class:"mb-3 btn btn-sm btn-primary add-file",onClick:N},[s("i",{class:v([o(w)?["fa-spinner","fa-spin"]:["fa-add"],"fa"])},null,2),e[19]||(e[19]=_(" Load repository ",-1))],8,fe)):x("",!0),s("button",{class:v([[{success:"btn-success",null:"btn-primary",error:"btn-danger"}[o(d).reload]],"mb-3 btn btn-sm btn-primary add-file"]),disabled:o(m)||o(d).reload==="loading",onClick:e[0]||(e[0]=t=>D())},[s("i",{class:v([{success:["fa-check"],error:["fa-cross"],loading:["fa-spinner","fa-spin"]}[o(d).reload]??["fa-refresh"],"fa"])},null,2),e[20]||(e[20]=_(" Reload settings ",-1))],10,ce),B(a.$slots,"buttons",{},void 0,!0)])]))}}),ge=J(me,[["__scopeId","data-v-064e11eb"]]),j=I(ge);j.config.globalProperties.$filters=q;j.mount("#vue-app-settings");
|
|
2
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sources":["../../../../../ose-js-app/src/settings/Settings.vue","../../../../../ose-js-app/src/settings/main.ts"],"sourcesContent":["<script lang=\"ts\" setup>\n\nimport CollapsibleCard from \"../common/CollapsibleCard.vue\";\nimport {computed, ref} from \"vue\";\nimport {alertDialog, promptDialog} from \"../common/bootbox\";\nimport {RepositoryConfig} from \"@ose/js-core\";\n\ndeclare var SETTINGS: {\n repositories: RepositoryConfig[],\n startup_repositories: string[],\n changing_startup_allowed: boolean,\n loading_new_allowed: boolean\n}\ndeclare var URLS: { [key: string]: any }\n\nconst prefix_url = URLS.prefix\nconst settings = ref<typeof SETTINGS>(SETTINGS)\n\nlet loading = ref<boolean>(false);\nlet deleting = ref<string | null>(null);\nlet startupChanging = ref<string | null>(null);\nlet installingWorkflow = ref<null | \"busy\" | \"error\" | \"success\">(null);\nlet blocked = computed(() => loading.value || deleting.value !== null || startupChanging.value !== null || installingWorkflow.value === \"busy\")\n\nlet buttonStates = ref<{ reload: string | null }>({\n reload: null,\n})\n\nlet runningTimeouts: { [key: string]: number } = {};\n\nasync function toggleStartup(repo: RepositoryConfig) {\n startupChanging.value = repo.full_name;\n\n const currentlySet = settings.value.startup_repositories.indexOf(repo.full_name) >= 0;\n const route = currentlySet ? 'remove' : 'add';\n\n const resp = await (await fetch(`${prefix_url}/api/settings/repositories/${route}_startup`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\"full_name\": repo.full_name})\n })).json()\n\n if (resp.success) {\n settings.value.startup_repositories = currentlySet ?\n settings.value.startup_repositories.filter(x => x !== repo.full_name) :\n [...settings.value.startup_repositories, repo.full_name];\n } else {\n\n await alertDialog({\n title: currentlySet ? \"Unsetting as startup failed\" : \"Unsetting as startup failed\",\n message: \"The current configuration probably does not allow setting startup repositories.\"\n })\n }\n\n startupChanging.value = null;\n}\n\nasync function unloadRepository(repo: RepositoryConfig) {\n deleting.value = repo.full_name;\n\n const resp = await (await fetch(`${prefix_url}/api/settings/repositories/unload`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\"full_name\": repo.full_name})\n })).json()\n\n if (resp.success) {\n settings.value.repositories = settings.value.repositories.filter(x => x !== repo)\n } else {\n await alertDialog({\n title: \"Unloading failed\",\n message: \"The repository was probably already unloaded. Try refreshing the page.\"\n })\n }\n\n deleting.value = null;\n}\n\nasync function loadRepository() {\n loading.value = true;\n let resp = await (await fetch(`${prefix_url}/api/settings/repositories/possibilities`)).json()\n\n if (resp.success) {\n const suggestions = resp.repositories;\n const index = await promptDialog({\n title: \"Found possible external parents\",\n message:\n `Chose one of your repositories to load.`,\n inputType: \"select\",\n inputOptions: suggestions.map(({short_name, full_name}, i) => ({\n value: i,\n text: `${short_name} (${full_name})`\n })),\n buttons: {\n confirm: {\n label: `Load repository`,\n className: \"btn-success\",\n },\n cancel: {\n label: \"Cancel\",\n className: \"btn-warning\"\n }\n }\n })\n\n if (index !== null) {\n const result = await (await fetch(`${prefix_url}/api/settings/repositories/load`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(suggestions[index])\n })).json()\n\n if (result.success) {\n settings.value.repositories = [...settings.value.repositories, result.repo]\n } else {\n await alertDialog({\n title: \"Loading failed\",\n message: result.error\n })\n }\n }\n } else {\n await alertDialog({\n title: \"Unloading failed\",\n message: \"The repository was probably already unloaded. Try refreshing the page.\"\n })\n }\n loading.value = false;\n}\n\n\nasync function installWorkflow(name: string, repo: RepositoryConfig) {\n installingWorkflow.value = \"busy\";\n try {\n const resp = await (await fetch(`${prefix_url}/api/repo/${repo.short_name}/install_workflow/${name}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n }\n })).json();\n\n if (!resp.success) {\n await alertDialog({\n title: \"Workflow installation failed\",\n message: resp.msg\n });\n }\n\n installingWorkflow.value = \"success\"\n } catch (error) {\n await alertDialog({\n title: \"Workflow installation failed\",\n message: \"An error occurred while installing the workflow.\"\n });\n\n installingWorkflow.value = \"error\"\n }\n}\n\nasync function reload() {\n buttonStates.value.reload = \"loading\"\n try {\n const resp = await (await fetch(`${prefix_url}/api/settings/repositories/reload`, {method: \"post\"})).json();\n if (resp.success) {\n settings.value.repositories = resp.repositories;\n buttonStates.value.reload = \"success\";\n } else {\n await alertDialog({\n title: \"Reloading settings failed\",\n message: resp.error\n });\n buttonStates.value.reload = \"error\";\n }\n } catch (error) {\n await alertDialog({\n title: \"Reloading settings failed\",\n message: \"An error occurred while reloading the settings.\"\n });\n buttonStates.value.reload = \"error\";\n }\n\n if (runningTimeouts[\"reload\"]) {\n clearTimeout(runningTimeouts[\"reload\"]);\n }\n runningTimeouts[\"reload\"] = setTimeout(() => buttonStates.value.reload = null, 2000);\n}\n</script>\n\n<template>\n\n <div class=\"settings\">\n\n <h1>Settings</h1>\n <h3>Repositories</h3>\n <CollapsibleCard v-for=\"repo in settings.repositories\">\n <template #title>\n {{ repo.short_name }} ({{ repo.full_name }})\n </template>\n <template #buttons>\n <button :disabled=\"blocked || !settings.changing_startup_allowed\" class=\"btn btn-primary btn-sm\"\n @click=\"toggleStartup(repo)\">\n <template v-if=\"settings.startup_repositories.indexOf(repo.full_name) >= 0\">\n <i class=\"fa fa-square-check\"></i> Loaded on startup\n </template>\n <template v-else>\n <i class=\"fa fa-square\"></i> Not loaded on startup\n </template>\n </button>\n\n <button v-if=\"settings.loading_new_allowed\" :disabled=\"blocked\"\n class=\"btn btn-danger btn-sm btn-circle\" @click=\"$event.stopPropagation(); unloadRepository(repo)\">\n <i :class=\"deleting === repo.full_name ? ['fa-spinner', 'fa-spin'] : ['fa-trash']\" class=\"fa\"></i>\n </button>\n </template>\n <template #body>\n <h6>Core settings</h6>\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">ID Length</span>\n <input v-model=\"repo.id_digits\" class=\"form-control\" type=\"number\">\n </div>\n\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Main branch</span>\n <input v-model=\"repo.main_branch\" class=\"form-control\" type=\"text\">\n </div>\n\n <h6>Release</h6>\n\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Released OWL file</span>\n <input v-model=\"repo.release_file\" class=\"form-control\" type=\"text\">\n </div>\n\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Released script</span>\n <input v-model=\"repo.release_script_path\" class=\"form-control\" type=\"text\">\n </div>\n\n <h6>Subontologies</h6>\n <p class=\"text-body-secondary\">\n To generate hierarchical spreadsheets\n </p>\n\n <template v-for=\"subontology in repo.subontologies\">\n <div class=\"input-group input-group-sm mb-3\">\n <span class=\"input-group-text\">Excel</span>\n <input v-model=\"subontology.excel_file\" class=\"form-control\" type=\"text\">\n <span class=\"input-group-text\">Released</span>\n <input v-model=\"subontology.release_file\" class=\"form-control\" type=\"text\">\n\n <button :disabled=\"blocked\" class=\"btn btn-danger\"\n @click=\"repo.subontology = repo.subontologies.filter(x => x != subontology)\">\n <i class=\"fa fa-trash\"></i>\n </button>\n </div>\n </template>\n\n <h6>Workflows</h6>\n <p class=\"text-body-secondary\">\n Install github workflows in this repository\n </p>\n\n\n <button :class=\"{'btn-success': installingWorkflow === 'success', 'btn-danger': installingWorkflow === 'error'}\"\n :disabled=\"blocked\" class=\"btn btn-primary btn-sm\"\n @click=\"installWorkflow('externals', repo)\">\n <i v-if=\"installingWorkflow === 'busy'\" class=\"fa fa-spin fa-spinner\"></i>\n <i v-if=\"installingWorkflow === 'success'\" class=\"fa fa-check\"></i>\n <i v-if=\"installingWorkflow === 'error'\" class=\"fa fa-close\"></i>\n <i v-else class=\"fa fa-file-import\"></i>\n Automatically build externals owl file\n </button>\n </template>\n </CollapsibleCard>\n\n <div class=\"d-flex gap-2\">\n <button v-if=\"settings.loading_new_allowed\" :disabled=\"blocked\" class=\"mb-3 btn btn-sm btn-primary add-file\"\n @click=\"loadRepository\">\n <i :class=\"loading ? ['fa-spinner', 'fa-spin'] : ['fa-add']\" class=\"fa\"></i>\n Load repository\n </button>\n <button :class=\"[{'success': 'btn-success', null: 'btn-primary', 'error': 'btn-danger'}[buttonStates.reload]]\" :disabled=\"blocked || buttonStates.reload === 'loading'\"\n class=\"mb-3 btn btn-sm btn-primary add-file\"\n @click=\"reload()\">\n <i :class=\"{'success': ['fa-check'], 'error': ['fa-cross'], 'loading': ['fa-spinner', 'fa-spin']}[buttonStates.reload] ?? ['fa-refresh']\"\n class=\"fa\"></i>\n Reload settings\n </button>\n <slot name=\"buttons\"></slot>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.settings {\n display: flex;\n flex-direction: column;\n gap: 14px\n}\n</style>\n","import {createApp} from \"vue\";\nimport Settings from \"./Settings.vue\";\nimport {$filters} from \"@ose/js-core\";\n\n\nconst app = createApp(Settings)\n// import {createBootstrap} from 'bootstrap-vue-next'\n\napp.config.globalProperties.$filters = $filters\n\n// app.use(createBootstrap())\napp.mount(\"#vue-app-settings\")\n"],"names":["prefix_url","settings","ref","loading","deleting","startupChanging","installingWorkflow","blocked","computed","buttonStates","runningTimeouts","toggleStartup","repo","currentlySet","x","alertDialog","unloadRepository","loadRepository","resp","suggestions","index","promptDialog","short_name","full_name","i","result","installWorkflow","name","reload","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_Fragment","_renderList","_createBlock","CollapsibleCard","_unref","$event","_hoisted_4","_vModelText","_hoisted_6","_hoisted_8","_hoisted_10","subontology","_hoisted_12","_normalizeClass","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_renderSlot","_ctx","app","createApp","Settings","$filters"],"mappings":"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"}
|