diff --git a/.gitignore b/.gitignore index c439cf649..88248e777 100644 --- a/.gitignore +++ b/.gitignore @@ -139,6 +139,7 @@ src/bpp/static/bpp/scss/*.css src/bpp/static/bpp/scss/*.css.map src/bpp/static/bpp/css/admin-themes.css src/bpp/static/bpp/css/admin-filter-panel.css +src/bpp/static/bpp/css/admin-print.css src/bpp/static/scss/*.css src/bpp/static/scss/*.css.map src/przemapuj_zrodla_pbn/static/przemapuj_zrodla_pbn/css/przemapuj-zrodla.css diff --git a/Gruntfile.js b/Gruntfile.js index d0db4c9f2..1aada7211 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -75,6 +75,12 @@ module.exports = function (grunt) { 'src/bpp/static/bpp/scss/admin-filter-panel.scss' } }, + adminprint: { + files: { + 'src/bpp/static/bpp/css/admin-print.css': + 'src/bpp/static/bpp/scss/admin-print.scss' + } + }, przemapuj_zrodla: { files: { 'src/przemapuj_zrodla_pbn/static/przemapuj_zrodla_pbn/css/przemapuj-zrodla.css': @@ -172,6 +178,7 @@ module.exports = function (grunt) { 'sass:uafm', 'sass:adminthemes', 'sass:adminfilterpanel', + 'sass:adminprint', 'sass:przemapuj_zrodla', 'sass:deduplikator_autorow', 'sass:deduplikator_zrodel', diff --git a/src/bpp/newsfragments/print-styles.feature.rst b/src/bpp/newsfragments/print-styles.feature.rst new file mode 100644 index 000000000..7157c46e5 --- /dev/null +++ b/src/bpp/newsfragments/print-styles.feature.rst @@ -0,0 +1,8 @@ +Uporządkowane style wydruku (``@media print``) dla serwisu publicznego +i panelu administracyjnego: znika nawigacja, stopka, banery i widgety, +tło jest białe zamiast szarego, a skala typografii została sprowadzona do +rozmiarów dokumentu (tekst 10,5 pt, nagłówki 11–16 pt) zamiast ekranowych +``rem``. Naprawione też: martwa klasa ``hide-on-print`` (nie miała +definicji w CSS, więc przycisk zgłoszeń i banery serwera testowego mimo +wszystko się drukowały), ignorowane ustawienia marginesów strony +z django-constance oraz pusta pierwsza strona wydruków z admina. diff --git a/src/bpp/static/bpp/scss/admin-print.scss b/src/bpp/static/bpp/scss/admin-print.scss new file mode 100644 index 000000000..9469f2bca --- /dev/null +++ b/src/bpp/static/bpp/scss/admin-print.scss @@ -0,0 +1,369 @@ +// ============================================================================= +// PRINT STYLES — panel administracyjny (Grappelli) +// +// OSOBNY ENTRYPOINT, a nie sekcja w admin-themes.scss — bo admin-themes.css, +// admin-style.css i admin-menu.css sa linkowane w admin/base_site.html +// z atrybutem media="screen". Cokolwiek dopisane tam do @media print +// przegladarka pobierze, ale NIGDY nie zastosuje. Ten plik jest linkowany +// bez media="screen" (patrz admin/base_site.html), a jego tresc siedzi +// w @media print, wiec na ekranie nie zmienia niczego. +// +// Odpowiednik dla serwisu publicznego: src/bpp/static/scss/_print.scss +// +// Grappelli (grappelli/stylesheets/screen.css) jest linkowane z media="all", +// wiec JEGO reguly obowiazuja rowniez na wydruku — i to z nimi walczymy nizej. +// ============================================================================= + +@media print { + + // =========================================================================== + // 1. UKLAD — dwie pulapki Grappelliego + // =========================================================================== + // + // (a) `#grp-content { padding: 80px 20px 50vh }`. To `50vh` na dole jest + // zabojcze: na ekranie rezerwuje miejsce pod przyklejona stopke z + // przyciskami, ale przy druku 1vh to 1% wysokosci PUDELKA STRONY, wiec + // kazdy wydruk z admina konczyl sie POLOWA PUSTEJ KARTKI (a przy + // krotkiej tresci — cala pusta strona wiecej). Gorne 80px robilo + // miejsce pod `position: fixed` naglowek, ktorego i tak nie drukujemy. + // + // (b) `#grp-header { position: fixed }` oraz + // `.grp-fixed-footer { position: fixed; bottom: 0 }`. Elementy fixed + // przy druku laduja na pierwszej stronie NA tresci. Oba i tak ukrywamy + // w sekcji 2, ale zdejmujemy tez pozycjonowanie — na wypadek, gdyby + // ktorys szablon nadpisal `display`. + #grp-content { + padding: 0 !important; + float: none !important; + width: auto !important; + position: static !important; + } + + #grp-container, + #grp-content-container { + margin: 0 !important; + padding: 0 !important; + width: auto !important; + float: none !important; + position: static !important; + } + + #grp-header, + .grp-fixed-footer { + position: static !important; + } + + // (c) Grappelli uklada liste zmian i moduly formularza na FLOATACH + // (`.grp-changelist-results { float: left }`). Wysoki float NIE dzieli + // sie miedzy strony wydruku — przegladarka przepycha go w calosci na + // nastepna strone. Efekt: pierwsza kartka zawierala sam tytul i byla + // poza tym pusta, a tabela zaczynala sie dopiero od strony 2. + // W normalnym przeplywie tresc fragmentuje sie prawidlowo. + #grp-changelist, + #grp-changelist-form, + .grp-changelist-results, + .grp-module, + .grp-group { + float: none !important; + clear: none !important; + width: auto !important; + } + + // Grappelli maluje ciemne paski naglowka/stopki gradientami; na papierze + // schodzi na to toner i nic nie wnosi. + html, + body, + #grp-container, + #grp-content, + #grp-content-container, + .grp-module { + background: #fff !important; + background-image: none !important; + color: #000 !important; + } + + // Baner serwera testowego wstrzykuje `body { background-image: url(...) }` + // inline w admin/base.html — inline style bije selektor, stad !important + // wyzej nie wystarczy dla `background-image`; deklarujemy osobno. + body { + background-image: none !important; + } + + // =========================================================================== + // 2. CHROME ADMINA — naglowek, nawigacja, narzedzia + // =========================================================================== + + #grp-header, + #grp-navigation, + #grp-admin-title, + #grp-user-tools, + #grp-context-navigation, + #grp-breadcrumbs, + #grp-page-tools, + #nav-global-container, + #grp-toc-handler { + display: none !important; + } + + // =========================================================================== + // 3. STEROWANIE — przyciski, akcje, filtry, wyszukiwarka, paginacja + // =========================================================================== + // + // Wszystko, czego nie da sie kliknac na kartce. Formularzy jako calosci + // NIE ukrywamy — na change_form wartosci pol SA trescia wydruku. + + .grp-submit-row, + .grp-object-tools, + .grp-changelist-actions, + #grp-changelist-search-form, + .grp-search, + .grp-pagination, + .grp-add-link, + .grp-delete-link, + .grp-cancel-link, + .grp-reset-link, + #grp-open-all, + #grp-close-all, + .grp-messagelist, + .bpp-support-button, + .countdown-banner, + .maintenance-banner, + .hide-on-print, + .hide-for-print { + display: none !important; + } + + // Panel filtrow: prawa kolumna Grappelliego oraz wlasny panel BPP + // (admin-filter-panel.scss, ladowany w admin/change_list.html). + #grp-filters, + .grp-filter, + #filter-panel-toggle, + .filter-panel, + .filter-panel-overlay, + .loading-overlay, + .filter-loading-indicator, + .htmx-error-toast { + display: none !important; + } + + // Kolumna z checkboxami zaznaczania rekordow na liscie zmian — na papierze + // to pusty pasek zjadajacy szerokosc tabeli. + .action-checkbox-column, + td.action-checkbox, + th.action-checkbox-column, + #result_list .action-checkbox { + display: none !important; + } + + // Teksty pomocy pod polami. Na ekranie tlumacza dzialanie przyciskow + // ("Kliknij Uzupelnij, zeby..."), na papierze to kilkanascie linii + // instrukcji do klikania w czyms, czego kliknac nie mozna — czysty szum, + // ktory na formularzu wydawnictwa potrafil dolozyc kilka kartek. + .grp-help, + .grp-help-tooltip, + p.help, + .help, + .helptext { + display: none !important; + } + + // Przyciski akcji wewnatrz formularza (Uzupelnij, pobierz z PBN, ikonki + // narzedzi). Wartosci pol zostaja — znika tylko sterowanie. + input[type="button"], + input[type="submit"], + input[type="reset"], + a.grp-button, + .grp-tools, + .grp-button { + display: none !important; + } + + // Kazdy