feat(17-04): menu plugin admin with registry types, URL checks and tree reorder

- golem15.menu plugin, tables golem15_menu_menus and golem15_menu_menu_entries with the PHP columns plus a nullable url_pattern (D-02)
- MenuEntry BeforeSave ports PHP beforeSave: nest columns 0, menu from the parent, sort_order after the menu's last
- entry type dropdown: url, divider and the signpost registry types; reference depends on type through signpost.ReferenceOptions
- URL scheme allowlist (errors.url_scheme), target _self or _blank, menu and parent cycle checks
- menu filter, toolbar reorder/create/delete and config_reorder.yaml partitioned by menu
- navigation Menus with Menus and Menu entries, permission golem15.menu.manage_menu, en and pl phrasebooks
- TestMenuAdminSmoke
This commit is contained in:
2026-10-12 17:30:50 +02:00
commit 08f99b8aad
34 changed files with 2197 additions and 0 deletions

47
lang/en/lang.yaml Normal file
View File

@@ -0,0 +1,47 @@
plugin:
name: Menus
description: Site menus with links, dividers and content entries.
permissions:
manage_menu: Manage site menus
models:
general:
id: ID
created_at: Created At
updated_at: Updated At
menu:
label: Menu
label_plural: Menus
name: Name
code: Code
css_class: CSS class
is_active: Active
menuentry:
label: Menu entry
label_plural: Menu entries
menu: Menu
menu_comment: Entries with a parent belong to the parent's menu.
parent: Parent
type: Type
type_url: Link
type_divider: Divider
title: Title
url: URL
url_comment: Used by Link entries. Start with http://, https://, mailto:, tel:, / or #.
reference: Reference
reference_comment: The record this entry points to, for types that need one.
url_pattern: URL pattern
url_pattern_comment: Use :placeholder syntax, e.g. /blog/:slug
code: Code
icon: Icon
css_class: CSS class
target: Opens in
target_self: Same tab
target_blank: New tab
is_published: Published
reorder_title: Reorder menu entries
errors:
url_scheme: Use a link that starts with http://, https://, mailto:, tel:, / or #.
target: Choose Same tab or New tab.
type_unknown: Choose one of the listed types.
menu_required: Choose a menu or a parent entry.
parent_cycle: An entry cannot be placed under itself or one of its own entries.

47
lang/pl/lang.yaml Normal file
View File

@@ -0,0 +1,47 @@
plugin:
name: Menu
description: Menu strony z linkami, separatorami i pozycjami treści.
permissions:
manage_menu: Zarządzanie menu strony
models:
general:
id: ID
created_at: Utworzono
updated_at: Zaktualizowano
menu:
label: Menu
label_plural: Menu
name: Nazwa
code: Kod
css_class: Klasa CSS
is_active: Aktywne
menuentry:
label: Pozycja menu
label_plural: Pozycje menu
menu: Menu
menu_comment: Pozycje z pozycją nadrzędną należą do jej menu.
parent: Pozycja nadrzędna
type: Typ
type_url: Link
type_divider: Separator
title: Tytuł
url: URL
url_comment: Dla pozycji typu Link. Zacznij od http://, https://, mailto:, tel:, / lub #.
reference: Odnośnik
reference_comment: Rekord, do którego prowadzi pozycja, dla typów, które go wymagają.
url_pattern: Wzorzec URL
url_pattern_comment: Użyj składni :placeholder, np. /blog/:slug
code: Kod
icon: Ikona
css_class: Klasa CSS
target: Otwieraj w
target_self: Tej samej karcie
target_blank: Nowej karcie
is_published: Opublikowane
reorder_title: Zmiana kolejności pozycji menu
errors:
url_scheme: Podaj link zaczynający się od http://, https://, mailto:, tel:, / lub #.
target: Wybierz Tej samej karcie lub Nowej karcie.
type_unknown: Wybierz jeden z typów z listy.
menu_required: Wybierz menu albo pozycję nadrzędną.
parent_cycle: Pozycji nie można umieścić pod nią samą ani pod jej własnymi pozycjami.