@strapi/admin 5.52.3 → 5.53.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 (109) hide show
  1. package/dist/admin/admin/src/translations/en.json.js +18 -0
  2. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  3. package/dist/admin/admin/src/translations/en.json.mjs +18 -0
  4. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  5. package/dist/admin/admin/src/utils/getFetchClient.js +118 -43
  6. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  7. package/dist/admin/admin/src/utils/getFetchClient.mjs +118 -45
  8. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  9. package/dist/admin/ee/admin/src/constants.js +6 -0
  10. package/dist/admin/ee/admin/src/constants.js.map +1 -1
  11. package/dist/admin/ee/admin/src/constants.mjs +6 -0
  12. package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
  13. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +31 -3
  14. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js.map +1 -1
  15. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs +33 -5
  16. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
  17. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.js +177 -0
  18. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.js.map +1 -0
  19. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.mjs +175 -0
  20. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.mjs.map +1 -0
  21. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js +173 -0
  22. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js.map +1 -0
  23. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs +151 -0
  24. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs.map +1 -0
  25. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +10 -1
  26. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  27. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +10 -1
  28. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  29. package/dist/admin/index.js +2 -0
  30. package/dist/admin/index.js.map +1 -1
  31. package/dist/admin/index.mjs +1 -1
  32. package/dist/admin/shared/utils/audit-log-export.js +16 -0
  33. package/dist/admin/shared/utils/audit-log-export.js.map +1 -0
  34. package/dist/admin/shared/utils/audit-log-export.mjs +9 -0
  35. package/dist/admin/shared/utils/audit-log-export.mjs.map +1 -0
  36. package/dist/admin/src/utils/getFetchClient.d.ts +9 -2
  37. package/dist/admin/tests/store.d.ts +4 -0
  38. package/dist/admin/tests/utils.d.ts +4 -0
  39. package/dist/ee/admin/src/constants.d.ts +4 -0
  40. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.d.ts +10 -0
  41. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.d.ts +18 -0
  42. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +9 -0
  43. package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts +1 -0
  44. package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts.map +1 -1
  45. package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts.map +1 -1
  46. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts +24 -3
  47. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -1
  48. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +8 -2
  49. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  50. package/dist/ee/server/src/audit-logs/utils/csv.d.ts +5 -0
  51. package/dist/ee/server/src/audit-logs/utils/csv.d.ts.map +1 -0
  52. package/dist/ee/server/src/audit-logs/utils/export-token.d.ts +5 -0
  53. package/dist/ee/server/src/audit-logs/utils/export-token.d.ts.map +1 -0
  54. package/dist/ee/server/src/audit-logs/utils.d.ts +10 -0
  55. package/dist/ee/server/src/audit-logs/utils.d.ts.map +1 -0
  56. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts +2 -0
  57. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts.map +1 -1
  58. package/dist/ee/server/src/config/admin-actions.d.ts.map +1 -1
  59. package/dist/ee/server/src/index.d.ts +1 -0
  60. package/dist/ee/server/src/index.d.ts.map +1 -1
  61. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.js +50 -0
  62. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.js.map +1 -1
  63. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.mjs +51 -1
  64. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.mjs.map +1 -1
  65. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.js +13 -4
  66. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.js.map +1 -1
  67. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.mjs +13 -4
  68. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.mjs.map +1 -1
  69. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js +201 -7
  70. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
  71. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs +201 -8
  72. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
  73. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +119 -34
  74. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  75. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +119 -34
  76. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  77. package/dist/server/ee/server/src/audit-logs/utils/csv.js +33 -0
  78. package/dist/server/ee/server/src/audit-logs/utils/csv.js.map +1 -0
  79. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs +29 -0
  80. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs.map +1 -0
  81. package/dist/server/ee/server/src/audit-logs/utils/export-token.js +33 -0
  82. package/dist/server/ee/server/src/audit-logs/utils/export-token.js.map +1 -0
  83. package/dist/server/ee/server/src/audit-logs/utils/export-token.mjs +29 -0
  84. package/dist/server/ee/server/src/audit-logs/utils/export-token.mjs.map +1 -0
  85. package/dist/server/ee/server/src/audit-logs/utils.js +14 -0
  86. package/dist/server/ee/server/src/audit-logs/utils.js.map +1 -0
  87. package/dist/server/ee/server/src/audit-logs/utils.mjs +12 -0
  88. package/dist/server/ee/server/src/audit-logs/utils.mjs.map +1 -0
  89. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.js +11 -0
  90. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.js.map +1 -1
  91. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.mjs +11 -1
  92. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.mjs.map +1 -1
  93. package/dist/server/ee/server/src/config/admin-actions.js +8 -0
  94. package/dist/server/ee/server/src/config/admin-actions.js.map +1 -1
  95. package/dist/server/ee/server/src/config/admin-actions.mjs +8 -0
  96. package/dist/server/ee/server/src/config/admin-actions.mjs.map +1 -1
  97. package/dist/server/ee/server/src/index.js +10 -0
  98. package/dist/server/ee/server/src/index.js.map +1 -1
  99. package/dist/server/ee/server/src/index.mjs +10 -0
  100. package/dist/server/ee/server/src/index.mjs.map +1 -1
  101. package/dist/server/shared/utils/audit-log-export.js +22 -0
  102. package/dist/server/shared/utils/audit-log-export.js.map +1 -0
  103. package/dist/server/shared/utils/audit-log-export.mjs +12 -0
  104. package/dist/server/shared/utils/audit-log-export.mjs.map +1 -0
  105. package/dist/shared/contracts/audit-logs.d.ts +15 -1
  106. package/dist/shared/contracts/audit-logs.d.ts.map +1 -1
  107. package/dist/shared/utils/audit-log-export.d.ts +9 -0
  108. package/dist/shared/utils/audit-log-export.d.ts.map +1 -0
  109. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ListPage.js","sources":["../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flex, IconButton, Typography } from '@strapi/design-system';\nimport { Eye } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Filters } from '../../../../../../../admin/src/components/Filters';\nimport { Layouts } from '../../../../../../../admin/src/components/Layouts/Layout';\nimport { Page } from '../../../../../../../admin/src/components/PageHelpers';\nimport { Pagination } from '../../../../../../../admin/src/components/Pagination';\nimport { Table } from '../../../../../../../admin/src/components/Table';\nimport { useTypedSelector } from '../../../../../../../admin/src/core/store/hooks';\nimport {\n useQueryParams,\n withEncodedUserParams,\n} from '../../../../../../../admin/src/hooks/useQueryParams';\nimport { useRBAC } from '../../../../../../../admin/src/hooks/useRBAC';\nimport { AuditLog } from '../../../../../../../shared/contracts/audit-logs';\n\nimport { Modal } from './components/Modal';\nimport { useAuditLogsData } from './hooks/useAuditLogsData';\nimport { useFormatTimeStamp } from './hooks/useFormatTimeStamp';\nimport { getDefaultMessage } from './utils/getActionTypesDefaultMessages';\nimport { getDisplayedFilters } from './utils/getDisplayedFilters';\n\nconst USERS_PAGE_SIZE = 10;\n\nconst ListPage = () => {\n const { formatMessage } = useIntl();\n const permissions = useTypedSelector((state) => state.admin_app.permissions.settings);\n\n const {\n allowedActions: { canRead: canReadAuditLogs },\n isLoading: isLoadingRBAC,\n } = useRBAC(permissions?.auditLogs?.read || []);\n\n const [{ query }, setQuery] = useQueryParams<{\n id?: AuditLog['id'];\n filters?: unknown;\n _q?: unknown;\n }>();\n\n const openLog = (id: AuditLog['id']) =>\n setQuery(withEncodedUserParams(query, { id }), 'push', true);\n const closeLog = () => setQuery(withEncodedUserParams(query, { id: undefined }), 'push', true);\n const [usersPageSize, setUsersPageSize] = React.useState(USERS_PAGE_SIZE);\n const {\n auditLogs,\n users,\n usersPagination,\n isLoadingUsers,\n isLoading: isLoadingData,\n hasError,\n } = useAuditLogsData({\n canReadAuditLogs,\n usersPageSize,\n });\n\n const { page = 1, pageCount = 1 } = usersPagination ?? {};\n const hasMoreUsers = page < pageCount;\n\n const handleLoadMoreUsers = () => {\n if (hasMoreUsers) {\n setUsersPageSize((prevPageSize) => prevPageSize + USERS_PAGE_SIZE);\n }\n };\n\n const formatTimeStamp = useFormatTimeStamp();\n\n const displayedFilters = getDisplayedFilters({\n formatMessage,\n users,\n usersFilter: {\n loading: isLoadingUsers,\n hasMoreItems: hasMoreUsers,\n onLoadMore: handleLoadMoreUsers,\n },\n });\n\n const headers: Table.Header<AuditLog, object>[] = [\n {\n name: 'action',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.action',\n defaultMessage: 'Action',\n }),\n sortable: true,\n },\n {\n name: 'date',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.date',\n defaultMessage: 'Date',\n }),\n sortable: true,\n },\n {\n name: 'user',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.user',\n defaultMessage: 'User',\n }),\n sortable: false,\n // In this case, the passed parameter cannot and shouldn't be something else than User\n cellFormatter: ({ user }) => (user ? user.displayName : ''),\n },\n ];\n\n if (hasError) {\n return <Page.Error />;\n }\n\n const isLoading = isLoadingData || isLoadingRBAC;\n\n const { results = [] } = auditLogs ?? {};\n\n return (\n <Page.Main aria-busy={isLoading}>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: formatMessage({\n id: 'global.auditLogs',\n defaultMessage: 'Audit Logs',\n }),\n }\n )}\n </Page.Title>\n <Layouts.Header\n title={formatMessage({\n id: 'global.auditLogs',\n defaultMessage: 'Audit Logs',\n })}\n subtitle={formatMessage({\n id: 'Settings.permissions.auditLogs.listview.header.subtitle',\n defaultMessage: 'Logs of all the activities that happened in your environment',\n })}\n />\n <Layouts.Action\n startActions={\n <Filters.Root options={displayedFilters}>\n <Filters.Trigger />\n <Filters.Popover zIndex={499} />\n <Filters.List />\n </Filters.Root>\n }\n />\n <Layouts.Content>\n <Table.Root rows={results} headers={headers} isLoading={isLoading}>\n <Table.Content>\n <Table.Head>\n {headers.map((header) => (\n <Table.HeaderCell key={header.name} {...header} />\n ))}\n </Table.Head>\n <Table.Empty />\n <Table.Loading />\n <Table.Body>\n {results.map((log) => (\n <Table.Row key={log.id} onClick={() => openLog(log.id)}>\n {headers.map((header) => {\n const { name, cellFormatter } = header;\n\n switch (name) {\n case 'action':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {formatMessage(\n {\n id: `Settings.permissions.auditLogs.${log.action}`,\n // @ts-expect-error – getDefaultMessage probably doesn't benefit from being so strongly typed unless we just add string at the end.\n defaultMessage: getDefaultMessage(log.action),\n },\n { model: (log.payload?.model as string) ?? '' }\n )}\n </Typography>\n </Table.Cell>\n );\n case 'date':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {formatTimeStamp(log.date)}\n </Typography>\n </Table.Cell>\n );\n case 'user':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {cellFormatter ? cellFormatter(log, header) : '-'}\n </Typography>\n </Table.Cell>\n );\n default:\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {(log[name as keyof AuditLog] as string) || '-'}\n </Typography>\n </Table.Cell>\n );\n }\n })}\n <Table.Cell onClick={(e) => e.stopPropagation()}>\n <Flex justifyContent=\"end\">\n <IconButton\n onClick={() => openLog(log.id)}\n withTooltip={false}\n label={formatMessage(\n { id: 'app.component.table.view', defaultMessage: '{target} details' },\n { target: `${log.action} action` }\n )}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n </Flex>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n\n <Pagination.Root {...auditLogs?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n {query?.id && <Modal handleClose={closeLog} logId={query.id.toString()} />}\n </Page.Main>\n );\n};\n\nconst ProtectedListPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.auditLogs?.main\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListPage />\n </Page.Protect>\n );\n};\n\nexport { ListPage, ProtectedListPage };\n"],"names":["USERS_PAGE_SIZE","ListPage","formatMessage","useIntl","permissions","useTypedSelector","state","admin_app","settings","allowedActions","canRead","canReadAuditLogs","isLoading","isLoadingRBAC","useRBAC","auditLogs","read","query","setQuery","useQueryParams","openLog","id","withEncodedUserParams","closeLog","undefined","usersPageSize","setUsersPageSize","React","useState","users","usersPagination","isLoadingUsers","isLoadingData","hasError","useAuditLogsData","page","pageCount","hasMoreUsers","handleLoadMoreUsers","prevPageSize","formatTimeStamp","useFormatTimeStamp","displayedFilters","getDisplayedFilters","usersFilter","loading","hasMoreItems","onLoadMore","headers","name","label","defaultMessage","sortable","cellFormatter","user","displayName","_jsx","Page","Error","results","_jsxs","Main","aria-busy","Title","Layouts","Header","title","subtitle","Action","startActions","Filters","Root","options","Trigger","Popover","zIndex","List","Content","Table","rows","Head","map","header","HeaderCell","Empty","Loading","Body","log","Row","onClick","Cell","Typography","textColor","action","getDefaultMessage","model","payload","date","e","stopPropagation","Flex","justifyContent","IconButton","withTooltip","target","variant","Eye","Pagination","pagination","PageSize","Links","Modal","handleClose","logId","toString","ProtectedListPage","main","Protect"],"mappings":"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"}
1
+ {"version":3,"file":"ListPage.js","sources":["../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Flex, IconButton, Typography } from '@strapi/design-system';\nimport { Download, Eye } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Filters } from '../../../../../../../admin/src/components/Filters';\nimport { Layouts } from '../../../../../../../admin/src/components/Layouts/Layout';\nimport { Page } from '../../../../../../../admin/src/components/PageHelpers';\nimport { Pagination } from '../../../../../../../admin/src/components/Pagination';\nimport { Table } from '../../../../../../../admin/src/components/Table';\nimport { useTypedSelector } from '../../../../../../../admin/src/core/store/hooks';\nimport {\n useQueryParams,\n withEncodedUserParams,\n} from '../../../../../../../admin/src/hooks/useQueryParams';\nimport { useRBAC } from '../../../../../../../admin/src/hooks/useRBAC';\nimport { AuditLog } from '../../../../../../../shared/contracts/audit-logs';\n\nimport { ExportCard } from './components/ExportCard';\nimport { Modal } from './components/Modal';\nimport { useAuditLogsData } from './hooks/useAuditLogsData';\nimport { useExportAuditLogs } from './hooks/useExportAuditLogs';\nimport { useFormatTimeStamp } from './hooks/useFormatTimeStamp';\nimport { getDefaultMessage } from './utils/getActionTypesDefaultMessages';\nimport { getDisplayedFilters } from './utils/getDisplayedFilters';\n\nconst USERS_PAGE_SIZE = 10;\n\nconst ListPage = () => {\n const { formatMessage } = useIntl();\n const permissions = useTypedSelector((state) => state.admin_app.permissions.settings);\n\n const readPermissions = permissions?.auditLogs?.read;\n const exportPermissions = permissions?.auditLogs?.export;\n const {\n allowedActions: { canRead: canReadAuditLogs, canExport: canExportAuditLogs },\n isLoading: isLoadingRBAC,\n } = useRBAC(\n React.useMemo(\n () => [...(readPermissions ?? []), ...(exportPermissions ?? [])],\n [readPermissions, exportPermissions]\n )\n );\n\n const [{ query }, setQuery] = useQueryParams<{\n id?: AuditLog['id'];\n filters?: unknown;\n _q?: unknown;\n }>();\n\n const openLog = (id: AuditLog['id']) =>\n setQuery(withEncodedUserParams(query, { id }), 'push', true);\n const closeLog = () => setQuery(withEncodedUserParams(query, { id: undefined }), 'push', true);\n const { exportAuditLogs, downloadExport, dismissExport, isExporting, progress, exportResult } =\n useExportAuditLogs();\n\n const [usersPageSize, setUsersPageSize] = React.useState(USERS_PAGE_SIZE);\n const {\n auditLogs,\n users,\n usersPagination,\n isLoadingUsers,\n isLoading: isLoadingData,\n hasError,\n } = useAuditLogsData({\n canReadAuditLogs,\n usersPageSize,\n });\n\n const { page = 1, pageCount = 1 } = usersPagination ?? {};\n const hasMoreUsers = page < pageCount;\n\n const handleLoadMoreUsers = () => {\n if (hasMoreUsers) {\n setUsersPageSize((prevPageSize) => prevPageSize + USERS_PAGE_SIZE);\n }\n };\n\n const formatTimeStamp = useFormatTimeStamp();\n\n const displayedFilters = getDisplayedFilters({\n formatMessage,\n users,\n usersFilter: {\n loading: isLoadingUsers,\n hasMoreItems: hasMoreUsers,\n onLoadMore: handleLoadMoreUsers,\n },\n });\n\n const headers: Table.Header<AuditLog, object>[] = [\n {\n name: 'action',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.action',\n defaultMessage: 'Action',\n }),\n sortable: true,\n },\n {\n name: 'date',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.date',\n defaultMessage: 'Date',\n }),\n sortable: true,\n },\n {\n name: 'user',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.user',\n defaultMessage: 'User',\n }),\n sortable: false,\n // System actions, such as a scheduled release publish, have no user\n cellFormatter: ({ user }) => (user ? user.displayName : '-'),\n },\n ];\n\n if (hasError) {\n return <Page.Error />;\n }\n\n const isLoading = isLoadingData || isLoadingRBAC;\n\n const { results = [] } = auditLogs ?? {};\n const totalEntries = auditLogs?.pagination?.total;\n\n return (\n <Page.Main aria-busy={isLoading}>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: formatMessage({\n id: 'global.auditLogs',\n defaultMessage: 'Audit Logs',\n }),\n }\n )}\n </Page.Title>\n <Layouts.Header\n title={formatMessage({\n id: 'global.auditLogs',\n defaultMessage: 'Audit Logs',\n })}\n subtitle={formatMessage({\n id: 'Settings.permissions.auditLogs.listview.header.subtitle',\n defaultMessage: 'Logs of all the activities that happened in your environment',\n })}\n primaryAction={\n canExportAuditLogs && (\n <Button\n startIcon={<Download />}\n loading={isExporting}\n disabled={isLoading || totalEntries === 0}\n onClick={() => exportAuditLogs(query?.filters, totalEntries ?? 0)}\n >\n {formatMessage({\n id: 'Settings.permissions.auditLogs.listview.export',\n defaultMessage: 'Export as CSV',\n })}\n </Button>\n )\n }\n />\n <Layouts.Action\n startActions={\n <Filters.Root options={displayedFilters}>\n <Filters.Trigger />\n <Filters.Popover zIndex={499} />\n <Filters.List />\n </Filters.Root>\n }\n />\n <Layouts.Content>\n <Table.Root rows={results} headers={headers} isLoading={isLoading}>\n <Table.Content>\n <Table.Head>\n {headers.map((header) => (\n <Table.HeaderCell key={header.name} {...header} />\n ))}\n </Table.Head>\n <Table.Empty />\n <Table.Loading />\n <Table.Body>\n {results.map((log) => (\n <Table.Row key={log.id} onClick={() => openLog(log.id)}>\n {headers.map((header) => {\n const { name, cellFormatter } = header;\n\n switch (name) {\n case 'action':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {formatMessage(\n {\n id: `Settings.permissions.auditLogs.${log.action}`,\n // @ts-expect-error – getDefaultMessage probably doesn't benefit from being so strongly typed unless we just add string at the end.\n defaultMessage: getDefaultMessage(log.action),\n },\n { model: (log.payload?.model as string) ?? '' }\n )}\n </Typography>\n </Table.Cell>\n );\n case 'date':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {formatTimeStamp(log.date)}\n </Typography>\n </Table.Cell>\n );\n case 'user':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {cellFormatter ? cellFormatter(log, header) : '-'}\n </Typography>\n </Table.Cell>\n );\n default:\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {(log[name as keyof AuditLog] as string) || '-'}\n </Typography>\n </Table.Cell>\n );\n }\n })}\n <Table.Cell onClick={(e) => e.stopPropagation()}>\n <Flex justifyContent=\"end\">\n <IconButton\n onClick={() => openLog(log.id)}\n withTooltip={false}\n label={formatMessage(\n { id: 'app.component.table.view', defaultMessage: '{target} details' },\n { target: `${log.action} action` }\n )}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n </Flex>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n\n <Pagination.Root {...auditLogs?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n {query?.id && <Modal handleClose={closeLog} logId={query.id.toString()} />}\n <ExportCard\n progress={progress}\n exportResult={exportResult}\n onDownload={downloadExport}\n onDismiss={dismissExport}\n />\n </Page.Main>\n );\n};\n\nconst ProtectedListPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.auditLogs?.main\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListPage />\n </Page.Protect>\n );\n};\n\nexport { ListPage, ProtectedListPage };\n"],"names":["USERS_PAGE_SIZE","ListPage","formatMessage","useIntl","permissions","useTypedSelector","state","admin_app","settings","readPermissions","auditLogs","read","exportPermissions","export","allowedActions","canRead","canReadAuditLogs","canExport","canExportAuditLogs","isLoading","isLoadingRBAC","useRBAC","React","useMemo","query","setQuery","useQueryParams","openLog","id","withEncodedUserParams","closeLog","undefined","exportAuditLogs","downloadExport","dismissExport","isExporting","progress","exportResult","useExportAuditLogs","usersPageSize","setUsersPageSize","useState","users","usersPagination","isLoadingUsers","isLoadingData","hasError","useAuditLogsData","page","pageCount","hasMoreUsers","handleLoadMoreUsers","prevPageSize","formatTimeStamp","useFormatTimeStamp","displayedFilters","getDisplayedFilters","usersFilter","loading","hasMoreItems","onLoadMore","headers","name","label","defaultMessage","sortable","cellFormatter","user","displayName","_jsx","Page","Error","results","totalEntries","pagination","total","_jsxs","Main","aria-busy","Title","Layouts","Header","title","subtitle","primaryAction","Button","startIcon","Download","disabled","onClick","filters","Action","startActions","Filters","Root","options","Trigger","Popover","zIndex","List","Content","Table","rows","Head","map","header","HeaderCell","Empty","Loading","Body","log","Row","Cell","Typography","textColor","action","getDefaultMessage","model","payload","date","e","stopPropagation","Flex","justifyContent","IconButton","withTooltip","target","variant","Eye","Pagination","PageSize","Links","Modal","handleClose","logId","toString","ExportCard","onDownload","onDismiss","ProtectedListPage","main","Protect"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { Typography, Flex, IconButton } from '@strapi/design-system';
4
- import { Eye } from '@strapi/icons';
3
+ import { Button, Typography, Flex, IconButton } from '@strapi/design-system';
4
+ import { Download, Eye } from '@strapi/icons';
5
5
  import { useIntl } from 'react-intl';
6
6
  import { Filters } from '../../../../../../../admin/src/components/Filters.mjs';
7
7
  import { Layouts } from '../../../../../../../admin/src/components/Layouts/Layout.mjs';
@@ -11,8 +11,10 @@ import { Table } from '../../../../../../../admin/src/components/Table.mjs';
11
11
  import { useTypedSelector } from '../../../../../../../admin/src/core/store/hooks.mjs';
12
12
  import { useQueryParams, withEncodedUserParams } from '../../../../../../../admin/src/hooks/useQueryParams.mjs';
13
13
  import { useRBAC } from '../../../../../../../admin/src/hooks/useRBAC.mjs';
14
+ import { ExportCard } from './components/ExportCard.mjs';
14
15
  import { Modal } from './components/Modal.mjs';
15
16
  import { useAuditLogsData } from './hooks/useAuditLogsData.mjs';
17
+ import { useExportAuditLogs } from './hooks/useExportAuditLogs.mjs';
16
18
  import { useFormatTimeStamp } from './hooks/useFormatTimeStamp.mjs';
17
19
  import { getDefaultMessage } from './utils/getActionTypesDefaultMessages.mjs';
18
20
  import { getDisplayedFilters } from './utils/getDisplayedFilters.mjs';
@@ -21,7 +23,15 @@ const USERS_PAGE_SIZE = 10;
21
23
  const ListPage = ()=>{
22
24
  const { formatMessage } = useIntl();
23
25
  const permissions = useTypedSelector((state)=>state.admin_app.permissions.settings);
24
- const { allowedActions: { canRead: canReadAuditLogs }, isLoading: isLoadingRBAC } = useRBAC(permissions?.auditLogs?.read || []);
26
+ const readPermissions = permissions?.auditLogs?.read;
27
+ const exportPermissions = permissions?.auditLogs?.export;
28
+ const { allowedActions: { canRead: canReadAuditLogs, canExport: canExportAuditLogs }, isLoading: isLoadingRBAC } = useRBAC(React.useMemo(()=>[
29
+ ...readPermissions ?? [],
30
+ ...exportPermissions ?? []
31
+ ], [
32
+ readPermissions,
33
+ exportPermissions
34
+ ]));
25
35
  const [{ query }, setQuery] = useQueryParams();
26
36
  const openLog = (id)=>setQuery(withEncodedUserParams(query, {
27
37
  id
@@ -29,6 +39,7 @@ const ListPage = ()=>{
29
39
  const closeLog = ()=>setQuery(withEncodedUserParams(query, {
30
40
  id: undefined
31
41
  }), 'push', true);
42
+ const { exportAuditLogs, downloadExport, dismissExport, isExporting, progress, exportResult } = useExportAuditLogs();
32
43
  const [usersPageSize, setUsersPageSize] = React.useState(USERS_PAGE_SIZE);
33
44
  const { auditLogs, users, usersPagination, isLoadingUsers, isLoading: isLoadingData, hasError } = useAuditLogsData({
34
45
  canReadAuditLogs,
@@ -75,8 +86,8 @@ const ListPage = ()=>{
75
86
  defaultMessage: 'User'
76
87
  }),
77
88
  sortable: false,
78
- // In this case, the passed parameter cannot and shouldn't be something else than User
79
- cellFormatter: ({ user })=>user ? user.displayName : ''
89
+ // System actions, such as a scheduled release publish, have no user
90
+ cellFormatter: ({ user })=>user ? user.displayName : '-'
80
91
  }
81
92
  ];
82
93
  if (hasError) {
@@ -84,6 +95,7 @@ const ListPage = ()=>{
84
95
  }
85
96
  const isLoading = isLoadingData || isLoadingRBAC;
86
97
  const { results = [] } = auditLogs ?? {};
98
+ const totalEntries = auditLogs?.pagination?.total;
87
99
  return /*#__PURE__*/ jsxs(Page.Main, {
88
100
  "aria-busy": isLoading,
89
101
  children: [
@@ -106,6 +118,16 @@ const ListPage = ()=>{
106
118
  subtitle: formatMessage({
107
119
  id: 'Settings.permissions.auditLogs.listview.header.subtitle',
108
120
  defaultMessage: 'Logs of all the activities that happened in your environment'
121
+ }),
122
+ primaryAction: canExportAuditLogs && /*#__PURE__*/ jsx(Button, {
123
+ startIcon: /*#__PURE__*/ jsx(Download, {}),
124
+ loading: isExporting,
125
+ disabled: isLoading || totalEntries === 0,
126
+ onClick: ()=>exportAuditLogs(query?.filters, totalEntries ?? 0),
127
+ children: formatMessage({
128
+ id: 'Settings.permissions.auditLogs.listview.export',
129
+ defaultMessage: 'Export as CSV'
130
+ })
109
131
  })
110
132
  }),
111
133
  /*#__PURE__*/ jsx(Layouts.Action, {
@@ -214,6 +236,12 @@ const ListPage = ()=>{
214
236
  query?.id && /*#__PURE__*/ jsx(Modal, {
215
237
  handleClose: closeLog,
216
238
  logId: query.id.toString()
239
+ }),
240
+ /*#__PURE__*/ jsx(ExportCard, {
241
+ progress: progress,
242
+ exportResult: exportResult,
243
+ onDownload: downloadExport,
244
+ onDismiss: dismissExport
217
245
  })
218
246
  ]
219
247
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ListPage.mjs","sources":["../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flex, IconButton, Typography } from '@strapi/design-system';\nimport { Eye } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Filters } from '../../../../../../../admin/src/components/Filters';\nimport { Layouts } from '../../../../../../../admin/src/components/Layouts/Layout';\nimport { Page } from '../../../../../../../admin/src/components/PageHelpers';\nimport { Pagination } from '../../../../../../../admin/src/components/Pagination';\nimport { Table } from '../../../../../../../admin/src/components/Table';\nimport { useTypedSelector } from '../../../../../../../admin/src/core/store/hooks';\nimport {\n useQueryParams,\n withEncodedUserParams,\n} from '../../../../../../../admin/src/hooks/useQueryParams';\nimport { useRBAC } from '../../../../../../../admin/src/hooks/useRBAC';\nimport { AuditLog } from '../../../../../../../shared/contracts/audit-logs';\n\nimport { Modal } from './components/Modal';\nimport { useAuditLogsData } from './hooks/useAuditLogsData';\nimport { useFormatTimeStamp } from './hooks/useFormatTimeStamp';\nimport { getDefaultMessage } from './utils/getActionTypesDefaultMessages';\nimport { getDisplayedFilters } from './utils/getDisplayedFilters';\n\nconst USERS_PAGE_SIZE = 10;\n\nconst ListPage = () => {\n const { formatMessage } = useIntl();\n const permissions = useTypedSelector((state) => state.admin_app.permissions.settings);\n\n const {\n allowedActions: { canRead: canReadAuditLogs },\n isLoading: isLoadingRBAC,\n } = useRBAC(permissions?.auditLogs?.read || []);\n\n const [{ query }, setQuery] = useQueryParams<{\n id?: AuditLog['id'];\n filters?: unknown;\n _q?: unknown;\n }>();\n\n const openLog = (id: AuditLog['id']) =>\n setQuery(withEncodedUserParams(query, { id }), 'push', true);\n const closeLog = () => setQuery(withEncodedUserParams(query, { id: undefined }), 'push', true);\n const [usersPageSize, setUsersPageSize] = React.useState(USERS_PAGE_SIZE);\n const {\n auditLogs,\n users,\n usersPagination,\n isLoadingUsers,\n isLoading: isLoadingData,\n hasError,\n } = useAuditLogsData({\n canReadAuditLogs,\n usersPageSize,\n });\n\n const { page = 1, pageCount = 1 } = usersPagination ?? {};\n const hasMoreUsers = page < pageCount;\n\n const handleLoadMoreUsers = () => {\n if (hasMoreUsers) {\n setUsersPageSize((prevPageSize) => prevPageSize + USERS_PAGE_SIZE);\n }\n };\n\n const formatTimeStamp = useFormatTimeStamp();\n\n const displayedFilters = getDisplayedFilters({\n formatMessage,\n users,\n usersFilter: {\n loading: isLoadingUsers,\n hasMoreItems: hasMoreUsers,\n onLoadMore: handleLoadMoreUsers,\n },\n });\n\n const headers: Table.Header<AuditLog, object>[] = [\n {\n name: 'action',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.action',\n defaultMessage: 'Action',\n }),\n sortable: true,\n },\n {\n name: 'date',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.date',\n defaultMessage: 'Date',\n }),\n sortable: true,\n },\n {\n name: 'user',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.user',\n defaultMessage: 'User',\n }),\n sortable: false,\n // In this case, the passed parameter cannot and shouldn't be something else than User\n cellFormatter: ({ user }) => (user ? user.displayName : ''),\n },\n ];\n\n if (hasError) {\n return <Page.Error />;\n }\n\n const isLoading = isLoadingData || isLoadingRBAC;\n\n const { results = [] } = auditLogs ?? {};\n\n return (\n <Page.Main aria-busy={isLoading}>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: formatMessage({\n id: 'global.auditLogs',\n defaultMessage: 'Audit Logs',\n }),\n }\n )}\n </Page.Title>\n <Layouts.Header\n title={formatMessage({\n id: 'global.auditLogs',\n defaultMessage: 'Audit Logs',\n })}\n subtitle={formatMessage({\n id: 'Settings.permissions.auditLogs.listview.header.subtitle',\n defaultMessage: 'Logs of all the activities that happened in your environment',\n })}\n />\n <Layouts.Action\n startActions={\n <Filters.Root options={displayedFilters}>\n <Filters.Trigger />\n <Filters.Popover zIndex={499} />\n <Filters.List />\n </Filters.Root>\n }\n />\n <Layouts.Content>\n <Table.Root rows={results} headers={headers} isLoading={isLoading}>\n <Table.Content>\n <Table.Head>\n {headers.map((header) => (\n <Table.HeaderCell key={header.name} {...header} />\n ))}\n </Table.Head>\n <Table.Empty />\n <Table.Loading />\n <Table.Body>\n {results.map((log) => (\n <Table.Row key={log.id} onClick={() => openLog(log.id)}>\n {headers.map((header) => {\n const { name, cellFormatter } = header;\n\n switch (name) {\n case 'action':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {formatMessage(\n {\n id: `Settings.permissions.auditLogs.${log.action}`,\n // @ts-expect-error – getDefaultMessage probably doesn't benefit from being so strongly typed unless we just add string at the end.\n defaultMessage: getDefaultMessage(log.action),\n },\n { model: (log.payload?.model as string) ?? '' }\n )}\n </Typography>\n </Table.Cell>\n );\n case 'date':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {formatTimeStamp(log.date)}\n </Typography>\n </Table.Cell>\n );\n case 'user':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {cellFormatter ? cellFormatter(log, header) : '-'}\n </Typography>\n </Table.Cell>\n );\n default:\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {(log[name as keyof AuditLog] as string) || '-'}\n </Typography>\n </Table.Cell>\n );\n }\n })}\n <Table.Cell onClick={(e) => e.stopPropagation()}>\n <Flex justifyContent=\"end\">\n <IconButton\n onClick={() => openLog(log.id)}\n withTooltip={false}\n label={formatMessage(\n { id: 'app.component.table.view', defaultMessage: '{target} details' },\n { target: `${log.action} action` }\n )}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n </Flex>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n\n <Pagination.Root {...auditLogs?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n {query?.id && <Modal handleClose={closeLog} logId={query.id.toString()} />}\n </Page.Main>\n );\n};\n\nconst ProtectedListPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.auditLogs?.main\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListPage />\n </Page.Protect>\n );\n};\n\nexport { ListPage, ProtectedListPage };\n"],"names":["USERS_PAGE_SIZE","ListPage","formatMessage","useIntl","permissions","useTypedSelector","state","admin_app","settings","allowedActions","canRead","canReadAuditLogs","isLoading","isLoadingRBAC","useRBAC","auditLogs","read","query","setQuery","useQueryParams","openLog","id","withEncodedUserParams","closeLog","undefined","usersPageSize","setUsersPageSize","React","useState","users","usersPagination","isLoadingUsers","isLoadingData","hasError","useAuditLogsData","page","pageCount","hasMoreUsers","handleLoadMoreUsers","prevPageSize","formatTimeStamp","useFormatTimeStamp","displayedFilters","getDisplayedFilters","usersFilter","loading","hasMoreItems","onLoadMore","headers","name","label","defaultMessage","sortable","cellFormatter","user","displayName","_jsx","Page","Error","results","_jsxs","Main","aria-busy","Title","Layouts","Header","title","subtitle","Action","startActions","Filters","Root","options","Trigger","Popover","zIndex","List","Content","Table","rows","Head","map","header","HeaderCell","Empty","Loading","Body","log","Row","onClick","Cell","Typography","textColor","action","getDefaultMessage","model","payload","date","e","stopPropagation","Flex","justifyContent","IconButton","withTooltip","target","variant","Eye","Pagination","pagination","PageSize","Links","Modal","handleClose","logId","toString","ProtectedListPage","main","Protect"],"mappings":"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"}
1
+ {"version":3,"file":"ListPage.mjs","sources":["../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Flex, IconButton, Typography } from '@strapi/design-system';\nimport { Download, Eye } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Filters } from '../../../../../../../admin/src/components/Filters';\nimport { Layouts } from '../../../../../../../admin/src/components/Layouts/Layout';\nimport { Page } from '../../../../../../../admin/src/components/PageHelpers';\nimport { Pagination } from '../../../../../../../admin/src/components/Pagination';\nimport { Table } from '../../../../../../../admin/src/components/Table';\nimport { useTypedSelector } from '../../../../../../../admin/src/core/store/hooks';\nimport {\n useQueryParams,\n withEncodedUserParams,\n} from '../../../../../../../admin/src/hooks/useQueryParams';\nimport { useRBAC } from '../../../../../../../admin/src/hooks/useRBAC';\nimport { AuditLog } from '../../../../../../../shared/contracts/audit-logs';\n\nimport { ExportCard } from './components/ExportCard';\nimport { Modal } from './components/Modal';\nimport { useAuditLogsData } from './hooks/useAuditLogsData';\nimport { useExportAuditLogs } from './hooks/useExportAuditLogs';\nimport { useFormatTimeStamp } from './hooks/useFormatTimeStamp';\nimport { getDefaultMessage } from './utils/getActionTypesDefaultMessages';\nimport { getDisplayedFilters } from './utils/getDisplayedFilters';\n\nconst USERS_PAGE_SIZE = 10;\n\nconst ListPage = () => {\n const { formatMessage } = useIntl();\n const permissions = useTypedSelector((state) => state.admin_app.permissions.settings);\n\n const readPermissions = permissions?.auditLogs?.read;\n const exportPermissions = permissions?.auditLogs?.export;\n const {\n allowedActions: { canRead: canReadAuditLogs, canExport: canExportAuditLogs },\n isLoading: isLoadingRBAC,\n } = useRBAC(\n React.useMemo(\n () => [...(readPermissions ?? []), ...(exportPermissions ?? [])],\n [readPermissions, exportPermissions]\n )\n );\n\n const [{ query }, setQuery] = useQueryParams<{\n id?: AuditLog['id'];\n filters?: unknown;\n _q?: unknown;\n }>();\n\n const openLog = (id: AuditLog['id']) =>\n setQuery(withEncodedUserParams(query, { id }), 'push', true);\n const closeLog = () => setQuery(withEncodedUserParams(query, { id: undefined }), 'push', true);\n const { exportAuditLogs, downloadExport, dismissExport, isExporting, progress, exportResult } =\n useExportAuditLogs();\n\n const [usersPageSize, setUsersPageSize] = React.useState(USERS_PAGE_SIZE);\n const {\n auditLogs,\n users,\n usersPagination,\n isLoadingUsers,\n isLoading: isLoadingData,\n hasError,\n } = useAuditLogsData({\n canReadAuditLogs,\n usersPageSize,\n });\n\n const { page = 1, pageCount = 1 } = usersPagination ?? {};\n const hasMoreUsers = page < pageCount;\n\n const handleLoadMoreUsers = () => {\n if (hasMoreUsers) {\n setUsersPageSize((prevPageSize) => prevPageSize + USERS_PAGE_SIZE);\n }\n };\n\n const formatTimeStamp = useFormatTimeStamp();\n\n const displayedFilters = getDisplayedFilters({\n formatMessage,\n users,\n usersFilter: {\n loading: isLoadingUsers,\n hasMoreItems: hasMoreUsers,\n onLoadMore: handleLoadMoreUsers,\n },\n });\n\n const headers: Table.Header<AuditLog, object>[] = [\n {\n name: 'action',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.action',\n defaultMessage: 'Action',\n }),\n sortable: true,\n },\n {\n name: 'date',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.date',\n defaultMessage: 'Date',\n }),\n sortable: true,\n },\n {\n name: 'user',\n label: formatMessage({\n id: 'Settings.permissions.auditLogs.user',\n defaultMessage: 'User',\n }),\n sortable: false,\n // System actions, such as a scheduled release publish, have no user\n cellFormatter: ({ user }) => (user ? user.displayName : '-'),\n },\n ];\n\n if (hasError) {\n return <Page.Error />;\n }\n\n const isLoading = isLoadingData || isLoadingRBAC;\n\n const { results = [] } = auditLogs ?? {};\n const totalEntries = auditLogs?.pagination?.total;\n\n return (\n <Page.Main aria-busy={isLoading}>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: formatMessage({\n id: 'global.auditLogs',\n defaultMessage: 'Audit Logs',\n }),\n }\n )}\n </Page.Title>\n <Layouts.Header\n title={formatMessage({\n id: 'global.auditLogs',\n defaultMessage: 'Audit Logs',\n })}\n subtitle={formatMessage({\n id: 'Settings.permissions.auditLogs.listview.header.subtitle',\n defaultMessage: 'Logs of all the activities that happened in your environment',\n })}\n primaryAction={\n canExportAuditLogs && (\n <Button\n startIcon={<Download />}\n loading={isExporting}\n disabled={isLoading || totalEntries === 0}\n onClick={() => exportAuditLogs(query?.filters, totalEntries ?? 0)}\n >\n {formatMessage({\n id: 'Settings.permissions.auditLogs.listview.export',\n defaultMessage: 'Export as CSV',\n })}\n </Button>\n )\n }\n />\n <Layouts.Action\n startActions={\n <Filters.Root options={displayedFilters}>\n <Filters.Trigger />\n <Filters.Popover zIndex={499} />\n <Filters.List />\n </Filters.Root>\n }\n />\n <Layouts.Content>\n <Table.Root rows={results} headers={headers} isLoading={isLoading}>\n <Table.Content>\n <Table.Head>\n {headers.map((header) => (\n <Table.HeaderCell key={header.name} {...header} />\n ))}\n </Table.Head>\n <Table.Empty />\n <Table.Loading />\n <Table.Body>\n {results.map((log) => (\n <Table.Row key={log.id} onClick={() => openLog(log.id)}>\n {headers.map((header) => {\n const { name, cellFormatter } = header;\n\n switch (name) {\n case 'action':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {formatMessage(\n {\n id: `Settings.permissions.auditLogs.${log.action}`,\n // @ts-expect-error – getDefaultMessage probably doesn't benefit from being so strongly typed unless we just add string at the end.\n defaultMessage: getDefaultMessage(log.action),\n },\n { model: (log.payload?.model as string) ?? '' }\n )}\n </Typography>\n </Table.Cell>\n );\n case 'date':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {formatTimeStamp(log.date)}\n </Typography>\n </Table.Cell>\n );\n case 'user':\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {cellFormatter ? cellFormatter(log, header) : '-'}\n </Typography>\n </Table.Cell>\n );\n default:\n return (\n <Table.Cell key={name}>\n <Typography textColor=\"neutral800\">\n {(log[name as keyof AuditLog] as string) || '-'}\n </Typography>\n </Table.Cell>\n );\n }\n })}\n <Table.Cell onClick={(e) => e.stopPropagation()}>\n <Flex justifyContent=\"end\">\n <IconButton\n onClick={() => openLog(log.id)}\n withTooltip={false}\n label={formatMessage(\n { id: 'app.component.table.view', defaultMessage: '{target} details' },\n { target: `${log.action} action` }\n )}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n </Flex>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n\n <Pagination.Root {...auditLogs?.pagination}>\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Layouts.Content>\n {query?.id && <Modal handleClose={closeLog} logId={query.id.toString()} />}\n <ExportCard\n progress={progress}\n exportResult={exportResult}\n onDownload={downloadExport}\n onDismiss={dismissExport}\n />\n </Page.Main>\n );\n};\n\nconst ProtectedListPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.auditLogs?.main\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListPage />\n </Page.Protect>\n );\n};\n\nexport { ListPage, ProtectedListPage };\n"],"names":["USERS_PAGE_SIZE","ListPage","formatMessage","useIntl","permissions","useTypedSelector","state","admin_app","settings","readPermissions","auditLogs","read","exportPermissions","export","allowedActions","canRead","canReadAuditLogs","canExport","canExportAuditLogs","isLoading","isLoadingRBAC","useRBAC","React","useMemo","query","setQuery","useQueryParams","openLog","id","withEncodedUserParams","closeLog","undefined","exportAuditLogs","downloadExport","dismissExport","isExporting","progress","exportResult","useExportAuditLogs","usersPageSize","setUsersPageSize","useState","users","usersPagination","isLoadingUsers","isLoadingData","hasError","useAuditLogsData","page","pageCount","hasMoreUsers","handleLoadMoreUsers","prevPageSize","formatTimeStamp","useFormatTimeStamp","displayedFilters","getDisplayedFilters","usersFilter","loading","hasMoreItems","onLoadMore","headers","name","label","defaultMessage","sortable","cellFormatter","user","displayName","_jsx","Page","Error","results","totalEntries","pagination","total","_jsxs","Main","aria-busy","Title","Layouts","Header","title","subtitle","primaryAction","Button","startIcon","Download","disabled","onClick","filters","Action","startActions","Filters","Root","options","Trigger","Popover","zIndex","List","Content","Table","rows","Head","map","header","HeaderCell","Empty","Loading","Body","log","Row","Cell","Typography","textColor","action","getDefaultMessage","model","payload","date","e","stopPropagation","Flex","justifyContent","IconButton","withTooltip","target","variant","Eye","Pagination","PageSize","Links","Modal","handleClose","logId","toString","ExportCard","onDownload","onDismiss","ProtectedListPage","main","Protect"],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var icons = require('@strapi/icons');
6
+ var reactIntl = require('react-intl');
7
+ var reactRouterDom = require('react-router-dom');
8
+ var styledComponents = require('styled-components');
9
+ var useWarnIfUnsavedChanges = require('../../../../../../../../admin/src/hooks/useWarnIfUnsavedChanges.js');
10
+
11
+ const ExportProgressBar = styledComponents.styled(designSystem.ProgressBar)`
12
+ width: 100%;
13
+ background-color: ${({ theme })=>theme.colors.neutral150};
14
+
15
+ > div {
16
+ background-color: ${({ theme })=>theme.colors.primary600};
17
+ }
18
+ `;
19
+ const ExportCard = ({ progress, exportResult, onDownload, onDismiss })=>{
20
+ const { formatMessage } = reactIntl.useIntl();
21
+ const isExportPending = Boolean(progress || exportResult);
22
+ useWarnIfUnsavedChanges.useWarnIfUnsavedChanges(isExportPending);
23
+ const blocker = reactRouterDom.useBlocker(({ currentLocation, nextLocation })=>isExportPending && currentLocation.pathname !== nextLocation.pathname);
24
+ if (!progress && !exportResult) {
25
+ return null;
26
+ }
27
+ const progressCaption = progress ? formatMessage({
28
+ id: 'Settings.permissions.auditLogs.listview.export.progress.caption',
29
+ defaultMessage: 'Preparing your export - {fetched, number} out of {total, plural, one {# event} other {# events}}'
30
+ }, {
31
+ fetched: progress.fetched,
32
+ total: progress.total
33
+ }) : null;
34
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Portal, {
35
+ children: [
36
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
37
+ position: "fixed",
38
+ bottom: 4,
39
+ right: 4,
40
+ zIndex: 200,
41
+ width: "32rem",
42
+ role: "status",
43
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
44
+ direction: "column",
45
+ alignItems: "stretch",
46
+ gap: 2,
47
+ padding: 4,
48
+ hasRadius: true,
49
+ background: "neutral0",
50
+ borderColor: "neutral150",
51
+ shadow: "popupShadow",
52
+ children: progress ? /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
53
+ children: [
54
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
55
+ fontWeight: "bold",
56
+ children: formatMessage({
57
+ id: 'Settings.permissions.auditLogs.listview.export.progress.title',
58
+ defaultMessage: 'Exporting audit logs'
59
+ })
60
+ }),
61
+ /*#__PURE__*/ jsxRuntime.jsx(ExportProgressBar, {
62
+ size: "S",
63
+ value: progress.total > 0 ? Math.round(progress.fetched / progress.total * 100) : 0,
64
+ "aria-label": progressCaption ?? undefined
65
+ }),
66
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
67
+ variant: "pi",
68
+ textColor: "neutral600",
69
+ children: progressCaption
70
+ })
71
+ ]
72
+ }) : exportResult && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
73
+ children: [
74
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
75
+ gap: 2,
76
+ children: [
77
+ /*#__PURE__*/ jsxRuntime.jsx(icons.CheckCircle, {
78
+ fill: "success500"
79
+ }),
80
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
81
+ fontWeight: "bold",
82
+ children: formatMessage({
83
+ id: 'Settings.permissions.auditLogs.listview.export.ready.title',
84
+ defaultMessage: 'Export ready'
85
+ })
86
+ })
87
+ ]
88
+ }),
89
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
90
+ variant: "pi",
91
+ textColor: "neutral600",
92
+ children: exportResult.fileName
93
+ }),
94
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
95
+ gap: 2,
96
+ children: [
97
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
98
+ startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Download, {}),
99
+ onClick: onDownload,
100
+ children: formatMessage({
101
+ id: 'Settings.permissions.auditLogs.listview.export.ready.download',
102
+ defaultMessage: 'Download CSV'
103
+ })
104
+ }),
105
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
106
+ variant: "tertiary",
107
+ onClick: onDismiss,
108
+ children: formatMessage({
109
+ id: 'app.components.Button.cancel',
110
+ defaultMessage: 'Cancel'
111
+ })
112
+ })
113
+ ]
114
+ })
115
+ ]
116
+ })
117
+ })
118
+ }),
119
+ blocker.state === 'blocked' && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Root, {
120
+ open: true,
121
+ onOpenChange: (isOpen)=>{
122
+ if (!isOpen) {
123
+ blocker.reset();
124
+ }
125
+ },
126
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Content, {
127
+ children: [
128
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Header, {
129
+ children: formatMessage({
130
+ id: 'app.components.ConfirmDialog.title',
131
+ defaultMessage: 'Confirmation'
132
+ })
133
+ }),
134
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Body, {
135
+ icon: /*#__PURE__*/ jsxRuntime.jsx(icons.WarningCircle, {
136
+ width: "24px",
137
+ height: "24px",
138
+ fill: "danger600"
139
+ }),
140
+ textAlign: "center",
141
+ children: formatMessage({
142
+ id: 'Settings.permissions.auditLogs.listview.export.leave',
143
+ defaultMessage: 'Are you sure you want to leave? Your ongoing export will be canceled.'
144
+ })
145
+ }),
146
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Footer, {
147
+ children: [
148
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Cancel, {
149
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
150
+ variant: "tertiary",
151
+ fullWidth: true,
152
+ children: formatMessage({
153
+ id: 'app.components.Button.cancel',
154
+ defaultMessage: 'Cancel'
155
+ })
156
+ })
157
+ }),
158
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
159
+ onClick: ()=>blocker.proceed(),
160
+ variant: "danger-light",
161
+ fullWidth: true,
162
+ children: formatMessage({
163
+ id: 'app.components.Button.confirm',
164
+ defaultMessage: 'Confirm'
165
+ })
166
+ })
167
+ ]
168
+ })
169
+ ]
170
+ })
171
+ })
172
+ ]
173
+ });
174
+ };
175
+
176
+ exports.ExportCard = ExportCard;
177
+ //# sourceMappingURL=ExportCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportCard.js","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.tsx"],"sourcesContent":["import { Box, Button, Dialog, Flex, Portal, ProgressBar, Typography } from '@strapi/design-system';\nimport { CheckCircle, Download, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useBlocker } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useWarnIfUnsavedChanges } from '../../../../../../../../admin/src/hooks/useWarnIfUnsavedChanges';\n\nimport type { ExportProgress, ExportResult } from '../hooks/useExportAuditLogs';\n\nconst ExportProgressBar = styled(ProgressBar)`\n width: 100%;\n background-color: ${({ theme }) => theme.colors.neutral150};\n\n > div {\n background-color: ${({ theme }) => theme.colors.primary600};\n }\n`;\n\ninterface ExportCardProps {\n progress: ExportProgress | null;\n exportResult: ExportResult | null;\n onDownload: () => void;\n onDismiss: () => void;\n}\n\nconst ExportCard = ({ progress, exportResult, onDownload, onDismiss }: ExportCardProps) => {\n const { formatMessage } = useIntl();\n\n const isExportPending = Boolean(progress || exportResult);\n\n useWarnIfUnsavedChanges(isExportPending);\n\n const blocker = useBlocker(\n ({ currentLocation, nextLocation }) =>\n isExportPending && currentLocation.pathname !== nextLocation.pathname\n );\n\n if (!progress && !exportResult) {\n return null;\n }\n\n const progressCaption = progress\n ? formatMessage(\n {\n id: 'Settings.permissions.auditLogs.listview.export.progress.caption',\n defaultMessage:\n 'Preparing your export - {fetched, number} out of {total, plural, one {# event} other {# events}}',\n },\n { fetched: progress.fetched, total: progress.total }\n )\n : null;\n\n return (\n <Portal>\n <Box position=\"fixed\" bottom={4} right={4} zIndex={200} width=\"32rem\" role=\"status\">\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={2}\n padding={4}\n hasRadius\n background=\"neutral0\"\n borderColor=\"neutral150\"\n shadow=\"popupShadow\"\n >\n {progress ? (\n <>\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'Settings.permissions.auditLogs.listview.export.progress.title',\n defaultMessage: 'Exporting audit logs',\n })}\n </Typography>\n <ExportProgressBar\n size=\"S\"\n value={\n progress.total > 0 ? Math.round((progress.fetched / progress.total) * 100) : 0\n }\n aria-label={progressCaption ?? undefined}\n />\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {progressCaption}\n </Typography>\n </>\n ) : (\n exportResult && (\n <>\n <Flex gap={2}>\n <CheckCircle fill=\"success500\" />\n <Typography fontWeight=\"bold\">\n {formatMessage({\n id: 'Settings.permissions.auditLogs.listview.export.ready.title',\n defaultMessage: 'Export ready',\n })}\n </Typography>\n </Flex>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {exportResult.fileName}\n </Typography>\n <Flex gap={2}>\n <Button startIcon={<Download />} onClick={onDownload}>\n {formatMessage({\n id: 'Settings.permissions.auditLogs.listview.export.ready.download',\n defaultMessage: 'Download CSV',\n })}\n </Button>\n <Button variant=\"tertiary\" onClick={onDismiss}>\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n </Flex>\n </>\n )\n )}\n </Flex>\n </Box>\n {blocker.state === 'blocked' && (\n <Dialog.Root\n open\n onOpenChange={(isOpen) => {\n if (!isOpen) {\n blocker.reset();\n }\n }}\n >\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n })}\n </Dialog.Header>\n <Dialog.Body\n icon={<WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />}\n textAlign=\"center\"\n >\n {formatMessage({\n id: 'Settings.permissions.auditLogs.listview.export.leave',\n defaultMessage:\n 'Are you sure you want to leave? Your ongoing export will be canceled.',\n })}\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" fullWidth>\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n </Dialog.Cancel>\n <Button onClick={() => blocker.proceed()} variant=\"danger-light\" fullWidth>\n {formatMessage({\n id: 'app.components.Button.confirm',\n defaultMessage: 'Confirm',\n })}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n )}\n </Portal>\n );\n};\n\nexport { ExportCard };\nexport type { ExportCardProps };\n"],"names":["ExportProgressBar","styled","ProgressBar","theme","colors","neutral150","primary600","ExportCard","progress","exportResult","onDownload","onDismiss","formatMessage","useIntl","isExportPending","Boolean","useWarnIfUnsavedChanges","blocker","useBlocker","currentLocation","nextLocation","pathname","progressCaption","id","defaultMessage","fetched","total","_jsxs","Portal","_jsx","Box","position","bottom","right","zIndex","width","role","Flex","direction","alignItems","gap","padding","hasRadius","background","borderColor","shadow","_Fragment","Typography","fontWeight","size","value","Math","round","aria-label","undefined","variant","textColor","CheckCircle","fill","fileName","Button","startIcon","Download","onClick","state","Dialog","Root","open","onOpenChange","isOpen","reset","Content","Header","Body","icon","WarningCircle","height","textAlign","Footer","Cancel","fullWidth","proceed"],"mappings":"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"}