@plutonhq/core-frontend 0.1.6 → 0.1.7

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 (64) hide show
  1. package/dist-lib/components/Plan/Backups/Backups.module.scss.js +44 -42
  2. package/dist-lib/components/Plan/Backups/Backups.module.scss.js.map +1 -1
  3. package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.d.ts +3 -2
  4. package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.d.ts.map +1 -1
  5. package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.js +29 -22
  6. package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.js.map +1 -1
  7. package/dist-lib/components/Plan/PlanProgress/PlanProgress.d.ts +2 -1
  8. package/dist-lib/components/Plan/PlanProgress/PlanProgress.d.ts.map +1 -1
  9. package/dist-lib/components/Plan/PlanProgress/PlanProgress.js +22 -18
  10. package/dist-lib/components/Plan/PlanProgress/PlanProgress.js.map +1 -1
  11. package/dist-lib/components/Plan/Restores/Restores.js +5 -5
  12. package/dist-lib/components/Plan/Restores/Restores.js.map +1 -1
  13. package/dist-lib/components/Restore/RestoreFileSelector/RestoreFileSelector.js +73 -73
  14. package/dist-lib/components/Restore/RestoreFileSelector/RestoreFileSelector.js.map +1 -1
  15. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.d.ts.map +1 -1
  16. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js +50 -50
  17. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js.map +1 -1
  18. package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js +8 -8
  19. package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js.map +1 -1
  20. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js +34 -36
  21. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js.map +1 -1
  22. package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.d.ts +2 -1
  23. package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.d.ts.map +1 -1
  24. package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.js +62 -60
  25. package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.js.map +1 -1
  26. package/dist-lib/components/common/LogViewer/LogViewer.d.ts.map +1 -1
  27. package/dist-lib/components/common/LogViewer/LogViewer.js +51 -47
  28. package/dist-lib/components/common/LogViewer/LogViewer.js.map +1 -1
  29. package/dist-lib/components/common/LogViewer/LogViewer.module.scss.js +24 -24
  30. package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
  31. package/dist-lib/hooks/usePlanSingleActions.js +49 -37
  32. package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
  33. package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
  34. package/dist-lib/routes/PlanSingle/PlanSingle.js +68 -67
  35. package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
  36. package/dist-lib/services/backups.d.ts.map +1 -1
  37. package/dist-lib/services/backups.js +35 -34
  38. package/dist-lib/services/backups.js.map +1 -1
  39. package/dist-lib/services/plans.d.ts +5 -2
  40. package/dist-lib/services/plans.d.ts.map +1 -1
  41. package/dist-lib/services/plans.js +45 -43
  42. package/dist-lib/services/plans.js.map +1 -1
  43. package/dist-lib/services/restores.d.ts.map +1 -1
  44. package/dist-lib/services/restores.js +56 -55
  45. package/dist-lib/services/restores.js.map +1 -1
  46. package/dist-lib/services.js +19 -19
  47. package/dist-lib/styles/core-frontend.css +1 -1
  48. package/package.json +1 -1
  49. package/src/components/Plan/Backups/Backups.module.scss +2 -1
  50. package/src/components/Plan/PlanPendingBackup/PlanPendingBackup.tsx +27 -18
  51. package/src/components/Plan/PlanProgress/PlanProgress.tsx +13 -2
  52. package/src/components/Plan/Restores/Restores.tsx +1 -1
  53. package/src/components/Restore/RestoreFileSelector/RestoreFileSelector.tsx +4 -4
  54. package/src/components/Restore/RestoreWizard/RestoreConfirmStep.tsx +26 -19
  55. package/src/components/Restore/RestoreWizard/RestorePreviewStep.tsx +1 -1
  56. package/src/components/Restore/RestoreWizard/RestoreWizard.module.scss +2 -2
  57. package/src/components/Restore/RestoredFileBrowser/RestoredFileBrowser.tsx +18 -14
  58. package/src/components/common/LogViewer/LogViewer.module.scss +1 -1
  59. package/src/components/common/LogViewer/LogViewer.tsx +18 -10
  60. package/src/hooks/usePlanSingleActions.tsx +21 -8
  61. package/src/routes/PlanSingle/PlanSingle.tsx +2 -0
  62. package/src/services/backups.ts +12 -4
  63. package/src/services/plans.ts +4 -3
  64. package/src/services/restores.ts +12 -4
@@ -1,68 +1,70 @@
1
1
  import { jsxs as l, jsx as a } from "react/jsx-runtime";
2
- import { useState as b, useMemo as E } from "react";
3
- import { FixedSizeList as W } from "react-window";
4
- import x from "../../common/Icon/Icon.js";
2
+ import { useState as w, useMemo as x, useEffect as K } from "react";
3
+ import { FixedSizeList as q } from "react-window";
4
+ import C from "../../common/Icon/Icon.js";
5
5
  import s from "./RestoredFileBrowser.module.scss.js";
6
- import { formatNumberToK as K, formatBytes as C, isMobile as q } from "../../../utils/helpers.js";
7
- import { getPathSeparator as y, splitPath as u, getParentPath as D, normalizePath as g } from "../../../utils/restore.js";
8
- import J from "../../common/FileIcon/FileIcon.js";
9
- const Q = q(), X = Q ? 65 : 45, oe = ({ files: w, stats: $ }) => {
10
- const [d, P] = b(""), [S, A] = b(""), [f, j] = b({
6
+ import { formatNumberToK as J, formatBytes as D, isMobile as Q } from "../../../utils/helpers.js";
7
+ import { getPathSeparator as g, splitPath as p, getParentPath as S, normalizePath as y } from "../../../utils/restore.js";
8
+ import X from "../../common/FileIcon/FileIcon.js";
9
+ const Y = Q(), Z = Y ? 65 : 45, ie = ({ files: u, stats: $, isPreview: A = !1 }) => {
10
+ const [d, P] = w(""), [z, U] = w(""), [f, j] = w({
11
11
  unchanged: !0,
12
12
  restored: !0,
13
13
  updated: !0
14
- }), [N, I] = b(() => {
14
+ }), [N, I] = w(() => {
15
15
  const e = /* @__PURE__ */ new Set();
16
- return w.forEach((t) => {
17
- const o = y(t.path), r = u(t.path);
16
+ return u.forEach((t) => {
17
+ const o = g(t.path), r = p(t.path);
18
18
  let n = "";
19
19
  r.forEach((c, i) => {
20
20
  n = n ? `${n}${o}${c}` : c, i < 3 && e.add(n);
21
21
  });
22
22
  }), e;
23
- }), m = E(() => {
23
+ }), b = x(() => {
24
24
  const e = {};
25
- return w.filter((t) => {
26
- const o = t.path.toLowerCase().includes(S.toLowerCase()), r = f[t.action];
25
+ return u.filter((t) => {
26
+ const o = t.path.toLowerCase().includes(z.toLowerCase()), r = f[t.action];
27
27
  return o && r;
28
28
  }).forEach((t) => {
29
- const o = D(t.path), r = g(o);
29
+ const o = S(t.path), r = y(o);
30
30
  r && (e[r] || (e[r] = []), e[r].push(t));
31
31
  }), e;
32
- }, [w, S, f]), p = E(() => {
32
+ }, [u, z, f]), h = x(() => {
33
33
  const e = /* @__PURE__ */ new Set();
34
- Object.keys(m).forEach((o) => {
35
- const r = y(o), n = u(o);
34
+ return u.forEach((t) => {
35
+ const o = S(t.path), r = g(o), n = p(o);
36
36
  let c = "";
37
37
  n.forEach((i) => {
38
38
  c = c ? `${c}${r}${i}` : i, c && e.add(c);
39
39
  });
40
- });
41
- const t = Array.from(e);
42
- return console.log("SelectedFolder :", t[0]), P(t[0] || ""), t;
43
- }, [m]), U = (e) => {
44
- const t = y(e);
45
- return p.some((o) => o !== e && o.startsWith(e + t));
46
- }, k = (e) => Object.entries(m).some(([t, o]) => t.startsWith(e) && o.some((r) => r.action === "restored" || r.action === "updated")), z = (e) => {
47
- const t = new Set(N), o = y(e), r = u(e);
40
+ }), Array.from(e);
41
+ }, [u]);
42
+ K(() => {
43
+ h.length > 0 && d === "" && P(h[0]);
44
+ }, [h, d]);
45
+ const H = (e) => {
46
+ const t = g(e);
47
+ return h.some((o) => o !== e && o.startsWith(e + t));
48
+ }, L = (e) => Object.entries(b).some(([t, o]) => t.startsWith(e) && o.some((r) => r.action === "restored" || r.action === "updated")), E = (e) => {
49
+ const t = new Set(N), o = g(e), r = p(e);
48
50
  let n = "";
49
51
  r.forEach((c, i) => {
50
52
  n = n ? `${n}${o}${c}` : c, i < r.length - 1 && t.add(n);
51
53
  }), I(t);
52
- }, H = (e) => {
54
+ }, M = (e) => {
53
55
  const t = new Set(N);
54
56
  N.has(e) ? t.delete(e) : t.add(e), I(t);
55
- }, M = (e) => {
56
- const t = y(e), r = u(e).slice(0, -1);
57
+ }, R = (e) => {
58
+ const t = g(e), r = p(e).slice(0, -1);
57
59
  let n = "";
58
60
  return r.every((c) => (n = n ? `${n}${t}${c}` : c, N.has(n)));
59
- }, L = E(() => !d || !m[d] ? [] : m[d].sort((e, t) => {
60
- const o = g(e.path), r = g(t.path), n = p.includes(o), c = p.includes(r);
61
+ }, k = x(() => !d || !b[d] ? [] : b[d].sort((e, t) => {
62
+ const o = y(e.path), r = y(t.path), n = h.includes(o), c = h.includes(r);
61
63
  if (n && !c) return -1;
62
64
  if (!n && c) return 1;
63
65
  const i = { restored: 0, updated: 1, unchanged: 2 };
64
66
  return i[e.action] - i[t.action];
65
- }), [d, m, p]), F = d && D(d) !== d && d !== "" && d !== "/", B = L.length + (F ? 1 : 0), R = ({ index: e, style: t }) => {
67
+ }), [d, b, h]), F = d && S(d) !== d && d !== "" && d !== "/", B = k.length + (F ? 1 : 0), T = ({ index: e, style: t }) => {
66
68
  if (F && e === 0)
67
69
  return /* @__PURE__ */ l(
68
70
  "div",
@@ -70,8 +72,8 @@ const Q = q(), X = Q ? 65 : 45, oe = ({ files: w, stats: $ }) => {
70
72
  style: t,
71
73
  className: `${s.file} ${s.fileIsDir} ${s.goUpButton}`,
72
74
  onClick: () => {
73
- const V = D(d), v = g(V);
74
- console.log("normalizedParentPath :", v), !(!v || v === "") && (z(v), P(v));
75
+ const W = S(d), v = y(W);
76
+ console.log("normalizedParentPath :", v), !(!v || v === "") && (E(v), P(v));
75
77
  },
76
78
  children: [
77
79
  /* @__PURE__ */ a("div", { className: s.fileName, children: "..." }),
@@ -80,28 +82,28 @@ const Q = q(), X = Q ? 65 : 45, oe = ({ files: w, stats: $ }) => {
80
82
  ]
81
83
  }
82
84
  );
83
- const o = F ? e - 1 : e, r = L[o];
85
+ const o = F ? e - 1 : e, r = k[o];
84
86
  if (!r) return null;
85
- const n = u(r.path), c = n[n.length - 1], i = g(r.path), h = p.includes(i), O = k(i), T = r.action, _ = r.action === "restored", G = _ ? "New" : r.action;
87
+ const n = p(r.path), c = n[n.length - 1], i = y(r.path), m = h.includes(i), G = L(i), O = r.action, _ = r.action === "restored", V = _ ? "New" : r.action;
86
88
  return /* @__PURE__ */ l(
87
89
  "div",
88
90
  {
89
91
  style: t,
90
- className: `${s.file} ${h ? s.fileIsDir : ""}`,
92
+ className: `${s.file} ${m ? s.fileIsDir : ""}`,
91
93
  onClick: () => {
92
- h && (P(i), z(i));
94
+ m && (P(i), E(i));
93
95
  },
94
96
  children: [
95
97
  /* @__PURE__ */ l("div", { className: s.fileName, children: [
96
- h ? /* @__PURE__ */ a(x, { type: h ? "fm-directory" : "fm-file", size: 16 }) : /* @__PURE__ */ a(J, { filename: c || "" }),
98
+ m ? /* @__PURE__ */ a(C, { type: m ? "fm-directory" : "fm-file", size: 16 }) : /* @__PURE__ */ a(X, { filename: c || "" }),
97
99
  " ",
98
100
  _ && /* @__PURE__ */ a("span", { className: s.newFileIndicator }),
99
101
  " ",
100
102
  c,
101
- O && /* @__PURE__ */ a("i", {})
103
+ G && /* @__PURE__ */ a("i", {})
102
104
  ] }),
103
- /* @__PURE__ */ a("div", { className: `${s.status} ${s[T]}`, children: /* @__PURE__ */ a("i", { children: G }) }),
104
- /* @__PURE__ */ a("div", { className: s.fileSize, children: h ? "-" : C(r.size) })
105
+ /* @__PURE__ */ a("div", { className: `${s.status} ${s[O]}`, children: /* @__PURE__ */ a("i", { children: V }) }),
106
+ /* @__PURE__ */ a("div", { className: s.fileSize, children: m ? "-" : D(r.size) })
105
107
  ]
106
108
  }
107
109
  );
@@ -111,12 +113,12 @@ const Q = q(), X = Q ? 65 : 45, oe = ({ files: w, stats: $ }) => {
111
113
  /* @__PURE__ */ a("div", { className: s.toolbarLeft, children: $ && /* @__PURE__ */ l("div", { className: s.stats, children: [
112
114
  /* @__PURE__ */ a("strong", { children: "Summary: " }),
113
115
  " ",
114
- K($.total_files),
116
+ J($.total_files),
115
117
  " Items ",
116
118
  " • ",
117
- C($.bytes_restored),
119
+ D($.bytes_restored),
118
120
  "/",
119
- C($.total_bytes)
121
+ D($.total_bytes)
120
122
  ] }) }),
121
123
  /* @__PURE__ */ l("div", { className: s.toolbarRight, children: [
122
124
  /* @__PURE__ */ a("div", { className: s.filters, children: Object.keys(f).map((e) => /* @__PURE__ */ l("label", { children: [
@@ -124,37 +126,37 @@ const Q = q(), X = Q ? 65 : 45, oe = ({ files: w, stats: $ }) => {
124
126
  e === "restored" ? "New" : e
125
127
  ] }, e)) }),
126
128
  /* @__PURE__ */ l("div", { className: s.search, children: [
127
- /* @__PURE__ */ a(x, { type: "search", size: 16 }),
128
- /* @__PURE__ */ a("input", { type: "text", placeholder: "Search in current Directory...", value: S, onChange: (e) => A(e.target.value) })
129
+ /* @__PURE__ */ a(C, { type: "search", size: 16 }),
130
+ /* @__PURE__ */ a("input", { type: "text", placeholder: "Search in current Directory...", value: z, onChange: (e) => U(e.target.value) })
129
131
  ] })
130
132
  ] })
131
133
  ] }),
132
134
  /* @__PURE__ */ l("div", { className: s.browserContent, children: [
133
135
  /* @__PURE__ */ l("div", { className: `${s.sidebar} styled__scrollbar`, children: [
134
136
  /* @__PURE__ */ a("div", { className: s.sidebarHeader, children: "Directories" }),
135
- p.map((e) => {
136
- const t = u(e), o = t[t.length - 1], r = t.length - 1, n = N.has(e), c = k(e), i = U(e);
137
- return r === 0 || M(e) ? /* @__PURE__ */ l(
137
+ h.map((e) => {
138
+ const t = p(e), o = t[t.length - 1], r = t.length - 1, n = N.has(e), c = L(e), i = H(e);
139
+ return r === 0 || R(e) ? /* @__PURE__ */ l(
138
140
  "div",
139
141
  {
140
142
  className: `${s.directory} ${d === e ? s.selected : ""} ${i ? "" : s.directoryEmpty}`,
141
143
  style: { paddingLeft: `${r * 20}px` },
142
144
  onClick: () => {
143
- P(e), z(e);
145
+ P(e), E(e);
144
146
  },
145
147
  children: [
146
148
  i ? /* @__PURE__ */ a(
147
149
  "button",
148
150
  {
149
151
  className: s.toggleButton,
150
- onClick: (h) => {
151
- h.stopPropagation(), H(e);
152
+ onClick: (m) => {
153
+ m.stopPropagation(), M(e);
152
154
  },
153
155
  children: n ? "-" : "+"
154
156
  }
155
157
  ) : /* @__PURE__ */ a("span", { className: `${s.togglePlaceholder}` }),
156
158
  /* @__PURE__ */ l("span", { className: s.dirName, children: [
157
- /* @__PURE__ */ a(x, { type: "fm-directory", size: 14 }),
159
+ /* @__PURE__ */ a(C, { type: "fm-directory", size: 14 }),
158
160
  " ",
159
161
  o,
160
162
  c && /* @__PURE__ */ a("span", { className: s.notification })
@@ -172,21 +174,21 @@ const Q = q(), X = Q ? 65 : 45, oe = ({ files: w, stats: $ }) => {
172
174
  /* @__PURE__ */ a("div", { children: "Size" })
173
175
  ] }),
174
176
  d && B > 0 ? /* @__PURE__ */ a(
175
- W,
177
+ q,
176
178
  {
177
- height: window.innerHeight - 250,
179
+ height: window.innerHeight - (A ? 370 : 250),
178
180
  itemCount: B,
179
- itemSize: X,
181
+ itemSize: Z,
180
182
  width: "100%",
181
183
  className: `${s.fileListVirtualized} styled__scrollbar`,
182
- children: R
184
+ children: T
183
185
  }
184
- ) : /* @__PURE__ */ a("div", { className: s.fileListEmpty, children: "Select a folder from the left to browse it's content" })
186
+ ) : /* @__PURE__ */ a("div", { className: s.fileListEmpty, children: "Select a folder from the left to browse its content" })
185
187
  ] }) })
186
188
  ] })
187
189
  ] });
188
190
  };
189
191
  export {
190
- oe as default
192
+ ie as default
191
193
  };
192
194
  //# sourceMappingURL=RestoredFileBrowser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RestoredFileBrowser.js","sources":["../../../../src/components/Restore/RestoredFileBrowser/RestoredFileBrowser.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\r\nimport { FixedSizeList as List } from 'react-window';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport classes from './RestoredFileBrowser.module.scss';\r\nimport { RestoredFileItem, RestoredItemsStats } from '../../../@types/restores';\r\nimport { formatBytes, formatNumberToK, isMobile } from '../../../utils/helpers';\r\nimport { getParentPath, getPathSeparator, normalizePath, splitPath } from '../../../utils/restore';\r\nimport FileIcon from '../../common/FileIcon/FileIcon';\r\n\r\ninterface RestoredFileBrowserProps {\r\n files: RestoredFileItem[];\r\n stats?: RestoredItemsStats;\r\n}\r\n\r\nconst isMobileDevice = isMobile();\r\nconst ITEM_HEIGHT = isMobileDevice ? 65 : 45;\r\n\r\nconst RestoredFileBrowser = ({ files, stats }: RestoredFileBrowserProps) => {\r\n const [selectedFolder, setSelectedFolder] = useState<string>('');\r\n const [search, setSearch] = useState('');\r\n const [filters, setFilters] = useState({\r\n unchanged: true,\r\n restored: true,\r\n updated: true,\r\n });\r\n\r\n const [expandedFolders, setExpandedFolders] = useState<Set<string>>(() => {\r\n const allPaths = new Set<string>();\r\n files.forEach((file) => {\r\n const separator = getPathSeparator(file.path);\r\n const parts = splitPath(file.path);\r\n let currentPath = '';\r\n\r\n parts.forEach((part, index) => {\r\n currentPath = currentPath ? `${currentPath}${separator}${part}` : part;\r\n // Only expand folders up to 5 levels deep (index < 5)\r\n if (index < 3) {\r\n allPaths.add(currentPath);\r\n }\r\n });\r\n });\r\n return allPaths;\r\n });\r\n\r\n const fileSystem = useMemo(() => {\r\n const system: { [key: string]: RestoredFileItem[] } = {};\r\n\r\n files\r\n .filter((file) => {\r\n const matchesSearch = file.path.toLowerCase().includes(search.toLowerCase());\r\n const matchesFilter = filters[file.action];\r\n return matchesSearch && matchesFilter;\r\n })\r\n .forEach((file) => {\r\n const dirPath = getParentPath(file.path);\r\n // Use the normalized path as key\r\n const normalizedDirPath = normalizePath(dirPath);\r\n\r\n if (normalizedDirPath) {\r\n if (!system[normalizedDirPath]) {\r\n system[normalizedDirPath] = [];\r\n }\r\n system[normalizedDirPath].push(file);\r\n }\r\n });\r\n\r\n return system;\r\n }, [files, search, filters]);\r\n\r\n const directories = useMemo(() => {\r\n const dirs = new Set<string>();\r\n Object.keys(fileSystem).forEach((path) => {\r\n const separator = getPathSeparator(path);\r\n const parts = splitPath(path);\r\n let currentPath = '';\r\n\r\n parts.forEach((part) => {\r\n currentPath = currentPath ? `${currentPath}${separator}${part}` : part;\r\n if (currentPath) {\r\n dirs.add(currentPath);\r\n }\r\n });\r\n });\r\n const dirsArray = Array.from(dirs);\r\n\r\n // Set the first directory as selected by default\r\n console.log('SelectedFolder :', dirsArray[0]);\r\n setSelectedFolder(dirsArray[0] || '');\r\n\r\n return dirsArray;\r\n }, [fileSystem]);\r\n\r\n const hasSubdirectories = (dir: string) => {\r\n const separator = getPathSeparator(dir);\r\n return directories.some((d) => d !== dir && d.startsWith(dir + separator));\r\n };\r\n\r\n const hasUpdatedContent = (dir: string) => {\r\n return Object.entries(fileSystem).some(([path, files]) => {\r\n return path.startsWith(dir) && files.some((f) => f.action === 'restored' || f.action === 'updated');\r\n });\r\n };\r\n\r\n const expandParentDirectories = (dir: string) => {\r\n const newExpanded = new Set(expandedFolders);\r\n const separator = getPathSeparator(dir);\r\n const parts = splitPath(dir);\r\n let currentPath = '';\r\n\r\n // Expand all parent directories\r\n parts.forEach((part, index) => {\r\n currentPath = currentPath ? `${currentPath}${separator}${part}` : part;\r\n if (index < parts.length - 1) {\r\n // Don't expand the target directory itself\r\n newExpanded.add(currentPath);\r\n }\r\n });\r\n\r\n setExpandedFolders(newExpanded);\r\n };\r\n\r\n const toggleFolder = (dir: string) => {\r\n const newExpanded = new Set(expandedFolders);\r\n if (expandedFolders.has(dir)) {\r\n newExpanded.delete(dir);\r\n } else {\r\n newExpanded.add(dir);\r\n }\r\n setExpandedFolders(newExpanded);\r\n };\r\n\r\n const isVisible = (dir: string) => {\r\n const separator = getPathSeparator(dir);\r\n const parts = splitPath(dir);\r\n const parentParts = parts.slice(0, -1);\r\n let parentPath = '';\r\n\r\n // Check if all parent folders are expanded\r\n return parentParts.every((part) => {\r\n parentPath = parentPath ? `${parentPath}${separator}${part}` : part;\r\n return expandedFolders.has(parentPath);\r\n });\r\n };\r\n\r\n const sortedFiles = useMemo(() => {\r\n if (!selectedFolder || !fileSystem[selectedFolder]) return [];\r\n\r\n return fileSystem[selectedFolder].sort((a, b) => {\r\n const normalizedPathA = normalizePath(a.path);\r\n const normalizedPathB = normalizePath(b.path);\r\n const isDirectoryA = directories.includes(normalizedPathA);\r\n const isDirectoryB = directories.includes(normalizedPathB);\r\n\r\n // First sort by type: directories first, then files\r\n if (isDirectoryA && !isDirectoryB) return -1;\r\n if (!isDirectoryA && isDirectoryB) return 1;\r\n\r\n // If both are same type, sort by status priority\r\n const priority = { restored: 0, updated: 1, unchanged: 2 };\r\n return priority[a.action] - priority[b.action];\r\n });\r\n }, [selectedFolder, fileSystem, directories]);\r\n\r\n const showGoUpButton = selectedFolder && getParentPath(selectedFolder) !== selectedFolder && selectedFolder !== '' && selectedFolder !== '/';\r\n const totalItems = sortedFiles.length + (showGoUpButton ? 1 : 0);\r\n\r\n const FileRow = ({ index, style }: { index: number; style: React.CSSProperties }) => {\r\n // If showing go up button and this is the first item\r\n if (showGoUpButton && index === 0) {\r\n return (\r\n <div\r\n style={style}\r\n className={`${classes.file} ${classes.fileIsDir} ${classes.goUpButton}`}\r\n onClick={() => {\r\n const parentPath = getParentPath(selectedFolder);\r\n const normalizedParentPath = normalizePath(parentPath);\r\n console.log('normalizedParentPath :', normalizedParentPath);\r\n if (!normalizedParentPath || normalizedParentPath === '') return;\r\n expandParentDirectories(normalizedParentPath);\r\n setSelectedFolder(normalizedParentPath);\r\n }}\r\n >\r\n <div className={classes.fileName}>...</div>\r\n <div className={classes.status}></div>\r\n <div></div>\r\n </div>\r\n );\r\n }\r\n\r\n const fileIndex = showGoUpButton ? index - 1 : index;\r\n const file = sortedFiles[fileIndex];\r\n\r\n if (!file) return null;\r\n\r\n const parts = splitPath(file.path);\r\n const fileName = parts[parts.length - 1];\r\n const normalizedPath = normalizePath(file.path);\r\n const isDirectory = directories.includes(normalizedPath);\r\n const hasUpdates = hasUpdatedContent(normalizedPath);\r\n const fileAction = file.action;\r\n const isRestored = file.action === 'restored' ? true : false;\r\n const fileActionLabel = isRestored ? 'New' : file.action;\r\n\r\n return (\r\n <div\r\n style={style}\r\n className={`${classes.file} ${isDirectory ? classes.fileIsDir : ''}`}\r\n onClick={() => {\r\n if (isDirectory) {\r\n setSelectedFolder(normalizedPath);\r\n expandParentDirectories(normalizedPath);\r\n }\r\n }}\r\n >\r\n <div className={classes.fileName}>\r\n {isDirectory ? <Icon type={isDirectory ? 'fm-directory' : 'fm-file'} size={16} /> : <FileIcon filename={fileName || ''} />}{' '}\r\n {isRestored && <span className={classes.newFileIndicator} />} {fileName}\r\n {hasUpdates && <i />}\r\n </div>\r\n <div className={`${classes.status} ${classes[fileAction]}`}>\r\n <i>{fileActionLabel}</i>\r\n </div>\r\n <div className={classes.fileSize}>{isDirectory ? '-' : formatBytes(file.size)}</div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className={classes.restoredFileBrowser}>\r\n <div className={classes.toolbar}>\r\n <div className={classes.toolbarLeft}>\r\n {stats && (\r\n <div className={classes.stats}>\r\n <strong>Summary: </strong> {formatNumberToK(stats.total_files)} Items {' • '}\r\n {formatBytes(stats.bytes_restored)}/{formatBytes(stats.total_bytes)}\r\n </div>\r\n )}\r\n </div>\r\n <div className={classes.toolbarRight}>\r\n <div className={classes.filters}>\r\n {(Object.keys(filters) as Array<keyof typeof filters>).map((action) => (\r\n <label key={action}>\r\n <input type=\"checkbox\" checked={filters[action]} onChange={(e) => setFilters({ ...filters, [action]: e.target.checked })} />\r\n {action === 'restored' ? 'New' : action}\r\n </label>\r\n ))}\r\n </div>\r\n <div className={classes.search}>\r\n <Icon type=\"search\" size={16} />\r\n <input type=\"text\" placeholder=\"Search in current Directory...\" value={search} onChange={(e) => setSearch(e.target.value)} />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className={classes.browserContent}>\r\n <div className={`${classes.sidebar} styled__scrollbar`}>\r\n <div className={classes.sidebarHeader}>Directories</div>\r\n {directories.map((dir) => {\r\n const parts = splitPath(dir);\r\n const dirName = parts[parts.length - 1];\r\n const depth = parts.length - 1;\r\n const isExpanded = expandedFolders.has(dir);\r\n const hasUpdates = hasUpdatedContent(dir);\r\n const hasChildren = hasSubdirectories(dir);\r\n\r\n // Only render if parent folders are expanded or if it's a root folder\r\n if (depth === 0 || isVisible(dir)) {\r\n return (\r\n <div\r\n key={dir}\r\n className={`${classes.directory} ${selectedFolder === dir ? classes.selected : ''} ${hasChildren ? '' : classes.directoryEmpty}`}\r\n style={{ paddingLeft: `${depth * 20}px` }}\r\n onClick={() => {\r\n setSelectedFolder(dir);\r\n expandParentDirectories(dir);\r\n }}\r\n >\r\n {hasChildren ? (\r\n <button\r\n className={classes.toggleButton}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleFolder(dir);\r\n }}\r\n >\r\n {isExpanded ? '-' : '+'}\r\n </button>\r\n ) : (\r\n <span className={`${classes.togglePlaceholder}`} />\r\n )}\r\n <span className={classes.dirName}>\r\n <Icon type={'fm-directory'} size={14} /> {dirName}\r\n {hasUpdates && <span className={classes.notification} />}\r\n </span>\r\n </div>\r\n );\r\n }\r\n return null;\r\n })}\r\n </div>\r\n\r\n <div className={classes.content}>\r\n <div className={classes.fileList}>\r\n <div className={classes.header}>\r\n <div>Name</div>\r\n <div>Status</div>\r\n <div>Size</div>\r\n </div>\r\n {selectedFolder && totalItems > 0 ? (\r\n <List\r\n height={window.innerHeight - 250}\r\n itemCount={totalItems}\r\n itemSize={ITEM_HEIGHT}\r\n width=\"100%\"\r\n className={`${classes.fileListVirtualized} styled__scrollbar`}\r\n >\r\n {FileRow}\r\n </List>\r\n ) : (\r\n <div className={classes.fileListEmpty}>Select a folder from the left to browse it's content</div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default RestoredFileBrowser;\r\n"],"names":["isMobileDevice","isMobile","ITEM_HEIGHT","RestoredFileBrowser","files","stats","selectedFolder","setSelectedFolder","useState","search","setSearch","filters","setFilters","expandedFolders","setExpandedFolders","allPaths","file","separator","getPathSeparator","parts","splitPath","currentPath","part","index","fileSystem","useMemo","system","matchesSearch","matchesFilter","dirPath","getParentPath","normalizedDirPath","normalizePath","directories","dirs","path","dirsArray","hasSubdirectories","dir","d","hasUpdatedContent","f","expandParentDirectories","newExpanded","toggleFolder","isVisible","parentParts","parentPath","sortedFiles","a","b","normalizedPathA","normalizedPathB","isDirectoryA","isDirectoryB","priority","showGoUpButton","totalItems","FileRow","style","jsxs","classes","normalizedParentPath","jsx","fileIndex","fileName","normalizedPath","isDirectory","hasUpdates","fileAction","isRestored","fileActionLabel","Icon","FileIcon","formatBytes","formatNumberToK","action","e","dirName","depth","isExpanded","hasChildren","List"],"mappings":"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"}
1
+ {"version":3,"file":"RestoredFileBrowser.js","sources":["../../../../src/components/Restore/RestoredFileBrowser/RestoredFileBrowser.tsx"],"sourcesContent":["import { useState, useMemo, useEffect } from 'react';\r\nimport { FixedSizeList as List } from 'react-window';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport classes from './RestoredFileBrowser.module.scss';\r\nimport { RestoredFileItem, RestoredItemsStats } from '../../../@types/restores';\r\nimport { formatBytes, formatNumberToK, isMobile } from '../../../utils/helpers';\r\nimport { getParentPath, getPathSeparator, normalizePath, splitPath } from '../../../utils/restore';\r\nimport FileIcon from '../../common/FileIcon/FileIcon';\r\n\r\ninterface RestoredFileBrowserProps {\r\n files: RestoredFileItem[];\r\n stats?: RestoredItemsStats;\r\n isPreview?: boolean;\r\n}\r\n\r\nconst isMobileDevice = isMobile();\r\nconst ITEM_HEIGHT = isMobileDevice ? 65 : 45;\r\n\r\nconst RestoredFileBrowser = ({ files, stats, isPreview = false }: RestoredFileBrowserProps) => {\r\n const [selectedFolder, setSelectedFolder] = useState<string>('');\r\n const [search, setSearch] = useState('');\r\n const [filters, setFilters] = useState({\r\n unchanged: true,\r\n restored: true,\r\n updated: true,\r\n });\r\n\r\n const [expandedFolders, setExpandedFolders] = useState<Set<string>>(() => {\r\n const allPaths = new Set<string>();\r\n files.forEach((file) => {\r\n const separator = getPathSeparator(file.path);\r\n const parts = splitPath(file.path);\r\n let currentPath = '';\r\n\r\n parts.forEach((part, index) => {\r\n currentPath = currentPath ? `${currentPath}${separator}${part}` : part;\r\n // Only expand folders up to 5 levels deep (index < 5)\r\n if (index < 3) {\r\n allPaths.add(currentPath);\r\n }\r\n });\r\n });\r\n return allPaths;\r\n });\r\n\r\n const fileSystem = useMemo(() => {\r\n const system: { [key: string]: RestoredFileItem[] } = {};\r\n\r\n files\r\n .filter((file) => {\r\n const matchesSearch = file.path.toLowerCase().includes(search.toLowerCase());\r\n const matchesFilter = filters[file.action];\r\n return matchesSearch && matchesFilter;\r\n })\r\n .forEach((file) => {\r\n const dirPath = getParentPath(file.path);\r\n // Use the normalized path as key\r\n const normalizedDirPath = normalizePath(dirPath);\r\n\r\n if (normalizedDirPath) {\r\n if (!system[normalizedDirPath]) {\r\n system[normalizedDirPath] = [];\r\n }\r\n system[normalizedDirPath].push(file);\r\n }\r\n });\r\n\r\n return system;\r\n }, [files, search, filters]);\r\n\r\n const directories = useMemo(() => {\r\n const dirs = new Set<string>();\r\n // Derive directories from all files, not filtered fileSystem, to keep tree stable during search\r\n files.forEach((file) => {\r\n const dirPath = getParentPath(file.path);\r\n const separator = getPathSeparator(dirPath);\r\n const parts = splitPath(dirPath);\r\n let currentPath = '';\r\n\r\n parts.forEach((part) => {\r\n currentPath = currentPath ? `${currentPath}${separator}${part}` : part;\r\n if (currentPath) {\r\n dirs.add(currentPath);\r\n }\r\n });\r\n });\r\n return Array.from(dirs);\r\n }, [files]);\r\n\r\n // Set initial selected folder when directories change\r\n useEffect(() => {\r\n if (directories.length > 0 && selectedFolder === '') {\r\n setSelectedFolder(directories[0]);\r\n }\r\n }, [directories, selectedFolder]);\r\n\r\n const hasSubdirectories = (dir: string) => {\r\n const separator = getPathSeparator(dir);\r\n return directories.some((d) => d !== dir && d.startsWith(dir + separator));\r\n };\r\n\r\n const hasUpdatedContent = (dir: string) => {\r\n return Object.entries(fileSystem).some(([path, files]) => {\r\n return path.startsWith(dir) && files.some((f) => f.action === 'restored' || f.action === 'updated');\r\n });\r\n };\r\n\r\n const expandParentDirectories = (dir: string) => {\r\n const newExpanded = new Set(expandedFolders);\r\n const separator = getPathSeparator(dir);\r\n const parts = splitPath(dir);\r\n let currentPath = '';\r\n\r\n // Expand all parent directories\r\n parts.forEach((part, index) => {\r\n currentPath = currentPath ? `${currentPath}${separator}${part}` : part;\r\n if (index < parts.length - 1) {\r\n // Don't expand the target directory itself\r\n newExpanded.add(currentPath);\r\n }\r\n });\r\n\r\n setExpandedFolders(newExpanded);\r\n };\r\n\r\n const toggleFolder = (dir: string) => {\r\n const newExpanded = new Set(expandedFolders);\r\n if (expandedFolders.has(dir)) {\r\n newExpanded.delete(dir);\r\n } else {\r\n newExpanded.add(dir);\r\n }\r\n setExpandedFolders(newExpanded);\r\n };\r\n\r\n const isVisible = (dir: string) => {\r\n const separator = getPathSeparator(dir);\r\n const parts = splitPath(dir);\r\n const parentParts = parts.slice(0, -1);\r\n let parentPath = '';\r\n\r\n // Check if all parent folders are expanded\r\n return parentParts.every((part) => {\r\n parentPath = parentPath ? `${parentPath}${separator}${part}` : part;\r\n return expandedFolders.has(parentPath);\r\n });\r\n };\r\n\r\n const sortedFiles = useMemo(() => {\r\n if (!selectedFolder || !fileSystem[selectedFolder]) return [];\r\n\r\n return fileSystem[selectedFolder].sort((a, b) => {\r\n const normalizedPathA = normalizePath(a.path);\r\n const normalizedPathB = normalizePath(b.path);\r\n const isDirectoryA = directories.includes(normalizedPathA);\r\n const isDirectoryB = directories.includes(normalizedPathB);\r\n\r\n // First sort by type: directories first, then files\r\n if (isDirectoryA && !isDirectoryB) return -1;\r\n if (!isDirectoryA && isDirectoryB) return 1;\r\n\r\n // If both are same type, sort by status priority\r\n const priority = { restored: 0, updated: 1, unchanged: 2 };\r\n return priority[a.action] - priority[b.action];\r\n });\r\n }, [selectedFolder, fileSystem, directories]);\r\n\r\n const showGoUpButton = selectedFolder && getParentPath(selectedFolder) !== selectedFolder && selectedFolder !== '' && selectedFolder !== '/';\r\n const totalItems = sortedFiles.length + (showGoUpButton ? 1 : 0);\r\n\r\n const FileRow = ({ index, style }: { index: number; style: React.CSSProperties }) => {\r\n // If showing go up button and this is the first item\r\n if (showGoUpButton && index === 0) {\r\n return (\r\n <div\r\n style={style}\r\n className={`${classes.file} ${classes.fileIsDir} ${classes.goUpButton}`}\r\n onClick={() => {\r\n const parentPath = getParentPath(selectedFolder);\r\n const normalizedParentPath = normalizePath(parentPath);\r\n console.log('normalizedParentPath :', normalizedParentPath);\r\n if (!normalizedParentPath || normalizedParentPath === '') return;\r\n expandParentDirectories(normalizedParentPath);\r\n setSelectedFolder(normalizedParentPath);\r\n }}\r\n >\r\n <div className={classes.fileName}>...</div>\r\n <div className={classes.status}></div>\r\n <div></div>\r\n </div>\r\n );\r\n }\r\n\r\n const fileIndex = showGoUpButton ? index - 1 : index;\r\n const file = sortedFiles[fileIndex];\r\n\r\n if (!file) return null;\r\n\r\n const parts = splitPath(file.path);\r\n const fileName = parts[parts.length - 1];\r\n const normalizedPath = normalizePath(file.path);\r\n const isDirectory = directories.includes(normalizedPath);\r\n const hasUpdates = hasUpdatedContent(normalizedPath);\r\n const fileAction = file.action;\r\n const isRestored = file.action === 'restored' ? true : false;\r\n const fileActionLabel = isRestored ? 'New' : file.action;\r\n\r\n return (\r\n <div\r\n style={style}\r\n className={`${classes.file} ${isDirectory ? classes.fileIsDir : ''}`}\r\n onClick={() => {\r\n if (isDirectory) {\r\n setSelectedFolder(normalizedPath);\r\n expandParentDirectories(normalizedPath);\r\n }\r\n }}\r\n >\r\n <div className={classes.fileName}>\r\n {isDirectory ? <Icon type={isDirectory ? 'fm-directory' : 'fm-file'} size={16} /> : <FileIcon filename={fileName || ''} />}{' '}\r\n {isRestored && <span className={classes.newFileIndicator} />} {fileName}\r\n {hasUpdates && <i />}\r\n </div>\r\n <div className={`${classes.status} ${classes[fileAction]}`}>\r\n <i>{fileActionLabel}</i>\r\n </div>\r\n <div className={classes.fileSize}>{isDirectory ? '-' : formatBytes(file.size)}</div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className={classes.restoredFileBrowser}>\r\n <div className={classes.toolbar}>\r\n <div className={classes.toolbarLeft}>\r\n {stats && (\r\n <div className={classes.stats}>\r\n <strong>Summary: </strong> {formatNumberToK(stats.total_files)} Items {' • '}\r\n {formatBytes(stats.bytes_restored)}/{formatBytes(stats.total_bytes)}\r\n </div>\r\n )}\r\n </div>\r\n <div className={classes.toolbarRight}>\r\n <div className={classes.filters}>\r\n {(Object.keys(filters) as Array<keyof typeof filters>).map((action) => (\r\n <label key={action}>\r\n <input type=\"checkbox\" checked={filters[action]} onChange={(e) => setFilters({ ...filters, [action]: e.target.checked })} />\r\n {action === 'restored' ? 'New' : action}\r\n </label>\r\n ))}\r\n </div>\r\n <div className={classes.search}>\r\n <Icon type=\"search\" size={16} />\r\n <input type=\"text\" placeholder=\"Search in current Directory...\" value={search} onChange={(e) => setSearch(e.target.value)} />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className={classes.browserContent}>\r\n <div className={`${classes.sidebar} styled__scrollbar`}>\r\n <div className={classes.sidebarHeader}>Directories</div>\r\n {directories.map((dir) => {\r\n const parts = splitPath(dir);\r\n const dirName = parts[parts.length - 1];\r\n const depth = parts.length - 1;\r\n const isExpanded = expandedFolders.has(dir);\r\n const hasUpdates = hasUpdatedContent(dir);\r\n const hasChildren = hasSubdirectories(dir);\r\n\r\n // Only render if parent folders are expanded or if it's a root folder\r\n if (depth === 0 || isVisible(dir)) {\r\n return (\r\n <div\r\n key={dir}\r\n className={`${classes.directory} ${selectedFolder === dir ? classes.selected : ''} ${hasChildren ? '' : classes.directoryEmpty}`}\r\n style={{ paddingLeft: `${depth * 20}px` }}\r\n onClick={() => {\r\n setSelectedFolder(dir);\r\n expandParentDirectories(dir);\r\n }}\r\n >\r\n {hasChildren ? (\r\n <button\r\n className={classes.toggleButton}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleFolder(dir);\r\n }}\r\n >\r\n {isExpanded ? '-' : '+'}\r\n </button>\r\n ) : (\r\n <span className={`${classes.togglePlaceholder}`} />\r\n )}\r\n <span className={classes.dirName}>\r\n <Icon type={'fm-directory'} size={14} /> {dirName}\r\n {hasUpdates && <span className={classes.notification} />}\r\n </span>\r\n </div>\r\n );\r\n }\r\n return null;\r\n })}\r\n </div>\r\n\r\n <div className={classes.content}>\r\n <div className={classes.fileList}>\r\n <div className={classes.header}>\r\n <div>Name</div>\r\n <div>Status</div>\r\n <div>Size</div>\r\n </div>\r\n {selectedFolder && totalItems > 0 ? (\r\n <List\r\n height={window.innerHeight - (isPreview ? 370 : 250)}\r\n itemCount={totalItems}\r\n itemSize={ITEM_HEIGHT}\r\n width=\"100%\"\r\n className={`${classes.fileListVirtualized} styled__scrollbar`}\r\n >\r\n {FileRow}\r\n </List>\r\n ) : (\r\n <div className={classes.fileListEmpty}>Select a folder from the left to browse its content</div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default RestoredFileBrowser;\r\n"],"names":["isMobileDevice","isMobile","ITEM_HEIGHT","RestoredFileBrowser","files","stats","isPreview","selectedFolder","setSelectedFolder","useState","search","setSearch","filters","setFilters","expandedFolders","setExpandedFolders","allPaths","file","separator","getPathSeparator","parts","splitPath","currentPath","part","index","fileSystem","useMemo","system","matchesSearch","matchesFilter","dirPath","getParentPath","normalizedDirPath","normalizePath","directories","dirs","useEffect","hasSubdirectories","dir","d","hasUpdatedContent","path","f","expandParentDirectories","newExpanded","toggleFolder","isVisible","parentParts","parentPath","sortedFiles","a","b","normalizedPathA","normalizedPathB","isDirectoryA","isDirectoryB","priority","showGoUpButton","totalItems","FileRow","style","jsxs","classes","normalizedParentPath","jsx","fileIndex","fileName","normalizedPath","isDirectory","hasUpdates","fileAction","isRestored","fileActionLabel","Icon","FileIcon","formatBytes","formatNumberToK","action","e","dirName","depth","isExpanded","hasChildren","List"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LogViewer.d.ts","sourceRoot":"","sources":["../../../../src/components/common/LogViewer/LogViewer.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,UAAU,cAAc;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,EAAE,CAAC;CAClB;AAMD,QAAA,MAAM,SAAS,GAAI,2DAAsF,cAAc,4CAuItH,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"LogViewer.d.ts","sourceRoot":"","sources":["../../../../src/components/common/LogViewer/LogViewer.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,UAAU,cAAc;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,EAAE,CAAC;CAClB;AAMD,QAAA,MAAM,SAAS,GAAI,2DAAsF,cAAc,4CA+ItH,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1,64 +1,68 @@
1
1
  import { jsxs as t, jsx as s } from "react/jsx-runtime";
2
- import { useState as g } from "react";
3
- import i from "../Icon/Icon.js";
2
+ import { useState as h, useEffect as _ } from "react";
3
+ import n from "../Icon/Icon.js";
4
4
  import a from "./LogViewer.module.scss.js";
5
- import { useGetDownloadLogs as _ } from "../../../services/plans.js";
6
- import { getLogLevelName as x } from "../../../utils/helpers.js";
7
- import { useGetDownloadAppLogs as j } from "../../../services/settings.js";
8
- import C from "../form/MultiSelect/MultiSelect.js";
9
- const F = ["info", "error", "warn"], b = 500, O = 1e3, Z = ({ type: n = "", planMethod: w = "backup", logs: h = [], planId: T, settingsID: $ = "1", isLoading: p }) => {
10
- const L = [...new Set(h.map((e) => e.module))], [u, S] = g(""), [P, H] = g(["info", "error", "warn"]), [I, V] = g(L), [o, A] = g(1), D = _(), z = j(), c = h.filter((e) => {
11
- var k, M;
12
- const m = (k = e.msg) == null ? void 0 : k.toLowerCase().includes(u.toLowerCase()), l = (M = e.backupId) == null ? void 0 : M.toLowerCase().includes(u.toLowerCase()), r = x(e.level), d = P.includes(r), R = I.includes(e.module);
13
- return (m || l) && d && R;
14
- }), v = c.length > O, N = Math.ceil(c.length / b), y = (o - 1) * b, B = y + b, G = v ? c.slice(y, B) : c, f = (e) => {
15
- A(e);
16
- }, E = () => {
5
+ import { useGetDownloadLogs as j } from "../../../services/plans.js";
6
+ import { getLogLevelName as C } from "../../../utils/helpers.js";
7
+ import { useGetDownloadAppLogs as F } from "../../../services/settings.js";
8
+ import $ from "../form/MultiSelect/MultiSelect.js";
9
+ const O = ["info", "error", "warn"], b = 500, U = 1e3, ee = ({ type: c = "", planMethod: L = "backup", logs: p = [], planId: P, settingsID: S = "1", isLoading: u }) => {
10
+ const g = [...new Set(p.map((e) => e.module))], [v, D] = h(""), [I, H] = h(["info", "error", "warn"]), [N, y] = h([]), [o, V] = h(1), A = j(), z = F();
11
+ _(() => {
12
+ g.length > 0 && N.length === 0 && y(g);
13
+ }, [g.length]);
14
+ const r = p.filter((e) => {
15
+ var M, x;
16
+ const i = (M = e.msg) == null ? void 0 : M.toLowerCase().includes(v.toLowerCase()), l = (x = e.backupId) == null ? void 0 : x.toLowerCase().includes(v.toLowerCase()), d = C(e.level), m = I.includes(d), R = N.includes(e.module);
17
+ return (i || l) && m && R;
18
+ }).sort((e, i) => new Date(i.time).getTime() - new Date(e.time).getTime()), f = r.length > U, w = Math.ceil(r.length / b), k = (o - 1) * b, B = k + b, E = f ? r.slice(k, B) : r, T = (e) => {
19
+ V(e);
20
+ }, G = () => {
17
21
  const e = [];
18
- let l = Math.max(1, o - Math.floor(2.5)), r = Math.min(N, l + 5 - 1);
19
- r - l < 4 && (l = Math.max(1, r - 5 + 1));
20
- for (let d = l; d <= r; d++)
21
- e.push(d);
22
+ let l = Math.max(1, o - Math.floor(2.5)), d = Math.min(w, l + 5 - 1);
23
+ d - l < 4 && (l = Math.max(1, d - 5 + 1));
24
+ for (let m = l; m <= d; m++)
25
+ e.push(m);
22
26
  return e;
23
27
  };
24
28
  return /* @__PURE__ */ t("div", { className: a.logViewer, children: [
25
29
  /* @__PURE__ */ t("div", { className: a.toolbar, children: [
26
30
  /* @__PURE__ */ s("div", { className: a.toolbarLeft, children: /* @__PURE__ */ t("div", { className: a.toolbarSummary, children: [
27
- c.length,
31
+ r.length,
28
32
  "/",
29
- h.length,
33
+ p.length,
30
34
  " log items",
31
- v && ` (Page ${o} of ${N})`
35
+ f && ` (Page ${o} of ${w})`
32
36
  ] }) }),
33
37
  /* @__PURE__ */ t("div", { className: a.toolbarRight, children: [
34
38
  /* @__PURE__ */ s("div", { className: a.filters, children: /* @__PURE__ */ s(
35
- C,
39
+ $,
36
40
  {
37
41
  title: "Log Levels",
38
- fieldValue: P,
39
- options: F.map((e) => ({ label: e, value: e })),
42
+ fieldValue: I,
43
+ options: O.map((e) => ({ label: e, value: e })),
40
44
  onUpdate: (e) => H(e)
41
45
  }
42
46
  ) }),
43
47
  /* @__PURE__ */ s("div", { className: a.filters, children: /* @__PURE__ */ s(
44
- C,
48
+ $,
45
49
  {
46
- title: n === "plan" ? "Task Type" : "Module Type",
47
- fieldValue: I,
48
- options: L.map((e) => ({ label: e || "General", value: e })),
49
- onUpdate: (e) => V(e)
50
+ title: c === "plan" ? "Task Type" : "Module Type",
51
+ fieldValue: N,
52
+ options: g.map((e) => ({ label: e || "General", value: e })),
53
+ onUpdate: (e) => y(e)
50
54
  }
51
55
  ) }),
52
56
  /* @__PURE__ */ t("div", { className: a.search, children: [
53
- /* @__PURE__ */ s(i, { type: "search", size: 16 }),
54
- /* @__PURE__ */ s("input", { type: "text", placeholder: "Search Log Messages...", value: u, onChange: (e) => S(e.target.value) })
57
+ /* @__PURE__ */ s(n, { type: "search", size: 16 }),
58
+ /* @__PURE__ */ s("input", { type: "text", placeholder: "Search Log Messages...", value: v, onChange: (e) => D(e.target.value) })
55
59
  ] }),
56
60
  /* @__PURE__ */ t(
57
61
  "button",
58
62
  {
59
- onClick: () => n === "plan" && T ? D.mutate(T) : z.mutate($),
63
+ onClick: () => c === "plan" && P ? A.mutate(P) : z.mutate(S),
60
64
  children: [
61
- /* @__PURE__ */ s(i, { type: "download", size: 16 }),
65
+ /* @__PURE__ */ s(n, { type: "download", size: 16 }),
62
66
  /* @__PURE__ */ s("span", { children: "Download" })
63
67
  ]
64
68
  }
@@ -69,44 +73,44 @@ const F = ["info", "error", "warn"], b = 500, O = 1e3, Z = ({ type: n = "", plan
69
73
  /* @__PURE__ */ t("div", { className: a.logsHeader, children: [
70
74
  /* @__PURE__ */ s("div", { className: a.logsHeaderItem, children: "Level" }),
71
75
  /* @__PURE__ */ s("div", { className: `${a.logsHeaderItem} ${a.logsHeaderItemTime}`, children: "Time" }),
72
- /* @__PURE__ */ s("div", { className: a.logsHeaderItem, children: n === "plan" ? "Task" : "Module" }),
73
- /* @__PURE__ */ s("div", { className: a.logsHeaderItem, children: n === "plan" && w !== "sync" ? "Backup Id" : "PID" }),
76
+ /* @__PURE__ */ s("div", { className: a.logsHeaderItem, children: c === "plan" ? "Task" : "Module" }),
77
+ /* @__PURE__ */ s("div", { className: a.logsHeaderItem, children: c === "plan" && L !== "sync" ? "Backup Id" : "PID" }),
74
78
  /* @__PURE__ */ s("div", { className: a.logsHeaderItem, children: "Message" })
75
79
  ] }),
76
80
  /* @__PURE__ */ t("div", { className: a.logs, children: [
77
- !p && G.map((e, m) => {
78
- const l = x(e.level);
81
+ !u && E.map((e, i) => {
82
+ const l = C(e.level);
79
83
  return /* @__PURE__ */ t("div", { className: `${a.log}`, children: [
80
84
  /* @__PURE__ */ t("div", { className: `${a.logType} ${a[`logType--${l.toLowerCase()}`]}`, children: [
81
- /* @__PURE__ */ s(i, { type: `log-${l.toLowerCase()}`, size: 13 }),
85
+ /* @__PURE__ */ s(n, { type: `log-${l.toLowerCase()}`, size: 13 }),
82
86
  " ",
83
87
  l
84
88
  ] }),
85
89
  /* @__PURE__ */ s("div", { className: a.logTime, children: new Date(e.time).toLocaleString() }),
86
90
  /* @__PURE__ */ s("div", { className: a.logModule, children: e.module }),
87
- /* @__PURE__ */ s("div", { className: a.logID, children: n === "plan" && w !== "sync" ? e.backupId || "N/A" : e.pid || "N/A" }),
91
+ /* @__PURE__ */ s("div", { className: a.logID, children: c === "plan" && L !== "sync" ? e.backupId || "N/A" : e.pid || "N/A" }),
88
92
  /* @__PURE__ */ s("div", { className: a.logMessage, children: e.msg })
89
- ] }, m);
93
+ ] }, i);
90
94
  }),
91
- p && /* @__PURE__ */ s("div", { className: a.loading, children: /* @__PURE__ */ s(i, { type: "loading", size: 20 }) })
95
+ u && /* @__PURE__ */ s("div", { className: a.loading, children: /* @__PURE__ */ s(n, { type: "loading", size: 20 }) })
92
96
  ] })
93
97
  ] }),
94
- v && !p && /* @__PURE__ */ t("div", { className: a.pagination, children: [
95
- /* @__PURE__ */ s("button", { onClick: () => f(o - 1), disabled: o === 1, className: a.paginationButton, children: /* @__PURE__ */ s(i, { type: "arrow-left", size: 16 }) }),
96
- E().map((e) => /* @__PURE__ */ s(
98
+ f && !u && /* @__PURE__ */ t("div", { className: a.pagination, children: [
99
+ /* @__PURE__ */ s("button", { onClick: () => T(o - 1), disabled: o === 1, className: a.paginationButton, children: /* @__PURE__ */ s(n, { type: "arrow-left", size: 16 }) }),
100
+ G().map((e) => /* @__PURE__ */ s(
97
101
  "button",
98
102
  {
99
- onClick: () => f(e),
103
+ onClick: () => T(e),
100
104
  className: `${a.paginationButton} ${o === e ? a.paginationButtonActive : ""}`,
101
105
  children: e
102
106
  },
103
107
  e
104
108
  )),
105
- /* @__PURE__ */ s("button", { onClick: () => f(o + 1), disabled: o === N, className: a.paginationButton, children: /* @__PURE__ */ s(i, { type: "arrow-right", size: 16 }) })
109
+ /* @__PURE__ */ s("button", { onClick: () => T(o + 1), disabled: o === w, className: a.paginationButton, children: /* @__PURE__ */ s(n, { type: "arrow-right", size: 16 }) })
106
110
  ] })
107
111
  ] });
108
112
  };
109
113
  export {
110
- Z as default
114
+ ee as default
111
115
  };
112
116
  //# sourceMappingURL=LogViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogViewer.js","sources":["../../../../src/components/common/LogViewer/LogViewer.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport Icon from '../Icon/Icon';\r\nimport classes from './LogViewer.module.scss';\r\nimport { useGetDownloadLogs } from '../../../services/plans';\r\nimport { getLogLevelName } from '../../../utils/helpers';\r\nimport { useGetDownloadAppLogs } from '../../../services/settings';\r\nimport MultiSelect from '../form/MultiSelect/MultiSelect';\r\nimport { LogItem } from '../../../@types/settings';\r\n\r\ninterface LogViewerProps {\r\n type: string;\r\n planId?: string;\r\n planMethod?: string;\r\n sourceType?: string;\r\n settingsID?: string;\r\n isLoading: boolean;\r\n logs: LogItem[];\r\n}\r\n\r\nconst logTypes = ['info', 'error', 'warn'];\r\nconst ITEMS_PER_PAGE = 500;\r\nconst PAGINATION_THRESHOLD = 1000;\r\n\r\nconst LogViewer = ({ type = '', planMethod = 'backup', logs = [], planId, settingsID = '1', isLoading }: LogViewerProps) => {\r\n const allTaskTypes = [...new Set(logs.map((log) => log.module))];\r\n const [search, setSearch] = useState('');\r\n const [filters, setFilters] = useState<string[]>(['info', 'error', 'warn']);\r\n const [taskTypes, setTaskTypes] = useState<string[]>(allTaskTypes);\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const downloadPlanLogsMutation = useGetDownloadLogs();\r\n const downloadAppLogsMutation = useGetDownloadAppLogs();\r\n\r\n const theLogs = logs.filter((log) => {\r\n const matchesSearch = log.msg?.toLowerCase().includes(search.toLowerCase());\r\n const matchesBackupId = log.backupId?.toLowerCase().includes(search.toLowerCase());\r\n const logType = getLogLevelName(log.level);\r\n const matchesFilter = filters.includes(logType);\r\n const matchesTaskType = taskTypes.includes(log.module);\r\n return (matchesSearch || matchesBackupId) && matchesFilter && matchesTaskType;\r\n });\r\n\r\n const showPagination = theLogs.length > PAGINATION_THRESHOLD;\r\n const totalPages = Math.ceil(theLogs.length / ITEMS_PER_PAGE);\r\n const startIndex = (currentPage - 1) * ITEMS_PER_PAGE;\r\n const endIndex = startIndex + ITEMS_PER_PAGE;\r\n const paginatedLogs = showPagination ? theLogs.slice(startIndex, endIndex) : theLogs;\r\n\r\n const handlePageChange = (page: number) => {\r\n setCurrentPage(page);\r\n };\r\n\r\n const getPageNumbers = () => {\r\n const pages = [];\r\n const maxVisiblePages = 5;\r\n let startPage = Math.max(1, currentPage - Math.floor(maxVisiblePages / 2));\r\n let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1);\r\n\r\n if (endPage - startPage < maxVisiblePages - 1) {\r\n startPage = Math.max(1, endPage - maxVisiblePages + 1);\r\n }\r\n\r\n for (let i = startPage; i <= endPage; i++) {\r\n pages.push(i);\r\n }\r\n return pages;\r\n };\r\n\r\n return (\r\n <div className={classes.logViewer}>\r\n <div className={classes.toolbar}>\r\n <div className={classes.toolbarLeft}>\r\n <div className={classes.toolbarSummary}>\r\n {theLogs.length}/{logs.length} log items\r\n {showPagination && ` (Page ${currentPage} of ${totalPages})`}\r\n </div>\r\n </div>\r\n <div className={classes.toolbarRight}>\r\n <div className={classes.filters}>\r\n <MultiSelect\r\n title=\"Log Levels\"\r\n fieldValue={filters}\r\n options={logTypes.map((logType) => ({ label: logType, value: logType }))}\r\n onUpdate={(updatedLogTypes) => setFilters(updatedLogTypes)}\r\n />\r\n </div>\r\n <div className={classes.filters}>\r\n <MultiSelect\r\n title={type === 'plan' ? 'Task Type' : 'Module Type'}\r\n fieldValue={taskTypes}\r\n options={allTaskTypes.map((taskType) => ({ label: taskType || 'General', value: taskType }))}\r\n onUpdate={(updatedTaskTypes) => setTaskTypes(updatedTaskTypes)}\r\n />\r\n </div>\r\n <div className={classes.search}>\r\n <Icon type=\"search\" size={16} />\r\n <input type=\"text\" placeholder=\"Search Log Messages...\" value={search} onChange={(e) => setSearch(e.target.value)} />\r\n </div>\r\n <button\r\n onClick={() => (type === 'plan' && planId ? downloadPlanLogsMutation.mutate(planId) : downloadAppLogsMutation.mutate(settingsID))}\r\n >\r\n <Icon type=\"download\" size={16} />\r\n <span>Download</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div className={classes.logsTable}>\r\n <div className={classes.logsHeader}>\r\n <div className={classes.logsHeaderItem}>Level</div>\r\n <div className={`${classes.logsHeaderItem} ${classes.logsHeaderItemTime}`}>Time</div>\r\n <div className={classes.logsHeaderItem}>{type === 'plan' ? 'Task' : 'Module'}</div>\r\n <div className={classes.logsHeaderItem}>{type === 'plan' && planMethod !== 'sync' ? 'Backup Id' : 'PID'}</div>\r\n <div className={classes.logsHeaderItem}>Message</div>\r\n </div>\r\n <div className={classes.logs}>\r\n {!isLoading &&\r\n paginatedLogs.map((log, index) => {\r\n const logType = getLogLevelName(log.level);\r\n // const isBackupLogStart = type === 'plan' && log.backupId && log.msg.includes('Started');\r\n return (\r\n <div key={index} className={`${classes.log}`}>\r\n <div className={`${classes.logType} ${classes[`logType--${logType.toLowerCase()}`]}`}>\r\n <Icon type={`log-${logType.toLowerCase()}`} size={13} /> {logType}\r\n </div>\r\n <div className={classes.logTime}>{new Date(log.time).toLocaleString()}</div>\r\n <div className={classes.logModule}>{log.module}</div>\r\n <div className={classes.logID}>{type === 'plan' && planMethod !== 'sync' ? log.backupId || 'N/A' : log.pid || 'N/A'}</div>\r\n <div className={classes.logMessage}>{log.msg}</div>\r\n </div>\r\n );\r\n })}\r\n {isLoading && (\r\n <div className={classes.loading}>\r\n <Icon type=\"loading\" size={20} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n {showPagination && !isLoading && (\r\n <div className={classes.pagination}>\r\n <button onClick={() => handlePageChange(currentPage - 1)} disabled={currentPage === 1} className={classes.paginationButton}>\r\n <Icon type=\"arrow-left\" size={16} />\r\n </button>\r\n {getPageNumbers().map((page) => (\r\n <button\r\n key={page}\r\n onClick={() => handlePageChange(page)}\r\n className={`${classes.paginationButton} ${currentPage === page ? classes.paginationButtonActive : ''}`}\r\n >\r\n {page}\r\n </button>\r\n ))}\r\n <button onClick={() => handlePageChange(currentPage + 1)} disabled={currentPage === totalPages} className={classes.paginationButton}>\r\n <Icon type=\"arrow-right\" size={16} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default LogViewer;\r\n"],"names":["logTypes","ITEMS_PER_PAGE","PAGINATION_THRESHOLD","LogViewer","type","planMethod","logs","planId","settingsID","isLoading","allTaskTypes","log","search","setSearch","useState","filters","setFilters","taskTypes","setTaskTypes","currentPage","setCurrentPage","downloadPlanLogsMutation","useGetDownloadLogs","downloadAppLogsMutation","useGetDownloadAppLogs","theLogs","matchesSearch","_a","matchesBackupId","_b","logType","getLogLevelName","matchesFilter","matchesTaskType","showPagination","totalPages","startIndex","endIndex","paginatedLogs","handlePageChange","page","getPageNumbers","pages","startPage","endPage","i","jsxs","classes","jsx","MultiSelect","updatedLogTypes","taskType","updatedTaskTypes","Icon","index"],"mappings":"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"}
1
+ {"version":3,"file":"LogViewer.js","sources":["../../../../src/components/common/LogViewer/LogViewer.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport Icon from '../Icon/Icon';\r\nimport classes from './LogViewer.module.scss';\r\nimport { useGetDownloadLogs } from '../../../services/plans';\r\nimport { getLogLevelName } from '../../../utils/helpers';\r\nimport { useGetDownloadAppLogs } from '../../../services/settings';\r\nimport MultiSelect from '../form/MultiSelect/MultiSelect';\r\nimport { LogItem } from '../../../@types/settings';\r\n\r\ninterface LogViewerProps {\r\n type: string;\r\n planId?: string;\r\n planMethod?: string;\r\n sourceType?: string;\r\n settingsID?: string;\r\n isLoading: boolean;\r\n logs: LogItem[];\r\n}\r\n\r\nconst logTypes = ['info', 'error', 'warn'];\r\nconst ITEMS_PER_PAGE = 500;\r\nconst PAGINATION_THRESHOLD = 1000;\r\n\r\nconst LogViewer = ({ type = '', planMethod = 'backup', logs = [], planId, settingsID = '1', isLoading }: LogViewerProps) => {\r\n const allTaskTypes = [...new Set(logs.map((log) => log.module))];\r\n const [search, setSearch] = useState('');\r\n const [filters, setFilters] = useState<string[]>(['info', 'error', 'warn']);\r\n const [taskTypes, setTaskTypes] = useState<string[]>([]);\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const downloadPlanLogsMutation = useGetDownloadLogs();\r\n const downloadAppLogsMutation = useGetDownloadAppLogs();\r\n\r\n useEffect(() => {\r\n if (allTaskTypes.length > 0 && taskTypes.length === 0) {\r\n setTaskTypes(allTaskTypes);\r\n }\r\n }, [allTaskTypes.length]);\r\n\r\n const theLogs = logs\r\n .filter((log) => {\r\n const matchesSearch = log.msg?.toLowerCase().includes(search.toLowerCase());\r\n const matchesBackupId = log.backupId?.toLowerCase().includes(search.toLowerCase());\r\n const logType = getLogLevelName(log.level);\r\n const matchesFilter = filters.includes(logType);\r\n const matchesTaskType = taskTypes.includes(log.module);\r\n return (matchesSearch || matchesBackupId) && matchesFilter && matchesTaskType;\r\n })\r\n .sort((a, b) => new Date(b.time).getTime() - new Date(a.time).getTime());\r\n\r\n const showPagination = theLogs.length > PAGINATION_THRESHOLD;\r\n const totalPages = Math.ceil(theLogs.length / ITEMS_PER_PAGE);\r\n const startIndex = (currentPage - 1) * ITEMS_PER_PAGE;\r\n const endIndex = startIndex + ITEMS_PER_PAGE;\r\n const paginatedLogs = showPagination ? theLogs.slice(startIndex, endIndex) : theLogs;\r\n\r\n const handlePageChange = (page: number) => {\r\n setCurrentPage(page);\r\n };\r\n\r\n const getPageNumbers = () => {\r\n const pages = [];\r\n const maxVisiblePages = 5;\r\n let startPage = Math.max(1, currentPage - Math.floor(maxVisiblePages / 2));\r\n let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1);\r\n\r\n if (endPage - startPage < maxVisiblePages - 1) {\r\n startPage = Math.max(1, endPage - maxVisiblePages + 1);\r\n }\r\n\r\n for (let i = startPage; i <= endPage; i++) {\r\n pages.push(i);\r\n }\r\n return pages;\r\n };\r\n\r\n return (\r\n <div className={classes.logViewer}>\r\n <div className={classes.toolbar}>\r\n <div className={classes.toolbarLeft}>\r\n <div className={classes.toolbarSummary}>\r\n {theLogs.length}/{logs.length} log items\r\n {showPagination && ` (Page ${currentPage} of ${totalPages})`}\r\n </div>\r\n </div>\r\n <div className={classes.toolbarRight}>\r\n <div className={classes.filters}>\r\n <MultiSelect\r\n title=\"Log Levels\"\r\n fieldValue={filters}\r\n options={logTypes.map((logType) => ({ label: logType, value: logType }))}\r\n onUpdate={(updatedLogTypes) => setFilters(updatedLogTypes)}\r\n />\r\n </div>\r\n <div className={classes.filters}>\r\n <MultiSelect\r\n title={type === 'plan' ? 'Task Type' : 'Module Type'}\r\n fieldValue={taskTypes}\r\n options={allTaskTypes.map((taskType) => ({ label: taskType || 'General', value: taskType }))}\r\n onUpdate={(updatedTaskTypes) => setTaskTypes(updatedTaskTypes)}\r\n />\r\n </div>\r\n <div className={classes.search}>\r\n <Icon type=\"search\" size={16} />\r\n <input type=\"text\" placeholder=\"Search Log Messages...\" value={search} onChange={(e) => setSearch(e.target.value)} />\r\n </div>\r\n <button\r\n onClick={() => (type === 'plan' && planId ? downloadPlanLogsMutation.mutate(planId) : downloadAppLogsMutation.mutate(settingsID))}\r\n >\r\n <Icon type=\"download\" size={16} />\r\n <span>Download</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div className={classes.logsTable}>\r\n <div className={classes.logsHeader}>\r\n <div className={classes.logsHeaderItem}>Level</div>\r\n <div className={`${classes.logsHeaderItem} ${classes.logsHeaderItemTime}`}>Time</div>\r\n <div className={classes.logsHeaderItem}>{type === 'plan' ? 'Task' : 'Module'}</div>\r\n <div className={classes.logsHeaderItem}>{type === 'plan' && planMethod !== 'sync' ? 'Backup Id' : 'PID'}</div>\r\n <div className={classes.logsHeaderItem}>Message</div>\r\n </div>\r\n <div className={classes.logs}>\r\n {!isLoading &&\r\n paginatedLogs.map((log, index) => {\r\n const logType = getLogLevelName(log.level);\r\n // const isBackupLogStart = type === 'plan' && log.backupId && log.msg.includes('Started');\r\n return (\r\n <div key={index} className={`${classes.log}`}>\r\n <div className={`${classes.logType} ${classes[`logType--${logType.toLowerCase()}`]}`}>\r\n <Icon type={`log-${logType.toLowerCase()}`} size={13} /> {logType}\r\n </div>\r\n <div className={classes.logTime}>{new Date(log.time).toLocaleString()}</div>\r\n <div className={classes.logModule}>{log.module}</div>\r\n <div className={classes.logID}>{type === 'plan' && planMethod !== 'sync' ? log.backupId || 'N/A' : log.pid || 'N/A'}</div>\r\n <div className={classes.logMessage}>{log.msg}</div>\r\n </div>\r\n );\r\n })}\r\n {isLoading && (\r\n <div className={classes.loading}>\r\n <Icon type=\"loading\" size={20} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n {showPagination && !isLoading && (\r\n <div className={classes.pagination}>\r\n <button onClick={() => handlePageChange(currentPage - 1)} disabled={currentPage === 1} className={classes.paginationButton}>\r\n <Icon type=\"arrow-left\" size={16} />\r\n </button>\r\n {getPageNumbers().map((page) => (\r\n <button\r\n key={page}\r\n onClick={() => handlePageChange(page)}\r\n className={`${classes.paginationButton} ${currentPage === page ? classes.paginationButtonActive : ''}`}\r\n >\r\n {page}\r\n </button>\r\n ))}\r\n <button onClick={() => handlePageChange(currentPage + 1)} disabled={currentPage === totalPages} className={classes.paginationButton}>\r\n <Icon type=\"arrow-right\" size={16} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default LogViewer;\r\n"],"names":["logTypes","ITEMS_PER_PAGE","PAGINATION_THRESHOLD","LogViewer","type","planMethod","logs","planId","settingsID","isLoading","allTaskTypes","log","search","setSearch","useState","filters","setFilters","taskTypes","setTaskTypes","currentPage","setCurrentPage","downloadPlanLogsMutation","useGetDownloadLogs","downloadAppLogsMutation","useGetDownloadAppLogs","useEffect","theLogs","matchesSearch","_a","matchesBackupId","_b","logType","getLogLevelName","matchesFilter","matchesTaskType","a","b","showPagination","totalPages","startIndex","endIndex","paginatedLogs","handlePageChange","page","getPageNumbers","pages","startPage","endPage","i","jsxs","classes","jsx","MultiSelect","updatedLogTypes","taskType","updatedTaskTypes","Icon","index"],"mappings":";;;;;;;;AAmBA,MAAMA,IAAW,CAAC,QAAQ,SAAS,MAAM,GACnCC,IAAiB,KACjBC,IAAuB,KAEvBC,KAAY,CAAC,EAAE,MAAAC,IAAO,IAAI,YAAAC,IAAa,UAAU,MAAAC,IAAO,CAAA,GAAI,QAAAC,GAAQ,YAAAC,IAAa,KAAK,WAAAC,QAAgC;AACzH,QAAMC,IAAe,CAAC,GAAG,IAAI,IAAIJ,EAAK,IAAI,CAACK,MAAQA,EAAI,MAAM,CAAC,CAAC,GACzD,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAE,GACjC,CAACC,GAASC,CAAU,IAAIF,EAAmB,CAAC,QAAQ,SAAS,MAAM,CAAC,GACpE,CAACG,GAAWC,CAAY,IAAIJ,EAAmB,CAAA,CAAE,GACjD,CAACK,GAAaC,CAAc,IAAIN,EAAS,CAAC,GAC1CO,IAA2BC,EAAA,GAC3BC,IAA0BC,EAAA;AAEhC,EAAAC,EAAU,MAAM;AACb,IAAIf,EAAa,SAAS,KAAKO,EAAU,WAAW,KACjDC,EAAaR,CAAY;AAAA,EAE/B,GAAG,CAACA,EAAa,MAAM,CAAC;AAExB,QAAMgB,IAAUpB,EACZ,OAAO,CAACK,MAAQ;;AACd,UAAMgB,KAAgBC,IAAAjB,EAAI,QAAJ,gBAAAiB,EAAS,cAAc,SAAShB,EAAO,gBACvDiB,KAAkBC,IAAAnB,EAAI,aAAJ,gBAAAmB,EAAc,cAAc,SAASlB,EAAO,gBAC9DmB,IAAUC,EAAgBrB,EAAI,KAAK,GACnCsB,IAAgBlB,EAAQ,SAASgB,CAAO,GACxCG,IAAkBjB,EAAU,SAASN,EAAI,MAAM;AACrD,YAAQgB,KAAiBE,MAAoBI,KAAiBC;AAAA,EACjE,CAAC,EACA,KAAK,CAACC,GAAGC,MAAM,IAAI,KAAKA,EAAE,IAAI,EAAE,QAAA,IAAY,IAAI,KAAKD,EAAE,IAAI,EAAE,SAAS,GAEpEE,IAAiBX,EAAQ,SAASxB,GAClCoC,IAAa,KAAK,KAAKZ,EAAQ,SAASzB,CAAc,GACtDsC,KAAcpB,IAAc,KAAKlB,GACjCuC,IAAWD,IAAatC,GACxBwC,IAAgBJ,IAAiBX,EAAQ,MAAMa,GAAYC,CAAQ,IAAId,GAEvEgB,IAAmB,CAACC,MAAiB;AACxC,IAAAvB,EAAeuB,CAAI;AAAA,EACtB,GAEMC,IAAiB,MAAM;AAC1B,UAAMC,IAAQ,CAAA;AAEd,QAAIC,IAAY,KAAK,IAAI,GAAG3B,IAAc,KAAK,MAAM,GAAmB,CAAC,GACrE4B,IAAU,KAAK,IAAIT,GAAYQ,IAAY,IAAkB,CAAC;AAElE,IAAIC,IAAUD,IAAY,MACvBA,IAAY,KAAK,IAAI,GAAGC,IAAU,IAAkB,CAAC;AAGxD,aAASC,IAAIF,GAAWE,KAAKD,GAASC;AACnC,MAAAH,EAAM,KAAKG,CAAC;AAEf,WAAOH;AAAA,EACV;AAEA,SACG,gBAAAI,EAAC,OAAA,EAAI,WAAWC,EAAQ,WACrB,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,SACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,aACrB,4BAAC,OAAA,EAAI,WAAWA,EAAQ,gBACpB,UAAA;AAAA,QAAAxB,EAAQ;AAAA,QAAO;AAAA,QAAEpB,EAAK;AAAA,QAAO;AAAA,QAC7B+B,KAAkB,UAAUlB,CAAW,OAAOmB,CAAU;AAAA,MAAA,EAAA,CAC5D,EAAA,CACH;AAAA,MACA,gBAAAW,EAAC,OAAA,EAAI,WAAWC,EAAQ,cACrB,UAAA;AAAA,QAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,SACrB,UAAA,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YACE,OAAM;AAAA,YACN,YAAYrC;AAAA,YACZ,SAASf,EAAS,IAAI,CAAC+B,OAAa,EAAE,OAAOA,GAAS,OAAOA,EAAA,EAAU;AAAA,YACvE,UAAU,CAACsB,MAAoBrC,EAAWqC,CAAe;AAAA,UAAA;AAAA,QAAA,GAE/D;AAAA,QACA,gBAAAF,EAAC,OAAA,EAAI,WAAWD,EAAQ,SACrB,UAAA,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YACE,OAAOhD,MAAS,SAAS,cAAc;AAAA,YACvC,YAAYa;AAAA,YACZ,SAASP,EAAa,IAAI,CAAC4C,OAAc,EAAE,OAAOA,KAAY,WAAW,OAAOA,EAAA,EAAW;AAAA,YAC3F,UAAU,CAACC,MAAqBrC,EAAaqC,CAAgB;AAAA,UAAA;AAAA,QAAA,GAEnE;AAAA,QACA,gBAAAN,EAAC,OAAA,EAAI,WAAWC,EAAQ,QACrB,UAAA;AAAA,UAAA,gBAAAC,EAACK,GAAA,EAAK,MAAK,UAAS,MAAM,IAAI;AAAA,UAC9B,gBAAAL,EAAC,SAAA,EAAM,MAAK,QAAO,aAAY,0BAAyB,OAAOvC,GAAQ,UAAU,CAAC,MAAMC,EAAU,EAAE,OAAO,KAAK,EAAA,CAAG;AAAA,QAAA,GACtH;AAAA,QACA,gBAAAoC;AAAA,UAAC;AAAA,UAAA;AAAA,YACE,SAAS,MAAO7C,MAAS,UAAUG,IAASc,EAAyB,OAAOd,CAAM,IAAIgB,EAAwB,OAAOf,CAAU;AAAA,YAE/H,UAAA;AAAA,cAAA,gBAAA2C,EAACK,GAAA,EAAK,MAAK,YAAW,MAAM,IAAI;AAAA,cAChC,gBAAAL,EAAC,UAAK,UAAA,WAAA,CAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACjB,EAAA,CACH;AAAA,IAAA,GACH;AAAA,IACA,gBAAAF,EAAC,OAAA,EAAI,WAAWC,EAAQ,WACrB,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,YACrB,UAAA;AAAA,QAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,gBAAgB,UAAA,SAAK;AAAA,QAC7C,gBAAAC,EAAC,OAAA,EAAI,WAAW,GAAGD,EAAQ,cAAc,IAAIA,EAAQ,kBAAkB,IAAI,UAAA,OAAA,CAAI;AAAA,QAC/E,gBAAAC,EAAC,SAAI,WAAWD,EAAQ,gBAAiB,UAAA9C,MAAS,SAAS,SAAS,SAAA,CAAS;AAAA,QAC7E,gBAAA+C,EAAC,OAAA,EAAI,WAAWD,EAAQ,gBAAiB,gBAAS,UAAU7C,MAAe,SAAS,cAAc,MAAA,CAAM;AAAA,QACxG,gBAAA8C,EAAC,OAAA,EAAI,WAAWD,EAAQ,gBAAgB,UAAA,UAAA,CAAO;AAAA,MAAA,GAClD;AAAA,MACA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,MACpB,UAAA;AAAA,QAAA,CAACzC,KACCgC,EAAc,IAAI,CAAC9B,GAAK8C,MAAU;AAC/B,gBAAM1B,IAAUC,EAAgBrB,EAAI,KAAK;AAEzC,mCACI,OAAA,EAAgB,WAAW,GAAGuC,EAAQ,GAAG,IACvC,UAAA;AAAA,YAAA,gBAAAD,EAAC,OAAA,EAAI,WAAW,GAAGC,EAAQ,OAAO,IAAIA,EAAQ,YAAYnB,EAAQ,YAAA,CAAa,EAAE,CAAC,IAC/E,UAAA;AAAA,cAAA,gBAAAoB,EAACK,GAAA,EAAK,MAAM,OAAOzB,EAAQ,aAAa,IAAI,MAAM,GAAA,CAAI;AAAA,cAAE;AAAA,cAAEA;AAAA,YAAA,GAC7D;AAAA,YACA,gBAAAoB,EAAC,OAAA,EAAI,WAAWD,EAAQ,SAAU,UAAA,IAAI,KAAKvC,EAAI,IAAI,EAAE,eAAA,EAAe,CAAE;AAAA,8BACrE,OAAA,EAAI,WAAWuC,EAAQ,WAAY,YAAI,QAAO;AAAA,YAC/C,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,OAAQ,UAAA9C,MAAS,UAAUC,MAAe,SAASM,EAAI,YAAY,QAAQA,EAAI,OAAO,OAAM;AAAA,8BACnH,OAAA,EAAI,WAAWuC,EAAQ,YAAa,YAAI,IAAA,CAAI;AAAA,UAAA,EAAA,GAPtCO,CAQV;AAAA,QAEN,CAAC;AAAA,QACHhD,KACE,gBAAA0C,EAAC,OAAA,EAAI,WAAWD,EAAQ,SACrB,UAAA,gBAAAC,EAACK,GAAA,EAAK,MAAK,WAAU,MAAM,GAAA,CAAI,EAAA,CAClC;AAAA,MAAA,EAAA,CAEN;AAAA,IAAA,GACH;AAAA,IACCnB,KAAkB,CAAC5B,uBAChB,OAAA,EAAI,WAAWyC,EAAQ,YACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,YAAO,SAAS,MAAMT,EAAiBvB,IAAc,CAAC,GAAG,UAAUA,MAAgB,GAAG,WAAW+B,EAAQ,kBACvG,UAAA,gBAAAC,EAACK,GAAA,EAAK,MAAK,cAAa,MAAM,IAAI,GACrC;AAAA,MACCZ,IAAiB,IAAI,CAACD,MACpB,gBAAAQ;AAAA,QAAC;AAAA,QAAA;AAAA,UAEE,SAAS,MAAMT,EAAiBC,CAAI;AAAA,UACpC,WAAW,GAAGO,EAAQ,gBAAgB,IAAI/B,MAAgBwB,IAAOO,EAAQ,yBAAyB,EAAE;AAAA,UAEnG,UAAAP;AAAA,QAAA;AAAA,QAJIA;AAAA,MAAA,CAMV;AAAA,MACD,gBAAAQ,EAAC,YAAO,SAAS,MAAMT,EAAiBvB,IAAc,CAAC,GAAG,UAAUA,MAAgBmB,GAAY,WAAWY,EAAQ,kBAChH,UAAA,gBAAAC,EAACK,GAAA,EAAK,MAAK,eAAc,MAAM,IAAI,EAAA,CACtC;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,GAEN;AAEN;"}