wenay-react2 1.0.47 → 1.0.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -14
- package/doc/EXAMPLE_USAGE.md +969 -969
- package/doc/PROJECT_FUNCTIONALITY.md +403 -403
- package/doc/PROJECT_RULES.md +27 -27
- package/doc/WENAY_REACT2_RENAMES.md +170 -170
- package/doc/changes/v1.0.35.md +18 -18
- package/doc/changes/v1.0.38.md +37 -37
- package/doc/changes/v1.0.39.md +23 -23
- package/doc/changes/v1.0.40.md +14 -14
- package/doc/changes/v1.0.41.md +35 -35
- package/doc/changes/v1.0.42.md +26 -26
- package/doc/changes/v1.0.43.md +10 -10
- package/doc/changes/v1.0.44.md +14 -14
- package/doc/changes/v1.0.45.md +8 -8
- package/doc/changes/v1.0.46.md +11 -11
- package/doc/changes/v1.0.47.md +9 -9
- package/doc/changes/v1.0.48.md +8 -0
- package/doc/changes/v1.0.49.md +7 -0
- package/doc/examples/README.md +5 -4
- package/doc/examples/conference-client.html +34 -0
- package/doc/examples/conference-client.ts +212 -0
- package/doc/examples/conference-server.mjs +150 -0
- package/doc/examples/peer-call-media.tsx +7 -7
- package/doc/examples/stand.tsx +5 -5
- package/doc/native.md +37 -37
- package/doc/progress/README.md +13 -13
- package/doc/progress/architecture-fix-queue.md +74 -74
- package/doc/progress/column-state-present-gate.md +28 -28
- package/doc/progress/common2-adoption-1.0.73.md +28 -28
- package/doc/progress/common2-adoption-1.0.74.md +24 -24
- package/doc/progress/hook-controller-opportunities.md +363 -363
- package/doc/progress/hook-extraction-audit.md +195 -195
- package/doc/progress/public-surface-normalization.md +351 -351
- package/doc/progress/qa-stand-walkthrough-2026-07-12.md +62 -0
- package/doc/progress/stand-as-examples-audit.md +20 -20
- package/doc/progress/style-system-normalization.md +121 -121
- package/doc/target/README.md +32 -32
- package/doc/target/my.md +134 -124
- package/doc/wenay-react2-rare.md +807 -807
- package/doc/wenay-react2.md +543 -541
- package/lib/common/demo/fakeRtcLoopback.d.ts +17 -0
- package/lib/common/demo/fakeRtcLoopback.js +108 -0
- package/lib/common/demo/peerConference.d.ts +449 -0
- package/lib/common/demo/peerConference.js +372 -0
- package/lib/common/demo/peerMedia.js +6 -1
- package/lib/common/src/hooks/index.d.ts +1 -0
- package/lib/common/src/hooks/index.js +1 -0
- package/lib/common/src/hooks/useRoute.d.ts +28 -0
- package/lib/common/src/hooks/useRoute.js +30 -0
- package/lib/common/src/logs/logsController.js +2 -2
- package/lib/common/testUseReact/qa.js +4 -3
- package/lib/style/menuRight.css +19 -19
- package/lib/style/style.css +23 -23
- package/lib/style/tokens.css +184 -184
- package/package.json +2 -1
- package/doc/wenay-react2-1.0.8.tgz +0 -0
package/doc/target/my.md
CHANGED
|
@@ -1,127 +1,137 @@
|
|
|
1
|
-
# Target — очередь задач
|
|
2
|
-
|
|
3
|
-
Правила ведения: [README.md](README.md). Ниже — статус по задачам; **исходные надиктовки сохранены дословно в конце файла** (ничего не удаляю).
|
|
4
|
-
|
|
1
|
+
# Target — очередь задач
|
|
2
|
+
|
|
3
|
+
Правила ведения: [README.md](README.md). Ниже — статус по задачам; **исходные надиктовки сохранены дословно в конце файла** (ничего не удаляю).
|
|
4
|
+
|
|
5
5
|
## In Progress
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
7
|
+
- **Конференц-демо: групповой созвон на обеих технологиях — relay-мост + WebRTC direct.** DONE 2026-07-13 (обе надиктовки 2026-07-12, дословно в конце файла).
|
|
8
|
+
- Отгружено: `wenay-react2/demo/peer-conference` — headless `createConferenceWorld` (host-star: групповой звонок КОМПОНУЕТСЯ из парных, один CallManager держит N-1 исходящих; roster активных звонков = единственный ACL-авторитет) + `ConferenceCallDemo` (QA card 46: грид на `Peer.createMediaRelay` fan-out, focus-пара на `Replay.createRouteCoordinator` — relay-hop `serveReplayChannel` и WebRTC `createWebRtcConnector`/`acceptWebRtcDirect` обслуживают ОДНУ owner-seq линию, hand-off без разрывов по seq; никогда не сервить маршрут из `relay.watchOf` — per-watcher seq). Хук `useRouteState`. Fake-RTC loopback (порт оракула common2) для jest/песочниц.
|
|
9
|
+
- **Через бэк (надиктовка №2)**: `doc/examples/conference-server.mjs` (Node+Socket.IO: peer host, комнатная политика — accepted call вступает обеими сторонами в room, offer брокерится только внутри общей комнаты, media relay с `canWatch`=sameRoom) + `conference-client.html/.ts` (одно место = одна вкладка: грид через серверный relay, peer-store строки с promoteDirect в настоящий cross-tab RTCPeerConnection и reinterpose обратно).
|
|
10
|
+
- Проверено: tsc, Jest 25/87 (9 новых), build; карточка 46 пройдена живьём на РЕАЛЬНОМ RTCPeerConnection (promote #153→#174 без разрыва, policy-отказы, server revoke, kill transport → auto-fallback); бэкенд-вариант — две вкладки, cross-tab direct (beat 47→51→69 gap-free), сервер переживает mid-room disconnect. Durable: `doc/changes/v1.0.49.md`, brief-док §Route, examples README.
|
|
11
|
+
- Побочно найден и записан upstream-баг common2 (см. Blocked ниже).
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
«Hook extraction — do-now кандидаты (3)» выполнен 2026-07-09: `useCacheMapPersistence` (cache.ts), `useResizeObserver`/`useElementSize` (MyResizeObserver.tsx), `useLogsPageTable` (logs.tsx); старые имена — compatibility wrappers, card 25 не тронута. Проверено: tsc qa-check, jest 45/45, build, стенд 3010 (карточки 21 F5-persistence / 19 resize / 9 logs). Durable-запись: `doc/changes/v1.0.41.md`; parked/отклонённые кандидаты остаются в `doc/progress/hook-extraction-audit.md`.
|
|
15
|
+
|
|
16
|
+
(Предыдущий проход «Нормализация внутренних слоёв библиотеки» проверен multi-agent-верификацией и отгружен в v1.0.40/v1.0.41; durable-запись: `doc/progress/public-surface-normalization.md`, `doc/progress/hook-controller-opportunities.md`, `doc/changes/v1.0.38–v1.0.41.md`.)
|
|
17
|
+
|
|
18
|
+
## Ready
|
|
19
|
+
|
|
20
|
+
- **API-витрина: ярусы канон/compat + quickstart** (из оценки юзабельности 2026-07-10, надиктовка в конце файла).
|
|
21
|
+
- Проблема: вызовы лаконичные, но ИЗУЧЕНИЕ — нет. Рядом с каноном на одной поверхности торчит легаси (3 публичных способа модалки, 2 стека логов, `Get*`/`*2`/`*3`-имена, demo-экспорты типа `MyChartEngine`); новичок не отличит канон от compat без rare-дока; `updateBy`-модель — налог на вход.
|
|
22
|
+
- Задача (без breaking, чисто витрина): 1) **README/quickstart** — 5 главных примитивов с примерами (toolbar+columnState, SettingsDialog, FloatingWindow, replay-хуки, memoryCache-контракт), «начни отсюда»; 2) **явные ярусы** — либо отдельный «modern» entrypoint (реэкспорт только канона, старый корень не трогаем), либо чёткая namespace-разметка в api.tsx + в brief-доке бейджи канон/compat/deprecated; 3) размеченный список compat-поверхности синхронизировать с Cleanup Inventory (rare-док) — он же план breaking-версии.
|
|
23
|
+
- Оценка: эффективность high (самый дешёвый рост юзабельности), простота easy/medium (докосновно + один реэкспорт-модуль), риск low (аддитивно, публичный API не меняется).
|
|
24
|
+
- Связка: breaking-версия (A3 + снос deprecated `onCLickClose`/`keySave`/`DragArea`/`menuR`, сужение `ListenApi`) идёт ПОСЛЕ витрины — витрина и есть список того, что сносим.
|
|
25
|
+
|
|
26
|
+
- **common2 1.0.66–1.0.73 adoption: Media + Peer/route React surface** (из надиктовки №4 «посмотри, что нового, создай цели использовать»).
|
|
27
|
+
- Контекст: 1.0.66 = `Media` (захват мик/камера как бинарные Listen/replay-источники, `decodeMediaFrame`), 1.0.67 = `Replay.createRouteCoordinator` (policy-gated relay↔direct, link.subscribe без switchRoute), 1.0.68 = WebRTC direct-путь (`createSignalHub` по существующему RPC-сокету, `createWebRtcConnector` с инжектируемой `rtc`-фабрикой — инжекция `() => new RTCPeerConnection(cfg)` живёт на браузерной/React-стороне, `acceptWebRtcDirect`, `serveReplayChannel`). Вместе: media → replay line → policy-маршрутизация relay/direct.
|
|
28
|
+
- **1. `useMediaSource` — DONE in 1.0.45.** Capture lifecycle only: state, start/stop, device selection and stats; frame consumption stays on Listen/replay. QA cards 38/39 use core canvas/audio viewers.
|
|
29
|
+
- **2. Peer SDK adapter — DONE in 1.0.45.** `usePeer(client, account)` exposes the mirrored store, route/status and explicit controls including resync, without taking over protocol repair or transport. QA card 40 covers an in-process host/mirror/resync scenario.
|
|
30
|
+
- **3. WebRTC recipe (docs/example, not a hook)** — how the app injects the `rtc` factory (`() => new RTCPeerConnection(cfg)`) and wires the signal port from `createRpcServerAuto`; combine with a Media source (call/stream demo) over Peer. Real-browser ICE serialization is fixed in 1.0.69 (`toJSON()` on the wire), so a live two-tab demo is feasible — see common2 `demo/` shared-cursors stand.
|
|
27
31
|
- Оценка: 1 — simple/low-risk (аддитивно); 2 — medium (in-proc fake стенд, по образцу peer-sdk oracle); 3 — docs-first. Приоритет: после architecture-fix очереди A1-A10.
|
|
28
|
-
- **Аудит 1.0.71–1.0.73 (2026-07-10, dependency обновлена до 1.0.73)**: `Peer` repair/resync (1.0.71) остаётся core protocol — React не должен повторять gap/journal state machine; `usePeer` может лишь отразить `peer(account)` store/route и вызвать `resync()` по app-owned transport reconnect. Media hidden-tab workers/ImageCapture (1.0.72) принимаем автоматически через core defaults, без React-кода. Media viewer helpers (1.0.73: canvas/audio/publish pipe) — core imperative hot path; React-кандидаты только тонкие lifecycle bindings над ref (`useMediaVideoCanvas`, `useMediaAudioPlayer`), без frame-level React state. Сначала docs/recipe + QA card с реальным consumer; хук — лишь если recipe повторяется.
|
|
29
|
-
|
|
30
|
-
- **common2 1.0.74 adoption: Calls, presence and protected Media relay — implementation complete in 1.0.46; manual camera verify pending.** Отдельный продуктовый проход; не смешан с `usePeer`.
|
|
31
|
-
- **Call controller/view — DONE.** — поверх `Peer.createCallManager({port: callPortOf(remote), self})`: lifecycle `ringing → active → ended`, входящий звонок, accept/decline/hangup, offline/busy/timeout reason. React хранит только UI-состояние/подписки; signal envelopes, glare и busy gate остаются в common2.
|
|
32
|
-
- **Presence — DONE.** — тонкая подписка на `peerHost.presence` с initial `list()` после subscription; показывать только edges online/offline, не polling и не собственный presence-store.
|
|
33
|
-
- **Media relay + ACL — DONE (binding/QA recipe).** — call view подключает viewers только в active состоянии. Сервер задаёт `watchOf(watcher)` + `canWatch`; React не получает права решать доступ. Relay-first остаётся default, direct — явный opt-in.
|
|
34
|
-
- **Стенд и тесты одним batch:** два in-process peer-клиента: presence edge, ring/accept/active, audio/video relay keyframe, hangup/decline/offline/busy; отдельный ACL-revoke кейс, доказывающий закрытие уже открытой подписки.
|
|
35
|
-
- Оценка: medium/high; сначала определить server-owned authorize policy и UX входящего звонка, затем делать адаптер. `usePeer` не расширять до call manager — это другой lifecycle.
|
|
36
|
-
- **Stand → shipped examples: разделить интерактивные consumer demos и internal QA-regressions** (архитектурная переработка стенда).
|
|
37
|
-
- Проблема: 44 карточки живут в одном `testUseReact/qa.tsx`; сценарий может одновременно быть хорошим consumer-примером и проверкой, но npm сейчас получает отдельную копию в `doc/examples`. Это создаёт риск расхождения.
|
|
38
|
-
- Целевая модель: весь `demo/stand` поставляется как интерактивный пример; Active-карточки — canonical consumer guidance, Archive-карточки — явный regression/compat context. QA-доска добавляет manual acceptance metadata. Карточка получает manifest: category, canonical/regression, source example, automated test, manual check.
|
|
39
|
-
- Миграция batch-ами: **1) Media/Peer calls/presence/relay — DONE in 1.0.46**: единый export `wenay-react2/demo/peer-media`, который рендерят QA cards 41–44; **2) Replay cards 23/24/33/34**; **3) toolbar/columnState/grid**; legacy archive оставить internal до отдельного решения. Никакого big-bang rewrite и никаких изменений публичного API.
|
|
40
|
-
- Acceptance: npm tarball содержит запускаемые исходники `demo/` + README; QA card импортирует тот же canonical component, а не его копию; каждое demo имеет test/ручной чек; archive regression-карточки явно не называются рекомендуемым путём.
|
|
41
|
-
- Оценка: high usability / medium effort / medium migration risk. Сначала extraction Media/Peer, потому что его уже можно проверить картами 41–44.
|
|
42
|
-
- **Context menu / Menu: controller-first split**.
|
|
43
|
-
- Прогресс/оценка: [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md)
|
|
44
|
-
- Смысл: выделить `createContextMenuController` / `useMenuLayer` + `MenuView` и action-layer для async/progress/submenu flow, не ломая `contextMenu.openAt`, `contextMenu.Layer` и `contextMenu.stats`.
|
|
45
|
-
- Оценка: эффективность high; простота medium/hard; риск medium. Брать только отдельным focused pass с tests по click/async/submenu/stats.
|
|
46
|
-
- **Chart canvas wrapper: `useChartEngineCanvas` + view split**.
|
|
47
|
-
- Прогресс/оценка: [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md)
|
|
48
|
-
- Смысл: вынести canvas lifecycle, `ResizeObserver`, event attach/destroy and RAF bridge из `MyChartEngine` wrapper.
|
|
49
|
-
- Оценка: эффективность medium; простота medium; риск medium. Брать, если будет stand/test на chart lifecycle.
|
|
50
|
-
|
|
51
|
-
- **Architecture audit 2026-07-09 — fix queue** (4 subsystem readers + core reading; suspicious surfaces recorded in rare-doc Cleanup Inventory).
|
|
52
|
-
- DONE 2026-07-09/10 (details + verification in `doc/changes/v1.0.41.md`): **A1** memoryStore layering inverted (`utils/persistedMaps.ts`, components re-export their maps); **A2** `getLogsApi` per-call state isolation (+`settingsKey`), global `logsApi` keeps legacy shared state; **A4** columnState barrel is ag-grid-free again (columnGrid ships from its own module via root api); **A5** shared `utils/fixedOrder.ts` replaced 4 inline pinFixed copies; **A6** updateBy: f-through-ref, separate React/imperative listener sets (renderByLast/Revers touch only React subscribers), bounded reentrancy coalescing; **A8** `dispose()` on createToolbar/createColumnGrid + `visibleCount` re-seed on re-attach; **A10-safe** searchHistory read purity, window guards (RightMenu render clamp, LeftModal useViewport, ApiLeftMenu default element), dead imports dropped.
|
|
53
|
-
- **A3 (high, BREAKING)** `menuR.tsx` is dead public code + duplicates menuMouse gesture logic (menuMouse.tsx:342-380). Remove in a deliberate breaking version (recorded in Cleanup Inventory).
|
|
54
|
-
- DONE 2026-07-10 (**A7**, details in `doc/changes/v1.0.42.md`): DragBox → адаптер над useDraggableApi (+аддитивные `onMove`/`trackState` в хук, `__test/dragBox.test.tsx`, QA card 35); DragArea @deprecated as-is (уникальная семантика, потребителей нет — снос только в breaking); useFloatingWindowController/StickerMenu остаются на своих loop'ах осознанно (clamp/buttons-recovery/persist/z-stack и mount-lifetime listeners/click-suppression — load-bearing).
|
|
55
|
-
- DONE 2026-07-10 (**A9**, details in `doc/changes/v1.0.42.md`): внутренний `components/Overlay.tsx` (portal+scrim+outside+Escape, НЕ экспортирован); ModalProvider и SettingsDialog — адаптеры над ним (публичный API/поведение 1:1, включая двухступенчатый Escape SettingsDialog); createModalElementStore/LeftModal-drawer/ModalWrapper — осознанно не overlay'и. `__test/modalProvider.test.tsx`. Overlay = DOM-шов для будущего RN-слоя.
|
|
56
|
-
- DONE 2026-07-10 (**A10 safe part 2**, details in `doc/changes/v1.0.42.md`): `onClickClose` additive alias (+deprecated `onCLickClose`); `keyForSave` alias on useOutside `Button` (+deprecated `keySave`); QA card dup fixed (Replay 25→33, 26→34; toolbar 25 / useReorder 26 keep numbers); `__test/tokens.test.ts` two-way tokens.ts↔tokens.css guarantee (codegen отклонён — сборку не трогаем).
|
|
57
|
-
- DONE 2026-07-10 (**A10 loop-guard**, details in `doc/changes/v1.0.42.md`): `readFromGrid` guards на `structEqual` (utils/structEqual.ts, экспортирован из barrel); порядок-чувствительный `sameMap` НЕ тронут осознанно (его чувствительность реимпозит stored order при сбросе columnDefs).
|
|
58
|
-
- **A10 remaining (breaking only)**: raw `ListenApi` (emit/close) exposed from columnState/Toolbar onChange (narrowing is breaking); removal of deprecated `onCLickClose`/`keySave` — breaking pass only.
|
|
59
|
-
- Rule: each fix is its own focused pass with verify (tsc+jest+build+stand); breaking removals only in a deliberate breaking version.
|
|
60
|
-
|
|
61
|
-
- **Architecture follow-up: ownership and lifecycle boundaries (overlay / grid / columnState)** (code review 2026-07-10).
|
|
62
|
-
- **Overlay stack (high)**: `Overlay` instances independently subscribe to `document`. A `SettingsDialog` above a `ModalProvider` lets the lower modal handle the same Escape/outside interaction; this breaks SettingsDialog's two-stage Escape contract. Introduce an internal stack/arbiter so only the topmost dismissible layer receives Escape and outside-click; verify nested ModalProvider + SettingsDialog (search clear on first Escape, dialog close on second, parent remains open).
|
|
63
|
-
- **ag-grid row identity (high)**: `AgGridTable` currently lets a caller supply `getRowId` alongside `controller`, while the controller buffer owns another `getId`. Make the ownership unambiguous (reject/ignore override or explicitly derive the core identity); verify update/remove/reconnect with a controller and a conflicting callback.
|
|
64
|
-
- **ColumnGrid attachment ownership (high)**: one controller keeps one mutable `gridApi`, but its `Table` surface permits multiple mounts; an old table's destroy can detach the newer one. Either enforce one table per controller with a clear error or scope attachment state to a Table instance; verify two mounts plus either unmount order.
|
|
65
|
-
- **ColumnState contract consistency (medium)**: `groups` affects `visibleKeys()`/cards but is ignored when applying state to desktop ag-grid; `ColumnGrid.View` also forwards index `0` to a supplied `getId`. Align the shared config on both views and pass the actual row index. Add integration coverage.
|
|
66
|
-
- **Dispose lifecycle (medium)**: `createColumnGrid.dispose()` releases local listeners but not its attached grid listeners. Define dispose as a full release and make it detach the active grid; verify no grid events mutate state after dispose.
|
|
67
|
-
- Приоритет: отдельные focused passes; не смешивать с feature-задачами ColumnDots. Проверка каждого: tsc qa-check, jest, build и соответствующий lifecycle/integration test.
|
|
68
|
-
|
|
69
|
-
- **QA-стенд: расширить интеграционное покрытие и сделать его картой публичных примитивов**.
|
|
70
|
-
- Проблема: стенд уже содержит полезные локальные карточки (modal 13, Settings 20, columnState 28–32, replay 23–26), но не покрывает опасные межслойные сценарии: вложенные overlay, ownership `GridApi`, `dispose`, повторный mount и смену entrypoint/платформенного слоя. Зелёный Jest не заменяет эти проверки.
|
|
71
|
-
- Задача: 1) составить компактную матрицу «публичный primitive → unit → QA card → ручной сценарий» и пометить пробелы; 2) добавить active QA-карточки только для interaction/lifecycle сценариев, которые нельзя надёжно доказать unit-тестом: overlay stack (Modal + Settings), ColumnGrid mount/unmount/ownership, persistence reload/reset, replay reconnect/route switch; 3) дать каждой карточке действия, ожидаемый результат, reset/изоляцию ключей и номер без дублей; 4) завести правило: новая визуальная либо lifecycle-поверхность не считается готовой без unit/integration проверки и обновлённой или намеренно неприменимой QA-карточки.
|
|
72
|
-
- Не превращать стенд в копию всех компонентов: чистые функции и детерминированные controller-ветки остаются в Jest; стенд — для пользовательского взаимодействия, DOM, аг-grid, browser lifecycle и визуальной приёмки.
|
|
73
|
-
- Acceptance: карточки запускаются на чистой странице без console errors; ключевые сценарии воспроизводимы вручную; карта покрытия хранится в `doc/`; команды tsc qa-check, jest и build проходят.
|
|
74
|
-
- Приоритет: после исправления overlay/grid ownership — новые карточки должны проверять именно исправленные контракты.
|
|
75
|
-
|
|
76
|
-
- **Hook extraction — parked кандидаты** (do-now 1-3 выполнены и отгружены, см. In Progress выше / `doc/changes/v1.0.41.md`). Остались условные: `useChartCanvas` (ждёт ChartDemo в карточке/тесте), `useContextMenuGesture` (ждёт оживления menuR или live touch-consumer), `columnState.api.reorderPreview` (ждёт общего reorder-контракта), `useResizeableFit` (маленький shared bind callback-ref, отдельный микро-pass). Полные причины/условия возврата: [../progress/hook-extraction-audit.md](../progress/hook-extraction-audit.md).
|
|
77
|
-
|
|
78
|
-
## Inbox
|
|
79
|
-
|
|
80
|
-
- **ColumnDots: фильтр-ползунок по значениям + мультисорт-опция + именованные пресеты** (надиктовка 2026-07-10, дословно в конце файла; контекст — мобильный ползунок таблицы, карточки 29/32).
|
|
81
|
-
- **1. Сорт-кнопка**: сейчас одна (asc→desc→off) — оставить одиночной по умолчанию, но добавить ОПЦИЮ множественной сортировки (multi-sort) настройкой.
|
|
82
|
-
- **2. Второй ползунок — фильтр по значениям** (открывается по кнопке при необходимости, кнопок вызова две — уточнить у пользователя что вторая): такой же трек с ячейками/метками, на котором пользователь СТАВИТ ТОЧКИ:
|
|
83
|
-
- числовые значения: значения раскладываются по треку; две точки = диапазон (считаем всегда по КРАЙНИМ точкам — лишние точки внутри не меняют диапазон); крайняя правая + середина = правый диапазон;
|
|
84
|
-
- категориальные значения (например, 9 типов): те же точки по меткам типов; выбор = диапазон ЛИБО конкретные точки;
|
|
85
|
-
- **режим фильтра** переключается кнопкой (как сорт-кнопка): «левее точек / между точками / только по точкам / …» — т.е. lt/range/in-set и т.п.;
|
|
86
|
-
- главный сценарий — мобила, всё пальцем (продолжение live-драга точек из v1.0.43).
|
|
87
|
-
- **3. Именованные пресеты**: кнопки «Сохранить» (с именем) и «Сбросить»; загрузка = выбор из сохранённых по имени. ОТКРЫТЫЙ ВОПРОС (пользователь сам не решил): куда поместить кнопки на телефоне — места на треке не хватает; кандидаты — в шапку дотс-панели / в меню по long-press / отдельная строка-«шторка». Персист — обычный путь memoryGetOrCreate→memoryCache (пресеты = отдельный ключ со словарём имя→конфиг фильтра+сорта).
|
|
88
|
-
- Смежное: фильтр должен лечь в columnState-конфиг (`filter` там уже есть — формат согласовать с ag-grid setFilterModel), чтобы desktop-грид получал тот же фильтр через grid.attach.
|
|
89
|
-
- Статус: надиктовка записана, скоупинг и уточнения (вторая кнопка вызова; полный список режимов) — перед взятием в работу.
|
|
90
|
-
|
|
91
|
-
- **React Native / мобильная версия функционала** (надиктовка 2026-07-10, дословно в конце файла).
|
|
92
|
-
- Суть: библиотеку планируют использовать и в мобильном (React Native), где DOM недоступен (нет `document`/`window`/`createPortal`/CSS-классов).
|
|
93
|
-
- Первичная оценка: слоистость уже движется в нужную сторону — headless/controller-слой (updateBy/renderBy, columnState config, createToolbar config+Settings-модель, callbackHub, observableMap/memoryCache, replay-хуки) в основном DOM-free и потенциально переносим; DOM живёт во view-слое (FloatingWindow/Rnd, порталы/скримы, CSS-токены, ag-grid). Направление: (1) аудит `document`/`window`/`createPortal`/CSS-зависимостей по модулям; (2) выделить/закрепить platform-neutral core (возможно отдельный entrypoint без DOM-импортов); (3) RN-view-адаптеры — отдельный пакет/подпапка, не в этом проходе. ag-grid в RN не живёт — мобильные представления уже есть (ColumnDots/CardList) как модель. Персист: storage-слой абстрагировать (localStorage → AsyncStorage).
|
|
94
|
-
- Статус: требует отдельного скоупинга после A-очереди; A9 Overlay-примитив планировать сразу с учётом этого (ядро без DOM, портал/скрим — в web-адаптере). Стоявшие здесь specs («Недоиспользуемые методы: primitive-reuse pass» и «Hook/controller-first backlog») проверены multi-agent-верификацией: оба `doneInCode=fully`, отгружены в v1.0.39–v1.0.41, конкретные изменения записаны в changelog (MiniLogs/AgGridTable/`useListenEffect`/стиль-токены — v1.0.39/40; MessageEventLogs split — v1.0.41). Удалены из очереди; durable-запись — в `doc/progress/public-surface-normalization.md` и `doc/progress/hook-controller-opportunities.md`. Внутренний `createUpdateApi`-pass намеренно только в progress (публичный API не менялся).
|
|
95
|
-
|
|
96
|
-
## Verify
|
|
97
|
-
|
|
98
|
-
_Пусто._ «ColumnState present-gate» выпущен как v1.0.44: repro сначала подтвердил утечку `visible.b=false` после чужого resize под закрытым gate; фикс читает visibility только для ключей, проходящих gate; targeted Jest 3/3, полный Jest 64/64, tsc и build прошли; пакет опубликован. Durable-запись: `doc/changes/v1.0.44.md`; рабочая история: `doc/progress/column-state-present-gate.md`.
|
|
99
|
-
|
|
100
|
-
«Система стилей и CSS variables» проверена: `doneInCode=fully`, `.wenayColsMenu*`/`--cols-menu-*` и `--cols-dots-*`/`--cols-card-*` в коде, changelog v1.0.38/v1.0.39/v1.0.41, отгружено в релизах. Удалено; durable-запись — `doc/progress/style-system-normalization.md`.
|
|
101
|
-
|
|
102
|
-
## Blocked — уровень приложения (не эта React-библиотека)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
>
|
|
116
|
-
|
|
117
|
-
>
|
|
118
|
-
|
|
119
|
-
>
|
|
120
|
-
|
|
121
|
-
>
|
|
122
|
-
|
|
123
|
-
>
|
|
124
|
-
|
|
125
|
-
>
|
|
126
|
-
|
|
127
|
-
>
|
|
32
|
+
- **Аудит 1.0.71–1.0.73 (2026-07-10, dependency обновлена до 1.0.73)**: `Peer` repair/resync (1.0.71) остаётся core protocol — React не должен повторять gap/journal state machine; `usePeer` может лишь отразить `peer(account)` store/route и вызвать `resync()` по app-owned transport reconnect. Media hidden-tab workers/ImageCapture (1.0.72) принимаем автоматически через core defaults, без React-кода. Media viewer helpers (1.0.73: canvas/audio/publish pipe) — core imperative hot path; React-кандидаты только тонкие lifecycle bindings над ref (`useMediaVideoCanvas`, `useMediaAudioPlayer`), без frame-level React state. Сначала docs/recipe + QA card с реальным consumer; хук — лишь если recipe повторяется.
|
|
33
|
+
|
|
34
|
+
- **common2 1.0.74 adoption: Calls, presence and protected Media relay — implementation complete in 1.0.46; manual camera verify pending.** Отдельный продуктовый проход; не смешан с `usePeer`.
|
|
35
|
+
- **Call controller/view — DONE.** — поверх `Peer.createCallManager({port: callPortOf(remote), self})`: lifecycle `ringing → active → ended`, входящий звонок, accept/decline/hangup, offline/busy/timeout reason. React хранит только UI-состояние/подписки; signal envelopes, glare и busy gate остаются в common2.
|
|
36
|
+
- **Presence — DONE.** — тонкая подписка на `peerHost.presence` с initial `list()` после subscription; показывать только edges online/offline, не polling и не собственный presence-store.
|
|
37
|
+
- **Media relay + ACL — DONE (binding/QA recipe).** — call view подключает viewers только в active состоянии. Сервер задаёт `watchOf(watcher)` + `canWatch`; React не получает права решать доступ. Relay-first остаётся default, direct — явный opt-in.
|
|
38
|
+
- **Стенд и тесты одним batch:** два in-process peer-клиента: presence edge, ring/accept/active, audio/video relay keyframe, hangup/decline/offline/busy; отдельный ACL-revoke кейс, доказывающий закрытие уже открытой подписки.
|
|
39
|
+
- Оценка: medium/high; сначала определить server-owned authorize policy и UX входящего звонка, затем делать адаптер. `usePeer` не расширять до call manager — это другой lifecycle.
|
|
40
|
+
- **Stand → shipped examples: разделить интерактивные consumer demos и internal QA-regressions** (архитектурная переработка стенда).
|
|
41
|
+
- Проблема: 44 карточки живут в одном `testUseReact/qa.tsx`; сценарий может одновременно быть хорошим consumer-примером и проверкой, но npm сейчас получает отдельную копию в `doc/examples`. Это создаёт риск расхождения.
|
|
42
|
+
- Целевая модель: весь `demo/stand` поставляется как интерактивный пример; Active-карточки — canonical consumer guidance, Archive-карточки — явный regression/compat context. QA-доска добавляет manual acceptance metadata. Карточка получает manifest: category, canonical/regression, source example, automated test, manual check.
|
|
43
|
+
- Миграция batch-ами: **1) Media/Peer calls/presence/relay — DONE in 1.0.46**: единый export `wenay-react2/demo/peer-media`, который рендерят QA cards 41–44; **2) Replay cards 23/24/33/34**; **3) toolbar/columnState/grid**; legacy archive оставить internal до отдельного решения. Никакого big-bang rewrite и никаких изменений публичного API.
|
|
44
|
+
- Acceptance: npm tarball содержит запускаемые исходники `demo/` + README; QA card импортирует тот же canonical component, а не его копию; каждое demo имеет test/ручной чек; archive regression-карточки явно не называются рекомендуемым путём.
|
|
45
|
+
- Оценка: high usability / medium effort / medium migration risk. Сначала extraction Media/Peer, потому что его уже можно проверить картами 41–44.
|
|
46
|
+
- **Context menu / Menu: controller-first split**.
|
|
47
|
+
- Прогресс/оценка: [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md)
|
|
48
|
+
- Смысл: выделить `createContextMenuController` / `useMenuLayer` + `MenuView` и action-layer для async/progress/submenu flow, не ломая `contextMenu.openAt`, `contextMenu.Layer` и `contextMenu.stats`.
|
|
49
|
+
- Оценка: эффективность high; простота medium/hard; риск medium. Брать только отдельным focused pass с tests по click/async/submenu/stats.
|
|
50
|
+
- **Chart canvas wrapper: `useChartEngineCanvas` + view split**.
|
|
51
|
+
- Прогресс/оценка: [../progress/hook-controller-opportunities.md](../progress/hook-controller-opportunities.md)
|
|
52
|
+
- Смысл: вынести canvas lifecycle, `ResizeObserver`, event attach/destroy and RAF bridge из `MyChartEngine` wrapper.
|
|
53
|
+
- Оценка: эффективность medium; простота medium; риск medium. Брать, если будет stand/test на chart lifecycle.
|
|
54
|
+
|
|
55
|
+
- **Architecture audit 2026-07-09 — fix queue** (4 subsystem readers + core reading; suspicious surfaces recorded in rare-doc Cleanup Inventory).
|
|
56
|
+
- DONE 2026-07-09/10 (details + verification in `doc/changes/v1.0.41.md`): **A1** memoryStore layering inverted (`utils/persistedMaps.ts`, components re-export their maps); **A2** `getLogsApi` per-call state isolation (+`settingsKey`), global `logsApi` keeps legacy shared state; **A4** columnState barrel is ag-grid-free again (columnGrid ships from its own module via root api); **A5** shared `utils/fixedOrder.ts` replaced 4 inline pinFixed copies; **A6** updateBy: f-through-ref, separate React/imperative listener sets (renderByLast/Revers touch only React subscribers), bounded reentrancy coalescing; **A8** `dispose()` on createToolbar/createColumnGrid + `visibleCount` re-seed on re-attach; **A10-safe** searchHistory read purity, window guards (RightMenu render clamp, LeftModal useViewport, ApiLeftMenu default element), dead imports dropped.
|
|
57
|
+
- **A3 (high, BREAKING)** `menuR.tsx` is dead public code + duplicates menuMouse gesture logic (menuMouse.tsx:342-380). Remove in a deliberate breaking version (recorded in Cleanup Inventory).
|
|
58
|
+
- DONE 2026-07-10 (**A7**, details in `doc/changes/v1.0.42.md`): DragBox → адаптер над useDraggableApi (+аддитивные `onMove`/`trackState` в хук, `__test/dragBox.test.tsx`, QA card 35); DragArea @deprecated as-is (уникальная семантика, потребителей нет — снос только в breaking); useFloatingWindowController/StickerMenu остаются на своих loop'ах осознанно (clamp/buttons-recovery/persist/z-stack и mount-lifetime listeners/click-suppression — load-bearing).
|
|
59
|
+
- DONE 2026-07-10 (**A9**, details in `doc/changes/v1.0.42.md`): внутренний `components/Overlay.tsx` (portal+scrim+outside+Escape, НЕ экспортирован); ModalProvider и SettingsDialog — адаптеры над ним (публичный API/поведение 1:1, включая двухступенчатый Escape SettingsDialog); createModalElementStore/LeftModal-drawer/ModalWrapper — осознанно не overlay'и. `__test/modalProvider.test.tsx`. Overlay = DOM-шов для будущего RN-слоя.
|
|
60
|
+
- DONE 2026-07-10 (**A10 safe part 2**, details in `doc/changes/v1.0.42.md`): `onClickClose` additive alias (+deprecated `onCLickClose`); `keyForSave` alias on useOutside `Button` (+deprecated `keySave`); QA card dup fixed (Replay 25→33, 26→34; toolbar 25 / useReorder 26 keep numbers); `__test/tokens.test.ts` two-way tokens.ts↔tokens.css guarantee (codegen отклонён — сборку не трогаем).
|
|
61
|
+
- DONE 2026-07-10 (**A10 loop-guard**, details in `doc/changes/v1.0.42.md`): `readFromGrid` guards на `structEqual` (utils/structEqual.ts, экспортирован из barrel); порядок-чувствительный `sameMap` НЕ тронут осознанно (его чувствительность реимпозит stored order при сбросе columnDefs).
|
|
62
|
+
- **A10 remaining (breaking only)**: raw `ListenApi` (emit/close) exposed from columnState/Toolbar onChange (narrowing is breaking); removal of deprecated `onCLickClose`/`keySave` — breaking pass only.
|
|
63
|
+
- Rule: each fix is its own focused pass with verify (tsc+jest+build+stand); breaking removals only in a deliberate breaking version.
|
|
64
|
+
|
|
65
|
+
- **Architecture follow-up: ownership and lifecycle boundaries (overlay / grid / columnState)** (code review 2026-07-10).
|
|
66
|
+
- **Overlay stack (high)**: `Overlay` instances independently subscribe to `document`. A `SettingsDialog` above a `ModalProvider` lets the lower modal handle the same Escape/outside interaction; this breaks SettingsDialog's two-stage Escape contract. Introduce an internal stack/arbiter so only the topmost dismissible layer receives Escape and outside-click; verify nested ModalProvider + SettingsDialog (search clear on first Escape, dialog close on second, parent remains open).
|
|
67
|
+
- **ag-grid row identity (high)**: `AgGridTable` currently lets a caller supply `getRowId` alongside `controller`, while the controller buffer owns another `getId`. Make the ownership unambiguous (reject/ignore override or explicitly derive the core identity); verify update/remove/reconnect with a controller and a conflicting callback.
|
|
68
|
+
- **ColumnGrid attachment ownership (high)**: one controller keeps one mutable `gridApi`, but its `Table` surface permits multiple mounts; an old table's destroy can detach the newer one. Either enforce one table per controller with a clear error or scope attachment state to a Table instance; verify two mounts plus either unmount order.
|
|
69
|
+
- **ColumnState contract consistency (medium)**: `groups` affects `visibleKeys()`/cards but is ignored when applying state to desktop ag-grid; `ColumnGrid.View` also forwards index `0` to a supplied `getId`. Align the shared config on both views and pass the actual row index. Add integration coverage.
|
|
70
|
+
- **Dispose lifecycle (medium)**: `createColumnGrid.dispose()` releases local listeners but not its attached grid listeners. Define dispose as a full release and make it detach the active grid; verify no grid events mutate state after dispose.
|
|
71
|
+
- Приоритет: отдельные focused passes; не смешивать с feature-задачами ColumnDots. Проверка каждого: tsc qa-check, jest, build и соответствующий lifecycle/integration test.
|
|
72
|
+
|
|
73
|
+
- **QA-стенд: расширить интеграционное покрытие и сделать его картой публичных примитивов**.
|
|
74
|
+
- Проблема: стенд уже содержит полезные локальные карточки (modal 13, Settings 20, columnState 28–32, replay 23–26), но не покрывает опасные межслойные сценарии: вложенные overlay, ownership `GridApi`, `dispose`, повторный mount и смену entrypoint/платформенного слоя. Зелёный Jest не заменяет эти проверки.
|
|
75
|
+
- Задача: 1) составить компактную матрицу «публичный primitive → unit → QA card → ручной сценарий» и пометить пробелы; 2) добавить active QA-карточки только для interaction/lifecycle сценариев, которые нельзя надёжно доказать unit-тестом: overlay stack (Modal + Settings), ColumnGrid mount/unmount/ownership, persistence reload/reset, replay reconnect/route switch; 3) дать каждой карточке действия, ожидаемый результат, reset/изоляцию ключей и номер без дублей; 4) завести правило: новая визуальная либо lifecycle-поверхность не считается готовой без unit/integration проверки и обновлённой или намеренно неприменимой QA-карточки.
|
|
76
|
+
- Не превращать стенд в копию всех компонентов: чистые функции и детерминированные controller-ветки остаются в Jest; стенд — для пользовательского взаимодействия, DOM, аг-grid, browser lifecycle и визуальной приёмки.
|
|
77
|
+
- Acceptance: карточки запускаются на чистой странице без console errors; ключевые сценарии воспроизводимы вручную; карта покрытия хранится в `doc/`; команды tsc qa-check, jest и build проходят.
|
|
78
|
+
- Приоритет: после исправления overlay/grid ownership — новые карточки должны проверять именно исправленные контракты.
|
|
79
|
+
|
|
80
|
+
- **Hook extraction — parked кандидаты** (do-now 1-3 выполнены и отгружены, см. In Progress выше / `doc/changes/v1.0.41.md`). Остались условные: `useChartCanvas` (ждёт ChartDemo в карточке/тесте), `useContextMenuGesture` (ждёт оживления menuR или live touch-consumer), `columnState.api.reorderPreview` (ждёт общего reorder-контракта), `useResizeableFit` (маленький shared bind callback-ref, отдельный микро-pass). Полные причины/условия возврата: [../progress/hook-extraction-audit.md](../progress/hook-extraction-audit.md).
|
|
81
|
+
|
|
82
|
+
## Inbox
|
|
83
|
+
|
|
84
|
+
- **ColumnDots: фильтр-ползунок по значениям + мультисорт-опция + именованные пресеты** (надиктовка 2026-07-10, дословно в конце файла; контекст — мобильный ползунок таблицы, карточки 29/32).
|
|
85
|
+
- **1. Сорт-кнопка**: сейчас одна (asc→desc→off) — оставить одиночной по умолчанию, но добавить ОПЦИЮ множественной сортировки (multi-sort) настройкой.
|
|
86
|
+
- **2. Второй ползунок — фильтр по значениям** (открывается по кнопке при необходимости, кнопок вызова две — уточнить у пользователя что вторая): такой же трек с ячейками/метками, на котором пользователь СТАВИТ ТОЧКИ:
|
|
87
|
+
- числовые значения: значения раскладываются по треку; две точки = диапазон (считаем всегда по КРАЙНИМ точкам — лишние точки внутри не меняют диапазон); крайняя правая + середина = правый диапазон;
|
|
88
|
+
- категориальные значения (например, 9 типов): те же точки по меткам типов; выбор = диапазон ЛИБО конкретные точки;
|
|
89
|
+
- **режим фильтра** переключается кнопкой (как сорт-кнопка): «левее точек / между точками / только по точкам / …» — т.е. lt/range/in-set и т.п.;
|
|
90
|
+
- главный сценарий — мобила, всё пальцем (продолжение live-драга точек из v1.0.43).
|
|
91
|
+
- **3. Именованные пресеты**: кнопки «Сохранить» (с именем) и «Сбросить»; загрузка = выбор из сохранённых по имени. ОТКРЫТЫЙ ВОПРОС (пользователь сам не решил): куда поместить кнопки на телефоне — места на треке не хватает; кандидаты — в шапку дотс-панели / в меню по long-press / отдельная строка-«шторка». Персист — обычный путь memoryGetOrCreate→memoryCache (пресеты = отдельный ключ со словарём имя→конфиг фильтра+сорта).
|
|
92
|
+
- Смежное: фильтр должен лечь в columnState-конфиг (`filter` там уже есть — формат согласовать с ag-grid setFilterModel), чтобы desktop-грид получал тот же фильтр через grid.attach.
|
|
93
|
+
- Статус: надиктовка записана, скоупинг и уточнения (вторая кнопка вызова; полный список режимов) — перед взятием в работу.
|
|
94
|
+
|
|
95
|
+
- **React Native / мобильная версия функционала** (надиктовка 2026-07-10, дословно в конце файла).
|
|
96
|
+
- Суть: библиотеку планируют использовать и в мобильном (React Native), где DOM недоступен (нет `document`/`window`/`createPortal`/CSS-классов).
|
|
97
|
+
- Первичная оценка: слоистость уже движется в нужную сторону — headless/controller-слой (updateBy/renderBy, columnState config, createToolbar config+Settings-модель, callbackHub, observableMap/memoryCache, replay-хуки) в основном DOM-free и потенциально переносим; DOM живёт во view-слое (FloatingWindow/Rnd, порталы/скримы, CSS-токены, ag-grid). Направление: (1) аудит `document`/`window`/`createPortal`/CSS-зависимостей по модулям; (2) выделить/закрепить platform-neutral core (возможно отдельный entrypoint без DOM-импортов); (3) RN-view-адаптеры — отдельный пакет/подпапка, не в этом проходе. ag-grid в RN не живёт — мобильные представления уже есть (ColumnDots/CardList) как модель. Персист: storage-слой абстрагировать (localStorage → AsyncStorage).
|
|
98
|
+
- Статус: требует отдельного скоупинга после A-очереди; A9 Overlay-примитив планировать сразу с учётом этого (ядро без DOM, портал/скрим — в web-адаптере). Стоявшие здесь specs («Недоиспользуемые методы: primitive-reuse pass» и «Hook/controller-first backlog») проверены multi-agent-верификацией: оба `doneInCode=fully`, отгружены в v1.0.39–v1.0.41, конкретные изменения записаны в changelog (MiniLogs/AgGridTable/`useListenEffect`/стиль-токены — v1.0.39/40; MessageEventLogs split — v1.0.41). Удалены из очереди; durable-запись — в `doc/progress/public-surface-normalization.md` и `doc/progress/hook-controller-opportunities.md`. Внутренний `createUpdateApi`-pass намеренно только в progress (публичный API не менялся).
|
|
99
|
+
|
|
100
|
+
## Verify
|
|
101
|
+
|
|
102
|
+
_Пусто._ «ColumnState present-gate» выпущен как v1.0.44: repro сначала подтвердил утечку `visible.b=false` после чужого resize под закрытым gate; фикс читает visibility только для ключей, проходящих gate; targeted Jest 3/3, полный Jest 64/64, tsc и build прошли; пакет опубликован. Durable-запись: `doc/changes/v1.0.44.md`; рабочая история: `doc/progress/column-state-present-gate.md`.
|
|
103
|
+
|
|
104
|
+
«Система стилей и CSS variables» проверена: `doneInCode=fully`, `.wenayColsMenu*`/`--cols-menu-*` и `--cols-dots-*`/`--cols-card-*` в коде, changelog v1.0.38/v1.0.39/v1.0.41, отгружено в релизах. Удалено; durable-запись — `doc/progress/style-system-normalization.md`.
|
|
105
|
+
|
|
106
|
+
## Blocked — уровень приложения (не эта React-библиотека)
|
|
107
|
+
|
|
108
|
+
- **Upstream-баг wenay-common2 1.0.74 (репозиторий common2): `createMediaRelay().dropAccount()` падает на policy-отозванных вью.** `dropAccount` делает `Object.values(ownerView)` по КЭШИРОВАННОМУ Proxy-вью (`peer-media-relay.js:127`), чей `get` возвращает `undefined`, когда `canWatch` уже отказывает — а к моменту offline звонок обычно завершён и гранты сняты → `line.close()` на undefined роняет процесс. Воспроизведено 2026-07-13 сервером conference-примера; **та же мина лежит в собственном demo/server.ts common2** (порядок `callPolicy.dropAccount` → `media.dropAccount`). Фикс на стороне common2: итерировать raw `policyLines` (target Proxy) либо guard'ить undefined. Обход в нашем примере: `media.dropAccount` ДО снятия грантов + try/catch (doc/examples/conference-server.mjs).
|
|
109
|
+
|
|
110
|
+
Эти задачи живут на стороне приложения (`clientBacktest` / супер-админка), а не в этой библиотеке. Держим как источник, пока не будет доступа к тем репозиториям.
|
|
111
|
+
|
|
112
|
+
- **Balance / Client Backtest**: total по категориям и общий total; фильтры по каждой категории; количество монет в базовой валюте (или фильтр относительно прайса, как на главной странице — есть спец-фильтр для кредитов); кликабельность — возврат займа (по одной и массово, правой кнопкой), панель займа как на главной, трансфер в spot/др. (в т.ч. массовый), массовая очистка лимиток, массовое закрытие позиций на фьючерсах; окно рыночной сделки (buy/sell по выбранному рынку) по кнопке Asset и по BaseOne.
|
|
113
|
+
- **Уровень прав пользователя через супер-админку**: IP супер-админки статичен (хардкод-константа в коде, не ENV); узнавать уровень/права клиента через супер-админку (клиентские страницы и так открываются через неё); нужно комплексное решение — bootstrap прав при открытии клиентской страницы.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Исходные надиктовки (дословно)
|
|
118
|
+
|
|
119
|
+
> Тут я буду надиктовывать различные задачи через Transkriptor, э-э-э, поэтому могут быть какие-тооо опечатки в словах, это нужно понимать. Вот. И вот этот главный пункт — это как бы ты запишешь как README таргета, что ли, а-а-а, файл README. Это твоя первая задача, по сути. А-а-а, потом суть данного направления в том, что типа я просто надиктовываю задачи, которые хочу сделать в порядке какой-нибудь очереди, ну, чтобы про них потом не забыть. Иии потом ты- Угу действия начинаешь выполнять, ты делаешь согласно своих правил, там, у тебя правила записаны, как поступать. Типааа прогрееесс, там, файл, типа, и прочее, ход выполнения. Иии к-- если ты её взял на разработку, то ты как-то должен помечать, типа, вот взял на разработку. Типа, доделано, недоделано — это мы уже потом по прогрессу будем смотреть. Вот и всё. Ну и удалять отсюда, чтобы всегда подчищать документ. То есть я сюда- выкидываю задачи. Можно даже сделать несколько слоёв. Слой, типа, от меня, как задачи, слой, который выполняется, пока не выполнен полностью, и тот, который выполнен и уже очищен. Ну, вот, я думаю, это так будет наиболее правильно.
|
|
120
|
+
|
|
121
|
+
> Нам нужнооо Используя технологию из библиотек, наших же, а-а-а, изменить Ниньо. А точнее, давай не миньо, начнем с баланса. А-а-а, вот есть Binance, а-а-а, баланс нааа Client Backtest. Э-э-э, там есть кнопка, так и называется она Баланс есть. И там есть для спота, для кросса, для фьючерсов отдельные записи. Хотелось бы видеть там же total общий, а-а-а, в базе в его соответствиях, также total по категории. Такжеяя ты сделал таблицу, нооо Лучшеее разрешить таммм вот эти фильтрыыы везде. Который, ну, м-можно было, чтоб каждую категорию фильтровать. Ну, в общем, как обычно. Потом А, кстати, вас бы, чтобы палатка кабельность То есть важно Чтооо, допустим, количество монет мне нужно фильтровать в базовой валюте, ну, типа относительно. Ну, тут есть хотя бы базовая валюта. Я могу по этому столбцу фильтровать. Вот. Ну, либо писать там, как бы в скобках, сколько это будет в базовой валюте, как, ну, как на главной странице. Иии фильтр-- ну, тоже сделать всё, как на главной странице: фильтр относительно прайса. Там у нас специальный фильтр для кредитов для этого написан, и он там используется. Потоммм А, добавить кликабельность, наверное. Что я имею в виду под кликабельностью? Ну, типа чтобы можно было нажать там на «Борууу» и можно было вернуть займ. Вот. Чтобы можно было выделить массово и вернуть займ везде правой кнопкой, допустим, а-а-а, либо по одной монете вернуть займ. Вот. Чтобы при клике на «Борууу» именно открывалась панелька займа, как с главной страницы. Ну, это касаемо кросс. Вот. Чтобы я мог нажать правую кнопку, нажать «Перевести трансфер» иии просто перекинуть её, а-а-а, в spot или куда-нибудь ещё, чтобы я мог массово выделить и сделать массовый трансфер. Вот. Хоть получается у нас много где такие правды, но всё-таки. Также по лимиткам хочу иметь возможность очистить данную лимитку, также массово выбрать, очистить массово лимитки. Вот. А-а-а, на фьючерсах Закрыть позиции массово. А-а-а, также я хочу при нажатии на кнопку «Asset» Чтобы у меняяя, наверное, открывалось окно возможности конвертации данной монеты, но без кон-- ну и без системы конвертации рыночной, типа buy-sell. По различным рынкам. Ну, типа, чтобы мне предполагалось, м-м-м, на как-- по какому рынку я хочу открыть диалоговое окно на покупку-продажу. Вот. Ну, типа, чтобы на месте я мог Выбрать, куда я хочу Стифом продать или купить. А-а-а, потом. А-а-а, м-м-м Как бы, конверт у BaseOne. А-а-а, конвертировать базовую валюту. Но опять же, это ещё не конвертация, а именно сделка по рынку, по ASL. Вот, а-а-а Точно так же хотелось бы отцу-то её иметь.
|
|
122
|
+
|
|
123
|
+
> Смотри, нам, короче, нужно как-то брать. У нас есть, короче, супер-админка, и его-- и ее IP-шник, как правило, пока что статичен. Можно хардкодить временно, ну, либо использовать как через переменную, хардкодить через переменную статическую, чтобы было-- ну, не через ENW, а в коде прям, короче. Вот. И просто у нас есть некоторые моменты, которые требуются только для определенных вещей, и нам бы узнавать уровень пользователя. Типа, ну, есть ли права, а-а-а, в клиентской системе, э-э-э, типа для такого-то режима. А узнать уровень пользователя мы можем только через супер-админку. Вот. Как это правильнее сделать? Я пока не понимаю. Ну, типа, к примеру, вот мы на фронте показываем APK. Пока что понятно для отладки, у нас пока так и оставляем. Ну, это больше задачааа, которая требует, наверное, комплексного решения. Скорее всего, нам нужно просто открывать клиентскую страницу через суперадминку. Кстати, мы так и делаем. Все клиентские страницы мы открываем через суперадминку.
|
|
124
|
+
|
|
125
|
+
> wenay-common2 Обнови эту библиотеку на последней версии. Посмотри, что там есть новое, можем ли это использовать. Если можем, тооо создай в таргете цели использовать это. И что необходимо сделать в качестве задач.
|
|
126
|
+
|
|
127
|
+
> у нас еще планируется мобильные устройства - там говорят нет каких то элементов. и что то скорее всего надо продублировать
|
|
128
|
+
|
|
129
|
+
> да мы еще планиурем использовать библиотеку и для мобильного использования , а там дум обьекты вроде не потдерживаются.... ну ты сам знаешь что надо для реакт нативу - может сделать мобильную версию этого функционала
|
|
130
|
+
|
|
131
|
+
> вопрос насоклько этот код вобще лакнчиный и юзабельный?ты бы сам ег остал использовать [оценка 2026-07-10: вызовы лаконичны, изучение — нет; задача «API-витрина» в Ready] да оформи задачу в my.md но текущий релиз запуш
|
|
132
|
+
|
|
133
|
+
> Запиши такую задачу. Значит, надо М-м-м, где менюшка? Ст-- для таблицы есть, особенно вот этот ползунок. Надо его улучшить. А именно: там вот есть фильтр по возрастанию, по убыванию, кнопочка одна. Во-первых, он должен быть множественный. Либо не множественный. Пока что пусть он будет нормальный. С-- но опционально такая настройка должна быть. А-а-а, второй момент важен. Есть ли помимооо фильтра у нас открывается второй ползунок? Если нужно. Там получается две кнопки вызвать ползунок второй. Второй ползунок, оннн так же, как и первый, состоит из каких-то ячеек иии ползунков . Ну, вот этих вот. То есть, допустим, мы там можем задать Кремль, край? Естественно, если мы выбрали «Больше» и выбираем тут-- там на ползунке есть эти цифры, то они, цифры, расположены, ну, вся эта куча, чтобы человек мог выбрать Там в левую часть либо в правую часть. То есть технический человек ставит сразу две точки? А-а-а, ты поставил крайние, я посередине. Это означает, что, ну, был этот диапазон. Крайний правый посередине означает, что был правый диапазон. Если он добавляет еще точки, мы их всё равно считаем по крайним точкам. Нам неважно, если этооо Если этооо, к-к-какой-нибудь, например, тверд-- ну, либо какой-нибудь другой вариант еще рассматриваем. Вот. А если этооо, к примеру Там название чего-то, и этих названий определенное количество. Допустим Девять типов чего-то. То мыыы-- э-э-э, вот у нас есть девять типов. Мы точно так же точки расставляем. Человек может выбрать несколько точек: либо диапазон, автооо, типа, либо конкретно. И режим выбирается, к примеру, вот этой кнопкой: фильтровать вверх, вниз. То есть мы выбираем левее, точки, между точками, только по точкам, там меньше точек. Ну, чё-то типа такого. Вот, я думаю, это будет очень удобно. Особенно на мобиле. Иии нужна настройка ещёёё Сохранить этот настрой. Ну, типа, вот, н-- допустим, так сделали . Понятно, кнопка «Сбросить» их вот, и кнопка «Сохранить». Только пока не очень понимаю, куда это поставить. Особенно на мобиле, на телефоне там места не хватает, ну, точнее, не хватает. Типа ты, допустим, настроил настройку . Кнопку нажал, их там запримел. Иии, соответственно, точно так же, еслиии тыыы Как загружать правильно? Загружать на опять же, смотреть, чё ты сохраняешься. Сохраняешься с именем?
|
|
134
|
+
|
|
135
|
+
> Мы можем в кассете приме работа сделать демонстрацию имеего в силе моста сделать. Причем для созвона нескольких участников. Используя обе технологии. Для меня это важно [записано 2026-07-12; прочтение: «в качестве примера работы сделать демонстрацию, имею в виду мосты, причём для созвона нескольких участников, используя обе технологии (relay-мост + WebRTC direct)»; задача в In Progress]
|
|
136
|
+
|
|
137
|
+
> Прочем желательно пример через бэк тоже. [записано 2026-07-12; прочтение: «причём желательно пример через бэк(енд) тоже» — дополнение к конференц-демо: серверный вариант моста]
|