fix(tradein/maps): убрать украинский флаг Leaflet и починить атрибуцию OSM #2621

Merged
lekss361 merged 1 commit from fix/tradein-leaflet-attribution into main 2026-08-02 12:12:44 +00:00
Owner

Что и почему

1. Украинский флаг в атрибуции карт.
Leaflet 1.9.4 по умолчанию вшивает флаг в prefix контрола атрибуции — подтверждено в исходнике:

// leaflet-src.js:5743
var ukrainianFlag = '<svg ... class="leaflet-attribution-flag">...';
// leaflet-src.js:5762
prefix: '<a href="https://leafletjs.com" ...>' + (Browser.inlineSvg ? ukrainianFlag + ' ' : '') + 'Leaflet</a>'

Ни в одной карте МЕРЫ prefix не переопределялся → флаг висел на всех шести картах. Гасим через map.attributionControl.setPrefix(false). Это уносит и собственную подпись Leaflet — законно, BSD-лицензия Leaflet не требует упоминания в UI.

attributionControl: false намеренно НЕ используется: он снёс бы весь контрол вместе с атрибуцией тайлов, обязательной по ODbL.

2. Атрибуция тайлов OSM была нелегитимной.
Во всех картах стояло голое "© OpenStreetMap" — без ссылки на лицензию и без слова contributors, что не соответствует Attribution Guidelines OSMF. Заменено на канонический кредит со ссылкой на https://www.openstreetmap.org/copyright. Имя OpenStreetMap не переводится (требование гайдлайнов), поэтому строка в канонической английской форме.

Побочный эффект: новая строка короче прежнего рендера (флаг + Leaflet | © OpenStreetMap© OpenStreetMap contributors), риска распирания узкого HeroBar-локатора (560×152) нет.

3. Дедупликация.
loadLeaflet() и константы LEAFLET_* были дословно (побайтово) скопированы в шести компонентах. Из-за этого правку атрибуции пришлось бы вносить шесть раз, и любая забытая копия молча осталась бы со старым поведением. Вынесено в новый tradein-mvp/frontend/src/lib/leaflet.ts:

  • loadLeaflet(), LEAFLET_VER/CSS/JS/*_SRI — перенесены без изменений;
  • OSM_TILE_URL / OSM_ATTRIBUTION / OSM_MAX_ZOOM;
  • createMap(L, container, options?) — обёртка над L.map(), которая сразу делает setPrefix(false). Возвращает ту же карту, чейнинг .setView(...) работает как раньше. Смысл обёртки: при добавлении седьмой карты забыть про флаг физически нельзя.

Версия Leaflet и SRI-хэши сохранены как есть, на npm-пакет не переводил — отдельная задача.

Затронутые файлы

Все шесть точек создания карты в МЕРЕ (список перепроверен грепом L.map( по всему tradein-mvp/frontend/src — других нет):

  • components/trade-in/MapCard.tsx
  • components/trade-in/MapPicker.tsx
  • components/trade-in/SaleShareMap.tsx (карта sale-share)
  • components/trade-in/v2/HeroBar.tsx
  • components/trade-in/v2/ParamsPanel.tsx
  • components/trade-in/v2/SourcesMap.tsx

-281/+185 строк: чистое сокращение за счёт удаления пяти дублей загрузчика.

Проверено

  • npx tsc --noEmitexit 0, чисто.
  • npm run lint (next lint) — exit 0. Остались две warning'а в файлах, которых PR не касается и которые были красными до него: app/scrapers/cian/page.tsx:167 (CianAuthBanner unused), components/trade-in/OfferCard.tsx:208 (pct unused).
  • Грепом подтверждено, что не осталось ни одного локального const LEAFLET_, ни одного function loadLeaflet, ни одного "© OpenStreetMap" и ни одного прямого L.map( в компонентах.
  • Все шесть loadLeaflet перед выносом сверены попарно — они были идентичны, поведение при дедупликации не изменилось.
  • Комментарии в ParamsPanel.tsx / HeroBar.tsx, ссылающиеся на OSM-атрибуцию и её расположение, перечитаны — остались корректными.

НЕ проверено (честно)

  • Визуально в браузере не смотрел. Локальный запуск МЕРЫ без бэкенда даёт пустой DOM (RouteGuard), а прод-проверка возможна только после мержа и деплоя. То, что флаг исчез, а ссылка на copyright появилась — вывод из чтения исходника Leaflet 1.9.4 (Control.Attribution._update пишет prefixAndAttribs в innerHTML, пустой prefix просто не пушится в массив), а не наблюдение. Нужен post-deploy smoke: открыть /v2 и /sale-share, убедиться, что в правом нижнем углу карты нет флага и есть кликабельный «OpenStreetMap contributors».
  • next build не гонял — CI-гейт для tradein-фронта это type-check + lint, оба зелёные; импорты покрыты tsc.
  • Автотестов на карты в репозитории нет, добавлять в рамках этого PR не стал.

Границы

Тронут только tradein-mvp/frontend/. Основной фронт frontend/ (Site Finder, Птица) со своими картами и своей проблемой атрибуции не затронут — отдельный PR. tradein-mvp/frontend/src/app/v2/page.tsx не трогал.

## Что и почему **1. Украинский флаг в атрибуции карт.** Leaflet 1.9.4 по умолчанию вшивает флаг в prefix контрола атрибуции — подтверждено в исходнике: ```js // leaflet-src.js:5743 var ukrainianFlag = '<svg ... class="leaflet-attribution-flag">...'; // leaflet-src.js:5762 prefix: '<a href="https://leafletjs.com" ...>' + (Browser.inlineSvg ? ukrainianFlag + ' ' : '') + 'Leaflet</a>' ``` Ни в одной карте МЕРЫ prefix не переопределялся → флаг висел на всех шести картах. Гасим через `map.attributionControl.setPrefix(false)`. Это уносит и собственную подпись Leaflet — законно, BSD-лицензия Leaflet не требует упоминания в UI. `attributionControl: false` намеренно **НЕ** используется: он снёс бы весь контрол вместе с атрибуцией тайлов, обязательной по ODbL. **2. Атрибуция тайлов OSM была нелегитимной.** Во всех картах стояло голое `"© OpenStreetMap"` — без ссылки на лицензию и без слова *contributors*, что не соответствует Attribution Guidelines OSMF. Заменено на канонический кредит со ссылкой на `https://www.openstreetmap.org/copyright`. Имя OpenStreetMap не переводится (требование гайдлайнов), поэтому строка в канонической английской форме. Побочный эффект: новая строка **короче** прежнего рендера (`флаг + Leaflet | © OpenStreetMap` → `© OpenStreetMap contributors`), риска распирания узкого HeroBar-локатора (560×152) нет. **3. Дедупликация.** `loadLeaflet()` и константы `LEAFLET_*` были **дословно** (побайтово) скопированы в шести компонентах. Из-за этого правку атрибуции пришлось бы вносить шесть раз, и любая забытая копия молча осталась бы со старым поведением. Вынесено в новый `tradein-mvp/frontend/src/lib/leaflet.ts`: - `loadLeaflet()`, `LEAFLET_VER/CSS/JS/*_SRI` — перенесены **без изменений**; - `OSM_TILE_URL` / `OSM_ATTRIBUTION` / `OSM_MAX_ZOOM`; - `createMap(L, container, options?)` — обёртка над `L.map()`, которая сразу делает `setPrefix(false)`. Возвращает ту же карту, чейнинг `.setView(...)` работает как раньше. Смысл обёртки: при добавлении седьмой карты забыть про флаг физически нельзя. Версия Leaflet и SRI-хэши сохранены как есть, на npm-пакет не переводил — отдельная задача. ## Затронутые файлы Все шесть точек создания карты в МЕРЕ (список перепроверен грепом `L.map(` по всему `tradein-mvp/frontend/src` — других нет): - `components/trade-in/MapCard.tsx` - `components/trade-in/MapPicker.tsx` - `components/trade-in/SaleShareMap.tsx` (карта sale-share) - `components/trade-in/v2/HeroBar.tsx` - `components/trade-in/v2/ParamsPanel.tsx` - `components/trade-in/v2/SourcesMap.tsx` `-281/+185` строк: чистое сокращение за счёт удаления пяти дублей загрузчика. ## Проверено - `npx tsc --noEmit` — **exit 0**, чисто. - `npm run lint` (`next lint`) — **exit 0**. Остались две warning'а в файлах, которых PR не касается и которые были красными до него: `app/scrapers/cian/page.tsx:167` (`CianAuthBanner` unused), `components/trade-in/OfferCard.tsx:208` (`pct` unused). - Грепом подтверждено, что не осталось ни одного локального `const LEAFLET_`, ни одного `function loadLeaflet`, ни одного `"© OpenStreetMap"` и ни одного прямого `L.map(` в компонентах. - Все шесть `loadLeaflet` перед выносом сверены попарно — они были идентичны, поведение при дедупликации не изменилось. - Комментарии в `ParamsPanel.tsx` / `HeroBar.tsx`, ссылающиеся на OSM-атрибуцию и её расположение, перечитаны — остались корректными. ## НЕ проверено (честно) - **Визуально в браузере не смотрел.** Локальный запуск МЕРЫ без бэкенда даёт пустой DOM (RouteGuard), а прод-проверка возможна только после мержа и деплоя. То, что флаг исчез, а ссылка на copyright появилась — вывод из чтения исходника Leaflet 1.9.4 (`Control.Attribution._update` пишет `prefixAndAttribs` в `innerHTML`, пустой prefix просто не пушится в массив), а не наблюдение. **Нужен post-deploy smoke: открыть `/v2` и `/sale-share`, убедиться, что в правом нижнем углу карты нет флага и есть кликабельный «OpenStreetMap contributors».** - `next build` не гонял — CI-гейт для tradein-фронта это `type-check` + `lint`, оба зелёные; импорты покрыты tsc. - Автотестов на карты в репозитории нет, добавлять в рамках этого PR не стал. ## Границы Тронут **только** `tradein-mvp/frontend/`. Основной фронт `frontend/` (Site Finder, Птица) со своими картами и своей проблемой атрибуции не затронут — отдельный PR. `tradein-mvp/frontend/src/app/v2/page.tsx` не трогал.
lekss361 added 1 commit 2026-08-02 10:17:57 +00:00
fix(tradein/maps): убрать украинский флаг Leaflet и починить атрибуцию OSM
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m2s
ed0ed9787f
Leaflet 1.9.4 по умолчанию вшивает украинский флаг в prefix контрола
атрибуции (leaflet-src.js: `var ukrainianFlag = '<svg ...>'` →
`prefix: '<a href="https://leafletjs.com" ...>' + ukrainianFlag + ' Leaflet</a>'`).
Ни в одной карте МЕРЫ prefix не переопределялся, поэтому флаг висел на всех
шести картах. Политического символа в продуктовом UI быть не должно — гасим
через `map.attributionControl.setPrefix(false)` (уносит и подпись Leaflet,
это законно: BSD не требует упоминания в UI).

`attributionControl: false` намеренно НЕ используем — он снёс бы весь контрол
вместе с атрибуцией тайлов, обязательной по ODbL.

Заодно чиним саму атрибуцию тайлов: во всех картах стояло голое
"© OpenStreetMap" — без ссылки на лицензию и без "contributors", что не
соответствует Attribution Guidelines OSMF. Теперь канонический кредит со
ссылкой на openstreetmap.org/copyright.

loadLeaflet() и константы LEAFLET_* были дословно скопированы в шести
компонентах: правку атрибуции пришлось бы вносить шесть раз, и любая забытая
копия молча осталась бы со старым поведением. Вынесено в src/lib/leaflet.ts —
единый загрузчик, константы тайлов/атрибуции и обёртка createMap(), которая
не даёт забыть setPrefix при добавлении новой карты. Версия Leaflet и
SRI-хэши сохранены как есть; переход на npm-пакет — отдельная задача.
lekss361 merged commit d0d0d1fbab into main 2026-08-02 12:12:44 +00:00
lekss361 deleted branch fix/tradein-leaflet-attribution 2026-08-02 12:12:44 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2621
No description provided.