feat(12.2-04): add the fileupload field with deferred uploads on the form session key

- sessionKey.ts: one 32-byte base64url key per form mount, sent only in headers
- api/files.ts: FileRoutes over the record and child file routes, XHR upload with progress, 401 refresh and retry
- FileuploadField and FileCaptionModal per UI-SPEC section 3: dropzone, image grid, rows, per-item states, client pre-checks, reorder, protected previews
- FormView provides FORM_SESSION, counts pending changes as dirty and sends X-Session-Key on create and update
- fileupload lang keys in en and pl, admin-spa docs note, deferred smoke test, rebuilt dist
This commit is contained in:
Jakub Zych
2026-10-02 19:22:22 +02:00
parent 1ebfe691a2
commit ea33296799
22 changed files with 2338 additions and 15 deletions

View File

@@ -112,6 +112,44 @@ extension:
widget_failed: Nie udało się wczytać tej kontrolki. Odśwież stronę, a jeśli błąd wróci, sprawdź zasoby wtyczki.
partial_failed: Nie udało się wczytać tej sekcji. Odśwież stronę, aby spróbować ponownie.
action_failed: Nie udało się wykonać akcji. Spróbuj ponownie.
fileupload:
attachment: Szczegóły załącznika
help: Dodaj tytuł oraz opis załącznika.
title_label: Tytuł
description_label: Opis
default_prompt: Przeciągnij plik tutaj lub kliknij, aby przesłać
default_prompt_many: Przeciągnij pliki tutaj lub kliknij, aby przesłać
upload_file: Prześlij plik
replace_file: Zamień plik
remove_file: Usuń plik
upload_error: Błąd przesyłania
upload_failed: Nie udało się przesłać pliku. Spróbuj ponownie.
retry: Ponów
too_large: "Plik :name jest większy niż :size. Wybierz mniejszy plik."
wrong_type: "Plik :name ma niedozwolony typ. Dozwolone: :types."
too_many:
one: "Osiągnięto limit plików (:max). Nie dodano :count pliku."
few: "Osiągnięto limit plików (:max). Nie dodano :count plików."
many: "Osiągnięto limit plików (:max). Nie dodano :count plików."
other: "Osiągnięto limit plików (:max). Nie dodano :count plików."
limits_types: "Dozwolone: :types"
limits_size: "do :size"
limits_count: "Pliki: :current z :max"
uploading: "Przesyłanie… :percent%"
queued: Oczekuje…
unsaved: Niezapisany
move: "Przenieś: :name"
moved: "Przeniesiono :name na pozycję :position z :total."
reorder_failed: Nie udało się zapisać nowej kolejności. Przywrócono poprzednią.
edit_details: "Edytuj szczegóły: :name"
download: "Pobierz: :name"
open_preview: "Otwórz: :name"
preview_unavailable: Brak podglądu
load_failed: Nie udało się wczytać plików. Odśwież stronę, aby spróbować ponownie.
cancel_upload: "Anuluj przesyłanie: :name"
details_saved: Zapisano szczegóły załącznika
details_submit: Zapisz szczegóły
empty: Brak plików
messages:
list:
record_count: