@plutonhq/core-frontend 0.1.25 → 0.1.27

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 (91) hide show
  1. package/dist-lib/@types/backups.d.ts +4 -1
  2. package/dist-lib/@types/backups.d.ts.map +1 -1
  3. package/dist-lib/@types/plans.d.ts +2 -0
  4. package/dist-lib/@types/plans.d.ts.map +1 -1
  5. package/dist-lib/@types/restores.d.ts +2 -0
  6. package/dist-lib/@types/restores.d.ts.map +1 -1
  7. package/dist-lib/components/Device/DeviceInfo/DeviceInfo.module.scss.js +26 -26
  8. package/dist-lib/components/Plan/BackupEvents/BackupEvents.d.ts.map +1 -1
  9. package/dist-lib/components/Plan/BackupEvents/BackupEvents.js +27 -27
  10. package/dist-lib/components/Plan/BackupEvents/BackupEvents.js.map +1 -1
  11. package/dist-lib/components/Plan/PlanBackups/PlanBackups.d.ts.map +1 -1
  12. package/dist-lib/components/Plan/PlanBackups/PlanBackups.js +26 -26
  13. package/dist-lib/components/Plan/PlanBackups/PlanBackups.js.map +1 -1
  14. package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
  15. package/dist-lib/components/Plan/PlanForm/PlanForm.js +64 -80
  16. package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
  17. package/dist-lib/components/Plan/PlanHistory/PlanHistory.js +1 -1
  18. package/dist-lib/components/Plan/PlanHistory/PlanHistory.js.map +1 -1
  19. package/dist-lib/components/Plan/PlanPruneModal/PlanPruneModal.d.ts.map +1 -1
  20. package/dist-lib/components/Plan/PlanPruneModal/PlanPruneModal.js +62 -26
  21. package/dist-lib/components/Plan/PlanPruneModal/PlanPruneModal.js.map +1 -1
  22. package/dist-lib/components/Plan/PlanSettings/PlanPruneSettings.d.ts.map +1 -1
  23. package/dist-lib/components/Plan/PlanSettings/PlanPruneSettings.js +138 -62
  24. package/dist-lib/components/Plan/PlanSettings/PlanPruneSettings.js.map +1 -1
  25. package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js +42 -42
  26. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.d.ts.map +1 -1
  27. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js +39 -30
  28. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js.map +1 -1
  29. package/dist-lib/components/Plan/PlanStats/PlanStats.d.ts.map +1 -1
  30. package/dist-lib/components/Plan/PlanStats/PlanStats.js +25 -25
  31. package/dist-lib/components/Plan/PlanStats/PlanStats.js.map +1 -1
  32. package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js +1 -1
  33. package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
  34. package/dist-lib/components/common/Icon/Icon.js +12 -1
  35. package/dist-lib/components/common/Icon/Icon.js.map +1 -1
  36. package/dist-lib/components/common/StatusLabel/StatusLabel.d.ts +1 -1
  37. package/dist-lib/components/common/StatusLabel/StatusLabel.d.ts.map +1 -1
  38. package/dist-lib/components/common/StatusLabel/StatusLabel.js +17 -12
  39. package/dist-lib/components/common/StatusLabel/StatusLabel.js.map +1 -1
  40. package/dist-lib/components/common/form/IntervalField/IntervalField.d.ts.map +1 -1
  41. package/dist-lib/components/common/form/IntervalField/IntervalField.js +66 -46
  42. package/dist-lib/components/common/form/IntervalField/IntervalField.js.map +1 -1
  43. package/dist-lib/components/common/form/NumberInput/NumberInput.module.scss.js +4 -4
  44. package/dist-lib/components/common/form/StoragePicker/StoragePicker.d.ts.map +1 -1
  45. package/dist-lib/components/common/form/StoragePicker/StoragePicker.js +49 -47
  46. package/dist-lib/components/common/form/StoragePicker/StoragePicker.js.map +1 -1
  47. package/dist-lib/components/common/form/TagsInput/TagsInput.d.ts +2 -1
  48. package/dist-lib/components/common/form/TagsInput/TagsInput.d.ts.map +1 -1
  49. package/dist-lib/components/common/form/TagsInput/TagsInput.js +15 -15
  50. package/dist-lib/components/common/form/TagsInput/TagsInput.js.map +1 -1
  51. package/dist-lib/components/common/form/TimePicker/TimePicker.module.scss.js +13 -13
  52. package/dist-lib/hooks/usePlanSingleActions.js +7 -7
  53. package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
  54. package/dist-lib/styles/core-frontend.css +1 -1
  55. package/dist-lib/styles/global.scss +6 -0
  56. package/dist-lib/utils/constants.js +1 -1
  57. package/dist-lib/utils/constants.js.map +1 -1
  58. package/dist-lib/utils/helpers.d.ts +2 -0
  59. package/dist-lib/utils/helpers.d.ts.map +1 -1
  60. package/dist-lib/utils/helpers.js +55 -33
  61. package/dist-lib/utils/helpers.js.map +1 -1
  62. package/dist-lib/utils/plans.js +6 -6
  63. package/dist-lib/utils/plans.js.map +1 -1
  64. package/dist-lib/utils.js +34 -33
  65. package/package.json +1 -1
  66. package/src/@types/backups.ts +4 -1
  67. package/src/@types/plans.ts +2 -0
  68. package/src/@types/restores.ts +2 -0
  69. package/src/components/Device/DeviceInfo/DeviceInfo.module.scss +1 -0
  70. package/src/components/Plan/BackupEvents/BackupEvents.tsx +5 -3
  71. package/src/components/Plan/PlanBackups/PlanBackups.tsx +5 -2
  72. package/src/components/Plan/PlanForm/PlanForm.tsx +1 -19
  73. package/src/components/Plan/PlanHistory/PlanHistory.tsx +1 -1
  74. package/src/components/Plan/PlanPruneModal/PlanPruneModal.tsx +54 -11
  75. package/src/components/Plan/PlanSettings/PlanPruneSettings.tsx +145 -61
  76. package/src/components/Plan/PlanSettings/PlanSettings.module.scss +5 -0
  77. package/src/components/Plan/PlanSettings/PlanSourceSettings.tsx +15 -1
  78. package/src/components/Plan/PlanStats/PlanStats.module.scss +3 -0
  79. package/src/components/Plan/PlanStats/PlanStats.tsx +2 -8
  80. package/src/components/common/Icon/Icon.tsx +12 -0
  81. package/src/components/common/StatusLabel/StatusLabel.tsx +7 -1
  82. package/src/components/common/form/IntervalField/IntervalField.tsx +21 -1
  83. package/src/components/common/form/NumberInput/NumberInput.module.scss +1 -0
  84. package/src/components/common/form/StoragePicker/StoragePicker.tsx +8 -1
  85. package/src/components/common/form/TagsInput/TagsInput.tsx +3 -2
  86. package/src/components/common/form/TimePicker/TimePicker.module.scss +1 -0
  87. package/src/hooks/usePlanSingleActions.tsx +2 -2
  88. package/src/styles/global.scss +6 -0
  89. package/src/utils/constants.ts +1 -1
  90. package/src/utils/helpers.ts +25 -0
  91. package/src/utils/plans.ts +3 -3
@@ -1,114 +1,113 @@
1
1
  import { jsxs as o, jsx as r } from "react/jsx-runtime";
2
- import { useState as F } from "react";
2
+ import { useState as R } from "react";
3
3
  import n from "../../common/Icon/Icon.js";
4
- import w from "../../common/SidePanel/SidePanel.js";
5
- import z from "../../common/form/StoragePicker/StoragePicker.js";
6
- import V from "../PlanSettings/PlanStrategySettings.js";
7
- import D from "../PlanSettings/PlanSourceSettings.js";
8
- import E from "../../common/form/NumberInput/NumberInput.js";
9
- import i from "../AddPlan/AddPlan.module.scss.js";
10
- import d from "./PlanForm.module.scss.js";
11
- import { useGetSettings as q } from "../../../services/settings.js";
12
- import A from "../PlanSettings/PlanAdvancedSettings.js";
13
- import { isPlanSettingsValid as c } from "../../../utils/plans.js";
4
+ import z from "../../common/SidePanel/SidePanel.js";
5
+ import w from "../../common/form/StoragePicker/StoragePicker.js";
6
+ import D from "../PlanSettings/PlanStrategySettings.js";
7
+ import E from "../PlanSettings/PlanSourceSettings.js";
8
+ import t from "../AddPlan/AddPlan.module.scss.js";
9
+ import c from "./PlanForm.module.scss.js";
10
+ import { useGetSettings as V } from "../../../services/settings.js";
11
+ import q from "../PlanSettings/PlanAdvancedSettings.js";
12
+ import { isPlanSettingsValid as s } from "../../../utils/plans.js";
14
13
  import L from "../../common/form/IntervalField/IntervalField.js";
15
14
  import T from "./PlanFormNav.js";
16
15
  import { useGetDevice as j } from "../../../services/devices.js";
17
- import G from "../PlanSettings/PlanPruneSettings.js";
18
- import K from "../PlanSettings/PlanReplicationSettings.js";
19
- const le = ({
20
- title: I,
16
+ import A from "../PlanSettings/PlanPruneSettings.js";
17
+ import G from "../PlanSettings/PlanReplicationSettings.js";
18
+ const te = ({
19
+ title: P,
21
20
  planSettings: e,
22
21
  type: l,
23
- onPlanSettingsChange: s,
22
+ onPlanSettingsChange: d,
24
23
  onSubmit: f,
25
24
  isSubmitting: h,
26
- close: P,
25
+ close: I,
27
26
  storagePath: x,
28
27
  storageId: B,
29
28
  planId: C
30
29
  }) => {
31
30
  var N, b, k;
32
- const [t, m] = F(1), { data: u } = q(), U = ((N = u == null ? void 0 : u.result) == null ? void 0 : N.settings) || {}, { data: p } = j("main", !0), y = (b = p == null ? void 0 : p.result) == null ? void 0 : b.device, v = {
31
+ const [i, m] = R(1), { data: u } = V(), U = ((N = u == null ? void 0 : u.result) == null ? void 0 : N.settings) || {}, { data: p } = j("main", !0), y = (b = p == null ? void 0 : p.result) == null ? void 0 : b.device, v = {
33
32
  1: {
34
33
  title: "Next: Configure Source & Destination",
35
- onClick: () => c(e, t) && m(t + 1)
34
+ onClick: () => s(e, i) && m(i + 1)
36
35
  },
37
36
  2: {
38
37
  title: "Next: Setup Schedule & Retention",
39
- onClick: () => c(e, t) && m(t + 1)
38
+ onClick: () => s(e, i) && m(i + 1)
40
39
  },
41
- 3: { title: "Next: Advanced Settings", onClick: () => c(e, t) && m(t + 1) },
40
+ 3: { title: "Next: Advanced Settings", onClick: () => s(e, i) && m(i + 1) },
42
41
  4: {
43
42
  title: "Create Plan",
44
- onClick: () => c(e, !1) && f()
43
+ onClick: () => s(e, !1) && f()
45
44
  }
46
- }, R = (a) => {
45
+ }, F = (a) => {
47
46
  if (l !== "edit")
48
47
  return;
49
- c(e, t) && m(a);
48
+ s(e, i) && m(a);
50
49
  };
51
50
  return /* @__PURE__ */ o(
52
- w,
51
+ z,
53
52
  {
54
- title: I,
53
+ title: P,
55
54
  icon: /* @__PURE__ */ r(n, { type: "backup", size: 20 }),
56
55
  width: l === "add" ? "100%" : void 0,
57
56
  headerWidth: l === "add" ? "740px" : void 0,
58
- close: P,
57
+ close: I,
59
58
  withTabs: !0,
60
- footer: /* @__PURE__ */ r("div", { className: d.planFormFooter, children: /* @__PURE__ */ o("div", { className: d.footerContainer, children: [
61
- /* @__PURE__ */ r("div", { className: i.footerLeft, children: /* @__PURE__ */ r("div", { className: i.summary, children: l === "add" && t > 1 && /* @__PURE__ */ o("button", { className: d.backButton, onClick: () => t > 0 && m(t - 1), disabled: h, children: [
59
+ footer: /* @__PURE__ */ r("div", { className: c.planFormFooter, children: /* @__PURE__ */ o("div", { className: c.footerContainer, children: [
60
+ /* @__PURE__ */ r("div", { className: t.footerLeft, children: /* @__PURE__ */ r("div", { className: t.summary, children: l === "add" && i > 1 && /* @__PURE__ */ o("button", { className: c.backButton, onClick: () => i > 0 && m(i - 1), disabled: h, children: [
62
61
  /* @__PURE__ */ r(n, { type: "arrow-left", size: 14 }),
63
62
  " Back"
64
63
  ] }) }) }),
65
- /* @__PURE__ */ r("div", { className: i.footerRight, children: l === "add" ? /* @__PURE__ */ o("button", { className: i.createButton, onClick: v[t].onClick, children: [
64
+ /* @__PURE__ */ r("div", { className: t.footerRight, children: l === "add" ? /* @__PURE__ */ o("button", { className: t.createButton, onClick: v[i].onClick, children: [
66
65
  /* @__PURE__ */ r(n, { type: "check", size: 12 }),
67
66
  " ",
68
- v[t].title
69
- ] }) : /* @__PURE__ */ o("button", { className: i.createButton, onClick: () => c(e, !1) && f(), children: [
67
+ v[i].title
68
+ ] }) : /* @__PURE__ */ o("button", { className: t.createButton, onClick: () => s(e, !1) && f(), children: [
70
69
  /* @__PURE__ */ r(n, { type: "check", size: 12 }),
71
70
  " ",
72
71
  "Update Plan"
73
72
  ] }) })
74
73
  ] }) }),
75
74
  children: [
76
- /* @__PURE__ */ r(T, { step: t, type: l, gotoStep: R }),
77
- /* @__PURE__ */ o("div", { className: `${d.formContent} styled__scrollbar`, children: [
78
- h && /* @__PURE__ */ r("div", { className: i.loader, children: /* @__PURE__ */ r(n, { size: 36, type: "loading" }) }),
79
- t === 1 && /* @__PURE__ */ o("div", { className: d.planStep, children: [
80
- /* @__PURE__ */ o("div", { className: i.field, children: [
81
- /* @__PURE__ */ r("label", { className: i.label, children: "Backup Plan Name*" }),
82
- !e.title && /* @__PURE__ */ r("span", { className: i.fieldErrorLabel, children: "Required" }),
75
+ /* @__PURE__ */ r(T, { step: i, type: l, gotoStep: F }),
76
+ /* @__PURE__ */ o("div", { className: `${c.formContent} styled__scrollbar`, children: [
77
+ h && /* @__PURE__ */ r("div", { className: t.loader, children: /* @__PURE__ */ r(n, { size: 36, type: "loading" }) }),
78
+ i === 1 && /* @__PURE__ */ o("div", { className: c.planStep, children: [
79
+ /* @__PURE__ */ o("div", { className: t.field, children: [
80
+ /* @__PURE__ */ r("label", { className: t.label, children: "Backup Plan Name*" }),
81
+ !e.title && /* @__PURE__ */ r("span", { className: t.fieldErrorLabel, children: "Required" }),
83
82
  /* @__PURE__ */ r(
84
83
  "input",
85
84
  {
86
- className: i.titleInput,
85
+ className: t.titleInput,
87
86
  type: "text",
88
87
  placeholder: "Plan Name",
89
88
  value: e.title || "",
90
- onChange: (a) => s({ ...e, title: a.target.value })
89
+ onChange: (a) => d({ ...e, title: a.target.value })
91
90
  }
92
91
  )
93
92
  ] }),
94
- /* @__PURE__ */ o("div", { className: i.field, children: [
95
- /* @__PURE__ */ r("label", { className: i.label, children: "Backup Plan Description" }),
93
+ /* @__PURE__ */ o("div", { className: t.field, children: [
94
+ /* @__PURE__ */ r("label", { className: t.label, children: "Backup Plan Description" }),
96
95
  /* @__PURE__ */ r(
97
96
  "input",
98
97
  {
99
- className: i.titleInput,
98
+ className: t.titleInput,
100
99
  type: "text",
101
100
  placeholder: "Plan Description",
102
101
  value: e.description || "",
103
- onChange: (a) => s({ ...e, description: a.target.value })
102
+ onChange: (a) => d({ ...e, description: a.target.value })
104
103
  }
105
104
  )
106
105
  ] }),
107
106
  e.sourceType === "device" && /* @__PURE__ */ r(
108
- V,
107
+ D,
109
108
  {
110
109
  plan: e,
111
- onUpdate: (a) => s({ ...e, method: a }),
110
+ onUpdate: (a) => d({ ...e, method: a }),
112
111
  disabled: l === "edit",
113
112
  options: [
114
113
  {
@@ -135,27 +134,27 @@ const le = ({
135
134
  }
136
135
  )
137
136
  ] }),
138
- t === 2 && /* @__PURE__ */ o("div", { className: d.planStep, children: [
137
+ i === 2 && /* @__PURE__ */ o("div", { className: c.planStep, children: [
139
138
  /* @__PURE__ */ r(
140
- D,
139
+ E,
141
140
  {
142
141
  plan: e,
143
- onUpdate: (a) => s({ ...a }),
142
+ onUpdate: (a) => d({ ...a }),
144
143
  isEditing: l === "edit",
145
144
  error: e.sourceConfig.includes.length === 0 ? "Required" : ""
146
145
  }
147
146
  ),
148
- /* @__PURE__ */ o("div", { className: i.field, children: [
149
- /* @__PURE__ */ r("label", { className: i.label, children: "Backup Destination*" }),
150
- !e.storage.name && /* @__PURE__ */ r("span", { className: i.fieldErrorLabel, children: "Required" }),
147
+ /* @__PURE__ */ o("div", { className: t.field, children: [
148
+ /* @__PURE__ */ r("label", { className: t.label, children: "Backup Destination*" }),
149
+ !e.storage.name && /* @__PURE__ */ r("span", { className: t.fieldErrorLabel, children: "Required" }),
151
150
  /* @__PURE__ */ r(
152
- z,
151
+ w,
153
152
  {
154
153
  storagePath: x || e.storagePath,
155
154
  storageId: B || ((k = e.storage) == null ? void 0 : k.id) || "",
156
155
  deviceId: e.sourceId || "main",
157
156
  disabled: l === "edit",
158
- onUpdate: (a) => s({
157
+ onUpdate: (a) => d({
159
158
  ...e,
160
159
  storagePath: a.path,
161
160
  storage: { id: a.storage.id, name: a.storage.name }
@@ -164,7 +163,7 @@ const le = ({
164
163
  )
165
164
  ] }),
166
165
  /* @__PURE__ */ r(
167
- K,
166
+ G,
168
167
  {
169
168
  replication: e.settings.replication,
170
169
  primaryStorageId: e.storage.id,
@@ -172,55 +171,40 @@ const le = ({
172
171
  deviceId: e.sourceId || "main",
173
172
  isEditing: l === "edit",
174
173
  planID: C,
175
- onUpdate: (a) => s({
174
+ onUpdate: (a) => d({
176
175
  ...e,
177
176
  settings: { ...e.settings, replication: a }
178
177
  })
179
178
  }
180
179
  )
181
180
  ] }),
182
- t === 3 && /* @__PURE__ */ o("div", { className: d.planStep, children: [
183
- /* @__PURE__ */ r("div", { className: i.field, style: { width: "150px" }, children: /* @__PURE__ */ r(
181
+ i === 3 && /* @__PURE__ */ o("div", { className: c.planStep, children: [
182
+ /* @__PURE__ */ r("div", { className: t.field, style: { width: "150px" }, children: /* @__PURE__ */ r(
184
183
  L,
185
184
  {
186
- label: "Backup Interval*",
185
+ label: "Backup Interval",
187
186
  fieldValue: e.settings.interval,
188
- onUpdate: (a) => s({ ...e, settings: { ...e.settings, interval: a } })
189
- }
190
- ) }),
191
- /* @__PURE__ */ r("div", { className: i.field, style: { width: "150px" }, children: /* @__PURE__ */ r(
192
- E,
193
- {
194
- label: "Backups to Keep",
195
- fieldValue: e.settings.prune.snapCount,
196
- onUpdate: (a) => s({
197
- ...e,
198
- settings: { ...e.settings, prune: { ...e.settings.prune, snapCount: a } }
199
- }),
200
- placeholder: "5",
201
- min: 1,
202
- inline: !1,
203
- hint: "Number of Active Restorable Backups/Snapshots to Keep regardless of the Removal Policy"
187
+ onUpdate: (a) => d({ ...e, settings: { ...e.settings, interval: a } })
204
188
  }
205
189
  ) }),
206
190
  /* @__PURE__ */ r(
207
- G,
191
+ A,
208
192
  {
209
193
  plan: e,
210
- onUpdate: (a) => s({
194
+ onUpdate: (a) => d({
211
195
  ...e,
212
196
  settings: { ...e.settings, prune: a }
213
197
  })
214
198
  }
215
199
  )
216
200
  ] }),
217
- t === 4 && /* @__PURE__ */ r("div", { className: d.planStep, children: /* @__PURE__ */ r(A, { plan: e, appSettings: U, onUpdate: s, device: y }) })
201
+ i === 4 && /* @__PURE__ */ r("div", { className: c.planStep, children: /* @__PURE__ */ r(q, { plan: e, appSettings: U, onUpdate: d, device: y }) })
218
202
  ] })
219
203
  ]
220
204
  }
221
205
  );
222
206
  };
223
207
  export {
224
- le as default
208
+ te as default
225
209
  };
226
210
  //# sourceMappingURL=PlanForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanForm.js","sources":["../../../../src/components/Plan/PlanForm/PlanForm.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport SidePanel from '../../common/SidePanel/SidePanel';\r\nimport StoragePicker from '../../common/form/StoragePicker/StoragePicker';\r\nimport PlanStrategySettings from '../PlanSettings/PlanStrategySettings';\r\nimport PlanSourceSettings from '../PlanSettings/PlanSourceSettings';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\nimport classes from '../AddPlan/AddPlan.module.scss';\r\nimport PFClasses from './PlanForm.module.scss';\r\nimport { useGetSettings } from '../../../services/settings';\r\nimport PlanAdvancedSettings from '../PlanSettings/PlanAdvancedSettings';\r\nimport { isPlanSettingsValid } from '../../../utils/plans';\r\nimport IntervalField from '../../common/form/IntervalField/IntervalField';\r\nimport PlanFormNav from './PlanFormNav';\r\nimport { useGetDevice } from '../../../services/devices';\r\nimport PlanPruneSettings from '../PlanSettings/PlanPruneSettings';\r\nimport PlanReplicationSettings from '../PlanSettings/PlanReplicationSettings';\r\n\r\ntype PlanFormProps = {\r\n title: string;\r\n planSettings: NewPlanSettings;\r\n type: 'add' | 'edit';\r\n onPlanSettingsChange: (settings: NewPlanSettings) => void;\r\n onSubmit: () => void;\r\n isSubmitting: boolean;\r\n close: () => void;\r\n storagePath?: string;\r\n storageId?: string;\r\n planId?: string;\r\n};\r\n\r\nconst PlanForm = ({\r\n title,\r\n planSettings,\r\n type,\r\n onPlanSettingsChange,\r\n onSubmit,\r\n isSubmitting,\r\n close,\r\n storagePath,\r\n storageId,\r\n planId,\r\n}: PlanFormProps) => {\r\n const [step, setStep] = useState<number>(1);\r\n\r\n const { data: settingsData } = useGetSettings();\r\n const appSettings = settingsData?.result?.settings || {};\r\n // const smtpConnected = appSettings?.integration?.smtp?.connected ? true : false;\r\n\r\n const { data: deviceData } = useGetDevice('main', true);\r\n const deviceInstance = deviceData?.result?.device;\r\n\r\n const buttonTexts: Record<number, { title: string; onClick: () => void }> = {\r\n 1: {\r\n title: 'Next: Configure Source & Destination',\r\n onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1),\r\n },\r\n 2: {\r\n title: 'Next: Setup Schedule & Retention',\r\n onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1),\r\n },\r\n 3: { title: 'Next: Advanced Settings', onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1) },\r\n 4: {\r\n title: 'Create Plan',\r\n onClick: () => isPlanSettingsValid(planSettings, false) && onSubmit(),\r\n },\r\n };\r\n\r\n const gotoStep = (nStep: number) => {\r\n if (type !== 'edit') {\r\n return;\r\n }\r\n\r\n const isSettingsValid = isPlanSettingsValid(planSettings, step);\r\n if (isSettingsValid) {\r\n setStep(nStep);\r\n }\r\n };\r\n\r\n return (\r\n <SidePanel\r\n title={title}\r\n icon={<Icon type={'backup'} size={20} />}\r\n width={type === 'add' ? '100%' : undefined}\r\n headerWidth={type === 'add' ? '740px' : undefined}\r\n close={close}\r\n withTabs={true}\r\n footer={\r\n <div className={PFClasses.planFormFooter}>\r\n <div className={PFClasses.footerContainer}>\r\n <div className={classes.footerLeft}>\r\n <div className={classes.summary}>\r\n {type === 'add' && step > 1 && (\r\n <button className={PFClasses.backButton} onClick={() => step > 0 && setStep(step - 1)} disabled={isSubmitting}>\r\n <Icon type=\"arrow-left\" size={14} /> Back\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n <div className={classes.footerRight}>\r\n {type === 'add' ? (\r\n <button className={classes.createButton} onClick={buttonTexts[step].onClick}>\r\n <Icon type=\"check\" size={12} /> {buttonTexts[step].title}\r\n </button>\r\n ) : (\r\n <button className={classes.createButton} onClick={() => isPlanSettingsValid(planSettings, false) && onSubmit()}>\r\n <Icon type=\"check\" size={12} /> {'Update Plan'}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n >\r\n <PlanFormNav step={step} type={type} gotoStep={gotoStep} />\r\n\r\n <div className={`${PFClasses.formContent} styled__scrollbar`}>\r\n {isSubmitting && (\r\n <div className={classes.loader}>\r\n <Icon size={36} type=\"loading\" />\r\n </div>\r\n )}\r\n {step === 1 && (\r\n <div className={PFClasses.planStep}>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Plan Name*</label>\r\n {!planSettings.title && <span className={classes.fieldErrorLabel}>{'Required'}</span>}\r\n <input\r\n className={classes.titleInput}\r\n type=\"text\"\r\n placeholder=\"Plan Name\"\r\n value={planSettings.title || ''}\r\n onChange={(e) => onPlanSettingsChange({ ...planSettings, title: e.target.value })}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Plan Description</label>\r\n <input\r\n className={classes.titleInput}\r\n type=\"text\"\r\n placeholder=\"Plan Description\"\r\n value={planSettings.description || ''}\r\n onChange={(e) => onPlanSettingsChange({ ...planSettings, description: e.target.value })}\r\n />\r\n </div>\r\n {/* <PlanTypeSettings\r\n plan={planSettings}\r\n onUpdate={(plan: NewPlanSettings) => onPlanSettingsChange({ ...plan })}\r\n disabled={type === 'edit' ? true : false}\r\n options={[\r\n {\r\n value: 'device',\r\n icon: 'computer',\r\n label: 'Device',\r\n description: 'Backup content of a Computer/Server',\r\n },\r\n {\r\n value: 'database',\r\n icon: 'database',\r\n label: 'Database',\r\n description: 'Backup a Database',\r\n disabled: true,\r\n },\r\n {\r\n value: 'googleworkspace',\r\n icon: 'google-workspace',\r\n label: 'Google Workspace',\r\n description: 'Backup Google Workspace',\r\n disabled: true,\r\n },\r\n {\r\n value: 'microsoft365',\r\n icon: 'microsoft-365',\r\n label: 'Microsoft 365',\r\n description: 'Backup Microsoft 365',\r\n disabled: true,\r\n },\r\n ]}\r\n /> */}\r\n {planSettings.sourceType === 'device' && (\r\n <PlanStrategySettings\r\n plan={planSettings}\r\n onUpdate={(method) => onPlanSettingsChange({ ...planSettings, method })}\r\n disabled={type === 'edit' ? true : false}\r\n options={[\r\n {\r\n value: 'backup',\r\n icon: 'backup',\r\n label: 'Incremental Backup',\r\n description: 'Periodically create Incremental backup snapshots of source',\r\n },\r\n // {\r\n // value: 'sync',\r\n // icon: 'reload',\r\n // label: 'Real-time Sync',\r\n // description: 'Maintain identical source (with revisions)',\r\n // disabled: true,\r\n // },\r\n // {\r\n // value: 'rescue',\r\n // icon: 'rescue',\r\n // label: 'Linux Server Backup',\r\n // description: 'Full Linux system backups with bootable ISO image',\r\n // disabled: true,\r\n // },\r\n ]}\r\n />\r\n )}\r\n </div>\r\n )}\r\n {step === 2 && (\r\n <div className={PFClasses.planStep}>\r\n <PlanSourceSettings\r\n plan={planSettings}\r\n onUpdate={(plan) => onPlanSettingsChange({ ...plan })}\r\n isEditing={type === 'edit' ? true : false}\r\n error={planSettings.sourceConfig.includes.length === 0 ? 'Required' : ''}\r\n />\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Destination*</label>\r\n {!planSettings.storage.name && <span className={classes.fieldErrorLabel}>{'Required'}</span>}\r\n <StoragePicker\r\n storagePath={storagePath || planSettings.storagePath}\r\n storageId={storageId || planSettings.storage?.id || ''}\r\n deviceId={planSettings.sourceId || 'main'}\r\n disabled={type === 'edit' ? true : false}\r\n onUpdate={(s: { storage: { name: string; id: string; type: string }; path: string }) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n storagePath: s.path,\r\n storage: { id: s.storage.id, name: s.storage.name },\r\n })\r\n }\r\n />\r\n </div>\r\n <PlanReplicationSettings\r\n replication={planSettings.settings.replication}\r\n primaryStorageId={planSettings.storage.id}\r\n primaryStoragePath={planSettings.storagePath}\r\n deviceId={planSettings.sourceId || 'main'}\r\n isEditing={type === 'edit' ? true : false}\r\n planID={planId}\r\n onUpdate={(replication) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, replication: replication },\r\n })\r\n }\r\n />\r\n </div>\r\n )}\r\n {step === 3 && (\r\n <div className={PFClasses.planStep}>\r\n <div className={classes.field} style={{ width: '150px' }}>\r\n <IntervalField\r\n label=\"Backup Interval*\"\r\n fieldValue={planSettings.settings.interval}\r\n onUpdate={(intervalSettings) =>\r\n onPlanSettingsChange({ ...planSettings, settings: { ...planSettings.settings, interval: intervalSettings } })\r\n }\r\n />\r\n </div>\r\n\r\n <div className={classes.field} style={{ width: '150px' }}>\r\n <NumberInput\r\n label=\"Backups to Keep\"\r\n fieldValue={planSettings.settings.prune.snapCount}\r\n onUpdate={(val) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, prune: { ...planSettings.settings.prune, snapCount: val } },\r\n })\r\n }\r\n placeholder=\"5\"\r\n min={1}\r\n inline={false}\r\n hint=\"Number of Active Restorable Backups/Snapshots to Keep regardless of the Removal Policy\"\r\n />\r\n </div>\r\n <PlanPruneSettings\r\n plan={planSettings}\r\n onUpdate={(pruneSettings) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, prune: pruneSettings },\r\n })\r\n }\r\n />\r\n </div>\r\n )}\r\n {step === 4 && (\r\n <div className={PFClasses.planStep}>\r\n <PlanAdvancedSettings plan={planSettings} appSettings={appSettings} onUpdate={onPlanSettingsChange} device={deviceInstance} />\r\n </div>\r\n )}\r\n </div>\r\n </SidePanel>\r\n );\r\n};\r\n\r\nexport default PlanForm;\r\n"],"names":["PlanForm","title","planSettings","type","onPlanSettingsChange","onSubmit","isSubmitting","close","storagePath","storageId","planId","step","setStep","useState","settingsData","useGetSettings","appSettings","_a","deviceData","useGetDevice","deviceInstance","_b","buttonTexts","isPlanSettingsValid","gotoStep","nStep","jsxs","SidePanel","jsx","Icon","PFClasses","classes","PlanFormNav","e","PlanStrategySettings","method","PlanSourceSettings","plan","StoragePicker","_c","s","PlanReplicationSettings","replication","IntervalField","intervalSettings","NumberInput","val","PlanPruneSettings","pruneSettings","PlanAdvancedSettings"],"mappings":"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"}
1
+ {"version":3,"file":"PlanForm.js","sources":["../../../../src/components/Plan/PlanForm/PlanForm.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport SidePanel from '../../common/SidePanel/SidePanel';\r\nimport StoragePicker from '../../common/form/StoragePicker/StoragePicker';\r\nimport PlanStrategySettings from '../PlanSettings/PlanStrategySettings';\r\nimport PlanSourceSettings from '../PlanSettings/PlanSourceSettings';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport classes from '../AddPlan/AddPlan.module.scss';\r\nimport PFClasses from './PlanForm.module.scss';\r\nimport { useGetSettings } from '../../../services/settings';\r\nimport PlanAdvancedSettings from '../PlanSettings/PlanAdvancedSettings';\r\nimport { isPlanSettingsValid } from '../../../utils/plans';\r\nimport IntervalField from '../../common/form/IntervalField/IntervalField';\r\nimport PlanFormNav from './PlanFormNav';\r\nimport { useGetDevice } from '../../../services/devices';\r\nimport PlanPruneSettings from '../PlanSettings/PlanPruneSettings';\r\nimport PlanReplicationSettings from '../PlanSettings/PlanReplicationSettings';\r\n\r\ntype PlanFormProps = {\r\n title: string;\r\n planSettings: NewPlanSettings;\r\n type: 'add' | 'edit';\r\n onPlanSettingsChange: (settings: NewPlanSettings) => void;\r\n onSubmit: () => void;\r\n isSubmitting: boolean;\r\n close: () => void;\r\n storagePath?: string;\r\n storageId?: string;\r\n planId?: string;\r\n};\r\n\r\nconst PlanForm = ({\r\n title,\r\n planSettings,\r\n type,\r\n onPlanSettingsChange,\r\n onSubmit,\r\n isSubmitting,\r\n close,\r\n storagePath,\r\n storageId,\r\n planId,\r\n}: PlanFormProps) => {\r\n const [step, setStep] = useState<number>(1);\r\n\r\n const { data: settingsData } = useGetSettings();\r\n const appSettings = settingsData?.result?.settings || {};\r\n // const smtpConnected = appSettings?.integration?.smtp?.connected ? true : false;\r\n\r\n const { data: deviceData } = useGetDevice('main', true);\r\n const deviceInstance = deviceData?.result?.device;\r\n\r\n const buttonTexts: Record<number, { title: string; onClick: () => void }> = {\r\n 1: {\r\n title: 'Next: Configure Source & Destination',\r\n onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1),\r\n },\r\n 2: {\r\n title: 'Next: Setup Schedule & Retention',\r\n onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1),\r\n },\r\n 3: { title: 'Next: Advanced Settings', onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1) },\r\n 4: {\r\n title: 'Create Plan',\r\n onClick: () => isPlanSettingsValid(planSettings, false) && onSubmit(),\r\n },\r\n };\r\n\r\n const gotoStep = (nStep: number) => {\r\n if (type !== 'edit') {\r\n return;\r\n }\r\n\r\n const isSettingsValid = isPlanSettingsValid(planSettings, step);\r\n if (isSettingsValid) {\r\n setStep(nStep);\r\n }\r\n };\r\n\r\n return (\r\n <SidePanel\r\n title={title}\r\n icon={<Icon type={'backup'} size={20} />}\r\n width={type === 'add' ? '100%' : undefined}\r\n headerWidth={type === 'add' ? '740px' : undefined}\r\n close={close}\r\n withTabs={true}\r\n footer={\r\n <div className={PFClasses.planFormFooter}>\r\n <div className={PFClasses.footerContainer}>\r\n <div className={classes.footerLeft}>\r\n <div className={classes.summary}>\r\n {type === 'add' && step > 1 && (\r\n <button className={PFClasses.backButton} onClick={() => step > 0 && setStep(step - 1)} disabled={isSubmitting}>\r\n <Icon type=\"arrow-left\" size={14} /> Back\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n <div className={classes.footerRight}>\r\n {type === 'add' ? (\r\n <button className={classes.createButton} onClick={buttonTexts[step].onClick}>\r\n <Icon type=\"check\" size={12} /> {buttonTexts[step].title}\r\n </button>\r\n ) : (\r\n <button className={classes.createButton} onClick={() => isPlanSettingsValid(planSettings, false) && onSubmit()}>\r\n <Icon type=\"check\" size={12} /> {'Update Plan'}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n >\r\n <PlanFormNav step={step} type={type} gotoStep={gotoStep} />\r\n\r\n <div className={`${PFClasses.formContent} styled__scrollbar`}>\r\n {isSubmitting && (\r\n <div className={classes.loader}>\r\n <Icon size={36} type=\"loading\" />\r\n </div>\r\n )}\r\n {step === 1 && (\r\n <div className={PFClasses.planStep}>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Plan Name*</label>\r\n {!planSettings.title && <span className={classes.fieldErrorLabel}>{'Required'}</span>}\r\n <input\r\n className={classes.titleInput}\r\n type=\"text\"\r\n placeholder=\"Plan Name\"\r\n value={planSettings.title || ''}\r\n onChange={(e) => onPlanSettingsChange({ ...planSettings, title: e.target.value })}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Plan Description</label>\r\n <input\r\n className={classes.titleInput}\r\n type=\"text\"\r\n placeholder=\"Plan Description\"\r\n value={planSettings.description || ''}\r\n onChange={(e) => onPlanSettingsChange({ ...planSettings, description: e.target.value })}\r\n />\r\n </div>\r\n {/* <PlanTypeSettings\r\n plan={planSettings}\r\n onUpdate={(plan: NewPlanSettings) => onPlanSettingsChange({ ...plan })}\r\n disabled={type === 'edit' ? true : false}\r\n options={[\r\n {\r\n value: 'device',\r\n icon: 'computer',\r\n label: 'Device',\r\n description: 'Backup content of a Computer/Server',\r\n },\r\n {\r\n value: 'database',\r\n icon: 'database',\r\n label: 'Database',\r\n description: 'Backup a Database',\r\n disabled: true,\r\n },\r\n {\r\n value: 'googleworkspace',\r\n icon: 'google-workspace',\r\n label: 'Google Workspace',\r\n description: 'Backup Google Workspace',\r\n disabled: true,\r\n },\r\n {\r\n value: 'microsoft365',\r\n icon: 'microsoft-365',\r\n label: 'Microsoft 365',\r\n description: 'Backup Microsoft 365',\r\n disabled: true,\r\n },\r\n ]}\r\n /> */}\r\n {planSettings.sourceType === 'device' && (\r\n <PlanStrategySettings\r\n plan={planSettings}\r\n onUpdate={(method) => onPlanSettingsChange({ ...planSettings, method })}\r\n disabled={type === 'edit' ? true : false}\r\n options={[\r\n {\r\n value: 'backup',\r\n icon: 'backup',\r\n label: 'Incremental Backup',\r\n description: 'Periodically create Incremental backup snapshots of source',\r\n },\r\n // {\r\n // value: 'sync',\r\n // icon: 'reload',\r\n // label: 'Real-time Sync',\r\n // description: 'Maintain identical source (with revisions)',\r\n // disabled: true,\r\n // },\r\n // {\r\n // value: 'rescue',\r\n // icon: 'rescue',\r\n // label: 'Linux Server Backup',\r\n // description: 'Full Linux system backups with bootable ISO image',\r\n // disabled: true,\r\n // },\r\n ]}\r\n />\r\n )}\r\n </div>\r\n )}\r\n {step === 2 && (\r\n <div className={PFClasses.planStep}>\r\n <PlanSourceSettings\r\n plan={planSettings}\r\n onUpdate={(plan) => onPlanSettingsChange({ ...plan })}\r\n isEditing={type === 'edit' ? true : false}\r\n error={planSettings.sourceConfig.includes.length === 0 ? 'Required' : ''}\r\n />\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Destination*</label>\r\n {!planSettings.storage.name && <span className={classes.fieldErrorLabel}>{'Required'}</span>}\r\n <StoragePicker\r\n storagePath={storagePath || planSettings.storagePath}\r\n storageId={storageId || planSettings.storage?.id || ''}\r\n deviceId={planSettings.sourceId || 'main'}\r\n disabled={type === 'edit' ? true : false}\r\n onUpdate={(s: { storage: { name: string; id: string; type: string }; path: string }) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n storagePath: s.path,\r\n storage: { id: s.storage.id, name: s.storage.name },\r\n })\r\n }\r\n />\r\n </div>\r\n <PlanReplicationSettings\r\n replication={planSettings.settings.replication}\r\n primaryStorageId={planSettings.storage.id}\r\n primaryStoragePath={planSettings.storagePath}\r\n deviceId={planSettings.sourceId || 'main'}\r\n isEditing={type === 'edit' ? true : false}\r\n planID={planId}\r\n onUpdate={(replication) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, replication: replication },\r\n })\r\n }\r\n />\r\n </div>\r\n )}\r\n {step === 3 && (\r\n <div className={PFClasses.planStep}>\r\n <div className={classes.field} style={{ width: '150px' }}>\r\n <IntervalField\r\n label=\"Backup Interval\"\r\n fieldValue={planSettings.settings.interval}\r\n onUpdate={(intervalSettings) =>\r\n onPlanSettingsChange({ ...planSettings, settings: { ...planSettings.settings, interval: intervalSettings } })\r\n }\r\n />\r\n </div>\r\n <PlanPruneSettings\r\n plan={planSettings}\r\n onUpdate={(pruneSettings) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, prune: pruneSettings },\r\n })\r\n }\r\n />\r\n </div>\r\n )}\r\n {step === 4 && (\r\n <div className={PFClasses.planStep}>\r\n <PlanAdvancedSettings plan={planSettings} appSettings={appSettings} onUpdate={onPlanSettingsChange} device={deviceInstance} />\r\n </div>\r\n )}\r\n </div>\r\n </SidePanel>\r\n );\r\n};\r\n\r\nexport default PlanForm;\r\n"],"names":["PlanForm","title","planSettings","type","onPlanSettingsChange","onSubmit","isSubmitting","close","storagePath","storageId","planId","step","setStep","useState","settingsData","useGetSettings","appSettings","_a","deviceData","useGetDevice","deviceInstance","_b","buttonTexts","isPlanSettingsValid","gotoStep","nStep","jsxs","SidePanel","jsx","Icon","PFClasses","classes","PlanFormNav","e","PlanStrategySettings","method","PlanSourceSettings","plan","StoragePicker","_c","s","PlanReplicationSettings","replication","IntervalField","intervalSettings","PlanPruneSettings","pruneSettings","PlanAdvancedSettings"],"mappings":"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"}
@@ -34,7 +34,7 @@ const w = ({ planId: r, history: s, itemsCount: a = 10 }) => {
34
34
  <div><b>Changes</b>: ${$(t.changes)}</div>
35
35
  <div><b>Started</b>: ${p(t.started)}</div>
36
36
  <div><b>Ended</b>: ${t.ended ? p(t.ended) : " - "}</div>
37
- <div><b>Duration</b>: ${d ? c(d) : "0ms"} </div>
37
+ <div><b>Duration</b>: ${t.status !== "started" && d ? c(d) : "-"} </div>
38
38
  `,
39
39
  "data-tooltip-place": "top"
40
40
  },
@@ -1 +1 @@
1
- {"version":3,"file":"PlanHistory.js","sources":["../../../../src/components/Plan/PlanHistory/PlanHistory.tsx"],"sourcesContent":["import { Plan } from '../../../@types/plans';\r\nimport { formatDateTime, formatDuration } from '../../../utils/helpers';\r\nimport classes from './PlanHistory.module.scss';\r\n\r\ninterface PlanHistoryProps {\r\n planId: string;\r\n history: Plan['backups'];\r\n itemsCount?: number;\r\n}\r\nconst PlanHistory = ({ planId, history, itemsCount = 10 }: PlanHistoryProps) => {\r\n const emptySlots = history.length < itemsCount ? itemsCount - history.length : 0;\r\n const statusVals = {\r\n completed: '✔️ Completed',\r\n failed: '❌ Failed',\r\n started: '⏳ In Progress',\r\n cancelled: '🛇 Cancelled',\r\n };\r\n\r\n const backupChanges = (changes: { new?: number; modified?: number; removed?: number }) => {\r\n const newCount = changes?.new || 0;\r\n const modifiedCount = changes?.modified || 0;\r\n const removedCount = changes?.removed || 0;\r\n const parts = [];\r\n if (newCount > 0) parts.push(`${newCount} New`);\r\n if (modifiedCount > 0) parts.push(`${modifiedCount} Modified`);\r\n if (removedCount > 0) parts.push(`${removedCount} Removed`);\r\n return parts.length > 0 ? parts.join(' / ') : 'No Changes';\r\n };\r\n\r\n return (\r\n <div className={`${classes.history} ${itemsCount > 10 ? classes.historyFull : ''}`}>\r\n {emptySlots > 0 &&\r\n [...Array(emptySlots)].map((_, i) => (\r\n <div\r\n className={classes.historyItemEmpty}\r\n key={`${planId}-empty-${i}`}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-content=\"No History\"\r\n data-tooltip-place=\"top\"\r\n ></div>\r\n ))}\r\n\r\n {history.slice(0, itemsCount).map((h, i) => {\r\n const duration = h.duration || (h.ended ? (new Date(h.ended).getTime() - new Date(h.started).getTime()) / 1000 : 0);\r\n return (\r\n <div\r\n className={`${h.status === 'completed' ? classes.historyItemSuccess : ''} ${h.status === 'failed' || h.status === 'cancelled' ? classes.historyItemFailed : ''} ${h.inProgress ? classes.historyItemPending : ''}`}\r\n key={`${planId}-history-${i}`}\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-html={`\r\n <div><b>Status</b>: ${statusVals[h.status as keyof typeof statusVals] || 'Unknown'}</div>\r\n <div><b>Changes</b>: ${backupChanges(h.changes)}</div>\r\n <div><b>Started</b>: ${formatDateTime(h.started)}</div>\r\n <div><b>Ended</b>: ${h.ended ? formatDateTime(h.ended) : ' - '}</div>\r\n <div><b>Duration</b>: ${duration ? formatDuration(duration) : '0ms'} </div>\r\n `}\r\n data-tooltip-place=\"top\"\r\n ></div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanHistory;\r\n"],"names":["PlanHistory","planId","history","itemsCount","emptySlots","statusVals","backupChanges","changes","newCount","modifiedCount","removedCount","parts","jsxs","classes","_","i","jsx","h","duration","formatDateTime","formatDuration"],"mappings":";;;AASA,MAAMA,IAAc,CAAC,EAAE,QAAAC,GAAQ,SAAAC,GAAS,YAAAC,IAAa,SAA2B;AAC7E,QAAMC,IAAaF,EAAQ,SAASC,IAAaA,IAAaD,EAAQ,SAAS,GACzEG,IAAa;AAAA,IAChB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,EAAA,GAGRC,IAAgB,CAACC,MAAmE;AACvF,UAAMC,KAAWD,KAAA,gBAAAA,EAAS,QAAO,GAC3BE,KAAgBF,KAAA,gBAAAA,EAAS,aAAY,GACrCG,KAAeH,KAAA,gBAAAA,EAAS,YAAW,GACnCI,IAAQ,CAAA;AACd,WAAIH,IAAW,KAAGG,EAAM,KAAK,GAAGH,CAAQ,MAAM,GAC1CC,IAAgB,KAAGE,EAAM,KAAK,GAAGF,CAAa,WAAW,GACzDC,IAAe,KAAGC,EAAM,KAAK,GAAGD,CAAY,UAAU,GACnDC,EAAM,SAAS,IAAIA,EAAM,KAAK,KAAK,IAAI;AAAA,EACjD;AAEA,SACG,gBAAAC,EAAC,OAAA,EAAI,WAAW,GAAGC,EAAQ,OAAO,IAAIV,IAAa,KAAKU,EAAQ,cAAc,EAAE,IAC5E,UAAA;AAAA,IAAAT,IAAa,KACX,CAAC,GAAG,MAAMA,CAAU,CAAC,EAAE,IAAI,CAACU,GAAGC,MAC5B,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACE,WAAWH,EAAQ;AAAA,QAEnB,mBAAgB;AAAA,QAChB,wBAAqB;AAAA,QACrB,sBAAmB;AAAA,MAAA;AAAA,MAHd,GAAGZ,CAAM,UAAUc,CAAC;AAAA,IAAA,CAK9B;AAAA,IAEHb,EAAQ,MAAM,GAAGC,CAAU,EAAE,IAAI,CAACc,GAAGF,MAAM;AACzC,YAAMG,IAAWD,EAAE,aAAaA,EAAE,SAAS,IAAI,KAAKA,EAAE,KAAK,EAAE,QAAA,IAAY,IAAI,KAAKA,EAAE,OAAO,EAAE,QAAA,KAAa,MAAO;AACjH,aACG,gBAAAD;AAAA,QAAC;AAAA,QAAA;AAAA,UACE,WAAW,GAAGC,EAAE,WAAW,cAAcJ,EAAQ,qBAAqB,EAAE,IAAII,EAAE,WAAW,YAAYA,EAAE,WAAW,cAAcJ,EAAQ,oBAAoB,EAAE,IAAII,EAAE,aAAaJ,EAAQ,qBAAqB,EAAE;AAAA,UAEhN,mBAAgB;AAAA,UAChB,qBAAmB;AAAA,wCACGR,EAAWY,EAAE,MAAiC,KAAK,SAAS;AAAA,yCAC3DX,EAAcW,EAAE,OAAO,CAAC;AAAA,yCACxBE,EAAeF,EAAE,OAAO,CAAC;AAAA,uCAC3BA,EAAE,QAAQE,EAAeF,EAAE,KAAK,IAAI,KAAK;AAAA,0CACtCC,IAAWE,EAAeF,CAAQ,IAAI,KAAK;AAAA;AAAA,UAEnE,sBAAmB;AAAA,QAAA;AAAA,QATd,GAAGjB,CAAM,YAAYc,CAAC;AAAA,MAAA;AAAA,IAYpC,CAAC;AAAA,EAAA,GACJ;AAEN;"}
1
+ {"version":3,"file":"PlanHistory.js","sources":["../../../../src/components/Plan/PlanHistory/PlanHistory.tsx"],"sourcesContent":["import { Plan } from '../../../@types/plans';\r\nimport { formatDateTime, formatDuration } from '../../../utils/helpers';\r\nimport classes from './PlanHistory.module.scss';\r\n\r\ninterface PlanHistoryProps {\r\n planId: string;\r\n history: Plan['backups'];\r\n itemsCount?: number;\r\n}\r\nconst PlanHistory = ({ planId, history, itemsCount = 10 }: PlanHistoryProps) => {\r\n const emptySlots = history.length < itemsCount ? itemsCount - history.length : 0;\r\n const statusVals = {\r\n completed: '✔️ Completed',\r\n failed: '❌ Failed',\r\n started: '⏳ In Progress',\r\n cancelled: '🛇 Cancelled',\r\n };\r\n\r\n const backupChanges = (changes: { new?: number; modified?: number; removed?: number }) => {\r\n const newCount = changes?.new || 0;\r\n const modifiedCount = changes?.modified || 0;\r\n const removedCount = changes?.removed || 0;\r\n const parts = [];\r\n if (newCount > 0) parts.push(`${newCount} New`);\r\n if (modifiedCount > 0) parts.push(`${modifiedCount} Modified`);\r\n if (removedCount > 0) parts.push(`${removedCount} Removed`);\r\n return parts.length > 0 ? parts.join(' / ') : 'No Changes';\r\n };\r\n\r\n return (\r\n <div className={`${classes.history} ${itemsCount > 10 ? classes.historyFull : ''}`}>\r\n {emptySlots > 0 &&\r\n [...Array(emptySlots)].map((_, i) => (\r\n <div\r\n className={classes.historyItemEmpty}\r\n key={`${planId}-empty-${i}`}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-content=\"No History\"\r\n data-tooltip-place=\"top\"\r\n ></div>\r\n ))}\r\n\r\n {history.slice(0, itemsCount).map((h, i) => {\r\n const duration = h.duration || (h.ended ? (new Date(h.ended).getTime() - new Date(h.started).getTime()) / 1000 : 0);\r\n return (\r\n <div\r\n className={`${h.status === 'completed' ? classes.historyItemSuccess : ''} ${h.status === 'failed' || h.status === 'cancelled' ? classes.historyItemFailed : ''} ${h.inProgress ? classes.historyItemPending : ''}`}\r\n key={`${planId}-history-${i}`}\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-html={`\r\n <div><b>Status</b>: ${statusVals[h.status as keyof typeof statusVals] || 'Unknown'}</div>\r\n <div><b>Changes</b>: ${backupChanges(h.changes)}</div>\r\n <div><b>Started</b>: ${formatDateTime(h.started)}</div>\r\n <div><b>Ended</b>: ${h.ended ? formatDateTime(h.ended) : ' - '}</div>\r\n <div><b>Duration</b>: ${h.status !== 'started' && duration ? formatDuration(duration) : '-'} </div>\r\n `}\r\n data-tooltip-place=\"top\"\r\n ></div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanHistory;\r\n"],"names":["PlanHistory","planId","history","itemsCount","emptySlots","statusVals","backupChanges","changes","newCount","modifiedCount","removedCount","parts","jsxs","classes","_","i","jsx","h","duration","formatDateTime","formatDuration"],"mappings":";;;AASA,MAAMA,IAAc,CAAC,EAAE,QAAAC,GAAQ,SAAAC,GAAS,YAAAC,IAAa,SAA2B;AAC7E,QAAMC,IAAaF,EAAQ,SAASC,IAAaA,IAAaD,EAAQ,SAAS,GACzEG,IAAa;AAAA,IAChB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,EAAA,GAGRC,IAAgB,CAACC,MAAmE;AACvF,UAAMC,KAAWD,KAAA,gBAAAA,EAAS,QAAO,GAC3BE,KAAgBF,KAAA,gBAAAA,EAAS,aAAY,GACrCG,KAAeH,KAAA,gBAAAA,EAAS,YAAW,GACnCI,IAAQ,CAAA;AACd,WAAIH,IAAW,KAAGG,EAAM,KAAK,GAAGH,CAAQ,MAAM,GAC1CC,IAAgB,KAAGE,EAAM,KAAK,GAAGF,CAAa,WAAW,GACzDC,IAAe,KAAGC,EAAM,KAAK,GAAGD,CAAY,UAAU,GACnDC,EAAM,SAAS,IAAIA,EAAM,KAAK,KAAK,IAAI;AAAA,EACjD;AAEA,SACG,gBAAAC,EAAC,OAAA,EAAI,WAAW,GAAGC,EAAQ,OAAO,IAAIV,IAAa,KAAKU,EAAQ,cAAc,EAAE,IAC5E,UAAA;AAAA,IAAAT,IAAa,KACX,CAAC,GAAG,MAAMA,CAAU,CAAC,EAAE,IAAI,CAACU,GAAGC,MAC5B,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACE,WAAWH,EAAQ;AAAA,QAEnB,mBAAgB;AAAA,QAChB,wBAAqB;AAAA,QACrB,sBAAmB;AAAA,MAAA;AAAA,MAHd,GAAGZ,CAAM,UAAUc,CAAC;AAAA,IAAA,CAK9B;AAAA,IAEHb,EAAQ,MAAM,GAAGC,CAAU,EAAE,IAAI,CAACc,GAAGF,MAAM;AACzC,YAAMG,IAAWD,EAAE,aAAaA,EAAE,SAAS,IAAI,KAAKA,EAAE,KAAK,EAAE,QAAA,IAAY,IAAI,KAAKA,EAAE,OAAO,EAAE,QAAA,KAAa,MAAO;AACjH,aACG,gBAAAD;AAAA,QAAC;AAAA,QAAA;AAAA,UACE,WAAW,GAAGC,EAAE,WAAW,cAAcJ,EAAQ,qBAAqB,EAAE,IAAII,EAAE,WAAW,YAAYA,EAAE,WAAW,cAAcJ,EAAQ,oBAAoB,EAAE,IAAII,EAAE,aAAaJ,EAAQ,qBAAqB,EAAE;AAAA,UAEhN,mBAAgB;AAAA,UAChB,qBAAmB;AAAA,wCACGR,EAAWY,EAAE,MAAiC,KAAK,SAAS;AAAA,yCAC3DX,EAAcW,EAAE,OAAO,CAAC;AAAA,yCACxBE,EAAeF,EAAE,OAAO,CAAC;AAAA,uCAC3BA,EAAE,QAAQE,EAAeF,EAAE,KAAK,IAAI,KAAK;AAAA,0CACtCA,EAAE,WAAW,aAAaC,IAAWE,EAAeF,CAAQ,IAAI,GAAG;AAAA;AAAA,UAE3F,sBAAmB;AAAA,QAAA;AAAA,QATd,GAAGjB,CAAM,YAAYc,CAAC;AAAA,MAAA;AAAA,IAYpC,CAAC;AAAA,EAAA,GACJ;AAEN;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlanPruneModal.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanPruneModal/PlanPruneModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD,UAAU,mBAAmB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,QAAA,MAAM,cAAc,GAAI,+DAA+D,mBAAmB,4CA0CzG,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"PlanPruneModal.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanPruneModal/PlanPruneModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD,UAAU,mBAAmB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,QAAA,MAAM,cAAc,GAAI,+DAA+D,mBAAmB,4CAqFzG,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -1,37 +1,73 @@
1
- import { jsx as a, Fragment as i, jsxs as l } from "react/jsx-runtime";
2
- import { usePrunePlan as p } from "../../../services/plans.js";
3
- import { planIntervalAgeName as m } from "../../../utils/plans.js";
4
- import d from "../../common/ActionModal/ActionModal.js";
5
- const h = ({ planId: r, method: n, prune: e, snapshotsCount: s, taskPending: c, close: t }) => {
6
- const o = p();
7
- return /* @__PURE__ */ a(
8
- d,
1
+ import { jsx as i, Fragment as a, jsxs as n } from "react/jsx-runtime";
2
+ import { usePrunePlan as k } from "../../../services/plans.js";
3
+ import { planIntervalAgeName as r } from "../../../utils/plans.js";
4
+ import y from "../../common/ActionModal/ActionModal.js";
5
+ const w = ({ planId: c, method: t, prune: e, snapshotsCount: s, taskPending: p, close: l }) => {
6
+ const o = k(), u = () => {
7
+ switch (e.policy) {
8
+ case "keepLast":
9
+ return /* @__PURE__ */ n(a, { children: [
10
+ "Your plan is set to keep the last ",
11
+ e.snapCount,
12
+ " backups.",
13
+ " ",
14
+ e.snapCount < s ? `Running prune now will remove ${s - e.snapCount} older snapshots, freeing up some storage space.` : "There are no excess snapshots to clean up."
15
+ ] });
16
+ case "forgetByAge":
17
+ return /* @__PURE__ */ n(a, { children: [
18
+ "Your plan is set to remove backups older than ",
19
+ r(e.forgetAge || "3m"),
20
+ ", while always keeping at least",
21
+ " ",
22
+ e.snapCount || 1,
23
+ " backup",
24
+ (e.snapCount || 1) > 1 ? "s" : "",
25
+ ". This action will remove any backups that exceed the retention policy."
26
+ ] });
27
+ case "custom":
28
+ return /* @__PURE__ */ n(a, { children: [
29
+ "Your plan uses an advanced retention policy",
30
+ e.keepDailySnaps ? `, keeping daily backups for ${e.keepDailySnaps} days` : "",
31
+ e.keepWeeklySnaps ? `, weekly backups for ${e.keepWeeklySnaps} weeks` : "",
32
+ e.keepMonthlySnaps ? `, monthly backups for ${e.keepMonthlySnaps} months` : "",
33
+ ", while always keeping at least",
34
+ " ",
35
+ e.snapCount || 1,
36
+ " backup",
37
+ (e.snapCount || 1) > 1 ? "s" : "",
38
+ ". This action will remove any backups that exceed the retention policy."
39
+ ] });
40
+ case "disable":
41
+ return /* @__PURE__ */ i(a, { children: "Pruning is disabled for this plan. No backups will be removed." });
42
+ default:
43
+ return /* @__PURE__ */ n(a, { children: [
44
+ "Your plan is set to maintain ",
45
+ e.snapCount,
46
+ " recent backups.",
47
+ " ",
48
+ e.snapCount < s ? `Running prune now will remove ${s - e.snapCount} older snapshots, freeing up some storage space.` : "There are no excess snapshots to clean up."
49
+ ] });
50
+ }
51
+ }, d = () => !(e.policy === "disable" || e.policy === "keepLast" && e.snapCount >= s);
52
+ return /* @__PURE__ */ i(
53
+ y,
9
54
  {
10
- title: n === "sync" ? "Clean Up Old Revisions" : "Clean Up Old Backups",
11
- message: /* @__PURE__ */ a(i, { children: n === "sync" ? /* @__PURE__ */ l(i, { children: [
55
+ title: t === "sync" ? "Clean Up Old Revisions" : "Clean Up Old Backups",
56
+ message: /* @__PURE__ */ i(a, { children: t === "sync" ? /* @__PURE__ */ n(a, { children: [
12
57
  "Your plan is set to maintain",
13
58
  " ",
14
- e.policy === "forgetByAge" ? `file revisions newer than ${m(e.forgetAge || "3m")}.` : "",
15
- " ",
16
- e.policy === "forgetByFileCount" ? `Only keep the last ${e.snapCount} versions of each file.` : "",
59
+ e.policy === "forgetByAge" ? `file revisions newer than ${r(e.forgetAge || "3m")}.` : "",
17
60
  " This action will remove any excess file revisions older than the retention policy."
18
- ] }) : /* @__PURE__ */ l(i, { children: [
19
- "Your plan is set to maintain ",
20
- e.snapCount,
21
- " recent backups(snapshots).",
22
- " ",
23
- e.snapCount < s ? `Running prune now will remove
24
- ${s - e.snapCount} older snapshots, freeing up some storage space` : "There are no excess snapshots to clean up."
25
- ] }) }),
26
- closeModal: () => !o.isPending && t(),
61
+ ] }) : u() }),
62
+ closeModal: () => !o.isPending && l(),
27
63
  width: "500px",
28
64
  primaryAction: {
29
- title: n === "sync" ? "Yes, Remove Old Revisions" : e.snapCount < s ? "Yes, Remove Old Backups" : "",
65
+ title: t === "sync" ? "Yes, Remove Old Revisions" : d() ? "Yes, Remove Old Backups" : "",
30
66
  type: "default",
31
67
  isPending: o.isPending,
32
- action: () => !c && o.mutate(r, {
68
+ action: () => !p && o.mutate(c, {
33
69
  onSuccess: () => {
34
- t();
70
+ l();
35
71
  }
36
72
  })
37
73
  }
@@ -39,6 +75,6 @@ const h = ({ planId: r, method: n, prune: e, snapshotsCount: s, taskPending: c,
39
75
  );
40
76
  };
41
77
  export {
42
- h as default
78
+ w as default
43
79
  };
44
80
  //# sourceMappingURL=PlanPruneModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanPruneModal.js","sources":["../../../../src/components/Plan/PlanPruneModal/PlanPruneModal.tsx"],"sourcesContent":["import { PlanPrune } from '../../../@types/plans';\r\nimport { usePrunePlan } from '../../../services/plans';\r\nimport { planIntervalAgeName } from '../../../utils/plans';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\n\r\ninterface PlanPruneModalProps {\r\n planId: string;\r\n method: string;\r\n prune: PlanPrune;\r\n snapshotsCount: number;\r\n taskPending: boolean;\r\n close: () => void;\r\n}\r\n\r\nconst PlanPruneModal = ({ planId, method, prune, snapshotsCount, taskPending, close }: PlanPruneModalProps) => {\r\n const pruneMutation = usePrunePlan();\r\n\r\n return (\r\n <ActionModal\r\n title={method === 'sync' ? 'Clean Up Old Revisions' : 'Clean Up Old Backups'}\r\n message={\r\n <>\r\n {method === 'sync' ? (\r\n <>\r\n Your plan is set to maintain{' '}\r\n {prune.policy === 'forgetByAge' ? `file revisions newer than ${planIntervalAgeName(prune.forgetAge || '3m')}.` : ''}{' '}\r\n {prune.policy === 'forgetByFileCount' ? `Only keep the last ${prune.snapCount} versions of each file.` : ''} This action will\r\n remove any excess file revisions older than the retention policy.\r\n </>\r\n ) : (\r\n <>\r\n Your plan is set to maintain {prune.snapCount} recent backups(snapshots).{' '}\r\n {prune.snapCount < snapshotsCount\r\n ? `Running prune now will remove ${' '}\r\n ${snapshotsCount - prune.snapCount} older snapshots, freeing up some storage space`\r\n : 'There are no excess snapshots to clean up.'}\r\n </>\r\n )}\r\n </>\r\n }\r\n closeModal={() => !pruneMutation.isPending && close()}\r\n width=\"500px\"\r\n primaryAction={{\r\n title: method === 'sync' ? `Yes, Remove Old Revisions` : prune.snapCount < snapshotsCount ? 'Yes, Remove Old Backups' : '',\r\n type: 'default',\r\n isPending: pruneMutation.isPending,\r\n action: () =>\r\n !taskPending &&\r\n pruneMutation.mutate(planId, {\r\n onSuccess: () => {\r\n close();\r\n },\r\n }),\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default PlanPruneModal;\r\n"],"names":["PlanPruneModal","planId","method","prune","snapshotsCount","taskPending","close","pruneMutation","usePrunePlan","jsx","ActionModal","Fragment","jsxs","planIntervalAgeName"],"mappings":";;;;AAcA,MAAMA,IAAiB,CAAC,EAAE,QAAAC,GAAQ,QAAAC,GAAQ,OAAAC,GAAO,gBAAAC,GAAgB,aAAAC,GAAa,OAAAC,QAAiC;AAC5G,QAAMC,IAAgBC,EAAA;AAEtB,SACG,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,OAAOR,MAAW,SAAS,2BAA2B;AAAA,MACtD,SACG,gBAAAO,EAAAE,GAAA,EACI,UAAAT,MAAW,SACT,gBAAAU,EAAAD,GAAA,EAAE,UAAA;AAAA,QAAA;AAAA,QAC8B;AAAA,QAC5BR,EAAM,WAAW,gBAAgB,6BAA6BU,EAAoBV,EAAM,aAAa,IAAI,CAAC,MAAM;AAAA,QAAI;AAAA,QACpHA,EAAM,WAAW,sBAAsB,sBAAsBA,EAAM,SAAS,4BAA4B;AAAA,QAAG;AAAA,MAAA,EAAA,CAE/G,IAEA,gBAAAS,EAAAD,GAAA,EAAE,UAAA;AAAA,QAAA;AAAA,QAC+BR,EAAM;AAAA,QAAU;AAAA,QAA4B;AAAA,QACzEA,EAAM,YAAYC,IACd;AAAA,0BACAA,IAAiBD,EAAM,SAAS,oDAChC;AAAA,MAAA,EAAA,CACR,EAAA,CAEN;AAAA,MAEH,YAAY,MAAM,CAACI,EAAc,aAAaD,EAAA;AAAA,MAC9C,OAAM;AAAA,MACN,eAAe;AAAA,QACZ,OAAOJ,MAAW,SAAS,8BAA8BC,EAAM,YAAYC,IAAiB,4BAA4B;AAAA,QACxH,MAAM;AAAA,QACN,WAAWG,EAAc;AAAA,QACzB,QAAQ,MACL,CAACF,KACDE,EAAc,OAAON,GAAQ;AAAA,UAC1B,WAAW,MAAM;AACd,YAAAK,EAAA;AAAA,UACH;AAAA,QAAA,CACF;AAAA,MAAA;AAAA,IACP;AAAA,EAAA;AAGT;"}
1
+ {"version":3,"file":"PlanPruneModal.js","sources":["../../../../src/components/Plan/PlanPruneModal/PlanPruneModal.tsx"],"sourcesContent":["import { PlanPrune } from '../../../@types/plans';\r\nimport { usePrunePlan } from '../../../services/plans';\r\nimport { planIntervalAgeName } from '../../../utils/plans';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\n\r\ninterface PlanPruneModalProps {\r\n planId: string;\r\n method: string;\r\n prune: PlanPrune;\r\n snapshotsCount: number;\r\n taskPending: boolean;\r\n close: () => void;\r\n}\r\n\r\nconst PlanPruneModal = ({ planId, method, prune, snapshotsCount, taskPending, close }: PlanPruneModalProps) => {\r\n const pruneMutation = usePrunePlan();\r\n\r\n const getBackupMessage = () => {\r\n switch (prune.policy) {\r\n case 'keepLast':\r\n return (\r\n <>\r\n Your plan is set to keep the last {prune.snapCount} backups.{' '}\r\n {prune.snapCount < snapshotsCount\r\n ? `Running prune now will remove ${snapshotsCount - prune.snapCount} older snapshots, freeing up some storage space.`\r\n : 'There are no excess snapshots to clean up.'}\r\n </>\r\n );\r\n case 'forgetByAge':\r\n return (\r\n <>\r\n Your plan is set to remove backups older than {planIntervalAgeName(prune.forgetAge || '3m')}, while always keeping at least{' '}\r\n {prune.snapCount || 1} backup{(prune.snapCount || 1) > 1 ? 's' : ''}. This action will remove any backups that exceed the retention\r\n policy.\r\n </>\r\n );\r\n case 'custom':\r\n return (\r\n <>\r\n Your plan uses an advanced retention policy\r\n {prune.keepDailySnaps ? `, keeping daily backups for ${prune.keepDailySnaps} days` : ''}\r\n {prune.keepWeeklySnaps ? `, weekly backups for ${prune.keepWeeklySnaps} weeks` : ''}\r\n {prune.keepMonthlySnaps ? `, monthly backups for ${prune.keepMonthlySnaps} months` : ''}, while always keeping at least{' '}\r\n {prune.snapCount || 1} backup{(prune.snapCount || 1) > 1 ? 's' : ''}. This action will remove any backups that exceed the retention\r\n policy.\r\n </>\r\n );\r\n case 'disable':\r\n return <>Pruning is disabled for this plan. No backups will be removed.</>;\r\n default:\r\n return (\r\n <>\r\n Your plan is set to maintain {prune.snapCount} recent backups.{' '}\r\n {prune.snapCount < snapshotsCount\r\n ? `Running prune now will remove ${snapshotsCount - prune.snapCount} older snapshots, freeing up some storage space.`\r\n : 'There are no excess snapshots to clean up.'}\r\n </>\r\n );\r\n }\r\n };\r\n\r\n const canPrune = () => {\r\n if (prune.policy === 'disable') return false;\r\n if (prune.policy === 'keepLast' && prune.snapCount >= snapshotsCount) return false;\r\n return true;\r\n };\r\n\r\n return (\r\n <ActionModal\r\n title={method === 'sync' ? 'Clean Up Old Revisions' : 'Clean Up Old Backups'}\r\n message={\r\n <>\r\n {method === 'sync' ? (\r\n <>\r\n Your plan is set to maintain{' '}\r\n {prune.policy === 'forgetByAge' ? `file revisions newer than ${planIntervalAgeName(prune.forgetAge || '3m')}.` : ''} This action\r\n will remove any excess file revisions older than the retention policy.\r\n </>\r\n ) : (\r\n getBackupMessage()\r\n )}\r\n </>\r\n }\r\n closeModal={() => !pruneMutation.isPending && close()}\r\n width=\"500px\"\r\n primaryAction={{\r\n title: method === 'sync' ? 'Yes, Remove Old Revisions' : canPrune() ? 'Yes, Remove Old Backups' : '',\r\n type: 'default',\r\n isPending: pruneMutation.isPending,\r\n action: () =>\r\n !taskPending &&\r\n pruneMutation.mutate(planId, {\r\n onSuccess: () => {\r\n close();\r\n },\r\n }),\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default PlanPruneModal;\r\n"],"names":["PlanPruneModal","planId","method","prune","snapshotsCount","taskPending","close","pruneMutation","usePrunePlan","getBackupMessage","jsxs","Fragment","planIntervalAgeName","canPrune","jsx","ActionModal"],"mappings":";;;;AAcA,MAAMA,IAAiB,CAAC,EAAE,QAAAC,GAAQ,QAAAC,GAAQ,OAAAC,GAAO,gBAAAC,GAAgB,aAAAC,GAAa,OAAAC,QAAiC;AAC5G,QAAMC,IAAgBC,EAAA,GAEhBC,IAAmB,MAAM;AAC5B,YAAQN,EAAM,QAAA;AAAA,MACX,KAAK;AACF,eACG,gBAAAO,EAAAC,GAAA,EAAE,UAAA;AAAA,UAAA;AAAA,UACoCR,EAAM;AAAA,UAAU;AAAA,UAAU;AAAA,UAC5DA,EAAM,YAAYC,IACd,iCAAiCA,IAAiBD,EAAM,SAAS,qDACjE;AAAA,QAAA,GACR;AAAA,MAEN,KAAK;AACF,eACG,gBAAAO,EAAAC,GAAA,EAAE,UAAA;AAAA,UAAA;AAAA,UACgDC,EAAoBT,EAAM,aAAa,IAAI;AAAA,UAAE;AAAA,UAAgC;AAAA,UAC3HA,EAAM,aAAa;AAAA,UAAE;AAAA,WAASA,EAAM,aAAa,KAAK,IAAI,MAAM;AAAA,UAAG;AAAA,QAAA,GAEvE;AAAA,MAEN,KAAK;AACF,eACG,gBAAAO,EAAAC,GAAA,EAAE,UAAA;AAAA,UAAA;AAAA,UAEER,EAAM,iBAAiB,+BAA+BA,EAAM,cAAc,UAAU;AAAA,UACpFA,EAAM,kBAAkB,wBAAwBA,EAAM,eAAe,WAAW;AAAA,UAChFA,EAAM,mBAAmB,yBAAyBA,EAAM,gBAAgB,YAAY;AAAA,UAAG;AAAA,UAAgC;AAAA,UACvHA,EAAM,aAAa;AAAA,UAAE;AAAA,WAASA,EAAM,aAAa,KAAK,IAAI,MAAM;AAAA,UAAG;AAAA,QAAA,GAEvE;AAAA,MAEN,KAAK;AACF,sCAAS,UAAA,iEAAA,CAA8D;AAAA,MAC1E;AACG,eACG,gBAAAO,EAAAC,GAAA,EAAE,UAAA;AAAA,UAAA;AAAA,UAC+BR,EAAM;AAAA,UAAU;AAAA,UAAiB;AAAA,UAC9DA,EAAM,YAAYC,IACd,iCAAiCA,IAAiBD,EAAM,SAAS,qDACjE;AAAA,QAAA,GACR;AAAA,IAAA;AAAA,EAGZ,GAEMU,IAAW,MACV,EAAAV,EAAM,WAAW,aACjBA,EAAM,WAAW,cAAcA,EAAM,aAAaC;AAIzD,SACG,gBAAAU;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,OAAOb,MAAW,SAAS,2BAA2B;AAAA,MACtD,SACG,gBAAAY,EAAAH,GAAA,EACI,UAAAT,MAAW,SACT,gBAAAQ,EAAAC,GAAA,EAAE,UAAA;AAAA,QAAA;AAAA,QAC8B;AAAA,QAC5BR,EAAM,WAAW,gBAAgB,6BAA6BS,EAAoBT,EAAM,aAAa,IAAI,CAAC,MAAM;AAAA,QAAG;AAAA,MAAA,GAEvH,IAEAM,KAEN;AAAA,MAEH,YAAY,MAAM,CAACF,EAAc,aAAaD,EAAA;AAAA,MAC9C,OAAM;AAAA,MACN,eAAe;AAAA,QACZ,OAAOJ,MAAW,SAAS,8BAA8BW,EAAA,IAAa,4BAA4B;AAAA,QAClG,MAAM;AAAA,QACN,WAAWN,EAAc;AAAA,QACzB,QAAQ,MACL,CAACF,KACDE,EAAc,OAAON,GAAQ;AAAA,UAC1B,WAAW,MAAM;AACd,YAAAK,EAAA;AAAA,UACH;AAAA,QAAA,CACF;AAAA,MAAA;AAAA,IACP;AAAA,EAAA;AAGT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlanPruneSettings.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSettings/PlanPruneSettings.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,UAAU,sBAAsB;IAC7B,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED,QAAA,MAAM,iBAAiB,GAAI,oBAAoB,sBAAsB,4CAyFpE,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"PlanPruneSettings.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSettings/PlanPruneSettings.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIxD,UAAU,sBAAsB;IAC7B,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED,QAAA,MAAM,iBAAiB,GAAI,oBAAoB,sBAAsB,4CA6KpE,CAAC;AAEF,eAAe,iBAAiB,CAAC"}