@webiny/app-audit-logs 6.4.12-beta.4 → 6.5.0-beta.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/components/Text.d.ts +1 -3
- package/components/Text.js +4 -9
- package/components/Text.js.map +1 -1
- package/config/list/AuditLogsListConfig.d.ts +11 -5
- package/config/list/AuditLogsListConfig.js +10 -1
- package/config/list/AuditLogsListConfig.js.map +1 -1
- package/config/list/Browser/index.d.ts +2 -3
- package/config/list/Details/PreviewTab.d.ts +15 -0
- package/config/list/Details/PreviewTab.js +32 -0
- package/config/list/Details/PreviewTab.js.map +1 -0
- package/config/list/Details/index.d.ts +8 -0
- package/config/list/Details/index.js +7 -0
- package/config/list/Details/index.js.map +1 -0
- package/features/listAuditLogs/ListAuditLogsGateway.d.ts +11 -0
- package/features/listAuditLogs/ListAuditLogsGateway.js +71 -0
- package/features/listAuditLogs/ListAuditLogsGateway.js.map +1 -0
- package/features/listAuditLogs/ListAuditLogsRepository.d.ts +11 -0
- package/features/listAuditLogs/ListAuditLogsRepository.js +35 -0
- package/features/listAuditLogs/ListAuditLogsRepository.js.map +1 -0
- package/features/listAuditLogs/ListAuditLogsUseCase.d.ts +10 -0
- package/features/listAuditLogs/ListAuditLogsUseCase.js +19 -0
- package/features/listAuditLogs/ListAuditLogsUseCase.js.map +1 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsGateway.d.ts +20 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsGateway.js +5 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsGateway.js.map +1 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsRepository.d.ts +20 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsRepository.js +5 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsRepository.js.map +1 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsUseCase.d.ts +20 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsUseCase.js +5 -0
- package/features/listAuditLogs/abstractions/ListAuditLogsUseCase.js.map +1 -0
- package/features/listAuditLogs/abstractions/index.d.ts +6 -0
- package/features/listAuditLogs/abstractions/index.js +3 -0
- package/features/listAuditLogs/feature.d.ts +3 -0
- package/features/listAuditLogs/feature.js +21 -0
- package/features/listAuditLogs/feature.js.map +1 -0
- package/features/listAuditLogs/index.d.ts +1 -0
- package/features/listAuditLogs/index.js +1 -0
- package/features/permissions/feature.d.ts +1 -1
- package/graphql.d.ts +1 -1
- package/graphql.js +1 -2
- package/graphql.js.map +1 -1
- package/hooks/graphql.d.ts +0 -18
- package/hooks/graphql.js +0 -44
- package/hooks/schema.d.ts +6 -7
- package/hooks/schema.js +1 -2
- package/hooks/schema.js.map +1 -1
- package/hooks/useAuditLogsList.d.ts +1 -4
- package/hooks/useAuditLogsList.js +34 -42
- package/hooks/useAuditLogsList.js.map +1 -1
- package/index.js +8 -1
- package/index.js.map +1 -1
- package/package.json +14 -17
- package/types.d.ts +2 -2
- package/views/Logs/Filters/FilterByAction.d.ts +1 -1
- package/views/Logs/Filters/FilterByAction.js +5 -3
- package/views/Logs/Filters/FilterByAction.js.map +1 -1
- package/views/Logs/Filters/FilterByApp.js +2 -1
- package/views/Logs/Filters/FilterByApp.js.map +1 -1
- package/views/Logs/Filters/FilterByCreatedBy.js +18 -10
- package/views/Logs/Filters/FilterByCreatedBy.js.map +1 -1
- package/views/Logs/Filters/FilterByCreatedOn.js +26 -27
- package/views/Logs/Filters/FilterByCreatedOn.js.map +1 -1
- package/views/Logs/Filters/FilterByEntity.d.ts +1 -1
- package/views/Logs/Filters/FilterByEntity.js +5 -3
- package/views/Logs/Filters/FilterByEntity.js.map +1 -1
- package/views/Logs/Filters/FilterByEntityId.js +2 -1
- package/views/Logs/Filters/FilterByEntityId.js.map +1 -1
- package/views/Logs/Filters/FilterByInitiator.js +16 -9
- package/views/Logs/Filters/FilterByInitiator.js.map +1 -1
- package/views/Logs/Filters/Filters.d.ts +1 -2
- package/views/Logs/Filters/Filters.js +61 -13
- package/views/Logs/Filters/Filters.js.map +1 -1
- package/views/Logs/Header/ButtonFilters/ButtonFilters.js +4 -5
- package/views/Logs/Header/ButtonFilters/ButtonFilters.js.map +1 -1
- package/views/Logs/Header/Header.d.ts +2 -4
- package/views/Logs/Header/Header.js +4 -7
- package/views/Logs/Header/Header.js.map +1 -1
- package/views/Logs/LoadMoreButton/styled.d.ts +4 -4
- package/views/Logs/LoadMoreButton/styled.js +4 -6
- package/views/Logs/LoadMoreButton/styled.js.map +1 -1
- package/views/Logs/LogsView.js +4 -8
- package/views/Logs/LogsView.js.map +1 -1
- package/views/Logs/Preview/AuditLogDetailsPresenter.d.ts +13 -0
- package/views/Logs/Preview/AuditLogDetailsPresenter.js +36 -0
- package/views/Logs/Preview/AuditLogDetailsPresenter.js.map +1 -0
- package/views/Logs/Preview/Preview.d.ts +4 -2
- package/views/Logs/Preview/Preview.js +67 -22
- package/views/Logs/Preview/Preview.js.map +1 -1
- package/views/Logs/Preview/abstractions.d.ts +14 -0
- package/views/Logs/Preview/abstractions.js +5 -0
- package/views/Logs/Preview/abstractions.js.map +1 -0
- package/views/Logs/Preview/feature.d.ts +5 -0
- package/views/Logs/Preview/feature.js +22 -0
- package/views/Logs/Preview/feature.js.map +1 -0
- package/views/Logs/Preview/index.d.ts +2 -0
- package/views/Logs/Preview/index.js +1 -0
- package/views/Logs/Preview/tabs/AiPromptTabs.d.ts +2 -0
- package/views/Logs/Preview/tabs/AiPromptTabs.js +25 -0
- package/views/Logs/Preview/tabs/AiPromptTabs.js.map +1 -0
- package/views/Logs/Preview/tabs/LlmResponseTab.d.ts +4 -0
- package/views/Logs/Preview/tabs/LlmResponseTab.js +41 -0
- package/views/Logs/Preview/tabs/LlmResponseTab.js.map +1 -0
- package/views/Logs/Preview/tabs/SystemPromptTab.d.ts +4 -0
- package/views/Logs/Preview/tabs/SystemPromptTab.js +24 -0
- package/views/Logs/Preview/tabs/SystemPromptTab.js.map +1 -0
- package/views/Logs/Preview/tabs/UserPromptTab.d.ts +4 -0
- package/views/Logs/Preview/tabs/UserPromptTab.js +18 -0
- package/views/Logs/Preview/tabs/UserPromptTab.js.map +1 -0
- package/views/Logs/Preview/tabs/shared.d.ts +28 -0
- package/views/Logs/Preview/tabs/shared.js +16 -0
- package/views/Logs/Preview/tabs/shared.js.map +1 -0
- package/views/Logs/Table/Table.d.ts +3 -6
- package/views/Logs/Table/Table.js +25 -16
- package/views/Logs/Table/Table.js.map +1 -1
- package/views/Logs/Table/styled.d.ts +1 -16
- package/views/Logs/Table/styled.js +15 -55
- package/views/Logs/Table/styled.js.map +1 -1
- package/hooks/graphql.js.map +0 -1
- package/views/Logs/Filters/FilterByTimestamp.d.ts +0 -2
- package/views/Logs/Filters/FilterByTimestamp.js +0 -39
- package/views/Logs/Filters/FilterByTimestamp.js.map +0 -1
- package/views/Logs/Filters/styled.d.ts +0 -4
- package/views/Logs/Filters/styled.js +0 -13
- package/views/Logs/Filters/styled.js.map +0 -1
- package/views/Logs/Logs.d.ts +0 -3
- package/views/Logs/Logs.js +0 -76
- package/views/Logs/Logs.js.map +0 -1
- package/views/Logs/Preview/styled.d.ts +0 -5
- package/views/Logs/Preview/styled.js +0 -32
- package/views/Logs/Preview/styled.js.map +0 -1
|
@@ -1,37 +1,36 @@
|
|
|
1
1
|
import react from "react";
|
|
2
|
-
import {
|
|
3
|
-
import { Input } from "@webiny/admin-ui";
|
|
2
|
+
import { DatePicker } from "@webiny/admin-ui";
|
|
4
3
|
import { useBind } from "@webiny/form";
|
|
5
|
-
|
|
6
|
-
const formatDateTime = (date)=>{
|
|
7
|
-
if (!date) return "";
|
|
8
|
-
return format(new Date(date), "yyyy-MM-dd'T'HH:mm");
|
|
9
|
-
};
|
|
10
|
-
const getValidFilterValue = (value)=>{
|
|
11
|
-
if ("" === value) return;
|
|
12
|
-
return new Date(value);
|
|
13
|
-
};
|
|
4
|
+
const now = new Date();
|
|
14
5
|
const FilterByCreatedOn = ()=>{
|
|
15
6
|
const bindFrom = useBind({
|
|
16
|
-
name: "createdOn_gte"
|
|
17
|
-
beforeChange (value, cb) {
|
|
18
|
-
cb(getValidFilterValue(value));
|
|
19
|
-
}
|
|
7
|
+
name: "createdOn_gte"
|
|
20
8
|
});
|
|
21
9
|
const bindTo = useBind({
|
|
22
|
-
name: "createdOn_lte"
|
|
23
|
-
beforeChange (value, cb) {
|
|
24
|
-
cb(getValidFilterValue(value));
|
|
25
|
-
}
|
|
10
|
+
name: "createdOn_lte"
|
|
26
11
|
});
|
|
27
|
-
return /*#__PURE__*/ react.createElement(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
12
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
13
|
+
className: "flex flex-col gap-md"
|
|
14
|
+
}, /*#__PURE__*/ react.createElement(DatePicker, {
|
|
15
|
+
label: "Created from",
|
|
16
|
+
type: "dateTimeLocal",
|
|
17
|
+
value: bindFrom.value ?? void 0,
|
|
18
|
+
onChange: (value)=>{
|
|
19
|
+
bindFrom.onChange(value ?? void 0);
|
|
20
|
+
},
|
|
21
|
+
placeholder: "Select date",
|
|
22
|
+
size: "md",
|
|
23
|
+
maxDate: now
|
|
24
|
+
}), /*#__PURE__*/ react.createElement(DatePicker, {
|
|
25
|
+
label: "Created to",
|
|
26
|
+
type: "dateTimeLocal",
|
|
27
|
+
value: bindTo.value ?? void 0,
|
|
28
|
+
onChange: (value)=>{
|
|
29
|
+
bindTo.onChange(value ?? void 0);
|
|
30
|
+
},
|
|
31
|
+
placeholder: "Select date",
|
|
32
|
+
size: "md",
|
|
33
|
+
maxDate: now
|
|
35
34
|
}));
|
|
36
35
|
};
|
|
37
36
|
export { FilterByCreatedOn };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/Filters/FilterByCreatedOn.js","sources":["../../../../src/views/Logs/Filters/FilterByCreatedOn.tsx"],"sourcesContent":["import React from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"views/Logs/Filters/FilterByCreatedOn.js","sources":["../../../../src/views/Logs/Filters/FilterByCreatedOn.tsx"],"sourcesContent":["import React from \"react\";\nimport { DatePicker } from \"@webiny/admin-ui\";\nimport { useBind } from \"@webiny/form\";\n\nconst now = new Date();\n\nexport const FilterByCreatedOn = () => {\n const bindFrom = useBind({\n name: \"createdOn_gte\"\n });\n\n const bindTo = useBind({\n name: \"createdOn_lte\"\n });\n\n return (\n <div className={\"flex flex-col gap-md\"}>\n <DatePicker\n label={\"Created from\"}\n type=\"dateTimeLocal\"\n value={bindFrom.value ?? undefined}\n onChange={value => {\n bindFrom.onChange(value ?? undefined);\n }}\n placeholder=\"Select date\"\n size=\"md\"\n maxDate={now}\n />\n <DatePicker\n label={\"Created to\"}\n type=\"dateTimeLocal\"\n value={bindTo.value ?? undefined}\n onChange={value => {\n bindTo.onChange(value ?? undefined);\n }}\n placeholder=\"Select date\"\n size=\"md\"\n maxDate={now}\n />\n </div>\n );\n};\n"],"names":["now","Date","FilterByCreatedOn","bindFrom","useBind","bindTo","DatePicker","undefined","value"],"mappings":";;;AAIA,MAAMA,MAAM,IAAIC;AAET,MAAMC,oBAAoB;IAC7B,MAAMC,WAAWC,QAAQ;QACrB,MAAM;IACV;IAEA,MAAMC,SAASD,QAAQ;QACnB,MAAM;IACV;IAEA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACE,YAAUA;QACP,OAAO;QACP,MAAK;QACL,OAAOH,SAAS,KAAK,IAAII;QACzB,UAAUC,CAAAA;YACNL,SAAS,QAAQ,CAACK,SAASD;QAC/B;QACA,aAAY;QACZ,MAAK;QACL,SAASP;sBAEb,oBAACM,YAAUA;QACP,OAAO;QACP,MAAK;QACL,OAAOD,OAAO,KAAK,IAAIE;QACvB,UAAUC,CAAAA;YACNH,OAAO,QAAQ,CAACG,SAASD;QAC7B;QACA,aAAY;QACZ,MAAK;QACL,SAASP;;AAIzB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
export declare const FilterByEntity: () => React.JSX.Element
|
|
2
|
+
export declare const FilterByEntity: () => React.JSX.Element;
|
|
@@ -31,12 +31,14 @@ const FilterByEntity = ()=>{
|
|
|
31
31
|
}, [
|
|
32
32
|
data.app
|
|
33
33
|
]);
|
|
34
|
-
|
|
34
|
+
const disabled = 0 === options.length;
|
|
35
35
|
return /*#__PURE__*/ react.createElement(Select, {
|
|
36
36
|
...bind,
|
|
37
|
+
label: "Entity",
|
|
37
38
|
size: "md",
|
|
38
|
-
placeholder: "
|
|
39
|
-
options: options
|
|
39
|
+
placeholder: "All entities",
|
|
40
|
+
options: disabled ? [] : options,
|
|
41
|
+
disabled: disabled
|
|
40
42
|
});
|
|
41
43
|
};
|
|
42
44
|
export { FilterByEntity };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/Filters/FilterByEntity.js","sources":["../../../../src/views/Logs/Filters/FilterByEntity.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { useBind, useForm } from \"@webiny/form\";\nimport { Select } from \"@webiny/admin-ui\";\nimport { apps as auditLogsApps } from \"@webiny/common-audit-logs\";\nimport type { IFilterFormData } from \"./types.js\";\n\nconst getValidFilterValue = (value: string): string | undefined => {\n if (value === \"all\" || value === \"\") {\n return undefined;\n }\n return value;\n};\n\nexport const FilterByEntity = () => {\n const { data, setValue } = useForm<IFilterFormData>();\n const bind = useBind({\n name: \"entity\",\n beforeChange(value, cb) {\n setValue(\"action\", undefined);\n cb(getValidFilterValue(value));\n }\n });\n\n const options = useMemo(() => {\n if (!data.app) {\n return [];\n }\n\n const entities = auditLogsApps.find(app => app.app === data.app)?.entities || [];\n\n return [\n { label: \"All\", value: \"all\" },\n ...entities.map(entity => ({ label: entity.displayName, value: entity.type }))\n ];\n }, [data.app]);\n\n
|
|
1
|
+
{"version":3,"file":"views/Logs/Filters/FilterByEntity.js","sources":["../../../../src/views/Logs/Filters/FilterByEntity.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { useBind, useForm } from \"@webiny/form\";\nimport { Select } from \"@webiny/admin-ui\";\nimport { apps as auditLogsApps } from \"@webiny/common-audit-logs\";\nimport type { IFilterFormData } from \"./types.js\";\n\nconst getValidFilterValue = (value: string): string | undefined => {\n if (value === \"all\" || value === \"\") {\n return undefined;\n }\n return value;\n};\n\nexport const FilterByEntity = () => {\n const { data, setValue } = useForm<IFilterFormData>();\n const bind = useBind({\n name: \"entity\",\n beforeChange(value, cb) {\n setValue(\"action\", undefined);\n cb(getValidFilterValue(value));\n }\n });\n\n const options = useMemo(() => {\n if (!data.app) {\n return [];\n }\n\n const entities = auditLogsApps.find(app => app.app === data.app)?.entities || [];\n\n return [\n { label: \"All\", value: \"all\" },\n ...entities.map(entity => ({ label: entity.displayName, value: entity.type }))\n ];\n }, [data.app]);\n\n const disabled = options.length === 0;\n\n return (\n <Select\n {...bind}\n label={\"Entity\"}\n size={\"md\"}\n placeholder={\"All entities\"}\n options={disabled ? [] : options}\n disabled={disabled}\n />\n );\n};\n"],"names":["getValidFilterValue","value","FilterByEntity","data","setValue","useForm","bind","useBind","cb","undefined","options","useMemo","entities","auditLogsApps","app","entity","disabled","Select"],"mappings":";;;;AAMA,MAAMA,sBAAsB,CAACC;IACzB,IAAIA,AAAU,UAAVA,SAAmBA,AAAU,OAAVA,OACnB;IAEJ,OAAOA;AACX;AAEO,MAAMC,iBAAiB;IAC1B,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAE,GAAGC;IAC3B,MAAMC,OAAOC,QAAQ;QACjB,MAAM;QACN,cAAaN,KAAK,EAAEO,EAAE;YAClBJ,SAAS,UAAUK;YACnBD,GAAGR,oBAAoBC;QAC3B;IACJ;IAEA,MAAMS,UAAUC,QAAQ;QACpB,IAAI,CAACR,KAAK,GAAG,EACT,OAAO,EAAE;QAGb,MAAMS,WAAWC,KAAc,IAAI,CAACC,CAAAA,MAAOA,IAAI,GAAG,KAAKX,KAAK,GAAG,GAAG,YAAY,EAAE;QAEhF,OAAO;YACH;gBAAE,OAAO;gBAAO,OAAO;YAAM;eAC1BS,SAAS,GAAG,CAACG,CAAAA,SAAW;oBAAE,OAAOA,OAAO,WAAW;oBAAE,OAAOA,OAAO,IAAI;gBAAC;SAC9E;IACL,GAAG;QAACZ,KAAK,GAAG;KAAC;IAEb,MAAMa,WAAWN,AAAmB,MAAnBA,QAAQ,MAAM;IAE/B,OAAO,WAAP,GACI,oBAACO,QAAMA;QACF,GAAGX,IAAI;QACR,OAAO;QACP,MAAM;QACN,aAAa;QACb,SAASU,WAAW,EAAE,GAAGN;QACzB,UAAUM;;AAGtB"}
|
|
@@ -16,8 +16,9 @@ const FilterByEntityId = ()=>{
|
|
|
16
16
|
});
|
|
17
17
|
return /*#__PURE__*/ react.createElement(Input, {
|
|
18
18
|
...bind,
|
|
19
|
+
label: "Entity ID",
|
|
19
20
|
size: "md",
|
|
20
|
-
placeholder: "
|
|
21
|
+
placeholder: "Enter entity ID"
|
|
21
22
|
});
|
|
22
23
|
};
|
|
23
24
|
export { FilterByEntityId };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/Filters/FilterByEntityId.js","sources":["../../../../src/views/Logs/Filters/FilterByEntityId.tsx"],"sourcesContent":["import React from \"react\";\nimport { useBind, useForm } from \"@webiny/form\";\nimport { Input } from \"@webiny/admin-ui\";\nimport type { IFilterFormData } from \"~/views/Logs/Filters/types.js\";\n\nexport const FilterByEntityId = () => {\n const { setValue } = useForm<IFilterFormData>();\n const bind = useBind({\n name: \"entityId\",\n beforeChange(value, cb) {\n if (!value) {\n cb(undefined);\n return;\n }\n setValue(\"app\", undefined);\n setValue(\"entity\", undefined);\n setValue(\"action\", undefined);\n setValue(\"createdBy\", undefined);\n cb(value);\n }\n });\n\n return <Input {...bind} size={\"md\"} placeholder={\"
|
|
1
|
+
{"version":3,"file":"views/Logs/Filters/FilterByEntityId.js","sources":["../../../../src/views/Logs/Filters/FilterByEntityId.tsx"],"sourcesContent":["import React from \"react\";\nimport { useBind, useForm } from \"@webiny/form\";\nimport { Input } from \"@webiny/admin-ui\";\nimport type { IFilterFormData } from \"~/views/Logs/Filters/types.js\";\n\nexport const FilterByEntityId = () => {\n const { setValue } = useForm<IFilterFormData>();\n const bind = useBind({\n name: \"entityId\",\n beforeChange(value, cb) {\n if (!value) {\n cb(undefined);\n return;\n }\n setValue(\"app\", undefined);\n setValue(\"entity\", undefined);\n setValue(\"action\", undefined);\n setValue(\"createdBy\", undefined);\n cb(value);\n }\n });\n\n return <Input {...bind} label={\"Entity ID\"} size={\"md\"} placeholder={\"Enter entity ID\"} />;\n};\n"],"names":["FilterByEntityId","setValue","useForm","bind","useBind","value","cb","undefined","Input"],"mappings":";;;AAKO,MAAMA,mBAAmB;IAC5B,MAAM,EAAEC,QAAQ,EAAE,GAAGC;IACrB,MAAMC,OAAOC,QAAQ;QACjB,MAAM;QACN,cAAaC,KAAK,EAAEC,EAAE;YAClB,IAAI,CAACD,OAAO,YACRC,GAAGC;YAGPN,SAAS,OAAOM;YAChBN,SAAS,UAAUM;YACnBN,SAAS,UAAUM;YACnBN,SAAS,aAAaM;YACtBD,GAAGD;QACP;IACJ;IAEA,OAAO,WAAP,GAAO,oBAACG,OAAKA;QAAE,GAAGL,IAAI;QAAE,OAAO;QAAa,MAAM;QAAM,aAAa;;AACzE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import react, { useMemo } from "react";
|
|
2
|
-
import {
|
|
1
|
+
import react, { useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { useContainer } from "@webiny/app";
|
|
3
|
+
import { MainGraphQLClient } from "@webiny/app/features/mainGraphQLClient";
|
|
3
4
|
import { useBind } from "@webiny/form";
|
|
4
5
|
import { Select } from "@webiny/admin-ui";
|
|
5
6
|
import { LIST_USERS } from "../../../graphql.js";
|
|
@@ -8,16 +9,23 @@ const getValidFilterValue = (value)=>{
|
|
|
8
9
|
return value;
|
|
9
10
|
};
|
|
10
11
|
const FilterByInitiator = ()=>{
|
|
11
|
-
const
|
|
12
|
+
const container = useContainer();
|
|
13
|
+
const client = container.resolve(MainGraphQLClient);
|
|
14
|
+
const [users, setUsers] = useState([]);
|
|
15
|
+
useEffect(()=>{
|
|
16
|
+
client.execute({
|
|
17
|
+
query: LIST_USERS
|
|
18
|
+
}).then((response)=>{
|
|
19
|
+
setUsers(response.adminUsers.users.data || []);
|
|
20
|
+
});
|
|
21
|
+
}, []);
|
|
12
22
|
const bind = useBind({
|
|
13
23
|
name: "data.initiator",
|
|
14
24
|
beforeChange (value, cb) {
|
|
15
25
|
cb(getValidFilterValue(value));
|
|
16
26
|
}
|
|
17
27
|
});
|
|
18
|
-
const options = useMemo(()=>
|
|
19
|
-
const users = listUsers?.adminUsers?.users?.data || [];
|
|
20
|
-
return [
|
|
28
|
+
const options = useMemo(()=>[
|
|
21
29
|
{
|
|
22
30
|
label: "All",
|
|
23
31
|
value: "all"
|
|
@@ -26,9 +34,8 @@ const FilterByInitiator = ()=>{
|
|
|
26
34
|
label: `${user.firstName} ${user.lastName}`,
|
|
27
35
|
value: user.id
|
|
28
36
|
}))
|
|
29
|
-
]
|
|
30
|
-
|
|
31
|
-
listUsers
|
|
37
|
+
], [
|
|
38
|
+
users
|
|
32
39
|
]);
|
|
33
40
|
return /*#__PURE__*/ react.createElement(Select, {
|
|
34
41
|
...bind,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/Filters/FilterByInitiator.js","sources":["../../../../src/views/Logs/Filters/FilterByInitiator.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"views/Logs/Filters/FilterByInitiator.js","sources":["../../../../src/views/Logs/Filters/FilterByInitiator.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { useContainer } from \"@webiny/app\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient\";\nimport { useBind } from \"@webiny/form\";\nimport { Select } from \"@webiny/admin-ui\";\nimport { LIST_USERS } from \"~/graphql.js\";\nimport type { User } from \"~/types.js\";\n\ninterface ListUsersResponse {\n adminUsers: {\n users: {\n data: User[];\n };\n };\n}\n\nconst getValidFilterValue = (value: string): string | undefined => {\n if (value === \"all\" || value === \"\") {\n return undefined;\n }\n return value;\n};\n\nexport const FilterByInitiator = () => {\n const container = useContainer();\n const client = container.resolve(MainGraphQLClient);\n const [users, setUsers] = useState<User[]>([]);\n\n useEffect(() => {\n client.execute<ListUsersResponse>({ query: LIST_USERS }).then(response => {\n setUsers(response.adminUsers.users.data || []);\n });\n }, []);\n\n const bind = useBind({\n name: \"data.initiator\",\n beforeChange(value, cb) {\n cb(getValidFilterValue(value));\n }\n });\n\n const options = useMemo(() => {\n return [\n { label: \"All\", value: \"all\" },\n ...users.map(user => ({ label: `${user.firstName} ${user.lastName}`, value: user.id }))\n ];\n }, [users]);\n\n return <Select {...bind} size={\"md\"} placeholder={\"Filter by Initiator\"} options={options} />;\n};\n"],"names":["getValidFilterValue","value","FilterByInitiator","container","useContainer","client","MainGraphQLClient","users","setUsers","useState","useEffect","LIST_USERS","response","bind","useBind","cb","options","useMemo","user","Select"],"mappings":";;;;;;AAgBA,MAAMA,sBAAsB,CAACC;IACzB,IAAIA,AAAU,UAAVA,SAAmBA,AAAU,OAAVA,OACnB;IAEJ,OAAOA;AACX;AAEO,MAAMC,oBAAoB;IAC7B,MAAMC,YAAYC;IAClB,MAAMC,SAASF,UAAU,OAAO,CAACG;IACjC,MAAM,CAACC,OAAOC,SAAS,GAAGC,SAAiB,EAAE;IAE7CC,UAAU;QACNL,OAAO,OAAO,CAAoB;YAAE,OAAOM;QAAW,GAAG,IAAI,CAACC,CAAAA;YAC1DJ,SAASI,SAAS,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE;QACjD;IACJ,GAAG,EAAE;IAEL,MAAMC,OAAOC,QAAQ;QACjB,MAAM;QACN,cAAab,KAAK,EAAEc,EAAE;YAClBA,GAAGf,oBAAoBC;QAC3B;IACJ;IAEA,MAAMe,UAAUC,QAAQ,IACb;YACH;gBAAE,OAAO;gBAAO,OAAO;YAAM;eAC1BV,MAAM,GAAG,CAACW,CAAAA,OAAS;oBAAE,OAAO,GAAGA,KAAK,SAAS,CAAC,CAAC,EAAEA,KAAK,QAAQ,EAAE;oBAAE,OAAOA,KAAK,EAAE;gBAAC;SACvF,EACF;QAACX;KAAM;IAEV,OAAO,WAAP,GAAO,oBAACY,QAAMA;QAAE,GAAGN,IAAI;QAAE,MAAM;QAAM,aAAa;QAAuB,SAASG;;AACtF"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { IListAuditLogsVariablesWhere } from "../../../hooks/graphql.js";
|
|
3
3
|
interface FiltersProps {
|
|
4
|
-
showingFilters: boolean;
|
|
5
4
|
setWhere: (where: Partial<IListAuditLogsVariablesWhere>) => void;
|
|
6
5
|
}
|
|
7
|
-
export declare const Filters: ({
|
|
6
|
+
export declare const Filters: ({ setWhere }: FiltersProps) => React.JSX.Element;
|
|
8
7
|
export {};
|
|
@@ -1,21 +1,69 @@
|
|
|
1
|
-
import react, { useCallback } from "react";
|
|
2
|
-
import {
|
|
1
|
+
import react, { useCallback, useState } from "react";
|
|
2
|
+
import { ReactComponent } from "@webiny/icons/filter_list.svg";
|
|
3
|
+
import { Drawer, IconButton } from "@webiny/admin-ui";
|
|
4
|
+
import { Form } from "@webiny/form";
|
|
3
5
|
import { useAuditLogsListConfig } from "../../../config/list/index.js";
|
|
4
|
-
const
|
|
6
|
+
const Filters = ({ setWhere })=>{
|
|
5
7
|
const { browser } = useAuditLogsListConfig();
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
const [open, setOpen] = useState(false);
|
|
9
|
+
const [formData, setFormData] = useState({});
|
|
10
|
+
const [hasActiveFilters, setHasActiveFilters] = useState(false);
|
|
11
|
+
const onFormChange = useCallback((data)=>{
|
|
12
|
+
setFormData(data);
|
|
13
|
+
}, []);
|
|
14
|
+
const applyFilters = useCallback(()=>{
|
|
15
|
+
const hasValues = Object.values(formData).some((v)=>void 0 !== v && "" !== v);
|
|
16
|
+
setHasActiveFilters(hasValues);
|
|
17
|
+
if (!hasValues) {
|
|
18
|
+
setWhere({});
|
|
19
|
+
setOpen(false);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const convertedFilters = browser.filtersToWhere.reduce((acc, converter)=>converter(acc), formData);
|
|
9
23
|
setWhere(convertedFilters);
|
|
24
|
+
setOpen(false);
|
|
10
25
|
}, [
|
|
11
|
-
browser.filtersToWhere
|
|
26
|
+
browser.filtersToWhere,
|
|
27
|
+
setWhere,
|
|
28
|
+
formData
|
|
12
29
|
]);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
30
|
+
const clearFilters = useCallback(()=>{
|
|
31
|
+
setFormData({});
|
|
32
|
+
setWhere({});
|
|
33
|
+
setHasActiveFilters(false);
|
|
34
|
+
}, [
|
|
35
|
+
setWhere
|
|
36
|
+
]);
|
|
37
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(IconButton, {
|
|
38
|
+
variant: hasActiveFilters ? "primary" : "ghost",
|
|
39
|
+
icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
|
|
40
|
+
onClick: ()=>setOpen(true),
|
|
41
|
+
"data-testid": "audit-logs.toggle-filters"
|
|
42
|
+
}), /*#__PURE__*/ react.createElement(Drawer, {
|
|
43
|
+
open: open,
|
|
44
|
+
onClose: ()=>setOpen(false),
|
|
45
|
+
modal: true,
|
|
46
|
+
width: 360,
|
|
47
|
+
title: "Filters",
|
|
48
|
+
headerSeparator: true,
|
|
49
|
+
footerSeparator: true,
|
|
50
|
+
bodyPadding: false,
|
|
51
|
+
actions: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Drawer.CancelButton, {
|
|
52
|
+
text: "Clear all",
|
|
53
|
+
onClick: clearFilters
|
|
54
|
+
}), /*#__PURE__*/ react.createElement(Drawer.ConfirmButton, {
|
|
55
|
+
text: "Apply filters",
|
|
56
|
+
onClick: applyFilters
|
|
57
|
+
}))
|
|
58
|
+
}, /*#__PURE__*/ react.createElement(Form, {
|
|
59
|
+
data: formData,
|
|
60
|
+
onChange: onFormChange
|
|
61
|
+
}, ()=>/*#__PURE__*/ react.createElement("div", {
|
|
62
|
+
className: "flex flex-col gap-lg p-lg"
|
|
63
|
+
}, browser.filters.map((filter)=>/*#__PURE__*/ react.createElement("div", {
|
|
64
|
+
key: filter.name
|
|
65
|
+
}, filter.element))))));
|
|
18
66
|
};
|
|
19
|
-
export {
|
|
67
|
+
export { Filters };
|
|
20
68
|
|
|
21
69
|
//# sourceMappingURL=Filters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/Filters/Filters.js","sources":["../../../../src/views/Logs/Filters/Filters.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport
|
|
1
|
+
{"version":3,"file":"views/Logs/Filters/Filters.js","sources":["../../../../src/views/Logs/Filters/Filters.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport { ReactComponent as FilterIcon } from \"@webiny/icons/filter_list.svg\";\nimport { Drawer, IconButton } from \"@webiny/admin-ui\";\nimport { Form } from \"@webiny/form\";\nimport { useAuditLogsListConfig } from \"~/config/list/index.js\";\nimport type { IListAuditLogsVariablesWhere } from \"~/hooks/graphql.js\";\n\ninterface FiltersProps {\n setWhere: (where: Partial<IListAuditLogsVariablesWhere>) => void;\n}\n\nexport const Filters = ({ setWhere }: FiltersProps) => {\n const { browser } = useAuditLogsListConfig();\n const [open, setOpen] = useState(false);\n const [formData, setFormData] = useState<Record<string, unknown>>({});\n const [hasActiveFilters, setHasActiveFilters] = useState(false);\n\n const onFormChange = useCallback((data: Record<string, unknown>) => {\n setFormData(data);\n }, []);\n\n const applyFilters = useCallback(() => {\n const hasValues = Object.values(formData).some(v => v !== undefined && v !== \"\");\n setHasActiveFilters(hasValues);\n\n if (!hasValues) {\n setWhere({});\n setOpen(false);\n return;\n }\n\n const convertedFilters = browser.filtersToWhere.reduce(\n (acc, converter) => converter(acc),\n formData\n );\n\n setWhere(convertedFilters as Partial<IListAuditLogsVariablesWhere>);\n setOpen(false);\n }, [browser.filtersToWhere, setWhere, formData]);\n\n const clearFilters = useCallback(() => {\n setFormData({});\n setWhere({});\n setHasActiveFilters(false);\n }, [setWhere]);\n\n return (\n <>\n <IconButton\n variant={hasActiveFilters ? \"primary\" : \"ghost\"}\n icon={<FilterIcon />}\n onClick={() => setOpen(true)}\n data-testid=\"audit-logs.toggle-filters\"\n />\n <Drawer\n open={open}\n onClose={() => setOpen(false)}\n modal={true}\n width={360}\n title=\"Filters\"\n headerSeparator={true}\n footerSeparator={true}\n bodyPadding={false}\n actions={\n <>\n <Drawer.CancelButton text=\"Clear all\" onClick={clearFilters} />\n <Drawer.ConfirmButton text=\"Apply filters\" onClick={applyFilters} />\n </>\n }\n >\n <Form data={formData} onChange={onFormChange}>\n {() => (\n <div className={\"flex flex-col gap-lg p-lg\"}>\n {browser.filters.map(filter => (\n <div key={filter.name}>{filter.element}</div>\n ))}\n </div>\n )}\n </Form>\n </Drawer>\n </>\n );\n};\n"],"names":["Filters","setWhere","browser","useAuditLogsListConfig","open","setOpen","useState","formData","setFormData","hasActiveFilters","setHasActiveFilters","onFormChange","useCallback","data","applyFilters","hasValues","Object","v","undefined","convertedFilters","acc","converter","clearFilters","IconButton","FilterIcon","Drawer","Form","filter"],"mappings":";;;;;AAWO,MAAMA,UAAU,CAAC,EAAEC,QAAQ,EAAgB;IAC9C,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAM,CAACC,MAAMC,QAAQ,GAAGC,SAAS;IACjC,MAAM,CAACC,UAAUC,YAAY,GAAGF,SAAkC,CAAC;IACnE,MAAM,CAACG,kBAAkBC,oBAAoB,GAAGJ,SAAS;IAEzD,MAAMK,eAAeC,YAAY,CAACC;QAC9BL,YAAYK;IAChB,GAAG,EAAE;IAEL,MAAMC,eAAeF,YAAY;QAC7B,MAAMG,YAAYC,OAAO,MAAM,CAACT,UAAU,IAAI,CAACU,CAAAA,IAAKA,AAAMC,WAAND,KAAmBA,AAAM,OAANA;QACvEP,oBAAoBK;QAEpB,IAAI,CAACA,WAAW;YACZd,SAAS,CAAC;YACVI,QAAQ;YACR;QACJ;QAEA,MAAMc,mBAAmBjB,QAAQ,cAAc,CAAC,MAAM,CAClD,CAACkB,KAAKC,YAAcA,UAAUD,MAC9Bb;QAGJN,SAASkB;QACTd,QAAQ;IACZ,GAAG;QAACH,QAAQ,cAAc;QAAED;QAAUM;KAAS;IAE/C,MAAMe,eAAeV,YAAY;QAC7BJ,YAAY,CAAC;QACbP,SAAS,CAAC;QACVS,oBAAoB;IACxB,GAAG;QAACT;KAAS;IAEb,OAAO,WAAP,GACI,wDACI,oBAACsB,YAAUA;QACP,SAASd,mBAAmB,YAAY;QACxC,oBAAM,oBAACe,gBAAUA;QACjB,SAAS,IAAMnB,QAAQ;QACvB,eAAY;sBAEhB,oBAACoB,QAAMA;QACH,MAAMrB;QACN,SAAS,IAAMC,QAAQ;QACvB,OAAO;QACP,OAAO;QACP,OAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,aAAa;QACb,uBACI,wDACI,oBAACoB,OAAO,YAAY;YAAC,MAAK;YAAY,SAASH;0BAC/C,oBAACG,OAAO,aAAa;YAAC,MAAK;YAAgB,SAASX;;qBAI5D,oBAACY,MAAIA;QAAC,MAAMnB;QAAU,UAAUI;OAC3B,kBACG,oBAAC;YAAI,WAAW;WACXT,QAAQ,OAAO,CAAC,GAAG,CAACyB,CAAAA,SAAAA,WAAAA,GACjB,oBAAC;gBAAI,KAAKA,OAAO,IAAI;eAAGA,OAAO,OAAO;AAQtE"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import react, { useCallback } from "react";
|
|
2
|
-
import styled from "@emotion/styled";
|
|
3
2
|
import { ReactComponent } from "@webiny/icons/filter_list.svg";
|
|
4
3
|
import { ReactComponent as filter_list_off_svg_ReactComponent } from "@webiny/icons/filter_list_off.svg";
|
|
5
4
|
import { IconButton } from "@webiny/admin-ui";
|
|
6
|
-
const ButtonWrapper = styled("div")`
|
|
7
|
-
margin-left: 8px;
|
|
8
|
-
`;
|
|
9
5
|
const Icon = ({ showingFilters })=>showingFilters ? /*#__PURE__*/ react.createElement(filter_list_off_svg_ReactComponent, null) : /*#__PURE__*/ react.createElement(ReactComponent, null);
|
|
10
6
|
const IconComponent = /*#__PURE__*/ react.memo(Icon);
|
|
11
7
|
const ButtonFilters = ({ showingFilters, hideFilters, showFilters })=>{
|
|
@@ -15,7 +11,10 @@ const ButtonFilters = ({ showingFilters, hideFilters, showFilters })=>{
|
|
|
15
11
|
}, [
|
|
16
12
|
showingFilters
|
|
17
13
|
]);
|
|
18
|
-
return /*#__PURE__*/ react.createElement(
|
|
14
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
15
|
+
className: "ml-sm"
|
|
16
|
+
}, /*#__PURE__*/ react.createElement(IconButton, {
|
|
17
|
+
variant: "secondary",
|
|
19
18
|
icon: /*#__PURE__*/ react.createElement(IconComponent, {
|
|
20
19
|
showingFilters: showingFilters
|
|
21
20
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/Header/ButtonFilters/ButtonFilters.js","sources":["../../../../../src/views/Logs/Header/ButtonFilters/ButtonFilters.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport
|
|
1
|
+
{"version":3,"file":"views/Logs/Header/ButtonFilters/ButtonFilters.js","sources":["../../../../../src/views/Logs/Header/ButtonFilters/ButtonFilters.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { ReactComponent as FilterIcon } from \"@webiny/icons/filter_list.svg\";\nimport { ReactComponent as CloseFilterIcon } from \"@webiny/icons/filter_list_off.svg\";\nimport { IconButton } from \"@webiny/admin-ui\";\n\ninterface IconProps {\n showingFilters?: boolean;\n}\n\nconst Icon = ({ showingFilters }: IconProps) => {\n return showingFilters ? <CloseFilterIcon /> : <FilterIcon />;\n};\nconst IconComponent = React.memo(Icon);\n\ntype ButtonFiltersProps = {\n showingFilters: boolean;\n hideFilters: () => void;\n showFilters: () => void;\n};\n\nexport const ButtonFilters = ({ showingFilters, hideFilters, showFilters }: ButtonFiltersProps) => {\n const toggleFilters = useCallback(() => {\n if (showingFilters) {\n hideFilters();\n return;\n }\n showFilters();\n }, [showingFilters]);\n\n return (\n <div className={\"ml-sm\"}>\n <IconButton\n variant={\"secondary\"}\n icon={<IconComponent showingFilters={showingFilters} />}\n onClick={toggleFilters}\n data-testid=\"audit-logs.toggle-filters\"\n />\n </div>\n );\n};\n"],"names":["Icon","showingFilters","CloseFilterIcon","FilterIcon","IconComponent","React","ButtonFilters","hideFilters","showFilters","toggleFilters","useCallback","IconButton"],"mappings":";;;;AASA,MAAMA,OAAO,CAAC,EAAEC,cAAc,EAAa,GAChCA,iBAAiB,WAAjBA,GAAiB,oBAACC,oCAAeA,QAAAA,WAAAA,GAAM,oBAACC,gBAAUA;AAE7D,MAAMC,gBAAgB,WAAHA,GAAGC,MAAAA,IAAU,CAACL;AAQ1B,MAAMM,gBAAgB,CAAC,EAAEL,cAAc,EAAEM,WAAW,EAAEC,WAAW,EAAsB;IAC1F,MAAMC,gBAAgBC,YAAY;QAC9B,IAAIT,gBAAgB,YAChBM;QAGJC;IACJ,GAAG;QAACP;KAAe;IAEnB,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACU,YAAUA;QACP,SAAS;QACT,oBAAM,oBAACP,eAAaA;YAAC,gBAAgBH;;QACrC,SAASQ;QACT,eAAY;;AAI5B"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
type HeaderProps = {
|
|
3
3
|
title: string;
|
|
4
|
-
|
|
5
|
-
hideFilters: () => void;
|
|
6
|
-
showFilters: () => void;
|
|
4
|
+
children?: React.ReactNode;
|
|
7
5
|
};
|
|
8
|
-
export declare const Header: ({ title,
|
|
6
|
+
export declare const Header: ({ title, children }: HeaderProps) => React.JSX.Element;
|
|
9
7
|
export {};
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import react from "react";
|
|
2
|
-
import { ButtonFilters } from "./ButtonFilters/index.js";
|
|
3
2
|
import { Text } from "../../../components/Text.js";
|
|
4
|
-
const Header = ({ title,
|
|
3
|
+
const Header = ({ title, children })=>/*#__PURE__*/ react.createElement("div", {
|
|
5
4
|
className: "box-border w-full border-b border-neutral-dimmed px-md py-sm"
|
|
6
5
|
}, /*#__PURE__*/ react.createElement("div", {
|
|
7
6
|
className: "flex items-center justify-between"
|
|
8
7
|
}, /*#__PURE__*/ react.createElement(Text, {
|
|
9
8
|
use: "headline5"
|
|
10
|
-
}, title), /*#__PURE__*/ react.createElement(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
showFilters: showFilters
|
|
14
|
-
})));
|
|
9
|
+
}, title), /*#__PURE__*/ react.createElement("div", {
|
|
10
|
+
className: "ml-auto"
|
|
11
|
+
}, children)));
|
|
15
12
|
export { Header };
|
|
16
13
|
|
|
17
14
|
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/Header/Header.js","sources":["../../../../src/views/Logs/Header/Header.tsx"],"sourcesContent":["import React from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"views/Logs/Header/Header.js","sources":["../../../../src/views/Logs/Header/Header.tsx"],"sourcesContent":["import React from \"react\";\nimport { Text } from \"~/components/Text.js\";\n\ntype HeaderProps = {\n title: string;\n children?: React.ReactNode;\n};\n\nexport const Header = ({ title, children }: HeaderProps) => {\n return (\n <div className=\"box-border w-full border-b border-neutral-dimmed px-md py-sm\">\n <div className=\"flex items-center justify-between\">\n <Text use={\"headline5\"}>{title}</Text>\n <div className={\"ml-auto\"}>{children}</div>\n </div>\n </div>\n );\n};\n"],"names":["Header","title","children","Text"],"mappings":";;AAQO,MAAMA,SAAS,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAAe,GAC5C,WAAP,GACI,oBAAC;QAAI,WAAU;qBACX,oBAAC;QAAI,WAAU;qBACX,oBAACC,MAAIA;QAAC,KAAK;OAAcF,QAAAA,WAAAA,GACzB,oBAAC;QAAI,WAAW;OAAYC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
1
|
+
import React from "react";
|
|
2
|
+
export declare const Container: ({ children }: {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
}) => React.JSX.Element;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
const Container =
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
margin-top: 16px;
|
|
6
|
-
`;
|
|
1
|
+
import react from "react";
|
|
2
|
+
const Container = ({ children })=>/*#__PURE__*/ react.createElement("div", {
|
|
3
|
+
className: "flex justify-center mt-md"
|
|
4
|
+
}, children);
|
|
7
5
|
export { Container };
|
|
8
6
|
|
|
9
7
|
//# sourceMappingURL=styled.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/LoadMoreButton/styled.js","sources":["../../../../src/views/Logs/LoadMoreButton/styled.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"views/Logs/LoadMoreButton/styled.js","sources":["../../../../src/views/Logs/LoadMoreButton/styled.tsx"],"sourcesContent":["import React from \"react\";\n\nexport const Container = ({ children }: { children: React.ReactNode }) => {\n return <div className={\"flex justify-center mt-md\"}>{children}</div>;\n};\n"],"names":["Container","children"],"mappings":";AAEO,MAAMA,YAAY,CAAC,EAAEC,QAAQ,EAAiC,GAC1D,WAAP,GAAO,oBAAC;QAAI,WAAW;OAA8BA"}
|
package/views/Logs/LogsView.js
CHANGED
|
@@ -33,16 +33,12 @@ const LogsView = ()=>{
|
|
|
33
33
|
return /*#__PURE__*/ react.createElement("div", {
|
|
34
34
|
className: "flex flex-col h-main-content"
|
|
35
35
|
}, /*#__PURE__*/ react.createElement(Header, {
|
|
36
|
-
title: "Audit Logs"
|
|
37
|
-
showingFilters: list.showingFilters,
|
|
38
|
-
showFilters: list.showFilters,
|
|
39
|
-
hideFilters: list.hideFilters
|
|
40
|
-
}), /*#__PURE__*/ react.createElement("div", {
|
|
41
|
-
className: "flex-1 min-h-0"
|
|
36
|
+
title: "Audit Logs"
|
|
42
37
|
}, /*#__PURE__*/ react.createElement(Filters, {
|
|
43
|
-
showingFilters: list.showingFilters,
|
|
44
38
|
setWhere: list.setWhere
|
|
45
|
-
}),
|
|
39
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
40
|
+
className: "flex-1 min-h-0"
|
|
41
|
+
}, 0 !== list.records.length || list.isListLoading ? /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Preview, {
|
|
46
42
|
auditLog: selectedAuditLog,
|
|
47
43
|
onClose: ()=>closePreviewModal(),
|
|
48
44
|
hasAccessToUsers: hasAccessToUsers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views/Logs/LogsView.js","sources":["../../../src/views/Logs/LogsView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { EmptyView } from \"@webiny/app-admin\";\nimport { useSecurity } from \"@webiny/app-admin\";\nimport { Scrollbar } from \"@webiny/admin-ui\";\nimport { LoadingMore } from \"~/views/Logs/LoadingMore/index.js\";\nimport { LoadMoreButton } from \"~/views/Logs/LoadMoreButton/index.js\";\nimport { Header } from \"~/views/Logs/Header/index.js\";\nimport { Filters } from \"~/views/Logs/Filters/index.js\";\nimport { Table } from \"~/views/Logs/Table/index.js\";\nimport { Preview } from \"~/views/Logs/Preview/index.js\";\nimport { useAuditLogsList } from \"~/hooks/index.js\";\nimport type { IAuditLog } from \"~/types.js\";\n\nconst t = i18n.ns(\"app-audit-logs/views/logs\");\n\nexport const LogsView = () => {\n const [selectedAuditLog, setSelectedAuditLog] = useState<IAuditLog | null>(null);\n const handleAuditLogSelect = useCallback(\n (auditLog: IAuditLog) => setSelectedAuditLog(auditLog),\n []\n );\n const closePreviewModal = useCallback(() => setSelectedAuditLog(null), []);\n\n const { innerHeight: windowHeight } = window;\n const [tableHeight, setTableHeight] = useState(0);\n const tableRef = useRef<HTMLDivElement>(null);\n const { getPermissions } = useSecurity();\n const hasAccessToUsers = Boolean(getPermissions(\"adminUsers\").length);\n\n const list = useAuditLogsList();\n\n useEffect(() => {\n setTableHeight(tableRef?.current?.clientHeight || 0);\n\n return () => {\n setTableHeight(0);\n };\n });\n\n const loadMoreOnScroll = debounce(({ scrollFrame }) => {\n if (scrollFrame.top > 0.8 && !list.isListLoadingMore && list.meta.hasMoreItems) {\n list.listMoreRecords();\n }\n }, 200);\n\n return (\n <div className={\"flex flex-col h-main-content\"}>\n <Header
|
|
1
|
+
{"version":3,"file":"views/Logs/LogsView.js","sources":["../../../src/views/Logs/LogsView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { EmptyView } from \"@webiny/app-admin\";\nimport { useSecurity } from \"@webiny/app-admin\";\nimport { Scrollbar } from \"@webiny/admin-ui\";\nimport { LoadingMore } from \"~/views/Logs/LoadingMore/index.js\";\nimport { LoadMoreButton } from \"~/views/Logs/LoadMoreButton/index.js\";\nimport { Header } from \"~/views/Logs/Header/index.js\";\nimport { Filters } from \"~/views/Logs/Filters/index.js\";\nimport { Table } from \"~/views/Logs/Table/index.js\";\nimport { Preview } from \"~/views/Logs/Preview/index.js\";\nimport { useAuditLogsList } from \"~/hooks/index.js\";\nimport type { IAuditLog } from \"~/types.js\";\n\nconst t = i18n.ns(\"app-audit-logs/views/logs\");\n\nexport const LogsView = () => {\n const [selectedAuditLog, setSelectedAuditLog] = useState<IAuditLog | null>(null);\n const handleAuditLogSelect = useCallback(\n (auditLog: IAuditLog) => setSelectedAuditLog(auditLog),\n []\n );\n const closePreviewModal = useCallback(() => setSelectedAuditLog(null), []);\n\n const { innerHeight: windowHeight } = window;\n const [tableHeight, setTableHeight] = useState(0);\n const tableRef = useRef<HTMLDivElement>(null);\n const { getPermissions } = useSecurity();\n const hasAccessToUsers = Boolean(getPermissions(\"adminUsers\").length);\n\n const list = useAuditLogsList();\n\n useEffect(() => {\n setTableHeight(tableRef?.current?.clientHeight || 0);\n\n return () => {\n setTableHeight(0);\n };\n });\n\n const loadMoreOnScroll = debounce(({ scrollFrame }) => {\n if (scrollFrame.top > 0.8 && !list.isListLoadingMore && list.meta.hasMoreItems) {\n list.listMoreRecords();\n }\n }, 200);\n\n return (\n <div className={\"flex flex-col h-main-content\"}>\n <Header title=\"Audit Logs\">\n <Filters setWhere={list.setWhere} />\n </Header>\n <div className={\"flex-1 min-h-0\"}>\n {list.records.length === 0 && !list.isListLoading ? (\n <EmptyView title={t`No results found.`} action={null} />\n ) : (\n <>\n <Preview\n auditLog={selectedAuditLog}\n onClose={() => closePreviewModal()}\n hasAccessToUsers={hasAccessToUsers}\n />\n <Scrollbar\n data-testid=\"default-data-list\"\n onScrollFrame={scrollFrame => loadMoreOnScroll({ scrollFrame })}\n >\n <div className={\"h-[500px]\"}>\n <Table\n ref={tableRef}\n records={list.records}\n loading={list.isListLoading && !list.isListLoadingMore}\n handleRecordSelect={handleAuditLogSelect}\n sorting={list.sorting}\n onSortingChange={list.setSorting}\n hasAccessToUsers={hasAccessToUsers}\n />\n <LoadMoreButton\n show={!list.isListLoading && list.meta.hasMoreItems}\n disabled={list.isListLoadingMore}\n windowHeight={windowHeight}\n tableHeight={tableHeight}\n onClick={list.listMoreRecords}\n />\n </div>\n </Scrollbar>\n {list.isListLoadingMore && <LoadingMore />}\n </>\n )}\n </div>\n </div>\n );\n};\n"],"names":["t","i18n","LogsView","selectedAuditLog","setSelectedAuditLog","useState","handleAuditLogSelect","useCallback","auditLog","closePreviewModal","windowHeight","window","tableHeight","setTableHeight","tableRef","useRef","getPermissions","useSecurity","hasAccessToUsers","Boolean","list","useAuditLogsList","useEffect","loadMoreOnScroll","debounce","scrollFrame","Header","Filters","Preview","Scrollbar","Table","LoadMoreButton","LoadingMore","EmptyView"],"mappings":";;;;;;;;;;;;AAeA,MAAMA,IAAIC,KAAK,EAAE,CAAC;AAEX,MAAMC,WAAW;IACpB,MAAM,CAACC,kBAAkBC,oBAAoB,GAAGC,SAA2B;IAC3E,MAAMC,uBAAuBC,YACzB,CAACC,WAAwBJ,oBAAoBI,WAC7C,EAAE;IAEN,MAAMC,oBAAoBF,YAAY,IAAMH,oBAAoB,OAAO,EAAE;IAEzE,MAAM,EAAE,aAAaM,YAAY,EAAE,GAAGC;IACtC,MAAM,CAACC,aAAaC,eAAe,GAAGR,SAAS;IAC/C,MAAMS,WAAWC,OAAuB;IACxC,MAAM,EAAEC,cAAc,EAAE,GAAGC;IAC3B,MAAMC,mBAAmBC,QAAQH,eAAe,cAAc,MAAM;IAEpE,MAAMI,OAAOC;IAEbC,UAAU;QACNT,eAAeC,UAAU,SAAS,gBAAgB;QAElD,OAAO;YACHD,eAAe;QACnB;IACJ;IAEA,MAAMU,mBAAmBC,SAAS,CAAC,EAAEC,WAAW,EAAE;QAC9C,IAAIA,YAAY,GAAG,GAAG,OAAO,CAACL,KAAK,iBAAiB,IAAIA,KAAK,IAAI,CAAC,YAAY,EAC1EA,KAAK,eAAe;IAE5B,GAAG;IAEH,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACM,QAAMA;QAAC,OAAM;qBACV,oBAACC,SAAOA;QAAC,UAAUP,KAAK,QAAQ;uBAEpC,oBAAC;QAAI,WAAW;OACXA,AAAwB,MAAxBA,KAAK,OAAO,CAAC,MAAM,IAAWA,KAAK,aAAa,G,cAG7C,wDACI,oBAACQ,SAAOA;QACJ,UAAUzB;QACV,SAAS,IAAMM;QACf,kBAAkBS;sBAEtB,oBAACW,WAASA;QACN,eAAY;QACZ,eAAeJ,CAAAA,cAAeF,iBAAiB;gBAAEE;YAAY;qBAE7D,oBAAC;QAAI,WAAW;qBACZ,oBAACK,OAAKA;QACF,KAAKhB;QACL,SAASM,KAAK,OAAO;QACrB,SAASA,KAAK,aAAa,IAAI,CAACA,KAAK,iBAAiB;QACtD,oBAAoBd;QACpB,SAASc,KAAK,OAAO;QACrB,iBAAiBA,KAAK,UAAU;QAChC,kBAAkBF;sBAEtB,oBAACa,gBAAcA;QACX,MAAM,CAACX,KAAK,aAAa,IAAIA,KAAK,IAAI,CAAC,YAAY;QACnD,UAAUA,KAAK,iBAAiB;QAChC,cAAcV;QACd,aAAaE;QACb,SAASQ,KAAK,eAAe;UAIxCA,KAAK,iBAAiB,IAAI,WAAJ,GAAI,oBAACY,aAAWA,SAhCK,WAAH,GAC7C,oBAACC,WAASA;QAAC,OAAOjC,CAAC,CAAC,iBAAiB,CAAC;QAAE,QAAQ;;AAqCpE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuditLogDetailsPresenter as Abstraction, type IAuditLogDetailsVm } from "./abstractions.js";
|
|
2
|
+
import type { IAuditLog } from "../../../types.js";
|
|
3
|
+
declare class AuditLogDetailsPresenterImpl implements Abstraction.Interface {
|
|
4
|
+
private _auditLog;
|
|
5
|
+
constructor();
|
|
6
|
+
get vm(): IAuditLogDetailsVm;
|
|
7
|
+
init(auditLog: IAuditLog): void;
|
|
8
|
+
private parseContent;
|
|
9
|
+
}
|
|
10
|
+
export declare const AuditLogDetailsPresenter: typeof AuditLogDetailsPresenterImpl & {
|
|
11
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IAuditLogDetailsPresenter>;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { computed, makeAutoObservable } from "mobx";
|
|
2
|
+
import { AuditLogDetailsPresenter } from "./abstractions.js";
|
|
3
|
+
class AuditLogDetailsPresenterImpl {
|
|
4
|
+
constructor(){
|
|
5
|
+
this._auditLog = null;
|
|
6
|
+
makeAutoObservable(this, {
|
|
7
|
+
vm: computed
|
|
8
|
+
}, {
|
|
9
|
+
autoBind: true
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
get vm() {
|
|
13
|
+
return {
|
|
14
|
+
auditLog: this._auditLog,
|
|
15
|
+
content: this.parseContent()
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
init(auditLog) {
|
|
19
|
+
this._auditLog = auditLog;
|
|
20
|
+
}
|
|
21
|
+
parseContent() {
|
|
22
|
+
if (!this._auditLog) return {};
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(this._auditLog.content);
|
|
25
|
+
} catch {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const AuditLogDetailsPresenter_AuditLogDetailsPresenter = AuditLogDetailsPresenter.createImplementation({
|
|
31
|
+
implementation: AuditLogDetailsPresenterImpl,
|
|
32
|
+
dependencies: []
|
|
33
|
+
});
|
|
34
|
+
export { AuditLogDetailsPresenter_AuditLogDetailsPresenter as AuditLogDetailsPresenter };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=AuditLogDetailsPresenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views/Logs/Preview/AuditLogDetailsPresenter.js","sources":["../../../../src/views/Logs/Preview/AuditLogDetailsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, computed } from \"mobx\";\nimport {\n AuditLogDetailsPresenter as Abstraction,\n type IAuditLogDetailsVm\n} from \"./abstractions.js\";\nimport type { IAuditLog } from \"~/types.js\";\n\nclass AuditLogDetailsPresenterImpl implements Abstraction.Interface {\n private _auditLog: IAuditLog | null = null;\n\n constructor() {\n makeAutoObservable(this, { vm: computed }, { autoBind: true });\n }\n\n get vm(): IAuditLogDetailsVm {\n return {\n auditLog: this._auditLog,\n content: this.parseContent()\n };\n }\n\n init(auditLog: IAuditLog): void {\n this._auditLog = auditLog;\n }\n\n private parseContent(): Record<string, unknown> {\n if (!this._auditLog) {\n return {};\n }\n try {\n return JSON.parse(this._auditLog.content);\n } catch {\n return {};\n }\n }\n}\n\nexport const AuditLogDetailsPresenter = Abstraction.createImplementation({\n implementation: AuditLogDetailsPresenterImpl,\n dependencies: []\n});\n"],"names":["AuditLogDetailsPresenterImpl","makeAutoObservable","computed","auditLog","JSON","AuditLogDetailsPresenter","Abstraction"],"mappings":";;AAOA,MAAMA;IAGF,aAAc;aAFN,SAAS,GAAqB;QAGlCC,mBAAmB,IAAI,EAAE;YAAE,IAAIC;QAAS,GAAG;YAAE,UAAU;QAAK;IAChE;IAEA,IAAI,KAAyB;QACzB,OAAO;YACH,UAAU,IAAI,CAAC,SAAS;YACxB,SAAS,IAAI,CAAC,YAAY;QAC9B;IACJ;IAEA,KAAKC,QAAmB,EAAQ;QAC5B,IAAI,CAAC,SAAS,GAAGA;IACrB;IAEQ,eAAwC;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,EACf,OAAO,CAAC;QAEZ,IAAI;YACA,OAAOC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO;QAC5C,EAAE,OAAM;YACJ,OAAO,CAAC;QACZ;IACJ;AACJ;AAEO,MAAMC,oDAA2BC,yBAAAA,oBAAgC,CAAC;IACrE,gBAAgBN;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { IAuditLog } from "../../../types.js";
|
|
3
|
-
interface
|
|
3
|
+
interface PreviewProps {
|
|
4
4
|
auditLog: IAuditLog | null;
|
|
5
5
|
onClose: () => void;
|
|
6
6
|
hasAccessToUsers: boolean;
|
|
7
7
|
}
|
|
8
|
-
export declare const Preview: ({ auditLog, onClose, hasAccessToUsers }:
|
|
8
|
+
export declare const Preview: (({ auditLog, onClose, hasAccessToUsers }: PreviewProps) => React.JSX.Element | null) & {
|
|
9
|
+
displayName: string;
|
|
10
|
+
};
|
|
9
11
|
export {};
|