1'use strict'; 2(() => { 3 const tr=(a,pt,en)=>a.state.lang==='pt'?pt:en; 4 const labels={programming:['Responsável pela Programação','Programming Lead'],engineering:['Responsável pela Engenharia','Engineering Lead'],team:['LÃder de Equipe','Team Lead']}; 5 function renderEditor(a,{candidates=[],selected=[],fieldName='account_ids'}={}){ 6 const ids=new Set(selected.map(Number)); 7 return '<p class="muted">'+tr(a,'Selecione uma ou mais pessoas. Desmarque para retirar a responsabilidade.','Select one or more people. Uncheck to remove an assignment.')+'</p><div class="responsibility-choices">'+(candidates.length?candidates.map(person=>'<label class="check-label"><input type="checkbox" name="'+a.esc(fieldName)+'" value="'+Number(person.account_id)+'" '+(ids.has(Number(person.account_id))?'checked':'')+'><span><strong>'+a.esc(person.full_name)+'</strong>'+(person.status==='pending_activation'?'<small>'+tr(a,'Conta aguarda ativação','Account awaiting activation')+'</small>':'')+'</span></label>').join(''):'<p class="muted">'+tr(a,'Nenhuma pessoa elegÃvel nesta temporada.','No eligible people in this season.')+'</p>')+'</div>'; 8 } 9 function cardsHTML(a,managers=[],labelPt='Responsável',labelEn='Manager'){ 10 return '<div class="responsibility-people">'+managers.map(person=>{ 11 const id=Number(person.person_id??person.id),valid=Number.isSafeInteger(id)&&id>0&&person.status!=='unavailable',name=person.full_name||'',tag=valid?'button':'div'; 12 return '<'+tag+' class="responsibility-person" '+(valid?'type="button" data-responsibility-person="'+id+'" aria-label="'+a.esc(tr(a,'Abrir perfil de ','Open profile of ')+name)+'"':'')+'>'+(valid?a.avatarHTML?.(id,name,'initials',person.photo||null)||'':'')+'<span class="responsibility-person-copy"><small>'+a.esc(tr(a,labelPt,labelEn))+'</small><strong data-user-content>'+a.esc(name)+'</strong>'+(person.status==='pending_activation'?'<small>'+tr(a,'Conta aguarda ativação','Account awaiting activation')+'</small>':'')+'</span></'+tag+'>'; 13 }).join('')+'</div>'; 14 } 15 function bindCards(a,container){container.querySelectorAll('[data-responsibility-person]').forEach(button=>button.onclick=()=>a.openPersonProfile(Number(button.dataset.responsibilityPerson)));} 16 function slot(a,area){return '<div class="area-responsibilities" data-area-responsibilities="'+a.esc(area)+'" aria-live="polite"></div>';} 17 async function mountArea(a,container){ 18 const host=container.querySelector('[data-area-responsibilities]');if(!host)return; 19 const area=host.dataset.areaResponsibilities;if(!Object.hasOwn(labels,area))return; 20 const key=a.readContextKey(),season=Number(a.state.seasonId),current=()=>host.isConnected&&a.readContextKey()===key; 21 async function load(){ 22 if(!current())return;host.setAttribute('aria-busy','true'); 23 try{const data=await a.api('people.leadership.area.get',{season_id:season,area_code:area});if(!current())return; 24 host.innerHTML=cardsHTML(a,data.items||[],...labels[area])+(data.can_manage===true&&!a.readOnlySeason?.()?'<button type="button" class="button" data-area-responsibilities-edit>'+a.icon('users')+tr(a,'Responsáveis','Managers')+'</button>':'');bindCards(a,host); 25 host.querySelector('[data-area-responsibilities-edit]')?.addEventListener('click',()=>editArea(a,data,key)); 26 }catch(error){if(current()){host.innerHTML='<span class="muted responsibility-load-error">'+tr(a,'Responsáveis indisponÃveis','Managers unavailable')+'</span><button type="button" class="button small" data-area-responsibilities-retry>'+a.t('retry')+'</button>';host.querySelector('[data-area-responsibilities-retry]').onclick=load;}} 27 finally{if(current())host.removeAttribute('aria-busy');} 28 } 29 await load(); 30 } 31 function editArea(a,data,key){ 32 if(a.readContextKey()!==key||data.can_manage!==true||a.readOnlySeason?.())return; 33 const area=data.area_code,candidates=data.candidates||[],title=tr(a,'Responsáveis · ','Managers · ')+tr(a,...({programming:['Programação','Programming'],engineering:['Engenharia','Engineering'],team:['Equipe','Team']}[area])),selected=(data.items||[]).map(person=>person.account_id);let done=false; 34 a.openDialog(title,renderEditor(a,{candidates,selected}),a.editorFooter(),async(form,dialog)=>{ 35 if(done||!a.readDialogCurrent(dialog,key)||a.readOnlySeason?.())return; 36 const ids=[...new Set(form.getAll('account_ids').map(Number))],members=ids.map(id=>candidates.find(person=>Number(person.account_id)===id)); 37 if(members.some(person=>!person))throw Error(tr(a,'Reabra a seleção de responsáveis.','Reopen manager selection.')); 38 await a.api('people.leadership.area.save',{season_id:Number(data.season_id),area_code:area,members:members.map(person=>({account_id:Number(person.account_id),person_id:Number(person.person_id)})),version:data.version},'POST'); 39 if(!a.readDialogCurrent(dialog,key))return;done=true;
40 a.state.cache.people=null; 41 try{const people=await a.api('people.list',{season_id:Number(data.season_id)});if(!a.readDialogCurrent(dialog,key))return;const records=Array.isArray(people)?people:people.items||[];a.state.cache.people=records;if(a.state.bootstrap)a.state.bootstrap.people=records;} 42 catch{if(!a.readDialogCurrent(dialog,key))return;} 43 await a.saved(dialog); 44 }); 45 } 46 window.AltaVoltagemResponsibilities={renderEditor,cardsHTML,bindCards,slot,mountArea}; 47})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.