@webiny/app-audit-logs 6.6.0-alpha.0 → 6.6.0-alpha.2
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 +6 -0
- package/config/list/AuditLogsListConfig.js +10 -1
- package/config/list/AuditLogsListConfig.js.map +1 -1
- 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/hooks/schema.d.ts +2 -3
- package/hooks/schema.js +1 -2
- package/hooks/schema.js.map +1 -1
- package/hooks/useAuditLogsList.d.ts +0 -3
- package/hooks/useAuditLogsList.js +11 -12
- package/hooks/useAuditLogsList.js.map +1 -1
- package/index.js +12 -5
- package/index.js.map +1 -1
- package/package.json +13 -15
- 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 +2 -1
- 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/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/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,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) & React.NamedExoticComponent<PreviewProps> & {
|
|
9
|
+
readonly type: ({ auditLog, onClose, hasAccessToUsers }: PreviewProps) => React.JSX.Element | null;
|
|
10
|
+
};
|
|
9
11
|
export {};
|