@workos-inc/widgets 1.20.2-next.1792700156145 → 1.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -10
- package/dist/cjs/admin-portal-audit-log-streaming.client.cjs +2 -1
- package/dist/cjs/admin-portal-audit-log-streaming.client.cjs.map +1 -1
- package/dist/cjs/admin-portal-domain-verification.client.cjs +3 -2
- package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
- package/dist/cjs/admin-portal-sso-connection.client.cjs +2 -1
- package/dist/cjs/admin-portal-sso-connection.client.cjs.map +1 -1
- package/dist/cjs/api/api-provider.cjs +23 -1
- package/dist/cjs/api/api-provider.cjs.map +1 -1
- package/dist/cjs/api/api-provider.d.cts.map +1 -1
- package/dist/cjs/api/claims.cjs.map +1 -1
- package/dist/cjs/api/claims.d.cts +2 -1
- package/dist/cjs/api/claims.d.cts.map +1 -1
- package/dist/cjs/api/client-graphql/client.cjs +3 -2
- package/dist/cjs/api/client-graphql/client.cjs.map +1 -1
- package/dist/cjs/api/client-graphql/hooks.cjs +3 -20
- package/dist/cjs/api/client-graphql/hooks.cjs.map +1 -1
- package/dist/cjs/api/client-graphql/hooks.d.cts +3 -12
- package/dist/cjs/api/client-graphql/hooks.d.cts.map +1 -1
- package/dist/cjs/api/client-graphql/query-keys.cjs +25 -0
- package/dist/cjs/api/client-graphql/query-keys.cjs.map +1 -0
- package/dist/cjs/api/client-graphql/query-keys.d.cts +16 -0
- package/dist/cjs/api/client-graphql/query-keys.d.cts.map +1 -0
- package/dist/cjs/components/copy-text.cjs +1 -1
- package/dist/cjs/components/copy-text.cjs.map +1 -1
- package/dist/cjs/components/form.cjs +9 -13
- package/dist/cjs/components/form.cjs.map +1 -1
- package/dist/cjs/components/form.d.cts.map +1 -1
- package/dist/cjs/components/otp-input.cjs +1 -0
- package/dist/cjs/components/otp-input.cjs.map +1 -1
- package/dist/cjs/directory-sync.client.cjs +2 -1
- package/dist/cjs/directory-sync.client.cjs.map +1 -1
- package/dist/cjs/lib/api/api-key.cjs +4 -3
- package/dist/cjs/lib/api/api-key.cjs.map +1 -1
- package/dist/cjs/lib/api/me.cjs +2 -1
- package/dist/cjs/lib/api/me.cjs.map +1 -1
- package/dist/cjs/lib/api/pipes.cjs +7 -6
- package/dist/cjs/lib/api/pipes.cjs.map +1 -1
- package/dist/cjs/lib/api/user-api-key.cjs +3 -2
- package/dist/cjs/lib/api/user-api-key.cjs.map +1 -1
- package/dist/cjs/lib/i18n/intl-context.cjs.map +1 -1
- package/dist/cjs/lib/i18n/intl-context.d.cts +1 -0
- package/dist/cjs/lib/i18n/intl-context.d.cts.map +1 -1
- package/dist/cjs/lib/i18n/use-translation.cjs +2 -2
- package/dist/cjs/lib/i18n/use-translation.cjs.map +1 -1
- package/dist/cjs/lib/use-composed-event-handlers.cjs +15 -0
- package/dist/cjs/lib/use-composed-event-handlers.cjs.map +1 -0
- package/dist/cjs/lib/use-composed-event-handlers.d.cts +6 -0
- package/dist/cjs/lib/use-composed-event-handlers.d.cts.map +1 -0
- package/dist/cjs/lib/use-debounce.cjs +124 -116
- package/dist/cjs/lib/use-debounce.cjs.map +1 -1
- package/dist/cjs/lib/use-debounce.d.cts +53 -48
- package/dist/cjs/lib/use-debounce.d.cts.map +1 -1
- package/dist/cjs/lib/use-widgets-invalidator.cjs +3 -3
- package/dist/cjs/lib/use-widgets-invalidator.cjs.map +1 -1
- package/dist/cjs/lib/use-widgets-invalidator.d.cts.map +1 -1
- package/dist/cjs/lib/utils.cjs +0 -7
- package/dist/cjs/lib/utils.cjs.map +1 -1
- package/dist/cjs/lib/utils.d.cts +0 -3
- package/dist/cjs/lib/utils.d.cts.map +1 -1
- package/dist/cjs/organization-switcher.client.cjs +2 -1
- package/dist/cjs/organization-switcher.client.cjs.map +1 -1
- package/dist/cjs/pipes-admin.client.cjs +2 -1
- package/dist/cjs/pipes-admin.client.cjs.map +1 -1
- package/dist/cjs/pipes.client.cjs +2 -1
- package/dist/cjs/pipes.client.cjs.map +1 -1
- package/dist/cjs/user-security.client.cjs +2 -1
- package/dist/cjs/user-security.client.cjs.map +1 -1
- package/dist/cjs/user-sessions.client.cjs +2 -1
- package/dist/cjs/user-sessions.client.cjs.map +1 -1
- package/dist/cjs/widgets/api-keys/api-keys-search.cjs +1 -1
- package/dist/cjs/widgets/api-keys/api-keys-search.cjs.map +1 -1
- package/dist/cjs/widgets/api-keys/user-api-keys-search.cjs +1 -1
- package/dist/cjs/widgets/api-keys/user-api-keys-search.cjs.map +1 -1
- package/dist/cjs/widgets/organization-switcher/organization-switcher.cjs +19 -5
- package/dist/cjs/widgets/organization-switcher/organization-switcher.cjs.map +1 -1
- package/dist/cjs/widgets/organization-switcher/organization-switcher.d.cts +2 -1
- package/dist/cjs/widgets/organization-switcher/organization-switcher.d.cts.map +1 -1
- package/dist/cjs/widgets/pipes/pipes.cjs +3 -2
- package/dist/cjs/widgets/pipes/pipes.cjs.map +1 -1
- package/dist/cjs/widgets/user-sessions/logout-all-sessions-dialog.cjs +2 -1
- package/dist/cjs/widgets/user-sessions/logout-all-sessions-dialog.cjs.map +1 -1
- package/dist/cjs/widgets/user-sessions/logout-dialog.cjs +2 -1
- package/dist/cjs/widgets/user-sessions/logout-dialog.cjs.map +1 -1
- package/dist/cjs/widgets/users-management/invite-user-dialog.cjs +5 -6
- package/dist/cjs/widgets/users-management/invite-user-dialog.cjs.map +1 -1
- package/dist/cjs/widgets/users-management/users-management-utils.cjs +4 -3
- package/dist/cjs/widgets/users-management/users-management-utils.cjs.map +1 -1
- package/dist/cjs/widgets/users-management/users-management.cjs.map +1 -1
- package/dist/cjs/widgets/users-management/users-search.cjs +1 -1
- package/dist/cjs/widgets/users-management/users-search.cjs.map +1 -1
- package/dist/esm/admin-portal-audit-log-streaming.client.js +2 -1
- package/dist/esm/admin-portal-audit-log-streaming.client.js.map +1 -1
- package/dist/esm/admin-portal-domain-verification.client.js +2 -1
- package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
- package/dist/esm/admin-portal-sso-connection.client.js +2 -1
- package/dist/esm/admin-portal-sso-connection.client.js.map +1 -1
- package/dist/esm/api/api-provider.d.ts.map +1 -1
- package/dist/esm/api/api-provider.js +23 -1
- package/dist/esm/api/api-provider.js.map +1 -1
- package/dist/esm/api/claims.d.ts +2 -1
- package/dist/esm/api/claims.d.ts.map +1 -1
- package/dist/esm/api/claims.js.map +1 -1
- package/dist/esm/api/client-graphql/client.js +3 -2
- package/dist/esm/api/client-graphql/client.js.map +1 -1
- package/dist/esm/api/client-graphql/hooks.d.ts +3 -12
- package/dist/esm/api/client-graphql/hooks.d.ts.map +1 -1
- package/dist/esm/api/client-graphql/hooks.js +1 -18
- package/dist/esm/api/client-graphql/hooks.js.map +1 -1
- package/dist/esm/api/client-graphql/query-keys.d.ts +16 -0
- package/dist/esm/api/client-graphql/query-keys.d.ts.map +1 -0
- package/dist/esm/api/client-graphql/query-keys.js +23 -0
- package/dist/esm/api/client-graphql/query-keys.js.map +1 -0
- package/dist/esm/components/copy-text.js +1 -1
- package/dist/esm/components/copy-text.js.map +1 -1
- package/dist/esm/components/form.d.ts.map +1 -1
- package/dist/esm/components/form.js +9 -13
- package/dist/esm/components/form.js.map +1 -1
- package/dist/esm/components/otp-input.js +1 -0
- package/dist/esm/components/otp-input.js.map +1 -1
- package/dist/esm/directory-sync.client.js +2 -1
- package/dist/esm/directory-sync.client.js.map +1 -1
- package/dist/esm/lib/api/api-key.js +2 -1
- package/dist/esm/lib/api/api-key.js.map +1 -1
- package/dist/esm/lib/api/me.js +2 -1
- package/dist/esm/lib/api/me.js.map +1 -1
- package/dist/esm/lib/api/pipes.js +2 -1
- package/dist/esm/lib/api/pipes.js.map +1 -1
- package/dist/esm/lib/api/user-api-key.js +2 -1
- package/dist/esm/lib/api/user-api-key.js.map +1 -1
- package/dist/esm/lib/i18n/intl-context.d.ts +1 -0
- package/dist/esm/lib/i18n/intl-context.d.ts.map +1 -1
- package/dist/esm/lib/i18n/intl-context.js.map +1 -1
- package/dist/esm/lib/i18n/use-translation.js +2 -2
- package/dist/esm/lib/i18n/use-translation.js.map +1 -1
- package/dist/esm/lib/use-composed-event-handlers.d.ts +6 -0
- package/dist/esm/lib/use-composed-event-handlers.d.ts.map +1 -0
- package/dist/esm/lib/use-composed-event-handlers.js +12 -0
- package/dist/esm/lib/use-composed-event-handlers.js.map +1 -0
- package/dist/esm/lib/use-debounce.d.ts +53 -48
- package/dist/esm/lib/use-debounce.d.ts.map +1 -1
- package/dist/esm/lib/use-debounce.js +124 -116
- package/dist/esm/lib/use-debounce.js.map +1 -1
- package/dist/esm/lib/use-widgets-invalidator.d.ts.map +1 -1
- package/dist/esm/lib/use-widgets-invalidator.js +2 -2
- package/dist/esm/lib/use-widgets-invalidator.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +0 -3
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +1 -7
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/organization-switcher.client.js +2 -1
- package/dist/esm/organization-switcher.client.js.map +1 -1
- package/dist/esm/pipes-admin.client.js +2 -1
- package/dist/esm/pipes-admin.client.js.map +1 -1
- package/dist/esm/pipes.client.js +2 -1
- package/dist/esm/pipes.client.js.map +1 -1
- package/dist/esm/user-security.client.js +2 -1
- package/dist/esm/user-security.client.js.map +1 -1
- package/dist/esm/user-sessions.client.js +2 -1
- package/dist/esm/user-sessions.client.js.map +1 -1
- package/dist/esm/widgets/api-keys/api-keys-search.js +1 -1
- package/dist/esm/widgets/api-keys/api-keys-search.js.map +1 -1
- package/dist/esm/widgets/api-keys/user-api-keys-search.js +1 -1
- package/dist/esm/widgets/api-keys/user-api-keys-search.js.map +1 -1
- package/dist/esm/widgets/organization-switcher/organization-switcher.d.ts +2 -1
- package/dist/esm/widgets/organization-switcher/organization-switcher.d.ts.map +1 -1
- package/dist/esm/widgets/organization-switcher/organization-switcher.js +19 -5
- package/dist/esm/widgets/organization-switcher/organization-switcher.js.map +1 -1
- package/dist/esm/widgets/pipes/pipes.js +2 -1
- package/dist/esm/widgets/pipes/pipes.js.map +1 -1
- package/dist/esm/widgets/user-sessions/logout-all-sessions-dialog.js +2 -1
- package/dist/esm/widgets/user-sessions/logout-all-sessions-dialog.js.map +1 -1
- package/dist/esm/widgets/user-sessions/logout-dialog.js +2 -1
- package/dist/esm/widgets/user-sessions/logout-dialog.js.map +1 -1
- package/dist/esm/widgets/users-management/invite-user-dialog.js +5 -6
- package/dist/esm/widgets/users-management/invite-user-dialog.js.map +1 -1
- package/dist/esm/widgets/users-management/users-management-utils.js +2 -1
- package/dist/esm/widgets/users-management/users-management-utils.js.map +1 -1
- package/dist/esm/widgets/users-management/users-management.js.map +1 -1
- package/dist/esm/widgets/users-management/users-search.js +1 -1
- package/dist/esm/widgets/users-management/users-search.js.map +1 -1
- package/package.json +1 -1
- package/src/api/api-provider.tsx +39 -1
- package/src/api/claims.ts +2 -1
- package/src/api/client-graphql/client.ts +8 -2
- package/src/api/client-graphql/hooks.ts +8 -27
- package/src/api/client-graphql/query-keys.ts +29 -0
- package/src/components/copy-text.tsx +1 -1
- package/src/components/form.tsx +33 -29
- package/src/components/otp-input.tsx +2 -0
- package/src/lib/i18n/intl-context.tsx +4 -0
- package/src/lib/i18n/use-translation.ts +1 -4
- package/src/lib/use-composed-event-handlers.ts +25 -0
- package/src/lib/use-debounce.ts +289 -237
- package/src/lib/use-widgets-invalidator.ts +0 -4
- package/src/lib/utils.ts +0 -12
- package/src/widgets/api-keys/api-keys-search.tsx +6 -3
- package/src/widgets/api-keys/user-api-keys-search.tsx +6 -3
- package/src/widgets/organization-switcher/organization-switcher.tsx +32 -8
- package/src/widgets/users-management/invite-user-dialog.tsx +9 -11
- package/src/widgets/users-management/users-management.tsx +1 -1
- package/src/widgets/users-management/users-search.tsx +6 -3
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
|
|
4
|
+
const require_api_client_graphql_query_keys = require("../../api/client-graphql/query-keys.cjs");
|
|
4
5
|
const require_api_client_graphql_hooks = require("../../api/client-graphql/hooks.cjs");
|
|
5
6
|
const require_components_elements_button = require("../../components/elements/button.cjs");
|
|
6
7
|
const require_components_elements_alert_dialog = require("../../components/elements/alert-dialog.cjs");
|
|
@@ -23,7 +24,7 @@ const LogoutAllSessionsDialog = ({ open, onOpenChange, currentSessionId, childre
|
|
|
23
24
|
};
|
|
24
25
|
const handleDone = react.useCallback(() => {
|
|
25
26
|
onOpenChange?.(false);
|
|
26
|
-
client.invalidateQueries({ queryKey:
|
|
27
|
+
client.invalidateQueries({ queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("Sessions") });
|
|
27
28
|
}, [client, onOpenChange]);
|
|
28
29
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_themes_components_alert_dialog.Root, {
|
|
29
30
|
open,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout-all-sessions-dialog.cjs","names":["useQueryClient","useClientGraphqlMutation","expectResultMember","React","clientGraphqlQueryKey","Translation","Flex","Button","SaveButton"],"sources":["../../../../src/widgets/user-sessions/logout-all-sessions-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../../api/client-graphql/hooks.js\";\nimport { AlertDialog, Button } from \"../../components/elements.js\";\nimport { SaveButton } from \"../../components/save-button.js\";\nimport { expectResultMember } from \"../../lib/client-graphql-result.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\n\ninterface LogoutAllSessionsDialogProps extends AlertDialog.RootProps {\n currentSessionId?: string;\n children?: ReactNode;\n}\n\nconst LogoutAllSessionsDialog: React.FC<LogoutAllSessionsDialogProps> = ({\n open,\n onOpenChange,\n currentSessionId,\n children,\n ...props\n}) => {\n const client = useQueryClient();\n\n const revokeAllSessions = useClientGraphqlMutation({\n mutationFn: async (sdk) =>\n expectResultMember(\n (\n await sdk.RevokeAllSessions({\n input: { currentSessionId: currentSessionId || null },\n })\n ).revokeAllSessions,\n \"AllSessionsRevoked\",\n ),\n });\n\n const onSubmitForm = () => {\n revokeAllSessions.mutate();\n };\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n });\n }, [client, onOpenChange]);\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of all other devices?\"\n id=\"x//BWg\"\n description=\"Dialog title asking to confirm signing out of all other devices\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be logged out of all other active sessions on other devices, except this one.\"\n id=\"GftsX9\"\n description=\"Description explaining all other sessions will be logged out\"\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={\n revokeAllSessions.isPending || revokeAllSessions.isSuccess\n }\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"Pnmy4H\"\n description=\"Button to cancel signing out of all devices\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeAllSessions.isPending}\n done={revokeAllSessions.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"1Fb48o\"\n description=\"Button to confirm signing out of all other devices\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\nexport { LogoutAllSessionsDialog };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout-all-sessions-dialog.cjs","names":["useQueryClient","useClientGraphqlMutation","expectResultMember","React","clientGraphqlQueryKey","Translation","Flex","Button","SaveButton"],"sources":["../../../../src/widgets/user-sessions/logout-all-sessions-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../../api/client-graphql/hooks.js\";\nimport { AlertDialog, Button } from \"../../components/elements.js\";\nimport { SaveButton } from \"../../components/save-button.js\";\nimport { expectResultMember } from \"../../lib/client-graphql-result.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\n\ninterface LogoutAllSessionsDialogProps extends AlertDialog.RootProps {\n currentSessionId?: string;\n children?: ReactNode;\n}\n\nconst LogoutAllSessionsDialog: React.FC<LogoutAllSessionsDialogProps> = ({\n open,\n onOpenChange,\n currentSessionId,\n children,\n ...props\n}) => {\n const client = useQueryClient();\n\n const revokeAllSessions = useClientGraphqlMutation({\n mutationFn: async (sdk) =>\n expectResultMember(\n (\n await sdk.RevokeAllSessions({\n input: { currentSessionId: currentSessionId || null },\n })\n ).revokeAllSessions,\n \"AllSessionsRevoked\",\n ),\n });\n\n const onSubmitForm = () => {\n revokeAllSessions.mutate();\n };\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n });\n }, [client, onOpenChange]);\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of all other devices?\"\n id=\"x//BWg\"\n description=\"Dialog title asking to confirm signing out of all other devices\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be logged out of all other active sessions on other devices, except this one.\"\n id=\"GftsX9\"\n description=\"Description explaining all other sessions will be logged out\"\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={\n revokeAllSessions.isPending || revokeAllSessions.isSuccess\n }\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"Pnmy4H\"\n description=\"Button to cancel signing out of all devices\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeAllSessions.isPending}\n done={revokeAllSessions.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"1Fb48o\"\n description=\"Button to confirm signing out of all other devices\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\nexport { LogoutAllSessionsDialog };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,MAAM,2BAAmE,EACvE,MACA,cACA,kBACA,UACA,GAAG,YACC;CACJ,MAAM,UAAA,GAASA,sBAAAA,eAAAA,CAAe;CAE9B,MAAM,oBAAoBC,iCAAAA,yBAAyB,EACjD,YAAY,OAAO,QACjBC,kCAAAA,oBAEI,MAAM,IAAI,kBAAkB,EAC1B,OAAO,EAAE,kBAAkB,oBAAoB,KAAK,EACtD,CAAC,EAAA,CACD,mBACF,oBACF,EACJ,CAAC;CAED,MAAM,qBAAqB;EACzB,kBAAkB,OAAO;CAC3B;CAEA,MAAM,aAAaC,MAAM,kBAAkB;EACzC,eAAe,KAAK;EAEpB,OAAO,kBAAkB,EACvB,UAAUC,sCAAAA,sBAAsB,UAAU,EAC5C,CAAC;CACH,GAAG,CAAC,QAAQ,YAAY,CAAC;CAEzB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,MAAA;EAAwB;EAAoB;EAAc,GAAI;EAC5D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,yCAAA,SAAA;GAAqB,UAAS;GAA9B,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,OAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACgB,CAAA;IACnB,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,aAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACsB,CAAA;IAEzB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAD;KAAM,KAAI;KAAI,SAAQ;KAAM,IAAG;KAAI,SAAA;KACjC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MACE,WAAW,UAAU;OACnB,MAAM,eAAe;OACrB,aAAa;MACf;MAJF,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,QAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,mCAAAA,QAAD;OACE,SAAQ;OACR,UACE,kBAAkB,aAAa,kBAAkB;OAGnD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,6BAAAA,aAAD;QACE,gBAAe;QACf,IAAG;QACH,aAAY;OACb,CAAA;MACK,CAAA,EACU,CAAA,GAEpB,iBAAA,GAAA,kBAAA,IAAA,CAACG,+BAAAA,YAAD;OACE,SAAA;OACA,SAAS,kBAAkB;OAC3B,MAAM,kBAAkB;OACxB,QAAQ;OAER,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,mCAAAA,QAAD;QAAQ,SAAQ;QAAc,MAAK;QACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,6BAAAA,aAAD;SACE,gBAAe;SACf,IAAG;SACH,aAAY;QACb,CAAA;OACK,CAAA;MACE,CAAA,CACR;;IACF,CAAA;GACa;;CACL,CAAA;AAEtB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
|
|
4
|
+
const require_api_client_graphql_query_keys = require("../../api/client-graphql/query-keys.cjs");
|
|
4
5
|
const require_api_client_graphql_hooks = require("../../api/client-graphql/hooks.cjs");
|
|
5
6
|
const require_components_elements_button = require("../../components/elements/button.cjs");
|
|
6
7
|
const require_lib_i18n_use_translation = require("../../lib/i18n/use-translation.cjs");
|
|
@@ -29,7 +30,7 @@ const LogoutDialog = ({ children, session, open, onOpenChange, ...props }) => {
|
|
|
29
30
|
const handleDone = react.useCallback(() => {
|
|
30
31
|
onOpenChange?.(false);
|
|
31
32
|
client.invalidateQueries({
|
|
32
|
-
queryKey:
|
|
33
|
+
queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("Sessions"),
|
|
33
34
|
exact: false
|
|
34
35
|
});
|
|
35
36
|
}, [onOpenChange, client]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout-dialog.cjs","names":["useQueryClient","useTranslation","parseUserAgent","useClientGraphqlMutation","expectResultMember","React","clientGraphqlQueryKey","Translation","Strong","Flex","Button","SaveButton"],"sources":["../../../../src/widgets/user-sessions/logout-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex, Strong } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { SessionFieldsFragment } from \"../../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../../api/client-graphql/hooks.js\";\nimport { AlertDialog, Button } from \"../../components/elements.js\";\nimport { SaveButton } from \"../../components/save-button.js\";\nimport { expectResultMember } from \"../../lib/client-graphql-result.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { parseUserAgent } from \"../../lib/parse-user-agent.js\";\n\ninterface LogoutDialogProps extends AlertDialog.RootProps {\n children?: ReactNode;\n session: SessionFieldsFragment;\n}\n\nconst LogoutDialog: React.FC<LogoutDialogProps> = ({\n children,\n session,\n open,\n onOpenChange,\n ...props\n}) => {\n const client = useQueryClient();\n const translate = useTranslation();\n const device =\n parseUserAgent(session.userAgent)?.pretty ??\n translate({\n defaultMessage: \"Unknown device\",\n id: \"nF+P+T\",\n description:\n \"Label for a session whose device could not be determined from its user agent\",\n });\n\n const revokeSession = useClientGraphqlMutation({\n mutationFn: async (sdk, sessionId: string) =>\n expectResultMember(\n (await sdk.RevokeSession({ input: { sessionId } })).revokeSession,\n \"SessionRevoked\",\n ),\n });\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n exact: false,\n });\n }, [onOpenChange, client]);\n\n const onSubmitForm = () => {\n revokeSession.mutate(session.id);\n };\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of device?\"\n id=\"Jic5nB\"\n description=\"Dialog title asking to confirm signing out of a device\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be signed out of {device}.\"\n id=\"diFnRK\"\n description=\"Description explaining the user will be signed out of a specific device\"\n values={{ device: <Strong>{device}</Strong> }}\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={revokeSession.isPending || revokeSession.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"KjY2RX\"\n description=\"Button to cancel the logout action\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeSession.isPending}\n done={revokeSession.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"tRJt/S\"\n description=\"Button to confirm signing out of device\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\nexport { LogoutDialog };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout-dialog.cjs","names":["useQueryClient","useTranslation","parseUserAgent","useClientGraphqlMutation","expectResultMember","React","clientGraphqlQueryKey","Translation","Strong","Flex","Button","SaveButton"],"sources":["../../../../src/widgets/user-sessions/logout-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex, Strong } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { SessionFieldsFragment } from \"../../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../../api/client-graphql/hooks.js\";\nimport { AlertDialog, Button } from \"../../components/elements.js\";\nimport { SaveButton } from \"../../components/save-button.js\";\nimport { expectResultMember } from \"../../lib/client-graphql-result.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { parseUserAgent } from \"../../lib/parse-user-agent.js\";\n\ninterface LogoutDialogProps extends AlertDialog.RootProps {\n children?: ReactNode;\n session: SessionFieldsFragment;\n}\n\nconst LogoutDialog: React.FC<LogoutDialogProps> = ({\n children,\n session,\n open,\n onOpenChange,\n ...props\n}) => {\n const client = useQueryClient();\n const translate = useTranslation();\n const device =\n parseUserAgent(session.userAgent)?.pretty ??\n translate({\n defaultMessage: \"Unknown device\",\n id: \"nF+P+T\",\n description:\n \"Label for a session whose device could not be determined from its user agent\",\n });\n\n const revokeSession = useClientGraphqlMutation({\n mutationFn: async (sdk, sessionId: string) =>\n expectResultMember(\n (await sdk.RevokeSession({ input: { sessionId } })).revokeSession,\n \"SessionRevoked\",\n ),\n });\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n exact: false,\n });\n }, [onOpenChange, client]);\n\n const onSubmitForm = () => {\n revokeSession.mutate(session.id);\n };\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of device?\"\n id=\"Jic5nB\"\n description=\"Dialog title asking to confirm signing out of a device\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be signed out of {device}.\"\n id=\"diFnRK\"\n description=\"Description explaining the user will be signed out of a specific device\"\n values={{ device: <Strong>{device}</Strong> }}\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={revokeSession.isPending || revokeSession.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"KjY2RX\"\n description=\"Button to cancel the logout action\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeSession.isPending}\n done={revokeSession.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"tRJt/S\"\n description=\"Button to confirm signing out of device\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\nexport { LogoutDialog };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,MAAM,gBAA6C,EACjD,UACA,SACA,MACA,cACA,GAAG,YACC;CACJ,MAAM,UAAA,GAASA,sBAAAA,eAAAA,CAAe;CAC9B,MAAM,YAAYC,iCAAAA,eAAe;CACjC,MAAM,SACJC,6BAAAA,eAAe,QAAQ,SAAS,CAAC,EAAE,UACnC,UAAU;EACR,gBAAgB;EAChB,IAAI;EACJ,aACE;CACJ,CAAC;CAEH,MAAM,gBAAgBC,iCAAAA,yBAAyB,EAC7C,YAAY,OAAO,KAAK,cACtBC,kCAAAA,oBACG,MAAM,IAAI,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAA,CAAG,eACpD,gBACF,EACJ,CAAC;CAED,MAAM,aAAaC,MAAM,kBAAkB;EACzC,eAAe,KAAK;EAEpB,OAAO,kBAAkB;GACvB,UAAUC,sCAAAA,sBAAsB,UAAU;GAC1C,OAAO;EACT,CAAC;CACH,GAAG,CAAC,cAAc,MAAM,CAAC;CAEzB,MAAM,qBAAqB;EACzB,cAAc,OAAO,QAAQ,EAAE;CACjC;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,MAAA;EAAwB;EAAoB;EAAc,GAAI;EAC5D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,yCAAA,SAAA;GAAqB,UAAS;GAA9B,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,OAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACgB,CAAA;IACnB,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,aAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;KACZ,QAAQ,EAAE,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,QAAD,EAAA,UAAS,OAAe,CAAA,EAAE;IAC7C,CAAA,EACsB,CAAA;IAEzB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAD;KAAM,KAAI;KAAI,SAAQ;KAAM,IAAG;KAAI,SAAA;KACjC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MACE,WAAW,UAAU;OACnB,MAAM,eAAe;OACrB,aAAa;MACf;MAJF,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,QAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,mCAAAA,QAAD;OACE,SAAQ;OACR,UAAU,cAAc,aAAa,cAAc;OAEnD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACH,6BAAAA,aAAD;QACE,gBAAe;QACf,IAAG;QACH,aAAY;OACb,CAAA;MACK,CAAA,EACU,CAAA,GAEpB,iBAAA,GAAA,kBAAA,IAAA,CAACI,+BAAAA,YAAD;OACE,SAAA;OACA,SAAS,cAAc;OACvB,MAAM,cAAc;OACpB,QAAQ;OAER,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,mCAAAA,QAAD;QAAQ,SAAQ;QAAc,MAAK;QACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACH,6BAAAA,aAAD;SACE,gBAAe;SACf,IAAG;SACH,aAAY;QACb,CAAA;OACK,CAAA;MACE,CAAA,CACR;;IACF,CAAA;GACa;;CACL,CAAA;AAEtB"}
|
|
@@ -35,12 +35,11 @@ const InviteUserDialog = ({ children }) => {
|
|
|
35
35
|
const rolesQuery = require_widgets_users_management_users_management_utils.useRolesAndConfig();
|
|
36
36
|
const roles = rolesQuery.data?.roles ?? require_widgets_users_management_users_management_utils.EMPTY_ROLES_AND_CONFIG.roles.roles;
|
|
37
37
|
const [selectedRole, setSelectedRole] = react.useState(() => getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE);
|
|
38
|
-
react.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}, [roles]);
|
|
38
|
+
const [previousRoles, setPreviousRoles] = react.useState(roles);
|
|
39
|
+
if (previousRoles !== roles) {
|
|
40
|
+
setPreviousRoles(roles);
|
|
41
|
+
if (!roles.find((role) => role.slug === selectedRole)) setSelectedRole(getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE);
|
|
42
|
+
}
|
|
44
43
|
const onSubmitForm = (input) => {
|
|
45
44
|
if (inviteUser.isPending || rolesQuery.status !== "success") return;
|
|
46
45
|
inviteUser.mutate(input, { onSuccess: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invite-user-dialog.cjs","names":["useTranslation","React","useRolesAndConfig","EMPTY_ROLES_AND_CONFIG","Translation","Flex","Text","Callout","Button","VisuallyHidden","Label","isErrorLike","useInvalidateMembers","useClientGraphqlMutation","unwrapInviteUser"],"sources":["../../../../src/widgets/users-management/invite-user-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport type { InviteUserInput } from \"../../api/client-graphql/generated.js\";\nimport { useClientGraphqlMutation } from \"../../api/client-graphql/hooks.js\";\nimport {\n Button,\n Dialog,\n Label,\n Select,\n TextField,\n} from \"../../components/elements.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { isErrorLike } from \"../../lib/utils.js\";\nimport {\n EMPTY_ROLES_AND_CONFIG,\n unwrapInviteUser,\n useInvalidateMembers,\n useRolesAndConfig,\n} from \"./users-management-utils.js\";\nimport type { Role } from \"./users-management-utils.js\";\n\n/**\n * Used to stub a fake value for the role select. It will be selected by default\n * before the role query resolves, or if the query results in an error. We do\n * this because we need to provide _any_ value to the select to avoid\n * controlled/uncontrolled bugs.\n */\nconst PLACEHOLDER_ROLE = \"_rolePlaceholder\";\n\ninterface InviteUserDialogProps {\n children?: React.ReactNode;\n}\n\nconst InviteUserDialog: React.FC<InviteUserDialogProps> = ({ children }) => {\n const translate = useTranslation();\n const [open, setOpen] = React.useState(false);\n const dialogId = toId(\"invite-user\", React.useId());\n const formId = toId(dialogId, \"form\");\n\n const inviteUser = useInviteUser();\n const rolesQuery = useRolesAndConfig();\n const roles = rolesQuery.data?.roles ?? EMPTY_ROLES_AND_CONFIG.roles.roles;\n const [selectedRole, setSelectedRole] = React.useState(\n () => getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE,\n );\n React.useEffect(() => {\n // Update the selected role if it's not in the list (eg if the list was\n // previously empty and the query resolved)\n // TODO: Fix this!\n // oxlint-disable-next-line react/set-state-in-effect\n setSelectedRole((selectedRole) => {\n if (roles.find((role) => role.slug === selectedRole)) {\n // if current selected role is in the new list, don't change it\n return selectedRole;\n }\n return getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE;\n });\n }, [roles]);\n\n const onSubmitForm = (input: InviteUserInput) => {\n if (inviteUser.isPending || rolesQuery.status !== \"success\") {\n return;\n }\n inviteUser.mutate(input, {\n onSuccess: () => {\n setOpen(false);\n },\n });\n };\n\n const formErrors = getFormErrors(inviteUser.error);\n useFormFieldFocusOnError(dialogId, inviteUser.error);\n\n return (\n <Dialog.Root open={open} onOpenChange={setOpen}>\n {children && <Dialog.Trigger>{children}</Dialog.Trigger>}\n <Dialog.Content maxWidth=\"480px\" key={String(open)}>\n <Dialog.Title>\n <Translation\n defaultMessage=\"Invite user\"\n id=\"6+aYFi\"\n description=\"Dialog title for inviting a user\"\n />\n </Dialog.Title>\n <Dialog.Description>\n <Translation\n defaultMessage=\"An invitation will be sent to this email address with a link to complete their account.\"\n id=\"IicELr\"\n description=\"Dialog description explaining invitation process\"\n />\n </Dialog.Description>\n <Flex direction=\"column\" gap=\"4\" mt=\"5\" asChild>\n <form\n id={formId}\n onSubmit={async (event) => {\n event.preventDefault();\n onSubmitForm({\n email: event.currentTarget.email.value,\n roleSlug: selectedRole,\n });\n }}\n >\n <FormField\n rootId={dialogId}\n name=\"email\"\n label={translate({\n defaultMessage: \"Email address\",\n id: \"ACNqhk\",\n description: \"Label for email address field\",\n })}\n error={formErrors.fields.email}\n required\n control={(props) => (\n <TextField.Root\n {...props}\n data-1p-ignore=\"true\"\n data-lpignore=\"true\"\n type=\"email\"\n autoComplete=\"off\"\n placeholder={translate({\n defaultMessage: \"Enter an email address\",\n id: \"0ulARV\",\n description: \"Placeholder for email address field\",\n })}\n />\n )}\n />\n\n <FormField\n rootId={dialogId}\n name=\"role\"\n label={translate({\n defaultMessage: \"Role\",\n id: \"1Htc3a\",\n description: \"Label for role selection field\",\n })}\n error={formErrors.fields.role}\n disabled={rolesQuery.isPending || roles.length <= 1}\n info={\n roles.length === 1 ? (\n <Translation\n defaultMessage=\"New users will be invited with the {roleName} role, as it is the only one available.\"\n id=\"/CNKkm\"\n description=\"Info message when only one role is available\"\n values={{\n roleName: <Text weight=\"bold\">{roles[0].name}</Text>,\n }}\n />\n ) : undefined\n }\n control={({\n id,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedBy,\n ...props\n }) => (\n <Select.Root\n {...props}\n value={selectedRole}\n onValueChange={setSelectedRole}\n >\n <Select.Trigger\n id={id}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n />\n <Select.Content>\n <Select.Item value={PLACEHOLDER_ROLE} disabled>\n <Translation\n defaultMessage=\"Select a role\"\n id=\"0VMIWs\"\n description=\"Placeholder option for role selection\"\n />\n </Select.Item>\n {roles.map((role) => (\n <Select.Item key={role.slug} value={role.slug}>\n {role.name}\n </Select.Item>\n ))}\n </Select.Content>\n </Select.Root>\n )}\n />\n </form>\n </Flex>\n\n {formErrors.form ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>{formErrors.form}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={inviteUser.isPending}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <Button\n type=\"submit\"\n form={formId}\n loading={inviteUser.isPending}\n disabled={rolesQuery.isPending || undefined}\n >\n <Translation\n defaultMessage=\"Invite\"\n id=\"JIQROV\"\n description=\"Invite button text to send invitation\"\n />\n </Button>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">{formErrors.form}</section>\n </VisuallyHidden>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\ninterface FormControlRenderProps {\n id: string;\n name: string;\n \"aria-describedby\": string | undefined;\n \"aria-invalid\"?: boolean;\n required: boolean | undefined;\n disabled: boolean | undefined;\n}\n\ninterface FormFieldProps {\n rootId: string;\n name: string;\n label: string;\n error?: React.ReactNode;\n info?: React.ReactNode;\n control: (props: FormControlRenderProps) => React.ReactNode;\n required?: boolean;\n disabled?: boolean;\n}\n\nconst FormField: React.FC<FormFieldProps> = ({\n rootId,\n name,\n label,\n error,\n info,\n control,\n required,\n disabled,\n}) => {\n const fieldId = toId(rootId, name);\n const errorId = toId(rootId, name, \"error\");\n const infoId = toId(rootId, name, \"info\");\n return (\n <Flex direction=\"column\" gap=\"1\">\n <Label htmlFor={fieldId}>{label}</Label>\n {control({\n id: fieldId,\n name,\n \"aria-describedby\": (() => {\n const tags: string[] = [];\n if (error) {\n tags.push(errorId);\n }\n if (info) {\n tags.push(infoId);\n }\n if (tags.length === 0) {\n return undefined;\n }\n return tags.join(\" \");\n })(),\n \"aria-invalid\": !!error || undefined,\n required: required || undefined,\n disabled: disabled || undefined,\n })}\n\n {error ? (\n <Text color=\"red\" size=\"2\" id={errorId}>\n {error}\n </Text>\n ) : null}\n {info ? (\n <Text color=\"gray\" size=\"2\" id={infoId} mt=\"1\">\n {info}\n </Text>\n ) : null}\n </Flex>\n );\n};\n\nfunction toId(...parts: string[]) {\n return parts.join(\"-\");\n}\n\nfunction getFormErrors(queryError: unknown) {\n const formErrors = {\n form: null as string | null,\n fields: {\n email: null as string | null,\n role: null as string | null,\n },\n };\n\n if (queryError) {\n if (!isErrorLike(queryError)) {\n return {\n ...formErrors,\n form: \"An unexpected error occurred. Please try again.\",\n };\n }\n\n switch (queryError.message.toLowerCase()) {\n case \"user already exists\":\n case \"user already invited\":\n case \"invalid email\":\n formErrors.fields.email = queryError.message;\n break;\n case \"invalid role\":\n formErrors.fields.role = queryError.message;\n break;\n case \"this organization is not allowed to send invites.\":\n formErrors.form = queryError.message;\n break;\n default:\n // TODO handle more cases for various server errors\n formErrors.form =\n \"There was an error inviting this user. Please refresh the page and try again.\";\n break;\n }\n }\n\n return formErrors;\n}\n\n// Note: Error messages in getFormErrors are kept as plain strings\n// since they are displayed dynamically\n\nfunction useFormFieldFocusOnError(dialogId: string, queryError: unknown) {\n React.useEffect(() => {\n const fieldErrors = getFormErrors(queryError).fields;\n for (const [name, error] of Object.entries(fieldErrors)) {\n if (error) {\n const fieldElement = document.getElementById(toId(dialogId, name)) as\n | HTMLInputElement\n | HTMLButtonElement\n | null;\n if (fieldElement) {\n fieldElement?.focus();\n if (\"select\" in fieldElement) {\n fieldElement.select();\n }\n }\n break;\n }\n }\n }, [dialogId, queryError]);\n}\n\nfunction useInviteUser() {\n const invalidateMembers = useInvalidateMembers();\n\n return useClientGraphqlMutation({\n mutationFn: async (sdk, input: InviteUserInput) => {\n const { inviteUser: result } = await sdk.InviteUser({ input });\n return unwrapInviteUser(result);\n },\n onSuccess: invalidateMembers,\n });\n}\n\nfunction getDefaultRole(roles: Role[]) {\n return roles.find((role) => role.isDefault) || roles[0];\n}\nexport { InviteUserDialog };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"invite-user-dialog.cjs","names":["useTranslation","React","useRolesAndConfig","EMPTY_ROLES_AND_CONFIG","Translation","Flex","Text","Callout","Button","VisuallyHidden","Label","isErrorLike","useInvalidateMembers","useClientGraphqlMutation","unwrapInviteUser"],"sources":["../../../../src/widgets/users-management/invite-user-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport type { InviteUserInput } from \"../../api/client-graphql/generated.js\";\nimport { useClientGraphqlMutation } from \"../../api/client-graphql/hooks.js\";\nimport {\n Button,\n Dialog,\n Label,\n Select,\n TextField,\n} from \"../../components/elements.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { isErrorLike } from \"../../lib/utils.js\";\nimport {\n EMPTY_ROLES_AND_CONFIG,\n unwrapInviteUser,\n useInvalidateMembers,\n useRolesAndConfig,\n} from \"./users-management-utils.js\";\nimport type { Role } from \"./users-management-utils.js\";\n\n/**\n * Used to stub a fake value for the role select. It will be selected by default\n * before the role query resolves, or if the query results in an error. We do\n * this because we need to provide _any_ value to the select to avoid\n * controlled/uncontrolled bugs.\n */\nconst PLACEHOLDER_ROLE = \"_rolePlaceholder\";\n\ninterface InviteUserDialogProps {\n children?: React.ReactNode;\n}\n\nconst InviteUserDialog: React.FC<InviteUserDialogProps> = ({ children }) => {\n const translate = useTranslation();\n const [open, setOpen] = React.useState(false);\n const dialogId = toId(\"invite-user\", React.useId());\n const formId = toId(dialogId, \"form\");\n\n const inviteUser = useInviteUser();\n const rolesQuery = useRolesAndConfig();\n const roles = rolesQuery.data?.roles ?? EMPTY_ROLES_AND_CONFIG.roles.roles;\n const [selectedRole, setSelectedRole] = React.useState(\n () => getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE,\n );\n\n const [previousRoles, setPreviousRoles] = React.useState(roles);\n if (previousRoles !== roles) {\n setPreviousRoles(roles);\n // Update the selected role if it's not in the list (eg if the list was\n // previously empty and the query resolved)\n const found = roles.find((role) => role.slug === selectedRole);\n if (!found) {\n setSelectedRole(getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE);\n }\n }\n\n const onSubmitForm = (input: InviteUserInput) => {\n if (inviteUser.isPending || rolesQuery.status !== \"success\") {\n return;\n }\n inviteUser.mutate(input, {\n onSuccess: () => {\n setOpen(false);\n },\n });\n };\n\n const formErrors = getFormErrors(inviteUser.error);\n useFormFieldFocusOnError(dialogId, inviteUser.error);\n\n return (\n <Dialog.Root open={open} onOpenChange={setOpen}>\n {children && <Dialog.Trigger>{children}</Dialog.Trigger>}\n <Dialog.Content maxWidth=\"480px\" key={String(open)}>\n <Dialog.Title>\n <Translation\n defaultMessage=\"Invite user\"\n id=\"6+aYFi\"\n description=\"Dialog title for inviting a user\"\n />\n </Dialog.Title>\n <Dialog.Description>\n <Translation\n defaultMessage=\"An invitation will be sent to this email address with a link to complete their account.\"\n id=\"IicELr\"\n description=\"Dialog description explaining invitation process\"\n />\n </Dialog.Description>\n <Flex direction=\"column\" gap=\"4\" mt=\"5\" asChild>\n <form\n id={formId}\n onSubmit={async (event) => {\n event.preventDefault();\n onSubmitForm({\n email: event.currentTarget.email.value,\n roleSlug: selectedRole,\n });\n }}\n >\n <FormField\n rootId={dialogId}\n name=\"email\"\n label={translate({\n defaultMessage: \"Email address\",\n id: \"ACNqhk\",\n description: \"Label for email address field\",\n })}\n error={formErrors.fields.email}\n required\n control={(props) => (\n <TextField.Root\n {...props}\n data-1p-ignore=\"true\"\n data-lpignore=\"true\"\n type=\"email\"\n autoComplete=\"off\"\n placeholder={translate({\n defaultMessage: \"Enter an email address\",\n id: \"0ulARV\",\n description: \"Placeholder for email address field\",\n })}\n />\n )}\n />\n\n <FormField\n rootId={dialogId}\n name=\"role\"\n label={translate({\n defaultMessage: \"Role\",\n id: \"1Htc3a\",\n description: \"Label for role selection field\",\n })}\n error={formErrors.fields.role}\n disabled={rolesQuery.isPending || roles.length <= 1}\n info={\n roles.length === 1 ? (\n <Translation\n defaultMessage=\"New users will be invited with the {roleName} role, as it is the only one available.\"\n id=\"/CNKkm\"\n description=\"Info message when only one role is available\"\n values={{\n roleName: <Text weight=\"bold\">{roles[0].name}</Text>,\n }}\n />\n ) : undefined\n }\n control={({\n id,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedBy,\n ...props\n }) => (\n <Select.Root\n {...props}\n value={selectedRole}\n onValueChange={setSelectedRole}\n >\n <Select.Trigger\n id={id}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n />\n <Select.Content>\n <Select.Item value={PLACEHOLDER_ROLE} disabled>\n <Translation\n defaultMessage=\"Select a role\"\n id=\"0VMIWs\"\n description=\"Placeholder option for role selection\"\n />\n </Select.Item>\n {roles.map((role) => (\n <Select.Item key={role.slug} value={role.slug}>\n {role.name}\n </Select.Item>\n ))}\n </Select.Content>\n </Select.Root>\n )}\n />\n </form>\n </Flex>\n\n {formErrors.form ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>{formErrors.form}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={inviteUser.isPending}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <Button\n type=\"submit\"\n form={formId}\n loading={inviteUser.isPending}\n disabled={rolesQuery.isPending || undefined}\n >\n <Translation\n defaultMessage=\"Invite\"\n id=\"JIQROV\"\n description=\"Invite button text to send invitation\"\n />\n </Button>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">{formErrors.form}</section>\n </VisuallyHidden>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\ninterface FormControlRenderProps {\n id: string;\n name: string;\n \"aria-describedby\": string | undefined;\n \"aria-invalid\"?: boolean;\n required: boolean | undefined;\n disabled: boolean | undefined;\n}\n\ninterface FormFieldProps {\n rootId: string;\n name: string;\n label: string;\n error?: React.ReactNode;\n info?: React.ReactNode;\n control: (props: FormControlRenderProps) => React.ReactNode;\n required?: boolean;\n disabled?: boolean;\n}\n\nconst FormField: React.FC<FormFieldProps> = ({\n rootId,\n name,\n label,\n error,\n info,\n control,\n required,\n disabled,\n}) => {\n const fieldId = toId(rootId, name);\n const errorId = toId(rootId, name, \"error\");\n const infoId = toId(rootId, name, \"info\");\n return (\n <Flex direction=\"column\" gap=\"1\">\n <Label htmlFor={fieldId}>{label}</Label>\n {control({\n id: fieldId,\n name,\n \"aria-describedby\": (() => {\n const tags: string[] = [];\n if (error) {\n tags.push(errorId);\n }\n if (info) {\n tags.push(infoId);\n }\n if (tags.length === 0) {\n return undefined;\n }\n return tags.join(\" \");\n })(),\n \"aria-invalid\": !!error || undefined,\n required: required || undefined,\n disabled: disabled || undefined,\n })}\n\n {error ? (\n <Text color=\"red\" size=\"2\" id={errorId}>\n {error}\n </Text>\n ) : null}\n {info ? (\n <Text color=\"gray\" size=\"2\" id={infoId} mt=\"1\">\n {info}\n </Text>\n ) : null}\n </Flex>\n );\n};\n\nfunction toId(...parts: string[]) {\n return parts.join(\"-\");\n}\n\nfunction getFormErrors(queryError: unknown) {\n const formErrors = {\n form: null as string | null,\n fields: {\n email: null as string | null,\n role: null as string | null,\n },\n };\n\n if (queryError) {\n if (!isErrorLike(queryError)) {\n return {\n ...formErrors,\n form: \"An unexpected error occurred. Please try again.\",\n };\n }\n\n switch (queryError.message.toLowerCase()) {\n case \"user already exists\":\n case \"user already invited\":\n case \"invalid email\":\n formErrors.fields.email = queryError.message;\n break;\n case \"invalid role\":\n formErrors.fields.role = queryError.message;\n break;\n case \"this organization is not allowed to send invites.\":\n formErrors.form = queryError.message;\n break;\n default:\n // TODO handle more cases for various server errors\n formErrors.form =\n \"There was an error inviting this user. Please refresh the page and try again.\";\n break;\n }\n }\n\n return formErrors;\n}\n\n// Note: Error messages in getFormErrors are kept as plain strings\n// since they are displayed dynamically\n\nfunction useFormFieldFocusOnError(dialogId: string, queryError: unknown) {\n React.useEffect(() => {\n const fieldErrors = getFormErrors(queryError).fields;\n for (const [name, error] of Object.entries(fieldErrors)) {\n if (error) {\n const fieldElement = document.getElementById(toId(dialogId, name)) as\n | HTMLInputElement\n | HTMLButtonElement\n | null;\n if (fieldElement) {\n fieldElement?.focus();\n if (\"select\" in fieldElement) {\n fieldElement.select();\n }\n }\n break;\n }\n }\n }, [dialogId, queryError]);\n}\n\nfunction useInviteUser() {\n const invalidateMembers = useInvalidateMembers();\n\n return useClientGraphqlMutation({\n mutationFn: async (sdk, input: InviteUserInput) => {\n const { inviteUser: result } = await sdk.InviteUser({ input });\n return unwrapInviteUser(result);\n },\n onSuccess: invalidateMembers,\n });\n}\n\nfunction getDefaultRole(roles: Role[]) {\n return roles.find((role) => role.isDefault) || roles[0];\n}\nexport { InviteUserDialog };\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../lib/constants.cjs");
|
|
3
|
+
const require_api_client_graphql_query_keys = require("../../api/client-graphql/query-keys.cjs");
|
|
3
4
|
const require_api_errors = require("../../api/errors.cjs");
|
|
4
5
|
const require_api_client_graphql_hooks = require("../../api/client-graphql/hooks.cjs");
|
|
5
6
|
const require_widgets_users_management_users_management_context = require("./users-management-context.cjs");
|
|
@@ -34,7 +35,7 @@ const EMPTY_ROLES_AND_CONFIG = { roles: {
|
|
|
34
35
|
} };
|
|
35
36
|
function useRolesAndConfig() {
|
|
36
37
|
return require_api_client_graphql_hooks.useClientGraphqlQuery({
|
|
37
|
-
queryKey:
|
|
38
|
+
queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListRoles"),
|
|
38
39
|
queryFn: (sdk) => sdk.ListRoles(),
|
|
39
40
|
select: (data) => data.roles,
|
|
40
41
|
initialData: EMPTY_ROLES_AND_CONFIG
|
|
@@ -51,7 +52,7 @@ function useUsers(context) {
|
|
|
51
52
|
search: searchQuery ?? null
|
|
52
53
|
};
|
|
53
54
|
return require_api_client_graphql_hooks.useClientGraphqlQuery({
|
|
54
|
-
queryKey:
|
|
55
|
+
queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListOrganizationMemberships", variables),
|
|
55
56
|
queryFn: (sdk) => sdk.ListOrganizationMemberships(variables),
|
|
56
57
|
select: toMembersQueryResult,
|
|
57
58
|
placeholderData: _tanstack_react_query.keepPreviousData
|
|
@@ -59,7 +60,7 @@ function useUsers(context) {
|
|
|
59
60
|
}
|
|
60
61
|
function useInvalidateMembers() {
|
|
61
62
|
const queryClient = (0, _tanstack_react_query.useQueryClient)();
|
|
62
|
-
return () => queryClient.invalidateQueries({ queryKey:
|
|
63
|
+
return () => queryClient.invalidateQueries({ queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListOrganizationMemberships") });
|
|
63
64
|
}
|
|
64
65
|
function mutationFailure(typename, message) {
|
|
65
66
|
return new require_api_errors.ApiError({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-management-utils.cjs","names":["useClientGraphqlQuery","clientGraphqlQueryKey","useUsersManagementContext","keepPreviousData","useQueryClient","ApiError"],"sources":["../../../../src/widgets/users-management/users-management-utils.ts"],"sourcesContent":["import type { UseQueryResult } from \"@tanstack/react-query\";\nimport { keepPreviousData, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n InviteUserMutation,\n ListOrganizationMembershipsQuery,\n ListRolesQuery,\n OrganizationMemberAction,\n OrganizationMemberFieldsFragment,\n RemoveMemberMutation,\n ResendInvitationMutation,\n RevokeInvitationMutation,\n RoleFieldsFragment,\n UpdateMemberRoleMutation,\n} from \"../../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlQuery,\n} from \"../../api/client-graphql/hooks.js\";\nimport { ApiError } from \"../../api/errors.js\";\nimport type { ListMetadata } from \"../../lib/api/types.js\";\nimport { USER_ROW_LIMIT } from \"../../lib/constants.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\nimport type { UsersManagementContextValue } from \"./users-management-context.js\";\n\nexport type Role = RoleFieldsFragment;\n\nexport type RolesAndConfig = ListRolesQuery[\"roles\"];\n\nexport interface Member extends Omit<\n OrganizationMemberFieldsFragment,\n \"actions\"\n> {\n actions: MemberAction[];\n isLoggedInUser: boolean;\n}\n\nexport interface MembersQueryResult {\n data: Member[];\n listMetadata: ListMetadata;\n}\n\nconst MemberActions = {\n EditRole: \"edit-role\",\n ResendInvite: \"resend-invite\",\n RevokeInvite: \"revoke-invite\",\n RevokeMembership: \"revoke-membership\",\n} as const satisfies Record<OrganizationMemberAction, string>;\n\ntype MemberAction = (typeof MemberActions)[keyof typeof MemberActions];\n\nfunction toMember(member: OrganizationMemberFieldsFragment): Member {\n return {\n ...member,\n actions: member.actions.map((action) => MemberActions[action]),\n isLoggedInUser: member.isCurrentUser,\n };\n}\n\nfunction toMembersQueryResult(\n data: ListOrganizationMembershipsQuery,\n): MembersQueryResult {\n const { organizationMemberships } = data;\n return {\n data: organizationMemberships.data.map(toMember),\n listMetadata: {\n before: organizationMemberships.listMetadata.before ?? null,\n after: organizationMemberships.listMetadata.after ?? null,\n },\n };\n}\n\nexport const EMPTY_ROLES_AND_CONFIG: Readonly<ListRolesQuery> = {\n roles: { multipleRolesEnabled: false, roles: [] },\n};\n\nexport function useRolesAndConfig(): UseQueryResult<RolesAndConfig> {\n return useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListRoles\"),\n queryFn: (sdk) => sdk.ListRoles(),\n select: (data) => data.roles,\n initialData: EMPTY_ROLES_AND_CONFIG,\n });\n}\n\nexport function useUsers(context?: UsersManagementContextValue) {\n const {\n state: { pagination, role, searchQuery },\n } = useUsersManagementContext(context);\n const { before, after } = pagination || {};\n const variables = {\n after: after ?? null,\n before: before ?? null,\n limit: USER_ROW_LIMIT,\n roleSlug: role ?? null,\n search: searchQuery ?? null,\n };\n\n return useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationMemberships\", variables),\n queryFn: (sdk) => sdk.ListOrganizationMemberships(variables),\n select: toMembersQueryResult,\n placeholderData: keepPreviousData,\n });\n}\n\nexport function useInvalidateMembers() {\n const queryClient = useQueryClient();\n return () =>\n queryClient.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationMemberships\"),\n });\n}\n\nfunction mutationFailure(typename: string, message: string): ApiError {\n return new ApiError({\n message,\n status: 400,\n queryType: \"mutation\",\n context: { typename },\n });\n}\n\nexport function unwrapUpdateMemberRole(\n result: UpdateMemberRoleMutation[\"updateMemberRole\"],\n) {\n switch (result.__typename) {\n case \"MemberRoleUpdated\":\n return result.member;\n case \"MemberNotFound\":\n throw mutationFailure(result.__typename, \"Cannot edit role for user\");\n case \"RoleNotFound\":\n throw mutationFailure(result.__typename, \"Invalid role\");\n }\n}\n\nexport function unwrapInviteUser(result: InviteUserMutation[\"inviteUser\"]) {\n switch (result.__typename) {\n case \"UserInvited\":\n return result.invitation;\n case \"InviteeAlreadyMember\":\n throw mutationFailure(result.__typename, \"User already exists\");\n case \"InviteeAlreadyInvited\":\n throw mutationFailure(result.__typename, \"User already invited\");\n case \"InvalidInviteeEmail\":\n case \"InviteeEmailNotDeliverable\":\n throw mutationFailure(result.__typename, \"Invalid email\");\n case \"InvalidInviteeRole\":\n throw mutationFailure(result.__typename, \"Invalid role\");\n case \"InvalidInvitationExpiry\":\n throw mutationFailure(result.__typename, \"Invalid input\");\n case \"OrganizationBlockedFromSendingInvites\":\n throw mutationFailure(\n result.__typename,\n \"This organization is not allowed to send invites.\",\n );\n }\n}\n\nexport function unwrapRemoveMember(\n result: RemoveMemberMutation[\"removeMember\"],\n) {\n switch (result.__typename) {\n case \"MemberRemoved\":\n return result;\n case \"MemberNotFound\":\n case \"MemberIsManagedByDirectory\":\n throw mutationFailure(result.__typename, \"Cannot revoke membership\");\n }\n}\n\nexport function unwrapRevokeInvitation(\n result: RevokeInvitationMutation[\"revokeInvitation\"],\n) {\n switch (result.__typename) {\n case \"InvitationRevoked\":\n return result.invitation;\n case \"InvitationNotFound\":\n throw mutationFailure(result.__typename, \"User not invited\");\n case \"InvitationNotPending\":\n throw mutationFailure(result.__typename, \"User already accepted invite\");\n }\n}\n\nexport function unwrapResendInvitation(\n result: ResendInvitationMutation[\"resendInvitation\"],\n) {\n switch (result.__typename) {\n case \"InvitationResent\":\n return result.invitation;\n case \"ResendInvitationNotFound\":\n throw mutationFailure(result.__typename, \"User not invited\");\n case \"InviteeAlreadyAccepted\":\n throw mutationFailure(result.__typename, \"User already accepted invite\");\n case \"InviteeEmailNotDeliverable\":\n throw mutationFailure(result.__typename, \"Invalid email\");\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"users-management-utils.cjs","names":["useClientGraphqlQuery","clientGraphqlQueryKey","useUsersManagementContext","keepPreviousData","useQueryClient","ApiError"],"sources":["../../../../src/widgets/users-management/users-management-utils.ts"],"sourcesContent":["import type { UseQueryResult } from \"@tanstack/react-query\";\nimport { keepPreviousData, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n InviteUserMutation,\n ListOrganizationMembershipsQuery,\n ListRolesQuery,\n OrganizationMemberAction,\n OrganizationMemberFieldsFragment,\n RemoveMemberMutation,\n ResendInvitationMutation,\n RevokeInvitationMutation,\n RoleFieldsFragment,\n UpdateMemberRoleMutation,\n} from \"../../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlQuery,\n} from \"../../api/client-graphql/hooks.js\";\nimport { ApiError } from \"../../api/errors.js\";\nimport type { ListMetadata } from \"../../lib/api/types.js\";\nimport { USER_ROW_LIMIT } from \"../../lib/constants.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\nimport type { UsersManagementContextValue } from \"./users-management-context.js\";\n\nexport type Role = RoleFieldsFragment;\n\nexport type RolesAndConfig = ListRolesQuery[\"roles\"];\n\nexport interface Member extends Omit<\n OrganizationMemberFieldsFragment,\n \"actions\"\n> {\n actions: MemberAction[];\n isLoggedInUser: boolean;\n}\n\nexport interface MembersQueryResult {\n data: Member[];\n listMetadata: ListMetadata;\n}\n\nconst MemberActions = {\n EditRole: \"edit-role\",\n ResendInvite: \"resend-invite\",\n RevokeInvite: \"revoke-invite\",\n RevokeMembership: \"revoke-membership\",\n} as const satisfies Record<OrganizationMemberAction, string>;\n\ntype MemberAction = (typeof MemberActions)[keyof typeof MemberActions];\n\nfunction toMember(member: OrganizationMemberFieldsFragment): Member {\n return {\n ...member,\n actions: member.actions.map((action) => MemberActions[action]),\n isLoggedInUser: member.isCurrentUser,\n };\n}\n\nfunction toMembersQueryResult(\n data: ListOrganizationMembershipsQuery,\n): MembersQueryResult {\n const { organizationMemberships } = data;\n return {\n data: organizationMemberships.data.map(toMember),\n listMetadata: {\n before: organizationMemberships.listMetadata.before ?? null,\n after: organizationMemberships.listMetadata.after ?? null,\n },\n };\n}\n\nexport const EMPTY_ROLES_AND_CONFIG: Readonly<ListRolesQuery> = {\n roles: { multipleRolesEnabled: false, roles: [] },\n};\n\nexport function useRolesAndConfig(): UseQueryResult<RolesAndConfig> {\n return useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListRoles\"),\n queryFn: (sdk) => sdk.ListRoles(),\n select: (data) => data.roles,\n initialData: EMPTY_ROLES_AND_CONFIG,\n });\n}\n\nexport function useUsers(context?: UsersManagementContextValue) {\n const {\n state: { pagination, role, searchQuery },\n } = useUsersManagementContext(context);\n const { before, after } = pagination || {};\n const variables = {\n after: after ?? null,\n before: before ?? null,\n limit: USER_ROW_LIMIT,\n roleSlug: role ?? null,\n search: searchQuery ?? null,\n };\n\n return useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationMemberships\", variables),\n queryFn: (sdk) => sdk.ListOrganizationMemberships(variables),\n select: toMembersQueryResult,\n placeholderData: keepPreviousData,\n });\n}\n\nexport function useInvalidateMembers() {\n const queryClient = useQueryClient();\n return () =>\n queryClient.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationMemberships\"),\n });\n}\n\nfunction mutationFailure(typename: string, message: string): ApiError {\n return new ApiError({\n message,\n status: 400,\n queryType: \"mutation\",\n context: { typename },\n });\n}\n\nexport function unwrapUpdateMemberRole(\n result: UpdateMemberRoleMutation[\"updateMemberRole\"],\n) {\n switch (result.__typename) {\n case \"MemberRoleUpdated\":\n return result.member;\n case \"MemberNotFound\":\n throw mutationFailure(result.__typename, \"Cannot edit role for user\");\n case \"RoleNotFound\":\n throw mutationFailure(result.__typename, \"Invalid role\");\n }\n}\n\nexport function unwrapInviteUser(result: InviteUserMutation[\"inviteUser\"]) {\n switch (result.__typename) {\n case \"UserInvited\":\n return result.invitation;\n case \"InviteeAlreadyMember\":\n throw mutationFailure(result.__typename, \"User already exists\");\n case \"InviteeAlreadyInvited\":\n throw mutationFailure(result.__typename, \"User already invited\");\n case \"InvalidInviteeEmail\":\n case \"InviteeEmailNotDeliverable\":\n throw mutationFailure(result.__typename, \"Invalid email\");\n case \"InvalidInviteeRole\":\n throw mutationFailure(result.__typename, \"Invalid role\");\n case \"InvalidInvitationExpiry\":\n throw mutationFailure(result.__typename, \"Invalid input\");\n case \"OrganizationBlockedFromSendingInvites\":\n throw mutationFailure(\n result.__typename,\n \"This organization is not allowed to send invites.\",\n );\n }\n}\n\nexport function unwrapRemoveMember(\n result: RemoveMemberMutation[\"removeMember\"],\n) {\n switch (result.__typename) {\n case \"MemberRemoved\":\n return result;\n case \"MemberNotFound\":\n case \"MemberIsManagedByDirectory\":\n throw mutationFailure(result.__typename, \"Cannot revoke membership\");\n }\n}\n\nexport function unwrapRevokeInvitation(\n result: RevokeInvitationMutation[\"revokeInvitation\"],\n) {\n switch (result.__typename) {\n case \"InvitationRevoked\":\n return result.invitation;\n case \"InvitationNotFound\":\n throw mutationFailure(result.__typename, \"User not invited\");\n case \"InvitationNotPending\":\n throw mutationFailure(result.__typename, \"User already accepted invite\");\n }\n}\n\nexport function unwrapResendInvitation(\n result: ResendInvitationMutation[\"resendInvitation\"],\n) {\n switch (result.__typename) {\n case \"InvitationResent\":\n return result.invitation;\n case \"ResendInvitationNotFound\":\n throw mutationFailure(result.__typename, \"User not invited\");\n case \"InviteeAlreadyAccepted\":\n throw mutationFailure(result.__typename, \"User already accepted invite\");\n case \"InviteeEmailNotDeliverable\":\n throw mutationFailure(result.__typename, \"Invalid email\");\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-management.cjs","names":["useIsHydrated","useUsersManagementContext","useTranslation","React","SearchProvider","Flex","Grid","Box","UsersSearch","UsersFilter","InviteUserDialog","Button","Translation","Table","getBestName","Avatar","UserActionsDropdown","IconButton","DotsHorizontalIcon","Skeleton","GenericError","Badge","VisuallyHidden","Separator","useLocale","useComparativeReadableDate","Text","useSearchContext","Tooltip","getWidgetDomProps"],"sources":["../../../../src/widgets/users-management/users-management.tsx"],"sourcesContent":["\"use client\";\n\nimport { DotsHorizontalIcon } from \"@radix-ui/react-icons\";\nimport {\n Box,\n Flex,\n Grid,\n Separator,\n Table,\n Text,\n Tooltip,\n VisuallyHidden,\n} from \"@radix-ui/themes\";\nimport type { TextProps } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport {\n Avatar,\n Badge,\n Button,\n IconButton,\n Select,\n Skeleton,\n TextField,\n} from \"../../components/elements.js\";\nimport { GenericError } from \"../../components/generic-error.js\";\nimport { USER_ROW_LIMIT } from \"../../lib/constants.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\nimport { useLocale } from \"../../lib/i18n/use-locale.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { useComparativeReadableDate } from \"../../lib/use-comparative-readable-date.js\";\nimport { useIsHydrated } from \"../../lib/use-is-hydrated.js\";\nimport { getBestName } from \"../../lib/utils.js\";\nimport { getWidgetDomProps } from \"../../lib/widget-dom-props.js\";\nimport type {\n WidgetRootDomProps,\n WidgetRootState,\n} from \"../../lib/widget-types.js\";\nimport { InviteUserDialog } from \"./invite-user-dialog.js\";\nimport { SearchProvider, useSearchContext } from \"./search-provider.js\";\nimport { UserActionsDropdown } from \"./user-actions-dropdown.js\";\nimport { UsersFilter } from \"./users-filter.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\nimport type {\n Member,\n MembersQueryResult,\n RolesAndConfig,\n} from \"./users-management-utils.js\";\nimport { UsersSearch } from \"./users-search.js\";\n\ninterface UsersManagementProps extends WidgetRootDomProps {\n rolesData: RolesAndConfig;\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 pagination = {\n before: userData.listMetadata.before ?? null,\n after: userData.listMetadata.after ?? null,\n };\n\n const { dispatch } = useUsersManagementContext();\n const isMultipleRolesEnabled = rolesData.multipleRolesEnabled;\n const translate = useTranslation();\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 [delayElapsed, setDelayElapsed] = React.useState(false);\n const [prevIsPending, setPrevIsPending] = React.useState(isPending);\n if (isPending !== prevIsPending) {\n setPrevIsPending(isPending);\n if (isPending) {\n setDelayElapsed(false);\n }\n }\n const deferredLoading = isPending && delayElapsed;\n\n React.useEffect(() => {\n if (!isPending) {\n return;\n }\n const timeoutId = window.setTimeout(() => {\n setDelayElapsed(true);\n }, 500);\n return () => {\n window.clearTimeout(timeoutId);\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 <Button>\n <Translation\n defaultMessage=\"Invite user\"\n id=\"NBXpRj\"\n description=\"Button text to invite a new user to the organization\"\n />\n </Button>\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 <Translation\n defaultMessage=\"User\"\n id=\"BBh86k\"\n description=\"Column header for user information in the users table\"\n />\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"100px\">\n {isMultipleRolesEnabled ? (\n <Translation\n defaultMessage=\"Roles\"\n id=\"A1DuWM\"\n description=\"Column header for user roles when multiple roles are enabled\"\n />\n ) : (\n <Translation\n defaultMessage=\"Role\"\n id=\"nQbe+Y\"\n description=\"Column header for user role when only single role is allowed\"\n />\n )}\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"140px\">\n <Translation\n defaultMessage=\"Last active\"\n id=\"oOwLGt\"\n description=\"Column header showing when users were last active\"\n />\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\n title={translate({\n defaultMessage: \"User actions\",\n id: \"1nsmNS\",\n description:\n \"Button tooltip for opening user actions menu\",\n })}\n >\n <DotsHorizontalIcon />\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 <Button\n variant=\"secondary\"\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, after: null },\n });\n }\n }}\n >\n <Translation\n defaultMessage=\"Previous\"\n id=\"910Q6b\"\n description=\"Button text to navigate to the previous page of users\"\n />\n </Button>\n <Button\n variant=\"secondary\"\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, before: null },\n });\n }\n }}\n >\n <Translation\n defaultMessage=\"Next\"\n id=\"UlAY08\"\n description=\"Button text to navigate to the next page of users\"\n />\n </Button>\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 const translate = useTranslation();\n const placeholderText = (\n <Translation\n defaultMessage=\"All\"\n id=\"l/Do9/\"\n description=\"Filter option to show all users\"\n />\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.Root\n disabled\n aria-label={translate({\n defaultMessage: \"User search\",\n id: \"lzPOKv\",\n description: \"Label for the user search input field\",\n })}\n />\n </Box>\n </Skeleton>\n <Skeleton loading>\n <Box flexGrow=\"0\" flexShrink=\"0\">\n <Select.Root disabled value=\"all\" onValueChange={() => void 0}>\n <Select.Trigger>{placeholderText}</Select.Trigger>\n <Select.Content>\n <Select.Item value=\"all\">{placeholderText}</Select.Item>\n </Select.Content>\n </Select.Root>\n </Box>\n </Skeleton>\n </Flex>\n <Skeleton loading>\n <Box flexGrow=\"0\" flexShrink=\"0\" style={{ placeSelf: \"flex-end\" }}>\n <Button disabled>\n <Translation\n defaultMessage=\"Invite user\"\n id=\"NBXpRj\"\n description=\"Button text to invite a new user to the organization\"\n />\n </Button>\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>\n <Translation\n defaultMessage=\"User\"\n id=\"BBh86k\"\n description=\"Column header for user information in the users table\"\n />\n </Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"100px\">\n <Skeleton>\n <Translation\n defaultMessage=\"Role\"\n id=\"FK7mP4\"\n description=\"Column header for user role\"\n />\n </Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"140px\">\n <Skeleton>\n <Translation\n defaultMessage=\"Last active\"\n id=\"oOwLGt\"\n description=\"Column header showing when users were last active\"\n />\n </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 <Button disabled variant=\"secondary\" size=\"1\">\n <Translation\n defaultMessage=\"Previous\"\n id=\"910Q6b\"\n description=\"Button text to navigate to the previous page of users\"\n />\n </Button>\n </Skeleton>\n <Skeleton loading>\n <Button disabled variant=\"secondary\" size=\"1\">\n <Translation\n defaultMessage=\"Next\"\n id=\"UlAY08\"\n description=\"Button text to navigate to the next page of users\"\n />\n </Button>\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\ninterface UserBadgeProps {\n user: Member;\n}\n\nconst UserBadge: React.FC<UserBadgeProps> = ({ user }) => {\n if (user.isLoggedInUser) {\n return (\n <Badge color=\"gray\" style={{ userSelect: \"none\" }}>\n <Translation\n defaultMessage=\"You\"\n id=\"ER1Vmv\"\n description=\"Badge indicating the current logged-in user\"\n />\n </Badge>\n );\n }\n if (user.status === \"Invited\") {\n return (\n <Badge color=\"amber\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"Status: \"\n id=\"E2o/+H\"\n description=\"Prefix for status indicator in screen reader\"\n />\n </VisuallyHidden>\n <Translation\n defaultMessage=\"Invited\"\n id=\"byIkUu\"\n description=\"Badge status indicating user has been invited but not yet accepted\"\n />\n </Badge>\n );\n }\n if (user.status === \"InviteExpired\") {\n return (\n <Badge color=\"red\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"Status: Invite \"\n id=\"BWvbwY\"\n description=\"Prefix for invite status indicator in screen reader\"\n />\n </VisuallyHidden>\n <Translation\n defaultMessage=\"Expired\"\n id=\"+0sQaN\"\n description=\"Badge status indicating user invitation has expired\"\n />\n </Badge>\n );\n }\n if (user.status === \"InviteRevoked\") {\n return (\n <Badge color=\"red\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"Status: Invite \"\n id=\"BWvbwY\"\n description=\"Prefix for invite status indicator in screen reader\"\n />\n </VisuallyHidden>\n <Translation\n defaultMessage=\"Revoked\"\n id=\"NNBv+r\"\n description=\"Badge status indicating user invitation has been revoked\"\n />\n </Badge>\n );\n }\n return null;\n};\n\ninterface LastActiveProps {\n user: Member;\n isHydrated: boolean;\n dim?: boolean;\n}\n\nconst LastActive: React.FC<LastActiveProps> = (props) => {\n if (!props.user.lastActivityAt) {\n return (\n <>\n <VisuallyHidden>\n {props.user.status === \"Active\" ? (\n <Translation\n defaultMessage=\"Never\"\n id=\"0duvF4\"\n description=\"Screen reader text indicating user has never been active\"\n />\n ) : (\n <Translation\n defaultMessage=\"Not active\"\n id=\"hd2+kk\"\n description=\"Screen reader text indicating user is not active\"\n />\n )}\n </VisuallyHidden>\n <Separator />\n </>\n );\n }\n return <LastActiveImpl {...props} date={props.user.lastActivityAt} />;\n};\n\ninterface LastActiveImplProps extends LastActiveProps {\n date: string;\n}\n\nconst LastActiveImpl: React.FC<LastActiveImplProps> = ({\n date,\n isHydrated,\n dim,\n}) => {\n const locale = useLocale();\n const lastActiveDate = new Date(date);\n const lastActiveDateTime = lastActiveDate.toLocaleTimeString(locale, {\n // hard-coded timezone before hydration to prevent server/client mismatch\n timeZone: isHydrated ? undefined : \"America/Los_Angeles\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n\n const lastActiveDisplay = useComparativeReadableDate({\n date: lastActiveDate,\n });\n\n if (lastActiveDisplay.state !== \"valid\") {\n return (\n <>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"Unknown\"\n id=\"UUigrK\"\n description=\"Screen reader text indicating last active date is unknown\"\n />\n </VisuallyHidden>\n <Separator />\n </>\n );\n }\n\n return (\n <TableCellText asChild dim={dim}>\n <time dateTime={date} title={lastActiveDateTime}>\n {lastActiveDisplay.formatted}\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: React.FC = () => (\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 {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\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\ninterface UsersManagementEmptyStateProps {\n isPending: boolean;\n}\n\nconst UsersManagementEmptyState: React.FC<UsersManagementEmptyStateProps> = ({\n isPending,\n}) => {\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 <Translation\n defaultMessage=\"No users found for query '{query}'\"\n id=\"wrEZ8+\"\n description=\"Message shown when no users match the search query\"\n values={{\n query: isClearing ? lastSearchQuery : searchQuery,\n }}\n />\n </Text>\n\n <Button\n variant=\"secondary\"\n size=\"1\"\n onClick={() => {\n setClearing({ isClearing: true, lastSearchQuery: searchQuery });\n clearSearch();\n }}\n loading={isPending}\n >\n <Translation\n defaultMessage=\"Clear search\"\n id=\"Xv3fVI\"\n description=\"Button text to clear the current search query\"\n />\n </Button>\n </Flex>\n );\n }\n\n return (\n <Flex align=\"center\" justify=\"center\" py=\"8\" gap=\"2\">\n <Text size=\"2\">\n <Translation\n defaultMessage=\"No users found\"\n id=\"MQ+LoA\"\n description=\"Message shown when there are no users in the system\"\n />\n </Text>\n </Flex>\n );\n};\n\ninterface UserRolesCellContentProps {\n user: Member;\n isMultipleRolesEnabled: boolean;\n dimText: boolean;\n}\n\nconst UserRolesCellContent: React.FC<UserRolesCellContentProps> = ({\n user,\n isMultipleRolesEnabled,\n dimText,\n}) => {\n if (!user.roles || user.roles.length === 0) {\n return (\n <>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"No roles assigned\"\n id=\"CVOVB0\"\n description=\"Screen reader text indicating user has no roles assigned\"\n />\n </VisuallyHidden>\n {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n <span aria-hidden style={{ userSelect: \"none\" }}>\n –\n </span>\n </>\n );\n }\n\n if (isMultipleRolesEnabled && user.roles.length > 1) {\n const roleNames = user.roles?.map((role) => role.name).join(\", \");\n return (\n <Tooltip content={roleNames} maxWidth=\"250px\">\n <TableCellText dim={dimText}>\n <Translation\n defaultMessage=\"{count} roles\"\n id=\"lWAmRC\"\n description=\"Shows the number of roles assigned to a user (plural)\"\n values={{ count: user.roles.length }}\n />\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 getWidgetDomProps({\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDA,MAAM,mBAAmD,EACvD,UACA,WACA,WACA,oBACA,GAAG,eACC;CACJ,MAAM,QAAQ,UAAU,QAAQ,CAAC;CACjC,MAAM,aAAa,OAAO,UAAU;CACpC,MAAM,aAAaA,4BAAAA,cAAc;CACjC,MAAM,aAAa;EACjB,QAAQ,SAAS,aAAa,UAAU;EACxC,OAAO,SAAS,aAAa,SAAS;CACxC;CAEA,MAAM,EAAE,aAAaC,0DAAAA,0BAA0B;CAC/C,MAAM,yBAAyB,UAAU;CACzC,MAAM,YAAYC,iCAAAA,eAAe;CAKjC,MAAM,CAAC,cAAc,mBAAmBC,MAAM,SAAS,KAAK;CAC5D,MAAM,CAAC,eAAe,oBAAoBA,MAAM,SAAS,SAAS;CAClE,IAAI,cAAc,eAAe;EAC/B,iBAAiB,SAAS;EAC1B,IAAI,WACF,gBAAgB,KAAK;CAEzB;CACA,MAAM,kBAAkB,aAAa;CAErC,MAAM,gBAAgB;EACpB,IAAI,CAAC,WACH;EAEF,MAAM,YAAY,OAAO,iBAAiB;GACxC,gBAAgB,IAAI;EACtB,GAAG,GAAG;EACN,aAAa;GACX,OAAO,aAAa,SAAS;EAC/B;CACF,GAAG,CAAC,SAAS,CAAC;CAEd,MAAM,iBAAiB,CAAC,EAAE,WAAW,UAAU,WAAW;CAE1D,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,iDAAAA,gBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,iBAAAA,MAAD;EACE,WAAU;EACV,KAAI;EACJ,GAAI,sBAAsB,YAAY,QAAQ;EAHhD,UAAA;GAKE,iBAAA,GAAA,kBAAA,KAAA,CAACC,iBAAAA,MAAD;IAAM,SAAQ;IAAW,KAAI;IAA7B,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAACD,iBAAAA,MAAD;KAAM,KAAI;KAAI,OAAM;KAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,iBAAAA,KAAD;MAAK,WAAU;MAAQ,UAAS;MAAI,YAAW;MAC7C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,aAAD,CAAc,CAAA;KACX,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAACD,iBAAAA,KAAD;MAAK,UAAS;MAAI,YAAW;MAC3B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,8CAAAA,aAAD;OACE,OAAO,UAAU;OACjB,UAAU;MACX,CAAA;KACE,CAAA,CACD;IACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,iBAAAA,KAAD;KAAK,UAAS;KAAI,YAAW;KAAI,OAAO,EAAE,WAAW,WAAW;KAC9D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,oDAAAA,kBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,mCAAAA,QAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;MACE,gBAAe;MACf,IAAG;MACH,aAAY;KACb,CAAA,EACK,CAAA,EACQ,CAAA;IACf,CAAA,CACD;;GACN,iBAAA,GAAA,kBAAA,KAAA,CAACC,iBAAAA,MAAM,MAAP;IAAY,SAAQ;IAAQ,MAAK;IAAjC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,QAAP,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAACA,iBAAAA,MAAM,KAAP,EAAA,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,kBAAP;MAAwB,OAAM;MAC5B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,6BAAAA,aAAD;OACE,gBAAe;OACf,IAAG;OACH,aAAY;MACb,CAAA;KACqB,CAAA;KACxB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAM,kBAAP;MAAwB,OAAM;MAC3B,UAAA,yBACC,iBAAA,GAAA,kBAAA,IAAA,CAACD,6BAAAA,aAAD;OACE,gBAAe;OACf,IAAG;OACH,aAAY;MACb,CAAA,IAED,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;OACE,gBAAe;OACf,IAAG;OACH,aAAY;MACb,CAAA;KAEmB,CAAA;KACxB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAM,kBAAP;MAAwB,OAAM;MAC5B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,6BAAAA,aAAD;OACE,gBAAe;OACf,IAAG;OACH,aAAY;MACb,CAAA;KACqB,CAAA;KACxB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAM,kBAAP,EAAwB,OAAM,OAAQ,CAAA;IAC7B,EAAA,CAAA,EACC,CAAA,GAEd,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,MAAP;KACE,OAAO;MACL,YAAY,yBAAyB,YAAY,SAAS;MAC1D,SAAS,aAAa,aAAa,IAAI,KAAM;KAC/C;KAEC,UAAA,MAAM,SAAS,IACd,MAAM,KAAK,SAAS;MAClB,MAAM,kBAAkBC,kBAAAA,YAAY,IAAI;MACxC,MAAM,UACJ,KAAK,WAAW,mBAChB,KAAK,WAAW;MAClB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACD,iBAAAA,MAAM,KAAP;OAAyB,OAAM;OAA/B,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,eAAP,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAACR,iBAAAA,MAAD;SACE,OAAM;SACN,KAAI;SACJ,UAAS;SACT,QAAO;SAJT,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAACU,mCAAAA,QAAD;UACE,MAAK;UACL,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD,CAAmB,CAAA;UAC7B,KAAK,KAAK,qBAAqB;UAC/B,KAAK;SACN,CAAA,GAEA,kBACC,iBAAA,GAAA,kBAAA,KAAA,CAACV,iBAAAA,MAAD;UACE,WAAU;UACV,OAAM;UACN,QAAO;UACP,SAAQ;UACR,UAAS;UALX,UAAA,CAOE,iBAAA,GAAA,kBAAA,KAAA,CAACA,iBAAAA,MAAD;WAAM,KAAI;WAAI,OAAM;WAAS,UAAS;WAAtC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;YAAe,KAAK;YACjB,UAAA;WACY,CAAA,GACf,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAiB,KAAO,CAAA,CACpB;UACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;WACE,OAAM;WACN,OAAO,KAAK;WACZ,KAAK;WAEJ,UAAA,KAAK;UACO,CAAA,CACX;SAEN,CAAA,IAAA,iBAAA,GAAA,kBAAA,KAAA,CAACA,iBAAAA,MAAD;UAAM,KAAI;UAAI,OAAM;UAAS,UAAS;UAAtC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;WAAe,KAAK;WAAS,OAAO,KAAK;WACtC,UAAA,KAAK;UACO,CAAA,GACf,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAiB,KAAO,CAAA,CACpB;SAEJ,CAAA,CAAA;QACa,CAAA,EAAA,CAAA;QACrB,iBAAA,GAAA,kBAAA,IAAA,CAACQ,iBAAAA,MAAM,MAAP,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,sBAAD;SACQ;SACkB;SACf;QACV,CAAA,EACS,CAAA;QACZ,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,MAAP,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;SAAkB;SAAkB;QAAa,CAAA,EACvC,CAAA;QACZ,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,MAAP;SAAY,SAAQ;SAClB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,uDAAAA,qBAAD;UAA2B;UACzB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,wCAAAA,YAAD;WACE,OAAO,UAAU;YACf,gBAAgB;YAChB,IAAI;YACJ,aACE;WACJ,CAAC;WAED,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,oBAAD,CAAqB,CAAA;UACX,CAAA;SACO,CAAA;QACX,CAAA;OACH;MAvEK,GAAA,KAAK,EAuEV;KAEf,CAAC,IAED,iBAAA,GAAA,kBAAA,IAAA,CAACL,iBAAAA,MAAM,KAAP;MAAW,OAAM;MACf,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,MAAP;OAAY,SAAS;OACnB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,2BAAD,EAAsC,UAAY,CAAA;MACxC,CAAA;KACH,CAAA;IAEH,CAAA,CACF;;GAEX,iBACC,iBAAA,GAAA,kBAAA,KAAA,CAACR,iBAAAA,MAAD;IAAM,KAAI;IAAI,SAAQ;IAAtB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACM,mCAAAA,QAAD;KACE,SAAQ;KACR,MAAK;KACL,UAAU,CAAC,WAAW,UAAU,aAAa;KAC7C,SAAS;KACT,eAAe;MACb,IAAI,WAAW,QACb,SAAS;OACP,MAAM;OACN,YAAY;QAAE,QAAQ,WAAW;QAAQ,OAAO;OAAK;MACvD,CAAC;KAEL;KAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;MACE,gBAAe;MACf,IAAG;MACH,aAAY;KACb,CAAA;IACK,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAACD,mCAAAA,QAAD;KACE,SAAQ;KACR,MAAK;KACL,UAAU,CAAC,WAAW,SAAS,aAAa;KAC5C,SAAS;KACT,eAAe;MACb,IAAI,WAAW,OACb,SAAS;OACP,MAAM;OACN,YAAY;QAAE,OAAO,WAAW;QAAO,QAAQ;OAAK;MACtD,CAAC;KAEL;KAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;MACE,gBAAe;MACf,IAAG;MACH,aAAY;KACb,CAAA;IACK,CAAA,CACJ;GACJ,CAAA,IAAA;EACA;CACQ,CAAA,EAAA,CAAA;AAEpB;AAIA,MAAM,0BACJ,UACG;CACH,MAAM,YAAYV,iCAAAA,eAAe;CACjC,MAAM,kBACJ,iBAAA,GAAA,kBAAA,IAAA,CAACU,6BAAAA,aAAD;EACE,gBAAe;EACf,IAAG;EACH,aAAY;CACb,CAAA;CAEH,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACP,iBAAAA,MAAD;EACE,WAAU;EACV,KAAI;EACJ,GAAI,sBAAsB,WAAW,KAAK;EAH5C,UAAA;GAKE,iBAAA,GAAA,kBAAA,KAAA,CAACC,iBAAAA,MAAD;IAAM,SAAQ;IAAW,KAAI;IAA7B,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAACD,iBAAAA,MAAD;KAAM,KAAI;KAAI,OAAM;KAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACc,qCAAAA,UAAD;MAAU,SAAA;MACR,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACZ,iBAAAA,KAAD;OAAK,WAAU;OAAQ,UAAS;OAAI,YAAW;OAC7C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAA,uCAAA,MAAA;QACE,UAAA;QACA,cAAY,UAAU;SACpB,gBAAgB;SAChB,IAAI;SACJ,aAAa;QACf,CAAC;OACF,CAAA;MACE,CAAA;KACG,CAAA,GACV,iBAAA,GAAA,kBAAA,IAAA,CAACY,qCAAAA,UAAD;MAAU,SAAA;MACR,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACZ,iBAAAA,KAAD;OAAK,UAAS;OAAI,YAAW;OAC3B,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,mCAAA,MAAA;QAAa,UAAA;QAAS,OAAM;QAAM,qBAAqB,KAAK;QAA5D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,mCAAA,SAAA,EAAA,UAAiB,gBAAgC,CAAA,GACjD,iBAAA,GAAA,kBAAA,IAAA,CAAA,mCAAA,SAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,mCAAA,MAAA;SAAa,OAAM;SAAO,UAAA;QAA6B,CAAA,EACzC,CAAA,CACL;;MACV,CAAA;KACG,CAAA,CACN;IACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACY,qCAAAA,UAAD;KAAU,SAAA;KACR,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACZ,iBAAAA,KAAD;MAAK,UAAS;MAAI,YAAW;MAAI,OAAO,EAAE,WAAW,WAAW;MAC9D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACI,mCAAAA,QAAD;OAAQ,UAAA;OACN,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;QACE,gBAAe;QACf,IAAG;QACH,aAAY;OACb,CAAA;MACK,CAAA;KACL,CAAA;IACG,CAAA,CACN;;GACN,iBAAA,GAAA,kBAAA,KAAA,CAACC,iBAAAA,MAAM,MAAP;IAAY,SAAQ;IAAQ,MAAK;IAAjC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,QAAP,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAACA,iBAAAA,MAAM,KAAP,EAAA,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,kBAAP;MAAwB,OAAM;MAC5B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,qCAAAA,UAAD;OAAU,SAAA;OACR,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACP,6BAAAA,aAAD;QACE,gBAAe;QACf,IAAG;QACH,aAAY;OACb,CAAA;MACO,CAAA;KACY,CAAA;KACxB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAM,kBAAP;MAAwB,OAAM;MAC5B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,qCAAAA,UAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACP,6BAAAA,aAAD;OACE,gBAAe;OACf,IAAG;OACH,aAAY;MACb,CAAA,EACO,CAAA;KACY,CAAA;KACxB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAM,kBAAP;MAAwB,OAAM;MAC5B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,qCAAAA,UAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACP,6BAAAA,aAAD;OACE,gBAAe;OACf,IAAG;OACH,aAAY;MACb,CAAA,EACO,CAAA;KACY,CAAA;KACxB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAM,kBAAP,EAAwB,OAAM,OAAQ,CAAA;IAC7B,EAAA,CAAA,EACC,CAAA,GAEd,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,MAAP,EAAA,UACG,MAAM,KAAK,EAAE,QAAA,GAAuB,IAAI,GAAG,UAC1C,iBAAA,GAAA,kBAAA,KAAA,CAACA,iBAAAA,MAAM,KAAP;KAAuB,OAAM;KAA7B,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,iBAAAA,MAAM,eAAP,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAACR,iBAAAA,MAAD;OAAM,OAAM;OAAS,KAAI;OAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACc,qCAAAA,UAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACJ,mCAAAA,QAAD;QAAQ,MAAK;QAAI,UAAS;OAAK,CAAA,EACvB,CAAA,GAEV,iBAAA,GAAA,kBAAA,KAAA,CAACV,iBAAAA,MAAD;QACE,WAAU;QACV,QAAO;QACP,SAAQ;QAHV,UAAA,CAKE,iBAAA,GAAA,kBAAA,IAAA,CAACc,qCAAAA,UAAD;SAAU,OAAM;SAAQ,QAAO;QAAkB,CAAA,GACjD,iBAAA,GAAA,kBAAA,IAAA,CAACA,qCAAAA,UAAD;SAAU,OAAM;SAAO,QAAO;SAAiB,IAAG;QAAK,CAAA,CACnD;OACF,CAAA,CAAA;MACa,CAAA,EAAA,CAAA;MACrB,iBAAA,GAAA,kBAAA,IAAA,CAACN,iBAAAA,MAAM,MAAP,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACR,iBAAAA,MAAD;OAAM,MAAK;OAAO,KAAI;OACpB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACc,qCAAAA,UAAD;QAAU,OAAM;QAAO,QAAO;OAAkB,CAAA;MAC5C,CAAA,EACI,CAAA;MACZ,iBAAA,GAAA,kBAAA,IAAA,CAACN,iBAAAA,MAAM,MAAP,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACM,qCAAAA,UAAD;OAAU,OAAM;OAAQ,QAAO;MAAkB,CAAA,EACvC,CAAA;MACZ,iBAAA,GAAA,kBAAA,IAAA,CAACN,iBAAAA,MAAM,MAAP,EAAY,SAAQ,MAAO,CAAA;KAClB;IA1BK,GAAA,KA0BL,CACZ,EACS,CAAA,CACF;;GAEZ,iBAAA,GAAA,kBAAA,KAAA,CAACR,iBAAAA,MAAD;IAAM,KAAI;IAAI,SAAQ;IAAtB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACc,qCAAAA,UAAD;KAAU,SAAA;KACR,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACR,mCAAAA,QAAD;MAAQ,UAAA;MAAS,SAAQ;MAAY,MAAK;MACxC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;OACE,gBAAe;OACf,IAAG;OACH,aAAY;MACb,CAAA;KACK,CAAA;IACA,CAAA,GACV,iBAAA,GAAA,kBAAA,IAAA,CAACO,qCAAAA,UAAD;KAAU,SAAA;KACR,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACR,mCAAAA,QAAD;MAAQ,UAAA;MAAS,SAAQ;MAAY,MAAK;MACxC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;OACE,gBAAe;OACf,IAAG;OACH,aAAY;MACb,CAAA;KACK,CAAA;IACA,CAAA,CACN;;EACF;;AAEV;AAMA,MAAM,wBAA6D,EACjE,OACA,GAAG,eACC;CACJ,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACQ,iCAAAA,cAAD;EACS;EACP,WAAU;EACV,GAAI,sBAAsB,SAAS,QAAQ;CAC5C,CAAA;AAEL;AAMA,MAAM,aAAuC,EAAE,WAAW;CACxD,IAAI,KAAK,gBACP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,kCAAAA,OAAD;EAAO,OAAM;EAAO,OAAO,EAAE,YAAY,OAAO;EAC9C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACT,6BAAAA,aAAD;GACE,gBAAe;GACf,IAAG;GACH,aAAY;EACb,CAAA;CACI,CAAA;CAGX,IAAI,KAAK,WAAW,WAClB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACS,kCAAAA,OAAD;EAAO,OAAM;EAAQ,OAAO,EAAE,YAAY,OAAO;EAAjD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,gBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACV,6BAAAA,aAAD;GACE,gBAAe;GACf,IAAG;GACH,aAAY;EACb,CAAA,EACa,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;GACE,gBAAe;GACf,IAAG;GACH,aAAY;EACb,CAAA,CACI;;CAGX,IAAI,KAAK,WAAW,iBAClB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACS,kCAAAA,OAAD;EAAO,OAAM;EAAM,OAAO,EAAE,YAAY,OAAO;EAA/C,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,gBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACV,6BAAAA,aAAD;GACE,gBAAe;GACf,IAAG;GACH,aAAY;EACb,CAAA,EACa,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;GACE,gBAAe;GACf,IAAG;GACH,aAAY;EACb,CAAA,CACI;;CAGX,IAAI,KAAK,WAAW,iBAClB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACS,kCAAAA,OAAD;EAAO,OAAM;EAAM,OAAO,EAAE,YAAY,OAAO;EAA/C,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,gBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACV,6BAAAA,aAAD;GACE,gBAAe;GACf,IAAG;GACH,aAAY;EACb,CAAA,EACa,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;GACE,gBAAe;GACf,IAAG;GACH,aAAY;EACb,CAAA,CACI;;CAGX,OAAO;AACT;AAQA,MAAM,cAAyC,UAAU;CACvD,IAAI,CAAC,MAAM,KAAK,gBACd,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACU,iBAAAA,gBAAD,EAAA,UACG,MAAM,KAAK,WAAW,WACrB,iBAAA,GAAA,kBAAA,IAAA,CAACV,6BAAAA,aAAD;EACE,gBAAe;EACf,IAAG;EACH,aAAY;CACb,CAAA,IAED,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;EACE,gBAAe;EACf,IAAG;EACH,aAAY;CACb,CAAA,EAEW,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACW,iBAAAA,WAAD,CAAY,CAAA,CACZ,EAAA,CAAA;CAGN,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;EAAgB,GAAI;EAAO,MAAM,MAAM,KAAK;CAAiB,CAAA;AACtE;AAMA,MAAM,kBAAiD,EACrD,MACA,YACA,UACI;CACJ,MAAM,SAASC,4BAAAA,UAAU;CACzB,MAAM,iBAAiB,IAAI,KAAK,IAAI;CACpC,MAAM,qBAAqB,eAAe,mBAAmB,QAAQ;EAEnE,UAAU,aAAa,SAAY;EACnC,OAAO;EACP,KAAK;EACL,MAAM;EACN,MAAM;EACN,QAAQ;CACV,CAAC;CAED,MAAM,oBAAoBC,0CAAAA,2BAA2B,EACnD,MAAM,eACR,CAAC;CAED,IAAI,kBAAkB,UAAU,SAC9B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACH,iBAAAA,gBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACV,6BAAAA,aAAD;EACE,gBAAe;EACf,IAAG;EACH,aAAY;CACb,CAAA,EACa,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACW,iBAAAA,WAAD,CAAY,CAAA,CACZ,EAAA,CAAA;CAIN,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;EAAe,SAAA;EAAa;EAC1B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,UAAU;GAAM,OAAO;GAC1B,UAAA,kBAAkB;EACf,CAAA;CACO,CAAA;AAEnB;AAEA,MAAM,gBAAgBpB,MAAM,WAC1B,SAAS,cACP,EAAE,UAAU,KAAK,QAAQ,WAAW,GAAG,SACvC,cACA;CACA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACuB,iBAAAA,MAAD;EACE,KAAK;EACL,OAAO,UAAU,cAAc,SAAS;EACxC,QAAQ,UAAU,cAAc,YAAY;EAC5C,MAAM,UAAU,cAAc,MAAM;EACpC,UAAA;EACA,GAAI;EACJ,OACE,MACI;GAEE,SAAS;GACT,GAAG,MAAM;EACX,IACA,MAAM;EAGX;CACG,CAAA;AAEV,CACF;AAOA,MAAM,yBACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;CACE,OAAM;CACN,OAAM;CACN,QAAO;CACP,MAAK;CACL,SAAQ;CALV,UAAA,CAQE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAO,YAAgB,CAAA,GACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,GAAE,kPAAmP,CAAA,CACxP;;AAOP,MAAM,6BAAuE,EAC3E,gBACI;CACJ,MAAM,EAAE,gBAAgBC,iDAAAA,iBAAiB;CACzC,MAAM,EACJ,OAAO,EAAE,kBACP1B,0DAAAA,0BAA0B;CAQ9B,MAAM,CAAC,EAAE,YAAY,mBAAmB,eAAeE,MAAM,SAAS;EACpE,YAAY;EACZ,iBAAiB;CACnB,CAAC;CACD,MAAM,CAAC,YAAY,iBAAiBA,MAAM,SAAS,SAAS;CAC5D,IAAI,eAAe,WAAW;EAC5B,cAAc,SAAS;EACvB,IAAI,CAAC,WACH,aAAa,SACX,KAAK,aAAa;GAAE,YAAY;GAAO,iBAAiB;EAAK,IAAI,IACnE;CAEJ;CAEA,IAAI,eAAe,YACjB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACE,iBAAAA,MAAD;EAAM,OAAM;EAAS,SAAQ;EAAS,IAAG;EAAI,WAAU;EAAS,KAAI;EAApE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACqB,iBAAAA,MAAD;GAAM,MAAK;GACT,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACd,6BAAAA,aAAD;IACE,gBAAe;IACf,IAAG;IACH,aAAY;IACZ,QAAQ,EACN,OAAO,aAAa,kBAAkB,YACxC;GACD,CAAA;EACG,CAAA,GAEN,iBAAA,GAAA,kBAAA,IAAA,CAACD,mCAAAA,QAAD;GACE,SAAQ;GACR,MAAK;GACL,eAAe;IACb,YAAY;KAAE,YAAY;KAAM,iBAAiB;IAAY,CAAC;IAC9D,YAAY;GACd;GACA,SAAS;GAET,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;IACE,gBAAe;IACf,IAAG;IACH,aAAY;GACb,CAAA;EACK,CAAA,CACJ;;CAIV,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACP,iBAAAA,MAAD;EAAM,OAAM;EAAS,SAAQ;EAAS,IAAG;EAAI,KAAI;EAC/C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACqB,iBAAAA,MAAD;GAAM,MAAK;GACT,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACd,6BAAAA,aAAD;IACE,gBAAe;IACf,IAAG;IACH,aAAY;GACb,CAAA;EACG,CAAA;CACF,CAAA;AAEV;AAQA,MAAM,wBAA6D,EACjE,MACA,wBACA,cACI;CACJ,IAAI,CAAC,KAAK,SAAS,KAAK,MAAM,WAAW,GACvC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACU,iBAAAA,gBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACV,6BAAAA,aAAD;EACE,gBAAe;EACf,IAAG;EACH,aAAY;CACb,CAAA,EACa,CAAA,GAEhB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EAAM,eAAA;EAAY,OAAO,EAAE,YAAY,OAAO;EAAG,UAAA;CAE3C,CAAA,CACN,EAAA,CAAA;CAIN,IAAI,0BAA0B,KAAK,MAAM,SAAS,GAAG;EACnD,MAAM,YAAY,KAAK,OAAO,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI;EAChE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACgB,iBAAAA,SAAD;GAAS,SAAS;GAAW,UAAS;GACpC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;IAAe,KAAK;IAClB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAChB,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;KACZ,QAAQ,EAAE,OAAO,KAAK,MAAM,OAAO;IACpC,CAAA;GACY,CAAA;EACR,CAAA;CAEb;CAEA,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;EAAe,KAAK;EAAU,UAAA,KAAK,QAAQ,EAAE,EAAE;CAAoB,CAAA;AAC5E;AAEA,SAAS,sBACP,OACA,UACA;CACA,OAAOiB,6BAAAA,kBAAkB;EACvB,GAAG;EACH,cAAc;EACd,UAAU;EACV,aAAa;CACf,CAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"users-management.cjs","names":["useIsHydrated","useUsersManagementContext","useTranslation","React","SearchProvider","Flex","Grid","Box","UsersSearch","UsersFilter","InviteUserDialog","Button","Translation","Table","getBestName","Avatar","UserActionsDropdown","IconButton","DotsHorizontalIcon","Skeleton","GenericError","Badge","VisuallyHidden","Separator","useLocale","useComparativeReadableDate","Text","useSearchContext","Tooltip","getWidgetDomProps"],"sources":["../../../../src/widgets/users-management/users-management.tsx"],"sourcesContent":["\"use client\";\n\nimport { DotsHorizontalIcon } from \"@radix-ui/react-icons\";\nimport {\n Box,\n Flex,\n Grid,\n Separator,\n Table,\n Text,\n Tooltip,\n VisuallyHidden,\n} from \"@radix-ui/themes\";\nimport type { TextProps } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport {\n Avatar,\n Badge,\n Button,\n IconButton,\n Select,\n Skeleton,\n TextField,\n} from \"../../components/elements.js\";\nimport { GenericError } from \"../../components/generic-error.js\";\nimport { USER_ROW_LIMIT } from \"../../lib/constants.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\nimport { useLocale } from \"../../lib/i18n/use-locale.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { useComparativeReadableDate } from \"../../lib/use-comparative-readable-date.js\";\nimport { useIsHydrated } from \"../../lib/use-is-hydrated.js\";\nimport { getBestName } from \"../../lib/utils.js\";\nimport { getWidgetDomProps } from \"../../lib/widget-dom-props.js\";\nimport type {\n WidgetRootDomProps,\n WidgetRootState,\n} from \"../../lib/widget-types.js\";\nimport { InviteUserDialog } from \"./invite-user-dialog.js\";\nimport { SearchProvider, useSearchContext } from \"./search-provider.js\";\nimport { UserActionsDropdown } from \"./user-actions-dropdown.js\";\nimport { UsersFilter } from \"./users-filter.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\nimport type {\n Member,\n MembersQueryResult,\n RolesAndConfig,\n} from \"./users-management-utils.js\";\nimport { UsersSearch } from \"./users-search.js\";\n\ninterface UsersManagementProps extends WidgetRootDomProps {\n rolesData: RolesAndConfig;\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 pagination = {\n before: userData.listMetadata.before ?? null,\n after: userData.listMetadata.after ?? null,\n };\n\n const { dispatch } = useUsersManagementContext();\n const isMultipleRolesEnabled = rolesData.multipleRolesEnabled;\n const translate = useTranslation();\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 [delayElapsed, setDelayElapsed] = React.useState(false);\n const [prevIsPending, setPrevIsPending] = React.useState(isPending);\n if (isPending !== prevIsPending) {\n setPrevIsPending(isPending);\n if (isPending) {\n setDelayElapsed(false);\n }\n }\n const deferredLoading = isPending && delayElapsed;\n\n React.useEffect(() => {\n if (!isPending) {\n return;\n }\n const timeoutId = window.setTimeout(() => {\n setDelayElapsed(true);\n }, 500);\n return () => {\n window.clearTimeout(timeoutId);\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 <Button>\n <Translation\n defaultMessage=\"Invite user\"\n id=\"NBXpRj\"\n description=\"Button text to invite a new user to the organization\"\n />\n </Button>\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 <Translation\n defaultMessage=\"User\"\n id=\"BBh86k\"\n description=\"Column header for user information in the users table\"\n />\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"100px\">\n {isMultipleRolesEnabled ? (\n <Translation\n defaultMessage=\"Roles\"\n id=\"A1DuWM\"\n description=\"Column header for user roles when multiple roles are enabled\"\n />\n ) : (\n <Translation\n defaultMessage=\"Role\"\n id=\"nQbe+Y\"\n description=\"Column header for user role when only single role is allowed\"\n />\n )}\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"140px\">\n <Translation\n defaultMessage=\"Last active\"\n id=\"oOwLGt\"\n description=\"Column header showing when users were last active\"\n />\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\n title={translate({\n defaultMessage: \"User actions\",\n id: \"1nsmNS\",\n description:\n \"Button tooltip for opening user actions menu\",\n })}\n >\n <DotsHorizontalIcon />\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 <Button\n variant=\"secondary\"\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, after: null },\n });\n }\n }}\n >\n <Translation\n defaultMessage=\"Previous\"\n id=\"910Q6b\"\n description=\"Button text to navigate to the previous page of users\"\n />\n </Button>\n <Button\n variant=\"secondary\"\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, before: null },\n });\n }\n }}\n >\n <Translation\n defaultMessage=\"Next\"\n id=\"UlAY08\"\n description=\"Button text to navigate to the next page of users\"\n />\n </Button>\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 const translate = useTranslation();\n const placeholderText = (\n <Translation\n defaultMessage=\"All\"\n id=\"l/Do9/\"\n description=\"Filter option to show all users\"\n />\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.Root\n disabled\n aria-label={translate({\n defaultMessage: \"User search\",\n id: \"lzPOKv\",\n description: \"Label for the user search input field\",\n })}\n />\n </Box>\n </Skeleton>\n <Skeleton loading>\n <Box flexGrow=\"0\" flexShrink=\"0\">\n <Select.Root disabled value=\"all\" onValueChange={() => void 0}>\n <Select.Trigger>{placeholderText}</Select.Trigger>\n <Select.Content>\n <Select.Item value=\"all\">{placeholderText}</Select.Item>\n </Select.Content>\n </Select.Root>\n </Box>\n </Skeleton>\n </Flex>\n <Skeleton loading>\n <Box flexGrow=\"0\" flexShrink=\"0\" style={{ placeSelf: \"flex-end\" }}>\n <Button disabled>\n <Translation\n defaultMessage=\"Invite user\"\n id=\"NBXpRj\"\n description=\"Button text to invite a new user to the organization\"\n />\n </Button>\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>\n <Translation\n defaultMessage=\"User\"\n id=\"BBh86k\"\n description=\"Column header for user information in the users table\"\n />\n </Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"100px\">\n <Skeleton>\n <Translation\n defaultMessage=\"Role\"\n id=\"FK7mP4\"\n description=\"Column header for user role\"\n />\n </Skeleton>\n </Table.ColumnHeaderCell>\n <Table.ColumnHeaderCell width=\"140px\">\n <Skeleton>\n <Translation\n defaultMessage=\"Last active\"\n id=\"oOwLGt\"\n description=\"Column header showing when users were last active\"\n />\n </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 <Button disabled variant=\"secondary\" size=\"1\">\n <Translation\n defaultMessage=\"Previous\"\n id=\"910Q6b\"\n description=\"Button text to navigate to the previous page of users\"\n />\n </Button>\n </Skeleton>\n <Skeleton loading>\n <Button disabled variant=\"secondary\" size=\"1\">\n <Translation\n defaultMessage=\"Next\"\n id=\"UlAY08\"\n description=\"Button text to navigate to the next page of users\"\n />\n </Button>\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\ninterface UserBadgeProps {\n user: Member;\n}\n\nconst UserBadge: React.FC<UserBadgeProps> = ({ user }) => {\n if (user.isLoggedInUser) {\n return (\n <Badge color=\"gray\" style={{ userSelect: \"none\" }}>\n <Translation\n defaultMessage=\"You\"\n id=\"ER1Vmv\"\n description=\"Badge indicating the current logged-in user\"\n />\n </Badge>\n );\n }\n if (user.status === \"Invited\") {\n return (\n <Badge color=\"amber\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"Status: \"\n id=\"E2o/+H\"\n description=\"Prefix for status indicator in screen reader\"\n />\n </VisuallyHidden>\n <Translation\n defaultMessage=\"Invited\"\n id=\"byIkUu\"\n description=\"Badge status indicating user has been invited but not yet accepted\"\n />\n </Badge>\n );\n }\n if (user.status === \"InviteExpired\") {\n return (\n <Badge color=\"red\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"Status: Invite \"\n id=\"BWvbwY\"\n description=\"Prefix for invite status indicator in screen reader\"\n />\n </VisuallyHidden>\n <Translation\n defaultMessage=\"Expired\"\n id=\"+0sQaN\"\n description=\"Badge status indicating user invitation has expired\"\n />\n </Badge>\n );\n }\n if (user.status === \"InviteRevoked\") {\n return (\n <Badge color=\"red\" style={{ userSelect: \"none\" }}>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"Status: Invite \"\n id=\"BWvbwY\"\n description=\"Prefix for invite status indicator in screen reader\"\n />\n </VisuallyHidden>\n <Translation\n defaultMessage=\"Revoked\"\n id=\"NNBv+r\"\n description=\"Badge status indicating user invitation has been revoked\"\n />\n </Badge>\n );\n }\n return null;\n};\n\ninterface LastActiveProps {\n user: Member;\n isHydrated: boolean;\n dim?: boolean;\n}\n\nconst LastActive: React.FC<LastActiveProps> = (props) => {\n if (!props.user.lastActivityAt) {\n return (\n <>\n <VisuallyHidden>\n {props.user.status === \"Active\" ? (\n <Translation\n defaultMessage=\"Never\"\n id=\"0duvF4\"\n description=\"Screen reader text indicating user has never been active\"\n />\n ) : (\n <Translation\n defaultMessage=\"Not active\"\n id=\"hd2+kk\"\n description=\"Screen reader text indicating user is not active\"\n />\n )}\n </VisuallyHidden>\n <Separator />\n </>\n );\n }\n return <LastActiveImpl {...props} date={props.user.lastActivityAt} />;\n};\n\ninterface LastActiveImplProps extends LastActiveProps {\n date: string;\n}\n\nconst LastActiveImpl: React.FC<LastActiveImplProps> = ({\n date,\n isHydrated,\n dim,\n}) => {\n const locale = useLocale();\n const lastActiveDate = new Date(date);\n const lastActiveDateTime = lastActiveDate.toLocaleTimeString(locale, {\n // hard-coded timezone before hydration to prevent server/client mismatch\n timeZone: isHydrated ? undefined : \"America/Los_Angeles\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n\n const lastActiveDisplay = useComparativeReadableDate({\n date: lastActiveDate,\n });\n\n if (lastActiveDisplay.state !== \"valid\") {\n return (\n <>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"Unknown\"\n id=\"UUigrK\"\n description=\"Screen reader text indicating last active date is unknown\"\n />\n </VisuallyHidden>\n <Separator />\n </>\n );\n }\n\n return (\n <TableCellText asChild dim={dim}>\n <time dateTime={date} title={lastActiveDateTime}>\n {lastActiveDisplay.formatted}\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(v2): 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: React.FC = () => (\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 {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\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\ninterface UsersManagementEmptyStateProps {\n isPending: boolean;\n}\n\nconst UsersManagementEmptyState: React.FC<UsersManagementEmptyStateProps> = ({\n isPending,\n}) => {\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 <Translation\n defaultMessage=\"No users found for query '{query}'\"\n id=\"wrEZ8+\"\n description=\"Message shown when no users match the search query\"\n values={{\n query: isClearing ? lastSearchQuery : searchQuery,\n }}\n />\n </Text>\n\n <Button\n variant=\"secondary\"\n size=\"1\"\n onClick={() => {\n setClearing({ isClearing: true, lastSearchQuery: searchQuery });\n clearSearch();\n }}\n loading={isPending}\n >\n <Translation\n defaultMessage=\"Clear search\"\n id=\"Xv3fVI\"\n description=\"Button text to clear the current search query\"\n />\n </Button>\n </Flex>\n );\n }\n\n return (\n <Flex align=\"center\" justify=\"center\" py=\"8\" gap=\"2\">\n <Text size=\"2\">\n <Translation\n defaultMessage=\"No users found\"\n id=\"MQ+LoA\"\n description=\"Message shown when there are no users in the system\"\n />\n </Text>\n </Flex>\n );\n};\n\ninterface UserRolesCellContentProps {\n user: Member;\n isMultipleRolesEnabled: boolean;\n dimText: boolean;\n}\n\nconst UserRolesCellContent: React.FC<UserRolesCellContentProps> = ({\n user,\n isMultipleRolesEnabled,\n dimText,\n}) => {\n if (!user.roles || user.roles.length === 0) {\n return (\n <>\n <VisuallyHidden>\n <Translation\n defaultMessage=\"No roles assigned\"\n id=\"CVOVB0\"\n description=\"Screen reader text indicating user has no roles assigned\"\n />\n </VisuallyHidden>\n {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n <span aria-hidden style={{ userSelect: \"none\" }}>\n –\n </span>\n </>\n );\n }\n\n if (isMultipleRolesEnabled && user.roles.length > 1) {\n const roleNames = user.roles?.map((role) => role.name).join(\", \");\n return (\n <Tooltip content={roleNames} maxWidth=\"250px\">\n <TableCellText dim={dimText}>\n <Translation\n defaultMessage=\"{count} roles\"\n id=\"lWAmRC\"\n description=\"Shows the number of roles assigned to a user (plural)\"\n values={{ count: user.roles.length }}\n />\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 getWidgetDomProps({\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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-search.cjs","names":["React","useSearchContext","useUsersManagementContext","useTranslation","useDebouncedCallback","useComposedRefs","cx","namespaceClassName","MagnifyingGlassIcon","IconButton","Cross2Icon"],"sources":["../../../../src/widgets/users-management/users-search.tsx"],"sourcesContent":["\"use client\";\n\nimport { Cross2Icon, MagnifyingGlassIcon } from \"@radix-ui/react-icons\";\nimport cx from \"clsx\";\nimport * as React from \"react\";\nimport { IconButton, TextField } from \"../../components/elements.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { useDebouncedCallback } from \"../../lib/use-debounce.js\";\nimport { namespaceClassName } from \"../../lib/widget-dom-props.js\";\nimport { useSearchContext } from \"./search-provider.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\n\ninterface UsersSearchProps extends TextField.RootProps {}\n\nconst UsersSearch = React.forwardRef<HTMLInputElement, UsersSearchProps>(\n function UsersSearch({ className, ...props }, ref) {\n const { inputRef, clearSearch, searchValue, setSearchValue } =\n useSearchContext();\n const { dispatch } = useUsersManagementContext();\n const translate = useTranslation();\n\n const filter = useDebouncedCallback((value) => {\n
|
|
1
|
+
{"version":3,"file":"users-search.cjs","names":["React","useSearchContext","useUsersManagementContext","useTranslation","useDebouncedCallback","useComposedRefs","cx","namespaceClassName","MagnifyingGlassIcon","IconButton","Cross2Icon"],"sources":["../../../../src/widgets/users-management/users-search.tsx"],"sourcesContent":["\"use client\";\n\nimport { Cross2Icon, MagnifyingGlassIcon } from \"@radix-ui/react-icons\";\nimport cx from \"clsx\";\nimport * as React from \"react\";\nimport { IconButton, TextField } from \"../../components/elements.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { useDebouncedCallback } from \"../../lib/use-debounce.js\";\nimport { namespaceClassName } from \"../../lib/widget-dom-props.js\";\nimport { useSearchContext } from \"./search-provider.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\n\ninterface UsersSearchProps extends TextField.RootProps {}\n\nconst UsersSearch = React.forwardRef<HTMLInputElement, UsersSearchProps>(\n function UsersSearch({ className, ...props }, ref) {\n const { inputRef, clearSearch, searchValue, setSearchValue } =\n useSearchContext();\n const { dispatch } = useUsersManagementContext();\n const translate = useTranslation();\n\n const filter = useDebouncedCallback(\n (value) => {\n dispatch({ type: \"FILTER_BY_SEARCH\", searchQuery: value });\n },\n { wait: 200 },\n );\n\n const resetSearch = () => {\n clearSearch();\n filter.cancel();\n };\n\n return (\n <TextField.Root\n ref={useComposedRefs(inputRef, ref)}\n className={cx(namespaceClassName(\"users-search\"), className)}\n autoComplete=\"off\"\n aria-label={translate({\n defaultMessage: \"User search\",\n id: \"lzPOKv\",\n description: \"Label for the user search input field\",\n })}\n placeholder={translate({\n defaultMessage: \"Search by name or e-mail\",\n id: \"VH4IKy\",\n description: \"Placeholder text for the user search input field\",\n })}\n value={searchValue}\n onChange={(event) => {\n const value = event.target.value;\n setSearchValue(value);\n filter(value);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n resetSearch();\n }\n }}\n {...props}\n >\n <TextField.Slot side=\"left\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextField.Slot>\n\n <TextField.Slot side=\"right\">\n {!!searchValue && (\n <IconButton\n size=\"1\"\n onClick={resetSearch}\n title={translate({\n defaultMessage: \"Clear search\",\n id: \"IBozK6\",\n description: \"Tooltip text for the clear search button\",\n })}\n >\n <Cross2Icon aria-hidden=\"true\" />\n </IconButton>\n )}\n </TextField.Slot>\n </TextField.Root>\n );\n },\n);\nexport { UsersSearch };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAeA,MAAM,cAAcA,MAAM,WACxB,SAAS,YAAY,EAAE,WAAW,GAAG,SAAS,KAAK;CACjD,MAAM,EAAE,UAAU,aAAa,aAAa,mBAC1CC,iDAAAA,iBAAiB;CACnB,MAAM,EAAE,aAAaC,0DAAAA,0BAA0B;CAC/C,MAAM,YAAYC,iCAAAA,eAAe;CAEjC,MAAM,SAASC,yBAAAA,sBACZ,UAAU;EACT,SAAS;GAAE,MAAM;GAAoB,aAAa;EAAM,CAAC;CAC3D,GACA,EAAE,MAAM,IAAI,CACd;CAEA,MAAM,oBAAoB;EACxB,YAAY;EACZ,OAAO,OAAO;CAChB;CAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,uCAAA,MAAA;EACE,KAAKC,yBAAAA,gBAAgB,UAAU,GAAG;EAClC,YAAA,GAAWC,KAAAA,QAAAA,CAAGC,6BAAAA,mBAAmB,cAAc,GAAG,SAAS;EAC3D,cAAa;EACb,cAAY,UAAU;GACpB,gBAAgB;GAChB,IAAI;GACJ,aAAa;EACf,CAAC;EACD,aAAa,UAAU;GACrB,gBAAgB;GAChB,IAAI;GACJ,aAAa;EACf,CAAC;EACD,OAAO;EACP,WAAW,UAAU;GACnB,MAAM,QAAQ,MAAM,OAAO;GAC3B,eAAe,KAAK;GACpB,OAAO,KAAK;EACd;EACA,YAAY,UAAU;GACpB,IAAI,MAAM,QAAQ,UAAU;IAC1B,MAAM,eAAe;IACrB,YAAY;GACd;EACF;EACA,GAAI;EA1BN,UAAA,CA4BE,iBAAA,GAAA,kBAAA,IAAA,CAAA,uCAAA,MAAA;GAAgB,MAAK;GACnB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,qBAAD;IAAqB,eAAY;IAAO,QAAO;IAAK,OAAM;GAAM,CAAA;EAClD,CAAA,GAEhB,iBAAA,GAAA,kBAAA,IAAA,CAAA,uCAAA,MAAA;GAAgB,MAAK;GAClB,UAAA,CAAC,CAAC,eACD,iBAAA,GAAA,kBAAA,IAAA,CAACC,wCAAAA,YAAD;IACE,MAAK;IACL,SAAS;IACT,OAAO,UAAU;KACf,gBAAgB;KAChB,IAAI;KACJ,aAAa;IACf,CAAC;IAED,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,YAAD,EAAY,eAAY,OAAQ,CAAA;GACtB,CAAA;EAEA,CAAA,CACF;;AAEpB,CACF"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useWorkOsApiUrl } from "./lib/widgets-context.js";
|
|
3
|
+
import { clientGraphqlQueryKey } from "./api/client-graphql/query-keys.js";
|
|
3
4
|
import { ApiProvider } from "./api/api-provider.js";
|
|
4
|
-
import {
|
|
5
|
+
import { useClientGraphqlMutation, useClientGraphqlQuery } from "./api/client-graphql/hooks.js";
|
|
5
6
|
import { ErrorBoundary } from "./components/error-boundary.js";
|
|
6
7
|
import { AdminPortalAuditLogStreaming as AdminPortalAuditLogStreaming$1, AdminPortalAuditLogStreamingButton, AdminPortalAuditLogStreamingError, AdminPortalAuditLogStreamingLoading } from "./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js";
|
|
7
8
|
import "react";
|