@exxatdesignux/ui 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +701 -6
- package/README.md +138 -0
- package/bin/init.mjs +134 -31
- package/consumer-extras/cursor-rules/exxat-board-cards.mdc +1 -1
- package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +2 -2
- package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +1 -1
- package/consumer-extras/cursor-rules/exxat-data-tables.mdc +2 -0
- package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +1 -1
- package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +3 -3
- package/consumer-extras/cursor-rules/exxat-library-hub-header.mdc +28 -0
- package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +1 -1
- package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +1 -1
- package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +6 -6
- package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +1 -1
- package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +2 -2
- package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -3
- package/consumer-extras/cursor-skills/exxat-dedicated-search-surfaces/SKILL.md +2 -2
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +7 -7
- package/consumer-extras/cursor-skills/exxat-kpi-flat-band/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-list-page-view-shells/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +4 -4
- package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +8 -8
- package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +277 -0
- package/consumer-extras/handbook/HANDBOOK.md +2 -0
- package/consumer-extras/handbook/glossary.md +2 -1
- package/consumer-extras/handbook/reference-implementations.md +31 -4
- package/consumer-extras/patterns/collaboration-access-pattern.md +7 -7
- package/consumer-extras/patterns/data-views-pattern.md +18 -16
- package/consumer-extras/patterns/kpi-flat-band-pattern.md +2 -2
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/data-table/index.js.map +1 -1
- package/dist/components/data-table/pagination.js +3 -3
- package/dist/components/data-table/pagination.js.map +1 -1
- package/dist/components/data-table/use-table-state.d.ts +1 -1
- package/dist/components/data-table/use-table-state.js.map +1 -1
- package/dist/components/data-views/data-row-list.js.map +1 -1
- package/dist/components/data-views/finder-panel-view.d.ts +1 -1
- package/dist/components/data-views/finder-panel-view.js.map +1 -1
- package/dist/components/data-views/hub-table.d.ts +9 -3
- package/dist/components/data-views/hub-table.js +262 -40
- package/dist/components/data-views/hub-table.js.map +1 -1
- package/dist/components/data-views/index.js +262 -40
- package/dist/components/data-views/index.js.map +1 -1
- package/dist/components/data-views/list-page-split-hub-tokens.d.ts +2 -2
- package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -1
- package/dist/components/data-views/list-page-tree-column-header.d.ts +1 -1
- package/dist/components/data-views/list-page-tree-column-header.js.map +1 -1
- package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -1
- package/dist/components/data-views/os-folder-glyph.d.ts +1 -1
- package/dist/components/data-views/os-folder-glyph.js.map +1 -1
- package/dist/components/ui/avatar.d.ts +1 -1
- package/dist/components/ui/key-metrics.js.map +1 -1
- package/dist/index.js +136 -39
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/src/components/data-table/index.tsx +2 -2
- package/src/components/data-table/pagination.tsx +5 -1
- package/src/components/data-table/use-table-state.ts +1 -1
- package/src/components/data-views/data-row-list.tsx +1 -1
- package/src/components/data-views/finder-panel-view.tsx +2 -2
- package/src/components/data-views/hub-table.tsx +149 -41
- package/src/components/data-views/list-page-split-hub-tokens.ts +2 -2
- package/src/components/data-views/list-page-tree-column-header.tsx +1 -1
- package/src/components/data-views/os-folder-glyph.tsx +1 -1
- package/src/components/ui/key-metrics.tsx +1 -1
- package/template/.claude/skills/exxat-ds-skill/SKILL.md +8 -7
- package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
- package/template/.cursor/rules/exxat-command-menu.mdc +1 -1
- package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +6 -6
- package/template/.cursor/rules/exxat-data-tables.mdc +3 -3
- package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +5 -5
- package/template/.cursor/rules/exxat-mono-ids.mdc +1 -1
- package/template/.cursor/rules/exxat-page-vs-drawer.mdc +1 -1
- package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
- package/template/AGENTS.md +43 -37
- package/template/app/(app)/columns/page.tsx +11 -0
- package/template/app/(app)/library/all/page.tsx +11 -0
- package/template/app/(app)/library/find/page.tsx +12 -0
- package/template/app/(app)/{question-bank → library}/layout.tsx +16 -16
- package/template/app/(app)/library/list/page.tsx +12 -0
- package/template/app/(app)/{question-bank → library}/new/page.tsx +10 -10
- package/template/app/(app)/library/page.tsx +11 -0
- package/template/app/(app)/tokens-themes/page.tsx +11 -0
- package/template/components/ask-leo-composer.tsx +2 -2
- package/template/components/columns-client.tsx +158 -0
- package/template/components/columns-showcase.tsx +541 -0
- package/template/components/data-views/index.ts +32 -6
- package/template/components/data-views/{question-bank-folder-tree-branch.tsx → library-folder-tree-branch.tsx} +19 -19
- package/template/components/data-views/table-cells.tsx +673 -0
- package/template/components/folder-details-shell.tsx +11 -11
- package/template/components/hub-tree-panel-view.tsx +24 -24
- package/template/components/{question-bank-board-view.tsx → library-board-view.tsx} +44 -44
- package/template/components/{question-bank-client.tsx → library-client.tsx} +82 -82
- package/template/components/{question-bank-dashboard-charts.tsx → library-dashboard-charts.tsx} +14 -14
- package/template/components/{question-bank-favorite-button.tsx → library-favorite-button.tsx} +7 -7
- package/template/components/{question-bank-hub-client.tsx → library-hub-client.tsx} +43 -43
- package/template/components/{question-bank-new-folder-sheet.tsx → library-new-folder-sheet.tsx} +14 -14
- package/template/components/{question-bank-os-folder-view.tsx → library-os-folder-view.tsx} +31 -31
- package/template/components/{question-bank-page-header.tsx → library-page-header.tsx} +6 -6
- package/template/components/library-panel-activator.tsx +8 -0
- package/template/components/{question-bank-secondary-nav.tsx → library-secondary-nav.tsx} +60 -60
- package/template/components/{question-bank-table.tsx → library-table.tsx} +97 -97
- package/template/components/list-hub-status-badge.tsx +2 -2
- package/template/components/{new-question-composer.tsx → new-library-item-form.tsx} +37 -37
- package/template/components/sidebar/app-sidebar.tsx +61 -5
- package/template/components/sidebar/secondary-panel.tsx +109 -56
- package/template/components/sidebar/sidebar-auto-collapse.tsx +2 -2
- package/template/components/sidebar/sidebar-auto-open.tsx +2 -1
- package/template/components/table-properties/types.ts +1 -1
- package/template/components/templates/discovery-hub-template.tsx +1 -1
- package/template/components/templates/new-focus-template.tsx +2 -2
- package/template/components/templates/secondary-panel-hub-template.tsx +1 -1
- package/template/components/tokens-secondary-nav.tsx +192 -0
- package/template/components/tokens-themes-client.tsx +476 -0
- package/template/components/tokens-themes-section.tsx +386 -0
- package/template/docs/HANDBOOK.md +187 -0
- package/template/docs/blueprints/README.md +1 -1
- package/template/docs/blueprints/board-card.md +1 -1
- package/template/docs/blueprints/data-table.md +2 -2
- package/template/docs/blueprints/list-page-template.md +3 -3
- package/template/docs/blueprints/page-header.md +4 -4
- package/template/docs/collaboration-access-pattern.md +7 -7
- package/template/docs/component-selection-guide.md +1 -1
- package/template/docs/data-views-pattern.md +18 -16
- package/template/docs/glossary.md +58 -0
- package/template/docs/kpi-flat-band-pattern.md +3 -3
- package/template/docs/kpi-trend-pattern.md +18 -3
- package/template/docs/large-dataset-strategy.md +155 -0
- package/template/docs/library-hub-header-pattern.md +25 -0
- package/template/docs/migrations/_template.md +1 -1
- package/template/docs/reference-implementations.md +151 -0
- package/template/docs/token-taxonomy.md +1 -1
- package/template/docs/voice-and-tone.md +262 -0
- package/template/eslint.config.mjs +9 -39
- package/template/hooks/use-secondary-panel-hub-nav.ts +10 -10
- package/template/lib/ask-leo-route-context.ts +6 -18
- package/template/lib/coach-mark-registry.ts +0 -16
- package/template/lib/command-menu-config.ts +5 -12
- package/template/lib/command-menu-search-data.ts +8 -39
- package/template/lib/{question-bank-authoring.ts → library-authoring.ts} +89 -88
- package/template/lib/library-dedicated-search.ts +19 -0
- package/template/lib/library-hub-search.ts +90 -0
- package/template/lib/library-nav.ts +477 -0
- package/template/lib/library-recent-searches.ts +22 -0
- package/template/lib/{placements-supported-views.ts → library-supported-views.ts} +2 -2
- package/template/lib/list-status-badges.ts +16 -104
- package/template/lib/mock/dashboard.ts +1 -1
- package/template/lib/mock/{question-bank-folders.ts → library-folders.ts} +30 -30
- package/template/lib/mock/library-header-collaborators.ts +54 -0
- package/template/lib/mock/{question-bank-inspector.ts → library-inspector.ts} +29 -29
- package/template/lib/mock/{question-bank-kpi.ts → library-kpi.ts} +20 -20
- package/template/lib/mock/library.ts +249 -0
- package/template/lib/mock/navigation.tsx +32 -26
- package/template/lib/table-state-lifecycle.ts +1 -1
- package/template/next.config.mjs +7 -4
- package/template/package.json +0 -1
- package/tokens/hooks-index.json +2874 -0
- package/consumer-extras/cursor-rules/exxat-question-bank-hub-header.mdc +0 -28
- package/template/app/(app)/examples/page.tsx +0 -41
- package/template/app/(app)/question-bank/find/page.tsx +0 -12
- package/template/app/(app)/question-bank/library/page.tsx +0 -11
- package/template/app/(app)/question-bank/list/page.tsx +0 -12
- package/template/app/(app)/question-bank/page.tsx +0 -11
- package/template/components/compliance-board-view.tsx +0 -142
- package/template/components/compliance-client.tsx +0 -92
- package/template/components/compliance-page-header.tsx +0 -89
- package/template/components/compliance-table.tsx +0 -468
- package/template/components/data-view-dashboard-charts-compliance.tsx +0 -963
- package/template/components/data-view-dashboard-charts-team.tsx +0 -971
- package/template/components/data-view-dashboard-charts.tsx +0 -1503
- package/template/components/new-placement-back-btn.tsx +0 -28
- package/template/components/new-placement-form.tsx +0 -942
- package/template/components/placement-board-card.tsx +0 -250
- package/template/components/placement-detail.tsx +0 -438
- package/template/components/placements-board-view.tsx +0 -397
- package/template/components/placements-client.tsx +0 -220
- package/template/components/placements-list-view.tsx +0 -124
- package/template/components/placements-page-header.tsx +0 -166
- package/template/components/placements-table-cells.test.tsx +0 -22
- package/template/components/placements-table-cells.tsx +0 -173
- package/template/components/placements-table-columns.tsx +0 -210
- package/template/components/placements-table.tsx +0 -934
- package/template/components/question-bank-panel-activator.tsx +0 -8
- package/template/components/rotations-empty-state.tsx +0 -50
- package/template/components/rotations-panel-activator.tsx +0 -8
- package/template/components/sites-board-view.tsx +0 -67
- package/template/components/sites-client.tsx +0 -154
- package/template/components/sites-table.tsx +0 -249
- package/template/components/team-board-view.tsx +0 -122
- package/template/components/team-client.tsx +0 -100
- package/template/components/team-page-header.tsx +0 -92
- package/template/components/team-table.tsx +0 -553
- package/template/docs/question-bank-hub-header-pattern.md +0 -25
- package/template/lib/compliance-supported-views.ts +0 -10
- package/template/lib/data-view-dashboard-placements-layout.ts +0 -215
- package/template/lib/mock/compliance-kpi.ts +0 -61
- package/template/lib/mock/compliance.ts +0 -146
- package/template/lib/mock/placements-kpi.ts +0 -134
- package/template/lib/mock/placements.ts +0 -176
- package/template/lib/mock/question-bank-header-collaborators.ts +0 -54
- package/template/lib/mock/question-bank.ts +0 -249
- package/template/lib/mock/sites-directory.ts +0 -16
- package/template/lib/mock/sites-kpi.ts +0 -25
- package/template/lib/mock/team-kpi.ts +0 -60
- package/template/lib/mock/team.ts +0 -118
- package/template/lib/placement-board-card-layout.ts +0 -79
- package/template/lib/question-bank-dedicated-search.ts +0 -19
- package/template/lib/question-bank-hub-search.ts +0 -90
- package/template/lib/question-bank-nav.ts +0 -477
- package/template/lib/question-bank-recent-searches.ts +0 -22
- package/template/lib/question-bank-supported-views.ts +0 -12
- package/template/lib/sites-supported-views.ts +0 -10
- package/template/lib/team-supported-views.ts +0 -10
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* Scope syncs to the main hub via `?scope=` + optional `folderId=` (`lib/
|
|
4
|
+
* Library secondary sidebar — All / My / folder tree (Font Awesome only).
|
|
5
|
+
* Scope syncs to the main hub via `?scope=` + optional `folderId=` (`lib/library-nav.ts`).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import * as React from "react"
|
|
@@ -27,18 +27,18 @@ import {
|
|
|
27
27
|
import { Kbd, KbdGroup } from "@/components/ui/kbd"
|
|
28
28
|
import { Tip } from "@/components/ui/tip"
|
|
29
29
|
import { cn } from "@/lib/utils"
|
|
30
|
-
import type {
|
|
31
|
-
import {
|
|
30
|
+
import type { LibraryFolder } from "@/lib/mock/library-folders"
|
|
31
|
+
import { DEFAULT_LIBRARY_FOLDERS, newFolderId, collectFolderDescendantIds } from "@/lib/mock/library-folders"
|
|
32
32
|
import { useSecondaryPanel } from "@/components/sidebar"
|
|
33
|
-
import {
|
|
33
|
+
import { LibraryNewFolderSheet } from "@/components/library-new-folder-sheet"
|
|
34
34
|
import {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
} from "@/lib/
|
|
41
|
-
import {
|
|
35
|
+
isLibraryNavActive,
|
|
36
|
+
parseLibraryNav,
|
|
37
|
+
LIBRARY_FAVORITES_FOLDER_ID,
|
|
38
|
+
libraryFavoritesFolderHref,
|
|
39
|
+
libraryHubScopeHref,
|
|
40
|
+
} from "@/lib/library-nav"
|
|
41
|
+
import { LibraryFolderTreeBranch } from "@/components/data-views/library-folder-tree-branch"
|
|
42
42
|
|
|
43
43
|
function NavRow({
|
|
44
44
|
href,
|
|
@@ -119,31 +119,31 @@ function IconNavRow({
|
|
|
119
119
|
)
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
export function
|
|
122
|
+
export function LibrarySecondaryNav() {
|
|
123
123
|
const pathname = usePathname()
|
|
124
124
|
const router = useRouter()
|
|
125
125
|
const searchParams = useSearchParams()
|
|
126
126
|
const searchParamsKey = searchParams.toString()
|
|
127
|
-
const { openPanel,
|
|
127
|
+
const { openPanel, libraryFolderBridge, libraryAccessBridge, secondaryPanelCompact } =
|
|
128
128
|
useSecondaryPanel()
|
|
129
129
|
const [newFolderOpen, setNewFolderOpen] = React.useState(false)
|
|
130
130
|
const [newFolderParentId, setNewFolderParentId] = React.useState<string | null>(null)
|
|
131
|
-
const [customizingFolder, setCustomizingFolder] = React.useState<
|
|
132
|
-
const [deleteFolder, setDeleteFolder] = React.useState<
|
|
131
|
+
const [customizingFolder, setCustomizingFolder] = React.useState<LibraryFolder | null>(null)
|
|
132
|
+
const [deleteFolder, setDeleteFolder] = React.useState<LibraryFolder | null>(null)
|
|
133
133
|
const nav = React.useMemo(
|
|
134
|
-
() =>
|
|
134
|
+
() => parseLibraryNav(new URLSearchParams(searchParamsKey)),
|
|
135
135
|
[searchParamsKey],
|
|
136
136
|
)
|
|
137
137
|
|
|
138
|
-
const folders =
|
|
139
|
-
const canManageFolders =
|
|
140
|
-
const canManageAccess =
|
|
138
|
+
const folders = libraryFolderBridge?.folders ?? DEFAULT_LIBRARY_FOLDERS
|
|
139
|
+
const canManageFolders = libraryFolderBridge != null
|
|
140
|
+
const canManageAccess = libraryAccessBridge != null
|
|
141
141
|
|
|
142
142
|
/** Favorites is a primary nav row (with All / My), not under “Folders”. */
|
|
143
143
|
const folderTreeRoots = React.useMemo(
|
|
144
144
|
() =>
|
|
145
145
|
folders
|
|
146
|
-
.filter(f => f.parentId === null && f.id !==
|
|
146
|
+
.filter(f => f.parentId === null && f.id !== LIBRARY_FAVORITES_FOLDER_ID)
|
|
147
147
|
.sort((a, b) => a.name.localeCompare(b.name)),
|
|
148
148
|
[folders],
|
|
149
149
|
)
|
|
@@ -160,22 +160,22 @@ export function QuestionBankSecondaryNav() {
|
|
|
160
160
|
setNewFolderOpen(true)
|
|
161
161
|
}, [])
|
|
162
162
|
|
|
163
|
-
const openCustomizeFolder = React.useCallback((folder:
|
|
163
|
+
const openCustomizeFolder = React.useCallback((folder: LibraryFolder) => {
|
|
164
164
|
setCustomizingFolder(folder)
|
|
165
165
|
setNewFolderParentId(folder.parentId)
|
|
166
166
|
setNewFolderOpen(true)
|
|
167
167
|
}, [])
|
|
168
168
|
|
|
169
169
|
const openManageAccess = React.useCallback(() => {
|
|
170
|
-
|
|
171
|
-
}, [
|
|
170
|
+
libraryAccessBridge?.openManageAccess()
|
|
171
|
+
}, [libraryAccessBridge])
|
|
172
172
|
|
|
173
|
-
const openDeleteFolder = React.useCallback((folder:
|
|
173
|
+
const openDeleteFolder = React.useCallback((folder: LibraryFolder) => {
|
|
174
174
|
setDeleteFolder(folder)
|
|
175
175
|
}, [])
|
|
176
176
|
|
|
177
177
|
const commitDeleteFolder = React.useCallback(() => {
|
|
178
|
-
if (!deleteFolder || !
|
|
178
|
+
if (!deleteFolder || !libraryFolderBridge) return
|
|
179
179
|
const victim = deleteFolder
|
|
180
180
|
const parent = victim.parentId
|
|
181
181
|
const desc = collectFolderDescendantIds(folders, victim.id)
|
|
@@ -189,14 +189,14 @@ export function QuestionBankSecondaryNav() {
|
|
|
189
189
|
const reassignTarget =
|
|
190
190
|
parentStillExists ? parent : (fallbackRoot ?? remaining[0]!.id)
|
|
191
191
|
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
libraryFolderBridge.onFoldersChange(remaining)
|
|
193
|
+
libraryFolderBridge.onItemsChange(prev =>
|
|
194
194
|
prev.map(item => (desc.has(item.folderId) ? { ...item, folderId: reassignTarget } : item)),
|
|
195
195
|
)
|
|
196
196
|
|
|
197
197
|
if (nav.scope === "folder" && nav.folderId && desc.has(nav.folderId)) {
|
|
198
198
|
router.replace(
|
|
199
|
-
|
|
199
|
+
libraryHubScopeHref(
|
|
200
200
|
pathname,
|
|
201
201
|
new URLSearchParams(searchParamsKey),
|
|
202
202
|
parentStillExists
|
|
@@ -207,13 +207,13 @@ export function QuestionBankSecondaryNav() {
|
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
setDeleteFolder(null)
|
|
210
|
-
}, [deleteFolder, folders, nav.folderId, nav.scope, pathname,
|
|
210
|
+
}, [deleteFolder, folders, nav.folderId, nav.scope, pathname, libraryFolderBridge, router, searchParamsKey])
|
|
211
211
|
|
|
212
212
|
const sheetParentId = customizingFolder?.parentId ?? newFolderParentId
|
|
213
213
|
|
|
214
214
|
const flattenedFolderLinks = React.useMemo(() => {
|
|
215
|
-
const out:
|
|
216
|
-
const walk = (folder:
|
|
215
|
+
const out: LibraryFolder[] = []
|
|
216
|
+
const walk = (folder: LibraryFolder) => {
|
|
217
217
|
out.push(folder)
|
|
218
218
|
folders
|
|
219
219
|
.filter(c => c.parentId === folder.id)
|
|
@@ -226,7 +226,7 @@ export function QuestionBankSecondaryNav() {
|
|
|
226
226
|
|
|
227
227
|
const hubNavModals = (
|
|
228
228
|
<>
|
|
229
|
-
<
|
|
229
|
+
<LibraryNewFolderSheet
|
|
230
230
|
open={newFolderOpen}
|
|
231
231
|
onOpenChange={open => {
|
|
232
232
|
setNewFolderOpen(open)
|
|
@@ -242,11 +242,11 @@ export function QuestionBankSecondaryNav() {
|
|
|
242
242
|
? "Update the folder name, color, and icon shown in the navigation and folder views."
|
|
243
243
|
: sheetParentId
|
|
244
244
|
? "The folder is created inside the folder selected in the navigation."
|
|
245
|
-
: "Add a top-level folder to the
|
|
245
|
+
: "Add a top-level folder to the library."
|
|
246
246
|
}
|
|
247
247
|
onCreated={folder => {
|
|
248
248
|
if (customizingFolder) {
|
|
249
|
-
|
|
249
|
+
libraryFolderBridge?.onFoldersChange(prev =>
|
|
250
250
|
prev.map(item =>
|
|
251
251
|
item.id === customizingFolder.id
|
|
252
252
|
? {
|
|
@@ -259,7 +259,7 @@ export function QuestionBankSecondaryNav() {
|
|
|
259
259
|
),
|
|
260
260
|
)
|
|
261
261
|
} else {
|
|
262
|
-
|
|
262
|
+
libraryFolderBridge?.onFoldersChange(prev => [...prev, { ...folder, id: newFolderId() }])
|
|
263
263
|
}
|
|
264
264
|
setNewFolderOpen(false)
|
|
265
265
|
setCustomizingFolder(null)
|
|
@@ -299,7 +299,7 @@ export function QuestionBankSecondaryNav() {
|
|
|
299
299
|
if (secondaryPanelCompact) {
|
|
300
300
|
return (
|
|
301
301
|
<>
|
|
302
|
-
<nav className="flex min-h-0 flex-1 flex-col" role="navigation" aria-label="
|
|
302
|
+
<nav className="flex min-h-0 flex-1 flex-col" role="navigation" aria-label="Library">
|
|
303
303
|
<div className="flex flex-col items-center border-b border-sidebar-border/60 px-1 py-2">
|
|
304
304
|
<Tip label="Show labels" side="right">
|
|
305
305
|
<Button
|
|
@@ -308,7 +308,7 @@ export function QuestionBankSecondaryNav() {
|
|
|
308
308
|
variant="ghost"
|
|
309
309
|
className="size-9 shrink-0"
|
|
310
310
|
aria-label="Show labels"
|
|
311
|
-
onClick={() => openPanel("
|
|
311
|
+
onClick={() => openPanel("library")}
|
|
312
312
|
>
|
|
313
313
|
<i className="fa-light fa-angles-right text-[15px]" aria-hidden="true" />
|
|
314
314
|
</Button>
|
|
@@ -316,25 +316,25 @@ export function QuestionBankSecondaryNav() {
|
|
|
316
316
|
</div>
|
|
317
317
|
<ul className="flex flex-1 flex-col items-center gap-1 overflow-y-auto px-1 py-2" role="list">
|
|
318
318
|
<IconNavRow
|
|
319
|
-
href={
|
|
320
|
-
active={
|
|
319
|
+
href={libraryHubScopeHref(pathname, searchParams, { scope: "all" })}
|
|
320
|
+
active={isLibraryNavActive(pathname, nav, "all")}
|
|
321
321
|
iconClass="fa-table-list"
|
|
322
322
|
label="All questions"
|
|
323
|
-
onClick={() => openPanel("
|
|
323
|
+
onClick={() => openPanel("library")}
|
|
324
324
|
/>
|
|
325
325
|
<IconNavRow
|
|
326
|
-
href={
|
|
327
|
-
active={
|
|
326
|
+
href={libraryHubScopeHref(pathname, searchParams, { scope: "my" })}
|
|
327
|
+
active={isLibraryNavActive(pathname, nav, "my")}
|
|
328
328
|
iconClass="fa-user"
|
|
329
329
|
label="My questions"
|
|
330
|
-
onClick={() => openPanel("
|
|
330
|
+
onClick={() => openPanel("library")}
|
|
331
331
|
/>
|
|
332
332
|
<IconNavRow
|
|
333
|
-
href={
|
|
334
|
-
active={
|
|
333
|
+
href={libraryFavoritesFolderHref(pathname, searchParams)}
|
|
334
|
+
active={isLibraryNavActive(pathname, nav, "folder", LIBRARY_FAVORITES_FOLDER_ID)}
|
|
335
335
|
iconClass="fa-star"
|
|
336
336
|
label="Favorites"
|
|
337
|
-
onClick={() => openPanel("
|
|
337
|
+
onClick={() => openPanel("library")}
|
|
338
338
|
/>
|
|
339
339
|
<li className="flex w-full justify-center pt-1" role="none">
|
|
340
340
|
<DropdownMenu>
|
|
@@ -354,18 +354,18 @@ export function QuestionBankSecondaryNav() {
|
|
|
354
354
|
<div className="px-2 py-1.5 text-xs text-muted-foreground">No folders</div>
|
|
355
355
|
) : (
|
|
356
356
|
flattenedFolderLinks.map(folder => {
|
|
357
|
-
const href =
|
|
357
|
+
const href = libraryHubScopeHref(pathname, searchParams, {
|
|
358
358
|
scope: "folder",
|
|
359
359
|
folderId: folder.id,
|
|
360
360
|
})
|
|
361
|
-
const active =
|
|
361
|
+
const active = isLibraryNavActive(pathname, nav, "folder", folder.id)
|
|
362
362
|
return (
|
|
363
363
|
<DropdownMenuItem key={folder.id} asChild>
|
|
364
364
|
<Link
|
|
365
365
|
href={href}
|
|
366
366
|
scroll={false}
|
|
367
367
|
className={cn(active && "bg-accent")}
|
|
368
|
-
onClick={() => openPanel("
|
|
368
|
+
onClick={() => openPanel("library")}
|
|
369
369
|
>
|
|
370
370
|
{folder.name}
|
|
371
371
|
</Link>
|
|
@@ -401,27 +401,27 @@ export function QuestionBankSecondaryNav() {
|
|
|
401
401
|
|
|
402
402
|
return (
|
|
403
403
|
<>
|
|
404
|
-
<div className="min-h-0 flex-1 overflow-y-auto px-3 pb-4" role="navigation" aria-label="
|
|
404
|
+
<div className="min-h-0 flex-1 overflow-y-auto px-3 pb-4" role="navigation" aria-label="Library">
|
|
405
405
|
<ul className="space-y-0.5" role="list">
|
|
406
406
|
<NavRow
|
|
407
|
-
href={
|
|
408
|
-
active={
|
|
407
|
+
href={libraryHubScopeHref(pathname, searchParams, { scope: "all" })}
|
|
408
|
+
active={isLibraryNavActive(pathname, nav, "all")}
|
|
409
409
|
iconClass="fa-table-list"
|
|
410
410
|
label="All questions"
|
|
411
|
-
onClick={() => openPanel("
|
|
411
|
+
onClick={() => openPanel("library")}
|
|
412
412
|
/>
|
|
413
413
|
<NavRow
|
|
414
|
-
href={
|
|
415
|
-
active={
|
|
414
|
+
href={libraryHubScopeHref(pathname, searchParams, { scope: "my" })}
|
|
415
|
+
active={isLibraryNavActive(pathname, nav, "my")}
|
|
416
416
|
iconClass="fa-user"
|
|
417
417
|
label="My questions"
|
|
418
418
|
/>
|
|
419
419
|
<NavRow
|
|
420
|
-
href={
|
|
421
|
-
active={
|
|
420
|
+
href={libraryFavoritesFolderHref(pathname, searchParams)}
|
|
421
|
+
active={isLibraryNavActive(pathname, nav, "folder", LIBRARY_FAVORITES_FOLDER_ID)}
|
|
422
422
|
iconClass="fa-star"
|
|
423
423
|
label="Favorites"
|
|
424
|
-
onClick={() => openPanel("
|
|
424
|
+
onClick={() => openPanel("library")}
|
|
425
425
|
/>
|
|
426
426
|
<li role="presentation" className="select-none">
|
|
427
427
|
<div className="flex items-center justify-between gap-2 px-2 pt-3 pb-1">
|
|
@@ -445,7 +445,7 @@ export function QuestionBankSecondaryNav() {
|
|
|
445
445
|
</li>
|
|
446
446
|
{folderTreeRoots.map(folder => (
|
|
447
447
|
<li key={folder.id} className="min-w-0 w-full list-none">
|
|
448
|
-
<
|
|
448
|
+
<LibraryFolderTreeBranch
|
|
449
449
|
folder={folder}
|
|
450
450
|
folders={folders}
|
|
451
451
|
pathname={pathname}
|