NetAdmin: Gateway-kenttä, IPAM-integraatio VLAN/IP-tietoihin
- Lisää Gateway-sarake ja -valitsin NetAdmin-näkymään (devices-linkitys) - VLAN ja IP näytetään IPAM:sta automaattisesti asiakkaan nimellä - Muokkausmodaalissa asiakkaan IPAM VLANit/IP:t näkyvät ensimmäisinä - DB: gateway_device_id LEFT JOIN devices, IPAM-enrichment API:ssa Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
83
script.js
83
script.js
@@ -4539,7 +4539,7 @@ function renderNetadminTable() {
|
||||
filtered = filtered.filter(c => {
|
||||
const searchStr = [
|
||||
c.customer_name, c.asennusosoite, c.kaupunki, c.postinumero,
|
||||
c.liittymanopeus, c.vlan, c.laite, c.portti, c.ip
|
||||
c.liittymanopeus, c.vlan, c.laite, c.portti, c.ip, c.gateway_name
|
||||
].filter(Boolean).join(' ').toLowerCase();
|
||||
return searchStr.includes(query);
|
||||
});
|
||||
@@ -4568,15 +4568,35 @@ function renderNetadminTable() {
|
||||
deviceInfo?.ping_status === 'down' ? 'netadmin-status-down' : '';
|
||||
const deviceDisplay = c.laite ? `<span class="${pingClass}">${esc(c.laite)}</span>` : '-';
|
||||
|
||||
// VLAN: näytä tallennettu arvo, tai IPAM:sta haetut
|
||||
let vlanDisplay = esc(c.vlan || '');
|
||||
if (!c.vlan && c.ipam_vlans && c.ipam_vlans.length > 0) {
|
||||
vlanDisplay = c.ipam_vlans.map(v =>
|
||||
`<span class="ipam-hint" title="IPAM: ${esc(v.nimi || '')}">${esc(String(v.vlan_id))}</span>`
|
||||
).join(', ');
|
||||
}
|
||||
|
||||
// IP: näytä tallennettu arvo, tai IPAM:sta haetut
|
||||
let ipDisplay = c.ip ? `<code>${esc(c.ip)}</code>` : '';
|
||||
if (!c.ip && c.ipam_ips && c.ipam_ips.length > 0) {
|
||||
ipDisplay = c.ipam_ips.map(i =>
|
||||
`<span class="ipam-hint" title="IPAM: ${esc(i.nimi || '')}">${esc(i.verkko)}</span>`
|
||||
).join(', ');
|
||||
}
|
||||
|
||||
// Gateway
|
||||
const gwDisplay = c.gateway_name ? esc(c.gateway_name) : '-';
|
||||
|
||||
return `<tr onclick="openNetadminDetail(${c.id})" style="cursor:pointer;" title="Avaa liittymän tiedot">
|
||||
<td><strong>${esc(c.customer_name || '-')}</strong></td>
|
||||
<td>${esc(addr)}</td>
|
||||
<td>${esc(c.kaupunki || '-')}</td>
|
||||
<td><span class="netadmin-speed">${esc(c.liittymanopeus || '-')}</span></td>
|
||||
<td>${esc(c.vlan || '-')}</td>
|
||||
<td>${vlanDisplay || '-'}</td>
|
||||
<td>${deviceDisplay}</td>
|
||||
<td>${esc(c.portti || '-')}</td>
|
||||
<td><code>${esc(c.ip || '-')}</code></td>
|
||||
<td>${ipDisplay || '-'}</td>
|
||||
<td>${gwDisplay}</td>
|
||||
</tr>`;
|
||||
}).join('');
|
||||
}
|
||||
@@ -4758,6 +4778,20 @@ function getIpComboOptions(source) {
|
||||
return items;
|
||||
}
|
||||
|
||||
// Rakennetaan Gateway-combobox optiot (kaikki laitteet devices-listasta)
|
||||
function getGatewayComboOptions() {
|
||||
const devices = netadminData.devices || [];
|
||||
return [...devices].sort((a, b) => (a.nimi || '').localeCompare(b.nimi || '')).map(d => {
|
||||
const pingDot = d.ping_status === 'up' ? '🟢' : d.ping_status === 'down' ? '🔴' : '';
|
||||
return {
|
||||
value: String(d.id),
|
||||
label: (pingDot ? pingDot + ' ' : '') + d.nimi,
|
||||
sub: [d.hallintaosoite, d.malli].filter(Boolean).join(' — '),
|
||||
searchStr: `${d.nimi} ${d.hallintaosoite || ''} ${d.malli || ''} ${d.funktio || ''} ${d.site_name || ''}`,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
async function openNetadminDetail(connId) {
|
||||
try {
|
||||
const conn = await apiCall(`netadmin_connection&id=${connId}`);
|
||||
@@ -4777,11 +4811,44 @@ async function openNetadminDetail(connId) {
|
||||
speedSel.insertBefore(opt, speedSel.lastElementChild);
|
||||
}
|
||||
speedSel.value = speed;
|
||||
// Populoi VLAN, Laite ja IP hakukentät IPAM/Tekniikka-datasta
|
||||
initCombo(document.getElementById('na-combo-vlan'), getVlanComboOptions(), conn.vlan || '');
|
||||
// Populoi VLAN, Laite ja IP hakukentät — yhdistä IPAM-data asiakkaan tietoihin
|
||||
// Jos asiakkaalla on IPAM VLANeja, näytä ne ensin
|
||||
let vlanOptions = getVlanComboOptions();
|
||||
if (conn.ipam_vlans && conn.ipam_vlans.length > 0) {
|
||||
const ipamVlanOpts = conn.ipam_vlans.map(v => ({
|
||||
value: String(v.vlan_id || ''),
|
||||
label: String(v.vlan_id || '') + (v.nimi ? ` — ${v.nimi}` : ''),
|
||||
sub: v.site_name || '',
|
||||
badge: 'IPAM', badgeClass: 'free',
|
||||
group: '📌 Asiakkaan VLANit (IPAM)',
|
||||
searchStr: `${v.vlan_id} ${v.nimi || ''} ${v.site_name || ''}`,
|
||||
}));
|
||||
vlanOptions = [...ipamVlanOpts, ...vlanOptions];
|
||||
}
|
||||
initCombo(document.getElementById('na-combo-vlan'), vlanOptions, conn.vlan || '');
|
||||
|
||||
initCombo(document.getElementById('na-combo-laite'), getDeviceComboOptions(), conn.laite || '');
|
||||
initCombo(document.getElementById('na-combo-ip'), getIpComboOptions(), conn.ip || '');
|
||||
|
||||
// Jos asiakkaalla on IPAM IP:itä, näytä ne ensin
|
||||
let ipOptions = getIpComboOptions();
|
||||
if (conn.ipam_ips && conn.ipam_ips.length > 0) {
|
||||
const ipamIpOpts = conn.ipam_ips.map(i => ({
|
||||
value: i.verkko,
|
||||
label: i.verkko,
|
||||
sub: [i.nimi, i.site_name].filter(Boolean).join(' — '),
|
||||
badge: 'IPAM', badgeClass: 'free',
|
||||
group: '📌 Asiakkaan IP:t (IPAM)',
|
||||
searchStr: `${i.verkko} ${i.nimi || ''} ${i.site_name || ''}`,
|
||||
}));
|
||||
ipOptions = [...ipamIpOpts, ...ipOptions];
|
||||
}
|
||||
initCombo(document.getElementById('na-combo-ip'), ipOptions, conn.ip || '');
|
||||
|
||||
document.getElementById('na-edit-portti').value = conn.portti || '';
|
||||
|
||||
// Gateway-laitevalitsin
|
||||
initCombo(document.getElementById('na-combo-gateway'), getGatewayComboOptions(), conn.gateway_device_id ? String(conn.gateway_device_id) : '');
|
||||
|
||||
document.getElementById('netadmin-detail-modal').style.display = '';
|
||||
} catch (e) { alert('Liittymän avaus epäonnistui: ' + e.message); }
|
||||
}
|
||||
@@ -4800,6 +4867,7 @@ document.getElementById('netadmin-detail-form')?.addEventListener('submit', asyn
|
||||
e.preventDefault();
|
||||
const connId = document.getElementById('na-edit-id').value;
|
||||
try {
|
||||
const gwVal = document.getElementById('na-edit-gateway').value;
|
||||
await apiCall('netadmin_connection_update', 'POST', {
|
||||
id: parseInt(connId),
|
||||
asennusosoite: document.getElementById('na-edit-osoite').value,
|
||||
@@ -4809,7 +4877,8 @@ document.getElementById('netadmin-detail-form')?.addEventListener('submit', asyn
|
||||
vlan: document.getElementById('na-edit-vlan').value,
|
||||
laite: document.getElementById('na-edit-laite').value,
|
||||
portti: document.getElementById('na-edit-portti').value,
|
||||
ip: document.getElementById('na-edit-ip').value
|
||||
ip: document.getElementById('na-edit-ip').value,
|
||||
gateway_device_id: gwVal ? parseInt(gwVal) : null
|
||||
});
|
||||
closeNetadminDetail();
|
||||
loadNetadmin();
|
||||
|
||||
Reference in New Issue
Block a user