@workos-inc/widgets 1.7.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/cjs/api/endpoint.cjs +1 -0
- package/dist/cjs/api/endpoint.cjs.map +1 -1
- package/dist/cjs/api/endpoint.d.cts +1 -0
- package/dist/cjs/index.cjs +5 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +1 -0
- package/dist/cjs/lib/add-mfa-dialog.cjs +133 -61
- package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-domain-verification.cjs +41 -5
- package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-sso-connection.cjs +121 -44
- package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-key-details-card.cjs +25 -3
- package/dist/cjs/lib/api-keys/api-key-details-card.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs +25 -3
- package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-keys-search.cjs +13 -4
- package/dist/cjs/lib/api-keys/api-keys-search.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-keys-table.cjs +94 -12
- package/dist/cjs/lib/api-keys/api-keys-table.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-keys.cjs +16 -2
- package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/create-api-key.cjs +172 -20
- package/dist/cjs/lib/api-keys/create-api-key.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/relative-time.cjs +12 -2
- package/dist/cjs/lib/api-keys/relative-time.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs +49 -7
- package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs.map +1 -1
- package/dist/cjs/lib/change-password-dialog.cjs +122 -16
- package/dist/cjs/lib/change-password-dialog.cjs.map +1 -1
- package/dist/cjs/lib/copy-button.cjs +14 -2
- package/dist/cjs/lib/copy-button.cjs.map +1 -1
- package/dist/cjs/lib/copy-button.d.cts +2 -1
- package/dist/cjs/lib/delete-domain-dialog.cjs +52 -19
- package/dist/cjs/lib/delete-domain-dialog.cjs.map +1 -1
- package/dist/cjs/lib/delete-user-dialog.cjs +46 -11
- package/dist/cjs/lib/delete-user-dialog.cjs.map +1 -1
- package/dist/cjs/lib/delete-user-dialog.d.cts +2 -2
- package/dist/cjs/lib/domain-actions.cjs +51 -7
- package/dist/cjs/lib/domain-actions.cjs.map +1 -1
- package/dist/cjs/lib/domain-item.cjs +42 -8
- package/dist/cjs/lib/domain-item.cjs.map +1 -1
- package/dist/cjs/lib/edit-user-profile-dialog.cjs +62 -11
- package/dist/cjs/lib/edit-user-profile-dialog.cjs.map +1 -1
- package/dist/cjs/lib/edit-user-role-dialog.cjs +90 -17
- package/dist/cjs/lib/edit-user-role-dialog.cjs.map +1 -1
- package/dist/cjs/lib/elements.cjs +14 -3
- package/dist/cjs/lib/elements.cjs.map +1 -1
- package/dist/cjs/lib/elements.d.cts +5 -2
- package/dist/cjs/lib/elevated-access.cjs +78 -18
- package/dist/cjs/lib/elevated-access.cjs.map +1 -1
- package/dist/cjs/lib/generic-error.cjs +53 -11
- package/dist/cjs/lib/generic-error.cjs.map +1 -1
- package/dist/cjs/lib/generic-error.d.cts +5 -1
- package/dist/cjs/lib/i18n/intl-context.cjs +47 -0
- package/dist/cjs/lib/i18n/intl-context.cjs.map +1 -0
- package/dist/cjs/lib/i18n/intl-context.d.cts +29 -0
- package/dist/cjs/lib/i18n/translation.cjs +67 -0
- package/dist/cjs/lib/i18n/translation.cjs.map +1 -0
- package/dist/cjs/lib/i18n/translation.d.cts +16 -0
- package/dist/cjs/lib/i18n/use-locale.cjs +33 -0
- package/dist/cjs/lib/i18n/use-locale.cjs.map +1 -0
- package/dist/cjs/lib/i18n/use-locale.d.cts +7 -0
- package/dist/cjs/lib/i18n/use-translation.cjs +47 -0
- package/dist/cjs/lib/i18n/use-translation.cjs.map +1 -0
- package/dist/cjs/lib/i18n/use-translation.d.cts +15 -0
- package/dist/cjs/lib/identity-providers.d.cts +1 -1
- package/dist/cjs/lib/invite-user-dialog.cjs +69 -14
- package/dist/cjs/lib/invite-user-dialog.cjs.map +1 -1
- package/dist/cjs/lib/logout-all-sessions-dialog.cjs +33 -4
- package/dist/cjs/lib/logout-all-sessions-dialog.cjs.map +1 -1
- package/dist/cjs/lib/logout-dialog.cjs +34 -10
- package/dist/cjs/lib/logout-dialog.cjs.map +1 -1
- package/dist/cjs/lib/organization-switcher.cjs +12 -2
- package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
- package/dist/cjs/lib/pipes.cjs +175 -36
- package/dist/cjs/lib/pipes.cjs.map +1 -1
- package/dist/cjs/lib/resend-invite-dialog.cjs +67 -17
- package/dist/cjs/lib/resend-invite-dialog.cjs.map +1 -1
- package/dist/cjs/lib/reset-mfa-dialog.cjs +50 -7
- package/dist/cjs/lib/reset-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/revoke-invite-dialog.cjs +42 -10
- package/dist/cjs/lib/revoke-invite-dialog.cjs.map +1 -1
- package/dist/cjs/lib/save-button.cjs +9 -1
- package/dist/cjs/lib/save-button.cjs.map +1 -1
- package/dist/cjs/lib/set-password-dialog.cjs +101 -13
- package/dist/cjs/lib/set-password-dialog.cjs.map +1 -1
- package/dist/cjs/lib/user-actions-dropdown.cjs +54 -6
- package/dist/cjs/lib/user-actions-dropdown.cjs.map +1 -1
- package/dist/cjs/lib/user-profile.cjs +81 -10
- package/dist/cjs/lib/user-profile.cjs.map +1 -1
- package/dist/cjs/lib/user-security.cjs +127 -25
- package/dist/cjs/lib/user-security.cjs.map +1 -1
- package/dist/cjs/lib/user-sessions.cjs +74 -15
- package/dist/cjs/lib/user-sessions.cjs.map +1 -1
- package/dist/cjs/lib/users-management.cjs +265 -49
- package/dist/cjs/lib/users-management.cjs.map +1 -1
- package/dist/cjs/lib/users-search.cjs +18 -4
- package/dist/cjs/lib/users-search.cjs.map +1 -1
- package/dist/cjs/lib/utils.cjs +10 -7
- package/dist/cjs/lib/utils.cjs.map +1 -1
- package/dist/cjs/lib/utils.d.cts +2 -1
- package/dist/cjs/lib/view-dns-record-dialog.cjs +89 -18
- package/dist/cjs/lib/view-dns-record-dialog.cjs.map +1 -1
- package/dist/cjs/workos-widgets.client.cjs +2 -2
- package/dist/cjs/workos-widgets.client.cjs.map +1 -1
- package/dist/css/lib/provider-icon.css +93 -3
- package/dist/esm/api/endpoint.d.ts +1 -0
- package/dist/esm/api/endpoint.js +1 -0
- package/dist/esm/api/endpoint.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/add-mfa-dialog.js +133 -61
- package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/admin-portal-domain-verification.js +41 -5
- package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
- package/dist/esm/lib/admin-portal-sso-connection.js +121 -44
- package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
- package/dist/esm/lib/api-keys/api-key-details-card.js +25 -3
- package/dist/esm/lib/api-keys/api-key-details-card.js.map +1 -1
- package/dist/esm/lib/api-keys/api-key-details-dialog.js +25 -3
- package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
- package/dist/esm/lib/api-keys/api-keys-search.js +13 -4
- package/dist/esm/lib/api-keys/api-keys-search.js.map +1 -1
- package/dist/esm/lib/api-keys/api-keys-table.js +94 -12
- package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
- package/dist/esm/lib/api-keys/api-keys.js +16 -2
- package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
- package/dist/esm/lib/api-keys/create-api-key.js +172 -20
- package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
- package/dist/esm/lib/api-keys/relative-time.js +12 -2
- package/dist/esm/lib/api-keys/relative-time.js.map +1 -1
- package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +49 -7
- package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
- package/dist/esm/lib/change-password-dialog.js +122 -16
- package/dist/esm/lib/change-password-dialog.js.map +1 -1
- package/dist/esm/lib/copy-button.d.ts +2 -1
- package/dist/esm/lib/copy-button.js +14 -2
- package/dist/esm/lib/copy-button.js.map +1 -1
- package/dist/esm/lib/delete-domain-dialog.js +52 -19
- package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
- package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
- package/dist/esm/lib/delete-user-dialog.js +36 -11
- package/dist/esm/lib/delete-user-dialog.js.map +1 -1
- package/dist/esm/lib/domain-actions.js +41 -7
- package/dist/esm/lib/domain-actions.js.map +1 -1
- package/dist/esm/lib/domain-item.js +42 -8
- package/dist/esm/lib/domain-item.js.map +1 -1
- package/dist/esm/lib/edit-user-profile-dialog.js +62 -11
- package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
- package/dist/esm/lib/edit-user-role-dialog.js +90 -17
- package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
- package/dist/esm/lib/elements.d.ts +5 -2
- package/dist/esm/lib/elements.js +14 -3
- package/dist/esm/lib/elements.js.map +1 -1
- package/dist/esm/lib/elevated-access.js +78 -18
- package/dist/esm/lib/elevated-access.js.map +1 -1
- package/dist/esm/lib/generic-error.d.ts +5 -1
- package/dist/esm/lib/generic-error.js +53 -11
- package/dist/esm/lib/generic-error.js.map +1 -1
- package/dist/esm/lib/i18n/intl-context.d.ts +29 -0
- package/dist/esm/lib/i18n/intl-context.js +12 -0
- package/dist/esm/lib/i18n/intl-context.js.map +1 -0
- package/dist/esm/lib/i18n/translation.d.ts +16 -0
- package/dist/esm/lib/i18n/translation.js +45 -0
- package/dist/esm/lib/i18n/translation.js.map +1 -0
- package/dist/esm/lib/i18n/use-locale.d.ts +7 -0
- package/dist/esm/lib/i18n/use-locale.js +9 -0
- package/dist/esm/lib/i18n/use-locale.js.map +1 -0
- package/dist/esm/lib/i18n/use-translation.d.ts +15 -0
- package/dist/esm/lib/i18n/use-translation.js +23 -0
- package/dist/esm/lib/i18n/use-translation.js.map +1 -0
- package/dist/esm/lib/identity-providers.d.ts +1 -1
- package/dist/esm/lib/invite-user-dialog.js +70 -15
- package/dist/esm/lib/invite-user-dialog.js.map +1 -1
- package/dist/esm/lib/logout-all-sessions-dialog.js +33 -4
- package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
- package/dist/esm/lib/logout-dialog.js +34 -10
- package/dist/esm/lib/logout-dialog.js.map +1 -1
- package/dist/esm/lib/organization-switcher.js +12 -2
- package/dist/esm/lib/organization-switcher.js.map +1 -1
- package/dist/esm/lib/pipes.js +175 -36
- package/dist/esm/lib/pipes.js.map +1 -1
- package/dist/esm/lib/resend-invite-dialog.js +67 -17
- package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
- package/dist/esm/lib/reset-mfa-dialog.js +50 -7
- package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/revoke-invite-dialog.js +42 -10
- package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
- package/dist/esm/lib/save-button.js +9 -1
- package/dist/esm/lib/save-button.js.map +1 -1
- package/dist/esm/lib/set-password-dialog.js +101 -13
- package/dist/esm/lib/set-password-dialog.js.map +1 -1
- package/dist/esm/lib/user-actions-dropdown.js +54 -6
- package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
- package/dist/esm/lib/user-profile.js +81 -10
- package/dist/esm/lib/user-profile.js.map +1 -1
- package/dist/esm/lib/user-security.js +127 -25
- package/dist/esm/lib/user-security.js.map +1 -1
- package/dist/esm/lib/user-sessions.js +74 -15
- package/dist/esm/lib/user-sessions.js.map +1 -1
- package/dist/esm/lib/users-management.js +266 -51
- package/dist/esm/lib/users-management.js.map +1 -1
- package/dist/esm/lib/users-search.js +18 -4
- package/dist/esm/lib/users-search.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +2 -1
- package/dist/esm/lib/utils.js +10 -7
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/lib/view-dns-record-dialog.js +89 -18
- package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
- package/dist/esm/workos-widgets.client.js +2 -2
- package/dist/esm/workos-widgets.client.js.map +1 -1
- package/package.json +13 -4
|
@@ -40,6 +40,8 @@ var React = __toESM(require("react"), 1);
|
|
|
40
40
|
var Form = __toESM(require("@radix-ui/react-form"), 1);
|
|
41
41
|
var import_elements = require("./elements.js");
|
|
42
42
|
var import_save_button = require("./save-button.js");
|
|
43
|
+
var import_translation = require("./i18n/translation.js");
|
|
44
|
+
var import_use_translation = require("./i18n/use-translation.js");
|
|
43
45
|
function EditUserProfileDialog({
|
|
44
46
|
children,
|
|
45
47
|
user,
|
|
@@ -63,6 +65,7 @@ function EditUserProfileDialog({
|
|
|
63
65
|
);
|
|
64
66
|
}
|
|
65
67
|
function Content({ user, onClose }) {
|
|
68
|
+
const translate = (0, import_use_translation.useTranslation)();
|
|
66
69
|
const client = (0, import_react_query.useQueryClient)();
|
|
67
70
|
const updateMe = (0, import_endpoint.useUpdateMe)({
|
|
68
71
|
mutation: {
|
|
@@ -79,11 +82,23 @@ function Content({ user, onClose }) {
|
|
|
79
82
|
}
|
|
80
83
|
});
|
|
81
84
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
82
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { mb: "5", children:
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { mb: "5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
86
|
+
import_translation.Translation,
|
|
87
|
+
{
|
|
88
|
+
defaultMessage: "Edit name",
|
|
89
|
+
id: "pcK9ly",
|
|
90
|
+
description: "Dialog title for editing user name"
|
|
91
|
+
}
|
|
92
|
+
) }),
|
|
93
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Description, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
94
|
+
import_translation.Translation,
|
|
95
|
+
{
|
|
96
|
+
defaultMessage: "Edit the details of {email}",
|
|
97
|
+
id: "SEsXx0",
|
|
98
|
+
description: "Dialog description for editing user details",
|
|
99
|
+
values: { email: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", children: user.email }) }
|
|
100
|
+
}
|
|
101
|
+
) }) }),
|
|
87
102
|
updateMe.error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Root, { color: "red", my: "-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: getMutationErrorMessage(updateMe.error) }) }) : null,
|
|
88
103
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
89
104
|
Form.Root,
|
|
@@ -103,27 +118,49 @@ function Content({ user, onClose }) {
|
|
|
103
118
|
children: [
|
|
104
119
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { my: "5", direction: "column", gap: "4", children: [
|
|
105
120
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Field, { name: "firstName", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "1", children: [
|
|
106
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children:
|
|
121
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
122
|
+
import_translation.Translation,
|
|
123
|
+
{
|
|
124
|
+
defaultMessage: "First name",
|
|
125
|
+
id: "DAYdcg",
|
|
126
|
+
description: "Label for first name field"
|
|
127
|
+
}
|
|
128
|
+
) }) }),
|
|
107
129
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
108
130
|
import_elements.TextField,
|
|
109
131
|
{
|
|
110
132
|
"data-1p-ignore": true,
|
|
111
133
|
autoComplete: "given-name",
|
|
112
134
|
defaultValue: user.firstName ?? "",
|
|
113
|
-
placeholder:
|
|
135
|
+
placeholder: translate({
|
|
136
|
+
defaultMessage: "Your first name",
|
|
137
|
+
id: "gUTpgG",
|
|
138
|
+
description: "Placeholder for first name field"
|
|
139
|
+
}),
|
|
114
140
|
disabled: updateMe.isPending || updateMe.isSuccess
|
|
115
141
|
}
|
|
116
142
|
) })
|
|
117
143
|
] }) }),
|
|
118
144
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Field, { name: "lastName", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "1", children: [
|
|
119
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children:
|
|
145
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
146
|
+
import_translation.Translation,
|
|
147
|
+
{
|
|
148
|
+
defaultMessage: "Last name",
|
|
149
|
+
id: "IwcAMv",
|
|
150
|
+
description: "Label for last name field"
|
|
151
|
+
}
|
|
152
|
+
) }) }),
|
|
120
153
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Form.Control, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
121
154
|
import_elements.TextField,
|
|
122
155
|
{
|
|
123
156
|
"data-1p-ignore": true,
|
|
124
157
|
autoComplete: "family-name",
|
|
125
158
|
defaultValue: user.lastName ?? "",
|
|
126
|
-
placeholder:
|
|
159
|
+
placeholder: translate({
|
|
160
|
+
defaultMessage: "Your last name",
|
|
161
|
+
id: "Gy8eW0",
|
|
162
|
+
description: "Placeholder for last name field"
|
|
163
|
+
}),
|
|
127
164
|
disabled: updateMe.isPending || updateMe.isSuccess
|
|
128
165
|
}
|
|
129
166
|
) })
|
|
@@ -135,7 +172,14 @@ function Content({ user, onClose }) {
|
|
|
135
172
|
{
|
|
136
173
|
variant: "secondary",
|
|
137
174
|
disabled: updateMe.isPending || updateMe.isSuccess,
|
|
138
|
-
children:
|
|
175
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
176
|
+
import_translation.Translation,
|
|
177
|
+
{
|
|
178
|
+
defaultMessage: "Cancel",
|
|
179
|
+
id: "hHNj31",
|
|
180
|
+
description: "Cancel button text"
|
|
181
|
+
}
|
|
182
|
+
)
|
|
139
183
|
}
|
|
140
184
|
) }),
|
|
141
185
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -145,7 +189,14 @@ function Content({ user, onClose }) {
|
|
|
145
189
|
loading: updateMe.isPending,
|
|
146
190
|
done: updateMe.isSuccess,
|
|
147
191
|
onDone: onClose,
|
|
148
|
-
children:
|
|
192
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
193
|
+
import_translation.Translation,
|
|
194
|
+
{
|
|
195
|
+
defaultMessage: "Save",
|
|
196
|
+
id: "RT8KNi",
|
|
197
|
+
description: "Save button text"
|
|
198
|
+
}
|
|
199
|
+
)
|
|
149
200
|
}
|
|
150
201
|
)
|
|
151
202
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/edit-user-profile-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport { getMeQueryKey, Me, useUpdateMe } from \"../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport * as Form from \"@radix-ui/react-form\";\nimport { Dialog, Label, Button, TextField } from \"./elements.js\";\nimport { SaveButton } from \"./save-button.js\";\n\ninterface EditUserProfileDialogProps extends Dialog.RootProps {\n user: Me;\n children?: ReactNode;\n}\n\nexport function EditUserProfileDialog({\n children,\n user,\n ...props\n}: EditUserProfileDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root\n {...props}\n open={props.open ?? open}\n onOpenChange={props.onOpenChange ?? setOpen}\n >\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <Dialog.Content maxWidth=\"480px\">\n <Content user={user} onClose={handleClose} />\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface ContentProps extends Pick<EditUserProfileDialogProps, \"user\"> {\n onClose: () => void;\n}\n\nfunction Content({ user, onClose }: ContentProps) {\n const client = useQueryClient();\n const updateMe = useUpdateMe({\n mutation: {\n onSettled: () => {\n client.invalidateQueries({ queryKey: getMeQueryKey() });\n },\n onSuccess: (newProfile) => {\n client.setQueryData(getMeQueryKey(), {\n ...user,\n firstName: newProfile.firstName || user.firstName,\n lastName: newProfile.lastName || user.lastName,\n });\n },\n },\n });\n\n return (\n <>\n <Dialog.Title mb=\"5\">Edit name</Dialog.Title>\n <VisuallyHidden>\n <Dialog.Description>\n Edit the details of <Text weight=\"bold\">{user.email}</Text>\n </Dialog.Description>\n </VisuallyHidden>\n\n {updateMe.error ? (\n <Callout.Root color=\"red\" my=\"-2\">\n <Callout.Text>{getMutationErrorMessage(updateMe.error)}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Form.Root\n onSubmit={async (event) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const firstName = formData.get(\"firstName\")?.toString();\n const lastName = formData.get(\"lastName\")?.toString();\n updateMe.mutate({\n data: {\n firstName: firstName ?? undefined,\n lastName: lastName ?? undefined,\n },\n });\n }}\n >\n <Flex my=\"5\" direction=\"column\" gap=\"4\">\n <Form.Field name=\"firstName\" asChild>\n <Flex direction=\"column\" gap=\"1\">\n <Form.Label asChild>\n <Label>First name</Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n data-1p-ignore\n autoComplete=\"given-name\"\n defaultValue={user.firstName ?? \"\"}\n placeholder=\"Your first name\"\n disabled={updateMe.isPending || updateMe.isSuccess}\n />\n </Form.Control>\n </Flex>\n </Form.Field>\n\n <Form.Field name=\"lastName\" asChild>\n <Flex direction=\"column\" gap=\"1\">\n <Form.Label asChild>\n <Label>Last name</Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n data-1p-ignore\n autoComplete=\"family-name\"\n defaultValue={user.lastName ?? \"\"}\n placeholder=\"Your last name\"\n disabled={updateMe.isPending || updateMe.isSuccess}\n />\n </Form.Control>\n </Flex>\n </Form.Field>\n </Flex>\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button\n variant=\"secondary\"\n disabled={updateMe.isPending || updateMe.isSuccess}\n >\n Cancel\n </Button>\n </Dialog.Close>\n <SaveButton\n type=\"submit\"\n loading={updateMe.isPending}\n done={updateMe.isSuccess}\n onDone={onClose}\n >\n Save\n </SaveButton>\n </Flex>\n\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(updateMe.error)}\n </section>\n </VisuallyHidden>\n </Form.Root>\n </>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n\n // TODO Handle server errors\n return \"Something went wrong. Please try again.\";\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/edit-user-profile-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport { getMeQueryKey, Me, useUpdateMe } from \"../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport * as Form from \"@radix-ui/react-form\";\nimport { Dialog, Label, Button, TextField } from \"./elements.js\";\nimport { SaveButton } from \"./save-button.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface EditUserProfileDialogProps extends Dialog.RootProps {\n user: Me;\n children?: ReactNode;\n}\n\nexport function EditUserProfileDialog({\n children,\n user,\n ...props\n}: EditUserProfileDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root\n {...props}\n open={props.open ?? open}\n onOpenChange={props.onOpenChange ?? setOpen}\n >\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <Dialog.Content maxWidth=\"480px\">\n <Content user={user} onClose={handleClose} />\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface ContentProps extends Pick<EditUserProfileDialogProps, \"user\"> {\n onClose: () => void;\n}\n\nfunction Content({ user, onClose }: ContentProps) {\n const translate = useTranslation();\n const client = useQueryClient();\n const updateMe = useUpdateMe({\n mutation: {\n onSettled: () => {\n client.invalidateQueries({ queryKey: getMeQueryKey() });\n },\n onSuccess: (newProfile) => {\n client.setQueryData(getMeQueryKey(), {\n ...user,\n firstName: newProfile.firstName || user.firstName,\n lastName: newProfile.lastName || user.lastName,\n });\n },\n },\n });\n\n return (\n <>\n <Dialog.Title mb=\"5\">\n <Translation\n defaultMessage=\"Edit name\"\n id=\"pcK9ly\"\n description=\"Dialog title for editing user name\"\n />\n </Dialog.Title>\n <VisuallyHidden>\n <Dialog.Description>\n <Translation\n defaultMessage=\"Edit the details of {email}\"\n id=\"SEsXx0\"\n description=\"Dialog description for editing user details\"\n values={{ email: <Text weight=\"bold\">{user.email}</Text> }}\n />\n </Dialog.Description>\n </VisuallyHidden>\n\n {updateMe.error ? (\n <Callout.Root color=\"red\" my=\"-2\">\n <Callout.Text>{getMutationErrorMessage(updateMe.error)}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Form.Root\n onSubmit={async (event) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const firstName = formData.get(\"firstName\")?.toString();\n const lastName = formData.get(\"lastName\")?.toString();\n updateMe.mutate({\n data: {\n firstName: firstName ?? undefined,\n lastName: lastName ?? undefined,\n },\n });\n }}\n >\n <Flex my=\"5\" direction=\"column\" gap=\"4\">\n <Form.Field name=\"firstName\" asChild>\n <Flex direction=\"column\" gap=\"1\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"First name\"\n id=\"DAYdcg\"\n description=\"Label for first name field\"\n />\n </Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n data-1p-ignore\n autoComplete=\"given-name\"\n defaultValue={user.firstName ?? \"\"}\n placeholder={translate({\n defaultMessage: \"Your first name\",\n id: \"gUTpgG\",\n description: \"Placeholder for first name field\",\n })}\n disabled={updateMe.isPending || updateMe.isSuccess}\n />\n </Form.Control>\n </Flex>\n </Form.Field>\n\n <Form.Field name=\"lastName\" asChild>\n <Flex direction=\"column\" gap=\"1\">\n <Form.Label asChild>\n <Label>\n <Translation\n defaultMessage=\"Last name\"\n id=\"IwcAMv\"\n description=\"Label for last name field\"\n />\n </Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n data-1p-ignore\n autoComplete=\"family-name\"\n defaultValue={user.lastName ?? \"\"}\n placeholder={translate({\n defaultMessage: \"Your last name\",\n id: \"Gy8eW0\",\n description: \"Placeholder for last name field\",\n })}\n disabled={updateMe.isPending || updateMe.isSuccess}\n />\n </Form.Control>\n </Flex>\n </Form.Field>\n </Flex>\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button\n variant=\"secondary\"\n disabled={updateMe.isPending || updateMe.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <SaveButton\n type=\"submit\"\n loading={updateMe.isPending}\n done={updateMe.isSuccess}\n onDone={onClose}\n >\n <Translation\n defaultMessage=\"Save\"\n id=\"RT8KNi\"\n description=\"Save button text\"\n />\n </SaveButton>\n </Flex>\n\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(updateMe.error)}\n </section>\n </VisuallyHidden>\n </Form.Root>\n </>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n\n // TODO Handle server errors\n return \"Something went wrong. Please try again.\";\n}\n\n// Note: Error messages in getMutationErrorMessage are kept as plain strings\n// since they are displayed dynamically\n"],"mappings":"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","names":[]}
|
|
@@ -41,6 +41,8 @@ var import_user = require("./api/user.js");
|
|
|
41
41
|
var import_elements = require("./elements.js");
|
|
42
42
|
var import_utils = require("./utils.js");
|
|
43
43
|
var import_endpoint = require("../api/endpoint.js");
|
|
44
|
+
var import_translation = require("./i18n/translation.js");
|
|
45
|
+
var import_use_translation = require("./i18n/use-translation.js");
|
|
44
46
|
function EditUserRoleDialog({
|
|
45
47
|
children,
|
|
46
48
|
user,
|
|
@@ -84,6 +86,7 @@ function EditSingleUserRoleDialogContent({
|
|
|
84
86
|
queryState,
|
|
85
87
|
onFormSubmitSuccess
|
|
86
88
|
}) {
|
|
89
|
+
const translate = (0, import_use_translation.useTranslation)();
|
|
87
90
|
const displayName = (0, import_utils.getBestName)(user) || user.email;
|
|
88
91
|
const updateUser = (0, import_user.useUpdateUserRole)();
|
|
89
92
|
const [selectedRole, setSelectedRole] = (0, import_react.useState)(
|
|
@@ -108,11 +111,23 @@ function EditSingleUserRoleDialogContent({
|
|
|
108
111
|
const showErrorMessage = !!queryState.error;
|
|
109
112
|
const showSingleRoleInfo = queryState.isSuccess && roles.length === 1;
|
|
110
113
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.Dialog.Content, { maxWidth: "480px", children: [
|
|
111
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { children:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
115
|
+
import_translation.Translation,
|
|
116
|
+
{
|
|
117
|
+
defaultMessage: "Edit role",
|
|
118
|
+
id: "Ue7G8Y",
|
|
119
|
+
description: "Dialog title for editing user role"
|
|
120
|
+
}
|
|
121
|
+
) }),
|
|
122
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Description, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
123
|
+
import_translation.Translation,
|
|
124
|
+
{
|
|
125
|
+
defaultMessage: "Select the role to assign to {displayName}",
|
|
126
|
+
id: "jWl49/",
|
|
127
|
+
description: "Dialog description for role selection",
|
|
128
|
+
values: { displayName: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", children: displayName }) }
|
|
129
|
+
}
|
|
130
|
+
) }),
|
|
116
131
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { mt: "2", direction: "column", gap: "1", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
117
132
|
"form",
|
|
118
133
|
{
|
|
@@ -134,7 +149,11 @@ function EditSingleUserRoleDialogContent({
|
|
|
134
149
|
import_elements.Select.Trigger,
|
|
135
150
|
{
|
|
136
151
|
id: selectId,
|
|
137
|
-
placeholder:
|
|
152
|
+
placeholder: translate({
|
|
153
|
+
defaultMessage: "Assign a role",
|
|
154
|
+
id: "0beebz",
|
|
155
|
+
description: "Placeholder for role selection dropdown"
|
|
156
|
+
}),
|
|
138
157
|
"aria-labelledby": selectLabelId,
|
|
139
158
|
"aria-invalid": showErrorMessage || void 0,
|
|
140
159
|
"aria-describedby": [showErrorMessage && errorId, showSingleRoleInfo && infoId].filter(Boolean).join(" ") || void 0
|
|
@@ -145,20 +164,41 @@ function EditSingleUserRoleDialogContent({
|
|
|
145
164
|
}
|
|
146
165
|
),
|
|
147
166
|
showErrorMessage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { color: "red", size: "2", id: errorId, children: getRoleSelectErrorMessage(queryState.error) }) : null,
|
|
148
|
-
showSingleRoleInfo ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { color: "gray", size: "2", id: infoId, mt: "1", children:
|
|
167
|
+
showSingleRoleInfo ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { color: "gray", size: "2", id: infoId, mt: "1", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
168
|
+
import_translation.Translation,
|
|
169
|
+
{
|
|
170
|
+
defaultMessage: "You cannot update the role for this user as there is only one role available.",
|
|
171
|
+
id: "XLp48i",
|
|
172
|
+
description: "Info message when only one role is available"
|
|
173
|
+
}
|
|
174
|
+
) }) : null
|
|
149
175
|
]
|
|
150
176
|
}
|
|
151
177
|
) }),
|
|
152
178
|
updateUser.error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Root, { color: "red", mt: "4", mb: "-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: getMutationErrorMessage(updateUser.error) }) }) : null,
|
|
153
179
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { mt: "5", gap: "3", justify: "end", children: [
|
|
154
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", disabled: updateUser.isPending, children:
|
|
180
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", disabled: updateUser.isPending, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
181
|
+
import_translation.Translation,
|
|
182
|
+
{
|
|
183
|
+
defaultMessage: "Cancel",
|
|
184
|
+
id: "hHNj31",
|
|
185
|
+
description: "Cancel button text"
|
|
186
|
+
}
|
|
187
|
+
) }) }),
|
|
155
188
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
156
189
|
import_elements.Button,
|
|
157
190
|
{
|
|
158
191
|
form: formId,
|
|
159
192
|
loading: updateUser.isPending,
|
|
160
193
|
disabled: queryState.isLoading || showSingleRoleInfo || void 0,
|
|
161
|
-
children:
|
|
194
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
195
|
+
import_translation.Translation,
|
|
196
|
+
{
|
|
197
|
+
defaultMessage: "Save",
|
|
198
|
+
id: "RT8KNi",
|
|
199
|
+
description: "Save button text"
|
|
200
|
+
}
|
|
201
|
+
)
|
|
162
202
|
}
|
|
163
203
|
)
|
|
164
204
|
] }),
|
|
@@ -212,11 +252,23 @@ function EditMultipleUserRolesDialogContent({
|
|
|
212
252
|
maxHeight: "calc(100vh - var(--dialog-content-padding) * 2 - var(--space-6) - max(var(--space-6), 6vh)",
|
|
213
253
|
minHeight: "200px",
|
|
214
254
|
children: [
|
|
215
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { children:
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
255
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
256
|
+
import_translation.Translation,
|
|
257
|
+
{
|
|
258
|
+
defaultMessage: "Edit roles",
|
|
259
|
+
id: "VQ1Avr",
|
|
260
|
+
description: "Dialog title for editing user roles (multiple)"
|
|
261
|
+
}
|
|
262
|
+
) }),
|
|
263
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Description, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
264
|
+
import_translation.Translation,
|
|
265
|
+
{
|
|
266
|
+
defaultMessage: "Select the roles to assign to {displayName}",
|
|
267
|
+
id: "yyM/+B",
|
|
268
|
+
description: "Dialog description for selecting multiple roles",
|
|
269
|
+
values: { displayName: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", children: displayName }) }
|
|
270
|
+
}
|
|
271
|
+
) }),
|
|
220
272
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { mt: "4", direction: "column", gap: "1", asChild: true, minHeight: "0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
221
273
|
import_themes.Card,
|
|
222
274
|
{
|
|
@@ -281,17 +333,38 @@ function EditMultipleUserRolesDialogContent({
|
|
|
281
333
|
)
|
|
282
334
|
}
|
|
283
335
|
) }),
|
|
284
|
-
showSingleRoleInfo ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { color: "gray", size: "2", id: infoId, mt: "1", children:
|
|
336
|
+
showSingleRoleInfo ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { color: "gray", size: "2", id: infoId, mt: "1", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
337
|
+
import_translation.Translation,
|
|
338
|
+
{
|
|
339
|
+
defaultMessage: "You cannot update the role for this user as there is only one role available.",
|
|
340
|
+
id: "XLp48i",
|
|
341
|
+
description: "Info message when only one role is available"
|
|
342
|
+
}
|
|
343
|
+
) }) : null,
|
|
285
344
|
error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Root, { color: "red", mt: "4", mb: "-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: error }) }) : null,
|
|
286
345
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { mt: "5", gap: "3", justify: "end", children: [
|
|
287
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", disabled: updateUser.isPending, children:
|
|
346
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", disabled: updateUser.isPending, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
347
|
+
import_translation.Translation,
|
|
348
|
+
{
|
|
349
|
+
defaultMessage: "Cancel",
|
|
350
|
+
id: "hHNj31",
|
|
351
|
+
description: "Cancel button text"
|
|
352
|
+
}
|
|
353
|
+
) }) }),
|
|
288
354
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
289
355
|
import_elements.Button,
|
|
290
356
|
{
|
|
291
357
|
form: formId,
|
|
292
358
|
loading: updateUser.isPending,
|
|
293
359
|
disabled: queryState.isLoading || showSingleRoleInfo || void 0,
|
|
294
|
-
children:
|
|
360
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
361
|
+
import_translation.Translation,
|
|
362
|
+
{
|
|
363
|
+
defaultMessage: "Save",
|
|
364
|
+
id: "RT8KNi",
|
|
365
|
+
description: "Save button text"
|
|
366
|
+
}
|
|
367
|
+
)
|
|
295
368
|
}
|
|
296
369
|
)
|
|
297
370
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/edit-user-role-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Box,\n Card,\n Callout,\n CheckboxGroup,\n Flex,\n ScrollArea,\n Text,\n VisuallyHidden,\n Separator,\n} from \"@radix-ui/themes\";\nimport { type ReactNode, useState } from \"react\";\nimport { useUpdateUserRole } from \"./api/user.js\";\nimport { Dialog, Button, Select, Skeleton } from \"./elements.js\";\nimport { getBestName } from \"./utils.js\";\nimport {\n Member,\n MemberRole,\n RolesAndConfig403,\n RolesAndConfig404,\n useRolesAndConfig,\n} from \"../api/endpoint.js\";\n\ninterface EditUserRoleDialogProps extends Dialog.RootProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user: Member;\n children?: ReactNode;\n}\n\nexport function EditUserRoleDialog({\n children,\n user,\n ...props\n}: EditUserRoleDialogProps) {\n const rolesAndConfigQuery = useRolesAndConfig({\n query: {\n initialData: { roles: [], multipleRolesEnabled: false },\n },\n });\n const { data, ...restQueryState } = rolesAndConfigQuery;\n const queryState = {\n error: restQueryState.error,\n isLoading: restQueryState.isLoading,\n isSuccess: restQueryState.isSuccess,\n };\n\n return (\n <Dialog.Root {...props}>\n {children && <Dialog.Trigger>{children}</Dialog.Trigger>}\n {data.multipleRolesEnabled ? (\n <EditMultipleUserRolesDialogContent\n user={user}\n roles={data.roles}\n queryState={queryState}\n onFormSubmitSuccess={() => props.onOpenChange(false)}\n />\n ) : (\n <EditSingleUserRoleDialogContent\n user={user}\n roles={data.roles}\n queryState={queryState}\n onFormSubmitSuccess={() => props.onOpenChange(false)}\n />\n )}\n </Dialog.Root>\n );\n}\n\ninterface EditSingleUserRoleDialogContentProps {\n user: Member;\n roles: MemberRole[];\n queryState: {\n error: RolesAndConfig403 | RolesAndConfig404 | null;\n isLoading: boolean;\n isSuccess: boolean;\n };\n onFormSubmitSuccess: () => void;\n}\n\nexport function EditSingleUserRoleDialogContent({\n user,\n roles,\n queryState,\n onFormSubmitSuccess,\n}: EditSingleUserRoleDialogContentProps) {\n const displayName = getBestName(user) || user.email;\n const updateUser = useUpdateUserRole();\n const [selectedRole, setSelectedRole] = useState(\n user.roles?.at(0)?.slug || \"Unknown\",\n );\n\n const onSubmitForm = ({ id, roles }: { id: string; roles: string[] }) => {\n updateUser.mutate(\n { userId: id, data: { roles } },\n {\n onSuccess: () => {\n onFormSubmitSuccess();\n },\n },\n );\n };\n\n const rootId = React.useId();\n const formId = `edit-user-form-${rootId}`;\n const selectId = `role-select-${rootId}`;\n const selectLabelId = `${selectId}-label`;\n const infoId = `${selectId}-info`;\n const errorId = `${selectId}-error`;\n const showErrorMessage = !!queryState.error;\n const showSingleRoleInfo = queryState.isSuccess && roles.length === 1;\n\n return (\n <Dialog.Content maxWidth=\"480px\">\n <Dialog.Title>Edit role</Dialog.Title>\n <Dialog.Description>\n Select the role to assign to <Text weight=\"bold\">{displayName}</Text>\n </Dialog.Description>\n <Flex mt=\"2\" direction=\"column\" gap=\"1\" asChild>\n <form\n id={formId}\n onSubmit={async (event) => {\n event.preventDefault();\n onSubmitForm({ id: user.id, roles: [selectedRole] });\n }}\n >\n <Select.Root\n name=\"roles\"\n value={selectedRole ?? \"Unknown\"}\n onValueChange={setSelectedRole}\n disabled={queryState.isLoading || showSingleRoleInfo}\n >\n <Skeleton loading={queryState.isLoading}>\n <Select.Trigger\n id={selectId}\n placeholder=\"Assign a role\"\n aria-labelledby={selectLabelId}\n aria-invalid={showErrorMessage || undefined}\n aria-describedby={\n [showErrorMessage && errorId, showSingleRoleInfo && infoId]\n .filter(Boolean)\n .join(\" \") || undefined\n }\n />\n </Skeleton>\n\n <Select.Content>\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 {showErrorMessage ? (\n <Text color=\"red\" size=\"2\" id={errorId}>\n {getRoleSelectErrorMessage(queryState.error)}\n </Text>\n ) : null}\n\n {showSingleRoleInfo ? (\n <Text color=\"gray\" size=\"2\" id={infoId} mt=\"1\">\n You cannot update the role for this user as there is only one role\n available.\n </Text>\n ) : null}\n </form>\n </Flex>\n\n {updateUser.error ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>\n {getMutationErrorMessage(updateUser.error)}\n </Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={updateUser.isPending}>\n Cancel\n </Button>\n </Dialog.Close>\n\n <Button\n form={formId}\n loading={updateUser.isPending}\n disabled={queryState.isLoading || showSingleRoleInfo || undefined}\n >\n Save\n </Button>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(updateUser.error)}\n </section>\n </VisuallyHidden>\n </Dialog.Content>\n );\n}\n\ntype EditMultipleUserRolesDialogContentProps =\n EditSingleUserRoleDialogContentProps;\n\nfunction EditMultipleUserRolesDialogContent({\n user,\n roles,\n queryState,\n onFormSubmitSuccess,\n}: EditMultipleUserRolesDialogContentProps) {\n const displayName = getBestName(user) || user.email;\n const updateUser = useUpdateUserRole();\n const [error, setError] = useState<string | null>(null);\n\n React.useEffect(() => {\n if (queryState.error && !error) {\n setError(\"There was an error fetching roles. Please try again.\");\n }\n }, [queryState.error, error]);\n\n const onSubmitForm = ({ id, roles }: { id: string; roles: string[] }) => {\n if (roles.length === 0) {\n setError(\"Please select at least one role\");\n return;\n }\n updateUser.mutate(\n { userId: id, data: { roles } },\n {\n onSuccess: () => {\n onFormSubmitSuccess();\n },\n onError: () => {\n setError(\n \"There was an error updating the user role. Please try again.\",\n );\n },\n },\n );\n };\n\n const rootId = React.useId();\n const formId = `edit-user-form-${rootId}`;\n const checkboxGroupId = `role-checkbox-group-${rootId}`;\n const infoId = `${checkboxGroupId}-info`;\n const showSingleRoleInfo = queryState.isSuccess && roles.length === 1;\n return (\n <Dialog.Content maxWidth=\"480px\">\n <Flex\n direction=\"column\"\n gap=\"1\"\n maxHeight=\"calc(100vh - var(--dialog-content-padding) * 2 - var(--space-6) - max(var(--space-6), 6vh)\"\n minHeight=\"200px\"\n >\n <Dialog.Title>Edit roles</Dialog.Title>\n <Dialog.Description>\n Select the roles to assign to <Text weight=\"bold\">{displayName}</Text>\n </Dialog.Description>\n <Flex mt=\"4\" direction=\"column\" gap=\"1\" asChild minHeight=\"0\">\n <Card\n asChild\n style={{ display: \"flex\", padding: \"2px 0\", flexGrow: 0 }}\n >\n <form\n id={formId}\n onSubmit={async (event) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const selectedRoles = formData\n .getAll(\"roles\")\n .map((role) => role.toString());\n onSubmitForm({ id: user.id, roles: selectedRoles });\n }}\n >\n <ScrollArea>\n <CheckboxGroup.Root\n defaultValue={user.roles?.map((role) => role.slug) || []}\n name=\"roles\"\n style={{ gap: \"0\" }}\n id={checkboxGroupId}\n onValueChange={(values) => {\n if (error && values.length > 0) {\n setError(\"\");\n }\n }}\n >\n {roles.map((role, i) => (\n <Box key={role.slug}>\n <Flex px=\"4\" justify=\"center\" py=\"3\">\n <CheckboxGroup.Item\n value={role.slug}\n style={{\n width: \"100%\",\n gap: \"var(--space-3)\",\n alignItems: \"center\",\n }}\n disabled={showSingleRoleInfo}\n >\n <Flex direction=\"column\" width=\"100%\">\n <Text weight=\"bold\" size=\"2\">\n {role.name}\n </Text>\n <Text\n color=\"gray\"\n size=\"2\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {role.description}\n </Text>\n </Flex>\n </CheckboxGroup.Item>\n </Flex>\n {i !== roles.length - 1 && (\n <Separator orientation=\"horizontal\" size=\"4\" />\n )}\n </Box>\n ))}\n </CheckboxGroup.Root>\n </ScrollArea>\n </form>\n </Card>\n </Flex>\n\n {showSingleRoleInfo ? (\n <Text color=\"gray\" size=\"2\" id={infoId} mt=\"1\">\n You cannot update the role for this user as there is only one role\n available.\n </Text>\n ) : null}\n\n {error ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>{error}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={updateUser.isPending}>\n Cancel\n </Button>\n </Dialog.Close>\n\n <Button\n form={formId}\n loading={updateUser.isPending}\n disabled={queryState.isLoading || showSingleRoleInfo || undefined}\n >\n Save\n </Button>\n </Flex>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(updateUser.error)}\n </section>\n </VisuallyHidden>\n </Dialog.Content>\n );\n}\n\nfunction getRoleSelectErrorMessage(error: unknown) {\n if (!error) {\n return null;\n }\n // TODO Handle server errors\n return \"There was an error fetching roles. Please try again.\";\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (!error) {\n return null;\n }\n // TODO Handle server errors\n return \"There was an error updating the user role. Please try again.\";\n}\n"],"mappings":"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","names":["roles"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/edit-user-role-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Box,\n Card,\n Callout,\n CheckboxGroup,\n Flex,\n ScrollArea,\n Text,\n VisuallyHidden,\n Separator,\n} from \"@radix-ui/themes\";\nimport { type ReactNode, useState } from \"react\";\nimport { useUpdateUserRole } from \"./api/user.js\";\nimport { Dialog, Button, Select, Skeleton } from \"./elements.js\";\nimport { getBestName } from \"./utils.js\";\nimport {\n Member,\n MemberRole,\n RolesAndConfig403,\n RolesAndConfig404,\n useRolesAndConfig,\n} from \"../api/endpoint.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface EditUserRoleDialogProps extends Dialog.RootProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user: Member;\n children?: ReactNode;\n}\n\nexport function EditUserRoleDialog({\n children,\n user,\n ...props\n}: EditUserRoleDialogProps) {\n const rolesAndConfigQuery = useRolesAndConfig({\n query: {\n initialData: { roles: [], multipleRolesEnabled: false },\n },\n });\n const { data, ...restQueryState } = rolesAndConfigQuery;\n const queryState = {\n error: restQueryState.error,\n isLoading: restQueryState.isLoading,\n isSuccess: restQueryState.isSuccess,\n };\n\n return (\n <Dialog.Root {...props}>\n {children && <Dialog.Trigger>{children}</Dialog.Trigger>}\n {data.multipleRolesEnabled ? (\n <EditMultipleUserRolesDialogContent\n user={user}\n roles={data.roles}\n queryState={queryState}\n onFormSubmitSuccess={() => props.onOpenChange(false)}\n />\n ) : (\n <EditSingleUserRoleDialogContent\n user={user}\n roles={data.roles}\n queryState={queryState}\n onFormSubmitSuccess={() => props.onOpenChange(false)}\n />\n )}\n </Dialog.Root>\n );\n}\n\ninterface EditSingleUserRoleDialogContentProps {\n user: Member;\n roles: MemberRole[];\n queryState: {\n error: RolesAndConfig403 | RolesAndConfig404 | null;\n isLoading: boolean;\n isSuccess: boolean;\n };\n onFormSubmitSuccess: () => void;\n}\n\nexport function EditSingleUserRoleDialogContent({\n user,\n roles,\n queryState,\n onFormSubmitSuccess,\n}: EditSingleUserRoleDialogContentProps) {\n const translate = useTranslation();\n const displayName = getBestName(user) || user.email;\n const updateUser = useUpdateUserRole();\n const [selectedRole, setSelectedRole] = useState(\n user.roles?.at(0)?.slug || \"Unknown\",\n );\n\n const onSubmitForm = ({ id, roles }: { id: string; roles: string[] }) => {\n updateUser.mutate(\n { userId: id, data: { roles } },\n {\n onSuccess: () => {\n onFormSubmitSuccess();\n },\n },\n );\n };\n\n const rootId = React.useId();\n const formId = `edit-user-form-${rootId}`;\n const selectId = `role-select-${rootId}`;\n const selectLabelId = `${selectId}-label`;\n const infoId = `${selectId}-info`;\n const errorId = `${selectId}-error`;\n const showErrorMessage = !!queryState.error;\n const showSingleRoleInfo = queryState.isSuccess && roles.length === 1;\n\n return (\n <Dialog.Content maxWidth=\"480px\">\n <Dialog.Title>\n <Translation\n defaultMessage=\"Edit role\"\n id=\"Ue7G8Y\"\n description=\"Dialog title for editing user role\"\n />\n </Dialog.Title>\n <Dialog.Description>\n <Translation\n defaultMessage=\"Select the role to assign to {displayName}\"\n id=\"jWl49/\"\n description=\"Dialog description for role selection\"\n values={{ displayName: <Text weight=\"bold\">{displayName}</Text> }}\n />\n </Dialog.Description>\n <Flex mt=\"2\" direction=\"column\" gap=\"1\" asChild>\n <form\n id={formId}\n onSubmit={async (event) => {\n event.preventDefault();\n onSubmitForm({ id: user.id, roles: [selectedRole] });\n }}\n >\n <Select.Root\n name=\"roles\"\n value={selectedRole ?? \"Unknown\"}\n onValueChange={setSelectedRole}\n disabled={queryState.isLoading || showSingleRoleInfo}\n >\n <Skeleton loading={queryState.isLoading}>\n <Select.Trigger\n id={selectId}\n placeholder={translate({\n defaultMessage: \"Assign a role\",\n id: \"0beebz\",\n description: \"Placeholder for role selection dropdown\",\n })}\n aria-labelledby={selectLabelId}\n aria-invalid={showErrorMessage || undefined}\n aria-describedby={\n [showErrorMessage && errorId, showSingleRoleInfo && infoId]\n .filter(Boolean)\n .join(\" \") || undefined\n }\n />\n </Skeleton>\n\n <Select.Content>\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 {showErrorMessage ? (\n <Text color=\"red\" size=\"2\" id={errorId}>\n {getRoleSelectErrorMessage(queryState.error)}\n </Text>\n ) : null}\n\n {showSingleRoleInfo ? (\n <Text color=\"gray\" size=\"2\" id={infoId} mt=\"1\">\n <Translation\n defaultMessage=\"You cannot update the role for this user as there is only one role available.\"\n id=\"XLp48i\"\n description=\"Info message when only one role is available\"\n />\n </Text>\n ) : null}\n </form>\n </Flex>\n\n {updateUser.error ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>\n {getMutationErrorMessage(updateUser.error)}\n </Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={updateUser.isPending}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n\n <Button\n form={formId}\n loading={updateUser.isPending}\n disabled={queryState.isLoading || showSingleRoleInfo || undefined}\n >\n <Translation\n defaultMessage=\"Save\"\n id=\"RT8KNi\"\n description=\"Save button text\"\n />\n </Button>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(updateUser.error)}\n </section>\n </VisuallyHidden>\n </Dialog.Content>\n );\n}\n\ntype EditMultipleUserRolesDialogContentProps =\n EditSingleUserRoleDialogContentProps;\n\nfunction EditMultipleUserRolesDialogContent({\n user,\n roles,\n queryState,\n onFormSubmitSuccess,\n}: EditMultipleUserRolesDialogContentProps) {\n const displayName = getBestName(user) || user.email;\n const updateUser = useUpdateUserRole();\n const [error, setError] = useState<string | null>(null);\n\n React.useEffect(() => {\n if (queryState.error && !error) {\n setError(\"There was an error fetching roles. Please try again.\");\n }\n }, [queryState.error, error]);\n\n const onSubmitForm = ({ id, roles }: { id: string; roles: string[] }) => {\n if (roles.length === 0) {\n setError(\"Please select at least one role\");\n return;\n }\n updateUser.mutate(\n { userId: id, data: { roles } },\n {\n onSuccess: () => {\n onFormSubmitSuccess();\n },\n onError: () => {\n setError(\n \"There was an error updating the user role. Please try again.\",\n );\n },\n },\n );\n };\n\n const rootId = React.useId();\n const formId = `edit-user-form-${rootId}`;\n const checkboxGroupId = `role-checkbox-group-${rootId}`;\n const infoId = `${checkboxGroupId}-info`;\n const showSingleRoleInfo = queryState.isSuccess && roles.length === 1;\n return (\n <Dialog.Content maxWidth=\"480px\">\n <Flex\n direction=\"column\"\n gap=\"1\"\n maxHeight=\"calc(100vh - var(--dialog-content-padding) * 2 - var(--space-6) - max(var(--space-6), 6vh)\"\n minHeight=\"200px\"\n >\n <Dialog.Title>\n <Translation\n defaultMessage=\"Edit roles\"\n id=\"VQ1Avr\"\n description=\"Dialog title for editing user roles (multiple)\"\n />\n </Dialog.Title>\n <Dialog.Description>\n <Translation\n defaultMessage=\"Select the roles to assign to {displayName}\"\n id=\"yyM/+B\"\n description=\"Dialog description for selecting multiple roles\"\n values={{ displayName: <Text weight=\"bold\">{displayName}</Text> }}\n />\n </Dialog.Description>\n <Flex mt=\"4\" direction=\"column\" gap=\"1\" asChild minHeight=\"0\">\n <Card\n asChild\n style={{ display: \"flex\", padding: \"2px 0\", flexGrow: 0 }}\n >\n <form\n id={formId}\n onSubmit={async (event) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const selectedRoles = formData\n .getAll(\"roles\")\n .map((role) => role.toString());\n onSubmitForm({ id: user.id, roles: selectedRoles });\n }}\n >\n <ScrollArea>\n <CheckboxGroup.Root\n defaultValue={user.roles?.map((role) => role.slug) || []}\n name=\"roles\"\n style={{ gap: \"0\" }}\n id={checkboxGroupId}\n onValueChange={(values) => {\n if (error && values.length > 0) {\n setError(\"\");\n }\n }}\n >\n {roles.map((role, i) => (\n <Box key={role.slug}>\n <Flex px=\"4\" justify=\"center\" py=\"3\">\n <CheckboxGroup.Item\n value={role.slug}\n style={{\n width: \"100%\",\n gap: \"var(--space-3)\",\n alignItems: \"center\",\n }}\n disabled={showSingleRoleInfo}\n >\n <Flex direction=\"column\" width=\"100%\">\n <Text weight=\"bold\" size=\"2\">\n {role.name}\n </Text>\n <Text\n color=\"gray\"\n size=\"2\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {role.description}\n </Text>\n </Flex>\n </CheckboxGroup.Item>\n </Flex>\n {i !== roles.length - 1 && (\n <Separator orientation=\"horizontal\" size=\"4\" />\n )}\n </Box>\n ))}\n </CheckboxGroup.Root>\n </ScrollArea>\n </form>\n </Card>\n </Flex>\n\n {showSingleRoleInfo ? (\n <Text color=\"gray\" size=\"2\" id={infoId} mt=\"1\">\n <Translation\n defaultMessage=\"You cannot update the role for this user as there is only one role available.\"\n id=\"XLp48i\"\n description=\"Info message when only one role is available\"\n />\n </Text>\n ) : null}\n\n {error ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>{error}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={updateUser.isPending}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n\n <Button\n form={formId}\n loading={updateUser.isPending}\n disabled={queryState.isLoading || showSingleRoleInfo || undefined}\n >\n <Translation\n defaultMessage=\"Save\"\n id=\"RT8KNi\"\n description=\"Save button text\"\n />\n </Button>\n </Flex>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(updateUser.error)}\n </section>\n </VisuallyHidden>\n </Dialog.Content>\n );\n}\n\nfunction getRoleSelectErrorMessage(error: unknown) {\n if (!error) {\n return null;\n }\n // TODO Handle server errors\n return \"There was an error fetching roles. Please try again.\";\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (!error) {\n return null;\n }\n // TODO Handle server errors\n return \"There was an error updating the user role. Please try again.\";\n}\n\n// Note: Error messages in helper functions are kept as plain strings\n// since they are displayed dynamically\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqDI;AAnDJ,YAAuB;AACvB,oBAUO;AACP,mBAAyC;AACzC,kBAAkC;AAClC,sBAAiD;AACjD,mBAA4B;AAC5B,sBAMO;AACP,yBAA4B;AAC5B,6BAA+B;AASxB,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,QAAM,0BAAsB,mCAAkB;AAAA,IAC5C,OAAO;AAAA,MACL,aAAa,EAAE,OAAO,CAAC,GAAG,sBAAsB,MAAM;AAAA,IACxD;AAAA,EACF,CAAC;AACD,QAAM,EAAE,MAAM,GAAG,eAAe,IAAI;AACpC,QAAM,aAAa;AAAA,IACjB,OAAO,eAAe;AAAA,IACtB,WAAW,eAAe;AAAA,IAC1B,WAAW,eAAe;AAAA,EAC5B;AAEA,SACE,6CAAC,uBAAO,MAAP,EAAa,GAAG,OACd;AAAA,gBAAY,4CAAC,uBAAO,SAAP,EAAgB,UAAS;AAAA,IACtC,KAAK,uBACJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,qBAAqB,MAAM,MAAM,aAAa,KAAK;AAAA;AAAA,IACrD,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,qBAAqB,MAAM,MAAM,aAAa,KAAK;AAAA;AAAA,IACrD;AAAA,KAEJ;AAEJ;AAaO,SAAS,gCAAgC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,gBAAY,uCAAe;AACjC,QAAM,kBAAc,0BAAY,IAAI,KAAK,KAAK;AAC9C,QAAM,iBAAa,+BAAkB;AACrC,QAAM,CAAC,cAAc,eAAe,QAAI;AAAA,IACtC,KAAK,OAAO,GAAG,CAAC,GAAG,QAAQ;AAAA,EAC7B;AAEA,QAAM,eAAe,CAAC,EAAE,IAAI,OAAAA,OAAM,MAAuC;AACvE,eAAW;AAAA,MACT,EAAE,QAAQ,IAAI,MAAM,EAAE,OAAAA,OAAM,EAAE;AAAA,MAC9B;AAAA,QACE,WAAW,MAAM;AACf,8BAAoB;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,SAAS,kBAAkB,MAAM;AACvC,QAAM,WAAW,eAAe,MAAM;AACtC,QAAM,gBAAgB,GAAG,QAAQ;AACjC,QAAM,SAAS,GAAG,QAAQ;AAC1B,QAAM,UAAU,GAAG,QAAQ;AAC3B,QAAM,mBAAmB,CAAC,CAAC,WAAW;AACtC,QAAM,qBAAqB,WAAW,aAAa,MAAM,WAAW;AAEpE,SACE,6CAAC,uBAAO,SAAP,EAAe,UAAS,SACvB;AAAA,gDAAC,uBAAO,OAAP,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IACA,4CAAC,uBAAO,aAAP,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA,QACZ,QAAQ,EAAE,aAAa,4CAAC,sBAAK,QAAO,QAAQ,uBAAY,EAAQ;AAAA;AAAA,IAClE,GACF;AAAA,IACA,4CAAC,sBAAK,IAAG,KAAI,WAAU,UAAS,KAAI,KAAI,SAAO,MAC7C;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,UAAU,OAAO,UAAU;AACzB,gBAAM,eAAe;AACrB,uBAAa,EAAE,IAAI,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;AAAA,QACrD;AAAA,QAEA;AAAA;AAAA,YAAC,uBAAO;AAAA,YAAP;AAAA,cACC,MAAK;AAAA,cACL,OAAO,gBAAgB;AAAA,cACvB,eAAe;AAAA,cACf,UAAU,WAAW,aAAa;AAAA,cAElC;AAAA,4DAAC,4BAAS,SAAS,WAAW,WAC5B;AAAA,kBAAC,uBAAO;AAAA,kBAAP;AAAA,oBACC,IAAI;AAAA,oBACJ,aAAa,UAAU;AAAA,sBACrB,gBAAgB;AAAA,sBAChB,IAAI;AAAA,sBACJ,aAAa;AAAA,oBACf,CAAC;AAAA,oBACD,mBAAiB;AAAA,oBACjB,gBAAc,oBAAoB;AAAA,oBAClC,oBACE,CAAC,oBAAoB,SAAS,sBAAsB,MAAM,EACvD,OAAO,OAAO,EACd,KAAK,GAAG,KAAK;AAAA;AAAA,gBAEpB,GACF;AAAA,gBAEA,4CAAC,uBAAO,SAAP,EACE,gBAAM,IAAI,CAAC,SACV,4CAAC,uBAAO,MAAP,EAA4B,OAAO,KAAK,MACtC,eAAK,QADU,KAAK,IAEvB,CACD,GACH;AAAA;AAAA;AAAA,UACF;AAAA,UAEC,mBACC,4CAAC,sBAAK,OAAM,OAAM,MAAK,KAAI,IAAI,SAC5B,oCAA0B,WAAW,KAAK,GAC7C,IACE;AAAA,UAEH,qBACC,4CAAC,sBAAK,OAAM,QAAO,MAAK,KAAI,IAAI,QAAQ,IAAG,KACzC;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF,IACE;AAAA;AAAA;AAAA,IACN,GACF;AAAA,IAEC,WAAW,QACV,4CAAC,sBAAQ,MAAR,EAAa,OAAM,OAAM,IAAG,KAAI,IAAG,MAClC,sDAAC,sBAAQ,MAAR,EACE,kCAAwB,WAAW,KAAK,GAC3C,GACF,IACE;AAAA,IAEJ,6CAAC,sBAAK,IAAG,KAAI,KAAI,KAAI,SAAQ,OAC3B;AAAA,kDAAC,uBAAO,OAAP,EACC,sDAAC,0BAAO,SAAQ,aAAY,UAAU,WAAW,WAC/C;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF,GACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,SAAS,WAAW;AAAA,UACpB,UAAU,WAAW,aAAa,sBAAsB;AAAA,UAExD;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAEA,4CAAC,gCAAe,SAAO,MACrB,sDAAC,aAAQ,aAAU,UAChB,kCAAwB,WAAW,KAAK,GAC3C,GACF;AAAA,KACF;AAEJ;AAKA,SAAS,mCAAmC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,kBAAc,0BAAY,IAAI,KAAK,KAAK;AAC9C,QAAM,iBAAa,+BAAkB;AACrC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AAEtD,QAAM,UAAU,MAAM;AACpB,QAAI,WAAW,SAAS,CAAC,OAAO;AAC9B,eAAS,sDAAsD;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,WAAW,OAAO,KAAK,CAAC;AAE5B,QAAM,eAAe,CAAC,EAAE,IAAI,OAAAA,OAAM,MAAuC;AACvE,QAAIA,OAAM,WAAW,GAAG;AACtB,eAAS,iCAAiC;AAC1C;AAAA,IACF;AACA,eAAW;AAAA,MACT,EAAE,QAAQ,IAAI,MAAM,EAAE,OAAAA,OAAM,EAAE;AAAA,MAC9B;AAAA,QACE,WAAW,MAAM;AACf,8BAAoB;AAAA,QACtB;AAAA,QACA,SAAS,MAAM;AACb;AAAA,YACE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,SAAS,kBAAkB,MAAM;AACvC,QAAM,kBAAkB,uBAAuB,MAAM;AACrD,QAAM,SAAS,GAAG,eAAe;AACjC,QAAM,qBAAqB,WAAW,aAAa,MAAM,WAAW;AACpE,SACE,6CAAC,uBAAO,SAAP,EAAe,UAAS,SACvB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAI;AAAA,QACJ,WAAU;AAAA,QACV,WAAU;AAAA,QAEV;AAAA,sDAAC,uBAAO,OAAP,EACC;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF;AAAA,UACA,4CAAC,uBAAO,aAAP,EACC;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA,cACZ,QAAQ,EAAE,aAAa,4CAAC,sBAAK,QAAO,QAAQ,uBAAY,EAAQ;AAAA;AAAA,UAClE,GACF;AAAA,UACA,4CAAC,sBAAK,IAAG,KAAI,WAAU,UAAS,KAAI,KAAI,SAAO,MAAC,WAAU,KACxD;AAAA,YAAC;AAAA;AAAA,cACC,SAAO;AAAA,cACP,OAAO,EAAE,SAAS,QAAQ,SAAS,SAAS,UAAU,EAAE;AAAA,cAExD;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,UAAU,OAAO,UAAU;AACzB,0BAAM,eAAe;AACrB,0BAAM,WAAW,IAAI,SAAS,MAAM,aAAa;AACjD,0BAAM,gBAAgB,SACnB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;AAChC,iCAAa,EAAE,IAAI,KAAK,IAAI,OAAO,cAAc,CAAC;AAAA,kBACpD;AAAA,kBAEA,sDAAC,4BACC;AAAA,oBAAC,4BAAc;AAAA,oBAAd;AAAA,sBACC,cAAc,KAAK,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,KAAK,CAAC;AAAA,sBACvD,MAAK;AAAA,sBACL,OAAO,EAAE,KAAK,IAAI;AAAA,sBAClB,IAAI;AAAA,sBACJ,eAAe,CAAC,WAAW;AACzB,4BAAI,SAAS,OAAO,SAAS,GAAG;AAC9B,mCAAS,EAAE;AAAA,wBACb;AAAA,sBACF;AAAA,sBAEC,gBAAM,IAAI,CAAC,MAAM,MAChB,6CAAC,qBACC;AAAA,oEAAC,sBAAK,IAAG,KAAI,SAAQ,UAAS,IAAG,KAC/B;AAAA,0BAAC,4BAAc;AAAA,0BAAd;AAAA,4BACC,OAAO,KAAK;AAAA,4BACZ,OAAO;AAAA,8BACL,OAAO;AAAA,8BACP,KAAK;AAAA,8BACL,YAAY;AAAA,4BACd;AAAA,4BACA,UAAU;AAAA,4BAEV,uDAAC,sBAAK,WAAU,UAAS,OAAM,QAC7B;AAAA,0EAAC,sBAAK,QAAO,QAAO,MAAK,KACtB,eAAK,MACR;AAAA,8BACA;AAAA,gCAAC;AAAA;AAAA,kCACC,OAAM;AAAA,kCACN,MAAK;AAAA,kCACL,OAAO;AAAA,oCACL,UAAU;AAAA,oCACV,cAAc;AAAA,oCACd,YAAY;AAAA,kCACd;AAAA,kCAEC,eAAK;AAAA;AAAA,8BACR;AAAA,+BACF;AAAA;AAAA,wBACF,GACF;AAAA,wBACC,MAAM,MAAM,SAAS,KACpB,4CAAC,2BAAU,aAAY,cAAa,MAAK,KAAI;AAAA,2BA9BvC,KAAK,IAgCf,CACD;AAAA;AAAA,kBACH,GACF;AAAA;AAAA,cACF;AAAA;AAAA,UACF,GACF;AAAA,UAEC,qBACC,4CAAC,sBAAK,OAAM,QAAO,MAAK,KAAI,IAAI,QAAQ,IAAG,KACzC;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF,IACE;AAAA,UAEH,QACC,4CAAC,sBAAQ,MAAR,EAAa,OAAM,OAAM,IAAG,KAAI,IAAG,MAClC,sDAAC,sBAAQ,MAAR,EAAc,iBAAM,GACvB,IACE;AAAA,UAEJ,6CAAC,sBAAK,IAAG,KAAI,KAAI,KAAI,SAAQ,OAC3B;AAAA,wDAAC,uBAAO,OAAP,EACC,sDAAC,0BAAO,SAAQ,aAAY,UAAU,WAAW,WAC/C;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAe;AAAA,gBACf,IAAG;AAAA,gBACH,aAAY;AAAA;AAAA,YACd,GACF,GACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,SAAS,WAAW;AAAA,gBACpB,UAAU,WAAW,aAAa,sBAAsB;AAAA,gBAExD;AAAA,kBAAC;AAAA;AAAA,oBACC,gBAAe;AAAA,oBACf,IAAG;AAAA,oBACH,aAAY;AAAA;AAAA,gBACd;AAAA;AAAA,YACF;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,4CAAC,gCAAe,SAAO,MACrB,sDAAC,aAAQ,aAAU,UAChB,kCAAwB,WAAW,KAAK,GAC3C,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,0BAA0B,OAAgB;AACjD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAgB;AAC/C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":["roles"]}
|
|
@@ -51,6 +51,7 @@ var import_clsx = __toESM(require("clsx"), 1);
|
|
|
51
51
|
var import_widgets_context = require("./widgets-context.js");
|
|
52
52
|
var import_utils = require("./utils.js");
|
|
53
53
|
var import_react_icons = require("@radix-ui/react-icons");
|
|
54
|
+
var import_use_translation = require("./i18n/use-translation.js");
|
|
54
55
|
var Dialog = __toESM(require("./elements/dialog.js"), 1);
|
|
55
56
|
var AlertDialog = __toESM(require("./elements/alert-dialog.js"), 1);
|
|
56
57
|
var DropdownMenu = __toESM(require("./elements/dropdown-menu.js"), 1);
|
|
@@ -112,6 +113,7 @@ const IconButton = React.forwardRef(
|
|
|
112
113
|
...(0, import_utils.getDomProps)({ elementId: "iconButton", className }),
|
|
113
114
|
variant: "ghost",
|
|
114
115
|
color: "gray",
|
|
116
|
+
"aria-label": props.title,
|
|
115
117
|
...props,
|
|
116
118
|
...element
|
|
117
119
|
}
|
|
@@ -177,7 +179,17 @@ const TextFieldSlot = React.forwardRef(function TextFieldSlot2({ className, ...p
|
|
|
177
179
|
const PasswordField = React.forwardRef(function PasswordField2({ className, ...props }, ref) {
|
|
178
180
|
const element = (0, import_widgets_context.useElement)("textfield");
|
|
179
181
|
const [showPassword, setShowPassword] = React.useState(false);
|
|
180
|
-
const
|
|
182
|
+
const translate = (0, import_use_translation.useTranslation)();
|
|
183
|
+
const hidePasswordText = translate({
|
|
184
|
+
defaultMessage: "Hide password",
|
|
185
|
+
id: "Jv4Vps",
|
|
186
|
+
description: "Button text to hide password"
|
|
187
|
+
});
|
|
188
|
+
const showPasswordText = translate({
|
|
189
|
+
defaultMessage: "Show password",
|
|
190
|
+
id: "UIfBSd",
|
|
191
|
+
description: "Button text to show password"
|
|
192
|
+
});
|
|
181
193
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
182
194
|
import_themes.TextField.Root,
|
|
183
195
|
{
|
|
@@ -193,8 +205,7 @@ const PasswordField = React.forwardRef(function PasswordField2({ className, ...p
|
|
|
193
205
|
type: "button",
|
|
194
206
|
size: "1",
|
|
195
207
|
onClick: () => setShowPassword(!showPassword),
|
|
196
|
-
|
|
197
|
-
title: label,
|
|
208
|
+
title: showPassword ? hidePasswordText : showPasswordText,
|
|
198
209
|
children: showPassword ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.EyeOpenIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.EyeClosedIcon, {})
|
|
199
210
|
}
|
|
200
211
|
) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/elements.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Avatar as RadixAvatar,\n AvatarProps as RadixAvatarProps,\n Badge as RadixBadge,\n IconButton as RadixIconButton,\n Skeleton as RadixSkeleton,\n Text,\n TextField as RadixTextField,\n type BadgeProps,\n type ButtonProps as RadixButtonProps,\n type IconButtonProps,\n type SkeletonProps,\n type TextProps,\n Button as RadixButton,\n} from \"@radix-ui/themes\";\nimport type {\n GetPropDefTypes,\n avatarPropDefs,\n badgePropDefs,\n buttonPropDefs,\n dialogContentPropDefs,\n dropdownMenuContentPropDefs,\n dropdownMenuItemPropDefs,\n iconButtonPropDefs,\n textPropDefs,\n textFieldRootPropDefs,\n selectTriggerPropDefs,\n skeletonPropDefs,\n} from \"@radix-ui/themes/props\";\nimport cx from \"clsx\";\nimport { useElement } from \"./widgets-context.js\";\nimport { getDomProps, namespaceClassNames } from \"./utils.js\";\nimport { EyeClosedIcon, EyeOpenIcon } from \"@radix-ui/react-icons\";\n\nexport interface ButtonProps\n extends Omit<RadixButtonProps, \"variant\" | \"color\"> {\n variant?: \"primary\" | \"secondary\" | \"destructive\";\n unsafe_radixVariant?: RadixButtonProps[\"variant\"];\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n function Button(\n { className, variant = \"primary\", unsafe_radixVariant, ...props },\n ref,\n ) {\n const element = useElement(`${variant}Button`);\n\n const themeProps = (() => {\n let props: RadixButtonProps = {};\n if (variant === \"primary\") {\n props = {\n variant: \"solid\",\n } satisfies RadixButtonProps;\n } else if (variant === \"secondary\") {\n props = {\n highContrast: true,\n variant: \"surface\",\n color: \"gray\",\n } satisfies RadixButtonProps;\n } else if (variant === \"destructive\") {\n props = {\n variant: \"solid\",\n color: \"red\",\n } satisfies RadixButtonProps;\n } else {\n variant satisfies never;\n }\n\n if (unsafe_radixVariant) {\n props.variant = unsafe_radixVariant;\n }\n\n return props;\n })();\n\n return (\n <RadixButton\n ref={ref}\n {...getDomProps({\n elementId: `${variant}Button`,\n className: cx(\n className,\n // TODO: Remove BEM-style selector once conventions are standardized\n `button--${variant}`,\n ),\n })}\n {...themeProps}\n {...props}\n {...element}\n />\n );\n },\n);\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n function IconButton({ className, ...props }, ref) {\n const element = useElement(\"iconButton\");\n return (\n <RadixIconButton\n ref={ref}\n {...getDomProps({ elementId: \"iconButton\", className })}\n variant=\"ghost\"\n color=\"gray\"\n {...props}\n {...element}\n />\n );\n },\n);\n\nexport const Skeleton = React.forwardRef<HTMLSpanElement, SkeletonProps>(\n function Skeleton({ className, ...props }, ref) {\n const element = useElement(\"skeleton\");\n return (\n <RadixSkeleton\n ref={ref}\n {...getDomProps({ elementId: \"skeleton\", className })}\n {...props}\n {...element}\n />\n );\n },\n);\n\nexport const Label = React.forwardRef<HTMLLabelElement, TextProps>(\n function Label({ children, className, style = {}, ...props }, ref) {\n const element = useElement(\"label\");\n return (\n <Text\n as=\"label\"\n ref={ref}\n weight=\"bold\"\n size=\"2\"\n {...getDomProps({ elementId: \"label\", className })}\n style={{ width: \"fit-content\", ...style }}\n // Text props are a complex union type depending on the `as` prop value,\n // which breaks down when spreading in `element`.\n {...(props as any)}\n {...element}\n >\n {children}\n </Text>\n );\n },\n);\n\nexport const TextField = React.forwardRef<\n HTMLInputElement,\n RadixTextField.RootProps\n>(function TextField({ className, ...props }, ref) {\n const element = useElement(\"textfield\");\n return (\n <RadixTextField.Root\n ref={ref}\n variant=\"surface\"\n className={cx(namespaceClassNames(\"text-field\"), className)}\n {...props}\n {...element}\n />\n );\n});\n\nexport const TextFieldSlot = React.forwardRef<\n HTMLDivElement,\n RadixTextField.SlotProps\n>(function TextFieldSlot({ className, ...props }, ref) {\n return (\n <RadixTextField.Slot\n ref={ref}\n className={cx(namespaceClassNames(\"text-field-slot\"), className)}\n {...props}\n />\n );\n});\n\nexport const PasswordField = React.forwardRef<\n HTMLInputElement,\n RadixTextField.RootProps\n>(function PasswordField({ className, ...props }, ref) {\n const element = useElement(\"textfield\");\n const [showPassword, setShowPassword] = React.useState(false);\n const label = showPassword ? \"Hide password\" : \"Show password\";\n return (\n <RadixTextField.Root\n ref={ref}\n variant=\"surface\"\n className={cx(namespaceClassNames(\"text-field\"), className)}\n {...props}\n {...element}\n type={showPassword ? \"text\" : \"password\"}\n >\n <RadixTextField.Slot side=\"right\">\n <IconButton\n type=\"button\"\n size=\"1\"\n onClick={() => setShowPassword(!showPassword)}\n aria-label={label}\n title={label}\n >\n {showPassword ? <EyeOpenIcon /> : <EyeClosedIcon />}\n </IconButton>\n </RadixTextField.Slot>\n </RadixTextField.Root>\n );\n});\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge({ className, ...props }, ref) {\n const element = useElement(\"badge\");\n return (\n <RadixBadge\n ref={ref}\n {...getDomProps({ elementId: \"badge\", className })}\n {...props}\n {...element}\n />\n );\n },\n);\n\ninterface AvatarProps extends RadixAvatarProps {\n dim?: boolean;\n}\n\nexport const Avatar = React.forwardRef<HTMLImageElement, AvatarProps>(\n function Avatar({ dim, className, ...props }, ref) {\n const element = useElement(\"avatar\");\n return (\n <RadixAvatar\n ref={ref}\n color=\"gray\"\n {...getDomProps({ elementId: \"avatar\", className })}\n {...props}\n {...element}\n // TODO: use CSS var instead of hard-coded value for opacity\n style={dim ? { opacity: 0.6, ...props.style } : props.style}\n />\n );\n },\n);\n\ntype OmitAsChild<T> = {\n [K in keyof T]: T[K] extends undefined\n ? undefined\n : Omit<NonNullable<T[K]>, \"asChild\">;\n};\n\nexport * as Dialog from \"./elements/dialog.js\";\nexport * as AlertDialog from \"./elements/alert-dialog.js\";\nexport * as DropdownMenu from \"./elements/dropdown-menu.js\";\nexport * as Select from \"./elements/select.js\";\n\nexport type Elements = OmitAsChild<{\n dialog?: GetPropDefTypes<typeof dialogContentPropDefs>;\n primaryButton?: GetPropDefTypes<typeof buttonPropDefs>;\n secondaryButton?: GetPropDefTypes<typeof buttonPropDefs>;\n destructiveButton?: GetPropDefTypes<typeof buttonPropDefs>;\n iconButton?: GetPropDefTypes<typeof iconButtonPropDefs>;\n textfield?: GetPropDefTypes<typeof textFieldRootPropDefs>;\n select?: GetPropDefTypes<typeof selectTriggerPropDefs>;\n badge?: GetPropDefTypes<typeof badgePropDefs>;\n dropdown?: GetPropDefTypes<typeof dropdownMenuContentPropDefs>;\n primaryMenuItem?: GetPropDefTypes<typeof dropdownMenuItemPropDefs>;\n destructiveMenuItem?: GetPropDefTypes<typeof dropdownMenuItemPropDefs>;\n avatar?: Omit<GetPropDefTypes<typeof avatarPropDefs>, \"fallback\">;\n label?: GetPropDefTypes<typeof textPropDefs>;\n skeleton?: GetPropDefTypes<typeof skeletonPropDefs>;\n}>;\n"],"mappings":"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","names":["Button","props","RadixButton","cx","IconButton","RadixIconButton","Skeleton","RadixSkeleton","Label","TextField","RadixTextField","TextFieldSlot","PasswordField","Badge","RadixBadge","Avatar","RadixAvatar"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/elements.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Avatar as RadixAvatar,\n AvatarProps as RadixAvatarProps,\n Badge as RadixBadge,\n IconButton as RadixIconButton,\n Skeleton as RadixSkeleton,\n Text,\n TextField as RadixTextField,\n type BadgeProps,\n type ButtonProps as RadixButtonProps,\n type IconButtonProps as RadixIconButtonProps,\n type SkeletonProps,\n type TextProps,\n Button as RadixButton,\n} from \"@radix-ui/themes\";\nimport type {\n GetPropDefTypes,\n avatarPropDefs,\n badgePropDefs,\n buttonPropDefs,\n dialogContentPropDefs,\n dropdownMenuContentPropDefs,\n dropdownMenuItemPropDefs,\n iconButtonPropDefs,\n textPropDefs,\n textFieldRootPropDefs,\n selectTriggerPropDefs,\n skeletonPropDefs,\n} from \"@radix-ui/themes/props\";\nimport cx from \"clsx\";\nimport { useElement } from \"./widgets-context.js\";\nimport { getDomProps, namespaceClassNames } from \"./utils.js\";\nimport { EyeClosedIcon, EyeOpenIcon } from \"@radix-ui/react-icons\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\nexport interface ButtonProps\n extends Omit<RadixButtonProps, \"variant\" | \"color\"> {\n variant?: \"primary\" | \"secondary\" | \"destructive\";\n unsafe_radixVariant?: RadixButtonProps[\"variant\"];\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n function Button(\n { className, variant = \"primary\", unsafe_radixVariant, ...props },\n ref,\n ) {\n const element = useElement(`${variant}Button`);\n\n const themeProps = (() => {\n let props: RadixButtonProps = {};\n if (variant === \"primary\") {\n props = {\n variant: \"solid\",\n } satisfies RadixButtonProps;\n } else if (variant === \"secondary\") {\n props = {\n highContrast: true,\n variant: \"surface\",\n color: \"gray\",\n } satisfies RadixButtonProps;\n } else if (variant === \"destructive\") {\n props = {\n variant: \"solid\",\n color: \"red\",\n } satisfies RadixButtonProps;\n } else {\n variant satisfies never;\n }\n\n if (unsafe_radixVariant) {\n props.variant = unsafe_radixVariant;\n }\n\n return props;\n })();\n\n return (\n <RadixButton\n ref={ref}\n {...getDomProps({\n elementId: `${variant}Button`,\n className: cx(\n className,\n // TODO: Remove BEM-style selector once conventions are standardized\n `button--${variant}`,\n ),\n })}\n {...themeProps}\n {...props}\n {...element}\n />\n );\n },\n);\n\nexport interface IconButtonProps extends RadixIconButtonProps {\n title: string;\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n function IconButton({ className, ...props }, ref) {\n const element = useElement(\"iconButton\");\n return (\n <RadixIconButton\n ref={ref}\n {...getDomProps({ elementId: \"iconButton\", className })}\n variant=\"ghost\"\n color=\"gray\"\n aria-label={props.title}\n {...props}\n {...element}\n />\n );\n },\n);\n\nexport const Skeleton = React.forwardRef<HTMLSpanElement, SkeletonProps>(\n function Skeleton({ className, ...props }, ref) {\n const element = useElement(\"skeleton\");\n return (\n <RadixSkeleton\n ref={ref}\n {...getDomProps({ elementId: \"skeleton\", className })}\n {...props}\n {...element}\n />\n );\n },\n);\n\nexport const Label = React.forwardRef<HTMLLabelElement, TextProps>(\n function Label({ children, className, style = {}, ...props }, ref) {\n const element = useElement(\"label\");\n return (\n <Text\n as=\"label\"\n ref={ref}\n weight=\"bold\"\n size=\"2\"\n {...getDomProps({ elementId: \"label\", className })}\n style={{ width: \"fit-content\", ...style }}\n // Text props are a complex union type depending on the `as` prop value,\n // which breaks down when spreading in `element`.\n {...(props as any)}\n {...element}\n >\n {children}\n </Text>\n );\n },\n);\n\nexport const TextField = React.forwardRef<\n HTMLInputElement,\n RadixTextField.RootProps\n>(function TextField({ className, ...props }, ref) {\n const element = useElement(\"textfield\");\n return (\n <RadixTextField.Root\n ref={ref}\n variant=\"surface\"\n className={cx(namespaceClassNames(\"text-field\"), className)}\n {...props}\n {...element}\n />\n );\n});\n\nexport const TextFieldSlot = React.forwardRef<\n HTMLDivElement,\n RadixTextField.SlotProps\n>(function TextFieldSlot({ className, ...props }, ref) {\n return (\n <RadixTextField.Slot\n ref={ref}\n className={cx(namespaceClassNames(\"text-field-slot\"), className)}\n {...props}\n />\n );\n});\n\nexport const PasswordField = React.forwardRef<\n HTMLInputElement,\n RadixTextField.RootProps\n>(function PasswordField({ className, ...props }, ref) {\n const element = useElement(\"textfield\");\n const [showPassword, setShowPassword] = React.useState(false);\n const translate = useTranslation();\n const hidePasswordText = translate({\n defaultMessage: \"Hide password\",\n id: \"Jv4Vps\",\n description: \"Button text to hide password\",\n });\n const showPasswordText = translate({\n defaultMessage: \"Show password\",\n id: \"UIfBSd\",\n description: \"Button text to show password\",\n });\n return (\n <RadixTextField.Root\n ref={ref}\n variant=\"surface\"\n className={cx(namespaceClassNames(\"text-field\"), className)}\n {...props}\n {...element}\n type={showPassword ? \"text\" : \"password\"}\n >\n <RadixTextField.Slot side=\"right\">\n <IconButton\n type=\"button\"\n size=\"1\"\n onClick={() => setShowPassword(!showPassword)}\n title={showPassword ? hidePasswordText : showPasswordText}\n >\n {showPassword ? <EyeOpenIcon /> : <EyeClosedIcon />}\n </IconButton>\n </RadixTextField.Slot>\n </RadixTextField.Root>\n );\n});\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge({ className, ...props }, ref) {\n const element = useElement(\"badge\");\n return (\n <RadixBadge\n ref={ref}\n {...getDomProps({ elementId: \"badge\", className })}\n {...props}\n {...element}\n />\n );\n },\n);\n\ninterface AvatarProps extends RadixAvatarProps {\n dim?: boolean;\n}\n\nexport const Avatar = React.forwardRef<HTMLImageElement, AvatarProps>(\n function Avatar({ dim, className, ...props }, ref) {\n const element = useElement(\"avatar\");\n return (\n <RadixAvatar\n ref={ref}\n color=\"gray\"\n {...getDomProps({ elementId: \"avatar\", className })}\n {...props}\n {...element}\n // TODO: use CSS var instead of hard-coded value for opacity\n style={dim ? { opacity: 0.6, ...props.style } : props.style}\n />\n );\n },\n);\n\ntype OmitAsChild<T> = {\n [K in keyof T]: T[K] extends undefined\n ? undefined\n : Omit<NonNullable<T[K]>, \"asChild\">;\n};\n\nexport * as Dialog from \"./elements/dialog.js\";\nexport * as AlertDialog from \"./elements/alert-dialog.js\";\nexport * as DropdownMenu from \"./elements/dropdown-menu.js\";\nexport * as Select from \"./elements/select.js\";\n\nexport type Elements = OmitAsChild<{\n dialog?: GetPropDefTypes<typeof dialogContentPropDefs>;\n primaryButton?: GetPropDefTypes<typeof buttonPropDefs>;\n secondaryButton?: GetPropDefTypes<typeof buttonPropDefs>;\n destructiveButton?: GetPropDefTypes<typeof buttonPropDefs>;\n iconButton?: GetPropDefTypes<typeof iconButtonPropDefs>;\n textfield?: GetPropDefTypes<typeof textFieldRootPropDefs>;\n select?: GetPropDefTypes<typeof selectTriggerPropDefs>;\n badge?: GetPropDefTypes<typeof badgePropDefs>;\n dropdown?: GetPropDefTypes<typeof dropdownMenuContentPropDefs>;\n primaryMenuItem?: GetPropDefTypes<typeof dropdownMenuItemPropDefs>;\n destructiveMenuItem?: GetPropDefTypes<typeof dropdownMenuItemPropDefs>;\n avatar?: Omit<GetPropDefTypes<typeof avatarPropDefs>, \"fallback\">;\n label?: GetPropDefTypes<typeof textPropDefs>;\n skeleton?: GetPropDefTypes<typeof skeletonPropDefs>;\n}>;\n"],"mappings":"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","names":["Button","props","RadixButton","cx","IconButton","RadixIconButton","Skeleton","RadixSkeleton","Label","TextField","RadixTextField","TextFieldSlot","PasswordField","Badge","RadixBadge","Avatar","RadixAvatar"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { ButtonProps as ButtonProps$1, IconButtonProps, SkeletonProps, TextProps, TextField as TextField$1, BadgeProps, AvatarProps as AvatarProps$1 } from '@radix-ui/themes';
|
|
2
|
+
import { ButtonProps as ButtonProps$1, IconButtonProps as IconButtonProps$1, SkeletonProps, TextProps, TextField as TextField$1, BadgeProps, AvatarProps as AvatarProps$1 } from '@radix-ui/themes';
|
|
3
3
|
import { GetPropDefTypes, dialogContentPropDefs, buttonPropDefs, iconButtonPropDefs, textFieldRootPropDefs, selectTriggerPropDefs, badgePropDefs, dropdownMenuContentPropDefs, dropdownMenuItemPropDefs, avatarPropDefs, textPropDefs, skeletonPropDefs } from '@radix-ui/themes/props';
|
|
4
4
|
export { d as Dialog } from '../dialog-C15qCLN3.cjs';
|
|
5
5
|
export { a as AlertDialog } from '../alert-dialog-BlG3_awx.cjs';
|
|
@@ -15,6 +15,9 @@ interface ButtonProps extends Omit<ButtonProps$1, "variant" | "color"> {
|
|
|
15
15
|
unsafe_radixVariant?: ButtonProps$1["variant"];
|
|
16
16
|
}
|
|
17
17
|
declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
18
|
+
interface IconButtonProps extends IconButtonProps$1 {
|
|
19
|
+
title: string;
|
|
20
|
+
}
|
|
18
21
|
declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
19
22
|
declare const Skeleton: React.ForwardRefExoticComponent<SkeletonProps & React.RefAttributes<HTMLSpanElement>>;
|
|
20
23
|
declare const Label: React.ForwardRefExoticComponent<TextProps & React.RefAttributes<HTMLLabelElement>>;
|
|
@@ -47,4 +50,4 @@ type Elements = OmitAsChild<{
|
|
|
47
50
|
skeleton?: GetPropDefTypes<typeof skeletonPropDefs>;
|
|
48
51
|
}>;
|
|
49
52
|
|
|
50
|
-
export { Avatar, Badge, Button, type ButtonProps, type Elements, IconButton, Label, PasswordField, Skeleton, TextField, TextFieldSlot };
|
|
53
|
+
export { Avatar, Badge, Button, type ButtonProps, type Elements, IconButton, type IconButtonProps, Label, PasswordField, Skeleton, TextField, TextFieldSlot };
|