All checks were successful
Build and deploy / Validate source (push) Successful in 6s
Build and deploy / Integration suite on a real stack (push) Successful in 2m31s
Build and deploy / Secret scan and release gate (push) Successful in 6s
Build and deploy / Publish images (push) Successful in 1m0s
The product page is rebuilt around mockup 1. The two ways to send are
cards under the title; the PNG/CDR route choice is gone (it never changed
the price, and the picker now takes every allowed format). Each file card
has a thumbnail, its size, check chips with a plain sentence for any
problem, a "Ver detalhes da conferência" link and a copies stepper; a CDR
file says "Conferência manual · preço cheio" and asks for the length. The
buy box shows the price scale in DPI with the customer's step, the metre
and 10 cm length, the total and what the resolution saved, and "Sai em N
partes" only above 20 m. Folha já montada gets "Ampliar" instead of zoom.
Pricing, grade and checks are unchanged.
Fixes on top: the card thumbnail is a small image made once, not the full
preview re-parsed on every repaint; sizes from 1 GB up read in GB; a failed
upload is shown with "Tentar de novo" instead of retrying silently on every
cart change. The browser suites wait for the product and the reloaded page
instead of racing them, and the artwork suite delays imagemDaArte, which
the packing now uses, fixing the CI failure of f4aacb5.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
105 lines
5.0 KiB
JavaScript
105 lines
5.0 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;
|
|
$('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;
|
|
$('zTit').textContent=c.zt; $('zSub').textContent=c.zs;
|
|
$('zManual').hidden=!ehFolha(m);
|
|
$('zOutra').textContent = ehFolha(m) ? 'Adicionar outra folha' : 'Adicionar mais artes';
|
|
$('zona').classList.remove('compacta');
|
|
$('inp').multiple=c.multi;
|
|
// The file decides the price: PNG, JPG and PDF are checked here, the others by hand.
|
|
$('inp').accept = ehFolha(m) ? '.png,.jpg,.jpeg,.pdf,.tif,.tiff,.psd,.psb,.ai,.cdr'
|
|
: '.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=rs(pisoEscada(folha))+' a '+rs(TABELA[folha]).slice(3)+' /m';
|
|
$('tipoAvulsaPreco').textContent='+ '+rs(MONTAGEM[avulsa])+' /m';
|
|
$('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([]);
|
|
pintaModo(); 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');
|
|
});
|
|
|