Settings - Plugins: show each plugin logo, as the server page already does #288
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Postulo/postulo#288
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Server settings → Plugins shows each plugin's logo beside its name. Settings → Plugins — the page a person actually visits to see what is running for them — shows none. The same plugins, listed twice, recognisable on one page and not the other.
A logo is how somebody picks Paperless out of a dozen rows without reading each label. It is also the page's own argument: this is the list of whose code is acting on your behalf, and a mark you recognise is worth more here than on the administrator's page.
Why it is missing
Not a design decision — the row simply never carries the plugin.
plugins/policy.py:246-262builds each row as a dict of name, label, description, kind, provenance and decision, and the plugin instance is the loop variable that is never passed out. The server's own builder (core/server_views.py:931-933) does pass it, with the reason written down:So the fix is that key, plus the tag the other page already calls:
plugins/policy.py— add"plugin": pluginto the row.templates/settings/plugins.html—{% plugin_logo row.plugin "…" %}in the row, asserver/plugins.html:53does atsize-8 text-xs.{% plugin_logo %}(core/templatetags/postulo.py:271) already handles everything else: a plugin with no logo gets an initials tile rather than a broken image, the tag is decorative by design so it needs no alternative text beside the name it sits next to, and the image is served by this instance — never from whoever wrote the plugin, because an<img>at their server would tell them which instances run their code (#106).logos.png_foris cached by plugin name for the life of the process, so a dozen rows cost one lookup each and no file reads after the first page view.Points to settle
<li class="flex items-start gap-3">and already opens with a 3.5-unit element: the checkbox, or — for a plugin Postulo ships — a blank<span aria-hidden="true">holding its place (settings/plugins.html:55-62). The logo is a third thing. Either it goes between that column and the label, or it takes the place of the blank span on shipped rows, which would make those rows read better and the two row shapes diverge further. Worth looking at with the mark ticked, where both shapes are on screen together.size-8matches the server page;size-6is the tag's default and may sit better in a row this dense. One glance at both answers it.settings/plugins.html:64says the label is the target because the checkbox is 13 pixels, and that it passed SC 2.5.8 “only on the spacing exception — these rows are tall and nothing else is near. That is a thin thing to rest on: one more control in the row and it stops being true.” A logo is decorative and not a control, so the exception is not spent — but it is now not the only thing near the checkbox either, andtests/e2e/test_target_size.pymeasures rather than reads. Check it rather than reasoning about it.Adjacent, deliberately not in scope
{% plugin_logo %}is used in exactly one template today. Settings → Connections (connections/list.html:33,connections/pick.html:17) names plugins without logos, andpick.htmlalready hasentry.pluginin hand. Those are the same one-line change and would finish what #106 started — but they are a separate issue, not a quiet widening of this one.Notes
tests/e2e/test_target_size.pyandtest_reflow.pyboth visit this page; the row gains width at 320 pixels, which is where #113 and #167 found their problems.npm run build:cssif the row gains classes, since the compiled CSS is committed and CI checks it.