Журнал изменений
"Журналы" leave "Безопасность" for a section of their own, and the settings of the copies and the scanner move to the forms of their jobs. The repeated audit of the panel fixes what axe and a live screen reader found over 249 screens. The lasting part of the panel plan moves into the documents, with the page measurements it left for this step. The three share files down to the language files and the probes, so they land together at the owner's word.
Core changes:
- The journals (admin/modules/logs.php, admin/modules/security.php, admin/modules/scheduler.php):
- name=logs holds the list, op=logview, op=logins, op=download and op=delete under the token and the journal of logs
- the first tab of "Безопасность" is the ban list with the verdict of the self-check
- log_b, dump_age, log_d, dump_skip and mail_d stand on the forms of the jobs dbbackup and filescan
- every form writes its own fields, so configsave() no longer loses proxy (SecurityFormTest)
- sess_d, sess_b and their constants are gone, _LOGS replaces _MONITOR_LOGS
- The audit (public/templates/admin, public/plugins/system/slaed.js, public/plugins/editors/toastui, tools/label-audit.mjs):
- landmarks and names: one main on a page, the login and setExit() in the admin theme, the lamps, the code blocks, the editor
- keys and state: Space sorts by a head cell, a strip of links marks its page with aria-current
- targets and contrast: 24 px or the spacing of WCAG 2.5.8, the strong tones of the light scheme, the skin of Toast UI
- the file manager keeps a long name in its ellipsis, a phone scrolls its table
- an address of the panel that names no section answers 404 (AdminLogTest)
- the label crawl opens the screens it passed by, tools/ui-audit-baseline.json and tools/ui-contrast.json stored anew
- The reference (docs/TEMPLATES.md, docs/ARCHITECTURE.md, docs/PERFORMANCE.md, admin/info/panel/ru.md):
- "Parts Of A Screen", "The Engine Of The Parts" and "What the audit of the panel left" in the templates
- the two lamps, the data of "Статистика" and "Мониторинг", the robots and the sections that stay apart in "Admin Shell Boundary"
- the generation, the queries and the polls of both screens, measured on the stand
- section 12 of the help of the panel, and the words of removed things out of two help pages
Benefits:
- A journal is found where its name says, and the settings of a job stand beside that job
- The panel passes axe at two widths in both schemes, with what stays listed and reasoned in the documents
- The plan file can go: what the series decided and measured stands in the tree
Technical notes:
- config/security.php loses sess_b and sess_d, config/modules.php gains the row logs; setUpdateConfig() and setUpdateMerge() drop the keys from a site
- Not breaking for a site: the merge of an update adds the section; the addresses name=security&op=logview and op=logins are gone
- StatisticDataTest::theArchiveHasItsGap stays red since 2026-11-01: statistic_probe.php calls getStatArchive() without its clock, a defect of the test
"Фавориты" become a tab of "Пользователи", "Замена слов" a page of "Конфигурации", and "Сообщения" give way to blocks, so the menu loses three sections. The request reading stops blocking on a match and reports it instead, the member cookie, the recovery code and the logout stop trusting what a stolen row or a foreign page can supply, and no address carries a token. The two works share files and lines down to the language files and the probes, so they land together at the owner's word.
Core changes:
- The favorites (modules/account/admin/index.php, public/templates/admin/fragments/list-filter.html):
- op=favorites, op=favconf, op=favsave and op=favdrop under the token of account, getAccountTabs() for the seven copies of the strip
- the link of the settings in the filter bar through link_url and link_text
- admin/modules/favorites.php, its help and its row are gone, config/favorites.php stays
- The word replacement (admin/modules/config.php, admin/modules/modules.php):
- op=replace with one form per type of getNodeTypeMap(), op=replacesave writes its own key and no empty pair
- _BLOCKS_PAGEHINT on the two lists of a module, the help of "Дополнительные поля" written from the code
- admin/modules/replace.php, its help, its row and the dead case mailtest are gone, config/replace.php stays
- The site messages (admin/modules/blocks.php, core/user.php, core/system.php, public/update.php, storage/update/sql/):
- the content of a block is edited in getTplTextarea() with the store blocks.content, a TEXT of 64 KB without embeds
- addsave() and editsave() refuse a text over the column with a page before any query
- setMessageShow(), admin/modules/messages.php, the setting message, _MESSAGE_BOX, is_message_box, .sl-message-box and _message are gone
- the update drops the table without its rows; setUpdateConfig() and setUpdateMerge() take the key out
- the help of "Блоки" tells how to make an announcement and which field turns the zone of the home on
- The request reading (core/security.php, core/classes/captcha.php):
- checkRequestData() replaces the four checks: only ../, <script and a stream wrapper in a GET value stop a request, the rest is a notice of hack.log
- a ban takes the address alone, keeps at most 1000 automatic rows, and one security mail leaves per hour
- getIp() trusts REMOTE_ADDR unless it is a proxy of security.proxy; flood, flood_t and ref_post are gone
- The logins and the accounts (core/system.php, modules/account/index.php, core/classes/mail.php):
- Captcha::isLoginLimited() closes an address after 5 misses on a name or 30 on all
- the member cookie carries getUserToken(), a recovery code is keyed and ends within two hours
- the password is read as typed and getPassMatch() still opens a hash stored from an escaped form
- a sent mail of the kinds account and admins keeps no body, a change of the address asks the current password
- the session cookie is HttpOnly and SameSite=Lax, every login regenerates the id
- The tokens and the output (public/index.php, core/admin.php, core/helpers.php, public/plugins/system/, public/templates/):
- a page holds its token in meta sl-token, scripts send it by header, and nothing reads a token from the address
- a scope takes its own token alone, a logout is a POST with a token
- filterTrustedTags() runs last in the text filters, filterWebUrl() empties any scheme but http and https
- only a super administrator edits an info page
- Tests and tools (tests/, tools/hooks/pre-commit, tools/label-audit.mjs):
- ReplaceRuleTest, RequestWatchTest and TokenScopeTest are new, BlocksTest holds the refusal over the column
- the journal of route_probe.php runs through "Голосования", the update probes move their message rows to the newsletter
- the commit hook refuses a staged master secret whatever else is skipped
Benefits:
- the menu of the panel holds three sections less, each moved where its data is used
- a read of the database alone forges no login and no recovery, and a stolen address carries no token
Technical notes:
- Breaking: every member logs in once more after the update, and a bookmark to name=favorites, name=replace or name=messages opens no page
- Breaking: the update drops _message with its rows; a message still needed goes into a block before it
- The shipped home keeps the zone c off (top 3), so an announcement needs the field the help names
- The stand database dropped _message; another stand runs DROP TABLE <prefix>_message
- config/layout.php of the stand stays out of the commit, config/security.php carries its secret empty
"Загрузки" becomes "Файловый менеджер". "Редактор" and "Шаблон" leave as sections: their files open in the one browser, a theme as a context that only views and edits, in place of one editor per file on a single page. The screens of the block files and of the XSL stay where they are and save through the same writer, so a stale save is refused everywhere.
Core changes:
- The file layer (core/classes/filemanager.php, core/admin.php):
- the context theme of FileManager over public/templates/<theme>: browse, preview, download and edit alone
- .htaccess and xsl open in the source editor, as apache and xml
- getAdminFileTheme() takes a folder name and builds no path from the client, getAdminFileQuery() carries ctx and templ
- getAdminFileBack(), getAdminFileHome() and getAdminFileRel() replace the addresses and names each screen spelled out
- getAdminFileLinks(): direct links to robots.txt, .htaccess and header.php over the tree of the system files
- The section (admin/modules/uploads.php, config/modules.php):
- the tab op=theme with the list of themes and the warning of Update::THEMES, the tab "Шаблоны вложений"
- getUploadsTabs() replaces the seven copies of the strip
- getRobotsTemplate() and the button of the standard rules move here, into the foot of the editor of that file
- the row uploads takes _EUPLOAD, the rows editor and template are gone; the key name=uploads does not change
- One writer (admin/modules/blocks.php, modules/sitemap/admin/index.php):
- filecodesave() and xslsave() write through setFileBody(), a new file first through addFileEntry()
- a stale save answers 409 and keeps the typed text (getBlockCodeForm(), getXslForm())
- The removed sections (admin/modules/, admin/info/, admin/lang/):
- editor.php, template.php and their help are deleted, the help of the section holds what is current
- _EFUNC, _EHEAD, _EHT, _EINFO, _EROB, _ERON, _ESAVED with their variants, _TEMPLATES and _STYLES leave the six locales
- _UPLOADS_TPLS and _UPLOADS_QUICK are added, _EROBSTD and _EINFOPHP stay
- The stub and the update (config/system.php, core/system.php, core/classes/update.php, public/update.php):
- config/system.php, which nothing included, is deleted with its place in the loader, setConfigFile() and isSiteFile()
- setUpdateModules() moves the file of an old site to system.php.old, as the loader would now require it, and stops when it cannot
- setUpdateModules() renames a stored _UPLOADS to _EUPLOAD; the records of the two sections drop as any without a module
- Templates (public/templates/admin/):
- the strip of the direct links in file-browser.html, the slot of window-foot-edit.html, the button of the robots rules
- Reference (docs/, UPGRADING.md, CONTRIBUTING.md, admin/info/, modules/*/admin/info/):
- "Compile And Render" and "Editing A Theme From The Panel" in docs/TEMPLATES.md, the entry in docs/VERSIONS.md
- UPGRADING.md names the new addresses and what to do with code left in config/system.php
- Tests and tools (tests/, tools/):
- FileManagerEditTest holds the theme context and the one writer, FileManagerCatalogTest the root of the area
- UpdateSetupTest holds the rename and the move of the old file, its failure included
- the probes and ReleaseToolTest take header.php as the reserved file; ui-shots.json and ui-contrast.json name the new pages
Benefits:
- A theme opens one file at a time instead of 221 editors on one page
- Every save of a file of the panel compares a version under the directory lock
- Four sections become one, where an administrator looks for files
Technical notes:
- The screens name=editor and name=template are gone; every other address of name=uploads stays
- config/header.php opens whole, with its first lines, which are no longer stripped and added back
- A theme now edits any text file up to 2 MB, not only html and css; the screen is the super administrator's alone
- No schema change; a site rebuilds config/local.php for the new section registry
The queue and the undeliverable addresses already served all the mail of the site, while its transport lay in a tab of the general settings. The transport, the test letter and the frame of a letter now stand in the section that shows what they do, and each form writes what belongs to it. The key name=newsletter does not change.
Core changes:
- The mail section (admin/modules/newsletter.php):
- getMailPanel(), getMailRow() and mailtest() move here, the tab "Транспорт" shows them
- op=mailconf renders the form with the settings find, op=mailsave stores it, op=mailtest queues the test letter
- the three take the token of the section, and both modules stay the main administrator's
- mailsave() writes config/mail.php and, from the source of config/global.php, the key mtemp alone
- the strip gains the tab, the policy of the campaigns moves to index 5
- The general settings (admin/modules/config.php):
- five tabs are left, the bound of the tab in config(), save() and clearcache() is 4
- save() writes the whole of global.php, so it keeps mtemp, which its form no longer shows
- The caption (admin/lang/, admin/modules/monitor.php, core/monitor.php):
- _NEWSLETTER carries the new word of the section in the six locales
- _MAILOPT is gone, its one reader on the monitor takes _NEWSLETTER
- _NEWSLETTER_JOB keeps the word of the campaigns on the flag of their job
- Help and reference (admin/info/, docs/, UPGRADING.md):
- the help of the section holds the transport, the help of the settings and of the scheduler point to it
- UPGRADING.md names the new addresses, docs/VERSIONS.md the move
- Tests and tools (tests/, tools/):
- MailConfigTest holds that the settings keep mtemp, that the mail form writes its own keys, and the guard of the section
- MailDrainTest watches newsletter.php for a frame built by hand, where the test letter now lives
- the label crawl opens mailconf, its baseline holds the route and has lost the two of tab=5
Benefits:
- An administrator finds the transport where the queue tells it is needed
- A save of the general settings no longer writes the mail settings
- The new word reaches every site with its language files
Technical notes:
- mtemp stays in config/global.php and the rest in config/mail.php, no key moves and no step of a version is needed
- config/modules.php keeps lang _NEWSLETTER: the merge of an update never overwrites a key the site has
- name=config&tab=5 no longer exists and shows a tab of the settings; no link of the tree leads there
- The stand database is unchanged but for the traces of the check
The last small findings of the panel audit are closed. A file name in an address could ban a visitor as an attack, a save of the upload settings rewrote a zero the form promises to keep, the presentation invented its visitors, and the fields of the site had no name. Each is corrected at its source, and what the audit reported but the current code no longer shows was measured and left alone.
Core changes:
- The attack detector (core/security.php):
- checkGet() and checkCookie() take the SQL keywords only where no letter touches them
- Eyedropper-....gif in key= no longer writes hack.log, queues a mail or, with the block setting, bans the visitor
- the bound is letters and not \b, as /!50000UNION/ has a digit before the word
- a keyword beside a digit or a separator still counts, and so does the name of a table with the prefix
- The upload limits (admin/modules/uploads.php):
- configsave() keeps a 0 in moderfiles, userfiles and guestfiles, as _CONFINES and getEditorFileJson() read it: no limit
- a save without an edit no longer turns the userfiles and guestfiles 0 of the row layout into 100
- The presentation (modules/presentation/index.php):
- "Онлайн" shows getSessionCounts() alone, the floor 48 + visits % 37 is gone
- the cache chart stays staged, as the comment of getPresentationData() says
- Muted zeros and the warning tone (admin/modules/database.php, public/templates/admin/):
- a zero of "Расходы" takes sl-muted, an InnoDB value that is not zero the plain tone, and the help says so
- is_dimmed leaves the admin inline-badge.html, so sl-dimmed of the panel is the menu row that is off
- the light --sl-warning-strong of the admin theme goes to #b23b0b: sl-chip-warn over the sidebar reads 4.53:1, it read 3.98:1
- The fields of the site (modules/search, modules/account, modules/forum, modules/node, core/user.php, public/templates/lite/):
- search, registration, the profile, the feed box of the cabinet, private messages, a material and the forum name every field
- label_for and an id in the form rows, aria_label where no label stands, select_label of form-submit.html
- the list of search applies by its button, so the required word is held by the form; RSS keeps its submit on change, as its section rebuilds the categories of the form on the server
- CodeMirror (public/plugins/system/editor.js):
- getAreaAttr() gives the editable area tabindex="0": it was a Tab stop already, and axe now counts its scroller as reachable
- Tests and tools (tests/, tools/):
- UpdateConfigTest holds that the version of the old site is not carried, in place of a comparison of null with null
- InputFilterTest holds the bounds of the detector, UploadIntegrationTest the zero of the save
- PanelPartsTest holds the site modules too, but for RSS
- label-audit.mjs counts an image with its alt in a label as its text; the baseline holds no entry, 492 routes
- ui-contrast.json is written anew for the moved tone, ui-audit-baseline.json is stored
- Reference (docs/VERSIONS.md, admin/info/database/ru.md):
- the entry of the change and the column "Расходы" in its current state
Benefits:
- A file name no longer costs a visitor a ban, and the injection forms the detector caught are still caught
- A setting means what its hint says, and a number on the presentation is a real one where the page claims it
- The label crawl of the panel and the site runs against an empty baseline
Technical notes:
- No schema, URL or API change; config/uploads.php stays as shipped
- A save of the upload settings on a site where 0 was typed now keeps the 0, which lifts the limit
- A keyword standing alone in a value still counts as an attack, as before: drop_down.gif, or a search for select
A reader of the panel met fields without a name, lists that reloaded the page as soon as they changed, and tabs outside any tablist, while the arrows stopped on the second tab. The label crawl could not see the missing names at all, so it was green on them. The fields, the filters and the tabs are corrected at their source, and the crawl now holds the names.
Core changes:
- The filters that submitted themselves (core/helpers.php, admin/modules/categories.php, admin/modules/modules.php, admin/modules/template.php, modules/master/admin/index.php):
- the filters of the forms of "Категории" and "Модули" and of the statistics of "Мастер" stand on fragments/list-filter.html
- a button and is_now: a change still opens the list, and a page without the script still works
- getTplCategoryModule() answers that filter with $auto and a select with its id for a form row otherwise
- the filter of the list of "Модули" takes is_now as its form does, the theme filter of "Шаблон" takes the canon with its button
- The tabs (public/plugins/system/slaed.js):
- initTabGroup() finds the strip through its first tab, as on a module head the strip is the group itself
- role="tablist" never landed there, on "Конфигурации", "Дополнительные поля" and "Замена слов"
- its li takes role="presentation", a link of the strip that opens a page role="tab", a tab its aria-controls where the panel has an id
- arrows move the focus with the choice, so the second press goes on; Home and End work
- The names of the fields (admin/modules/.php, modules//admin/index.php, modules/node/index.php, public/templates/*):
- label_for and an id in the rows of the forms, the rows of the uploads settings through one closure
- aria_label on fragments/select.html and fragments/input.html of both themes where no label stands
- label of getTplAddDateTime(), the icon picker named by its placeholder, the login fields of lite, the pick of all files
- the hints of the site builder are tied to their fields, and the word field of the file dialog says its operation
- Two lists under one label (admin/lang/*.php, admin/modules/layout.php, admin/modules/modules.php, modules/node/admin/index.php):
- _BLOCKS_SIDE and _BLOCKS_TOP on "Модули", on a Node type and in the site builder
- _BLOCKS_MOD, _LAYOUT_SIDE and _LAYOUT_TOP go, and the note of the builder no longer quotes the old label
- Tests and tools (tests/Unit/PanelPartsTest.php, tools/label-audit.mjs, tools/label-audit-baseline.json):
- PanelPartsTest holds that no panel screen submits a list by itself and that a strip is a tablist of tabs
- the crawl gains control-unnamed, which takes neither a title nor a placeholder for a name
- a field in a closed tab counts, a field whose own display is none does not
- key, own, word and month leave the signature of a route, as they name a record
- the baseline is stored anew on the stand after the production move: 492 routes, no entry of the panel, 21 of the site
- Help and reference (admin/info/categories/ru.md, admin/info/layout/ru.md, admin/info/modules/ru.md, modules/node/admin/info/ru.md, docs/TEMPLATES.md, docs/VERSIONS.md):
- the help names the two labels as the screens show them
- the Label crawl section of docs/TEMPLATES.md describes the new check
Benefits:
- A screen reader names every field of the panel, and a keyboard walks every strip of tabs
- A change of a filter no longer reloads a page without a way to confirm it (WCAG 3.2.2)
- A field without a name now fails npm run ui:label
Technical notes:
- Breaking: the constants _BLOCKS_MOD, _LAYOUT_SIDE and _LAYOUT_TOP are gone in the six languages
- The names and the order of the posted fields do not change; no schema change and no step of a version
- The fields of the site without a name stay in the baseline of the crawl, each named by the plan of the panel
- The stand database keeps only the sent security rows of _mail from the crawls; config/uploads.php equals HEAD
- config/layout.php and config/security.php are not part of the commit
A section of the panel can be delegated, and two of them handed out credentials with it: the settings of "Пользователи" gave and took the OAuth keys, and the settings of "Журнал изменений" gave the GitHub token in the value of its field. The keys move to "Безопасность", which is the super administrator's alone, and the access to GitHub stays with that administrator.
Core changes:
- The OAuth keys (admin/modules/security.php, modules/account/admin/index.php, admin/lang/*.php):
- the tab "OAuth-ключи" of "Безопасность", op=oauthkeys and op=oauthsave, with the fields and the write of config/oauth.php
- the write keeps merging over the stored file, so the endpoints the form does not carry stay
- config() and save() of the account module no longer draw or write them; op=oauthlist stays in "Пользователи"
- the constant _SEC_OAUTH in the six languages
- The access to GitHub (modules/changelog/admin/index.php):
- source, ghowner, ghrepo and ghtoken are drawn and written for isAdmin(true) alone
- with an owner or a repository of their choice another administrator would send the site there with the token
- a save by another administrator keeps the stored four and changes the other settings
- Tests and tools (tests/Unit/AdminSecretTest.php, tests/Support/route_probe.php, tools/label-audit.mjs):
- AdminSecretTest holds both over real requests: what a delegated administrator sees and writes, what a super administrator does, a save without the token, and that no journal holds a value
- the label crawl opens op=oauthkeys
- Help and reference (admin/info/security/ru.md, modules/account/admin/info/ru.md, modules/changelog/admin/info/ru.md, docs/VERSIONS.md, UPGRADING.md):
- how to get the keys moves to the help of "Безопасность"
- OAuth in the help of "Пользователи" is a section of its own, no longer inside the settings of the module
- the help of "Журнал изменений" says who sets the source and the access
Benefits:
- Delegating "Пользователи" or "Журнал изменений" no longer hands out a credential or the use of one
- The keys live beside the other settings only the super administrator reaches
Technical notes:
- Breaking: op=save of name=account no longer takes the fields oactive, gactive, gclientid, gsecret, mactive, mclientid and msecret; they go to name=security&op=oauthsave
- Breaking: the tab "Конфигурации" of name=security moves from index 4 to index 5
- No schema change and no step of a version; the stand database keeps only the login rows of the check
- config/layout.php and config/security.php are not part of the commit
The audit of the panel sections found defects beside the question it asked. Each is small and stands on its own: a link and a return to operations that do not exist, a message shown once after its end, a file path taken from the request, an RSS block that would fetch on every view, and help that describes modules which are gone.
Core changes:
- The site message (core/user.php):
- setMessageShow() links a moderator to name=messages&op=add instead of an operation without a handler
- an expired message is switched off and skipped, not shown once more as unlimited
- one match on the audience replaces four branches of the same output
- The file of "Редактор" (admin/modules/editor.php):
- save() takes the path from the tab it was sent by, and the hidden field file is gone
- a path sent in the request wrote any file PHP could reach, outside the rules of the file manager
- The block files and the builder (admin/modules/blocks.php, admin/modules/layout.php):
- a bad file name in filecode() returns to op=fileedit instead of op=logview, which does not exist
- a block made by the builder gets refresh 3600, the default of the block form
- at 0 getRssBlock() would fetch its feed on every view
- The help of the panel (admin/info/ratings, categories, config, groups, lang, messages, newsletter, uploads, modules/voting/admin/info):
- "Рейтинги" is rewritten by the code: no points for votes, no cookie, 0 means no wait, the guests and the journal are there
- modules that are gone no longer stand in the others
- "Сообщения" says a message shows on the home page, one at a time
- The record (docs/VERSIONS.md):
- the entry of these repairs
Benefits:
- A moderator reaches the message from the site, and an ended message stays off
- The Editor can no longer write outside its four files
- The help describes the panel as it is
Technical notes:
- No schema, configuration or URL of a working page changes
- The field file of the Editor form is gone; its form sends the tab, as it always did
- Checked through the site: the link, the expiry, a real and a forged save of the Editor, the bad block name, the help tabs
- The refresh of a builder block is held by LayoutPublishTest and LayoutDraftTest only: publishing would rewrite the layout of the stand
The engine of the series lands in the admin theme and the screens "Статистика" and "Мониторинг" are rebuilt on it by their data. The other screens of the panel take the window, the tiles, the meters on top and the mark "i", and the counter of the statistics becomes the only record of visits, so the module "Переходы" is gone.
Core changes:
- The engine of the series (public/templates/admin/assets/js/admin-ui.js, core/helpers.php, tests/Unit/DecimalTextTest.php):
- the live chart with its glide and guide, the day columns, the archive strip, the rhythm, the week by hours
- the stack, the bar rows, the table of days, the figure apart from its text
- filterDecimal(), with filterSize() through it
- "Статистика" (admin/modules/statistic.php, core/monitor.php, public/templates/admin/partials/cockpit.html, statistic-cockpit.html, fragments/series.html, tests/Unit/StatisticDataTest.php):
- getStatData() gives the dial of the day, the windows, the log of days and op=live
- the archive strip is kept in storage/counter/archive.json, built on the first opening
- the GD chart, statistic-extended.html and the settings bet and shi are gone
- "Мониторинг" (admin/modules/monitor.php, core/monitor.php, partials/monitor-cockpit.html, tests/Unit/MonitorSignalTest.php):
- the pulse and thirteen signals of getServerSignalList(), getServerLamp() and getSupportEnd()
- the tiles over the live chart, the windows, the findings of the audit
- op=live takes the place of op=status, op=traffic and op=sync
- basic-monitor.html, monitor-chart.html, .sl-monitor-card and the part signal are gone
- The screens of the panel (admin/modules/newsletter.php, database.php, security.php, config.php, update.php, modules/search/admin/index.php, modules/sitemap/admin/index.php, modules/master/admin/index.php, core/admin.php):
- the window, the tiles and the meters on top on the screens of the inventory of ADMIN-UX.13
- the meter of a campaign only with a real limit, a campaign with nothing expected shows its figures alone
- the quota of "Загрузки" over the file list, by Upload::getUsedBytes(), made public
- The parts under the screens (core/helpers.php, core/system.php, partials/admin-list.html, fragments/pane-cap.html, popover.html, meter.html, file-browser-props.html, partials/file-browser.html, theme.css, base.css):
- getTplMeter() moves from the monitor into the helpers, with the row form sl-meter-row
- getTplLongCell() and CELL_LONG open a value of 16 characters or more behind the mark, a shorter one keeps its title
- the key pane of getTplAdminList() puts a list inside a window, by the one head pane-cap.html
- a cut cell that ends a row stays inside the table, the open overflow of a last cell belongs to the dial
- a status wraps instead of covering its neighbour, --sl-col-sent-width takes a figure with its word
- Visitor accounting (core/security.php, core/system.php, public/index.php, config/statistic.php, config/global.php, config/modules.php, admin/modules/statistic.php, admin/modules/config.php, core/classes/cache.php, storage/update/sql/table.sql, table_update6_3.sql, modules/search/index.php, tests/Unit/StatsContractTest.php):
- a line of statistic.log gains the hosts, the landing pages, the names and the types of robots
- a full field lets a frequent key in by evicting the rarest
- a source counts the start of a session only, the new source ai is checked first
- getBotInfo() reads the masks of five types, getVisitBot() adds a visit without Accept-Language as a robot
- the lists and the masks move to the settings of the statistics, the tab "Краулеры" of the configuration is gone
- admin/modules/referers.php, config/referers.php, the table _referer and the log of addresses are gone
- Cache::setBody() retries a rename on a busy file
- Reference, help, tests and gates (docs/TEMPLATES.md, docs/VERSIONS.md, docs/UPDATE.md, docs/NODE.md, UPGRADING.md, README.md, admin/info//ru.md, modules//admin/info/ru.md, admin/lang/*.php, public/demo/, tests/Unit/PanelPartsTest.php, tests/Support/panel_probe.php, monitor_probe.php, statistic_probe.php, decimal_probe.php, tools/):
- the help of every changed screen, the constants in the six languages, the contract and the key pane of the list
- PanelPartsTest holds the meter, the mark and the window of a list by their keys and their escaping
- the baselines stored from the tree
Benefits:
- The two richest screens and the rest of the panel are built of one set of parts
- A long value is read whole behind one mark, a figure shows as a meter only where a real limit stands behind it
- One record of visits replaces two mechanisms, and a robot no longer writes search words or enters "Аудитория"
Technical notes:
- Breaking: name=referers, the table {prefix}_referer and config/referers.php are gone; is_bot(), from_bot(), engines_word() and updateRefererTrack() are gone, custom code calls getBotInfo(getAgent()); bots and fbots left config/global.php
- Breaking: the tabs of name=config after "Цензура" moved up by one: the cache is tab=4 and the mail is tab=5
- Breaking: op=status, op=traffic and op=sync of the monitor give way to op=live; the settings bet and shi are gone
- The stand database changed: DROP TABLE {prefix}_referer on another machine, also after loading a dump
- config/layout.php and config/security.php are not part of the commit
The effects settled on the demo series "Статистика" become the motion of the admin theme, each living once and all stopped by one switch. On that motion the theme gains the parts the screens "Статистика" and "Мониторинг" will be built of, ready for every screen of the panel; no screen takes them yet.
Core changes:
- The motion of the panel (public/templates/admin/assets/css/theme.css, base.css, tools/ui-contract.php):
- the block "Motion over the page" holds the moving rules, the tokens carry --sl-time-scale
- sl-aurora runs a light round the frame of the cockpit, a home tile and a monitor card under the hand
- the scan and the comet of the cockpit move into the block, the circles glow by --sl-knob-mix
- the arcs of the rings fill on --sl-knob-dur, the tiles rise on --sl-tile-dur, a press spreads on --sl-ripple-dur
- a chart of "Мониторинг" is drawn once on --sl-graph-dur
- The behaviours (public/templates/admin/assets/js/admin-ui.js):
- setFigureRun() runs a figure of the rings, the strip and the queues to its new value, setFigureFresh() lights it once
- setArriveMarks() and setArriveDone() let the tiles and the charts wait for the view
- setTileTilt() leans a tile to the hand under a glare, one pointerdown spreads the ripple
- a still panel gets none of it, by isMotionStill()
- The parts of the series (public/templates/admin/fragments/pane.html, pane-row.html, pane-ground.html, metric-list.html, kv-list.html, long.html, meter.html, signal.html, signal-list.html, ext.html, theme.css, base.css, tools/ui-contract.php):
- the window .sl-pane with its lamps or icon, its meta and live chip, one body or two halves
- the rows .sl-pane-split, .sl-pane-side and .sl-pane-trio on the ground .sl-ground
- the grid of the ground drifts by transform on a layer of its own, .sl-ground-lines
- the tile of figures .sl-metric with the dot and the icon of its series
- the list .sl-kv in a dl, the "i" of a cut value .sl-long, the meter .sl-meter with the role meter
- the signal .sl-signal with the passed ones folded, the extensions by weight .sl-ext
- a part of a ground rises in its turn, a tile of figures leans, the beam crosses the head of a window
- the demo classes st-* and mn-* stay on the stand; their text at --sl-text-subtle takes --sl-text-muted, 4.5:1
- Reference and help (docs/TEMPLATES.md, docs/VERSIONS.md, admin/info/panel/ru.md, public/demo/assets/st.css):
- "Motion" of "Panel Shell" with the laws of a move, the entry of the motion in the versions
- "Layout Sections" and the entry of the builder take the parity with its demo: the keys order and for, the icon of a zone, the scale of the canvas, the canon over the demo
- the help of the home names the motion, st.css reads sl-aurora and --sl-aurora-dur
- Tests and gates (tests/Unit/SeriesPartsTest.php, tools/ui-audit-baseline.json):
- every fragment of the series is held by its keys and its escaping
- the baseline stored from the tree
Benefits:
- One switch stops every effect, and a new effect has one place and one set of laws
- The screens of the series are built of one set of parts, which the rest of the panel can take
- The drift of the ground costs about 1% of a core against 15% and more by background-position
Technical notes:
- No schema, URL or API change
- New tokens --sl-aurora-dur, --sl-aurora-width, --sl-tile-dur, --sl-ripple-dur, --sl-graph-dur, --sl-knob-dur, --sl-knob-mix, --sl-ground-dur, --sl-ground-width, --sl-pane-dur, --sl-metric-min-width with their components
- The reference of the parts is the last step of their plan; "Motion" does not list them until then
- The stand database, uploads/ and the stand's draft unchanged; config/layout.php and config/security.php are not part of the commit