Files
Alfredv2/alfred/app/static/js/alfred-main-v2.js
T

72 lines
3.3 KiB
JavaScript

/* ALFRED_GLASS_V2 — mise en page uniquement ; logique V1 et extensions conservees. */
(() => {
'use strict';
const main = document.getElementById('alfredMainV1');
if (!main || main.dataset.glassV2 === 'ready') return;
main.dataset.glassV2 = 'ready';
const logo = main.querySelector('.av-logo');
const name = document.getElementById('avName');
const subtitle = document.getElementById('avVoiceSubtitle');
if (!logo || !name) return;
let assistantName = String(name.textContent || '').trim() || 'Alfred';
const cleanName = value => {
if(typeof value !== 'string')return '';
const s = value.trim();
return s.length >= 2 && s.length <= 30 ? s : '';
};
function setName(value) {
const s = cleanName(value);
if(!s) return;
assistantName=s;
name.textContent=s;
const first=Array.from(s)[0] || 'A';
logo.textContent=first.toLocaleUpperCase('fr-FR');
logo.setAttribute('aria-label',`Initiale de ${s}`);
// La V1 conserve son nom initial dans la phrase de veille : mise a jour apres chaque evenement.
const title=document.getElementById('avVoiceTitle');
if(title && subtitle && (title.textContent === 'En veille' || title.textContent === 'En attente')) {
subtitle.textContent=`Dites « ${s} » puis votre demande`;
}
}
setName(assistantName);
async function fetchName(){
try{
const r=await fetch('/api/state',{cache:'no-store'});
if(!r.ok)return;
const d=await r.json();
setName(d.assistant_name || d.title || '');
} catch(_){ /* La page reste utilisable si /api/state est indisponible. */ }
}
fetchName();
setInterval(()=>{if(!document.hidden)fetchName();},20000);
window.addEventListener('focus',fetchName);
window.alfredSocket?.on('alfred_state',state=>{
setName(state?.assistant_name || state?.title || assistantName);
});
// Le menu ··· ouvre les options de la V1 au lieu de naviguer directement vers /config.
const oldMenu=main.querySelector('.av-head-actions > a[href="/config"]');
if(oldMenu){
const btn=document.createElement('button');
btn.type='button';btn.id='avTopMenu';btn.className=oldMenu.className;
btn.setAttribute('data-av-action','more');
btn.setAttribute('aria-label','Ouvrir le menu principal');
btn.title='Menu : Configuration, Surveillance, Journaux';
btn.innerHTML=oldMenu.innerHTML;
oldMenu.replaceWith(btn);
}
const grid=document.querySelector('#avMoreDialog .av-more-grid');
if(grid&&!grid.querySelector('a[href="/logs"]')){
const link=document.createElement('a');
link.href='/logs';link.textContent='Journaux et historiques';
link.setAttribute('aria-label','Ouvrir les journaux');
const svg=document.createElementNS('http://www.w3.org/2000/svg','svg');
svg.setAttribute('viewBox','0 0 24 24');svg.setAttribute('class','a-icon');svg.setAttribute('fill','none');
svg.setAttribute('stroke','currentColor');svg.setAttribute('stroke-width','1.8');
const d=document.createElementNS('http://www.w3.org/2000/svg','path');
d.setAttribute('d','M6 3h9l4 4v14H6a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zM14 3v5h5M8 12h8M8 16h8');
svg.appendChild(d);link.prepend(svg);grid.append(link);
}
// Rail et historique restes en DOM : les scripts des Listes et de la V1 les utilisent.
// Ne pas les supprimer au risque de casser les evenements ou le rafraichissement.
})();