All checks were successful
Build and deploy / Validate source (push) Successful in 5s
Build and deploy / Integration suite on a real stack (push) Successful in 2m28s
Build and deploy / Secret scan and release gate (push) Successful in 8s
Build and deploy / Publish images (push) Successful in 1m52s
The home, each product's Montagem and the cart now have their own addresses (/artes-avulsas, /arquivo-por-metro, /uv-artes-avulsas, /uv-arquivo-por-metro, /carrinho) and show only their own content, with Back, Forward, reload and direct links working as in any store. They stay one document so uploaded artworks survive moving between pages; nginx serves index.html for these addresses. "Adicionar ao carrinho" puts the item in the cart and opens it, and an empty cart says so. Portal quote links open in the cart. Also fixes the "57 cm" line break on the ready-sheet option, returns "Novo pedido" to the home, and says PDF depends on the product. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
103 lines
4.9 KiB
JavaScript
103 lines
4.9 KiB
JavaScript
/* Site DTF — Choosing a product, and the declared sheet/loose-artwork switch.
|
|
Extracted verbatim from the single inline script in web/index.html.
|
|
Loaded as classic scripts in the order listed there: they share one global
|
|
scope and run top to bottom, exactly as the original did. */
|
|
// ── escolha
|
|
document.querySelectorAll('.ec').forEach(b=>b.addEventListener('click',()=>escolheProduto(b.dataset.modo)));
|
|
// Back on the home and into the same product: the artworks sent are still there.
|
|
function escolheProduto(m){
|
|
if(modo===m && $('foco').classList.contains('on')) vaiPara(PAGINAS[m]);
|
|
else abrir(m);
|
|
}
|
|
function abrir(m){
|
|
modo=m; artes=[]; folhas=[]; metros=0; nota=0; reencaixado=false;
|
|
montagemCm=0;
|
|
avisoTipo('');
|
|
pintaModo();
|
|
$('lista').innerHTML=''; $('rA').style.display='none'; recusa([]);
|
|
recemChegada=null; caminho='auto'; avisoCam(''); pintaCaminhos();
|
|
$('vMt').textContent='—'; previaAoVivo(); agendaAvaliacao();
|
|
limpaPaineis(); // o carrinho só some se o pedido estiver vazio
|
|
vaiPara(PAGINAS[m]);
|
|
}
|
|
function pintaModo(){
|
|
const m=modo;
|
|
const c=MODOS[m];
|
|
$('cards').style.display='none'; $('foco').classList.add('on');
|
|
$('fTit').textContent=c.tit; $('fLg').textContent=c.lg;
|
|
$('fPreco').textContent=c.preco; $('fSub').textContent=c.sub;
|
|
$('zTit').textContent=c.zt; $('zSub').textContent=c.zs;
|
|
$('inp').multiple=c.multi;
|
|
$('inp').accept = ehFolha(m) ? '.png,.jpg,.jpeg,.pdf'
|
|
: '.png,.jpg,.jpeg,.webp';
|
|
$('catFoco').className='cat '+(ehFolha(m)?'file':'av');
|
|
$('larguraFolhaPronta').textContent=String(c.larg).replace('.',',');
|
|
$('foco2').classList.remove('sofila'); // a caixa de requisitos vale nos 4 modos
|
|
$('montcabTit').textContent = ehFolha(m) ? 'Sua folha' : 'Montagem ao vivo';
|
|
$('qOk').textContent = ehFolha(m) ? 'Adicionar ao carrinho' : 'Ver a folha montada';
|
|
pintaTipoEnvio();
|
|
}
|
|
// O par folha montada / artes separadas fica visível e com preço nos dois lados,
|
|
// nos dois modos: nenhuma troca acontece sem o cliente ver o que muda, e sempre
|
|
// dá para voltar atrás sem recomeçar o pedido.
|
|
function pintaTipoEnvio(){
|
|
const el=$('tipoEnvio'); if(!el) return;
|
|
el.hidden=!modo;
|
|
if(el.hidden) return;
|
|
const folha = ehFolha() ? modo : PAR[modo];
|
|
const avulsa = ehFolha() ? PAR[modo] : modo;
|
|
$('tipoFolhaPreco').textContent='a partir de '+rs(pisoEscada(folha));
|
|
$('tipoAvulsaPreco').textContent='a partir de '+rs(pisoEscada(avulsa))+' · montagem inclusa';
|
|
$('larguraFolhaPronta').textContent=String(MODOS[folha].larg).replace('.',',');
|
|
const atual = ehFolha() ? 'folha' : 'avulsa';
|
|
el.querySelectorAll('.cam').forEach(b=>{
|
|
b.classList.toggle('on', b.dataset.tipo===atual);
|
|
b.disabled=folhas.length>0 || artes.length>0; // já tem arquivo: a escolha está feita
|
|
});
|
|
}
|
|
function avisoTipo(txt){
|
|
const el=$('avisoTipo'); if(!el) return;
|
|
el.innerHTML=txt; el.style.display = txt? '' : 'none';
|
|
}
|
|
// A imagem foi declarada folha montada mas não tem resolução para isso. Devolve o
|
|
// arquivo com o motivo e o caminho certo — sem trocar preço por conta própria.
|
|
function recusaFolha(x, md){
|
|
const arquivo=x.f, destino = modo==='uvfile' ? 'uv' : 'avulsa';
|
|
folhas=folhas.filter(y=>y!==x);
|
|
pintaFolha();
|
|
avisoTipo('<b>'+escapeHTML(arquivo.name)+' não é uma folha montada.</b> '+
|
|
'Para ocupar os '+n1(larguraFilme())+' cm do filme ela teria só '+md.dpiFolha+
|
|
' DPI, e o mínimo para imprimir é '+DPI_RECUSA+'. '+
|
|
'Se for uma arte para montarmos, use <b>'+MODOS[destino].tit+'</b>, '+
|
|
'a partir de '+rs(pisoEscada(destino))+'/m. '+
|
|
'<button type="button" id="usarAvulsa">Enviar como '+MODOS[destino].tit.toLowerCase()+'</button>');
|
|
const botao=$('usarAvulsa');
|
|
if(botao) botao.addEventListener('click',()=>{
|
|
avisoTipo(''); trocaTipo(PAR[modo]); sel([arquivo]);
|
|
});
|
|
}
|
|
document.querySelectorAll('#tipoEnvio .cam').forEach(b=>b.addEventListener('click',()=>{
|
|
if(b.disabled) return;
|
|
const querFolha=b.dataset.tipo==='folha';
|
|
if(querFolha===ehFolha()) return;
|
|
avisoTipo(''); trocaTipo(PAR[modo]); // escolha explícita do cliente
|
|
}));
|
|
// Troca declarada, nunca silenciosa: o cliente já viu os dois preços no seletor.
|
|
function trocaTipo(destino){
|
|
if(!destino || modo===destino) return;
|
|
folhas=[]; artes=[]; recemChegada=null; metros=0; nota=0; montagemCm=0;
|
|
modo=destino;
|
|
history.replaceState(history.state,'',PAGINAS[modo]); document.title=tituloPagina();
|
|
$('lista').innerHTML=''; $('rA').style.display='none'; recusa([]);
|
|
caminho='auto'; avisoCam('');
|
|
pintaModo(); pintaCaminhos(); limpaPaineis(); agendaAvaliacao(); previaAoVivo();
|
|
}
|
|
$('bVoltar').addEventListener('click',()=>{
|
|
itemAtual=null; modo=null; $('atual').style.display='none'; $('carrLin').innerHTML=''; pintaPedido();
|
|
$('foco').classList.remove('on');
|
|
['qual','prev'].forEach(id=>$(id).classList.remove('on'));
|
|
if(!pedido.length) $('carr').classList.remove('on');
|
|
vaiPara('/#envio');
|
|
});
|
|
|