feat: build collaboration workspaces

This commit is contained in:
2026-07-03 03:02:36 -07:00
parent bf3dd256ab
commit 4ba2a11b88
53 changed files with 9557 additions and 29 deletions

View File

@@ -1,5 +1,5 @@
import { AlertsModulePage } from "@/modules/shared/components/ReservedModulePages";
import AlertsPage from "../../alerts/page";
export default function ScopedAlertsPage(): React.ReactElement {
return <AlertsModulePage />;
export default async function ScopedAlertsPage(): Promise<React.ReactElement> {
return AlertsPage();
}

View File

@@ -1,5 +1,5 @@
import { DevicesModulePage } from "@/modules/shared/components/ReservedModulePages";
import DevicesPage from "../../devices/page";
export default function ScopedDevicesPage(): React.ReactElement {
return <DevicesModulePage />;
export default async function ScopedDevicesPage(): Promise<React.ReactElement> {
return DevicesPage();
}

View File

@@ -1,5 +1,5 @@
import { FamilyModulePage } from "@/modules/shared/components/ReservedModulePages";
import FamilyPage from "../../family/page";
export default function ScopedFamilyPage(): React.ReactElement {
return <FamilyModulePage />;
export default async function ScopedFamilyPage(): Promise<React.ReactElement> {
return FamilyPage();
}

View File

@@ -1,5 +1,5 @@
import { NoticesModulePage } from "@/modules/shared/components/ReservedModulePages";
import NoticesPage from "../../notices/page";
export default function ScopedNoticesPage(): React.ReactElement {
return <NoticesModulePage />;
export default async function ScopedNoticesPage(): Promise<React.ReactElement> {
return NoticesPage();
}

View File

@@ -1,5 +1,26 @@
import { AlertsModulePage } from "@/modules/shared/components/ReservedModulePages";
import { redirect } from "next/navigation";
export default function AlertsPage(): React.ReactElement {
return <AlertsModulePage />;
import { getCurrentAuthContext } from "@/modules/core/server/auth";
import { hasPermission } from "@/modules/core/server/permissions";
import { AlertsWorkspaceClient } from "@/modules/alerts/components/AlertsWorkspaceClient";
import { listAlertCenterData } from "@/modules/alerts/server/operations";
import { getWorkspaceHref } from "@/modules/shared/lib/workspace-routing";
export default async function AlertsPage(): Promise<React.ReactElement> {
const context = await getCurrentAuthContext();
if (!context) {
redirect("/login");
}
if (!hasPermission(context.permissions, "alert:read")) {
redirect(getWorkspaceHref(context.organization?.slug, "/dashboard"));
}
const organizationId = context.organization?.id;
if (!organizationId) {
redirect(getWorkspaceHref(context.organization?.slug, "/dashboard"));
}
const data = await listAlertCenterData(organizationId);
return <AlertsWorkspaceClient canManage={hasPermission(context.permissions, "alert:manage")} initialData={data} />;
}

View File

@@ -1,5 +1,26 @@
import { DevicesModulePage } from "@/modules/shared/components/ReservedModulePages";
import { redirect } from "next/navigation";
export default function DevicesPage(): React.ReactElement {
return <DevicesModulePage />;
import { getCurrentAuthContext } from "@/modules/core/server/auth";
import { hasPermission } from "@/modules/core/server/permissions";
import { DevicesWorkspaceClient } from "@/modules/devices/components/DevicesWorkspaceClient";
import { listDeviceOperationsData } from "@/modules/devices/server/operations";
import { getWorkspaceHref } from "@/modules/shared/lib/workspace-routing";
export default async function DevicesPage(): Promise<React.ReactElement> {
const context = await getCurrentAuthContext();
if (!context) {
redirect("/login");
}
if (!hasPermission(context.permissions, "device:read")) {
redirect(getWorkspaceHref(context.organization?.slug, "/dashboard"));
}
const organizationId = context.organization?.id;
if (!organizationId) {
redirect(getWorkspaceHref(context.organization?.slug, "/dashboard"));
}
const data = await listDeviceOperationsData(organizationId);
return <DevicesWorkspaceClient canManage={hasPermission(context.permissions, "device:manage")} initialData={data} />;
}

View File

@@ -1,5 +1,26 @@
import { FamilyModulePage } from "@/modules/shared/components/ReservedModulePages";
import { redirect } from "next/navigation";
export default function FamilyPage(): React.ReactElement {
return <FamilyModulePage />;
import { getCurrentAuthContext } from "@/modules/core/server/auth";
import { hasPermission } from "@/modules/core/server/permissions";
import { FamilyWorkspaceClient } from "@/modules/family/components/FamilyWorkspaceClient";
import { listFamilyServiceData } from "@/modules/family/server/operations";
import { getWorkspaceHref } from "@/modules/shared/lib/workspace-routing";
export default async function FamilyPage(): Promise<React.ReactElement> {
const context = await getCurrentAuthContext();
if (!context) {
redirect("/login");
}
if (!hasPermission(context.permissions, "family:read")) {
redirect(getWorkspaceHref(context.organization?.slug, "/dashboard"));
}
const organizationId = context.organization?.id;
if (!organizationId) {
redirect(getWorkspaceHref(context.organization?.slug, "/dashboard"));
}
const data = await listFamilyServiceData(organizationId);
return <FamilyWorkspaceClient canManage={hasPermission(context.permissions, "family:manage")} initialData={data} />;
}

View File

@@ -1,5 +1,26 @@
import { NoticesModulePage } from "@/modules/shared/components/ReservedModulePages";
import { redirect } from "next/navigation";
export default function NoticesPage(): React.ReactElement {
return <NoticesModulePage />;
import { getCurrentAuthContext } from "@/modules/core/server/auth";
import { hasPermission } from "@/modules/core/server/permissions";
import { NoticesWorkspaceClient } from "@/modules/notices/components/NoticesWorkspaceClient";
import { listNoticeCenterData } from "@/modules/notices/server/operations";
import { getWorkspaceHref } from "@/modules/shared/lib/workspace-routing";
export default async function NoticesPage(): Promise<React.ReactElement> {
const context = await getCurrentAuthContext();
if (!context) {
redirect("/login");
}
if (!hasPermission(context.permissions, "notice:read")) {
redirect(getWorkspaceHref(context.organization?.slug, "/dashboard"));
}
const organizationId = context.organization?.id;
if (!organizationId) {
redirect(getWorkspaceHref(context.organization?.slug, "/dashboard"));
}
const data = await listNoticeCenterData(organizationId, context.account.id);
return <NoticesWorkspaceClient canManage={hasPermission(context.permissions, "notice:manage")} initialData={data} />;
}