@plutonhq/core-frontend 0.1.31 → 0.1.33
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/@types/plans.d.ts +4 -0
- package/dist-lib/@types/plans.d.ts.map +1 -1
- package/dist-lib/components/Plan/AddPlan/AddPlan.d.ts.map +1 -1
- package/dist-lib/components/Plan/AddPlan/AddPlan.js +29 -24
- package/dist-lib/components/Plan/AddPlan/AddPlan.js.map +1 -1
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.js +33 -33
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.js.map +1 -1
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.module.scss.js +36 -36
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.d.ts.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +63 -53
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js +32 -32
- package/dist-lib/components/Plan/Backups/Backups.d.ts.map +1 -1
- package/dist-lib/components/Plan/Backups/Backups.js +148 -144
- package/dist-lib/components/Plan/Backups/Backups.js.map +1 -1
- package/dist-lib/components/Plan/Backups/Backups.module.scss.js +34 -32
- package/dist-lib/components/Plan/Backups/Backups.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts +9 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts.map +1 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.js +117 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.js.map +1 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js +20 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts +4 -2
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanForm/PlanForm.js +33 -29
- package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts +2 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js +85 -57
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js +11 -9
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanItems/PlanItem.js +1 -1
- package/dist-lib/components/Plan/PlanItems/PlanItem.js.map +1 -1
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts +9 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.js +262 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.js.map +1 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js +14 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts +4 -2
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js +24 -22
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts +4 -2
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js +39 -28
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js +66 -64
- package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts +7 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js +116 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js.map +1 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js +20 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanStats/PlanStats.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanStats/PlanStats.js +29 -30
- package/dist-lib/components/Plan/PlanStats/PlanStats.js.map +1 -1
- package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js +16 -14
- package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js.map +1 -1
- package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
- package/dist-lib/components/common/Icon/Icon.js +395 -378
- package/dist-lib/components/common/Icon/Icon.js.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.d.ts +2 -1
- package/dist-lib/components/common/SortItems/SortItems.d.ts.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.js +14 -14
- package/dist-lib/components/common/SortItems/SortItems.js.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.module.scss.js +1 -1
- package/dist-lib/components/common/form/MultiSelect/MultiSelect.module.scss.js +16 -16
- package/dist-lib/components/index.d.ts +2 -0
- package/dist-lib/components/index.d.ts.map +1 -1
- package/dist-lib/components.js +199 -195
- package/dist-lib/components.js.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.js +22 -19
- package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
- package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js +449 -0
- package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js.map +1 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js +5219 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js.map +1 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js +1691 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js.map +1 -0
- package/dist-lib/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 +93 -0
- package/dist-lib/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.map +1 -0
- package/dist-lib/routes/Login/Login.d.ts.map +1 -1
- package/dist-lib/routes/Login/Login.js +45 -36
- package/dist-lib/routes/Login/Login.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.js +131 -118
- package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
- package/dist-lib/routes/Plans/Plans.d.ts.map +1 -1
- package/dist-lib/routes/Plans/Plans.js +77 -51
- package/dist-lib/routes/Plans/Plans.js.map +1 -1
- package/dist-lib/services/plans.d.ts +33 -5
- package/dist-lib/services/plans.d.ts.map +1 -1
- package/dist-lib/services/plans.js +92 -67
- package/dist-lib/services/plans.js.map +1 -1
- package/dist-lib/services.js +93 -91
- package/dist-lib/styles/core-frontend.css +1 -1
- package/dist-lib/styles/global.scss +4 -0
- package/dist-lib/utils/helpers.d.ts +2 -0
- package/dist-lib/utils/helpers.d.ts.map +1 -1
- package/dist-lib/utils/helpers.js +68 -42
- package/dist-lib/utils/helpers.js.map +1 -1
- package/dist-lib/utils.js +36 -34
- package/package.json +3 -1
- package/src/@types/plans.ts +5 -0
- package/src/components/Plan/AddPlan/AddPlan.tsx +22 -16
- package/src/components/Plan/BackupEvents/BackupEvents.module.scss +2 -0
- package/src/components/Plan/BackupEvents/BackupEvents.tsx +2 -2
- package/src/components/Plan/BackupProgress/BackupProgress.module.scss +1 -0
- package/src/components/Plan/BackupProgress/BackupProgress.tsx +7 -2
- package/src/components/Plan/Backups/Backups.module.scss +16 -0
- package/src/components/Plan/Backups/Backups.tsx +13 -2
- package/src/components/Plan/FilterPlans/FilterPlans.module.scss +65 -0
- package/src/components/Plan/FilterPlans/FilterPlans.tsx +126 -0
- package/src/components/Plan/PlanForm/PlanForm.tsx +7 -1
- package/src/components/Plan/PlanIntegrity/PlanIntegrity.module.scss +19 -0
- package/src/components/Plan/PlanIntegrity/PlanIntegrity.tsx +40 -3
- package/src/components/Plan/PlanItems/PlanItem.tsx +1 -1
- package/src/components/Plan/PlanRepair/PlanRepair.module.scss +53 -0
- package/src/components/Plan/PlanRepair/PlanRepair.tsx +243 -0
- package/src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx +6 -2
- package/src/components/Plan/PlanSettings/PlanGeneralSettings.tsx +14 -2
- package/src/components/Plan/PlanSettings/PlanSettings.module.scss +8 -0
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.module.scss +76 -0
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.tsx +163 -0
- package/src/components/Plan/PlanStats/PlanStats.module.scss +16 -2
- package/src/components/Plan/PlanStats/PlanStats.tsx +8 -11
- package/src/components/common/Icon/Icon.tsx +21 -0
- package/src/components/common/SortItems/SortItems.module.scss +3 -2
- package/src/components/common/SortItems/SortItems.tsx +6 -3
- package/src/components/common/form/MultiSelect/MultiSelect.module.scss +1 -0
- package/src/components/index.ts +2 -0
- package/src/hooks/usePlanSingleActions.tsx +26 -23
- package/src/routes/Login/Login.tsx +8 -2
- package/src/routes/PlanSingle/PlanSingle.tsx +17 -0
- package/src/routes/Plans/Plans.tsx +70 -35
- package/src/services/plans.ts +40 -4
- package/src/styles/global.scss +4 -0
- package/src/utils/helpers.ts +25 -0
|
@@ -1,56 +1,67 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
const
|
|
6
|
-
const { encryption:
|
|
7
|
-
return /* @__PURE__ */
|
|
8
|
-
/* @__PURE__ */
|
|
9
|
-
/* @__PURE__ */ e("label", { className:
|
|
1
|
+
import { jsxs as c, Fragment as t, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import m from "../../common/form/NumberInput/NumberInput.js";
|
|
3
|
+
import s from "../../common/form/Toggle/Toggle.js";
|
|
4
|
+
import a from "./PlanSettings.module.scss.js";
|
|
5
|
+
const k = ({ settings: r, onUpdate: i, isEditing: n, runSettings: o, setRunSettings: d }) => {
|
|
6
|
+
const { encryption: p, compression: f, retries: b, retryDelay: u } = r;
|
|
7
|
+
return /* @__PURE__ */ c(t, { children: [
|
|
8
|
+
/* @__PURE__ */ c("div", { className: a.field, children: [
|
|
9
|
+
/* @__PURE__ */ e("label", { className: a.label, children: "Encryption" }),
|
|
10
10
|
/* @__PURE__ */ e(
|
|
11
|
-
|
|
11
|
+
s,
|
|
12
12
|
{
|
|
13
|
-
fieldValue:
|
|
14
|
-
disabled:
|
|
15
|
-
onUpdate: (l) =>
|
|
13
|
+
fieldValue: p,
|
|
14
|
+
disabled: n,
|
|
15
|
+
onUpdate: (l) => i({ ...r, encryption: l }),
|
|
16
16
|
description: "Encrypt Source Files before backup"
|
|
17
17
|
}
|
|
18
18
|
)
|
|
19
19
|
] }),
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
/* @__PURE__ */ e("label", { className:
|
|
20
|
+
/* @__PURE__ */ c("div", { className: a.field, children: [
|
|
21
|
+
/* @__PURE__ */ e("label", { className: a.label, children: "Compression" }),
|
|
22
22
|
/* @__PURE__ */ e(
|
|
23
|
-
|
|
23
|
+
s,
|
|
24
24
|
{
|
|
25
|
-
fieldValue:
|
|
26
|
-
onUpdate: (l) =>
|
|
25
|
+
fieldValue: f,
|
|
26
|
+
onUpdate: (l) => i({ ...r, compression: l }),
|
|
27
27
|
description: "Compress Source Files before backup"
|
|
28
28
|
}
|
|
29
29
|
)
|
|
30
30
|
] }),
|
|
31
|
-
/* @__PURE__ */ e("div", { className:
|
|
32
|
-
|
|
31
|
+
/* @__PURE__ */ e("div", { className: a.field, children: /* @__PURE__ */ e(
|
|
32
|
+
m,
|
|
33
33
|
{
|
|
34
34
|
label: "Retries",
|
|
35
|
-
fieldValue:
|
|
36
|
-
onUpdate: (l) =>
|
|
35
|
+
fieldValue: b,
|
|
36
|
+
onUpdate: (l) => i({ ...r, retries: l }),
|
|
37
37
|
hint: "How many times a failed backups is retried. Default: 5.",
|
|
38
38
|
inline: !1
|
|
39
39
|
}
|
|
40
40
|
) }),
|
|
41
|
-
/* @__PURE__ */ e("div", { className:
|
|
42
|
-
|
|
41
|
+
/* @__PURE__ */ e("div", { className: a.field, children: /* @__PURE__ */ e(
|
|
42
|
+
m,
|
|
43
43
|
{
|
|
44
44
|
label: "Retries Delay",
|
|
45
|
-
fieldValue:
|
|
46
|
-
onUpdate: (l) =>
|
|
45
|
+
fieldValue: u,
|
|
46
|
+
onUpdate: (l) => i({ ...r, retryDelay: l }),
|
|
47
47
|
hint: "How long to wait before retrying a failed backup. Default: 300 seconds.",
|
|
48
48
|
inline: !1
|
|
49
49
|
}
|
|
50
|
-
) })
|
|
50
|
+
) }),
|
|
51
|
+
!n && d && /* @__PURE__ */ c("div", { className: `${a.field} ${a.runNowField}`, children: [
|
|
52
|
+
/* @__PURE__ */ e("label", { className: a.label, children: "Run Backup Now" }),
|
|
53
|
+
/* @__PURE__ */ e(
|
|
54
|
+
s,
|
|
55
|
+
{
|
|
56
|
+
fieldValue: (o == null ? void 0 : o.runNow) ?? !0,
|
|
57
|
+
onUpdate: (l) => d && d({ ...o, runNow: l }),
|
|
58
|
+
description: "Run backup immediately after creating the plan"
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
] })
|
|
51
62
|
] });
|
|
52
63
|
};
|
|
53
64
|
export {
|
|
54
|
-
|
|
65
|
+
k as default
|
|
55
66
|
};
|
|
56
67
|
//# sourceMappingURL=PlanGeneralSettings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanGeneralSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanGeneralSettings.tsx"],"sourcesContent":["import { NewPlanSettings } from '../../../@types/plans';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport classes from './PlanSettings.module.scss';\r\n\r\ninterface PlanGeneralSettingsProps {\r\n settings: NewPlanSettings['settings'];\r\n onUpdate: (settings: NewPlanSettings['settings']) => void;\r\n isEditing: boolean;\r\n}\r\n\r\nconst PlanGeneralSettings = ({ settings, onUpdate, isEditing }: PlanGeneralSettingsProps) => {\r\n const { encryption, compression, retries, retryDelay } = settings;\r\n return (\r\n <>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Encryption</label>\r\n <Toggle\r\n fieldValue={encryption}\r\n disabled={isEditing}\r\n onUpdate={(val: boolean) => onUpdate({ ...settings, encryption: val })}\r\n description=\"Encrypt Source Files before backup\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Compression</label>\r\n <Toggle\r\n fieldValue={compression}\r\n onUpdate={(val: boolean) => onUpdate({ ...settings, compression: val })}\r\n description=\"Compress Source Files before backup\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Retries\"\r\n fieldValue={retries}\r\n onUpdate={(val: number) => onUpdate({ ...settings, retries: val })}\r\n hint=\"How many times a failed backups is retried. Default: 5.\"\r\n inline={false}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Retries Delay\"\r\n fieldValue={retryDelay}\r\n onUpdate={(val: number) => onUpdate({ ...settings, retryDelay: val })}\r\n hint=\"How long to wait before retrying a failed backup. Default: 300 seconds.\"\r\n inline={false}\r\n />\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default PlanGeneralSettings;\r\n"],"names":["PlanGeneralSettings","settings","onUpdate","isEditing","encryption","compression","retries","retryDelay","jsxs","Fragment","classes","jsx","Toggle","val","NumberInput"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"PlanGeneralSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanGeneralSettings.tsx"],"sourcesContent":["import { NewPlanSettings, PlanAddRunSettings } from '../../../@types/plans';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport classes from './PlanSettings.module.scss';\r\n\r\ninterface PlanGeneralSettingsProps {\r\n settings: NewPlanSettings['settings'];\r\n onUpdate: (settings: NewPlanSettings['settings']) => void;\r\n isEditing: boolean;\r\n runSettings?: PlanAddRunSettings;\r\n setRunSettings?: (runSettings: PlanAddRunSettings) => void;\r\n}\r\n\r\nconst PlanGeneralSettings = ({ settings, onUpdate, isEditing, runSettings, setRunSettings }: PlanGeneralSettingsProps) => {\r\n const { encryption, compression, retries, retryDelay } = settings;\r\n return (\r\n <>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Encryption</label>\r\n <Toggle\r\n fieldValue={encryption}\r\n disabled={isEditing}\r\n onUpdate={(val: boolean) => onUpdate({ ...settings, encryption: val })}\r\n description=\"Encrypt Source Files before backup\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Compression</label>\r\n <Toggle\r\n fieldValue={compression}\r\n onUpdate={(val: boolean) => onUpdate({ ...settings, compression: val })}\r\n description=\"Compress Source Files before backup\"\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Retries\"\r\n fieldValue={retries}\r\n onUpdate={(val: number) => onUpdate({ ...settings, retries: val })}\r\n hint=\"How many times a failed backups is retried. Default: 5.\"\r\n inline={false}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Retries Delay\"\r\n fieldValue={retryDelay}\r\n onUpdate={(val: number) => onUpdate({ ...settings, retryDelay: val })}\r\n hint=\"How long to wait before retrying a failed backup. Default: 300 seconds.\"\r\n inline={false}\r\n />\r\n </div>\r\n {!isEditing && setRunSettings && (\r\n <div className={`${classes.field} ${classes.runNowField}`}>\r\n <label className={classes.label}>Run Backup Now</label>\r\n <Toggle\r\n fieldValue={runSettings?.runNow ?? true}\r\n onUpdate={(val: boolean) => setRunSettings && setRunSettings({ ...runSettings, runNow: val })}\r\n description={'Run backup immediately after creating the plan'}\r\n />\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default PlanGeneralSettings;\r\n"],"names":["PlanGeneralSettings","settings","onUpdate","isEditing","runSettings","setRunSettings","encryption","compression","retries","retryDelay","jsxs","Fragment","classes","jsx","Toggle","val","NumberInput"],"mappings":";;;;AAaA,MAAMA,IAAsB,CAAC,EAAE,UAAAC,GAAU,UAAAC,GAAU,WAAAC,GAAW,aAAAC,GAAa,gBAAAC,QAA+C;AACvH,QAAM,EAAE,YAAAC,GAAY,aAAAC,GAAa,SAAAC,GAAS,YAAAC,MAAeR;AACzD,SACG,gBAAAS,EAAAC,GAAA,EACG,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWE,EAAQ,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,cAAU;AAAA,MAC3C,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACE,YAAYR;AAAA,UACZ,UAAUH;AAAA,UACV,UAAU,CAACY,MAAiBb,EAAS,EAAE,GAAGD,GAAU,YAAYc,GAAK;AAAA,UACrE,aAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IACf,GACH;AAAA,IACA,gBAAAL,EAAC,OAAA,EAAI,WAAWE,EAAQ,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,eAAW;AAAA,MAC5C,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACE,YAAYP;AAAA,UACZ,UAAU,CAACQ,MAAiBb,EAAS,EAAE,GAAGD,GAAU,aAAac,GAAK;AAAA,UACtE,aAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IACf,GACH;AAAA,IACA,gBAAAF,EAAC,OAAA,EAAI,WAAWD,EAAQ,OACrB,UAAA,gBAAAC;AAAA,MAACG;AAAA,MAAA;AAAA,QACE,OAAM;AAAA,QACN,YAAYR;AAAA,QACZ,UAAU,CAACO,MAAgBb,EAAS,EAAE,GAAGD,GAAU,SAASc,GAAK;AAAA,QACjE,MAAK;AAAA,QACL,QAAQ;AAAA,MAAA;AAAA,IAAA,GAEd;AAAA,IACA,gBAAAF,EAAC,OAAA,EAAI,WAAWD,EAAQ,OACrB,UAAA,gBAAAC;AAAA,MAACG;AAAA,MAAA;AAAA,QACE,OAAM;AAAA,QACN,YAAYP;AAAA,QACZ,UAAU,CAACM,MAAgBb,EAAS,EAAE,GAAGD,GAAU,YAAYc,GAAK;AAAA,QACpE,MAAK;AAAA,QACL,QAAQ;AAAA,MAAA;AAAA,IAAA,GAEd;AAAA,IACC,CAACZ,KAAaE,KACZ,gBAAAK,EAAC,OAAA,EAAI,WAAW,GAAGE,EAAQ,KAAK,IAAIA,EAAQ,WAAW,IACpD,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,kBAAc;AAAA,MAC/C,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACE,aAAYV,KAAA,gBAAAA,EAAa,WAAU;AAAA,UACnC,UAAU,CAACW,MAAiBV,KAAkBA,EAAe,EAAE,GAAGD,GAAa,QAAQW,GAAK;AAAA,UAC5F,aAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAChB,EAAA,CACH;AAAA,EAAA,GAEN;AAEN;"}
|
|
@@ -1,78 +1,80 @@
|
|
|
1
|
-
const t = "
|
|
1
|
+
const t = "_field_dFRJC", i = "_fieldErrorLabel_jCO9z", e = "_fieldNotice_HFCZG", n = "_runNowField_mE2sZ", o = "_label_p1Fb5", c = "_forgetByAgeField_rBL8f", s = "_customPolicyOption_jQvbx", a = "_advancedTabContent_d73Ma", _ = "_advancedTabs_HrflJ", d = "_advancedTabActive_Q7VZD", r = "_advancedSettingsSelect_WwLFi", p = "_eventTabs_GPKQo", l = "_eventTab_DiaIH", T = "_eventTabHead_4bx94", b = "_eventTabHeadTitle_V6jPX", v = "_eventTabContent_YyHkl", f = "_addScriptButton_Vcv8Q", S = "_scriptItem_JwyjB", u = "_scriptHeader_cwVvq", g = "_scriptTitle_cGYF8", O = "_scriptPositionControls_j0iUF", m = "_scriptPathInput_8qOtG", F = "_scriptFooter_z1STm", B = "_scriptOptions_B16LV", C = "_scriptOptionCheckbox_tlpxA", N = "_removeScriptButton_aQASR", H = "_scriptOptionTimeout_vRASq", P = "_hasTimeOutSettings_tL0hS", h = "_timeoutSettings_BnDYx", x = "_notificationTestField_W7xP1", y = "_notificationSettingsSection_d179L", A = "_notificationToggle_O2kFq", I = "_notificationSettings_DnJv6", L = "_testNotificationContainer_uy7jp", w = "_testNotificationButton_rwXRI", j = "_disabled_BMTEz", k = "_testNotificationOptions_BgulU", E = {
|
|
2
2
|
field: t,
|
|
3
3
|
fieldErrorLabel: i,
|
|
4
4
|
fieldNotice: e,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
runNowField: n,
|
|
6
|
+
label: o,
|
|
7
|
+
forgetByAgeField: c,
|
|
8
|
+
customPolicyOption: s,
|
|
9
|
+
advancedTabContent: a,
|
|
10
|
+
advancedTabs: _,
|
|
11
|
+
advancedTabActive: d,
|
|
11
12
|
advancedSettingsSelect: r,
|
|
12
|
-
eventTabs:
|
|
13
|
-
eventTab:
|
|
14
|
-
eventTabHead:
|
|
15
|
-
eventTabHeadTitle:
|
|
16
|
-
eventTabContent:
|
|
17
|
-
addScriptButton:
|
|
18
|
-
scriptItem:
|
|
19
|
-
scriptHeader:
|
|
20
|
-
scriptTitle:
|
|
21
|
-
scriptPositionControls:
|
|
13
|
+
eventTabs: p,
|
|
14
|
+
eventTab: l,
|
|
15
|
+
eventTabHead: T,
|
|
16
|
+
eventTabHeadTitle: b,
|
|
17
|
+
eventTabContent: v,
|
|
18
|
+
addScriptButton: f,
|
|
19
|
+
scriptItem: S,
|
|
20
|
+
scriptHeader: u,
|
|
21
|
+
scriptTitle: g,
|
|
22
|
+
scriptPositionControls: O,
|
|
22
23
|
scriptPathInput: m,
|
|
23
|
-
scriptFooter:
|
|
24
|
-
scriptOptions:
|
|
25
|
-
scriptOptionCheckbox:
|
|
26
|
-
removeScriptButton:
|
|
27
|
-
scriptOptionTimeout:
|
|
28
|
-
hasTimeOutSettings:
|
|
29
|
-
timeoutSettings:
|
|
30
|
-
notificationTestField:
|
|
31
|
-
notificationSettingsSection:
|
|
32
|
-
notificationToggle:
|
|
33
|
-
notificationSettings:
|
|
34
|
-
testNotificationContainer:
|
|
35
|
-
testNotificationButton:
|
|
36
|
-
disabled:
|
|
37
|
-
testNotificationOptions:
|
|
24
|
+
scriptFooter: F,
|
|
25
|
+
scriptOptions: B,
|
|
26
|
+
scriptOptionCheckbox: C,
|
|
27
|
+
removeScriptButton: N,
|
|
28
|
+
scriptOptionTimeout: H,
|
|
29
|
+
hasTimeOutSettings: P,
|
|
30
|
+
timeoutSettings: h,
|
|
31
|
+
notificationTestField: x,
|
|
32
|
+
notificationSettingsSection: y,
|
|
33
|
+
notificationToggle: A,
|
|
34
|
+
notificationSettings: I,
|
|
35
|
+
testNotificationContainer: L,
|
|
36
|
+
testNotificationButton: w,
|
|
37
|
+
disabled: j,
|
|
38
|
+
testNotificationOptions: k
|
|
38
39
|
};
|
|
39
40
|
export {
|
|
40
|
-
|
|
41
|
+
f as addScriptButton,
|
|
41
42
|
r as advancedSettingsSelect,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
d as advancedTabActive,
|
|
44
|
+
a as advancedTabContent,
|
|
45
|
+
_ as advancedTabs,
|
|
46
|
+
s as customPolicyOption,
|
|
47
|
+
E as default,
|
|
48
|
+
j as disabled,
|
|
49
|
+
l as eventTab,
|
|
50
|
+
v as eventTabContent,
|
|
51
|
+
T as eventTabHead,
|
|
52
|
+
b as eventTabHeadTitle,
|
|
53
|
+
p as eventTabs,
|
|
53
54
|
t as field,
|
|
54
55
|
i as fieldErrorLabel,
|
|
55
56
|
e as fieldNotice,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
57
|
+
c as forgetByAgeField,
|
|
58
|
+
P as hasTimeOutSettings,
|
|
59
|
+
o as label,
|
|
60
|
+
I as notificationSettings,
|
|
61
|
+
y as notificationSettingsSection,
|
|
62
|
+
x as notificationTestField,
|
|
63
|
+
A as notificationToggle,
|
|
64
|
+
N as removeScriptButton,
|
|
65
|
+
n as runNowField,
|
|
66
|
+
F as scriptFooter,
|
|
67
|
+
u as scriptHeader,
|
|
68
|
+
S as scriptItem,
|
|
69
|
+
C as scriptOptionCheckbox,
|
|
70
|
+
H as scriptOptionTimeout,
|
|
71
|
+
B as scriptOptions,
|
|
70
72
|
m as scriptPathInput,
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
O as scriptPositionControls,
|
|
74
|
+
g as scriptTitle,
|
|
75
|
+
w as testNotificationButton,
|
|
76
|
+
L as testNotificationContainer,
|
|
77
|
+
k as testNotificationOptions,
|
|
78
|
+
h as timeoutSettings
|
|
77
79
|
};
|
|
78
80
|
//# sourceMappingURL=PlanSettings.module.scss.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanSettings.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PlanSettings.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Backup } from '../../../@types/backups';
|
|
2
|
+
interface PlanSizeChartProps {
|
|
3
|
+
backups: Backup[];
|
|
4
|
+
}
|
|
5
|
+
declare const PlanSizeChart: ({ backups }: PlanSizeChartProps) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export default PlanSizeChart;
|
|
7
|
+
//# sourceMappingURL=PlanSizeChart.d.ts.map
|
|
@@ -0,0 +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,4CAwIrD,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsxs as c, jsx as o } from "react/jsx-runtime";
|
|
2
|
+
import { useState as y, useRef as N, useEffect as D, useMemo as z } from "react";
|
|
3
|
+
import { Chart as R, CategoryScale as w, LinearScale as x, PointElement as F, LineElement as L, Filler as A, Tooltip as E, Legend as T } from "../../../node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js";
|
|
4
|
+
import { Line as I } 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 B from "../../common/Icon/Icon.js";
|
|
6
|
+
import { formatBytes as H, formatNumberToK as M, isDarkMode as m } from "../../../utils/helpers.js";
|
|
7
|
+
import r from "./PlanSizeChart.module.scss.js";
|
|
8
|
+
R.register(w, x, F, L, A, E, T);
|
|
9
|
+
const f = [
|
|
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: p }) => {
|
|
16
|
+
const [u, b] = y("3m"), [n, i] = y(!1), l = N(null);
|
|
17
|
+
D(() => {
|
|
18
|
+
if (!n) return;
|
|
19
|
+
const e = (t) => {
|
|
20
|
+
l.current && !l.current.contains(t.target) && i(!1);
|
|
21
|
+
};
|
|
22
|
+
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
23
|
+
}, [n]);
|
|
24
|
+
const d = f.find((e) => e.key === u) || f[3], s = z(() => {
|
|
25
|
+
const e = Date.now() - d.days * 24 * 60 * 60 * 1e3;
|
|
26
|
+
return [...p || []].filter((t) => {
|
|
27
|
+
const a = new Date(t.started).getTime();
|
|
28
|
+
return !isNaN(a) && a >= e;
|
|
29
|
+
}).sort((t, a) => new Date(t.started).getTime() - new Date(a.started).getTime());
|
|
30
|
+
}, [p, d.days]), k = s.map((e) => new Date(e.started).toLocaleString()), C = s.map((e) => e.totalSize || 0), h = s.map((e) => e.totalFiles || 0), v = {
|
|
31
|
+
labels: k,
|
|
32
|
+
datasets: [
|
|
33
|
+
{
|
|
34
|
+
label: "Size",
|
|
35
|
+
data: C,
|
|
36
|
+
yAxisID: "ySize",
|
|
37
|
+
borderColor: "transparent",
|
|
38
|
+
backgroundColor: "rgba(87, 132, 255, 0.12)",
|
|
39
|
+
fill: !0,
|
|
40
|
+
tension: 0.4,
|
|
41
|
+
borderWidth: 1.5,
|
|
42
|
+
pointRadius: 0,
|
|
43
|
+
pointHoverRadius: 4,
|
|
44
|
+
pointHoverBackgroundColor: "rgba(87, 90, 255, 1)"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
label: "Files",
|
|
48
|
+
data: h,
|
|
49
|
+
yAxisID: "yFiles",
|
|
50
|
+
borderColor: "#9a9bff",
|
|
51
|
+
backgroundColor: "transparent",
|
|
52
|
+
borderDash: [3, 3],
|
|
53
|
+
fill: !1,
|
|
54
|
+
tension: 0.4,
|
|
55
|
+
borderWidth: 1.2,
|
|
56
|
+
pointRadius: 0,
|
|
57
|
+
pointHoverRadius: 4,
|
|
58
|
+
pointHoverBackgroundColor: "rgba(87, 90, 255, 1)"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}, S = {
|
|
62
|
+
responsive: !0,
|
|
63
|
+
animation: !1,
|
|
64
|
+
maintainAspectRatio: !1,
|
|
65
|
+
interaction: { mode: "index", intersect: !1 },
|
|
66
|
+
plugins: {
|
|
67
|
+
legend: { display: !1 },
|
|
68
|
+
tooltip: {
|
|
69
|
+
displayColors: !1,
|
|
70
|
+
backgroundColor: m ? "rgba(0, 0, 0, 0.9)" : "rgba(255, 255, 255, 1)",
|
|
71
|
+
titleColor: m ? "#fff" : "#666",
|
|
72
|
+
bodyColor: m ? "#ccc" : "#888",
|
|
73
|
+
padding: 8,
|
|
74
|
+
titleFont: { size: 11 },
|
|
75
|
+
bodyFont: { size: 11 },
|
|
76
|
+
callbacks: {
|
|
77
|
+
title: (e) => {
|
|
78
|
+
var g;
|
|
79
|
+
const t = ((g = e[0]) == null ? void 0 : g.dataIndex) ?? 0, a = s[t];
|
|
80
|
+
return a ? new Date(a.started).toLocaleString() : "";
|
|
81
|
+
},
|
|
82
|
+
label: (e) => e.dataset.label === "Size" ? `Size: ${H(e.parsed.y || 0)}` : `Files: ${M(e.parsed.y || 0)}`
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
scales: {
|
|
87
|
+
x: { display: !1 },
|
|
88
|
+
ySize: { display: !1, beginAtZero: !0 },
|
|
89
|
+
yFiles: { display: !1, beginAtZero: !0, position: "right" }
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
return /* @__PURE__ */ c("div", { className: r.chartWrap, children: [
|
|
93
|
+
/* @__PURE__ */ c("div", { className: r.rangeSelector, ref: l, children: [
|
|
94
|
+
/* @__PURE__ */ o("button", { type: "button", className: r.rangeBtn, onClick: () => i((e) => !e), children: d.label }),
|
|
95
|
+
n && /* @__PURE__ */ o("ul", { className: r.rangeMenu, children: f.slice().reverse().map((e) => /* @__PURE__ */ o(
|
|
96
|
+
"li",
|
|
97
|
+
{
|
|
98
|
+
className: e.key === u ? r.active : "",
|
|
99
|
+
onClick: () => {
|
|
100
|
+
b(e.key), i(!1);
|
|
101
|
+
},
|
|
102
|
+
children: e.label
|
|
103
|
+
},
|
|
104
|
+
e.key
|
|
105
|
+
)) })
|
|
106
|
+
] }),
|
|
107
|
+
s.length === 0 ? /* @__PURE__ */ c("div", { className: r.empty, children: [
|
|
108
|
+
/* @__PURE__ */ o(B, { type: "folders", size: 16 }),
|
|
109
|
+
" No data in range"
|
|
110
|
+
] }) : /* @__PURE__ */ o("div", { className: r.chartCanvas, children: /* @__PURE__ */ o(I, { data: v, options: S }) })
|
|
111
|
+
] });
|
|
112
|
+
};
|
|
113
|
+
export {
|
|
114
|
+
G as default
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=PlanSizeChart.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const a = "_chartWrap_slogW", t = "_chartCanvas_SAnEg", e = "_rangeSelector_CX7xw", n = "_rangeBtn_w8xWx", c = "_rangeMenu_JfD7U", r = "_active_8N8Tg", s = "_empty_xcKM5", _ = {
|
|
2
|
+
chartWrap: a,
|
|
3
|
+
chartCanvas: t,
|
|
4
|
+
rangeSelector: e,
|
|
5
|
+
rangeBtn: n,
|
|
6
|
+
rangeMenu: c,
|
|
7
|
+
active: r,
|
|
8
|
+
empty: s
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
r as active,
|
|
12
|
+
t as chartCanvas,
|
|
13
|
+
a as chartWrap,
|
|
14
|
+
_ as default,
|
|
15
|
+
s as empty,
|
|
16
|
+
n as rangeBtn,
|
|
17
|
+
c as rangeMenu,
|
|
18
|
+
e as rangeSelector
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=PlanSizeChart.module.scss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanSizeChart.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanStats.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanStats/PlanStats.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"PlanStats.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanStats/PlanStats.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAQ7C,UAAU,cAAc;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,GAAG,CAAC;CACtB;AAED,QAAA,MAAM,SAAS,GAAI,kCAAkC,cAAc,4CAqElE,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { jsxs as i, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import
|
|
3
|
-
import { formatIntervalDisplay as
|
|
4
|
-
import
|
|
2
|
+
import n from "../../common/Icon/Icon.js";
|
|
3
|
+
import { formatIntervalDisplay as y, formatNumberToK as S, formatBytes as u } from "../../../utils/helpers.js";
|
|
4
|
+
import z from "../PlanHistory/PlanHistory.js";
|
|
5
|
+
import b from "../PlanSizeChart/PlanSizeChart.js";
|
|
5
6
|
import t from "./PlanStats.module.scss.js";
|
|
6
|
-
import
|
|
7
|
-
const
|
|
8
|
-
const { sourceConfig: a, storage:
|
|
7
|
+
import x from "../PlanStorageInfo/PlanStorageInfo.js";
|
|
8
|
+
const F = ({ plan: o, isSync: r, lastBackupItem: s }) => {
|
|
9
|
+
const { sourceConfig: a, storage: p, storagePath: m, isActive: h, settings: v } = o, { interval: g } = v, f = (s == null ? void 0 : s.totalFiles) || 0, N = (s == null ? void 0 : s.totalSize) || 0, T = (l) => {
|
|
9
10
|
let d = "";
|
|
10
11
|
return l && l.includes && l.includes.length > 0 && (d += "<div><strong>Includes</strong></div>", d += l.includes.map((c) => `<div>${o.device.name} -> ${c}</div>`).join("")), l && l.excludes && l.excludes.length > 0 && (d += "<div><strong>Excludes</strong></div>", d += l.excludes.map((c) => `<div>${c}</div>`).join("")), d;
|
|
11
12
|
};
|
|
12
13
|
return /* @__PURE__ */ i("div", { className: t.planStats, children: [
|
|
13
14
|
/* @__PURE__ */ i("div", { className: t.sources, children: [
|
|
14
15
|
/* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
|
|
15
|
-
/* @__PURE__ */ e(
|
|
16
|
+
/* @__PURE__ */ e(n, { type: "backup", size: 12 }),
|
|
16
17
|
" ",
|
|
17
18
|
r ? "Syncing" : "Backing Up"
|
|
18
19
|
] }),
|
|
19
20
|
/* @__PURE__ */ i("div", { className: t.sourceContent, children: [
|
|
20
|
-
/* @__PURE__ */ i("div", { "data-tooltip-id": "htmlToolTip", "data-tooltip-place": "top", "data-tooltip-html":
|
|
21
|
-
/* @__PURE__ */ e(
|
|
21
|
+
/* @__PURE__ */ i("div", { "data-tooltip-id": "htmlToolTip", "data-tooltip-place": "top", "data-tooltip-html": T(a), children: [
|
|
22
|
+
/* @__PURE__ */ e(n, { type: "folders", size: 18 }),
|
|
22
23
|
/* @__PURE__ */ i("span", { children: [
|
|
23
24
|
a == null ? void 0 : a.includes.length,
|
|
24
25
|
" Sources"
|
|
@@ -29,52 +30,50 @@ const A = ({ plan: o, isSync: r, lastBackupItem: n }) => {
|
|
|
29
30
|
{
|
|
30
31
|
"data-tooltip-id": "htmlToolTip",
|
|
31
32
|
"data-tooltip-place": "top",
|
|
32
|
-
"data-tooltip-html": h ? `${r ? "Syncing" : "Copying"} changes ${
|
|
33
|
+
"data-tooltip-html": h ? `${r ? "Syncing" : "Copying"} changes ${y(g)}` : "Plan is Not Active",
|
|
33
34
|
children: [
|
|
34
|
-
/* @__PURE__ */ e(
|
|
35
|
+
/* @__PURE__ */ e(n, { type: h ? r ? "reload" : "copy" : "pause", size: 16 }),
|
|
35
36
|
/* @__PURE__ */ e("div", { className: t.sourceArrow, children: "→" })
|
|
36
37
|
]
|
|
37
38
|
}
|
|
38
39
|
),
|
|
39
40
|
/* @__PURE__ */ e(
|
|
40
|
-
|
|
41
|
+
x,
|
|
41
42
|
{
|
|
42
43
|
disableTooltip: !1,
|
|
43
44
|
inline: !1,
|
|
44
45
|
replicationSettings: o.settings.replication,
|
|
45
|
-
storage:
|
|
46
|
-
storagePath:
|
|
46
|
+
storage: p,
|
|
47
|
+
storagePath: m
|
|
47
48
|
}
|
|
48
49
|
)
|
|
49
50
|
] })
|
|
50
51
|
] }),
|
|
51
52
|
/* @__PURE__ */ i("div", { className: t.snapshots, children: [
|
|
52
53
|
/* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
|
|
53
|
-
/* @__PURE__ */ e(
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
/* @__PURE__ */ e("
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
/* @__PURE__ */ i("div", { children: [
|
|
63
|
-
/* @__PURE__ */ e("span", { children: v ? z(v) : "0.00B" }),
|
|
64
|
-
/* @__PURE__ */ e("span", { children: "Size" })
|
|
54
|
+
/* @__PURE__ */ e(n, { type: "folders", size: 12 }),
|
|
55
|
+
" Stats",
|
|
56
|
+
" ",
|
|
57
|
+
/* @__PURE__ */ i("span", { className: t.widgetSubTitle, children: [
|
|
58
|
+
S(f),
|
|
59
|
+
" files ",
|
|
60
|
+
/* @__PURE__ */ e("i", { children: "|" }),
|
|
61
|
+
" ",
|
|
62
|
+
u(N)
|
|
65
63
|
] })
|
|
66
|
-
] })
|
|
64
|
+
] }),
|
|
65
|
+
/* @__PURE__ */ e("div", { className: t.snapshotsContent, children: /* @__PURE__ */ e(b, { backups: o.backups }) })
|
|
67
66
|
] }),
|
|
68
67
|
/* @__PURE__ */ i("div", { className: t.health, children: [
|
|
69
68
|
/* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
|
|
70
|
-
/* @__PURE__ */ e(
|
|
69
|
+
/* @__PURE__ */ e(n, { type: "speed", size: 12 }),
|
|
71
70
|
" Health"
|
|
72
71
|
] }),
|
|
73
|
-
/* @__PURE__ */ e("div", { className: t.healthContent, children: /* @__PURE__ */ e(
|
|
72
|
+
/* @__PURE__ */ e("div", { className: t.healthContent, children: /* @__PURE__ */ e(z, { planId: o.id, history: o.backups, itemsCount: 90 }) })
|
|
74
73
|
] })
|
|
75
74
|
] });
|
|
76
75
|
};
|
|
77
76
|
export {
|
|
78
|
-
|
|
77
|
+
F as default
|
|
79
78
|
};
|
|
80
79
|
//# sourceMappingURL=PlanStats.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanStats.js","sources":["../../../../src/components/Plan/PlanStats/PlanStats.tsx"],"sourcesContent":["import Icon from '../../common/Icon/Icon';\r\nimport { Plan } from '../../../@types/plans';\r\nimport {
|
|
1
|
+
{"version":3,"file":"PlanStats.js","sources":["../../../../src/components/Plan/PlanStats/PlanStats.tsx"],"sourcesContent":["import Icon from '../../common/Icon/Icon';\r\nimport { Plan } from '../../../@types/plans';\r\nimport { formatIntervalDisplay } from '../../../utils/helpers';\r\nimport PlanHistory from '../PlanHistory/PlanHistory';\r\nimport PlanSizeChart from '../PlanSizeChart/PlanSizeChart';\r\nimport classes from './PlanStats.module.scss';\r\nimport PlanStorageInfo from '../PlanStorageInfo/PlanStorageInfo';\r\nimport { formatBytes, formatNumberToK } from '../../../utils/helpers';\r\n\r\ninterface PlanStatsProps {\r\n plan: Plan;\r\n isSync: boolean;\r\n lastBackupItem: any;\r\n}\r\n\r\nconst PlanStats = ({ plan, isSync, lastBackupItem }: PlanStatsProps) => {\r\n const { sourceConfig, storage, storagePath, isActive, settings } = plan;\r\n const { interval } = settings;\r\n\r\n const totalFiles = lastBackupItem?.totalFiles || 0;\r\n const totalSize = lastBackupItem?.totalSize || 0;\r\n\r\n const sourceTooltipHTML = (sources: Plan['sourceConfig']) => {\r\n let html = '';\r\n if (sources && sources.includes && sources.includes.length > 0) {\r\n html += `<div><strong>Includes</strong></div>`;\r\n html += sources.includes.map((p) => `<div>${plan.device.name} -> ${p}</div>`).join('');\r\n }\r\n if (sources && sources.excludes && sources.excludes.length > 0) {\r\n html += `<div><strong>Excludes</strong></div>`;\r\n html += sources.excludes.map((p) => `<div>${p}</div>`).join('');\r\n }\r\n return html;\r\n };\r\n\r\n return (\r\n <div className={classes.planStats}>\r\n <div className={classes.sources}>\r\n <div className={classes.widgetTitle}>\r\n <Icon type=\"backup\" size={12} /> {isSync ? 'Syncing' : 'Backing Up'}\r\n </div>\r\n <div className={classes.sourceContent}>\r\n <div data-tooltip-id=\"htmlToolTip\" data-tooltip-place=\"top\" data-tooltip-html={sourceTooltipHTML(sourceConfig)}>\r\n <Icon type=\"folders\" size={18} />\r\n <span>{sourceConfig?.includes.length} Sources</span>\r\n </div>\r\n <div\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={isActive ? `${isSync ? 'Syncing' : 'Copying'} changes ${formatIntervalDisplay(interval)}` : 'Plan is Not Active'}\r\n >\r\n <Icon type={isActive ? (isSync ? 'reload' : 'copy') : 'pause'} size={16} />\r\n <div className={classes.sourceArrow}>→</div>\r\n </div>\r\n <PlanStorageInfo\r\n disableTooltip={false}\r\n inline={false}\r\n replicationSettings={plan.settings.replication}\r\n storage={storage}\r\n storagePath={storagePath}\r\n />\r\n </div>\r\n </div>\r\n <div className={classes.snapshots}>\r\n <div className={classes.widgetTitle}>\r\n <Icon type=\"folders\" size={12} /> Stats{' '}\r\n <span className={classes.widgetSubTitle}>\r\n {formatNumberToK(totalFiles)} files <i>|</i> {formatBytes(totalSize)}\r\n </span>\r\n </div>\r\n <div className={classes.snapshotsContent}>\r\n <PlanSizeChart backups={plan.backups} />\r\n </div>\r\n </div>\r\n <div className={classes.health}>\r\n <div className={classes.widgetTitle}>\r\n <Icon type=\"speed\" size={12} /> Health\r\n </div>\r\n <div className={classes.healthContent}>\r\n <PlanHistory planId={plan.id} history={plan.backups} itemsCount={90} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanStats;\r\n"],"names":["PlanStats","plan","isSync","lastBackupItem","sourceConfig","storage","storagePath","isActive","settings","interval","totalFiles","totalSize","sourceTooltipHTML","sources","html","p","jsxs","classes","jsx","Icon","formatIntervalDisplay","PlanStorageInfo","formatNumberToK","formatBytes","PlanSizeChart","PlanHistory"],"mappings":"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"}
|