adicionado funcionalidade pra salvar as observações, algumas alterações no estilo de alguns elementos foram acrescentados

This commit is contained in:
Eder Moraes 2025-06-01 02:02:47 -03:00
parent eb5f91b8c9
commit 063e336b80
3 changed files with 73 additions and 31 deletions

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; connect-src https://autoatend.linco.work"> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; connect-src https://autoatend.linco.work">
<title>Aguardando atendimento</title> <title>Tela de Atendimento</title>
<link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="style.css">
<script src="js/jquery/jquery.js"></script> <script src="js/jquery/jquery.js"></script>
</head> </head>
@ -31,7 +31,7 @@
<div id="encaminhar-view" style="display: none;"> <div id="encaminhar-view" style="display: none;">
<h1>Observações</h1> <h1>Observações</h1>
<p>Atendendo: <span id="selected-item-name"></span></p> <p>Atendendo: <span id="selected-item-name"></span></p>
<textarea id="observation-text" rows="10" cols="50" placeholder="Digite suas observações..."></textarea> <textarea id="enc-observation-text" rows="10" cols="50" placeholder="Digite suas observações..."></textarea>
<button id="save-button">Salvar</button> <button id="save-button">Salvar</button>
</div> </div>

62
main.js
View File

@ -49,7 +49,11 @@ async function readData() {
// Função para buscar dados da API // Função para buscar dados da API
async function fetchDataFromAPI() { async function fetchDataFromAPI() {
//executa uma vez e a cada 30 segundos //executa uma vez e a cada 30 segundos
getAndUpdateDataStorage(); setInterval(()=>{
//TODO propicio para fazer um webhook nessas funções que repetem a chamada de requisições em busca de alterações
getAndUpdateDataStorage();
const timer = setInterval(()=>{
getAndUpdateDataStorage(); getAndUpdateDataStorage();
},30000); },30000);
} }
@ -235,7 +239,7 @@ function createFloatingWindow() {
height: winHeight, height: winHeight,
icon: "icon.ico", icon: "icon.ico",
x: screenWidth - winWidth + 0, x: screenWidth - winWidth + 0,
y: screenHeight - winHeight - 60, y: screenHeight - winHeight - 180,
frame: false, frame: false,
transparent: true, transparent: true,
alwaysOnTop: true, alwaysOnTop: true,
@ -517,8 +521,10 @@ ipcMain.on('select-atend-id',(itemId)=>{
}); });
// Ouvir clique no botão "Iniciar atendimento" // Ouvir clique no botão "Iniciar atendimento"
ipcMain.on('iniciar-atendimento', (event, itemId) => { ipcMain.on('iniciar-atendimento', async (event, itemId) => {
const token = await getAuthToken();
const colabId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('idOperator')")
//TODO inicia o atendimento o id do atendimento deve ser requisitado do backend //TODO inicia o atendimento o id do atendimento deve ser requisitado do backend
const url = apiUrl + 'iniciar-atendimento/'+itemId; // URL de exemplo para enviar a solicitação const url = apiUrl + 'iniciar-atendimento/'+itemId; // URL de exemplo para enviar a solicitação
@ -529,7 +535,7 @@ ipcMain.on('iniciar-atendimento', (event, itemId) => {
url: url, url: url,
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Authorization': 'Bearer ' + localStorage.getItem('token') 'Authorization': 'Bearer ' + token
} }
}); });
@ -559,19 +565,53 @@ ipcMain.on('iniciar-atendimento', (event, itemId) => {
}); });
// Ouvir clique no botão "Salvar" // Ouvir clique no botão "Salvar"
ipcMain.on('save-observation', (event, { itemId, observation }) => { ipcMain.on('save-observation', async (event, { itemId, observation }) => {
//TODO salva a observação e finaliza o atendimento //TODO salva a observação e finaliza o atendimento
console.log(`Salvando observação para item ${itemId}: ${observation}`); console.log(`Salvando observação para item ${itemId}: ${observation}`);
console.log("Observação 'salva' (apenas log por enquanto)."); const token = await getAuthToken();
const colabId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('idOperator')")
//TODO inicia o atendimento o id do atendimento deve ser requisitado do backend
const url = apiUrl + 'finalizar-atendimento/'+itemId; // URL de exemplo para enviar a solicitação
const fmData = JSON.stringify({
"colabId": colabId,
"obsAtendimento": observation
});
// Simula o envio de uma solicitação POST com o ID do item
const request = net.request({
method: 'POST',
url: url,
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
}
});
request.on('response', (response) => {
response.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
response.on('end', () => {
console.log('Solicitação concluída.');
// Avisa a janela principal que a solicitação foi feita (opcional)
// mainWin.webContents.send('request-done', itemId);
});
});
request.on('error', (error) => {
console.error(`Erro na solicitação: ${error}`);
// Poderia notificar a UI sobre o erro
});
// Envia o ID como corpo da requisição (exemplo)
request.write(fmData);
request.end();
// Opcional: Ler dados novamente e atualizar contagem na janela flutuante
// const data = readData();
// if (floatingWin) {
// floatingWin.webContents.send('update-count', data.length);
// }
// Opcional: Fechar ou resetar a janela principal após salvar // Opcional: Fechar ou resetar a janela principal após salvar
if (mainWin) { if (mainWin) {

View File

@ -5,6 +5,7 @@ const itemList = document.getElementById('item-list');
const nextButton = document.getElementById('next-button'); const nextButton = document.getElementById('next-button');
const logoutButton = document.getElementById('logout-button'); const logoutButton = document.getElementById('logout-button');
const observationText = document.getElementById('observation-text'); const observationText = document.getElementById('observation-text');
const encObservationText = document.getElementById('enc-observation-text');
const saveButton = document.getElementById('save-button'); const saveButton = document.getElementById('save-button');
const selectedItemNameSpan = document.getElementById('selected-item-name'); const selectedItemNameSpan = document.getElementById('selected-item-name');
const queueNumber = document.getElementById('queue-number'); const queueNumber = document.getElementById('queue-number');
@ -26,15 +27,19 @@ window.electronAPI.onLoadData((data) => {
//chama o proximo da fila ao abrir a janela de atendimentos //chama o proximo da fila ao abrir a janela de atendimentos
window.electronAPI.selectAtendID((data)=>{ window.electronAPI.selectAtendID((data)=>{
if(!data){ if(!data){
queueNumber.innerHTML = 'Ninguem aguardando atendimento'; queueNumber.innerHTML = 'Ninguem aguardando atendimento, fechando a janela em alguns segundos...';
window.close(); setTimeout(() => {
window.close();
},5000);
return; return;
} }
// Reseta a view para a lista sempre que os dados são carregados ao clicar no botão para abrir a janela // Reseta a view para a lista sempre que os dados são carregados ao clicar no botão para abrir a janela
populateList(data); populateList(data);
showListView(); showListView();
selectedItemId = data.id ?? null; selectedItemId = data.id ?? null;
queueNumber.innerHTML = data ? 'NA VEZ: '+ /*data.senhaGen + ' - '+*/ data.clientName.toUpperCase() + ' - ' + data.descricaoServico.toUpperCase() : 'Ninguem aguardando atendimento'; //data.senhaGen
queueNumber.innerHTML = data ? `NA VEZ: <u style="color:orange;">${data.clientName.toUpperCase()}</u> - ${data.descricaoServico.toUpperCase()}` : 'Ninguem aguardando atendimento';
selectedItemNameSpan.innerHTML = data ? `<u> ${data.clientName.toUpperCase()} </u> <i style="float:right;">[ ${data.senhaGen} ]</i>` : 'Ninguem aguardando atendimento';
}); });
@ -47,7 +52,7 @@ function populateList(currentData) {
itemList.innerHTML = ''; // Limpa a lista anterior itemList.innerHTML = ''; // Limpa a lista anterior
if (!proximos || proximos.length === 0 || !currentData) { if (!proximos || proximos.length === 0 || !currentData) {
itemList.innerHTML = '<li>Nenhum item encontrado.</li>'; itemList.innerHTML = '<li>Fila vazia!</li>';
nextButton.disabled = !currentData; nextButton.disabled = !currentData;
return; return;
} }
@ -59,13 +64,13 @@ function populateList(currentData) {
selectedItemId = itemToProcess.id; selectedItemId = itemToProcess.id;
selectedItemName = itemToProcess.clientName; selectedItemName = itemToProcess.clientName;
const li = document.createElement('li'); const li = document.createElement('li');
li.textContent = /*${itemToProcess.senhaGen}: */ `${itemToProcess.clientName.toUpperCase()} - ${itemToProcess.attendanceType.toUpperCase()} - ${itemToProcess.descricaoServico.toUpperCase()}`; li.innerHTML = /*${itemToProcess.senhaGen}: */ `<u>${itemToProcess.clientName.toUpperCase()}</u> - ${itemToProcess.attendanceType.toUpperCase()} - ${itemToProcess.descricaoServico.toUpperCase()}`;
li.dataset.id = itemToProcess.id; // Armazena o ID no elemento li.dataset.id = itemToProcess.id; // Armazena o ID no elemento
li.classList.add('selected'); // Marca como selecionado visualmente (precisa de CSS) li.classList.add('selected'); // Marca como selecionado visualmente (precisa de CSS)
itemList.appendChild(li); itemList.appendChild(li);
nextButton.disabled = false; nextButton.disabled = false;
} else { } else {
itemList.innerHTML = '<li>Nenhum item para processar.</li>'; itemList.innerHTML = '<li>Fila vazia!</li>';
nextButton.disabled = !currentData; nextButton.disabled = !currentData;
selectedItemId = null; selectedItemId = null;
selectedItemName = ''; selectedItemName = '';
@ -96,9 +101,6 @@ showListView();
//inicia o atendimento //inicia o atendimento
function showObservationView() { function showObservationView() {
if (!selectedItemId) return; // Não muda se nada estiver selecionado if (!selectedItemId) return; // Não muda se nada estiver selecionado
//obter o id do atendimento de modo asyncrono
selectedItemNameSpan.textContent = selectedItemName || `ID ${selectedItemId}`; // Mostra nome ou ID
listView.style.display = 'none'; listView.style.display = 'none';
observationView.style.display = 'block'; observationView.style.display = 'block';
} }
@ -121,14 +123,14 @@ logoutButton.addEventListener('click',()=>{
// //
// // Evento do botão "Salvar" // // Evento do botão "Salvar"
// saveButton.addEventListener('click', () => { saveButton.addEventListener('click', () => {
// const observation = observationText.value.trim(); const observation = observationText.value;
// if (selectedItemId !== null) { if (selectedItemId !== null) {
// window.electronAPI.saveObservation({ itemId: selectedItemId, observation: observation }); window.electronAPI.saveObservation({ itemId: selectedItemId, observation: observation });
// window.location.reload(); window.location.reload();
// // A janela será escondida pelo main process após salvar (conforme main.js) // A janela será escondida pelo main process após salvar (conforme main.js)
// // Se quiser resetar a view sem esconder, chame showListView() aqui. // Se quiser resetar a view sem esconder, chame showListView() aqui.
// } }
// }); });
// Inicialmente, mostra a view da lista (estará vazia até receber dados) // Inicialmente, mostra a view da lista (estará vazia até receber dados)