Release: dev -> main (restore fixes, theming, schema-checker, quickicon hardening) #300

Merged
jmiller merged 27 commits from release/dev-to-main-r2 into main 2026-07-16 18:43:06 +00:00
Owner

Cuts a fresh stable from dev: schema-checker reconciliation, restore/backup progress theming + controls, MokoRestore black theme, restore cancel cleanup, silent-partial-restore fixes, snapshots type-label, ntfy default, quickicon dashboard hardening. Excludes the untested component Type-Name change (#299), held for install-testing.

https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i

Cuts a fresh stable from dev: schema-checker reconciliation, restore/backup progress theming + controls, MokoRestore black theme, restore cancel cleanup, silent-partial-restore fixes, snapshots type-label, ntfy default, quickicon dashboard hardening. Excludes the untested component Type-Name change (#299), held for install-testing. https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
jmiller added 27 commits 2026-07-16 18:42:51 +00:00
Back-fills dev with the fuller rebrand that shipped on main in the
dev->main release (#282): MokoGitea->MokoGIT, GITEA_ORG->GIT_ORG,
mokogit-actions[bot], and the corrected .mokogit/CLAUDE.md path. dev's
earlier partial rename (#279) is superseded so dev and main no longer
diverge on CI config.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
"A MokoSuiteBackup backup is currently running" -> "A MokoSuiteBackup
is currently running". en-GB + en-US.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
Brings the full-screen runbackup screen's controls onto the black
backup-progress modal in the backups view:
- "Automatically return to the list when finished" checkbox (default on);
  unchecked leaves the completion screen up with buttons.
- Cancel button while running (double confirm) — stops the step loop and
  cancels the record via ajax.cancelBackup.
- Terminal buttons: View backup record + Back to backups on success;
  Retry + Back to backups on failure.
Title icon/text updated via safe DOM (no innerHTML). Restore modal
unchanged in this pass.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
Restore-progress modal now matches the backup modal: auto-continue
checkbox, terminal buttons (Retry restore / Back to backups), and a
double-confirm Cancel. Restore's cancel warns that stopping mid-flight
may leave the site partially restored (no server rollback), and there is
no "view record" button (restore has no new record). startSteppedRestore
split into a re-runnable runSteppedRestore() so Retry works. Title via
safe DOM (no innerHTML).

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
The generated restore.php wizard used a light "Joomla-styled" blue theme.
Restyled its stylesheet to the full-black MokoSuite look that matches the
runbackup / backup-progress screens: black background + big header, dark
panels/cards, dark form inputs with readable contrast, MokoSuite blue/green
accents, dark step-bar/checks/alerts/progress/log, and all inline help-box
styles converted from light to the dark palette. No logic changes.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
The stepped-restore Cancel button (added with the progress-modal controls)
stopped the client loop and reloaded, but left the server-side restore
session, *.restore.json state, and the extracted staging directory behind
with no reaper — so cancelled/abandoned restores leaked disk indefinitely.

- SteppedRestoreEngine::cancel() mirrors the failure-cleanup path (delete
  staging dir + restore state + session).
- AjaxController::restoreCancel() exposes it (token + restore ACL gated).
- Restore modal Cancel now calls ajax.restoreCancel with the session id
  before leaving (session id tracked in restoreSessionId).
- SteppedSession::cleanupOldSessions() also reaps orphaned
  mokosuitebackup-restore-* staging dirs >24h (backstop for browser-close).

Found by an audit of the restore path against recent changes; the schema
(retired sftp_*/VARCHAR include_mokorestore) and PHP 8.3 changes were
confirmed to NOT affect restore.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
Stepped restore silently swallowed every failed SQL statement and always
reported "Restore complete", so a half-imported database looked fine.

- SteppedRestoreEngine::stepDatabase() now records a failure count + first
  few messages (recordSqlError) instead of only error_log(), and the
  completion step returns the count with a warning; the modal shows
  "Restore Complete (with warnings)" and does NOT auto-return.
- New quote/backtick/escape-aware isCompleteStatement() replaces the naive
  "line ends with ;" terminator, so a ; or newline inside a string value no
  longer splits a statement mid-value.
- Comment/blank lines are only skipped BETWEEN statements, never inside an
  accumulating multi-line statement.

Relates to #188 (DatabaseImporter) and the standalone MokoRestore splitter;
tracked in #291.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
fix: default ntfy server to ntfy.mokoconsulting.tech (#166)
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 3s
313b96b070
Replaces the old public ntfy.sh default in the runtime defaults: profile
form default/hint, NotificationSender fallbacks, the ntfy_server column
default in install.mysql.sql, and the en-GB field description. ntfy.sh is
still documented as the public alternative.

Closes #166.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
fix: snapshots restore type labels show raw type (#170)
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 4s
2b6dbdac23
typeLabels[TYPE] referenced an undefined uppercase variable; the forEach
parameter is lowercase `type`, so every type label rendered as the raw
type string instead of its translated label.

Closes #170.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
Merge pull request 'fix: snapshots restore type labels show raw type' (#295) from fix/snapshots-typelabel into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 37s
95d2b3375c
Merge pull request 'fix: default ntfy server to ntfy.mokoconsulting.tech' (#293) from fix/ntfy-default-url into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 21s
ed2dbee579
fix(restore): surface DatabaseImporter errors + quote-aware split (#188)
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Failing after 7s
Universal: PR Check / Branch Policy (pull_request) Successful in 2s
Universal: PR Check / Secret Scan (pull_request) Successful in 8s
Universal: PR Check / Validate PR (pull_request) Failing after 12s
Generic: Project CI / Lint & Validate (pull_request) Successful in 15s
Branch Cleanup / Delete merged branch (pull_request) Successful in 1s
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 12s
Generic: Project CI / Tests (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
028e1c7e80
RestoreEngine ignored DatabaseImporter::hasErrors(), so the non-stepped
restore always reported success even when SQL statements failed. It now
logs the failures and returns a warning ("database may be incomplete").
DatabaseImporter's splitter is also quote/backtick/escape-aware so a ; or
newline inside a value no longer splits a statement, and comments are only
skipped between statements — matching the stepped-engine fix (#291).

Closes #188.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
Merge pull request 'fix(restore): surface DatabaseImporter errors + quote-aware split' (#294) from fix/databaseimporter-surface-errors into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 30s
f3bcf9d79e
fix(quickicon): never let the dashboard widget crash the admin page (#297)
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Universal: PR Check / Secret Scan (pull_request) Successful in 7s
Generic: Project CI / Lint & Validate (pull_request) Successful in 11s
Universal: PR Check / Validate PR (pull_request) Failing after 9s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 8s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 23s
Generic: Project CI / Tests (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
7e58ca7598
The mod_quickicon helper array_merge()s a defaults array into each icon a
plugin returns; if a plugin's DB query throws or it returns a malformed
(unwrapped) icon, the whole admin dashboard can 500 with an array_merge
TypeError. The current handler is structurally correct (icons are wrapped
in a list, matching core plg_quickicon_joomlaupdate), so this hardens it:

- Extract the query/state logic into buildStatusIcon().
- Wrap it in try/catch — on any Throwable, log and contribute no icon
  instead of bubbling into the dashboard render.
- Document why the [$icon] list-wrapping is load-bearing.

Closes #297.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
chore(version): pre-release bump to 02.64.12-dev [skip ci]
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 1s
747e50bf62
Merge pull request 'fix(quickicon): never let the dashboard widget crash the admin page' (#298) from fix/quickicon-harden into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 22s
b1b81fd107
Merge remote-tracking branch 'origin/dev' into release/dev-to-main-r2
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Successful in 32s
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Generic: Project CI / Lint & Validate (pull_request) Successful in 10s
Universal: PR Check / Secret Scan (pull_request) Successful in 6s
Universal: PR Check / Validate PR (pull_request) Failing after 9s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Generic: Repo Health / Access control (pull_request) Successful in 2s
Generic: Standards Compliance / Secret Scanning (pull_request) Failing after 4s
Generic: Standards Compliance / License Header Validation (pull_request) Successful in 4s
Generic: Standards Compliance / Repository Structure Validation (pull_request) Successful in 4s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 20s
Generic: Standards Compliance / Coding Standards Check (pull_request) Successful in 5s
Generic: Standards Compliance / Workflow Configuration Check (pull_request) Failing after 5s
Generic: Standards Compliance / Documentation Quality Check (pull_request) Successful in 4s
Generic: Standards Compliance / README Completeness Check (pull_request) Failing after 4s
Generic: Standards Compliance / Git Repository Hygiene (pull_request) Successful in 6s
Generic: Standards Compliance / Script Integrity Validation (pull_request) Successful in 6s
Generic: Standards Compliance / Line Length Check (pull_request) Successful in 5s
Generic: Standards Compliance / File Naming Standards (pull_request) Successful in 4s
Generic: Standards Compliance / Insecure Code Pattern Detection (pull_request) Successful in 4s
Generic: Standards Compliance / Version Consistency Check (pull_request) Successful in 49s
Generic: Standards Compliance / Dead Code Detection (pull_request) Successful in 8s
Generic: Standards Compliance / File Size Limits (pull_request) Successful in 4s
Generic: Standards Compliance / Binary File Detection (pull_request) Successful in 6s
Generic: Standards Compliance / TODO/FIXME Tracking (pull_request) Successful in 4s
Generic: Standards Compliance / Code Complexity Analysis (pull_request) Successful in 51s
Generic: Standards Compliance / Code Duplication Detection (pull_request) Successful in 52s
Generic: Standards Compliance / Broken Link Detection (pull_request) Successful in 4s
Generic: Standards Compliance / API Documentation Coverage (pull_request) Successful in 4s
Generic: Standards Compliance / Accessibility Check (pull_request) Successful in 4s
Generic: Standards Compliance / Performance Metrics (pull_request) Successful in 4s
Generic: Standards Compliance / Dependency Vulnerability Scanning (pull_request) Successful in 50s
Generic: Standards Compliance / Unused Dependencies Check (pull_request) Successful in 53s
Generic: Standards Compliance / Terraform Configuration Validation (pull_request) Successful in 8s
Generic: Standards Compliance / Enterprise Readiness Check (pull_request) Failing after 51s
Branch Cleanup / Delete merged branch (pull_request) Successful in 1s
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Generic: Standards Compliance / Repository Health Check (pull_request) Failing after 52s
Generic: Project CI / Tests (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Generic: Repo Health / Report: Scripts Governance (pull_request) Has been cancelled
Generic: Repo Health / Report: Repository Health (pull_request) Has been cancelled
Generic: Standards Compliance / Compliance Summary (pull_request) Has been cancelled
9a82fc97f2
# Conflicts:
#	.mokogit/workflows/issue-branch.yml
jmiller merged commit 84fd06bf2d into main 2026-07-16 18:43:06 +00:00
jmiller deleted branch release/dev-to-main-r2 2026-07-16 18:43:07 +00:00
Sign in to join this conversation.