@workos-inc/widgets 1.5.1 → 1.6.0

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 (192) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/admin-portal-domain-verification.client.cjs +32 -17
  3. package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
  4. package/dist/cjs/admin-portal-domain-verification.client.d.cts +3 -2
  5. package/dist/cjs/{admin-portal-sso-connection-client.cjs → admin-portal-sso-connection.client.cjs} +58 -31
  6. package/dist/cjs/admin-portal-sso-connection.client.cjs.map +1 -0
  7. package/dist/cjs/admin-portal-sso-connection.client.d.cts +16 -0
  8. package/dist/cjs/api/api-provider.cjs +1 -1
  9. package/dist/cjs/api/api-provider.cjs.map +1 -1
  10. package/dist/cjs/api/api-provider.d.cts +1 -1
  11. package/dist/cjs/api/endpoint.cjs +62 -2
  12. package/dist/cjs/api/endpoint.cjs.map +1 -1
  13. package/dist/cjs/api/endpoint.d.cts +62 -1
  14. package/dist/cjs/{api-keys-client.cjs → api-keys.client.cjs} +42 -25
  15. package/dist/cjs/api-keys.client.cjs.map +1 -0
  16. package/dist/cjs/api-keys.client.d.cts +15 -0
  17. package/dist/cjs/index.cjs +9 -2
  18. package/dist/cjs/index.cjs.map +1 -1
  19. package/dist/cjs/index.d.cts +6 -2
  20. package/dist/cjs/lib/admin-portal-domain-verification.cjs +33 -34
  21. package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
  22. package/dist/cjs/lib/admin-portal-domain-verification.d.cts +10 -6
  23. package/dist/cjs/lib/admin-portal-sso-connection.cjs +79 -79
  24. package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
  25. package/dist/cjs/lib/admin-portal-sso-connection.d.cts +13 -6
  26. package/dist/cjs/lib/api-keys/api-keys.cjs +70 -66
  27. package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
  28. package/dist/cjs/lib/api-keys/api-keys.d.cts +16 -8
  29. package/dist/cjs/lib/constants.cjs +5 -2
  30. package/dist/cjs/lib/constants.cjs.map +1 -1
  31. package/dist/cjs/lib/constants.d.cts +2 -1
  32. package/dist/cjs/lib/elevated-access.cjs.map +1 -1
  33. package/dist/cjs/lib/empty-state.cjs +24 -8
  34. package/dist/cjs/lib/empty-state.cjs.map +1 -1
  35. package/dist/cjs/lib/empty-state.d.cts +6 -2
  36. package/dist/cjs/lib/generic-error.cjs +33 -24
  37. package/dist/cjs/lib/generic-error.cjs.map +1 -1
  38. package/dist/cjs/lib/generic-error.d.cts +5 -2
  39. package/dist/cjs/lib/identity-providers.cjs +2 -1
  40. package/dist/cjs/lib/identity-providers.cjs.map +1 -1
  41. package/dist/cjs/lib/identity-providers.d.cts +2 -2
  42. package/dist/cjs/lib/oauth-icons.cjs +12 -7
  43. package/dist/cjs/lib/oauth-icons.cjs.map +1 -1
  44. package/dist/cjs/lib/oauth-icons.d.cts +7 -3
  45. package/dist/cjs/lib/organization-switcher.cjs +62 -9
  46. package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
  47. package/dist/cjs/lib/organization-switcher.d.cts +12 -9
  48. package/dist/cjs/lib/otp-input.cjs +1 -1
  49. package/dist/cjs/lib/otp-input.cjs.map +1 -1
  50. package/dist/cjs/lib/pipes.cjs +343 -0
  51. package/dist/cjs/lib/pipes.cjs.map +1 -0
  52. package/dist/cjs/lib/pipes.d.cts +19 -0
  53. package/dist/cjs/lib/provider-icon.cjs +0 -6
  54. package/dist/cjs/lib/provider-icon.cjs.map +1 -1
  55. package/dist/cjs/lib/provider-icon.d.cts +4 -1
  56. package/dist/cjs/lib/save-button.cjs.map +1 -1
  57. package/dist/cjs/lib/user-profile.cjs +77 -83
  58. package/dist/cjs/lib/user-profile.cjs.map +1 -1
  59. package/dist/cjs/lib/user-profile.d.cts +11 -7
  60. package/dist/cjs/lib/user-security.cjs +30 -24
  61. package/dist/cjs/lib/user-security.cjs.map +1 -1
  62. package/dist/cjs/lib/user-security.d.cts +10 -7
  63. package/dist/cjs/lib/user-sessions.cjs +19 -9
  64. package/dist/cjs/lib/user-sessions.cjs.map +1 -1
  65. package/dist/cjs/lib/user-sessions.d.cts +10 -6
  66. package/dist/cjs/lib/users-management.cjs +224 -216
  67. package/dist/cjs/lib/users-management.cjs.map +1 -1
  68. package/dist/cjs/lib/users-management.d.cts +10 -7
  69. package/dist/cjs/lib/utils.cjs +43 -0
  70. package/dist/cjs/lib/utils.cjs.map +1 -1
  71. package/dist/cjs/lib/utils.d.cts +29 -2
  72. package/dist/cjs/organization-switcher.client.cjs +45 -16
  73. package/dist/cjs/organization-switcher.client.cjs.map +1 -1
  74. package/dist/cjs/organization-switcher.client.d.cts +2 -1
  75. package/dist/cjs/pipes.client.cjs +64 -0
  76. package/dist/cjs/pipes.client.cjs.map +1 -0
  77. package/dist/cjs/pipes.client.d.cts +15 -0
  78. package/dist/cjs/user-profile.client.cjs +27 -10
  79. package/dist/cjs/user-profile.client.cjs.map +1 -1
  80. package/dist/cjs/user-profile.client.d.cts +4 -3
  81. package/dist/cjs/user-security.client.cjs +27 -10
  82. package/dist/cjs/user-security.client.cjs.map +1 -1
  83. package/dist/cjs/user-security.client.d.cts +3 -2
  84. package/dist/cjs/user-sessions.client.cjs +34 -16
  85. package/dist/cjs/user-sessions.client.cjs.map +1 -1
  86. package/dist/cjs/user-sessions.client.d.cts +4 -2
  87. package/dist/cjs/users-management.client.cjs +35 -18
  88. package/dist/cjs/users-management.client.cjs.map +1 -1
  89. package/dist/cjs/users-management.client.d.cts +3 -2
  90. package/dist/cjs/workos-widgets.client.cjs +7 -12
  91. package/dist/cjs/workos-widgets.client.cjs.map +1 -1
  92. package/dist/css/lib/provider-icon.css +16 -11
  93. package/dist/esm/admin-portal-domain-verification.client.d.ts +3 -2
  94. package/dist/esm/admin-portal-domain-verification.client.js +31 -17
  95. package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
  96. package/dist/esm/admin-portal-sso-connection.client.d.ts +16 -0
  97. package/dist/esm/{admin-portal-sso-connection-client.js → admin-portal-sso-connection.client.js} +57 -31
  98. package/dist/esm/admin-portal-sso-connection.client.js.map +1 -0
  99. package/dist/esm/api/api-provider.d.ts +1 -1
  100. package/dist/esm/api/api-provider.js +1 -1
  101. package/dist/esm/api/api-provider.js.map +1 -1
  102. package/dist/esm/api/endpoint.d.ts +62 -1
  103. package/dist/esm/api/endpoint.js +56 -2
  104. package/dist/esm/api/endpoint.js.map +1 -1
  105. package/dist/esm/api-keys.client.d.ts +15 -0
  106. package/dist/esm/api-keys.client.js +75 -0
  107. package/dist/esm/api-keys.client.js.map +1 -0
  108. package/dist/esm/index.d.ts +6 -2
  109. package/dist/esm/index.js +9 -2
  110. package/dist/esm/index.js.map +1 -1
  111. package/dist/esm/lib/admin-portal-domain-verification.d.ts +10 -6
  112. package/dist/esm/lib/admin-portal-domain-verification.js +33 -34
  113. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  114. package/dist/esm/lib/admin-portal-sso-connection.d.ts +13 -6
  115. package/dist/esm/lib/admin-portal-sso-connection.js +83 -80
  116. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  117. package/dist/esm/lib/api-keys/api-keys.d.ts +16 -8
  118. package/dist/esm/lib/api-keys/api-keys.js +69 -54
  119. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  120. package/dist/esm/lib/constants.d.ts +2 -1
  121. package/dist/esm/lib/constants.js +3 -1
  122. package/dist/esm/lib/constants.js.map +1 -1
  123. package/dist/esm/lib/elevated-access.js.map +1 -1
  124. package/dist/esm/lib/empty-state.d.ts +6 -2
  125. package/dist/esm/lib/empty-state.js +24 -8
  126. package/dist/esm/lib/empty-state.js.map +1 -1
  127. package/dist/esm/lib/generic-error.d.ts +5 -2
  128. package/dist/esm/lib/generic-error.js +33 -24
  129. package/dist/esm/lib/generic-error.js.map +1 -1
  130. package/dist/esm/lib/identity-providers.d.ts +2 -2
  131. package/dist/esm/lib/identity-providers.js +2 -1
  132. package/dist/esm/lib/identity-providers.js.map +1 -1
  133. package/dist/esm/lib/oauth-icons.d.ts +7 -3
  134. package/dist/esm/lib/oauth-icons.js +11 -6
  135. package/dist/esm/lib/oauth-icons.js.map +1 -1
  136. package/dist/esm/lib/organization-switcher.d.ts +12 -9
  137. package/dist/esm/lib/organization-switcher.js +54 -9
  138. package/dist/esm/lib/organization-switcher.js.map +1 -1
  139. package/dist/esm/lib/otp-input.js +1 -1
  140. package/dist/esm/lib/otp-input.js.map +1 -1
  141. package/dist/esm/lib/pipes.d.ts +19 -0
  142. package/dist/esm/lib/pipes.js +334 -0
  143. package/dist/esm/lib/pipes.js.map +1 -0
  144. package/dist/esm/lib/provider-icon.d.ts +4 -1
  145. package/dist/esm/lib/provider-icon.js +0 -8
  146. package/dist/esm/lib/provider-icon.js.map +1 -1
  147. package/dist/esm/lib/save-button.js.map +1 -1
  148. package/dist/esm/lib/user-profile.d.ts +11 -7
  149. package/dist/esm/lib/user-profile.js +82 -75
  150. package/dist/esm/lib/user-profile.js.map +1 -1
  151. package/dist/esm/lib/user-security.d.ts +10 -7
  152. package/dist/esm/lib/user-security.js +34 -25
  153. package/dist/esm/lib/user-security.js.map +1 -1
  154. package/dist/esm/lib/user-sessions.d.ts +10 -6
  155. package/dist/esm/lib/user-sessions.js +20 -9
  156. package/dist/esm/lib/user-sessions.js.map +1 -1
  157. package/dist/esm/lib/users-management.d.ts +10 -7
  158. package/dist/esm/lib/users-management.js +230 -217
  159. package/dist/esm/lib/users-management.js.map +1 -1
  160. package/dist/esm/lib/utils.d.ts +29 -2
  161. package/dist/esm/lib/utils.js +46 -1
  162. package/dist/esm/lib/utils.js.map +1 -1
  163. package/dist/esm/organization-switcher.client.d.ts +2 -1
  164. package/dist/esm/organization-switcher.client.js +44 -16
  165. package/dist/esm/organization-switcher.client.js.map +1 -1
  166. package/dist/esm/pipes.client.d.ts +15 -0
  167. package/dist/esm/pipes.client.js +42 -0
  168. package/dist/esm/pipes.client.js.map +1 -0
  169. package/dist/esm/user-profile.client.d.ts +4 -3
  170. package/dist/esm/user-profile.client.js +26 -10
  171. package/dist/esm/user-profile.client.js.map +1 -1
  172. package/dist/esm/user-security.client.d.ts +3 -2
  173. package/dist/esm/user-security.client.js +26 -10
  174. package/dist/esm/user-security.client.js.map +1 -1
  175. package/dist/esm/user-sessions.client.d.ts +4 -2
  176. package/dist/esm/user-sessions.client.js +33 -16
  177. package/dist/esm/user-sessions.client.js.map +1 -1
  178. package/dist/esm/users-management.client.d.ts +3 -2
  179. package/dist/esm/users-management.client.js +34 -18
  180. package/dist/esm/users-management.client.js.map +1 -1
  181. package/dist/esm/workos-widgets.client.js +7 -12
  182. package/dist/esm/workos-widgets.client.js.map +1 -1
  183. package/package.json +17 -10
  184. package/dist/cjs/admin-portal-sso-connection-client.cjs.map +0 -1
  185. package/dist/cjs/admin-portal-sso-connection-client.d.cts +0 -12
  186. package/dist/cjs/api-keys-client.cjs.map +0 -1
  187. package/dist/cjs/api-keys-client.d.cts +0 -10
  188. package/dist/esm/admin-portal-sso-connection-client.d.ts +0 -12
  189. package/dist/esm/admin-portal-sso-connection-client.js.map +0 -1
  190. package/dist/esm/api-keys-client.d.ts +0 -10
  191. package/dist/esm/api-keys-client.js +0 -60
  192. package/dist/esm/api-keys-client.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/users-management.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Box,\n Flex,\n Grid,\n Select,\n Separator,\n Table,\n Tooltip,\n Text,\n type TextProps,\n VisuallyHidden,\n} from \"@radix-ui/themes\";\nimport {\n Avatar,\n Badge,\n IconButton,\n PrimaryButton,\n SecondaryButton,\n SelectContent,\n SelectItem,\n SelectTrigger,\n Skeleton,\n TextField,\n} from \"./elements.js\";\nimport { InviteUserDialog } from \"./invite-user-dialog.js\";\nimport { SearchProvider, useSearchContext } from \"./search-provider.js\";\nimport { useIsHydrated } from \"./use-is-hydrated.js\";\nimport { UserActionsDropdown } from \"./user-actions-dropdown.js\";\nimport { UsersFilter } from \"./users-filter.js\";\nimport { UsersSearch } from \"./users-search.js\";\nimport { getBestName, getComparativeReadableDate, pluralize } from \"./utils.js\";\nimport { USER_ROW_LIMIT } from \"./constants.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\nimport clsx from \"clsx\";\nimport { Member, MemberRole, MembersQueryResult } from \"../api/endpoint.js\";\nimport { GenericError } from \"./generic-error.js\";\n\ninterface UsersManagementProps {\n rolesData: { roles: MemberRole[]; multipleRolesEnabled: boolean };\n userData: MembersQueryResult;\n disableRolesFilter?: boolean;\n // When the users list is loading new users\n isPending: boolean;\n}\n\nexport const UsersManagement = ({\n userData,\n rolesData,\n isPending,\n disableRolesFilter,\n}: UsersManagementProps) => {\n const users = userData?.data ?? [];\n const usersCount = users?.length ?? 0;\n const isHydrated = useIsHydrated();\n const { listMetadata: pagination = {} } = userData;\n const { dispatch } = useUsersManagementContext();\n const isMultipleRolesEnabled = rolesData.multipleRolesEnabled;\n\n // we only want to show the loading indicator for some buttons if the request\n // is still pending after 500ms. If the request is fast enough the indicator\n // is a bit jarring.\n const [deferredLoading, setDeferredLoading] = React.useState(false);\n React.useEffect(() => {\n if (isPending) {\n const timeoutId = window.setTimeout(() => {\n setDeferredLoading(true);\n }, 500);\n return () => {\n window.clearTimeout(timeoutId);\n };\n } else {\n setDeferredLoading(false);\n }\n }, [isPending]);\n\n const showPagination = !!(pagination.before || pagination.after);\n\n return (\n <SearchProvider>\n <UsersManagementRoot>\n <Grid columns=\"1fr auto\" gap=\"2\">\n <Flex gap=\"2\" align=\"center\">\n <Box flexBasis=\"380px\" flexGrow=\"0\" flexShrink=\"1\">\n <UsersSearch />\n </Box>\n <Box flexGrow=\"0\" flexShrink=\"0\">\n <UsersFilter\n roles={rolesData.roles}\n disabled={disableRolesFilter}\n />\n </Box>\n </Flex>\n <Box flexGrow=\"0\" flexShrink=\"0\" style={{ placeSelf: \"flex-end\" }}>\n <InviteUserDialog>\n <PrimaryButton>Invite user</PrimaryButton>\n </InviteUserDialog>\n </Box>\n </Grid>\n <Table.Root variant=\"ghost\" size=\"1\">\n <Table.Header>\n <Table.Row>\n <Table.ColumnHeaderCell width=\"260px\">\n User\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"100px\">\n {`Role${isMultipleRolesEnabled ? \"s\" : \"\"}`}\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"140px\">\n Last active\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"28px\" />\n </Table.Row>\n </Table.Header>\n\n <Table.Body\n style={{\n transition: `opacity 0.2s ease-out ${isPending ? \"0.2s\" : \"0s\"}`,\n opacity: isPending && usersCount > 0 ? 0.5 : 1,\n }}\n >\n {users.length > 0 ? (\n users.map((user) => {\n const userDisplayName = getBestName(user);\n const dimText =\n user.status === \"InviteRevoked\" ||\n user.status === \"InviteExpired\";\n return (\n <Table.Row key={user.id} align=\"center\">\n <Table.RowHeaderCell>\n <Flex\n align=\"center\"\n gap=\"3\"\n overflow=\"hidden\"\n height=\"var(--space-7)\"\n >\n <Avatar\n size=\"2\"\n fallback={<FallbackUserIcon />}\n src={user.profilePictureUrl ?? undefined}\n dim={dimText}\n />\n\n {userDisplayName ? (\n <Flex\n direction=\"column\"\n align=\"start\"\n height=\"var(--space-7)\"\n justify=\"center\"\n overflow=\"hidden\"\n >\n <Flex gap=\"2\" align=\"center\" minWidth=\"0\">\n <TableCellText dim={dimText}>\n {userDisplayName}\n </TableCellText>\n <UserBadge user={user} />\n </Flex>\n <TableCellText\n level=\"secondary\"\n title={user.email}\n dim={dimText}\n >\n {user.email}\n </TableCellText>\n </Flex>\n ) : (\n <Flex gap=\"2\" align=\"center\" minWidth=\"0\">\n <TableCellText dim={dimText} title={user.email}>\n {user.email}\n </TableCellText>\n <UserBadge user={user} />\n </Flex>\n )}\n </Flex>\n </Table.RowHeaderCell>\n <Table.Cell>\n <UserRolesCellContent\n user={user}\n isMultipleRolesEnabled={isMultipleRolesEnabled}\n dimText={dimText}\n />\n </Table.Cell>\n <Table.Cell>\n <LastActive user={user} isHydrated={isHydrated} />\n </Table.Cell>\n <Table.Cell justify=\"end\">\n <UserActionsDropdown user={user}>\n <IconButton title=\"User actions\">\n <VisuallyHidden>User actions</VisuallyHidden>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n aria-hidden\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM12.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM18.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z\"\n />\n </svg>\n </IconButton>\n </UserActionsDropdown>\n </Table.Cell>\n </Table.Row>\n );\n })\n ) : (\n <Table.Row align=\"center\">\n <Table.Cell colSpan={4}>\n <UsersManagementEmptyState isPending={isPending} />\n </Table.Cell>\n </Table.Row>\n )}\n </Table.Body>\n </Table.Root>\n\n {showPagination ? (\n <Flex gap=\"2\" justify=\"end\">\n <SecondaryButton\n size=\"1\"\n disabled={!pagination.after || isPending || undefined}\n loading={deferredLoading}\n onClick={() => {\n if (pagination.after) {\n dispatch({\n type: \"SET_PAGINATION\",\n pagination: { after: pagination.after },\n });\n }\n }}\n >\n Previous\n </SecondaryButton>\n <SecondaryButton\n size=\"1\"\n disabled={!pagination.before || isPending || undefined}\n loading={deferredLoading}\n onClick={() => {\n if (pagination.before) {\n dispatch({\n type: \"SET_PAGINATION\",\n pagination: { before: pagination.before },\n });\n }\n }}\n >\n Next\n </SecondaryButton>\n </Flex>\n ) : null}\n </UsersManagementRoot>\n </SearchProvider>\n );\n};\n\nexport const UsersManagementLoading: React.FC = () => {\n return (\n <UsersManagementRoot>\n <Grid columns=\"1fr auto\" gap=\"2\">\n <Flex gap=\"2\" align=\"center\">\n <Skeleton loading>\n <Box flexBasis=\"380px\" flexGrow=\"0\" flexShrink=\"1\">\n <TextField />\n </Box>\n </Skeleton>\n <Skeleton loading>\n <Box flexGrow=\"0\" flexShrink=\"0\">\n <Select.Root value=\"all\" onValueChange={() => void 0}>\n <SelectTrigger>All</SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All</SelectItem>\n </SelectContent>\n </Select.Root>\n </Box>\n </Skeleton>\n </Flex>\n <Skeleton loading>\n <Box flexGrow=\"0\" flexShrink=\"0\" style={{ placeSelf: \"flex-end\" }}>\n <PrimaryButton>Invite user</PrimaryButton>\n </Box>\n </Skeleton>\n </Grid>\n <Table.Root variant=\"ghost\" size=\"1\">\n <Table.Header>\n <Table.Row>\n <Table.ColumnHeaderCell width=\"260px\">\n <Skeleton loading>User</Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"100px\">\n <Skeleton>Role</Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"140px\">\n <Skeleton>Last active</Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"28px\" />\n </Table.Row>\n </Table.Header>\n\n <Table.Body>\n {Array.from({ length: USER_ROW_LIMIT }, (_, index) => (\n <Table.Row key={index} align=\"center\">\n <Table.RowHeaderCell>\n <Flex align=\"center\" gap=\"3\">\n <Skeleton>\n <Avatar size=\"2\" fallback=\"F\" />\n </Skeleton>\n\n <Flex\n direction=\"column\"\n height=\"var(--space-7)\"\n justify=\"center\"\n >\n <Skeleton width=\"180px\" height=\"var(--space-4)\" />\n <Skeleton width=\"90px\" height=\"var(--space-3)\" mt=\"1\" />\n </Flex>\n </Flex>\n </Table.RowHeaderCell>\n <Table.Cell>\n <Flex wrap=\"wrap\" gap=\"1\">\n <Skeleton width=\"75px\" height=\"var(--space-4)\" />\n </Flex>\n </Table.Cell>\n <Table.Cell>\n <Skeleton width=\"120px\" height=\"var(--space-4)\" />\n </Table.Cell>\n <Table.Cell justify=\"end\" />\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Root>\n\n <Flex gap=\"2\" justify=\"end\">\n <Skeleton loading>\n <SecondaryButton size=\"1\">Previous</SecondaryButton>\n </Skeleton>\n <Skeleton loading>\n <SecondaryButton size=\"1\">Next</SecondaryButton>\n </Skeleton>\n </Flex>\n </UsersManagementRoot>\n );\n};\n\nexport function UsersManagementError({ error }: { error: unknown }) {\n return (\n <UsersManagementRoot\n direction=\"row\"\n justify=\"center\"\n align=\"center\"\n minHeight=\"676px\"\n >\n <GenericError error={error} />\n </UsersManagementRoot>\n );\n}\n\nfunction UsersManagementRoot({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof Flex>) {\n return (\n <Flex\n className={clsx(\"woswidgets-widget\", className)}\n data-woswidgets-widget-id=\"users-management\"\n direction=\"column\"\n gap=\"3\"\n {...props}\n >\n {children}\n </Flex>\n );\n}\n\nfunction UserBadge({ user }: { user: Member }) {\n // TODO: This is not yet available in the data. Update here after API is updated.\n if (user.isLoggedInUser) {\n return (\n <Badge color=\"gray\" style={{ userSelect: \"none\" }}>\n You\n </Badge>\n );\n }\n if (user.status === \"Invited\") {\n return (\n <Badge color=\"amber\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>Status: </VisuallyHidden>Invited\n </Badge>\n );\n }\n if (user.status === \"InviteExpired\") {\n return (\n <Badge color=\"red\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>Status: Invite </VisuallyHidden>\n Expired\n </Badge>\n );\n }\n if (user.status === \"InviteRevoked\") {\n return (\n <Badge color=\"red\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>Status: Invite </VisuallyHidden>\n Revoked\n </Badge>\n );\n }\n return null;\n}\n\ninterface LastActiveProps {\n user: Member;\n isHydrated: boolean;\n dim?: boolean;\n}\n\nfunction LastActive(props: LastActiveProps) {\n if (!props.user.lastActivityAt) {\n return (\n <>\n <VisuallyHidden>\n {props.user.status === \"Active\" ? \"Never\" : \"Not active\"}\n </VisuallyHidden>\n <Separator />\n </>\n );\n }\n return <LastActiveImpl {...props} date={props.user.lastActivityAt} />;\n}\n\nfunction LastActiveImpl({\n date,\n isHydrated,\n dim,\n}: LastActiveProps & { date: string }) {\n const { lastActiveDateTime, lastActiveDisplay } = React.useMemo(() => {\n const defaultTimeZone = \"America/Los_Angeles\";\n const lastActiveDate = new Date(date);\n const lastActiveDateTime = lastActiveDate.toLocaleTimeString(\"en-US\", {\n // hard-coded timezone before hydration to prevent server/client mismatch\n timeZone: isHydrated ? undefined : defaultTimeZone,\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n\n // Server and client may produce a different 'now' date, so only\n // show comparative date if the component is hydrated to prevent a\n // server/client mismatch\n const lastActiveDisplay = isHydrated\n ? getComparativeReadableDate(new Date(), lastActiveDate)\n : lastActiveDate.toLocaleDateString(\"en-US\", {\n // hard-coded timezone to prevent server/client mismatch\n timeZone: defaultTimeZone,\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n\n return { lastActiveDateTime, lastActiveDisplay };\n }, [isHydrated, date]);\n\n // handle cases where the DB might return an invalid date string\n if (lastActiveDisplay === \"Invalid Date\") {\n return (\n <>\n <VisuallyHidden>Unknown</VisuallyHidden>\n <Separator />\n </>\n );\n }\n\n return (\n <TableCellText asChild dim={dim}>\n <time dateTime={date} title={lastActiveDateTime}>\n {lastActiveDisplay}\n </time>\n </TableCellText>\n );\n}\n\nconst TableCellText = React.forwardRef<HTMLSpanElement, TableCellTextProps>(\n function TableCellText(\n { children, dim, level = \"primary\", ...props },\n forwardedRef,\n ) {\n return (\n <Text\n ref={forwardedRef}\n color={level === \"secondary\" ? \"gray\" : undefined}\n weight={level === \"secondary\" ? \"regular\" : \"medium\"}\n size={level === \"secondary\" ? \"1\" : \"2\"}\n truncate\n {...props}\n style={\n dim\n ? {\n // TODO: use CSS var instead of hard-coded value for opacity\n opacity: 0.6,\n ...props.style,\n }\n : props.style\n }\n >\n {children}\n </Text>\n );\n },\n);\n\ntype TableCellTextProps = TextProps & {\n level?: \"primary\" | \"secondary\";\n dim?: boolean;\n};\n\nconst FallbackUserIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n >\n <title>User icon</title>\n <path d=\"M229.19,213c-15.81-27.32-40.63-46.49-69.47-54.62a70,70,0,1,0-63.44,0C67.44,166.5,42.62,185.67,26.81,213a6,6,0,1,0,10.38,6C56.4,185.81,90.34,166,128,166s71.6,19.81,90.81,53a6,6,0,1,0,10.38-6ZM70,96a58,58,0,1,1,58,58A58.07,58.07,0,0,1,70,96Z\" />\n </svg>\n);\n\nconst UsersManagementEmptyState = ({ isPending }: { isPending: boolean }) => {\n const { clearSearch } = useSearchContext();\n const {\n state: { searchQuery },\n } = useUsersManagementContext();\n\n // When the search query is cleared, the users query is re-fetched which sends\n // us into a pending state. When this happens we want to keep a snapshot of\n // the previous search query while the query is revalidated. We can use this\n // to keep the 'No users found for query' UI in place until re-fetching is\n // complete, otherwise the view flips to 'No users found' very quickly before\n // the full table is shown again.\n const [{ isClearing, lastSearchQuery }, setClearing] = React.useState({\n isClearing: false,\n lastSearchQuery: null as null | string,\n });\n const [wasPending, setWasPending] = React.useState(isPending);\n if (wasPending !== isPending) {\n setWasPending(isPending);\n if (!isPending) {\n setClearing((prev) =>\n prev.isClearing ? { isClearing: false, lastSearchQuery: null } : prev,\n );\n }\n }\n\n if (searchQuery || isClearing) {\n return (\n <Flex align=\"center\" justify=\"center\" py=\"8\" direction=\"column\" gap=\"2\">\n <Text size=\"2\">\n No users found for query{\" \"}\n <Text weight=\"medium\">\n “{isClearing ? lastSearchQuery : searchQuery}”\n </Text>\n </Text>\n\n <SecondaryButton\n size=\"1\"\n onClick={() => {\n setClearing({ isClearing: true, lastSearchQuery: searchQuery });\n clearSearch();\n }}\n loading={isPending}\n >\n Clear search\n </SecondaryButton>\n </Flex>\n );\n }\n\n return (\n <Flex align=\"center\" justify=\"center\" py=\"8\" gap=\"2\">\n <Text size=\"2\">No users found</Text>\n </Flex>\n );\n};\n\ninterface UserRolesCellContentProps {\n user: Member;\n isMultipleRolesEnabled: boolean;\n dimText: boolean;\n}\n\nfunction UserRolesCellContent({\n user,\n isMultipleRolesEnabled,\n dimText,\n}: UserRolesCellContentProps) {\n if (!user.roles || user.roles.length === 0) {\n return (\n <>\n <VisuallyHidden>No roles assigned</VisuallyHidden>\n <span aria-hidden style={{ userSelect: \"none\" }}>\n –\n </span>\n </>\n );\n }\n\n if (isMultipleRolesEnabled && user.roles.length > 1) {\n return (\n <Tooltip\n content={user.roles?.map((role) => role.name).join(\", \")}\n maxWidth=\"250px\"\n >\n <TableCellText dim={dimText}>\n {pluralize(\"role\", user.roles.length)}\n </TableCellText>\n </Tooltip>\n );\n }\n\n return <TableCellText dim={dimText}>{user.roles?.[0]?.name}</TableCellText>;\n}\n"],"mappings":"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","names":["clsx","lastActiveDateTime","lastActiveDisplay","TableCellText"]}
1
+ {"version":3,"sources":["../../../src/lib/users-management.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Box,\n Flex,\n Grid,\n Select,\n Separator,\n Table,\n Tooltip,\n Text,\n type TextProps,\n VisuallyHidden,\n} from \"@radix-ui/themes\";\nimport {\n Avatar,\n Badge,\n IconButton,\n PrimaryButton,\n SecondaryButton,\n SelectContent,\n SelectItem,\n SelectTrigger,\n Skeleton,\n TextField,\n} from \"./elements.js\";\nimport { InviteUserDialog } from \"./invite-user-dialog.js\";\nimport { SearchProvider, useSearchContext } from \"./search-provider.js\";\nimport { useIsHydrated } from \"./use-is-hydrated.js\";\nimport { UserActionsDropdown } from \"./user-actions-dropdown.js\";\nimport { UsersFilter } from \"./users-filter.js\";\nimport { UsersSearch } from \"./users-search.js\";\nimport {\n getBestName,\n getComparativeReadableDate,\n getDomProps,\n pluralize,\n WidgetRootState,\n type WidgetRootDomProps,\n} from \"./utils.js\";\nimport { USER_ROW_LIMIT } from \"./constants.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\nimport { Member, MemberRole, MembersQueryResult } from \"../api/endpoint.js\";\nimport { GenericError } from \"./generic-error.js\";\n\ninterface UsersManagementProps extends WidgetRootDomProps {\n rolesData: { roles: MemberRole[]; multipleRolesEnabled: boolean };\n userData: MembersQueryResult;\n disableRolesFilter?: boolean;\n // When the users list is loading new users\n isPending: boolean;\n}\n\nconst UsersManagement: React.FC<UsersManagementProps> = ({\n userData,\n rolesData,\n isPending,\n disableRolesFilter,\n ...domProps\n}) => {\n const users = userData?.data ?? [];\n const usersCount = users?.length ?? 0;\n const isHydrated = useIsHydrated();\n const { listMetadata: pagination = {} } = userData;\n const { dispatch } = useUsersManagementContext();\n const isMultipleRolesEnabled = rolesData.multipleRolesEnabled;\n\n // we only want to show the loading indicator for some buttons if the request\n // is still pending after 500ms. If the request is fast enough the indicator\n // is a bit jarring.\n const [deferredLoading, setDeferredLoading] = React.useState(false);\n React.useEffect(() => {\n if (isPending) {\n const timeoutId = window.setTimeout(() => {\n setDeferredLoading(true);\n }, 500);\n return () => {\n window.clearTimeout(timeoutId);\n };\n } else {\n setDeferredLoading(false);\n }\n }, [isPending]);\n\n const showPagination = !!(pagination.before || pagination.after);\n\n return (\n <SearchProvider>\n <Flex\n direction=\"column\"\n gap=\"3\"\n {...getWidgetRootDomProps(\"resolved\", domProps)}\n >\n <Grid columns=\"1fr auto\" gap=\"2\">\n <Flex gap=\"2\" align=\"center\">\n <Box flexBasis=\"380px\" flexGrow=\"0\" flexShrink=\"1\">\n <UsersSearch />\n </Box>\n <Box flexGrow=\"0\" flexShrink=\"0\">\n <UsersFilter\n roles={rolesData.roles}\n disabled={disableRolesFilter}\n />\n </Box>\n </Flex>\n <Box flexGrow=\"0\" flexShrink=\"0\" style={{ placeSelf: \"flex-end\" }}>\n <InviteUserDialog>\n <PrimaryButton>Invite user</PrimaryButton>\n </InviteUserDialog>\n </Box>\n </Grid>\n <Table.Root variant=\"ghost\" size=\"1\">\n <Table.Header>\n <Table.Row>\n <Table.ColumnHeaderCell width=\"260px\">\n User\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"100px\">\n {`Role${isMultipleRolesEnabled ? \"s\" : \"\"}`}\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"140px\">\n Last active\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"28px\" />\n </Table.Row>\n </Table.Header>\n\n <Table.Body\n style={{\n transition: `opacity 0.2s ease-out ${isPending ? \"0.2s\" : \"0s\"}`,\n opacity: isPending && usersCount > 0 ? 0.5 : 1,\n }}\n >\n {users.length > 0 ? (\n users.map((user) => {\n const userDisplayName = getBestName(user);\n const dimText =\n user.status === \"InviteRevoked\" ||\n user.status === \"InviteExpired\";\n return (\n <Table.Row key={user.id} align=\"center\">\n <Table.RowHeaderCell>\n <Flex\n align=\"center\"\n gap=\"3\"\n overflow=\"hidden\"\n height=\"var(--space-7)\"\n >\n <Avatar\n size=\"2\"\n fallback={<FallbackUserIcon />}\n src={user.profilePictureUrl ?? undefined}\n dim={dimText}\n />\n\n {userDisplayName ? (\n <Flex\n direction=\"column\"\n align=\"start\"\n height=\"var(--space-7)\"\n justify=\"center\"\n overflow=\"hidden\"\n >\n <Flex gap=\"2\" align=\"center\" minWidth=\"0\">\n <TableCellText dim={dimText}>\n {userDisplayName}\n </TableCellText>\n <UserBadge user={user} />\n </Flex>\n <TableCellText\n level=\"secondary\"\n title={user.email}\n dim={dimText}\n >\n {user.email}\n </TableCellText>\n </Flex>\n ) : (\n <Flex gap=\"2\" align=\"center\" minWidth=\"0\">\n <TableCellText dim={dimText} title={user.email}>\n {user.email}\n </TableCellText>\n <UserBadge user={user} />\n </Flex>\n )}\n </Flex>\n </Table.RowHeaderCell>\n <Table.Cell>\n <UserRolesCellContent\n user={user}\n isMultipleRolesEnabled={isMultipleRolesEnabled}\n dimText={dimText}\n />\n </Table.Cell>\n <Table.Cell>\n <LastActive user={user} isHydrated={isHydrated} />\n </Table.Cell>\n <Table.Cell justify=\"end\">\n <UserActionsDropdown user={user}>\n <IconButton title=\"User actions\">\n <VisuallyHidden>User actions</VisuallyHidden>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n aria-hidden\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM12.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM18.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z\"\n />\n </svg>\n </IconButton>\n </UserActionsDropdown>\n </Table.Cell>\n </Table.Row>\n );\n })\n ) : (\n <Table.Row align=\"center\">\n <Table.Cell colSpan={4}>\n <UsersManagementEmptyState isPending={isPending} />\n </Table.Cell>\n </Table.Row>\n )}\n </Table.Body>\n </Table.Root>\n\n {showPagination ? (\n <Flex gap=\"2\" justify=\"end\">\n <SecondaryButton\n size=\"1\"\n disabled={!pagination.after || isPending || undefined}\n loading={deferredLoading}\n onClick={() => {\n if (pagination.after) {\n dispatch({\n type: \"SET_PAGINATION\",\n pagination: { after: pagination.after },\n });\n }\n }}\n >\n Previous\n </SecondaryButton>\n <SecondaryButton\n size=\"1\"\n disabled={!pagination.before || isPending || undefined}\n loading={deferredLoading}\n onClick={() => {\n if (pagination.before) {\n dispatch({\n type: \"SET_PAGINATION\",\n pagination: { before: pagination.before },\n });\n }\n }}\n >\n Next\n </SecondaryButton>\n </Flex>\n ) : null}\n </Flex>\n </SearchProvider>\n );\n};\n\ninterface UsersManagementLoadingProps extends WidgetRootDomProps {}\n\nconst UsersManagementLoading: React.FC<UsersManagementLoadingProps> = (\n props,\n) => {\n return (\n <Flex\n direction=\"column\"\n gap=\"3\"\n {...getWidgetRootDomProps(\"loading\", props)}\n >\n <Grid columns=\"1fr auto\" gap=\"2\">\n <Flex gap=\"2\" align=\"center\">\n <Skeleton loading>\n <Box flexBasis=\"380px\" flexGrow=\"0\" flexShrink=\"1\">\n <TextField />\n </Box>\n </Skeleton>\n <Skeleton loading>\n <Box flexGrow=\"0\" flexShrink=\"0\">\n <Select.Root value=\"all\" onValueChange={() => void 0}>\n <SelectTrigger>All</SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All</SelectItem>\n </SelectContent>\n </Select.Root>\n </Box>\n </Skeleton>\n </Flex>\n <Skeleton loading>\n <Box flexGrow=\"0\" flexShrink=\"0\" style={{ placeSelf: \"flex-end\" }}>\n <PrimaryButton>Invite user</PrimaryButton>\n </Box>\n </Skeleton>\n </Grid>\n <Table.Root variant=\"ghost\" size=\"1\">\n <Table.Header>\n <Table.Row>\n <Table.ColumnHeaderCell width=\"260px\">\n <Skeleton loading>User</Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"100px\">\n <Skeleton>Role</Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"140px\">\n <Skeleton>Last active</Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"28px\" />\n </Table.Row>\n </Table.Header>\n\n <Table.Body>\n {Array.from({ length: USER_ROW_LIMIT }, (_, index) => (\n <Table.Row key={index} align=\"center\">\n <Table.RowHeaderCell>\n <Flex align=\"center\" gap=\"3\">\n <Skeleton>\n <Avatar size=\"2\" fallback=\"F\" />\n </Skeleton>\n\n <Flex\n direction=\"column\"\n height=\"var(--space-7)\"\n justify=\"center\"\n >\n <Skeleton width=\"180px\" height=\"var(--space-4)\" />\n <Skeleton width=\"90px\" height=\"var(--space-3)\" mt=\"1\" />\n </Flex>\n </Flex>\n </Table.RowHeaderCell>\n <Table.Cell>\n <Flex wrap=\"wrap\" gap=\"1\">\n <Skeleton width=\"75px\" height=\"var(--space-4)\" />\n </Flex>\n </Table.Cell>\n <Table.Cell>\n <Skeleton width=\"120px\" height=\"var(--space-4)\" />\n </Table.Cell>\n <Table.Cell justify=\"end\" />\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Root>\n\n <Flex gap=\"2\" justify=\"end\">\n <Skeleton loading>\n <SecondaryButton size=\"1\">Previous</SecondaryButton>\n </Skeleton>\n <Skeleton loading>\n <SecondaryButton size=\"1\">Next</SecondaryButton>\n </Skeleton>\n </Flex>\n </Flex>\n );\n};\n\ninterface UsersManagementErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst UsersManagementError: React.FC<UsersManagementErrorProps> = ({\n error,\n ...domProps\n}) => {\n return (\n <GenericError\n error={error}\n minHeight=\"676px\"\n {...getWidgetRootDomProps(\"error\", domProps)}\n />\n );\n};\n\nfunction UserBadge({ user }: { user: Member }) {\n // TODO: This is not yet available in the data. Update here after API is updated.\n if (user.isLoggedInUser) {\n return (\n <Badge color=\"gray\" style={{ userSelect: \"none\" }}>\n You\n </Badge>\n );\n }\n if (user.status === \"Invited\") {\n return (\n <Badge color=\"amber\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>Status: </VisuallyHidden>Invited\n </Badge>\n );\n }\n if (user.status === \"InviteExpired\") {\n return (\n <Badge color=\"red\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>Status: Invite </VisuallyHidden>\n Expired\n </Badge>\n );\n }\n if (user.status === \"InviteRevoked\") {\n return (\n <Badge color=\"red\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>Status: Invite </VisuallyHidden>\n Revoked\n </Badge>\n );\n }\n return null;\n}\n\ninterface LastActiveProps {\n user: Member;\n isHydrated: boolean;\n dim?: boolean;\n}\n\nfunction LastActive(props: LastActiveProps) {\n if (!props.user.lastActivityAt) {\n return (\n <>\n <VisuallyHidden>\n {props.user.status === \"Active\" ? \"Never\" : \"Not active\"}\n </VisuallyHidden>\n <Separator />\n </>\n );\n }\n return <LastActiveImpl {...props} date={props.user.lastActivityAt} />;\n}\n\nfunction LastActiveImpl({\n date,\n isHydrated,\n dim,\n}: LastActiveProps & { date: string }) {\n const { lastActiveDateTime, lastActiveDisplay } = React.useMemo(() => {\n const defaultTimeZone = \"America/Los_Angeles\";\n const lastActiveDate = new Date(date);\n const lastActiveDateTime = lastActiveDate.toLocaleTimeString(\"en-US\", {\n // hard-coded timezone before hydration to prevent server/client mismatch\n timeZone: isHydrated ? undefined : defaultTimeZone,\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n\n // Server and client may produce a different 'now' date, so only\n // show comparative date if the component is hydrated to prevent a\n // server/client mismatch\n const lastActiveDisplay = isHydrated\n ? getComparativeReadableDate(new Date(), lastActiveDate)\n : lastActiveDate.toLocaleDateString(\"en-US\", {\n // hard-coded timezone to prevent server/client mismatch\n timeZone: defaultTimeZone,\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n\n return { lastActiveDateTime, lastActiveDisplay };\n }, [isHydrated, date]);\n\n // handle cases where the DB might return an invalid date string\n if (lastActiveDisplay === \"Invalid Date\") {\n return (\n <>\n <VisuallyHidden>Unknown</VisuallyHidden>\n <Separator />\n </>\n );\n }\n\n return (\n <TableCellText asChild dim={dim}>\n <time dateTime={date} title={lastActiveDateTime}>\n {lastActiveDisplay}\n </time>\n </TableCellText>\n );\n}\n\nconst TableCellText = React.forwardRef<HTMLSpanElement, TableCellTextProps>(\n function TableCellText(\n { children, dim, level = \"primary\", ...props },\n forwardedRef,\n ) {\n return (\n <Text\n ref={forwardedRef}\n color={level === \"secondary\" ? \"gray\" : undefined}\n weight={level === \"secondary\" ? \"regular\" : \"medium\"}\n size={level === \"secondary\" ? \"1\" : \"2\"}\n truncate\n {...props}\n style={\n dim\n ? {\n // TODO: use CSS var instead of hard-coded value for opacity\n opacity: 0.6,\n ...props.style,\n }\n : props.style\n }\n >\n {children}\n </Text>\n );\n },\n);\n\ntype TableCellTextProps = TextProps & {\n level?: \"primary\" | \"secondary\";\n dim?: boolean;\n};\n\nconst FallbackUserIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n >\n <title>User icon</title>\n <path d=\"M229.19,213c-15.81-27.32-40.63-46.49-69.47-54.62a70,70,0,1,0-63.44,0C67.44,166.5,42.62,185.67,26.81,213a6,6,0,1,0,10.38,6C56.4,185.81,90.34,166,128,166s71.6,19.81,90.81,53a6,6,0,1,0,10.38-6ZM70,96a58,58,0,1,1,58,58A58.07,58.07,0,0,1,70,96Z\" />\n </svg>\n);\n\nconst UsersManagementEmptyState = ({ isPending }: { isPending: boolean }) => {\n const { clearSearch } = useSearchContext();\n const {\n state: { searchQuery },\n } = useUsersManagementContext();\n\n // When the search query is cleared, the users query is re-fetched which sends\n // us into a pending state. When this happens we want to keep a snapshot of\n // the previous search query while the query is revalidated. We can use this\n // to keep the 'No users found for query' UI in place until re-fetching is\n // complete, otherwise the view flips to 'No users found' very quickly before\n // the full table is shown again.\n const [{ isClearing, lastSearchQuery }, setClearing] = React.useState({\n isClearing: false,\n lastSearchQuery: null as null | string,\n });\n const [wasPending, setWasPending] = React.useState(isPending);\n if (wasPending !== isPending) {\n setWasPending(isPending);\n if (!isPending) {\n setClearing((prev) =>\n prev.isClearing ? { isClearing: false, lastSearchQuery: null } : prev,\n );\n }\n }\n\n if (searchQuery || isClearing) {\n return (\n <Flex align=\"center\" justify=\"center\" py=\"8\" direction=\"column\" gap=\"2\">\n <Text size=\"2\">\n No users found for query{\" \"}\n <Text weight=\"medium\">\n “{isClearing ? lastSearchQuery : searchQuery}”\n </Text>\n </Text>\n\n <SecondaryButton\n size=\"1\"\n onClick={() => {\n setClearing({ isClearing: true, lastSearchQuery: searchQuery });\n clearSearch();\n }}\n loading={isPending}\n >\n Clear search\n </SecondaryButton>\n </Flex>\n );\n }\n\n return (\n <Flex align=\"center\" justify=\"center\" py=\"8\" gap=\"2\">\n <Text size=\"2\">No users found</Text>\n </Flex>\n );\n};\n\ninterface UserRolesCellContentProps {\n user: Member;\n isMultipleRolesEnabled: boolean;\n dimText: boolean;\n}\n\nfunction UserRolesCellContent({\n user,\n isMultipleRolesEnabled,\n dimText,\n}: UserRolesCellContentProps) {\n if (!user.roles || user.roles.length === 0) {\n return (\n <>\n <VisuallyHidden>No roles assigned</VisuallyHidden>\n <span aria-hidden style={{ userSelect: \"none\" }}>\n –\n </span>\n </>\n );\n }\n\n if (isMultipleRolesEnabled && user.roles.length > 1) {\n return (\n <Tooltip\n content={user.roles?.map((role) => role.name).join(\", \")}\n maxWidth=\"250px\"\n >\n <TableCellText dim={dimText}>\n {pluralize(\"role\", user.roles.length)}\n </TableCellText>\n </Tooltip>\n );\n }\n\n return <TableCellText dim={dimText}>{user.roles?.[0]?.name}</TableCellText>;\n}\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"users-management\",\n widgetState: state,\n });\n}\n\nexport type { UsersManagementLoadingProps, UsersManagementErrorProps };\nexport { UsersManagement, UsersManagementLoading, UsersManagementError };\n"],"mappings":"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","names":["lastActiveDateTime","lastActiveDisplay","TableCellText"]}
@@ -1,10 +1,10 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as React from 'react';
2
+ import { WidgetRootDomProps } from './utils.cjs';
3
3
  import { MemberRole, MembersQueryResult } from '../api/endpoint.cjs';
4
4
  import '@tanstack/react-query';
5
5
  import '../api/widgets-api-client.cjs';
6
6
 
7
- interface UsersManagementProps {
7
+ interface UsersManagementProps extends WidgetRootDomProps {
8
8
  rolesData: {
9
9
  roles: MemberRole[];
10
10
  multipleRolesEnabled: boolean;
@@ -13,10 +13,13 @@ interface UsersManagementProps {
13
13
  disableRolesFilter?: boolean;
14
14
  isPending: boolean;
15
15
  }
16
- declare const UsersManagement: ({ userData, rolesData, isPending, disableRolesFilter, }: UsersManagementProps) => react_jsx_runtime.JSX.Element;
17
- declare const UsersManagementLoading: React.FC;
18
- declare function UsersManagementError({ error }: {
16
+ declare const UsersManagement: React.FC<UsersManagementProps>;
17
+ interface UsersManagementLoadingProps extends WidgetRootDomProps {
18
+ }
19
+ declare const UsersManagementLoading: React.FC<UsersManagementLoadingProps>;
20
+ interface UsersManagementErrorProps extends WidgetRootDomProps {
19
21
  error: unknown;
20
- }): react_jsx_runtime.JSX.Element;
22
+ }
23
+ declare const UsersManagementError: React.FC<UsersManagementErrorProps>;
21
24
 
22
- export { UsersManagement, UsersManagementError, UsersManagementLoading };
25
+ export { UsersManagement, UsersManagementError, type UsersManagementErrorProps, UsersManagementLoading, type UsersManagementLoadingProps };
@@ -31,6 +31,7 @@ __export(utils_exports, {
31
31
  canUseDOM: () => canUseDOM,
32
32
  getBestName: () => getBestName,
33
33
  getComparativeReadableDate: () => getComparativeReadableDate,
34
+ getDomProps: () => getDomProps,
34
35
  getUserLocation: () => getUserLocation,
35
36
  isErrorLike: () => isErrorLike,
36
37
  isObjectLike: () => isObjectLike,
@@ -42,6 +43,7 @@ __export(utils_exports, {
42
43
  });
43
44
  module.exports = __toCommonJS(utils_exports);
44
45
  var import_bowser = __toESM(require("bowser"), 1);
46
+ var import_clsx = __toESM(require("clsx"), 1);
45
47
  var import_constants = require("./constants.js");
46
48
  const canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement);
47
49
  function getBestName({
@@ -109,6 +111,46 @@ async function parseErrorResponse(response) {
109
111
  function namespaceClassNames(...classNames) {
110
112
  return classNames.map((className) => `${import_constants.WIDGETS_CLASS_NAMESPACE}-${className}`).join(" ");
111
113
  }
114
+ function getDomProps(args) {
115
+ let {
116
+ className,
117
+ dataAttributes,
118
+ isWidgetRoot = false,
119
+ widgetId,
120
+ elementId,
121
+ widgetState,
122
+ ...passthroughProps
123
+ } = args;
124
+ const props = {
125
+ ...passthroughProps,
126
+ className: (0, import_clsx.default)(
127
+ className,
128
+ isWidgetRoot && namespaceClassNames("widget"),
129
+ !!elementId && namespaceClassNames(elementId)
130
+ )
131
+ };
132
+ if (widgetId) {
133
+ props[`data-${import_constants.WIDGETS_DATA_ATTRIBUTE_NAMESPACE}-widget-id`] = widgetId;
134
+ }
135
+ if (isWidgetRoot) {
136
+ widgetState ??= "resolved";
137
+ props[`data-${import_constants.WIDGETS_DATA_ATTRIBUTE_NAMESPACE}-widget-state`] = widgetState;
138
+ }
139
+ if (dataAttributes) {
140
+ for (const [key, value] of Object.entries(dataAttributes)) {
141
+ if (value != null) {
142
+ const parts = [widgetId, elementId, key].filter((v) => v != null).map(fastKebabCase).join("-");
143
+ if (parts) {
144
+ props[`data-${import_constants.WIDGETS_DATA_ATTRIBUTE_NAMESPACE}-${parts}`] = value;
145
+ }
146
+ }
147
+ }
148
+ }
149
+ return props;
150
+ }
151
+ function fastKebabCase(alphaString) {
152
+ return alphaString.replace(/([A-Z])/g, "-$1").toLowerCase();
153
+ }
112
154
  function parseUserAgent(userAgent) {
113
155
  const browser = import_bowser.default.getParser(userAgent ?? "");
114
156
  const browserName = browser.getBrowserName().replace(/^Mobile\s*/i, "");
@@ -136,6 +178,7 @@ function pluralize(word = "", amount = 0, showAmount = true) {
136
178
  canUseDOM,
137
179
  getBestName,
138
180
  getComparativeReadableDate,
181
+ getDomProps,
139
182
  getUserLocation,
140
183
  isErrorLike,
141
184
  isObjectLike,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts"],"sourcesContent":["import { Member } from \"../api/endpoint.js\";\nimport Bowser from \"bowser\";\nimport { WIDGETS_CLASS_NAMESPACE } from \"./constants.js\";\n\nexport const canUseDOM = !!(\n typeof window !== \"undefined\" &&\n window.document &&\n window.document.createElement\n);\n\nexport function getBestName({\n firstName,\n lastName,\n}: Pick<Member, \"firstName\" | \"lastName\">) {\n return [firstName, lastName].filter(Boolean).join(\" \") || null;\n}\n\nexport function getComparativeReadableDate(\n now: Date,\n then: Date,\n options?: { timeZone?: string },\n): string {\n const timeSince = now.getTime() - then.getTime();\n\n // Has it been less than a minute?\n if (timeSince < 60_000) {\n return \"Just now\";\n }\n\n // Has it been less than an hour?\n if (timeSince < 3_600_000) {\n const timePassed = Math.floor(timeSince / 60_000);\n return timePassed === 1 ? \"1 minute ago\" : `${timePassed} minutes ago`;\n }\n\n // Has it been less than a day?\n if (timeSince < 86_400_000) {\n const timePassed = Math.floor(timeSince / 3_600_000);\n return timePassed === 1 ? \"1 hour ago\" : `${timePassed} hours ago`;\n }\n\n // Has it been less than a week?\n if (timeSince < 604_800_000) {\n const timePassed = Math.floor(timeSince / 86_400_000);\n return timePassed === 1 ? \"1 day ago\" : `${timePassed} days ago`;\n }\n\n // Has it been less than a month?\n if (timeSince < 2_592_000_000) {\n const timePassed = Math.floor(timeSince / 604_800_000);\n return timePassed === 1 ? \"1 week ago\" : `${timePassed} weeks ago`;\n }\n\n // Any later?\n return then.toLocaleDateString(\"en-US\", {\n timeZone: options?.timeZone,\n month: \"long\",\n day: \"numeric\",\n // omit year if it's the same as the current year\n year: now.getFullYear() !== then.getFullYear() ? \"numeric\" : undefined,\n });\n}\n\nexport function isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function isErrorLike(\n value: unknown,\n): value is Record<string, unknown> & { message: string } {\n return isObjectLike(value) && typeof value.message === \"string\";\n}\n\nexport async function parseErrorResponse(\n response: Response,\n): Promise<{ message: string; status: number }> {\n try {\n const json = await response.json();\n if (!isObjectLike(json) || typeof json.message !== \"string\") {\n return {\n status: response.status,\n message: response.statusText,\n };\n }\n return {\n ...json,\n status: response.status,\n message: json.message || response.statusText,\n };\n } catch {\n return {\n status: response.status,\n message: response.statusText,\n };\n }\n}\n\nexport function namespaceClassNames(className: string): string;\nexport function namespaceClassNames(...classNames: string[]): string;\nexport function namespaceClassNames(...classNames: string[]): string {\n return classNames\n .map((className) => `${WIDGETS_CLASS_NAMESPACE}-${className}`)\n .join(\" \");\n}\n\nexport function parseUserAgent(userAgent?: string | null) {\n const browser = Bowser.getParser(userAgent ?? \"\");\n const browserName = browser.getBrowserName().replace(/^Mobile\\s*/i, \"\");\n const osName = browser.getOSName();\n const pretty = [browserName, osName].filter(Boolean).join(\" on \");\n\n return { pretty, isMobile: browser.getPlatformType() === \"mobile\" };\n}\n\nexport function getUserLocation(\n location?: {\n cityName: string;\n countryISOCode: string;\n } | null,\n ipAddress?: string | null,\n) {\n if (location) {\n return (\n [location.cityName, location.countryISOCode].filter(Boolean).join(\", \") ||\n \"Unknown location\"\n );\n }\n\n if (ipAddress) {\n return ipAddress;\n }\n\n return \"Unknown location\";\n}\n\nexport function unreachable(value: never): never {\n throw new TypeError(`Unreachable code: ${value}`);\n}\n\nexport function pluralize(word = \"\", amount = 0, showAmount = true): string {\n return `${showAmount ? `${amount} ` : \"\"}${word}${amount === 1 ? \"\" : \"s\"}`;\n}\n"],"mappings":"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","names":["Bowser"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts"],"sourcesContent":["import { Member } from \"../api/endpoint.js\";\nimport Bowser from \"bowser\";\nimport cx from \"clsx\";\nimport {\n WIDGETS_CLASS_NAMESPACE,\n WIDGETS_DATA_ATTRIBUTE_NAMESPACE,\n} from \"./constants.js\";\n\nexport const canUseDOM = !!(\n typeof window !== \"undefined\" &&\n window.document &&\n window.document.createElement\n);\n\nexport function getBestName({\n firstName,\n lastName,\n}: Pick<Member, \"firstName\" | \"lastName\">) {\n return [firstName, lastName].filter(Boolean).join(\" \") || null;\n}\n\nexport function getComparativeReadableDate(\n now: Date,\n then: Date,\n options?: { timeZone?: string },\n): string {\n const timeSince = now.getTime() - then.getTime();\n\n // Has it been less than a minute?\n if (timeSince < 60_000) {\n return \"Just now\";\n }\n\n // Has it been less than an hour?\n if (timeSince < 3_600_000) {\n const timePassed = Math.floor(timeSince / 60_000);\n return timePassed === 1 ? \"1 minute ago\" : `${timePassed} minutes ago`;\n }\n\n // Has it been less than a day?\n if (timeSince < 86_400_000) {\n const timePassed = Math.floor(timeSince / 3_600_000);\n return timePassed === 1 ? \"1 hour ago\" : `${timePassed} hours ago`;\n }\n\n // Has it been less than a week?\n if (timeSince < 604_800_000) {\n const timePassed = Math.floor(timeSince / 86_400_000);\n return timePassed === 1 ? \"1 day ago\" : `${timePassed} days ago`;\n }\n\n // Has it been less than a month?\n if (timeSince < 2_592_000_000) {\n const timePassed = Math.floor(timeSince / 604_800_000);\n return timePassed === 1 ? \"1 week ago\" : `${timePassed} weeks ago`;\n }\n\n // Any later?\n return then.toLocaleDateString(\"en-US\", {\n timeZone: options?.timeZone,\n month: \"long\",\n day: \"numeric\",\n // omit year if it's the same as the current year\n year: now.getFullYear() !== then.getFullYear() ? \"numeric\" : undefined,\n });\n}\n\nexport function isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function isErrorLike(\n value: unknown,\n): value is Record<string, unknown> & { message: string } {\n return isObjectLike(value) && typeof value.message === \"string\";\n}\n\nexport async function parseErrorResponse(\n response: Response,\n): Promise<{ message: string; status: number }> {\n try {\n const json = await response.json();\n if (!isObjectLike(json) || typeof json.message !== \"string\") {\n return {\n status: response.status,\n message: response.statusText,\n };\n }\n return {\n ...json,\n status: response.status,\n message: json.message || response.statusText,\n };\n } catch {\n return {\n status: response.status,\n message: response.statusText,\n };\n }\n}\n\nexport function namespaceClassNames(...classNames: string[]): string {\n return classNames\n .map((className) => `${WIDGETS_CLASS_NAMESPACE}-${className}`)\n .join(\" \");\n}\n\ninterface CommonDomArgs {\n className?: string | undefined | null;\n dataAttributes?: Record<string, string | boolean | undefined | null>;\n}\n\ninterface WidgetRootDomArgs {\n isWidgetRoot: true;\n widgetId: string;\n elementId?: never;\n widgetState: WidgetRootState;\n}\n\ninterface WidgetElementDomArgs {\n isWidgetRoot?: false;\n widgetId?: string;\n elementId?: string;\n widgetState?: never;\n}\n\ntype DomArgs = CommonDomArgs & (WidgetRootDomArgs | WidgetElementDomArgs);\n\ntype DataAttributeProps = {\n [K in `data-${string}`]?: string | boolean;\n};\n\ntype DomProps = {\n className: string | undefined;\n} & DataAttributeProps;\n\nexport function getDomProps(args: DomArgs) {\n // data-woswidgets-widget-id\n let {\n className,\n dataAttributes,\n isWidgetRoot = false,\n widgetId,\n elementId,\n widgetState,\n ...passthroughProps\n } = args;\n const props: DomProps = {\n ...passthroughProps,\n className: cx(\n className,\n isWidgetRoot && namespaceClassNames(\"widget\"),\n !!elementId && namespaceClassNames(elementId),\n ),\n };\n\n if (widgetId) {\n props[`data-${WIDGETS_DATA_ATTRIBUTE_NAMESPACE}-widget-id`] = widgetId;\n }\n\n if (isWidgetRoot) {\n widgetState ??= \"resolved\";\n props[`data-${WIDGETS_DATA_ATTRIBUTE_NAMESPACE}-widget-state`] =\n widgetState;\n }\n\n if (dataAttributes) {\n for (const [key, value] of Object.entries(dataAttributes)) {\n if (value != null) {\n const parts = [widgetId, elementId, key]\n .filter((v) => v != null)\n .map(fastKebabCase)\n .join(\"-\");\n if (parts) {\n props[`data-${WIDGETS_DATA_ATTRIBUTE_NAMESPACE}-${parts}`] = value;\n }\n }\n }\n }\n\n return props;\n}\n\n/**\n * Opt for simplicity and performance over capturing edge cases. Input strings\n * are expected to only be alphabetic.\n */\nfunction fastKebabCase(alphaString: string) {\n return alphaString.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\nexport function parseUserAgent(userAgent?: string | null) {\n const browser = Bowser.getParser(userAgent ?? \"\");\n const browserName = browser.getBrowserName().replace(/^Mobile\\s*/i, \"\");\n const osName = browser.getOSName();\n const pretty = [browserName, osName].filter(Boolean).join(\" on \");\n\n return { pretty, isMobile: browser.getPlatformType() === \"mobile\" };\n}\n\nexport function getUserLocation(\n location?: {\n cityName: string;\n countryISOCode: string;\n } | null,\n ipAddress?: string | null,\n) {\n if (location) {\n return (\n [location.cityName, location.countryISOCode].filter(Boolean).join(\", \") ||\n \"Unknown location\"\n );\n }\n\n if (ipAddress) {\n return ipAddress;\n }\n\n return \"Unknown location\";\n}\n\nexport function unreachable(value: never): never {\n throw new TypeError(`Unreachable code: ${value}`);\n}\n\nexport function pluralize(word = \"\", amount = 0, showAmount = true): string {\n return `${showAmount ? `${amount} ` : \"\"}${word}${amount === 1 ? \"\" : \"s\"}`;\n}\n\n// Props that all widgets should accept.\nexport interface WidgetRootDomProps {\n className?: string;\n}\n\nexport type WidgetRootState = \"loading\" | \"error\" | \"resolved\";\n"],"mappings":"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","names":["cx","Bowser"]}
@@ -15,8 +15,31 @@ declare function parseErrorResponse(response: Response): Promise<{
15
15
  message: string;
16
16
  status: number;
17
17
  }>;
18
- declare function namespaceClassNames(className: string): string;
19
18
  declare function namespaceClassNames(...classNames: string[]): string;
19
+ interface CommonDomArgs {
20
+ className?: string | undefined | null;
21
+ dataAttributes?: Record<string, string | boolean | undefined | null>;
22
+ }
23
+ interface WidgetRootDomArgs {
24
+ isWidgetRoot: true;
25
+ widgetId: string;
26
+ elementId?: never;
27
+ widgetState: WidgetRootState;
28
+ }
29
+ interface WidgetElementDomArgs {
30
+ isWidgetRoot?: false;
31
+ widgetId?: string;
32
+ elementId?: string;
33
+ widgetState?: never;
34
+ }
35
+ type DomArgs = CommonDomArgs & (WidgetRootDomArgs | WidgetElementDomArgs);
36
+ type DataAttributeProps = {
37
+ [K in `data-${string}`]?: string | boolean;
38
+ };
39
+ type DomProps = {
40
+ className: string | undefined;
41
+ } & DataAttributeProps;
42
+ declare function getDomProps(args: DomArgs): DomProps;
20
43
  declare function parseUserAgent(userAgent?: string | null): {
21
44
  pretty: string;
22
45
  isMobile: boolean;
@@ -27,5 +50,9 @@ declare function getUserLocation(location?: {
27
50
  } | null, ipAddress?: string | null): string;
28
51
  declare function unreachable(value: never): never;
29
52
  declare function pluralize(word?: string, amount?: number, showAmount?: boolean): string;
53
+ interface WidgetRootDomProps {
54
+ className?: string;
55
+ }
56
+ type WidgetRootState = "loading" | "error" | "resolved";
30
57
 
31
- export { canUseDOM, getBestName, getComparativeReadableDate, getUserLocation, isErrorLike, isObjectLike, namespaceClassNames, parseErrorResponse, parseUserAgent, pluralize, unreachable };
58
+ export { type WidgetRootDomProps, type WidgetRootState, canUseDOM, getBestName, getComparativeReadableDate, getDomProps, getUserLocation, isErrorLike, isObjectLike, namespaceClassNames, parseErrorResponse, parseUserAgent, pluralize, unreachable };
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  var organization_switcher_client_exports = {};
21
21
  __export(organization_switcher_client_exports, {
22
22
  OrganizationSwitcher: () => OrganizationSwitcher,
23
+ OrganizationSwitcherError: () => import_organization_switcher.OrganizationSwitcherError,
23
24
  OrganizationSwitcherLoading: () => import_organization_switcher.OrganizationSwitcherLoading
24
25
  });
25
26
  module.exports = __toCommonJS(organization_switcher_client_exports);
@@ -35,20 +36,30 @@ const OrganizationSwitcher = ({
35
36
  ...passthroughProps
36
37
  }) => {
37
38
  const baseUrl = (0, import_widgets_context.useWorkOsApiUrl)();
38
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_error_boundary.ErrorBoundary, { FallbackComponent: import_organization_switcher.OrganizationSwitcherError, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
39
- import_api_provider.ApiProvider,
39
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
40
+ import_error_boundary.ErrorBoundary,
40
41
  {
41
- widgetType: "organization-switcher",
42
- authToken,
43
- baseUrl,
44
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(OrganizationSwitcherContent, { ...passthroughProps })
42
+ fallbackRender: ({ error }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_organization_switcher.OrganizationSwitcherError, { ...passthroughProps, error }),
43
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
44
+ import_api_provider.ApiProvider,
45
+ {
46
+ widgetType: "organization-switcher",
47
+ authToken,
48
+ baseUrl,
49
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(OrganizationSwitcherImpl, { ...passthroughProps })
50
+ }
51
+ )
45
52
  }
46
- ) });
53
+ );
47
54
  };
48
55
  const emptyOrganizations = [];
49
- const OrganizationSwitcherContent = ({
56
+ const OrganizationSwitcherImpl = ({
50
57
  variant,
51
- ...rest
58
+ switchToOrganization,
59
+ organizationLabel,
60
+ truncateBehavior,
61
+ children,
62
+ ...domProps
52
63
  }) => {
53
64
  const isApiReady = (0, import_api_provider.useApiReady)();
54
65
  const organizationsQuery = (0, import_endpoint.useOrganizations)({
@@ -58,22 +69,40 @@ const OrganizationSwitcherContent = ({
58
69
  });
59
70
  const organizations = organizationsQuery.data?.data ?? emptyOrganizations;
60
71
  if (organizationsQuery.isLoading || !isApiReady) {
61
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_organization_switcher.OrganizationSwitcherLoading, {});
72
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_organization_switcher.OrganizationSwitcherLoading, { ...domProps });
62
73
  }
63
74
  if (organizationsQuery.isError) {
64
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_organization_switcher.OrganizationSwitcherError, { error: organizationsQuery.error });
75
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
76
+ import_organization_switcher.OrganizationSwitcherError,
77
+ {
78
+ error: organizationsQuery.error,
79
+ ...domProps
80
+ }
81
+ );
65
82
  }
66
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_error_boundary.ErrorBoundary, { FallbackComponent: import_organization_switcher.OrganizationSwitcherError, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
67
- import_organization_switcher.OrganizationSwitcher,
83
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
84
+ import_error_boundary.ErrorBoundary,
68
85
  {
69
- organizations,
70
- ...rest
86
+ fallbackRender: ({ error }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_organization_switcher.OrganizationSwitcherError, { error, ...domProps }),
87
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
88
+ import_organization_switcher.OrganizationSwitcher,
89
+ {
90
+ organizations,
91
+ switchToOrganization,
92
+ variant,
93
+ organizationLabel,
94
+ truncateBehavior,
95
+ ...domProps,
96
+ children
97
+ }
98
+ )
71
99
  }
72
- ) });
100
+ );
73
101
  };
74
102
  // Annotate the CommonJS export names for ESM import in node:
75
103
  0 && (module.exports = {
76
104
  OrganizationSwitcher,
105
+ OrganizationSwitcherError,
77
106
  OrganizationSwitcherLoading
78
107
  });
79
108
  //# sourceMappingURL=organization-switcher.client.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/organization-switcher.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport { OrganizationInfo, useOrganizations } from \"./api/endpoint.js\";\nimport * as React from \"react\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport {\n OrganizationSwitcherError,\n OrganizationSwitcherLoading,\n OrganizationSwitcherPassthroughProps,\n OrganizationSwitcher as OrganizationSwitcherPresentational,\n} from \"./lib/organization-switcher.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { keepPreviousData } from \"@tanstack/react-query\";\n\nexport interface OrganizationSwitcherProps\n extends OrganizationSwitcherPassthroughProps {\n authToken: AuthToken;\n}\n\nexport const OrganizationSwitcher: React.FC<OrganizationSwitcherProps> = ({\n authToken,\n ...passthroughProps\n}) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary FallbackComponent={OrganizationSwitcherError}>\n <ApiProvider\n widgetType=\"organization-switcher\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <OrganizationSwitcherContent {...passthroughProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\nexport { OrganizationSwitcherLoading };\n\n// Constant reference to avoid unnecessary prop changes\nconst emptyOrganizations: OrganizationInfo[] = [];\n\nconst OrganizationSwitcherContent = ({\n variant,\n ...rest\n}: OrganizationSwitcherPassthroughProps) => {\n const isApiReady = useApiReady();\n const organizationsQuery = useOrganizations({\n query: {\n placeholderData: keepPreviousData,\n },\n });\n\n const organizations = organizationsQuery.data?.data ?? emptyOrganizations;\n\n if (organizationsQuery.isLoading || !isApiReady) {\n return <OrganizationSwitcherLoading />;\n }\n\n if (organizationsQuery.isError) {\n return <OrganizationSwitcherError error={organizationsQuery.error} />;\n }\n\n return (\n <ErrorBoundary FallbackComponent={OrganizationSwitcherError}>\n <OrganizationSwitcherPresentational\n organizations={organizations}\n {...rest}\n />\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCQ;AA/BR,0BAAoD;AACpD,sBAAmD;AAEnD,4BAA8B;AAC9B,mCAKO;AACP,6BAAgC;AAChC,yBAAiC;AAO1B,MAAM,uBAA4D,CAAC;AAAA,EACxE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,cAAU,wCAAgB;AAEhC,SACE,4CAAC,uCAAc,mBAAmB,wDAChC;AAAA,IAAC;AAAA;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MACA;AAAA,MAEA,sDAAC,+BAA6B,GAAG,kBAAkB;AAAA;AAAA,EACrD,GACF;AAEJ;AAKA,MAAM,qBAAyC,CAAC;AAEhD,MAAM,8BAA8B,CAAC;AAAA,EACnC;AAAA,EACA,GAAG;AACL,MAA4C;AAC1C,QAAM,iBAAa,iCAAY;AAC/B,QAAM,yBAAqB,kCAAiB;AAAA,IAC1C,OAAO;AAAA,MACL,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,mBAAmB,MAAM,QAAQ;AAEvD,MAAI,mBAAmB,aAAa,CAAC,YAAY;AAC/C,WAAO,4CAAC,4DAA4B;AAAA,EACtC;AAEA,MAAI,mBAAmB,SAAS;AAC9B,WAAO,4CAAC,0DAA0B,OAAO,mBAAmB,OAAO;AAAA,EACrE;AAEA,SACE,4CAAC,uCAAc,mBAAmB,wDAChC;AAAA,IAAC,6BAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF;AAEJ;","names":["OrganizationSwitcherPresentational"]}
1
+ {"version":3,"sources":["../../src/organization-switcher.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { ApiProvider, AuthToken, useApiReady } from \"./api/api-provider.js\";\nimport { OrganizationInfo, useOrganizations } from \"./api/endpoint.js\";\nimport * as React from \"react\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport {\n OrganizationSwitcherError,\n OrganizationSwitcherLoading,\n OrganizationSwitcher as OrganizationSwitcherPresentational,\n} from \"./lib/organization-switcher.js\";\nimport type {\n OrganizationSwitcherErrorProps,\n OrganizationSwitcherLoadingProps,\n OrganizationSwitcherPassthroughProps,\n} from \"./lib/organization-switcher.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport { keepPreviousData } from \"@tanstack/react-query\";\n\ninterface OrganizationSwitcherProps\n extends OrganizationSwitcherPassthroughProps {\n authToken: AuthToken;\n}\n\nconst OrganizationSwitcher: React.FC<OrganizationSwitcherProps> = ({\n authToken,\n ...passthroughProps\n}) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <OrganizationSwitcherError {...passthroughProps} error={error} />\n )}\n >\n <ApiProvider\n widgetType=\"organization-switcher\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <OrganizationSwitcherImpl {...passthroughProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\n// Constant reference to avoid unnecessary prop changes\nconst emptyOrganizations: OrganizationInfo[] = [];\n\nconst OrganizationSwitcherImpl = ({\n variant,\n switchToOrganization,\n organizationLabel,\n truncateBehavior,\n children,\n ...domProps\n}: OrganizationSwitcherPassthroughProps) => {\n const isApiReady = useApiReady();\n const organizationsQuery = useOrganizations({\n query: {\n placeholderData: keepPreviousData,\n },\n });\n\n const organizations = organizationsQuery.data?.data ?? emptyOrganizations;\n\n if (organizationsQuery.isLoading || !isApiReady) {\n return <OrganizationSwitcherLoading {...domProps} />;\n }\n\n if (organizationsQuery.isError) {\n return (\n <OrganizationSwitcherError\n error={organizationsQuery.error}\n {...domProps}\n />\n );\n }\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <OrganizationSwitcherError error={error} {...domProps} />\n )}\n >\n <OrganizationSwitcherPresentational\n organizations={organizations}\n switchToOrganization={switchToOrganization}\n variant={variant}\n organizationLabel={organizationLabel}\n truncateBehavior={truncateBehavior}\n {...domProps}\n >\n {children}\n </OrganizationSwitcherPresentational>\n </ErrorBoundary>\n );\n};\n\nexport type {\n OrganizationSwitcherProps,\n OrganizationSwitcherLoadingProps,\n OrganizationSwitcherErrorProps,\n};\nexport {\n OrganizationSwitcher,\n OrganizationSwitcherLoading,\n OrganizationSwitcherError,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCQ;AA9BR,0BAAoD;AACpD,sBAAmD;AAEnD,4BAA8B;AAC9B,mCAIO;AAMP,6BAAgC;AAChC,yBAAiC;AAOjC,MAAM,uBAA4D,CAAC;AAAA,EACjE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,cAAU,wCAAgB;AAChC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,gBAAgB,CAAC,EAAE,MAAM,MACvB,4CAAC,0DAA2B,GAAG,kBAAkB,OAAc;AAAA,MAGjE;AAAA,QAAC;AAAA;AAAA,UACC,YAAW;AAAA,UACX;AAAA,UACA;AAAA,UAEA,sDAAC,4BAA0B,GAAG,kBAAkB;AAAA;AAAA,MAClD;AAAA;AAAA,EACF;AAEJ;AAGA,MAAM,qBAAyC,CAAC;AAEhD,MAAM,2BAA2B,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA4C;AAC1C,QAAM,iBAAa,iCAAY;AAC/B,QAAM,yBAAqB,kCAAiB;AAAA,IAC1C,OAAO;AAAA,MACL,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,mBAAmB,MAAM,QAAQ;AAEvD,MAAI,mBAAmB,aAAa,CAAC,YAAY;AAC/C,WAAO,4CAAC,4DAA6B,GAAG,UAAU;AAAA,EACpD;AAEA,MAAI,mBAAmB,SAAS;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,mBAAmB;AAAA,QACzB,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,gBAAgB,CAAC,EAAE,MAAM,MACvB,4CAAC,0DAA0B,OAAe,GAAG,UAAU;AAAA,MAGzD;AAAA,QAAC,6BAAAA;AAAA,QAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACC,GAAG;AAAA,UAEH;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;","names":["OrganizationSwitcherPresentational"]}
@@ -1,11 +1,12 @@
1
1
  import { AuthToken } from './api/api-provider.cjs';
2
2
  import * as React from 'react';
3
3
  import { OrganizationSwitcherPassthroughProps } from './lib/organization-switcher.cjs';
4
- export { OrganizationSwitcherLoading } from './lib/organization-switcher.cjs';
4
+ export { OrganizationSwitcherError, OrganizationSwitcherErrorProps, OrganizationSwitcherLoading, OrganizationSwitcherLoadingProps } from './lib/organization-switcher.cjs';
5
5
  import 'react/jsx-runtime';
6
6
  import './api/endpoint.cjs';
7
7
  import '@tanstack/react-query';
8
8
  import './api/widgets-api-client.cjs';
9
+ import './lib/utils.cjs';
9
10
 
10
11
  interface OrganizationSwitcherProps extends OrganizationSwitcherPassthroughProps {
11
12
  authToken: AuthToken;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var pipes_client_exports = {};
21
+ __export(pipes_client_exports, {
22
+ Pipes: () => Pipes,
23
+ PipesError: () => import_pipes.PipesError,
24
+ PipesLoading: () => import_pipes.PipesLoading
25
+ });
26
+ module.exports = __toCommonJS(pipes_client_exports);
27
+ var import_jsx_runtime = require("react/jsx-runtime");
28
+ var import_api_provider = require("./api/api-provider.js");
29
+ var import_widgets_context = require("./lib/widgets-context.js");
30
+ var import_pipes = require("./lib/pipes.js");
31
+ var import_endpoint = require("./api/endpoint.js");
32
+ var import_use_is_hydrated = require("./lib/use-is-hydrated.js");
33
+ var import_error_boundary = require("./lib/error-boundary.js");
34
+ const Pipes = ({ authToken, ...domProps }) => {
35
+ const baseUrl = (0, import_widgets_context.useWorkOsApiUrl)();
36
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
37
+ import_error_boundary.ErrorBoundary,
38
+ {
39
+ fallbackRender: ({ error }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_pipes.PipesError, { ...domProps, error }),
40
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_api_provider.ApiProvider, { widgetType: "pipes", authToken, baseUrl, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PipesImpl, { ...domProps }) })
41
+ }
42
+ );
43
+ };
44
+ const PipesImpl = (props) => {
45
+ const isHydrated = (0, import_use_is_hydrated.useIsHydrated)();
46
+ const integrations = (0, import_endpoint.useMyDataIntegrations)();
47
+ if (!isHydrated || integrations.isLoading) {
48
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_pipes.PipesLoading, { count: 6, ...props });
49
+ }
50
+ if (integrations.isError) {
51
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_pipes.PipesError, { error: integrations.error, ...props });
52
+ }
53
+ if (integrations.isSuccess) {
54
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_pipes.Pipes, { integrations: integrations.data.data, ...props });
55
+ }
56
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_pipes.PipesError, { error: integrations.error, ...props });
57
+ };
58
+ // Annotate the CommonJS export names for ESM import in node:
59
+ 0 && (module.exports = {
60
+ Pipes,
61
+ PipesError,
62
+ PipesLoading
63
+ });
64
+ //# sourceMappingURL=pipes.client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/pipes.client.tsx"],"sourcesContent":["\"use client\";\nimport { ApiProvider, AuthToken } from \"./api/api-provider.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n Pipes as PipesPresentational,\n PipesError,\n PipesLoading,\n} from \"./lib/pipes.js\";\nimport type { PipesErrorProps, PipesLoadingProps } from \"./lib/pipes.js\";\nimport { useMyDataIntegrations } from \"./api/endpoint.js\";\nimport { useIsHydrated } from \"./lib/use-is-hydrated.js\";\nimport { ErrorBoundary } from \"./lib/error-boundary.js\";\nimport { WidgetRootDomProps } from \"./lib/utils.js\";\n\ninterface PipesProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst Pipes: React.FC<PipesProps> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => <PipesError {...domProps} error={error} />}\n >\n <ApiProvider widgetType=\"pipes\" authToken={authToken} baseUrl={baseUrl}>\n <PipesImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\nconst PipesImpl = (props: Omit<PipesProps, \"authToken\">) => {\n const isHydrated = useIsHydrated();\n const integrations = useMyDataIntegrations();\n\n if (!isHydrated || integrations.isLoading) {\n return <PipesLoading count={6} {...props} />;\n }\n\n if (integrations.isError) {\n return <PipesError error={integrations.error} {...props} />;\n }\n\n if (integrations.isSuccess) {\n return (\n <PipesPresentational integrations={integrations.data.data} {...props} />\n );\n }\n\n return <PipesError error={integrations.error} {...props} />;\n};\n\nexport type { PipesProps, PipesLoadingProps, PipesErrorProps };\nexport { Pipes, PipesLoading, PipesError };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBqC;AAtBrC,0BAAuC;AACvC,6BAAgC;AAChC,mBAIO;AAEP,sBAAsC;AACtC,6BAA8B;AAC9B,4BAA8B;AAO9B,MAAM,QAA8B,CAAC,EAAE,WAAW,GAAG,SAAS,MAAM;AAClE,QAAM,cAAU,wCAAgB;AAEhC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,gBAAgB,CAAC,EAAE,MAAM,MAAM,4CAAC,2BAAY,GAAG,UAAU,OAAc;AAAA,MAEvE,sDAAC,mCAAY,YAAW,SAAQ,WAAsB,SACpD,sDAAC,aAAW,GAAG,UAAU,GAC3B;AAAA;AAAA,EACF;AAEJ;AAEA,MAAM,YAAY,CAAC,UAAyC;AAC1D,QAAM,iBAAa,sCAAc;AACjC,QAAM,mBAAe,uCAAsB;AAE3C,MAAI,CAAC,cAAc,aAAa,WAAW;AACzC,WAAO,4CAAC,6BAAa,OAAO,GAAI,GAAG,OAAO;AAAA,EAC5C;AAEA,MAAI,aAAa,SAAS;AACxB,WAAO,4CAAC,2BAAW,OAAO,aAAa,OAAQ,GAAG,OAAO;AAAA,EAC3D;AAEA,MAAI,aAAa,WAAW;AAC1B,WACE,4CAAC,aAAAA,OAAA,EAAoB,cAAc,aAAa,KAAK,MAAO,GAAG,OAAO;AAAA,EAE1E;AAEA,SAAO,4CAAC,2BAAW,OAAO,aAAa,OAAQ,GAAG,OAAO;AAC3D;","names":["PipesPresentational"]}
@@ -0,0 +1,15 @@
1
+ import { AuthToken } from './api/api-provider.cjs';
2
+ export { PipesError, PipesErrorProps, PipesLoading, PipesLoadingProps } from './lib/pipes.cjs';
3
+ import { WidgetRootDomProps } from './lib/utils.cjs';
4
+ import 'react/jsx-runtime';
5
+ import 'react';
6
+ import './api/endpoint.cjs';
7
+ import '@tanstack/react-query';
8
+ import './api/widgets-api-client.cjs';
9
+
10
+ interface PipesProps extends WidgetRootDomProps {
11
+ authToken: AuthToken;
12
+ }
13
+ declare const Pipes: React.FC<PipesProps>;
14
+
15
+ export { Pipes, type PipesProps };