v2 - new interface, many new page for fine tuning
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
/* 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.
|
||||
})();
|
||||
Reference in New Issue
Block a user