@burdenoff/microfe-organization 2026.1026.1 → 2026.1101.2
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/dist/generated/global-operations.js +57 -58
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/generated/global-types.js +1 -2
- package/dist/generated/global-types.js.map +1 -1
- package/dist/node_modules/sonner/dist/index.js +2 -3
- package/dist/node_modules/sonner/dist/index.js.map +1 -1
- package/dist/node_modules/zod/v4/classic/errors.js +44 -0
- package/dist/node_modules/zod/v4/classic/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/parse.js +7 -0
- package/dist/node_modules/zod/v4/classic/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/schemas.js +652 -0
- package/dist/node_modules/zod/v4/classic/schemas.js.map +1 -0
- package/dist/node_modules/zod/v4/core/api.js +429 -0
- package/dist/node_modules/zod/v4/core/api.js.map +1 -0
- package/dist/node_modules/zod/v4/core/checks.js +143 -0
- package/dist/node_modules/zod/v4/core/checks.js.map +1 -0
- package/dist/node_modules/zod/v4/core/core.js +84 -0
- package/dist/node_modules/zod/v4/core/core.js.map +1 -0
- package/dist/node_modules/zod/v4/core/doc.js +29 -0
- package/dist/node_modules/zod/v4/core/doc.js.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.js +90 -0
- package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.js +285 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +1 -0
- package/dist/node_modules/zod/v4/core/memoizer.js +188 -0
- package/dist/node_modules/zod/v4/core/memoizer.js.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.js +159 -0
- package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/core/regexes.js +34 -0
- package/dist/node_modules/zod/v4/core/regexes.js.map +1 -0
- package/dist/node_modules/zod/v4/core/registries.js +41 -0
- package/dist/node_modules/zod/v4/core/registries.js.map +1 -0
- package/dist/node_modules/zod/v4/core/schemas.js +979 -0
- package/dist/node_modules/zod/v4/core/schemas.js.map +1 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.js +330 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.js.map +1 -0
- package/dist/node_modules/zod/v4/core/util.js +417 -0
- package/dist/node_modules/zod/v4/core/util.js.map +1 -0
- package/dist/node_modules/zod/v4/core/versions.js +9 -0
- package/dist/node_modules/zod/v4/core/versions.js.map +1 -0
- package/dist/node_modules/zod/v4/locales/en.js +96 -0
- package/dist/node_modules/zod/v4/locales/en.js.map +1 -0
- package/dist/organization-management/AdminOrganizationRoot.js +13 -10
- package/dist/organization-management/AdminOrganizationRoot.js.map +1 -1
- package/dist/organization-management/AdminOrganizationRoutes.js +8 -9
- package/dist/organization-management/AdminOrganizationRoutes.js.map +1 -1
- package/dist/organization-management/UserOrganizationRoot.js +13 -10
- package/dist/organization-management/UserOrganizationRoot.js.map +1 -1
- package/dist/organization-management/UserOrganizationRoutes.js +1 -2
- package/dist/organization-management/UserOrganizationRoutes.js.map +1 -1
- package/dist/organization-management/constants/permissions.js +1 -2
- package/dist/organization-management/constants/permissions.js.map +1 -1
- package/dist/organization-management/hooks/useOrganizationEventEmitter.js +1 -2
- package/dist/organization-management/hooks/useOrganizationEventEmitter.js.map +1 -1
- package/dist/organization-management/hooks/useOrganizationPageView.js +1 -2
- package/dist/organization-management/hooks/useOrganizationPageView.js.map +1 -1
- package/dist/organization-management/modules/members/components/BulkInviteForm.js +3 -3
- package/dist/organization-management/modules/members/components/BulkInviteForm.js.map +1 -1
- package/dist/organization-management/modules/members/components/InviteMemberForm.js +1 -2
- package/dist/organization-management/modules/members/components/InviteMemberForm.js.map +1 -1
- package/dist/organization-management/modules/members/components/InviteStatusBadge.js +1 -2
- package/dist/organization-management/modules/members/components/InviteStatusBadge.js.map +1 -1
- package/dist/organization-management/modules/members/components/MemberRoleBadge.js +1 -2
- package/dist/organization-management/modules/members/components/MemberRoleBadge.js.map +1 -1
- package/dist/organization-management/modules/members/components/MyInviteCard.js +5 -6
- package/dist/organization-management/modules/members/components/MyInviteCard.js.map +1 -1
- package/dist/organization-management/modules/members/components/PendingInvitesList.js +8 -9
- package/dist/organization-management/modules/members/components/PendingInvitesList.js.map +1 -1
- package/dist/organization-management/modules/members/hooks/useInvites.js +2 -3
- package/dist/organization-management/modules/members/hooks/useInvites.js.map +1 -1
- package/dist/organization-management/modules/members/hooks/useMembers.js +1 -2
- package/dist/organization-management/modules/members/hooks/useMembers.js.map +1 -1
- package/dist/organization-management/modules/members/hooks/useWorkspaceInvites.js +1 -2
- package/dist/organization-management/modules/members/hooks/useWorkspaceInvites.js.map +1 -1
- package/dist/organization-management/modules/members/pages/InviteMemberPage.js +16 -17
- package/dist/organization-management/modules/members/pages/InviteMemberPage.js.map +1 -1
- package/dist/organization-management/modules/members/pages/InvitePeoplePage.js +14 -15
- package/dist/organization-management/modules/members/pages/InvitePeoplePage.js.map +1 -1
- package/dist/organization-management/modules/members/pages/MemberDetailPage.js +18 -19
- package/dist/organization-management/modules/members/pages/MemberDetailPage.js.map +1 -1
- package/dist/organization-management/modules/members/pages/MembersListPage.js +142 -143
- package/dist/organization-management/modules/members/pages/MembersListPage.js.map +1 -1
- package/dist/organization-management/modules/members/pages/MyInvitesPage.js +168 -169
- package/dist/organization-management/modules/members/pages/MyInvitesPage.js.map +1 -1
- package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js +13 -14
- package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js.map +1 -1
- package/dist/organization-management/modules/members/utils/bulkInviteCsv.js +4 -10
- package/dist/organization-management/modules/members/utils/bulkInviteCsv.js.map +1 -1
- package/dist/organization-management/modules/members/utils/workspaceInvitationDisplay.js +1 -2
- package/dist/organization-management/modules/members/utils/workspaceInvitationDisplay.js.map +1 -1
- package/dist/organization-management/modules/organizations/components/OrganizationForm.js +14 -15
- package/dist/organization-management/modules/organizations/components/OrganizationForm.js.map +1 -1
- package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.js +1 -2
- package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.js.map +1 -1
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.js +2 -3
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.js.map +1 -1
- package/dist/organization-management/modules/organizations/hooks/useOrgsWithPermission.js +22 -21
- package/dist/organization-management/modules/organizations/hooks/useOrgsWithPermission.js.map +1 -1
- package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js +18 -19
- package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js.map +1 -1
- package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js +29 -30
- package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js.map +1 -1
- package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js +14 -15
- package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js.map +1 -1
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js +33 -34
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js.map +1 -1
- package/dist/organization-management/modules/organizations/schemas/index.js +11 -12
- package/dist/organization-management/modules/organizations/schemas/index.js.map +1 -1
- package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.js +16 -24
- package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.js.map +1 -1
- package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js +5 -6
- package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js.map +1 -1
- package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js +31 -32
- package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js.map +1 -1
- package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.js +1 -2
- package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.js.map +1 -1
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.js +1 -2
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.js.map +1 -1
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.js +11 -12
- package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.js.map +1 -1
- package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js +18 -19
- package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js.map +1 -1
- package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js +43 -44
- package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js.map +1 -1
- package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js +19 -20
- package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js.map +1 -1
- package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js +240 -241
- package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js.map +1 -1
- package/dist/organization-management/modules/workspaces/schemas/index.js +6 -7
- package/dist/organization-management/modules/workspaces/schemas/index.js.map +1 -1
- package/dist/organization-management/providers/OrgConsoleProvider.js +1 -2
- package/dist/organization-management/providers/OrgConsoleProvider.js.map +1 -1
- package/dist/organization-management/providers/OrgScopedPermissions.js +1 -2
- package/dist/organization-management/providers/OrgScopedPermissions.js.map +1 -1
- package/dist/organization-management/shared/components/dialog/ConfirmDialog.js +1 -2
- package/dist/organization-management/shared/components/dialog/ConfirmDialog.js.map +1 -1
- package/dist/organization-management/shared/components/dialog/ConfirmDialogView.js +1 -2
- package/dist/organization-management/shared/components/dialog/ConfirmDialogView.js.map +1 -1
- package/dist/organization-management/shared/components/feedback/ErrorState.js +1 -2
- package/dist/organization-management/shared/components/feedback/ErrorState.js.map +1 -1
- package/dist/organization-management/shared/components/feedback/LoadingState.js +1 -2
- package/dist/organization-management/shared/components/feedback/LoadingState.js.map +1 -1
- package/dist/organization-management/shared/components/input/SearchInput.js +1 -2
- package/dist/organization-management/shared/components/input/SearchInput.js.map +1 -1
- package/dist/organization-management/shared/components/input/SelectionCheckbox.js +1 -2
- package/dist/organization-management/shared/components/input/SelectionCheckbox.js.map +1 -1
- package/dist/organization-management/shared/hooks/useDebouncedValue.js +1 -2
- package/dist/organization-management/shared/hooks/useDebouncedValue.js.map +1 -1
- package/dist/organization-management/shared/hooks/useTr.js +1 -2
- package/dist/organization-management/shared/hooks/useTr.js.map +1 -1
- package/dist/organization-management/shared/logger.js +1 -2
- package/dist/organization-management/shared/logger.js.map +1 -1
- package/dist/organization-management/shared/recaptcha.js +1 -2
- package/dist/organization-management/shared/recaptcha.js.map +1 -1
- package/dist/organization-management/shared/types/graphql.js +1 -2
- package/dist/organization-management/shared/types/graphql.js.map +1 -1
- package/dist/utils/nativeBridge.js +1 -2
- package/package.json +8 -6
- package/dist/node_modules/zod/v3/ZodError.js +0 -82
- package/dist/node_modules/zod/v3/ZodError.js.map +0 -1
- package/dist/node_modules/zod/v3/errors.js +0 -10
- package/dist/node_modules/zod/v3/errors.js.map +0 -1
- package/dist/node_modules/zod/v3/helpers/errorUtil.js +0 -9
- package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +0 -1
- package/dist/node_modules/zod/v3/helpers/parseUtil.js +0 -93
- package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +0 -1
- package/dist/node_modules/zod/v3/helpers/util.js +0 -76
- package/dist/node_modules/zod/v3/helpers/util.js.map +0 -1
- package/dist/node_modules/zod/v3/locales/en.js +0 -62
- package/dist/node_modules/zod/v3/locales/en.js.map +0 -1
- package/dist/node_modules/zod/v3/types.js +0 -2441
- package/dist/node_modules/zod/v3/types.js.map +0 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { useOrgConsole as e } from "../../../providers/OrgConsoleProvider.js";
|
|
2
2
|
import { useOrganization as t } from "../hooks/useOrganizations.js";
|
|
3
3
|
import { OrganizationStatusBadge as n } from "../components/OrganizationStatusBadge.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
4
|
+
import { LoadingState as r } from "../../../shared/components/feedback/LoadingState.js";
|
|
5
|
+
import { ErrorState as i } from "../../../shared/components/feedback/ErrorState.js";
|
|
6
|
+
import { useWorkspacesByOrganization as a } from "../../workspaces/hooks/useWorkspaces.js";
|
|
7
|
+
import { WorkspaceCard as o } from "../../workspaces/components/WorkspaceCard.js";
|
|
8
|
+
import { PERMISSIONS as s } from "../../../constants/permissions.js";
|
|
9
|
+
import { useTr as c } from "../../../shared/hooks/useTr.js";
|
|
10
|
+
import { useOrganizationPageView as l } from "../../../hooks/useOrganizationPageView.js";
|
|
11
11
|
import { useMemo as u, useState as d } from "react";
|
|
12
12
|
import { ArrowLeft as f, Briefcase as p, Building as m, Edit as h, UserPlus as g, Users as _ } from "lucide-react";
|
|
13
13
|
import { CTAOverflowMenu as v, EmphasisPanel as y, GlassCard as b, IllustratedEmptyState as x, NextSteps as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
|
|
14
14
|
import { usePermissions as w } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
15
15
|
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
16
16
|
import { useParams as D } from "react-router";
|
|
17
|
-
|
|
17
|
+
// src/organization-management/modules/organizations/pages/OrganizationDetailPage.tsx
|
|
18
18
|
function O(e) {
|
|
19
19
|
return new Date(e).toLocaleDateString("en-US", {
|
|
20
20
|
year: "numeric",
|
|
@@ -25,9 +25,9 @@ function O(e) {
|
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
function k() {
|
|
28
|
-
let k =
|
|
29
|
-
|
|
30
|
-
let { navigate: j, basePath: M = "/organizations" } = e(), { hasPermission: N, isLoading: P } = w(), { organization: F, loading: I, error: L } = t(A ?? ""), [R, z] = d("overview"), { workspaces: B, loading: V, error: H, refetch: U } =
|
|
28
|
+
let k = c(), { id: A } = D();
|
|
29
|
+
l("organizations.detail", { organizationId: A });
|
|
30
|
+
let { navigate: j, basePath: M = "/organizations" } = e(), { hasPermission: N, isLoading: P } = w(), { organization: F, loading: I, error: L } = t(A ?? ""), [R, z] = d("overview"), { workspaces: B, loading: V, error: H, refetch: U } = a(R === "workspaces" && A ? A ?? "" : "", 50, 0), W = u(() => [{
|
|
31
31
|
id: "overview",
|
|
32
32
|
label: k("organizations.detail.tab.overview", "Overview")
|
|
33
33
|
}, {
|
|
@@ -41,13 +41,13 @@ function k() {
|
|
|
41
41
|
]);
|
|
42
42
|
return P ? /* @__PURE__ */ T("div", {
|
|
43
43
|
className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
|
|
44
|
-
children: /* @__PURE__ */ T(
|
|
45
|
-
}) : N(
|
|
44
|
+
children: /* @__PURE__ */ T(r, { message: k("common.loadingPermissions", "Loading permissions...") })
|
|
45
|
+
}) : N(s.ORG_READ) ? I ? /* @__PURE__ */ T("div", {
|
|
46
46
|
className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6",
|
|
47
|
-
children: /* @__PURE__ */ T(
|
|
47
|
+
children: /* @__PURE__ */ T(r, { message: k("organizations.detail.loading", "Loading organization details...") })
|
|
48
48
|
}) : L || !F ? /* @__PURE__ */ T("div", {
|
|
49
49
|
className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6",
|
|
50
|
-
children: /* @__PURE__ */ T(
|
|
50
|
+
children: /* @__PURE__ */ T(i, {
|
|
51
51
|
message: L?.message || k("organizations.detail.notFound", "Organization not found"),
|
|
52
52
|
action: {
|
|
53
53
|
label: k("organizations.create.back", "Back to Organizations"),
|
|
@@ -107,7 +107,7 @@ function k() {
|
|
|
107
107
|
]
|
|
108
108
|
})]
|
|
109
109
|
}), /* @__PURE__ */ T(v, {
|
|
110
|
-
primary: N(
|
|
110
|
+
primary: N(s.ORG_UPDATE) ? {
|
|
111
111
|
label: k("organizations.edit.title", "Edit Organization"),
|
|
112
112
|
icon: /* @__PURE__ */ T(h, {
|
|
113
113
|
size: 16,
|
|
@@ -115,14 +115,14 @@ function k() {
|
|
|
115
115
|
}),
|
|
116
116
|
onSelect: () => j(`${M}/${A}/edit`)
|
|
117
117
|
} : void 0,
|
|
118
|
-
actions: [...N(
|
|
119
|
-
label: N(
|
|
118
|
+
actions: [...N(s.MEMBER_LIST) ? [{
|
|
119
|
+
label: N(s.MEMBER_INVITE) ? k("organizations.detail.manageMembers", "Manage Members") : k("organizations.detail.viewMembers", "View Members"),
|
|
120
120
|
icon: /* @__PURE__ */ T(_, {
|
|
121
121
|
size: 16,
|
|
122
122
|
"aria-hidden": "true"
|
|
123
123
|
}),
|
|
124
124
|
onSelect: () => j(`${M}/${A}/members`)
|
|
125
|
-
}] : [], ...N(
|
|
125
|
+
}] : [], ...N(s.MEMBER_INVITE) ? [{
|
|
126
126
|
label: k("members.invite.button", "Invite Member"),
|
|
127
127
|
icon: /* @__PURE__ */ T(g, {
|
|
128
128
|
size: 16,
|
|
@@ -136,7 +136,7 @@ function k() {
|
|
|
136
136
|
/* @__PURE__ */ T(S, {
|
|
137
137
|
storageKey: "organization-org-detail",
|
|
138
138
|
steps: [
|
|
139
|
-
...N(
|
|
139
|
+
...N(s.MEMBER_INVITE) ? [{
|
|
140
140
|
id: "invite",
|
|
141
141
|
label: k("organizations.detail.next.invite", "Invite a member"),
|
|
142
142
|
description: k("organizations.detail.next.inviteDesc", "Bring people into this organization so they can access its workspaces."),
|
|
@@ -146,7 +146,7 @@ function k() {
|
|
|
146
146
|
}),
|
|
147
147
|
onClick: () => j(`${M}/${A}/members/invite`)
|
|
148
148
|
}] : [],
|
|
149
|
-
...N(
|
|
149
|
+
...N(s.WORKSPACE_CREATE) ? [{
|
|
150
150
|
id: "workspace",
|
|
151
151
|
label: k("organizations.detail.next.workspace", "Create a workspace"),
|
|
152
152
|
description: k("organizations.detail.next.workspaceDesc", "Give a team or project its own space to collaborate in."),
|
|
@@ -156,7 +156,7 @@ function k() {
|
|
|
156
156
|
}),
|
|
157
157
|
onClick: () => j(`${M}/workspaces/new?organizationId=${A}`)
|
|
158
158
|
}] : [],
|
|
159
|
-
...N(
|
|
159
|
+
...N(s.MEMBER_LIST) ? [{
|
|
160
160
|
id: "members",
|
|
161
161
|
label: k("organizations.detail.next.members", "Review members"),
|
|
162
162
|
description: k("organizations.detail.next.membersDesc", "See who belongs to this organization and manage their roles."),
|
|
@@ -166,7 +166,7 @@ function k() {
|
|
|
166
166
|
}),
|
|
167
167
|
onClick: () => j(`${M}/${A}/members`)
|
|
168
168
|
}] : [],
|
|
169
|
-
...N(
|
|
169
|
+
...N(s.ORG_UPDATE) ? [{
|
|
170
170
|
id: "edit",
|
|
171
171
|
label: k("organizations.detail.next.edit", "Edit organization profile"),
|
|
172
172
|
description: k("organizations.detail.next.editDesc", "Update the name, slug, website, or description."),
|
|
@@ -308,7 +308,7 @@ function k() {
|
|
|
308
308
|
}), /* @__PURE__ */ T("p", {
|
|
309
309
|
className: "text-sm text-[var(--color-text-secondary)]",
|
|
310
310
|
children: k("organizations.detail.workspacesSubtitle", "Create and manage workspaces for this organization.")
|
|
311
|
-
})] }), N(
|
|
311
|
+
})] }), N(s.WORKSPACE_CREATE) && /* @__PURE__ */ E("button", {
|
|
312
312
|
type: "button",
|
|
313
313
|
onClick: () => j(`${M}/workspaces/new?organizationId=${A}`),
|
|
314
314
|
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",
|
|
@@ -319,8 +319,8 @@ function k() {
|
|
|
319
319
|
})]
|
|
320
320
|
}), V ? /* @__PURE__ */ T("div", {
|
|
321
321
|
className: "py-8",
|
|
322
|
-
children: /* @__PURE__ */ T(
|
|
323
|
-
}) : H ? /* @__PURE__ */ T(
|
|
322
|
+
children: /* @__PURE__ */ T(r, { message: k("workspaces.list.loading", "Loading workspaces...") })
|
|
323
|
+
}) : H ? /* @__PURE__ */ T(i, {
|
|
324
324
|
message: H.message,
|
|
325
325
|
action: {
|
|
326
326
|
label: k("common.retry", "Retry"),
|
|
@@ -330,7 +330,7 @@ function k() {
|
|
|
330
330
|
}
|
|
331
331
|
}) : B.length > 0 ? /* @__PURE__ */ T("div", {
|
|
332
332
|
className: "grid grid-cols-1 gap-4 xl:grid-cols-2",
|
|
333
|
-
children: B.map((e) => /* @__PURE__ */ T(
|
|
333
|
+
children: B.map((e) => /* @__PURE__ */ T(o, {
|
|
334
334
|
workspace: e,
|
|
335
335
|
showActions: !1,
|
|
336
336
|
onClick: (e) => {
|
|
@@ -342,8 +342,8 @@ function k() {
|
|
|
342
342
|
children: /* @__PURE__ */ T(x, {
|
|
343
343
|
illustration: "empty-data",
|
|
344
344
|
title: k("workspaces.list.emptyTitle", "No workspaces yet"),
|
|
345
|
-
description: N(
|
|
346
|
-
action: N(
|
|
345
|
+
description: N(s.WORKSPACE_CREATE) ? k("workspaces.list.emptyDescription", "Create a workspace when this organization is ready to collaborate with teams or projects.") : k("workspaces.list.emptyDescriptionViewer", "No workspaces have been created in this organization yet."),
|
|
346
|
+
action: N(s.WORKSPACE_CREATE) ? /* @__PURE__ */ T("button", {
|
|
347
347
|
type: "button",
|
|
348
348
|
onClick: () => j(`${M}/workspaces/new?organizationId=${A}`),
|
|
349
349
|
className: "inline-flex min-h-11 items-center justify-center gap-2 rounded-lg bg-[var(--color-action-primary-bg)] px-4 py-2 font-medium text-[var(--color-action-primary-text)] transition-all duration-200 hover:bg-[var(--color-action-primary-bgHover)]",
|
|
@@ -364,7 +364,6 @@ function k() {
|
|
|
364
364
|
})
|
|
365
365
|
});
|
|
366
366
|
}
|
|
367
|
-
//#endregion
|
|
368
367
|
export { k as OrganizationDetailPage };
|
|
369
368
|
|
|
370
369
|
//# sourceMappingURL=OrganizationDetailPage.js.map
|
package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrganizationDetailPage.js","names":[],"sources":["../../../../../src/organization-management/modules/organizations/pages/OrganizationDetailPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { ArrowLeft, Briefcase, Building, Edit, UserPlus, Users } from 'lucide-react';\nimport {\n CTAOverflowMenu,\n EmphasisPanel,\n GlassCard,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useOrganization } from '../hooks/useOrganizations';\nimport { OrganizationStatusBadge } from '../components/OrganizationStatusBadge';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { useWorkspacesByOrganization } from '../../workspaces/hooks/useWorkspaces';\nimport { WorkspaceCard } from '../../workspaces/components/WorkspaceCard';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\nimport { useOrganizationPageView } from '../../../hooks/useOrganizationPageView';\n\ntype ActiveTab = 'overview' | 'workspaces';\n\nfunction formatDate(dateString: string) {\n return new Date(dateString).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function OrganizationDetailPage() {\n const tr = useTr();\n const { id } = useParams<{ id: string }>();\n useOrganizationPageView('organizations.detail', { organizationId: id });\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const { organization, loading, error } = useOrganization(id ?? '');\n const [activeTab, setActiveTab] = useState<ActiveTab>('overview');\n\n const shouldFetchWorkspaces = activeTab === 'workspaces' && Boolean(id);\n const {\n workspaces,\n loading: workspacesLoading,\n error: workspacesError,\n refetch: refetchWorkspaces,\n } = useWorkspacesByOrganization(shouldFetchWorkspaces ? (id ?? '') : '', 50, 0);\n\n const tabItems = useMemo(\n () => [\n { id: 'overview' as const, label: tr('organizations.detail.tab.overview', 'Overview') },\n {\n id: 'workspaces' as const,\n label: `${tr('organizations.detail.tab.workspaces', 'Workspaces')} (${activeTab === 'workspaces' ? workspaces.length : (organization?.workspaceCount ?? 0)})`,\n },\n ],\n [activeTab, organization?.workspaceCount, tr, workspaces.length]\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.ORG_READ)) {\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(\n 'organizations.detail.noPermission',\n \"You don't have permission to view this organization.\"\n )}\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\n message={tr('organizations.detail.loading', 'Loading organization details...')}\n />\n </div>\n );\n }\n\n if (error || !organization) {\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 || tr('organizations.detail.notFound', 'Organization not found')}\n action={{\n label: tr('organizations.create.back', 'Back to Organizations'),\n onClick: () => navigate(basePath),\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-200\">\n <div className=\"mx-auto flex w-full max-w-7xl flex-col gap-6\">\n <div className=\"space-y-4\">\n <button\n type=\"button\"\n onClick={() => navigate(basePath)}\n className=\"inline-flex min-h-10 items-center gap-2 text-[var(--color-text-secondary)] transition-all duration-200 hover:text-[var(--color-text-primary)]\"\n >\n <ArrowLeft size={20} aria-hidden=\"true\" />\n <span className=\"text-sm font-medium\">\n {tr('organizations.create.back', 'Back to Organizations')}\n </span>\n </button>\n\n <EmphasisPanel className=\"flex flex-col gap-4 p-5 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"flex min-w-0 items-start gap-4\">\n <div className=\"flex size-16 items-center justify-center rounded-xl bg-[var(--color-status-info-bgSubtle)] text-[var(--color-status-info-text)]\">\n <Building size={28} aria-hidden=\"true\" />\n </div>\n\n <div className=\"min-w-0 space-y-2\">\n <div className=\"flex flex-wrap items-start gap-3\">\n <h1 className=\"text-3xl font-bold text-[var(--color-text-primary)]\">\n {organization.name}\n </h1>\n <OrganizationStatusBadge status={organization.status} />\n </div>\n <p className=\"break-all font-mono text-sm text-[var(--color-text-secondary)]\">\n /{organization.slug}\n </p>\n {organization.description ? (\n <p className=\"max-w-2xl text-sm text-[var(--color-text-secondary)]\">\n {organization.description}\n </p>\n ) : null}\n <PagePurpose className=\"max-w-2xl\">\n {tr(\n 'organizations.detail.purpose',\n 'This is the home for one organization — review its profile and metadata here, jump into the Workspaces tab to see where teams collaborate, or manage who belongs. Use this page to keep an organization healthy and growing.'\n )}\n </PagePurpose>\n </div>\n </div>\n\n <CTAOverflowMenu\n primary={\n hasPermission(PERMISSIONS.ORG_UPDATE)\n ? {\n label: tr('organizations.edit.title', 'Edit Organization'),\n icon: <Edit size={16} aria-hidden=\"true\" />,\n onSelect: () => navigate(`${basePath}/${id}/edit`),\n }\n : undefined\n }\n actions={[\n ...(hasPermission(PERMISSIONS.MEMBER_LIST)\n ? [\n {\n label: hasPermission(PERMISSIONS.MEMBER_INVITE)\n ? tr('organizations.detail.manageMembers', 'Manage Members')\n : tr('organizations.detail.viewMembers', 'View Members'),\n icon: <Users size={16} aria-hidden=\"true\" />,\n onSelect: () => navigate(`${basePath}/${id}/members`),\n },\n ]\n : []),\n ...(hasPermission(PERMISSIONS.MEMBER_INVITE)\n ? [\n {\n label: tr('members.invite.button', 'Invite Member'),\n icon: <UserPlus size={16} aria-hidden=\"true\" />,\n onSelect: () => navigate(`${basePath}/${id}/members/invite`),\n },\n ]\n : []),\n ]}\n />\n </EmphasisPanel>\n </div>\n\n <NextSteps\n storageKey=\"organization-org-detail\"\n steps={[\n ...(hasPermission(PERMISSIONS.MEMBER_INVITE)\n ? [\n {\n id: 'invite',\n label: tr('organizations.detail.next.invite', 'Invite a member'),\n description: tr(\n 'organizations.detail.next.inviteDesc',\n 'Bring people into this organization so they can access its workspaces.'\n ),\n icon: <UserPlus size={16} aria-hidden=\"true\" />,\n onClick: () => navigate(`${basePath}/${id}/members/invite`),\n },\n ]\n : []),\n ...(hasPermission(PERMISSIONS.WORKSPACE_CREATE)\n ? [\n {\n id: 'workspace',\n label: tr('organizations.detail.next.workspace', 'Create a workspace'),\n description: tr(\n 'organizations.detail.next.workspaceDesc',\n 'Give a team or project its own space to collaborate in.'\n ),\n icon: <Briefcase size={16} aria-hidden=\"true\" />,\n onClick: () => navigate(`${basePath}/workspaces/new?organizationId=${id}`),\n },\n ]\n : []),\n ...(hasPermission(PERMISSIONS.MEMBER_LIST)\n ? [\n {\n id: 'members',\n label: tr('organizations.detail.next.members', 'Review members'),\n description: tr(\n 'organizations.detail.next.membersDesc',\n 'See who belongs to this organization and manage their roles.'\n ),\n icon: <Users size={16} aria-hidden=\"true\" />,\n onClick: () => navigate(`${basePath}/${id}/members`),\n },\n ]\n : []),\n ...(hasPermission(PERMISSIONS.ORG_UPDATE)\n ? [\n {\n id: 'edit',\n label: tr('organizations.detail.next.edit', 'Edit organization profile'),\n description: tr(\n 'organizations.detail.next.editDesc',\n 'Update the name, slug, website, or description.'\n ),\n icon: <Edit size={16} aria-hidden=\"true\" />,\n onClick: () => navigate(`${basePath}/${id}/edit`),\n },\n ]\n : []),\n ]}\n />\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-0\">\n <div className=\"overflow-x-auto border-b border-[var(--color-border-seam)]\">\n <div className=\"flex min-w-max gap-2 px-4 pt-4 sm:px-6\">\n {tabItems.map((tabItem) => {\n const isActive = activeTab === tabItem.id;\n return (\n <button\n type=\"button\"\n key={tabItem.id}\n onClick={() => setActiveTab(tabItem.id)}\n className={`inline-flex min-h-11 items-center rounded-t-lg border-b-2 px-4 py-3 text-sm font-medium transition-colors ${\n isActive\n ? 'border-[var(--color-action-primary-bg)] text-[var(--color-action-primary-bg)]'\n : 'border-transparent text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]'\n }`}\n aria-pressed={isActive}\n >\n {tabItem.label}\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {activeTab === 'overview' ? (\n <div className=\"grid grid-cols-1 gap-6 xl:grid-cols-[minmax(0,1fr)_320px]\">\n <GlassCard\n treatment=\"plain\"\n className=\"border-border-seam bg-[var(--color-bg-canvas)] p-5\"\n >\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)]\">\n {tr('organizations.detail.detailsSection', 'Organization details')}\n </h2>\n\n <dl className=\"mt-5 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.name', 'Name')}\n </dt>\n <dd className=\"mt-1 text-sm text-[var(--color-text-primary)]\">\n {organization.name}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.slug', 'Slug')}\n </dt>\n <dd className=\"mt-1 break-all font-mono text-sm text-[var(--color-text-primary)]\">\n {organization.slug}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.status', 'Status')}\n </dt>\n <dd className=\"mt-1\">\n <OrganizationStatusBadge status={organization.status} />\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('organizations.detail.workspaceCount', 'Workspace count')}\n </dt>\n <dd className=\"mt-1 text-sm text-[var(--color-text-primary)]\">\n {organization.workspaceCount ?? 0}\n </dd>\n </div>\n {organization.website ? (\n <div className=\"sm:col-span-2\">\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('organizations.detail.website', 'Website')}\n </dt>\n <dd className=\"mt-1 break-all text-sm\">\n <a\n href={organization.website}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-[var(--color-action-primary-bg)] underline-offset-2 hover:underline\"\n >\n {organization.website}\n </a>\n </dd>\n </div>\n ) : null}\n {organization.description ? (\n <div className=\"sm:col-span-2\">\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.description', 'Description')}\n </dt>\n <dd className=\"mt-1 text-sm leading-6 text-[var(--color-text-primary)]\">\n {organization.description}\n </dd>\n </div>\n ) : null}\n </dl>\n </GlassCard>\n\n <GlassCard\n treatment=\"plain\"\n className=\"border-border-seam bg-[var(--color-bg-canvas)] p-5 xl:sticky xl:top-6 xl:self-start\"\n >\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)]\">\n {tr('common.metadata', 'Metadata')}\n </h2>\n\n <dl className=\"mt-5 space-y-4\">\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.created', 'Created')}\n </dt>\n <dd className=\"mt-1 text-sm text-[var(--color-text-primary)]\">\n {formatDate(organization.createdAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.lastUpdated', 'Last updated')}\n </dt>\n <dd className=\"mt-1 text-sm text-[var(--color-text-primary)]\">\n {formatDate(organization.updatedAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('organizations.detail.tenantId', 'Tenant ID')}\n </dt>\n <dd className=\"mt-1 break-all font-mono text-sm text-[var(--color-text-primary)]\">\n {organization.tenantId}\n </dd>\n </div>\n </dl>\n </GlassCard>\n </div>\n ) : (\n <section className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)]\">\n {tr('organizations.detail.workspacesTitle', 'Organization workspaces')}\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)]\">\n {tr(\n 'organizations.detail.workspacesSubtitle',\n 'Create and manage workspaces for this organization.'\n )}\n </p>\n </div>\n\n {hasPermission(PERMISSIONS.WORKSPACE_CREATE) && (\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/workspaces/new?organizationId=${id}`)}\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\"\n >\n <Briefcase size={16} aria-hidden=\"true\" />\n <span>{tr('workspaces.create.button', 'Create Workspace')}</span>\n </button>\n )}\n </div>\n\n {workspacesLoading ? (\n <div className=\"py-8\">\n <LoadingState\n message={tr('workspaces.list.loading', 'Loading workspaces...')}\n />\n </div>\n ) : workspacesError ? (\n <ErrorState\n message={workspacesError.message}\n action={{\n label: tr('common.retry', 'Retry'),\n onClick: () => {\n void refetchWorkspaces();\n },\n }}\n />\n ) : workspaces.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-4 xl:grid-cols-2\">\n {workspaces.map((workspace) => (\n <WorkspaceCard\n key={workspace.id}\n workspace={workspace}\n showActions={false}\n onClick={(selectedWorkspace) => {\n navigate(`${basePath}/workspaces/${selectedWorkspace.id}`);\n }}\n />\n ))}\n </div>\n ) : (\n <div className=\"rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-canvas)] p-6\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tr('workspaces.list.emptyTitle', 'No workspaces yet')}\n description={\n hasPermission(PERMISSIONS.WORKSPACE_CREATE)\n ? tr(\n 'workspaces.list.emptyDescription',\n 'Create a workspace when this organization is ready to collaborate with teams or projects.'\n )\n : tr(\n 'workspaces.list.emptyDescriptionViewer',\n 'No workspaces have been created in this organization yet.'\n )\n }\n action={\n hasPermission(PERMISSIONS.WORKSPACE_CREATE) ? (\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/workspaces/new?organizationId=${id}`)\n }\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 font-medium text-[var(--color-action-primary-text)] transition-all duration-200 hover:bg-[var(--color-action-primary-bgHover)]\"\n >\n {tr('workspaces.create.button', 'Create Workspace')}\n </button>\n ) : undefined\n }\n />\n </div>\n )}\n </section>\n )}\n </div>\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OrganizationDetailPage.js","names":["formatDate","dateString","OrganizationDetailPage","tr","useTr","useParams","id","useOrgConsole","permissionsLoading","usePermissions","useOrganization","activeTab","setActiveTab","useState","workspacesLoading","workspacesError","refetchWorkspaces","useWorkspacesByOrganization","tabItems","useMemo","workspaces","organization","LoadingState","hasPermission","PERMISSIONS","loading","error","ErrorState","navigate","basePath","ArrowLeft","EmphasisPanel","Building","OrganizationStatusBadge","PagePurpose","CTAOverflowMenu","Edit","Users","UserPlus","NextSteps","Briefcase","GlassCard","isActive","tabItem","WorkspaceCard","selectedWorkspace","workspace","IllustratedEmptyState"],"sources":["../../../../../src/organization-management/modules/organizations/pages/OrganizationDetailPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { ArrowLeft, Briefcase, Building, Edit, UserPlus, Users } from 'lucide-react';\nimport {\n CTAOverflowMenu,\n EmphasisPanel,\n GlassCard,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useOrganization } from '../hooks/useOrganizations';\nimport { OrganizationStatusBadge } from '../components/OrganizationStatusBadge';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { useWorkspacesByOrganization } from '../../workspaces/hooks/useWorkspaces';\nimport { WorkspaceCard } from '../../workspaces/components/WorkspaceCard';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\nimport { useOrganizationPageView } from '../../../hooks/useOrganizationPageView';\n\ntype ActiveTab = 'overview' | 'workspaces';\n\nfunction formatDate(dateString: string) {\n return new Date(dateString).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function OrganizationDetailPage() {\n const tr = useTr();\n const { id } = useParams<{ id: string }>();\n useOrganizationPageView('organizations.detail', { organizationId: id });\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const { organization, loading, error } = useOrganization(id ?? '');\n const [activeTab, setActiveTab] = useState<ActiveTab>('overview');\n\n const shouldFetchWorkspaces = activeTab === 'workspaces' && Boolean(id);\n const {\n workspaces,\n loading: workspacesLoading,\n error: workspacesError,\n refetch: refetchWorkspaces,\n } = useWorkspacesByOrganization(shouldFetchWorkspaces ? (id ?? '') : '', 50, 0);\n\n const tabItems = useMemo(\n () => [\n { id: 'overview' as const, label: tr('organizations.detail.tab.overview', 'Overview') },\n {\n id: 'workspaces' as const,\n label: `${tr('organizations.detail.tab.workspaces', 'Workspaces')} (${activeTab === 'workspaces' ? workspaces.length : (organization?.workspaceCount ?? 0)})`,\n },\n ],\n [activeTab, organization?.workspaceCount, tr, workspaces.length]\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.ORG_READ)) {\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(\n 'organizations.detail.noPermission',\n \"You don't have permission to view this organization.\"\n )}\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\n message={tr('organizations.detail.loading', 'Loading organization details...')}\n />\n </div>\n );\n }\n\n if (error || !organization) {\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 || tr('organizations.detail.notFound', 'Organization not found')}\n action={{\n label: tr('organizations.create.back', 'Back to Organizations'),\n onClick: () => navigate(basePath),\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-200\">\n <div className=\"mx-auto flex w-full max-w-7xl flex-col gap-6\">\n <div className=\"space-y-4\">\n <button\n type=\"button\"\n onClick={() => navigate(basePath)}\n className=\"inline-flex min-h-10 items-center gap-2 text-[var(--color-text-secondary)] transition-all duration-200 hover:text-[var(--color-text-primary)]\"\n >\n <ArrowLeft size={20} aria-hidden=\"true\" />\n <span className=\"text-sm font-medium\">\n {tr('organizations.create.back', 'Back to Organizations')}\n </span>\n </button>\n\n <EmphasisPanel className=\"flex flex-col gap-4 p-5 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"flex min-w-0 items-start gap-4\">\n <div className=\"flex size-16 items-center justify-center rounded-xl bg-[var(--color-status-info-bgSubtle)] text-[var(--color-status-info-text)]\">\n <Building size={28} aria-hidden=\"true\" />\n </div>\n\n <div className=\"min-w-0 space-y-2\">\n <div className=\"flex flex-wrap items-start gap-3\">\n <h1 className=\"text-3xl font-bold text-[var(--color-text-primary)]\">\n {organization.name}\n </h1>\n <OrganizationStatusBadge status={organization.status} />\n </div>\n <p className=\"break-all font-mono text-sm text-[var(--color-text-secondary)]\">\n /{organization.slug}\n </p>\n {organization.description ? (\n <p className=\"max-w-2xl text-sm text-[var(--color-text-secondary)]\">\n {organization.description}\n </p>\n ) : null}\n <PagePurpose className=\"max-w-2xl\">\n {tr(\n 'organizations.detail.purpose',\n 'This is the home for one organization — review its profile and metadata here, jump into the Workspaces tab to see where teams collaborate, or manage who belongs. Use this page to keep an organization healthy and growing.'\n )}\n </PagePurpose>\n </div>\n </div>\n\n <CTAOverflowMenu\n primary={\n hasPermission(PERMISSIONS.ORG_UPDATE)\n ? {\n label: tr('organizations.edit.title', 'Edit Organization'),\n icon: <Edit size={16} aria-hidden=\"true\" />,\n onSelect: () => navigate(`${basePath}/${id}/edit`),\n }\n : undefined\n }\n actions={[\n ...(hasPermission(PERMISSIONS.MEMBER_LIST)\n ? [\n {\n label: hasPermission(PERMISSIONS.MEMBER_INVITE)\n ? tr('organizations.detail.manageMembers', 'Manage Members')\n : tr('organizations.detail.viewMembers', 'View Members'),\n icon: <Users size={16} aria-hidden=\"true\" />,\n onSelect: () => navigate(`${basePath}/${id}/members`),\n },\n ]\n : []),\n ...(hasPermission(PERMISSIONS.MEMBER_INVITE)\n ? [\n {\n label: tr('members.invite.button', 'Invite Member'),\n icon: <UserPlus size={16} aria-hidden=\"true\" />,\n onSelect: () => navigate(`${basePath}/${id}/members/invite`),\n },\n ]\n : []),\n ]}\n />\n </EmphasisPanel>\n </div>\n\n <NextSteps\n storageKey=\"organization-org-detail\"\n steps={[\n ...(hasPermission(PERMISSIONS.MEMBER_INVITE)\n ? [\n {\n id: 'invite',\n label: tr('organizations.detail.next.invite', 'Invite a member'),\n description: tr(\n 'organizations.detail.next.inviteDesc',\n 'Bring people into this organization so they can access its workspaces.'\n ),\n icon: <UserPlus size={16} aria-hidden=\"true\" />,\n onClick: () => navigate(`${basePath}/${id}/members/invite`),\n },\n ]\n : []),\n ...(hasPermission(PERMISSIONS.WORKSPACE_CREATE)\n ? [\n {\n id: 'workspace',\n label: tr('organizations.detail.next.workspace', 'Create a workspace'),\n description: tr(\n 'organizations.detail.next.workspaceDesc',\n 'Give a team or project its own space to collaborate in.'\n ),\n icon: <Briefcase size={16} aria-hidden=\"true\" />,\n onClick: () => navigate(`${basePath}/workspaces/new?organizationId=${id}`),\n },\n ]\n : []),\n ...(hasPermission(PERMISSIONS.MEMBER_LIST)\n ? [\n {\n id: 'members',\n label: tr('organizations.detail.next.members', 'Review members'),\n description: tr(\n 'organizations.detail.next.membersDesc',\n 'See who belongs to this organization and manage their roles.'\n ),\n icon: <Users size={16} aria-hidden=\"true\" />,\n onClick: () => navigate(`${basePath}/${id}/members`),\n },\n ]\n : []),\n ...(hasPermission(PERMISSIONS.ORG_UPDATE)\n ? [\n {\n id: 'edit',\n label: tr('organizations.detail.next.edit', 'Edit organization profile'),\n description: tr(\n 'organizations.detail.next.editDesc',\n 'Update the name, slug, website, or description.'\n ),\n icon: <Edit size={16} aria-hidden=\"true\" />,\n onClick: () => navigate(`${basePath}/${id}/edit`),\n },\n ]\n : []),\n ]}\n />\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-0\">\n <div className=\"overflow-x-auto border-b border-[var(--color-border-seam)]\">\n <div className=\"flex min-w-max gap-2 px-4 pt-4 sm:px-6\">\n {tabItems.map((tabItem) => {\n const isActive = activeTab === tabItem.id;\n return (\n <button\n type=\"button\"\n key={tabItem.id}\n onClick={() => setActiveTab(tabItem.id)}\n className={`inline-flex min-h-11 items-center rounded-t-lg border-b-2 px-4 py-3 text-sm font-medium transition-colors ${\n isActive\n ? 'border-[var(--color-action-primary-bg)] text-[var(--color-action-primary-bg)]'\n : 'border-transparent text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]'\n }`}\n aria-pressed={isActive}\n >\n {tabItem.label}\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {activeTab === 'overview' ? (\n <div className=\"grid grid-cols-1 gap-6 xl:grid-cols-[minmax(0,1fr)_320px]\">\n <GlassCard\n treatment=\"plain\"\n className=\"border-border-seam bg-[var(--color-bg-canvas)] p-5\"\n >\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)]\">\n {tr('organizations.detail.detailsSection', 'Organization details')}\n </h2>\n\n <dl className=\"mt-5 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.name', 'Name')}\n </dt>\n <dd className=\"mt-1 text-sm text-[var(--color-text-primary)]\">\n {organization.name}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.slug', 'Slug')}\n </dt>\n <dd className=\"mt-1 break-all font-mono text-sm text-[var(--color-text-primary)]\">\n {organization.slug}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.status', 'Status')}\n </dt>\n <dd className=\"mt-1\">\n <OrganizationStatusBadge status={organization.status} />\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('organizations.detail.workspaceCount', 'Workspace count')}\n </dt>\n <dd className=\"mt-1 text-sm text-[var(--color-text-primary)]\">\n {organization.workspaceCount ?? 0}\n </dd>\n </div>\n {organization.website ? (\n <div className=\"sm:col-span-2\">\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('organizations.detail.website', 'Website')}\n </dt>\n <dd className=\"mt-1 break-all text-sm\">\n <a\n href={organization.website}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-[var(--color-action-primary-bg)] underline-offset-2 hover:underline\"\n >\n {organization.website}\n </a>\n </dd>\n </div>\n ) : null}\n {organization.description ? (\n <div className=\"sm:col-span-2\">\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.description', 'Description')}\n </dt>\n <dd className=\"mt-1 text-sm leading-6 text-[var(--color-text-primary)]\">\n {organization.description}\n </dd>\n </div>\n ) : null}\n </dl>\n </GlassCard>\n\n <GlassCard\n treatment=\"plain\"\n className=\"border-border-seam bg-[var(--color-bg-canvas)] p-5 xl:sticky xl:top-6 xl:self-start\"\n >\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)]\">\n {tr('common.metadata', 'Metadata')}\n </h2>\n\n <dl className=\"mt-5 space-y-4\">\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.created', 'Created')}\n </dt>\n <dd className=\"mt-1 text-sm text-[var(--color-text-primary)]\">\n {formatDate(organization.createdAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('common.lastUpdated', 'Last updated')}\n </dt>\n <dd className=\"mt-1 text-sm text-[var(--color-text-primary)]\">\n {formatDate(organization.updatedAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-[var(--color-text-secondary)]\">\n {tr('organizations.detail.tenantId', 'Tenant ID')}\n </dt>\n <dd className=\"mt-1 break-all font-mono text-sm text-[var(--color-text-primary)]\">\n {organization.tenantId}\n </dd>\n </div>\n </dl>\n </GlassCard>\n </div>\n ) : (\n <section className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)]\">\n {tr('organizations.detail.workspacesTitle', 'Organization workspaces')}\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)]\">\n {tr(\n 'organizations.detail.workspacesSubtitle',\n 'Create and manage workspaces for this organization.'\n )}\n </p>\n </div>\n\n {hasPermission(PERMISSIONS.WORKSPACE_CREATE) && (\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/workspaces/new?organizationId=${id}`)}\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\"\n >\n <Briefcase size={16} aria-hidden=\"true\" />\n <span>{tr('workspaces.create.button', 'Create Workspace')}</span>\n </button>\n )}\n </div>\n\n {workspacesLoading ? (\n <div className=\"py-8\">\n <LoadingState\n message={tr('workspaces.list.loading', 'Loading workspaces...')}\n />\n </div>\n ) : workspacesError ? (\n <ErrorState\n message={workspacesError.message}\n action={{\n label: tr('common.retry', 'Retry'),\n onClick: () => {\n void refetchWorkspaces();\n },\n }}\n />\n ) : workspaces.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-4 xl:grid-cols-2\">\n {workspaces.map((workspace) => (\n <WorkspaceCard\n key={workspace.id}\n workspace={workspace}\n showActions={false}\n onClick={(selectedWorkspace) => {\n navigate(`${basePath}/workspaces/${selectedWorkspace.id}`);\n }}\n />\n ))}\n </div>\n ) : (\n <div className=\"rounded-xl border border-[var(--color-border-default)] bg-[var(--color-bg-canvas)] p-6\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tr('workspaces.list.emptyTitle', 'No workspaces yet')}\n description={\n hasPermission(PERMISSIONS.WORKSPACE_CREATE)\n ? tr(\n 'workspaces.list.emptyDescription',\n 'Create a workspace when this organization is ready to collaborate with teams or projects.'\n )\n : tr(\n 'workspaces.list.emptyDescriptionViewer',\n 'No workspaces have been created in this organization yet.'\n )\n }\n action={\n hasPermission(PERMISSIONS.WORKSPACE_CREATE) ? (\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/workspaces/new?organizationId=${id}`)\n }\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 font-medium text-[var(--color-action-primary-text)] transition-all duration-200 hover:bg-[var(--color-action-primary-bgHover)]\"\n >\n {tr('workspaces.create.button', 'Create Workspace')}\n </button>\n ) : undefined\n }\n />\n </div>\n )}\n </section>\n )}\n </div>\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { toast as e } from "../../../../node_modules/sonner/dist/index.js";
|
|
2
|
+
import { useOrgConsole as t } from "../../../providers/OrgConsoleProvider.js";
|
|
3
3
|
import { useOrganization as n, useUpdateOrganization as r } from "../hooks/useOrganizations.js";
|
|
4
|
-
import {
|
|
4
|
+
import { OrganizationForm as i } from "../components/OrganizationForm.js";
|
|
5
5
|
import { LoadingState as a } from "../../../shared/components/feedback/LoadingState.js";
|
|
6
6
|
import { ErrorState as o } from "../../../shared/components/feedback/ErrorState.js";
|
|
7
7
|
import { PERMISSIONS as s } from "../../../constants/permissions.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { useTr as c } from "../../../shared/hooks/useTr.js";
|
|
9
|
+
import { useOrganizationPageView as l } from "../../../hooks/useOrganizationPageView.js";
|
|
10
10
|
import { ArrowLeft as u } from "lucide-react";
|
|
11
11
|
import { GlassCard as d, PagePurpose as f } from "@burdenoff/fe-libs/ui";
|
|
12
12
|
import { usePermissions as p } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
13
13
|
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
14
14
|
import { useParams as g } from "react-router";
|
|
15
|
-
|
|
15
|
+
// src/organization-management/modules/organizations/pages/OrganizationEditPage.tsx
|
|
16
16
|
function _() {
|
|
17
|
-
let _ =
|
|
18
|
-
|
|
19
|
-
let { navigate: y, basePath: b = "/organizations" } =
|
|
17
|
+
let _ = c(), { id: v } = g();
|
|
18
|
+
l("organizations.edit", { organizationId: v });
|
|
19
|
+
let { navigate: y, basePath: b = "/organizations" } = t(), { hasPermission: x, isLoading: S } = p(), { organization: C, loading: w, error: T } = n(v), { updateOrganization: E, loading: D } = r(), O = async (t) => {
|
|
20
20
|
if (v) try {
|
|
21
|
-
let n = await E(v,
|
|
21
|
+
let n = await E(v, t);
|
|
22
22
|
if (n.errors?.length) throw Error(n.errors[0]?.message ?? _("organizations.edit.failed", "Failed to update organization"));
|
|
23
|
-
|
|
24
|
-
} catch (
|
|
25
|
-
|
|
23
|
+
e.success(_("organizations.edit.success", "Organization updated successfully")), y(`${b}/${v}`);
|
|
24
|
+
} catch (t) {
|
|
25
|
+
e.error(t instanceof Error ? t.message : _("organizations.edit.failed", "Failed to update organization"));
|
|
26
26
|
}
|
|
27
27
|
}, k = () => {
|
|
28
28
|
y(`${b}/${v}`);
|
|
@@ -79,7 +79,7 @@ function _() {
|
|
|
79
79
|
treatment: "glass",
|
|
80
80
|
glow: !0,
|
|
81
81
|
className: "border-border-seam p-6",
|
|
82
|
-
children: /* @__PURE__ */ m(
|
|
82
|
+
children: /* @__PURE__ */ m(i, {
|
|
83
83
|
organization: C,
|
|
84
84
|
onSubmit: O,
|
|
85
85
|
onCancel: k,
|
|
@@ -95,7 +95,6 @@ function _() {
|
|
|
95
95
|
})
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
|
-
//#endregion
|
|
99
98
|
export { _ as OrganizationEditPage };
|
|
100
99
|
|
|
101
100
|
//# sourceMappingURL=OrganizationEditPage.js.map
|
package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrganizationEditPage.js","names":[],"sources":["../../../../../src/organization-management/modules/organizations/pages/OrganizationEditPage.tsx"],"sourcesContent":["import { useParams } from 'react-router';\nimport { ArrowLeft } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useOrganization, useUpdateOrganization } from '../hooks/useOrganizations';\nimport { OrganizationForm } from '../components/OrganizationForm';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\nimport { useOrganizationPageView } from '../../../hooks/useOrganizationPageView';\nimport type { UpdateOrganizationInput } from '../types';\n\n/**\n * Organization Edit Page\n * Form to edit an existing organization\n */\nexport function OrganizationEditPage() {\n const tr = useTr();\n const { id } = useParams<{ id: string }>();\n useOrganizationPageView('organizations.edit', { organizationId: id });\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const { organization, loading: fetchLoading, error } = useOrganization(id!);\n const { updateOrganization, loading: updateLoading } = useUpdateOrganization();\n\n const handleSubmit = async (data: UpdateOrganizationInput) => {\n if (!id) return;\n\n try {\n const result = await updateOrganization(id, data);\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ??\n tr('organizations.edit.failed', 'Failed to update organization')\n );\n }\n\n toast.success(tr('organizations.edit.success', 'Organization updated successfully'));\n navigate(`${basePath}/${id}`);\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : tr('organizations.edit.failed', 'Failed to update organization')\n );\n }\n };\n\n const handleCancel = () => {\n navigate(`${basePath}/${id}`);\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.ORG_UPDATE)) {\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(\n 'organizations.edit.noPermission',\n \"You don't have permission to edit organizations.\"\n )}\n </div>\n </div>\n );\n }\n\n if (fetchLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <LoadingState message={tr('organizations.edit.loading', 'Loading organization...')} />\n </div>\n );\n }\n\n if (error || !organization) {\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 || tr('organizations.detail.notFound', 'Organization not found')}\n action={{\n label: tr('organizations.create.back', 'Back to Organizations'),\n onClick: () => navigate(basePath),\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-200\">\n {/* Page Header */}\n <div className=\"mb-6\">\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"\n inline-flex items-center gap-2 mb-4\n text-[var(--color-text-secondary)]\n hover:text-[var(--color-text-primary)]\n \n transition-all duration-200\n \"\n >\n <ArrowLeft size={20} />\n <span className=\"text-sm font-medium\">\n {tr('common.backTo', 'Back to')} {organization.name}\n </span>\n </button>\n\n <h1 className=\"text-3xl font-bold text-[var(--color-text-primary)] mb-2\">\n {tr('organizations.edit.title', 'Edit Organization')}\n </h1>\n <p className=\"text-[var(--color-text-secondary)]\">\n {tr('organizations.edit.subtitle', 'Update organization information')}\n </p>\n <PagePurpose className=\"mt-2 max-w-2xl\">\n {tr(\n 'organizations.edit.purpose',\n \"Update this organization's profile — its name, slug, website, and description. Keeping these accurate helps members recognize the organization and keeps links working.\"\n )}\n </PagePurpose>\n </div>\n\n {/* Form Card */}\n <div className=\"max-w-2xl\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-6\">\n <OrganizationForm\n organization={organization}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n loading={updateLoading}\n />\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,
|
|
1
|
+
{"version":3,"file":"OrganizationEditPage.js","names":["OrganizationEditPage","tr","useTr","useParams","id","useOrgConsole","permissionsLoading","usePermissions","fetchLoading","useOrganization","updateLoading","useUpdateOrganization","handleSubmit","result","updateOrganization","data","toast","navigate","basePath","error","handleCancel","LoadingState","hasPermission","PERMISSIONS","organization","ErrorState","ArrowLeft","PagePurpose","GlassCard","OrganizationForm"],"sources":["../../../../../src/organization-management/modules/organizations/pages/OrganizationEditPage.tsx"],"sourcesContent":["import { useParams } from 'react-router';\nimport { ArrowLeft } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useOrganization, useUpdateOrganization } from '../hooks/useOrganizations';\nimport { OrganizationForm } from '../components/OrganizationForm';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\nimport { useOrganizationPageView } from '../../../hooks/useOrganizationPageView';\nimport type { UpdateOrganizationInput } from '../types';\n\n/**\n * Organization Edit Page\n * Form to edit an existing organization\n */\nexport function OrganizationEditPage() {\n const tr = useTr();\n const { id } = useParams<{ id: string }>();\n useOrganizationPageView('organizations.edit', { organizationId: id });\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const { organization, loading: fetchLoading, error } = useOrganization(id!);\n const { updateOrganization, loading: updateLoading } = useUpdateOrganization();\n\n const handleSubmit = async (data: UpdateOrganizationInput) => {\n if (!id) return;\n\n try {\n const result = await updateOrganization(id, data);\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ??\n tr('organizations.edit.failed', 'Failed to update organization')\n );\n }\n\n toast.success(tr('organizations.edit.success', 'Organization updated successfully'));\n navigate(`${basePath}/${id}`);\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : tr('organizations.edit.failed', 'Failed to update organization')\n );\n }\n };\n\n const handleCancel = () => {\n navigate(`${basePath}/${id}`);\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.ORG_UPDATE)) {\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(\n 'organizations.edit.noPermission',\n \"You don't have permission to edit organizations.\"\n )}\n </div>\n </div>\n );\n }\n\n if (fetchLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <LoadingState message={tr('organizations.edit.loading', 'Loading organization...')} />\n </div>\n );\n }\n\n if (error || !organization) {\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 || tr('organizations.detail.notFound', 'Organization not found')}\n action={{\n label: tr('organizations.create.back', 'Back to Organizations'),\n onClick: () => navigate(basePath),\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-200\">\n {/* Page Header */}\n <div className=\"mb-6\">\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"\n inline-flex items-center gap-2 mb-4\n text-[var(--color-text-secondary)]\n hover:text-[var(--color-text-primary)]\n \n transition-all duration-200\n \"\n >\n <ArrowLeft size={20} />\n <span className=\"text-sm font-medium\">\n {tr('common.backTo', 'Back to')} {organization.name}\n </span>\n </button>\n\n <h1 className=\"text-3xl font-bold text-[var(--color-text-primary)] mb-2\">\n {tr('organizations.edit.title', 'Edit Organization')}\n </h1>\n <p className=\"text-[var(--color-text-secondary)]\">\n {tr('organizations.edit.subtitle', 'Update organization information')}\n </p>\n <PagePurpose className=\"mt-2 max-w-2xl\">\n {tr(\n 'organizations.edit.purpose',\n \"Update this organization's profile — its name, slug, website, and description. Keeping these accurate helps members recognize the organization and keeps links working.\"\n )}\n </PagePurpose>\n </div>\n\n {/* Form Card */}\n <div className=\"max-w-2xl\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-6\">\n <OrganizationForm\n organization={organization}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n loading={updateLoading}\n />\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,SAAgBA,IAAuB;CACrC,IAAMC,IAAKC,EAAM,GACX,EAAE,UAAOC,EAA0B;CACzC,EAAwB,sBAAsB,EAAE,gBAAgBC,EAAG,CAAC;CACpE,IAAM,EAAE,aAAU,cAAW,qBAAqBC,EAAc,GAC1D,EAAE,kBAAe,WAAWC,MAAuBC,EAAe,GAClE,EAAE,iBAAc,SAASC,GAAc,aAAUC,EAAgBL,CAAG,GACpE,EAAE,uBAAoB,SAASM,MAAkBC,EAAsB,GAEvEC,IAAe,OAAO,MAAkC;EAC5D,IAAKR,GAEL,IAAI;GACF,IAAMS,IAAS,MAAMC,EAAmBV,GAAIW,CAAI;GAChD,IAAIF,EAAO,QAAQ,QACjB,MAAU,MACRA,EAAO,OAAO,EAAE,EAAE,WAChBZ,EAAG,6BAA6B,+BAA+B,CACnE;GAIF,AADAe,EAAM,QAAQf,EAAG,8BAA8B,mCAAmC,CAAC,GACnFgB,EAAS,GAAGC,EAAS,GAAGd,GAAI;EAC9B,SAASe,GAAO;GACd,EAAM,MACJA,aAAiB,QACbA,EAAM,UACNlB,EAAG,6BAA6B,+BAA+B,CACrE;EACF;CACF,GAEMmB,UAAqB;EACzB,EAAS,GAAGF,EAAS,GAAGd,GAAI;CAC9B;CA6CA,OA3CIE,IAEA,kBAAC,OAAD;EAAK,WAAU;EACb,UAAA,kBAACe,GAAD,EAAc,SAASpB,EAAG,6BAA6B,wBAAwB,EAAI,CAAA;CAChF,CAAA,IAIJqB,EAAcC,EAAY,UAAU,IAarCf,IAEA,kBAAC,OAAD;EAAK,WAAU;EACb,UAAA,kBAACa,GAAD,EAAc,SAASpB,EAAG,8BAA8B,yBAAyB,EAAI,CAAA;CAClF,CAAA,IAILkB,KAAS,CAACK,IAEV,kBAAC,OAAD;EAAK,WAAU;EACb,UAAA,kBAACC,GAAD;GACE,SAASN,GAAO,WAAWlB,EAAG,iCAAiC,wBAAwB;GACvF,QAAQ;IACN,OAAOA,EAAG,6BAA6B,uBAAuB;IAC9D,eAAegB,EAASC,CAAQ;GAClC;EACD,CAAA;CACE,CAAA,IAKP,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CAEE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,UAAD;KACE,MAAK;KACL,SAASE;KACT,WAAU;KAHZ,UAAA,CAWE,kBAACM,GAAD,EAAW,MAAM,GAAK,CAAA,GACtB,kBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OACGzB,EAAG,iBAAiB,SAAS;OAAE;OAAEuB,EAAa;MAC3C;KACA,CAAA,CAAA;;IAER,kBAAC,MAAD;KAAI,WAAU;KACX,UAAAvB,EAAG,4BAA4B,mBAAmB;IACjD,CAAA;IACJ,kBAAC,KAAD;KAAG,WAAU;KACV,UAAAA,EAAG,+BAA+B,iCAAiC;IACnE,CAAA;IACH,kBAAC0B,GAAD;KAAa,WAAU;KACpB,UAAA1B,EACC,8BACA,yKACF;IACW,CAAA;GACV;EAGL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GACb,UAAA,kBAAC2B,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;IAC1C,UAAA,kBAACC,GAAD;KACgB;KACd,UAAUjB;KACV,UAAUQ;KACV,SAASV;IACV,CAAA;GACQ,CAAA;EACR,CAAA,CACF;C,KA/EH,kBAAC,OAAD;EAAK,WAAU;EACb,UAAA,kBAAC,OAAD;GAAK,WAAU;GACZ,UAAAT,EACC,mCACA,kDACF;EACG,CAAA;CACF,CAAA;AA0EX"}
|