@burdenoff/microfe-organization 2026.513.2 → 2026.517.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.
- package/dist/generated/global-operations.d.ts +50 -0
- package/dist/generated/global-operations.d.ts.map +1 -1
- package/dist/generated/global-operations.js +90 -70
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/organization-management/AdminOrganizationRoutes.d.ts.map +1 -1
- package/dist/organization-management/AdminOrganizationRoutes.js +1 -1
- package/dist/organization-management/AdminOrganizationRoutes.js.map +1 -1
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.d.ts +32 -0
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.d.ts.map +1 -1
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.js +64 -42
- package/dist/organization-management/modules/organizations/hooks/useOrganizations.js.map +1 -1
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.d.ts +18 -1
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.d.ts.map +1 -1
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js +205 -200
- package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminOrganizationRoutes.d.ts","sourceRoot":"","sources":["../../src/organization-management/AdminOrganizationRoutes.tsx"],"names":[],"mappings":"AAuEA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"AdminOrganizationRoutes.d.ts","sourceRoot":"","sources":["../../src/organization-management/AdminOrganizationRoutes.tsx"],"names":[],"mappings":"AAuEA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,4CA6CtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminOrganizationRoutes.js","names":[],"sources":["../../src/organization-management/AdminOrganizationRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Route, Routes } from 'react-router-dom';\nimport { useFeatureFlagDetails } from '@burdenoff/fe-libs/shared/feature-flags';\n\n// Eager load - main entry point page\nimport { OrganizationsListPage } from './modules/organizations/pages/OrganizationsListPage';\n\n// Lazy load - secondary pages\nconst OrganizationCreatePage = lazy(() =>\n import('./modules/organizations/pages/OrganizationCreatePage').then((m) => ({\n default: m.OrganizationCreatePage,\n }))\n);\nconst OrganizationDetailPage = lazy(() =>\n import('./modules/organizations/pages/OrganizationDetailPage').then((m) => ({\n default: m.OrganizationDetailPage,\n }))\n);\nconst OrganizationEditPage = lazy(() =>\n import('./modules/organizations/pages/OrganizationEditPage').then((m) => ({\n default: m.OrganizationEditPage,\n }))\n);\n\n// Workspaces - lazy load all\nconst WorkspacesListPage = lazy(() =>\n import('./modules/workspaces/pages/WorkspacesListPage').then((m) => ({\n default: m.WorkspacesListPage,\n }))\n);\nconst WorkspaceCreatePage = lazy(() =>\n import('./modules/workspaces/pages/WorkspaceCreatePage').then((m) => ({\n default: m.WorkspaceCreatePage,\n }))\n);\nconst WorkspaceDetailPage = lazy(() =>\n import('./modules/workspaces/pages/WorkspaceDetailPage').then((m) => ({\n default: m.WorkspaceDetailPage,\n }))\n);\nconst WorkspaceEditPage = lazy(() =>\n import('./modules/workspaces/pages/WorkspaceEditPage').then((m) => ({\n default: m.WorkspaceEditPage,\n }))\n);\n\n// Members - lazy load all\nconst MembersListPage = lazy(() =>\n import('./modules/members/pages/MembersListPage').then((m) => ({ default: m.MembersListPage }))\n);\nconst MemberDetailPage = lazy(() =>\n import('./modules/members/pages/MemberDetailPage').then((m) => ({ default: m.MemberDetailPage }))\n);\nconst InviteMemberPage = lazy(() =>\n import('./modules/members/pages/InviteMemberPage').then((m) => ({ default: m.InviteMemberPage }))\n);\nconst MyInvitesPage = lazy(() =>\n import('./modules/members/pages/MyInvitesPage').then((m) => ({ default: m.MyInvitesPage }))\n);\n\n/**\n * Loading fallback for lazy-loaded pages\n */\nfunction PageLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center min-h-[200px]\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-[var(--color-border-default)] border-t-[var(--color-action-primary-bg)]\" />\n </div>\n );\n}\n\n/**\n * AdminOrganizationRoutes\n *\n * Full admin routing surface for the organization management MFE,\n * mounted by the admin application. Exposes all pages:\n * organizations CRUD, workspaces CRUD, members management, and\n * user-level invites.\n *\n * Routes start from root (/) since parent route is /organizations/*\n *\n * Lazy loading strategy:\n * - OrganizationsListPage: Eager loaded (main entry point)\n * - All other pages: Lazy loaded for better initial bundle size\n */\nexport function AdminOrganizationRoutes() {\n // Keep aligned with the platform feature-flag default-allow policy: an\n // unseeded flag must not disable shipped CRUDL. Explicit false still gates a\n // surface off when admins configure the flag.\n const createDetails = useFeatureFlagDetails('organization.create');\n const workspacesDetails = useFeatureFlagDetails('organization.workspaces');\n const membersDetails = useFeatureFlagDetails('organization.members');\n const inviteDetails = useFeatureFlagDetails('organization.invite');\n const createEnabled = createDetails ? Boolean(createDetails.value) : true;\n const workspacesEnabled = workspacesDetails ? Boolean(workspacesDetails.value) : true;\n const membersEnabled = membersDetails ? Boolean(membersDetails.value) : true;\n const inviteEnabled = inviteDetails ? Boolean(inviteDetails.value) : true;\n\n return (\n <Suspense fallback={<PageLoadingFallback />}>\n <Routes>\n {/* Organizations - index is the list (eager loaded) */}\n <Route index element={<OrganizationsListPage />} />\n {createEnabled && <Route path=\"new\" element={<OrganizationCreatePage />} />}\n <Route path=\":id\" element={<OrganizationDetailPage />} />\n <Route path=\":id/edit\" element={<OrganizationEditPage />} />\n\n {/* Workspaces */}\n {workspacesEnabled && <Route path=\"workspaces\" element={<WorkspacesListPage />} />}\n {workspacesEnabled && <Route path=\"workspaces/new\" element={<WorkspaceCreatePage />} />}\n {workspacesEnabled && <Route path=\"workspaces/:id\" element={<WorkspaceDetailPage />} />}\n {workspacesEnabled && <Route path=\"workspaces/:id/edit\" element={<WorkspaceEditPage />} />}\n\n {/* My Invites - user-level, not org-scoped */}\n <Route path=\"invites\" element={<MyInvitesPage />} />\n\n {/* Member routes - scoped under organization ID */}\n {/* Invite route is matched before generic :userId, so declare it first */}\n {inviteEnabled && (\n <Route path=\":organizationId/members/invite\" element={<InviteMemberPage />} />\n )}\n {membersEnabled && <Route path=\":organizationId/members\" element={<MembersListPage />} />}\n {membersEnabled && (\n <Route path=\":organizationId/members/:userId\" element={<MemberDetailPage />} />\n )}\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":";;;;;;AAQA,IAAM,IAAyB,QAC7B,OAAO,2DAAwD,MAAM,OAAO,EAC1E,SAAS,EAAE,wBACZ,EAAE,CACJ,EACK,IAAyB,QAC7B,OAAO,2DAAwD,MAAM,OAAO,EAC1E,SAAS,EAAE,wBACZ,EAAE,CACJ,EACK,IAAuB,QAC3B,OAAO,yDAAsD,MAAM,OAAO,EACxE,SAAS,EAAE,sBACZ,EAAE,CACJ,EAGK,IAAqB,QACzB,OAAO,oDAAiD,MAAM,OAAO,EACnE,SAAS,EAAE,oBACZ,EAAE,CACJ,EACK,IAAsB,QAC1B,OAAO,qDAAkD,MAAM,OAAO,EACpE,SAAS,EAAE,qBACZ,EAAE,CACJ,EACK,IAAsB,QAC1B,OAAO,qDAAkD,MAAM,OAAO,EACpE,SAAS,EAAE,qBACZ,EAAE,CACJ,EACK,IAAoB,QACxB,OAAO,mDAAgD,MAAM,OAAO,EAClE,SAAS,EAAE,mBACZ,EAAE,CACJ,EAGK,IAAkB,QACtB,OAAO,8CAA2C,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAChG,EACK,IAAmB,QACvB,OAAO,+CAA4C,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAClG,EACK,IAAmB,QACvB,OAAO,+CAA4C,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAClG,EACK,IAAgB,QACpB,OAAO,4CAAyC,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAC5F;AAKD,SAAS,IAAsB;AAC7B,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,6HAA8H,CAAA;EACzI,CAAA;;AAkBV,SAAgB,IAA0B;CAIxC,IAAM,IAAgB,EAAsB,sBAAsB,EAC5D,IAAoB,EAAsB,0BAA0B,EACpE,IAAiB,EAAsB,uBAAuB,EAC9D,IAAgB,EAAsB,sBAAsB,EAC5D,IAAgB,IAAgB,EAAQ,EAAc,QAAS,IAC/D,IAAoB,IAAoB,EAAQ,EAAkB,QAAS,IAC3E,IAAiB,IAAiB,EAAQ,EAAe,QAAS,IAClE,IAAgB,IAAgB,EAAQ,EAAc,QAAS;AAErE,QACE,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;YACzC,kBAAC,GAAD,EAAA,UAAA;
|
|
1
|
+
{"version":3,"file":"AdminOrganizationRoutes.js","names":[],"sources":["../../src/organization-management/AdminOrganizationRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Route, Routes } from 'react-router-dom';\nimport { useFeatureFlagDetails } from '@burdenoff/fe-libs/shared/feature-flags';\n\n// Eager load - main entry point page\nimport { OrganizationsListPage } from './modules/organizations/pages/OrganizationsListPage';\n\n// Lazy load - secondary pages\nconst OrganizationCreatePage = lazy(() =>\n import('./modules/organizations/pages/OrganizationCreatePage').then((m) => ({\n default: m.OrganizationCreatePage,\n }))\n);\nconst OrganizationDetailPage = lazy(() =>\n import('./modules/organizations/pages/OrganizationDetailPage').then((m) => ({\n default: m.OrganizationDetailPage,\n }))\n);\nconst OrganizationEditPage = lazy(() =>\n import('./modules/organizations/pages/OrganizationEditPage').then((m) => ({\n default: m.OrganizationEditPage,\n }))\n);\n\n// Workspaces - lazy load all\nconst WorkspacesListPage = lazy(() =>\n import('./modules/workspaces/pages/WorkspacesListPage').then((m) => ({\n default: m.WorkspacesListPage,\n }))\n);\nconst WorkspaceCreatePage = lazy(() =>\n import('./modules/workspaces/pages/WorkspaceCreatePage').then((m) => ({\n default: m.WorkspaceCreatePage,\n }))\n);\nconst WorkspaceDetailPage = lazy(() =>\n import('./modules/workspaces/pages/WorkspaceDetailPage').then((m) => ({\n default: m.WorkspaceDetailPage,\n }))\n);\nconst WorkspaceEditPage = lazy(() =>\n import('./modules/workspaces/pages/WorkspaceEditPage').then((m) => ({\n default: m.WorkspaceEditPage,\n }))\n);\n\n// Members - lazy load all\nconst MembersListPage = lazy(() =>\n import('./modules/members/pages/MembersListPage').then((m) => ({ default: m.MembersListPage }))\n);\nconst MemberDetailPage = lazy(() =>\n import('./modules/members/pages/MemberDetailPage').then((m) => ({ default: m.MemberDetailPage }))\n);\nconst InviteMemberPage = lazy(() =>\n import('./modules/members/pages/InviteMemberPage').then((m) => ({ default: m.InviteMemberPage }))\n);\nconst MyInvitesPage = lazy(() =>\n import('./modules/members/pages/MyInvitesPage').then((m) => ({ default: m.MyInvitesPage }))\n);\n\n/**\n * Loading fallback for lazy-loaded pages\n */\nfunction PageLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center min-h-[200px]\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-[var(--color-border-default)] border-t-[var(--color-action-primary-bg)]\" />\n </div>\n );\n}\n\n/**\n * AdminOrganizationRoutes\n *\n * Full admin routing surface for the organization management MFE,\n * mounted by the admin application. Exposes all pages:\n * organizations CRUD, workspaces CRUD, members management, and\n * user-level invites.\n *\n * Routes start from root (/) since parent route is /organizations/*\n *\n * Lazy loading strategy:\n * - OrganizationsListPage: Eager loaded (main entry point)\n * - All other pages: Lazy loaded for better initial bundle size\n */\nexport function AdminOrganizationRoutes() {\n // Keep aligned with the platform feature-flag default-allow policy: an\n // unseeded flag must not disable shipped CRUDL. Explicit false still gates a\n // surface off when admins configure the flag.\n const createDetails = useFeatureFlagDetails('organization.create');\n const workspacesDetails = useFeatureFlagDetails('organization.workspaces');\n const membersDetails = useFeatureFlagDetails('organization.members');\n const inviteDetails = useFeatureFlagDetails('organization.invite');\n const createEnabled = createDetails ? Boolean(createDetails.value) : true;\n const workspacesEnabled = workspacesDetails ? Boolean(workspacesDetails.value) : true;\n const membersEnabled = membersDetails ? Boolean(membersDetails.value) : true;\n const inviteEnabled = inviteDetails ? Boolean(inviteDetails.value) : true;\n\n return (\n <Suspense fallback={<PageLoadingFallback />}>\n <Routes>\n {/* Organizations - index is the list (eager loaded). Admin app\n renders the platform-wide list (organizations query); product-app\n shells mounting this page should leave the default `mode=\"my\"`. */}\n <Route index element={<OrganizationsListPage mode=\"admin\" />} />\n {createEnabled && <Route path=\"new\" element={<OrganizationCreatePage />} />}\n <Route path=\":id\" element={<OrganizationDetailPage />} />\n <Route path=\":id/edit\" element={<OrganizationEditPage />} />\n\n {/* Workspaces */}\n {workspacesEnabled && <Route path=\"workspaces\" element={<WorkspacesListPage />} />}\n {workspacesEnabled && <Route path=\"workspaces/new\" element={<WorkspaceCreatePage />} />}\n {workspacesEnabled && <Route path=\"workspaces/:id\" element={<WorkspaceDetailPage />} />}\n {workspacesEnabled && <Route path=\"workspaces/:id/edit\" element={<WorkspaceEditPage />} />}\n\n {/* My Invites - user-level, not org-scoped */}\n <Route path=\"invites\" element={<MyInvitesPage />} />\n\n {/* Member routes - scoped under organization ID */}\n {/* Invite route is matched before generic :userId, so declare it first */}\n {inviteEnabled && (\n <Route path=\":organizationId/members/invite\" element={<InviteMemberPage />} />\n )}\n {membersEnabled && <Route path=\":organizationId/members\" element={<MembersListPage />} />}\n {membersEnabled && (\n <Route path=\":organizationId/members/:userId\" element={<MemberDetailPage />} />\n )}\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,11 @@ import { Organization, OrganizationFilterInput, CreateOrganizationInput, UpdateO
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Hook to fetch organizations with filtering and pagination
|
|
5
|
+
*
|
|
6
|
+
* @deprecated Calls the platform-wide `organizations` admin query — which is
|
|
7
|
+
* gated by global RBAC perm and will be removed once callers migrate. For the
|
|
8
|
+
* end-user "my orgs" view use `useMyOrganizations`. For the admin "all orgs"
|
|
9
|
+
* view (once the admin app pages land) use the upcoming `useAllOrganizations`.
|
|
5
10
|
*/
|
|
6
11
|
export declare function useOrganizations(filter?: OrganizationFilterInput, limit?: number, offset?: number, enabled?: boolean): {
|
|
7
12
|
organizations: Organization[];
|
|
@@ -19,6 +24,33 @@ export declare function useOrganizations(filter?: OrganizationFilterInput, limit
|
|
|
19
24
|
}) => any) | undefined;
|
|
20
25
|
}) => Promise<import('@apollo/client').ApolloQueryResult<TFetchData>>;
|
|
21
26
|
};
|
|
27
|
+
/**
|
|
28
|
+
* Hook to fetch organizations the current user is a member of (owned + added to).
|
|
29
|
+
*
|
|
30
|
+
* Backed by the `myOrganizations` query which uses @rbac(scopeType: "self") —
|
|
31
|
+
* authenticated user only, no permission check, resolver filters by actorId.
|
|
32
|
+
* Use this in product-app contexts where the user should see *their* orgs.
|
|
33
|
+
*
|
|
34
|
+
* Filter input is intentionally not supported — `myOrganizations` returns the
|
|
35
|
+
* full membership list and any further filtering should be done client-side
|
|
36
|
+
* (or via a future `myOrganizationsFiltered` query if the use-case warrants it).
|
|
37
|
+
*/
|
|
38
|
+
export declare function useMyOrganizations(limit?: number, offset?: number, enabled?: boolean): {
|
|
39
|
+
organizations: Organization[];
|
|
40
|
+
total: any;
|
|
41
|
+
limit: any;
|
|
42
|
+
offset: any;
|
|
43
|
+
hasMore: any;
|
|
44
|
+
loading: boolean;
|
|
45
|
+
error: import('@apollo/client').ApolloError | undefined;
|
|
46
|
+
refetch: (variables?: any) => Promise<import('@apollo/client').ApolloQueryResult<Types.GetMyOrganizationsQuery>>;
|
|
47
|
+
fetchMore: <TFetchData = Types.GetMyOrganizationsQuery, TFetchVars extends import('@apollo/client').OperationVariables = Types.GetMyOrganizationsQueryVariables>(fetchMoreOptions: import('@apollo/client').FetchMoreQueryOptions<TFetchVars, TFetchData> & {
|
|
48
|
+
updateQuery?: ((previousQueryResult: any, options: {
|
|
49
|
+
fetchMoreResult: import('@apollo/client').Unmasked<TFetchData>;
|
|
50
|
+
variables: TFetchVars;
|
|
51
|
+
}) => any) | undefined;
|
|
52
|
+
}) => Promise<import('@apollo/client').ApolloQueryResult<TFetchData>>;
|
|
53
|
+
};
|
|
22
54
|
/**
|
|
23
55
|
* Hook to fetch a single organization by ID
|
|
24
56
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOrganizations.d.ts","sourceRoot":"","sources":["../../../../../src/organization-management/modules/organizations/hooks/useOrganizations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useOrganizations.d.ts","sourceRoot":"","sources":["../../../../../src/organization-management/modules/organizations/hooks/useOrganizations.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AA8BlB;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,CAAC,EAAE,uBAAuB,EAChC,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,EAClB,OAAO,GAAE,OAAc;;;;;;;;;;;;;;;EAoBxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,EAClB,OAAO,GAAE,OAAc;;;;;;;;;;;;;;;EAyBxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM;;;;;EAgBzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;kBAStB,YAAY,GAAG,SAAS;;;;EAKrE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,MAAM,GAAE,MAAU;;;;;;;;;;;;;;;EAmBhG;AAED;;GAEG;AACH,wBAAgB,qBAAqB;gCAKC,uBAAuB;;;;EAuC5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB;6BAKF,MAAM,SAAS,uBAAuB;;;;EAuCxE;AAED;;GAEG;AACH,wBAAgB,qBAAqB;6BAKF,MAAM;;;;EAuCxC"}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { useCreateOrganizationMutation as e, useDeleteOrganizationMutation as t,
|
|
2
|
-
import { useOrganizationEventEmitter as
|
|
3
|
-
import { logger as
|
|
4
|
-
import { executeRecaptcha as
|
|
1
|
+
import { useCreateOrganizationMutation as e, useDeleteOrganizationMutation as t, useGetMyOrganizationsQuery as n, useGetOrganizationQuery as r, useGetOrganizationsQuery as i, useUpdateOrganizationMutation as a } from "../../../../generated/global-operations.js";
|
|
2
|
+
import { useOrganizationEventEmitter as o } from "../../../hooks/useOrganizationEventEmitter.js";
|
|
3
|
+
import { logger as s, redactId as c } from "../../../shared/logger.js";
|
|
4
|
+
import { executeRecaptcha as l } from "../../../shared/recaptcha.js";
|
|
5
5
|
//#region src/organization-management/modules/organizations/hooks/useOrganizations.ts
|
|
6
|
-
function
|
|
6
|
+
function u(e) {
|
|
7
7
|
return e?.graphQLErrors?.[0]?.extensions?.code;
|
|
8
8
|
}
|
|
9
|
-
function
|
|
9
|
+
function d(e) {
|
|
10
10
|
return e instanceof Error ? e.message : e?.message ?? "Unknown error";
|
|
11
11
|
}
|
|
12
|
-
function
|
|
13
|
-
let { data: a, loading: o, error: s, refetch: c, fetchMore: l } =
|
|
12
|
+
function f(e, t = 20, n = 0, r = !0) {
|
|
13
|
+
let { data: a, loading: o, error: s, refetch: c, fetchMore: l } = i({
|
|
14
14
|
variables: {
|
|
15
15
|
filter: e,
|
|
16
16
|
limit: t,
|
|
17
17
|
offset: n
|
|
18
18
|
},
|
|
19
|
-
skip: !
|
|
19
|
+
skip: !r,
|
|
20
20
|
fetchPolicy: "cache-first",
|
|
21
21
|
nextFetchPolicy: "cache-first"
|
|
22
22
|
});
|
|
@@ -32,8 +32,30 @@ function d(e, t = 20, n = 0, i = !0) {
|
|
|
32
32
|
fetchMore: l
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
function
|
|
36
|
-
let { data:
|
|
35
|
+
function p(e = 20, t = 0, r = !0) {
|
|
36
|
+
let { data: i, loading: a, error: o, refetch: s, fetchMore: c } = n({
|
|
37
|
+
variables: {
|
|
38
|
+
limit: e,
|
|
39
|
+
offset: t
|
|
40
|
+
},
|
|
41
|
+
skip: !r,
|
|
42
|
+
fetchPolicy: "cache-and-network",
|
|
43
|
+
nextFetchPolicy: "cache-first"
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
organizations: i?.myOrganizations?.items || [],
|
|
47
|
+
total: i?.myOrganizations?.total || 0,
|
|
48
|
+
limit: i?.myOrganizations?.limit || e,
|
|
49
|
+
offset: i?.myOrganizations?.offset || t,
|
|
50
|
+
hasMore: i?.myOrganizations?.hasMore || !1,
|
|
51
|
+
loading: a,
|
|
52
|
+
error: o,
|
|
53
|
+
refetch: s,
|
|
54
|
+
fetchMore: c
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function m(e) {
|
|
58
|
+
let { data: t, loading: n, error: i, refetch: a } = r({
|
|
37
59
|
variables: { id: e },
|
|
38
60
|
skip: !e,
|
|
39
61
|
fetchPolicy: "cache-first",
|
|
@@ -41,35 +63,35 @@ function f(e) {
|
|
|
41
63
|
}), o = t?.organization;
|
|
42
64
|
return {
|
|
43
65
|
organization: o,
|
|
44
|
-
loading:
|
|
66
|
+
loading: n && !o,
|
|
45
67
|
error: i,
|
|
46
68
|
refetch: a
|
|
47
69
|
};
|
|
48
70
|
}
|
|
49
|
-
function
|
|
50
|
-
let { emit: t } =
|
|
71
|
+
function h() {
|
|
72
|
+
let { emit: t } = o(), [n, { data: r, loading: i, error: a }] = e();
|
|
51
73
|
return {
|
|
52
74
|
createOrganization: async (e) => {
|
|
53
|
-
|
|
75
|
+
s.info("mutation.start", { name: "createOrganization" });
|
|
54
76
|
try {
|
|
55
|
-
let r = await
|
|
77
|
+
let r = await l("organization_create"), i = await n({ variables: { input: {
|
|
56
78
|
...e,
|
|
57
79
|
...r ? { recaptchaToken: r } : {}
|
|
58
80
|
} } }), a = i.data?.createOrganization?.id;
|
|
59
81
|
return t("organization.created", {
|
|
60
82
|
organizationId: a,
|
|
61
83
|
source: "microfe-organization"
|
|
62
|
-
}),
|
|
84
|
+
}), s.info("mutation.success", {
|
|
63
85
|
name: "createOrganization",
|
|
64
|
-
organizationId:
|
|
86
|
+
organizationId: c(a)
|
|
65
87
|
}), i;
|
|
66
88
|
} catch (e) {
|
|
67
|
-
let n =
|
|
89
|
+
let n = u(e), r = d(e);
|
|
68
90
|
throw t("organization.create_failed", {
|
|
69
91
|
source: "microfe-organization",
|
|
70
92
|
errorCode: n,
|
|
71
93
|
errorMessage: r
|
|
72
|
-
}),
|
|
94
|
+
}), s.error("mutation.failed", {
|
|
73
95
|
name: "createOrganization",
|
|
74
96
|
errorCode: n,
|
|
75
97
|
errorMessage: r
|
|
@@ -78,16 +100,16 @@ function p() {
|
|
|
78
100
|
},
|
|
79
101
|
data: r,
|
|
80
102
|
loading: i,
|
|
81
|
-
error:
|
|
103
|
+
error: a
|
|
82
104
|
};
|
|
83
105
|
}
|
|
84
|
-
function
|
|
85
|
-
let { emit: e } =
|
|
106
|
+
function g() {
|
|
107
|
+
let { emit: e } = o(), [t, { data: n, loading: r, error: i }] = a();
|
|
86
108
|
return {
|
|
87
109
|
updateOrganization: async (n, r) => {
|
|
88
|
-
|
|
110
|
+
s.info("mutation.start", {
|
|
89
111
|
name: "updateOrganization",
|
|
90
|
-
organizationId:
|
|
112
|
+
organizationId: c(n)
|
|
91
113
|
});
|
|
92
114
|
try {
|
|
93
115
|
let i = await t({ variables: {
|
|
@@ -97,20 +119,20 @@ function m() {
|
|
|
97
119
|
return e("organization.updated", {
|
|
98
120
|
organizationId: n,
|
|
99
121
|
source: "microfe-organization"
|
|
100
|
-
}),
|
|
122
|
+
}), s.info("mutation.success", {
|
|
101
123
|
name: "updateOrganization",
|
|
102
|
-
organizationId:
|
|
124
|
+
organizationId: c(n)
|
|
103
125
|
}), i;
|
|
104
126
|
} catch (t) {
|
|
105
|
-
let r =
|
|
127
|
+
let r = u(t), i = d(t);
|
|
106
128
|
throw e("organization.update_failed", {
|
|
107
129
|
organizationId: n,
|
|
108
130
|
source: "microfe-organization",
|
|
109
131
|
errorCode: r,
|
|
110
132
|
errorMessage: i
|
|
111
|
-
}),
|
|
133
|
+
}), s.error("mutation.failed", {
|
|
112
134
|
name: "updateOrganization",
|
|
113
|
-
organizationId:
|
|
135
|
+
organizationId: c(n),
|
|
114
136
|
errorCode: r,
|
|
115
137
|
errorMessage: i
|
|
116
138
|
}, t), t;
|
|
@@ -118,36 +140,36 @@ function m() {
|
|
|
118
140
|
},
|
|
119
141
|
data: n,
|
|
120
142
|
loading: r,
|
|
121
|
-
error:
|
|
143
|
+
error: i
|
|
122
144
|
};
|
|
123
145
|
}
|
|
124
|
-
function
|
|
125
|
-
let { emit: e } =
|
|
146
|
+
function _() {
|
|
147
|
+
let { emit: e } = o(), [n, { data: r, loading: i, error: a }] = t();
|
|
126
148
|
return {
|
|
127
149
|
deleteOrganization: async (t) => {
|
|
128
|
-
|
|
150
|
+
s.info("mutation.start", {
|
|
129
151
|
name: "deleteOrganization",
|
|
130
|
-
organizationId:
|
|
152
|
+
organizationId: c(t)
|
|
131
153
|
});
|
|
132
154
|
try {
|
|
133
155
|
let r = await n({ variables: { id: t } });
|
|
134
156
|
return e("organization.deleted", {
|
|
135
157
|
organizationId: t,
|
|
136
158
|
source: "microfe-organization"
|
|
137
|
-
}),
|
|
159
|
+
}), s.info("mutation.success", {
|
|
138
160
|
name: "deleteOrganization",
|
|
139
|
-
organizationId:
|
|
161
|
+
organizationId: c(t)
|
|
140
162
|
}), r;
|
|
141
163
|
} catch (n) {
|
|
142
|
-
let r =
|
|
164
|
+
let r = u(n), i = d(n);
|
|
143
165
|
throw e("organization.delete_failed", {
|
|
144
166
|
organizationId: t,
|
|
145
167
|
source: "microfe-organization",
|
|
146
168
|
errorCode: r,
|
|
147
169
|
errorMessage: i
|
|
148
|
-
}),
|
|
170
|
+
}), s.error("mutation.failed", {
|
|
149
171
|
name: "deleteOrganization",
|
|
150
|
-
organizationId:
|
|
172
|
+
organizationId: c(t),
|
|
151
173
|
errorCode: r,
|
|
152
174
|
errorMessage: i
|
|
153
175
|
}, n), n;
|
|
@@ -155,10 +177,10 @@ function h() {
|
|
|
155
177
|
},
|
|
156
178
|
data: r,
|
|
157
179
|
loading: i,
|
|
158
|
-
error:
|
|
180
|
+
error: a
|
|
159
181
|
};
|
|
160
182
|
}
|
|
161
183
|
//#endregion
|
|
162
|
-
export {
|
|
184
|
+
export { h as useCreateOrganization, _ as useDeleteOrganization, p as useMyOrganizations, m as useOrganization, f as useOrganizations, g as useUpdateOrganization };
|
|
163
185
|
|
|
164
186
|
//# sourceMappingURL=useOrganizations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOrganizations.js","names":[],"sources":["../../../../../src/organization-management/modules/organizations/hooks/useOrganizations.ts"],"sourcesContent":["import {\n useGetOrganizationsQuery,\n useGetOrganizationQuery,\n useGetOrganizationBySlugQuery,\n useGetOrganizationsByTenantQuery,\n useCreateOrganizationMutation,\n useUpdateOrganizationMutation,\n useDeleteOrganizationMutation,\n} from '../../../../generated/global-operations';\nimport type {\n Organization,\n OrganizationFilterInput,\n CreateOrganizationInput,\n UpdateOrganizationInput,\n} from '../types';\nimport { useOrganizationEventEmitter } from '../../../hooks/useOrganizationEventEmitter';\nimport { logger, redactId } from '../../../shared/logger';\nimport { executeRecaptcha } from '../../../shared/recaptcha';\n\ninterface GraphqlExtensions {\n code?: string;\n}\n\ninterface GraphqlError {\n message?: string;\n extensions?: GraphqlExtensions;\n}\n\ninterface ApolloLikeError {\n message?: string;\n graphQLErrors?: ReadonlyArray<GraphqlError>;\n}\n\nfunction extractErrorCode(error: unknown): string | undefined {\n const apolloError = error as ApolloLikeError | undefined;\n return apolloError?.graphQLErrors?.[0]?.extensions?.code;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n const apolloError = error as ApolloLikeError | undefined;\n return apolloError?.message ?? 'Unknown error';\n}\n\n/**\n * Hook to fetch organizations with filtering and pagination\n */\nexport function useOrganizations(\n filter?: OrganizationFilterInput,\n limit: number = 20,\n offset: number = 0,\n enabled: boolean = true\n) {\n const { data, loading, error, refetch, fetchMore } = useGetOrganizationsQuery({\n variables: { filter, limit, offset },\n skip: !enabled,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n return {\n organizations: (data?.organizations?.items as Organization[]) || [],\n total: data?.organizations?.total || 0,\n limit: data?.organizations?.limit || limit,\n offset: data?.organizations?.offset || offset,\n hasMore: data?.organizations?.hasMore || false,\n loading,\n error,\n refetch,\n fetchMore,\n };\n}\n\n/**\n * Hook to fetch a single organization by ID\n */\nexport function useOrganization(id: string) {\n const { data, loading, error, refetch } = useGetOrganizationQuery({\n variables: { id },\n skip: !id,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n const organization = data?.organization as Organization | undefined;\n\n return {\n organization,\n loading: loading && !organization,\n error,\n refetch,\n };\n}\n\n/**\n * Hook to fetch an organization by slug\n */\nexport function useOrganizationBySlug(tenantId: string, slug: string) {\n const { data, loading, error, refetch } = useGetOrganizationBySlugQuery({\n variables: { tenantId, slug },\n skip: !tenantId || !slug,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n return {\n organization: data?.organizationBySlug as Organization | undefined,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Hook to fetch organizations by tenant ID\n */\nexport function useOrganizationsByTenant(tenantId: string, limit: number = 20, offset: number = 0) {\n const { data, loading, error, refetch, fetchMore } = useGetOrganizationsByTenantQuery({\n variables: { tenantId, limit, offset },\n skip: !tenantId,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n return {\n organizations: (data?.organizations?.items as Organization[]) || [],\n total: data?.organizations?.total || 0,\n limit: data?.organizations?.limit || limit,\n offset: data?.organizations?.offset || offset,\n hasMore: data?.organizations?.hasMore || false,\n loading,\n error,\n refetch,\n fetchMore,\n };\n}\n\n/**\n * Hook to create a new organization\n */\nexport function useCreateOrganization() {\n const { emit } = useOrganizationEventEmitter();\n const [createOrganization, { data, loading, error }] = useCreateOrganizationMutation();\n\n return {\n createOrganization: async (input: CreateOrganizationInput) => {\n logger.info('mutation.start', { name: 'createOrganization' });\n try {\n const recaptchaToken = await executeRecaptcha('organization_create');\n const result = await createOrganization({\n variables: {\n input: {\n ...input,\n ...(recaptchaToken ? { recaptchaToken } : {}),\n },\n },\n });\n const organizationId = result.data?.createOrganization?.id;\n emit('organization.created', { organizationId, source: 'microfe-organization' });\n logger.info('mutation.success', {\n name: 'createOrganization',\n organizationId: redactId(organizationId),\n });\n return result;\n } catch (mutationError) {\n const errorCode = extractErrorCode(mutationError);\n const errorMessage = extractErrorMessage(mutationError);\n emit('organization.create_failed', {\n source: 'microfe-organization',\n errorCode,\n errorMessage,\n });\n logger.error(\n 'mutation.failed',\n { name: 'createOrganization', errorCode, errorMessage },\n mutationError\n );\n throw mutationError;\n }\n },\n data,\n loading,\n error,\n };\n}\n\n/**\n * Hook to update an organization\n */\nexport function useUpdateOrganization() {\n const { emit } = useOrganizationEventEmitter();\n const [updateOrganization, { data, loading, error }] = useUpdateOrganizationMutation();\n\n return {\n updateOrganization: async (id: string, input: UpdateOrganizationInput) => {\n logger.info('mutation.start', {\n name: 'updateOrganization',\n organizationId: redactId(id),\n });\n try {\n const result = await updateOrganization({ variables: { id, input } });\n emit('organization.updated', { organizationId: id, source: 'microfe-organization' });\n logger.info('mutation.success', {\n name: 'updateOrganization',\n organizationId: redactId(id),\n });\n return result;\n } catch (mutationError) {\n const errorCode = extractErrorCode(mutationError);\n const errorMessage = extractErrorMessage(mutationError);\n emit('organization.update_failed', {\n organizationId: id,\n source: 'microfe-organization',\n errorCode,\n errorMessage,\n });\n logger.error(\n 'mutation.failed',\n {\n name: 'updateOrganization',\n organizationId: redactId(id),\n errorCode,\n errorMessage,\n },\n mutationError\n );\n throw mutationError;\n }\n },\n data,\n loading,\n error,\n };\n}\n\n/**\n * Hook to delete an organization\n */\nexport function useDeleteOrganization() {\n const { emit } = useOrganizationEventEmitter();\n const [deleteOrganization, { data, loading, error }] = useDeleteOrganizationMutation();\n\n return {\n deleteOrganization: async (id: string) => {\n logger.info('mutation.start', {\n name: 'deleteOrganization',\n organizationId: redactId(id),\n });\n try {\n const result = await deleteOrganization({ variables: { id } });\n emit('organization.deleted', { organizationId: id, source: 'microfe-organization' });\n logger.info('mutation.success', {\n name: 'deleteOrganization',\n organizationId: redactId(id),\n });\n return result;\n } catch (mutationError) {\n const errorCode = extractErrorCode(mutationError);\n const errorMessage = extractErrorMessage(mutationError);\n emit('organization.delete_failed', {\n organizationId: id,\n source: 'microfe-organization',\n errorCode,\n errorMessage,\n });\n logger.error(\n 'mutation.failed',\n {\n name: 'deleteOrganization',\n organizationId: redactId(id),\n errorCode,\n errorMessage,\n },\n mutationError\n );\n throw mutationError;\n }\n },\n data,\n loading,\n error,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useOrganizations.js","names":[],"sources":["../../../../../src/organization-management/modules/organizations/hooks/useOrganizations.ts"],"sourcesContent":["import {\n useGetOrganizationsQuery,\n useGetMyOrganizationsQuery,\n useGetOrganizationQuery,\n useGetOrganizationBySlugQuery,\n useGetOrganizationsByTenantQuery,\n useCreateOrganizationMutation,\n useUpdateOrganizationMutation,\n useDeleteOrganizationMutation,\n} from '../../../../generated/global-operations';\nimport type {\n Organization,\n OrganizationFilterInput,\n CreateOrganizationInput,\n UpdateOrganizationInput,\n} from '../types';\nimport { useOrganizationEventEmitter } from '../../../hooks/useOrganizationEventEmitter';\nimport { logger, redactId } from '../../../shared/logger';\nimport { executeRecaptcha } from '../../../shared/recaptcha';\n\ninterface GraphqlExtensions {\n code?: string;\n}\n\ninterface GraphqlError {\n message?: string;\n extensions?: GraphqlExtensions;\n}\n\ninterface ApolloLikeError {\n message?: string;\n graphQLErrors?: ReadonlyArray<GraphqlError>;\n}\n\nfunction extractErrorCode(error: unknown): string | undefined {\n const apolloError = error as ApolloLikeError | undefined;\n return apolloError?.graphQLErrors?.[0]?.extensions?.code;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n const apolloError = error as ApolloLikeError | undefined;\n return apolloError?.message ?? 'Unknown error';\n}\n\n/**\n * Hook to fetch organizations with filtering and pagination\n *\n * @deprecated Calls the platform-wide `organizations` admin query — which is\n * gated by global RBAC perm and will be removed once callers migrate. For the\n * end-user \"my orgs\" view use `useMyOrganizations`. For the admin \"all orgs\"\n * view (once the admin app pages land) use the upcoming `useAllOrganizations`.\n */\nexport function useOrganizations(\n filter?: OrganizationFilterInput,\n limit: number = 20,\n offset: number = 0,\n enabled: boolean = true\n) {\n const { data, loading, error, refetch, fetchMore } = useGetOrganizationsQuery({\n variables: { filter, limit, offset },\n skip: !enabled,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n return {\n organizations: (data?.organizations?.items as Organization[]) || [],\n total: data?.organizations?.total || 0,\n limit: data?.organizations?.limit || limit,\n offset: data?.organizations?.offset || offset,\n hasMore: data?.organizations?.hasMore || false,\n loading,\n error,\n refetch,\n fetchMore,\n };\n}\n\n/**\n * Hook to fetch organizations the current user is a member of (owned + added to).\n *\n * Backed by the `myOrganizations` query which uses @rbac(scopeType: \"self\") —\n * authenticated user only, no permission check, resolver filters by actorId.\n * Use this in product-app contexts where the user should see *their* orgs.\n *\n * Filter input is intentionally not supported — `myOrganizations` returns the\n * full membership list and any further filtering should be done client-side\n * (or via a future `myOrganizationsFiltered` query if the use-case warrants it).\n */\nexport function useMyOrganizations(\n limit: number = 20,\n offset: number = 0,\n enabled: boolean = true\n) {\n const { data, loading, error, refetch, fetchMore } = useGetMyOrganizationsQuery({\n variables: { limit, offset },\n skip: !enabled,\n // First mount: use cache if present, then revalidate from the network in\n // the background. Subsequent renders within the same session reuse the\n // cache. This keeps the list fresh when the user navigates back after\n // accepting an invite in another tab without paying the round-trip on\n // every re-render.\n fetchPolicy: 'cache-and-network',\n nextFetchPolicy: 'cache-first',\n });\n\n return {\n organizations: (data?.myOrganizations?.items as Organization[]) || [],\n total: data?.myOrganizations?.total || 0,\n limit: data?.myOrganizations?.limit || limit,\n offset: data?.myOrganizations?.offset || offset,\n hasMore: data?.myOrganizations?.hasMore || false,\n loading,\n error,\n refetch,\n fetchMore,\n };\n}\n\n/**\n * Hook to fetch a single organization by ID\n */\nexport function useOrganization(id: string) {\n const { data, loading, error, refetch } = useGetOrganizationQuery({\n variables: { id },\n skip: !id,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n const organization = data?.organization as Organization | undefined;\n\n return {\n organization,\n loading: loading && !organization,\n error,\n refetch,\n };\n}\n\n/**\n * Hook to fetch an organization by slug\n */\nexport function useOrganizationBySlug(tenantId: string, slug: string) {\n const { data, loading, error, refetch } = useGetOrganizationBySlugQuery({\n variables: { tenantId, slug },\n skip: !tenantId || !slug,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n return {\n organization: data?.organizationBySlug as Organization | undefined,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Hook to fetch organizations by tenant ID\n */\nexport function useOrganizationsByTenant(tenantId: string, limit: number = 20, offset: number = 0) {\n const { data, loading, error, refetch, fetchMore } = useGetOrganizationsByTenantQuery({\n variables: { tenantId, limit, offset },\n skip: !tenantId,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n return {\n organizations: (data?.organizations?.items as Organization[]) || [],\n total: data?.organizations?.total || 0,\n limit: data?.organizations?.limit || limit,\n offset: data?.organizations?.offset || offset,\n hasMore: data?.organizations?.hasMore || false,\n loading,\n error,\n refetch,\n fetchMore,\n };\n}\n\n/**\n * Hook to create a new organization\n */\nexport function useCreateOrganization() {\n const { emit } = useOrganizationEventEmitter();\n const [createOrganization, { data, loading, error }] = useCreateOrganizationMutation();\n\n return {\n createOrganization: async (input: CreateOrganizationInput) => {\n logger.info('mutation.start', { name: 'createOrganization' });\n try {\n const recaptchaToken = await executeRecaptcha('organization_create');\n const result = await createOrganization({\n variables: {\n input: {\n ...input,\n ...(recaptchaToken ? { recaptchaToken } : {}),\n },\n },\n });\n const organizationId = result.data?.createOrganization?.id;\n emit('organization.created', { organizationId, source: 'microfe-organization' });\n logger.info('mutation.success', {\n name: 'createOrganization',\n organizationId: redactId(organizationId),\n });\n return result;\n } catch (mutationError) {\n const errorCode = extractErrorCode(mutationError);\n const errorMessage = extractErrorMessage(mutationError);\n emit('organization.create_failed', {\n source: 'microfe-organization',\n errorCode,\n errorMessage,\n });\n logger.error(\n 'mutation.failed',\n { name: 'createOrganization', errorCode, errorMessage },\n mutationError\n );\n throw mutationError;\n }\n },\n data,\n loading,\n error,\n };\n}\n\n/**\n * Hook to update an organization\n */\nexport function useUpdateOrganization() {\n const { emit } = useOrganizationEventEmitter();\n const [updateOrganization, { data, loading, error }] = useUpdateOrganizationMutation();\n\n return {\n updateOrganization: async (id: string, input: UpdateOrganizationInput) => {\n logger.info('mutation.start', {\n name: 'updateOrganization',\n organizationId: redactId(id),\n });\n try {\n const result = await updateOrganization({ variables: { id, input } });\n emit('organization.updated', { organizationId: id, source: 'microfe-organization' });\n logger.info('mutation.success', {\n name: 'updateOrganization',\n organizationId: redactId(id),\n });\n return result;\n } catch (mutationError) {\n const errorCode = extractErrorCode(mutationError);\n const errorMessage = extractErrorMessage(mutationError);\n emit('organization.update_failed', {\n organizationId: id,\n source: 'microfe-organization',\n errorCode,\n errorMessage,\n });\n logger.error(\n 'mutation.failed',\n {\n name: 'updateOrganization',\n organizationId: redactId(id),\n errorCode,\n errorMessage,\n },\n mutationError\n );\n throw mutationError;\n }\n },\n data,\n loading,\n error,\n };\n}\n\n/**\n * Hook to delete an organization\n */\nexport function useDeleteOrganization() {\n const { emit } = useOrganizationEventEmitter();\n const [deleteOrganization, { data, loading, error }] = useDeleteOrganizationMutation();\n\n return {\n deleteOrganization: async (id: string) => {\n logger.info('mutation.start', {\n name: 'deleteOrganization',\n organizationId: redactId(id),\n });\n try {\n const result = await deleteOrganization({ variables: { id } });\n emit('organization.deleted', { organizationId: id, source: 'microfe-organization' });\n logger.info('mutation.success', {\n name: 'deleteOrganization',\n organizationId: redactId(id),\n });\n return result;\n } catch (mutationError) {\n const errorCode = extractErrorCode(mutationError);\n const errorMessage = extractErrorMessage(mutationError);\n emit('organization.delete_failed', {\n organizationId: id,\n source: 'microfe-organization',\n errorCode,\n errorMessage,\n });\n logger.error(\n 'mutation.failed',\n {\n name: 'deleteOrganization',\n organizationId: redactId(id),\n errorCode,\n errorMessage,\n },\n mutationError\n );\n throw mutationError;\n }\n },\n data,\n loading,\n error,\n };\n}\n"],"mappings":";;;;;AAkCA,SAAS,EAAiB,GAAoC;AAE5D,QADoB,GACA,gBAAgB,IAAI,YAAY;;AAGtD,SAAS,EAAoB,GAAwB;AAGnD,QAFI,aAAiB,QAAc,EAAM,UACrB,GACA,WAAW;;AAWjC,SAAgB,EACd,GACA,IAAgB,IAChB,IAAiB,GACjB,IAAmB,IACnB;CACA,IAAM,EAAE,SAAM,YAAS,UAAO,YAAS,iBAAc,EAAyB;EAC5E,WAAW;GAAE;GAAQ;GAAO;GAAQ;EACpC,MAAM,CAAC;EACP,aAAa;EACb,iBAAiB;EAClB,CAAC;AAEF,QAAO;EACL,eAAgB,GAAM,eAAe,SAA4B,EAAE;EACnE,OAAO,GAAM,eAAe,SAAS;EACrC,OAAO,GAAM,eAAe,SAAS;EACrC,QAAQ,GAAM,eAAe,UAAU;EACvC,SAAS,GAAM,eAAe,WAAW;EACzC;EACA;EACA;EACA;EACD;;AAcH,SAAgB,EACd,IAAgB,IAChB,IAAiB,GACjB,IAAmB,IACnB;CACA,IAAM,EAAE,SAAM,YAAS,UAAO,YAAS,iBAAc,EAA2B;EAC9E,WAAW;GAAE;GAAO;GAAQ;EAC5B,MAAM,CAAC;EAMP,aAAa;EACb,iBAAiB;EAClB,CAAC;AAEF,QAAO;EACL,eAAgB,GAAM,iBAAiB,SAA4B,EAAE;EACrE,OAAO,GAAM,iBAAiB,SAAS;EACvC,OAAO,GAAM,iBAAiB,SAAS;EACvC,QAAQ,GAAM,iBAAiB,UAAU;EACzC,SAAS,GAAM,iBAAiB,WAAW;EAC3C;EACA;EACA;EACA;EACD;;AAMH,SAAgB,EAAgB,GAAY;CAC1C,IAAM,EAAE,SAAM,YAAS,UAAO,eAAY,EAAwB;EAChE,WAAW,EAAE,OAAI;EACjB,MAAM,CAAC;EACP,aAAa;EACb,iBAAiB;EAClB,CAAC,EAEI,IAAe,GAAM;AAE3B,QAAO;EACL;EACA,SAAS,KAAW,CAAC;EACrB;EACA;EACD;;AAiDH,SAAgB,IAAwB;CACtC,IAAM,EAAE,YAAS,GAA6B,EACxC,CAAC,GAAoB,EAAE,SAAM,YAAS,cAAW,GAA+B;AAEtF,QAAO;EACL,oBAAoB,OAAO,MAAmC;AAC5D,KAAO,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAI;IACF,IAAM,IAAiB,MAAM,EAAiB,sBAAsB,EAC9D,IAAS,MAAM,EAAmB,EACtC,WAAW,EACT,OAAO;KACL,GAAG;KACH,GAAI,IAAiB,EAAE,mBAAgB,GAAG,EAAE;KAC7C,EACF,EACF,CAAC,EACI,IAAiB,EAAO,MAAM,oBAAoB;AAMxD,WALA,EAAK,wBAAwB;KAAE;KAAgB,QAAQ;KAAwB,CAAC,EAChF,EAAO,KAAK,oBAAoB;KAC9B,MAAM;KACN,gBAAgB,EAAS,EAAe;KACzC,CAAC,EACK;YACA,GAAe;IACtB,IAAM,IAAY,EAAiB,EAAc,EAC3C,IAAe,EAAoB,EAAc;AAWvD,UAVA,EAAK,8BAA8B;KACjC,QAAQ;KACR;KACA;KACD,CAAC,EACF,EAAO,MACL,mBACA;KAAE,MAAM;KAAsB;KAAW;KAAc,EACvD,EACD,EACK;;;EAGV;EACA;EACA;EACD;;AAMH,SAAgB,IAAwB;CACtC,IAAM,EAAE,YAAS,GAA6B,EACxC,CAAC,GAAoB,EAAE,SAAM,YAAS,cAAW,GAA+B;AAEtF,QAAO;EACL,oBAAoB,OAAO,GAAY,MAAmC;AACxE,KAAO,KAAK,kBAAkB;IAC5B,MAAM;IACN,gBAAgB,EAAS,EAAG;IAC7B,CAAC;AACF,OAAI;IACF,IAAM,IAAS,MAAM,EAAmB,EAAE,WAAW;KAAE;KAAI;KAAO,EAAE,CAAC;AAMrE,WALA,EAAK,wBAAwB;KAAE,gBAAgB;KAAI,QAAQ;KAAwB,CAAC,EACpF,EAAO,KAAK,oBAAoB;KAC9B,MAAM;KACN,gBAAgB,EAAS,EAAG;KAC7B,CAAC,EACK;YACA,GAAe;IACtB,IAAM,IAAY,EAAiB,EAAc,EAC3C,IAAe,EAAoB,EAAc;AAiBvD,UAhBA,EAAK,8BAA8B;KACjC,gBAAgB;KAChB,QAAQ;KACR;KACA;KACD,CAAC,EACF,EAAO,MACL,mBACA;KACE,MAAM;KACN,gBAAgB,EAAS,EAAG;KAC5B;KACA;KACD,EACD,EACD,EACK;;;EAGV;EACA;EACA;EACD;;AAMH,SAAgB,IAAwB;CACtC,IAAM,EAAE,YAAS,GAA6B,EACxC,CAAC,GAAoB,EAAE,SAAM,YAAS,cAAW,GAA+B;AAEtF,QAAO;EACL,oBAAoB,OAAO,MAAe;AACxC,KAAO,KAAK,kBAAkB;IAC5B,MAAM;IACN,gBAAgB,EAAS,EAAG;IAC7B,CAAC;AACF,OAAI;IACF,IAAM,IAAS,MAAM,EAAmB,EAAE,WAAW,EAAE,OAAI,EAAE,CAAC;AAM9D,WALA,EAAK,wBAAwB;KAAE,gBAAgB;KAAI,QAAQ;KAAwB,CAAC,EACpF,EAAO,KAAK,oBAAoB;KAC9B,MAAM;KACN,gBAAgB,EAAS,EAAG;KAC7B,CAAC,EACK;YACA,GAAe;IACtB,IAAM,IAAY,EAAiB,EAAc,EAC3C,IAAe,EAAoB,EAAc;AAiBvD,UAhBA,EAAK,8BAA8B;KACjC,gBAAgB;KAChB,QAAQ;KACR;KACA;KACD,CAAC,EACF,EAAO,MACL,mBACA;KACE,MAAM;KACN,gBAAgB,EAAS,EAAG;KAC5B;KACA;KACD,EACD,EACD,EACK;;;EAGV;EACA;EACA;EACD"}
|
|
@@ -1,2 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* `mode` controls which scope of organizations the page renders:
|
|
3
|
+
*
|
|
4
|
+
* - `'my'` (default) calls `myOrganizations` (gateway @rbac(scopeType:"self")).
|
|
5
|
+
* Use this in product-app shells (e.g. vibecontrols) where the user should
|
|
6
|
+
* see only orgs they are a member of. Membership IS the access list, so no
|
|
7
|
+
* client-side permission gate is needed.
|
|
8
|
+
*
|
|
9
|
+
* - `'admin'` calls the legacy `organizations` query (gateway @rbac(scopeType:
|
|
10
|
+
* "global")). Restricted to actors with global `organization:read` (super
|
|
11
|
+
* admins / service / custom global-admin roles). Use this in the admin app
|
|
12
|
+
* where operators need the tenant-wide list. Once `allOrganizations` is
|
|
13
|
+
* published through Hive Cloud + codegen, switch to `useAllOrganizations`.
|
|
14
|
+
*/
|
|
15
|
+
export interface OrganizationsListPageProps {
|
|
16
|
+
mode?: 'my' | 'admin';
|
|
17
|
+
}
|
|
18
|
+
export declare function OrganizationsListPage({ mode }?: OrganizationsListPageProps): import("react/jsx-runtime").JSX.Element;
|
|
2
19
|
//# sourceMappingURL=OrganizationsListPage.d.ts.map
|
package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrganizationsListPage.d.ts","sourceRoot":"","sources":["../../../../../src/organization-management/modules/organizations/pages/OrganizationsListPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OrganizationsListPage.d.ts","sourceRoot":"","sources":["../../../../../src/organization-management/modules/organizations/pages/OrganizationsListPage.tsx"],"names":[],"mappings":"AAkCA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,IAAW,EAAE,GAAE,0BAA+B,2CA6iBrF"}
|