Laitetilat: laitelinkit kortteihin + Sijainnit pois yritysasetuksista
Laitetila-laite-yhteys: - Lisätty laitetila_id -sarake devices-tauluun - Laite-lomakkeeseen uusi "Laitetila" dropdown (Tekniikka → Laitteet) - Laitetila-kortit näyttävät laitemäärän ja laitechipit (max 4 + "+N muuta") - Laitetilan detailnäkymässä taulukko tilan laitteista (nimi, tyyppi, malli, IP, ping) - dbLoadLaitetilat palauttaa device_count ja devices-listan per laitetila Yritysasetukset: - Poistettu Sijainnit-osio yrityksen tiedoista (hallitaan Tekniikka → Sijainnit) - Sijainnit sub-tab Tekniikassa pysyy ennallaan Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
127
script.js
127
script.js
@@ -2924,8 +2924,9 @@ async function editDevice(id) {
|
||||
document.getElementById('device-form-malli').value = d.malli || '';
|
||||
document.getElementById('device-form-ping-check').checked = d.ping_check || false;
|
||||
document.getElementById('device-form-lisatiedot').value = d.lisatiedot || '';
|
||||
await loadSitesForDropdown();
|
||||
await loadSitesAndLaitetilatForDropdown();
|
||||
document.getElementById('device-form-site').value = d.site_id || '';
|
||||
document.getElementById('device-form-laitetila').value = d.laitetila_id || '';
|
||||
document.getElementById('device-modal-title').textContent = 'Muokkaa laitetta';
|
||||
document.getElementById('device-modal').style.display = 'flex';
|
||||
}
|
||||
@@ -2938,19 +2939,25 @@ async function deleteDevice(id, name) {
|
||||
} catch (e) { alert(e.message); }
|
||||
}
|
||||
|
||||
async function loadSitesForDropdown() {
|
||||
async function loadSitesForDropdown() { await loadSitesAndLaitetilatForDropdown(); }
|
||||
|
||||
async function loadSitesAndLaitetilatForDropdown() {
|
||||
try {
|
||||
sitesData = await apiCall('sites');
|
||||
const sel = document.getElementById('device-form-site');
|
||||
sel.innerHTML = '<option value="">— Ei sijaintia —</option>' +
|
||||
const [sites, tilat] = await Promise.all([apiCall('sites'), apiCall('laitetilat')]);
|
||||
sitesData = sites;
|
||||
const siteSel = document.getElementById('device-form-site');
|
||||
siteSel.innerHTML = '<option value="">— Ei sijaintia —</option>' +
|
||||
sitesData.map(s => `<option value="${s.id}">${esc(s.nimi)}${s.kaupunki ? ' (' + esc(s.kaupunki) + ')' : ''}</option>`).join('');
|
||||
const tilaSel = document.getElementById('device-form-laitetila');
|
||||
tilaSel.innerHTML = '<option value="">— Ei laitetilaa —</option>' +
|
||||
tilat.map(t => `<option value="${t.id}">${esc(t.nimi)}${t.osoite ? ' (' + esc(t.osoite) + ')' : ''}</option>`).join('');
|
||||
} catch (e) { console.error(e); }
|
||||
}
|
||||
|
||||
document.getElementById('btn-add-device')?.addEventListener('click', async () => {
|
||||
document.getElementById('device-form-id').value = '';
|
||||
document.getElementById('device-form').reset();
|
||||
await loadSitesForDropdown();
|
||||
await loadSitesAndLaitetilatForDropdown();
|
||||
document.getElementById('device-modal-title').textContent = 'Lisää laite';
|
||||
document.getElementById('device-modal').style.display = 'flex';
|
||||
});
|
||||
@@ -2970,6 +2977,7 @@ document.getElementById('device-form')?.addEventListener('submit', async (e) =>
|
||||
hallintaosoite: document.getElementById('device-form-hallintaosoite').value.trim(),
|
||||
serial: document.getElementById('device-form-serial').value.trim(),
|
||||
site_id: document.getElementById('device-form-site').value || null,
|
||||
laitetila_id: document.getElementById('device-form-laitetila').value || null,
|
||||
funktio: document.getElementById('device-form-funktio').value.trim(),
|
||||
tyyppi: document.getElementById('device-form-tyyppi').value.trim(),
|
||||
malli: document.getElementById('device-form-malli').value.trim(),
|
||||
@@ -3012,7 +3020,6 @@ async function loadSitesTab() {
|
||||
sitesData = await apiCall('sites');
|
||||
sitesTabData = sitesData;
|
||||
renderSitesTab();
|
||||
renderSitesSettings(); // Päivitä myös asetuksissa
|
||||
} catch (e) { console.error(e); }
|
||||
}
|
||||
|
||||
@@ -3078,64 +3085,13 @@ async function deleteSite(id, name) {
|
||||
} catch (e) { alert(e.message); }
|
||||
}
|
||||
|
||||
// Renderöi sijainnit myös asetuksissa (company detail)
|
||||
function renderSitesSettings() {
|
||||
const container = document.getElementById('sites-list');
|
||||
if (!container) return;
|
||||
if (sitesData.length === 0) {
|
||||
container.innerHTML = '<p style="color:#888;font-size:0.9rem;">Ei sijainteja. Lisää ensimmäinen sijainti.</p>';
|
||||
return;
|
||||
}
|
||||
container.innerHTML = sitesData.map(s => `<div style="display:flex;justify-content:space-between;align-items:center;padding:0.75rem;background:#fff;border:1px solid #e0e0e0;border-radius:8px;margin-bottom:0.5rem;">
|
||||
<div>
|
||||
<strong>${esc(s.nimi)}</strong>
|
||||
${s.osoite ? `<span style="color:#888;font-size:0.85rem;margin-left:0.75rem;">${esc(s.osoite)}</span>` : ''}
|
||||
${s.kaupunki ? `<span style="color:#888;font-size:0.85rem;margin-left:0.5rem;">${esc(s.kaupunki)}</span>` : ''}
|
||||
</div>
|
||||
<div style="display:flex;gap:0.5rem;">
|
||||
<button class="btn-link" onclick="editSite('${s.id}')">Muokkaa</button>
|
||||
<button class="btn-link" style="color:#dc2626;" onclick="deleteSite('${s.id}','${esc(s.nimi)}')">Poista</button>
|
||||
</div>
|
||||
</div>`).join('');
|
||||
}
|
||||
|
||||
// Alias loadSites asetuksista kutsuun
|
||||
// Alias loadSites (Tekniikka sub-tab kutsuun)
|
||||
async function loadSites() { await loadSitesTab(); }
|
||||
|
||||
function renderSites() { renderSitesSettings(); }
|
||||
function renderSites() {}
|
||||
|
||||
document.getElementById('site-search-input')?.addEventListener('input', () => renderSitesTab());
|
||||
|
||||
document.getElementById('btn-add-site')?.addEventListener('click', () => {
|
||||
document.getElementById('site-form-id').value = '';
|
||||
document.getElementById('site-form-nimi').value = '';
|
||||
document.getElementById('site-form-osoite').value = '';
|
||||
document.getElementById('site-form-kaupunki').value = '';
|
||||
document.getElementById('site-form-title').textContent = 'Uusi sijainti';
|
||||
document.getElementById('site-form-container').style.display = '';
|
||||
});
|
||||
|
||||
document.getElementById('btn-save-site')?.addEventListener('click', async () => {
|
||||
const id = document.getElementById('site-form-id').value;
|
||||
const nimi = document.getElementById('site-form-nimi').value.trim();
|
||||
if (!nimi) return alert('Sijainnin nimi vaaditaan');
|
||||
const data = {
|
||||
nimi,
|
||||
osoite: document.getElementById('site-form-osoite').value.trim(),
|
||||
kaupunki: document.getElementById('site-form-kaupunki').value.trim(),
|
||||
};
|
||||
if (id) data.id = id;
|
||||
try {
|
||||
await apiCall('site_save', 'POST', data);
|
||||
document.getElementById('site-form-container').style.display = 'none';
|
||||
loadSitesTab();
|
||||
} catch (e) { alert(e.message); }
|
||||
});
|
||||
|
||||
document.getElementById('btn-cancel-site')?.addEventListener('click', () => {
|
||||
document.getElementById('site-form-container').style.display = 'none';
|
||||
});
|
||||
|
||||
// ==================== IPAM ====================
|
||||
|
||||
let ipamData = [];
|
||||
@@ -5483,18 +5439,33 @@ function renderLaitetilatList() {
|
||||
}
|
||||
noEl.style.display = 'none';
|
||||
|
||||
grid.innerHTML = allLaitetilat.map(t => `
|
||||
<div class="laitetila-card" onclick="openLaitetilaRead('${t.id}')">
|
||||
grid.innerHTML = allLaitetilat.map(t => {
|
||||
const dc = t.device_count || 0;
|
||||
const devList = (t.devices || []).slice(0, 4).map(d => {
|
||||
const ping = d.ping_status === 'up' ? '🟢' : d.ping_status === 'down' ? '🔴' : '⚪';
|
||||
return `<span class="lt-dev-chip">${ping} ${esc(d.nimi)}</span>`;
|
||||
}).join('');
|
||||
const moreCount = dc > 4 ? `<span class="lt-dev-more">+${dc - 4} muuta</span>` : '';
|
||||
return `<div class="laitetila-card" onclick="openLaitetilaRead('${t.id}')">
|
||||
<h4>${esc(t.nimi)}</h4>
|
||||
<p class="laitetila-osoite">${esc(t.osoite || '')}</p>
|
||||
<p class="laitetila-meta">📁 ${t.file_count || 0} tiedostoa</p>
|
||||
</div>
|
||||
`).join('');
|
||||
<div class="laitetila-stats">
|
||||
<span>🖥 ${dc} laitetta</span>
|
||||
<span>📁 ${t.file_count || 0} tiedostoa</span>
|
||||
</div>
|
||||
${dc > 0 ? `<div class="lt-dev-list">${devList}${moreCount}</div>` : ''}
|
||||
</div>`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
async function openLaitetilaRead(tilaId) {
|
||||
try {
|
||||
currentLaitetila = await apiCall(`laitetila&id=${tilaId}`);
|
||||
// Lataa laitetiedot rinnakkain jos ei vielä ladattu
|
||||
const [tila] = await Promise.all([
|
||||
apiCall(`laitetila&id=${tilaId}`),
|
||||
devicesData.length ? Promise.resolve() : apiCall('devices').then(d => { devicesData = d; })
|
||||
]);
|
||||
currentLaitetila = tila;
|
||||
renderLaitetilaReadView();
|
||||
showLaitetilaReadView();
|
||||
} catch (e) { alert('Laitetilan avaus epäonnistui: ' + e.message); }
|
||||
@@ -5554,6 +5525,30 @@ function renderLaitetilaReadView() {
|
||||
} else {
|
||||
filesSection.style.display = 'none';
|
||||
}
|
||||
|
||||
// Laitteet tässä tilassa
|
||||
const devSection = document.getElementById('laitetila-devices-section');
|
||||
const devList = document.getElementById('laitetila-devices-list');
|
||||
// Hae laitteet jotka on linkitetty tähän laitetilaan
|
||||
const tilaDevices = (devicesData || []).filter(d => d.laitetila_id === t.id);
|
||||
if (tilaDevices.length > 0) {
|
||||
devSection.style.display = '';
|
||||
devList.innerHTML = `<table class="lt-devices-table"><thead><tr><th>Laite</th><th>Tyyppi</th><th>Malli</th><th>IP</th><th>Tila</th></tr></thead><tbody>${
|
||||
tilaDevices.map(d => {
|
||||
const ping = d.ping_status === 'up' ? '🟢' : d.ping_status === 'down' ? '🔴' : '⚪';
|
||||
return `<tr>
|
||||
<td><strong>${esc(d.nimi)}</strong></td>
|
||||
<td>${esc(d.tyyppi || '-')}</td>
|
||||
<td>${esc(d.malli || '-')}</td>
|
||||
<td><code>${esc(d.hallintaosoite || '-')}</code></td>
|
||||
<td>${ping}</td>
|
||||
</tr>`;
|
||||
}).join('')
|
||||
}</tbody></table>`;
|
||||
} else {
|
||||
devSection.style.display = '';
|
||||
devList.innerHTML = '<p style="color:#aaa;font-size:0.85rem;">Ei laitteita tässä tilassa. Linkitä laitteita Tekniikka → Laitteet -osiossa.</p>';
|
||||
}
|
||||
}
|
||||
|
||||
// Tiedoston lataus
|
||||
|
||||
Reference in New Issue
Block a user