All checks were successful
Build and deploy / Validate source (push) Successful in 1m25s
Build and deploy / Integration suite on a real stack (push) Successful in 3m16s
Build and deploy / Secret scan and release gate (push) Successful in 13s
Build and deploy / Publish images (push) Successful in 1m29s
The customer's browser sends the small picture it already makes of each file (at most 300 KB, WebP/JPEG/PNG read from the bytes, own uploads only); it goes when the file's bytes go. Board cards, quote rows, the order panel and the quote detail show it, with the layout drawing as a second view and as the fallback for files without a picture. Cotações gets a customer filter (e-mail, CNPJ, WhatsApp) and product, layout and resolution-warning chips, with the page bar always shown. The board adds Entrega, Retirada and stalled-order chips. The top search now covers orders in any stage and unpaid quotes; CNPJ and phone match by digits only when nothing but digits and punctuation was typed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
80 lines
4.3 KiB
HTML
80 lines
4.3 KiB
HTML
<!doctype html>
|
|
<html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<title>Kanban DTF</title>
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap">
|
|
<link rel="stylesheet" href="/kanban.css">
|
|
</head><body>
|
|
<form id="login" class="login" hidden>
|
|
<div class="brand"><i aria-hidden="true">D</i>Kanban DTF</div>
|
|
<label>E-mail <input id="email" type="email" autocomplete="username" required></label>
|
|
<label>Senha <input id="password" type="password" autocomplete="current-password" required></label>
|
|
<button class="btn primary">Entrar</button>
|
|
<p id="login-status" class="hint" role="alert"></p>
|
|
</form>
|
|
|
|
<div id="app" hidden>
|
|
<header class="top">
|
|
<div class="brand"><i aria-hidden="true">D</i>Kanban DTF</div>
|
|
<nav class="tabs" aria-label="Seções">
|
|
<button type="button" data-tab="board" aria-selected="true">Produção <span class="count" id="count-board"></span></button>
|
|
<button type="button" data-tab="quotes" aria-selected="false">Cotações <span class="badge" id="badge-quotes"></span></button>
|
|
<button type="button" data-tab="payments" aria-selected="false">Pagamentos <span class="badge warn" id="badge-payments"></span></button>
|
|
<button type="button" data-tab="integrations" aria-selected="false">Integrações</button>
|
|
</nav>
|
|
<div class="searchbox">
|
|
<label class="search">
|
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="M20 20l-3.5-3.5"></path></svg>
|
|
<input id="search" type="search" placeholder="Buscar em pedidos e cotações: cliente, CNPJ, nº" aria-label="Buscar em pedidos e cotações" autocomplete="off" role="combobox" aria-expanded="false" aria-controls="search-results">
|
|
<kbd>/</kbd>
|
|
</label>
|
|
<div id="search-results" class="results" role="listbox" aria-label="Resultados da busca" hidden></div>
|
|
</div>
|
|
<span id="tiny" class="tinydot"></span>
|
|
<span id="who" class="who"></span>
|
|
<button class="btn ghost" id="refresh" type="button">Atualizar</button>
|
|
<button class="btn ghost" id="logout" type="button">Sair</button>
|
|
</header>
|
|
<p id="status" role="status"></p>
|
|
<main>
|
|
<section id="tab-board">
|
|
<div class="bar"><h1>Produção</h1><span class="muted" id="board-summary"></span><div class="chips" id="filters"></div></div>
|
|
<div class="kan" id="kan"></div>
|
|
</section>
|
|
<section id="tab-quotes" hidden>
|
|
<div class="split">
|
|
<div class="list">
|
|
<h1>Cotações</h1>
|
|
<div class="chips" id="quote-filters"></div>
|
|
<label class="qsearch">
|
|
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="M20 20l-3.5-3.5"></path></svg>
|
|
<input id="quote-q" type="search" placeholder="Filtrar por e-mail, CNPJ ou WhatsApp" aria-label="Filtrar cotações por cliente" autocomplete="off">
|
|
</label>
|
|
<div class="chips small" id="quote-chips"></div>
|
|
<div id="quote-list" style="display:flex;flex-direction:column;gap:8px"></div>
|
|
</div>
|
|
<div class="pane" id="reviews"></div>
|
|
</div>
|
|
</section>
|
|
<section id="tab-payments" class="page" hidden>
|
|
<h1>Pagamentos</h1>
|
|
<section id="payments"></section>
|
|
</section>
|
|
<section id="tab-integrations" class="page" hidden>
|
|
<h1>Integrações</h1>
|
|
<section><div class="grid4" id="integrations"></div></section>
|
|
<section><h2>Registro de envios</h2>
|
|
<div class="filters" id="event-filters"></div>
|
|
<table class="log"><thead><tr><th scope="col">Quando</th><th scope="col">Pedido</th><th scope="col">Destino</th><th scope="col">Evento</th><th scope="col">Resultado</th></tr></thead><tbody id="events"></tbody></table>
|
|
<div id="events-more"></div>
|
|
</section>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
|
|
<div class="drawer" id="drawer" hidden>
|
|
<div class="scrim" id="scrim"></div>
|
|
<aside class="panel" id="panel" aria-label="Pedido"></aside>
|
|
</div>
|
|
<script src="/upload.js"></script><script src="/kanban.js"></script></body></html>
|