История коммитов

.
refactor(admin): move the settings pages to Twig
The system settings, the module permissions and the antiflood settings become
@admin/settings.twig, @admin/modules-access.twig and @admin/antiflood.twig; the
three controllers return ViewResponse and drop the Render dependency.

- none of the three receives the whole johncms config any more: each gets the
values its form actually edits
- the current time of the site was computed in the template with date() and
now arrives as a fact
- the six permission blocks of the modules page were copies of one another and
became a loop over the modules the controller describes
.
refactor(admin): move the user moderation pages to Twig
Deleting a user, cleaning up the inactive profiles, the amnesty and the karma
settings become @admin templates; the four controllers return ViewResponse and
drop the Render dependency.

- the karma page no longer receives the whole johncms config, only its karma
settings
- the two hints carrying markup inside their msgid are printed with |raw
.
refactor(admin): move the user lists to Twig
The list of users, the staff, the ban panel, the pending registrations and the
IP search become @admin templates, and the shared row of a visitor becomes
@admin/components/user-row.twig; the five controllers return ViewResponse.

- the name of a visitor and the labels of their action buttons were printed
unescaped, so a name carrying markup reached the page as markup
- whether the address and the user agent may be shown is decided by
AdminUserRowMapper, and the row it builds always carries every key the
template reads
- the PHP closure building the moderation forms is now a macro
.
refactor(admin): move the forum settings and hidden content pages to Twig
The settings page and the lists of hidden posts and topics become
@admin/forum-settings.twig and @admin/forum-hidden-*.twig; the three
controllers return ViewResponse and drop the Render dependency.

- the whole forum config no longer reaches the template, only its settings
- whether the address and the user agent of an author may be shown is decided
by the row mappers, so the templates no longer compare rights themselves,
and the block itself became @admin/components/hidden-item-origin.twig
- the text of a hidden post is Twig\Markup, since the formatter escapes it
.
refactor(admin): move the forum dashboard and structure pages to Twig
Seven pages of /admin/forum become @admin/forum.twig and
@admin/forum-section-*.twig; both controllers return ViewResponse and drop
the Render dependency.

- validation messages of the add form travel as a list instead of a string
glued with <br>
- the access modes and the section types moved to the controller and are
shared by the add and the edit form
- the sections offered to move topics into arrive as rows, not as models
- five translations carried a <br> their msgid does not have, so autoescape
would print the tag as text: the tag is dropped from kk, ky, pl, ru and vi
.
refactor(admin): move the IP ban and whois pages to Twig
The six pages of /admin/ip-bans become @admin/ip-ban*.twig and the whois page
becomes @admin/ip-whois.twig; both controllers return ViewResponse and drop
the Render dependency.

- validation messages travel as a list instead of a string glued with <br>,
and the alert component prints them one per line
- the highlighting of a whois answer moves out of the template into
IpWhoisHighlighter, which escapes the answer and returns Twig\Markup
- the list of bans takes show_actions instead of no_buttons
.
refactor(admin): move the language pages to Twig
/admin/languages and its management page become @admin/languages.twig and
@admin/languages-manage.twig; the controller returns ViewResponse and drops
the Render dependency.

- the whole johncms config no longer reaches the template: the language list
arrives as rows of code, name and active
- entries of the remote language catalog are normalised in the controller, so
the template reads the same keys whatever the source
- the PHP closure building the install/update/delete forms is now a macro
.
refactor(admin): move the advertising pages to Twig
The list, the form and the confirmation of /admin/ads become @admin/ads.twig,
@admin/ad-form.twig and @admin/ad-confirm.twig; the controller returns
ViewResponse and no longer depends on Render.

- the PHP closure that glued the reorder forms together is now a Twig macro
- the option lists of the radio groups moved to the controller, and the place
filters of the list are built from the same source
- the two hints carrying a <br> inside their msgid are printed with |raw
.
feat(console): generate ide-twig.json for IDE template navigation
The Twig namespaces are a convention of the application, so an IDE cannot
resolve @namespace template names on its own. The new twig:ide-config command
writes ide-twig.json from TemplatePathRegistry, the same source the runtime
loader uses.

- twig:ide-config [--theme=default] [--check]
- ide-twig.json is committed; the verification gate runs --check so a module
added to the configuration cannot leave it stale
.
refactor(admin): move the counters pages to Twig
Five .phtml become @admin/counters.twig, counter-{view,form,preview,delete-confirm}.twig, and the error branch moves to @admin/pages/result.twig. The list builds its up and down forms with a macro instead of a closure that wrote HTML by hand.

The snippets keep being printed as they are on the view and the preview pages: that is what the pages are for — an administrator checks there that the counter really runs before saving it.