Skip to content

fix(importer_publikacji): kafelki jak w kreatorze zgłoszeń, Wstecz bez starego układu, autodetekcja języka - #803

Open
mpasternak wants to merge 3 commits into
devfrom
fix-kafelki-importera-i-historia
Open

fix(importer_publikacji): kafelki jak w kreatorze zgłoszeń, Wstecz bez starego układu, autodetekcja języka#803
mpasternak wants to merge 3 commits into
devfrom
fix-kafelki-importera-i-historia

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Trzy niezależne poprawki w importerze publikacji, zgłoszone w jednej sesji.

1. Kafelki wyboru źródła wyglądały inaczej niż w kreatorze zgłoszeń

Kafle importera to <a class="tile-card"> stojące wewnątrz .callout, więc
łapała je globalna reguła z flash_messages.css:

.callout a:not(.close-button)       { font-weight: bolder; … }
.callout a:not(.close-button):hover { text-decoration: underline; }

Efekt: pogrubiony cały kafel — razem z opisem, który miał być zwykłą
czcionką — i podkreślenie wszystkich linii tekstu po najechaniu myszą. Kafle
kreatora „Zgłoś publikację" wyglądają dobrze wyłącznie dlatego, że są
<label>, a nie <a>, więc reguła ich nie dotyczy.

Neutralizuje styl linku dla .callout a.tile-card (specyficzność remisowa
0,2,1, rozstrzygana kolejnością importu: wizard_forms idzie po common
we wszystkich motywach). Ikona dostaje kolor motywu jako jedyny akcent, a
kafle na obu ekranach unoszą się delikatnie pod kursorem — z wyłączeniem
przy prefers-reduced-motion.

2. „Wstecz" przywracał układ kroku 1 sprzed przebudowy

Po wejściu na importer, kliknięciu kafla i naciśnięciu „Wstecz" część
przeglądarek pokazywała radiowy wybór źródła i listę sesji pod spodem —
layout usunięty w c2a63f932, nieobecny już nawet w kodzie.

Źródłem jest cache historii HTMX-a w localStorage. hx-history="false" na
#importer-wizard blokuje wyłącznie zapis snapshotu; restoreHistory()
czyta cache bezwarunkowo. Wpis zapisany przed dodaniem tej flagi przeżywał
więc bezterminowo — i, skoro zapisu nigdy już nie będzie, nic nie miało go
nadpisać (HTMX podmienia wpis o danym URL-u dopiero przy zapisie, a LRU
wyrzuca go dopiero po 10 innych stronach z HTMX-em).

Nowy history_cache.js kasuje przy wejściu wpisy z prefiksem URL-a
importera, zostawiając cudze (np. liveops). Ładowany przed htmx.min.js,
prefiks wstrzykuje szablon przez data-prefiks.

3. Autodetekcja języka nie działała poza polskim

Import pracy z language="en" (np. DOI 10.1007/s00005-017-0485-3
z CrossRef) zostawiał pole „Język" puste, mimo że dostawca jawnie podaje
język.

_resolve_jezyk — i Komparator.porownaj_language przed nim — pytają
wyłącznie o Jezyk.skrot_crossref. Tę kolumnę wypełnia jedynie migracja
0410, i tylko dla polskiego; enum Jezyk.SKROT_CROSSREF ogranicza przy tym
listę wyboru w adminie do en / es / pl, więc redakcja nie ustawi tam np.
„de". Na czystej instalacji jedynym rozpoznawanym językiem był polski,
a fallback z FD#389 (pomyślany właśnie dla de/fr/ru/uk) był w praktyce
nieosiągalny. Testy FD#389 tego nie łapały, bo same zakładały rekord
Jezyk z ustawionym skrot_crossref — czyli stan, którego produkcja nie ma.

Poprawne kody ISO są w BPP od dawna, tyle że w innej kolumnie: kod_bcp47,
wypełnianej kuratorsko przez fixture jezyk.json i migrację 0480 (pl, en,
de, fr, es, ru, it). _resolve_jezyk sięga po nią, gdy skrot_crossref nic
nie zwróci — jawne mapowanie redakcji zachowuje pierwszeństwo. Region jest
pomijany po obu stronach (en-GBen). Ta sama ścieżka obsługuje język
streszczeń.

Bez migracji danych — działa od razu po wdrożeniu, na istniejących danych
referencyjnych.

Weryfikacja

  • pytest src/importer_publikacji/ src/crossref_bpp/ — 914 passed, 1 skipped
  • vitest tests/js/importer-history-cache.test.js — 7 passed
  • pre-commit — exit 0
  • Błąd z „Wstecz" odtworzony w przeglądarce przed poprawką (HTMX wstawiał
    podstawiony snapshot bez zapytania do serwera) i sprawdzony po niej
  • Punkt 3 sprawdzony na dumpie produkcyjnym przez realne API CrossRef: dla
    tego DOI sesja dostaje język „angielski". Test domyka też koniec ścieżki —
    krok „Weryfikacja" renderuje wykryty język jako selected

Znane ograniczenie (poza zakresem)

Pełne pokrycie mają języki skonfigurowane kuratorsko: pl, en, de, fr, es, ru,
it. Pozostałe rekordy mają w kod_bcp47 kody trzyliterowe wzięte ze skrótu
(ces, nld, ukr), a CrossRef i langdetect zwracają dwuliterowe — więc np.
praca czeska nadal nie dopasuje języka. Domknięcie wymaga tablicy
ISO 639-1 ↔ 639-2.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Dmq7jpU52KwQwPLp689ny6

mpasternak and others added 3 commits September 6, 2026 07:03
Kafle wyboru źródła danych w importerze to `<a class="tile-card">` stojące
wewnątrz `.callout`, więc łapała je globalna reguła z `flash_messages.css`:

    .callout a:not(.close-button)       { font-weight: bolder; … }
    .callout a:not(.close-button):hover { text-decoration: underline; }

Efekt: pogrubiony CAŁY kafel — razem z opisem, który miał być zwykłą
czcionką — i podkreślenie wszystkich linii tekstu po najechaniu myszą.
Kafle kreatora „Zgłoś publikację" wyglądają dobrze wyłącznie dlatego, że są
`<label>`, a nie `<a>`, więc reguła ich nie dotyczy.

Neutralizuje styl linku dla `.callout a.tile-card` (specyficzność remisowa
0,2,1, rozstrzygana kolejnością importu: `wizard_forms` idzie po `common`
we wszystkich motywach). Ikona dostaje kolor motywu jako jedyny akcent,
a kafle na obu ekranach unoszą się delikatnie pod kursorem — z wyłączeniem
przy `prefers-reduced-motion`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dmq7jpU52KwQwPLp689ny6
… kroku 1

Po wejściu na importer, kliknięciu kafla i naciśnięciu „Wstecz" część
przeglądarek pokazywała ekran sprzed przebudowy kroku 1 — radiowy wybór
źródła i listę sesji pod spodem — czyli layout, którego nie ma już nawet
w kodzie (usunięty w c2a63f9).

Źródłem jest cache historii HTMX-a w localStorage. `hx-history="false"` na
`#importer-wizard` blokuje wyłącznie ZAPIS snapshotu; `restoreHistory()`
czyta cache bezwarunkowo. Wpis zapisany przed dodaniem tej flagi przeżywał
więc bezterminowo — i, skoro zapisu nigdy już nie będzie, nic nie miało go
nadpisać (HTMX podmienia wpis o danym URL-u dopiero przy zapisie, a LRU
wyrzuca go dopiero po 10 innych stronach z HTMX-em).

Nowy `history_cache.js` kasuje przy wejściu wpisy z prefiksem URL-a
importera, zostawiając cudze (np. liveops). Ładowany przed htmx.min.js,
prefiks wstrzykuje szablon przez `data-prefiks`.

Odtworzone i zweryfikowane w przeglądarce: przed poprawką „Wstecz" wstawiał
podstawiony snapshot bez pytania serwera, po poprawce wraca pełna strona
z kafelkami.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dmq7jpU52KwQwPLp689ny6
…ncyjnych

Import pracy z `language="en"` (np. DOI 10.1007/s00005-017-0485-3 z CrossRef)
zostawiał pole „Język" puste, mimo że dostawca jawnie podaje język.

Przyczyna: `_resolve_jezyk` — i `Komparator.porownaj_language` przed nim —
pytają wyłącznie o `Jezyk.skrot_crossref`. Tę kolumnę wypełnia jedynie
migracja `0410`, i tylko dla polskiego; enum `Jezyk.SKROT_CROSSREF` ogranicza
przy tym listę wyboru w adminie do {en, es, pl}, więc redakcja nie ustawi tam
np. „de". Na czystej instalacji BPP jedynym rozpoznawanym językiem był więc
polski, a fallback z FD#389 (pomyślany właśnie dla de/fr/ru/uk) był w praktyce
nieosiągalny. Testy FD#389 tego nie łapały, bo same zakładały rekord `Jezyk`
z ustawionym `skrot_crossref` — czyli stan, którego produkcja nie ma.

Poprawne kody ISO są w BPP od dawna, tyle że w innej kolumnie: `kod_bcp47`,
wypełnianej kuratorsko przez fixture `jezyk.json` i migrację `0480` (pl, en,
de, fr, es, ru, it). `_resolve_jezyk` sięga po nią, gdy `skrot_crossref` nic
nie zwróci — jawne mapowanie redakcji zachowuje pierwszeństwo. Region jest
pomijany po obu stronach (`en-GB` ↔ `en`), bo i CrossRef, i langdetect
potrafią go zwrócić. Ta sama ścieżka obsługuje język streszczeń.

Testy pokrywają całą drogę, także jej koniec: krok „Weryfikacja" musi
wyrenderować wykryty język jako `selected` w liście wyboru — bez tej asercji
samo mapowanie mogłoby być zielone przy pustym polu w formularzu.

Zweryfikowane na dumpie produkcyjnym i realnym API CrossRef: dla tego DOI
sesja importu dostaje teraz język „angielski".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dmq7jpU52KwQwPLp689ny6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant