Adiciona possibilidade de editar e salvar informações na base de conhecimento adquirido
This commit is contained in:
+65
-4
@@ -222,18 +222,79 @@ const initApp = () => {
|
|||||||
}
|
}
|
||||||
knowledgeList.innerHTML = window.conhecimento.facts.map(f => `
|
knowledgeList.innerHTML = window.conhecimento.facts.map(f => `
|
||||||
<div class="knowledge-item" data-id="${f.id}">
|
<div class="knowledge-item" data-id="${f.id}">
|
||||||
<div class="knowledge-item-content">
|
<div class="knowledge-item-content" id="knowledge-content-${f.id}">
|
||||||
<span class="knowledge-source">${f.source}</span>
|
<span class="knowledge-source">${f.source}</span>
|
||||||
<p>${f.content}</p>
|
<p style="margin: 4px 0 0 0;">${f.content}</p>
|
||||||
<small>${new Date(f.addedAt).toLocaleDateString('pt-BR')}</small>
|
<small style="display: block; margin-top: 4px;">${new Date(f.addedAt).toLocaleDateString('pt-BR')}</small>
|
||||||
|
</div>
|
||||||
|
<div class="knowledge-actions" id="knowledge-actions-${f.id}" style="display: flex; gap: 4px; align-self: flex-start; margin-left: 8px;">
|
||||||
|
<button class="knowledge-edit-btn" onclick="startEditKnowledge(${f.id})" title="Editar" style="background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 2px 4px; font-size: 0.9rem; transition: color 0.2s;">✏️</button>
|
||||||
|
<button class="knowledge-delete-btn" onclick="deleteKnowledge(${f.id})" title="Excluir">×</button>
|
||||||
</div>
|
</div>
|
||||||
<button class="knowledge-delete-btn" onclick="deleteKnowledge(${f.id})">×</button>
|
|
||||||
</div>
|
</div>
|
||||||
`).join('');
|
`).join('');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Iniciar edição de item de conhecimento
|
||||||
|
window.startEditKnowledge = (id) => {
|
||||||
|
const fact = window.conhecimento.facts.find(f => f.id === id);
|
||||||
|
if (!fact) return;
|
||||||
|
|
||||||
|
const contentDiv = document.getElementById(`knowledge-content-${id}`);
|
||||||
|
const actionsDiv = document.getElementById(`knowledge-actions-${id}`);
|
||||||
|
if (!contentDiv) return;
|
||||||
|
|
||||||
|
if (actionsDiv) actionsDiv.style.display = 'none';
|
||||||
|
|
||||||
|
contentDiv.innerHTML = `
|
||||||
|
<span class="knowledge-source">${fact.source}</span>
|
||||||
|
<textarea id="edit-textarea-${id}" style="width: 100%; min-height: 70px; padding: 8px; border-radius: 6px; border: 1px solid var(--brand-green); background: var(--bg-primary); color: var(--text-primary); font-family: var(--font-sans); font-size: 0.9rem; resize: vertical; margin: 6px 0; outline: none; box-shadow: 0 0 4px var(--brand-glow);">${fact.content}</textarea>
|
||||||
|
<div style="display: flex; gap: 8px; margin-top: 4px;">
|
||||||
|
<button onclick="saveEditKnowledge(${id})" style="background: var(--brand-green); border: none; color: white; padding: 4px 10px; border-radius: 6px; font-size: 0.75rem; cursor: pointer; font-weight: 500; transition: opacity 0.2s;">Salvar</button>
|
||||||
|
<button onclick="renderKnowledgeList()" style="background: var(--bg-tertiary); border: none; color: var(--text-primary); padding: 4px 10px; border-radius: 6px; font-size: 0.75rem; cursor: pointer; font-weight: 500; transition: opacity 0.2s;">Cancelar</button>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const textarea = document.getElementById(`edit-textarea-${id}`);
|
||||||
|
if (textarea) {
|
||||||
|
textarea.focus();
|
||||||
|
textarea.setSelectionRange(textarea.value.length, textarea.value.length);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Salvar edição de item de conhecimento
|
||||||
|
window.saveEditKnowledge = async (id) => {
|
||||||
|
const textarea = document.getElementById(`edit-textarea-${id}`);
|
||||||
|
if (!textarea) return;
|
||||||
|
const newContent = textarea.value.trim();
|
||||||
|
if (!newContent) {
|
||||||
|
alert('O conteúdo do conhecimento não pode ser vazio.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(`/api/conhecimento/${id}`, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ content: newContent })
|
||||||
|
});
|
||||||
|
if (res.ok) {
|
||||||
|
const fact = window.conhecimento.facts.find(f => f.id === id);
|
||||||
|
if (fact) fact.content = newContent;
|
||||||
|
renderKnowledgeList();
|
||||||
|
} else {
|
||||||
|
const err = await res.json();
|
||||||
|
alert('Erro ao salvar conhecimento: ' + err.error);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Erro ao atualizar conhecimento:', e);
|
||||||
|
alert('Erro de conexão ao salvar conhecimento.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Deletar item de conhecimento (função global para onclick)
|
// Deletar item de conhecimento (função global para onclick)
|
||||||
window.deleteKnowledge = async (id) => {
|
window.deleteKnowledge = async (id) => {
|
||||||
|
if (!confirm('Deseja realmente remover este conhecimento aprendido?')) return;
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`/api/conhecimento/${id}`, { method: 'DELETE' });
|
const res = await fetch(`/api/conhecimento/${id}`, { method: 'DELETE' });
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
|
|||||||
@@ -185,6 +185,19 @@ app.delete('/api/conhecimento/:id', requireAuth, async (req, res) => {
|
|||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.put('/api/conhecimento/:id', requireAuth, async (req, res) => {
|
||||||
|
const { content } = req.body;
|
||||||
|
if (!content) return res.status(400).json({ error: 'Conteúdo é obrigatório' });
|
||||||
|
try {
|
||||||
|
const id = parseInt(req.params.id);
|
||||||
|
await dbPool.query("UPDATE escola.conhecimento SET content = $1 WHERE id = $2;", [content, id]);
|
||||||
|
res.json({ success: true });
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Erro ao atualizar conhecimento:', err);
|
||||||
|
res.status(500).json({ error: err.message });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Analisar mensagem final e extrair conhecimento aprendido (chamado pelo frontend)
|
// Analisar mensagem final e extrair conhecimento aprendido (chamado pelo frontend)
|
||||||
app.post('/api/conhecimento/extrair', requireAuth, async (req, res) => {
|
app.post('/api/conhecimento/extrair', requireAuth, async (req, res) => {
|
||||||
const { message } = req.body;
|
const { message } = req.body;
|
||||||
|
|||||||
Reference in New Issue
Block a user