Add stage classification and appointment scheduling UI
This commit is contained in:
+1
-1
@@ -268,7 +268,7 @@
|
|||||||
<button class="btn-ghost btn-sm" id="btn-cancelar-selecionados" type="button">Cancelar selecionados</button>
|
<button class="btn-ghost btn-sm" id="btn-cancelar-selecionados" type="button">Cancelar selecionados</button>
|
||||||
</div>
|
</div>
|
||||||
<table>
|
<table>
|
||||||
<thead><tr><th></th><th>Lead ID</th><th>Numero</th><th>Mensagem</th><th>Status</th></tr></thead>
|
<thead><tr><th></th><th>Lead ID</th><th>Numero</th><th>Mensagem</th><th>Status</th><th>Estagio</th></tr></thead>
|
||||||
<tbody id="fila-tabela"></tbody>
|
<tbody id="fila-tabela"></tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+28
-4
@@ -135,17 +135,41 @@ const Campanhas = (() => {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const STAGE_OPTIONS = [
|
||||||
|
'respondeu', 'interessado', 'demonstracao_agendada', 'sem_interesse', 'opt_out', 'venda_fechada'
|
||||||
|
];
|
||||||
|
|
||||||
async function carregarFila(campanhaId) {
|
async function carregarFila(campanhaId) {
|
||||||
const status = el('fila-filtro-status').value;
|
const status = el('fila-filtro-status').value;
|
||||||
const { fila } = await API.get(`/api/campaigns/${campanhaId}/fila?status=${status}`);
|
const { fila } = await API.get(`/api/campaigns/${campanhaId}/fila?status=${status}`);
|
||||||
el('fila-tabela').replaceChildren(...fila.map((linha) =>
|
el('fila-tabela').replaceChildren(...fila.map((linha) => {
|
||||||
h('tr', {},
|
const podeMarcarEstagio = linha.status === 'sent' || linha.status === 'error';
|
||||||
|
const stageSelect = h('select', { class: 'fila-estagio-select', disabled: podeMarcarEstagio ? null : 'disabled' },
|
||||||
|
h('option', { value: '' }, '—'),
|
||||||
|
...STAGE_OPTIONS.map((s) => h('option', { value: s }, s)));
|
||||||
|
const marcarBtn = h('button', {
|
||||||
|
class: 'btn-ghost btn-sm', type: 'button', disabled: podeMarcarEstagio ? null : 'disabled',
|
||||||
|
onclick: async () => {
|
||||||
|
if (!stageSelect.value) return;
|
||||||
|
await API.post(`/api/campaigns/leads/${linha.lead_id}/estagio`, { stage: stageSelect.value, campaignId: campanhaId });
|
||||||
|
toast('Estagio atualizado');
|
||||||
|
if (stageSelect.value === 'demonstracao_agendada') {
|
||||||
|
const dataAgendamento = prompt('Data/hora do agendamento (AAAA-MM-DD HH:MM):');
|
||||||
|
if (dataAgendamento) {
|
||||||
|
await API.post(`/api/campaigns/leads/${linha.lead_id}/agendamentos`, { kind: 'demonstracao', scheduledAt: dataAgendamento });
|
||||||
|
toast('Agendamento registrado');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 'Marcar');
|
||||||
|
return h('tr', {},
|
||||||
h('td', {}, h('input', { type: 'checkbox', class: 'fila-check', value: linha.id })),
|
h('td', {}, h('input', { type: 'checkbox', class: 'fila-check', value: linha.id })),
|
||||||
h('td', {}, String(linha.lead_id)),
|
h('td', {}, String(linha.lead_id)),
|
||||||
h('td', {}, linha.numero),
|
h('td', {}, linha.numero),
|
||||||
h('td', {}, linha.rendered_message),
|
h('td', {}, linha.rendered_message),
|
||||||
h('td', {}, linha.status))
|
h('td', {}, linha.status),
|
||||||
));
|
h('td', { class: 'row' }, stageSelect, marcarBtn));
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
function filaSelecionada() {
|
function filaSelecionada() {
|
||||||
|
|||||||
Reference in New Issue
Block a user