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

.
feat(admin): rebuild the search by an address as a live list
The tabs of the current addresses and of the history count what they find, the results follow the search as it is typed, and an address typed half way is said quietly in place of them. The rows are a table with the address, the proxy, the browser and the time, and the menu of the list of users. AdminUserRowMapper and the user-row component only served this page and are gone.
.
fix(admin): say what the amnesty did without escaped quotes
The message carried " in its msgid from the old templates, and the page escapes it, so the visitor read the entity. It is plain text now.
.
test(admin): cover what a row of the ban panel offers and where its dialog closes to
.
fix(admin): give back the karma of the bans the amnesty clears
Clearing the history of bans truncated the table: the karma each ban cost stayed taken, and MySQL committed whatever transaction was open around it. BanManager::clearAll() deletes every ban the way deleting one does, reading them a portion at a time. Both kinds of amnesty and who may grant it are covered now.
.
refactor(admin): share the tabs of the live lists
The tabs with their counts move out of users/tabs.twig into components/list-tabs.twig, with a block for what can be done to the open tab; the list of users embeds it with the buttons of the registrations.
.
feat(admin): rebuild the ban panel as a live list with tabs, a search and filters
The panel opens on the accounts banned now, with a tab for everybody who has had a ban, a search by nickname or number and a filter by kind; it is ordered by the end of the ban or by the violations from the heads of the columns, which replaces /admin/bans/by-violations. A row lifts its ban in a dialog and returns to the panel, leads to the bans of the account in the panel and to its page. The amnesty is a dialog, and the panel shows its message now. One row per account: the ban and the counts come from subqueries, as a join on the end of the ban repeated an account whose bans end together, which the amnesty makes happen.
.
refactor(admin): share the filters and the hidden state of the live lists
The dropdown with its chip moves out of UserListControlsMapper into ListFilterControl, and the state and filters regions out of users/ into components/, so another list of the panel can use them.
.
feat(admin): rebuild the sign-in log as a live list with a search and filters
The log is a table in a card with the time, the event as a badge, the account, who did it, the address and the details. A search finds the entries by a part of a nickname, an account number or an address; the filters narrow it to one event and a period, and ?user= from the page of an account stays a chip. The filter of the log is an AuthLogFilter now, read and written by AuthLogFilterMapper.
.
test: register the translator in the unit tests that render a message
The gettext helpers exist only once something registers a translator, so these tests failed whenever the random order ran them before any test that did. Found by running every file of the unit suite in a process of its own.
.
fix(forum): forget the paths of the sections between requests
ForumSectionPathService kept the paths it had worked out for the life of the process. The functional suite boots the container once, and on SQLite a rolled back section hands its id to the next one, so a test could read the path of a section of another test: VisitorPlacesTest failed whenever the order put it after one. The service is reset before every request now, like the other request-scoped services.