@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,4 +1,3 @@
1
- import type { IAuditLogRaw, IAuditLogsError, IAuditLogsMeta } from "../types.js";
2
1
  export interface IListAuditLogsVariablesWhere {
3
2
  app?: string;
4
3
  action?: string;
@@ -8,20 +7,3 @@ export interface IListAuditLogsVariablesWhere {
8
7
  createdOn_gte?: Date;
9
8
  createdOn_lte?: Date;
10
9
  }
11
- export interface IListAuditLogsVariables {
12
- where: Partial<IListAuditLogsVariablesWhere>;
13
- after: string | undefined;
14
- sort: "ASC" | "DESC" | undefined;
15
- limit: number | undefined;
16
- }
17
- export type IListAuditLogsVariablesPartial = Partial<IListAuditLogsVariables>;
18
- export interface IListAuditLogsResponse {
19
- auditLogs: {
20
- listAuditLogs: {
21
- data: IAuditLogRaw[] | null;
22
- meta: IAuditLogsMeta | null;
23
- error: IAuditLogsError | null;
24
- };
25
- };
26
- }
27
- export declare const LIST_AUDIT_LOGS: import("graphql").DocumentNode;
package/hooks/graphql.js CHANGED
@@ -1,44 +0,0 @@
1
- import graphql_tag from "graphql-tag";
2
- const LIST_AUDIT_LOGS = graphql_tag`
3
- query ListAuditLogs(
4
- $where: ListAuditLogsWhere!
5
- $sort: AuditLogsSort
6
- $after: String
7
- $limit: Number
8
- ) {
9
- auditLogs {
10
- listAuditLogs(where: $where, after: $after, sort: $sort, limit: $limit) {
11
- data {
12
- id
13
- createdBy {
14
- id
15
- displayName
16
- type
17
- }
18
- createdOn
19
- app
20
- action
21
- message
22
- entity
23
- entityId
24
- tags
25
- expiresAt
26
- content
27
- }
28
- meta {
29
- hasMoreItems
30
- cursor
31
- }
32
- error {
33
- message
34
- code
35
- data
36
- stack
37
- }
38
- }
39
- }
40
- }
41
- `;
42
- export { LIST_AUDIT_LOGS };
43
-
44
- //# sourceMappingURL=graphql.js.map
package/hooks/schema.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import zod from "zod";
2
- import { ActionType } from "../types.js";
3
2
  export declare const auditLogSchema: zod.ZodObject<{
4
3
  id: zod.ZodString;
5
4
  createdBy: zod.ZodObject<{
@@ -9,7 +8,7 @@ export declare const auditLogSchema: zod.ZodObject<{
9
8
  }, zod.core.$strip>;
10
9
  createdOn: zod.ZodPreprocess<zod.ZodDate>;
11
10
  app: zod.ZodString;
12
- action: zod.ZodEnum<typeof ActionType>;
11
+ action: zod.ZodString;
13
12
  message: zod.ZodString;
14
13
  entity: zod.ZodString;
15
14
  entityId: zod.ZodString;
@@ -26,7 +25,7 @@ export declare const listAuditLogsSchema: zod.ZodArray<zod.ZodObject<{
26
25
  }, zod.core.$strip>;
27
26
  createdOn: zod.ZodPreprocess<zod.ZodDate>;
28
27
  app: zod.ZodString;
29
- action: zod.ZodEnum<typeof ActionType>;
28
+ action: zod.ZodString;
30
29
  message: zod.ZodString;
31
30
  entity: zod.ZodString;
32
31
  entityId: zod.ZodString;
package/hooks/schema.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import zod from "zod";
2
- import { ActionType } from "../types.js";
3
2
  const auditLogSchema = zod.object({
4
3
  id: zod.string(),
5
4
  createdBy: zod.object({
@@ -12,7 +11,7 @@ const auditLogSchema = zod.object({
12
11
  return value;
13
12
  }, zod.date()),
14
13
  app: zod.string(),
15
- action: zod.nativeEnum(ActionType),
14
+ action: zod.string(),
16
15
  message: zod.string(),
17
16
  entity: zod.string(),
18
17
  entityId: zod.string(),
@@ -1 +1 @@
1
- {"version":3,"file":"hooks/schema.js","sources":["../../src/hooks/schema.ts"],"sourcesContent":["import zod from \"zod\";\nimport { ActionType } from \"~/types.js\";\n\nexport const auditLogSchema = zod.object({\n id: zod.string(),\n createdBy: zod.object({\n id: zod.string(),\n displayName: zod.string().optional(),\n type: zod.string().optional()\n }),\n createdOn: zod.preprocess(value => {\n if (typeof value === \"string\" || value instanceof Date) {\n return new Date(value);\n }\n return value;\n }, zod.date()),\n app: zod.string(),\n action: zod.nativeEnum(ActionType),\n message: zod.string(),\n entity: zod.string(),\n entityId: zod.string(),\n tags: zod.array(zod.string()),\n expiresAt: zod\n .preprocess(value => {\n if (typeof value === \"string\" || value instanceof Date) {\n return new Date(value);\n }\n return undefined;\n }, zod.date().optional().nullish())\n .optional()\n .nullish()\n .transform(value => {\n return value || undefined;\n }),\n content: zod.string()\n});\n\nexport const listAuditLogsSchema = zod.array(auditLogSchema);\n"],"names":["auditLogSchema","zod","value","Date","ActionType","undefined","listAuditLogsSchema"],"mappings":";;AAGO,MAAMA,iBAAiBC,IAAI,MAAM,CAAC;IACrC,IAAIA,IAAI,MAAM;IACd,WAAWA,IAAI,MAAM,CAAC;QAClB,IAAIA,IAAI,MAAM;QACd,aAAaA,IAAI,MAAM,GAAG,QAAQ;QAClC,MAAMA,IAAI,MAAM,GAAG,QAAQ;IAC/B;IACA,WAAWA,IAAI,UAAU,CAACC,CAAAA;QACtB,IAAI,AAAiB,YAAjB,OAAOA,SAAsBA,iBAAiBC,MAC9C,OAAO,IAAIA,KAAKD;QAEpB,OAAOA;IACX,GAAGD,IAAI,IAAI;IACX,KAAKA,IAAI,MAAM;IACf,QAAQA,IAAI,UAAU,CAACG;IACvB,SAASH,IAAI,MAAM;IACnB,QAAQA,IAAI,MAAM;IAClB,UAAUA,IAAI,MAAM;IACpB,MAAMA,IAAI,KAAK,CAACA,IAAI,MAAM;IAC1B,WAAWA,IAAAA,UACI,CAACC,CAAAA;QACR,IAAI,AAAiB,YAAjB,OAAOA,SAAsBA,iBAAiBC,MAC9C,OAAO,IAAIA,KAAKD;IAGxB,GAAGD,IAAI,IAAI,GAAG,QAAQ,GAAG,OAAO,IAC/B,QAAQ,GACR,OAAO,GACP,SAAS,CAACC,CAAAA,QACAA,SAASG;IAExB,SAASJ,IAAI,MAAM;AACvB;AAEO,MAAMK,sBAAsBL,IAAI,KAAK,CAACD"}
1
+ {"version":3,"file":"hooks/schema.js","sources":["../../src/hooks/schema.ts"],"sourcesContent":["import zod from \"zod\";\n\nexport const auditLogSchema = zod.object({\n id: zod.string(),\n createdBy: zod.object({\n id: zod.string(),\n displayName: zod.string().optional(),\n type: zod.string().optional()\n }),\n createdOn: zod.preprocess(value => {\n if (typeof value === \"string\" || value instanceof Date) {\n return new Date(value);\n }\n return value;\n }, zod.date()),\n app: zod.string(),\n action: zod.string(),\n message: zod.string(),\n entity: zod.string(),\n entityId: zod.string(),\n tags: zod.array(zod.string()),\n expiresAt: zod\n .preprocess(value => {\n if (typeof value === \"string\" || value instanceof Date) {\n return new Date(value);\n }\n return undefined;\n }, zod.date().optional().nullish())\n .optional()\n .nullish()\n .transform(value => {\n return value || undefined;\n }),\n content: zod.string()\n});\n\nexport const listAuditLogsSchema = zod.array(auditLogSchema);\n"],"names":["auditLogSchema","zod","value","Date","undefined","listAuditLogsSchema"],"mappings":";AAEO,MAAMA,iBAAiBC,IAAI,MAAM,CAAC;IACrC,IAAIA,IAAI,MAAM;IACd,WAAWA,IAAI,MAAM,CAAC;QAClB,IAAIA,IAAI,MAAM;QACd,aAAaA,IAAI,MAAM,GAAG,QAAQ;QAClC,MAAMA,IAAI,MAAM,GAAG,QAAQ;IAC/B;IACA,WAAWA,IAAI,UAAU,CAACC,CAAAA;QACtB,IAAI,AAAiB,YAAjB,OAAOA,SAAsBA,iBAAiBC,MAC9C,OAAO,IAAIA,KAAKD;QAEpB,OAAOA;IACX,GAAGD,IAAI,IAAI;IACX,KAAKA,IAAI,MAAM;IACf,QAAQA,IAAI,MAAM;IAClB,SAASA,IAAI,MAAM;IACnB,QAAQA,IAAI,MAAM;IAClB,UAAUA,IAAI,MAAM;IACpB,MAAMA,IAAI,KAAK,CAACA,IAAI,MAAM;IAC1B,WAAWA,IAAAA,UACI,CAACC,CAAAA;QACR,IAAI,AAAiB,YAAjB,OAAOA,SAAsBA,iBAAiBC,MAC9C,OAAO,IAAIA,KAAKD;IAGxB,GAAGD,IAAI,IAAI,GAAG,QAAQ,GAAG,OAAO,IAC/B,QAAQ,GACR,OAAO,GACP,SAAS,CAACC,CAAAA,QACAA,SAASE;IAExB,SAASH,IAAI,MAAM;AACvB;AAEO,MAAMI,sBAAsBJ,IAAI,KAAK,CAACD"}
@@ -1,4 +1,4 @@
1
- import { type IListAuditLogsVariablesWhere } from "../hooks/graphql.js";
1
+ import type { IListAuditLogsVariablesWhere } from "../hooks/graphql.js";
2
2
  import type { IAuditLog, IAuditLogsMeta } from "../types.js";
3
3
  import type { OnDataTableSortingChange, DataTableSorting } from "@webiny/admin-ui";
4
4
  export interface UseAuditLogs {
@@ -12,8 +12,5 @@ export interface UseAuditLogs {
12
12
  after?: string;
13
13
  sorting: DataTableSorting;
14
14
  setSorting: OnDataTableSortingChange;
15
- showingFilters: boolean;
16
- showFilters: () => void;
17
- hideFilters: () => void;
18
15
  }
19
16
  export declare const useAuditLogsList: () => UseAuditLogs;
@@ -1,9 +1,8 @@
1
- import { useCallback, useEffect, useMemo, useState } from "react";
2
- import { useQuery } from "@apollo/react-hooks";
3
- import { LIST_AUDIT_LOGS } from "./graphql.js";
4
- import { transformRawAuditLog } from "../utils/transformRawAuditLog.js";
5
- import { listAuditLogsSchema } from "./schema.js";
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { useFeature } from "@webiny/app";
3
+ import { ListAuditLogsFeature } from "../features/listAuditLogs/index.js";
6
4
  const useAuditLogsList = ()=>{
5
+ const { useCase } = useFeature(ListAuditLogsFeature);
7
6
  const [variables, setVariables] = useState({
8
7
  where: {},
9
8
  after: void 0,
@@ -11,13 +10,25 @@ const useAuditLogsList = ()=>{
11
10
  limit: 25
12
11
  });
13
12
  const [accumulatedRecords, setAccumulatedRecords] = useState([]);
13
+ const [loading, setLoading] = useState(true);
14
+ const [meta, setMeta] = useState({
15
+ hasMoreItems: false,
16
+ cursor: null
17
+ });
18
+ const resetPagination = useCallback(()=>{
19
+ setAccumulatedRecords([]);
20
+ setMeta({
21
+ hasMoreItems: false,
22
+ cursor: null
23
+ });
24
+ }, []);
14
25
  const setWhere = useCallback((where)=>{
15
26
  setVariables((prev)=>({
16
27
  ...prev,
17
28
  where,
18
29
  after: void 0
19
30
  }));
20
- setAccumulatedRecords([]);
31
+ resetPagination();
21
32
  }, []);
22
33
  const setSort = useCallback((sort)=>{
23
34
  setVariables((prev)=>({
@@ -25,7 +36,7 @@ const useAuditLogsList = ()=>{
25
36
  sort,
26
37
  after: void 0
27
38
  }));
28
- setAccumulatedRecords([]);
39
+ resetPagination();
29
40
  }, []);
30
41
  const setAfter = useCallback((after)=>{
31
42
  setVariables((prev)=>({
@@ -39,7 +50,6 @@ const useAuditLogsList = ()=>{
39
50
  limit
40
51
  }));
41
52
  }, []);
42
- const [showingFilters, setShowingFilters] = useState(false);
43
53
  const [acoSorting, setAcoSorting] = useState([]);
44
54
  useEffect(()=>{
45
55
  const sort = acoSorting[0];
@@ -48,32 +58,21 @@ const useAuditLogsList = ()=>{
48
58
  }, [
49
59
  acoSorting
50
60
  ]);
51
- const logs = useQuery(LIST_AUDIT_LOGS, {
52
- variables,
53
- fetchPolicy: "network-only"
54
- });
61
+ const requestIdRef = useRef(0);
55
62
  useEffect(()=>{
56
- if (!logs.data?.auditLogs.listAuditLogs.data) return;
57
- const items = listAuditLogsSchema.safeParse(logs.data.auditLogs.listAuditLogs.data);
58
- if (!items.success) return void console.error(items.error);
59
- const newRecords = items.data.map((auditLog)=>transformRawAuditLog({
60
- auditLog
61
- }));
62
- variables.after ? setAccumulatedRecords((prev)=>[
63
- ...prev,
64
- ...newRecords
65
- ]) : setAccumulatedRecords(newRecords);
63
+ setLoading(true);
64
+ const requestId = ++requestIdRef.current;
65
+ useCase.execute(variables).then((result)=>{
66
+ if (requestId !== requestIdRef.current) return;
67
+ variables.after ? setAccumulatedRecords((prev)=>[
68
+ ...prev,
69
+ ...result.records
70
+ ]) : setAccumulatedRecords(result.records);
71
+ setMeta(result.meta);
72
+ setLoading(false);
73
+ });
66
74
  }, [
67
- logs.data?.auditLogs
68
- ]);
69
- const meta = useMemo(()=>{
70
- if (!logs.data?.auditLogs.listAuditLogs.meta) return {
71
- hasMoreItems: false,
72
- cursor: null
73
- };
74
- return logs.data.auditLogs.listAuditLogs.meta;
75
- }, [
76
- logs.data?.auditLogs
75
+ variables
77
76
  ]);
78
77
  const sorting = useMemo(()=>[
79
78
  {
@@ -84,24 +83,17 @@ const useAuditLogsList = ()=>{
84
83
  variables.sort
85
84
  ]);
86
85
  return {
87
- isListLoading: logs.loading,
86
+ isListLoading: loading,
88
87
  records: accumulatedRecords,
89
88
  meta,
90
89
  listMoreRecords: ()=>{
91
- setAfter(meta.cursor || void 0);
90
+ if (!loading && meta.cursor) setAfter(meta.cursor);
92
91
  },
93
92
  setWhere,
94
93
  sorting,
95
94
  setSorting: setAcoSorting,
96
95
  setLimit,
97
- isListLoadingMore: logs.loading && !!variables.after,
98
- showingFilters,
99
- showFilters: ()=>{
100
- setShowingFilters(true);
101
- },
102
- hideFilters: ()=>{
103
- setShowingFilters(false);
104
- }
96
+ isListLoadingMore: loading && !!variables.after
105
97
  };
106
98
  };
107
99
  export { useAuditLogsList };
@@ -1 +1 @@
1
- {"version":3,"file":"hooks/useAuditLogsList.js","sources":["../../src/hooks/useAuditLogsList.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useQuery } from \"@apollo/react-hooks\";\nimport {\n type IListAuditLogsResponse,\n type IListAuditLogsVariablesPartial,\n type IListAuditLogsVariablesWhere,\n LIST_AUDIT_LOGS\n} from \"~/hooks/graphql.js\";\nimport type { IAuditLog, IAuditLogsMeta } from \"~/types.js\";\nimport type { OnDataTableSortingChange, DataTableSorting } from \"@webiny/admin-ui\";\nimport { transformRawAuditLog } from \"~/utils/transformRawAuditLog.js\";\nimport { listAuditLogsSchema } from \"~/hooks/schema.js\";\n\nexport interface UseAuditLogs {\n isListLoading: boolean;\n isListLoadingMore: boolean;\n records: IAuditLog[];\n meta: IAuditLogsMeta;\n listMoreRecords: () => void;\n setWhere: (where: Partial<IListAuditLogsVariablesWhere>) => void;\n setLimit: (limit: number) => void;\n after?: string;\n sorting: DataTableSorting;\n setSorting: OnDataTableSortingChange;\n showingFilters: boolean;\n showFilters: () => void;\n hideFilters: () => void;\n}\n\nexport const useAuditLogsList = (): UseAuditLogs => {\n const [variables, setVariables] = useState<IListAuditLogsVariablesPartial>({\n where: {},\n after: undefined,\n sort: \"DESC\",\n limit: 25\n });\n\n const [accumulatedRecords, setAccumulatedRecords] = useState<IAuditLog[]>([]);\n\n const setWhere = useCallback((where: Partial<IListAuditLogsVariablesWhere>) => {\n setVariables(prev => ({ ...prev, where, after: undefined }));\n setAccumulatedRecords([]);\n }, []);\n\n const setSort = useCallback((sort: \"ASC\" | \"DESC\") => {\n setVariables(prev => ({ ...prev, sort, after: undefined }));\n setAccumulatedRecords([]);\n }, []);\n\n const setAfter = useCallback((after?: string) => {\n setVariables(prev => ({ ...prev, after }));\n }, []);\n\n const setLimit = useCallback((limit: number) => {\n setVariables(prev => ({ ...prev, limit }));\n }, []);\n\n const [showingFilters, setShowingFilters] = useState(false);\n const [acoSorting, setAcoSorting] = useState<DataTableSorting>([]);\n\n useEffect(() => {\n const sort = acoSorting[0];\n if (!sort) {\n return;\n }\n setSort(sort.desc ? \"DESC\" : \"ASC\");\n }, [acoSorting]);\n\n const logs = useQuery<IListAuditLogsResponse, IListAuditLogsVariablesPartial>(LIST_AUDIT_LOGS, {\n variables,\n fetchPolicy: \"network-only\"\n });\n\n useEffect(() => {\n if (!logs.data?.auditLogs.listAuditLogs.data) {\n return;\n }\n const items = listAuditLogsSchema.safeParse(logs.data.auditLogs.listAuditLogs.data);\n if (!items.success) {\n console.error(items.error);\n return;\n }\n const newRecords = items.data.map(auditLog => transformRawAuditLog({ auditLog }));\n if (variables.after) {\n setAccumulatedRecords(prev => [...prev, ...newRecords]);\n } else {\n setAccumulatedRecords(newRecords);\n }\n }, [logs.data?.auditLogs]);\n\n const meta = useMemo(() => {\n if (!logs.data?.auditLogs.listAuditLogs.meta) {\n return {\n hasMoreItems: false,\n cursor: null\n };\n }\n return logs.data.auditLogs.listAuditLogs.meta;\n }, [logs.data?.auditLogs]);\n\n const sorting = useMemo((): DataTableSorting => {\n return [\n {\n id: \"createdOn\",\n desc: variables.sort === \"DESC\"\n }\n ];\n }, [variables.sort]);\n\n return {\n isListLoading: logs.loading,\n records: accumulatedRecords,\n meta,\n listMoreRecords: () => {\n setAfter(meta.cursor || undefined);\n },\n setWhere,\n sorting,\n setSorting: setAcoSorting,\n setLimit,\n isListLoadingMore: logs.loading && !!variables.after,\n showingFilters,\n showFilters: () => {\n setShowingFilters(true);\n },\n hideFilters: () => {\n setShowingFilters(false);\n }\n };\n};\n"],"names":["useAuditLogsList","variables","setVariables","useState","undefined","accumulatedRecords","setAccumulatedRecords","setWhere","useCallback","where","prev","setSort","sort","setAfter","after","setLimit","limit","showingFilters","setShowingFilters","acoSorting","setAcoSorting","useEffect","logs","useQuery","LIST_AUDIT_LOGS","items","listAuditLogsSchema","console","newRecords","auditLog","transformRawAuditLog","meta","useMemo","sorting"],"mappings":";;;;;AA6BO,MAAMA,mBAAmB;IAC5B,MAAM,CAACC,WAAWC,aAAa,GAAGC,SAAyC;QACvE,OAAO,CAAC;QACR,OAAOC;QACP,MAAM;QACN,OAAO;IACX;IAEA,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGH,SAAsB,EAAE;IAE5E,MAAMI,WAAWC,YAAY,CAACC;QAC1BP,aAAaQ,CAAAA,OAAS;gBAAE,GAAGA,IAAI;gBAAED;gBAAO,OAAOL;YAAU;QACzDE,sBAAsB,EAAE;IAC5B,GAAG,EAAE;IAEL,MAAMK,UAAUH,YAAY,CAACI;QACzBV,aAAaQ,CAAAA,OAAS;gBAAE,GAAGA,IAAI;gBAAEE;gBAAM,OAAOR;YAAU;QACxDE,sBAAsB,EAAE;IAC5B,GAAG,EAAE;IAEL,MAAMO,WAAWL,YAAY,CAACM;QAC1BZ,aAAaQ,CAAAA,OAAS;gBAAE,GAAGA,IAAI;gBAAEI;YAAM;IAC3C,GAAG,EAAE;IAEL,MAAMC,WAAWP,YAAY,CAACQ;QAC1Bd,aAAaQ,CAAAA,OAAS;gBAAE,GAAGA,IAAI;gBAAEM;YAAM;IAC3C,GAAG,EAAE;IAEL,MAAM,CAACC,gBAAgBC,kBAAkB,GAAGf,SAAS;IACrD,MAAM,CAACgB,YAAYC,cAAc,GAAGjB,SAA2B,EAAE;IAEjEkB,UAAU;QACN,MAAMT,OAAOO,UAAU,CAAC,EAAE;QAC1B,IAAI,CAACP,MACD;QAEJD,QAAQC,KAAK,IAAI,GAAG,SAAS;IACjC,GAAG;QAACO;KAAW;IAEf,MAAMG,OAAOC,SAAiEC,iBAAiB;QAC3FvB;QACA,aAAa;IACjB;IAEAoB,UAAU;QACN,IAAI,CAACC,KAAK,IAAI,EAAE,UAAU,cAAc,MACpC;QAEJ,MAAMG,QAAQC,oBAAoB,SAAS,CAACJ,KAAK,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI;QAClF,IAAI,CAACG,MAAM,OAAO,EAAE,YAChBE,QAAQ,KAAK,CAACF,MAAM,KAAK;QAG7B,MAAMG,aAAaH,MAAM,IAAI,CAAC,GAAG,CAACI,CAAAA,WAAYC,qBAAqB;gBAAED;YAAS;QAC1E5B,UAAU,KAAK,GACfK,sBAAsBI,CAAAA,OAAQ;mBAAIA;mBAASkB;aAAW,IAEtDtB,sBAAsBsB;IAE9B,GAAG;QAACN,KAAK,IAAI,EAAE;KAAU;IAEzB,MAAMS,OAAOC,QAAQ;QACjB,IAAI,CAACV,KAAK,IAAI,EAAE,UAAU,cAAc,MACpC,OAAO;YACH,cAAc;YACd,QAAQ;QACZ;QAEJ,OAAOA,KAAK,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI;IACjD,GAAG;QAACA,KAAK,IAAI,EAAE;KAAU;IAEzB,MAAMW,UAAUD,QAAQ,IACb;YACH;gBACI,IAAI;gBACJ,MAAM/B,AAAmB,WAAnBA,UAAU,IAAI;YACxB;SACH,EACF;QAACA,UAAU,IAAI;KAAC;IAEnB,OAAO;QACH,eAAeqB,KAAK,OAAO;QAC3B,SAASjB;QACT0B;QACA,iBAAiB;YACblB,SAASkB,KAAK,MAAM,IAAI3B;QAC5B;QACAG;QACA0B;QACA,YAAYb;QACZL;QACA,mBAAmBO,KAAK,OAAO,IAAI,CAAC,CAACrB,UAAU,KAAK;QACpDgB;QACA,aAAa;YACTC,kBAAkB;QACtB;QACA,aAAa;YACTA,kBAAkB;QACtB;IACJ;AACJ"}
1
+ {"version":3,"file":"hooks/useAuditLogsList.js","sources":["../../src/hooks/useAuditLogsList.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useFeature } from \"@webiny/app\";\nimport { ListAuditLogsFeature } from \"~/features/listAuditLogs/index.js\";\nimport type { IListAuditLogsVariablesWhere } from \"~/hooks/graphql.js\";\nimport type { IAuditLog, IAuditLogsMeta } from \"~/types.js\";\nimport type { OnDataTableSortingChange, DataTableSorting } from \"@webiny/admin-ui\";\n\nexport interface UseAuditLogs {\n isListLoading: boolean;\n isListLoadingMore: boolean;\n records: IAuditLog[];\n meta: IAuditLogsMeta;\n listMoreRecords: () => void;\n setWhere: (where: Partial<IListAuditLogsVariablesWhere>) => void;\n setLimit: (limit: number) => void;\n after?: string;\n sorting: DataTableSorting;\n setSorting: OnDataTableSortingChange;\n}\n\ninterface ListVariables {\n where: Record<string, unknown>;\n after: string | undefined;\n sort: \"ASC\" | \"DESC\";\n limit: number;\n}\n\nexport const useAuditLogsList = (): UseAuditLogs => {\n const { useCase } = useFeature(ListAuditLogsFeature);\n\n const [variables, setVariables] = useState<ListVariables>({\n where: {},\n after: undefined,\n sort: \"DESC\",\n limit: 25\n });\n\n const [accumulatedRecords, setAccumulatedRecords] = useState<IAuditLog[]>([]);\n const [loading, setLoading] = useState(true);\n const [meta, setMeta] = useState<IAuditLogsMeta>({\n hasMoreItems: false,\n cursor: null\n });\n\n const resetPagination = useCallback(() => {\n setAccumulatedRecords([]);\n setMeta({ hasMoreItems: false, cursor: null });\n }, []);\n\n const setWhere = useCallback((where: Partial<IListAuditLogsVariablesWhere>) => {\n setVariables(prev => ({ ...prev, where, after: undefined }));\n resetPagination();\n }, []);\n\n const setSort = useCallback((sort: \"ASC\" | \"DESC\") => {\n setVariables(prev => ({ ...prev, sort, after: undefined }));\n resetPagination();\n }, []);\n\n const setAfter = useCallback((after?: string) => {\n setVariables(prev => ({ ...prev, after }));\n }, []);\n\n const setLimit = useCallback((limit: number) => {\n setVariables(prev => ({ ...prev, limit }));\n }, []);\n\n const [acoSorting, setAcoSorting] = useState<DataTableSorting>([]);\n\n useEffect(() => {\n const sort = acoSorting[0];\n if (!sort) {\n return;\n }\n setSort(sort.desc ? \"DESC\" : \"ASC\");\n }, [acoSorting]);\n\n const requestIdRef = useRef(0);\n\n useEffect(() => {\n setLoading(true);\n const requestId = ++requestIdRef.current;\n\n useCase.execute(variables).then(result => {\n if (requestId !== requestIdRef.current) {\n return;\n }\n\n if (variables.after) {\n setAccumulatedRecords(prev => [...prev, ...result.records]);\n } else {\n setAccumulatedRecords(result.records);\n }\n\n setMeta(result.meta);\n setLoading(false);\n });\n }, [variables]);\n\n const sorting = useMemo((): DataTableSorting => {\n return [\n {\n id: \"createdOn\",\n desc: variables.sort === \"DESC\"\n }\n ];\n }, [variables.sort]);\n\n return {\n isListLoading: loading,\n records: accumulatedRecords,\n meta,\n listMoreRecords: () => {\n if (!loading && meta.cursor) {\n setAfter(meta.cursor);\n }\n },\n setWhere,\n sorting,\n setSorting: setAcoSorting,\n setLimit,\n isListLoadingMore: loading && !!variables.after\n };\n};\n"],"names":["useAuditLogsList","useCase","useFeature","ListAuditLogsFeature","variables","setVariables","useState","undefined","accumulatedRecords","setAccumulatedRecords","loading","setLoading","meta","setMeta","resetPagination","useCallback","setWhere","where","prev","setSort","sort","setAfter","after","setLimit","limit","acoSorting","setAcoSorting","useEffect","requestIdRef","useRef","requestId","result","sorting","useMemo"],"mappings":";;;AA2BO,MAAMA,mBAAmB;IAC5B,MAAM,EAAEC,OAAO,EAAE,GAAGC,WAAWC;IAE/B,MAAM,CAACC,WAAWC,aAAa,GAAGC,SAAwB;QACtD,OAAO,CAAC;QACR,OAAOC;QACP,MAAM;QACN,OAAO;IACX;IAEA,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGH,SAAsB,EAAE;IAC5E,MAAM,CAACI,SAASC,WAAW,GAAGL,SAAS;IACvC,MAAM,CAACM,MAAMC,QAAQ,GAAGP,SAAyB;QAC7C,cAAc;QACd,QAAQ;IACZ;IAEA,MAAMQ,kBAAkBC,YAAY;QAChCN,sBAAsB,EAAE;QACxBI,QAAQ;YAAE,cAAc;YAAO,QAAQ;QAAK;IAChD,GAAG,EAAE;IAEL,MAAMG,WAAWD,YAAY,CAACE;QAC1BZ,aAAaa,CAAAA,OAAS;gBAAE,GAAGA,IAAI;gBAAED;gBAAO,OAAOV;YAAU;QACzDO;IACJ,GAAG,EAAE;IAEL,MAAMK,UAAUJ,YAAY,CAACK;QACzBf,aAAaa,CAAAA,OAAS;gBAAE,GAAGA,IAAI;gBAAEE;gBAAM,OAAOb;YAAU;QACxDO;IACJ,GAAG,EAAE;IAEL,MAAMO,WAAWN,YAAY,CAACO;QAC1BjB,aAAaa,CAAAA,OAAS;gBAAE,GAAGA,IAAI;gBAAEI;YAAM;IAC3C,GAAG,EAAE;IAEL,MAAMC,WAAWR,YAAY,CAACS;QAC1BnB,aAAaa,CAAAA,OAAS;gBAAE,GAAGA,IAAI;gBAAEM;YAAM;IAC3C,GAAG,EAAE;IAEL,MAAM,CAACC,YAAYC,cAAc,GAAGpB,SAA2B,EAAE;IAEjEqB,UAAU;QACN,MAAMP,OAAOK,UAAU,CAAC,EAAE;QAC1B,IAAI,CAACL,MACD;QAEJD,QAAQC,KAAK,IAAI,GAAG,SAAS;IACjC,GAAG;QAACK;KAAW;IAEf,MAAMG,eAAeC,OAAO;IAE5BF,UAAU;QACNhB,WAAW;QACX,MAAMmB,YAAY,EAAEF,aAAa,OAAO;QAExC3B,QAAQ,OAAO,CAACG,WAAW,IAAI,CAAC2B,CAAAA;YAC5B,IAAID,cAAcF,aAAa,OAAO,EAClC;YAGAxB,UAAU,KAAK,GACfK,sBAAsBS,CAAAA,OAAQ;uBAAIA;uBAASa,OAAO,OAAO;iBAAC,IAE1DtB,sBAAsBsB,OAAO,OAAO;YAGxClB,QAAQkB,OAAO,IAAI;YACnBpB,WAAW;QACf;IACJ,GAAG;QAACP;KAAU;IAEd,MAAM4B,UAAUC,QAAQ,IACb;YACH;gBACI,IAAI;gBACJ,MAAM7B,AAAmB,WAAnBA,UAAU,IAAI;YACxB;SACH,EACF;QAACA,UAAU,IAAI;KAAC;IAEnB,OAAO;QACH,eAAeM;QACf,SAASF;QACTI;QACA,iBAAiB;YACb,IAAI,CAACF,WAAWE,KAAK,MAAM,EACvBS,SAAST,KAAK,MAAM;QAE5B;QACAI;QACAgB;QACA,YAAYN;QACZH;QACA,mBAAmBb,WAAW,CAAC,CAACN,UAAU,KAAK;IACnD;AACJ"}
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import react from "react";
2
- import { AdminConfig, AdminLayout, HasPermission, RegisterFeature, useRouter, useWcp } from "@webiny/app-admin";
2
+ import { AdminConfig, AdminLayout, HasPermission, RegisterFeature, useFeatureFlags, useRouter } from "@webiny/app-admin";
3
3
  import { ReactComponent } from "@webiny/icons/manage_search.svg";
4
4
  import { LogsModule } from "./views/Logs/LogsModule.js";
5
5
  import { SecurityPermission } from "./SecurityPermission.js";
@@ -7,14 +7,21 @@ import { LogsView } from "./views/Logs/LogsView.js";
7
7
  import { AuditLogsListWithConfig } from "./config/list/index.js";
8
8
  import { Routes } from "./routes.js";
9
9
  import { AlPermissionsFeature } from "./features/permissions/feature.js";
10
+ import { ListAuditLogsFeature } from "./features/listAuditLogs/index.js";
11
+ import { AuditLogDetailsPresenterFeature } from "./views/Logs/Preview/feature.js";
12
+ import { AiPromptPreviewTabs } from "./views/Logs/Preview/tabs/AiPromptTabs.js";
10
13
  const { Menu: Menu, Route: Route } = AdminConfig;
11
14
  const AuditLogs = ()=>{
12
- const wcp = useWcp();
15
+ const featureFlags = useFeatureFlags();
13
16
  const router = useRouter();
14
- if (!wcp.canUseAuditLogs()) return null;
17
+ if (!featureFlags.isEnabled("auditLogs")) return null;
15
18
  return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(RegisterFeature, {
16
19
  feature: AlPermissionsFeature
17
- }), /*#__PURE__*/ react.createElement(LogsModule, null), /*#__PURE__*/ react.createElement(SecurityPermission, null), /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(HasPermission, {
20
+ }), /*#__PURE__*/ react.createElement(RegisterFeature, {
21
+ feature: ListAuditLogsFeature
22
+ }), /*#__PURE__*/ react.createElement(RegisterFeature, {
23
+ feature: AuditLogDetailsPresenterFeature
24
+ }), /*#__PURE__*/ react.createElement(LogsModule, null), /*#__PURE__*/ react.createElement(SecurityPermission, null), /*#__PURE__*/ react.createElement(AiPromptPreviewTabs, null), /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(HasPermission, {
18
25
  any: [
19
26
  "al.*"
20
27
  ]
@@ -33,7 +40,10 @@ const AuditLogs = ()=>{
33
40
  route: Routes.AuditLogsList,
34
41
  element: /*#__PURE__*/ react.createElement(AdminLayout, {
35
42
  title: "Audit Logs - Logs"
36
- }, /*#__PURE__*/ react.createElement(AuditLogsListWithConfig, null, /*#__PURE__*/ react.createElement(LogsView, null)))
43
+ }, /*#__PURE__*/ react.createElement(AdminConfig.Breadcrumb, {
44
+ name: "auditLogs",
45
+ label: "Audit Logs"
46
+ }), /*#__PURE__*/ react.createElement(AuditLogsListWithConfig, null, /*#__PURE__*/ react.createElement(LogsView, null)))
37
47
  }))));
38
48
  };
39
49
  export { AuditLogs };
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { ReactComponent as Icon } from \"@webiny/icons/manage_search.svg\";\nimport { AdminConfig, AdminLayout, RegisterFeature, useWcp } from \"@webiny/app-admin\";\nimport { HasPermission } from \"@webiny/app-admin\";\nimport { LogsModule } from \"~/views/Logs/LogsModule.js\";\nimport { SecurityPermission } from \"~/SecurityPermission.js\";\nimport { LogsView } from \"~/views/Logs/LogsView.js\";\nimport { AuditLogsListWithConfig } from \"~/config/list/index.js\";\nimport { Routes } from \"~/routes.js\";\nimport { AlPermissionsFeature } from \"~/features/permissions/feature.js\";\n\nconst { Menu, Route } = AdminConfig;\n\nexport const AuditLogs = () => {\n const wcp = useWcp();\n const router = useRouter();\n\n if (!wcp.canUseAuditLogs()) {\n return null;\n }\n\n return (\n <>\n <RegisterFeature feature={AlPermissionsFeature} />\n <LogsModule />\n <SecurityPermission />\n <AdminConfig>\n <HasPermission any={[\"al.*\"]}>\n <Menu\n name=\"auditLogs\"\n pinnable\n element={\n <Menu.Link\n text={\"Audit Logs\"}\n icon={<Menu.Link.Icon element={<Icon />} label={\"Audit Logs\"} />}\n to={router.getLink(Routes.AuditLogsList)}\n />\n }\n />\n <Route\n route={Routes.AuditLogsList}\n element={\n <AdminLayout title={\"Audit Logs - Logs\"}>\n <AuditLogsListWithConfig>\n <LogsView />\n </AuditLogsListWithConfig>\n </AdminLayout>\n }\n />\n </HasPermission>\n </AdminConfig>\n </>\n );\n};\n"],"names":["Menu","Route","AdminConfig","AuditLogs","wcp","useWcp","router","useRouter","RegisterFeature","AlPermissionsFeature","LogsModule","SecurityPermission","HasPermission","Icon","Routes","AdminLayout","AuditLogsListWithConfig","LogsView"],"mappings":";;;;;;;;;AAYA,MAAM,EAAEA,MAAAA,IAAI,EAAEC,OAAAA,KAAK,EAAE,GAAGC;AAEjB,MAAMC,YAAY;IACrB,MAAMC,MAAMC;IACZ,MAAMC,SAASC;IAEf,IAAI,CAACH,IAAI,eAAe,IACpB,OAAO;IAGX,OAAO,WAAP,GACI,wDACI,oBAACI,iBAAeA;QAAC,SAASC;sBAC1B,oBAACC,YAAUA,OAAAA,WAAAA,GACX,oBAACC,oBAAkBA,OAAAA,WAAAA,GACnB,oBAACT,aAAWA,MAAAA,WAAAA,GACR,oBAACU,eAAaA;QAAC,KAAK;YAAC;SAAO;qBACxB,oBAACZ,MAAIA;QACD,MAAK;QACL;QACA,uBACI,oBAACA,KAAK,IAAI;YACN,MAAM;YACN,oBAAM,oBAACA,KAAK,IAAI,CAAC,IAAI;gBAAC,uBAAS,oBAACa,gBAAIA;gBAAK,OAAO;;YAChD,IAAIP,OAAO,OAAO,CAACQ,OAAO,aAAa;;sBAInD,oBAACb,OAAKA;QACF,OAAOa,OAAO,aAAa;QAC3B,uBACI,oBAACC,aAAWA;YAAC,OAAO;yBAChB,oBAACC,yBAAuBA,MAAAA,WAAAA,GACpB,oBAACC,UAAQA;;AAS7C"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { ReactComponent as Icon } from \"@webiny/icons/manage_search.svg\";\nimport { AdminConfig, AdminLayout, RegisterFeature, useFeatureFlags } from \"@webiny/app-admin\";\nimport { HasPermission } from \"@webiny/app-admin\";\nimport { LogsModule } from \"~/views/Logs/LogsModule.js\";\nimport { SecurityPermission } from \"~/SecurityPermission.js\";\nimport { LogsView } from \"~/views/Logs/LogsView.js\";\nimport { AuditLogsListWithConfig } from \"~/config/list/index.js\";\nimport { Routes } from \"~/routes.js\";\nimport { AlPermissionsFeature } from \"~/features/permissions/feature.js\";\nimport { ListAuditLogsFeature } from \"~/features/listAuditLogs/index.js\";\nimport { AuditLogDetailsPresenterFeature } from \"~/views/Logs/Preview/feature.js\";\nimport { AiPromptPreviewTabs } from \"~/views/Logs/Preview/tabs/AiPromptTabs.js\";\n\nconst { Menu, Route } = AdminConfig;\n\nexport const AuditLogs = () => {\n const featureFlags = useFeatureFlags();\n const router = useRouter();\n\n if (!featureFlags.isEnabled(\"auditLogs\")) {\n return null;\n }\n\n return (\n <>\n <RegisterFeature feature={AlPermissionsFeature} />\n <RegisterFeature feature={ListAuditLogsFeature} />\n <RegisterFeature feature={AuditLogDetailsPresenterFeature} />\n <LogsModule />\n <SecurityPermission />\n <AiPromptPreviewTabs />\n <AdminConfig>\n <HasPermission any={[\"al.*\"]}>\n <Menu\n name=\"auditLogs\"\n pinnable\n element={\n <Menu.Link\n text={\"Audit Logs\"}\n icon={<Menu.Link.Icon element={<Icon />} label={\"Audit Logs\"} />}\n to={router.getLink(Routes.AuditLogsList)}\n />\n }\n />\n <Route\n route={Routes.AuditLogsList}\n element={\n <AdminLayout title={\"Audit Logs - Logs\"}>\n <AdminConfig.Breadcrumb name={\"auditLogs\"} label={\"Audit Logs\"} />\n <AuditLogsListWithConfig>\n <LogsView />\n </AuditLogsListWithConfig>\n </AdminLayout>\n }\n />\n </HasPermission>\n </AdminConfig>\n </>\n );\n};\n"],"names":["Menu","Route","AdminConfig","AuditLogs","featureFlags","useFeatureFlags","router","useRouter","RegisterFeature","AlPermissionsFeature","ListAuditLogsFeature","AuditLogDetailsPresenterFeature","LogsModule","SecurityPermission","AiPromptPreviewTabs","HasPermission","Icon","Routes","AdminLayout","AuditLogsListWithConfig","LogsView"],"mappings":";;;;;;;;;;;;AAeA,MAAM,EAAEA,MAAAA,IAAI,EAAEC,OAAAA,KAAK,EAAE,GAAGC;AAEjB,MAAMC,YAAY;IACrB,MAAMC,eAAeC;IACrB,MAAMC,SAASC;IAEf,IAAI,CAACH,aAAa,SAAS,CAAC,cACxB,OAAO;IAGX,OAAO,WAAP,GACI,wDACI,oBAACI,iBAAeA;QAAC,SAASC;sBAC1B,oBAACD,iBAAeA;QAAC,SAASE;sBAC1B,oBAACF,iBAAeA;QAAC,SAASG;sBAC1B,oBAACC,YAAUA,OAAAA,WAAAA,GACX,oBAACC,oBAAkBA,OAAAA,WAAAA,GACnB,oBAACC,qBAAmBA,OAAAA,WAAAA,GACpB,oBAACZ,aAAWA,MAAAA,WAAAA,GACR,oBAACa,eAAaA;QAAC,KAAK;YAAC;SAAO;qBACxB,oBAACf,MAAIA;QACD,MAAK;QACL;QACA,uBACI,oBAACA,KAAK,IAAI;YACN,MAAM;YACN,oBAAM,oBAACA,KAAK,IAAI,CAAC,IAAI;gBAAC,uBAAS,oBAACgB,gBAAIA;gBAAK,OAAO;;YAChD,IAAIV,OAAO,OAAO,CAACW,OAAO,aAAa;;sBAInD,oBAAChB,OAAKA;QACF,OAAOgB,OAAO,aAAa;QAC3B,uBACI,oBAACC,aAAWA;YAAC,OAAO;yBAChB,oBAAChB,YAAY,UAAU;YAAC,MAAM;YAAa,OAAO;0BAClD,oBAACiB,yBAAuBA,MAAAA,WAAAA,GACpB,oBAACC,UAAQA;;AAS7C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-audit-logs",
3
- "version": "6.4.11",
3
+ "version": "6.6.0-alpha.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -13,21 +13,18 @@
13
13
  "description": "",
14
14
  "license": "MIT",
15
15
  "dependencies": {
16
- "@apollo/react-hooks": "3.1.5",
17
- "@emotion/css": "11.13.5",
18
- "@emotion/react": "11.14.0",
19
- "@emotion/styled": "11.14.1",
20
- "@webiny/admin-ui": "6.4.11",
21
- "@webiny/app": "6.4.11",
22
- "@webiny/app-admin": "6.4.11",
23
- "@webiny/common-audit-logs": "6.4.11",
24
- "@webiny/form": "6.4.11",
25
- "@webiny/icons": "6.4.11",
26
- "@webiny/react-composition": "6.4.11",
27
- "@webiny/react-properties": "6.4.11",
16
+ "@webiny/admin-ui": "6.6.0-alpha.1",
17
+ "@webiny/app": "6.6.0-alpha.1",
18
+ "@webiny/app-admin": "6.6.0-alpha.1",
19
+ "@webiny/common-audit-logs": "6.6.0-alpha.1",
20
+ "@webiny/feature": "6.6.0-alpha.1",
21
+ "@webiny/form": "6.6.0-alpha.1",
22
+ "@webiny/icons": "6.6.0-alpha.1",
23
+ "@webiny/react-composition": "6.6.0-alpha.1",
24
+ "@webiny/react-properties": "6.6.0-alpha.1",
28
25
  "date-fns": "4.4.0",
29
- "graphql-tag": "2.12.7",
30
26
  "lodash": "4.18.1",
27
+ "mobx": "7.0.3",
31
28
  "zod": "4.4.3"
32
29
  },
33
30
  "peerDependencies": {
@@ -35,10 +32,10 @@
35
32
  },
36
33
  "devDependencies": {
37
34
  "@types/react": "18.3.31",
38
- "@webiny/build-tools": "6.4.11",
39
- "execa": "5.1.1",
35
+ "@webiny/build-tools": "6.6.0-alpha.1",
36
+ "execa": "10.0.1",
40
37
  "rimraf": "6.1.3",
41
- "typescript": "6.0.3"
38
+ "typescript": "7.0.2"
42
39
  },
43
40
  "publishConfig": {
44
41
  "access": "public"
package/types.d.ts CHANGED
@@ -22,7 +22,7 @@ export interface IAuditLogRaw {
22
22
  createdBy: IAuditLogCreatedByRaw;
23
23
  createdOn: Date;
24
24
  app: string;
25
- action: ActionType;
25
+ action: string;
26
26
  message: string;
27
27
  entity: string;
28
28
  entityId: string;
@@ -36,7 +36,7 @@ export interface IAuditLogEntity {
36
36
  link?: string;
37
37
  }
38
38
  export interface IAuditLogAction {
39
- value: ActionType;
39
+ value: string;
40
40
  label: string;
41
41
  }
42
42
  export interface IAuditLog extends Omit<IAuditLogRaw, "entity" | "action" | "createdBy"> {
@@ -1,2 +1,2 @@
1
1
  import React from "react";
2
- export declare const FilterByAction: () => React.JSX.Element | null;
2
+ export declare const FilterByAction: () => React.JSX.Element;
@@ -31,12 +31,14 @@ const FilterByAction = ()=>{
31
31
  }, [
32
32
  data
33
33
  ]);
34
- if (!data.app || !data.entity) return null;
34
+ const disabled = !data.app || !data.entity;
35
35
  return /*#__PURE__*/ react.createElement(Select, {
36
36
  ...bind,
37
+ label: "Action",
37
38
  size: "md",
38
- placeholder: "Filter by Action",
39
- options: options
39
+ placeholder: "All actions",
40
+ options: disabled ? [] : options,
41
+ disabled: disabled
40
42
  });
41
43
  };
42
44
  export { FilterByAction };
@@ -1 +1 @@
1
- {"version":3,"file":"views/Logs/Filters/FilterByAction.js","sources":["../../../../src/views/Logs/Filters/FilterByAction.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 \"~/views/Logs/Filters/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 FilterByAction = () => {\n const { data } = useForm<IFilterFormData>();\n const bind = useBind({\n name: \"action\",\n beforeChange(value, cb) {\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 const actions = entities.find(entity => entity.type === data.entity)?.actions || [];\n\n return [\n { label: \"All\", value: \"all\" },\n ...actions.map(entity => ({ label: entity.displayName, value: entity.type }))\n ];\n }, [data]);\n\n if (!data.app || !data.entity) {\n return null;\n }\n\n return <Select {...bind} size={\"md\"} placeholder={\"Filter by Action\"} options={options} />;\n};\n"],"names":["getValidFilterValue","value","FilterByAction","data","useForm","bind","useBind","cb","options","useMemo","entities","auditLogsApps","app","actions","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,EAAE,GAAGC;IACjB,MAAMC,OAAOC,QAAQ;QACjB,MAAM;QACN,cAAaL,KAAK,EAAEM,EAAE;YAClBA,GAAGP,oBAAoBC;QAC3B;IACJ;IAEA,MAAMO,UAAUC,QAAQ;QACpB,IAAI,CAACN,KAAK,GAAG,EACT,OAAO,EAAE;QAGb,MAAMO,WAAWC,KAAc,IAAI,CAACC,CAAAA,MAAOA,IAAI,GAAG,KAAKT,KAAK,GAAG,GAAG,YAAY,EAAE;QAChF,MAAMU,UAAUH,SAAS,IAAI,CAACI,CAAAA,SAAUA,OAAO,IAAI,KAAKX,KAAK,MAAM,GAAG,WAAW,EAAE;QAEnF,OAAO;YACH;gBAAE,OAAO;gBAAO,OAAO;YAAM;eAC1BU,QAAQ,GAAG,CAACC,CAAAA,SAAW;oBAAE,OAAOA,OAAO,WAAW;oBAAE,OAAOA,OAAO,IAAI;gBAAC;SAC7E;IACL,GAAG;QAACX;KAAK;IAET,IAAI,CAACA,KAAK,GAAG,IAAI,CAACA,KAAK,MAAM,EACzB,OAAO;IAGX,OAAO,WAAP,GAAO,oBAACY,QAAMA;QAAE,GAAGV,IAAI;QAAE,MAAM;QAAM,aAAa;QAAoB,SAASG;;AACnF"}
1
+ {"version":3,"file":"views/Logs/Filters/FilterByAction.js","sources":["../../../../src/views/Logs/Filters/FilterByAction.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 \"~/views/Logs/Filters/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 FilterByAction = () => {\n const { data } = useForm<IFilterFormData>();\n const bind = useBind({\n name: \"action\",\n beforeChange(value, cb) {\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 const actions = entities.find(entity => entity.type === data.entity)?.actions || [];\n\n return [\n { label: \"All\", value: \"all\" },\n ...actions.map(entity => ({ label: entity.displayName, value: entity.type }))\n ];\n }, [data]);\n\n const disabled = !data.app || !data.entity;\n\n return (\n <Select\n {...bind}\n label={\"Action\"}\n size={\"md\"}\n placeholder={\"All actions\"}\n options={disabled ? [] : options}\n disabled={disabled}\n />\n );\n};\n"],"names":["getValidFilterValue","value","FilterByAction","data","useForm","bind","useBind","cb","options","useMemo","entities","auditLogsApps","app","actions","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,EAAE,GAAGC;IACjB,MAAMC,OAAOC,QAAQ;QACjB,MAAM;QACN,cAAaL,KAAK,EAAEM,EAAE;YAClBA,GAAGP,oBAAoBC;QAC3B;IACJ;IAEA,MAAMO,UAAUC,QAAQ;QACpB,IAAI,CAACN,KAAK,GAAG,EACT,OAAO,EAAE;QAGb,MAAMO,WAAWC,KAAc,IAAI,CAACC,CAAAA,MAAOA,IAAI,GAAG,KAAKT,KAAK,GAAG,GAAG,YAAY,EAAE;QAChF,MAAMU,UAAUH,SAAS,IAAI,CAACI,CAAAA,SAAUA,OAAO,IAAI,KAAKX,KAAK,MAAM,GAAG,WAAW,EAAE;QAEnF,OAAO;YACH;gBAAE,OAAO;gBAAO,OAAO;YAAM;eAC1BU,QAAQ,GAAG,CAACC,CAAAA,SAAW;oBAAE,OAAOA,OAAO,WAAW;oBAAE,OAAOA,OAAO,IAAI;gBAAC;SAC7E;IACL,GAAG;QAACX;KAAK;IAET,MAAMY,WAAW,CAACZ,KAAK,GAAG,IAAI,CAACA,KAAK,MAAM;IAE1C,OAAO,WAAP,GACI,oBAACa,QAAMA;QACF,GAAGX,IAAI;QACR,OAAO;QACP,MAAM;QACN,aAAa;QACb,SAASU,WAAW,EAAE,GAAGP;QACzB,UAAUO;;AAGtB"}
@@ -18,8 +18,9 @@ const FilterByApp = ()=>{
18
18
  });
19
19
  return /*#__PURE__*/ react.createElement(Select, {
20
20
  ...bind,
21
+ label: "Application",
21
22
  size: "md",
22
- placeholder: "Filter by App",
23
+ placeholder: "All applications",
23
24
  options: [
24
25
  {
25
26
  label: "All",
@@ -1 +1 @@
1
- {"version":3,"file":"views/Logs/Filters/FilterByApp.js","sources":["../../../../src/views/Logs/Filters/FilterByApp.tsx"],"sourcesContent":["import React 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 \"~/views/Logs/Filters/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 FilterByApp = () => {\n const { setValue } = useForm<IFilterFormData>();\n const bind = useBind({\n name: \"app\",\n beforeChange(value, cb) {\n setValue(\"entity\", undefined);\n setValue(\"action\", undefined);\n cb(getValidFilterValue(value));\n }\n });\n\n return (\n <Select\n {...bind}\n size={\"md\"}\n placeholder={\"Filter by App\"}\n options={[\n { label: \"All\", value: \"all\" },\n ...auditLogsApps.map(app => ({ label: app.displayName, value: app.app }))\n ]}\n />\n );\n};\n"],"names":["getValidFilterValue","value","FilterByApp","setValue","useForm","bind","useBind","cb","undefined","Select","auditLogsApps","app"],"mappings":";;;;AAMA,MAAMA,sBAAsB,CAACC;IACzB,IAAIA,AAAU,UAAVA,SAAmBA,AAAU,OAAVA,OACnB;IAEJ,OAAOA;AACX;AAEO,MAAMC,cAAc;IACvB,MAAM,EAAEC,QAAQ,EAAE,GAAGC;IACrB,MAAMC,OAAOC,QAAQ;QACjB,MAAM;QACN,cAAaL,KAAK,EAAEM,EAAE;YAClBJ,SAAS,UAAUK;YACnBL,SAAS,UAAUK;YACnBD,GAAGP,oBAAoBC;QAC3B;IACJ;IAEA,OAAO,WAAP,GACI,oBAACQ,QAAMA;QACF,GAAGJ,IAAI;QACR,MAAM;QACN,aAAa;QACb,SAAS;YACL;gBAAE,OAAO;gBAAO,OAAO;YAAM;eAC1BK,KAAAA,GAAiB,CAACC,CAAAA,MAAQ;oBAAE,OAAOA,IAAI,WAAW;oBAAE,OAAOA,IAAI,GAAG;gBAAC;SACzE;;AAGb"}
1
+ {"version":3,"file":"views/Logs/Filters/FilterByApp.js","sources":["../../../../src/views/Logs/Filters/FilterByApp.tsx"],"sourcesContent":["import React 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 \"~/views/Logs/Filters/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 FilterByApp = () => {\n const { setValue } = useForm<IFilterFormData>();\n const bind = useBind({\n name: \"app\",\n beforeChange(value, cb) {\n setValue(\"entity\", undefined);\n setValue(\"action\", undefined);\n cb(getValidFilterValue(value));\n }\n });\n\n return (\n <Select\n {...bind}\n label={\"Application\"}\n size={\"md\"}\n placeholder={\"All applications\"}\n options={[\n { label: \"All\", value: \"all\" },\n ...auditLogsApps.map(app => ({ label: app.displayName, value: app.app }))\n ]}\n />\n );\n};\n"],"names":["getValidFilterValue","value","FilterByApp","setValue","useForm","bind","useBind","cb","undefined","Select","auditLogsApps","app"],"mappings":";;;;AAMA,MAAMA,sBAAsB,CAACC;IACzB,IAAIA,AAAU,UAAVA,SAAmBA,AAAU,OAAVA,OACnB;IAEJ,OAAOA;AACX;AAEO,MAAMC,cAAc;IACvB,MAAM,EAAEC,QAAQ,EAAE,GAAGC;IACrB,MAAMC,OAAOC,QAAQ;QACjB,MAAM;QACN,cAAaL,KAAK,EAAEM,EAAE;YAClBJ,SAAS,UAAUK;YACnBL,SAAS,UAAUK;YACnBD,GAAGP,oBAAoBC;QAC3B;IACJ;IAEA,OAAO,WAAP,GACI,oBAACQ,QAAMA;QACF,GAAGJ,IAAI;QACR,OAAO;QACP,MAAM;QACN,aAAa;QACb,SAAS;YACL;gBAAE,OAAO;gBAAO,OAAO;YAAM;eAC1BK,KAAAA,GAAiB,CAACC,CAAAA,MAAQ;oBAAE,OAAOA,IAAI,WAAW;oBAAE,OAAOA,IAAI,GAAG;gBAAC;SACzE;;AAGb"}
@@ -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 FilterByCreatedBy = ()=>{
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: "createdBy",
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,14 +34,14 @@ const FilterByCreatedBy = ()=>{
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,
42
+ label: "Initiator",
35
43
  size: "md",
36
- placeholder: "Filter by Initiator",
44
+ placeholder: "Anyone",
37
45
  options: options
38
46
  });
39
47
  };
@@ -1 +1 @@
1
- {"version":3,"file":"views/Logs/Filters/FilterByCreatedBy.js","sources":["../../../../src/views/Logs/Filters/FilterByCreatedBy.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 FilterByCreatedBy = () => {\n const { data: listUsers } = useQuery(LIST_USERS);\n const bind = useBind({\n name: \"createdBy\",\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","FilterByCreatedBy","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/FilterByCreatedBy.js","sources":["../../../../src/views/Logs/Filters/FilterByCreatedBy.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 FilterByCreatedBy = () => {\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: \"createdBy\",\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 (\n <Select\n {...bind}\n label={\"Initiator\"}\n size={\"md\"}\n placeholder={\"Anyone\"}\n options={options}\n />\n );\n};\n"],"names":["getValidFilterValue","value","FilterByCreatedBy","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,GACI,oBAACY,QAAMA;QACF,GAAGN,IAAI;QACR,OAAO;QACP,MAAM;QACN,aAAa;QACb,SAASG;;AAGrB"}