@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.
Files changed (143) hide show
  1. package/dist-lib/@types/plans.d.ts +4 -0
  2. package/dist-lib/@types/plans.d.ts.map +1 -1
  3. package/dist-lib/components/Plan/AddPlan/AddPlan.d.ts.map +1 -1
  4. package/dist-lib/components/Plan/AddPlan/AddPlan.js +29 -24
  5. package/dist-lib/components/Plan/AddPlan/AddPlan.js.map +1 -1
  6. package/dist-lib/components/Plan/BackupEvents/BackupEvents.js +33 -33
  7. package/dist-lib/components/Plan/BackupEvents/BackupEvents.js.map +1 -1
  8. package/dist-lib/components/Plan/BackupEvents/BackupEvents.module.scss.js +36 -36
  9. package/dist-lib/components/Plan/BackupProgress/BackupProgress.d.ts.map +1 -1
  10. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +63 -53
  11. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
  12. package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js +32 -32
  13. package/dist-lib/components/Plan/Backups/Backups.d.ts.map +1 -1
  14. package/dist-lib/components/Plan/Backups/Backups.js +148 -144
  15. package/dist-lib/components/Plan/Backups/Backups.js.map +1 -1
  16. package/dist-lib/components/Plan/Backups/Backups.module.scss.js +34 -32
  17. package/dist-lib/components/Plan/Backups/Backups.module.scss.js.map +1 -1
  18. package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts +9 -0
  19. package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts.map +1 -0
  20. package/dist-lib/components/Plan/FilterPlans/FilterPlans.js +117 -0
  21. package/dist-lib/components/Plan/FilterPlans/FilterPlans.js.map +1 -0
  22. package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js +20 -0
  23. package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js.map +1 -0
  24. package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts +4 -2
  25. package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
  26. package/dist-lib/components/Plan/PlanForm/PlanForm.js +33 -29
  27. package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
  28. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts +2 -1
  29. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts.map +1 -1
  30. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js +85 -57
  31. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js.map +1 -1
  32. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js +11 -9
  33. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js.map +1 -1
  34. package/dist-lib/components/Plan/PlanItems/PlanItem.js +1 -1
  35. package/dist-lib/components/Plan/PlanItems/PlanItem.js.map +1 -1
  36. package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts +9 -0
  37. package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts.map +1 -0
  38. package/dist-lib/components/Plan/PlanRepair/PlanRepair.js +262 -0
  39. package/dist-lib/components/Plan/PlanRepair/PlanRepair.js.map +1 -0
  40. package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js +14 -0
  41. package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js.map +1 -0
  42. package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts +4 -2
  43. package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts.map +1 -1
  44. package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js +24 -22
  45. package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js.map +1 -1
  46. package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts +4 -2
  47. package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts.map +1 -1
  48. package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js +39 -28
  49. package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js.map +1 -1
  50. package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js +66 -64
  51. package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js.map +1 -1
  52. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts +7 -0
  53. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts.map +1 -0
  54. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js +116 -0
  55. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js.map +1 -0
  56. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js +20 -0
  57. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js.map +1 -0
  58. package/dist-lib/components/Plan/PlanStats/PlanStats.d.ts.map +1 -1
  59. package/dist-lib/components/Plan/PlanStats/PlanStats.js +29 -30
  60. package/dist-lib/components/Plan/PlanStats/PlanStats.js.map +1 -1
  61. package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js +16 -14
  62. package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js.map +1 -1
  63. package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
  64. package/dist-lib/components/common/Icon/Icon.js +395 -378
  65. package/dist-lib/components/common/Icon/Icon.js.map +1 -1
  66. package/dist-lib/components/common/SortItems/SortItems.d.ts +2 -1
  67. package/dist-lib/components/common/SortItems/SortItems.d.ts.map +1 -1
  68. package/dist-lib/components/common/SortItems/SortItems.js +14 -14
  69. package/dist-lib/components/common/SortItems/SortItems.js.map +1 -1
  70. package/dist-lib/components/common/SortItems/SortItems.module.scss.js +1 -1
  71. package/dist-lib/components/common/form/MultiSelect/MultiSelect.module.scss.js +16 -16
  72. package/dist-lib/components/index.d.ts +2 -0
  73. package/dist-lib/components/index.d.ts.map +1 -1
  74. package/dist-lib/components.js +199 -195
  75. package/dist-lib/components.js.map +1 -1
  76. package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
  77. package/dist-lib/hooks/usePlanSingleActions.js +22 -19
  78. package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
  79. package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js +449 -0
  80. package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js.map +1 -0
  81. package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js +5219 -0
  82. package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js.map +1 -0
  83. package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js +1691 -0
  84. package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js.map +1 -0
  85. 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
  86. 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
  87. package/dist-lib/routes/Login/Login.d.ts.map +1 -1
  88. package/dist-lib/routes/Login/Login.js +45 -36
  89. package/dist-lib/routes/Login/Login.js.map +1 -1
  90. package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
  91. package/dist-lib/routes/PlanSingle/PlanSingle.js +131 -118
  92. package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
  93. package/dist-lib/routes/Plans/Plans.d.ts.map +1 -1
  94. package/dist-lib/routes/Plans/Plans.js +77 -51
  95. package/dist-lib/routes/Plans/Plans.js.map +1 -1
  96. package/dist-lib/services/plans.d.ts +33 -5
  97. package/dist-lib/services/plans.d.ts.map +1 -1
  98. package/dist-lib/services/plans.js +92 -67
  99. package/dist-lib/services/plans.js.map +1 -1
  100. package/dist-lib/services.js +93 -91
  101. package/dist-lib/styles/core-frontend.css +1 -1
  102. package/dist-lib/styles/global.scss +4 -0
  103. package/dist-lib/utils/helpers.d.ts +2 -0
  104. package/dist-lib/utils/helpers.d.ts.map +1 -1
  105. package/dist-lib/utils/helpers.js +68 -42
  106. package/dist-lib/utils/helpers.js.map +1 -1
  107. package/dist-lib/utils.js +36 -34
  108. package/package.json +3 -1
  109. package/src/@types/plans.ts +5 -0
  110. package/src/components/Plan/AddPlan/AddPlan.tsx +22 -16
  111. package/src/components/Plan/BackupEvents/BackupEvents.module.scss +2 -0
  112. package/src/components/Plan/BackupEvents/BackupEvents.tsx +2 -2
  113. package/src/components/Plan/BackupProgress/BackupProgress.module.scss +1 -0
  114. package/src/components/Plan/BackupProgress/BackupProgress.tsx +7 -2
  115. package/src/components/Plan/Backups/Backups.module.scss +16 -0
  116. package/src/components/Plan/Backups/Backups.tsx +13 -2
  117. package/src/components/Plan/FilterPlans/FilterPlans.module.scss +65 -0
  118. package/src/components/Plan/FilterPlans/FilterPlans.tsx +126 -0
  119. package/src/components/Plan/PlanForm/PlanForm.tsx +7 -1
  120. package/src/components/Plan/PlanIntegrity/PlanIntegrity.module.scss +19 -0
  121. package/src/components/Plan/PlanIntegrity/PlanIntegrity.tsx +40 -3
  122. package/src/components/Plan/PlanItems/PlanItem.tsx +1 -1
  123. package/src/components/Plan/PlanRepair/PlanRepair.module.scss +53 -0
  124. package/src/components/Plan/PlanRepair/PlanRepair.tsx +243 -0
  125. package/src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx +6 -2
  126. package/src/components/Plan/PlanSettings/PlanGeneralSettings.tsx +14 -2
  127. package/src/components/Plan/PlanSettings/PlanSettings.module.scss +8 -0
  128. package/src/components/Plan/PlanSizeChart/PlanSizeChart.module.scss +76 -0
  129. package/src/components/Plan/PlanSizeChart/PlanSizeChart.tsx +163 -0
  130. package/src/components/Plan/PlanStats/PlanStats.module.scss +16 -2
  131. package/src/components/Plan/PlanStats/PlanStats.tsx +8 -11
  132. package/src/components/common/Icon/Icon.tsx +21 -0
  133. package/src/components/common/SortItems/SortItems.module.scss +3 -2
  134. package/src/components/common/SortItems/SortItems.tsx +6 -3
  135. package/src/components/common/form/MultiSelect/MultiSelect.module.scss +1 -0
  136. package/src/components/index.ts +2 -0
  137. package/src/hooks/usePlanSingleActions.tsx +26 -23
  138. package/src/routes/Login/Login.tsx +8 -2
  139. package/src/routes/PlanSingle/PlanSingle.tsx +17 -0
  140. package/src/routes/Plans/Plans.tsx +70 -35
  141. package/src/services/plans.ts +40 -4
  142. package/src/styles/global.scss +4 -0
  143. package/src/utils/helpers.ts +25 -0
@@ -1,56 +1,67 @@
1
- import { jsxs as s, Fragment as p, jsx as e } from "react/jsx-runtime";
2
- import o from "../../common/form/NumberInput/NumberInput.js";
3
- import n from "../../common/form/Toggle/Toggle.js";
4
- import i from "./PlanSettings.module.scss.js";
5
- const N = ({ settings: r, onUpdate: a, isEditing: c }) => {
6
- const { encryption: d, compression: t, retries: f, retryDelay: m } = r;
7
- return /* @__PURE__ */ s(p, { children: [
8
- /* @__PURE__ */ s("div", { className: i.field, children: [
9
- /* @__PURE__ */ e("label", { className: i.label, children: "Encryption" }),
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
- n,
11
+ s,
12
12
  {
13
- fieldValue: d,
14
- disabled: c,
15
- onUpdate: (l) => a({ ...r, encryption: 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__ */ s("div", { className: i.field, children: [
21
- /* @__PURE__ */ e("label", { className: i.label, children: "Compression" }),
20
+ /* @__PURE__ */ c("div", { className: a.field, children: [
21
+ /* @__PURE__ */ e("label", { className: a.label, children: "Compression" }),
22
22
  /* @__PURE__ */ e(
23
- n,
23
+ s,
24
24
  {
25
- fieldValue: t,
26
- onUpdate: (l) => a({ ...r, compression: 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: i.field, children: /* @__PURE__ */ e(
32
- o,
31
+ /* @__PURE__ */ e("div", { className: a.field, children: /* @__PURE__ */ e(
32
+ m,
33
33
  {
34
34
  label: "Retries",
35
- fieldValue: f,
36
- onUpdate: (l) => a({ ...r, retries: 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: i.field, children: /* @__PURE__ */ e(
42
- o,
41
+ /* @__PURE__ */ e("div", { className: a.field, children: /* @__PURE__ */ e(
42
+ m,
43
43
  {
44
44
  label: "Retries Delay",
45
- fieldValue: m,
46
- onUpdate: (l) => a({ ...r, retryDelay: 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
- N as default
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":";;;;AAWA,MAAMA,IAAsB,CAAC,EAAE,UAAAC,GAAU,UAAAC,GAAU,WAAAC,QAA0C;AAC1F,QAAM,EAAE,YAAAC,GAAY,aAAAC,GAAa,SAAAC,GAAS,YAAAC,MAAeN;AACzD,SACG,gBAAAO,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,UAAUD;AAAA,UACV,UAAU,CAACU,MAAiBX,EAAS,EAAE,GAAGD,GAAU,YAAYY,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,MAAiBX,EAAS,EAAE,GAAGD,GAAU,aAAaY,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,MAAgBX,EAAS,EAAE,GAAGD,GAAU,SAASY,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,MAAgBX,EAAS,EAAE,GAAGD,GAAU,YAAYY,GAAK;AAAA,QACpE,MAAK;AAAA,QACL,QAAQ;AAAA,MAAA;AAAA,IAAA,EACX,CACH;AAAA,EAAA,GACH;AAEN;"}
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 = "_field_9carP", i = "_fieldErrorLabel_xGxve", e = "_fieldNotice_QxZ4n", n = "_label_xwNgM", o = "_forgetByAgeField_e2RLj", c = "_customPolicyOption_fSJHz", s = "_advancedTabContent_kLrNt", a = "_advancedTabs_muCSl", _ = "_advancedTabActive_nnoTr", r = "_advancedSettingsSelect_pUFko", d = "_eventTabs_n0umQ", p = "_eventTab_yzXfs", l = "_eventTabHead_6UQ2q", T = "_eventTabHeadTitle_Qxkiy", f = "_eventTabContent_E6x5i", b = "_addScriptButton_lkWxx", v = "_scriptItem_GNGoc", g = "_scriptHeader_shIgU", S = "_scriptTitle_RQ4O3", u = "_scriptPositionControls_f9kOj", m = "_scriptPathInput_JcKQN", O = "_scriptFooter_8jm3T", C = "_scriptOptions_xGU10", N = "_scriptOptionCheckbox_4qqu1", x = "_removeScriptButton_t4MgA", h = "_scriptOptionTimeout_YdnK6", B = "_hasTimeOutSettings_V94p5", y = "_timeoutSettings_LhUOR", F = "_notificationTestField_5mlYR", H = "_notificationSettingsSection_pJymd", P = "_notificationToggle_Xl9Ui", k = "_notificationSettings_IMmAg", A = "_testNotificationContainer_WRyXt", I = "_testNotificationButton_Ghxzv", L = "_disabled_DTMsr", Q = "_testNotificationOptions_XZww9", U = {
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
- label: n,
6
- forgetByAgeField: o,
7
- customPolicyOption: c,
8
- advancedTabContent: s,
9
- advancedTabs: a,
10
- advancedTabActive: _,
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: d,
13
- eventTab: p,
14
- eventTabHead: l,
15
- eventTabHeadTitle: T,
16
- eventTabContent: f,
17
- addScriptButton: b,
18
- scriptItem: v,
19
- scriptHeader: g,
20
- scriptTitle: S,
21
- scriptPositionControls: u,
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: O,
24
- scriptOptions: C,
25
- scriptOptionCheckbox: N,
26
- removeScriptButton: x,
27
- scriptOptionTimeout: h,
28
- hasTimeOutSettings: B,
29
- timeoutSettings: y,
30
- notificationTestField: F,
31
- notificationSettingsSection: H,
32
- notificationToggle: P,
33
- notificationSettings: k,
34
- testNotificationContainer: A,
35
- testNotificationButton: I,
36
- disabled: L,
37
- testNotificationOptions: Q
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
- b as addScriptButton,
41
+ f as addScriptButton,
41
42
  r as advancedSettingsSelect,
42
- _ as advancedTabActive,
43
- s as advancedTabContent,
44
- a as advancedTabs,
45
- c as customPolicyOption,
46
- U as default,
47
- L as disabled,
48
- p as eventTab,
49
- f as eventTabContent,
50
- l as eventTabHead,
51
- T as eventTabHeadTitle,
52
- d as eventTabs,
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
- o as forgetByAgeField,
57
- B as hasTimeOutSettings,
58
- n as label,
59
- k as notificationSettings,
60
- H as notificationSettingsSection,
61
- F as notificationTestField,
62
- P as notificationToggle,
63
- x as removeScriptButton,
64
- O as scriptFooter,
65
- g as scriptHeader,
66
- v as scriptItem,
67
- N as scriptOptionCheckbox,
68
- h as scriptOptionTimeout,
69
- C as scriptOptions,
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
- u as scriptPositionControls,
72
- S as scriptTitle,
73
- I as testNotificationButton,
74
- A as testNotificationContainer,
75
- Q as testNotificationOptions,
76
- y as timeoutSettings
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;AAM7C,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,4CA0ElE,CAAC;AAEF,eAAe,SAAS,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 s from "../../common/Icon/Icon.js";
3
- import { formatIntervalDisplay as T, formatNumberToK as S, formatBytes as z } from "../../../utils/helpers.js";
4
- import x from "../PlanHistory/PlanHistory.js";
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 u from "../PlanStorageInfo/PlanStorageInfo.js";
7
- const A = ({ plan: o, isSync: r, lastBackupItem: n }) => {
8
- const { sourceConfig: a, storage: m, storagePath: g, isActive: h, settings: f } = o, { interval: N } = f, p = (n == null ? void 0 : n.totalFiles) || 0, v = (n == null ? void 0 : n.totalSize) || 0, y = (l) => {
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(s, { type: "backup", size: 12 }),
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": y(a), children: [
21
- /* @__PURE__ */ e(s, { type: "folders", size: 18 }),
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 ${T(N)}` : "Plan is Not Active",
33
+ "data-tooltip-html": h ? `${r ? "Syncing" : "Copying"} changes ${y(g)}` : "Plan is Not Active",
33
34
  children: [
34
- /* @__PURE__ */ e(s, { type: h ? r ? "reload" : "copy" : "pause", size: 16 }),
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
- u,
41
+ x,
41
42
  {
42
43
  disableTooltip: !1,
43
44
  inline: !1,
44
45
  replicationSettings: o.settings.replication,
45
- storage: m,
46
- storagePath: g
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(s, { type: "folders", size: 12 }),
54
- " Source Stats"
55
- ] }),
56
- /* @__PURE__ */ i("div", { className: t.snapshotsContent, children: [
57
- /* @__PURE__ */ i("div", { children: [
58
- /* @__PURE__ */ e("span", { children: p ? S(p) : 0 }),
59
- /* @__PURE__ */ e("span", { children: "Files" })
60
- ] }),
61
- /* @__PURE__ */ e("div", {}),
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(s, { type: "speed", size: 12 }),
69
+ /* @__PURE__ */ e(n, { type: "speed", size: 12 }),
71
70
  " Health"
72
71
  ] }),
73
- /* @__PURE__ */ e("div", { className: t.healthContent, children: /* @__PURE__ */ e(x, { planId: o.id, history: o.backups, itemsCount: 90 }) })
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
- A as default
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 { formatBytes, formatNumberToK, formatIntervalDisplay } from '../../../utils/helpers';\r\nimport PlanHistory from '../PlanHistory/PlanHistory';\r\nimport classes from './PlanStats.module.scss';\r\nimport PlanStorageInfo from '../PlanStorageInfo/PlanStorageInfo';\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} /> Source Stats\r\n </div>\r\n <div className={classes.snapshotsContent}>\r\n <div>\r\n <span>{totalFiles ? formatNumberToK(totalFiles) : 0}</span>\r\n <span>Files</span>\r\n </div>\r\n <div></div>\r\n <div>\r\n <span>{totalSize ? formatBytes(totalSize) : '0.00B'}</span>\r\n <span>Size</span>\r\n </div>\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","PlanHistory"],"mappings":"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"}
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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"}