diff --git a/webui/src/pages/NetworkResources.js b/webui/src/pages/NetworkResources.js
new file mode 100644
index 0000000..d0a9319
--- /dev/null
+++ b/webui/src/pages/NetworkResources.js
@@ -0,0 +1,122 @@
+import $ from 'jquery';
+import { JSONRPC } from '@/json-rpc.js';
+
+let resourcesData = {
+ domains: [],
+ subnets: [],
+ ASN: []
+};
+
+function escapeHtml(value) {
+ return String(value)
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+}
+
+function buildAsnLink(asn) {
+ const numericPart = String(asn).match(/\d+/);
+ const asnId = numericPart ? numericPart[0] : String(asn).replace(/[^a-zA-Z0-9]/g, '');
+ const safeId = asnId.length ? asnId : '0';
+ return `https://bgp.he.net/AS${encodeURIComponent(safeId)}`;
+}
+
+function normalizeArray(values) {
+ if (!Array.isArray(values)) {
+ return [];
+ }
+
+ return values
+ .map(item => (item === null || item === undefined) ? '' : String(item))
+ .filter(item => item.length > 0)
+ .sort((a, b) => a.localeCompare(b, 'ru', { numeric: true, sensitivity: 'base' }));
+}
+
+async function fetchResources() {
+ try {
+ const result = await JSONRPC.NetworkManager.getOutputResources();
+ resourcesData = {
+ domains: normalizeArray(result?.domains),
+ subnets: normalizeArray(result?.subnets),
+ ASN: normalizeArray(result?.ASN)
+ };
+ return true;
+ } catch (error) {
+ console.error('Ошибка при загрузке сетевых ресурсов:', error);
+ resourcesData = {
+ domains: [],
+ subnets: [],
+ ASN: []
+ };
+ return false;
+ }
+}
+
+function renderAsnSection(items) {
+ const content = items.length
+ ? items.map(item => `${escapeHtml(item)}`).join(', ')
+ : 'Данные отсутствуют';
+
+ return `
+ ${content}Автономные системы (ASN)
+
Загрузка сетевых ресурсов...
+Загрузка сетевых ресурсов...
'); + + const success = await fetchResources(); + if (success) { + renderResources($container); + } else { + $container.html(''); + } + }, + unmount: () => { + resourcesData = { + domains: [], + subnets: [], + ASN: [] + }; + } +};