@burdenoff/microfe-organization 2026.1026.1 → 2026.1101.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/dist/generated/global-operations.js +57 -58
  2. package/dist/generated/global-operations.js.map +1 -1
  3. package/dist/generated/global-types.js +1 -2
  4. package/dist/generated/global-types.js.map +1 -1
  5. package/dist/node_modules/sonner/dist/index.js +2 -3
  6. package/dist/node_modules/sonner/dist/index.js.map +1 -1
  7. package/dist/node_modules/zod/v4/classic/errors.js +44 -0
  8. package/dist/node_modules/zod/v4/classic/errors.js.map +1 -0
  9. package/dist/node_modules/zod/v4/classic/parse.js +7 -0
  10. package/dist/node_modules/zod/v4/classic/parse.js.map +1 -0
  11. package/dist/node_modules/zod/v4/classic/schemas.js +652 -0
  12. package/dist/node_modules/zod/v4/classic/schemas.js.map +1 -0
  13. package/dist/node_modules/zod/v4/core/api.js +429 -0
  14. package/dist/node_modules/zod/v4/core/api.js.map +1 -0
  15. package/dist/node_modules/zod/v4/core/checks.js +143 -0
  16. package/dist/node_modules/zod/v4/core/checks.js.map +1 -0
  17. package/dist/node_modules/zod/v4/core/core.js +84 -0
  18. package/dist/node_modules/zod/v4/core/core.js.map +1 -0
  19. package/dist/node_modules/zod/v4/core/doc.js +29 -0
  20. package/dist/node_modules/zod/v4/core/doc.js.map +1 -0
  21. package/dist/node_modules/zod/v4/core/errors.js +90 -0
  22. package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
  23. package/dist/node_modules/zod/v4/core/json-schema-processors.js +285 -0
  24. package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +1 -0
  25. package/dist/node_modules/zod/v4/core/memoizer.js +188 -0
  26. package/dist/node_modules/zod/v4/core/memoizer.js.map +1 -0
  27. package/dist/node_modules/zod/v4/core/parse.js +159 -0
  28. package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
  29. package/dist/node_modules/zod/v4/core/regexes.js +34 -0
  30. package/dist/node_modules/zod/v4/core/regexes.js.map +1 -0
  31. package/dist/node_modules/zod/v4/core/registries.js +41 -0
  32. package/dist/node_modules/zod/v4/core/registries.js.map +1 -0
  33. package/dist/node_modules/zod/v4/core/schemas.js +979 -0
  34. package/dist/node_modules/zod/v4/core/schemas.js.map +1 -0
  35. package/dist/node_modules/zod/v4/core/to-json-schema.js +330 -0
  36. package/dist/node_modules/zod/v4/core/to-json-schema.js.map +1 -0
  37. package/dist/node_modules/zod/v4/core/util.js +417 -0
  38. package/dist/node_modules/zod/v4/core/util.js.map +1 -0
  39. package/dist/node_modules/zod/v4/core/versions.js +9 -0
  40. package/dist/node_modules/zod/v4/core/versions.js.map +1 -0
  41. package/dist/node_modules/zod/v4/locales/en.js +96 -0
  42. package/dist/node_modules/zod/v4/locales/en.js.map +1 -0
  43. package/dist/organization-management/AdminOrganizationRoot.js +13 -10
  44. package/dist/organization-management/AdminOrganizationRoot.js.map +1 -1
  45. package/dist/organization-management/AdminOrganizationRoutes.js +8 -9
  46. package/dist/organization-management/AdminOrganizationRoutes.js.map +1 -1
  47. package/dist/organization-management/UserOrganizationRoot.js +13 -10
  48. package/dist/organization-management/UserOrganizationRoot.js.map +1 -1
  49. package/dist/organization-management/UserOrganizationRoutes.js +1 -2
  50. package/dist/organization-management/UserOrganizationRoutes.js.map +1 -1
  51. package/dist/organization-management/constants/permissions.js +1 -2
  52. package/dist/organization-management/constants/permissions.js.map +1 -1
  53. package/dist/organization-management/hooks/useOrganizationEventEmitter.js +1 -2
  54. package/dist/organization-management/hooks/useOrganizationEventEmitter.js.map +1 -1
  55. package/dist/organization-management/hooks/useOrganizationPageView.js +1 -2
  56. package/dist/organization-management/hooks/useOrganizationPageView.js.map +1 -1
  57. package/dist/organization-management/modules/members/components/BulkInviteForm.js +3 -3
  58. package/dist/organization-management/modules/members/components/BulkInviteForm.js.map +1 -1
  59. package/dist/organization-management/modules/members/components/InviteMemberForm.js +1 -2
  60. package/dist/organization-management/modules/members/components/InviteMemberForm.js.map +1 -1
  61. package/dist/organization-management/modules/members/components/InviteStatusBadge.js +1 -2
  62. package/dist/organization-management/modules/members/components/InviteStatusBadge.js.map +1 -1
  63. package/dist/organization-management/modules/members/components/MemberRoleBadge.js +1 -2
  64. package/dist/organization-management/modules/members/components/MemberRoleBadge.js.map +1 -1
  65. package/dist/organization-management/modules/members/components/MyInviteCard.js +5 -6
  66. package/dist/organization-management/modules/members/components/MyInviteCard.js.map +1 -1
  67. package/dist/organization-management/modules/members/components/PendingInvitesList.js +8 -9
  68. package/dist/organization-management/modules/members/components/PendingInvitesList.js.map +1 -1
  69. package/dist/organization-management/modules/members/hooks/useInvites.js +2 -3
  70. package/dist/organization-management/modules/members/hooks/useInvites.js.map +1 -1
  71. package/dist/organization-management/modules/members/hooks/useMembers.js +1 -2
  72. package/dist/organization-management/modules/members/hooks/useMembers.js.map +1 -1
  73. package/dist/organization-management/modules/members/hooks/useWorkspaceInvites.js +1 -2
  74. package/dist/organization-management/modules/members/hooks/useWorkspaceInvites.js.map +1 -1
  75. package/dist/organization-management/modules/members/pages/InviteMemberPage.js +16 -17
  76. package/dist/organization-management/modules/members/pages/InviteMemberPage.js.map +1 -1
  77. package/dist/organization-management/modules/members/pages/InvitePeoplePage.js +14 -15
  78. package/dist/organization-management/modules/members/pages/InvitePeoplePage.js.map +1 -1
  79. package/dist/organization-management/modules/members/pages/MemberDetailPage.js +18 -19
  80. package/dist/organization-management/modules/members/pages/MemberDetailPage.js.map +1 -1
  81. package/dist/organization-management/modules/members/pages/MembersListPage.js +142 -143
  82. package/dist/organization-management/modules/members/pages/MembersListPage.js.map +1 -1
  83. package/dist/organization-management/modules/members/pages/MyInvitesPage.js +168 -169
  84. package/dist/organization-management/modules/members/pages/MyInvitesPage.js.map +1 -1
  85. package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js +13 -14
  86. package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js.map +1 -1
  87. package/dist/organization-management/modules/members/utils/bulkInviteCsv.js +4 -10
  88. package/dist/organization-management/modules/members/utils/bulkInviteCsv.js.map +1 -1
  89. package/dist/organization-management/modules/members/utils/workspaceInvitationDisplay.js +1 -2
  90. package/dist/organization-management/modules/members/utils/workspaceInvitationDisplay.js.map +1 -1
  91. package/dist/organization-management/modules/organizations/components/OrganizationForm.js +14 -15
  92. package/dist/organization-management/modules/organizations/components/OrganizationForm.js.map +1 -1
  93. package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.js +1 -2
  94. package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.js.map +1 -1
  95. package/dist/organization-management/modules/organizations/hooks/useOrganizations.js +2 -3
  96. package/dist/organization-management/modules/organizations/hooks/useOrganizations.js.map +1 -1
  97. package/dist/organization-management/modules/organizations/hooks/useOrgsWithPermission.js +22 -21
  98. package/dist/organization-management/modules/organizations/hooks/useOrgsWithPermission.js.map +1 -1
  99. package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js +18 -19
  100. package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js.map +1 -1
  101. package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js +29 -30
  102. package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js.map +1 -1
  103. package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js +14 -15
  104. package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js.map +1 -1
  105. package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js +33 -34
  106. package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js.map +1 -1
  107. package/dist/organization-management/modules/organizations/schemas/index.js +11 -12
  108. package/dist/organization-management/modules/organizations/schemas/index.js.map +1 -1
  109. package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.js +16 -24
  110. package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.js.map +1 -1
  111. package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js +5 -6
  112. package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js.map +1 -1
  113. package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js +31 -32
  114. package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js.map +1 -1
  115. package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.js +1 -2
  116. package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.js.map +1 -1
  117. package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.js +1 -2
  118. package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.js.map +1 -1
  119. package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.js +11 -12
  120. package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.js.map +1 -1
  121. package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js +18 -19
  122. package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js.map +1 -1
  123. package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js +43 -44
  124. package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js.map +1 -1
  125. package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js +19 -20
  126. package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js.map +1 -1
  127. package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js +240 -241
  128. package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js.map +1 -1
  129. package/dist/organization-management/modules/workspaces/schemas/index.js +6 -7
  130. package/dist/organization-management/modules/workspaces/schemas/index.js.map +1 -1
  131. package/dist/organization-management/providers/OrgConsoleProvider.js +1 -2
  132. package/dist/organization-management/providers/OrgConsoleProvider.js.map +1 -1
  133. package/dist/organization-management/providers/OrgScopedPermissions.js +1 -2
  134. package/dist/organization-management/providers/OrgScopedPermissions.js.map +1 -1
  135. package/dist/organization-management/shared/components/dialog/ConfirmDialog.js +1 -2
  136. package/dist/organization-management/shared/components/dialog/ConfirmDialog.js.map +1 -1
  137. package/dist/organization-management/shared/components/dialog/ConfirmDialogView.js +1 -2
  138. package/dist/organization-management/shared/components/dialog/ConfirmDialogView.js.map +1 -1
  139. package/dist/organization-management/shared/components/feedback/ErrorState.js +1 -2
  140. package/dist/organization-management/shared/components/feedback/ErrorState.js.map +1 -1
  141. package/dist/organization-management/shared/components/feedback/LoadingState.js +1 -2
  142. package/dist/organization-management/shared/components/feedback/LoadingState.js.map +1 -1
  143. package/dist/organization-management/shared/components/input/SearchInput.js +1 -2
  144. package/dist/organization-management/shared/components/input/SearchInput.js.map +1 -1
  145. package/dist/organization-management/shared/components/input/SelectionCheckbox.js +1 -2
  146. package/dist/organization-management/shared/components/input/SelectionCheckbox.js.map +1 -1
  147. package/dist/organization-management/shared/hooks/useDebouncedValue.js +1 -2
  148. package/dist/organization-management/shared/hooks/useDebouncedValue.js.map +1 -1
  149. package/dist/organization-management/shared/hooks/useTr.js +1 -2
  150. package/dist/organization-management/shared/hooks/useTr.js.map +1 -1
  151. package/dist/organization-management/shared/logger.js +1 -2
  152. package/dist/organization-management/shared/logger.js.map +1 -1
  153. package/dist/organization-management/shared/recaptcha.js +1 -2
  154. package/dist/organization-management/shared/recaptcha.js.map +1 -1
  155. package/dist/organization-management/shared/types/graphql.js +1 -2
  156. package/dist/organization-management/shared/types/graphql.js.map +1 -1
  157. package/dist/utils/nativeBridge.js +1 -2
  158. package/package.json +7 -6
  159. package/dist/node_modules/zod/v3/ZodError.js +0 -82
  160. package/dist/node_modules/zod/v3/ZodError.js.map +0 -1
  161. package/dist/node_modules/zod/v3/errors.js +0 -10
  162. package/dist/node_modules/zod/v3/errors.js.map +0 -1
  163. package/dist/node_modules/zod/v3/helpers/errorUtil.js +0 -9
  164. package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +0 -1
  165. package/dist/node_modules/zod/v3/helpers/parseUtil.js +0 -93
  166. package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +0 -1
  167. package/dist/node_modules/zod/v3/helpers/util.js +0 -76
  168. package/dist/node_modules/zod/v3/helpers/util.js.map +0 -1
  169. package/dist/node_modules/zod/v3/locales/en.js +0 -62
  170. package/dist/node_modules/zod/v3/locales/en.js.map +0 -1
  171. package/dist/node_modules/zod/v3/types.js +0 -2441
  172. 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 { useTr as r } from "../../../shared/hooks/useTr.js";
5
- import { LoadingState as i } from "../../../shared/components/feedback/LoadingState.js";
6
- import { ErrorState as a } from "../../../shared/components/feedback/ErrorState.js";
7
- import { PERMISSIONS as o } from "../../../constants/permissions.js";
8
- import { useOrganizationPageView as s } from "../../../hooks/useOrganizationPageView.js";
9
- import { useWorkspacesByOrganization as c } from "../../workspaces/hooks/useWorkspaces.js";
10
- import { WorkspaceCard as l } from "../../workspaces/components/WorkspaceCard.js";
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
- //#region src/organization-management/modules/organizations/pages/OrganizationDetailPage.tsx
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 = r(), { id: A } = D();
29
- s("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 } = c(R === "workspaces" && A ? A ?? "" : "", 50, 0), W = 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(i, { message: k("common.loadingPermissions", "Loading permissions...") })
45
- }) : N(o.ORG_READ) ? I ? /* @__PURE__ */ T("div", {
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(i, { message: k("organizations.detail.loading", "Loading organization details...") })
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(a, {
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(o.ORG_UPDATE) ? {
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(o.MEMBER_LIST) ? [{
119
- label: N(o.MEMBER_INVITE) ? k("organizations.detail.manageMembers", "Manage Members") : k("organizations.detail.viewMembers", "View Members"),
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(o.MEMBER_INVITE) ? [{
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(o.MEMBER_INVITE) ? [{
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(o.WORKSPACE_CREATE) ? [{
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(o.MEMBER_LIST) ? [{
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(o.ORG_UPDATE) ? [{
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(o.WORKSPACE_CREATE) && /* @__PURE__ */ E("button", {
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(i, { message: k("workspaces.list.loading", "Loading workspaces...") })
323
- }) : H ? /* @__PURE__ */ T(a, {
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(l, {
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(o.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(o.WORKSPACE_CREATE) ? /* @__PURE__ */ T("button", {
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
@@ -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 { useOrgConsole as e } from "../../../providers/OrgConsoleProvider.js";
2
- import { toast as t } from "../../../../node_modules/sonner/dist/index.js";
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 { useTr as i } from "../../../shared/hooks/useTr.js";
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 { useOrganizationPageView as c } from "../../../hooks/useOrganizationPageView.js";
9
- import { OrganizationForm as l } from "../components/OrganizationForm.js";
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
- //#region src/organization-management/modules/organizations/pages/OrganizationEditPage.tsx
15
+ // src/organization-management/modules/organizations/pages/OrganizationEditPage.tsx
16
16
  function _() {
17
- let _ = i(), { id: v } = g();
18
- c("organizations.edit", { organizationId: v });
19
- let { navigate: y, basePath: b = "/organizations" } = e(), { hasPermission: x, isLoading: S } = p(), { organization: C, loading: w, error: T } = n(v), { updateOrganization: E, loading: D } = r(), O = async (e) => {
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, e);
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
- t.success(_("organizations.edit.success", "Organization updated successfully")), y(`${b}/${v}`);
24
- } catch (e) {
25
- t.error(e instanceof Error ? e.message : _("organizations.edit.failed", "Failed to update organization"));
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(l, {
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
@@ -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,SAAgB,IAAuB;CACrC,IAAM,IAAK,GAAO,EACZ,EAAE,UAAO,GAA2B;AAC1C,GAAwB,sBAAsB,EAAE,gBAAgB,GAAI,CAAC;CACrE,IAAM,EAAE,aAAU,cAAW,qBAAqB,GAAe,EAC3D,EAAE,kBAAe,WAAW,MAAuB,GAAgB,EACnE,EAAE,iBAAc,SAAS,GAAc,aAAU,EAAgB,EAAI,EACrE,EAAE,uBAAoB,SAAS,MAAkB,GAAuB,EAExE,IAAe,OAAO,MAAkC;AACvD,QAEL,KAAI;GACF,IAAM,IAAS,MAAM,EAAmB,GAAI,EAAK;AACjD,OAAI,EAAO,QAAQ,OACjB,OAAU,MACR,EAAO,OAAO,IAAI,WAChB,EAAG,6BAA6B,gCAAgC,CACnE;AAIH,GADA,EAAM,QAAQ,EAAG,8BAA8B,oCAAoC,CAAC,EACpF,EAAS,GAAG,EAAS,GAAG,IAAK;WACtB,GAAO;AACd,KAAM,MACJ,aAAiB,QACb,EAAM,UACN,EAAG,6BAA6B,gCAAgC,CACrE;;IAIC,UAAqB;AACzB,IAAS,GAAG,EAAS,GAAG,IAAK;;AA8C/B,QA3CI,IAEA,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAc,SAAS,EAAG,6BAA6B,yBAAyB,EAAI,CAAA;EAChF,CAAA,GAIL,EAAc,EAAY,WAAW,GAatC,IAEA,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAc,SAAS,EAAG,8BAA8B,0BAA0B,EAAI,CAAA;EAClF,CAAA,GAIN,KAAS,CAAC,IAEV,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,SAAS,GAAO,WAAW,EAAG,iCAAiC,yBAAyB;GACxF,QAAQ;IACN,OAAO,EAAG,6BAA6B,wBAAwB;IAC/D,eAAe,EAAS,EAAS;IAClC;GACD,CAAA;EACE,CAAA,GAKR,kBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAU;eAHZ,CAWE,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA,EACvB,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACG,EAAG,iBAAiB,UAAU;OAAC;OAAE,EAAa;OAC1C;QACA;;IAET,kBAAC,MAAD;KAAI,WAAU;eACX,EAAG,4BAA4B,oBAAoB;KACjD,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAG,+BAA+B,kCAAkC;KACnE,CAAA;IACJ,kBAAC,GAAD;KAAa,WAAU;eACpB,EACC,8BACA,0KACD;KACW,CAAA;IACV;MAGN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAC1C,kBAAC,GAAD;KACgB;KACd,UAAU;KACV,UAAU;KACV,SAAS;KACT,CAAA;IACQ,CAAA;GACR,CAAA,CACF;MA/EJ,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aACZ,EACC,mCACA,mDACD;GACG,CAAA;EACF,CAAA"}
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"}