@plutonhq/core-frontend 0.1.33 → 0.1.34
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/Device/DeviceResticSettings/DeviceResticSettings.js +4 -4
- package/dist-lib/components/Device/DeviceResticSettings/DeviceResticSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanPerformanceSettings.js +2 -2
- package/dist-lib/components/Plan/PlanSettings/PlanPerformanceSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js +47 -47
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js.map +1 -1
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js +6 -6
- package/dist-lib/components/common/FileManager/FileManager.module.scss.js +18 -16
- package/dist-lib/components/common/FileManager/FileManager.module.scss.js.map +1 -1
- package/dist-lib/styles/core-frontend.css +1 -1
- package/package.json +1 -1
- package/src/components/Device/DeviceResticSettings/DeviceResticSettings.tsx +2 -2
- package/src/components/Plan/PlanSettings/PlanPerformanceSettings.tsx +2 -2
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.module.scss +1 -1
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.tsx +11 -8
- package/src/components/common/FileManager/FileManager.module.scss +7 -0
|
@@ -2,7 +2,7 @@ import { jsxs as i, jsx as a } from "react/jsx-runtime";
|
|
|
2
2
|
import d from "../../common/form/Input/Input.js";
|
|
3
3
|
import o from "../../common/form/NumberInput/NumberInput.js";
|
|
4
4
|
import l from "../EditDevice/EditDevice.module.scss.js";
|
|
5
|
-
const
|
|
5
|
+
const n = ({ settings: e = {}, onUpdate: c }) => /* @__PURE__ */ i("div", { children: [
|
|
6
6
|
/* @__PURE__ */ a("div", { className: l.field, children: /* @__PURE__ */ a(
|
|
7
7
|
d,
|
|
8
8
|
{
|
|
@@ -40,8 +40,8 @@ const h = ({ settings: e = {}, onUpdate: c }) => /* @__PURE__ */ i("div", { chil
|
|
|
40
40
|
o,
|
|
41
41
|
{
|
|
42
42
|
label: "Packet Size (MB)",
|
|
43
|
-
fieldValue: e != null && e.packSize ? parseInt(e.packSize
|
|
44
|
-
onUpdate: (r) => c({ ...e, packSize: r ? r
|
|
43
|
+
fieldValue: e != null && e.packSize ? parseInt(e.packSize, 10) : "",
|
|
44
|
+
onUpdate: (r) => c({ ...e, packSize: r ? r.toString() : "" }),
|
|
45
45
|
min: 0,
|
|
46
46
|
max: 4e3,
|
|
47
47
|
hint: "Packs are blobs of data, which are encrypted and stored in the repository. Increasing the pack size requires more disk space for temporary pack files to be created before uploading.",
|
|
@@ -50,6 +50,6 @@ const h = ({ settings: e = {}, onUpdate: c }) => /* @__PURE__ */ i("div", { chil
|
|
|
50
50
|
) })
|
|
51
51
|
] });
|
|
52
52
|
export {
|
|
53
|
-
|
|
53
|
+
n as default
|
|
54
54
|
};
|
|
55
55
|
//# sourceMappingURL=DeviceResticSettings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceResticSettings.js","sources":["../../../../src/components/Device/DeviceResticSettings/DeviceResticSettings.tsx"],"sourcesContent":["import { DeviceSettings } from '../../../@types/devices';\r\nimport Input from '../../common/form/Input/Input';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\nimport classes from '../EditDevice/EditDevice.module.scss';\r\n\r\ninterface DeviceResticSettingsProps {\r\n settings?: DeviceSettings['restic'];\r\n onUpdate: (settings: DeviceResticSettingsProps['settings']) => void;\r\n}\r\n\r\nconst DeviceResticSettings = ({ settings = {}, onUpdate }: DeviceResticSettingsProps) => {\r\n return (\r\n <div>\r\n <div className={classes.field}>\r\n <Input\r\n label=\"Cache Directory\"\r\n fieldValue={settings?.cacheDir || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, cacheDir: val })}\r\n hint=\"Where Restic will store it's cache.\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Max Processor Cores\"\r\n fieldValue={settings?.maxProcessor || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, maxProcessor: val === 0 ? '' : val })}\r\n min={0}\r\n max={64}\r\n hint=\"Keep 0 or empty to use all cores. Uses all cores by default.\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Read Concurrency\"\r\n fieldValue={settings?.readConcurrency || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, readConcurrency: val === 0 ? '' : val })}\r\n min={0}\r\n hint=\"Read n files Concurrently. Default: 2\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Packet Size (MB)\"\r\n fieldValue={settings?.packSize ? parseInt(settings.packSize
|
|
1
|
+
{"version":3,"file":"DeviceResticSettings.js","sources":["../../../../src/components/Device/DeviceResticSettings/DeviceResticSettings.tsx"],"sourcesContent":["import { DeviceSettings } from '../../../@types/devices';\r\nimport Input from '../../common/form/Input/Input';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\nimport classes from '../EditDevice/EditDevice.module.scss';\r\n\r\ninterface DeviceResticSettingsProps {\r\n settings?: DeviceSettings['restic'];\r\n onUpdate: (settings: DeviceResticSettingsProps['settings']) => void;\r\n}\r\n\r\nconst DeviceResticSettings = ({ settings = {}, onUpdate }: DeviceResticSettingsProps) => {\r\n return (\r\n <div>\r\n <div className={classes.field}>\r\n <Input\r\n label=\"Cache Directory\"\r\n fieldValue={settings?.cacheDir || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, cacheDir: val })}\r\n hint=\"Where Restic will store it's cache.\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Max Processor Cores\"\r\n fieldValue={settings?.maxProcessor || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, maxProcessor: val === 0 ? '' : val })}\r\n min={0}\r\n max={64}\r\n hint=\"Keep 0 or empty to use all cores. Uses all cores by default.\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Read Concurrency\"\r\n fieldValue={settings?.readConcurrency || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, readConcurrency: val === 0 ? '' : val })}\r\n min={0}\r\n hint=\"Read n files Concurrently. Default: 2\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Packet Size (MB)\"\r\n fieldValue={settings?.packSize ? parseInt(settings.packSize, 10) : ''}\r\n onUpdate={(val) => onUpdate({ ...settings, packSize: val ? val.toString() : '' })}\r\n min={0}\r\n max={4000}\r\n hint=\"Packs are blobs of data, which are encrypted and stored in the repository. Increasing the pack size requires more disk space for temporary pack files to be created before uploading.\"\r\n inline={true}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DeviceResticSettings;\r\n"],"names":["DeviceResticSettings","settings","onUpdate","jsx","classes","Input","val","NumberInput"],"mappings":";;;;AAUA,MAAMA,IAAuB,CAAC,EAAE,UAAAC,IAAW,CAAA,GAAI,UAAAC,0BAExC,OAAA,EACE,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWC,EAAQ,OACrB,UAAA,gBAAAD;AAAA,IAACE;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,aAAYJ,KAAA,gBAAAA,EAAU,aAAY;AAAA,MAClC,UAAU,CAACK,MAAQJ,EAAS,EAAE,GAAGD,GAAU,UAAUK,GAAK;AAAA,MAC1D,MAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAAA,GAEd;AAAA,EACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,OACrB,UAAA,gBAAAD;AAAA,IAACI;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,aAAYN,KAAA,gBAAAA,EAAU,iBAAgB;AAAA,MACtC,UAAU,CAACK,MAAQJ,EAAS,EAAE,GAAGD,GAAU,cAAcK,MAAQ,IAAI,KAAKA,EAAA,CAAK;AAAA,MAC/E,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAAA,GAEd;AAAA,EACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,OACrB,UAAA,gBAAAD;AAAA,IAACI;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,aAAYN,KAAA,gBAAAA,EAAU,oBAAmB;AAAA,MACzC,UAAU,CAACK,MAAQJ,EAAS,EAAE,GAAGD,GAAU,iBAAiBK,MAAQ,IAAI,KAAKA,EAAA,CAAK;AAAA,MAClF,KAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAAA,GAEd;AAAA,EACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,OACrB,UAAA,gBAAAD;AAAA,IAACI;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,YAAYN,KAAA,QAAAA,EAAU,WAAW,SAASA,EAAS,UAAU,EAAE,IAAI;AAAA,MACnE,UAAU,CAACK,MAAQJ,EAAS,EAAE,GAAGD,GAAU,UAAUK,IAAMA,EAAI,SAAA,IAAa,IAAI;AAAA,MAChF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAAA,EACX,CACH;AAAA,GACH;"}
|
|
@@ -31,8 +31,8 @@ const b = ({ plan: s, onUpdate: r }) => {
|
|
|
31
31
|
c,
|
|
32
32
|
{
|
|
33
33
|
label: "Packet Size (MB)",
|
|
34
|
-
fieldValue: e != null && e.packSize ? parseInt(e.packSize
|
|
35
|
-
onUpdate: (a) => r({ ...e, packSize: a
|
|
34
|
+
fieldValue: e != null && e.packSize ? parseInt(e.packSize, 10) : "",
|
|
35
|
+
onUpdate: (a) => r({ ...e, packSize: a ? a.toString() : "" }),
|
|
36
36
|
min: 0,
|
|
37
37
|
max: 4e3
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanPerformanceSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanPerformanceSettings.tsx"],"sourcesContent":["import classes from './PlanSettings.module.scss';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\n\r\ninterface PlanPerformanceSettingsProps {\r\n plan: NewPlanSettings;\r\n onUpdate: (perfSettings: NewPlanSettings['settings']['performance']) => void;\r\n}\r\n\r\nconst PlanPerformanceSettings = ({ plan, onUpdate }: PlanPerformanceSettingsProps) => {\r\n const perfSettings = plan.settings?.performance || {};\r\n return (\r\n <>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Max Processor Cores\"\r\n fieldValue={perfSettings?.maxProcessor || ''}\r\n onUpdate={(val) => onUpdate({ ...perfSettings, maxProcessor: val })}\r\n min={0}\r\n max={64}\r\n hint=\"Keep 0 or empty to use all cores\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Read Concurrency\"\r\n fieldValue={perfSettings?.readConcurrency || ''}\r\n onUpdate={(val) => onUpdate({ ...perfSettings, readConcurrency: val })}\r\n min={0}\r\n hint=\"Read n files Concurrently. Default: 2\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Packet Size (MB)\"\r\n fieldValue={perfSettings?.packSize ? parseInt(perfSettings.packSize
|
|
1
|
+
{"version":3,"file":"PlanPerformanceSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanPerformanceSettings.tsx"],"sourcesContent":["import classes from './PlanSettings.module.scss';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\n\r\ninterface PlanPerformanceSettingsProps {\r\n plan: NewPlanSettings;\r\n onUpdate: (perfSettings: NewPlanSettings['settings']['performance']) => void;\r\n}\r\n\r\nconst PlanPerformanceSettings = ({ plan, onUpdate }: PlanPerformanceSettingsProps) => {\r\n const perfSettings = plan.settings?.performance || {};\r\n return (\r\n <>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Max Processor Cores\"\r\n fieldValue={perfSettings?.maxProcessor || ''}\r\n onUpdate={(val) => onUpdate({ ...perfSettings, maxProcessor: val })}\r\n min={0}\r\n max={64}\r\n hint=\"Keep 0 or empty to use all cores\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Read Concurrency\"\r\n fieldValue={perfSettings?.readConcurrency || ''}\r\n onUpdate={(val) => onUpdate({ ...perfSettings, readConcurrency: val })}\r\n min={0}\r\n hint=\"Read n files Concurrently. Default: 2\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Packet Size (MB)\"\r\n fieldValue={perfSettings?.packSize ? parseInt(perfSettings.packSize, 10) : ''}\r\n onUpdate={(val) => onUpdate({ ...perfSettings, packSize: val ? val.toString() : '' })}\r\n min={0}\r\n max={4000}\r\n />\r\n </div>\r\n\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Concurrent File Uploads\"\r\n fieldValue={perfSettings?.transfers || ''}\r\n onUpdate={(val) => onUpdate({ ...perfSettings, transfers: val })}\r\n min={0}\r\n max={100}\r\n hint=\"Default: 4\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Multi Thread Streams\"\r\n fieldValue={perfSettings?.multiThreadStream || ''}\r\n onUpdate={(val) => onUpdate({ ...perfSettings, multiThreadStream: val })}\r\n min={0}\r\n max={100}\r\n hint=\"Useful for large files. Default: 4\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Buffer Size (MB)\"\r\n fieldValue={perfSettings?.bufferSize ? parseInt(perfSettings.bufferSize.replace('M', ''), 10) : ''}\r\n onUpdate={(val) => onUpdate({ ...perfSettings, bufferSize: val ? val + 'M' : '' })}\r\n min={0}\r\n max={100}\r\n hint=\"In Megabytes. Helps with streaming large files. Default: 4\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <Toggle\r\n label=\"Scan Before Backup\"\r\n fieldValue={perfSettings.scan || false}\r\n onUpdate={(val: boolean) => onUpdate({ ...perfSettings, scan: val })}\r\n hint=\"Scan Before Backup for estimated Backup Time\"\r\n inline={true}\r\n />\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default PlanPerformanceSettings;\r\n"],"names":["PlanPerformanceSettings","plan","onUpdate","perfSettings","_a","jsxs","Fragment","jsx","classes","NumberInput","val","Toggle"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanSizeChart.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSizeChart/PlanSizeChart.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAgBjD,UAAU,kBAAkB;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,QAAA,MAAM,aAAa,GAAI,aAAa,kBAAkB,
|
|
1
|
+
{"version":3,"file":"PlanSizeChart.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSizeChart/PlanSizeChart.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAgBjD,UAAU,kBAAkB;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,QAAA,MAAM,aAAa,GAAI,aAAa,kBAAkB,4CA2IrD,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { Chart as
|
|
4
|
-
import { Line as
|
|
5
|
-
import
|
|
6
|
-
import { formatBytes as H, formatNumberToK as M, isDarkMode as
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
{ key: "7d", label: "7d", days: 7 },
|
|
11
|
-
{ key: "14d", label: "14d", days: 14 },
|
|
12
|
-
{ key: "1m", label: "1m", days: 30 },
|
|
13
|
-
{ key: "3m", label: "3m", days: 90 },
|
|
14
|
-
{ key: "6m", label: "6m", days: 180 }
|
|
15
|
-
], G = ({ backups:
|
|
16
|
-
const [
|
|
17
|
-
|
|
18
|
-
if (!
|
|
19
|
-
const e = (
|
|
20
|
-
|
|
1
|
+
import { jsxs as u, jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import { useState as g, useRef as S, useEffect as N, useMemo as D } from "react";
|
|
3
|
+
import { Chart as z, CategoryScale as R, LinearScale as w, PointElement as x, LineElement as L, Filler as A, Tooltip as B, Legend as E } from "../../../node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js";
|
|
4
|
+
import { Line as T } from "../../../node_modules/.pnpm/react-chartjs-2@5.3.1_chart.js@4.5.1_react@18.3.1/node_modules/react-chartjs-2/dist/index.js";
|
|
5
|
+
import I from "../../common/Icon/Icon.js";
|
|
6
|
+
import { formatBytes as H, formatNumberToK as M, isDarkMode as f } from "../../../utils/helpers.js";
|
|
7
|
+
import a from "./PlanSizeChart.module.scss.js";
|
|
8
|
+
z.register(R, w, x, L, A, B, E);
|
|
9
|
+
const p = [
|
|
10
|
+
{ key: "7d", label: "7d", labelFull: "7 days", days: 7 },
|
|
11
|
+
{ key: "14d", label: "14d", labelFull: "14 days", days: 14 },
|
|
12
|
+
{ key: "1m", label: "1m", labelFull: "1 month", days: 30 },
|
|
13
|
+
{ key: "3m", label: "3m", labelFull: "3 months", days: 90 },
|
|
14
|
+
{ key: "6m", label: "6m", labelFull: "6 months", days: 180 }
|
|
15
|
+
], G = ({ backups: l }) => {
|
|
16
|
+
const [y, b] = g("3m"), [i, d] = g(!1), c = S(null);
|
|
17
|
+
N(() => {
|
|
18
|
+
if (!i) return;
|
|
19
|
+
const e = (s) => {
|
|
20
|
+
c.current && !c.current.contains(s.target) && d(!1);
|
|
21
21
|
};
|
|
22
22
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
23
|
-
}, [
|
|
24
|
-
const
|
|
25
|
-
const e = Date.now() -
|
|
26
|
-
return [...
|
|
27
|
-
const
|
|
28
|
-
return !isNaN(
|
|
29
|
-
}).sort((
|
|
30
|
-
}, [
|
|
31
|
-
labels:
|
|
23
|
+
}, [i]);
|
|
24
|
+
const m = p.find((e) => e.key === y) || p[3], n = D(() => {
|
|
25
|
+
const e = Date.now() - m.days * 24 * 60 * 60 * 1e3;
|
|
26
|
+
return [...l && l.length === 1 ? [l[0], l[0]] : l || []].filter((o) => {
|
|
27
|
+
const t = new Date(o.started).getTime();
|
|
28
|
+
return !isNaN(t) && t >= e;
|
|
29
|
+
}).sort((o, t) => new Date(o.started).getTime() - new Date(t.started).getTime());
|
|
30
|
+
}, [l, m.days]), h = n.map((e) => new Date(e.started).toLocaleString()), C = n.map((e) => e.totalSize || 0), k = n.map((e) => e.totalFiles || 0), v = {
|
|
31
|
+
labels: h,
|
|
32
32
|
datasets: [
|
|
33
33
|
{
|
|
34
34
|
label: "Size",
|
|
@@ -45,7 +45,7 @@ const f = [
|
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
label: "Files",
|
|
48
|
-
data:
|
|
48
|
+
data: k,
|
|
49
49
|
yAxisID: "yFiles",
|
|
50
50
|
borderColor: "#9a9bff",
|
|
51
51
|
backgroundColor: "transparent",
|
|
@@ -58,7 +58,7 @@ const f = [
|
|
|
58
58
|
pointHoverBackgroundColor: "rgba(87, 90, 255, 1)"
|
|
59
59
|
}
|
|
60
60
|
]
|
|
61
|
-
},
|
|
61
|
+
}, F = {
|
|
62
62
|
responsive: !0,
|
|
63
63
|
animation: !1,
|
|
64
64
|
maintainAspectRatio: !1,
|
|
@@ -67,17 +67,17 @@ const f = [
|
|
|
67
67
|
legend: { display: !1 },
|
|
68
68
|
tooltip: {
|
|
69
69
|
displayColors: !1,
|
|
70
|
-
backgroundColor:
|
|
71
|
-
titleColor:
|
|
72
|
-
bodyColor:
|
|
70
|
+
backgroundColor: f ? "rgba(0, 0, 0, 0.9)" : "rgba(255, 255, 255, 1)",
|
|
71
|
+
titleColor: f ? "#fff" : "#666",
|
|
72
|
+
bodyColor: f ? "#ccc" : "#888",
|
|
73
73
|
padding: 8,
|
|
74
74
|
titleFont: { size: 11 },
|
|
75
75
|
bodyFont: { size: 11 },
|
|
76
76
|
callbacks: {
|
|
77
77
|
title: (e) => {
|
|
78
|
-
var
|
|
79
|
-
const
|
|
80
|
-
return
|
|
78
|
+
var t;
|
|
79
|
+
const s = ((t = e[0]) == null ? void 0 : t.dataIndex) ?? 0, o = n[s];
|
|
80
|
+
return o ? new Date(o.started).toLocaleString() : "";
|
|
81
81
|
},
|
|
82
82
|
label: (e) => e.dataset.label === "Size" ? `Size: ${H(e.parsed.y || 0)}` : `Files: ${M(e.parsed.y || 0)}`
|
|
83
83
|
}
|
|
@@ -89,25 +89,25 @@ const f = [
|
|
|
89
89
|
yFiles: { display: !1, beginAtZero: !0, position: "right" }
|
|
90
90
|
}
|
|
91
91
|
};
|
|
92
|
-
return /* @__PURE__ */
|
|
93
|
-
/* @__PURE__ */
|
|
94
|
-
/* @__PURE__ */
|
|
95
|
-
|
|
92
|
+
return /* @__PURE__ */ u("div", { className: a.chartWrap, children: [
|
|
93
|
+
/* @__PURE__ */ u("div", { className: a.rangeSelector, ref: c, children: [
|
|
94
|
+
/* @__PURE__ */ r("button", { type: "button", className: a.rangeBtn, onClick: () => d((e) => !e), children: m.label }),
|
|
95
|
+
i && /* @__PURE__ */ r("ul", { className: a.rangeMenu, children: p.slice().reverse().map((e) => /* @__PURE__ */ r(
|
|
96
96
|
"li",
|
|
97
97
|
{
|
|
98
|
-
className: e.key ===
|
|
98
|
+
className: e.key === y ? a.active : "",
|
|
99
99
|
onClick: () => {
|
|
100
|
-
b(e.key),
|
|
100
|
+
b(e.key), d(!1);
|
|
101
101
|
},
|
|
102
|
-
children: e.
|
|
102
|
+
children: e.labelFull
|
|
103
103
|
},
|
|
104
104
|
e.key
|
|
105
105
|
)) })
|
|
106
106
|
] }),
|
|
107
|
-
|
|
108
|
-
/* @__PURE__ */
|
|
107
|
+
n.length === 0 ? /* @__PURE__ */ u("div", { className: a.empty, children: [
|
|
108
|
+
/* @__PURE__ */ r(I, { type: "folders", size: 16 }),
|
|
109
109
|
" No data in range"
|
|
110
|
-
] }) : /* @__PURE__ */
|
|
110
|
+
] }) : /* @__PURE__ */ r("div", { className: a.chartCanvas, children: /* @__PURE__ */ r(T, { data: v, options: F }) })
|
|
111
111
|
] });
|
|
112
112
|
};
|
|
113
113
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanSizeChart.js","sources":["../../../../src/components/Plan/PlanSizeChart/PlanSizeChart.tsx"],"sourcesContent":["import { useMemo, useRef, useState, useEffect } from 'react';\r\nimport { Chart as ChartJS, CategoryScale, LinearScale, PointElement, LineElement, Filler, Tooltip, Legend, ChartOptions } from 'chart.js';\r\nimport { Line } from 'react-chartjs-2';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport { Backup } from '../../../@types/backups';\r\nimport { formatBytes, formatNumberToK, isDarkMode } from '../../../utils/helpers';\r\nimport classes from './PlanSizeChart.module.scss';\r\n\r\nChartJS.register(CategoryScale, LinearScale, PointElement, LineElement, Filler, Tooltip, Legend);\r\n\r\ntype RangeKey = '7d' | '14d' | '1m' | '3m' | '6m';\r\n\r\nconst RANGE_OPTIONS: { key: RangeKey; label: string; days: number }[] = [\r\n { key: '7d', label: '7d', days: 7 },\r\n { key: '14d', label: '14d', days: 14 },\r\n { key: '1m', label: '1m', days: 30 },\r\n { key: '3m', label: '3m', days: 90 },\r\n { key: '6m', label: '6m', days: 180 },\r\n];\r\n\r\ninterface PlanSizeChartProps {\r\n backups: Backup[];\r\n}\r\n\r\nconst PlanSizeChart = ({ backups }: PlanSizeChartProps) => {\r\n const [range, setRange] = useState<RangeKey>('3m');\r\n const [open, setOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onClick = (e: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', onClick);\r\n return () => document.removeEventListener('mousedown', onClick);\r\n }, [open]);\r\n\r\n const activeRange = RANGE_OPTIONS.find((r) => r.key === range) || RANGE_OPTIONS[3];\r\n\r\n const filtered = useMemo(() => {\r\n const cutoff = Date.now() - activeRange.days * 24 * 60 * 60 * 1000;\r\n return [...(backups || [])]\r\n .filter((b) => {\r\n const t = new Date(b.started).getTime();\r\n return !isNaN(t) && t >= cutoff;\r\n })\r\n .sort((a, b) => new Date(a.started).getTime() - new Date(b.started).getTime());\r\n }, [backups, activeRange.days]);\r\n\r\n const labels = filtered.map((b) => new Date(b.started).toLocaleString());\r\n const sizeData = filtered.map((b) => b.totalSize || 0);\r\n const filesData = filtered.map((b) => b.totalFiles || 0);\r\n\r\n const data = {\r\n labels,\r\n datasets: [\r\n {\r\n label: 'Size',\r\n data: sizeData,\r\n yAxisID: 'ySize',\r\n borderColor: 'transparent',\r\n backgroundColor: 'rgba(87, 132, 255, 0.12)',\r\n fill: true,\r\n tension: 0.4,\r\n borderWidth: 1.5,\r\n pointRadius: 0,\r\n pointHoverRadius: 4,\r\n pointHoverBackgroundColor: 'rgba(87, 90, 255, 1)',\r\n },\r\n {\r\n label: 'Files',\r\n data: filesData,\r\n yAxisID: 'yFiles',\r\n borderColor: '#9a9bff',\r\n backgroundColor: 'transparent',\r\n borderDash: [3, 3],\r\n fill: false,\r\n tension: 0.4,\r\n borderWidth: 1.2,\r\n pointRadius: 0,\r\n pointHoverRadius: 4,\r\n pointHoverBackgroundColor: 'rgba(87, 90, 255, 1)',\r\n },\r\n ],\r\n };\r\n\r\n const options: ChartOptions<'line'> = {\r\n responsive: true,\r\n animation: false,\r\n maintainAspectRatio: false,\r\n interaction: { mode: 'index', intersect: false },\r\n plugins: {\r\n legend: { display: false },\r\n tooltip: {\r\n displayColors: false,\r\n backgroundColor: isDarkMode ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 1)',\r\n titleColor: isDarkMode ? '#fff' : '#666',\r\n bodyColor: isDarkMode ? '#ccc' : '#888',\r\n padding: 8,\r\n titleFont: { size: 11 },\r\n bodyFont: { size: 11 },\r\n callbacks: {\r\n title: (items) => {\r\n const idx = items[0]?.dataIndex ?? 0;\r\n const b = filtered[idx];\r\n return b ? new Date(b.started).toLocaleString() : '';\r\n },\r\n label: (ctx) => {\r\n if (ctx.dataset.label === 'Size') return `Size: ${formatBytes(ctx.parsed.y || 0)}`;\r\n return `Files: ${formatNumberToK(ctx.parsed.y || 0)}`;\r\n },\r\n },\r\n },\r\n },\r\n scales: {\r\n x: { display: false },\r\n ySize: { display: false, beginAtZero: true },\r\n yFiles: { display: false, beginAtZero: true, position: 'right' },\r\n },\r\n };\r\n\r\n return (\r\n <div className={classes.chartWrap}>\r\n <div className={classes.rangeSelector} ref={dropdownRef}>\r\n <button type=\"button\" className={classes.rangeBtn} onClick={() => setOpen((v) => !v)}>\r\n {activeRange.label}\r\n </button>\r\n {open && (\r\n <ul className={classes.rangeMenu}>\r\n {RANGE_OPTIONS.slice()\r\n .reverse()\r\n .map((opt) => (\r\n <li\r\n key={opt.key}\r\n className={opt.key === range ? classes.active : ''}\r\n onClick={() => {\r\n setRange(opt.key);\r\n setOpen(false);\r\n }}\r\n >\r\n {opt.label}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n {filtered.length === 0 ? (\r\n <div className={classes.empty}>\r\n <Icon type=\"folders\" size={16} /> No data in range\r\n </div>\r\n ) : (\r\n <div className={classes.chartCanvas}>\r\n <Line data={data} options={options} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanSizeChart;\r\n"],"names":["ChartJS","CategoryScale","LinearScale","PointElement","LineElement","Filler","Tooltip","Legend","RANGE_OPTIONS","PlanSizeChart","backups","range","setRange","useState","open","setOpen","dropdownRef","useRef","useEffect","onClick","e","activeRange","r","filtered","useMemo","cutoff","b","t","a","labels","sizeData","filesData","data","options","isDarkMode","items","idx","_a","ctx","formatBytes","formatNumberToK","jsxs","classes","jsx","v","opt","Icon","Line"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlanSizeChart.js","sources":["../../../../src/components/Plan/PlanSizeChart/PlanSizeChart.tsx"],"sourcesContent":["import { useMemo, useRef, useState, useEffect } from 'react';\r\nimport { Chart as ChartJS, CategoryScale, LinearScale, PointElement, LineElement, Filler, Tooltip, Legend, ChartOptions } from 'chart.js';\r\nimport { Line } from 'react-chartjs-2';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport { Backup } from '../../../@types/backups';\r\nimport { formatBytes, formatNumberToK, isDarkMode } from '../../../utils/helpers';\r\nimport classes from './PlanSizeChart.module.scss';\r\n\r\nChartJS.register(CategoryScale, LinearScale, PointElement, LineElement, Filler, Tooltip, Legend);\r\n\r\ntype RangeKey = '7d' | '14d' | '1m' | '3m' | '6m';\r\n\r\nconst RANGE_OPTIONS: { key: RangeKey; label: string; labelFull: string; days: number }[] = [\r\n { key: '7d', label: '7d', labelFull: '7 days', days: 7 },\r\n { key: '14d', label: '14d', labelFull: '14 days', days: 14 },\r\n { key: '1m', label: '1m', labelFull: '1 month', days: 30 },\r\n { key: '3m', label: '3m', labelFull: '3 months', days: 90 },\r\n { key: '6m', label: '6m', labelFull: '6 months', days: 180 },\r\n];\r\n\r\ninterface PlanSizeChartProps {\r\n backups: Backup[];\r\n}\r\n\r\nconst PlanSizeChart = ({ backups }: PlanSizeChartProps) => {\r\n const [range, setRange] = useState<RangeKey>('3m');\r\n const [open, setOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onClick = (e: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', onClick);\r\n return () => document.removeEventListener('mousedown', onClick);\r\n }, [open]);\r\n\r\n const activeRange = RANGE_OPTIONS.find((r) => r.key === range) || RANGE_OPTIONS[3];\r\n\r\n const filtered = useMemo(() => {\r\n const cutoff = Date.now() - activeRange.days * 24 * 60 * 60 * 1000;\r\n // if there is only one backup duplicate the first backup to make 2 items\r\n // so that the graph is never empty and shows the size even if there is only one backup in the selected range\r\n const theBackups = backups && backups.length === 1 ? [backups[0], backups[0]] : backups || [];\r\n return [...theBackups]\r\n .filter((b) => {\r\n const t = new Date(b.started).getTime();\r\n return !isNaN(t) && t >= cutoff;\r\n })\r\n .sort((a, b) => new Date(a.started).getTime() - new Date(b.started).getTime());\r\n }, [backups, activeRange.days]);\r\n\r\n const labels = filtered.map((b) => new Date(b.started).toLocaleString());\r\n const sizeData = filtered.map((b) => b.totalSize || 0);\r\n const filesData = filtered.map((b) => b.totalFiles || 0);\r\n\r\n const data = {\r\n labels,\r\n datasets: [\r\n {\r\n label: 'Size',\r\n data: sizeData,\r\n yAxisID: 'ySize',\r\n borderColor: 'transparent',\r\n backgroundColor: 'rgba(87, 132, 255, 0.12)',\r\n fill: true,\r\n tension: 0.4,\r\n borderWidth: 1.5,\r\n pointRadius: 0,\r\n pointHoverRadius: 4,\r\n pointHoverBackgroundColor: 'rgba(87, 90, 255, 1)',\r\n },\r\n {\r\n label: 'Files',\r\n data: filesData,\r\n yAxisID: 'yFiles',\r\n borderColor: '#9a9bff',\r\n backgroundColor: 'transparent',\r\n borderDash: [3, 3],\r\n fill: false,\r\n tension: 0.4,\r\n borderWidth: 1.2,\r\n pointRadius: 0,\r\n pointHoverRadius: 4,\r\n pointHoverBackgroundColor: 'rgba(87, 90, 255, 1)',\r\n },\r\n ],\r\n };\r\n\r\n const options: ChartOptions<'line'> = {\r\n responsive: true,\r\n animation: false,\r\n maintainAspectRatio: false,\r\n interaction: { mode: 'index', intersect: false },\r\n plugins: {\r\n legend: { display: false },\r\n tooltip: {\r\n displayColors: false,\r\n backgroundColor: isDarkMode ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 1)',\r\n titleColor: isDarkMode ? '#fff' : '#666',\r\n bodyColor: isDarkMode ? '#ccc' : '#888',\r\n padding: 8,\r\n titleFont: { size: 11 },\r\n bodyFont: { size: 11 },\r\n callbacks: {\r\n title: (items) => {\r\n const idx = items[0]?.dataIndex ?? 0;\r\n const b = filtered[idx];\r\n return b ? new Date(b.started).toLocaleString() : '';\r\n },\r\n label: (ctx) => {\r\n if (ctx.dataset.label === 'Size') return `Size: ${formatBytes(ctx.parsed.y || 0)}`;\r\n return `Files: ${formatNumberToK(ctx.parsed.y || 0)}`;\r\n },\r\n },\r\n },\r\n },\r\n scales: {\r\n x: { display: false },\r\n ySize: { display: false, beginAtZero: true },\r\n yFiles: { display: false, beginAtZero: true, position: 'right' },\r\n },\r\n };\r\n\r\n return (\r\n <div className={classes.chartWrap}>\r\n <div className={classes.rangeSelector} ref={dropdownRef}>\r\n <button type=\"button\" className={classes.rangeBtn} onClick={() => setOpen((v) => !v)}>\r\n {activeRange.label}\r\n </button>\r\n {open && (\r\n <ul className={classes.rangeMenu}>\r\n {RANGE_OPTIONS.slice()\r\n .reverse()\r\n .map((opt) => (\r\n <li\r\n key={opt.key}\r\n className={opt.key === range ? classes.active : ''}\r\n onClick={() => {\r\n setRange(opt.key);\r\n setOpen(false);\r\n }}\r\n >\r\n {opt.labelFull}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n {filtered.length === 0 ? (\r\n <div className={classes.empty}>\r\n <Icon type=\"folders\" size={16} /> No data in range\r\n </div>\r\n ) : (\r\n <div className={classes.chartCanvas}>\r\n <Line data={data} options={options} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanSizeChart;\r\n"],"names":["ChartJS","CategoryScale","LinearScale","PointElement","LineElement","Filler","Tooltip","Legend","RANGE_OPTIONS","PlanSizeChart","backups","range","setRange","useState","open","setOpen","dropdownRef","useRef","useEffect","onClick","e","activeRange","r","filtered","useMemo","cutoff","b","a","labels","sizeData","filesData","data","options","isDarkMode","items","idx","_a","ctx","formatBytes","formatNumberToK","jsxs","classes","jsx","v","opt","Icon","Line"],"mappings":"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"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
const a = "
|
|
1
|
+
const a = "_chartWrap_bo3py", t = "_chartCanvas_xBRxt", e = "_rangeSelector_6Z1Hx", n = "_rangeBtn_6fPjz", r = "_rangeMenu_xBLqh", c = "_active_oXxJW", s = "_empty_OstSL", o = {
|
|
2
2
|
chartWrap: a,
|
|
3
3
|
chartCanvas: t,
|
|
4
4
|
rangeSelector: e,
|
|
5
5
|
rangeBtn: n,
|
|
6
|
-
rangeMenu:
|
|
7
|
-
active:
|
|
6
|
+
rangeMenu: r,
|
|
7
|
+
active: c,
|
|
8
8
|
empty: s
|
|
9
9
|
};
|
|
10
10
|
export {
|
|
11
|
-
|
|
11
|
+
c as active,
|
|
12
12
|
t as chartCanvas,
|
|
13
13
|
a as chartWrap,
|
|
14
|
-
|
|
14
|
+
o as default,
|
|
15
15
|
s as empty,
|
|
16
16
|
n as rangeBtn,
|
|
17
|
-
|
|
17
|
+
r as rangeMenu,
|
|
18
18
|
e as rangeSelector
|
|
19
19
|
};
|
|
20
20
|
//# sourceMappingURL=PlanSizeChart.module.scss.js.map
|
|
@@ -1,34 +1,36 @@
|
|
|
1
|
-
const e = "
|
|
1
|
+
const e = "_fileManager_P4pn0", i = "_navigationBar_x4ZpO", t = "_currentPath_9bxS8", l = "_fileList_EuASU", n = "_empty_fDxgu", a = "_fileHeader_rdcxy", o = "_fileListContainer_865J4", f = "_fileRow_dcz21", _ = "_selected_K7B0e", s = "_fileName_8odvK", c = "_fileNameText_BEWX5", r = "_fileSize_InVxT", d = "_fileDate_dfRAk", m = "_loading_Wi2lx", g = "_mobileFileInfo_At6wj", x = {
|
|
2
2
|
fileManager: e,
|
|
3
3
|
navigationBar: i,
|
|
4
4
|
currentPath: t,
|
|
5
|
-
fileList:
|
|
6
|
-
empty:
|
|
7
|
-
fileHeader:
|
|
5
|
+
fileList: l,
|
|
6
|
+
empty: n,
|
|
7
|
+
fileHeader: a,
|
|
8
8
|
fileListContainer: o,
|
|
9
|
-
fileRow:
|
|
10
|
-
selected:
|
|
11
|
-
fileName:
|
|
9
|
+
fileRow: f,
|
|
10
|
+
selected: _,
|
|
11
|
+
fileName: s,
|
|
12
12
|
fileNameText: c,
|
|
13
13
|
fileSize: r,
|
|
14
|
+
fileDate: d,
|
|
14
15
|
loading: m,
|
|
15
|
-
mobileFileInfo:
|
|
16
|
+
mobileFileInfo: g
|
|
16
17
|
};
|
|
17
18
|
export {
|
|
18
19
|
t as currentPath,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
x as default,
|
|
21
|
+
n as empty,
|
|
22
|
+
d as fileDate,
|
|
23
|
+
a as fileHeader,
|
|
24
|
+
l as fileList,
|
|
23
25
|
o as fileListContainer,
|
|
24
26
|
e as fileManager,
|
|
25
|
-
|
|
27
|
+
s as fileName,
|
|
26
28
|
c as fileNameText,
|
|
27
|
-
|
|
29
|
+
f as fileRow,
|
|
28
30
|
r as fileSize,
|
|
29
31
|
m as loading,
|
|
30
|
-
|
|
32
|
+
g as mobileFileInfo,
|
|
31
33
|
i as navigationBar,
|
|
32
|
-
|
|
34
|
+
_ as selected
|
|
33
35
|
};
|
|
34
36
|
//# sourceMappingURL=FileManager.module.scss.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileManager.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FileManager.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|