Commit Graph
344 Commits
Author SHA1 Message Date
bruno 0a675a94f7 feat: v4.0.1 — onboarding, landing page, smart redirect, register GET, 404 stylé, API unifiée
- Landing page / pour visiteurs non-auth (template landing.html)
- Redirection / intelligente: non-auth → landing, auth sans Gitea → local workspace, auth+Gitea → dashboard
- GET /auth/register — page d'inscription dédiée (tab register actif)
- 404 handler stylisé thème Notion sombre (JSON pour /api/*, HTML pour le reste)
- Alias /api/pages GET/POST → /board/api/pages (307 redirect)
- 133 tests passent
2026-07-20 07:55:09 -04:00
bruno c94dac2bbf Remove per-file 📚 icon from Recents/Favorites/Shared/Published section items
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
2026-07-20 06:55:49 -04:00
bruno 29d1ccb3dc Sidebar: replace '→ Library' text with 📚 icon, remove per-file 📚 in workspace tree
FlowDeck CI / test (push) Failing after 6s
FlowDeck CI / docker (push) Has been skipped
2026-07-20 06:47:45 -04:00
bruno 8d3bb36982 Remove prompt() from createPage() — creates Untitled file directly in correct workspace
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
2026-07-19 22:01:34 -04:00
bruno 98bda37484 Make createPage() and createFolder() context-aware
FlowDeck CI / test (push) Failing after 3s
FlowDeck CI / docker (push) Has been skipped
- createPage() now detects active workspace context (library, local-workspace page, sidebar)
- In a local/Gitea workspace: creates workspace item via /api/local-workspace/items with prompt
- No workspace: creates general Notion page via /board/api/pages (no prompt)
- Added hidden #fd-local-ws-id in local_workspace.html to expose workspace_id
- _confirmCreateFolder() passes workspace_id for Gitea workspaces
- Added _getContext() helper that checks multiple context sources in priority order
- Added _toast() helper for cross-component notifications
2026-07-19 21:56:46 -04:00
bruno 9100da74f3 Unify all New Page / New Folder buttons across the app
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- Add global window.FlowDeck namespace with createPage() and showCreateFolderModal()
- createPage() creates a Notion-style page via /board/api/pages (same as sidebar bottom-right button)
- showCreateFolderModal() opens a global themed modal (dark/light) instead of browser prompt()
- All New Page buttons now call window.FlowDeck.createPage()
- All New Folder buttons now call window.FlowDeck.showCreateFolderModal()
- Global New Folder modal uses existing .flowdeck-modal CSS classes for theme consistency
- Updated Ctrl+N keyboard shortcut to use unified createPage()
2026-07-19 21:40:39 -04:00
bruno 74883688ef fix(library): filtres source/tri/vue + recherche + colonnes masquables + icônes SVG + drag-drop visuel
FlowDeck CI / test (push) Failing after 12s
FlowDeck CI / docker (push) Has been skipped
Ajout dropdowns filter/sort/view dans toolbar, recherche inline, colonnes author/source masquables, remplacement emojis par SVG, amélioration styles hover/drag, modal move-to, menus contextuels enrichis.
2026-07-19 21:22:59 -04:00
bruno a5242ee79b fix(library): augmenter opacité hover-only 0.4→0.55, dots plus visibles, bouton OPEN amélioré
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
2026-07-19 15:15:44 -04:00
bruno 10d10b28c8 debug: log offsetHeight
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
2026-07-19 15:09:27 -04:00
bruno 2471119b4a fix(library): supprimer tous les x-show (loading, empty) — _renderTable contrôle tout
FlowDeck CI / test (push) Failing after 8s
FlowDeck CI / docker (push) Has been skipped
2026-07-19 15:07:48 -04:00
bruno 02cf759ec8 debug(library): add console.log in _renderTable
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
2026-07-19 15:04:44 -04:00
bruno 978b286990 fix(library): supprimer x-show du tableau + gestion visibilité dans _renderTable
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Le x-show sur #lib-table dépendait de flatItems.length,
qu'Alpine 3.14.9 ne détecte pas. Maintenant _renderTable()
contrôle l'affichage/masquage directement via style.display.
2026-07-19 14:58:34 -04:00
bruno 74102f00ab fix(library): rendu DOM direct (innerHTML) + suppression SortableJS
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
Abandon complet d'Alpine pour le rendu du tableau :
- _renderTable() fait innerHTML directement sur #lib-table-body
- Plus de x-for, plus de x-html, plus de getters
- SortableJS supprimé (causait removeEventListener sur null)
- Fix startRename/commitRenameById pour utiliser les IDs DOM
2026-07-19 14:53:17 -04:00
bruno 5dc8bd5a33 fix(library): x-html au lieu de x-for — contourne bug Alpine 3.14.9
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Le x-for d'Alpine 3.14.9 ne détecte pas les changements d'array.
Remplacement complet par x-html avec génération HTML manuelle.
Ajout de window._libData pour les onclick handlers globaux.
Fonctions _byId pour toggle/expand/rename/open depuis le HTML.
2026-07-19 14:49:17 -04:00
bruno c2eb088bb2 fix(library): splice au lieu d'assignation pour Alpine 3.14.9 x-for
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
Alpine 3.14.9 ne détecte pas le changement de référence d'array
(this.flatItems = result). Utilisation de splice() pour muter
l'array en place. Ajout de $nextTick pour forcer le re-render.
2026-07-19 14:45:06 -04:00
bruno 5967dd9056 debug(library): ajouter console.log pour tracer init + loadTab + flatItems
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Ajoute des logs dans init(), loadTab() et _recomputeFlatItems()
pour identifier pourquoi flatItems reste vide malgré le chargement API.
CSP: ajout fonts.googleapis.com/gstatic.com pour débloquer Google Fonts.
2026-07-19 14:41:21 -04:00
bruno c681018262 fix(library): icônes toujours visibles (opacity 0.4) + full au hover
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Remplacé visibility:hidden par opacity:0.4 pour les hover-only.
Cela garantit que les éléments sont RENDUS et visibles en permanence,
avec accentuation au hover (opacity 1).
2026-07-19 14:30:59 -04:00
bruno a94794ec81 fix(library): SQL workspace — (workspace != '' OR workspace_id IS NOT NULL)
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Les pages du workspace local ont workspace='' mais workspace_id=27.
Le filtre workspace != '' les excluait, retournant 0 items.
Ajout de OR workspace_id IS NOT NULL pour inclure les pages locales.
Simplification du frontend: le workspace tab appelle l'API standard avec workspace_id.
2026-07-19 14:14:07 -04:00
bruno 1bafbf1eff fix(library): tab Workspace affiche le contenu du workspace local actif
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- Nouvel endpoint /api/library/local-workspace?workspace_id=X
  interroge local_workspace_items et formate pour la Library
- Nouvel endpoint /api/library/local-workspace-children/{id}
  pour l'expansion d'arborescence des items du workspace local
- Frontend: détecte workspaceId + !isGiteaActive → appelle local-workspace
- Frontend: toggleExpand route vers le bon endpoint selon source_type
2026-07-19 14:12:04 -04:00
bruno d3923c1d9a fix(library): workspace tab — ne pas filtrer par workspace_id (NULL dans la DB)
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
Les pages ont workspace_id=NULL, donc le filtre ne retournait rien.
Le tab Workspace affiche maintenant toutes les pages avec workspace != ''.
2026-07-19 13:53:57 -04:00
bruno 9f17c39599 fix(library): supprimer getters Alpine 3.14.9 + Private tab caché quand workspace actif
FlowDeck CI / test (push) Failing after 8s
FlowDeck CI / docker (push) Has been skipped
- Tous les getters (flatItems, selectedCount, allSelected, emptyIcon/Title/Text)
  remplacés par des propriétés + fonctions _recompute().
  Les getters causent un bug connu d'Alpine 3.14.9 qui bloque l'init.
- Private tab: x-show="!workspaceId && !isGiteaActive"
  (caché quand un workspace local OU distant est ouvert)
2026-07-19 13:45:27 -04:00
bruno 2ee0a05efd fix(library): visibility hover + workspace filter + tab Repository pour Gitea
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- CSS hover-only: visibility:hidden/visible au lieu de opacity (infaillible)
- Workspace tab: filtré par workspace_id quand un workspace est actif
- Tab Private remplacé par Repository (visible seulement si Gitea workspace actif)
- Nouvel endpoint /api/library/repository pour le contenu Gitea
- dashboard.py passe is_gitea_workspace, owner, repo au template
2026-07-19 13:32:08 -04:00
bruno 04c059341d fix(workspace): corriger les séquences d'échappement cassées dans renderChildren
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
Les échappements de quotes dans le patch précédent étaient cassés
(\\' au lieu de \'), causant des erreurs de syntaxe JS qui
empêchaient l'initialisation de _wsInitData et donc d'Alpine.
2026-07-19 13:20:29 -04:00
bruno 31fba6da39 fix(library): layout Notion-style — drag+checkbox+OPEN dans colonne name, hover-only CSS corrigé
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- Drag handle (6 dots), checkbox, OPEN bouton intégrés dans la colonne Page name
- CSS hover-only: opacity 0 → 1 au mouseover (pas de visibilité permanente)
- Checkbox checked toujours visible (opacity:1) même sans hover
- OPEN bouton aligné à droite via margin-left:auto dans le name cell
- Double-clic sur le nom ouvre la page, simple clic = rename
- toggleExpand() force la réactivité Alpine via this.items = [...this.items]
- Colonnes drag/select/open séparées supprimées (layout Notion)
2026-07-19 13:12:44 -04:00
bruno b7c9401c92 fix(library): remove is_folder from children endpoint (pages table has no is_folder column)
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
2026-07-19 12:54:17 -04:00
bruno 33933352a8 fix(library+workspace): arborescence dans Workspace tab, icônes drag+multi-select visibles, inline rename au clic
FlowDeck CI / test (push) Failing after 13s
FlowDeck CI / docker (push) Has been skipped
- Library: ajout /api/library/children/{id} pour charger les enfants à la demande
- Library: drag handle (.drag-handle) et checkbox (.lib-checkbox) toujours visibles
- Library: SortableJS init pour drag-and-drop réordonner les rows
- Library: toggleExpand() async avec chargement des enfants depuis l'API
- Local workspace: drag handle 6-dots + checkbox toujours visible dans les tree items
- Local workspace: renderChildren() inclut checkbox + drag handle + inline rename
- Local workspace: clic sur nom de fichier = inline rename (plus navigation directe)
- Local workspace: bouton Open pour ouvrir le fichier (double-clic aussi)
- CSS: .item-checkbox toujours visible (plus opacity:0)
- CSS: .drag-handle avec opacité .45 par défaut, 1.0 au hover
2026-07-19 12:53:09 -04:00
bruno 6a2d56a7bd fix: Library page — hover effects, workspace filter, tree, rename
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
1. Hover effects fixed: converted table to div-based flexbox layout
   (tr/td don't support display:flex). .lib-row now properly shows
   drag handle, checkbox, and OPEN button on hover.

2. Recents filter by workspace: /api/library/recents now accepts
   workspace_id parameter. Template passes active_workspace_id from
   sidebar context to API calls.

3. Tree hierarchy: API now enriches items with has_children via
   _enrich_children() batch query — shows expand chevrons for
   pages with sub-pages.

4. Rename on click: single click on title starts inline rename
   (was opening page). OPEN button still opens side peek.

5. Code cleanup: extracted _enrich_children() helper to eliminate
   duplicate code across 6 endpoints.
2026-07-18 11:10:55 -04:00
bruno 28a41a30da feat: Notion-style Library page — complete redesign
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Complete rewrite of /library page to match Notion's Library design:

1. Table view with columns: Page name (with icon), Created by (avatar),
   Source, Last edited time, Last visited time
2. Hover effects showing drag handle (6 dots), checkbox, OPEN button
3. Side peek panel: opens on right, shows page content preview,
   close button, favorite toggle, copy link, more menu
4. Multi-selection: checkbox per row, select-all header, 'X selected' bar
   with Delete and '...' menu
5. ... menu: Remove from Recents, Copy links to all, Move to, Move to Trash
6. Inline rename: double-click title → edit field
7. 6 tabs: Recents, Favorites, Shared, Published, Private, Workspace
8. Tree expand/collapse for nested pages (has_children support)
9. + Add new row at bottom
10. Search bar toggleable

API additions:
- library.py: enhanced _build_item with icon, source_label, author
- dashboard.py: new /api/pages/{id}/content, /rename, /trash endpoints
- All 133 tests pass
2026-07-18 10:57:10 -04:00
bruno 5b56f970ee feat: compact breadcrumb menu + 'X more' Notion-style in workspace
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
1. Compact breadcrumb hover menu:
   - Reduced font-size: header-breadcrumb 14→13px, breadcrumb-link 14→13px
   - Dropdown menus: fd-nav-menu min-width 240→200px, padding reduced
   - fd-nav-item: padding 6px8→4px6, font 14→13px, gap 8→6px
   - fd-nav-section: font 11→10px, padding reduced
   - fd-nav-ico: size 16→14px, width 20→18px
   - fd-nav-arrow: size 16→14px, margin-left 4→2px

2. 'X more' Notion-style (tree view):
   - Shows first 5 items in displayTree, hides rest
   - 6th item shows 'X more...' with count of remaining items
   - Click to expand and show all items
   - 'Show less' button to collapse back to 5
   - showAll state auto-resets on folder navigation, sort, filter
   - Styling: semi-transparent hover effect on ws-more-item
2026-07-18 10:18:08 -04:00
bruno 37c8e99151 refactor: remove dead code _render_file_viewer from board.py
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
The standalone file viewer page (with '← Workspace' topbar) was dead code —
never called after the rollback. 192 lines removed, zero references left.
2026-07-18 10:03:09 -04:00
bruno 298617af58 revert: rollback _render_file_viewer wiring and URL encoding
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Rollback des commits 2226e5e et 2534e2b — les fichiers continuent
de s'ouvrir dans page_editor.html (layout normal avec sidebar),
pas dans le viewer standalone _render_file_viewer.
2026-07-18 09:44:48 -04:00
bruno 2226e5e2c8 fix: PDF viewer - also wire up _render_file_viewer in dashboard.py view_page_root
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
The real route for /pages/{page_id} is in dashboard.py (no prefix router),
not board.py (prefix /board). Both routes now call _render_file_viewer
for content_format='file' pages.
2026-07-18 09:37:38 -04:00
bruno 2534e2b425 fix: PDF viewer - wire up _render_file_viewer + URL-encode filenames
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
- view_page now calls _render_file_viewer for content_format='file' pages
  instead of rendering the full page_editor template (which was the old path)
- URL-encode filenames in file_url using urllib.parse.quote() to handle
  spaces and special characters correctly
- Fixed in both board.py (viewer + page_data) and dashboard.py

The _render_file_viewer was dead code — defined but never called. File pages
were going through page_editor.html which rendered PDFs in an iframe embedded
in the editor UI. Now they get a clean standalone HTML viewer.
2026-07-18 09:34:24 -04:00
bruno bd02c9ea8a fix: startup log version v2.1.0 → v4.0.0
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
2026-07-18 00:28:06 -04:00
bruno e85161dfc1 v4.0.0 — Route publique /p/<slug>, correctifs publish/share UI
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- Ajout route /p/<slug> qui sert les pages publiées (no auth, rendu HTML blocks)
- Template public_page.html — design épuré Notion-style
- Fix publishPage()/unpublishPage(): vérifient d.is_published au lieu de d.status==='ok'
- Fix shareInvite(): vérifie d.status==='shared'
- Fix removeShare(): vérifie d.status==='removed'
- ROADMAP.md: toutes les sections 4.0a-4.0e cochées ✅ (déjà implémentées)
- Version bump 2.5.0 → 4.0.0
2026-07-18 00:27:14 -04:00
bruno fe64617677 feat: star favoris dynamique + sidebar refresh sans reload
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- page_editor: étoile ⭐/☆ dynamique selon favorited (x-text)
- toggleFavorite() appelle refreshFavorites() du sidebar
- base.html: refreshFavorites() fetch /api/library/favorites + rebuild DOM
- Context menu 'Add to Favorites' → refreshFavorites() au lieu de location.reload()
- Les items dynamiques ont onclick/oncontextmenu pour fonctionner hors Alpine
2026-07-17 23:50:37 -04:00
bruno 25386bc79f feat: breadcrumb hover Notion-style + nav_workspace_id sur toutes les pages
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- _header.html: remplace click par hover (mouseenter/mouseleave)
  avec timer 200ms anti-flicker, cascade sous-menus au hover
- dashboard.py: ajoute nav_workspace_id à trash, library, workspace,
  gitea-workspace, local-workspace, workspaces, settings, pages/{id}
- La section du popover affiche 'Workspaces' pour Home, 'Private' pour le reste
- Les clics dans les popovers ferment le menu + naviguent
2026-07-17 23:43:16 -04:00
bruno d751415308 feat: add Notion-style breadcrumb navigation with dropdown menus
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
Backend:
- Added _nav_breadcrumb() to build page hierarchy chain (root → current)
- New /api/nav/menu endpoint returns workspace/folder children with has_children flag
- view_page() and view_page_root() now pass breadcrumb_items, nav_workspace_id, nav_page_id to template

Header template (_header.html):
- Replaced static breadcrumb with Alpine.js fdBreadcrumb() component
- Breadcrumb items now clickable with dropdown menus showing
2026-07-17 23:30:59 -04:00
bruno 6f1eabf91d fix: Windows path handling, light theme default, file viewer in editor, first-user admin logic
FlowDeck CI / test (push) Failing after 18s
FlowDeck CI / docker (push) Has been skipped
Config:
- Fixed SQLite path parsing on Windows (handle drive letters without prepending /)
- Changed default theme from dark to light
- Updated OAuth test credentials (gitea_oauth_client_id/secret)

Auth:
- First real user (excluding default admin with no password) becomes admin
- Changed user count query to exclude users without password_hash

File viewer:
- Removed separate _render_file_viewer() —
2026-07-17 20:38:39 -04:00
bruno c2ef7bfaa0 fix: show auto-created workspace name instead of 'Private' in sidebar
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
For Gitea workspaces, the sidebar section now displays the actual
workspace name (e.g. '📁 Projets/Ares') instead of the generic '📁 Private'.
The workspace name is auto-created from the Gitea project's owner/repo
when the remote workspace is first opened.
2026-07-16 14:27:47 -04:00
bruno c990382085 fix: use Alpine.data() to register giteaWorkspace component
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Replaced global function giteaWorkspace() with Alpine.data('giteaWorkspace', ...)
registered via document.addEventListener('alpine:init', ...). This is the
recommended Alpine 3 approach that guarantees the component factory is
available before Alpine processes x-data directives.

Changed x-data="giteaWorkspace()" to x-data="giteaWorkspace" (Alpine.data
calls the factory automatically, no parentheses needed).
2026-07-16 14:12:53 -04:00
bruno b141af886d fix: move giteaWorkspace() script before x-data div to fix init race
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
The <script> defining giteaWorkspace() was placed AFTER the <div x-data>
in the DOM, causing Alpine to try to evaluate giteaWorkspace() before
the function was defined. This resulted in 'Uncaught ReferenceError' for
all component properties (fileLoading, fileLanguage, showFile, etc.).

Fix: moved the <script> block to appear BEFORE the x-data div in the
HTML source, ensuring the function is defined when Alpine initializes.
2026-07-16 14:07:17 -04:00
bruno 56c5739605 fix: remove getter from giteaWorkspace() to fix Alpine 3.14.9 init error
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
The 'get sortedTreeItems()' getter caused Alpine's Proxy to fail during
component initialization, resulting in all properties being undefined
(fileLoading, fileLanguage, showFile, etc. — Uncaught ReferenceError).

Fix:
- Replaced getter with _sortTree() method + sortedTreeItems property
- _sortTree() called after treeItems is updated in loadMainTree()
- sortedTreeItems explicitly set to [] on error/empty paths
2026-07-16 13:48:47 -04:00
bruno 7613129204 fix: Gitea sidebar now has separate Repository section below Private
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Backend:
- _sidebar_data() no longer clears workspace_pages for Gitea workspaces
  The local tree stays intact in the 'Private' section
- workspace_pages is always loaded from DB (local files)

Sidebar template (base.html):
- Workspace section renamed to 'Private' when gitea_workspace is true
- New 'Repository (Gitea)' section added below, visible only for Gitea
  workspaces, with its own toggle (sectionsOpen.gitea) and refresh button
- Uses #sidebar-gitea-items container for the remote file tree

Gitea workspace:
- loadSidebarTree() now targets #sidebar-gitea-items
- window._gwData exposed for sidebar refresh button
- sectionsOpen now includes gitea: true by default
2026-07-16 13:44:10 -04:00
bruno f61f8b61ae fix: Gitea sidebar tree + header actions inline with title
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Gitea workspace sidebar:
- loadSidebarTree() now uses innerHTML replacement instead of DOM
  manipulation (avoids Alpine reactivity overwrites)
- Ensures workspace section is visible when tree loads
- Shows error message when Gitea API fails (no token/gateway)
- Better error handling with console.error catch

Header actions inline:
- page_editor: moved Edited/Share/Copy/Favorite/More buttons into
  the unified header (right_actions), accessible via window.E
  (editorState global reference set in init)
- Removed duplicate page-topbar div from content area
- Share dialog, More menu, and Activity popover stay in content
  area (triggered by header buttons via window.E references)
- Gitea workspace: header now uses page-action-btn for consistency
2026-07-16 13:08:14 -04:00
bruno 3210ac65a6 feat: Move to, Gitea context menu, Activity popover
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
Move to workspace:
- movePage() opens a dialog listing all workspaces via /api/workspaces
- doMove(wsId) calls PUT /api/pages/{id}/move with workspace_id
- Updated move API to accept JSON body with workspace_id for cross-workspace moves

Gitea workspace context menu:
- Right-click on any file/folder shows Rename + Delete options
- gwRename() prompts for new name, calls PUT /api/gitea/.../file
- gwDelete() confirms then calls DELETE /api/gitea/.../file
- Both trigger refreshTree() after success

Activity popover:
- 'Edited X ago' timestamp is now clickable (▾ indicator)
- Opens popover showing edited time + created date
- formatDate() helper for readable date formatting
2026-07-16 12:53:38 -04:00
bruno cef267d7b5 feat: real timestamp + working Export + polished More menu in page editor
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- 'Edited X ago' now shows real relative time from page.updated_at
- timeAgo computed getter in editorState() calculates relative time
- Export now generates a Markdown file from blocks and triggers download
- blocksToMarkdown() helper converts blocks to proper Markdown syntax
  (headings, lists, todos, quotes, dividers, code blocks)
- More menu items: Duplicate (was working), Export (now works),
  Move to Trash (was working), Copy link (via shortcut)
2026-07-16 12:49:45 -04:00
bruno 043dd4871c feat: gitea-workspace now has file tree browser like local-workspace
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
- Main content area now shows file/folder tree with breadcrumb navigation
- Click folders to drill down, click files to open
- Breadcrumb shows current path with clickable segments
- Sorted tree: folders first, then files alphabetically
- refreshTree() now reloads without full page reload
- Empty state with 'New file' button when folder is empty
2026-07-16 12:42:48 -04:00
bruno b5dd37a652 fix: remove duplicate action bar from page_editor (double header)
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped
The unified _header.html already renders the topbar with breadcrumb. The
page_editor had a second 'page-topbar' div in the content area with the
same buttons (Share, Copy link, Favorite, More). Removed the duplicate
actions from the header, keeping them only in the content area where
they are in the correct Alpine scope (editorState()).

This fixes:
- Double header visual duplication
- Share/Copy/Favorite/More buttons now work (in editorState scope)
2026-07-16 12:41:25 -04:00
bruno d4fb095baf feat: unified header across all pages (Notion-inspired breadcrumb + actions)
FlowDeck CI / test (push) Failing after 5s
FlowDeck CI / docker (push) Has been skipped
Created a shared _header.html template with:
- Hamburger button (toggle sidebar)
- Breadcrumb navigation with clickable segments and separators
- Page icon + title display
- Right-side action buttons (configurable per page)
- Dropdown panel CSS for More/New menus

Updated all pages to use the unified header:
- workspaces.html: Home / Workspaces + login/settings
- workspace.html: Workspace — Projects + login/settings
- local_workspace.html: workspace name
- gitea_workspace.html: Home / owner/repo + New/Upload/Refresh/Settings
- page_editor.html: title + Edited/Share/Copy/Favorite/More dropdown
- settings.html: Settings

Added CSS for breadcrumb, dropdown panel components.
2026-07-16 12:30:18 -04:00