diff --git a/archivebox/core/forms.py b/archivebox/core/forms.py index a65e0b40..f698b74e 100644 --- a/archivebox/core/forms.py +++ b/archivebox/core/forms.py @@ -338,6 +338,8 @@ class PluginConfigFormMixin: "checkbox_id": f"id_{field_name}_{index}", "enabled_config_key": enabled_config_key, "description": str(schema.get("description") or "").strip(), + "source_url": f"https://github.com/ArchiveBox/abx-plugins/tree/main/abx_plugins/plugins/{plugin_name}", + "docs_url": f"https://archivebox.github.io/abx-plugins/#{plugin_name}", "required_plugins": [str(item) for item in schema.get("required_plugins") or []], "required_binaries_count": len(schema.get("required_binaries") or []), "config_fields": config_fields, diff --git a/archivebox/templates/admin/personas/persona/change_form.html b/archivebox/templates/admin/personas/persona/change_form.html index 5969ffc2..52aef94b 100644 --- a/archivebox/templates/admin/personas/persona/change_form.html +++ b/archivebox/templates/admin/personas/persona/change_form.html @@ -302,7 +302,7 @@ document.addEventListener('DOMContentLoaded', function () { {% block after_field_sets %} {{ block.super }} -
+

Plugin Config

These typed controls update the same Persona config JSON shown above. Shared config keys stay synced across plugin sections.

{% include "core/plugin_config_grid.html" with plugin_groups=adminform.form.plugin_groups %} diff --git a/archivebox/templates/core/add.html b/archivebox/templates/core/add.html index c53e3419..f61d87f6 100644 --- a/archivebox/templates/core/add.html +++ b/archivebox/templates/core/add.html @@ -247,11 +247,11 @@
Quick Select: - + 👤 + ➕ {% for persona in recent_personas %} - ✎ + ✎ {% endfor %} diff --git a/archivebox/templates/core/plugin_config_grid.html b/archivebox/templates/core/plugin_config_grid.html index cb660cb9..b2b7f13e 100644 --- a/archivebox/templates/core/plugin_config_grid.html +++ b/archivebox/templates/core/plugin_config_grid.html @@ -82,7 +82,7 @@ .plugin-card-main { display: grid; - grid-template-columns: 18px minmax(0, 1fr) auto; + grid-template-columns: 18px minmax(0, 1fr) auto auto auto; gap: 8px; align-items: start; min-width: 0; @@ -90,7 +90,7 @@ } .plugin-card-main--static { - grid-template-columns: minmax(0, 1fr) auto; + grid-template-columns: minmax(0, 1fr) auto auto auto; } .plugin-card-main > input[type="checkbox"] { @@ -175,15 +175,16 @@ } .plugin-config-details { - grid-column: 3; + grid-column: 5; grid-row: 1; min-width: 0; } .plugin-card-main--static .plugin-config-details { - grid-column: 2; + grid-column: 4; } +.plugin-card-badge, .plugin-config-details summary { display: inline-flex; align-items: center; @@ -202,6 +203,40 @@ white-space: nowrap; } +.plugin-card-badge { + text-decoration: none !important; +} + +.plugin-card-badge:link, +.plugin-card-badge:visited, +.plugin-card-badge:active { + color: #475569; +} + +.plugin-card-badge:hover, +.plugin-card-badge:focus { + background: #eef4fa; + color: #1f2937; +} + +.plugin-source-badge { + grid-column: 3; + grid-row: 1; +} + +.plugin-docs-badge { + grid-column: 4; + grid-row: 1; +} + +.plugin-card-main--static .plugin-source-badge { + grid-column: 2; +} + +.plugin-card-main--static .plugin-docs-badge { + grid-column: 3; +} + .plugin-config-details summary::-webkit-details-marker { display: none; } @@ -362,11 +397,11 @@ } .plugin-card-main { - grid-template-columns: 18px minmax(0, 1fr); + grid-template-columns: 18px minmax(0, 1fr) auto auto auto; } .plugin-card-main--static { - grid-template-columns: minmax(0, 1fr); + grid-template-columns: minmax(0, 1fr) auto auto auto; } .plugin-config-details, @@ -411,12 +446,14 @@ - {% else %} -
- {{ plugin.label }} -
- {% endif %} -
+ {% else %} +
+ {{ plugin.label }} +
+ {% endif %} + Source + Docs +
Config {{ plugin.config_count }} diff --git a/archivebox/templates/static/add.css b/archivebox/templates/static/add.css index eb5d11c5..7dc085ba 100755 --- a/archivebox/templates/static/add.css +++ b/archivebox/templates/static/add.css @@ -761,10 +761,28 @@ select { .preset-btn:hover { background-color: #e9ecef; border-color: #adb5bd; + text-decoration: none; transform: translateY(-1px); box-shadow: 0 2px 4px rgba(0,0,0,0.1); } +a.preset-btn, +a.preset-btn:visited, +a.preset-btn:hover, +a.preset-btn:focus, +a.preset-btn:active { + text-decoration: none !important; +} + +#add-form .plugin-presets a.preset-btn, +#add-form .plugin-presets a.preset-btn:link, +#add-form .plugin-presets a.preset-btn:visited, +#add-form .plugin-presets a.preset-btn:hover, +#add-form .plugin-presets a.preset-btn:focus, +#add-form .plugin-presets a.preset-btn:active { + text-decoration: none !important; +} + .preset-btn:active { transform: translateY(0); box-shadow: none; @@ -798,6 +816,9 @@ select { } .persona-create-btn { + justify-content: center; + min-width: 28px; + padding: 6px 8px; color: #116329; border-color: #b6e3c6; background-color: #f0fff4; diff --git a/archivebox/tests/test_ui_add_view.py b/archivebox/tests/test_ui_add_view.py index 4908623e..73609b8c 100644 --- a/archivebox/tests/test_ui_add_view.py +++ b/archivebox/tests/test_ui_add_view.py @@ -70,6 +70,10 @@ def test_add_view_admin_renders_plugin_config_grid(client, admin_user, monkeypat assert any(card["config_fields"] for group in form.plugin_groups for card in group["plugins"]) assert b"Index only dry run" not in response.content assert b"Start paused" in response.content + assert b">Source" in response.content + assert b">Docs" in response.content + assert b"https://github.com/ArchiveBox/abx-plugins/tree/main/abx_plugins/plugins/" in response.content + assert b"https://archivebox.github.io/abx-plugins/#" in response.content def test_add_view_embeds_selected_persona_config_for_ui_hydration(client, admin_user, monkeypatch): diff --git a/etc/package.json b/etc/package.json index 6c9a117c..64d63b4c 100644 --- a/etc/package.json +++ b/etc/package.json @@ -1,6 +1,6 @@ { "name": "archivebox", - "version": "0.9.33rc40", + "version": "0.9.33rc41", "repository": "github:ArchiveBox/ArchiveBox", "license": "MIT", "dependencies": { diff --git a/pyproject.toml b/pyproject.toml index bb769f6e..94f2cf1a 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "archivebox" -version = "0.9.33rc40" +version = "0.9.33rc41" requires-python = ">=3.13" description = "Self-hosted internet archiving solution." authors = [{name = "Nick Sweeting", email = "pyproject.toml@archivebox.io"}] @@ -79,9 +79,9 @@ dependencies = [ ### Extractor dependencies (optional binaries detected at runtime via shutil.which) ### Binary/Package Management "abxbus==2.5.8", # EventBus API - "abxpkg>=1.11.66", # for: detecting, versioning, and installing binaries via apt/brew/pip/npm - "abx-plugins>=1.11.72", # shared ArchiveBox plugin package with Chrome/Puppeteer dependency wiring - "abx-dl>=1.11.72", # shared ArchiveBox downloader package with blocking install preflight + "abxpkg>=1.11.67", # for: detecting, versioning, and installing binaries via apt/brew/pip/npm + "abx-plugins>=1.11.73", # shared ArchiveBox plugin package with Chrome/Puppeteer dependency wiring + "abx-dl>=1.11.73", # shared ArchiveBox downloader package with blocking install preflight ### UUID7 backport for Python <3.14 "uuid7>=0.1.0; python_version < '3.14'", # provides the uuid_extensions module on Python 3.13 ]