diff --git a/CHANGELOG.md b/CHANGELOG.md index 947f7c2..f25493d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.40.5 - 2026-05-25 + +- Moved the Config page `Dependencies` panel to the top as a full-width card and changed the remaining settings panels to a two-column layout that collapses back to one column at `1080px` and below. + ## 0.40.4 - 2026-05-25 - Widened the watchlist auto-download modal layout so `Name source` and `Name` each fill half of the dialog row instead of staying in narrow grid cells. diff --git a/README.md b/README.md index 3bfc12d..e2c6d72 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,11 @@ Use it to set: 9. Discord webhook URL. 10. Discord notification events plus a test action. +Layout: + +- `Dependencies` stays at the top as a full-width runtime status card. +- The remaining Config sections use two columns on larger screens and collapse to one column at `1080px` width and below. + Saved settings are written to `.ani-cli-web/config.json`. Discord notification events: diff --git a/VERSION b/VERSION index f57373a..d3568f3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.40.4 +0.40.5 diff --git a/app_support.py b/app_support.py index 30f5c10..acaa4ac 100644 --- a/app_support.py +++ b/app_support.py @@ -19,7 +19,7 @@ from uuid import uuid4 PROJECT_ROOT = Path(__file__).resolve().parent ANI_CLI = os.environ.get("ANI_CLI_BIN") or shutil.which("ani-cli") or "ani-cli" APP_NAME = "ani-cli-web" -VERSION = "0.40.4" +VERSION = "0.40.5" ALLANIME_BASE = "allanime.day" ALLANIME_API = f"https://api.{ALLANIME_BASE}" ALLANIME_REFERER = "https://allmanga.to" diff --git a/config_page.py b/config_page.py index cb27a25..e1b9ab0 100644 --- a/config_page.py +++ b/config_page.py @@ -280,14 +280,28 @@ CONFIG_HTML = r""" flex-wrap: wrap; align-items: center; } + .settings-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; + align-items: start; + } .settings-main, .deps { - width: min(760px, 100%); + width: min(1180px, 100%); + } + .deps { + width: min(1180px, 100%); } @media (max-width: 900px) { .app { grid-template-columns: 1fr; } aside { border-right: 0; border-bottom: 1px solid var(--line); } .toolbar, .row { align-items: stretch; flex-direction: column; } } + @media (max-width: 1080px) { + .settings-grid { + grid-template-columns: 1fr; + } + } @media (max-width: 640px) { .form-grid, .check-grid { grid-template-columns: 1fr; @@ -320,118 +334,119 @@ CONFIG_HTML = r"""
-
-
-
-

Defaults

-

Manage the folder, mode, and quality that the Search page starts with.

-
- -
-
-
- -
-
- - -
-
Tip: these are the saved defaults only. The active search form can still be adjusted per download.
-
- -
-
-
-

Watchlist schedule

-

Periodically queue a background watchlist refresh to check for newly available episodes.

-
-
-
- - - -
-
When enabled, the server periodically starts the existing background “Refresh All” job using this interval. Bulk refreshes now wait this many seconds between shows to avoid flooding upstream sources.
-
- -
-
-
-

Auto-download

-

Automatically queue newly discovered episodes for shows in the `Watching` category after manual or scheduled refreshes.

-
-
-
- - - -
-
Adding a new watchlist entry does not auto-download anything. Auto-download only reacts to later manual refreshes or scheduled refreshes that find new episodes.
-
- -
-
-
-

Discord notifications

-

Send webhook notifications for refresh discoveries, refresh problems, and unexpected runtime errors.

-
- -
-
- -
The new-episodes notification includes one card per anime, with local cached thumbnails attached to the webhook when available.
-
-
- -
-""" + WEBHOOK_EVENT_OPTIONS + r""" -
-
-
-
+
+
+
+
+
+

Defaults

+

Manage the folder, mode, and quality that the Search page starts with.

+
+ +
+
+ +
+
+ + +
+
Tip: these are the saved defaults only. The active search form can still be adjusted per download.
+
+ +
+
+
+

Watchlist schedule

+

Periodically queue a background watchlist refresh to check for newly available episodes.

+
+
+
+ + + +
+
When enabled, the server periodically starts the existing background “Refresh All” job using this interval. Bulk refreshes now wait this many seconds between shows to avoid flooding upstream sources.
+
+ +
+
+
+

Auto-download

+

Automatically queue newly discovered episodes for shows in the `Watching` category after manual or scheduled refreshes.

+
+
+
+ + + +
+
Adding a new watchlist entry does not auto-download anything. Auto-download only reacts to later manual refreshes or scheduled refreshes that find new episodes.
+
+ +
+
+
+

Discord notifications

+

Send webhook notifications for refresh discoveries, refresh problems, and unexpected runtime errors.

+
+ +
+
+ +
The new-episodes notification includes one card per anime, with local cached thumbnails attached to the webhook when available.
+
+
+ +
+""" + WEBHOOK_EVENT_OPTIONS + r""" +
+
+
+
diff --git a/test_app.py b/test_app.py index 57d4137..88b3c6a 100644 --- a/test_app.py +++ b/test_app.py @@ -1959,6 +1959,12 @@ class TemplateHelperTests(unittest.TestCase): self.assertIn("async function api(path, options = {})", APP.CONFIG_HTML) self.assertIn("async function api(path, options = {})", APP.WATCHLIST_HTML) + def test_config_page_places_dependencies_before_settings_grid(self): + self.assertIn('
', APP.CONFIG_HTML) + self.assertIn('
', APP.CONFIG_HTML) + self.assertLess(APP.CONFIG_HTML.index('
'), APP.CONFIG_HTML.index('
')) + self.assertIn("@media (max-width: 1080px)", APP.CONFIG_HTML) + def test_search_page_sends_watchlist_auto_download_series(self): self.assertIn('auto_download_series: $("seasonInput").value || "1"', APP.INDEX_HTML)