{#if mapControlsCollapsed} {:else}
{#if searchQuery.trim()} {searchMatchCount} {/if}
{/if}
{#if showIpamPanel}

IP Address Management

Subnets

{#each ipamReport.subnets as subnet (subnet.cidr)}
{subnet.cidr} {#if subnet.name}{subnet.name}{/if} {#if subnet.vlanId}VLAN {subnet.vlanId}{/if} {#if !subnet.declared}inferred{/if}
{subnet.used} of {subnet.capacity} in use {#if suggestNextFreeIp(networkData, subnet.cidr)} · next free: {suggestNextFreeIp(networkData, subnet.cidr)} {/if}
{:else}

No IPv4 addresses found yet.

{/each}
{#if ipamReport.duplicates.length > 0}

Conflicts

    {#each ipamReport.duplicates as duplicate (duplicate.ip)}
  • {duplicate.ip} — {duplicate.owners.join(', ')}
  • {/each}
{/if} {#if ipamReport.unparsed.length > 0}

Not an IPv4 address

    {#each ipamReport.unparsed as assignment (`${assignment.ownerLabel}:${assignment.ip}`)}
  • {assignment.ownerLabel}: {assignment.ip}
  • {/each}
{/if}

Declared subnets

{#each networkData.subnets ?? [] as subnet, subnetIndex (`${subnet.cidr}:${subnetIndex}`)}
{:else}

None declared; subnets above are inferred as /24 from the IPs in use.

{/each}
{/if}
Source: {dataSourceLabel}
{saveStateLabel()}
{#if hasLoadedInitialData && !writable}
{readOnlyNotice}
{/if} {#if isLoadingData}
Loading JSON...
{/if} {#if loadError}
{loadError}
{/if} {#if saveError}
{saveError}
{/if} {#if tooltip.visible}
{tooltip.text}
{/if}
{#if warnings.length + ipamWarnings.length > 0}
Data warnings ({warnings.length + ipamWarnings.length})
{/if} {#if validationIssues.length > 0}
Validation issues ({validationIssues.length})
{/if}
{#if selectedTarget?.type === 'machine' && selectedMachine}
{#if selectedMachineHostId && selectedMachineVmCount > 0} {/if}

Hardware

Virtual Machines

{#each selectedMachine.software.vms as vm, vmIndex (`${vm.name}:${vm.ipAddress}:${vmIndex}`)}
{/each}

Ports

{#each machineConnectableOwnerNames as ownerName (ownerName)} {/each}
{#each selectedMachine.ports ?? [] as port, portIndex (`${port.portName}:${portIndex}`)}
{/each}
{:else if selectedTarget?.type === 'device' && selectedDevice}

Ports

{#each deviceConnectableOwnerNames as ownerName (ownerName)} {/each}
{#each selectedDevice.ports ?? [] as port, portIndex (`${port.portName}:${portIndex}`)}
{/each}
{:else if selectedTarget?.type === 'vm' && selectedVm}
{/if}
{#if addModalKind === 'machine'}
{:else if addModalKind === 'device'}
{/if}
(deleteTarget = null)} >

This action will remove the selected item and clean up related links. Continue?

(showExportModal = false)}>