@keycloakify/keycloak-account-ui 25.0.4-rc.7 → 26.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/KcAccountUiLoader.d.ts +1 -0
  2. package/KcAccountUiLoader.js +3 -2
  3. package/KcAccountUiLoader.js.map +1 -1
  4. package/README.md +19 -19
  5. package/account-security/AccountRow.js +5 -4
  6. package/account-security/AccountRow.js.map +1 -1
  7. package/account-security/DeviceActivity.js +5 -4
  8. package/account-security/DeviceActivity.js.map +1 -1
  9. package/account-security/LinkedAccounts.js +24 -9
  10. package/account-security/LinkedAccounts.js.map +1 -1
  11. package/account-security/LinkedAccountsToolbar.d.ts +12 -0
  12. package/account-security/LinkedAccountsToolbar.js +24 -0
  13. package/account-security/LinkedAccountsToolbar.js.map +1 -0
  14. package/account-security/SigningIn.js +1 -1
  15. package/account-security/SigningIn.js.map +1 -1
  16. package/api/methods.d.ts +7 -1
  17. package/api/methods.js +9 -2
  18. package/api/methods.js.map +1 -1
  19. package/api/parse-links.js +3 -3
  20. package/api/parse-links.js.map +1 -1
  21. package/api/parse-response.d.ts +2 -0
  22. package/api/parse-response.js +11 -15
  23. package/api/parse-response.js.map +1 -1
  24. package/api/request.js +1 -1
  25. package/api/request.js.map +1 -1
  26. package/api.js +1 -7
  27. package/api.js.map +1 -1
  28. package/applications/Applications.js +5 -4
  29. package/applications/Applications.js.map +1 -1
  30. package/environment.d.ts +1 -0
  31. package/environment.js.map +1 -1
  32. package/messages/messages_ca.properties +105 -12
  33. package/messages/messages_de.properties +23 -1
  34. package/messages/messages_en.properties +16 -1
  35. package/messages/messages_es.properties +1 -1
  36. package/messages/messages_fr.properties +64 -19
  37. package/messages/messages_it.properties +3 -0
  38. package/messages/messages_ka.properties +15 -0
  39. package/messages/messages_nl.properties +2 -0
  40. package/organizations/Organizations.d.ts +2 -0
  41. package/organizations/Organizations.js +19 -0
  42. package/organizations/Organizations.js.map +1 -0
  43. package/package.json +89 -29
  44. package/personal-info/PersonalInfo.js +11 -9
  45. package/personal-info/PersonalInfo.js.map +1 -1
  46. package/public/content.d.ts +4 -0
  47. package/public/content.js +5 -0
  48. package/public/content.js.map +1 -1
  49. package/resources/EditTheResource.js +4 -3
  50. package/resources/EditTheResource.js.map +1 -1
  51. package/resources/PermissionRequest.js +4 -3
  52. package/resources/PermissionRequest.js.map +1 -1
  53. package/resources/ResourcesTab.js +4 -3
  54. package/resources/ResourcesTab.js.map +1 -1
  55. package/resources/ShareTheResource.js +4 -3
  56. package/resources/ShareTheResource.js.map +1 -1
  57. package/root/Header.js +1 -1
  58. package/root/Header.js.map +1 -1
  59. package/root/PageNav.js +1 -1
  60. package/root/PageNav.js.map +1 -1
  61. package/routes.d.ts +1 -0
  62. package/routes.js +6 -0
  63. package/routes.js.map +1 -1
  64. package/src/KcAccountUiLoader.tsx +7 -2
  65. package/src/account-security/AccountRow.tsx +6 -8
  66. package/src/account-security/DeviceActivity.tsx +10 -9
  67. package/src/account-security/LinkedAccounts.tsx +107 -30
  68. package/src/account-security/LinkedAccountsToolbar.tsx +88 -0
  69. package/src/account-security/SigningIn.tsx +1 -1
  70. package/src/api/methods.ts +22 -2
  71. package/src/api/parse-links.ts +3 -3
  72. package/src/api/parse-response.ts +22 -23
  73. package/src/api/request.ts +1 -1
  74. package/src/api.ts +1 -7
  75. package/src/applications/Applications.tsx +19 -11
  76. package/src/environment.ts +1 -0
  77. package/src/organizations/Organizations.tsx +48 -0
  78. package/src/personal-info/PersonalInfo.tsx +10 -8
  79. package/src/public/content.ts +5 -0
  80. package/src/resources/EditTheResource.tsx +8 -7
  81. package/src/resources/PermissionRequest.tsx +5 -3
  82. package/src/resources/ResourcesTab.tsx +8 -7
  83. package/src/resources/ShareTheResource.tsx +9 -8
  84. package/src/root/Header.tsx +0 -1
  85. package/src/root/PageNav.tsx +1 -1
  86. package/src/routes.tsx +7 -0
  87. package/src/ui-shared/alerts/AlertPanel.tsx +43 -0
  88. package/src/ui-shared/alerts/Alerts.tsx +48 -52
  89. package/src/ui-shared/context/environment.ts +1 -1
  90. package/src/ui-shared/controls/KeycloakSpinner.tsx +12 -0
  91. package/src/ui-shared/controls/OrganizationTable.tsx +122 -0
  92. package/src/ui-shared/controls/select-control/SingleSelectControl.tsx +3 -1
  93. package/src/ui-shared/controls/select-control/TypeaheadSelectControl.tsx +5 -3
  94. package/src/ui-shared/controls/table/KeycloakDataTable.tsx +597 -0
  95. package/src/ui-shared/controls/table/ListEmptyState.tsx +86 -0
  96. package/src/ui-shared/controls/table/PaginatingTableToolbar.tsx +106 -0
  97. package/src/ui-shared/controls/table/TableToolbar.tsx +92 -0
  98. package/src/ui-shared/main.ts +35 -1
  99. package/src/ui-shared/masthead/Masthead.tsx +64 -48
  100. package/src/ui-shared/select/SingleSelect.tsx +2 -0
  101. package/src/ui-shared/select/TypeaheadSelect.tsx +2 -0
  102. package/src/ui-shared/user-profile/LocaleSelector.tsx +1 -1
  103. package/src/ui-shared/user-profile/UserProfileFields.tsx +18 -21
  104. package/src/ui-shared/user-profile/UserProfileGroup.tsx +3 -2
  105. package/src/ui-shared/user-profile/utils.ts +12 -6
  106. package/src/ui-shared/utils/ErrorBoundary.tsx +77 -0
  107. package/src/ui-shared/utils/darkMode.ts +19 -0
  108. package/src/ui-shared/utils/errors.ts +55 -0
  109. package/src/ui-shared/utils/generateId.ts +1 -0
  110. package/src/ui-shared/utils/useFetch.ts +44 -0
  111. package/src/ui-shared/utils/useSetTimeout.ts +40 -0
  112. package/src/utils/useAccountAlerts.ts +28 -0
  113. package/src/utils/usePromise.ts +8 -3
  114. package/src/zKcContextLike.ts +1 -0
  115. package/ui-shared/alerts/AlertPanel.d.ts +6 -0
  116. package/ui-shared/alerts/AlertPanel.js +6 -0
  117. package/ui-shared/alerts/AlertPanel.js.map +1 -0
  118. package/ui-shared/alerts/Alerts.d.ts +2 -3
  119. package/ui-shared/alerts/Alerts.js +32 -22
  120. package/ui-shared/alerts/Alerts.js.map +1 -1
  121. package/ui-shared/context/environment.js +1 -1
  122. package/ui-shared/context/environment.js.map +1 -1
  123. package/ui-shared/controls/KeycloakSpinner.d.ts +1 -0
  124. package/ui-shared/controls/KeycloakSpinner.js +8 -0
  125. package/ui-shared/controls/KeycloakSpinner.js.map +1 -0
  126. package/ui-shared/controls/OrganizationTable.d.ts +16 -0
  127. package/ui-shared/controls/OrganizationTable.js +45 -0
  128. package/ui-shared/controls/OrganizationTable.js.map +1 -0
  129. package/ui-shared/controls/select-control/SingleSelectControl.js +3 -1
  130. package/ui-shared/controls/select-control/SingleSelectControl.js.map +1 -1
  131. package/ui-shared/controls/select-control/TypeaheadSelectControl.js +5 -3
  132. package/ui-shared/controls/select-control/TypeaheadSelectControl.js.map +1 -1
  133. package/ui-shared/controls/table/KeycloakDataTable.d.ts +64 -0
  134. package/ui-shared/controls/table/KeycloakDataTable.js +279 -0
  135. package/ui-shared/controls/table/KeycloakDataTable.js.map +1 -0
  136. package/ui-shared/controls/table/ListEmptyState.d.ts +20 -0
  137. package/ui-shared/controls/table/ListEmptyState.js +11 -0
  138. package/ui-shared/controls/table/ListEmptyState.js.map +1 -0
  139. package/ui-shared/controls/table/PaginatingTableToolbar.d.ts +21 -0
  140. package/ui-shared/controls/table/PaginatingTableToolbar.js +27 -0
  141. package/ui-shared/controls/table/PaginatingTableToolbar.js.map +1 -0
  142. package/ui-shared/controls/table/TableToolbar.d.ts +12 -0
  143. package/ui-shared/controls/table/TableToolbar.js +30 -0
  144. package/ui-shared/controls/table/TableToolbar.js.map +1 -0
  145. package/ui-shared/main.d.ts +15 -1
  146. package/ui-shared/main.js +13 -1
  147. package/ui-shared/main.js.map +1 -1
  148. package/ui-shared/masthead/Masthead.d.ts +4 -7
  149. package/ui-shared/masthead/Masthead.js +14 -14
  150. package/ui-shared/masthead/Masthead.js.map +1 -1
  151. package/ui-shared/select/SingleSelect.d.ts +1 -1
  152. package/ui-shared/select/SingleSelect.js +2 -2
  153. package/ui-shared/select/SingleSelect.js.map +1 -1
  154. package/ui-shared/select/TypeaheadSelect.d.ts +1 -1
  155. package/ui-shared/select/TypeaheadSelect.js +2 -2
  156. package/ui-shared/select/TypeaheadSelect.js.map +1 -1
  157. package/ui-shared/user-profile/LocaleSelector.js +1 -1
  158. package/ui-shared/user-profile/LocaleSelector.js.map +1 -1
  159. package/ui-shared/user-profile/UserProfileFields.d.ts +2 -4
  160. package/ui-shared/user-profile/UserProfileFields.js +0 -18
  161. package/ui-shared/user-profile/UserProfileFields.js.map +1 -1
  162. package/ui-shared/user-profile/UserProfileGroup.js.map +1 -1
  163. package/ui-shared/user-profile/utils.js +2 -2
  164. package/ui-shared/user-profile/utils.js.map +1 -1
  165. package/ui-shared/utils/ErrorBoundary.d.ts +26 -0
  166. package/ui-shared/utils/ErrorBoundary.js +29 -0
  167. package/ui-shared/utils/ErrorBoundary.js.map +1 -0
  168. package/ui-shared/utils/darkMode.d.ts +1 -0
  169. package/ui-shared/utils/darkMode.js +16 -0
  170. package/ui-shared/utils/darkMode.js.map +1 -0
  171. package/ui-shared/utils/errors.d.ts +4 -0
  172. package/ui-shared/utils/errors.js +42 -0
  173. package/ui-shared/utils/errors.js.map +1 -0
  174. package/ui-shared/utils/generateId.d.ts +1 -0
  175. package/ui-shared/utils/generateId.js +2 -0
  176. package/ui-shared/utils/generateId.js.map +1 -0
  177. package/ui-shared/utils/useFetch.d.ts +17 -0
  178. package/ui-shared/utils/useFetch.js +38 -0
  179. package/ui-shared/utils/useFetch.js.map +1 -0
  180. package/ui-shared/utils/useSetTimeout.d.ts +1 -0
  181. package/ui-shared/utils/useSetTimeout.js +32 -0
  182. package/ui-shared/utils/useSetTimeout.js.map +1 -0
  183. package/utils/useAccountAlerts.d.ts +4 -0
  184. package/utils/useAccountAlerts.js +19 -0
  185. package/utils/useAccountAlerts.js.map +1 -0
  186. package/utils/usePromise.js +7 -3
  187. package/utils/usePromise.js.map +1 -1
  188. package/zKcContextLike.js +1 -0
  189. package/zKcContextLike.js.map +1 -1
  190. package/src/utils/isRecord.ts +0 -2
  191. package/utils/isRecord.d.ts +0 -1
  192. package/utils/isRecord.js +0 -2
  193. package/utils/isRecord.js.map +0 -1
@@ -0,0 +1,122 @@
1
+ import OrganizationRepresentation from "@keycloak/keycloak-admin-client/lib/defs/organizationRepresentation";
2
+ import { Badge, Chip, ChipGroup } from "@patternfly/react-core";
3
+ import { TableText } from "@patternfly/react-table";
4
+ import { FunctionComponent, PropsWithChildren, ReactNode } from "react";
5
+ import { useTranslation } from "react-i18next";
6
+ import { KeycloakDataTable, LoaderFunction } from "@keycloakify/keycloak-account-ui/ui-shared/controls/table/KeycloakDataTable";
7
+
8
+ type OrgDetailLinkProps = {
9
+ link: FunctionComponent<
10
+ PropsWithChildren<{ organization: OrganizationRepresentation }>
11
+ >;
12
+ organization: OrganizationRepresentation;
13
+ };
14
+
15
+ const OrgDetailLink = ({ link, organization }: OrgDetailLinkProps) => {
16
+ const { t } = useTranslation();
17
+ const Component = link;
18
+ return (
19
+ <TableText wrapModifier="truncate">
20
+ <Component organization={organization}>
21
+ {organization.name}
22
+ {!organization.enabled && (
23
+ <Badge
24
+ key={`${organization.id}-disabled`}
25
+ isRead
26
+ className="pf-v5-u-ml-sm"
27
+ >
28
+ {t("disabled")}
29
+ </Badge>
30
+ )}
31
+ </Component>
32
+ </TableText>
33
+ );
34
+ };
35
+
36
+ const Domains = (org: OrganizationRepresentation) => {
37
+ const { t } = useTranslation();
38
+ return (
39
+ <ChipGroup
40
+ numChips={2}
41
+ expandedText={t("hide")}
42
+ collapsedText={t("showRemaining")}
43
+ >
44
+ {org.domains?.map((dn) => {
45
+ const name = typeof dn === "string" ? dn : dn.name;
46
+ return (
47
+ <Chip key={name} isReadOnly>
48
+ {name}
49
+ </Chip>
50
+ );
51
+ })}
52
+ </ChipGroup>
53
+ );
54
+ };
55
+
56
+ type OrganizationTableProps = PropsWithChildren & {
57
+ loader:
58
+ | LoaderFunction<OrganizationRepresentation>
59
+ | OrganizationRepresentation[];
60
+ link: FunctionComponent<
61
+ PropsWithChildren<{ organization: OrganizationRepresentation }>
62
+ >;
63
+ toolbarItem?: ReactNode;
64
+ isPaginated?: boolean;
65
+ onSelect?: (orgs: OrganizationRepresentation[]) => void;
66
+ onDelete?: (org: OrganizationRepresentation) => void;
67
+ deleteLabel?: string;
68
+ };
69
+
70
+ export const OrganizationTable = ({
71
+ loader,
72
+ toolbarItem,
73
+ isPaginated = false,
74
+ onSelect,
75
+ onDelete,
76
+ deleteLabel = "delete",
77
+ link,
78
+ children,
79
+ }: OrganizationTableProps) => {
80
+ const { t } = useTranslation();
81
+
82
+ return (
83
+ <KeycloakDataTable
84
+ loader={loader}
85
+ isPaginated={isPaginated}
86
+ ariaLabelKey="organizationList"
87
+ searchPlaceholderKey="searchOrganization"
88
+ toolbarItem={toolbarItem}
89
+ onSelect={onSelect}
90
+ canSelectAll={onSelect !== undefined}
91
+ actions={
92
+ onDelete
93
+ ? [
94
+ {
95
+ title: t(deleteLabel),
96
+ onRowClick: onDelete,
97
+ },
98
+ ]
99
+ : undefined
100
+ }
101
+ columns={[
102
+ {
103
+ name: "name",
104
+ displayKey: "name",
105
+ cellRenderer: (row) => (
106
+ <OrgDetailLink link={link} organization={row} />
107
+ ),
108
+ },
109
+ {
110
+ name: "domains",
111
+ displayKey: "domains",
112
+ cellRenderer: Domains,
113
+ },
114
+ {
115
+ name: "description",
116
+ displayKey: "description",
117
+ },
118
+ ]}
119
+ emptyState={children}
120
+ />
121
+ );
122
+ };
@@ -13,6 +13,7 @@ import {
13
13
  FieldValues,
14
14
  useFormContext,
15
15
  } from "react-hook-form";
16
+ import { getRuleValue } from "@keycloakify/keycloak-account-ui/ui-shared/utils/getRuleValue";
16
17
  import { FormLabel } from "@keycloakify/keycloak-account-ui/ui-shared/controls/FormLabel";
17
18
  import {
18
19
  SelectControlProps,
@@ -38,12 +39,13 @@ export const SingleSelectControl = <
38
39
  formState: { errors },
39
40
  } = useFormContext();
40
41
  const [open, setOpen] = useState(false);
42
+ const required = getRuleValue(controller.rules?.required) === true;
41
43
 
42
44
  return (
43
45
  <FormLabel
44
46
  name={name}
45
47
  label={label}
46
- isRequired={!!controller.rules?.required}
48
+ isRequired={required}
47
49
  error={get(errors, name)}
48
50
  labelIcon={labelIcon}
49
51
  >
@@ -21,6 +21,7 @@ import {
21
21
  FieldValues,
22
22
  useFormContext,
23
23
  } from "react-hook-form";
24
+ import { getRuleValue } from "@keycloakify/keycloak-account-ui/ui-shared/utils/getRuleValue";
24
25
  import { FormLabel } from "@keycloakify/keycloak-account-ui/ui-shared/controls/FormLabel";
25
26
  import {
26
27
  SelectControlOption,
@@ -57,6 +58,7 @@ export const TypeaheadSelectControl = <
57
58
  const [filterValue, setFilterValue] = useState("");
58
59
  const [focusedItemIndex, setFocusedItemIndex] = useState<number>(0);
59
60
  const textInputRef = useRef<HTMLInputElement>();
61
+ const required = getRuleValue(controller.rules?.required) === true;
60
62
 
61
63
  const filteredOptions = options.filter((option) =>
62
64
  getValue(option).toLowerCase().startsWith(filterValue.toLowerCase()),
@@ -147,7 +149,7 @@ export const TypeaheadSelectControl = <
147
149
  <FormLabel
148
150
  name={name}
149
151
  label={label}
150
- isRequired={!!controller.rules?.required}
152
+ isRequired={required}
151
153
  error={get(errors, name)}
152
154
  labelIcon={labelIcon}
153
155
  >
@@ -236,12 +238,12 @@ export const TypeaheadSelectControl = <
236
238
  )}
237
239
  </TextInputGroupMain>
238
240
  <TextInputGroupUtilities>
239
- {!!filterValue && (
241
+ {(!!filterValue || field.value) && (
240
242
  <Button
241
243
  variant="plain"
242
244
  onClick={() => {
243
- field.onChange(undefined);
244
245
  setFilterValue("");
246
+ field.onChange("");
245
247
  textInputRef?.current?.focus();
246
248
  }}
247
249
  aria-label="Clear input value"