From af8f92636875e0fcc2670510ac03133c4793093c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=B6rburger?= Date: Fri, 20 Mar 2026 13:54:52 +0100 Subject: [PATCH 1/3] feat(communication): add unique ip in subnetwork check --- packages/plugins/src/wizards/connectedap.ts | 22 +++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/plugins/src/wizards/connectedap.ts b/packages/plugins/src/wizards/connectedap.ts index 124e81ed92..4fe78053d6 100644 --- a/packages/plugins/src/wizards/connectedap.ts +++ b/packages/plugins/src/wizards/connectedap.ts @@ -329,18 +329,36 @@ export function createTypeRestrictionCheckbox( `; } +function getIpsInSubnetwork(element: Element): string[] { + const subnetwork = element.closest('SubNetwork'); + if (!subnetwork) return []; + + return Array.from(subnetwork.querySelectorAll('ConnectedAP > Address > P[type="IP"]')) + .map(p => p.textContent?.trim() ?? '') + .filter(ip => ip !== ''); +} + export function createPTextField( element: Element, pType: string ): TemplateResult { + const currentValue = + element.querySelector(`:scope > Address > P[type="${pType}"]`)?.innerHTML ?? + null; + + let reservedIPs: string[] = []; + if (pType === 'IP') { + reservedIPs = getIpsInSubnetwork(element).filter(ip => ip !== currentValue); + } + return oscdHtml` Address > P[type="${pType}"]`) - ?.innerHTML ?? null} + .maybeValue=${currentValue} maxLength="${ifDefined(typeMaxLength[pType])}" + .reservedValues=${reservedIPs} >`; } From 4a664768d5b205f962915f6692c4c692719fc5ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=B6rburger?= Date: Mon, 23 Mar 2026 11:27:53 +0100 Subject: [PATCH 2/3] refactor(communication): use textContext and :scope-qualified selectors --- packages/plugins/src/wizards/connectedap.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugins/src/wizards/connectedap.ts b/packages/plugins/src/wizards/connectedap.ts index 4fe78053d6..57c13c6270 100644 --- a/packages/plugins/src/wizards/connectedap.ts +++ b/packages/plugins/src/wizards/connectedap.ts @@ -333,7 +333,7 @@ function getIpsInSubnetwork(element: Element): string[] { const subnetwork = element.closest('SubNetwork'); if (!subnetwork) return []; - return Array.from(subnetwork.querySelectorAll('ConnectedAP > Address > P[type="IP"]')) + return Array.from(subnetwork.querySelectorAll(':scope > ConnectedAP > Address > P[type="IP"]')) .map(p => p.textContent?.trim() ?? '') .filter(ip => ip !== ''); } @@ -343,7 +343,7 @@ export function createPTextField( pType: string ): TemplateResult { const currentValue = - element.querySelector(`:scope > Address > P[type="${pType}"]`)?.innerHTML ?? + element.querySelector(`:scope > Address > P[type="${pType}"]`)?.textContent?.trim() ?? null; let reservedIPs: string[] = []; From 4d23c185059698a54e8e75255f29356d32a16adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=B6rburger?= Date: Mon, 23 Mar 2026 11:29:29 +0100 Subject: [PATCH 3/3] refactor(communication): derive SubNetwork via parentElement --- packages/plugins/src/wizards/connectedap.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugins/src/wizards/connectedap.ts b/packages/plugins/src/wizards/connectedap.ts index 57c13c6270..1ed0494686 100644 --- a/packages/plugins/src/wizards/connectedap.ts +++ b/packages/plugins/src/wizards/connectedap.ts @@ -330,7 +330,7 @@ export function createTypeRestrictionCheckbox( } function getIpsInSubnetwork(element: Element): string[] { - const subnetwork = element.closest('SubNetwork'); + const subnetwork = element.parentElement; // SubNetwork is the parent of ConnectedAP if (!subnetwork) return []; return Array.from(subnetwork.querySelectorAll(':scope > ConnectedAP > Address > P[type="IP"]'))