@webiny/app-audit-logs 6.4.11 → 6.6.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/components/Text.d.ts +1 -3
  2. package/components/Text.js +4 -9
  3. package/components/Text.js.map +1 -1
  4. package/config/list/AuditLogsListConfig.d.ts +11 -5
  5. package/config/list/AuditLogsListConfig.js +10 -1
  6. package/config/list/AuditLogsListConfig.js.map +1 -1
  7. package/config/list/Browser/index.d.ts +2 -3
  8. package/config/list/Details/PreviewTab.d.ts +15 -0
  9. package/config/list/Details/PreviewTab.js +32 -0
  10. package/config/list/Details/PreviewTab.js.map +1 -0
  11. package/config/list/Details/index.d.ts +8 -0
  12. package/config/list/Details/index.js +7 -0
  13. package/config/list/Details/index.js.map +1 -0
  14. package/features/listAuditLogs/ListAuditLogsGateway.d.ts +11 -0
  15. package/features/listAuditLogs/ListAuditLogsGateway.js +71 -0
  16. package/features/listAuditLogs/ListAuditLogsGateway.js.map +1 -0
  17. package/features/listAuditLogs/ListAuditLogsRepository.d.ts +11 -0
  18. package/features/listAuditLogs/ListAuditLogsRepository.js +35 -0
  19. package/features/listAuditLogs/ListAuditLogsRepository.js.map +1 -0
  20. package/features/listAuditLogs/ListAuditLogsUseCase.d.ts +10 -0
  21. package/features/listAuditLogs/ListAuditLogsUseCase.js +19 -0
  22. package/features/listAuditLogs/ListAuditLogsUseCase.js.map +1 -0
  23. package/features/listAuditLogs/abstractions/ListAuditLogsGateway.d.ts +20 -0
  24. package/features/listAuditLogs/abstractions/ListAuditLogsGateway.js +5 -0
  25. package/features/listAuditLogs/abstractions/ListAuditLogsGateway.js.map +1 -0
  26. package/features/listAuditLogs/abstractions/ListAuditLogsRepository.d.ts +20 -0
  27. package/features/listAuditLogs/abstractions/ListAuditLogsRepository.js +5 -0
  28. package/features/listAuditLogs/abstractions/ListAuditLogsRepository.js.map +1 -0
  29. package/features/listAuditLogs/abstractions/ListAuditLogsUseCase.d.ts +20 -0
  30. package/features/listAuditLogs/abstractions/ListAuditLogsUseCase.js +5 -0
  31. package/features/listAuditLogs/abstractions/ListAuditLogsUseCase.js.map +1 -0
  32. package/features/listAuditLogs/abstractions/index.d.ts +6 -0
  33. package/features/listAuditLogs/abstractions/index.js +3 -0
  34. package/features/listAuditLogs/feature.d.ts +3 -0
  35. package/features/listAuditLogs/feature.js +21 -0
  36. package/features/listAuditLogs/feature.js.map +1 -0
  37. package/features/listAuditLogs/index.d.ts +1 -0
  38. package/features/listAuditLogs/index.js +1 -0
  39. package/graphql.d.ts +1 -1
  40. package/graphql.js +1 -2
  41. package/graphql.js.map +1 -1
  42. package/hooks/graphql.d.ts +0 -18
  43. package/hooks/graphql.js +0 -44
  44. package/hooks/schema.d.ts +2 -3
  45. package/hooks/schema.js +1 -2
  46. package/hooks/schema.js.map +1 -1
  47. package/hooks/useAuditLogsList.d.ts +1 -4
  48. package/hooks/useAuditLogsList.js +34 -42
  49. package/hooks/useAuditLogsList.js.map +1 -1
  50. package/index.js +15 -5
  51. package/index.js.map +1 -1
  52. package/package.json +14 -17
  53. package/types.d.ts +2 -2
  54. package/views/Logs/Filters/FilterByAction.d.ts +1 -1
  55. package/views/Logs/Filters/FilterByAction.js +5 -3
  56. package/views/Logs/Filters/FilterByAction.js.map +1 -1
  57. package/views/Logs/Filters/FilterByApp.js +2 -1
  58. package/views/Logs/Filters/FilterByApp.js.map +1 -1
  59. package/views/Logs/Filters/FilterByCreatedBy.js +18 -10
  60. package/views/Logs/Filters/FilterByCreatedBy.js.map +1 -1
  61. package/views/Logs/Filters/FilterByCreatedOn.js +26 -27
  62. package/views/Logs/Filters/FilterByCreatedOn.js.map +1 -1
  63. package/views/Logs/Filters/FilterByEntity.d.ts +1 -1
  64. package/views/Logs/Filters/FilterByEntity.js +5 -3
  65. package/views/Logs/Filters/FilterByEntity.js.map +1 -1
  66. package/views/Logs/Filters/FilterByEntityId.js +2 -1
  67. package/views/Logs/Filters/FilterByEntityId.js.map +1 -1
  68. package/views/Logs/Filters/FilterByInitiator.js +16 -9
  69. package/views/Logs/Filters/FilterByInitiator.js.map +1 -1
  70. package/views/Logs/Filters/Filters.d.ts +1 -2
  71. package/views/Logs/Filters/Filters.js +61 -13
  72. package/views/Logs/Filters/Filters.js.map +1 -1
  73. package/views/Logs/Header/ButtonFilters/ButtonFilters.js +4 -5
  74. package/views/Logs/Header/ButtonFilters/ButtonFilters.js.map +1 -1
  75. package/views/Logs/Header/Header.d.ts +2 -4
  76. package/views/Logs/Header/Header.js +4 -7
  77. package/views/Logs/Header/Header.js.map +1 -1
  78. package/views/Logs/LoadMoreButton/styled.d.ts +4 -4
  79. package/views/Logs/LoadMoreButton/styled.js +4 -6
  80. package/views/Logs/LoadMoreButton/styled.js.map +1 -1
  81. package/views/Logs/LogsView.js +4 -8
  82. package/views/Logs/LogsView.js.map +1 -1
  83. package/views/Logs/Preview/AuditLogDetailsPresenter.d.ts +13 -0
  84. package/views/Logs/Preview/AuditLogDetailsPresenter.js +36 -0
  85. package/views/Logs/Preview/AuditLogDetailsPresenter.js.map +1 -0
  86. package/views/Logs/Preview/Preview.d.ts +4 -2
  87. package/views/Logs/Preview/Preview.js +67 -22
  88. package/views/Logs/Preview/Preview.js.map +1 -1
  89. package/views/Logs/Preview/abstractions.d.ts +14 -0
  90. package/views/Logs/Preview/abstractions.js +5 -0
  91. package/views/Logs/Preview/abstractions.js.map +1 -0
  92. package/views/Logs/Preview/feature.d.ts +5 -0
  93. package/views/Logs/Preview/feature.js +22 -0
  94. package/views/Logs/Preview/feature.js.map +1 -0
  95. package/views/Logs/Preview/index.d.ts +2 -0
  96. package/views/Logs/Preview/index.js +1 -0
  97. package/views/Logs/Preview/tabs/AiPromptTabs.d.ts +2 -0
  98. package/views/Logs/Preview/tabs/AiPromptTabs.js +25 -0
  99. package/views/Logs/Preview/tabs/AiPromptTabs.js.map +1 -0
  100. package/views/Logs/Preview/tabs/LlmResponseTab.d.ts +4 -0
  101. package/views/Logs/Preview/tabs/LlmResponseTab.js +41 -0
  102. package/views/Logs/Preview/tabs/LlmResponseTab.js.map +1 -0
  103. package/views/Logs/Preview/tabs/SystemPromptTab.d.ts +4 -0
  104. package/views/Logs/Preview/tabs/SystemPromptTab.js +24 -0
  105. package/views/Logs/Preview/tabs/SystemPromptTab.js.map +1 -0
  106. package/views/Logs/Preview/tabs/UserPromptTab.d.ts +4 -0
  107. package/views/Logs/Preview/tabs/UserPromptTab.js +18 -0
  108. package/views/Logs/Preview/tabs/UserPromptTab.js.map +1 -0
  109. package/views/Logs/Preview/tabs/shared.d.ts +28 -0
  110. package/views/Logs/Preview/tabs/shared.js +16 -0
  111. package/views/Logs/Preview/tabs/shared.js.map +1 -0
  112. package/views/Logs/Table/Table.d.ts +3 -6
  113. package/views/Logs/Table/Table.js +25 -16
  114. package/views/Logs/Table/Table.js.map +1 -1
  115. package/views/Logs/Table/styled.d.ts +1 -16
  116. package/views/Logs/Table/styled.js +15 -55
  117. package/views/Logs/Table/styled.js.map +1 -1
  118. package/hooks/graphql.js.map +0 -1
  119. package/views/Logs/Filters/FilterByTimestamp.d.ts +0 -2
  120. package/views/Logs/Filters/FilterByTimestamp.js +0 -39
  121. package/views/Logs/Filters/FilterByTimestamp.js.map +0 -1
  122. package/views/Logs/Filters/styled.d.ts +0 -4
  123. package/views/Logs/Filters/styled.js +0 -13
  124. package/views/Logs/Filters/styled.js.map +0 -1
  125. package/views/Logs/Logs.d.ts +0 -3
  126. package/views/Logs/Logs.js +0 -76
  127. package/views/Logs/Logs.js.map +0 -1
  128. package/views/Logs/Preview/styled.d.ts +0 -5
  129. package/views/Logs/Preview/styled.js +0 -32
  130. package/views/Logs/Preview/styled.js.map +0 -1
@@ -1,37 +1,36 @@
1
1
  import react from "react";
2
- import { format } from "date-fns";
3
- import { Input } from "@webiny/admin-ui";
2
+ import { DatePicker } from "@webiny/admin-ui";
4
3
  import { useBind } from "@webiny/form";
5
- import { TimestampFiltersContainer } from "./styled.js";
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(TimestampFiltersContainer, null, /*#__PURE__*/ react.createElement(Input, {
28
- ...bindFrom,
29
- value: formatDateTime(bindFrom.value),
30
- type: "datetime-local"
31
- }), /*#__PURE__*/ react.createElement(Input, {
32
- ...bindTo,
33
- value: formatDateTime(bindTo.value),
34
- type: "datetime-local"
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 { format } from \"date-fns\";\nimport { Input } from \"@webiny/admin-ui\";\nimport { useBind } from \"@webiny/form\";\nimport { TimestampFiltersContainer } from \"./styled.js\";\n\nconst formatDateTime = (date: string) => {\n if (!date) {\n return \"\";\n }\n\n return format(new Date(date), \"yyyy-MM-dd'T'HH:mm\");\n};\n\nconst getValidFilterValue = (value: string): Date | undefined => {\n if (value === \"\") {\n return undefined;\n }\n\n return new Date(value);\n};\n\nexport const FilterByCreatedOn = () => {\n const bindFrom = useBind({\n name: \"createdOn_gte\",\n beforeChange(value, cb) {\n cb(getValidFilterValue(value));\n }\n });\n\n const bindTo = useBind({\n name: \"createdOn_lte\",\n beforeChange(value, cb) {\n cb(getValidFilterValue(value));\n }\n });\n\n return (\n <TimestampFiltersContainer>\n <Input {...bindFrom} value={formatDateTime(bindFrom.value)} type=\"datetime-local\" />\n <Input {...bindTo} value={formatDateTime(bindTo.value)} type=\"datetime-local\" />\n </TimestampFiltersContainer>\n );\n};\n"],"names":["formatDateTime","date","format","Date","getValidFilterValue","value","FilterByCreatedOn","bindFrom","useBind","cb","bindTo","TimestampFiltersContainer","Input"],"mappings":";;;;;AAMA,MAAMA,iBAAiB,CAACC;IACpB,IAAI,CAACA,MACD,OAAO;IAGX,OAAOC,OAAO,IAAIC,KAAKF,OAAO;AAClC;AAEA,MAAMG,sBAAsB,CAACC;IACzB,IAAIA,AAAU,OAAVA,OACA;IAGJ,OAAO,IAAIF,KAAKE;AACpB;AAEO,MAAMC,oBAAoB;IAC7B,MAAMC,WAAWC,QAAQ;QACrB,MAAM;QACN,cAAaH,KAAK,EAAEI,EAAE;YAClBA,GAAGL,oBAAoBC;QAC3B;IACJ;IAEA,MAAMK,SAASF,QAAQ;QACnB,MAAM;QACN,cAAaH,KAAK,EAAEI,EAAE;YAClBA,GAAGL,oBAAoBC;QAC3B;IACJ;IAEA,OAAO,WAAP,GACI,oBAACM,2BAAyBA,MAAAA,WAAAA,GACtB,oBAACC,OAAKA;QAAE,GAAGL,QAAQ;QAAE,OAAOP,eAAeO,SAAS,KAAK;QAAG,MAAK;sBACjE,oBAACK,OAAKA;QAAE,GAAGF,MAAM;QAAE,OAAOV,eAAeU,OAAO,KAAK;QAAG,MAAK;;AAGzE"}
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 | null;
2
+ export declare const FilterByEntity: () => React.JSX.Element;
@@ -31,12 +31,14 @@ const FilterByEntity = ()=>{
31
31
  }, [
32
32
  data.app
33
33
  ]);
34
- if (0 === options.length) return null;
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: "Filter by Entity",
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 if (options.length === 0) {\n return null;\n }\n\n return <Select {...bind} size={\"md\"} placeholder={\"Filter by Entity\"} options={options} />;\n};\n"],"names":["getValidFilterValue","value","FilterByEntity","data","setValue","useForm","bind","useBind","cb","undefined","options","useMemo","entities","auditLogsApps","app","entity","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,IAAIO,AAAmB,MAAnBA,QAAQ,MAAM,EACd,OAAO;IAGX,OAAO,WAAP,GAAO,oBAACM,QAAMA;QAAE,GAAGV,IAAI;QAAE,MAAM;QAAM,aAAa;QAAoB,SAASI;;AACnF"}
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: "Filter by EntityId"
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={\"Filter by EntityId\"} />;\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,MAAM;QAAM,aAAa;;AACrD"}
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 { useQuery } from "@apollo/react-hooks";
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 { data: listUsers } = useQuery(LIST_USERS);
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 { useQuery } from \"@apollo/react-hooks\";\nimport { useBind } from \"@webiny/form\";\nimport { Select } from \"@webiny/admin-ui\";\nimport { LIST_USERS } from \"~/graphql.js\";\nimport type { User } 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 FilterByInitiator = () => {\n const { data: listUsers } = useQuery(LIST_USERS);\n const bind = useBind({\n name: \"data.initiator\",\n beforeChange(value, cb) {\n cb(getValidFilterValue(value));\n }\n });\n\n const options = useMemo(() => {\n const users: User[] = listUsers?.adminUsers?.users?.data || [];\n\n return [\n { label: \"All\", value: \"all\" },\n ...users.map(user => ({ label: `${user.firstName} ${user.lastName}`, value: user.id }))\n ];\n }, [listUsers]);\n\n return <Select {...bind} size={\"md\"} placeholder={\"Filter by Initiator\"} options={options} />;\n};\n"],"names":["getValidFilterValue","value","FilterByInitiator","listUsers","useQuery","LIST_USERS","bind","useBind","cb","options","useMemo","users","user","Select"],"mappings":";;;;;AAOA,MAAMA,sBAAsB,CAACC;IACzB,IAAIA,AAAU,UAAVA,SAAmBA,AAAU,OAAVA,OACnB;IAEJ,OAAOA;AACX;AAEO,MAAMC,oBAAoB;IAC7B,MAAM,EAAE,MAAMC,SAAS,EAAE,GAAGC,SAASC;IACrC,MAAMC,OAAOC,QAAQ;QACjB,MAAM;QACN,cAAaN,KAAK,EAAEO,EAAE;YAClBA,GAAGR,oBAAoBC;QAC3B;IACJ;IAEA,MAAMQ,UAAUC,QAAQ;QACpB,MAAMC,QAAgBR,WAAW,YAAY,OAAO,QAAQ,EAAE;QAE9D,OAAO;YACH;gBAAE,OAAO;gBAAO,OAAO;YAAM;eAC1BQ,MAAM,GAAG,CAACC,CAAAA,OAAS;oBAAE,OAAO,GAAGA,KAAK,SAAS,CAAC,CAAC,EAAEA,KAAK,QAAQ,EAAE;oBAAE,OAAOA,KAAK,EAAE;gBAAC;SACvF;IACL,GAAG;QAACT;KAAU;IAEd,OAAO,WAAP,GAAO,oBAACU,QAAMA;QAAE,GAAGP,IAAI;QAAE,MAAM;QAAM,aAAa;QAAuB,SAASG;;AACtF"}
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: ({ showingFilters, setWhere }: FiltersProps) => React.JSX.Element;
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 { Filters } from "@webiny/app-admin";
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 Filters_Filters = ({ showingFilters, setWhere })=>{
6
+ const Filters = ({ setWhere })=>{
5
7
  const { browser } = useAuditLogsListConfig();
6
- const applyFilters = useCallback((data)=>{
7
- if (!Object.keys(data).length) return;
8
- const convertedFilters = browser.filtersToWhere.reduce((data, converter)=>converter(data), data);
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
- return /*#__PURE__*/ react.createElement(Filters, {
14
- filters: browser.filters,
15
- show: showingFilters,
16
- onChange: applyFilters
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 { Filters_Filters as Filters };
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 type { FiltersOnSubmit } from \"@webiny/app-admin\";\nimport { Filters as BaseFilters } from \"@webiny/app-admin\";\nimport { useAuditLogsListConfig } from \"~/config/list/index.js\";\nimport type { IListAuditLogsVariablesWhere } from \"~/hooks/graphql.js\";\n\ninterface FiltersProps {\n showingFilters: boolean;\n setWhere: (where: Partial<IListAuditLogsVariablesWhere>) => void;\n}\n\nexport const Filters = ({ showingFilters, setWhere }: FiltersProps) => {\n const { browser } = useAuditLogsListConfig();\n\n const applyFilters: FiltersOnSubmit = useCallback(\n data => {\n if (!Object.keys(data).length) {\n return;\n }\n\n const convertedFilters = browser.filtersToWhere.reduce(\n (data, converter) => converter(data),\n data\n );\n\n setWhere(convertedFilters);\n },\n [browser.filtersToWhere]\n );\n\n return <BaseFilters filters={browser.filters} show={showingFilters} onChange={applyFilters} />;\n};\n"],"names":["Filters","showingFilters","setWhere","browser","useAuditLogsListConfig","applyFilters","useCallback","data","Object","convertedFilters","converter","BaseFilters"],"mappings":";;;AAWO,MAAMA,kBAAU,CAAC,EAAEC,cAAc,EAAEC,QAAQ,EAAgB;IAC9D,MAAM,EAAEC,OAAO,EAAE,GAAGC;IAEpB,MAAMC,eAAgCC,YAClCC,CAAAA;QACI,IAAI,CAACC,OAAO,IAAI,CAACD,MAAM,MAAM,EACzB;QAGJ,MAAME,mBAAmBN,QAAQ,cAAc,CAAC,MAAM,CAClD,CAACI,MAAMG,YAAcA,UAAUH,OAC/BA;QAGJL,SAASO;IACb,GACA;QAACN,QAAQ,cAAc;KAAC;IAG5B,OAAO,WAAP,GAAO,oBAACQ,SAAWA;QAAC,SAASR,QAAQ,OAAO;QAAE,MAAMF;QAAgB,UAAUI;;AAClF"}
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(ButtonWrapper, null, /*#__PURE__*/ react.createElement(IconButton, {
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 styled from \"@emotion/styled\";\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\nconst ButtonWrapper = styled(\"div\")`\n margin-left: 8px;\n`;\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 <ButtonWrapper>\n <IconButton\n icon={<IconComponent showingFilters={showingFilters} />}\n onClick={toggleFilters}\n data-testid=\"audit-logs.toggle-filters\"\n />\n </ButtonWrapper>\n );\n};\n"],"names":["ButtonWrapper","styled","Icon","showingFilters","CloseFilterIcon","FilterIcon","IconComponent","React","ButtonFilters","hideFilters","showFilters","toggleFilters","useCallback","IconButton"],"mappings":";;;;;AAMA,MAAMA,gBAAgBC,OAAO,MAAM,CAAC;;AAEpC,CAAC;AAMD,MAAMC,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,oBAACH,eAAaA,MAAAA,WAAAA,GACV,oBAACa,YAAUA;QACP,oBAAM,oBAACP,eAAaA;YAAC,gBAAgBH;;QACrC,SAASQ;QACT,eAAY;;AAI5B"}
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
- showingFilters: boolean;
5
- hideFilters: () => void;
6
- showFilters: () => void;
4
+ children?: React.ReactNode;
7
5
  };
8
- export declare const Header: ({ title, showingFilters, hideFilters, showFilters }: HeaderProps) => React.JSX.Element;
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, showingFilters, hideFilters, showFilters })=>/*#__PURE__*/ react.createElement("div", {
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(ButtonFilters, {
11
- showingFilters: showingFilters,
12
- hideFilters: hideFilters,
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 { ButtonFilters } from \"~/views/Logs/Header/ButtonFilters/index.js\";\nimport { Text } from \"~/components/Text.js\";\n\ntype HeaderProps = {\n title: string;\n showingFilters: boolean;\n hideFilters: () => void;\n showFilters: () => void;\n};\n\nexport const Header = ({ title, showingFilters, hideFilters, showFilters }: 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 <ButtonFilters\n showingFilters={showingFilters}\n hideFilters={hideFilters}\n showFilters={showFilters}\n />\n </div>\n </div>\n );\n};\n"],"names":["Header","title","showingFilters","hideFilters","showFilters","Text","ButtonFilters"],"mappings":";;;AAWO,MAAMA,SAAS,CAAC,EAAEC,KAAK,EAAEC,cAAc,EAAEC,WAAW,EAAEC,WAAW,EAAe,GAC5E,WAAP,GACI,oBAAC;QAAI,WAAU;qBACX,oBAAC;QAAI,WAAU;qBACX,oBAACC,MAAIA;QAAC,KAAK;OAAcJ,QAAAA,WAAAA,GACzB,oBAACK,eAAaA;QACV,gBAAgBJ;QAChB,aAAaC;QACb,aAAaC"}
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
- export declare const Container: import("@emotion/styled").StyledComponent<{
2
- theme?: import("@emotion/react").Theme;
3
- as?: React.ElementType;
4
- }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
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 styled from "@emotion/styled";
2
- const Container = styled("div")`
3
- display: flex;
4
- justify-content: center;
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 styled from \"@emotion/styled\";\n\nexport const Container = styled(\"div\")`\n display: flex;\n justify-content: center;\n margin-top: 16px;\n`;\n"],"names":["Container","styled"],"mappings":";AAEO,MAAMA,YAAYC,OAAO,MAAM,CAAC;;;;AAIvC,CAAC"}
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"}
@@ -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
- }), 0 !== list.records.length || list.isListLoading ? /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Preview, {
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\n title=\"Audit Logs\"\n showingFilters={list.showingFilters}\n showFilters={list.showFilters}\n hideFilters={list.hideFilters}\n />\n <div className={\"flex-1 min-h-0\"}>\n <Filters showingFilters={list.showingFilters} setWhere={list.setWhere} />\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;QACH,OAAM;QACN,gBAAgBN,KAAK,cAAc;QACnC,aAAaA,KAAK,WAAW;QAC7B,aAAaA,KAAK,WAAW;sBAEjC,oBAAC;QAAI,WAAW;qBACZ,oBAACO,SAAOA;QAAC,gBAAgBP,KAAK,cAAc;QAAE,UAAUA,KAAK,QAAQ;QACpEA,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"}
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 HeaderProps {
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 }: HeaderProps) => React.JSX.Element | null;
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 {};