fix: always-visible export menu + wiki history rev creation
Export menu: dropped the details/summary toggle so format options are visible at all times; added flex layout with gap for breathing room. Wiki history: the browser edit form path was calling node.edit() instead of node.wiki_edit() so revisions were never recorded — /api/v1/nodes/.../revisions returned empty after every edit. Also tightened the access gate to can_wiki_edit so non-owner authenticated users can edit wiki-mode root nodes through the UI (matching the gate already used by the edit-button macro).
This commit is contained in:
parent
dded1622e8
commit
9e22c0d768
3 changed files with 57 additions and 34 deletions
|
|
@ -675,6 +675,24 @@ form.node-action {
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.export-menu {
|
||||||
|
font-size: 0.75em;
|
||||||
|
margin-top: 8px;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 14px;
|
||||||
|
align-items: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-label {
|
||||||
|
color: var(--color-muted);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-link {
|
||||||
|
color: var(--color-muted);
|
||||||
|
}
|
||||||
|
|
||||||
div.user-watching {
|
div.user-watching {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
|
|
|
||||||
|
|
@ -243,9 +243,8 @@
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro export_menu(node) %}
|
{% macro export_menu(node) %}
|
||||||
<details class="export-menu">
|
<div class="export-menu">
|
||||||
<summary class="action link">export</summary>
|
<span class="export-label">export:</span>
|
||||||
<div class="export-options">
|
|
||||||
<a href="/api/v1/export/threads/{{ node.id }}.md" class="export-link">markdown</a>
|
<a href="/api/v1/export/threads/{{ node.id }}.md" class="export-link">markdown</a>
|
||||||
<a href="/api/v1/export/threads/{{ node.id }}.html" class="export-link">html</a>
|
<a href="/api/v1/export/threads/{{ node.id }}.html" class="export-link">html</a>
|
||||||
<a href="/api/v1/export/threads/{{ node.id }}.pdf" class="export-link">pdf</a>
|
<a href="/api/v1/export/threads/{{ node.id }}.pdf" class="export-link">pdf</a>
|
||||||
|
|
@ -260,13 +259,11 @@
|
||||||
<a href="/{{ node.id }}/revisions" class="export-link">history (html)</a>
|
<a href="/{{ node.id }}/revisions" class="export-link">history (html)</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</details>
|
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro export_node_menu(node) %}
|
{% macro export_node_menu(node) %}
|
||||||
<details class="export-menu">
|
<div class="export-menu">
|
||||||
<summary class="action link">export</summary>
|
<span class="export-label">export:</span>
|
||||||
<div class="export-options">
|
|
||||||
<a href="/api/v1/export/nodes/{{ node.id }}.md" class="export-link">markdown</a>
|
<a href="/api/v1/export/nodes/{{ node.id }}.md" class="export-link">markdown</a>
|
||||||
<a href="/api/v1/export/nodes/{{ node.id }}.html" class="export-link">html</a>
|
<a href="/api/v1/export/nodes/{{ node.id }}.html" class="export-link">html</a>
|
||||||
<a href="/api/v1/export/nodes/{{ node.id }}.pdf" class="export-link">pdf</a>
|
<a href="/api/v1/export/nodes/{{ node.id }}.pdf" class="export-link">pdf</a>
|
||||||
|
|
@ -277,7 +274,6 @@
|
||||||
<a href="/{{ node.id }}/revisions" class="export-link">history (html)</a>
|
<a href="/{{ node.id }}/revisions" class="export-link">history (html)</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</details>
|
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro wiki_actions(node) %}
|
{% macro wiki_actions(node) %}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,10 @@ def edit_node(request):
|
||||||
request.session.flash(("You must log in to edit your messages.", "error"))
|
request.session.flash(("You must log in to edit your messages.", "error"))
|
||||||
return HTTPFound(get_referer_or_home(request))
|
return HTTPFound(get_referer_or_home(request))
|
||||||
|
|
||||||
if not request.namespace.can_alter_node(request.node, request.user):
|
# In wiki mode, any authenticated user can edit root nodes — match the
|
||||||
|
# `can_wiki_edit` gate used by the edit-button macro. Outside wiki mode
|
||||||
|
# this collapses back to owner/moderator only.
|
||||||
|
if not request.namespace.can_wiki_edit(request.node, request.user):
|
||||||
request.session.flash(("You do not own this message.", "error"))
|
request.session.flash(("You do not own this message.", "error"))
|
||||||
return HTTPFound(get_referer_or_home(request))
|
return HTTPFound(get_referer_or_home(request))
|
||||||
|
|
||||||
|
|
@ -34,6 +37,12 @@ def edit_node(request):
|
||||||
if thread_data or thread_title:
|
if thread_data or thread_title:
|
||||||
if thread_title:
|
if thread_title:
|
||||||
request.node.title = thread_title
|
request.node.title = thread_title
|
||||||
|
# In wiki-mode namespaces every edit gets a revision row so the history
|
||||||
|
# endpoint has something to show. The API wiki-edit endpoint already
|
||||||
|
# does this; the browser form path was silently dropping revisions.
|
||||||
|
if request.namespace.wiki:
|
||||||
|
request.node.wiki_edit(thread_data, user=request.user)
|
||||||
|
else:
|
||||||
request.node.edit(thread_data)
|
request.node.edit(thread_data)
|
||||||
|
|
||||||
# set return_to URI.
|
# set return_to URI.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue