Lisää sähköpostiallekirjoitus per käyttäjä per postilaatikko
- Allekirjoitukset tallennetaan users.json:iin (signatures-objekti, avaimena mailbox_id) - Käyttäjälomakkeessa dynaamiset textareat jokaiselle postilaatikolle - Allekirjoitus liitetään automaattisesti sähköpostivastauksiin (ticket_reply) - Esikatselu näkyy tikettivastauslomakkeen alla - Muistiinpanoihin (ticket_note) ei lisätä allekirjoitusta - Uusi all_mailboxes endpoint palauttaa kaikki käyttäjän postilaatikot - check_auth ja login palauttavat nyt myös user_id ja signatures Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
57
script.js
57
script.js
@@ -7,6 +7,7 @@ let currentUser = { username: '', nimi: '', role: '' };
|
||||
let currentCompany = null; // {id, nimi}
|
||||
let availableCompanies = []; // [{id, nimi}, ...]
|
||||
let currentTicketCompanyId = ''; // Avatun tiketin yritys (cross-company tuki)
|
||||
let currentUserSignatures = {}; // {mailbox_id: "allekirjoitus teksti"}
|
||||
|
||||
// Elements
|
||||
const loginScreen = document.getElementById('login-screen');
|
||||
@@ -131,9 +132,10 @@ async function checkAuth() {
|
||||
try {
|
||||
const data = await apiCall('check_auth');
|
||||
if (data.authenticated) {
|
||||
currentUser = { username: data.username, nimi: data.nimi, role: data.role };
|
||||
currentUser = { username: data.username, nimi: data.nimi, role: data.role, id: data.user_id };
|
||||
availableCompanies = data.companies || [];
|
||||
currentCompany = availableCompanies.find(c => c.id === data.company_id) || availableCompanies[0] || null;
|
||||
currentUserSignatures = data.signatures || {};
|
||||
showDashboard();
|
||||
}
|
||||
} catch (e) { /* not logged in */ }
|
||||
@@ -147,9 +149,10 @@ loginForm.addEventListener('submit', async (e) => {
|
||||
try {
|
||||
const data = await apiCall('login', 'POST', { username, password, captcha: parseInt(captcha) });
|
||||
loginError.style.display = 'none';
|
||||
currentUser = { username: data.username, nimi: data.nimi, role: data.role };
|
||||
currentUser = { username: data.username, nimi: data.nimi, role: data.role, id: data.user_id };
|
||||
availableCompanies = data.companies || [];
|
||||
currentCompany = availableCompanies.find(c => c.id === data.company_id) || availableCompanies[0] || null;
|
||||
currentUserSignatures = data.signatures || {};
|
||||
showDashboard();
|
||||
} catch (err) {
|
||||
loginError.textContent = err.message;
|
||||
@@ -976,6 +979,27 @@ function openUserForm(user = null) {
|
||||
</label>`
|
||||
).join('');
|
||||
});
|
||||
// Allekirjoitukset per postilaatikko
|
||||
const sigSection = document.getElementById('user-signatures-section');
|
||||
const sigList = document.getElementById('user-signatures-list');
|
||||
const userSigs = user ? (user.signatures || {}) : {};
|
||||
apiCall('all_mailboxes').then(mailboxes => {
|
||||
if (mailboxes.length === 0) {
|
||||
sigSection.style.display = 'none';
|
||||
return;
|
||||
}
|
||||
sigSection.style.display = '';
|
||||
sigList.innerHTML = mailboxes.map(mb =>
|
||||
`<div style="margin-bottom:0.75rem;">
|
||||
<label style="font-weight:600;font-size:0.85rem;color:#333;">${esc(mb.company_nimi)} — ${esc(mb.nimi)}</label>
|
||||
<textarea class="sig-textarea" data-mailbox-id="${mb.id}" rows="3"
|
||||
style="width:100%;margin-top:0.25rem;padding:8px;border:1px solid #ddd;border-radius:6px;font-size:0.85rem;font-family:inherit;resize:vertical;"
|
||||
placeholder="esim.\nJukka\nYritys Oy\ninfo@yritys.fi">${esc(userSigs[mb.id] || '')}</textarea>
|
||||
</div>`
|
||||
).join('');
|
||||
}).catch(() => {
|
||||
sigSection.style.display = 'none';
|
||||
});
|
||||
userModal.style.display = 'flex';
|
||||
}
|
||||
|
||||
@@ -999,12 +1023,20 @@ document.getElementById('user-form').addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
const id = document.getElementById('user-form-id').value;
|
||||
const companies = [...document.querySelectorAll('.user-company-cb:checked')].map(cb => cb.value);
|
||||
// Kerää allekirjoitukset
|
||||
const signatures = {};
|
||||
document.querySelectorAll('.sig-textarea').forEach(ta => {
|
||||
const mbId = ta.dataset.mailboxId;
|
||||
const val = ta.value.trim();
|
||||
if (val) signatures[mbId] = val;
|
||||
});
|
||||
const data = {
|
||||
username: document.getElementById('user-form-username').value,
|
||||
nimi: document.getElementById('user-form-nimi').value,
|
||||
email: document.getElementById('user-form-email').value,
|
||||
role: document.getElementById('user-form-role').value,
|
||||
companies,
|
||||
signatures,
|
||||
};
|
||||
const pw = document.getElementById('user-form-password').value;
|
||||
if (pw) data.password = pw;
|
||||
@@ -1014,6 +1046,12 @@ document.getElementById('user-form').addEventListener('submit', async (e) => {
|
||||
else { await apiCall('user_create', 'POST', data); }
|
||||
userModal.style.display = 'none';
|
||||
loadUsers();
|
||||
// Päivitä omat allekirjoitukset (check_auth palauttaa tuoreet)
|
||||
const auth = await apiCall('check_auth');
|
||||
if (auth.authenticated) {
|
||||
currentUser = { username: auth.username, nimi: auth.nimi, role: auth.role, id: auth.user_id };
|
||||
currentUserSignatures = auth.signatures || {};
|
||||
}
|
||||
} catch (e) { alert(e.message); }
|
||||
});
|
||||
|
||||
@@ -1348,6 +1386,17 @@ async function showTicketDetail(id, companyId = '') {
|
||||
document.querySelector('.btn-reply-tab[data-reply-type="reply"]').classList.add('active');
|
||||
document.getElementById('btn-send-reply').textContent = 'Lähetä vastaus';
|
||||
|
||||
// Allekirjoituksen esikatselu
|
||||
const sigPreview = document.getElementById('signature-preview');
|
||||
const mailboxId = ticket.mailbox_id || '';
|
||||
const sig = currentUserSignatures[mailboxId] || '';
|
||||
if (sig) {
|
||||
sigPreview.textContent = '-- \n' + sig;
|
||||
sigPreview.style.display = 'block';
|
||||
} else {
|
||||
sigPreview.style.display = 'none';
|
||||
}
|
||||
|
||||
} catch (e) { alert(e.message); }
|
||||
}
|
||||
|
||||
@@ -1376,12 +1425,16 @@ document.querySelectorAll('.btn-reply-tab').forEach(btn => {
|
||||
ticketReplyType = btn.dataset.replyType;
|
||||
const textarea = document.getElementById('ticket-reply-body');
|
||||
const sendBtn = document.getElementById('btn-send-reply');
|
||||
const sigPrev = document.getElementById('signature-preview');
|
||||
if (ticketReplyType === 'note') {
|
||||
textarea.placeholder = 'Kirjoita sisäinen muistiinpano...';
|
||||
sendBtn.textContent = 'Tallenna muistiinpano';
|
||||
sigPrev.style.display = 'none';
|
||||
} else {
|
||||
textarea.placeholder = 'Kirjoita vastaus...';
|
||||
sendBtn.textContent = 'Lähetä vastaus';
|
||||
// Näytä allekirjoitus jos on asetettu
|
||||
if (sigPrev.textContent.trim()) sigPrev.style.display = 'block';
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user