@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.
- package/dist-lib/components/Plan/Backups/Backups.module.scss.js +44 -42
- package/dist-lib/components/Plan/Backups/Backups.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.d.ts +3 -2
- package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.js +29 -22
- package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.js.map +1 -1
- package/dist-lib/components/Plan/PlanProgress/PlanProgress.d.ts +2 -1
- package/dist-lib/components/Plan/PlanProgress/PlanProgress.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanProgress/PlanProgress.js +22 -18
- package/dist-lib/components/Plan/PlanProgress/PlanProgress.js.map +1 -1
- package/dist-lib/components/Plan/Restores/Restores.js +5 -5
- package/dist-lib/components/Plan/Restores/Restores.js.map +1 -1
- package/dist-lib/components/Restore/RestoreFileSelector/RestoreFileSelector.js +73 -73
- package/dist-lib/components/Restore/RestoreFileSelector/RestoreFileSelector.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.d.ts.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js +50 -50
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js +8 -8
- package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js +34 -36
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js.map +1 -1
- package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.d.ts +2 -1
- package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.d.ts.map +1 -1
- package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.js +62 -60
- package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.js.map +1 -1
- package/dist-lib/components/common/LogViewer/LogViewer.d.ts.map +1 -1
- package/dist-lib/components/common/LogViewer/LogViewer.js +51 -47
- package/dist-lib/components/common/LogViewer/LogViewer.js.map +1 -1
- package/dist-lib/components/common/LogViewer/LogViewer.module.scss.js +24 -24
- package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.js +49 -37
- package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.js +68 -67
- package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
- package/dist-lib/services/backups.d.ts.map +1 -1
- package/dist-lib/services/backups.js +35 -34
- package/dist-lib/services/backups.js.map +1 -1
- package/dist-lib/services/plans.d.ts +5 -2
- package/dist-lib/services/plans.d.ts.map +1 -1
- package/dist-lib/services/plans.js +45 -43
- package/dist-lib/services/plans.js.map +1 -1
- package/dist-lib/services/restores.d.ts.map +1 -1
- package/dist-lib/services/restores.js +56 -55
- package/dist-lib/services/restores.js.map +1 -1
- package/dist-lib/services.js +19 -19
- package/dist-lib/styles/core-frontend.css +1 -1
- package/package.json +1 -1
- package/src/components/Plan/Backups/Backups.module.scss +2 -1
- package/src/components/Plan/PlanPendingBackup/PlanPendingBackup.tsx +27 -18
- package/src/components/Plan/PlanProgress/PlanProgress.tsx +13 -2
- package/src/components/Plan/Restores/Restores.tsx +1 -1
- package/src/components/Restore/RestoreFileSelector/RestoreFileSelector.tsx +4 -4
- package/src/components/Restore/RestoreWizard/RestoreConfirmStep.tsx +26 -19
- package/src/components/Restore/RestoreWizard/RestorePreviewStep.tsx +1 -1
- package/src/components/Restore/RestoreWizard/RestoreWizard.module.scss +2 -2
- package/src/components/Restore/RestoredFileBrowser/RestoredFileBrowser.tsx +18 -14
- package/src/components/common/LogViewer/LogViewer.module.scss +1 -1
- package/src/components/common/LogViewer/LogViewer.tsx +18 -10
- package/src/hooks/usePlanSingleActions.tsx +21 -8
- package/src/routes/PlanSingle/PlanSingle.tsx +2 -0
- package/src/services/backups.ts +12 -4
- package/src/services/plans.ts +4 -3
- 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
|
|
3
|
-
import { FixedSizeList as
|
|
4
|
-
import
|
|
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
|
|
7
|
-
import { getPathSeparator as
|
|
8
|
-
import
|
|
9
|
-
const
|
|
10
|
-
const [d, P] =
|
|
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] =
|
|
14
|
+
}), [N, I] = w(() => {
|
|
15
15
|
const e = /* @__PURE__ */ new Set();
|
|
16
|
-
return
|
|
17
|
-
const o =
|
|
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
|
-
}),
|
|
23
|
+
}), b = x(() => {
|
|
24
24
|
const e = {};
|
|
25
|
-
return
|
|
26
|
-
const o = t.path.toLowerCase().includes(
|
|
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 =
|
|
29
|
+
const o = S(t.path), r = y(o);
|
|
30
30
|
r && (e[r] || (e[r] = []), e[r].push(t));
|
|
31
31
|
}), e;
|
|
32
|
-
}, [
|
|
32
|
+
}, [u, z, f]), h = x(() => {
|
|
33
33
|
const e = /* @__PURE__ */ new Set();
|
|
34
|
-
|
|
35
|
-
const r =
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
},
|
|
54
|
+
}, M = (e) => {
|
|
53
55
|
const t = new Set(N);
|
|
54
56
|
N.has(e) ? t.delete(e) : t.add(e), I(t);
|
|
55
|
-
},
|
|
56
|
-
const t =
|
|
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
|
-
},
|
|
60
|
-
const o =
|
|
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,
|
|
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
|
|
74
|
-
console.log("normalizedParentPath :", v), !(!v || 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 =
|
|
85
|
+
const o = F ? e - 1 : e, r = k[o];
|
|
84
86
|
if (!r) return null;
|
|
85
|
-
const n =
|
|
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} ${
|
|
92
|
+
className: `${s.file} ${m ? s.fileIsDir : ""}`,
|
|
91
93
|
onClick: () => {
|
|
92
|
-
|
|
94
|
+
m && (P(i), E(i));
|
|
93
95
|
},
|
|
94
96
|
children: [
|
|
95
97
|
/* @__PURE__ */ l("div", { className: s.fileName, children: [
|
|
96
|
-
|
|
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
|
-
|
|
103
|
+
G && /* @__PURE__ */ a("i", {})
|
|
102
104
|
] }),
|
|
103
|
-
/* @__PURE__ */ a("div", { className: `${s.status} ${s[
|
|
104
|
-
/* @__PURE__ */ a("div", { className: s.fileSize, children:
|
|
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
|
-
|
|
116
|
+
J($.total_files),
|
|
115
117
|
" Items ",
|
|
116
118
|
" • ",
|
|
117
|
-
|
|
119
|
+
D($.bytes_restored),
|
|
118
120
|
"/",
|
|
119
|
-
|
|
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(
|
|
128
|
-
/* @__PURE__ */ a("input", { type: "text", placeholder: "Search in current Directory...", 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
|
-
|
|
136
|
-
const t =
|
|
137
|
-
return r === 0 ||
|
|
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),
|
|
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: (
|
|
151
|
-
|
|
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(
|
|
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
|
-
|
|
177
|
+
q,
|
|
176
178
|
{
|
|
177
|
-
height: window.innerHeight - 250,
|
|
179
|
+
height: window.innerHeight - (A ? 370 : 250),
|
|
178
180
|
itemCount: B,
|
|
179
|
-
itemSize:
|
|
181
|
+
itemSize: Z,
|
|
180
182
|
width: "100%",
|
|
181
183
|
className: `${s.fileListVirtualized} styled__scrollbar`,
|
|
182
|
-
children:
|
|
184
|
+
children: T
|
|
183
185
|
}
|
|
184
|
-
) : /* @__PURE__ */ a("div", { className: s.fileListEmpty, children: "Select a folder from the left to browse
|
|
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
|
-
|
|
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,
|
|
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
|
|
3
|
-
import
|
|
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
|
|
6
|
-
import { getLogLevelName as
|
|
7
|
-
import { useGetDownloadAppLogs as
|
|
8
|
-
import
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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)),
|
|
19
|
-
|
|
20
|
-
for (let
|
|
21
|
-
e.push(
|
|
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
|
-
|
|
31
|
+
r.length,
|
|
28
32
|
"/",
|
|
29
|
-
|
|
33
|
+
p.length,
|
|
30
34
|
" log items",
|
|
31
|
-
|
|
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
|
-
|
|
39
|
+
$,
|
|
36
40
|
{
|
|
37
41
|
title: "Log Levels",
|
|
38
|
-
fieldValue:
|
|
39
|
-
options:
|
|
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
|
-
|
|
48
|
+
$,
|
|
45
49
|
{
|
|
46
|
-
title:
|
|
47
|
-
fieldValue:
|
|
48
|
-
options:
|
|
49
|
-
onUpdate: (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(
|
|
54
|
-
/* @__PURE__ */ s("input", { type: "text", placeholder: "Search Log Messages...", 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: () =>
|
|
63
|
+
onClick: () => c === "plan" && P ? A.mutate(P) : z.mutate(S),
|
|
60
64
|
children: [
|
|
61
|
-
/* @__PURE__ */ s(
|
|
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:
|
|
73
|
-
/* @__PURE__ */ s("div", { className: a.logsHeaderItem, children:
|
|
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
|
-
!
|
|
78
|
-
const l =
|
|
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(
|
|
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:
|
|
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
|
-
] },
|
|
93
|
+
] }, i);
|
|
90
94
|
}),
|
|
91
|
-
|
|
95
|
+
u && /* @__PURE__ */ s("div", { className: a.loading, children: /* @__PURE__ */ s(n, { type: "loading", size: 20 }) })
|
|
92
96
|
] })
|
|
93
97
|
] }),
|
|
94
|
-
|
|
95
|
-
/* @__PURE__ */ s("button", { onClick: () =>
|
|
96
|
-
|
|
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: () =>
|
|
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: () =>
|
|
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
|
-
|
|
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":";;;;;;;;AAmBA,MAAMA,IAAW,CAAC,QAAQ,SAAS,MAAM,GACnCC,IAAiB,KACjBC,IAAuB,KAEvBC,IAAY,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,EAAmBJ,CAAY,GAC3D,CAACS,GAAaC,CAAc,IAAIN,EAAS,CAAC,GAC1CO,IAA2BC,EAAA,GAC3BC,IAA0BC,EAAA,GAE1BC,IAAUnB,EAAK,OAAO,CAACK,MAAQ;;AAClC,UAAMe,KAAgBC,IAAAhB,EAAI,QAAJ,gBAAAgB,EAAS,cAAc,SAASf,EAAO,gBACvDgB,KAAkBC,IAAAlB,EAAI,aAAJ,gBAAAkB,EAAc,cAAc,SAASjB,EAAO,gBAC9DkB,IAAUC,EAAgBpB,EAAI,KAAK,GACnCqB,IAAgBjB,EAAQ,SAASe,CAAO,GACxCG,IAAkBhB,EAAU,SAASN,EAAI,MAAM;AACrD,YAAQe,KAAiBE,MAAoBI,KAAiBC;AAAA,EACjE,CAAC,GAEKC,IAAiBT,EAAQ,SAASvB,GAClCiC,IAAa,KAAK,KAAKV,EAAQ,SAASxB,CAAc,GACtDmC,KAAcjB,IAAc,KAAKlB,GACjCoC,IAAWD,IAAanC,GACxBqC,IAAgBJ,IAAiBT,EAAQ,MAAMW,GAAYC,CAAQ,IAAIZ,GAEvEc,IAAmB,CAACC,MAAiB;AACxC,IAAApB,EAAeoB,CAAI;AAAA,EACtB,GAEMC,IAAiB,MAAM;AAC1B,UAAMC,IAAQ,CAAA;AAEd,QAAIC,IAAY,KAAK,IAAI,GAAGxB,IAAc,KAAK,MAAM,GAAmB,CAAC,GACrEyB,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,QAAAtB,EAAQ;AAAA,QAAO;AAAA,QAAEnB,EAAK;AAAA,QAAO;AAAA,QAC7B4B,KAAkB,UAAUf,CAAW,OAAOgB,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,YAAYlC;AAAA,YACZ,SAASf,EAAS,IAAI,CAAC8B,OAAa,EAAE,OAAOA,GAAS,OAAOA,EAAA,EAAU;AAAA,YACvE,UAAU,CAACoB,MAAoBlC,EAAWkC,CAAe;AAAA,UAAA;AAAA,QAAA,GAE/D;AAAA,QACA,gBAAAF,EAAC,OAAA,EAAI,WAAWD,EAAQ,SACrB,UAAA,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YACE,OAAO7C,MAAS,SAAS,cAAc;AAAA,YACvC,YAAYa;AAAA,YACZ,SAASP,EAAa,IAAI,CAACyC,OAAc,EAAE,OAAOA,KAAY,WAAW,OAAOA,EAAA,EAAW;AAAA,YAC3F,UAAU,CAACC,MAAqBlC,EAAakC,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,OAAOpC,GAAQ,UAAU,CAAC,MAAMC,EAAU,EAAE,OAAO,KAAK,EAAA,CAAG;AAAA,QAAA,GACtH;AAAA,QACA,gBAAAiC;AAAA,UAAC;AAAA,UAAA;AAAA,YACE,SAAS,MAAO1C,MAAS,UAAUG,IAASc,EAAyB,OAAOd,CAAM,IAAIgB,EAAwB,OAAOf,CAAU;AAAA,YAE/H,UAAA;AAAA,cAAA,gBAAAwC,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,UAAA3C,MAAS,SAAS,SAAS,SAAA,CAAS;AAAA,QAC7E,gBAAA4C,EAAC,OAAA,EAAI,WAAWD,EAAQ,gBAAiB,gBAAS,UAAU1C,MAAe,SAAS,cAAc,MAAA,CAAM;AAAA,QACxG,gBAAA2C,EAAC,OAAA,EAAI,WAAWD,EAAQ,gBAAgB,UAAA,UAAA,CAAO;AAAA,MAAA,GAClD;AAAA,MACA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,MACpB,UAAA;AAAA,QAAA,CAACtC,KACC6B,EAAc,IAAI,CAAC3B,GAAK2C,MAAU;AAC/B,gBAAMxB,IAAUC,EAAgBpB,EAAI,KAAK;AAEzC,mCACI,OAAA,EAAgB,WAAW,GAAGoC,EAAQ,GAAG,IACvC,UAAA;AAAA,YAAA,gBAAAD,EAAC,OAAA,EAAI,WAAW,GAAGC,EAAQ,OAAO,IAAIA,EAAQ,YAAYjB,EAAQ,YAAA,CAAa,EAAE,CAAC,IAC/E,UAAA;AAAA,cAAA,gBAAAkB,EAACK,GAAA,EAAK,MAAM,OAAOvB,EAAQ,aAAa,IAAI,MAAM,GAAA,CAAI;AAAA,cAAE;AAAA,cAAEA;AAAA,YAAA,GAC7D;AAAA,YACA,gBAAAkB,EAAC,OAAA,EAAI,WAAWD,EAAQ,SAAU,UAAA,IAAI,KAAKpC,EAAI,IAAI,EAAE,eAAA,EAAe,CAAE;AAAA,8BACrE,OAAA,EAAI,WAAWoC,EAAQ,WAAY,YAAI,QAAO;AAAA,YAC/C,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,OAAQ,UAAA3C,MAAS,UAAUC,MAAe,SAASM,EAAI,YAAY,QAAQA,EAAI,OAAO,OAAM;AAAA,8BACnH,OAAA,EAAI,WAAWoC,EAAQ,YAAa,YAAI,IAAA,CAAI;AAAA,UAAA,EAAA,GAPtCO,CAQV;AAAA,QAEN,CAAC;AAAA,QACH7C,KACE,gBAAAuC,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,CAACzB,uBAChB,OAAA,EAAI,WAAWsC,EAAQ,YACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,YAAO,SAAS,MAAMT,EAAiBpB,IAAc,CAAC,GAAG,UAAUA,MAAgB,GAAG,WAAW4B,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,IAAI5B,MAAgBqB,IAAOO,EAAQ,yBAAyB,EAAE;AAAA,UAEnG,UAAAP;AAAA,QAAA;AAAA,QAJIA;AAAA,MAAA,CAMV;AAAA,MACD,gBAAAQ,EAAC,YAAO,SAAS,MAAMT,EAAiBpB,IAAc,CAAC,GAAG,UAAUA,MAAgBgB,GAAY,WAAWY,EAAQ,kBAChH,UAAA,gBAAAC,EAACK,GAAA,EAAK,MAAK,eAAc,MAAM,IAAI,EAAA,CACtC;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,GAEN;AAEN;"}
|
|
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":"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"}
|