24 lines
3.0 KiB
JavaScript
24 lines
3.0 KiB
JavaScript
|
|
(() => {
|
||
|
|
'use strict';
|
||
|
|
const match=location.pathname.match(/^\/sag\/(\d+)(?:\/|$)/);
|
||
|
|
if(!match)return;
|
||
|
|
const id=Number(match[1]);
|
||
|
|
const esc=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
|
||
|
|
async function request(options) {
|
||
|
|
const r=await fetch(`/api/v1/sag/${id}/visibility`,options);
|
||
|
|
const value=await r.json();
|
||
|
|
if(!r.ok)throw new Error(typeof value.detail==='string'?value.detail:'Adgangen kunne ikke gemmes');
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
request().then(state=>{
|
||
|
|
if(!state.can_manage)return;
|
||
|
|
const button=document.createElement('button');button.className='btn btn-sm btn-outline-secondary';
|
||
|
|
button.textContent=state.restricted?'🔒 Fortrolig sag':'Fortrolighed';button.type='button';
|
||
|
|
button.style.cssText='position:fixed;right:1rem;bottom:5rem;z-index:1000';document.body.append(button);
|
||
|
|
const dialog=document.createElement('dialog');dialog.style.cssText='max-width:550px;width:95vw;border:2px solid var(--frame-border-strong);border-top:4px solid var(--accent);border-radius:var(--border-radius);box-shadow:var(--frame-shadow);padding:1rem;background:var(--bg-card);color:var(--text-primary)';
|
||
|
|
document.body.append(dialog);
|
||
|
|
const render=()=>{dialog.innerHTML=`<form><h2 class="h5">Fortrolighed</h2><p>Generelle sagsrettigheder gælder stadig. Administratorer har adgang til fortrolige sager.</p><label><input type="checkbox" name="restricted" ${state.restricted?'checked':''}> Begræns adgangen til udvalgte medarbejdere og grupper</label><label class="d-block mt-2">Medarbejdere<select name="users" class="form-select" multiple size="6">${state.users.map(u=>`<option value="${u.id}" ${state.user_ids.includes(u.id)?'selected':''}>${esc(u.name)}</option>`).join('')}</select></label><label class="d-block mt-2">Grupper<select name="groups" class="form-select" multiple size="5">${state.groups.map(g=>`<option value="${g.id}" ${state.group_ids.includes(g.id)?'selected':''}>${esc(g.name)}</option>`).join('')}</select></label><p class="text-danger" role="alert"></p><button class="btn btn-primary mt-3">Gem adgang</button> <button type="button" class="btn btn-light mt-3" data-close>Luk</button></form>`;dialog.querySelector('[data-close]').onclick=()=>dialog.close();dialog.querySelector('form').onsubmit=async e=>{e.preventDefault();const f=e.target;try{const result=await request({method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({restricted:f.elements.restricted.checked,version:state.version,user_ids:[...f.elements.users.selectedOptions].map(o=>Number(o.value)),group_ids:[...f.elements.groups.selectedOptions].map(o=>Number(o.value))})});state={...state,...result};button.textContent=state.restricted?'🔒 Fortrolig sag':'Fortrolighed';dialog.close();}catch(err){f.querySelector('[role=alert]').textContent=err.message;}};};
|
||
|
|
button.onclick=async()=>{try{state=await request();render();dialog.showModal();}catch(e){alert(e.message);}};
|
||
|
|
}).catch(()=>{});
|
||
|
|
})();
|