@keycloakify/keycloak-account-ui 26.0.0-rc.3 → 260007.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) hide show
  1. package/KcAccountUiLoader.d.ts +2 -4
  2. package/KcAccountUiLoader.js +34 -41
  3. package/KcAccountUiLoader.js.map +1 -1
  4. package/README.md +1 -50
  5. package/index.js.map +1 -1
  6. package/{KcAccountUi.js → keycloak-theme/account/KcAccountUi.tsx} +15 -7
  7. package/keycloak-theme/account/KcContext.ts +8 -0
  8. package/keycloak-theme/account/KcPage.tsx +11 -0
  9. package/{src → keycloak-theme/account}/account-security/AccountRow.tsx +8 -4
  10. package/{src → keycloak-theme/account}/account-security/DeviceActivity.tsx +11 -7
  11. package/{src → keycloak-theme/account}/account-security/LinkedAccounts.tsx +12 -8
  12. package/{src → keycloak-theme/account}/account-security/LinkedAccountsToolbar.tsx +4 -0
  13. package/{src → keycloak-theme/account}/account-security/SigningIn.tsx +12 -8
  14. package/{src → keycloak-theme/account}/api/constants.ts +4 -0
  15. package/{src → keycloak-theme/account}/api/methods.ts +9 -5
  16. package/{src → keycloak-theme/account}/api/parse-links.ts +4 -0
  17. package/{src → keycloak-theme/account}/api/parse-response.ts +6 -2
  18. package/{src → keycloak-theme/account}/api/representations.ts +4 -0
  19. package/{src → keycloak-theme/account}/api/request.ts +7 -3
  20. package/{src → keycloak-theme/account}/api.ts +11 -7
  21. package/{src → keycloak-theme/account}/applications/Applications.tsx +12 -8
  22. package/{src/public → keycloak-theme/account/assets}/content.ts +14 -20
  23. package/keycloak-theme/account/assets/favicon.svg +63 -0
  24. package/{src → keycloak-theme/account}/components/datalist/EmptyRow.tsx +4 -0
  25. package/{src → keycloak-theme/account}/components/page/Page.tsx +4 -0
  26. package/{src → keycloak-theme/account}/content/ContentComponent.tsx +10 -6
  27. package/keycloak-theme/account/content/fetchContent.ts +13 -0
  28. package/{src → keycloak-theme/account}/environment.ts +5 -1
  29. package/{src → keycloak-theme/account}/groups/Groups.tsx +9 -5
  30. package/{src → keycloak-theme/account/i18n}/i18n.ts +7 -5
  31. package/keycloak-theme/account/i18n/index.ts +5 -0
  32. package/{messages → keycloak-theme/account/i18n}/messages_ar.properties +8 -0
  33. package/{messages → keycloak-theme/account/i18n}/messages_ca.properties +8 -0
  34. package/{messages → keycloak-theme/account/i18n}/messages_cs.properties +8 -0
  35. package/{messages → keycloak-theme/account/i18n}/messages_da.properties +8 -0
  36. package/{messages → keycloak-theme/account/i18n}/messages_de.properties +8 -0
  37. package/{messages → keycloak-theme/account/i18n}/messages_el.properties +8 -0
  38. package/{messages → keycloak-theme/account/i18n}/messages_en.properties +8 -0
  39. package/{messages → keycloak-theme/account/i18n}/messages_es.properties +8 -0
  40. package/{messages → keycloak-theme/account/i18n}/messages_fa.properties +8 -0
  41. package/{messages → keycloak-theme/account/i18n}/messages_fi.properties +8 -0
  42. package/{messages → keycloak-theme/account/i18n}/messages_fr.properties +8 -0
  43. package/{messages → keycloak-theme/account/i18n}/messages_hu.properties +8 -0
  44. package/{messages → keycloak-theme/account/i18n}/messages_it.properties +8 -0
  45. package/{messages → keycloak-theme/account/i18n}/messages_ja.properties +8 -0
  46. package/{messages → keycloak-theme/account/i18n}/messages_ka.properties +8 -0
  47. package/{messages → keycloak-theme/account/i18n}/messages_lt.properties +8 -0
  48. package/{messages → keycloak-theme/account/i18n}/messages_lv.properties +8 -0
  49. package/{messages → keycloak-theme/account/i18n}/messages_nl.properties +8 -0
  50. package/{messages → keycloak-theme/account/i18n}/messages_no.properties +8 -0
  51. package/{messages → keycloak-theme/account/i18n}/messages_pl.properties +8 -0
  52. package/{messages → keycloak-theme/account/i18n}/messages_pt.properties +8 -0
  53. package/{messages → keycloak-theme/account/i18n}/messages_pt_BR.properties +8 -0
  54. package/{messages → keycloak-theme/account/i18n}/messages_ru.properties +8 -0
  55. package/{messages → keycloak-theme/account/i18n}/messages_sk.properties +8 -0
  56. package/{messages → keycloak-theme/account/i18n}/messages_sv.properties +8 -0
  57. package/{messages → keycloak-theme/account/i18n}/messages_th.properties +8 -0
  58. package/{messages → keycloak-theme/account/i18n}/messages_tr.properties +8 -0
  59. package/{messages → keycloak-theme/account/i18n}/messages_uk.properties +8 -0
  60. package/{messages → keycloak-theme/account/i18n}/messages_zh_CN.properties +8 -0
  61. package/{messages → keycloak-theme/account/i18n}/messages_zh_TW.properties +8 -0
  62. package/{src → keycloak-theme/account}/i18next.d.ts +4 -0
  63. package/{src → keycloak-theme/account}/oid4vci/Oid4Vci.tsx +9 -5
  64. package/{src → keycloak-theme/account}/organizations/Organizations.tsx +9 -5
  65. package/{src → keycloak-theme/account}/personal-info/PersonalInfo.tsx +13 -10
  66. package/{src → keycloak-theme/account}/resources/EditTheResource.tsx +8 -4
  67. package/{src → keycloak-theme/account}/resources/PermissionRequest.tsx +8 -4
  68. package/{src → keycloak-theme/account}/resources/ResourceToolbar.tsx +4 -0
  69. package/{src → keycloak-theme/account}/resources/Resources.tsx +6 -2
  70. package/{src → keycloak-theme/account}/resources/ResourcesTab.tsx +16 -12
  71. package/{src → keycloak-theme/account}/resources/ShareTheResource.tsx +9 -5
  72. package/{src → keycloak-theme/account}/resources/SharedWith.tsx +5 -1
  73. package/{src → keycloak-theme/account}/root/ErrorPage.tsx +4 -0
  74. package/{src → keycloak-theme/account}/root/Header.tsx +11 -6
  75. package/{src → keycloak-theme/account}/root/PageNav.tsx +9 -5
  76. package/{src → keycloak-theme/account}/root/Root.tsx +8 -4
  77. package/{src → keycloak-theme/account}/routes.tsx +18 -14
  78. package/{src → keycloak-theme/account}/utils/formatDate.ts +6 -3
  79. package/{src → keycloak-theme/account}/utils/joinPath.ts +4 -0
  80. package/{src → keycloak-theme/account}/utils/useAccountAlerts.ts +6 -2
  81. package/{src → keycloak-theme/account}/utils/usePromise.ts +4 -0
  82. package/package.json +18 -525
  83. package/src/KcAccountUiLoader.tsx +391 -370
  84. package/src/zKcContextLike.ts +31 -74
  85. package/tsconfig.tsbuildinfo +1 -0
  86. package/zKcContextLike.js +7 -7
  87. package/zKcContextLike.js.map +1 -1
  88. package/KcAccountUi.d.ts +0 -3
  89. package/KcAccountUi.js.map +0 -1
  90. package/account-security/AccountRow.d.ts +0 -8
  91. package/account-security/AccountRow.js +0 -37
  92. package/account-security/AccountRow.js.map +0 -1
  93. package/account-security/DeviceActivity.d.ts +0 -2
  94. package/account-security/DeviceActivity.js +0 -71
  95. package/account-security/DeviceActivity.js.map +0 -1
  96. package/account-security/LinkedAccounts.d.ts +0 -2
  97. package/account-security/LinkedAccounts.js +0 -40
  98. package/account-security/LinkedAccounts.js.map +0 -1
  99. package/account-security/LinkedAccountsToolbar.d.ts +0 -12
  100. package/account-security/LinkedAccountsToolbar.js +0 -24
  101. package/account-security/LinkedAccountsToolbar.js.map +0 -1
  102. package/account-security/SigningIn.d.ts +0 -2
  103. package/account-security/SigningIn.js +0 -65
  104. package/account-security/SigningIn.js.map +0 -1
  105. package/api/constants.d.ts +0 -2
  106. package/api/constants.js +0 -3
  107. package/api/constants.js.map +0 -1
  108. package/api/methods.d.ts +0 -31
  109. package/api/methods.js +0 -80
  110. package/api/methods.js.map +0 -1
  111. package/api/parse-links.d.ts +0 -5
  112. package/api/parse-links.js +0 -23
  113. package/api/parse-links.js.map +0 -1
  114. package/api/parse-response.d.ts +0 -5
  115. package/api/parse-response.js +0 -36
  116. package/api/parse-response.js.map +0 -1
  117. package/api/representations.d.ts +0 -202
  118. package/api/representations.js +0 -3
  119. package/api/representations.js.map +0 -1
  120. package/api/request.d.ts +0 -12
  121. package/api/request.js +0 -33
  122. package/api/request.js.map +0 -1
  123. package/api.d.ts +0 -13
  124. package/api.js +0 -46
  125. package/api.js.map +0 -1
  126. package/applications/Applications.d.ts +0 -2
  127. package/applications/Applications.js +0 -53
  128. package/applications/Applications.js.map +0 -1
  129. package/components/datalist/EmptyRow.d.ts +0 -5
  130. package/components/datalist/EmptyRow.js +0 -20
  131. package/components/datalist/EmptyRow.js.map +0 -1
  132. package/components/page/Page.d.ts +0 -7
  133. package/components/page/Page.js +0 -6
  134. package/components/page/Page.js.map +0 -1
  135. package/content/ContentComponent.d.ts +0 -2
  136. package/content/ContentComponent.js +0 -36
  137. package/content/ContentComponent.js.map +0 -1
  138. package/content/fetchContent.d.ts +0 -3
  139. package/content/fetchContent.js +0 -6
  140. package/content/fetchContent.js.map +0 -1
  141. package/environment.d.ts +0 -26
  142. package/environment.js +0 -3
  143. package/environment.js.map +0 -1
  144. package/groups/Groups.d.ts +0 -2
  145. package/groups/Groups.js +0 -45
  146. package/groups/Groups.js.map +0 -1
  147. package/i18n.d.ts +0 -4
  148. package/i18n.js +0 -32
  149. package/i18n.js.map +0 -1
  150. package/oid4vci/Oid4Vci.d.ts +0 -2
  151. package/oid4vci/Oid4Vci.js +0 -54
  152. package/oid4vci/Oid4Vci.js.map +0 -1
  153. package/organizations/Organizations.d.ts +0 -2
  154. package/organizations/Organizations.js +0 -19
  155. package/organizations/Organizations.js.map +0 -1
  156. package/personal-info/PersonalInfo.d.ts +0 -2
  157. package/personal-info/PersonalInfo.js +0 -69
  158. package/personal-info/PersonalInfo.js.map +0 -1
  159. package/public/content.d.ts +0 -37
  160. package/public/content.js +0 -50
  161. package/public/content.js.map +0 -1
  162. package/resources/EditTheResource.d.ts +0 -8
  163. package/resources/EditTheResource.js +0 -37
  164. package/resources/EditTheResource.js.map +0 -1
  165. package/resources/PermissionRequest.d.ts +0 -7
  166. package/resources/PermissionRequest.js +0 -40
  167. package/resources/PermissionRequest.js.map +0 -1
  168. package/resources/ResourceToolbar.d.ts +0 -12
  169. package/resources/ResourceToolbar.js +0 -24
  170. package/resources/ResourceToolbar.js.map +0 -1
  171. package/resources/Resources.d.ts +0 -2
  172. package/resources/Resources.js +0 -13
  173. package/resources/Resources.js.map +0 -1
  174. package/resources/ResourcesTab.d.ts +0 -5
  175. package/resources/ResourcesTab.js +0 -104
  176. package/resources/ResourcesTab.js.map +0 -1
  177. package/resources/ShareTheResource.d.ts +0 -9
  178. package/resources/ShareTheResource.js +0 -71
  179. package/resources/ShareTheResource.js.map +0 -1
  180. package/resources/SharedWith.d.ts +0 -6
  181. package/resources/SharedWith.js +0 -8
  182. package/resources/SharedWith.js.map +0 -1
  183. package/root/ErrorPage.d.ts +0 -5
  184. package/root/ErrorPage.js +0 -29
  185. package/root/ErrorPage.js.map +0 -1
  186. package/root/Header.d.ts +0 -1
  187. package/root/Header.js +0 -31
  188. package/root/Header.js.map +0 -1
  189. package/root/PageNav.d.ts +0 -22
  190. package/root/PageNav.js +0 -47
  191. package/root/PageNav.js.map +0 -1
  192. package/root/Root.d.ts +0 -1
  193. package/root/Root.js +0 -12
  194. package/root/Root.js.map +0 -1
  195. package/routes.d.ts +0 -16
  196. package/routes.js +0 -75
  197. package/routes.js.map +0 -1
  198. package/src/KcAccountUi.tsx +0 -25
  199. package/src/content/fetchContent.ts +0 -13
  200. package/src/global.d.ts +0 -9
  201. package/src/public/logo.svg +0 -1
  202. package/src/root/header.module.css +0 -3
  203. package/src/ui-shared/alerts/AlertPanel.tsx +0 -43
  204. package/src/ui-shared/alerts/Alerts.tsx +0 -82
  205. package/src/ui-shared/buttons/FormSubmitButton.tsx +0 -47
  206. package/src/ui-shared/context/ErrorPage.tsx +0 -60
  207. package/src/ui-shared/context/HelpContext.tsx +0 -30
  208. package/src/ui-shared/context/KeycloakContext.tsx +0 -97
  209. package/src/ui-shared/context/environment.ts +0 -50
  210. package/src/ui-shared/continue-cancel/ContinueCancelModal.tsx +0 -75
  211. package/src/ui-shared/controls/FormErrorText.tsx +0 -23
  212. package/src/ui-shared/controls/FormLabel.tsx +0 -40
  213. package/src/ui-shared/controls/HelpItem.tsx +0 -43
  214. package/src/ui-shared/controls/KeycloakSpinner.tsx +0 -12
  215. package/src/ui-shared/controls/NumberControl.tsx +0 -93
  216. package/src/ui-shared/controls/OrganizationTable.tsx +0 -122
  217. package/src/ui-shared/controls/PasswordControl.tsx +0 -71
  218. package/src/ui-shared/controls/PasswordInput.tsx +0 -50
  219. package/src/ui-shared/controls/SwitchControl.tsx +0 -67
  220. package/src/ui-shared/controls/TextAreaControl.tsx +0 -60
  221. package/src/ui-shared/controls/TextControl.tsx +0 -75
  222. package/src/ui-shared/controls/keycloak-text-area/KeycloakTextArea.tsx +0 -23
  223. package/src/ui-shared/controls/select-control/SelectControl.tsx +0 -75
  224. package/src/ui-shared/controls/select-control/SingleSelectControl.tsx +0 -109
  225. package/src/ui-shared/controls/select-control/TypeaheadSelectControl.tsx +0 -285
  226. package/src/ui-shared/controls/table/KeycloakDataTable.tsx +0 -597
  227. package/src/ui-shared/controls/table/ListEmptyState.tsx +0 -86
  228. package/src/ui-shared/controls/table/PaginatingTableToolbar.tsx +0 -106
  229. package/src/ui-shared/controls/table/TableToolbar.tsx +0 -92
  230. package/src/ui-shared/icons/IconMapper.tsx +0 -63
  231. package/src/ui-shared/index.ts +0 -1
  232. package/src/ui-shared/main.ts +0 -96
  233. package/src/ui-shared/masthead/DefaultAvatar.tsx +0 -109
  234. package/src/ui-shared/masthead/KeycloakDropdown.tsx +0 -48
  235. package/src/ui-shared/masthead/Masthead.tsx +0 -161
  236. package/src/ui-shared/scroll-form/FormPanel.tsx +0 -29
  237. package/src/ui-shared/scroll-form/FormTitle.tsx +0 -28
  238. package/src/ui-shared/scroll-form/ScrollForm.tsx +0 -98
  239. package/src/ui-shared/scroll-form/ScrollPanel.tsx +0 -21
  240. package/src/ui-shared/scroll-form/form-title.module.css +0 -4
  241. package/src/ui-shared/scroll-form/scroll-form.module.css +0 -8
  242. package/src/ui-shared/select/KeycloakSelect.tsx +0 -49
  243. package/src/ui-shared/select/SingleSelect.tsx +0 -87
  244. package/src/ui-shared/select/TypeaheadSelect.tsx +0 -198
  245. package/src/ui-shared/user-profile/LocaleSelector.tsx +0 -51
  246. package/src/ui-shared/user-profile/MultiInputComponent.tsx +0 -146
  247. package/src/ui-shared/user-profile/OptionsComponent.tsx +0 -63
  248. package/src/ui-shared/user-profile/SelectComponent.tsx +0 -109
  249. package/src/ui-shared/user-profile/TextAreaComponent.tsx +0 -23
  250. package/src/ui-shared/user-profile/TextComponent.tsx +0 -32
  251. package/src/ui-shared/user-profile/UserProfileFields.tsx +0 -243
  252. package/src/ui-shared/user-profile/UserProfileGroup.tsx +0 -71
  253. package/src/ui-shared/user-profile/utils.ts +0 -170
  254. package/src/ui-shared/utils/ErrorBoundary.tsx +0 -77
  255. package/src/ui-shared/utils/createNamedContext.ts +0 -11
  256. package/src/ui-shared/utils/darkMode.ts +0 -19
  257. package/src/ui-shared/utils/errors.ts +0 -55
  258. package/src/ui-shared/utils/generateId.ts +0 -1
  259. package/src/ui-shared/utils/getRuleValue.ts +0 -17
  260. package/src/ui-shared/utils/isDefined.ts +0 -3
  261. package/src/ui-shared/utils/useFetch.ts +0 -44
  262. package/src/ui-shared/utils/useRequiredContext.ts +0 -24
  263. package/src/ui-shared/utils/useSetTimeout.ts +0 -40
  264. package/src/ui-shared/utils/useStorageItem.ts +0 -51
  265. package/src/ui-shared/utils/useStoredState.ts +0 -38
  266. package/ui-shared/alerts/AlertPanel.d.ts +0 -6
  267. package/ui-shared/alerts/AlertPanel.js +0 -6
  268. package/ui-shared/alerts/AlertPanel.js.map +0 -1
  269. package/ui-shared/alerts/Alerts.d.ts +0 -16
  270. package/ui-shared/alerts/Alerts.js +0 -37
  271. package/ui-shared/alerts/Alerts.js.map +0 -1
  272. package/ui-shared/buttons/FormSubmitButton.d.ts +0 -10
  273. package/ui-shared/buttons/FormSubmitButton.js +0 -26
  274. package/ui-shared/buttons/FormSubmitButton.js.map +0 -1
  275. package/ui-shared/context/ErrorPage.d.ts +0 -5
  276. package/ui-shared/context/ErrorPage.js +0 -24
  277. package/ui-shared/context/ErrorPage.js.map +0 -1
  278. package/ui-shared/context/HelpContext.d.ts +0 -9
  279. package/ui-shared/context/HelpContext.js +0 -14
  280. package/ui-shared/context/HelpContext.js.map +0 -1
  281. package/ui-shared/context/KeycloakContext.d.ts +0 -12
  282. package/ui-shared/context/KeycloakContext.js +0 -53
  283. package/ui-shared/context/KeycloakContext.js.map +0 -1
  284. package/ui-shared/context/environment.d.ts +0 -36
  285. package/ui-shared/context/environment.js +0 -27
  286. package/ui-shared/context/environment.js.map +0 -1
  287. package/ui-shared/continue-cancel/ContinueCancelModal.d.ts +0 -15
  288. package/ui-shared/continue-cancel/ContinueCancelModal.js +0 -27
  289. package/ui-shared/continue-cancel/ContinueCancelModal.js.map +0 -1
  290. package/ui-shared/controls/FormErrorText.d.ts +0 -5
  291. package/ui-shared/controls/FormErrorText.js +0 -19
  292. package/ui-shared/controls/FormErrorText.js.map +0 -1
  293. package/ui-shared/controls/FormLabel.d.ts +0 -13
  294. package/ui-shared/controls/FormLabel.js +0 -20
  295. package/ui-shared/controls/FormLabel.js.map +0 -1
  296. package/ui-shared/controls/HelpItem.d.ts +0 -9
  297. package/ui-shared/controls/HelpItem.js +0 -9
  298. package/ui-shared/controls/HelpItem.js.map +0 -1
  299. package/ui-shared/controls/KeycloakSpinner.d.ts +0 -1
  300. package/ui-shared/controls/KeycloakSpinner.js +0 -8
  301. package/ui-shared/controls/KeycloakSpinner.js.map +0 -1
  302. package/ui-shared/controls/NumberControl.d.ts +0 -13
  303. package/ui-shared/controls/NumberControl.js +0 -33
  304. package/ui-shared/controls/NumberControl.js.map +0 -1
  305. package/ui-shared/controls/OrganizationTable.d.ts +0 -16
  306. package/ui-shared/controls/OrganizationTable.js +0 -45
  307. package/ui-shared/controls/OrganizationTable.js.map +0 -1
  308. package/ui-shared/controls/PasswordControl.d.ts +0 -9
  309. package/ui-shared/controls/PasswordControl.js +0 -25
  310. package/ui-shared/controls/PasswordControl.js.map +0 -1
  311. package/ui-shared/controls/PasswordInput.d.ts +0 -7
  312. package/ui-shared/controls/PasswordInput.js +0 -25
  313. package/ui-shared/controls/PasswordInput.js.map +0 -1
  314. package/ui-shared/controls/SwitchControl.d.ts +0 -11
  315. package/ui-shared/controls/SwitchControl.js +0 -29
  316. package/ui-shared/controls/SwitchControl.js.map +0 -1
  317. package/ui-shared/controls/TextAreaControl.d.ts +0 -8
  318. package/ui-shared/controls/TextAreaControl.js +0 -12
  319. package/ui-shared/controls/TextAreaControl.js.map +0 -1
  320. package/ui-shared/controls/TextControl.d.ts +0 -11
  321. package/ui-shared/controls/TextControl.js +0 -24
  322. package/ui-shared/controls/TextControl.js.map +0 -1
  323. package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.d.ts +0 -4
  324. package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.js +0 -5
  325. package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.js.map +0 -1
  326. package/ui-shared/controls/select-control/SelectControl.d.ts +0 -31
  327. package/ui-shared/controls/select-control/SelectControl.js +0 -28
  328. package/ui-shared/controls/select-control/SelectControl.js.map +0 -1
  329. package/ui-shared/controls/select-control/SingleSelectControl.d.ts +0 -3
  330. package/ui-shared/controls/select-control/SingleSelectControl.js +0 -43
  331. package/ui-shared/controls/select-control/SingleSelectControl.js.map +0 -1
  332. package/ui-shared/controls/select-control/TypeaheadSelectControl.d.ts +0 -3
  333. package/ui-shared/controls/select-control/TypeaheadSelectControl.js +0 -140
  334. package/ui-shared/controls/select-control/TypeaheadSelectControl.js.map +0 -1
  335. package/ui-shared/controls/table/KeycloakDataTable.d.ts +0 -64
  336. package/ui-shared/controls/table/KeycloakDataTable.js +0 -279
  337. package/ui-shared/controls/table/KeycloakDataTable.js.map +0 -1
  338. package/ui-shared/controls/table/ListEmptyState.d.ts +0 -20
  339. package/ui-shared/controls/table/ListEmptyState.js +0 -11
  340. package/ui-shared/controls/table/ListEmptyState.js.map +0 -1
  341. package/ui-shared/controls/table/PaginatingTableToolbar.d.ts +0 -21
  342. package/ui-shared/controls/table/PaginatingTableToolbar.js +0 -27
  343. package/ui-shared/controls/table/PaginatingTableToolbar.js.map +0 -1
  344. package/ui-shared/controls/table/TableToolbar.d.ts +0 -12
  345. package/ui-shared/controls/table/TableToolbar.js +0 -30
  346. package/ui-shared/controls/table/TableToolbar.js.map +0 -1
  347. package/ui-shared/icons/IconMapper.d.ts +0 -5
  348. package/ui-shared/icons/IconMapper.js +0 -40
  349. package/ui-shared/icons/IconMapper.js.map +0 -1
  350. package/ui-shared/index.d.ts +0 -1
  351. package/ui-shared/index.js +0 -2
  352. package/ui-shared/index.js.map +0 -1
  353. package/ui-shared/main.d.ts +0 -45
  354. package/ui-shared/main.js +0 -41
  355. package/ui-shared/main.js.map +0 -1
  356. package/ui-shared/masthead/DefaultAvatar.d.ts +0 -7
  357. package/ui-shared/masthead/DefaultAvatar.js +0 -26
  358. package/ui-shared/masthead/DefaultAvatar.js.map +0 -1
  359. package/ui-shared/masthead/KeycloakDropdown.d.ts +0 -10
  360. package/ui-shared/masthead/KeycloakDropdown.js +0 -23
  361. package/ui-shared/masthead/KeycloakDropdown.js.map +0 -1
  362. package/ui-shared/masthead/Masthead.d.ts +0 -19
  363. package/ui-shared/masthead/Masthead.js +0 -55
  364. package/ui-shared/masthead/Masthead.js.map +0 -1
  365. package/ui-shared/scroll-form/FormPanel.d.ts +0 -8
  366. package/ui-shared/scroll-form/FormPanel.js +0 -9
  367. package/ui-shared/scroll-form/FormPanel.js.map +0 -1
  368. package/ui-shared/scroll-form/FormTitle.d.ts +0 -8
  369. package/ui-shared/scroll-form/FormTitle.js +0 -19
  370. package/ui-shared/scroll-form/FormTitle.js.map +0 -1
  371. package/ui-shared/scroll-form/ScrollForm.d.ts +0 -15
  372. package/ui-shared/scroll-form/ScrollForm.js +0 -38
  373. package/ui-shared/scroll-form/ScrollForm.js.map +0 -1
  374. package/ui-shared/scroll-form/ScrollPanel.d.ts +0 -7
  375. package/ui-shared/scroll-form/ScrollPanel.js +0 -18
  376. package/ui-shared/scroll-form/ScrollPanel.js.map +0 -1
  377. package/ui-shared/scroll-form/form-title.module.css +0 -4
  378. package/ui-shared/scroll-form/scroll-form.module.css +0 -8
  379. package/ui-shared/select/KeycloakSelect.d.ts +0 -30
  380. package/ui-shared/select/KeycloakSelect.js +0 -31
  381. package/ui-shared/select/KeycloakSelect.js.map +0 -1
  382. package/ui-shared/select/SingleSelect.d.ts +0 -4
  383. package/ui-shared/select/SingleSelect.js +0 -46
  384. package/ui-shared/select/SingleSelect.js.map +0 -1
  385. package/ui-shared/select/TypeaheadSelect.d.ts +0 -2
  386. package/ui-shared/select/TypeaheadSelect.js +0 -96
  387. package/ui-shared/select/TypeaheadSelect.js.map +0 -1
  388. package/ui-shared/user-profile/LocaleSelector.d.ts +0 -7
  389. package/ui-shared/user-profile/LocaleSelector.js +0 -28
  390. package/ui-shared/user-profile/LocaleSelector.js.map +0 -1
  391. package/ui-shared/user-profile/MultiInputComponent.d.ts +0 -15
  392. package/ui-shared/user-profile/MultiInputComponent.js +0 -61
  393. package/ui-shared/user-profile/MultiInputComponent.js.map +0 -1
  394. package/ui-shared/user-profile/OptionsComponent.d.ts +0 -2
  395. package/ui-shared/user-profile/OptionsComponent.js +0 -29
  396. package/ui-shared/user-profile/OptionsComponent.js.map +0 -1
  397. package/ui-shared/user-profile/SelectComponent.d.ts +0 -2
  398. package/ui-shared/user-profile/SelectComponent.js +0 -56
  399. package/ui-shared/user-profile/SelectComponent.js.map +0 -1
  400. package/ui-shared/user-profile/TextAreaComponent.d.ts +0 -2
  401. package/ui-shared/user-profile/TextAreaComponent.js +0 -11
  402. package/ui-shared/user-profile/TextAreaComponent.js.map +0 -1
  403. package/ui-shared/user-profile/TextComponent.d.ts +0 -2
  404. package/ui-shared/user-profile/TextComponent.js +0 -14
  405. package/ui-shared/user-profile/TextComponent.js.map +0 -1
  406. package/ui-shared/user-profile/UserProfileFields.d.ts +0 -37
  407. package/ui-shared/user-profile/UserProfileFields.js +0 -94
  408. package/ui-shared/user-profile/UserProfileFields.js.map +0 -1
  409. package/ui-shared/user-profile/UserProfileGroup.d.ts +0 -12
  410. package/ui-shared/user-profile/UserProfileGroup.js +0 -15
  411. package/ui-shared/user-profile/UserProfileGroup.js.map +0 -1
  412. package/ui-shared/user-profile/utils.d.ts +0 -32
  413. package/ui-shared/user-profile/utils.js +0 -84
  414. package/ui-shared/user-profile/utils.js.map +0 -1
  415. package/ui-shared/utils/ErrorBoundary.d.ts +0 -26
  416. package/ui-shared/utils/ErrorBoundary.js +0 -29
  417. package/ui-shared/utils/ErrorBoundary.js.map +0 -1
  418. package/ui-shared/utils/createNamedContext.d.ts +0 -3
  419. package/ui-shared/utils/createNamedContext.js +0 -7
  420. package/ui-shared/utils/createNamedContext.js.map +0 -1
  421. package/ui-shared/utils/darkMode.d.ts +0 -1
  422. package/ui-shared/utils/darkMode.js +0 -16
  423. package/ui-shared/utils/darkMode.js.map +0 -1
  424. package/ui-shared/utils/errors.d.ts +0 -4
  425. package/ui-shared/utils/errors.js +0 -42
  426. package/ui-shared/utils/errors.js.map +0 -1
  427. package/ui-shared/utils/generateId.d.ts +0 -1
  428. package/ui-shared/utils/generateId.js +0 -2
  429. package/ui-shared/utils/generateId.js.map +0 -1
  430. package/ui-shared/utils/getRuleValue.d.ts +0 -2
  431. package/ui-shared/utils/getRuleValue.js +0 -12
  432. package/ui-shared/utils/getRuleValue.js.map +0 -1
  433. package/ui-shared/utils/isDefined.d.ts +0 -1
  434. package/ui-shared/utils/isDefined.js +0 -4
  435. package/ui-shared/utils/isDefined.js.map +0 -1
  436. package/ui-shared/utils/useFetch.d.ts +0 -17
  437. package/ui-shared/utils/useFetch.js +0 -38
  438. package/ui-shared/utils/useFetch.js.map +0 -1
  439. package/ui-shared/utils/useRequiredContext.d.ts +0 -9
  440. package/ui-shared/utils/useRequiredContext.js +0 -17
  441. package/ui-shared/utils/useRequiredContext.js.map +0 -1
  442. package/ui-shared/utils/useSetTimeout.d.ts +0 -1
  443. package/ui-shared/utils/useSetTimeout.js +0 -32
  444. package/ui-shared/utils/useSetTimeout.js.map +0 -1
  445. package/ui-shared/utils/useStorageItem.d.ts +0 -10
  446. package/ui-shared/utils/useStorageItem.js +0 -40
  447. package/ui-shared/utils/useStorageItem.js.map +0 -1
  448. package/ui-shared/utils/useStoredState.d.ts +0 -13
  449. package/ui-shared/utils/useStoredState.js +0 -21
  450. package/ui-shared/utils/useStoredState.js.map +0 -1
  451. package/utils/formatDate.d.ts +0 -4
  452. package/utils/formatDate.js +0 -12
  453. package/utils/formatDate.js.map +0 -1
  454. package/utils/joinPath.d.ts +0 -1
  455. package/utils/joinPath.js +0 -18
  456. package/utils/joinPath.js.map +0 -1
  457. package/utils/useAccountAlerts.d.ts +0 -4
  458. package/utils/useAccountAlerts.js +0 -19
  459. package/utils/useAccountAlerts.js.map +0 -1
  460. package/utils/usePromise.d.ts +0 -41
  461. package/utils/usePromise.js +0 -59
  462. package/utils/usePromise.js.map +0 -1
  463. /package/{public → keycloak-theme/account/assets}/logo.svg +0 -0
  464. /package/{root → keycloak-theme/account/root}/header.module.css +0 -0
@@ -1,597 +0,0 @@
1
- import { Button, ButtonVariant, ToolbarItem } from "@patternfly/react-core";
2
- import type { SVGIconProps } from "@patternfly/react-icons/dist/js/createIcon";
3
- import {
4
- ActionsColumn,
5
- ExpandableRowContent,
6
- IAction,
7
- IActions,
8
- IActionsResolver,
9
- IFormatter,
10
- IRow,
11
- IRowCell,
12
- ITransform,
13
- Table,
14
- TableProps,
15
- TableVariant,
16
- Tbody,
17
- Td,
18
- Th,
19
- Thead,
20
- Tr,
21
- } from "@patternfly/react-table";
22
- import { cloneDeep, differenceBy, get } from "lodash-es";
23
- import {
24
- ComponentClass,
25
- ReactNode,
26
- isValidElement,
27
- useEffect,
28
- useId,
29
- useMemo,
30
- useRef,
31
- useState,
32
- type JSX,
33
- } from "react";
34
- import { useTranslation } from "react-i18next";
35
-
36
- import { useStoredState } from "@keycloakify/keycloak-account-ui/ui-shared/utils/useStoredState";
37
- import { useFetch } from "@keycloakify/keycloak-account-ui/ui-shared/utils/useFetch";
38
- import { ListEmptyState } from "@keycloakify/keycloak-account-ui/ui-shared/controls/table/ListEmptyState";
39
- import { PaginatingTableToolbar } from "@keycloakify/keycloak-account-ui/ui-shared/controls/table/PaginatingTableToolbar";
40
- import { SyncAltIcon } from "@patternfly/react-icons";
41
- import { KeycloakSpinner } from "@keycloakify/keycloak-account-ui/ui-shared/controls/KeycloakSpinner";
42
-
43
- type TitleCell = { title: JSX.Element };
44
- type Cell<T> = keyof T | JSX.Element | TitleCell;
45
-
46
- type BaseRow<T> = {
47
- data: T;
48
- cells: Cell<T>[];
49
- };
50
-
51
- type Row<T> = BaseRow<T> & {
52
- selected: boolean;
53
- isOpen?: boolean;
54
- disableSelection: boolean;
55
- disableActions: boolean;
56
- };
57
-
58
- type SubRow<T> = BaseRow<T> & {
59
- parent: number;
60
- };
61
-
62
- type DataTableProps<T> = {
63
- ariaLabelKey: string;
64
- columns: Field<T>[];
65
- rows: (Row<T> | SubRow<T>)[];
66
- actions?: IActions;
67
- actionResolver?: IActionsResolver;
68
- onSelect?: (isSelected: boolean, rowIndex: number) => void;
69
- onCollapse?: (isOpen: boolean, rowIndex: number) => void;
70
- canSelectAll: boolean;
71
- isNotCompact?: boolean;
72
- isRadio?: boolean;
73
- };
74
-
75
- type CellRendererProps = {
76
- row: IRow;
77
- };
78
-
79
- const CellRenderer = ({ row }: CellRendererProps) => {
80
- const isRow = (c: ReactNode | IRowCell): c is IRowCell =>
81
- !!c && (c as IRowCell).title !== undefined;
82
- return row.cells!.map((c, i) => (
83
- <Td key={`cell-${i}`}>{(isRow(c) ? c.title : c) as ReactNode}</Td>
84
- ));
85
- };
86
-
87
- function DataTable<T>({
88
- columns,
89
- rows,
90
- actions,
91
- actionResolver,
92
- ariaLabelKey,
93
- onSelect,
94
- onCollapse,
95
- canSelectAll,
96
- isNotCompact,
97
- isRadio,
98
- ...props
99
- }: DataTableProps<T>) {
100
- const { t } = useTranslation();
101
-
102
- const [selectedRows, setSelectedRows] = useState<boolean[]>([]);
103
- const [expandedRows, setExpandedRows] = useState<boolean[]>([]);
104
-
105
- const updateState = (rowIndex: number, isSelected: boolean) => {
106
- const items = [
107
- ...(rowIndex === -1 ? Array(rows.length).fill(isSelected) : selectedRows),
108
- ];
109
- items[rowIndex] = isSelected;
110
- setSelectedRows(items);
111
- };
112
-
113
- useEffect(() => {
114
- if (canSelectAll) {
115
- const selectAllCheckbox = document.getElementsByName("check-all").item(0);
116
- if (selectAllCheckbox) {
117
- const checkbox = selectAllCheckbox as HTMLInputElement;
118
- const selected = selectedRows.filter((r) => r === true);
119
- checkbox.indeterminate =
120
- selected.length < rows.length && selected.length > 0;
121
- }
122
- }
123
- }, [selectedRows]);
124
-
125
- return (
126
- <Table
127
- {...props}
128
- variant={isNotCompact ? undefined : TableVariant.compact}
129
- aria-label={t(ariaLabelKey)}
130
- >
131
- <Thead>
132
- <Tr>
133
- {onCollapse && <Th />}
134
- {canSelectAll && (
135
- <Th
136
- select={
137
- !isRadio
138
- ? {
139
- onSelect: (_, isSelected, rowIndex) => {
140
- onSelect!(isSelected, rowIndex);
141
- updateState(-1, isSelected);
142
- },
143
- isSelected:
144
- selectedRows.filter((r) => r === true).length ===
145
- rows.length,
146
- }
147
- : undefined
148
- }
149
- />
150
- )}
151
- {columns.map((column) => (
152
- <Th
153
- key={column.displayKey}
154
- className={column.transforms?.[0]().className}
155
- >
156
- {t(column.displayKey || column.name)}
157
- </Th>
158
- ))}
159
- </Tr>
160
- </Thead>
161
- {!onCollapse ? (
162
- <Tbody>
163
- {(rows as IRow[]).map((row, index) => (
164
- <Tr key={index} isExpanded={expandedRows[index]}>
165
- {onSelect && (
166
- <Td
167
- select={{
168
- rowIndex: index,
169
- onSelect: (_, isSelected, rowIndex) => {
170
- onSelect!(isSelected, rowIndex);
171
- updateState(rowIndex, isSelected);
172
- },
173
- isSelected: selectedRows[index],
174
- variant: isRadio ? "radio" : "checkbox",
175
- }}
176
- />
177
- )}
178
- <CellRenderer row={row} />
179
- {(actions || actionResolver) && (
180
- <Td isActionCell>
181
- <ActionsColumn
182
- items={actions || actionResolver?.(row, {})!}
183
- extraData={{ rowIndex: index }}
184
- />
185
- </Td>
186
- )}
187
- </Tr>
188
- ))}
189
- </Tbody>
190
- ) : (
191
- (rows as IRow[]).map((row, index) => (
192
- <Tbody key={index}>
193
- {index % 2 === 0 ? (
194
- <Tr>
195
- <Td
196
- expand={{
197
- isExpanded: !!expandedRows[index],
198
- rowIndex: index,
199
- expandId: `${index}`,
200
- onToggle: (_, rowIndex, isOpen) => {
201
- onCollapse(isOpen, rowIndex);
202
- const expand = [...expandedRows];
203
- expand[index] = isOpen;
204
- setExpandedRows(expand);
205
- },
206
- }}
207
- />
208
- <CellRenderer row={row} />
209
- </Tr>
210
- ) : (
211
- <Tr isExpanded={!!expandedRows[index - 1]}>
212
- <Td />
213
- <Td colSpan={columns.length}>
214
- <ExpandableRowContent>
215
- <CellRenderer row={row} />
216
- </ExpandableRowContent>
217
- </Td>
218
- </Tr>
219
- )}
220
- </Tbody>
221
- ))
222
- )}
223
- </Table>
224
- );
225
- }
226
-
227
- export type Field<T> = {
228
- name: string;
229
- displayKey?: string;
230
- cellFormatters?: IFormatter[];
231
- transforms?: ITransform[];
232
- cellRenderer?: (row: T) => JSX.Element | string;
233
- };
234
-
235
- export type DetailField<T> = {
236
- name: string;
237
- enabled?: (row: T) => boolean;
238
- cellRenderer?: (row: T) => JSX.Element | string;
239
- };
240
-
241
- export type Action<T> = IAction & {
242
- onRowClick?: (row: T) => Promise<boolean | void> | void;
243
- };
244
-
245
- export type LoaderFunction<T> = (
246
- first?: number,
247
- max?: number,
248
- search?: string,
249
- ) => Promise<T[]>;
250
-
251
- export type DataListProps<T> = Omit<
252
- TableProps,
253
- "rows" | "cells" | "onSelect"
254
- > & {
255
- loader: T[] | LoaderFunction<T>;
256
- onSelect?: (value: T[]) => void;
257
- canSelectAll?: boolean;
258
- detailColumns?: DetailField<T>[];
259
- isRowDisabled?: (value: T) => boolean;
260
- isPaginated?: boolean;
261
- ariaLabelKey: string;
262
- searchPlaceholderKey?: string;
263
- columns: Field<T>[];
264
- actions?: Action<T>[];
265
- actionResolver?: IActionsResolver;
266
- searchTypeComponent?: ReactNode;
267
- toolbarItem?: ReactNode;
268
- subToolbar?: ReactNode;
269
- emptyState?: ReactNode;
270
- icon?: ComponentClass<SVGIconProps>;
271
- isNotCompact?: boolean;
272
- isRadio?: boolean;
273
- isSearching?: boolean;
274
- };
275
-
276
- /**
277
- * A generic component that can be used to show the initial list most sections have. Takes care of the loading of the date and filtering.
278
- * All you have to define is how the columns are displayed.
279
- * @example
280
- * <KeycloakDataTable columns={[
281
- * {
282
- * name: "clientId", //name of the field from the array of object the loader returns to display in this column
283
- * displayKey: "clientId", //i18n key to use to lookup the name of the column header
284
- * cellRenderer: ClientDetailLink, //optionally you can use a component to render the column when you don't want just the content of the field, the whole row / entire object is passed in.
285
- * }
286
- * ]}
287
- * @param {DataListProps} props - The properties.
288
- * @param {string} props.ariaLabelKey - The aria label key i18n key to lookup the label
289
- * @param {string} props.searchPlaceholderKey - The i18n key to lookup the placeholder for the search box
290
- * @param {boolean} props.isPaginated - if true the the loader will be called with first, max and search and a pager will be added in the header
291
- * @param {(first?: number, max?: number, search?: string) => Promise<T[]>} props.loader - loader function that will fetch the data to display first, max and search are only applicable when isPaginated = true
292
- * @param {Field<T>} props.columns - definition of the columns
293
- * @param {Field<T>} props.detailColumns - definition of the columns expandable columns
294
- * @param {Action[]} props.actions - the actions that appear on the row
295
- * @param {IActionsResolver} props.actionResolver Resolver for the given action
296
- * @param {ReactNode} props.toolbarItem - Toolbar items that appear on the top of the table {@link toolbarItem}
297
- * @param {ReactNode} props.emptyState - ReactNode show when the list is empty could be any component but best to use {@link ListEmptyState}
298
- */
299
- export function KeycloakDataTable<T>({
300
- ariaLabelKey,
301
- searchPlaceholderKey,
302
- isPaginated = false,
303
- onSelect,
304
- canSelectAll = false,
305
- isNotCompact,
306
- isRadio,
307
- detailColumns,
308
- isRowDisabled,
309
- loader,
310
- columns,
311
- actions,
312
- actionResolver,
313
- searchTypeComponent,
314
- toolbarItem,
315
- subToolbar,
316
- emptyState,
317
- icon,
318
- isSearching = false,
319
- ...props
320
- }: DataListProps<T>) {
321
- const { t } = useTranslation();
322
- const [selected, setSelected] = useState<T[]>([]);
323
- const [rows, setRows] = useState<(Row<T> | SubRow<T>)[]>();
324
- const [unPaginatedData, setUnPaginatedData] = useState<T[]>();
325
- const [loading, setLoading] = useState(false);
326
-
327
- const [defaultPageSize, setDefaultPageSize] = useStoredState(
328
- localStorage,
329
- "pageSize",
330
- 10,
331
- );
332
-
333
- const [max, setMax] = useState(defaultPageSize);
334
- const [first, setFirst] = useState(0);
335
- const [search, setSearch] = useState<string>("");
336
- const prevSearch = useRef<string>();
337
-
338
- const [key, setKey] = useState(0);
339
- const prevKey = useRef<number>();
340
- const refresh = () => setKey(key + 1);
341
- const id = useId();
342
-
343
- const renderCell = (columns: (Field<T> | DetailField<T>)[], value: T) => {
344
- return columns.map((col) => {
345
- if ("cellFormatters" in col) {
346
- const v = get(value, col.name);
347
- return col.cellFormatters?.reduce((s, f) => f(s), v);
348
- }
349
- if (col.cellRenderer) {
350
- const Component = col.cellRenderer;
351
- //@ts-ignore
352
- return { title: <Component {...value} /> };
353
- }
354
- return get(value, col.name);
355
- });
356
- };
357
-
358
- const convertToColumns = (data: T[]): (Row<T> | SubRow<T>)[] => {
359
- const isDetailColumnsEnabled = (value: T) =>
360
- detailColumns?.[0]?.enabled?.(value);
361
- return data
362
- .map((value, index) => {
363
- const disabledRow = isRowDisabled ? isRowDisabled(value) : false;
364
- const row: (Row<T> | SubRow<T>)[] = [
365
- {
366
- data: value,
367
- disableSelection: disabledRow,
368
- disableActions: disabledRow,
369
- selected: !!selected.find((v) => get(v, "id") === get(value, "id")),
370
- isOpen: isDetailColumnsEnabled(value) ? false : undefined,
371
- cells: renderCell(columns, value),
372
- },
373
- ];
374
- if (detailColumns) {
375
- row.push({
376
- parent: index * 2,
377
- cells: isDetailColumnsEnabled(value)
378
- ? renderCell(detailColumns!, value)
379
- : [],
380
- } as SubRow<T>);
381
- }
382
- return row;
383
- })
384
- .flat();
385
- };
386
-
387
- const getNodeText = (node: Cell<T>): string => {
388
- if (["string", "number"].includes(typeof node)) {
389
- return node!.toString();
390
- }
391
- if (node instanceof Array) {
392
- return node.map(getNodeText).join("");
393
- }
394
- if (typeof node === "object") {
395
- return getNodeText(
396
- isValidElement((node as TitleCell).title)
397
- ? (node as TitleCell).title.props
398
- : Object.values(node),
399
- );
400
- }
401
- return "";
402
- };
403
-
404
- const filteredData = useMemo<(Row<T> | SubRow<T>)[] | undefined>(
405
- () =>
406
- search === "" || isPaginated
407
- ? undefined
408
- : convertToColumns(unPaginatedData || [])
409
- .filter((row) =>
410
- row.cells.some(
411
- (cell) =>
412
- cell &&
413
- getNodeText(cell)
414
- .toLowerCase()
415
- .includes(search.toLowerCase()),
416
- ),
417
- )
418
- .slice(first, first + max + 1),
419
- [search, first, max],
420
- );
421
-
422
- useFetch(
423
- async () => {
424
- setLoading(true);
425
- const newSearch = prevSearch.current === "" && search !== "";
426
-
427
- if (newSearch) {
428
- setFirst(0);
429
- }
430
- prevSearch.current = search;
431
- return typeof loader === "function"
432
- ? key === prevKey.current && unPaginatedData
433
- ? unPaginatedData
434
- : await loader(newSearch ? 0 : first, max + 1, search)
435
- : loader;
436
- },
437
- (data) => {
438
- prevKey.current = key;
439
- if (!isPaginated) {
440
- setUnPaginatedData(data);
441
- if (data.length > first) {
442
- data = data.slice(first, first + max + 1);
443
- } else {
444
- setFirst(0);
445
- }
446
- }
447
-
448
- const result = convertToColumns(data);
449
- setRows(result);
450
- setLoading(false);
451
- },
452
- [
453
- key,
454
- first,
455
- max,
456
- search,
457
- typeof loader !== "function" ? loader : undefined,
458
- ],
459
- );
460
-
461
- const convertAction = () =>
462
- actions &&
463
- cloneDeep(actions).map((action: Action<T>, index: number) => {
464
- delete action.onRowClick;
465
- action.onClick = async (_, rowIndex) => {
466
- const result = await actions[index].onRowClick!(
467
- (filteredData || rows)![rowIndex].data,
468
- );
469
- if (result) {
470
- if (!isPaginated) {
471
- setSearch("");
472
- }
473
- refresh();
474
- }
475
- };
476
- return action;
477
- });
478
-
479
- const _onSelect = (isSelected: boolean, rowIndex: number) => {
480
- const data = filteredData || rows;
481
- if (rowIndex === -1) {
482
- setRows(
483
- data!.map((row) => {
484
- (row as Row<T>).selected = isSelected;
485
- return row;
486
- }),
487
- );
488
- } else {
489
- (data![rowIndex] as Row<T>).selected = isSelected;
490
-
491
- setRows([...rows!]);
492
- }
493
-
494
- // Keeps selected items when paginating
495
- const difference = differenceBy(
496
- selected,
497
- data!.map((row) => row.data),
498
- "id",
499
- );
500
-
501
- // Selected rows are any rows previously selected from a different page, plus current page selections
502
- const selectedRows = [
503
- ...difference,
504
- ...data!.filter((row) => (row as Row<T>).selected).map((row) => row.data),
505
- ];
506
-
507
- setSelected(selectedRows);
508
- onSelect!(selectedRows);
509
- };
510
-
511
- const onCollapse = (isOpen: boolean, rowIndex: number) => {
512
- (data![rowIndex] as Row<T>).isOpen = isOpen;
513
- setRows([...data!]);
514
- };
515
-
516
- const data = filteredData || rows;
517
- const noData = !data || data.length === 0;
518
- const searching = search !== "" || isSearching;
519
- // if we use detail columns there are twice the number of rows
520
- const maxRows = detailColumns ? max * 2 : max;
521
- const rowLength = detailColumns ? (data?.length || 0) / 2 : data?.length || 0;
522
-
523
- return (
524
- <>
525
- {(loading || !noData || searching) && (
526
- <PaginatingTableToolbar
527
- id={id}
528
- count={rowLength}
529
- first={first}
530
- max={max}
531
- onNextClick={setFirst}
532
- onPreviousClick={setFirst}
533
- onPerPageSelect={(first, max) => {
534
- setFirst(first);
535
- setMax(max);
536
- setDefaultPageSize(max);
537
- }}
538
- inputGroupName={
539
- searchPlaceholderKey ? `${ariaLabelKey}input` : undefined
540
- }
541
- inputGroupOnEnter={setSearch}
542
- inputGroupPlaceholder={t(searchPlaceholderKey || "")}
543
- searchTypeComponent={searchTypeComponent}
544
- toolbarItem={
545
- <>
546
- {toolbarItem} <ToolbarItem variant="separator" />{" "}
547
- <ToolbarItem>
548
- <Button variant="link" onClick={refresh}>
549
- <SyncAltIcon /> {t("refresh")}
550
- </Button>
551
- </ToolbarItem>
552
- </>
553
- }
554
- subToolbar={subToolbar}
555
- >
556
- {!loading && !noData && (
557
- <DataTable
558
- {...props}
559
- canSelectAll={canSelectAll}
560
- onSelect={onSelect ? _onSelect : undefined}
561
- onCollapse={detailColumns ? onCollapse : undefined}
562
- actions={convertAction()}
563
- actionResolver={actionResolver}
564
- rows={data.slice(0, maxRows)}
565
- columns={columns}
566
- isNotCompact={isNotCompact}
567
- isRadio={isRadio}
568
- ariaLabelKey={ariaLabelKey}
569
- />
570
- )}
571
- {!loading && noData && searching && (
572
- <ListEmptyState
573
- hasIcon={true}
574
- icon={icon}
575
- isSearchVariant={true}
576
- message={t("noSearchResults")}
577
- instructions={t("noSearchResultsInstructions")}
578
- secondaryActions={
579
- !isSearching
580
- ? [
581
- {
582
- text: t("clearAllFilters"),
583
- onClick: () => setSearch(""),
584
- type: ButtonVariant.link,
585
- },
586
- ]
587
- : []
588
- }
589
- />
590
- )}
591
- {loading && <KeycloakSpinner />}
592
- </PaginatingTableToolbar>
593
- )}
594
- {!loading && noData && !searching && emptyState}
595
- </>
596
- );
597
- }
@@ -1,86 +0,0 @@
1
- import { ComponentClass, MouseEventHandler, ReactNode } from "react";
2
- import {
3
- EmptyState,
4
- EmptyStateIcon,
5
- EmptyStateBody,
6
- Button,
7
- ButtonVariant,
8
- EmptyStateActions,
9
- EmptyStateHeader,
10
- EmptyStateFooter,
11
- } from "@patternfly/react-core";
12
- import type { SVGIconProps } from "@patternfly/react-icons/dist/js/createIcon";
13
- import { PlusCircleIcon, SearchIcon } from "@patternfly/react-icons";
14
-
15
- export type Action = {
16
- text: string;
17
- type?: ButtonVariant;
18
- onClick: MouseEventHandler<HTMLButtonElement>;
19
- };
20
-
21
- export type ListEmptyStateProps = {
22
- message: string;
23
- instructions: ReactNode;
24
- primaryActionText?: string;
25
- onPrimaryAction?: MouseEventHandler<HTMLButtonElement>;
26
- hasIcon?: boolean;
27
- icon?: ComponentClass<SVGIconProps>;
28
- isSearchVariant?: boolean;
29
- secondaryActions?: Action[];
30
- isDisabled?: boolean;
31
- };
32
-
33
- export const ListEmptyState = ({
34
- message,
35
- instructions,
36
- onPrimaryAction,
37
- hasIcon = true,
38
- isSearchVariant,
39
- primaryActionText,
40
- secondaryActions,
41
- icon,
42
- isDisabled = false,
43
- }: ListEmptyStateProps) => {
44
- return (
45
- <EmptyState data-testid="empty-state" variant="lg">
46
- {hasIcon && isSearchVariant ? (
47
- <EmptyStateIcon icon={SearchIcon} />
48
- ) : (
49
- hasIcon && <EmptyStateIcon icon={icon ? icon : PlusCircleIcon} />
50
- )}
51
- <EmptyStateHeader titleText={message} headingLevel="h1" />
52
- <EmptyStateBody>{instructions}</EmptyStateBody>
53
- <EmptyStateFooter>
54
- {primaryActionText && (
55
- <Button
56
- data-testid={`${message
57
- .replace(/\W+/g, "-")
58
- .toLowerCase()}-empty-action`}
59
- variant="primary"
60
- onClick={onPrimaryAction}
61
- isDisabled={isDisabled}
62
- >
63
- {primaryActionText}
64
- </Button>
65
- )}
66
- {secondaryActions && (
67
- <EmptyStateActions>
68
- {secondaryActions.map((action) => (
69
- <Button
70
- key={action.text}
71
- data-testid={`${action.text
72
- .replace(/\W+/g, "-")
73
- .toLowerCase()}-empty-action`}
74
- variant={action.type || ButtonVariant.secondary}
75
- onClick={action.onClick}
76
- isDisabled={isDisabled}
77
- >
78
- {action.text}
79
- </Button>
80
- ))}
81
- </EmptyStateActions>
82
- )}
83
- </EmptyStateFooter>
84
- </EmptyState>
85
- );
86
- };