@burdenoff/microfe-organization 2026.616.1 → 2026.624.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/organization-management/AdminOrganizationRoot.js +4 -4
  2. package/dist/organization-management/AdminOrganizationRoot.js.map +1 -1
  3. package/dist/organization-management/UserOrganizationRoot.js +4 -4
  4. package/dist/organization-management/UserOrganizationRoot.js.map +1 -1
  5. package/dist/organization-management/modules/members/components/BulkInviteForm.js +157 -176
  6. package/dist/organization-management/modules/members/components/BulkInviteForm.js.map +1 -1
  7. package/dist/organization-management/modules/members/components/InviteMemberForm.js +2 -2
  8. package/dist/organization-management/modules/members/components/InviteMemberForm.js.map +1 -1
  9. package/dist/organization-management/modules/members/components/MyInviteCard.js +2 -2
  10. package/dist/organization-management/modules/members/components/MyInviteCard.js.map +1 -1
  11. package/dist/organization-management/modules/members/components/PendingInvitesList.js +78 -101
  12. package/dist/organization-management/modules/members/components/PendingInvitesList.js.map +1 -1
  13. package/dist/organization-management/modules/members/pages/InvitePeoplePage.js +1 -1
  14. package/dist/organization-management/modules/members/pages/InvitePeoplePage.js.map +1 -1
  15. package/dist/organization-management/modules/members/pages/MemberDetailPage.js +2 -2
  16. package/dist/organization-management/modules/members/pages/MemberDetailPage.js.map +1 -1
  17. package/dist/organization-management/modules/members/pages/MembersListPage.js +3 -3
  18. package/dist/organization-management/modules/members/pages/MembersListPage.js.map +1 -1
  19. package/dist/organization-management/modules/members/pages/MyInvitesPage.js +2 -2
  20. package/dist/organization-management/modules/members/pages/MyInvitesPage.js.map +1 -1
  21. package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js +5 -5
  22. package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js.map +1 -1
  23. package/dist/organization-management/modules/organizations/components/OrganizationForm.js +2 -2
  24. package/dist/organization-management/modules/organizations/components/OrganizationForm.js.map +1 -1
  25. package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js +2 -2
  26. package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js.map +1 -1
  27. package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js +4 -4
  28. package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js.map +1 -1
  29. package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js +2 -2
  30. package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js.map +1 -1
  31. package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js +5 -5
  32. package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js.map +1 -1
  33. package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js +3 -3
  34. package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js.map +1 -1
  35. package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js +2 -2
  36. package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js.map +1 -1
  37. package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js +2 -2
  38. package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js.map +1 -1
  39. package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js +215 -285
  40. package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js.map +1 -1
  41. package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js +2 -2
  42. package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js.map +1 -1
  43. package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js +4 -4
  44. package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js.map +1 -1
  45. package/dist/organization-management/shared/components/feedback/EmptyState.js +2 -2
  46. package/dist/organization-management/shared/components/feedback/EmptyState.js.map +1 -1
  47. package/dist/organization-management/shared/components/feedback/ErrorState.js +2 -2
  48. package/dist/organization-management/shared/components/feedback/ErrorState.js.map +1 -1
  49. package/dist/organization-management/shared/components/feedback/LoadingState.js +1 -1
  50. package/dist/organization-management/shared/components/feedback/LoadingState.js.map +1 -1
  51. package/dist/organization-management/shared/components/input/SearchInput.js +1 -1
  52. package/dist/organization-management/shared/components/input/SearchInput.js.map +1 -1
  53. package/package.json +1 -1
@@ -7,7 +7,7 @@ import { FeatureFlagProvider as c } from "@burdenoff/fe-libs/shared/feature-flag
7
7
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
8
  //#region src/organization-management/AdminOrganizationRoot.tsx
9
9
  var d = (d) => {
10
- let { registerNavItems: f, registerFooterItems: p, basePath: m = "/organizations" } = d, h = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
10
+ let { registerNavItems: f, registerFooterItems: p, basePath: m = "/organizations", renderToaster: h = !1 } = d, g = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
11
11
  return n(() => {
12
12
  if (f) return f([
13
13
  {
@@ -21,7 +21,7 @@ var d = (d) => {
21
21
  {
22
22
  id: "admin-org-workspaces",
23
23
  label: "Workspaces",
24
- path: h(m, "/workspaces"),
24
+ path: g(m, "/workspaces"),
25
25
  icon: /* @__PURE__ */ l(r, { size: 20 }),
26
26
  order: 40,
27
27
  group: "globalconsole"
@@ -37,7 +37,7 @@ var d = (d) => {
37
37
  {
38
38
  id: "admin-org-invites",
39
39
  label: "My Invites",
40
- path: h(m, "/invites"),
40
+ path: g(m, "/invites"),
41
41
  icon: /* @__PURE__ */ l(a, { size: 20 }),
42
42
  order: 60,
43
43
  group: "globalconsole"
@@ -57,7 +57,7 @@ var d = (d) => {
57
57
  defaultEnabled: !0,
58
58
  children: /* @__PURE__ */ u(e, {
59
59
  ...d,
60
- children: [/* @__PURE__ */ l(t, {}), /* @__PURE__ */ l(s, {
60
+ children: [/* @__PURE__ */ l(t, {}), h && /* @__PURE__ */ l(s, {
61
61
  position: "top-right",
62
62
  richColors: !0,
63
63
  closeButton: !0
@@ -1 +1 @@
1
- {"version":3,"file":"AdminOrganizationRoot.js","names":[],"sources":["../../src/organization-management/AdminOrganizationRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { Building, Briefcase, Mail, Users } from 'lucide-react';\nimport { Toaster } from '@burdenoff/fe-libs/ui';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { OrgConsoleProvider } from './providers/OrgConsoleProvider';\nimport type { NavItem, OrganizationRootProps } from './types';\nimport { AdminOrganizationRoutes } from './AdminOrganizationRoutes';\n\n/**\n * AdminOrganizationRoot\n *\n * Full-capability root for the organization management MFE, intended to\n * be mounted inside the admin application. Exposes organizations,\n * workspaces, members, and invites management — registering nav items\n * for each top-level surface with IDs prefixed `admin-org-*`.\n *\n * Takes the same props as `OrganizationRootProps` so hosts can\n * swap between the user and admin roots without adapter code.\n */\nexport const AdminOrganizationRoot: FC<OrganizationRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/organizations' } = props;\n\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'admin-org-organizations',\n label: 'Organizations',\n path: basePath,\n icon: <Building size={20} />,\n order: 30,\n group: 'globalconsole',\n },\n {\n id: 'admin-org-workspaces',\n label: 'Workspaces',\n path: joinPath(basePath, '/workspaces'),\n icon: <Briefcase size={20} />,\n order: 40,\n group: 'globalconsole',\n },\n {\n id: 'admin-org-members',\n label: 'Members',\n // Members are accessed through org detail pages; point at orgs\n // list so admins have a discoverable entry point in the\n // top-level nav.\n path: basePath,\n icon: <Users size={20} />,\n order: 50,\n group: 'globalconsole',\n },\n {\n id: 'admin-org-invites',\n label: 'My Invites',\n path: joinPath(basePath, '/invites'),\n icon: <Mail size={20} />,\n order: 60,\n group: 'globalconsole',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [registerNavItems, basePath]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'organization-management-version',\n label: 'Organization Management v0.1.0',\n type: 'status' as const,\n order: 30,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems]);\n\n return (\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <OrgConsoleProvider {...props}>\n <AdminOrganizationRoutes />\n <Toaster position=\"top-right\" richColors closeButton />\n </OrgConsoleProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;AAoBA,IAAa,KAAoD,MAAU;CACzE,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,qBAAqB,GAEzE,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAkEtD,QA9DA,QAAgB;AACT,QAyCL,QADgB,EAtCY;GAC1B;IACE,IAAI;IACJ,OAAO;IACP,MAAM;IACN,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IAIP,MAAM;IACN,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IACxB,OAAO;IACP,OAAO;IACR;GACF,CAEyC;IAEzC,CAAC,GAAkB,EAAS,CAAC,EAEhC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,EAAoB,CAAC,EAGvB,kBAAC,GAAD;EAAqB,aAAa;EAAM,SAAQ;EAAS,gBAAgB;YACvE,kBAAC,GAAD;GAAoB,GAAI;aAAxB,CACE,kBAAC,GAAD,EAA2B,CAAA,EAC3B,kBAAC,GAAD;IAAS,UAAS;IAAY,YAAA;IAAW,aAAA;IAAc,CAAA,CACpC;;EACD,CAAA"}
1
+ {"version":3,"file":"AdminOrganizationRoot.js","names":[],"sources":["../../src/organization-management/AdminOrganizationRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { Building, Briefcase, Mail, Users } from 'lucide-react';\nimport { Toaster } from '@burdenoff/fe-libs/ui';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { OrgConsoleProvider } from './providers/OrgConsoleProvider';\nimport type { NavItem, OrganizationRootProps } from './types';\nimport { AdminOrganizationRoutes } from './AdminOrganizationRoutes';\n\n/**\n * AdminOrganizationRoot\n *\n * Full-capability root for the organization management MFE, intended to\n * be mounted inside the admin application. Exposes organizations,\n * workspaces, members, and invites management — registering nav items\n * for each top-level surface with IDs prefixed `admin-org-*`.\n *\n * Takes the same props as `OrganizationRootProps` so hosts can\n * swap between the user and admin roots without adapter code.\n */\nexport const AdminOrganizationRoot: FC<OrganizationRootProps> = (props) => {\n const {\n registerNavItems,\n registerFooterItems,\n basePath = '/organizations',\n renderToaster = false,\n } = props;\n\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'admin-org-organizations',\n label: 'Organizations',\n path: basePath,\n icon: <Building size={20} />,\n order: 30,\n group: 'globalconsole',\n },\n {\n id: 'admin-org-workspaces',\n label: 'Workspaces',\n path: joinPath(basePath, '/workspaces'),\n icon: <Briefcase size={20} />,\n order: 40,\n group: 'globalconsole',\n },\n {\n id: 'admin-org-members',\n label: 'Members',\n // Members are accessed through org detail pages; point at orgs\n // list so admins have a discoverable entry point in the\n // top-level nav.\n path: basePath,\n icon: <Users size={20} />,\n order: 50,\n group: 'globalconsole',\n },\n {\n id: 'admin-org-invites',\n label: 'My Invites',\n path: joinPath(basePath, '/invites'),\n icon: <Mail size={20} />,\n order: 60,\n group: 'globalconsole',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [registerNavItems, basePath]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'organization-management-version',\n label: 'Organization Management v0.1.0',\n type: 'status' as const,\n order: 30,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems]);\n\n return (\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <OrgConsoleProvider {...props}>\n <AdminOrganizationRoutes />\n {renderToaster && <Toaster position=\"top-right\" richColors closeButton />}\n </OrgConsoleProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;AAoBA,IAAa,KAAoD,MAAU;CACzE,IAAM,EACJ,qBACA,wBACA,cAAW,kBACX,mBAAgB,OACd,GAEE,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAkEtD,QA9DA,QAAgB;AACT,QAyCL,QADgB,EAtCY;GAC1B;IACE,IAAI;IACJ,OAAO;IACP,MAAM;IACN,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IAIP,MAAM;IACN,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IACxB,OAAO;IACP,OAAO;IACR;GACF,CAEyC;IAEzC,CAAC,GAAkB,EAAS,CAAC,EAEhC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,EAAoB,CAAC,EAGvB,kBAAC,GAAD;EAAqB,aAAa;EAAM,SAAQ;EAAS,gBAAgB;YACvE,kBAAC,GAAD;GAAoB,GAAI;aAAxB,CACE,kBAAC,GAAD,EAA2B,CAAA,EAC1B,KAAiB,kBAAC,GAAD;IAAS,UAAS;IAAY,YAAA;IAAW,aAAA;IAAc,CAAA,CACtD;;EACD,CAAA"}
@@ -7,7 +7,7 @@ import { FeatureFlagProvider as s } from "@burdenoff/fe-libs/shared/feature-flag
7
7
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
8
  //#region src/organization-management/UserOrganizationRoot.tsx
9
9
  var u = (u) => {
10
- let { registerNavItems: d, registerFooterItems: f, basePath: p = "/organizations" } = u, m = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
10
+ let { registerNavItems: d, registerFooterItems: f, basePath: p = "/organizations", renderToaster: m = !1 } = u, h = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
11
11
  return n(() => {
12
12
  if (d) return d([
13
13
  {
@@ -21,7 +21,7 @@ var u = (u) => {
21
21
  {
22
22
  id: "user-org-invite-people",
23
23
  label: "Invite People",
24
- path: m(p, "/invite"),
24
+ path: h(p, "/invite"),
25
25
  icon: /* @__PURE__ */ c(a, { size: 20 }),
26
26
  order: 25,
27
27
  group: "user"
@@ -29,7 +29,7 @@ var u = (u) => {
29
29
  {
30
30
  id: "user-org-invites",
31
31
  label: "My Invites",
32
- path: m(p, "/invites"),
32
+ path: h(p, "/invites"),
33
33
  icon: /* @__PURE__ */ c(i, { size: 20 }),
34
34
  order: 30,
35
35
  group: "user"
@@ -49,7 +49,7 @@ var u = (u) => {
49
49
  defaultEnabled: !0,
50
50
  children: /* @__PURE__ */ l(e, {
51
51
  ...u,
52
- children: [/* @__PURE__ */ c(t, {}), /* @__PURE__ */ c(o, {
52
+ children: [/* @__PURE__ */ c(t, {}), m && /* @__PURE__ */ c(o, {
53
53
  position: "top-right",
54
54
  richColors: !0,
55
55
  closeButton: !0
@@ -1 +1 @@
1
- {"version":3,"file":"UserOrganizationRoot.js","names":[],"sources":["../../src/organization-management/UserOrganizationRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { Building2, Mail, UserPlus } from 'lucide-react';\nimport { Toaster } from '@burdenoff/fe-libs/ui';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { OrgConsoleProvider } from './providers/OrgConsoleProvider';\nimport type { NavItem, OrganizationRootProps } from './types';\nimport { UserOrganizationRoutes } from './UserOrganizationRoutes';\n\n/**\n * UserOrganizationRoot\n *\n * User-facing root for the organization management MFE, intended to be\n * mounted inside product shells (workspaces, botlit, fluidgrids, etc.).\n *\n * Exposes the membership-scoped organization surface:\n * - Organizations list (`mode=\"my\"` → `myOrganizations`)\n * - Organization detail / edit (per-action `hasPermission` gates;\n * backend enforces membership on `organization(id)` resolver)\n * - Members list / detail / invite (backend enforces membership on\n * `organizationMembers` resolver)\n * - My pending invites\n *\n * Registers \"Organizations\" + \"My Invites\" nav items.\n *\n * Takes the same props as `OrganizationRootProps` so hosts can swap\n * between the user and admin roots without adapter code.\n */\nexport const UserOrganizationRoot: FC<OrganizationRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/organizations' } = props;\n\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'user-org-organizations',\n label: 'Organizations',\n path: basePath,\n icon: <Building2 size={20} />,\n order: 20,\n group: 'user',\n },\n {\n id: 'user-org-invite-people',\n label: 'Invite People',\n path: joinPath(basePath, '/invite'),\n icon: <UserPlus size={20} />,\n order: 25,\n group: 'user',\n },\n {\n id: 'user-org-invites',\n label: 'My Invites',\n path: joinPath(basePath, '/invites'),\n icon: <Mail size={20} />,\n order: 30,\n group: 'user',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [registerNavItems, basePath]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'user-organization-version',\n label: 'Organization (User) v0.1.0',\n type: 'status' as const,\n order: 30,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems]);\n\n return (\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <OrgConsoleProvider {...props}>\n <UserOrganizationRoutes />\n <Toaster position=\"top-right\" richColors closeButton />\n </OrgConsoleProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;AA4BA,IAAa,KAAmD,MAAU;CACxE,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,qBAAqB,GAEzE,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAuDtD,QAnDA,QAAgB;AACT,QA8BL,QADgB,EA3BY;GAC1B;IACE,IAAI;IACJ,OAAO;IACP,MAAM;IACN,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IACxB,OAAO;IACP,OAAO;IACR;GACF,CAEyC;IAEzC,CAAC,GAAkB,EAAS,CAAC,EAEhC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,EAAoB,CAAC,EAGvB,kBAAC,GAAD;EAAqB,aAAa;EAAM,SAAQ;EAAS,gBAAgB;YACvE,kBAAC,GAAD;GAAoB,GAAI;aAAxB,CACE,kBAAC,GAAD,EAA0B,CAAA,EAC1B,kBAAC,GAAD;IAAS,UAAS;IAAY,YAAA;IAAW,aAAA;IAAc,CAAA,CACpC;;EACD,CAAA"}
1
+ {"version":3,"file":"UserOrganizationRoot.js","names":[],"sources":["../../src/organization-management/UserOrganizationRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { Building2, Mail, UserPlus } from 'lucide-react';\nimport { Toaster } from '@burdenoff/fe-libs/ui';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { OrgConsoleProvider } from './providers/OrgConsoleProvider';\nimport type { NavItem, OrganizationRootProps } from './types';\nimport { UserOrganizationRoutes } from './UserOrganizationRoutes';\n\n/**\n * UserOrganizationRoot\n *\n * User-facing root for the organization management MFE, intended to be\n * mounted inside product shells (workspaces, botlit, fluidgrids, etc.).\n *\n * Exposes the membership-scoped organization surface:\n * - Organizations list (`mode=\"my\"` → `myOrganizations`)\n * - Organization detail / edit (per-action `hasPermission` gates;\n * backend enforces membership on `organization(id)` resolver)\n * - Members list / detail / invite (backend enforces membership on\n * `organizationMembers` resolver)\n * - My pending invites\n *\n * Registers \"Organizations\" + \"My Invites\" nav items.\n *\n * Takes the same props as `OrganizationRootProps` so hosts can swap\n * between the user and admin roots without adapter code.\n */\nexport const UserOrganizationRoot: FC<OrganizationRootProps> = (props) => {\n const {\n registerNavItems,\n registerFooterItems,\n basePath = '/organizations',\n renderToaster = false,\n } = props;\n\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'user-org-organizations',\n label: 'Organizations',\n path: basePath,\n icon: <Building2 size={20} />,\n order: 20,\n group: 'user',\n },\n {\n id: 'user-org-invite-people',\n label: 'Invite People',\n path: joinPath(basePath, '/invite'),\n icon: <UserPlus size={20} />,\n order: 25,\n group: 'user',\n },\n {\n id: 'user-org-invites',\n label: 'My Invites',\n path: joinPath(basePath, '/invites'),\n icon: <Mail size={20} />,\n order: 30,\n group: 'user',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [registerNavItems, basePath]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'user-organization-version',\n label: 'Organization (User) v0.1.0',\n type: 'status' as const,\n order: 30,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems]);\n\n return (\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <OrgConsoleProvider {...props}>\n <UserOrganizationRoutes />\n {renderToaster && <Toaster position=\"top-right\" richColors closeButton />}\n </OrgConsoleProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;AA4BA,IAAa,KAAmD,MAAU;CACxE,IAAM,EACJ,qBACA,wBACA,cAAW,kBACX,mBAAgB,OACd,GAEE,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAuDtD,QAnDA,QAAgB;AACT,QA8BL,QADgB,EA3BY;GAC1B;IACE,IAAI;IACJ,OAAO;IACP,MAAM;IACN,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IACxB,OAAO;IACP,OAAO;IACR;GACF,CAEyC;IAEzC,CAAC,GAAkB,EAAS,CAAC,EAEhC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,EAAoB,CAAC,EAGvB,kBAAC,GAAD;EAAqB,aAAa;EAAM,SAAQ;EAAS,gBAAgB;YACvE,kBAAC,GAAD;GAAoB,GAAI;aAAxB,CACE,kBAAC,GAAD,EAA0B,CAAA,EACzB,KAAiB,kBAAC,GAAD;IAAS,UAAS;IAAY,YAAA;IAAW,aAAA;IAAc,CAAA,CACtD;;EACD,CAAA"}
@@ -3,57 +3,58 @@ import { useTr as t } from "../../../shared/hooks/useTr.js";
3
3
  import { downloadTemplate as n, formatInviteError as r, parseBulkInviteCsv as i } from "../utils/bulkInviteCsv.js";
4
4
  import { useCallback as a, useMemo as o, useRef as s, useState as c } from "react";
5
5
  import { CheckCircle2 as l, Download as u, Loader2 as d, Send as f, Upload as p, XCircle as m } from "lucide-react";
6
- import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
6
+ import { ResponsiveTable as h } from "@burdenoff/fe-libs/ui";
7
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
7
8
  //#region src/organization-management/modules/members/components/BulkInviteForm.tsx
8
- function v({ organizationId: v, inviteMember: y, onCancel: b, loading: x }) {
9
- let S = t(), C = s(null), [w, T] = c([]), [E, D] = c(null), [O, k] = c(!1), [A, j] = c(!1), M = a((t) => {
9
+ function y({ organizationId: y, inviteMember: b, onCancel: x, loading: S }) {
10
+ let C = t(), w = s(null), [T, E] = c([]), [D, O] = c(null), [k, A] = c(!1), [j, M] = c(!1), N = a((t) => {
10
11
  let n = new FileReader();
11
12
  n.onload = () => {
12
- T(i(typeof n.result == "string" ? n.result : "").map((e) => ({
13
+ E(i(typeof n.result == "string" ? n.result : "").map((e) => ({
13
14
  ...e,
14
15
  status: { kind: "idle" }
15
- }))), D(t.name);
16
+ }))), O(t.name);
16
17
  }, n.onerror = () => {
17
- e.error(S("members.bulkInvite.readError", "Failed to read CSV file."));
18
+ e.error(C("members.bulkInvite.readError", "Failed to read CSV file."));
18
19
  }, n.readAsText(t);
19
- }, [S]), N = (e) => {
20
+ }, [C]), P = (e) => {
20
21
  let t = e.target.files?.[0];
21
- t && M(t), e.target.value = "";
22
- }, P = (e) => {
23
- e.preventDefault(), j(!1);
22
+ t && N(t), e.target.value = "";
23
+ }, F = (e) => {
24
+ e.preventDefault(), M(!1);
24
25
  let t = e.dataTransfer.files?.[0];
25
- t && M(t);
26
- }, F = o(() => ({
27
- total: w.length,
28
- withErrors: w.filter((e) => e.errors.length > 0).length,
29
- sendable: w.filter((e) => e.errors.length === 0).length,
30
- invited: w.filter((e) => e.status.kind === "invited").length,
31
- failed: w.filter((e) => e.status.kind === "failed").length
32
- }), [w]), I = async () => {
33
- if (F.sendable === 0 || O) return;
34
- k(!0);
35
- let t = w.map((e, t) => ({
26
+ t && N(t);
27
+ }, I = o(() => ({
28
+ total: T.length,
29
+ withErrors: T.filter((e) => e.errors.length > 0).length,
30
+ sendable: T.filter((e) => e.errors.length === 0).length,
31
+ invited: T.filter((e) => e.status.kind === "invited").length,
32
+ failed: T.filter((e) => e.status.kind === "failed").length
33
+ }), [T]), L = async () => {
34
+ if (I.sendable === 0 || k) return;
35
+ A(!0);
36
+ let t = T.map((e, t) => ({
36
37
  r: e,
37
38
  idx: t
38
39
  })).filter(({ r: e }) => e.errors.length === 0 && e.status.kind !== "invited");
39
40
  for (let { idx: e } of t) {
40
- T((t) => t.map((t, n) => n === e ? {
41
+ E((t) => t.map((t, n) => n === e ? {
41
42
  ...t,
42
43
  status: { kind: "sending" }
43
44
  } : t));
44
- let t = w[e];
45
+ let t = T[e];
45
46
  try {
46
- await y({
47
- organizationId: v,
47
+ await b({
48
+ organizationId: y,
48
49
  email: t.email,
49
50
  message: t.message
50
- }), T((t) => t.map((t, n) => n === e ? {
51
+ }), E((t) => t.map((t, n) => n === e ? {
51
52
  ...t,
52
53
  status: { kind: "invited" }
53
54
  } : t));
54
55
  } catch (t) {
55
- let n = r(t, S);
56
- T((t) => t.map((t, r) => r === e ? {
56
+ let n = r(t, C);
57
+ E((t) => t.map((t, r) => r === e ? {
57
58
  ...t,
58
59
  status: {
59
60
  kind: "failed",
@@ -62,230 +63,210 @@ function v({ organizationId: v, inviteMember: y, onCancel: b, loading: x }) {
62
63
  } : t));
63
64
  }
64
65
  }
65
- k(!1), T((t) => {
66
+ A(!1), E((t) => {
66
67
  let n = t.filter((e) => e.status.kind === "invited").length, r = t.filter((e) => e.status.kind === "failed").length;
67
- return e.success(`${S("members.bulkInvite.summaryInvited", "Invited")} ${n} ${S("members.bulkInvite.summaryOf", "of")} ${t.length}. ${r} ${S("members.bulkInvite.summaryFailed", "failed")}.`), t;
68
+ return e.success(`${C("members.bulkInvite.summaryInvited", "Invited")} ${n} ${C("members.bulkInvite.summaryOf", "of")} ${t.length}. ${r} ${C("members.bulkInvite.summaryFailed", "failed")}.`), t;
68
69
  });
69
- }, L = w.length > 0, R = F.sendable > 0 && !O && !x;
70
- return /* @__PURE__ */ _("div", {
70
+ }, R = T.length > 0, z = I.sendable > 0 && !k && !S, B = (e) => e.errors.length > 0 ? /* @__PURE__ */ v("span", {
71
+ className: "inline-flex items-center gap-1 text-[var(--color-status-error-text)]",
72
+ children: [/* @__PURE__ */ _(m, {
73
+ size: 14,
74
+ "aria-hidden": "true"
75
+ }), e.errors.join(" ")]
76
+ }) : e.status.kind === "sending" ? /* @__PURE__ */ v("span", {
77
+ className: "inline-flex items-center gap-1 text-[var(--color-text-secondary)]",
78
+ children: [/* @__PURE__ */ _(d, {
79
+ size: 14,
80
+ className: "animate-spin",
81
+ "aria-hidden": "true"
82
+ }), C("members.bulkInvite.statusSending", "Sending...")]
83
+ }) : e.status.kind === "invited" ? /* @__PURE__ */ v("span", {
84
+ className: "inline-flex items-center gap-1 text-[var(--color-status-success-text)]",
85
+ children: [/* @__PURE__ */ _(l, {
86
+ size: 14,
87
+ "aria-hidden": "true"
88
+ }), C("members.bulkInvite.statusInvited", "Invited")]
89
+ }) : e.status.kind === "failed" ? /* @__PURE__ */ v("span", {
90
+ className: "inline-flex items-center gap-1 text-[var(--color-status-error-text)]",
91
+ children: [/* @__PURE__ */ _(m, {
92
+ size: 14,
93
+ "aria-hidden": "true"
94
+ }), e.status.message]
95
+ }) : /* @__PURE__ */ _("span", {
96
+ className: "text-[var(--color-text-secondary)]",
97
+ children: C("members.bulkInvite.statusReady", "Ready")
98
+ }), V = [
99
+ {
100
+ key: "rowNumber",
101
+ header: "#",
102
+ priority: "secondary",
103
+ cell: (e) => /* @__PURE__ */ _("span", {
104
+ className: "text-xs tabular-nums text-[var(--color-text-secondary)]",
105
+ children: e.rowNumber
106
+ })
107
+ },
108
+ {
109
+ key: "email",
110
+ header: C("members.bulkInvite.colEmail", "Email"),
111
+ priority: "primary",
112
+ cell: (e) => e.email || /* @__PURE__ */ _("span", {
113
+ className: "italic text-[var(--color-text-muted)]",
114
+ children: C("members.bulkInvite.empty", "(empty)")
115
+ })
116
+ },
117
+ {
118
+ key: "role",
119
+ header: C("members.bulkInvite.colRole", "Role"),
120
+ priority: "secondary",
121
+ cell: (e) => e.role || /* @__PURE__ */ _("span", {
122
+ className: "text-[var(--color-text-muted)]",
123
+ children: "MEMBER"
124
+ })
125
+ },
126
+ {
127
+ key: "status",
128
+ header: C("members.bulkInvite.colStatus", "Status"),
129
+ priority: "secondary",
130
+ cell: (e) => B(e)
131
+ }
132
+ ];
133
+ return /* @__PURE__ */ v("div", {
71
134
  className: "space-y-5",
72
135
  children: [
73
- /* @__PURE__ */ _("div", {
136
+ /* @__PURE__ */ v("div", {
74
137
  className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
75
- children: [/* @__PURE__ */ g("p", {
138
+ children: [/* @__PURE__ */ _("p", {
76
139
  className: "text-sm text-[var(--color-text-muted)]",
77
- children: S("members.bulkInvite.description", "Upload a CSV with one row per person. Required column: email. Optional: role, message.")
78
- }), /* @__PURE__ */ _("button", {
140
+ children: C("members.bulkInvite.description", "Upload a CSV with one row per person. Required column: email. Optional: role, message.")
141
+ }), /* @__PURE__ */ v("button", {
79
142
  type: "button",
80
143
  onClick: n,
81
144
  className: "inline-flex min-h-10 items-center justify-center gap-2 rounded-lg border border-[var(--color-border-default)] px-3 py-2 text-sm text-[var(--color-text-primary)] transition-colors hover:bg-[var(--color-bg-subtle)]",
82
- children: [/* @__PURE__ */ g(u, {
145
+ children: [/* @__PURE__ */ _(u, {
83
146
  size: 16,
84
147
  "aria-hidden": "true"
85
- }), S("members.bulkInvite.downloadTemplate", "Download template")]
148
+ }), C("members.bulkInvite.downloadTemplate", "Download template")]
86
149
  })]
87
150
  }),
88
- /* @__PURE__ */ _("div", {
151
+ /* @__PURE__ */ v("div", {
89
152
  onDragOver: (e) => {
90
- e.preventDefault(), j(!0);
153
+ e.preventDefault(), M(!0);
91
154
  },
92
- onDragLeave: () => j(!1),
93
- onDrop: P,
94
- className: `flex flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed p-8 transition-colors ${A ? "border-[var(--color-action-primary-bg)] bg-[var(--color-status-info-bgSubtle)]" : "border-[var(--color-border-default)] bg-[var(--color-bg-canvas)]"}`,
155
+ onDragLeave: () => M(!1),
156
+ onDrop: F,
157
+ className: `flex flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed p-8 transition-colors ${j ? "border-[var(--color-action-primary-bg)] bg-[var(--color-status-info-bgSubtle)]" : "border-[var(--color-border-default)] bg-[var(--color-bg-canvas)]"}`,
95
158
  children: [
96
- /* @__PURE__ */ g(p, {
159
+ /* @__PURE__ */ _(p, {
97
160
  size: 28,
98
161
  className: "text-[var(--color-text-secondary)]",
99
162
  "aria-hidden": "true"
100
163
  }),
101
- /* @__PURE__ */ _("div", {
164
+ /* @__PURE__ */ v("div", {
102
165
  className: "text-center",
103
- children: [/* @__PURE__ */ g("p", {
166
+ children: [/* @__PURE__ */ _("p", {
104
167
  className: "text-sm font-medium text-[var(--color-text-primary)]",
105
- children: E || S("members.bulkInvite.dropHere", "Drop a CSV file here or click to browse")
106
- }), /* @__PURE__ */ g("p", {
168
+ children: D || C("members.bulkInvite.dropHere", "Drop a CSV file here or click to browse")
169
+ }), /* @__PURE__ */ _("p", {
107
170
  className: "mt-1 text-xs text-[var(--color-text-muted)]",
108
- children: S("members.bulkInvite.csvOnly", "CSV files only. Max 1000 rows recommended.")
171
+ children: C("members.bulkInvite.csvOnly", "CSV files only. Max 1000 rows recommended.")
109
172
  })]
110
173
  }),
111
- /* @__PURE__ */ g("input", {
112
- ref: C,
174
+ /* @__PURE__ */ _("input", {
175
+ ref: w,
113
176
  type: "file",
114
177
  accept: ".csv,text/csv",
115
- onChange: N,
178
+ onChange: P,
116
179
  className: "hidden",
117
- "aria-label": S("members.bulkInvite.fileInputLabel", "Choose CSV file")
180
+ "aria-label": C("members.bulkInvite.fileInputLabel", "Choose CSV file")
118
181
  }),
119
- /* @__PURE__ */ g("button", {
182
+ /* @__PURE__ */ _("button", {
120
183
  type: "button",
121
- onClick: () => C.current?.click(),
184
+ onClick: () => w.current?.click(),
122
185
  className: "inline-flex min-h-10 items-center justify-center gap-2 rounded-lg bg-[var(--color-action-primary-bg)] px-4 py-2 text-sm text-[var(--color-action-primary-text)] transition-all duration-200 hover:opacity-90",
123
- children: S("members.bulkInvite.chooseFile", "Choose file")
186
+ children: C("members.bulkInvite.chooseFile", "Choose file")
124
187
  })
125
188
  ]
126
189
  }),
127
- L && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ _("div", {
190
+ R && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ v("div", {
128
191
  className: "flex flex-wrap gap-4 text-xs text-[var(--color-text-secondary)]",
129
192
  children: [
130
- /* @__PURE__ */ _("span", { children: [
131
- S("members.bulkInvite.statsTotal", "Total rows"),
193
+ /* @__PURE__ */ v("span", { children: [
194
+ C("members.bulkInvite.statsTotal", "Total rows"),
132
195
  ": ",
133
- F.total
196
+ I.total
134
197
  ] }),
135
- /* @__PURE__ */ _("span", { children: [
136
- S("members.bulkInvite.statsValid", "Ready"),
198
+ /* @__PURE__ */ v("span", { children: [
199
+ C("members.bulkInvite.statsValid", "Ready"),
137
200
  ": ",
138
- F.sendable
201
+ I.sendable
139
202
  ] }),
140
- F.withErrors > 0 && /* @__PURE__ */ _("span", {
203
+ I.withErrors > 0 && /* @__PURE__ */ v("span", {
141
204
  className: "text-[var(--color-status-error-text)]",
142
205
  children: [
143
- S("members.bulkInvite.statsErrors", "With errors"),
206
+ C("members.bulkInvite.statsErrors", "With errors"),
144
207
  ": ",
145
- F.withErrors
208
+ I.withErrors
146
209
  ]
147
210
  }),
148
- F.invited > 0 && /* @__PURE__ */ _("span", {
211
+ I.invited > 0 && /* @__PURE__ */ v("span", {
149
212
  className: "text-[var(--color-status-success-text)]",
150
213
  children: [
151
- S("members.bulkInvite.statsInvited", "Invited"),
214
+ C("members.bulkInvite.statsInvited", "Invited"),
152
215
  ": ",
153
- F.invited
216
+ I.invited
154
217
  ]
155
218
  }),
156
- F.failed > 0 && /* @__PURE__ */ _("span", {
219
+ I.failed > 0 && /* @__PURE__ */ v("span", {
157
220
  className: "text-[var(--color-status-error-text)]",
158
221
  children: [
159
- S("members.bulkInvite.statsFailed", "Failed"),
222
+ C("members.bulkInvite.statsFailed", "Failed"),
160
223
  ": ",
161
- F.failed
224
+ I.failed
162
225
  ]
163
226
  })
164
227
  ]
165
- }), /* @__PURE__ */ g("div", {
166
- className: "overflow-hidden rounded-xl border border-[var(--color-border-default)]",
167
- children: /* @__PURE__ */ g("div", {
168
- className: "overflow-x-auto",
169
- children: /* @__PURE__ */ _("table", {
170
- className: "min-w-full",
171
- children: [/* @__PURE__ */ g("thead", {
172
- className: "bg-[var(--color-bg-subtle)]",
173
- children: /* @__PURE__ */ _("tr", { children: [
174
- /* @__PURE__ */ g("th", {
175
- className: "px-3 py-2 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
176
- children: "#"
177
- }),
178
- /* @__PURE__ */ g("th", {
179
- className: "px-3 py-2 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
180
- children: S("members.bulkInvite.colEmail", "Email")
181
- }),
182
- /* @__PURE__ */ g("th", {
183
- className: "px-3 py-2 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
184
- children: S("members.bulkInvite.colRole", "Role")
185
- }),
186
- /* @__PURE__ */ g("th", {
187
- className: "px-3 py-2 text-left text-xs font-semibold uppercase tracking-wide text-[var(--color-text-secondary)]",
188
- children: S("members.bulkInvite.colStatus", "Status")
189
- })
190
- ] })
191
- }), /* @__PURE__ */ g("tbody", {
192
- className: "divide-y divide-[var(--color-border-default)]",
193
- children: w.map((e) => {
194
- let t = e.errors.length > 0;
195
- return /* @__PURE__ */ _("tr", {
196
- className: "bg-[var(--color-bg-surface)]",
197
- children: [
198
- /* @__PURE__ */ g("td", {
199
- className: "px-3 py-2 text-xs text-[var(--color-text-secondary)]",
200
- children: e.rowNumber
201
- }),
202
- /* @__PURE__ */ g("td", {
203
- className: "px-3 py-2 text-sm text-[var(--color-text-primary)]",
204
- children: e.email || /* @__PURE__ */ g("span", {
205
- className: "italic text-[var(--color-text-muted)]",
206
- children: S("members.bulkInvite.empty", "(empty)")
207
- })
208
- }),
209
- /* @__PURE__ */ g("td", {
210
- className: "px-3 py-2 text-xs text-[var(--color-text-secondary)]",
211
- children: e.role || /* @__PURE__ */ g("span", {
212
- className: "text-[var(--color-text-muted)]",
213
- children: "MEMBER"
214
- })
215
- }),
216
- /* @__PURE__ */ g("td", {
217
- className: "px-3 py-2 text-xs",
218
- children: t ? /* @__PURE__ */ _("span", {
219
- className: "inline-flex items-center gap-1 text-[var(--color-status-error-text)]",
220
- children: [/* @__PURE__ */ g(m, {
221
- size: 14,
222
- "aria-hidden": "true"
223
- }), e.errors.join(" ")]
224
- }) : e.status.kind === "sending" ? /* @__PURE__ */ _("span", {
225
- className: "inline-flex items-center gap-1 text-[var(--color-text-secondary)]",
226
- children: [/* @__PURE__ */ g(d, {
227
- size: 14,
228
- className: "animate-spin",
229
- "aria-hidden": "true"
230
- }), S("members.bulkInvite.statusSending", "Sending...")]
231
- }) : e.status.kind === "invited" ? /* @__PURE__ */ _("span", {
232
- className: "inline-flex items-center gap-1 text-[var(--color-status-success-text)]",
233
- children: [/* @__PURE__ */ g(l, {
234
- size: 14,
235
- "aria-hidden": "true"
236
- }), S("members.bulkInvite.statusInvited", "Invited")]
237
- }) : e.status.kind === "failed" ? /* @__PURE__ */ _("span", {
238
- className: "inline-flex items-center gap-1 text-[var(--color-status-error-text)]",
239
- children: [/* @__PURE__ */ g(m, {
240
- size: 14,
241
- "aria-hidden": "true"
242
- }), e.status.message]
243
- }) : /* @__PURE__ */ g("span", {
244
- className: "text-[var(--color-text-secondary)]",
245
- children: S("members.bulkInvite.statusReady", "Ready")
246
- })
247
- })
248
- ]
249
- }, `${e.rowNumber}-${e.email}`);
250
- })
251
- })]
252
- })
228
+ }), /* @__PURE__ */ _("div", {
229
+ className: "rounded-xl border border-[var(--color-border-default)] p-2",
230
+ children: /* @__PURE__ */ _(h, {
231
+ columns: V,
232
+ data: T,
233
+ rowKey: (e) => `${e.rowNumber}-${e.email}`
253
234
  })
254
235
  })] }),
255
- /* @__PURE__ */ _("div", {
236
+ /* @__PURE__ */ v("div", {
256
237
  className: "flex flex-col gap-3 border-t border-[var(--color-border-default)] pt-4 sm:flex-row",
257
- children: [/* @__PURE__ */ _("button", {
238
+ children: [/* @__PURE__ */ v("button", {
258
239
  type: "button",
259
- onClick: I,
260
- disabled: !R,
261
- className: "inline-flex items-center justify-center gap-2 rounded-lg bg-[var(--color-action-primary-bg)] px-6 py-2.5 font-medium text-[var(--color-action-primary-text)] transition-all duration-200 hover:opacity-90 hover:scale-[1.02] active:scale-[0.98] disabled:cursor-not-allowed disabled:opacity-50 sm:min-w-[200px]",
240
+ onClick: L,
241
+ disabled: !z,
242
+ className: "inline-flex items-center justify-center gap-2 rounded-lg bg-[var(--color-action-primary-bg)] px-6 py-2.5 font-medium text-[var(--color-action-primary-text)] transition-all duration-200 hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50 sm:min-w-[200px]",
262
243
  children: [
263
- O ? /* @__PURE__ */ g(d, {
244
+ k ? /* @__PURE__ */ _(d, {
264
245
  size: 16,
265
246
  className: "animate-spin",
266
247
  "aria-hidden": "true"
267
- }) : /* @__PURE__ */ g(f, {
248
+ }) : /* @__PURE__ */ _(f, {
268
249
  size: 16,
269
250
  "aria-hidden": "true"
270
251
  }),
271
- S("members.bulkInvite.send", "Send"),
252
+ C("members.bulkInvite.send", "Send"),
272
253
  " ",
273
- F.sendable,
254
+ I.sendable,
274
255
  " ",
275
- S("members.bulkInvite.sendSuffix", "invites")
256
+ C("members.bulkInvite.sendSuffix", "invites")
276
257
  ]
277
- }), /* @__PURE__ */ g("button", {
258
+ }), /* @__PURE__ */ _("button", {
278
259
  type: "button",
279
- onClick: b,
280
- disabled: O,
281
- className: "rounded-lg border border-[var(--color-border-default)] bg-transparent px-6 py-2.5 font-medium text-[var(--color-text-primary)] transition-all duration-200 hover:bg-[var(--color-bg-subtle)] active:scale-[0.98] disabled:cursor-not-allowed disabled:opacity-50 sm:min-w-[140px]",
282
- children: S("common.cancel", "Cancel")
260
+ onClick: x,
261
+ disabled: k,
262
+ className: "rounded-lg border border-[var(--color-border-default)] bg-transparent px-6 py-2.5 font-medium text-[var(--color-text-primary)] transition-all duration-200 hover:bg-[var(--color-bg-subtle)] disabled:cursor-not-allowed disabled:opacity-50 sm:min-w-[140px]",
263
+ children: C("common.cancel", "Cancel")
283
264
  })]
284
265
  })
285
266
  ]
286
267
  });
287
268
  }
288
269
  //#endregion
289
- export { v as BulkInviteForm };
270
+ export { y as BulkInviteForm };
290
271
 
291
272
  //# sourceMappingURL=BulkInviteForm.js.map