fix: extract render_workspace_tree macro, fix sidebar-tree endpoint
- Extracted render_workspace_tree macro into _workspace_tree_macro.html so it can be imported independently from base.html (which has many template variables like user, workspace_name, etc.) - Fixed GET /api/sidebar/workspace-tree to use the extracted macro - Added error logging for easier debugging
This commit is contained in:
@@ -1554,15 +1554,16 @@ async def sidebar_workspace_tree(request: Request):
|
|||||||
'<span class="page-name text-dim">No pages yet</span></li>'
|
'<span class="page-name text-dim">No pages yet</span></li>'
|
||||||
)
|
)
|
||||||
|
|
||||||
# Render the tree using the same Jinja2 macro as base.html
|
# Render the tree using the extracted macro
|
||||||
env = Environment(loader=FileSystemLoader("app/templates"))
|
env = Environment(loader=FileSystemLoader("app/templates"))
|
||||||
template = env.from_string(
|
template = env.from_string(
|
||||||
"{% from 'base.html' import render_workspace_tree %}"
|
"{% from '_workspace_tree_macro.html' import render_workspace_tree %}"
|
||||||
"{{ render_workspace_tree(pages) }}"
|
"{{ render_workspace_tree(pages) }}"
|
||||||
)
|
)
|
||||||
html = template.render(pages=pages)
|
html = template.render(pages=pages)
|
||||||
return HTMLResponse(html)
|
return HTMLResponse(html)
|
||||||
except (ValueError, Exception):
|
except (ValueError, Exception) as e:
|
||||||
|
logger.error(f"sidebar_workspace_tree failed: {e}", exc_info=True)
|
||||||
return HTMLResponse(
|
return HTMLResponse(
|
||||||
'<li class="sidebar-item empty-hint"><span class="page-icon">📄</span>'
|
'<li class="sidebar-item empty-hint"><span class="page-icon">📄</span>'
|
||||||
'<span class="page-name text-dim">No pages yet</span></li>'
|
'<span class="page-name text-dim">No pages yet</span></li>'
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
{% macro render_workspace_tree(pages, depth=0) %}
|
||||||
|
{% for page in pages %}
|
||||||
|
<li class="sidebar-item ws-tree-item"
|
||||||
|
data-id="{{ page.db_id }}"
|
||||||
|
data-is-folder="{{ 'true' if page.is_folder else 'false' }}"
|
||||||
|
data-depth="{{ depth }}"
|
||||||
|
:class="{ active: activeNodeId === {{ page.db_id }} }"
|
||||||
|
draggable="true"
|
||||||
|
@dragstart="dragStart($event, {{ page.db_id }})"
|
||||||
|
@dragover.prevent="dragOver($event, {{ page.db_id }}, {{ 'true' if page.is_folder else 'false' }})"
|
||||||
|
@dragleave="dragLeave($event)"
|
||||||
|
@drop.prevent="drop($event, {{ page.db_id }})"
|
||||||
|
style="padding-left:{{ 4 + depth * 12 }}px;"
|
||||||
|
@contextmenu.prevent="showWsContext($event, {{ page.db_id }}, '{{ page.name | e }}', {{ 'true' if page.is_folder else 'false' }})"
|
||||||
|
@touchstart="wsTouchStart($event)"
|
||||||
|
@touchend="wsTouchEnd($event, {{ page.db_id }}, '{{ page.name | e }}', {{ 'true' if page.is_folder else 'false' }})"
|
||||||
|
@touchmove="wsTouchMove($event)">
|
||||||
|
{% if page.is_folder %}
|
||||||
|
<button class="tree-chevron"
|
||||||
|
@click.stop="toggleTreeFolder({{ page.db_id }})"
|
||||||
|
:class="{ open: expandedFolders[{{ page.db_id }}] }"
|
||||||
|
title="Toggle folder">▶</button>
|
||||||
|
{% else %}
|
||||||
|
<span style="width:12px;flex-shrink:0;"></span>
|
||||||
|
{% endif %}
|
||||||
|
<span class="page-icon">{{ page.icon }}</span>
|
||||||
|
{% if page.is_folder %}
|
||||||
|
<span class="page-name tree-folder-link"
|
||||||
|
@click.stop="navigateToFolder({{ page.db_id }})"
|
||||||
|
draggable="false"
|
||||||
|
title="Open folder">{{ page.name }}{% if page.child_count %} <span class="child-count">({{ page.child_count }})</span>{% endif %}</span>
|
||||||
|
{% else %}
|
||||||
|
<a href="/pages/{{ page.db_id }}" class="page-name" draggable="false">{{ page.name }}</a>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% if page.children %}
|
||||||
|
<li x-show="expandedFolders[{{ page.db_id }}]" x-transition style="list-style:none;margin:0;padding:0;">
|
||||||
|
<ul style="list-style:none;margin:0;padding:0;">
|
||||||
|
{{ render_workspace_tree(page.children, depth + 1) }}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
+1
-44
@@ -128,50 +128,7 @@
|
|||||||
<button class="section-action-btn" title="New Folder" @click.stop="newFolderInWorkspace()">📁</button>
|
<button class="section-action-btn" title="New Folder" @click.stop="newFolderInWorkspace()">📁</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% macro render_workspace_tree(pages, depth=0) %}
|
{% from '_workspace_tree_macro.html' import render_workspace_tree %}
|
||||||
{% for page in pages %}
|
|
||||||
<li class="sidebar-item ws-tree-item"
|
|
||||||
data-id="{{ page.db_id }}"
|
|
||||||
data-is-folder="{{ 'true' if page.is_folder else 'false' }}"
|
|
||||||
data-depth="{{ depth }}"
|
|
||||||
:class="{ active: activeNodeId === {{ page.db_id }} }"
|
|
||||||
draggable="true"
|
|
||||||
@dragstart="dragStart($event, {{ page.db_id }})"
|
|
||||||
@dragover.prevent="dragOver($event, {{ page.db_id }}, {{ 'true' if page.is_folder else 'false' }})"
|
|
||||||
@dragleave="dragLeave($event)"
|
|
||||||
@drop.prevent="drop($event, {{ page.db_id }})"
|
|
||||||
style="padding-left:{{ 4 + depth * 12 }}px;"
|
|
||||||
@contextmenu.prevent="showWsContext($event, {{ page.db_id }}, '{{ page.name | e }}', {{ 'true' if page.is_folder else 'false' }})"
|
|
||||||
@touchstart="wsTouchStart($event)"
|
|
||||||
@touchend="wsTouchEnd($event, {{ page.db_id }}, '{{ page.name | e }}', {{ 'true' if page.is_folder else 'false' }})"
|
|
||||||
@touchmove="wsTouchMove($event)">
|
|
||||||
{% if page.is_folder %}
|
|
||||||
<button class="tree-chevron"
|
|
||||||
@click.stop="toggleTreeFolder({{ page.db_id }})"
|
|
||||||
:class="{ open: expandedFolders[{{ page.db_id }}] }"
|
|
||||||
title="Toggle folder">▶</button>
|
|
||||||
{% else %}
|
|
||||||
<span style="width:12px;flex-shrink:0;"></span>
|
|
||||||
{% endif %}
|
|
||||||
<span class="page-icon">{{ page.icon }}</span>
|
|
||||||
{% if page.is_folder %}
|
|
||||||
<span class="page-name tree-folder-link"
|
|
||||||
@click.stop="navigateToFolder({{ page.db_id }})"
|
|
||||||
draggable="false"
|
|
||||||
title="Open folder">{{ page.name }}{% if page.child_count %} <span class="child-count">({{ page.child_count }})</span>{% endif %}</span>
|
|
||||||
{% else %}
|
|
||||||
<a href="/pages/{{ page.db_id }}" class="page-name" draggable="false">{{ page.name }}</a>
|
|
||||||
{% endif %}
|
|
||||||
</li>
|
|
||||||
{% if page.children %}
|
|
||||||
<li x-show="expandedFolders[{{ page.db_id }}]" x-transition style="list-style:none;margin:0;padding:0;">
|
|
||||||
<ul style="list-style:none;margin:0;padding:0;">
|
|
||||||
{{ render_workspace_tree(page.children, depth + 1) }}
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endmacro %}
|
|
||||||
<div class="sidebar-section-items" x-show="sectionsOpen.workspace" x-transition>
|
<div class="sidebar-section-items" x-show="sectionsOpen.workspace" x-transition>
|
||||||
<ul class="sidebar-items" data-section="workspace" id="sidebar-workspace-items">
|
<ul class="sidebar-items" data-section="workspace" id="sidebar-workspace-items">
|
||||||
{% if workspace_pages %}
|
{% if workspace_pages %}
|
||||||
|
|||||||
Reference in New Issue
Block a user