Связи: лаборатория только локально (исключена из репозитория)

- shine-UI/js/pages/network/lab.js убран из git (git rm --cached) и добавлен в .gitignore:
  на сервере лаборатория не нужна (там реальные данные), локально файл остаётся и работает.
- network-view.js: статический импорт lab.js заменён на ДИНАМИЧЕСКИЙ с фолбэком — если файла
  нет (прод/сервер), реальный экран «Связи» не ломается, а заход на /network-view/lab уводит
  на обычный экран. Локально лаборатория грузится как прежде.
- Документация фичи отражает, что lab.js — локальный (в .gitignore).
- Бамп client.version → 1.2.140.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Pixel
2026-06-09 21:23:18 +03:00
co-authored by Claude Opus 4.8
parent e6e96c4b0d
commit 369ef61cab
5 changed files with 19 additions and 135 deletions
+12 -3
View File
@@ -2,7 +2,6 @@ import { renderHeader } from '../components/header.js';
import { authService, state } from '../state.js';
import { makeProfileRoute } from '../services/shine-routes.js';
import { makeProfileLinksRoute } from '../services/shine-routes.js';
import { renderNetworkLab } from './network/lab.js';
import { createForceGraph } from './network/force-graph.js';
import { engineModelFromGraphModel } from './network/adapter.js';
import { openNodeMenu, relationLabelRu } from './network/node-menu.js';
@@ -217,9 +216,19 @@ let persistedCenterLogin = '';
let persistedCenterHistory = [];
export function render({ navigate, route }) {
// Лабораторный режим force-графа (Фаза 1): рендерится из мока, не трогая реальный путь ниже.
// Лабораторный режим force-графа — ТОЛЬКО для локальной разработки. Файл `network/lab.js`
// намеренно НЕ в гите (см. .gitignore): на сервере он не нужен (там реальные данные). Поэтому
// импорт ДИНАМИЧЕСКИЙ — если файла нет (прод/сервер), реальный экран «Связи» не ломается,
// а заход на /network-view/lab просто уводит на обычный экран.
if (String(route?.params?.mode || '').trim().toLowerCase() === 'lab') {
return renderNetworkLab({ navigate });
const host = document.createElement('div');
host.style.display = 'contents'; // прозрачная обёртка: lab-экран ведёт себя как прямой потомок
let inner = null;
import('./network/lab.js')
.then((m) => { inner = m.renderNetworkLab({ navigate }); host.append(inner); })
.catch(() => { navigate('network-view'); }); // нет файла (сервер) — на реальный экран
host.cleanup = () => { if (inner && typeof inner.cleanup === 'function') inner.cleanup(); };
return host;
}
const keepHistory = String(route?.params?.mode || '').trim().toLowerCase() === 'keep-history';
const routeLogin = normalizeLogin(route?.params?.login || '');