@strapi/admin 5.52.1 → 5.52.3
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/pages/Auth/AuthPage.js +14 -9
- package/dist/admin/admin/src/pages/Auth/AuthPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/AuthPage.mjs +15 -10
- package/dist/admin/admin/src/pages/Auth/AuthPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.js +2 -6
- package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.mjs +2 -6
- package/dist/admin/admin/src/pages/Auth/components/Login.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/constants.js +24 -8
- package/dist/admin/admin/src/pages/Auth/constants.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/constants.mjs +23 -9
- package/dist/admin/admin/src/pages/Auth/constants.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/utils.js +34 -0
- package/dist/admin/admin/src/pages/Auth/utils.js.map +1 -0
- package/dist/admin/admin/src/pages/Auth/utils.mjs +32 -0
- package/dist/admin/admin/src/pages/Auth/utils.mjs.map +1 -0
- package/dist/admin/admin/src/translations/pt-BR.json.js +1 -1
- package/dist/admin/admin/src/translations/pt-BR.json.mjs +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +4 -0
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +4 -0
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.js +27 -9
- package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.mjs +2 -2
- package/dist/admin/admin/src/utils/rulesEngine.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +9 -9
- 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 +10 -10
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -2
- 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/pages/Auth/constants.d.ts +19 -5
- package/dist/admin/src/pages/Auth/utils.d.ts +7 -0
- package/dist/admin/src/utils/rulesEngine.d.ts +9 -13
- package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.js +22 -4
- 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 +22 -4
- 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 +1 -1
- 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 +1 -1
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
- package/dist/server/server/src/controllers/validation/schema.js +36 -16
- package/dist/server/server/src/controllers/validation/schema.js.map +1 -1
- package/dist/server/server/src/controllers/validation/schema.mjs +1 -1
- package/dist/server/server/src/controllers/validation/schema.mjs.map +1 -1
- package/dist/server/server/src/services/content-type.js +8 -3
- package/dist/server/server/src/services/content-type.js.map +1 -1
- package/dist/server/server/src/services/content-type.mjs +8 -3
- package/dist/server/server/src/services/content-type.mjs.map +1 -1
- package/dist/server/server/src/services/permission/queries.js +3 -1
- package/dist/server/server/src/services/permission/queries.js.map +1 -1
- package/dist/server/server/src/services/permission/queries.mjs +3 -1
- package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
- package/dist/server/src/controllers/validation/schema.d.ts +8 -48
- package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
- package/dist/server/src/services/content-type.d.ts.map +1 -1
- package/dist/server/src/services/permission/queries.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rulesEngine.js","sources":["../../../../../admin/src/utils/rulesEngine.ts"],"sourcesContent":["import jsonLogic from 'json-logic-js';\nimport
|
|
1
|
+
{"version":3,"file":"rulesEngine.js","sources":["../../../../../admin/src/utils/rulesEngine.ts"],"sourcesContent":["import jsonLogic from 'json-logic-js';\nimport * as z from 'zod/v4';\n\nconst ConditionSchema = z.object({\n dependsOn: z.string().min(1),\n operator: z.enum(['is', 'isNot']),\n value: z.union([z.string(), z.number(), z.boolean()]),\n});\n\nexport type Condition = z.infer<typeof ConditionSchema>;\nexport type JsonLogicCondition = jsonLogic.RulesLogic<jsonLogic.AdditionalOperation>;\nexport type RulesEngine = {\n generate: (condition: Condition) => JsonLogicCondition;\n validate: (condition: Condition) => void;\n evaluate: (condition: JsonLogicCondition, data: unknown) => boolean;\n};\n\nexport function createRulesEngine(): RulesEngine {\n /**\n * Transforms a high-level `Condition` object into a JSON Logic-compatible condition.\n *\n * Converts operators like 'is' and 'isNot' into their JSON Logic equivalents ('==' and '!=').\n * Throws an error if the operator is not supported.\n *\n * @param condition - The condition object to convert.\n * @returns A JSON Logic AST representing the condition.\n * @throws {Error} If the operator is not recognized.\n */\n const generate = (condition: Condition): JsonLogicCondition => {\n const { dependsOn, operator, value } = condition;\n const operatorsMap = {\n is: '==',\n isNot: '!=',\n };\n if (!operatorsMap[operator]) {\n throw new Error(`Invalid operator: ${operator}`);\n }\n return { [operatorsMap[operator]]: [{ var: dependsOn }, value] };\n };\n\n /**\n * Validates a condition object against the `ConditionSchema`.\n *\n * Ensures that the condition adheres to the expected structure and types.\n *\n * @param condition - The condition object to validate.\n * @throws {ZodError} If the condition is invalid.\n */\n const validate = (condition: Condition) => {\n ConditionSchema.parse(condition);\n };\n\n /**\n * Evaluates a JSON Logic condition against provided data.\n * @throws {Error} If the condition is invalid.\n */\n const evaluate = (\n condition: jsonLogic.RulesLogic<jsonLogic.AdditionalOperation>,\n data: unknown\n ): boolean => {\n try {\n return jsonLogic.apply(condition, data);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n\n throw new Error(`Invalid condition: ${message}`);\n }\n };\n\n return {\n generate,\n validate,\n evaluate,\n };\n}\n"],"names":["ConditionSchema","z","object","dependsOn","string","min","operator","enum","value","union","number","boolean","createRulesEngine","generate","condition","operatorsMap","is","isNot","Error","var","validate","parse","evaluate","data","jsonLogic","apply","err","message","String"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAMA,eAAAA,GAAkBC,YAAAA,CAAEC,MAAM,CAAC;AAC/BC,IAAAA,SAAAA,EAAWF,YAAAA,CAAEG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA;IAC1BC,QAAAA,EAAUL,YAAAA,CAAEM,IAAI,CAAC;AAAC,QAAA,IAAA;AAAM,QAAA;AAAQ,KAAA,CAAA;IAChCC,KAAAA,EAAOP,YAAAA,CAAEQ,KAAK,CAAC;AAACR,QAAAA,YAAAA,CAAEG,MAAM,EAAA;AAAIH,QAAAA,YAAAA,CAAES,MAAM,EAAA;AAAIT,QAAAA,YAAAA,CAAEU,OAAO;AAAG,KAAA;AACtD,CAAA,CAAA;AAUO,SAASC,iBAAAA,GAAAA;AACd;;;;;;;;;MAUA,MAAMC,WAAW,CAACC,SAAAA,GAAAA;AAChB,QAAA,MAAM,EAAEX,SAAS,EAAEG,QAAQ,EAAEE,KAAK,EAAE,GAAGM,SAAAA;AACvC,QAAA,MAAMC,YAAAA,GAAe;YACnBC,EAAAA,EAAI,IAAA;YACJC,KAAAA,EAAO;AACT,SAAA;AACA,QAAA,IAAI,CAACF,YAAY,CAACT,QAAAA,CAAS,EAAE;AAC3B,YAAA,MAAM,IAAIY,KAAAA,CAAM,CAAC,kBAAkB,EAAEZ,QAAAA,CAAAA,CAAU,CAAA;AACjD,QAAA;QACA,OAAO;AAAE,YAAA,CAACS,YAAY,CAACT,QAAAA,CAAS,GAAG;AAAC,gBAAA;oBAAEa,GAAAA,EAAKhB;AAAU,iBAAA;AAAGK,gBAAAA;AAAM;AAAC,SAAA;AACjE,IAAA,CAAA;AAEA;;;;;;;MAQA,MAAMY,WAAW,CAACN,SAAAA,GAAAA;AAChBd,QAAAA,eAAAA,CAAgBqB,KAAK,CAACP,SAAAA,CAAAA;AACxB,IAAA,CAAA;AAEA;;;MAIA,MAAMQ,QAAAA,GAAW,CACfR,SAAAA,EACAS,IAAAA,GAAAA;QAEA,IAAI;YACF,OAAOC,0BAAAA,CAAUC,KAAK,CAACX,SAAAA,EAAWS,IAAAA,CAAAA;AACpC,QAAA,CAAA,CAAE,OAAOG,GAAAA,EAAc;AACrB,YAAA,MAAMC,UAAUD,GAAAA,YAAeR,KAAAA,GAAQQ,GAAAA,CAAIC,OAAO,GAAGC,MAAAA,CAAOF,GAAAA,CAAAA;AAE5D,YAAA,MAAM,IAAIR,KAAAA,CAAM,CAAC,mBAAmB,EAAES,OAAAA,CAAAA,CAAS,CAAA;AACjD,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLd,QAAAA,QAAAA;AACAO,QAAAA,QAAAA;AACAE,QAAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import jsonLogic from 'json-logic-js';
|
|
2
|
-
import
|
|
2
|
+
import * as z from 'zod/v4';
|
|
3
3
|
|
|
4
4
|
const ConditionSchema = z.object({
|
|
5
5
|
dependsOn: z.string().min(1),
|
|
@@ -69,5 +69,5 @@ function createRulesEngine() {
|
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
export {
|
|
72
|
+
export { createRulesEngine };
|
|
73
73
|
//# sourceMappingURL=rulesEngine.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rulesEngine.mjs","sources":["../../../../../admin/src/utils/rulesEngine.ts"],"sourcesContent":["import jsonLogic from 'json-logic-js';\nimport
|
|
1
|
+
{"version":3,"file":"rulesEngine.mjs","sources":["../../../../../admin/src/utils/rulesEngine.ts"],"sourcesContent":["import jsonLogic from 'json-logic-js';\nimport * as z from 'zod/v4';\n\nconst ConditionSchema = z.object({\n dependsOn: z.string().min(1),\n operator: z.enum(['is', 'isNot']),\n value: z.union([z.string(), z.number(), z.boolean()]),\n});\n\nexport type Condition = z.infer<typeof ConditionSchema>;\nexport type JsonLogicCondition = jsonLogic.RulesLogic<jsonLogic.AdditionalOperation>;\nexport type RulesEngine = {\n generate: (condition: Condition) => JsonLogicCondition;\n validate: (condition: Condition) => void;\n evaluate: (condition: JsonLogicCondition, data: unknown) => boolean;\n};\n\nexport function createRulesEngine(): RulesEngine {\n /**\n * Transforms a high-level `Condition` object into a JSON Logic-compatible condition.\n *\n * Converts operators like 'is' and 'isNot' into their JSON Logic equivalents ('==' and '!=').\n * Throws an error if the operator is not supported.\n *\n * @param condition - The condition object to convert.\n * @returns A JSON Logic AST representing the condition.\n * @throws {Error} If the operator is not recognized.\n */\n const generate = (condition: Condition): JsonLogicCondition => {\n const { dependsOn, operator, value } = condition;\n const operatorsMap = {\n is: '==',\n isNot: '!=',\n };\n if (!operatorsMap[operator]) {\n throw new Error(`Invalid operator: ${operator}`);\n }\n return { [operatorsMap[operator]]: [{ var: dependsOn }, value] };\n };\n\n /**\n * Validates a condition object against the `ConditionSchema`.\n *\n * Ensures that the condition adheres to the expected structure and types.\n *\n * @param condition - The condition object to validate.\n * @throws {ZodError} If the condition is invalid.\n */\n const validate = (condition: Condition) => {\n ConditionSchema.parse(condition);\n };\n\n /**\n * Evaluates a JSON Logic condition against provided data.\n * @throws {Error} If the condition is invalid.\n */\n const evaluate = (\n condition: jsonLogic.RulesLogic<jsonLogic.AdditionalOperation>,\n data: unknown\n ): boolean => {\n try {\n return jsonLogic.apply(condition, data);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n\n throw new Error(`Invalid condition: ${message}`);\n }\n };\n\n return {\n generate,\n validate,\n evaluate,\n };\n}\n"],"names":["ConditionSchema","z","object","dependsOn","string","min","operator","enum","value","union","number","boolean","createRulesEngine","generate","condition","operatorsMap","is","isNot","Error","var","validate","parse","evaluate","data","jsonLogic","apply","err","message","String"],"mappings":";;;AAGA,MAAMA,eAAAA,GAAkBC,CAAAA,CAAEC,MAAM,CAAC;AAC/BC,IAAAA,SAAAA,EAAWF,CAAAA,CAAEG,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA;IAC1BC,QAAAA,EAAUL,CAAAA,CAAEM,IAAI,CAAC;AAAC,QAAA,IAAA;AAAM,QAAA;AAAQ,KAAA,CAAA;IAChCC,KAAAA,EAAOP,CAAAA,CAAEQ,KAAK,CAAC;AAACR,QAAAA,CAAAA,CAAEG,MAAM,EAAA;AAAIH,QAAAA,CAAAA,CAAES,MAAM,EAAA;AAAIT,QAAAA,CAAAA,CAAEU,OAAO;AAAG,KAAA;AACtD,CAAA,CAAA;AAUO,SAASC,iBAAAA,GAAAA;AACd;;;;;;;;;MAUA,MAAMC,WAAW,CAACC,SAAAA,GAAAA;AAChB,QAAA,MAAM,EAAEX,SAAS,EAAEG,QAAQ,EAAEE,KAAK,EAAE,GAAGM,SAAAA;AACvC,QAAA,MAAMC,YAAAA,GAAe;YACnBC,EAAAA,EAAI,IAAA;YACJC,KAAAA,EAAO;AACT,SAAA;AACA,QAAA,IAAI,CAACF,YAAY,CAACT,QAAAA,CAAS,EAAE;AAC3B,YAAA,MAAM,IAAIY,KAAAA,CAAM,CAAC,kBAAkB,EAAEZ,QAAAA,CAAAA,CAAU,CAAA;AACjD,QAAA;QACA,OAAO;AAAE,YAAA,CAACS,YAAY,CAACT,QAAAA,CAAS,GAAG;AAAC,gBAAA;oBAAEa,GAAAA,EAAKhB;AAAU,iBAAA;AAAGK,gBAAAA;AAAM;AAAC,SAAA;AACjE,IAAA,CAAA;AAEA;;;;;;;MAQA,MAAMY,WAAW,CAACN,SAAAA,GAAAA;AAChBd,QAAAA,eAAAA,CAAgBqB,KAAK,CAACP,SAAAA,CAAAA;AACxB,IAAA,CAAA;AAEA;;;MAIA,MAAMQ,QAAAA,GAAW,CACfR,SAAAA,EACAS,IAAAA,GAAAA;QAEA,IAAI;YACF,OAAOC,SAAAA,CAAUC,KAAK,CAACX,SAAAA,EAAWS,IAAAA,CAAAA;AACpC,QAAA,CAAA,CAAE,OAAOG,GAAAA,EAAc;AACrB,YAAA,MAAMC,UAAUD,GAAAA,YAAeR,KAAAA,GAAQQ,GAAAA,CAAIC,OAAO,GAAGC,MAAAA,CAAOF,GAAAA,CAAAA;AAE5D,YAAA,MAAM,IAAIR,KAAAA,CAAM,CAAC,mBAAmB,EAAES,OAAAA,CAAAA,CAAS,CAAA;AACjD,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLd,QAAAA,QAAAA;AACAO,QAAAA,QAAAA;AACAE,QAAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -45,6 +45,12 @@ const ListPage = ()=>{
|
|
|
45
45
|
const permissions = hooks.useTypedSelector((state)=>state.admin_app.permissions.settings);
|
|
46
46
|
const { allowedActions: { canRead: canReadAuditLogs }, isLoading: isLoadingRBAC } = useRBAC.useRBAC(permissions?.auditLogs?.read || []);
|
|
47
47
|
const [{ query }, setQuery] = useQueryParams.useQueryParams();
|
|
48
|
+
const openLog = (id)=>setQuery(useQueryParams.withEncodedUserParams(query, {
|
|
49
|
+
id
|
|
50
|
+
}), 'push', true);
|
|
51
|
+
const closeLog = ()=>setQuery(useQueryParams.withEncodedUserParams(query, {
|
|
52
|
+
id: undefined
|
|
53
|
+
}), 'push', true);
|
|
48
54
|
const [usersPageSize, setUsersPageSize] = React__namespace.useState(USERS_PAGE_SIZE);
|
|
49
55
|
const { auditLogs, users, usersPagination, isLoadingUsers, isLoading: isLoadingData, hasError } = useAuditLogsData.useAuditLogsData({
|
|
50
56
|
canReadAuditLogs,
|
|
@@ -153,9 +159,7 @@ const ListPage = ()=>{
|
|
|
153
159
|
/*#__PURE__*/ jsxRuntime.jsx(Table.Table.Loading, {}),
|
|
154
160
|
/*#__PURE__*/ jsxRuntime.jsx(Table.Table.Body, {
|
|
155
161
|
children: results.map((log)=>/*#__PURE__*/ jsxRuntime.jsxs(Table.Table.Row, {
|
|
156
|
-
onClick: ()=>
|
|
157
|
-
id: log.id
|
|
158
|
-
}, 'push', true),
|
|
162
|
+
onClick: ()=>openLog(log.id),
|
|
159
163
|
children: [
|
|
160
164
|
headers.map((header)=>{
|
|
161
165
|
const { name, cellFormatter } = header;
|
|
@@ -201,9 +205,7 @@ const ListPage = ()=>{
|
|
|
201
205
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
202
206
|
justifyContent: "end",
|
|
203
207
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
204
|
-
onClick: ()=>
|
|
205
|
-
id: log.id
|
|
206
|
-
}, 'push', true),
|
|
208
|
+
onClick: ()=>openLog(log.id),
|
|
207
209
|
withTooltip: false,
|
|
208
210
|
label: formatMessage({
|
|
209
211
|
id: 'app.component.table.view',
|
|
@@ -232,9 +234,7 @@ const ListPage = ()=>{
|
|
|
232
234
|
]
|
|
233
235
|
}),
|
|
234
236
|
query?.id && /*#__PURE__*/ jsxRuntime.jsx(Modal.Modal, {
|
|
235
|
-
handleClose:
|
|
236
|
-
id: ''
|
|
237
|
-
}, 'remove', true),
|
|
237
|
+
handleClose: closeLog,
|
|
238
238
|
logId: query.id.toString()
|
|
239
239
|
})
|
|
240
240
|
]
|
|
@@ -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 { 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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"}
|
|
@@ -9,7 +9,7 @@ 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
14
|
import { Modal } from './components/Modal.mjs';
|
|
15
15
|
import { useAuditLogsData } from './hooks/useAuditLogsData.mjs';
|
|
@@ -23,6 +23,12 @@ const ListPage = ()=>{
|
|
|
23
23
|
const permissions = useTypedSelector((state)=>state.admin_app.permissions.settings);
|
|
24
24
|
const { allowedActions: { canRead: canReadAuditLogs }, isLoading: isLoadingRBAC } = useRBAC(permissions?.auditLogs?.read || []);
|
|
25
25
|
const [{ query }, setQuery] = useQueryParams();
|
|
26
|
+
const openLog = (id)=>setQuery(withEncodedUserParams(query, {
|
|
27
|
+
id
|
|
28
|
+
}), 'push', true);
|
|
29
|
+
const closeLog = ()=>setQuery(withEncodedUserParams(query, {
|
|
30
|
+
id: undefined
|
|
31
|
+
}), 'push', true);
|
|
26
32
|
const [usersPageSize, setUsersPageSize] = React.useState(USERS_PAGE_SIZE);
|
|
27
33
|
const { auditLogs, users, usersPagination, isLoadingUsers, isLoading: isLoadingData, hasError } = useAuditLogsData({
|
|
28
34
|
canReadAuditLogs,
|
|
@@ -131,9 +137,7 @@ const ListPage = ()=>{
|
|
|
131
137
|
/*#__PURE__*/ jsx(Table.Loading, {}),
|
|
132
138
|
/*#__PURE__*/ jsx(Table.Body, {
|
|
133
139
|
children: results.map((log)=>/*#__PURE__*/ jsxs(Table.Row, {
|
|
134
|
-
onClick: ()=>
|
|
135
|
-
id: log.id
|
|
136
|
-
}, 'push', true),
|
|
140
|
+
onClick: ()=>openLog(log.id),
|
|
137
141
|
children: [
|
|
138
142
|
headers.map((header)=>{
|
|
139
143
|
const { name, cellFormatter } = header;
|
|
@@ -179,9 +183,7 @@ const ListPage = ()=>{
|
|
|
179
183
|
children: /*#__PURE__*/ jsx(Flex, {
|
|
180
184
|
justifyContent: "end",
|
|
181
185
|
children: /*#__PURE__*/ jsx(IconButton, {
|
|
182
|
-
onClick: ()=>
|
|
183
|
-
id: log.id
|
|
184
|
-
}, 'push', true),
|
|
186
|
+
onClick: ()=>openLog(log.id),
|
|
185
187
|
withTooltip: false,
|
|
186
188
|
label: formatMessage({
|
|
187
189
|
id: 'app.component.table.view',
|
|
@@ -210,9 +212,7 @@ const ListPage = ()=>{
|
|
|
210
212
|
]
|
|
211
213
|
}),
|
|
212
214
|
query?.id && /*#__PURE__*/ jsx(Modal, {
|
|
213
|
-
handleClose:
|
|
214
|
-
id: ''
|
|
215
|
-
}, 'remove', true),
|
|
215
|
+
handleClose: closeLog,
|
|
216
216
|
logId: query.id.toString()
|
|
217
217
|
})
|
|
218
218
|
]
|
|
@@ -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 { 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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"}
|
package/dist/admin/index.js
CHANGED
|
@@ -88,7 +88,9 @@ exports.useAppInfo = AppInfo.useAppInfo;
|
|
|
88
88
|
exports.useAuth = Auth.useAuth;
|
|
89
89
|
exports.useInjectReducer = useInjectReducer.useInjectReducer;
|
|
90
90
|
exports.useAPIErrorHandler = useAPIErrorHandler.useAPIErrorHandler;
|
|
91
|
+
exports.deepEncodeQueryValues = useQueryParams.deepEncodeQueryValues;
|
|
91
92
|
exports.useQueryParams = useQueryParams.useQueryParams;
|
|
93
|
+
exports.withEncodedUserParams = useQueryParams.withEncodedUserParams;
|
|
92
94
|
exports.useFetchClient = useFetchClient.useFetchClient;
|
|
93
95
|
exports.useFocusInputField = useFocusInputField.useFocusInputField;
|
|
94
96
|
exports.useRBAC = useRBAC.useRBAC;
|
|
@@ -116,7 +118,6 @@ exports.storeToken = getFetchClient.storeToken;
|
|
|
116
118
|
exports.triggerSessionExpired = getFetchClient.triggerSessionExpired;
|
|
117
119
|
exports.fetchBaseQuery = baseQuery.fetchBaseQuery;
|
|
118
120
|
exports.isBaseQueryError = baseQuery.isBaseQueryError;
|
|
119
|
-
exports.ConditionSchema = rulesEngine.ConditionSchema;
|
|
120
121
|
exports.createRulesEngine = rulesEngine.createRulesEngine;
|
|
121
122
|
exports.getDisplayName = users.getDisplayName;
|
|
122
123
|
exports.getInitials = users.getInitials;
|
package/dist/admin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/admin/index.mjs
CHANGED
|
@@ -26,7 +26,7 @@ export { useAppInfo } from './admin/src/features/AppInfo.mjs';
|
|
|
26
26
|
export { useAuth } from './admin/src/features/Auth.mjs';
|
|
27
27
|
export { useInjectReducer } from './admin/src/hooks/useInjectReducer.mjs';
|
|
28
28
|
export { useAPIErrorHandler } from './admin/src/hooks/useAPIErrorHandler.mjs';
|
|
29
|
-
export { useQueryParams } from './admin/src/hooks/useQueryParams.mjs';
|
|
29
|
+
export { deepEncodeQueryValues, useQueryParams, withEncodedUserParams } from './admin/src/hooks/useQueryParams.mjs';
|
|
30
30
|
export { useFetchClient } from './admin/src/hooks/useFetchClient.mjs';
|
|
31
31
|
export { useFocusInputField } from './admin/src/hooks/useFocusInputField.mjs';
|
|
32
32
|
export { useRBAC } from './admin/src/hooks/useRBAC.mjs';
|
|
@@ -41,7 +41,7 @@ export { useGetCountDocumentsQuery } from './admin/src/services/homepage.mjs';
|
|
|
41
41
|
export { translatedErrors } from './admin/src/utils/translatedErrors.mjs';
|
|
42
42
|
export { FetchError, attemptTokenRefresh, getFetchClient, isFetchError, setOnSessionExpired, setOnTokenUpdate, storeToken, triggerSessionExpired } from './admin/src/utils/getFetchClient.mjs';
|
|
43
43
|
export { fetchBaseQuery, isBaseQueryError } from './admin/src/utils/baseQuery.mjs';
|
|
44
|
-
export {
|
|
44
|
+
export { createRulesEngine } from './admin/src/utils/rulesEngine.mjs';
|
|
45
45
|
export { getDisplayName, getInitials, hashAdminUserEmail } from './admin/src/utils/users.mjs';
|
|
46
46
|
export { adminApi } from './admin/src/services/api.mjs';
|
|
47
47
|
export { Layouts } from './admin/src/components/Layouts/Layout.mjs';
|
|
@@ -3,4 +3,16 @@ declare const useQueryParams: <TQuery extends object = QueryParams>(initialParam
|
|
|
3
3
|
readonly query: TQuery;
|
|
4
4
|
readonly rawQuery: string;
|
|
5
5
|
}, (nextParams: TQuery, method?: "push" | "remove", replace?: boolean) => void];
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* These functions are used to encode query values when writing them to the URL.
|
|
8
|
+
* As stated above, it should be handled by `useQueryParams` instead, but that would be a breaking change.
|
|
9
|
+
*/
|
|
10
|
+
declare const deepEncodeQueryValues: <T>(value: T) => T;
|
|
11
|
+
declare const withEncodedUserParams: <T extends object, TQuery extends {
|
|
12
|
+
filters?: unknown;
|
|
13
|
+
_q?: unknown;
|
|
14
|
+
}>(query: TQuery, nextParams: T) => T & {
|
|
15
|
+
filters?: TQuery["filters"];
|
|
16
|
+
_q?: TQuery["_q"];
|
|
17
|
+
};
|
|
18
|
+
export { useQueryParams, deepEncodeQueryValues, withEncodedUserParams };
|
|
@@ -44,7 +44,7 @@ export { useHistory } from './features/BackButton';
|
|
|
44
44
|
*/
|
|
45
45
|
export { useInjectReducer } from './hooks/useInjectReducer';
|
|
46
46
|
export { useAPIErrorHandler } from './hooks/useAPIErrorHandler';
|
|
47
|
-
export { useQueryParams } from './hooks/useQueryParams';
|
|
47
|
+
export { useQueryParams, deepEncodeQueryValues, withEncodedUserParams, } from './hooks/useQueryParams';
|
|
48
48
|
export { useFetchClient } from './hooks/useFetchClient';
|
|
49
49
|
export { useFocusInputField } from './hooks/useFocusInputField';
|
|
50
50
|
export { useRBAC, type AllowedActions } from './hooks/useRBAC';
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import type { ComponentType } from 'react';
|
|
2
2
|
import { RegisterProps } from './components/Register';
|
|
3
|
-
export
|
|
3
|
+
export declare const AUTH_TYPES: {
|
|
4
|
+
readonly LOGIN: "login";
|
|
5
|
+
readonly REGISTER: "register";
|
|
6
|
+
readonly REGISTER_ADMIN: "register-admin";
|
|
7
|
+
readonly FORGOT_PASSWORD: "forgot-password";
|
|
8
|
+
readonly RESET_PASSWORD: "reset-password";
|
|
9
|
+
readonly FORGOT_PASSWORD_SUCCESS: "forgot-password-success";
|
|
10
|
+
readonly OOPS: "oops";
|
|
11
|
+
readonly PROVIDERS: "providers";
|
|
12
|
+
};
|
|
13
|
+
export type AuthType = (typeof AUTH_TYPES)[keyof typeof AUTH_TYPES];
|
|
14
|
+
/**
|
|
15
|
+
* Narrows the `:authType` route param, which is an arbitrary string, to a known auth type.
|
|
16
|
+
*/
|
|
17
|
+
export declare const isAuthType: (value: string | undefined) => value is AuthType;
|
|
4
18
|
export type FormDictionary = Record<AuthType, ComponentType | ComponentType<RegisterProps>>;
|
|
5
19
|
export declare const FORMS: {
|
|
6
|
-
|
|
7
|
-
|
|
20
|
+
"forgot-password": () => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
"forgot-password-success": () => import("react/jsx-runtime").JSX.Element;
|
|
8
22
|
login: () => null;
|
|
9
23
|
oops: () => import("react/jsx-runtime").JSX.Element;
|
|
10
24
|
register: ({ hasAdmin }: RegisterProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
-
|
|
12
|
-
|
|
25
|
+
"register-admin": ({ hasAdmin }: RegisterProps) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
"reset-password": () => import("react/jsx-runtime").JSX.Element;
|
|
13
27
|
providers: () => null;
|
|
14
28
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the `?redirectTo` the user was sent to the auth pages with, so that logging in from a
|
|
3
|
+
* deep link returns them to where they started instead of the home page.
|
|
4
|
+
*
|
|
5
|
+
* Falls back to the home page when the param is absent, empty, or not a same-app path.
|
|
6
|
+
*/
|
|
7
|
+
export declare const getRedirectTo: (search: string) => string;
|
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
import jsonLogic from 'json-logic-js';
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import * as z from 'zod/v4';
|
|
3
|
+
declare const ConditionSchema: z.ZodObject<{
|
|
4
4
|
dependsOn: z.ZodString;
|
|
5
|
-
operator: z.ZodEnum<
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}, {
|
|
12
|
-
value: string | number | boolean;
|
|
13
|
-
operator: "is" | "isNot";
|
|
14
|
-
dependsOn: string;
|
|
15
|
-
}>;
|
|
5
|
+
operator: z.ZodEnum<{
|
|
6
|
+
is: "is";
|
|
7
|
+
isNot: "isNot";
|
|
8
|
+
}>;
|
|
9
|
+
value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
|
|
10
|
+
}, z.core.$strip>;
|
|
16
11
|
export type Condition = z.infer<typeof ConditionSchema>;
|
|
17
12
|
export type JsonLogicCondition = jsonLogic.RulesLogic<jsonLogic.AdditionalOperation>;
|
|
18
13
|
export type RulesEngine = {
|
|
@@ -21,3 +16,4 @@ export type RulesEngine = {
|
|
|
21
16
|
evaluate: (condition: JsonLogicCondition, data: unknown) => boolean;
|
|
22
17
|
};
|
|
23
18
|
export declare function createRulesEngine(): RulesEngine;
|
|
19
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/services/audit-logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAsBD;;;GAGG;AACH,QAAA,MAAM,sBAAsB,GAAI,QAAQ,IAAI,CAAC,MAAM;qBAExB,KAAK;oBAWN,OAAO;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/services/audit-logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAsBD;;;GAGG;AACH,QAAA,MAAM,sBAAsB,GAAI,QAAQ,IAAI,CAAC,MAAM;qBAExB,KAAK;oBAWN,OAAO;;;;;;;;;yBAiCF;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;;;;;;;;;;;;;gBAmC/D,OAAO;wCAkBW,IAAI;CAU3C,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -31,7 +31,21 @@ const getSanitizedUser = (user)=>{
|
|
|
31
31
|
return this;
|
|
32
32
|
},
|
|
33
33
|
async findMany (query) {
|
|
34
|
-
|
|
34
|
+
// NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory
|
|
35
|
+
// See: https://github.com/strapi/strapi/issues/27399
|
|
36
|
+
const { results: logRows, pagination } = await strapi.db.query('admin::audit-log').findPage({
|
|
37
|
+
...strapi.get('query-params').transform('admin::audit-log', query),
|
|
38
|
+
select: [
|
|
39
|
+
'id'
|
|
40
|
+
]
|
|
41
|
+
});
|
|
42
|
+
const ids = logRows.map((log)=>log.id);
|
|
43
|
+
const logs = ids.length ? await strapi.db.query('admin::audit-log').findMany({
|
|
44
|
+
where: {
|
|
45
|
+
id: {
|
|
46
|
+
$in: ids
|
|
47
|
+
}
|
|
48
|
+
},
|
|
35
49
|
populate: [
|
|
36
50
|
'user'
|
|
37
51
|
],
|
|
@@ -39,9 +53,13 @@ const getSanitizedUser = (user)=>{
|
|
|
39
53
|
'action',
|
|
40
54
|
'date',
|
|
41
55
|
'payload'
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
|
|
56
|
+
]
|
|
57
|
+
}) : [];
|
|
58
|
+
const logsById = new Map(logs.map((log)=>[
|
|
59
|
+
log.id,
|
|
60
|
+
log
|
|
61
|
+
]));
|
|
62
|
+
const results = ids.map((id)=>logsById.get(id)).filter(Boolean);
|
|
45
63
|
const sanitizedResults = results.map((result)=>{
|
|
46
64
|
const { user, ...rest } = result;
|
|
47
65
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-logs.js","sources":["../../../../../../../ee/server/src/audit-logs/services/audit-logs.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\ninterface Event {\n action: string;\n date: Date;\n userId: string | number;\n payload: Record<string, unknown>;\n}\n\ninterface Log extends Omit<Event, 'userId'> {\n user: string | number;\n}\n\nconst getSanitizedUser = (user: any) => {\n let displayName = user.email;\n\n if (user.username) {\n displayName = user.username;\n } else if (user.firstname && user.lastname) {\n displayName = `${user.firstname} ${user.lastname}`;\n }\n\n return {\n id: user.id,\n email: user.email,\n displayName,\n };\n};\n\n/**\n * @description\n * Manages audit logs interaction with the database. Accessible via strapi.get('audit-logs')\n */\nconst createAuditLogsService = (strapi: Core.Strapi) => {\n return {\n async saveEvent(event: Event) {\n const { userId, ...rest } = event;\n\n const auditLog: Log = { ...rest, user: userId };\n\n // Save to database\n await strapi.db.query('admin::audit-log').create({ data: auditLog });\n\n return this;\n },\n\n async findMany(query: unknown) {\n const { results, pagination } = await strapi.db.query('admin::audit-log').findPage({\n populate: ['user'],\n
|
|
1
|
+
{"version":3,"file":"audit-logs.js","sources":["../../../../../../../ee/server/src/audit-logs/services/audit-logs.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\ninterface Event {\n action: string;\n date: Date;\n userId: string | number;\n payload: Record<string, unknown>;\n}\n\ninterface Log extends Omit<Event, 'userId'> {\n user: string | number;\n}\n\nconst getSanitizedUser = (user: any) => {\n let displayName = user.email;\n\n if (user.username) {\n displayName = user.username;\n } else if (user.firstname && user.lastname) {\n displayName = `${user.firstname} ${user.lastname}`;\n }\n\n return {\n id: user.id,\n email: user.email,\n displayName,\n };\n};\n\n/**\n * @description\n * Manages audit logs interaction with the database. Accessible via strapi.get('audit-logs')\n */\nconst createAuditLogsService = (strapi: Core.Strapi) => {\n return {\n async saveEvent(event: Event) {\n const { userId, ...rest } = event;\n\n const auditLog: Log = { ...rest, user: userId };\n\n // Save to database\n await strapi.db.query('admin::audit-log').create({ data: auditLog });\n\n return this;\n },\n\n async findMany(query: unknown) {\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27399\n const { results: logRows, pagination } = await strapi.db.query('admin::audit-log').findPage({\n ...strapi.get('query-params').transform('admin::audit-log', query),\n select: ['id'],\n });\n\n const ids = logRows.map((log) => log.id);\n const logs = ids.length\n ? await strapi.db.query('admin::audit-log').findMany({\n where: { id: { $in: ids } },\n populate: ['user'],\n select: ['action', 'date', 'payload'],\n })\n : [];\n const logsById = new Map(logs.map((log) => [log.id, log]));\n const results = ids.map((id) => logsById.get(id)).filter(Boolean);\n\n const sanitizedResults = results.map((result: any) => {\n const { user, ...rest } = result;\n return {\n ...rest,\n user: user ? getSanitizedUser(user) : null,\n };\n });\n\n return {\n results: sanitizedResults,\n pagination,\n };\n },\n\n async findManyUsers(query: { page?: number | string; pageSize?: number | string }) {\n const { page = 1, pageSize = 10 } = query;\n\n const userAttribute = strapi.db.metadata.get('admin::audit-log').attributes.user;\n\n if (\n userAttribute?.type !== 'relation' ||\n !('joinTable' in userAttribute) ||\n !userAttribute.joinTable ||\n !('inverseJoinColumn' in userAttribute.joinTable)\n ) {\n throw new Error('The audit log user relation is expected to use a join table');\n }\n\n const { joinTable } = userAttribute;\n\n const authorIds = await strapi.db\n .connection(joinTable.name)\n .distinct(joinTable.inverseJoinColumn.name)\n .pluck(joinTable.inverseJoinColumn.name);\n\n const { results, pagination } = await strapi.db.query('admin::user').findPage({\n select: ['id', 'email', 'username', 'firstname', 'lastname'],\n where: { id: { $in: authorIds } },\n orderBy: { id: 'asc' },\n page: Number(page),\n pageSize: Number(pageSize),\n });\n\n return {\n results: results.map(getSanitizedUser),\n pagination,\n };\n },\n\n async findOne(id: unknown) {\n const result: any = await strapi.db.query('admin::audit-log').findOne({\n where: { id },\n populate: ['user'],\n select: ['action', 'date', 'payload'],\n });\n\n if (!result) {\n return null;\n }\n\n const { user, ...rest } = result;\n return {\n ...rest,\n user: user ? getSanitizedUser(user) : null,\n };\n },\n\n deleteExpiredEvents(expirationDate: Date) {\n return strapi.db.query('admin::audit-log').deleteMany({\n where: {\n date: {\n $lt: expirationDate.toISOString(),\n },\n },\n });\n },\n };\n};\n\nexport { createAuditLogsService };\n"],"names":["getSanitizedUser","user","displayName","email","username","firstname","lastname","id","createAuditLogsService","strapi","saveEvent","event","userId","rest","auditLog","db","query","create","data","findMany","results","logRows","pagination","findPage","get","transform","select","ids","map","log","logs","length","where","$in","populate","logsById","Map","filter","Boolean","sanitizedResults","result","findManyUsers","page","pageSize","userAttribute","metadata","attributes","type","joinTable","Error","authorIds","connection","name","distinct","inverseJoinColumn","pluck","orderBy","Number","findOne","deleteExpiredEvents","expirationDate","deleteMany","date","$lt","toISOString"],"mappings":"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"}
|