From bbdf19bd0574664cc23bde932f8848ef373b057a Mon Sep 17 00:00:00 2001 From: Kavalar Date: Thu, 28 May 2026 19:33:15 +0300 Subject: [PATCH] v1.0 --- index.html | 423 ++++++++++++++++++++++++++++------------------------- 1 file changed, 224 insertions(+), 199 deletions(-) diff --git a/index.html b/index.html index 30a2147..58d657f 100644 --- a/index.html +++ b/index.html @@ -57,14 +57,29 @@ .full-width { grid-column: 1 / -1; } .tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 5px; } .tag { background: #e2e8f0; padding: 3px 10px; border-radius: 20px; font-size: 0.75rem; color: #334155; } - .links-list { display: flex; flex-wrap: wrap; gap: 8px; } + .links-list { display: flex; flex-wrap: wrap; gap: 6px; } .link-item { background: #e2e8f0; padding: 4px 12px; border-radius: 20px; font-size: 0.8rem; } .link-item a { color: #1e3a5f; text-decoration: none; } .link-item a:hover { text-decoration: underline; } + .links-cell { max-width: 250px; } + .resource-link { + display: inline-block; + background: #eef2ff; + color: #1e3a5f; + padding: 3px 8px; + border-radius: 16px; + font-size: 0.7rem; + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 120px; + } + .resource-link:hover { background: #1e3a5f; color: white; } + hr { margin: 1rem 0; border-color: #ecf3f9; } - /* Admin Panel */ .admin-panel { position: fixed; top: 0; right: -650px; width: 650px; height: 100vh; background: white; box-shadow: -5px 0 30px rgba(0,0,0,0.2); @@ -85,9 +100,7 @@ .form-group input, .form-group textarea, .form-group select { padding: 8px 12px; border-radius: 10px; border: 1px solid #cbd5e1; font-family: 'Inter', sans-serif; font-size: 0.85rem; } .form-group textarea { min-height: 60px; resize: vertical; } .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } - .form-3col { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 1rem; } - /* Dynamic links */ .links-container { border: 1px solid #e2e8f0; border-radius: 12px; padding: 0.75rem; background: #fafcff; } .link-input-group { display: flex; gap: 8px; margin-bottom: 8px; align-items: center; } .link-input-group input { flex: 1; } @@ -137,9 +150,10 @@ @media (max-width: 750px) { .admin-panel { width: 100%; right: -100%; } - .form-row, .form-3col { grid-template-columns: 1fr; } + .form-row { grid-template-columns: 1fr; } .info-grid { grid-template-columns: 1fr; } .action-btns { flex-direction: column; gap: 4px; } + .links-cell { max-width: 180px; } } @@ -163,7 +177,8 @@
- + +
НазваниеТипСтатусЧленствоПриоритетРесурсДействия
НазваниеТипСтатусЧленствоПриоритетРесурсыДействия
Загрузка...
@@ -171,7 +186,6 @@ @@ -217,13 +231,11 @@ -
-
- -
Руководство и структура
@@ -421,17 +400,14 @@
🏢 Отделения
${escapeHtml(d.leadership?.branches || '—')}
-
Членство и состав
-
👥 Количество членов
${escapeHtml(org.membersCount || d.membership?.count || org.summaryMembership || '—')}
📋 Критерии вступления
${escapeHtml(d.membership?.criteria || '—')}
💰 Членские взносы
${escapeHtml(d.membership?.fees || '—')}
🏭 Отраслевой состав
${renderTags(d.membership?.sectors || org.sectors || '—')}
-
Деятельность и влияние
@@ -440,7 +416,6 @@
📧 Контакты
${escapeHtml(d.resources?.contacts || '—')}
-
SWOT-анализ
@@ -465,7 +440,6 @@ const tbody = document.getElementById('summaryTableBody'); if (!currentData) return; tbody.innerHTML = ''; - (currentData.organizations || []).forEach(org => { appendSummaryRow(tbody, org, 'main'); }); (currentData.additionalOrganizations || []).forEach(org => { appendSummaryRow(tbody, org, 'additional'); }); } @@ -475,7 +449,31 @@ const statusText = org.status === 'active' ? 'Действует' : 'Требует уточнения'; const priorityText = org.priority === 'high' ? 'Высокий' : (org.priority === 'medium' ? 'Средний' : 'Низкий'); const displayType = type === 'main' ? (org.shortType || 'Основная') : (org.type || 'Дополнительная'); - const members = org.membersCount || (type === 'main' ? (org.summaryMembership || '—') : (org.members || '—')); + + // Получаем количество членов из всех возможных полей + let members = '—'; + if (org.membersCount && org.membersCount !== 'Данные отсутствуют') { + members = org.membersCount; + } else if (type === 'main' && org.summaryMembership && org.summaryMembership !== 'Данные отсутствуют') { + members = org.summaryMembership; + } else if (type === 'additional' && org.members && org.members !== 'Данные отсутствуют') { + members = org.members; + } else if (org.detailed?.membership?.count && org.detailed.membership.count !== 'Нет公开 данных') { + members = org.detailed.membership.count; + } + + let allLinks = []; + if (org.resources?.links && Array.isArray(org.resources.links)) allLinks = [...org.resources.links]; + if (org.links && Array.isArray(org.links)) allLinks = [...allLinks, ...org.links]; + if (org.link && org.link !== '—' && !allLinks.includes(org.link)) allLinks.push(org.link); + allLinks = allLinks.filter(l => l && l.trim() !== '' && l !== '—'); + + let linksHtml = '—'; + if (allLinks.length > 0) { + linksHtml = ``; + } const row = document.createElement('tr'); row.setAttribute('data-id', org.id); @@ -486,7 +484,7 @@ ${statusText} ${escapeHtml(members)} ${priorityText} - ${org.link && org.link !== '—' ? `ресурс` : '—'} + ${linksHtml} ${type === 'additional' ? @@ -499,7 +497,6 @@ tbody.appendChild(row); } - // Функции для работы со ссылками function renderLinkInputs() { const container = document.getElementById('linksList'); container.innerHTML = ''; @@ -513,7 +510,6 @@ container.appendChild(div); }); - // Добавляем обработчики удаления document.querySelectorAll('.remove-link-btn').forEach(btn => { btn.addEventListener('click', (e) => { const idx = parseInt(btn.dataset.index); @@ -522,7 +518,6 @@ }); }); - // Добавляем обработчики изменения document.querySelectorAll('.link-input').forEach((input, idx) => { input.addEventListener('change', (e) => { currentLinks[idx] = e.target.value; @@ -559,24 +554,152 @@ fields.style.display = show ? 'block' : 'none'; } + function populateAdminForm() { + let org = null; + if (currentEditType === 'main') { + org = currentData.organizations?.find(o => o.id === currentEditId); + } else { + org = currentData.additionalOrganizations?.find(a => a.id === currentEditId); + } + if (!org) return; + + document.getElementById('orgName').value = org.name || ''; + document.getElementById('orgPriority').value = org.priority || 'medium'; + document.getElementById('orgStatus').value = org.status || 'active'; + document.getElementById('orgType').value = currentEditType === 'main' ? (org.shortType || '') : (org.type || ''); + + // Загружаем количество членов из правильного поля + let membersValue = ''; + if (org.membersCount && org.membersCount !== 'Данные отсутствуют') { + membersValue = org.membersCount; + } else if (currentEditType === 'main' && org.summaryMembership && org.summaryMembership !== 'Данные отсутствуют') { + membersValue = org.summaryMembership; + } else if (currentEditType === 'additional' && org.members && org.members !== 'Данные отсутствуют') { + membersValue = org.members; + } else if (org.detailed?.membership?.count) { + membersValue = org.detailed.membership.count; + } + document.getElementById('orgMembersCount').value = membersValue; + + // Загружаем ссылки + if (org.resources?.links) currentLinks = [...org.resources.links]; + else if (org.links) currentLinks = [...org.links]; + else if (org.link && org.link !== '—') currentLinks = [org.link]; + else currentLinks = []; + renderLinkInputs(); + + if (currentEditType === 'main') { + const d = org.detailed || {}; + document.getElementById('orgFullName').value = d.general?.fullName || ''; + document.getElementById('orgCreated').value = d.general?.created || ''; + document.getElementById('orgLegalForm').value = d.general?.legalForm || ''; + document.getElementById('orgAddress').value = d.general?.address || ''; + document.getElementById('orgKeyPeople').value = d.leadership?.keyPeople || ''; + document.getElementById('orgSectors').value = d.membership?.sectors || ''; + document.getElementById('orgCriteria').value = d.membership?.criteria || ''; + document.getElementById('orgFees').value = d.membership?.fees || ''; + document.getElementById('orgContacts').value = d.resources?.contacts || ''; + } + + document.getElementById('orgHead').value = org.detailed?.leadership?.head || ''; + document.getElementById('orgGoals').value = org.detailed?.goals || ''; + document.getElementById('orgActivity').value = org.detailed?.activity || ''; + document.getElementById('orgStrengths').value = org.detailed?.assessment?.strengths || ''; + document.getElementById('orgWeaknesses').value = org.detailed?.assessment?.weaknesses || ''; + } + + function updateOrgFromForm() { + let org = null; + const collectedLinks = collectLinks(); + const membersValue = document.getElementById('orgMembersCount').value; + + if (currentEditType === 'main') { + org = currentData.organizations?.find(o => o.id === currentEditId); + if (!org) return; + + org.name = document.getElementById('orgName').value; + org.priority = document.getElementById('orgPriority').value; + org.status = document.getElementById('orgStatus').value; + org.shortType = document.getElementById('orgType').value; + org.membersCount = membersValue; + org.summaryMembership = membersValue; + + org.resources = org.resources || {}; + org.resources.links = collectedLinks; + org.link = collectedLinks[0] || ''; + + if (!org.detailed) org.detailed = {}; + if (!org.detailed.general) org.detailed.general = {}; + if (!org.detailed.leadership) org.detailed.leadership = {}; + if (!org.detailed.membership) org.detailed.membership = {}; + if (!org.detailed.resources) org.detailed.resources = {}; + if (!org.detailed.assessment) org.detailed.assessment = {}; + + org.detailed.membership.count = membersValue; + org.detailed.general.fullName = document.getElementById('orgFullName').value; + org.detailed.general.created = document.getElementById('orgCreated').value; + org.detailed.general.legalForm = document.getElementById('orgLegalForm').value; + org.detailed.general.address = document.getElementById('orgAddress').value; + org.detailed.leadership.keyPeople = document.getElementById('orgKeyPeople').value; + org.detailed.membership.sectors = document.getElementById('orgSectors').value; + org.detailed.membership.criteria = document.getElementById('orgCriteria').value; + org.detailed.membership.fees = document.getElementById('orgFees').value; + org.detailed.resources.contacts = document.getElementById('orgContacts').value; + org.detailed.leadership.head = document.getElementById('orgHead').value; + org.detailed.goals = document.getElementById('orgGoals').value; + org.detailed.activity = document.getElementById('orgActivity').value; + org.detailed.assessment.strengths = document.getElementById('orgStrengths').value; + org.detailed.assessment.weaknesses = document.getElementById('orgWeaknesses').value; + } else { + org = currentData.additionalOrganizations?.find(a => a.id === currentEditId); + if (!org) return; + + org.name = document.getElementById('orgName').value; + org.priority = document.getElementById('orgPriority').value; + org.status = document.getElementById('orgStatus').value; + org.type = document.getElementById('orgType').value; + org.members = membersValue; + org.membersCount = membersValue; + org.links = collectedLinks; + org.link = collectedLinks[0] || ''; + + if (!org.detailed) org.detailed = { leadership: {}, assessment: {} }; + org.detailed.leadership.head = document.getElementById('orgHead').value; + org.detailed.goals = document.getElementById('orgGoals').value; + org.detailed.activity = document.getElementById('orgActivity').value; + if (!org.detailed.assessment) org.detailed.assessment = {}; + org.detailed.assessment.strengths = document.getElementById('orgStrengths').value; + org.detailed.assessment.weaknesses = document.getElementById('orgWeaknesses').value; + } + + saveAndRefresh().then(() => { initAdminSelect(); }); + } + window.moveToMain = async function(id) { const org = currentData.additionalOrganizations?.find(a => a.id === id); if (!org) return; + let allLinks = []; + if (org.links) allLinks = [...org.links]; + else if (org.link && org.link !== '—') allLinks = [org.link]; + allLinks = [...new Set(allLinks.filter(l => l && l.trim() !== ''))]; + + const membersVal = org.membersCount || org.members || 'Данные отсутствуют'; + const newMainOrg = { id: org.id, name: org.name, priority: org.priority, status: org.status, shortType: org.type || 'Организация', - membersCount: org.members || org.membersCount || 'Данные отсутствуют', - link: org.link || '', - sectors: org.sectors || '', - resources: { links: org.links || [] }, + membersCount: membersVal, + summaryMembership: membersVal, + link: allLinks[0] || '', + resources: { links: allLinks }, detailed: { general: { fullName: org.name, created: '', legalForm: '', address: '', statusText: 'Действует' }, leadership: { head: org.detailed?.leadership?.head || '', keyPeople: '', branches: '' }, - membership: { count: org.members || 'Данные отсутствуют', criteria: '', fees: '', sectors: org.sectors || '' }, + membership: { count: membersVal, criteria: '', fees: '', sectors: '' }, goals: org.detailed?.goals || '', activity: org.detailed?.activity || '', resources: { contacts: '' }, @@ -594,16 +717,23 @@ const org = currentData.organizations?.find(o => o.id === id); if (!org) return; + let allLinks = []; + if (org.resources?.links) allLinks = [...org.resources.links]; + else if (org.link && org.link !== '—') allLinks = [org.link]; + allLinks = [...new Set(allLinks.filter(l => l && l.trim() !== ''))]; + + const membersVal = org.membersCount || org.summaryMembership || 'Данные отсутствуют'; + const newAdditionalOrg = { id: org.id, name: org.name, priority: org.priority, status: org.status, type: org.shortType || 'Основная', - members: org.membersCount || org.summaryMembership || 'Данные отсутствуют', - link: org.link || '', - sectors: org.sectors || '', - links: org.resources?.links || [], + members: membersVal, + membersCount: membersVal, + link: allLinks[0] || '', + links: allLinks, detailed: { leadership: { head: org.detailed?.leadership?.head || '' }, goals: org.detailed?.goals || '', @@ -657,109 +787,6 @@ }); } - function populateAdminForm() { - let org = null; - if (currentEditType === 'main') { - org = currentData.organizations?.find(o => o.id === currentEditId); - } else { - org = currentData.additionalOrganizations?.find(a => a.id === currentEditId); - } - if (!org) return; - - document.getElementById('orgName').value = org.name || ''; - document.getElementById('orgPriority').value = org.priority || 'medium'; - document.getElementById('orgStatus').value = org.status || 'active'; - document.getElementById('orgType').value = currentEditType === 'main' ? (org.shortType || '') : (org.type || ''); - - // Количество членов - const membersCount = org.membersCount || (currentEditType === 'main' ? org.summaryMembership : org.members) || ''; - document.getElementById('orgMembersCount').value = membersCount; - - // Ссылки - currentLinks = org.resources?.links || org.links || []; - if (currentLinks.length === 0 && org.link) currentLinks = [org.link]; - renderLinkInputs(); - - if (currentEditType === 'main') { - const d = org.detailed || {}; - document.getElementById('orgFullName').value = d.general?.fullName || ''; - document.getElementById('orgCreated').value = d.general?.created || ''; - document.getElementById('orgLegalForm').value = d.general?.legalForm || ''; - document.getElementById('orgAddress').value = d.general?.address || ''; - document.getElementById('orgKeyPeople').value = d.leadership?.keyPeople || ''; - document.getElementById('orgSectors').value = d.membership?.sectors || org.sectors || ''; - document.getElementById('orgCriteria').value = d.membership?.criteria || ''; - document.getElementById('orgFees').value = d.membership?.fees || ''; - document.getElementById('orgContacts').value = d.resources?.contacts || ''; - } - - document.getElementById('orgHead').value = org.detailed?.leadership?.head || ''; - document.getElementById('orgGoals').value = org.detailed?.goals || ''; - document.getElementById('orgActivity').value = org.detailed?.activity || ''; - document.getElementById('orgStrengths').value = org.detailed?.assessment?.strengths || ''; - document.getElementById('orgWeaknesses').value = org.detailed?.assessment?.weaknesses || ''; - } - - function updateOrgFromForm() { - let org = null; - if (currentEditType === 'main') { - org = currentData.organizations?.find(o => o.id === currentEditId); - if (!org) return; - - org.name = document.getElementById('orgName').value; - org.priority = document.getElementById('orgPriority').value; - org.status = document.getElementById('orgStatus').value; - org.shortType = document.getElementById('orgType').value; - org.membersCount = document.getElementById('orgMembersCount').value; - - // Сохраняем ссылки - org.resources = org.resources || {}; - org.resources.links = collectLinks(); - - if (!org.detailed) org.detailed = {}; - if (!org.detailed.general) org.detailed.general = {}; - if (!org.detailed.leadership) org.detailed.leadership = {}; - if (!org.detailed.membership) org.detailed.membership = {}; - if (!org.detailed.resources) org.detailed.resources = {}; - if (!org.detailed.assessment) org.detailed.assessment = {}; - - org.detailed.general.fullName = document.getElementById('orgFullName').value; - org.detailed.general.created = document.getElementById('orgCreated').value; - org.detailed.general.legalForm = document.getElementById('orgLegalForm').value; - org.detailed.general.address = document.getElementById('orgAddress').value; - org.detailed.leadership.keyPeople = document.getElementById('orgKeyPeople').value; - org.detailed.membership.sectors = document.getElementById('orgSectors').value; - org.detailed.membership.criteria = document.getElementById('orgCriteria').value; - org.detailed.membership.fees = document.getElementById('orgFees').value; - org.detailed.resources.contacts = document.getElementById('orgContacts').value; - org.detailed.leadership.head = document.getElementById('orgHead').value; - org.detailed.goals = document.getElementById('orgGoals').value; - org.detailed.activity = document.getElementById('orgActivity').value; - org.detailed.assessment.strengths = document.getElementById('orgStrengths').value; - org.detailed.assessment.weaknesses = document.getElementById('orgWeaknesses').value; - } else { - org = currentData.additionalOrganizations?.find(a => a.id === currentEditId); - if (!org) return; - - org.name = document.getElementById('orgName').value; - org.priority = document.getElementById('orgPriority').value; - org.status = document.getElementById('orgStatus').value; - org.type = document.getElementById('orgType').value; - org.members = document.getElementById('orgMembersCount').value; - org.links = collectLinks(); - - if (!org.detailed) org.detailed = { leadership: {}, assessment: {} }; - org.detailed.leadership.head = document.getElementById('orgHead').value; - org.detailed.goals = document.getElementById('orgGoals').value; - org.detailed.activity = document.getElementById('orgActivity').value; - if (!org.detailed.assessment) org.detailed.assessment = {}; - org.detailed.assessment.strengths = document.getElementById('orgStrengths').value; - org.detailed.assessment.weaknesses = document.getElementById('orgWeaknesses').value; - } - - saveAndRefresh().then(() => { initAdminSelect(); }); - } - async function addNewOrganization() { const newId = Math.max( ...(currentData.organizations?.map(o => o.id) || [0]), @@ -839,7 +866,6 @@ function escapeHtml(str) { if (!str) return ''; return str.replace(/[&<>]/g, m => ({ '&': '&', '<': '<', '>': '>' }[m])); } - // Admin panel controls const adminPanel = document.getElementById('adminPanel'); const overlay = document.getElementById('overlay'); document.getElementById('adminToggleBtn').addEventListener('click', () => { @@ -879,7 +905,6 @@ }); }); - // Tabs const btns = document.querySelectorAll('.tab-btn'); const panels = { detailed: document.getElementById('detailedPanel'), summary: document.getElementById('summaryPanel') }; btns.forEach(btn => {