@strapi/admin 5.52.2 → 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.
- package/dist/admin/admin/src/components/Filters.js +9 -9
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Filters.mjs +10 -10
- package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
- package/dist/admin/admin/src/components/Pagination.js +2 -2
- package/dist/admin/admin/src/components/Pagination.js.map +1 -1
- package/dist/admin/admin/src/components/Pagination.mjs +3 -3
- package/dist/admin/admin/src/components/Pagination.mjs.map +1 -1
- package/dist/admin/admin/src/components/SearchInput.js +7 -8
- package/dist/admin/admin/src/components/SearchInput.js.map +1 -1
- package/dist/admin/admin/src/components/SearchInput.mjs +8 -9
- package/dist/admin/admin/src/components/SearchInput.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js +2 -2
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs +3 -3
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.js +35 -1
- package/dist/admin/admin/src/hooks/useQueryParams.js.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.mjs +34 -2
- package/dist/admin/admin/src/hooks/useQueryParams.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +18 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +18 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +118 -43
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +118 -45
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/ee/admin/src/constants.js +6 -0
- package/dist/admin/ee/admin/src/constants.js.map +1 -1
- package/dist/admin/ee/admin/src/constants.mjs +6 -0
- package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +40 -12
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs +43 -15
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.js +177 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.js.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.mjs +175 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.mjs.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js +173 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs +151 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +10 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +10 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
- package/dist/admin/index.js +4 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/shared/utils/audit-log-export.js +16 -0
- package/dist/admin/shared/utils/audit-log-export.js.map +1 -0
- package/dist/admin/shared/utils/audit-log-export.mjs +9 -0
- package/dist/admin/shared/utils/audit-log-export.mjs.map +1 -0
- package/dist/admin/src/components/Filters.d.ts +1 -0
- package/dist/admin/src/hooks/useQueryParams.d.ts +13 -1
- package/dist/admin/src/index.d.ts +1 -1
- package/dist/admin/src/utils/getFetchClient.d.ts +9 -2
- package/dist/admin/tests/store.d.ts +4 -0
- package/dist/admin/tests/utils.d.ts +4 -0
- package/dist/ee/admin/src/constants.d.ts +4 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.d.ts +10 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.d.ts +18 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +9 -0
- package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts +1 -0
- package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts.map +1 -1
- package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts.map +1 -1
- package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts +24 -3
- package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -1
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +8 -2
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
- package/dist/ee/server/src/audit-logs/utils/csv.d.ts +5 -0
- package/dist/ee/server/src/audit-logs/utils/csv.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/utils/export-token.d.ts +5 -0
- package/dist/ee/server/src/audit-logs/utils/export-token.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/utils.d.ts +10 -0
- package/dist/ee/server/src/audit-logs/utils.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts +2 -0
- package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts.map +1 -1
- package/dist/ee/server/src/config/admin-actions.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +1 -0
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.js +50 -0
- package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.mjs +51 -1
- package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.mjs.map +1 -1
- package/dist/server/ee/server/src/audit-logs/routes/audit-logs.js +13 -4
- package/dist/server/ee/server/src/audit-logs/routes/audit-logs.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/routes/audit-logs.mjs +13 -4
- package/dist/server/ee/server/src/audit-logs/routes/audit-logs.mjs.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.js +201 -7
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs +201 -8
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +119 -34
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +119 -34
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
- package/dist/server/ee/server/src/audit-logs/utils/csv.js +33 -0
- package/dist/server/ee/server/src/audit-logs/utils/csv.js.map +1 -0
- package/dist/server/ee/server/src/audit-logs/utils/csv.mjs +29 -0
- package/dist/server/ee/server/src/audit-logs/utils/csv.mjs.map +1 -0
- package/dist/server/ee/server/src/audit-logs/utils/export-token.js +33 -0
- package/dist/server/ee/server/src/audit-logs/utils/export-token.js.map +1 -0
- package/dist/server/ee/server/src/audit-logs/utils/export-token.mjs +29 -0
- package/dist/server/ee/server/src/audit-logs/utils/export-token.mjs.map +1 -0
- package/dist/server/ee/server/src/audit-logs/utils.js +14 -0
- package/dist/server/ee/server/src/audit-logs/utils.js.map +1 -0
- package/dist/server/ee/server/src/audit-logs/utils.mjs +12 -0
- package/dist/server/ee/server/src/audit-logs/utils.mjs.map +1 -0
- package/dist/server/ee/server/src/audit-logs/validation/audit-logs.js +11 -0
- package/dist/server/ee/server/src/audit-logs/validation/audit-logs.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/validation/audit-logs.mjs +11 -1
- package/dist/server/ee/server/src/audit-logs/validation/audit-logs.mjs.map +1 -1
- package/dist/server/ee/server/src/config/admin-actions.js +8 -0
- package/dist/server/ee/server/src/config/admin-actions.js.map +1 -1
- package/dist/server/ee/server/src/config/admin-actions.mjs +8 -0
- package/dist/server/ee/server/src/config/admin-actions.mjs.map +1 -1
- package/dist/server/ee/server/src/index.js +10 -0
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +10 -0
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/shared/utils/audit-log-export.js +22 -0
- package/dist/server/shared/utils/audit-log-export.js.map +1 -0
- package/dist/server/shared/utils/audit-log-export.mjs +12 -0
- package/dist/server/shared/utils/audit-log-export.mjs.map +1 -0
- package/dist/shared/contracts/audit-logs.d.ts +15 -1
- package/dist/shared/contracts/audit-logs.d.ts.map +1 -1
- package/dist/shared/utils/audit-log-export.d.ts +9 -0
- package/dist/shared/utils/audit-log-export.d.ts.map +1 -0
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../../../ee/admin/src/constants.ts"],"sourcesContent":["import type { SettingsMenu } from '../../../admin/src/constants';\nimport type { PermissionMap } from '../../../admin/src/types/permissions';\nimport type { RouteObject } from 'react-router-dom';\n\nexport const ADMIN_PERMISSIONS_EE = {\n settings: {\n auditLogs: {\n main: [{ action: 'admin::audit-logs.read', subject: null }],\n read: [{ action: 'admin::audit-logs.read', subject: null }],\n update: [{ action: 'admin::audit-logs.update', subject: null }],\n },\n 'review-workflows': {\n main: [{ action: 'admin::review-workflows.read', subject: null }],\n read: [{ action: 'admin::review-workflows.read', subject: null }],\n create: [{ action: 'admin::review-workflows.create', subject: null }],\n delete: [{ action: 'admin::review-workflows.delete', subject: null }],\n update: [{ action: 'admin::review-workflows.update', subject: null }],\n },\n sso: {\n main: [{ action: 'admin::provider-login.read', subject: null }],\n read: [{ action: 'admin::provider-login.read', subject: null }],\n update: [{ action: 'admin::provider-login.update', subject: null }],\n },\n releases: {\n read: [\n {\n action: 'plugin::content-releases.settings.read',\n subject: null,\n },\n ],\n update: [\n {\n action: 'plugin::content-releases.settings.update',\n subject: null,\n },\n ],\n },\n },\n} satisfies {\n settings: Pick<PermissionMap['settings'], 'auditLogs' | 'review-workflows' | 'sso' | 'releases'>;\n};\n\n/**\n * Base EE routes, these are relative to the `root` of the app.\n * We use a function to get them so we're not looking at window\n * during build time.\n */\nexport const getEERoutes = (): RouteObject[] =>\n window.strapi.isEE\n ? [\n {\n path: 'auth/login/:authResponse',\n lazy: async () => {\n const { AuthResponse } = await import('./pages/AuthResponse');\n\n return {\n Component: AuthResponse,\n };\n },\n },\n ]\n : [];\n\nexport const AUDIT_LOGS_DEFAULT_PAGE_SIZE = 50;\n\n// TODO: the constants.js file is imported before the React application is setup and\n// therefore `window.strapi` might not exist at import-time. We should probably define\n// which constant is available at which stage of the application lifecycle.\nexport const SETTINGS_LINKS_EE = (): SettingsMenu => ({\n global: window.strapi.features.isEnabled(window.strapi.features.SSO)\n ? [\n {\n intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' },\n to: '/settings/single-sign-on',\n id: 'sso',\n licenseOnly: true,\n },\n ]\n : [],\n\n admin: window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS)\n ? [\n {\n intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' },\n to: `/settings/audit-logs?pageSize=${AUDIT_LOGS_DEFAULT_PAGE_SIZE}&page=1&sort=date:DESC`,\n id: 'auditLogs',\n licenseOnly: true,\n },\n ]\n : [],\n});\n"],"names":["ADMIN_PERMISSIONS_EE","settings","auditLogs","main","action","subject","read","update","create","delete","sso","releases","getEERoutes","window","strapi","isEE","path","lazy","AuthResponse","Component","AUDIT_LOGS_DEFAULT_PAGE_SIZE","SETTINGS_LINKS_EE","global","features","isEnabled","SSO","intlLabel","id","defaultMessage","to","licenseOnly","admin","AUDIT_LOGS"],"mappings":";;MAIaA,oBAAAA,GAAuB;IAClCC,QAAAA,EAAU;QACRC,SAAAA,EAAW;YACTC,IAAAA,EAAM;AAAC,gBAAA;oBAAEC,MAAAA,EAAQ,wBAAA;oBAA0BC,OAAAA,EAAS;AAAK;AAAE,aAAA;YAC3DC,IAAAA,EAAM;AAAC,gBAAA;oBAAEF,MAAAA,EAAQ,wBAAA;oBAA0BC,OAAAA,EAAS;AAAK;AAAE,aAAA;YAC3DE,MAAAA,EAAQ;AAAC,gBAAA;oBAAEH,MAAAA,EAAQ,0BAAA;oBAA4BC,OAAAA,EAAS;AAAK;AAAE;AACjE,SAAA;QACA,kBAAA,EAAoB;YAClBF,IAAAA,EAAM;AAAC,gBAAA;oBAAEC,MAAAA,EAAQ,8BAAA;oBAAgCC,OAAAA,EAAS;AAAK;AAAE,aAAA;YACjEC,IAAAA,EAAM;AAAC,gBAAA;oBAAEF,MAAAA,EAAQ,8BAAA;oBAAgCC,OAAAA,EAAS;AAAK;AAAE,aAAA;
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../../../ee/admin/src/constants.ts"],"sourcesContent":["import type { SettingsMenu } from '../../../admin/src/constants';\nimport type { PermissionMap } from '../../../admin/src/types/permissions';\nimport type { RouteObject } from 'react-router-dom';\n\nexport const ADMIN_PERMISSIONS_EE = {\n settings: {\n auditLogs: {\n main: [{ action: 'admin::audit-logs.read', subject: null }],\n read: [{ action: 'admin::audit-logs.read', subject: null }],\n update: [{ action: 'admin::audit-logs.update', subject: null }],\n export: [{ action: 'admin::audit-logs.export', subject: null }],\n },\n 'review-workflows': {\n main: [{ action: 'admin::review-workflows.read', subject: null }],\n read: [{ action: 'admin::review-workflows.read', subject: null }],\n create: [{ action: 'admin::review-workflows.create', subject: null }],\n delete: [{ action: 'admin::review-workflows.delete', subject: null }],\n update: [{ action: 'admin::review-workflows.update', subject: null }],\n },\n sso: {\n main: [{ action: 'admin::provider-login.read', subject: null }],\n read: [{ action: 'admin::provider-login.read', subject: null }],\n update: [{ action: 'admin::provider-login.update', subject: null }],\n },\n releases: {\n read: [\n {\n action: 'plugin::content-releases.settings.read',\n subject: null,\n },\n ],\n update: [\n {\n action: 'plugin::content-releases.settings.update',\n subject: null,\n },\n ],\n },\n },\n} satisfies {\n settings: Pick<PermissionMap['settings'], 'auditLogs' | 'review-workflows' | 'sso' | 'releases'>;\n};\n\n/**\n * Base EE routes, these are relative to the `root` of the app.\n * We use a function to get them so we're not looking at window\n * during build time.\n */\nexport const getEERoutes = (): RouteObject[] =>\n window.strapi.isEE\n ? [\n {\n path: 'auth/login/:authResponse',\n lazy: async () => {\n const { AuthResponse } = await import('./pages/AuthResponse');\n\n return {\n Component: AuthResponse,\n };\n },\n },\n ]\n : [];\n\nexport const AUDIT_LOGS_DEFAULT_PAGE_SIZE = 50;\n\n// TODO: the constants.js file is imported before the React application is setup and\n// therefore `window.strapi` might not exist at import-time. We should probably define\n// which constant is available at which stage of the application lifecycle.\nexport const SETTINGS_LINKS_EE = (): SettingsMenu => ({\n global: window.strapi.features.isEnabled(window.strapi.features.SSO)\n ? [\n {\n intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' },\n to: '/settings/single-sign-on',\n id: 'sso',\n licenseOnly: true,\n },\n ]\n : [],\n\n admin: window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS)\n ? [\n {\n intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' },\n to: `/settings/audit-logs?pageSize=${AUDIT_LOGS_DEFAULT_PAGE_SIZE}&page=1&sort=date:DESC`,\n id: 'auditLogs',\n licenseOnly: true,\n },\n ]\n : [],\n});\n"],"names":["ADMIN_PERMISSIONS_EE","settings","auditLogs","main","action","subject","read","update","export","create","delete","sso","releases","getEERoutes","window","strapi","isEE","path","lazy","AuthResponse","Component","AUDIT_LOGS_DEFAULT_PAGE_SIZE","SETTINGS_LINKS_EE","global","features","isEnabled","SSO","intlLabel","id","defaultMessage","to","licenseOnly","admin","AUDIT_LOGS"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sources":["../../../../../ee/admin/src/constants.ts"],"sourcesContent":["import type { SettingsMenu } from '../../../admin/src/constants';\nimport type { PermissionMap } from '../../../admin/src/types/permissions';\nimport type { RouteObject } from 'react-router-dom';\n\nexport const ADMIN_PERMISSIONS_EE = {\n settings: {\n auditLogs: {\n main: [{ action: 'admin::audit-logs.read', subject: null }],\n read: [{ action: 'admin::audit-logs.read', subject: null }],\n update: [{ action: 'admin::audit-logs.update', subject: null }],\n },\n 'review-workflows': {\n main: [{ action: 'admin::review-workflows.read', subject: null }],\n read: [{ action: 'admin::review-workflows.read', subject: null }],\n create: [{ action: 'admin::review-workflows.create', subject: null }],\n delete: [{ action: 'admin::review-workflows.delete', subject: null }],\n update: [{ action: 'admin::review-workflows.update', subject: null }],\n },\n sso: {\n main: [{ action: 'admin::provider-login.read', subject: null }],\n read: [{ action: 'admin::provider-login.read', subject: null }],\n update: [{ action: 'admin::provider-login.update', subject: null }],\n },\n releases: {\n read: [\n {\n action: 'plugin::content-releases.settings.read',\n subject: null,\n },\n ],\n update: [\n {\n action: 'plugin::content-releases.settings.update',\n subject: null,\n },\n ],\n },\n },\n} satisfies {\n settings: Pick<PermissionMap['settings'], 'auditLogs' | 'review-workflows' | 'sso' | 'releases'>;\n};\n\n/**\n * Base EE routes, these are relative to the `root` of the app.\n * We use a function to get them so we're not looking at window\n * during build time.\n */\nexport const getEERoutes = (): RouteObject[] =>\n window.strapi.isEE\n ? [\n {\n path: 'auth/login/:authResponse',\n lazy: async () => {\n const { AuthResponse } = await import('./pages/AuthResponse');\n\n return {\n Component: AuthResponse,\n };\n },\n },\n ]\n : [];\n\nexport const AUDIT_LOGS_DEFAULT_PAGE_SIZE = 50;\n\n// TODO: the constants.js file is imported before the React application is setup and\n// therefore `window.strapi` might not exist at import-time. We should probably define\n// which constant is available at which stage of the application lifecycle.\nexport const SETTINGS_LINKS_EE = (): SettingsMenu => ({\n global: window.strapi.features.isEnabled(window.strapi.features.SSO)\n ? [\n {\n intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' },\n to: '/settings/single-sign-on',\n id: 'sso',\n licenseOnly: true,\n },\n ]\n : [],\n\n admin: window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS)\n ? [\n {\n intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' },\n to: `/settings/audit-logs?pageSize=${AUDIT_LOGS_DEFAULT_PAGE_SIZE}&page=1&sort=date:DESC`,\n id: 'auditLogs',\n licenseOnly: true,\n },\n ]\n : [],\n});\n"],"names":["ADMIN_PERMISSIONS_EE","settings","auditLogs","main","action","subject","read","update","create","delete","sso","releases","getEERoutes","window","strapi","isEE","path","lazy","AuthResponse","Component","AUDIT_LOGS_DEFAULT_PAGE_SIZE","SETTINGS_LINKS_EE","global","features","isEnabled","SSO","intlLabel","id","defaultMessage","to","licenseOnly","admin","AUDIT_LOGS"],"mappings":"MAIaA,oBAAAA,GAAuB;IAClCC,QAAAA,EAAU;QACRC,SAAAA,EAAW;YACTC,IAAAA,EAAM;AAAC,gBAAA;oBAAEC,MAAAA,EAAQ,wBAAA;oBAA0BC,OAAAA,EAAS;AAAK;AAAE,aAAA;YAC3DC,IAAAA,EAAM;AAAC,gBAAA;oBAAEF,MAAAA,EAAQ,wBAAA;oBAA0BC,OAAAA,EAAS;AAAK;AAAE,aAAA;YAC3DE,MAAAA,EAAQ;AAAC,gBAAA;oBAAEH,MAAAA,EAAQ,0BAAA;oBAA4BC,OAAAA,EAAS;AAAK;AAAE;AACjE,SAAA;QACA,kBAAA,EAAoB;YAClBF,IAAAA,EAAM;AAAC,gBAAA;oBAAEC,MAAAA,EAAQ,8BAAA;oBAAgCC,OAAAA,EAAS;AAAK;AAAE,aAAA;YACjEC,IAAAA,EAAM;AAAC,gBAAA;oBAAEF,MAAAA,EAAQ,8BAAA;oBAAgCC,OAAAA,EAAS;AAAK;AAAE,aAAA;
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../../../../ee/admin/src/constants.ts"],"sourcesContent":["import type { SettingsMenu } from '../../../admin/src/constants';\nimport type { PermissionMap } from '../../../admin/src/types/permissions';\nimport type { RouteObject } from 'react-router-dom';\n\nexport const ADMIN_PERMISSIONS_EE = {\n settings: {\n auditLogs: {\n main: [{ action: 'admin::audit-logs.read', subject: null }],\n read: [{ action: 'admin::audit-logs.read', subject: null }],\n update: [{ action: 'admin::audit-logs.update', subject: null }],\n export: [{ action: 'admin::audit-logs.export', subject: null }],\n },\n 'review-workflows': {\n main: [{ action: 'admin::review-workflows.read', subject: null }],\n read: [{ action: 'admin::review-workflows.read', subject: null }],\n create: [{ action: 'admin::review-workflows.create', subject: null }],\n delete: [{ action: 'admin::review-workflows.delete', subject: null }],\n update: [{ action: 'admin::review-workflows.update', subject: null }],\n },\n sso: {\n main: [{ action: 'admin::provider-login.read', subject: null }],\n read: [{ action: 'admin::provider-login.read', subject: null }],\n update: [{ action: 'admin::provider-login.update', subject: null }],\n },\n releases: {\n read: [\n {\n action: 'plugin::content-releases.settings.read',\n subject: null,\n },\n ],\n update: [\n {\n action: 'plugin::content-releases.settings.update',\n subject: null,\n },\n ],\n },\n },\n} satisfies {\n settings: Pick<PermissionMap['settings'], 'auditLogs' | 'review-workflows' | 'sso' | 'releases'>;\n};\n\n/**\n * Base EE routes, these are relative to the `root` of the app.\n * We use a function to get them so we're not looking at window\n * during build time.\n */\nexport const getEERoutes = (): RouteObject[] =>\n window.strapi.isEE\n ? [\n {\n path: 'auth/login/:authResponse',\n lazy: async () => {\n const { AuthResponse } = await import('./pages/AuthResponse');\n\n return {\n Component: AuthResponse,\n };\n },\n },\n ]\n : [];\n\nexport const AUDIT_LOGS_DEFAULT_PAGE_SIZE = 50;\n\n// TODO: the constants.js file is imported before the React application is setup and\n// therefore `window.strapi` might not exist at import-time. We should probably define\n// which constant is available at which stage of the application lifecycle.\nexport const SETTINGS_LINKS_EE = (): SettingsMenu => ({\n global: window.strapi.features.isEnabled(window.strapi.features.SSO)\n ? [\n {\n intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' },\n to: '/settings/single-sign-on',\n id: 'sso',\n licenseOnly: true,\n },\n ]\n : [],\n\n admin: window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS)\n ? [\n {\n intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' },\n to: `/settings/audit-logs?pageSize=${AUDIT_LOGS_DEFAULT_PAGE_SIZE}&page=1&sort=date:DESC`,\n id: 'auditLogs',\n licenseOnly: true,\n },\n ]\n : [],\n});\n"],"names":["ADMIN_PERMISSIONS_EE","settings","auditLogs","main","action","subject","read","update","export","create","delete","sso","releases","getEERoutes","window","strapi","isEE","path","lazy","AuthResponse","Component","AUDIT_LOGS_DEFAULT_PAGE_SIZE","SETTINGS_LINKS_EE","global","features","isEnabled","SSO","intlLabel","id","defaultMessage","to","licenseOnly","admin","AUDIT_LOGS"],"mappings":"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"}
|
|
@@ -13,8 +13,10 @@ var Table = require('../../../../../../../admin/src/components/Table.js');
|
|
|
13
13
|
var hooks = require('../../../../../../../admin/src/core/store/hooks.js');
|
|
14
14
|
var useQueryParams = require('../../../../../../../admin/src/hooks/useQueryParams.js');
|
|
15
15
|
var useRBAC = require('../../../../../../../admin/src/hooks/useRBAC.js');
|
|
16
|
+
var ExportCard = require('./components/ExportCard.js');
|
|
16
17
|
var Modal = require('./components/Modal.js');
|
|
17
18
|
var useAuditLogsData = require('./hooks/useAuditLogsData.js');
|
|
19
|
+
var useExportAuditLogs = require('./hooks/useExportAuditLogs.js');
|
|
18
20
|
var useFormatTimeStamp = require('./hooks/useFormatTimeStamp.js');
|
|
19
21
|
var getActionTypesDefaultMessages = require('./utils/getActionTypesDefaultMessages.js');
|
|
20
22
|
var getDisplayedFilters = require('./utils/getDisplayedFilters.js');
|
|
@@ -43,8 +45,23 @@ const USERS_PAGE_SIZE = 10;
|
|
|
43
45
|
const ListPage = ()=>{
|
|
44
46
|
const { formatMessage } = reactIntl.useIntl();
|
|
45
47
|
const permissions = hooks.useTypedSelector((state)=>state.admin_app.permissions.settings);
|
|
46
|
-
const
|
|
48
|
+
const readPermissions = permissions?.auditLogs?.read;
|
|
49
|
+
const exportPermissions = permissions?.auditLogs?.export;
|
|
50
|
+
const { allowedActions: { canRead: canReadAuditLogs, canExport: canExportAuditLogs }, isLoading: isLoadingRBAC } = useRBAC.useRBAC(React__namespace.useMemo(()=>[
|
|
51
|
+
...readPermissions ?? [],
|
|
52
|
+
...exportPermissions ?? []
|
|
53
|
+
], [
|
|
54
|
+
readPermissions,
|
|
55
|
+
exportPermissions
|
|
56
|
+
]));
|
|
47
57
|
const [{ query }, setQuery] = useQueryParams.useQueryParams();
|
|
58
|
+
const openLog = (id)=>setQuery(useQueryParams.withEncodedUserParams(query, {
|
|
59
|
+
id
|
|
60
|
+
}), 'push', true);
|
|
61
|
+
const closeLog = ()=>setQuery(useQueryParams.withEncodedUserParams(query, {
|
|
62
|
+
id: undefined
|
|
63
|
+
}), 'push', true);
|
|
64
|
+
const { exportAuditLogs, downloadExport, dismissExport, isExporting, progress, exportResult } = useExportAuditLogs.useExportAuditLogs();
|
|
48
65
|
const [usersPageSize, setUsersPageSize] = React__namespace.useState(USERS_PAGE_SIZE);
|
|
49
66
|
const { auditLogs, users, usersPagination, isLoadingUsers, isLoading: isLoadingData, hasError } = useAuditLogsData.useAuditLogsData({
|
|
50
67
|
canReadAuditLogs,
|
|
@@ -91,8 +108,8 @@ const ListPage = ()=>{
|
|
|
91
108
|
defaultMessage: 'User'
|
|
92
109
|
}),
|
|
93
110
|
sortable: false,
|
|
94
|
-
//
|
|
95
|
-
cellFormatter: ({ user })=>user ? user.displayName : ''
|
|
111
|
+
// System actions, such as a scheduled release publish, have no user
|
|
112
|
+
cellFormatter: ({ user })=>user ? user.displayName : '-'
|
|
96
113
|
}
|
|
97
114
|
];
|
|
98
115
|
if (hasError) {
|
|
@@ -100,6 +117,7 @@ const ListPage = ()=>{
|
|
|
100
117
|
}
|
|
101
118
|
const isLoading = isLoadingData || isLoadingRBAC;
|
|
102
119
|
const { results = [] } = auditLogs ?? {};
|
|
120
|
+
const totalEntries = auditLogs?.pagination?.total;
|
|
103
121
|
return /*#__PURE__*/ jsxRuntime.jsxs(PageHelpers.Page.Main, {
|
|
104
122
|
"aria-busy": isLoading,
|
|
105
123
|
children: [
|
|
@@ -122,6 +140,16 @@ const ListPage = ()=>{
|
|
|
122
140
|
subtitle: formatMessage({
|
|
123
141
|
id: 'Settings.permissions.auditLogs.listview.header.subtitle',
|
|
124
142
|
defaultMessage: 'Logs of all the activities that happened in your environment'
|
|
143
|
+
}),
|
|
144
|
+
primaryAction: canExportAuditLogs && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
|
|
145
|
+
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Download, {}),
|
|
146
|
+
loading: isExporting,
|
|
147
|
+
disabled: isLoading || totalEntries === 0,
|
|
148
|
+
onClick: ()=>exportAuditLogs(query?.filters, totalEntries ?? 0),
|
|
149
|
+
children: formatMessage({
|
|
150
|
+
id: 'Settings.permissions.auditLogs.listview.export',
|
|
151
|
+
defaultMessage: 'Export as CSV'
|
|
152
|
+
})
|
|
125
153
|
})
|
|
126
154
|
}),
|
|
127
155
|
/*#__PURE__*/ jsxRuntime.jsx(Layout.Layouts.Action, {
|
|
@@ -153,9 +181,7 @@ const ListPage = ()=>{
|
|
|
153
181
|
/*#__PURE__*/ jsxRuntime.jsx(Table.Table.Loading, {}),
|
|
154
182
|
/*#__PURE__*/ jsxRuntime.jsx(Table.Table.Body, {
|
|
155
183
|
children: results.map((log)=>/*#__PURE__*/ jsxRuntime.jsxs(Table.Table.Row, {
|
|
156
|
-
onClick: ()=>
|
|
157
|
-
id: log.id
|
|
158
|
-
}, 'push', true),
|
|
184
|
+
onClick: ()=>openLog(log.id),
|
|
159
185
|
children: [
|
|
160
186
|
headers.map((header)=>{
|
|
161
187
|
const { name, cellFormatter } = header;
|
|
@@ -201,9 +227,7 @@ const ListPage = ()=>{
|
|
|
201
227
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
202
228
|
justifyContent: "end",
|
|
203
229
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
204
|
-
onClick: ()=>
|
|
205
|
-
id: log.id
|
|
206
|
-
}, 'push', true),
|
|
230
|
+
onClick: ()=>openLog(log.id),
|
|
207
231
|
withTooltip: false,
|
|
208
232
|
label: formatMessage({
|
|
209
233
|
id: 'app.component.table.view',
|
|
@@ -232,10 +256,14 @@ const ListPage = ()=>{
|
|
|
232
256
|
]
|
|
233
257
|
}),
|
|
234
258
|
query?.id && /*#__PURE__*/ jsxRuntime.jsx(Modal.Modal, {
|
|
235
|
-
handleClose:
|
|
236
|
-
id: ''
|
|
237
|
-
}, 'remove', true),
|
|
259
|
+
handleClose: closeLog,
|
|
238
260
|
logId: query.id.toString()
|
|
261
|
+
}),
|
|
262
|
+
/*#__PURE__*/ jsxRuntime.jsx(ExportCard.ExportCard, {
|
|
263
|
+
progress: progress,
|
|
264
|
+
exportResult: exportResult,
|
|
265
|
+
onDownload: downloadExport,
|
|
266
|
+
onDismiss: dismissExport
|
|
239
267
|
})
|
|
240
268
|
]
|
|
241
269
|
});
|
|
@@ -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 { useQueryParams } 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<{ id?: AuditLog['id'] }>();\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={() => setQuery({ id: log.id }, 'push', true)}>\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={() => setQuery({ id: log.id }, 'push', true)}\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 && (\n <Modal\n handleClose={() => setQuery({ id: '' }, 'remove', true)}\n logId={query.id.toString()}\n />\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","allowedActions","canRead","canReadAuditLogs","isLoading","isLoadingRBAC","useRBAC","auditLogs","read","query","setQuery","useQueryParams","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","id","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';
|
|
@@ -9,10 +9,12 @@ import { Page } from '../../../../../../../admin/src/components/PageHelpers.mjs'
|
|
|
9
9
|
import { Pagination } from '../../../../../../../admin/src/components/Pagination.mjs';
|
|
10
10
|
import { Table } from '../../../../../../../admin/src/components/Table.mjs';
|
|
11
11
|
import { useTypedSelector } from '../../../../../../../admin/src/core/store/hooks.mjs';
|
|
12
|
-
import { useQueryParams } from '../../../../../../../admin/src/hooks/useQueryParams.mjs';
|
|
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,8 +23,23 @@ 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
|
|
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();
|
|
36
|
+
const openLog = (id)=>setQuery(withEncodedUserParams(query, {
|
|
37
|
+
id
|
|
38
|
+
}), 'push', true);
|
|
39
|
+
const closeLog = ()=>setQuery(withEncodedUserParams(query, {
|
|
40
|
+
id: undefined
|
|
41
|
+
}), 'push', true);
|
|
42
|
+
const { exportAuditLogs, downloadExport, dismissExport, isExporting, progress, exportResult } = useExportAuditLogs();
|
|
26
43
|
const [usersPageSize, setUsersPageSize] = React.useState(USERS_PAGE_SIZE);
|
|
27
44
|
const { auditLogs, users, usersPagination, isLoadingUsers, isLoading: isLoadingData, hasError } = useAuditLogsData({
|
|
28
45
|
canReadAuditLogs,
|
|
@@ -69,8 +86,8 @@ const ListPage = ()=>{
|
|
|
69
86
|
defaultMessage: 'User'
|
|
70
87
|
}),
|
|
71
88
|
sortable: false,
|
|
72
|
-
//
|
|
73
|
-
cellFormatter: ({ user })=>user ? user.displayName : ''
|
|
89
|
+
// System actions, such as a scheduled release publish, have no user
|
|
90
|
+
cellFormatter: ({ user })=>user ? user.displayName : '-'
|
|
74
91
|
}
|
|
75
92
|
];
|
|
76
93
|
if (hasError) {
|
|
@@ -78,6 +95,7 @@ const ListPage = ()=>{
|
|
|
78
95
|
}
|
|
79
96
|
const isLoading = isLoadingData || isLoadingRBAC;
|
|
80
97
|
const { results = [] } = auditLogs ?? {};
|
|
98
|
+
const totalEntries = auditLogs?.pagination?.total;
|
|
81
99
|
return /*#__PURE__*/ jsxs(Page.Main, {
|
|
82
100
|
"aria-busy": isLoading,
|
|
83
101
|
children: [
|
|
@@ -100,6 +118,16 @@ const ListPage = ()=>{
|
|
|
100
118
|
subtitle: formatMessage({
|
|
101
119
|
id: 'Settings.permissions.auditLogs.listview.header.subtitle',
|
|
102
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
|
+
})
|
|
103
131
|
})
|
|
104
132
|
}),
|
|
105
133
|
/*#__PURE__*/ jsx(Layouts.Action, {
|
|
@@ -131,9 +159,7 @@ const ListPage = ()=>{
|
|
|
131
159
|
/*#__PURE__*/ jsx(Table.Loading, {}),
|
|
132
160
|
/*#__PURE__*/ jsx(Table.Body, {
|
|
133
161
|
children: results.map((log)=>/*#__PURE__*/ jsxs(Table.Row, {
|
|
134
|
-
onClick: ()=>
|
|
135
|
-
id: log.id
|
|
136
|
-
}, 'push', true),
|
|
162
|
+
onClick: ()=>openLog(log.id),
|
|
137
163
|
children: [
|
|
138
164
|
headers.map((header)=>{
|
|
139
165
|
const { name, cellFormatter } = header;
|
|
@@ -179,9 +205,7 @@ const ListPage = ()=>{
|
|
|
179
205
|
children: /*#__PURE__*/ jsx(Flex, {
|
|
180
206
|
justifyContent: "end",
|
|
181
207
|
children: /*#__PURE__*/ jsx(IconButton, {
|
|
182
|
-
onClick: ()=>
|
|
183
|
-
id: log.id
|
|
184
|
-
}, 'push', true),
|
|
208
|
+
onClick: ()=>openLog(log.id),
|
|
185
209
|
withTooltip: false,
|
|
186
210
|
label: formatMessage({
|
|
187
211
|
id: 'app.component.table.view',
|
|
@@ -210,10 +234,14 @@ const ListPage = ()=>{
|
|
|
210
234
|
]
|
|
211
235
|
}),
|
|
212
236
|
query?.id && /*#__PURE__*/ jsx(Modal, {
|
|
213
|
-
handleClose:
|
|
214
|
-
id: ''
|
|
215
|
-
}, 'remove', true),
|
|
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 { useQueryParams } 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<{ id?: AuditLog['id'] }>();\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={() => setQuery({ id: log.id }, 'push', true)}>\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={() => setQuery({ id: log.id }, 'push', true)}\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 && (\n <Modal\n handleClose={() => setQuery({ id: '' }, 'remove', true)}\n logId={query.id.toString()}\n />\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","allowedActions","canRead","canReadAuditLogs","isLoading","isLoadingRBAC","useRBAC","auditLogs","read","query","setQuery","useQueryParams","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","id","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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"}
|