fix: /local-workspace — chemin du header + clic sur un dossier du sidebar (v7.69.9)
Corrige deux régressions de /local-workspace :
- le chemin du header restait bloqué sur « Home / <workspace> » quel que
soit le dossier affiché : la route rend désormais breadcrumb_items
(Home / <workspace> / <dossier> / <sous-dossier>, niveaux cliquables,
collapse « … » au-delà de 4) et la navigation sans rechargement recalcule
le chemin via l'event flowdeck:breadcrumb-changed ;
- le clic sur un dossier du sidebar affichait TOUS les composants à la
fois : Alpine.data('wsInitData') retournait le même objet singleton, le
2e montage (navigation partielle) levait « Cannot redefine property:
\ » et initTree abandonnait, laissant tout le contenu au state
brut. La factory retourne désormais une enveloppe fraîche par montage
qui délègue à l'état réactif partagé. #lw-config est aussi relu à chaque
exécution (le 2e montage gardait le folder_id du 1er chargement).
Inclus également le travail en cours de l'arbre : Library (colonnes Last
visited/Source, ordre d'en-tête, favoris à icônes Workspace), Meeting
Notes (bloc, CSS, routes, docs), coloration de code hljs, badges
favori/publié dans l'arbre local-workspace, docs (DATA_MODEL,
architectures) et tests associés.
This commit is contained in:
@@ -60,20 +60,38 @@
|
||||
/* ── Table (div-based for hover effects) ── */
|
||||
.lib-table{width:100%;}
|
||||
.lib-table-header{display:flex;align-items:center;border-bottom:1px solid var(--border);padding:0;}
|
||||
.lib-table-header .th{display:flex;align-items:center;gap:5px;padding:6px 8px;font-size:12px;font-weight:500;color:var(--text-dim);user-select:none;white-space:nowrap;}
|
||||
.lib-table-header .th{display:flex;align-items:center;gap:5px;padding:6px 8px;font-size:12px;font-weight:500;color:var(--text-dim);user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
.lib-table-header .th svg{width:13px;height:13px;flex-shrink:0;}
|
||||
|
||||
/* Column widths — Notion-style */
|
||||
.lib-col-name{flex:1;min-width:0;}
|
||||
.lib-col-author{width:150px;flex-shrink:0;display:none;}
|
||||
.lib-col-source{width:120px;flex-shrink:0;display:none;}
|
||||
.lib-col-author{width:150px;flex-shrink:0;}
|
||||
.lib-col-editedby{width:150px;flex-shrink:0;}
|
||||
.lib-col-source{width:120px;flex-shrink:0;}
|
||||
.lib-col-edited{width:110px;flex-shrink:0;text-align:right;justify-content:flex-end;}
|
||||
.lib-table.show-author .lib-col-author{display:flex;}
|
||||
.lib-table.show-source .lib-col-source{display:flex;}
|
||||
.lib-col-visited{width:130px;flex-shrink:0;text-align:right;justify-content:flex-end;}
|
||||
/* Visibilité des colonnes pilotée par Show columns. Ces règles doivent
|
||||
battre .lib-table-header .th et .lib-row .row-cell (spécificité 0,2,0) :
|
||||
avant, seul :not(.show-editedtime) (0,3,0) gagnait, donc seule Last
|
||||
edited time s'affichait/masquait — les autres options semblaient mortes. */
|
||||
.lib-table div.lib-col-author,
|
||||
.lib-table div.lib-col-editedby,
|
||||
.lib-table div.lib-col-source,
|
||||
.lib-table div.lib-col-visited{display:none;}
|
||||
.lib-table.show-author div.lib-col-author,
|
||||
.lib-table.show-editedby div.lib-col-editedby,
|
||||
.lib-table.show-source div.lib-col-source,
|
||||
.lib-table.show-visited div.lib-col-visited{display:flex;}
|
||||
.lib-table:not(.show-editedtime) div.lib-col-edited{display:none;}
|
||||
.row-source{display:inline-flex;align-items:center;gap:5px;}
|
||||
.row-source svg{width:13px;height:13px;flex-shrink:0;color:var(--text-dim);}
|
||||
|
||||
/* ── Row ── */
|
||||
.lib-row{display:flex;align-items:center;height:34px;transition:background 0.1s;position:relative;}
|
||||
.lib-row:hover{background:var(--bg-hover);}
|
||||
/* ── Date section headers (AI Meeting Notes tab) ── */
|
||||
.lib-section-header{display:flex;align-items:center;font-size:12px;font-weight:600;color:var(--text-secondary);padding:10px 8px 4px;user-select:none;}
|
||||
.lib-section-header:first-child{padding-top:2px;}
|
||||
.lib-row.selected{background:rgba(35,131,226,0.08);}
|
||||
.lib-row.drag-over{outline:2px solid var(--accent);outline-offset:-2px;background:rgba(35,131,226,0.12);}
|
||||
.lib-row.dragging{opacity:0.4;}
|
||||
@@ -189,7 +207,7 @@
|
||||
|
||||
/* ── Responsive ── */
|
||||
@media(max-width:768px){
|
||||
.lib-col-author,.lib-col-source{display:none!important;}
|
||||
.lib-col-author,.lib-col-editedby,.lib-col-source,.lib-col-visited{display:none!important;}
|
||||
.peek-overlay{width:100vw;max-width:100vw;}
|
||||
}
|
||||
</style>
|
||||
@@ -212,6 +230,9 @@
|
||||
<button class="lib-tab" :class="{ active: tab === 'recents' }" @click="switchTab('recents')">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><polyline points="12 7 12 12 16 14"/></svg> Recents
|
||||
</button>
|
||||
<button class="lib-tab" :class="{ active: tab === 'meetings' }" @click="switchTab('meetings')">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg> AI Meeting Notes
|
||||
</button>
|
||||
<button class="lib-tab" :class="{ active: tab === 'favorites' }" @click="switchTab('favorites')">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg> Favorites
|
||||
</button>
|
||||
@@ -265,6 +286,9 @@
|
||||
<div class="lib-dropdown" x-show="viewOpen" @click.outside="viewOpen=false" x-transition>
|
||||
<div class="dd-label">Show columns</div>
|
||||
<div class="dd-item" @click="toggleColumn('author')"><span class="check" x-text="showAuthor ? '✓' : ''"></span> Created by</div>
|
||||
<div class="dd-item" @click="toggleColumn('editedby')"><span class="check" x-text="showEditedBy ? '✓' : ''"></span> Last edited by</div>
|
||||
<div class="dd-item" @click="toggleColumn('editedtime')"><span class="check" x-text="showEditedTime ? '✓' : ''"></span> Last edited time</div>
|
||||
<div class="dd-item" @click="toggleColumn('visited')"><span class="check" x-text="showVisited ? '✓' : ''"></span> Last visited time</div>
|
||||
<div class="dd-item" @click="toggleColumn('source')"><span class="check" x-text="showSource ? '✓' : ''"></span> Source</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -351,7 +375,7 @@
|
||||
</div>
|
||||
|
||||
<!-- ── Table ── -->
|
||||
<div class="lib-table" id="lib-table" :class="{'show-author': showAuthor, 'show-source': showSource}">
|
||||
<div class="lib-table" id="lib-table" :class="{'show-author': showAuthor, 'show-editedby': showEditedBy, 'show-editedtime': showEditedTime, 'show-visited': showVisited, 'show-source': showSource}">
|
||||
<div class="lib-table-header">
|
||||
<div class="th lib-col-name">
|
||||
<input type="checkbox" style="width:14px;height:14px;accent-color:var(--accent);cursor:pointer;margin-left:2px;margin-right:6px;" :checked="allSelected" @click="toggleSelectAll()" title="Select / unselect all">
|
||||
@@ -359,11 +383,16 @@
|
||||
Page name
|
||||
</div>
|
||||
<div class="th lib-col-author">Created by</div>
|
||||
<div class="th lib-col-source">Source</div>
|
||||
<div class="th lib-col-editedby">Last edited by</div>
|
||||
<div class="th lib-col-edited">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><polyline points="12 7 12 12 16 14"/></svg>
|
||||
Last edited time
|
||||
</div>
|
||||
<div class="th lib-col-visited">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
Last visited time
|
||||
</div>
|
||||
<div class="th lib-col-source">Source</div>
|
||||
</div>
|
||||
<div class="lib-table-body" id="lib-table-body">
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user