@@ -0,0 +1,45 @@
|
||||
// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
|
||||
// What a project offers, in one place: the pages of the modules, as the organization home, the
|
||||
// workspace page and the project home all list them (spec §3.1, §4.1). Server-only: it reads the manifests,
|
||||
// so a page's loader hands the entries to its view (F10).
|
||||
//
|
||||
// A module with pages under a project says so in its manifest (`ui.nav`, scope `project`) and
|
||||
// `modules/pages.ts` mounts them (`modulePages`); nothing here is edited to add one. The documents
|
||||
// module is the exception that proves the rule: its two pages are routes of the shell
|
||||
// (`src/routes/$org.$workspace.$project.documents.*`), so the shell lists it by name.
|
||||
|
||||
import { PROFILE } from "@app/config"
|
||||
import { appModules } from "@app/modules"
|
||||
import { moduleSelected } from "@app/modules/inclusion" // kit:documents
|
||||
import type { Profile } from "@conusai-kit/platform"
|
||||
import type { ProjectEntry } from "../ui/projects"
|
||||
|
||||
/**
|
||||
* Documents, then every project-level entry the manifests declare, by their `order` (core-5): lower first across
|
||||
* modules, equal or absent ones (Documents among them, at 0) in this order.
|
||||
*/
|
||||
export function projectEntriesFor(profile: Profile): readonly ProjectEntry[] {
|
||||
return [
|
||||
...(moduleSelected("documents") ? [{ href: "documents", label: "documents.title", module: "documents" }] : []), // kit:documents
|
||||
...appModules.flatMap((module) =>
|
||||
(module.ui?.nav ?? [])
|
||||
.filter((item) => item.scope === "project")
|
||||
.filter(() => profile !== "convex" || ["notes", "files"].includes(module.id))
|
||||
.map((item) => ({
|
||||
href: item.href,
|
||||
label: item.label,
|
||||
module: module.id,
|
||||
...(item.icon ? { icon: item.icon } : {}),
|
||||
...(item.permission === undefined ? {} : { permission: item.permission }),
|
||||
...(item.order === undefined ? {} : { order: item.order }),
|
||||
...(item.flag === undefined ? {} : { flag: item.flag }),
|
||||
})),
|
||||
),
|
||||
].sort((a: ProjectEntry, b: ProjectEntry) => (a.order ?? 0) - (b.order ?? 0))
|
||||
}
|
||||
|
||||
export const PROJECT_ENTRIES: readonly ProjectEntry[] = projectEntriesFor(PROFILE)
|
||||
|
||||
/** The values a project's `moduleKey` can take when it is created from the shell. */
|
||||
const moduleKeys = [...new Set(PROJECT_ENTRIES.map((entry) => entry.module))]
|
||||
export const PROJECT_MODULE_KEYS: readonly string[] = moduleKeys.length ? moduleKeys : ["general"]
|
||||
Reference in New Issue
Block a user