@burdenoff/microfe-organization 2026.510.110
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/README.md +64 -0
- package/dist/generated/global-operations.d.ts +1647 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +724 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20716 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/global-types.js +8 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +53363 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/node_modules/sonner/dist/index.js +163 -0
- package/dist/node_modules/sonner/dist/index.js.map +1 -0
- package/dist/node_modules/zod/v3/ZodError.js +82 -0
- package/dist/node_modules/zod/v3/ZodError.js.map +1 -0
- package/dist/node_modules/zod/v3/errors.js +10 -0
- package/dist/node_modules/zod/v3/errors.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/errorUtil.js +9 -0
- package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/parseUtil.js +93 -0
- package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/util.js +76 -0
- package/dist/node_modules/zod/v3/helpers/util.js.map +1 -0
- package/dist/node_modules/zod/v3/locales/en.js +62 -0
- package/dist/node_modules/zod/v3/locales/en.js.map +1 -0
- package/dist/node_modules/zod/v3/types.js +2441 -0
- package/dist/node_modules/zod/v3/types.js.map +1 -0
- package/dist/organization-management/AdminOrganizationRoot.d.ts +16 -0
- package/dist/organization-management/AdminOrganizationRoot.d.ts.map +1 -0
- package/dist/organization-management/AdminOrganizationRoot.js +76 -0
- package/dist/organization-management/AdminOrganizationRoot.js.map +1 -0
- package/dist/organization-management/AdminOrganizationRoutes.d.ts +16 -0
- package/dist/organization-management/AdminOrganizationRoutes.d.ts.map +1 -0
- package/dist/organization-management/AdminOrganizationRoutes.js +73 -0
- package/dist/organization-management/AdminOrganizationRoutes.js.map +1 -0
- package/dist/organization-management/UserOrganizationRoot.d.ts +17 -0
- package/dist/organization-management/UserOrganizationRoot.d.ts.map +1 -0
- package/dist/organization-management/UserOrganizationRoot.js +45 -0
- package/dist/organization-management/UserOrganizationRoot.js.map +1 -0
- package/dist/organization-management/UserOrganizationRoutes.d.ts +12 -0
- package/dist/organization-management/UserOrganizationRoutes.d.ts.map +1 -0
- package/dist/organization-management/UserOrganizationRoutes.js +30 -0
- package/dist/organization-management/UserOrganizationRoutes.js.map +1 -0
- package/dist/organization-management/constants/permissions.d.ts +30 -0
- package/dist/organization-management/constants/permissions.d.ts.map +1 -0
- package/dist/organization-management/constants/permissions.js +22 -0
- package/dist/organization-management/constants/permissions.js.map +1 -0
- package/dist/organization-management/hooks/useOrganizationEventEmitter.d.ts +19 -0
- package/dist/organization-management/hooks/useOrganizationEventEmitter.d.ts.map +1 -0
- package/dist/organization-management/hooks/useOrganizationEventEmitter.js +15 -0
- package/dist/organization-management/hooks/useOrganizationEventEmitter.js.map +1 -0
- package/dist/organization-management/hooks/useOrganizationPageView.d.ts +11 -0
- package/dist/organization-management/hooks/useOrganizationPageView.d.ts.map +1 -0
- package/dist/organization-management/hooks/useOrganizationPageView.js +24 -0
- package/dist/organization-management/hooks/useOrganizationPageView.js.map +1 -0
- package/dist/organization-management/modules/members/components/InviteMemberForm.d.ts +18 -0
- package/dist/organization-management/modules/members/components/InviteMemberForm.d.ts.map +1 -0
- package/dist/organization-management/modules/members/components/InviteMemberForm.js +119 -0
- package/dist/organization-management/modules/members/components/InviteMemberForm.js.map +1 -0
- package/dist/organization-management/modules/members/components/InviteStatusBadge.d.ts +6 -0
- package/dist/organization-management/modules/members/components/InviteStatusBadge.d.ts.map +1 -0
- package/dist/organization-management/modules/members/components/InviteStatusBadge.js +51 -0
- package/dist/organization-management/modules/members/components/InviteStatusBadge.js.map +1 -0
- package/dist/organization-management/modules/members/components/MemberRoleBadge.d.ts +11 -0
- package/dist/organization-management/modules/members/components/MemberRoleBadge.d.ts.map +1 -0
- package/dist/organization-management/modules/members/components/MemberRoleBadge.js +56 -0
- package/dist/organization-management/modules/members/components/MemberRoleBadge.js.map +1 -0
- package/dist/organization-management/modules/members/components/MyInviteCard.d.ts +22 -0
- package/dist/organization-management/modules/members/components/MyInviteCard.d.ts.map +1 -0
- package/dist/organization-management/modules/members/components/MyInviteCard.js +70 -0
- package/dist/organization-management/modules/members/components/MyInviteCard.js.map +1 -0
- package/dist/organization-management/modules/members/components/PendingInvitesList.d.ts +6 -0
- package/dist/organization-management/modules/members/components/PendingInvitesList.d.ts.map +1 -0
- package/dist/organization-management/modules/members/components/PendingInvitesList.js +141 -0
- package/dist/organization-management/modules/members/components/PendingInvitesList.js.map +1 -0
- package/dist/organization-management/modules/members/hooks/useInvites.d.ts +75 -0
- package/dist/organization-management/modules/members/hooks/useInvites.d.ts.map +1 -0
- package/dist/organization-management/modules/members/hooks/useInvites.js +253 -0
- package/dist/organization-management/modules/members/hooks/useInvites.js.map +1 -0
- package/dist/organization-management/modules/members/hooks/useMembers.d.ts +84 -0
- package/dist/organization-management/modules/members/hooks/useMembers.d.ts.map +1 -0
- package/dist/organization-management/modules/members/hooks/useMembers.js +95 -0
- package/dist/organization-management/modules/members/hooks/useMembers.js.map +1 -0
- package/dist/organization-management/modules/members/pages/InviteMemberPage.d.ts +6 -0
- package/dist/organization-management/modules/members/pages/InviteMemberPage.d.ts.map +1 -0
- package/dist/organization-management/modules/members/pages/InviteMemberPage.js +91 -0
- package/dist/organization-management/modules/members/pages/InviteMemberPage.js.map +1 -0
- package/dist/organization-management/modules/members/pages/MemberDetailPage.d.ts +6 -0
- package/dist/organization-management/modules/members/pages/MemberDetailPage.d.ts.map +1 -0
- package/dist/organization-management/modules/members/pages/MemberDetailPage.js +115 -0
- package/dist/organization-management/modules/members/pages/MemberDetailPage.js.map +1 -0
- package/dist/organization-management/modules/members/pages/MembersListPage.d.ts +2 -0
- package/dist/organization-management/modules/members/pages/MembersListPage.d.ts.map +1 -0
- package/dist/organization-management/modules/members/pages/MembersListPage.js +424 -0
- package/dist/organization-management/modules/members/pages/MembersListPage.js.map +1 -0
- package/dist/organization-management/modules/members/pages/MyInvitesPage.d.ts +6 -0
- package/dist/organization-management/modules/members/pages/MyInvitesPage.d.ts.map +1 -0
- package/dist/organization-management/modules/members/pages/MyInvitesPage.js +114 -0
- package/dist/organization-management/modules/members/pages/MyInvitesPage.js.map +1 -0
- package/dist/organization-management/modules/members/types/index.d.ts +35 -0
- package/dist/organization-management/modules/members/types/index.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/components/OrganizationForm.d.ts +13 -0
- package/dist/organization-management/modules/organizations/components/OrganizationForm.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/components/OrganizationForm.js +325 -0
- package/dist/organization-management/modules/organizations/components/OrganizationForm.js.map +1 -0
- package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.d.ts +13 -0
- package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.js +49 -0
- package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.js.map +1 -0
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.d.ts +86 -0
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.js +164 -0
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.js.map +1 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.d.ts +6 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js +76 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js.map +1 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.d.ts +2 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js +306 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js.map +1 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.d.ts +6 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js +93 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js.map +1 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.d.ts +2 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js +448 -0
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js.map +1 -0
- package/dist/organization-management/modules/organizations/schemas/index.d.ts +53 -0
- package/dist/organization-management/modules/organizations/schemas/index.d.ts.map +1 -0
- package/dist/organization-management/modules/organizations/schemas/index.js +25 -0
- package/dist/organization-management/modules/organizations/schemas/index.js.map +1 -0
- package/dist/organization-management/modules/organizations/types/index.d.ts +34 -0
- package/dist/organization-management/modules/organizations/types/index.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.d.ts +13 -0
- package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.js +147 -0
- package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.js.map +1 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceCard.d.ts +16 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceCard.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js +107 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js.map +1 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceForm.d.ts +16 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceForm.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js +386 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js.map +1 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.d.ts +13 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.js +49 -0
- package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.js.map +1 -0
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.d.ts +47 -0
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.js +46 -0
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.js.map +1 -0
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.d.ts +133 -0
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.js +111 -0
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.js.map +1 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.d.ts +2 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js +82 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js.map +1 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.d.ts +2 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js +438 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js.map +1 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.d.ts +2 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js +90 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js.map +1 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.d.ts +2 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js +465 -0
- package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js.map +1 -0
- package/dist/organization-management/modules/workspaces/schemas/index.d.ts +44 -0
- package/dist/organization-management/modules/workspaces/schemas/index.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/schemas/index.js +22 -0
- package/dist/organization-management/modules/workspaces/schemas/index.js.map +1 -0
- package/dist/organization-management/modules/workspaces/types/index.d.ts +39 -0
- package/dist/organization-management/modules/workspaces/types/index.d.ts.map +1 -0
- package/dist/organization-management/modules/workspaces/types/workspace-member.d.ts +48 -0
- package/dist/organization-management/modules/workspaces/types/workspace-member.d.ts.map +1 -0
- package/dist/organization-management/providers/OrgConsoleProvider.d.ts +19 -0
- package/dist/organization-management/providers/OrgConsoleProvider.d.ts.map +1 -0
- package/dist/organization-management/providers/OrgConsoleProvider.js +24 -0
- package/dist/organization-management/providers/OrgConsoleProvider.js.map +1 -0
- package/dist/organization-management/shared/components/dialog/ConfirmDialog.d.ts +28 -0
- package/dist/organization-management/shared/components/dialog/ConfirmDialog.d.ts.map +1 -0
- package/dist/organization-management/shared/components/dialog/ConfirmDialog.js +105 -0
- package/dist/organization-management/shared/components/dialog/ConfirmDialog.js.map +1 -0
- package/dist/organization-management/shared/components/feedback/EmptyState.d.ts +14 -0
- package/dist/organization-management/shared/components/feedback/EmptyState.d.ts.map +1 -0
- package/dist/organization-management/shared/components/feedback/EmptyState.js +30 -0
- package/dist/organization-management/shared/components/feedback/EmptyState.js.map +1 -0
- package/dist/organization-management/shared/components/feedback/ErrorState.d.ts +11 -0
- package/dist/organization-management/shared/components/feedback/ErrorState.d.ts.map +1 -0
- package/dist/organization-management/shared/components/feedback/ErrorState.js +37 -0
- package/dist/organization-management/shared/components/feedback/ErrorState.js.map +1 -0
- package/dist/organization-management/shared/components/feedback/LoadingState.d.ts +6 -0
- package/dist/organization-management/shared/components/feedback/LoadingState.d.ts.map +1 -0
- package/dist/organization-management/shared/components/feedback/LoadingState.js +24 -0
- package/dist/organization-management/shared/components/feedback/LoadingState.js.map +1 -0
- package/dist/organization-management/shared/components/input/SearchInput.d.ts +15 -0
- package/dist/organization-management/shared/components/input/SearchInput.d.ts.map +1 -0
- package/dist/organization-management/shared/components/input/SearchInput.js +40 -0
- package/dist/organization-management/shared/components/input/SearchInput.js.map +1 -0
- package/dist/organization-management/shared/components/input/SelectionCheckbox.d.ts +10 -0
- package/dist/organization-management/shared/components/input/SelectionCheckbox.d.ts.map +1 -0
- package/dist/organization-management/shared/components/input/SelectionCheckbox.js +21 -0
- package/dist/organization-management/shared/components/input/SelectionCheckbox.js.map +1 -0
- package/dist/organization-management/shared/hooks/useDebouncedValue.d.ts +2 -0
- package/dist/organization-management/shared/hooks/useDebouncedValue.d.ts.map +1 -0
- package/dist/organization-management/shared/hooks/useDebouncedValue.js +17 -0
- package/dist/organization-management/shared/hooks/useDebouncedValue.js.map +1 -0
- package/dist/organization-management/shared/hooks/useTr.d.ts +14 -0
- package/dist/organization-management/shared/hooks/useTr.d.ts.map +1 -0
- package/dist/organization-management/shared/hooks/useTr.js +14 -0
- package/dist/organization-management/shared/hooks/useTr.js.map +1 -0
- package/dist/organization-management/shared/logger.d.ts +11 -0
- package/dist/organization-management/shared/logger.d.ts.map +1 -0
- package/dist/organization-management/shared/logger.js +46 -0
- package/dist/organization-management/shared/logger.js.map +1 -0
- package/dist/organization-management/shared/recaptcha.d.ts +2 -0
- package/dist/organization-management/shared/recaptcha.d.ts.map +1 -0
- package/dist/organization-management/shared/recaptcha.js +6 -0
- package/dist/organization-management/shared/recaptcha.js.map +1 -0
- package/dist/organization-management/shared/types/graphql.d.ts +131 -0
- package/dist/organization-management/shared/types/graphql.d.ts.map +1 -0
- package/dist/organization-management/shared/types/graphql.js +10 -0
- package/dist/organization-management/shared/types/graphql.js.map +1 -0
- package/dist/organization-management/shared/utils/cn.d.ts +8 -0
- package/dist/organization-management/shared/utils/cn.d.ts.map +1 -0
- package/dist/organization-management/types/index.d.ts +46 -0
- package/dist/organization-management/types/index.d.ts.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspacesListPage.d.ts","sourceRoot":"","sources":["../../../../../src/organization-management/modules/workspaces/pages/WorkspacesListPage.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,kBAAkB,4CAwhBjC"}
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
import { useOrgConsole as e } from "../../../providers/OrgConsoleProvider.js";
|
|
2
|
+
import { toast as t } from "../../../../node_modules/sonner/dist/index.js";
|
|
3
|
+
import { WorkspaceStatus as n } from "../../../shared/types/graphql.js";
|
|
4
|
+
import { useTr as r } from "../../../shared/hooks/useTr.js";
|
|
5
|
+
import { SearchInput as ee } from "../../../shared/components/input/SearchInput.js";
|
|
6
|
+
import { SelectionCheckbox as i } from "../../../shared/components/input/SelectionCheckbox.js";
|
|
7
|
+
import { LoadingState as a } from "../../../shared/components/feedback/LoadingState.js";
|
|
8
|
+
import { ErrorState as o } from "../../../shared/components/feedback/ErrorState.js";
|
|
9
|
+
import { EmptyState as s } from "../../../shared/components/feedback/EmptyState.js";
|
|
10
|
+
import { useDebouncedValue as te } from "../../../shared/hooks/useDebouncedValue.js";
|
|
11
|
+
import { useConfirmDialog as ne } from "../../../shared/components/dialog/ConfirmDialog.js";
|
|
12
|
+
import { PERMISSIONS as c } from "../../../constants/permissions.js";
|
|
13
|
+
import { isNative as l, nativeConfirm as u, nativeImpact as d, nativeNotify as f, nativeToast as p } from "../../../../utils/nativeBridge.js";
|
|
14
|
+
import { useDeleteWorkspace as m, useWorkspaces as h } from "../hooks/useWorkspaces.js";
|
|
15
|
+
import { WorkspaceStatusBadge as g } from "../components/WorkspaceStatusBadge.js";
|
|
16
|
+
import { useEffect as _, useMemo as re, useState as v } from "react";
|
|
17
|
+
import { Briefcase as y, Eye as b, Plus as ie, RefreshCw as ae, SquarePen as x, Trash2 as S } from "lucide-react";
|
|
18
|
+
import { usePermissions as C } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
19
|
+
import { Fragment as w, jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
20
|
+
//#region src/organization-management/modules/workspaces/pages/WorkspacesListPage.tsx
|
|
21
|
+
function D(e) {
|
|
22
|
+
return new Date(e).toLocaleDateString();
|
|
23
|
+
}
|
|
24
|
+
function O() {
|
|
25
|
+
let O = r(), { navigate: k, basePath: A = "/organizations" } = e(), { hasPermission: j, isLoading: oe } = C(), [M, N] = v(""), P = te(M, 300), [F, I] = v({}), [L, R] = v(/* @__PURE__ */ new Set()), { openConfirmDialog: z, ConfirmDialog: B } = ne(), { workspaces: V, loading: H, error: U, refetch: W } = h({
|
|
26
|
+
...F,
|
|
27
|
+
search: P || void 0
|
|
28
|
+
}, 20, 0), { deleteWorkspace: G, loading: K } = m();
|
|
29
|
+
_(() => {
|
|
30
|
+
R((e) => {
|
|
31
|
+
let t = new Set(V.map((e) => e.id)), n = new Set([...e].filter((e) => t.has(e)));
|
|
32
|
+
return n.size === e.size ? e : n;
|
|
33
|
+
});
|
|
34
|
+
}, [V]);
|
|
35
|
+
let q = re(() => V.filter((e) => L.has(e.id)), [L, V]), J = V.length > 0 && V.every((e) => L.has(e.id)), Y = V.some((e) => L.has(e.id)) && !J, X = async (e) => {
|
|
36
|
+
try {
|
|
37
|
+
let n = (await Promise.allSettled(e.map(async (e) => {
|
|
38
|
+
let t = await G(e);
|
|
39
|
+
if (t.errors?.length) throw Error(t.errors[0]?.message ?? O("workspaces.suspend.failed", "Failed to suspend workspace"));
|
|
40
|
+
}))).find((e) => e.status === "rejected");
|
|
41
|
+
if (n?.status === "rejected") throw n.reason;
|
|
42
|
+
R(/* @__PURE__ */ new Set()), await W();
|
|
43
|
+
let r = e.length === 1 ? O("workspaces.suspend.successSingle", "Workspace suspended successfully") : `${e.length} ${O("workspaces.suspend.successMany", "workspaces suspended successfully")}`;
|
|
44
|
+
t.success(r), f("success"), l() && p(r);
|
|
45
|
+
} catch (e) {
|
|
46
|
+
let n = e instanceof Error ? e.message : O("workspaces.suspend.failed", "Failed to suspend workspace");
|
|
47
|
+
t.error(n), f("error"), l() && p(n);
|
|
48
|
+
}
|
|
49
|
+
}, Z = (e, t) => {
|
|
50
|
+
d("medium");
|
|
51
|
+
let n = O("workspaces.suspend.title", "Suspend workspace"), r = `${O("workspaces.suspend.prefix", "Suspend")} ${t}? ${O("workspaces.suspend.suffix", "Workspace members will lose access until it is reactivated.")}`;
|
|
52
|
+
u({
|
|
53
|
+
title: n,
|
|
54
|
+
message: r,
|
|
55
|
+
okButtonTitle: O("workspaces.suspend.confirm", "Suspend")
|
|
56
|
+
}).then((t) => {
|
|
57
|
+
t === null ? z({
|
|
58
|
+
title: n,
|
|
59
|
+
description: r,
|
|
60
|
+
confirmText: O("workspaces.suspend.confirm", "Suspend"),
|
|
61
|
+
variant: "warning",
|
|
62
|
+
onConfirm: () => {
|
|
63
|
+
X([e]);
|
|
64
|
+
}
|
|
65
|
+
}) : t && X([e]);
|
|
66
|
+
});
|
|
67
|
+
}, se = () => {
|
|
68
|
+
q.length !== 0 && z({
|
|
69
|
+
title: O("workspaces.suspend.bulkTitle", "Suspend selected workspaces"),
|
|
70
|
+
description: `${O("workspaces.suspend.prefix", "Suspend")} ${q.length} ${O(q.length === 1 ? "workspaces.suspend.bulkSuffixSingle" : "workspaces.suspend.bulkSuffixMany", q.length === 1 ? "selected workspace?" : "selected workspaces?")}`,
|
|
71
|
+
confirmText: `${O("workspaces.suspend.confirm", "Suspend")} ${q.length}`,
|
|
72
|
+
variant: "warning",
|
|
73
|
+
onConfirm: () => {
|
|
74
|
+
X(q.map((e) => e.id));
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}, Q = (e, t) => {
|
|
78
|
+
R((n) => {
|
|
79
|
+
let r = new Set(n);
|
|
80
|
+
return t ? r.add(e) : r.delete(e), r;
|
|
81
|
+
});
|
|
82
|
+
}, $ = (e) => {
|
|
83
|
+
R((t) => {
|
|
84
|
+
let n = new Set(t);
|
|
85
|
+
return V.forEach((t) => {
|
|
86
|
+
e ? n.add(t.id) : n.delete(t.id);
|
|
87
|
+
}), n;
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
return oe ? /* @__PURE__ */ T("div", {
|
|
91
|
+
className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
|
|
92
|
+
children: /* @__PURE__ */ T(a, { message: O("common.loadingPermissions", "Loading permissions...") })
|
|
93
|
+
}) : j(c.WORKSPACE_LIST) ? H ? /* @__PURE__ */ T("div", {
|
|
94
|
+
className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6",
|
|
95
|
+
children: /* @__PURE__ */ T(a, { message: O("workspaces.list.loading", "Loading workspaces...") })
|
|
96
|
+
}) : U ? /* @__PURE__ */ T("div", {
|
|
97
|
+
className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6",
|
|
98
|
+
children: /* @__PURE__ */ T(o, {
|
|
99
|
+
message: U.message,
|
|
100
|
+
action: {
|
|
101
|
+
label: O("common.retry", "Retry"),
|
|
102
|
+
onClick: () => {
|
|
103
|
+
W();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
})
|
|
107
|
+
}) : /* @__PURE__ */ E("div", {
|
|
108
|
+
className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6 animate-in fade-in duration-300",
|
|
109
|
+
children: [/* @__PURE__ */ E("div", {
|
|
110
|
+
className: "mx-auto flex w-full max-w-7xl flex-col gap-6",
|
|
111
|
+
children: [
|
|
112
|
+
/* @__PURE__ */ E("div", {
|
|
113
|
+
className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",
|
|
114
|
+
children: [/* @__PURE__ */ E("div", {
|
|
115
|
+
className: "space-y-2",
|
|
116
|
+
children: [/* @__PURE__ */ T("h1", {
|
|
117
|
+
className: "text-3xl font-bold text-[var(--color-text-primary)]",
|
|
118
|
+
children: O("workspaces.list.title", "Workspaces")
|
|
119
|
+
}), /* @__PURE__ */ T("p", {
|
|
120
|
+
className: "max-w-2xl text-[var(--color-text-secondary)]",
|
|
121
|
+
children: O("workspaces.list.subtitle", "Manage organization workspaces, review their status, and open the workspace detail flow.")
|
|
122
|
+
})]
|
|
123
|
+
}), j(c.WORKSPACE_CREATE) && /* @__PURE__ */ E("button", {
|
|
124
|
+
onClick: () => k(`${A}/workspaces/new`),
|
|
125
|
+
className: "inline-flex min-h-11 items-center justify-center gap-2 rounded-lg bg-[var(--color-action-primary-bg)] px-4 py-2.5 text-[var(--color-action-primary-text)] transition-all duration-200 hover:opacity-90 active:scale-[0.98]",
|
|
126
|
+
children: [/* @__PURE__ */ T(ie, {
|
|
127
|
+
size: 18,
|
|
128
|
+
"aria-hidden": "true"
|
|
129
|
+
}), /* @__PURE__ */ T("span", {
|
|
130
|
+
className: "font-medium",
|
|
131
|
+
children: O("workspaces.create.button", "Create Workspace")
|
|
132
|
+
})]
|
|
133
|
+
})]
|
|
134
|
+
}),
|
|
135
|
+
/* @__PURE__ */ E("div", {
|
|
136
|
+
className: "rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-4 shadow-[var(--shadow-elevation-1)]",
|
|
137
|
+
children: [/* @__PURE__ */ E("div", {
|
|
138
|
+
className: "flex flex-col gap-3 lg:flex-row lg:items-center",
|
|
139
|
+
children: [
|
|
140
|
+
/* @__PURE__ */ T(ee, {
|
|
141
|
+
value: M,
|
|
142
|
+
onChange: N,
|
|
143
|
+
placeholder: O("workspaces.list.searchPlaceholder", "Search workspaces..."),
|
|
144
|
+
label: O("workspaces.list.searchLabel", "Search workspaces"),
|
|
145
|
+
inputId: "workspaces-search",
|
|
146
|
+
className: "flex-1"
|
|
147
|
+
}),
|
|
148
|
+
/* @__PURE__ */ E("label", {
|
|
149
|
+
className: "flex min-h-11 min-w-[180px] flex-col justify-center rounded-lg border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] px-3 py-2 text-sm text-[var(--color-text-secondary)]",
|
|
150
|
+
children: [/* @__PURE__ */ T("span", {
|
|
151
|
+
className: "sr-only",
|
|
152
|
+
children: O("workspaces.list.filterByStatus", "Filter by workspace status")
|
|
153
|
+
}), /* @__PURE__ */ E("select", {
|
|
154
|
+
value: F.status || "",
|
|
155
|
+
onChange: (e) => I({
|
|
156
|
+
...F,
|
|
157
|
+
status: e.target.value ? e.target.value : void 0
|
|
158
|
+
}),
|
|
159
|
+
className: "bg-transparent text-[var(--color-text-primary)] focus:outline-none",
|
|
160
|
+
"aria-label": O("workspaces.list.filterByStatus", "Filter by workspace status"),
|
|
161
|
+
children: [
|
|
162
|
+
/* @__PURE__ */ T("option", {
|
|
163
|
+
value: "",
|
|
164
|
+
children: O("workspaces.list.allStatuses", "All statuses")
|
|
165
|
+
}),
|
|
166
|
+
/* @__PURE__ */ T("option", {
|
|
167
|
+
value: n.ACTIVE,
|
|
168
|
+
children: O("workspaces.status.active", "Active")
|
|
169
|
+
}),
|
|
170
|
+
/* @__PURE__ */ T("option", {
|
|
171
|
+
value: n.INACTIVE,
|
|
172
|
+
children: O("workspaces.status.inactive", "Inactive")
|
|
173
|
+
}),
|
|
174
|
+
/* @__PURE__ */ T("option", {
|
|
175
|
+
value: n.ARCHIVED,
|
|
176
|
+
children: O("workspaces.status.archived", "Archived")
|
|
177
|
+
})
|
|
178
|
+
]
|
|
179
|
+
})]
|
|
180
|
+
}),
|
|
181
|
+
/* @__PURE__ */ T("button", {
|
|
182
|
+
onClick: () => {
|
|
183
|
+
W();
|
|
184
|
+
},
|
|
185
|
+
className: "inline-flex min-h-11 items-center justify-center gap-2 rounded-lg border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] px-4 py-2 text-[var(--color-text-primary)] transition-all duration-200 hover:bg-[var(--color-bg-subtle)] active:scale-95",
|
|
186
|
+
"aria-label": O("workspaces.list.refresh", "Refresh workspaces"),
|
|
187
|
+
title: O("workspaces.list.refresh", "Refresh workspaces"),
|
|
188
|
+
children: /* @__PURE__ */ T(ae, {
|
|
189
|
+
size: 18,
|
|
190
|
+
"aria-hidden": "true"
|
|
191
|
+
})
|
|
192
|
+
})
|
|
193
|
+
]
|
|
194
|
+
}), V.length > 0 ? /* @__PURE__ */ E("div", {
|
|
195
|
+
className: "mt-4 flex flex-col gap-3 rounded-lg border border-[var(--color-border-default)] bg-[var(--color-bg-canvas)] p-4 sm:flex-row sm:items-center sm:justify-between",
|
|
196
|
+
children: [/* @__PURE__ */ E("div", {
|
|
197
|
+
className: "flex flex-wrap items-center gap-3",
|
|
198
|
+
children: [/* @__PURE__ */ E("label", {
|
|
199
|
+
className: "flex items-center gap-2 text-sm text-[var(--color-text-primary)]",
|
|
200
|
+
children: [/* @__PURE__ */ T(i, {
|
|
201
|
+
checked: J,
|
|
202
|
+
indeterminate: Y,
|
|
203
|
+
onChange: $,
|
|
204
|
+
ariaLabel: O("workspaces.list.selectAll", "Select all workspaces")
|
|
205
|
+
}), /* @__PURE__ */ T("span", { children: O("common.selectAllVisible", "Select all visible") })]
|
|
206
|
+
}), L.size > 0 ? /* @__PURE__ */ T("button", {
|
|
207
|
+
onClick: () => R(/* @__PURE__ */ new Set()),
|
|
208
|
+
className: "text-sm text-[var(--color-text-secondary)] transition-colors hover:text-[var(--color-text-primary)]",
|
|
209
|
+
children: O("common.clearSelection", "Clear selection")
|
|
210
|
+
}) : null]
|
|
211
|
+
}), /* @__PURE__ */ E("div", {
|
|
212
|
+
className: "flex flex-col gap-2 sm:flex-row sm:items-center",
|
|
213
|
+
children: [/* @__PURE__ */ E("span", {
|
|
214
|
+
className: "text-sm text-[var(--color-text-secondary)]",
|
|
215
|
+
children: [
|
|
216
|
+
L.size,
|
|
217
|
+
" ",
|
|
218
|
+
O("common.selected", "selected")
|
|
219
|
+
]
|
|
220
|
+
}), j(c.WORKSPACE_DELETE) && /* @__PURE__ */ E("button", {
|
|
221
|
+
onClick: se,
|
|
222
|
+
disabled: q.length === 0 || K,
|
|
223
|
+
className: "inline-flex min-h-11 items-center justify-center gap-2 rounded-lg border border-[var(--color-status-warning-border)] px-3 py-2 text-[var(--color-status-warning-text)] transition-all duration-200 hover:bg-[var(--color-status-warning-bgSubtle)] disabled:cursor-not-allowed disabled:opacity-50",
|
|
224
|
+
children: [
|
|
225
|
+
/* @__PURE__ */ T(S, {
|
|
226
|
+
size: 16,
|
|
227
|
+
"aria-hidden": "true"
|
|
228
|
+
}),
|
|
229
|
+
/* @__PURE__ */ T("span", { children: O("workspaces.list.suspendSelected", "Suspend Selected") }),
|
|
230
|
+
q.length > 0 ? /* @__PURE__ */ E("span", { children: [
|
|
231
|
+
"(",
|
|
232
|
+
q.length,
|
|
233
|
+
")"
|
|
234
|
+
] }) : null
|
|
235
|
+
]
|
|
236
|
+
})]
|
|
237
|
+
})]
|
|
238
|
+
}) : null]
|
|
239
|
+
}),
|
|
240
|
+
V.length === 0 ? /* @__PURE__ */ T("div", {
|
|
241
|
+
className: "rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-6 shadow-[var(--shadow-elevation-1)]",
|
|
242
|
+
children: /* @__PURE__ */ T(s, {
|
|
243
|
+
icon: /* @__PURE__ */ T(y, {
|
|
244
|
+
size: 40,
|
|
245
|
+
"aria-hidden": "true"
|
|
246
|
+
}),
|
|
247
|
+
title: O("workspaces.list.emptyNoneTitle", "No workspaces found"),
|
|
248
|
+
description: O("workspaces.list.emptyNoneDescription", "Create a workspace to start mapping members, organization ownership, and collaboration settings."),
|
|
249
|
+
action: {
|
|
250
|
+
label: O("workspaces.create.button", "Create Workspace"),
|
|
251
|
+
onClick: () => k(`${A}/workspaces/new`)
|
|
252
|
+
}
|
|
253
|
+
})
|
|
254
|
+
}) : /* @__PURE__ */ E(w, { children: [/* @__PURE__ */ T("div", {
|
|
255
|
+
className: "grid gap-4 md:hidden",
|
|
256
|
+
children: V.map((e) => /* @__PURE__ */ E("article", {
|
|
257
|
+
className: "rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-4 shadow-[var(--shadow-elevation-1)]",
|
|
258
|
+
children: [/* @__PURE__ */ E("div", {
|
|
259
|
+
className: "flex items-start gap-3",
|
|
260
|
+
children: [/* @__PURE__ */ T(i, {
|
|
261
|
+
checked: L.has(e.id),
|
|
262
|
+
onChange: (t) => Q(e.id, t),
|
|
263
|
+
ariaLabel: `${O("workspaces.list.selectOne", "Select workspace")} ${e.name}`
|
|
264
|
+
}), /* @__PURE__ */ E("div", {
|
|
265
|
+
className: "min-w-0 flex-1 space-y-3",
|
|
266
|
+
children: [/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ E("div", {
|
|
267
|
+
className: "flex flex-wrap items-start gap-2",
|
|
268
|
+
children: [
|
|
269
|
+
/* @__PURE__ */ T("h2", {
|
|
270
|
+
className: "text-base font-semibold text-[var(--color-text-primary)]",
|
|
271
|
+
children: e.name
|
|
272
|
+
}),
|
|
273
|
+
/* @__PURE__ */ T(g, { status: e.status }),
|
|
274
|
+
/* @__PURE__ */ T("span", {
|
|
275
|
+
className: "inline-flex items-center rounded-md bg-[var(--color-bg-subtle)] px-2 py-1 text-xs font-medium text-[var(--color-text-secondary)]",
|
|
276
|
+
children: e.type
|
|
277
|
+
})
|
|
278
|
+
]
|
|
279
|
+
}), /* @__PURE__ */ E("p", {
|
|
280
|
+
className: "mt-1 break-all font-mono text-sm text-[var(--color-text-muted)]",
|
|
281
|
+
children: ["/", e.slug]
|
|
282
|
+
})] }), /* @__PURE__ */ E("dl", {
|
|
283
|
+
className: "grid grid-cols-2 gap-3 text-sm",
|
|
284
|
+
children: [/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("dt", {
|
|
285
|
+
className: "text-[var(--color-text-secondary)]",
|
|
286
|
+
children: O("workspaces.list.members", "Members")
|
|
287
|
+
}), /* @__PURE__ */ T("dd", {
|
|
288
|
+
className: "font-medium text-[var(--color-text-primary)]",
|
|
289
|
+
children: e.memberCount ?? 0
|
|
290
|
+
})] }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("dt", {
|
|
291
|
+
className: "text-[var(--color-text-secondary)]",
|
|
292
|
+
children: O("common.created", "Created")
|
|
293
|
+
}), /* @__PURE__ */ T("dd", {
|
|
294
|
+
className: "font-medium text-[var(--color-text-primary)]",
|
|
295
|
+
children: D(e.createdAt)
|
|
296
|
+
})] })]
|
|
297
|
+
})]
|
|
298
|
+
})]
|
|
299
|
+
}), /* @__PURE__ */ E("div", {
|
|
300
|
+
className: "mt-4 flex flex-wrap gap-2 border-t border-[var(--color-border-default)] pt-4",
|
|
301
|
+
children: [
|
|
302
|
+
/* @__PURE__ */ E("button", {
|
|
303
|
+
onClick: () => k(`${A}/workspaces/${e.id}`),
|
|
304
|
+
className: "inline-flex min-h-10 items-center gap-2 rounded-lg border border-[var(--color-border-default)] px-3 py-2 text-sm text-[var(--color-text-primary)] transition-all duration-200 hover:bg-[var(--color-bg-subtle)]",
|
|
305
|
+
children: [/* @__PURE__ */ T(b, {
|
|
306
|
+
size: 16,
|
|
307
|
+
"aria-hidden": "true"
|
|
308
|
+
}), O("common.view", "View")]
|
|
309
|
+
}),
|
|
310
|
+
j(c.WORKSPACE_UPDATE) && /* @__PURE__ */ E("button", {
|
|
311
|
+
onClick: () => k(`${A}/workspaces/${e.id}/edit`),
|
|
312
|
+
className: "inline-flex min-h-10 items-center gap-2 rounded-lg border border-[var(--color-border-default)] px-3 py-2 text-sm text-[var(--color-text-primary)] transition-all duration-200 hover:bg-[var(--color-bg-subtle)]",
|
|
313
|
+
children: [/* @__PURE__ */ T(x, {
|
|
314
|
+
size: 16,
|
|
315
|
+
"aria-hidden": "true"
|
|
316
|
+
}), O("common.edit", "Edit")]
|
|
317
|
+
}),
|
|
318
|
+
j(c.WORKSPACE_DELETE) && /* @__PURE__ */ E("button", {
|
|
319
|
+
onClick: () => Z(e.id, e.name),
|
|
320
|
+
disabled: K,
|
|
321
|
+
className: "inline-flex min-h-10 items-center gap-2 rounded-lg border border-[var(--color-status-warning-border)] px-3 py-2 text-sm text-[var(--color-status-warning-text)] transition-all duration-200 hover:bg-[var(--color-status-warning-bgSubtle)] disabled:cursor-not-allowed disabled:opacity-50",
|
|
322
|
+
children: [/* @__PURE__ */ T(S, {
|
|
323
|
+
size: 16,
|
|
324
|
+
"aria-hidden": "true"
|
|
325
|
+
}), O("workspaces.suspend.confirm", "Suspend")]
|
|
326
|
+
})
|
|
327
|
+
]
|
|
328
|
+
})]
|
|
329
|
+
}, e.id))
|
|
330
|
+
}), /* @__PURE__ */ T("div", {
|
|
331
|
+
className: "hidden overflow-hidden rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] shadow-[var(--shadow-elevation-1)] md:block",
|
|
332
|
+
children: /* @__PURE__ */ T("div", {
|
|
333
|
+
className: "overflow-x-auto",
|
|
334
|
+
children: /* @__PURE__ */ E("table", {
|
|
335
|
+
className: "min-w-full",
|
|
336
|
+
children: [/* @__PURE__ */ T("thead", {
|
|
337
|
+
className: "bg-[var(--color-bg-subtle)]",
|
|
338
|
+
children: /* @__PURE__ */ E("tr", { children: [
|
|
339
|
+
/* @__PURE__ */ T("th", {
|
|
340
|
+
className: "w-12 px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
|
|
341
|
+
children: /* @__PURE__ */ T(i, {
|
|
342
|
+
checked: J,
|
|
343
|
+
indeterminate: Y,
|
|
344
|
+
onChange: $,
|
|
345
|
+
ariaLabel: O("workspaces.list.selectAll", "Select all workspaces")
|
|
346
|
+
})
|
|
347
|
+
}),
|
|
348
|
+
/* @__PURE__ */ T("th", {
|
|
349
|
+
className: "px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
|
|
350
|
+
children: O("workspaces.list.column.workspace", "Workspace")
|
|
351
|
+
}),
|
|
352
|
+
/* @__PURE__ */ T("th", {
|
|
353
|
+
className: "px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
|
|
354
|
+
children: O("common.status", "Status")
|
|
355
|
+
}),
|
|
356
|
+
/* @__PURE__ */ T("th", {
|
|
357
|
+
className: "px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
|
|
358
|
+
children: O("workspaces.list.column.type", "Type")
|
|
359
|
+
}),
|
|
360
|
+
/* @__PURE__ */ T("th", {
|
|
361
|
+
className: "px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
|
|
362
|
+
children: O("common.created", "Created")
|
|
363
|
+
}),
|
|
364
|
+
/* @__PURE__ */ T("th", {
|
|
365
|
+
className: "px-6 py-3 text-right text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
|
|
366
|
+
children: O("common.actions", "Actions")
|
|
367
|
+
})
|
|
368
|
+
] })
|
|
369
|
+
}), /* @__PURE__ */ T("tbody", {
|
|
370
|
+
className: "divide-y divide-[var(--color-border-default)]",
|
|
371
|
+
children: V.map((e) => /* @__PURE__ */ E("tr", {
|
|
372
|
+
className: "transition-colors hover:bg-[var(--color-bg-subtle)]",
|
|
373
|
+
children: [
|
|
374
|
+
/* @__PURE__ */ T("td", {
|
|
375
|
+
className: "px-6 py-4 align-top",
|
|
376
|
+
children: /* @__PURE__ */ T(i, {
|
|
377
|
+
checked: L.has(e.id),
|
|
378
|
+
onChange: (t) => Q(e.id, t),
|
|
379
|
+
ariaLabel: `${O("workspaces.list.selectOne", "Select workspace")} ${e.name}`
|
|
380
|
+
})
|
|
381
|
+
}),
|
|
382
|
+
/* @__PURE__ */ T("td", {
|
|
383
|
+
className: "px-6 py-4",
|
|
384
|
+
children: /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
|
|
385
|
+
className: "font-medium text-[var(--color-text-primary)]",
|
|
386
|
+
children: e.name
|
|
387
|
+
}), /* @__PURE__ */ E("p", {
|
|
388
|
+
className: "break-all font-mono text-sm text-[var(--color-text-muted)]",
|
|
389
|
+
children: ["/", e.slug]
|
|
390
|
+
})] })
|
|
391
|
+
}),
|
|
392
|
+
/* @__PURE__ */ T("td", {
|
|
393
|
+
className: "px-6 py-4 align-top",
|
|
394
|
+
children: /* @__PURE__ */ T(g, { status: e.status })
|
|
395
|
+
}),
|
|
396
|
+
/* @__PURE__ */ T("td", {
|
|
397
|
+
className: "px-6 py-4 align-top",
|
|
398
|
+
children: /* @__PURE__ */ T("span", {
|
|
399
|
+
className: "inline-flex items-center rounded-md bg-[var(--color-bg-subtle)] px-2 py-1 text-xs font-medium text-[var(--color-text-secondary)]",
|
|
400
|
+
children: e.type
|
|
401
|
+
})
|
|
402
|
+
}),
|
|
403
|
+
/* @__PURE__ */ T("td", {
|
|
404
|
+
className: "px-6 py-4 align-top text-sm text-[var(--color-text-secondary)]",
|
|
405
|
+
children: D(e.createdAt)
|
|
406
|
+
}),
|
|
407
|
+
/* @__PURE__ */ T("td", {
|
|
408
|
+
className: "px-6 py-4 align-top",
|
|
409
|
+
children: /* @__PURE__ */ E("div", {
|
|
410
|
+
className: "flex items-center justify-end gap-2",
|
|
411
|
+
children: [
|
|
412
|
+
/* @__PURE__ */ T("button", {
|
|
413
|
+
onClick: () => k(`${A}/workspaces/${e.id}`),
|
|
414
|
+
className: "rounded-lg p-2 text-[var(--color-text-secondary)] transition-all duration-200 hover:bg-[var(--color-bg-muted)] hover:text-[var(--color-text-primary)]",
|
|
415
|
+
title: `${O("common.view", "View")} ${e.name}`,
|
|
416
|
+
"aria-label": `${O("common.view", "View")} ${e.name}`,
|
|
417
|
+
children: /* @__PURE__ */ T(b, {
|
|
418
|
+
size: 18,
|
|
419
|
+
"aria-hidden": "true"
|
|
420
|
+
})
|
|
421
|
+
}),
|
|
422
|
+
j(c.WORKSPACE_UPDATE) && /* @__PURE__ */ T("button", {
|
|
423
|
+
onClick: () => k(`${A}/workspaces/${e.id}/edit`),
|
|
424
|
+
className: "rounded-lg p-2 text-[var(--color-text-secondary)] transition-all duration-200 hover:bg-[var(--color-bg-muted)] hover:text-[var(--color-text-primary)]",
|
|
425
|
+
title: `${O("common.edit", "Edit")} ${e.name}`,
|
|
426
|
+
"aria-label": `${O("common.edit", "Edit")} ${e.name}`,
|
|
427
|
+
children: /* @__PURE__ */ T(x, {
|
|
428
|
+
size: 18,
|
|
429
|
+
"aria-hidden": "true"
|
|
430
|
+
})
|
|
431
|
+
}),
|
|
432
|
+
j(c.WORKSPACE_DELETE) && /* @__PURE__ */ T("button", {
|
|
433
|
+
onClick: () => Z(e.id, e.name),
|
|
434
|
+
disabled: K,
|
|
435
|
+
className: "rounded-lg p-2 text-[var(--color-status-warning-text)] transition-all duration-200 hover:bg-[var(--color-status-warning-bgSubtle)] disabled:cursor-not-allowed disabled:opacity-50",
|
|
436
|
+
title: `${O("workspaces.suspend.confirm", "Suspend")} ${e.name}`,
|
|
437
|
+
"aria-label": `${O("workspaces.suspend.confirm", "Suspend")} ${e.name}`,
|
|
438
|
+
children: /* @__PURE__ */ T(S, {
|
|
439
|
+
size: 18,
|
|
440
|
+
"aria-hidden": "true"
|
|
441
|
+
})
|
|
442
|
+
})
|
|
443
|
+
]
|
|
444
|
+
})
|
|
445
|
+
})
|
|
446
|
+
]
|
|
447
|
+
}, e.id))
|
|
448
|
+
})]
|
|
449
|
+
})
|
|
450
|
+
})
|
|
451
|
+
})] })
|
|
452
|
+
]
|
|
453
|
+
}), B]
|
|
454
|
+
}) : /* @__PURE__ */ T("div", {
|
|
455
|
+
className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
|
|
456
|
+
children: /* @__PURE__ */ T("div", {
|
|
457
|
+
className: "p-8 text-center text-[var(--color-text-secondary)]",
|
|
458
|
+
children: O("workspaces.list.noPermission", "You don't have permission to view workspaces.")
|
|
459
|
+
})
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
//#endregion
|
|
463
|
+
export { O as WorkspacesListPage };
|
|
464
|
+
|
|
465
|
+
//# sourceMappingURL=WorkspacesListPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspacesListPage.js","names":[],"sources":["../../../../../src/organization-management/modules/workspaces/pages/WorkspacesListPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Briefcase, Eye, Plus, RefreshCw, SquarePen, Trash2 } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useDeleteWorkspace, useWorkspaces } from '../hooks/useWorkspaces';\nimport { WorkspaceStatusBadge } from '../components/WorkspaceStatusBadge';\nimport { SearchInput } from '../../../shared/components/input/SearchInput';\nimport { SelectionCheckbox } from '../../../shared/components/input/SelectionCheckbox';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { EmptyState } from '../../../shared/components/feedback/EmptyState';\nimport { useDebouncedValue } from '../../../shared/hooks/useDebouncedValue';\nimport { useConfirmDialog } from '../../../shared/components/dialog/ConfirmDialog';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\nimport type { WorkspaceFilterInput } from '../types';\nimport { WorkspaceStatus } from '../types';\nimport {\n isNative,\n nativeConfirm,\n nativeImpact,\n nativeNotify,\n nativeToast,\n} from '../../../../utils/nativeBridge';\n\nfunction formatDate(date: string) {\n return new Date(date).toLocaleDateString();\n}\n\nexport function WorkspacesListPage() {\n const tr = useTr();\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const [searchQuery, setSearchQuery] = useState('');\n const debouncedSearchQuery = useDebouncedValue(searchQuery, 300);\n const [filter, setFilter] = useState<WorkspaceFilterInput>({});\n const [selectedWorkspaceIds, setSelectedWorkspaceIds] = useState<Set<string>>(new Set());\n const { openConfirmDialog, ConfirmDialog } = useConfirmDialog();\n\n const { workspaces, loading, error, refetch } = useWorkspaces(\n { ...filter, search: debouncedSearchQuery || undefined },\n 20,\n 0\n );\n\n const { deleteWorkspace, loading: deleteLoading } = useDeleteWorkspace();\n\n useEffect(() => {\n setSelectedWorkspaceIds((previousSelection) => {\n const visibleIds = new Set(workspaces.map((workspace) => workspace.id));\n const nextSelection = new Set(\n [...previousSelection].filter((workspaceId) => visibleIds.has(workspaceId))\n );\n\n if (nextSelection.size === previousSelection.size) {\n return previousSelection;\n }\n\n return nextSelection;\n });\n }, [workspaces]);\n\n const selectedWorkspaces = useMemo(\n () => workspaces.filter((workspace) => selectedWorkspaceIds.has(workspace.id)),\n [selectedWorkspaceIds, workspaces]\n );\n\n const allVisibleSelected =\n workspaces.length > 0 &&\n workspaces.every((workspace) => selectedWorkspaceIds.has(workspace.id));\n const partiallySelected =\n workspaces.some((workspace) => selectedWorkspaceIds.has(workspace.id)) && !allVisibleSelected;\n\n const executeSuspend = async (workspaceIds: string[]) => {\n try {\n const results = await Promise.allSettled(\n workspaceIds.map(async (workspaceId) => {\n const result = await deleteWorkspace(workspaceId);\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ??\n tr('workspaces.suspend.failed', 'Failed to suspend workspace')\n );\n }\n })\n );\n\n const rejectedResult = results.find((result) => result.status === 'rejected');\n if (rejectedResult?.status === 'rejected') {\n throw rejectedResult.reason;\n }\n\n setSelectedWorkspaceIds(new Set());\n await refetch();\n const successMsg =\n workspaceIds.length === 1\n ? tr('workspaces.suspend.successSingle', 'Workspace suspended successfully')\n : `${workspaceIds.length} ${tr('workspaces.suspend.successMany', 'workspaces suspended successfully')}`;\n toast.success(successMsg);\n void nativeNotify('success');\n if (isNative()) void nativeToast(successMsg);\n } catch (suspendError) {\n const errorMsg =\n suspendError instanceof Error\n ? suspendError.message\n : tr('workspaces.suspend.failed', 'Failed to suspend workspace');\n toast.error(errorMsg);\n void nativeNotify('error');\n if (isNative()) void nativeToast(errorMsg);\n }\n };\n\n const handleDelete = (workspaceId: string, workspaceName: string) => {\n nativeImpact('medium');\n const title = tr('workspaces.suspend.title', 'Suspend workspace');\n const description = `${tr('workspaces.suspend.prefix', 'Suspend')} ${workspaceName}? ${tr(\n 'workspaces.suspend.suffix',\n 'Workspace members will lose access until it is reactivated.'\n )}`;\n void nativeConfirm({\n title,\n message: description,\n okButtonTitle: tr('workspaces.suspend.confirm', 'Suspend'),\n }).then((nativeResult) => {\n if (nativeResult === null) {\n openConfirmDialog({\n title,\n description,\n confirmText: tr('workspaces.suspend.confirm', 'Suspend'),\n variant: 'warning',\n onConfirm: () => {\n void executeSuspend([workspaceId]);\n },\n });\n } else if (nativeResult) {\n void executeSuspend([workspaceId]);\n }\n });\n };\n\n const handleBulkDelete = () => {\n if (selectedWorkspaces.length === 0) return;\n\n openConfirmDialog({\n title: tr('workspaces.suspend.bulkTitle', 'Suspend selected workspaces'),\n description: `${tr('workspaces.suspend.prefix', 'Suspend')} ${selectedWorkspaces.length} ${tr(\n selectedWorkspaces.length === 1\n ? 'workspaces.suspend.bulkSuffixSingle'\n : 'workspaces.suspend.bulkSuffixMany',\n selectedWorkspaces.length === 1 ? 'selected workspace?' : 'selected workspaces?'\n )}`,\n confirmText: `${tr('workspaces.suspend.confirm', 'Suspend')} ${selectedWorkspaces.length}`,\n variant: 'warning',\n onConfirm: () => {\n void executeSuspend(selectedWorkspaces.map((workspace) => workspace.id));\n },\n });\n };\n\n const toggleWorkspaceSelection = (workspaceId: string, checked: boolean) => {\n setSelectedWorkspaceIds((previousSelection) => {\n const nextSelection = new Set(previousSelection);\n if (checked) {\n nextSelection.add(workspaceId);\n } else {\n nextSelection.delete(workspaceId);\n }\n return nextSelection;\n });\n };\n\n const toggleAllWorkspaces = (checked: boolean) => {\n setSelectedWorkspaceIds((previousSelection) => {\n const nextSelection = new Set(previousSelection);\n workspaces.forEach((workspace) => {\n if (checked) {\n nextSelection.add(workspace.id);\n } else {\n nextSelection.delete(workspace.id);\n }\n });\n return nextSelection;\n });\n };\n\n if (permissionsLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <LoadingState message={tr('common.loadingPermissions', 'Loading permissions...')} />\n </div>\n );\n }\n\n if (!hasPermission(PERMISSIONS.WORKSPACE_LIST)) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <div className=\"p-8 text-center text-[var(--color-text-secondary)]\">\n {tr('workspaces.list.noPermission', \"You don't have permission to view workspaces.\")}\n </div>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <LoadingState message={tr('workspaces.list.loading', 'Loading workspaces...')} />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <ErrorState\n message={error.message}\n action={{\n label: tr('common.retry', 'Retry'),\n onClick: () => {\n void refetch();\n },\n }}\n />\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6 animate-in fade-in duration-300\">\n <div className=\"mx-auto flex w-full max-w-7xl flex-col gap-6\">\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"space-y-2\">\n <h1 className=\"text-3xl font-bold text-[var(--color-text-primary)]\">\n {tr('workspaces.list.title', 'Workspaces')}\n </h1>\n <p className=\"max-w-2xl text-[var(--color-text-secondary)]\">\n {tr(\n 'workspaces.list.subtitle',\n 'Manage organization workspaces, review their status, and open the workspace detail flow.'\n )}\n </p>\n </div>\n\n {hasPermission(PERMISSIONS.WORKSPACE_CREATE) && (\n <button\n onClick={() => navigate(`${basePath}/workspaces/new`)}\n className=\"inline-flex min-h-11 items-center justify-center gap-2 rounded-lg bg-[var(--color-action-primary-bg)] px-4 py-2.5 text-[var(--color-action-primary-text)] transition-all duration-200 hover:opacity-90 active:scale-[0.98]\"\n >\n <Plus size={18} aria-hidden=\"true\" />\n <span className=\"font-medium\">\n {tr('workspaces.create.button', 'Create Workspace')}\n </span>\n </button>\n )}\n </div>\n\n <div className=\"rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-4 shadow-[var(--shadow-elevation-1)]\">\n <div className=\"flex flex-col gap-3 lg:flex-row lg:items-center\">\n <SearchInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder={tr('workspaces.list.searchPlaceholder', 'Search workspaces...')}\n label={tr('workspaces.list.searchLabel', 'Search workspaces')}\n inputId=\"workspaces-search\"\n className=\"flex-1\"\n />\n\n <label className=\"flex min-h-11 min-w-[180px] flex-col justify-center rounded-lg border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] px-3 py-2 text-sm text-[var(--color-text-secondary)]\">\n <span className=\"sr-only\">\n {tr('workspaces.list.filterByStatus', 'Filter by workspace status')}\n </span>\n <select\n value={filter.status || ''}\n onChange={(event) =>\n setFilter({\n ...filter,\n status: event.target.value\n ? (event.target.value as WorkspaceStatus)\n : undefined,\n })\n }\n className=\"bg-transparent text-[var(--color-text-primary)] focus:outline-none\"\n aria-label={tr('workspaces.list.filterByStatus', 'Filter by workspace status')}\n >\n <option value=\"\">{tr('workspaces.list.allStatuses', 'All statuses')}</option>\n <option value={WorkspaceStatus.ACTIVE}>\n {tr('workspaces.status.active', 'Active')}\n </option>\n <option value={WorkspaceStatus.INACTIVE}>\n {tr('workspaces.status.inactive', 'Inactive')}\n </option>\n <option value={WorkspaceStatus.ARCHIVED}>\n {tr('workspaces.status.archived', 'Archived')}\n </option>\n </select>\n </label>\n\n <button\n onClick={() => {\n void refetch();\n }}\n className=\"inline-flex min-h-11 items-center justify-center gap-2 rounded-lg border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] px-4 py-2 text-[var(--color-text-primary)] transition-all duration-200 hover:bg-[var(--color-bg-subtle)] active:scale-95\"\n aria-label={tr('workspaces.list.refresh', 'Refresh workspaces')}\n title={tr('workspaces.list.refresh', 'Refresh workspaces')}\n >\n <RefreshCw size={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n {workspaces.length > 0 ? (\n <div className=\"mt-4 flex flex-col gap-3 rounded-lg border border-[var(--color-border-default)] bg-[var(--color-bg-canvas)] p-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"flex items-center gap-2 text-sm text-[var(--color-text-primary)]\">\n <SelectionCheckbox\n checked={allVisibleSelected}\n indeterminate={partiallySelected}\n onChange={toggleAllWorkspaces}\n ariaLabel={tr('workspaces.list.selectAll', 'Select all workspaces')}\n />\n <span>{tr('common.selectAllVisible', 'Select all visible')}</span>\n </label>\n\n {selectedWorkspaceIds.size > 0 ? (\n <button\n onClick={() => setSelectedWorkspaceIds(new Set())}\n className=\"text-sm text-[var(--color-text-secondary)] transition-colors hover:text-[var(--color-text-primary)]\"\n >\n {tr('common.clearSelection', 'Clear selection')}\n </button>\n ) : null}\n </div>\n\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center\">\n <span className=\"text-sm text-[var(--color-text-secondary)]\">\n {selectedWorkspaceIds.size} {tr('common.selected', 'selected')}\n </span>\n {hasPermission(PERMISSIONS.WORKSPACE_DELETE) && (\n <button\n onClick={handleBulkDelete}\n disabled={selectedWorkspaces.length === 0 || deleteLoading}\n className=\"inline-flex min-h-11 items-center justify-center gap-2 rounded-lg border border-[var(--color-status-warning-border)] px-3 py-2 text-[var(--color-status-warning-text)] transition-all duration-200 hover:bg-[var(--color-status-warning-bgSubtle)] disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Trash2 size={16} aria-hidden=\"true\" />\n <span>{tr('workspaces.list.suspendSelected', 'Suspend Selected')}</span>\n {selectedWorkspaces.length > 0 ? (\n <span>({selectedWorkspaces.length})</span>\n ) : null}\n </button>\n )}\n </div>\n </div>\n ) : null}\n </div>\n\n {workspaces.length === 0 ? (\n <div className=\"rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-6 shadow-[var(--shadow-elevation-1)]\">\n <EmptyState\n icon={<Briefcase size={40} aria-hidden=\"true\" />}\n title={tr('workspaces.list.emptyNoneTitle', 'No workspaces found')}\n description={tr(\n 'workspaces.list.emptyNoneDescription',\n 'Create a workspace to start mapping members, organization ownership, and collaboration settings.'\n )}\n action={{\n label: tr('workspaces.create.button', 'Create Workspace'),\n onClick: () => navigate(`${basePath}/workspaces/new`),\n }}\n />\n </div>\n ) : (\n <>\n <div className=\"grid gap-4 md:hidden\">\n {workspaces.map((workspace) => (\n <article\n key={workspace.id}\n className=\"rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-4 shadow-[var(--shadow-elevation-1)]\"\n >\n <div className=\"flex items-start gap-3\">\n <SelectionCheckbox\n checked={selectedWorkspaceIds.has(workspace.id)}\n onChange={(checked) => toggleWorkspaceSelection(workspace.id, checked)}\n ariaLabel={`${tr('workspaces.list.selectOne', 'Select workspace')} ${workspace.name}`}\n />\n\n <div className=\"min-w-0 flex-1 space-y-3\">\n <div>\n <div className=\"flex flex-wrap items-start gap-2\">\n <h2 className=\"text-base font-semibold text-[var(--color-text-primary)]\">\n {workspace.name}\n </h2>\n <WorkspaceStatusBadge status={workspace.status} />\n <span className=\"inline-flex items-center rounded-md bg-[var(--color-bg-subtle)] px-2 py-1 text-xs font-medium text-[var(--color-text-secondary)]\">\n {workspace.type}\n </span>\n </div>\n <p className=\"mt-1 break-all font-mono text-sm text-[var(--color-text-muted)]\">\n /{workspace.slug}\n </p>\n </div>\n\n <dl className=\"grid grid-cols-2 gap-3 text-sm\">\n <div>\n <dt className=\"text-[var(--color-text-secondary)]\">\n {tr('workspaces.list.members', 'Members')}\n </dt>\n <dd className=\"font-medium text-[var(--color-text-primary)]\">\n {workspace.memberCount ?? 0}\n </dd>\n </div>\n <div>\n <dt className=\"text-[var(--color-text-secondary)]\">\n {tr('common.created', 'Created')}\n </dt>\n <dd className=\"font-medium text-[var(--color-text-primary)]\">\n {formatDate(workspace.createdAt)}\n </dd>\n </div>\n </dl>\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-wrap gap-2 border-t border-[var(--color-border-default)] pt-4\">\n <button\n onClick={() => navigate(`${basePath}/workspaces/${workspace.id}`)}\n className=\"inline-flex min-h-10 items-center gap-2 rounded-lg border border-[var(--color-border-default)] px-3 py-2 text-sm text-[var(--color-text-primary)] transition-all duration-200 hover:bg-[var(--color-bg-subtle)]\"\n >\n <Eye size={16} aria-hidden=\"true\" />\n {tr('common.view', 'View')}\n </button>\n {hasPermission(PERMISSIONS.WORKSPACE_UPDATE) && (\n <button\n onClick={() => navigate(`${basePath}/workspaces/${workspace.id}/edit`)}\n className=\"inline-flex min-h-10 items-center gap-2 rounded-lg border border-[var(--color-border-default)] px-3 py-2 text-sm text-[var(--color-text-primary)] transition-all duration-200 hover:bg-[var(--color-bg-subtle)]\"\n >\n <SquarePen size={16} aria-hidden=\"true\" />\n {tr('common.edit', 'Edit')}\n </button>\n )}\n {hasPermission(PERMISSIONS.WORKSPACE_DELETE) && (\n <button\n onClick={() => handleDelete(workspace.id, workspace.name)}\n disabled={deleteLoading}\n className=\"inline-flex min-h-10 items-center gap-2 rounded-lg border border-[var(--color-status-warning-border)] px-3 py-2 text-sm text-[var(--color-status-warning-text)] transition-all duration-200 hover:bg-[var(--color-status-warning-bgSubtle)] disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Trash2 size={16} aria-hidden=\"true\" />\n {tr('workspaces.suspend.confirm', 'Suspend')}\n </button>\n )}\n </div>\n </article>\n ))}\n </div>\n\n <div className=\"hidden overflow-hidden rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] shadow-[var(--shadow-elevation-1)] md:block\">\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full\">\n <thead className=\"bg-[var(--color-bg-subtle)]\">\n <tr>\n <th className=\"w-12 px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]\">\n <SelectionCheckbox\n checked={allVisibleSelected}\n indeterminate={partiallySelected}\n onChange={toggleAllWorkspaces}\n ariaLabel={tr('workspaces.list.selectAll', 'Select all workspaces')}\n />\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]\">\n {tr('workspaces.list.column.workspace', 'Workspace')}\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]\">\n {tr('common.status', 'Status')}\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]\">\n {tr('workspaces.list.column.type', 'Type')}\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]\">\n {tr('common.created', 'Created')}\n </th>\n <th className=\"px-6 py-3 text-right text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]\">\n {tr('common.actions', 'Actions')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-[var(--color-border-default)]\">\n {workspaces.map((workspace) => (\n <tr\n key={workspace.id}\n className=\"transition-colors hover:bg-[var(--color-bg-subtle)]\"\n >\n <td className=\"px-6 py-4 align-top\">\n <SelectionCheckbox\n checked={selectedWorkspaceIds.has(workspace.id)}\n onChange={(checked) => toggleWorkspaceSelection(workspace.id, checked)}\n ariaLabel={`${tr('workspaces.list.selectOne', 'Select workspace')} ${workspace.name}`}\n />\n </td>\n <td className=\"px-6 py-4\">\n <div>\n <p className=\"font-medium text-[var(--color-text-primary)]\">\n {workspace.name}\n </p>\n <p className=\"break-all font-mono text-sm text-[var(--color-text-muted)]\">\n /{workspace.slug}\n </p>\n </div>\n </td>\n <td className=\"px-6 py-4 align-top\">\n <WorkspaceStatusBadge status={workspace.status} />\n </td>\n <td className=\"px-6 py-4 align-top\">\n <span className=\"inline-flex items-center rounded-md bg-[var(--color-bg-subtle)] px-2 py-1 text-xs font-medium text-[var(--color-text-secondary)]\">\n {workspace.type}\n </span>\n </td>\n <td className=\"px-6 py-4 align-top text-sm text-[var(--color-text-secondary)]\">\n {formatDate(workspace.createdAt)}\n </td>\n <td className=\"px-6 py-4 align-top\">\n <div className=\"flex items-center justify-end gap-2\">\n <button\n onClick={() => navigate(`${basePath}/workspaces/${workspace.id}`)}\n className=\"rounded-lg p-2 text-[var(--color-text-secondary)] transition-all duration-200 hover:bg-[var(--color-bg-muted)] hover:text-[var(--color-text-primary)]\"\n title={`${tr('common.view', 'View')} ${workspace.name}`}\n aria-label={`${tr('common.view', 'View')} ${workspace.name}`}\n >\n <Eye size={18} aria-hidden=\"true\" />\n </button>\n {hasPermission(PERMISSIONS.WORKSPACE_UPDATE) && (\n <button\n onClick={() =>\n navigate(`${basePath}/workspaces/${workspace.id}/edit`)\n }\n className=\"rounded-lg p-2 text-[var(--color-text-secondary)] transition-all duration-200 hover:bg-[var(--color-bg-muted)] hover:text-[var(--color-text-primary)]\"\n title={`${tr('common.edit', 'Edit')} ${workspace.name}`}\n aria-label={`${tr('common.edit', 'Edit')} ${workspace.name}`}\n >\n <SquarePen size={18} aria-hidden=\"true\" />\n </button>\n )}\n {hasPermission(PERMISSIONS.WORKSPACE_DELETE) && (\n <button\n onClick={() => handleDelete(workspace.id, workspace.name)}\n disabled={deleteLoading}\n className=\"rounded-lg p-2 text-[var(--color-status-warning-text)] transition-all duration-200 hover:bg-[var(--color-status-warning-bgSubtle)] disabled:cursor-not-allowed disabled:opacity-50\"\n title={`${tr('workspaces.suspend.confirm', 'Suspend')} ${workspace.name}`}\n aria-label={`${tr('workspaces.suspend.confirm', 'Suspend')} ${workspace.name}`}\n >\n <Trash2 size={18} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </>\n )}\n </div>\n\n {ConfirmDialog}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { WorkspaceStatus } from '../types';
|
|
3
|
+
|
|
4
|
+
export declare const createWorkspaceSchema: z.ZodObject<{
|
|
5
|
+
status: z.ZodOptional<z.ZodNativeEnum<typeof WorkspaceStatus>>;
|
|
6
|
+
name: z.ZodString;
|
|
7
|
+
slug: z.ZodString;
|
|
8
|
+
type: z.ZodOptional<z.ZodString>;
|
|
9
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
10
|
+
tenantId: z.ZodString;
|
|
11
|
+
organizationId: z.ZodString;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
tenantId: string;
|
|
14
|
+
organizationId: string;
|
|
15
|
+
name: string;
|
|
16
|
+
slug: string;
|
|
17
|
+
type?: string | undefined;
|
|
18
|
+
status?: WorkspaceStatus | undefined;
|
|
19
|
+
metadata?: Record<string, unknown> | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
tenantId: string;
|
|
22
|
+
organizationId: string;
|
|
23
|
+
name: string;
|
|
24
|
+
slug: string;
|
|
25
|
+
type?: string | undefined;
|
|
26
|
+
status?: WorkspaceStatus | undefined;
|
|
27
|
+
metadata?: Record<string, unknown> | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
export declare const updateWorkspaceSchema: z.ZodObject<{
|
|
30
|
+
name: z.ZodOptional<z.ZodString>;
|
|
31
|
+
type: z.ZodOptional<z.ZodString>;
|
|
32
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
33
|
+
}, "strip", z.ZodTypeAny, {
|
|
34
|
+
name?: string | undefined;
|
|
35
|
+
type?: string | undefined;
|
|
36
|
+
metadata?: Record<string, unknown> | undefined;
|
|
37
|
+
}, {
|
|
38
|
+
name?: string | undefined;
|
|
39
|
+
type?: string | undefined;
|
|
40
|
+
metadata?: Record<string, unknown> | undefined;
|
|
41
|
+
}>;
|
|
42
|
+
export type CreateWorkspaceFormData = z.infer<typeof createWorkspaceSchema>;
|
|
43
|
+
export type UpdateWorkspaceFormData = z.infer<typeof updateWorkspaceSchema>;
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/organization-management/modules/workspaces/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AA6B3C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAKhC,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAIhC,CAAC;AAGH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC5E,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { WorkspaceStatus as e } from "../../../shared/types/graphql.js";
|
|
2
|
+
import { nativeEnumType as t, objectType as n, recordType as r, stringType as i, unknownType as a } from "../../../../node_modules/zod/v3/types.js";
|
|
3
|
+
//#region src/organization-management/modules/workspaces/schemas/index.ts
|
|
4
|
+
var o = {
|
|
5
|
+
name: i().min(2, "Name must be at least 2 characters").max(100, "Name must not exceed 100 characters").trim(),
|
|
6
|
+
slug: i().min(2, "Slug must be at least 2 characters").max(50, "Slug must not exceed 50 characters").regex(/^[a-z0-9-]+$/, "Slug must contain only lowercase letters, numbers, and hyphens").trim(),
|
|
7
|
+
type: i().optional(),
|
|
8
|
+
metadata: r(i(), a()).optional()
|
|
9
|
+
}, s = n({
|
|
10
|
+
tenantId: i().min(1, "Tenant is required"),
|
|
11
|
+
organizationId: i().min(1, "Organization is required"),
|
|
12
|
+
...o,
|
|
13
|
+
status: t(e).optional()
|
|
14
|
+
}), c = n({
|
|
15
|
+
name: o.name.optional(),
|
|
16
|
+
type: o.type,
|
|
17
|
+
metadata: o.metadata
|
|
18
|
+
});
|
|
19
|
+
//#endregion
|
|
20
|
+
export { s as createWorkspaceSchema, c as updateWorkspaceSchema };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/organization-management/modules/workspaces/schemas/index.ts"],"sourcesContent":["import { z } from 'zod';\nimport { WorkspaceStatus } from '../types';\n\n/**\n * Workspace Validation Schemas\n * Zod schemas for validating workspace form inputs\n *\n * Schema Changes:\n * - Removed description, iconUrl, visibility fields (not in backend schema)\n * - Added type field\n */\n\n// Base workspace schema with common fields\nconst baseWorkspaceSchema = {\n name: z\n .string()\n .min(2, 'Name must be at least 2 characters')\n .max(100, 'Name must not exceed 100 characters')\n .trim(),\n slug: z\n .string()\n .min(2, 'Slug must be at least 2 characters')\n .max(50, 'Slug must not exceed 50 characters')\n .regex(/^[a-z0-9-]+$/, 'Slug must contain only lowercase letters, numbers, and hyphens')\n .trim(),\n type: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n};\n\n// Create Workspace Schema\nexport const createWorkspaceSchema = z.object({\n tenantId: z.string().min(1, 'Tenant is required'),\n organizationId: z.string().min(1, 'Organization is required'),\n ...baseWorkspaceSchema,\n status: z.nativeEnum(WorkspaceStatus).optional(),\n});\n\n// Update Workspace Schema\nexport const updateWorkspaceSchema = z.object({\n name: baseWorkspaceSchema.name.optional(),\n type: baseWorkspaceSchema.type,\n metadata: baseWorkspaceSchema.metadata,\n});\n\n// Type exports\nexport type CreateWorkspaceFormData = z.infer<typeof createWorkspaceSchema>;\nexport type UpdateWorkspaceFormData = z.infer<typeof updateWorkspaceSchema>;\n"],"mappings":";;;AAaA,IAAM,IAAsB;CAC1B,MAAM,GACK,CACR,IAAI,GAAG,qCAAqC,CAC5C,IAAI,KAAK,sCAAsC,CAC/C,MAAM;CACT,MAAM,GACK,CACR,IAAI,GAAG,qCAAqC,CAC5C,IAAI,IAAI,qCAAqC,CAC7C,MAAM,gBAAgB,iEAAiE,CACvF,MAAM;CACT,MAAM,GAAU,CAAC,UAAU;CAC3B,UAAU,EAAS,GAAU,EAAE,GAAW,CAAC,CAAC,UAAU;CACvD,EAGY,IAAwB,EAAS;CAC5C,UAAU,GAAU,CAAC,IAAI,GAAG,qBAAqB;CACjD,gBAAgB,GAAU,CAAC,IAAI,GAAG,2BAA2B;CAC7D,GAAG;CACH,QAAQ,EAAa,EAAgB,CAAC,UAAU;CACjD,CAAC,EAGW,IAAwB,EAAS;CAC5C,MAAM,EAAoB,KAAK,UAAU;CACzC,MAAM,EAAoB;CAC1B,UAAU,EAAoB;CAC/B,CAAC"}
|