@plutonhq/core-frontend 0.1.13 → 0.1.14

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 (186) hide show
  1. package/dist-lib/@types/backups.d.ts +26 -0
  2. package/dist-lib/@types/backups.d.ts.map +1 -1
  3. package/dist-lib/@types/devices.d.ts +7 -0
  4. package/dist-lib/@types/devices.d.ts.map +1 -1
  5. package/dist-lib/@types/plans.d.ts +21 -1
  6. package/dist-lib/@types/plans.d.ts.map +1 -1
  7. package/dist-lib/@types/restores.d.ts +2 -0
  8. package/dist-lib/@types/restores.d.ts.map +1 -1
  9. package/dist-lib/components/Device/DeviceBackups/DeviceBackups.d.ts +3 -2
  10. package/dist-lib/components/Device/DeviceBackups/DeviceBackups.d.ts.map +1 -1
  11. package/dist-lib/components/Device/DeviceBackups/DeviceBackups.js +73 -85
  12. package/dist-lib/components/Device/DeviceBackups/DeviceBackups.js.map +1 -1
  13. package/dist-lib/components/Plan/BackupEvents/BackupEvents.d.ts.map +1 -1
  14. package/dist-lib/components/Plan/BackupEvents/BackupEvents.js +88 -50
  15. package/dist-lib/components/Plan/BackupEvents/BackupEvents.js.map +1 -1
  16. package/dist-lib/components/Plan/BackupEvents/BackupEvents.module.scss.js +70 -38
  17. package/dist-lib/components/Plan/BackupEvents/BackupEvents.module.scss.js.map +1 -1
  18. package/dist-lib/components/Plan/BackupProgress/BackupProgress.d.ts.map +1 -1
  19. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +166 -123
  20. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
  21. package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js +64 -30
  22. package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js.map +1 -1
  23. package/dist-lib/components/Plan/Backups/Backups.d.ts +8 -1
  24. package/dist-lib/components/Plan/Backups/Backups.d.ts.map +1 -1
  25. package/dist-lib/components/Plan/Backups/Backups.js +154 -125
  26. package/dist-lib/components/Plan/Backups/Backups.js.map +1 -1
  27. package/dist-lib/components/Plan/EditPlan/EditPlan.d.ts.map +1 -1
  28. package/dist-lib/components/Plan/EditPlan/EditPlan.js +11 -10
  29. package/dist-lib/components/Plan/EditPlan/EditPlan.js.map +1 -1
  30. package/dist-lib/components/Plan/Mirrors/MirrorDetails.d.ts +12 -0
  31. package/dist-lib/components/Plan/Mirrors/MirrorDetails.d.ts.map +1 -0
  32. package/dist-lib/components/Plan/Mirrors/MirrorDetails.js +68 -0
  33. package/dist-lib/components/Plan/Mirrors/MirrorDetails.js.map +1 -0
  34. package/dist-lib/components/Plan/Mirrors/MirrorDetails.module.scss.js +26 -0
  35. package/dist-lib/components/Plan/Mirrors/MirrorDetails.module.scss.js.map +1 -0
  36. package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.d.ts +11 -0
  37. package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.d.ts.map +1 -0
  38. package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.js +38 -0
  39. package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.js.map +1 -0
  40. package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.module.scss.js +16 -0
  41. package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.module.scss.js.map +1 -0
  42. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.d.ts +14 -0
  43. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.d.ts.map +1 -0
  44. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.js +54 -0
  45. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.js.map +1 -0
  46. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.module.scss.js +26 -0
  47. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.module.scss.js.map +1 -0
  48. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelectorModal.d.ts +15 -0
  49. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelectorModal.d.ts.map +1 -0
  50. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelectorModal.js +34 -0
  51. package/dist-lib/components/Plan/Mirrors/MirrorStorageSelectorModal.js.map +1 -0
  52. package/dist-lib/components/Plan/PlanBackups/PlanBackups.d.ts.map +1 -1
  53. package/dist-lib/components/Plan/PlanBackups/PlanBackups.js +20 -17
  54. package/dist-lib/components/Plan/PlanBackups/PlanBackups.js.map +1 -1
  55. package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts +2 -1
  56. package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
  57. package/dist-lib/components/Plan/PlanForm/PlanForm.js +85 -58
  58. package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
  59. package/dist-lib/components/Plan/PlanItems/PlanItem.d.ts.map +1 -1
  60. package/dist-lib/components/Plan/PlanItems/PlanItem.js +58 -59
  61. package/dist-lib/components/Plan/PlanItems/PlanItem.js.map +1 -1
  62. package/dist-lib/components/Plan/PlanRemoveModal/PlanRemoveModal.js +8 -8
  63. package/dist-lib/components/Plan/PlanRemoveModal/PlanRemoveModal.js.map +1 -1
  64. package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.d.ts +14 -0
  65. package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.d.ts.map +1 -0
  66. package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.js +290 -0
  67. package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.js.map +1 -0
  68. package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.module.scss.js +26 -0
  69. package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.module.scss.js.map +1 -0
  70. package/dist-lib/components/Plan/PlanStats/PlanStats.d.ts.map +1 -1
  71. package/dist-lib/components/Plan/PlanStats/PlanStats.js +41 -42
  72. package/dist-lib/components/Plan/PlanStats/PlanStats.js.map +1 -1
  73. package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js +5 -5
  74. package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.d.ts +15 -0
  75. package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.d.ts.map +1 -0
  76. package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.js +69 -0
  77. package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.js.map +1 -0
  78. package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.module.scss.js +16 -0
  79. package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.module.scss.js.map +1 -0
  80. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.d.ts.map +1 -1
  81. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js +36 -34
  82. package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js.map +1 -1
  83. package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.d.ts.map +1 -1
  84. package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js +7 -5
  85. package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js.map +1 -1
  86. package/dist-lib/components/Restore/RestoreWizard/RestoreSettingsStep.d.ts +12 -4
  87. package/dist-lib/components/Restore/RestoreWizard/RestoreSettingsStep.d.ts.map +1 -1
  88. package/dist-lib/components/Restore/RestoreWizard/RestoreSettingsStep.js +44 -32
  89. package/dist-lib/components/Restore/RestoreWizard/RestoreSettingsStep.js.map +1 -1
  90. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.d.ts +5 -1
  91. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.d.ts.map +1 -1
  92. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.js +48 -44
  93. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.js.map +1 -1
  94. package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js +32 -32
  95. package/dist-lib/components/Settings/GeneralSettings/GeneralSettings.js +14 -14
  96. package/dist-lib/components/Settings/GeneralSettings/GeneralSettings.js.map +1 -1
  97. package/dist-lib/components/Settings/IntegrationSettings/IntegrationSettings.d.ts.map +1 -1
  98. package/dist-lib/components/Settings/IntegrationSettings/IntegrationSettings.js +28 -19
  99. package/dist-lib/components/Settings/IntegrationSettings/IntegrationSettings.js.map +1 -1
  100. package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
  101. package/dist-lib/components/common/Icon/Icon.js +11 -0
  102. package/dist-lib/components/common/Icon/Icon.js.map +1 -1
  103. package/dist-lib/components/common/PageHeader/PageHeader.module.scss.js +6 -6
  104. package/dist-lib/components/index.d.ts +4 -0
  105. package/dist-lib/components/index.d.ts.map +1 -1
  106. package/dist-lib/components.js +86 -78
  107. package/dist-lib/components.js.map +1 -1
  108. package/dist-lib/hooks/usePwaAutoUpdate.d.ts +11 -2
  109. package/dist-lib/hooks/usePwaAutoUpdate.d.ts.map +1 -1
  110. package/dist-lib/hooks/usePwaAutoUpdate.js +32 -10
  111. package/dist-lib/hooks/usePwaAutoUpdate.js.map +1 -1
  112. package/dist-lib/router.d.ts.map +1 -1
  113. package/dist-lib/router.js +46 -35
  114. package/dist-lib/router.js.map +1 -1
  115. package/dist-lib/routes/DeviceSingle/DeviceSingle.d.ts.map +1 -1
  116. package/dist-lib/routes/DeviceSingle/DeviceSingle.js +40 -40
  117. package/dist-lib/routes/DeviceSingle/DeviceSingle.js.map +1 -1
  118. package/dist-lib/services/backups.d.ts +15 -2
  119. package/dist-lib/services/backups.d.ts.map +1 -1
  120. package/dist-lib/services/backups.js +119 -100
  121. package/dist-lib/services/backups.js.map +1 -1
  122. package/dist-lib/services/plans.d.ts +14 -0
  123. package/dist-lib/services/plans.d.ts.map +1 -1
  124. package/dist-lib/services/plans.js +160 -129
  125. package/dist-lib/services/plans.js.map +1 -1
  126. package/dist-lib/services/restores.d.ts +10 -2
  127. package/dist-lib/services/restores.d.ts.map +1 -1
  128. package/dist-lib/services/restores.js +61 -57
  129. package/dist-lib/services/restores.js.map +1 -1
  130. package/dist-lib/services/users.d.ts.map +1 -1
  131. package/dist-lib/services/users.js +32 -32
  132. package/dist-lib/services/users.js.map +1 -1
  133. package/dist-lib/services.js +107 -103
  134. package/dist-lib/styles/core-frontend.css +1 -1
  135. package/dist-lib/utils/progressHelpers.d.ts +12 -1
  136. package/dist-lib/utils/progressHelpers.d.ts.map +1 -1
  137. package/dist-lib/utils/progressHelpers.js +121 -63
  138. package/dist-lib/utils/progressHelpers.js.map +1 -1
  139. package/dist-lib/utils.js +29 -28
  140. package/package.json +1 -1
  141. package/src/@types/backups.ts +28 -0
  142. package/src/@types/devices.ts +8 -0
  143. package/src/@types/plans.ts +23 -1
  144. package/src/@types/restores.ts +2 -0
  145. package/src/components/Device/DeviceBackups/DeviceBackups.tsx +11 -36
  146. package/src/components/Plan/BackupEvents/BackupEvents.module.scss +65 -0
  147. package/src/components/Plan/BackupEvents/BackupEvents.tsx +65 -4
  148. package/src/components/Plan/BackupProgress/BackupProgress.module.scss +121 -3
  149. package/src/components/Plan/BackupProgress/BackupProgress.tsx +149 -71
  150. package/src/components/Plan/Backups/Backups.tsx +52 -4
  151. package/src/components/Plan/EditPlan/EditPlan.tsx +1 -0
  152. package/src/components/Plan/Mirrors/MirrorDetails.module.scss +76 -0
  153. package/src/components/Plan/Mirrors/MirrorDetails.tsx +100 -0
  154. package/src/components/Plan/Mirrors/MirrorStatusBadge.module.scss +25 -0
  155. package/src/components/Plan/Mirrors/MirrorStatusBadge.tsx +65 -0
  156. package/src/components/Plan/Mirrors/MirrorStorageSelector.module.scss +97 -0
  157. package/src/components/Plan/Mirrors/MirrorStorageSelector.tsx +70 -0
  158. package/src/components/Plan/Mirrors/MirrorStorageSelectorModal.tsx +40 -0
  159. package/src/components/Plan/PlanBackups/PlanBackups.tsx +4 -1
  160. package/src/components/Plan/PlanForm/PlanForm.tsx +30 -3
  161. package/src/components/Plan/PlanItems/PlanItem.tsx +3 -3
  162. package/src/components/Plan/PlanRemoveModal/PlanRemoveModal.tsx +1 -1
  163. package/src/components/Plan/PlanSettings/PlanReplicationSettings.module.scss +105 -0
  164. package/src/components/Plan/PlanSettings/PlanReplicationSettings.tsx +334 -0
  165. package/src/components/Plan/PlanStats/PlanStats.module.scss +1 -1
  166. package/src/components/Plan/PlanStats/PlanStats.tsx +8 -8
  167. package/src/components/Plan/PlanStorageInfo/PlanStorageInfo.module.scss +43 -0
  168. package/src/components/Plan/PlanStorageInfo/PlanStorageInfo.tsx +83 -0
  169. package/src/components/Restore/RestoreWizard/RestoreConfirmStep.tsx +2 -0
  170. package/src/components/Restore/RestoreWizard/RestorePreviewStep.tsx +2 -0
  171. package/src/components/Restore/RestoreWizard/RestoreSettingsStep.tsx +36 -13
  172. package/src/components/Restore/RestoreWizard/RestoreWizard.module.scss +4 -0
  173. package/src/components/Restore/RestoreWizard/RestoreWizard.tsx +9 -1
  174. package/src/components/Settings/GeneralSettings/GeneralSettings.tsx +1 -1
  175. package/src/components/Settings/IntegrationSettings/IntegrationSettings.tsx +9 -2
  176. package/src/components/common/Icon/Icon.tsx +10 -1
  177. package/src/components/common/PageHeader/PageHeader.module.scss +3 -0
  178. package/src/components/index.ts +6 -0
  179. package/src/hooks/usePwaAutoUpdate.ts +51 -11
  180. package/src/router.tsx +26 -17
  181. package/src/routes/DeviceSingle/DeviceSingle.tsx +3 -3
  182. package/src/services/backups.ts +32 -9
  183. package/src/services/plans.ts +45 -0
  184. package/src/services/restores.ts +10 -2
  185. package/src/services/users.ts +14 -5
  186. package/src/utils/progressHelpers.ts +85 -1
@@ -0,0 +1,290 @@
1
+ import { jsxs as s, jsx as r } from "react/jsx-runtime";
2
+ import { useState as I, useCallback as J } from "react";
3
+ import g from "../../common/Icon/Icon.js";
4
+ import w from "../../common/form/StoragePicker/StoragePicker.js";
5
+ import N from "../../common/form/Toggle/Toggle.js";
6
+ import f from "../AddPlan/AddPlan.module.scss.js";
7
+ import n from "./PlanReplicationSettings.module.scss.js";
8
+ import K from "../../common/ActionModal/ActionModal.js";
9
+ import { useDeleteReplicationStorage as Q } from "../../../services/plans.js";
10
+ import { toast as A } from "react-toastify";
11
+ import { nanoid as z } from "nanoid";
12
+ const W = {
13
+ enabled: !1,
14
+ concurrent: !1,
15
+ storages: []
16
+ }, P = 2, ne = ({
17
+ replication: B,
18
+ primaryStorageId: C,
19
+ primaryStoragePath: D,
20
+ deviceId: k,
21
+ isEditing: p = !1,
22
+ planID: M,
23
+ maxReplications: v,
24
+ onUpdate: l
25
+ }) => {
26
+ const [d, h] = I([]), [T, u] = I(!1), [R, b] = I(!1), c = Q(), o = B || W, H = J(
27
+ (e, t, a, i) => {
28
+ if (!e || !t) return !1;
29
+ const S = o.storages.some(
30
+ (m, y) => (a === void 0 || y !== a) && m.storageId === e && m.storagePath === t
31
+ ), G = d.some(
32
+ (m, y) => (i === void 0 || y !== i) && m.storageId === e && m.storagePath === t
33
+ );
34
+ return S || G;
35
+ },
36
+ [o.storages, d]
37
+ ), _ = (e) => {
38
+ l({ ...o, enabled: e });
39
+ }, j = (e) => {
40
+ l({ ...o, concurrent: e });
41
+ }, V = () => {
42
+ if (p) {
43
+ const e = v ?? P;
44
+ if (o.storages.length + d.length >= e) return;
45
+ h([...d, { replicationId: z(), storageId: "", storagePath: "", storageType: "", addedAt: Date.now() }]);
46
+ } else {
47
+ const e = v ?? P;
48
+ if (o.storages.length >= e) return;
49
+ l({
50
+ ...o,
51
+ storages: [...o.storages, { replicationId: z(), storageId: "", storagePath: "", storageType: "", addedAt: Date.now() }]
52
+ });
53
+ }
54
+ }, O = (e, t) => {
55
+ h((a) => {
56
+ const i = [...a];
57
+ return i[e] = t, i;
58
+ });
59
+ }, E = (e) => {
60
+ const t = d[e];
61
+ if (t.storageId) {
62
+ if (t.storageId === C && t.storagePath === D) {
63
+ A.error("Cannot replicate to the same storage as the primary backup.");
64
+ return;
65
+ }
66
+ if (H(t.storageId, t.storagePath, void 0, e)) {
67
+ A.error("This storage destination is already added.");
68
+ return;
69
+ }
70
+ h((a) => a.filter((i, S) => S !== e)), l({ ...o, storages: [...o.storages, t] });
71
+ }
72
+ }, L = (e) => {
73
+ h((t) => t.filter((a, i) => i !== e));
74
+ }, X = (e, t) => {
75
+ const a = [...o.storages];
76
+ a[e] = t, l({ ...o, storages: a });
77
+ }, Y = (e) => {
78
+ const t = o.storages.filter((a, i) => i !== e);
79
+ l({ ...o, storages: t });
80
+ }, q = () => {
81
+ if (typeof R == "object" && M) {
82
+ const e = R;
83
+ c.mutate(
84
+ {
85
+ planID: M,
86
+ storageID: e.storageId,
87
+ removeData: T,
88
+ storagePath: e.storagePath,
89
+ replicationId: e.replicationId
90
+ },
91
+ {
92
+ onSuccess: () => {
93
+ const t = o.storages.filter((a) => a.replicationId !== e.replicationId);
94
+ l({ ...o, storages: t, ...t.length === 0 && { enabled: !1 } }), b(!1), u(!1), c.reset();
95
+ }
96
+ }
97
+ );
98
+ }
99
+ }, F = (e) => {
100
+ u(!1), c.reset(), b(e);
101
+ };
102
+ return /* @__PURE__ */ s("div", { className: f.field, children: [
103
+ /* @__PURE__ */ s("div", { className: n.mirrorSection, children: [
104
+ /* @__PURE__ */ r(
105
+ N,
106
+ {
107
+ label: "Enable Replication",
108
+ description: "Replicate backups to additional storage destinations for redundancy (3-2-1 backup strategy)",
109
+ fieldValue: o.enabled,
110
+ onUpdate: _
111
+ }
112
+ ),
113
+ o.enabled && /* @__PURE__ */ s("div", { className: n.mirrorSettings, children: [
114
+ o.storages.map((e, t) => /* @__PURE__ */ s("div", { className: n.mirrorDestination, children: [
115
+ /* @__PURE__ */ s("div", { className: n.mirrorHeader, children: [
116
+ /* @__PURE__ */ s("label", { className: f.label, children: [
117
+ "Replication Destination ",
118
+ t + 1
119
+ ] }),
120
+ /* @__PURE__ */ s("div", { className: n.mirrorHeaderRight, children: [
121
+ o.storages.length > 1 && /* @__PURE__ */ s("div", { className: n.storagePositionControls, children: [
122
+ /* @__PURE__ */ r(
123
+ "button",
124
+ {
125
+ title: "Move Up",
126
+ disabled: t === 0,
127
+ onClick: () => {
128
+ const a = [...o.storages || []], [i] = a.splice(t, 1);
129
+ a.splice(t - 1, 0, i), l({ ...o, storages: a });
130
+ },
131
+ children: /* @__PURE__ */ r(g, { type: "caret-up", size: 14 })
132
+ }
133
+ ),
134
+ /* @__PURE__ */ r(
135
+ "button",
136
+ {
137
+ title: "Move Down",
138
+ disabled: t === o.storages.length - 1,
139
+ onClick: () => {
140
+ const a = [...o.storages || []], [i] = a.splice(t, 1);
141
+ a.splice(t + 1, 0, i), l({ ...o, storages: a });
142
+ },
143
+ children: /* @__PURE__ */ r(g, { type: "caret-down", size: 14 })
144
+ }
145
+ )
146
+ ] }),
147
+ /* @__PURE__ */ s(
148
+ "button",
149
+ {
150
+ className: n.removeBtn,
151
+ onClick: () => p ? F(e) : Y(t),
152
+ title: "Remove replication destination",
153
+ children: [
154
+ /* @__PURE__ */ r(g, { type: "trash", size: 14 }),
155
+ " Remove"
156
+ ]
157
+ }
158
+ )
159
+ ] })
160
+ ] }),
161
+ /* @__PURE__ */ r(
162
+ w,
163
+ {
164
+ storagePath: e.storagePath,
165
+ storageId: e.storageId,
166
+ deviceId: k,
167
+ disabled: p,
168
+ onUpdate: (a) => {
169
+ if (a.storage.id === C && a.path === D) {
170
+ A.error("Cannot replicate to the same storage as the primary backup.");
171
+ return;
172
+ }
173
+ X(t, {
174
+ replicationId: e.replicationId,
175
+ storageId: a.storage.id,
176
+ storagePath: a.path,
177
+ storageType: a.storage.type,
178
+ storageName: a.storage.name,
179
+ addedAt: e.addedAt
180
+ });
181
+ }
182
+ }
183
+ )
184
+ ] }, e.addedAt || t)),
185
+ p && d.map((e, t) => /* @__PURE__ */ s("div", { className: n.mirrorDestination, children: [
186
+ /* @__PURE__ */ s("div", { className: n.mirrorHeader, children: [
187
+ /* @__PURE__ */ s("label", { className: f.label, children: [
188
+ "Replication Destination ",
189
+ o.storages.length + t + 1
190
+ ] }),
191
+ /* @__PURE__ */ s("div", { className: n.mirrorHeaderRight, children: [
192
+ /* @__PURE__ */ s(
193
+ "button",
194
+ {
195
+ className: n.confirmBtn,
196
+ onClick: () => E(t),
197
+ disabled: !e.storageId,
198
+ title: e.storageId ? "Confirm replication destination" : "Select Storage Type to add the storage",
199
+ children: [
200
+ /* @__PURE__ */ r(g, { type: "check", size: 11 }),
201
+ " Confirm"
202
+ ]
203
+ }
204
+ ),
205
+ /* @__PURE__ */ s(
206
+ "button",
207
+ {
208
+ className: n.removeBtn,
209
+ onClick: () => L(t),
210
+ title: "Remove replication destination",
211
+ children: [
212
+ /* @__PURE__ */ r(g, { type: "trash", size: 14 }),
213
+ " Remove"
214
+ ]
215
+ }
216
+ )
217
+ ] })
218
+ ] }),
219
+ /* @__PURE__ */ r(
220
+ w,
221
+ {
222
+ storagePath: e.storagePath,
223
+ storageId: e.storageId,
224
+ deviceId: k,
225
+ disabled: !1,
226
+ onUpdate: (a) => {
227
+ O(t, {
228
+ replicationId: e.replicationId,
229
+ storageId: a.storage.id,
230
+ storagePath: a.path,
231
+ storageType: a.storage.type,
232
+ storageName: a.storage.name,
233
+ addedAt: e.addedAt
234
+ });
235
+ }
236
+ }
237
+ )
238
+ ] }, e.addedAt)),
239
+ o.storages.length + (p ? d.length : 0) < (v ?? P) && /* @__PURE__ */ s("button", { className: n.addMirrorBtn, onClick: V, children: [
240
+ /* @__PURE__ */ r(g, { type: "plus", size: 12 }),
241
+ " + Add Replication Destination"
242
+ ] }),
243
+ o.storages.length > 1 && /* @__PURE__ */ r("div", { className: n.concurrentOption, children: /* @__PURE__ */ r(
244
+ N,
245
+ {
246
+ label: "Run replications concurrently",
247
+ description: "Run replications in parallel to speed up the backup process",
248
+ fieldValue: o.concurrent,
249
+ onUpdate: j
250
+ }
251
+ ) })
252
+ ] })
253
+ ] }),
254
+ R && /* @__PURE__ */ r(
255
+ K,
256
+ {
257
+ title: "Remove Replication Storage",
258
+ message: /* @__PURE__ */ s("div", { children: [
259
+ /* @__PURE__ */ r("p", { children: "Are you sure you want to remove this Replication storage from this plan?" }),
260
+ /* @__PURE__ */ r(
261
+ N,
262
+ {
263
+ fieldValue: T,
264
+ onUpdate: () => u((e) => !e),
265
+ description: "Remove replicated data from the Storage",
266
+ customClasses: f.removeRemoteToggle
267
+ }
268
+ )
269
+ ] }),
270
+ closeModal: () => {
271
+ c.isPending || (b(!1), u(!1), c.reset());
272
+ },
273
+ width: "400px",
274
+ errorMessage: c.isError && "Error Removing Replication Storage!",
275
+ successMessage: c.isSuccess && "Removed Replication Storage Successfully!",
276
+ primaryAction: {
277
+ title: "Yes, Remove Storage",
278
+ type: "danger",
279
+ icon: "trash",
280
+ isPending: c.isPending,
281
+ action: () => q()
282
+ }
283
+ }
284
+ )
285
+ ] });
286
+ };
287
+ export {
288
+ ne as default
289
+ };
290
+ //# sourceMappingURL=PlanReplicationSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanReplicationSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanReplicationSettings.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\r\nimport { PlanReplicationSettings as ReplicationSettings, PlanReplicationStorage } from '../../../@types/plans';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport StoragePicker from '../../common/form/StoragePicker/StoragePicker';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport classes from '../../Plan/AddPlan/AddPlan.module.scss';\r\nimport mirrorClasses from './PlanReplicationSettings.module.scss';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\nimport { useDeleteReplicationStorage } from '../../../services';\r\nimport { toast } from 'react-toastify';\r\nimport { nanoid } from 'nanoid';\r\n\r\ninterface PlanReplicationSettingsProps {\r\n replication?: ReplicationSettings;\r\n primaryStorageId: string;\r\n primaryStoragePath?: string;\r\n deviceId: string;\r\n isEditing?: boolean;\r\n planID?: string;\r\n maxReplications?: number;\r\n onUpdate: (replication: ReplicationSettings) => void;\r\n}\r\n\r\nconst defaultReplication: ReplicationSettings = {\r\n enabled: false,\r\n concurrent: false,\r\n storages: [],\r\n};\r\n\r\nconst MAX_REPLICATIONS = 2;\r\n\r\nconst PlanReplicationSettings = ({\r\n replication,\r\n primaryStorageId,\r\n primaryStoragePath,\r\n deviceId,\r\n isEditing = false,\r\n planID,\r\n maxReplications: maxReplicationsProp,\r\n onUpdate,\r\n}: PlanReplicationSettingsProps) => {\r\n const [tempStorages, setTempStorages] = useState<PlanReplicationStorage[]>([]);\r\n const [removeStorageData, setRemoveStorageData] = useState<boolean>(false);\r\n const [showRemoveModal, setShowRemoveModal] = useState<boolean | PlanReplicationStorage>(false);\r\n\r\n const deleteStorageMutation = useDeleteReplicationStorage();\r\n const settings = replication || defaultReplication;\r\n\r\n /** Check if a storage+path combination already exists in committed or temp storages */\r\n const isDuplicateStorage = useCallback(\r\n (storageId: string, storagePath: string, excludeCommittedIndex?: number, excludeTempIndex?: number) => {\r\n // Skip duplicate check if storageId or storagePath is empty (incomplete selection)\r\n if (!storageId || !storagePath) return false;\r\n const committedDuplicate = settings.storages.some(\r\n (s, i) =>\r\n (excludeCommittedIndex === undefined || i !== excludeCommittedIndex) && s.storageId === storageId && s.storagePath === storagePath,\r\n );\r\n const tempDuplicate = tempStorages.some(\r\n (s, i) => (excludeTempIndex === undefined || i !== excludeTempIndex) && s.storageId === storageId && s.storagePath === storagePath,\r\n );\r\n return committedDuplicate || tempDuplicate;\r\n },\r\n [settings.storages, tempStorages],\r\n );\r\n\r\n const updateEnabled = (enabled: boolean) => {\r\n onUpdate({ ...settings, enabled });\r\n };\r\n\r\n const updateConcurrent = (concurrent: boolean) => {\r\n onUpdate({ ...settings, concurrent });\r\n };\r\n\r\n const addReplicationStorage = () => {\r\n if (isEditing) {\r\n const maxReplications = maxReplicationsProp ?? MAX_REPLICATIONS;\r\n if (settings.storages.length + tempStorages.length >= maxReplications) return;\r\n setTempStorages([...tempStorages, { replicationId: nanoid(), storageId: '', storagePath: '', storageType: '', addedAt: Date.now() }]);\r\n } else {\r\n const maxReplications = maxReplicationsProp ?? MAX_REPLICATIONS;\r\n if (settings.storages.length >= maxReplications) return;\r\n onUpdate({\r\n ...settings,\r\n storages: [...settings.storages, { replicationId: nanoid(), storageId: '', storagePath: '', storageType: '', addedAt: Date.now() }],\r\n });\r\n }\r\n };\r\n\r\n const updateTempStorage = (index: number, storage: PlanReplicationStorage) => {\r\n setTempStorages((prev) => {\r\n const updated = [...prev];\r\n updated[index] = storage;\r\n return updated;\r\n });\r\n };\r\n\r\n const confirmAddStorage = (index: number) => {\r\n const storage = tempStorages[index];\r\n if (!storage.storageId) return;\r\n if (storage.storageId === primaryStorageId && storage.storagePath === primaryStoragePath) {\r\n toast.error('Cannot replicate to the same storage as the primary backup.');\r\n return;\r\n }\r\n if (isDuplicateStorage(storage.storageId, storage.storagePath, undefined, index)) {\r\n toast.error('This storage destination is already added.');\r\n return;\r\n }\r\n setTempStorages((prev) => prev.filter((_, i) => i !== index));\r\n onUpdate({ ...settings, storages: [...settings.storages, storage] });\r\n };\r\n\r\n const removeTempStorage = (index: number) => {\r\n setTempStorages((prev) => prev.filter((_, i) => i !== index));\r\n };\r\n\r\n const updateReplicationStorage = (index: number, storage: PlanReplicationStorage) => {\r\n const updated = [...settings.storages];\r\n updated[index] = storage;\r\n onUpdate({ ...settings, storages: updated });\r\n };\r\n\r\n const removeAddedStorage = (index: number) => {\r\n const updated = settings.storages.filter((_, i) => i !== index);\r\n onUpdate({ ...settings, storages: updated });\r\n };\r\n\r\n const removeReplicationStorage = () => {\r\n if (typeof showRemoveModal === 'object' && planID) {\r\n const storageToRemove = showRemoveModal;\r\n deleteStorageMutation.mutate(\r\n {\r\n planID: planID,\r\n storageID: storageToRemove.storageId,\r\n removeData: removeStorageData,\r\n storagePath: storageToRemove.storagePath,\r\n replicationId: storageToRemove.replicationId,\r\n },\r\n {\r\n onSuccess: () => {\r\n // Remove the storage from local state and close modal\r\n const updated = settings.storages.filter((s) => s.replicationId !== storageToRemove.replicationId);\r\n onUpdate({ ...settings, storages: updated, ...(updated.length === 0 && { enabled: false }) });\r\n setShowRemoveModal(false);\r\n setRemoveStorageData(false);\r\n deleteStorageMutation.reset();\r\n },\r\n },\r\n );\r\n }\r\n };\r\n\r\n const openRemoveModal = (mirror: PlanReplicationStorage) => {\r\n setRemoveStorageData(false);\r\n deleteStorageMutation.reset();\r\n setShowRemoveModal(mirror);\r\n };\r\n\r\n return (\r\n <div className={classes.field}>\r\n <div className={mirrorClasses.mirrorSection}>\r\n <Toggle\r\n label=\"Enable Replication\"\r\n description=\"Replicate backups to additional storage destinations for redundancy (3-2-1 backup strategy)\"\r\n fieldValue={settings.enabled}\r\n onUpdate={updateEnabled}\r\n />\r\n\r\n {settings.enabled && (\r\n <div className={mirrorClasses.mirrorSettings}>\r\n {settings.storages.map((mirror, index) => (\r\n <div key={mirror.addedAt || index} className={mirrorClasses.mirrorDestination}>\r\n <div className={mirrorClasses.mirrorHeader}>\r\n <label className={classes.label}>Replication Destination {index + 1}</label>\r\n <div className={mirrorClasses.mirrorHeaderRight}>\r\n {settings.storages.length > 1 && (\r\n <div className={mirrorClasses.storagePositionControls}>\r\n <button\r\n title=\"Move Up\"\r\n disabled={index === 0}\r\n onClick={() => {\r\n const updatedStorages = [...(settings.storages || [])];\r\n const [movedStorage] = updatedStorages.splice(index, 1);\r\n updatedStorages.splice(index - 1, 0, movedStorage);\r\n onUpdate({ ...settings, storages: updatedStorages });\r\n }}\r\n >\r\n <Icon type={'caret-up'} size={14} />\r\n </button>\r\n <button\r\n title=\"Move Down\"\r\n disabled={index === settings.storages.length - 1}\r\n onClick={() => {\r\n const updatedStorages = [...(settings.storages || [])];\r\n const [movedStorage] = updatedStorages.splice(index, 1);\r\n updatedStorages.splice(index + 1, 0, movedStorage);\r\n onUpdate({ ...settings, storages: updatedStorages });\r\n }}\r\n >\r\n <Icon type={'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n )}\r\n <button\r\n className={mirrorClasses.removeBtn}\r\n onClick={() => (isEditing ? openRemoveModal(mirror) : removeAddedStorage(index))}\r\n title=\"Remove replication destination\"\r\n >\r\n <Icon type=\"trash\" size={14} /> Remove\r\n </button>\r\n </div>\r\n </div>\r\n <StoragePicker\r\n storagePath={mirror.storagePath}\r\n storageId={mirror.storageId}\r\n deviceId={deviceId}\r\n disabled={isEditing}\r\n onUpdate={(s) => {\r\n if (s.storage.id === primaryStorageId && s.path === primaryStoragePath) {\r\n toast.error('Cannot replicate to the same storage as the primary backup.');\r\n return;\r\n }\r\n updateReplicationStorage(index, {\r\n replicationId: mirror.replicationId,\r\n storageId: s.storage.id,\r\n storagePath: s.path,\r\n storageType: s.storage.type,\r\n storageName: s.storage.name,\r\n addedAt: mirror.addedAt,\r\n });\r\n }}\r\n />\r\n </div>\r\n ))}\r\n\r\n {isEditing &&\r\n tempStorages.map((tempStorage, index) => (\r\n <div key={tempStorage.addedAt} className={mirrorClasses.mirrorDestination}>\r\n <div className={mirrorClasses.mirrorHeader}>\r\n <label className={classes.label}>Replication Destination {settings.storages.length + index + 1}</label>\r\n <div className={mirrorClasses.mirrorHeaderRight}>\r\n <button\r\n className={mirrorClasses.confirmBtn}\r\n onClick={() => confirmAddStorage(index)}\r\n disabled={!tempStorage.storageId}\r\n title={!tempStorage.storageId ? 'Select Storage Type to add the storage' : 'Confirm replication destination'}\r\n >\r\n <Icon type=\"check\" size={11} /> Confirm\r\n </button>\r\n <button\r\n className={mirrorClasses.removeBtn}\r\n onClick={() => removeTempStorage(index)}\r\n title=\"Remove replication destination\"\r\n >\r\n <Icon type=\"trash\" size={14} /> Remove\r\n </button>\r\n </div>\r\n </div>\r\n <StoragePicker\r\n storagePath={tempStorage.storagePath}\r\n storageId={tempStorage.storageId}\r\n deviceId={deviceId}\r\n disabled={false}\r\n onUpdate={(s) => {\r\n updateTempStorage(index, {\r\n replicationId: tempStorage.replicationId,\r\n storageId: s.storage.id,\r\n storagePath: s.path,\r\n storageType: s.storage.type,\r\n storageName: s.storage.name,\r\n addedAt: tempStorage.addedAt,\r\n });\r\n }}\r\n />\r\n </div>\r\n ))}\r\n\r\n {settings.storages.length + (isEditing ? tempStorages.length : 0) < (maxReplicationsProp ?? MAX_REPLICATIONS) && (\r\n <button className={mirrorClasses.addMirrorBtn} onClick={addReplicationStorage}>\r\n <Icon type=\"plus\" size={12} /> + Add Replication Destination\r\n </button>\r\n )}\r\n\r\n {settings.storages.length > 1 && (\r\n <div className={mirrorClasses.concurrentOption}>\r\n <Toggle\r\n label=\"Run replications concurrently\"\r\n description=\"Run replications in parallel to speed up the backup process\"\r\n fieldValue={settings.concurrent}\r\n onUpdate={updateConcurrent}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {showRemoveModal && (\r\n <ActionModal\r\n title=\"Remove Replication Storage\"\r\n message={\r\n <div>\r\n <p>Are you sure you want to remove this Replication storage from this plan?</p>\r\n <Toggle\r\n fieldValue={removeStorageData}\r\n onUpdate={() => setRemoveStorageData((prev) => !prev)}\r\n description={`Remove replicated data from the Storage`}\r\n customClasses={classes.removeRemoteToggle}\r\n />\r\n </div>\r\n }\r\n closeModal={() => {\r\n if (!deleteStorageMutation.isPending) {\r\n setShowRemoveModal(false);\r\n setRemoveStorageData(false);\r\n deleteStorageMutation.reset();\r\n }\r\n }}\r\n width=\"400px\"\r\n errorMessage={deleteStorageMutation.isError && 'Error Removing Replication Storage!'}\r\n successMessage={deleteStorageMutation.isSuccess && 'Removed Replication Storage Successfully!'}\r\n primaryAction={{\r\n title: 'Yes, Remove Storage',\r\n type: 'danger',\r\n icon: 'trash',\r\n isPending: deleteStorageMutation.isPending,\r\n action: () => removeReplicationStorage(),\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanReplicationSettings;\r\n"],"names":["defaultReplication","MAX_REPLICATIONS","PlanReplicationSettings","replication","primaryStorageId","primaryStoragePath","deviceId","isEditing","planID","maxReplicationsProp","onUpdate","tempStorages","setTempStorages","useState","removeStorageData","setRemoveStorageData","showRemoveModal","setShowRemoveModal","deleteStorageMutation","useDeleteReplicationStorage","settings","isDuplicateStorage","useCallback","storageId","storagePath","excludeCommittedIndex","excludeTempIndex","committedDuplicate","s","i","tempDuplicate","updateEnabled","enabled","updateConcurrent","concurrent","addReplicationStorage","maxReplications","nanoid","updateTempStorage","index","storage","prev","updated","confirmAddStorage","toast","_","removeTempStorage","updateReplicationStorage","removeAddedStorage","removeReplicationStorage","storageToRemove","openRemoveModal","mirror","jsxs","classes","mirrorClasses","jsx","Toggle","updatedStorages","movedStorage","Icon","StoragePicker","tempStorage","ActionModal"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ const r = "_mirrorSection_Efsq1", o = "_mirrorSettings_AJKTW", t = "_mirrorDestination_3RA9j", n = "_mirrorHeader_aDDut", i = "_mirrorHeaderRight_p0Kdg", e = "_confirmBtn_TAGXU", s = "_removeBtn_Bx8Qq", c = "_storagePositionControls_fUF7P", m = "_addMirrorBtn_VVs1x", _ = "_concurrentOption_CHkh6", a = {
2
+ mirrorSection: r,
3
+ mirrorSettings: o,
4
+ mirrorDestination: t,
5
+ mirrorHeader: n,
6
+ mirrorHeaderRight: i,
7
+ confirmBtn: e,
8
+ removeBtn: s,
9
+ storagePositionControls: c,
10
+ addMirrorBtn: m,
11
+ concurrentOption: _
12
+ };
13
+ export {
14
+ m as addMirrorBtn,
15
+ _ as concurrentOption,
16
+ e as confirmBtn,
17
+ a as default,
18
+ t as mirrorDestination,
19
+ n as mirrorHeader,
20
+ i as mirrorHeaderRight,
21
+ r as mirrorSection,
22
+ o as mirrorSettings,
23
+ s as removeBtn,
24
+ c as storagePositionControls
25
+ };
26
+ //# sourceMappingURL=PlanReplicationSettings.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanReplicationSettings.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;AAK7C,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,4CAiFlE,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;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,4CAgFlE,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1,25 +1,26 @@
1
- import { jsxs as i, jsx as t } from "react/jsx-runtime";
1
+ import { jsxs as i, jsx as e } from "react/jsx-runtime";
2
2
  import a from "../../common/Icon/Icon.js";
3
- import { formatNumberToK as f, formatBytes as u } from "../../../utils/helpers.js";
3
+ import { formatNumberToK as u, formatBytes as T } from "../../../utils/helpers.js";
4
4
  import S from "../PlanHistory/PlanHistory.js";
5
- import d from "./PlanStats.module.scss.js";
6
- const w = ({ plan: r, isSync: h, lastBackupItem: n }) => {
7
- const { sourceConfig: c, storage: e, storagePath: g, isActive: v, settings: N } = r, { interval: o } = N, m = (n == null ? void 0 : n.totalFiles) || 0, y = (n == null ? void 0 : n.totalSize) || 0, T = (l) => {
8
- let s = "";
9
- return l && l.includes && l.includes.length > 0 && (s += "<div><strong>Includes</strong></div>", s += l.includes.map((p) => `<div>${r.device.name} -> ${p}</div>`).join("")), l && l.excludes && l.excludes.length > 0 && (s += "<div><strong>Excludes</strong></div>", s += l.excludes.map((p) => `<div>${p}</div>`).join("")), s;
5
+ import t from "./PlanStats.module.scss.js";
6
+ import z from "../PlanStorageInfo/PlanStorageInfo.js";
7
+ const C = ({ plan: d, isSync: c, lastBackupItem: s }) => {
8
+ const { sourceConfig: r, storage: g, storagePath: y, isActive: p, settings: f } = d, { interval: n } = f, m = (s == null ? void 0 : s.totalFiles) || 0, v = (s == null ? void 0 : s.totalSize) || 0, N = (l) => {
9
+ let o = "";
10
+ return l && l.includes && l.includes.length > 0 && (o += "<div><strong>Includes</strong></div>", o += l.includes.map((h) => `<div>${d.device.name} -> ${h}</div>`).join("")), l && l.excludes && l.excludes.length > 0 && (o += "<div><strong>Excludes</strong></div>", o += l.excludes.map((h) => `<div>${h}</div>`).join("")), o;
10
11
  };
11
- return /* @__PURE__ */ i("div", { className: d.planStats, children: [
12
- /* @__PURE__ */ i("div", { className: d.sources, children: [
13
- /* @__PURE__ */ i("div", { className: d.widgetTitle, children: [
14
- /* @__PURE__ */ t(a, { type: "backup", size: 12 }),
12
+ return /* @__PURE__ */ i("div", { className: t.planStats, children: [
13
+ /* @__PURE__ */ i("div", { className: t.sources, children: [
14
+ /* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
15
+ /* @__PURE__ */ e(a, { type: "backup", size: 12 }),
15
16
  " ",
16
- h ? "Syncing" : "Backing Up"
17
+ c ? "Syncing" : "Backing Up"
17
18
  ] }),
18
- /* @__PURE__ */ i("div", { className: d.sourceContent, children: [
19
- /* @__PURE__ */ i("div", { "data-tooltip-id": "htmlToolTip", "data-tooltip-place": "top", "data-tooltip-html": T(c), children: [
20
- /* @__PURE__ */ t(a, { type: "folders", size: 18 }),
19
+ /* @__PURE__ */ i("div", { className: t.sourceContent, children: [
20
+ /* @__PURE__ */ i("div", { "data-tooltip-id": "htmlToolTip", "data-tooltip-place": "top", "data-tooltip-html": N(r), children: [
21
+ /* @__PURE__ */ e(a, { type: "folders", size: 18 }),
21
22
  /* @__PURE__ */ i("span", { children: [
22
- c == null ? void 0 : c.includes.length,
23
+ r == null ? void 0 : r.includes.length,
23
24
  " Sources"
24
25
  ] })
25
26
  ] }),
@@ -28,54 +29,52 @@ const w = ({ plan: r, isSync: h, lastBackupItem: n }) => {
28
29
  {
29
30
  "data-tooltip-id": "htmlToolTip",
30
31
  "data-tooltip-place": "top",
31
- "data-tooltip-html": v ? h ? `Syncing changes every ${o.minutes} minutes` : `Copying changes ${["hours", "minutes", "days"].includes(o.type) ? o[o.type] + o.type : o.type}` : "Plan is Not Active",
32
+ "data-tooltip-html": p ? c ? `Syncing changes every ${n.minutes} minutes` : `Copying changes ${["hours", "minutes", "days"].includes(n.type) ? n[n.type] + n.type : n.type}` : "Plan is Not Active",
32
33
  children: [
33
- /* @__PURE__ */ t(a, { type: v ? h ? "reload" : "copy" : "pause", size: 16 }),
34
- /* @__PURE__ */ t("div", { className: d.sourceArrow, children: "→" })
34
+ /* @__PURE__ */ e(a, { type: p ? c ? "reload" : "copy" : "pause", size: 16 }),
35
+ /* @__PURE__ */ e("div", { className: t.sourceArrow, children: "→" })
35
36
  ]
36
37
  }
37
38
  ),
38
- /* @__PURE__ */ i(
39
- "div",
39
+ /* @__PURE__ */ e(
40
+ z,
40
41
  {
41
- "data-tooltip-id": "htmlToolTip",
42
- "data-tooltip-place": "top",
43
- "data-tooltip-html": `<div><strong>Storage:</strong> ${e == null ? void 0 : e.name}</div><div><strong>Path:</strong> ${g || "/"}</div>`,
44
- children: [
45
- (e == null ? void 0 : e.type) && /* @__PURE__ */ t("img", { src: `/providers/${e == null ? void 0 : e.type}.png` }),
46
- e == null ? void 0 : e.name
47
- ]
42
+ disableTooltip: !1,
43
+ inline: !1,
44
+ replicationSettings: d.settings.replication,
45
+ storage: g,
46
+ storagePath: y
48
47
  }
49
48
  )
50
49
  ] })
51
50
  ] }),
52
- /* @__PURE__ */ i("div", { className: d.snapshots, children: [
53
- /* @__PURE__ */ i("div", { className: d.widgetTitle, children: [
54
- /* @__PURE__ */ t(a, { type: "folders", size: 12 }),
51
+ /* @__PURE__ */ i("div", { className: t.snapshots, children: [
52
+ /* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
53
+ /* @__PURE__ */ e(a, { type: "folders", size: 12 }),
55
54
  " Source Stats"
56
55
  ] }),
57
- /* @__PURE__ */ i("div", { className: d.snapshotsContent, children: [
56
+ /* @__PURE__ */ i("div", { className: t.snapshotsContent, children: [
58
57
  /* @__PURE__ */ i("div", { children: [
59
- /* @__PURE__ */ t("span", { children: m ? f(m) : 0 }),
60
- /* @__PURE__ */ t("span", { children: "Files" })
58
+ /* @__PURE__ */ e("span", { children: m ? u(m) : 0 }),
59
+ /* @__PURE__ */ e("span", { children: "Files" })
61
60
  ] }),
62
- /* @__PURE__ */ t("div", {}),
61
+ /* @__PURE__ */ e("div", {}),
63
62
  /* @__PURE__ */ i("div", { children: [
64
- /* @__PURE__ */ t("span", { children: y ? u(y) : "0.00B" }),
65
- /* @__PURE__ */ t("span", { children: "Size" })
63
+ /* @__PURE__ */ e("span", { children: v ? T(v) : "0.00B" }),
64
+ /* @__PURE__ */ e("span", { children: "Size" })
66
65
  ] })
67
66
  ] })
68
67
  ] }),
69
- /* @__PURE__ */ i("div", { className: d.health, children: [
70
- /* @__PURE__ */ i("div", { className: d.widgetTitle, children: [
71
- /* @__PURE__ */ t(a, { type: "speed", size: 12 }),
68
+ /* @__PURE__ */ i("div", { className: t.health, children: [
69
+ /* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
70
+ /* @__PURE__ */ e(a, { type: "speed", size: 12 }),
72
71
  " Health"
73
72
  ] }),
74
- /* @__PURE__ */ t("div", { className: d.healthContent, children: /* @__PURE__ */ t(S, { planId: r.id, history: r.backups, itemsCount: 90 }) })
73
+ /* @__PURE__ */ e("div", { className: t.healthContent, children: /* @__PURE__ */ e(S, { planId: d.id, history: d.backups, itemsCount: 90 }) })
75
74
  ] })
76
75
  ] });
77
76
  };
78
77
  export {
79
- w as default
78
+ C as default
80
79
  };
81
80
  //# 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 } from '../../../utils/helpers';\r\nimport PlanHistory from '../PlanHistory/PlanHistory';\r\nimport classes from './PlanStats.module.scss';\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={\r\n isActive\r\n ? isSync\r\n ? `Syncing changes every ${interval.minutes} minutes`\r\n : `Copying changes ${['hours', 'minutes', 'days'].includes(interval.type) ? interval[interval.type as 'hours' | 'minutes' | 'days'] + interval.type : interval.type}`\r\n : 'Plan is Not Active'\r\n }\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 <div\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={`<div><strong>Storage:</strong> ${storage?.name}</div><div><strong>Path:</strong> ${storagePath || '/'}</div>`}\r\n >\r\n {storage?.type && <img src={`/providers/${storage?.type}.png`} />}\r\n {storage?.name}\r\n </div>\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","jsxs","classes","jsx","Icon","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 { formatBytes, formatNumberToK } 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={\r\n isActive\r\n ? isSync\r\n ? `Syncing changes every ${interval.minutes} minutes`\r\n : `Copying changes ${['hours', 'minutes', 'days'].includes(interval.type) ? interval[interval.type as 'hours' | 'minutes' | 'days'] + interval.type : interval.type}`\r\n : 'Plan is Not Active'\r\n }\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","PlanStorageInfo","formatNumberToK","formatBytes","PlanHistory"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- const s = "_planStats_Wa7Nw", t = "_widgetTitle_nMFL3", o = "_sources_mEh1x", n = "_snapshots_j4WO4", e = "_health_WLxE7", a = "_sourceContent_IVx9v", c = "_sourceArrow_L93n4", r = "_snapshotsContent_oCZ63", _ = {
1
+ const s = "_planStats_rYcAd", t = "_widgetTitle_PJX4o", o = "_sources_KFvuD", n = "_snapshots_s9ThB", e = "_health_Tux66", c = "_sourceContent_ioGQg", a = "_sourceArrow_VI4d7", r = "_snapshotsContent_ZuAcY", _ = {
2
2
  planStats: s,
3
3
  widgetTitle: t,
4
4
  sources: o,
5
5
  snapshots: n,
6
6
  health: e,
7
- sourceContent: a,
8
- sourceArrow: c,
7
+ sourceContent: c,
8
+ sourceArrow: a,
9
9
  snapshotsContent: r
10
10
  };
11
11
  export {
@@ -14,8 +14,8 @@ export {
14
14
  s as planStats,
15
15
  n as snapshots,
16
16
  r as snapshotsContent,
17
- c as sourceArrow,
18
- a as sourceContent,
17
+ a as sourceArrow,
18
+ c as sourceContent,
19
19
  o as sources,
20
20
  t as widgetTitle
21
21
  };
@@ -0,0 +1,15 @@
1
+ import { PlanReplicationSettings } from '../../../@types';
2
+ interface PlanStorageInfoProps {
3
+ storage: {
4
+ name: string;
5
+ type: string;
6
+ id: string;
7
+ };
8
+ storagePath: string;
9
+ replicationSettings?: PlanReplicationSettings;
10
+ disableTooltip?: boolean;
11
+ inline?: boolean;
12
+ }
13
+ declare const PlanStorageInfo: ({ replicationSettings, storage, storagePath, disableTooltip, inline }: PlanStorageInfoProps) => import("react/jsx-runtime").JSX.Element;
14
+ export default PlanStorageInfo;
15
+ //# sourceMappingURL=PlanStorageInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanStorageInfo.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanStorageInfo/PlanStorageInfo.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,UAAU,oBAAoB;IAC3B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,QAAA,MAAM,eAAe,GAAI,uEAAqF,oBAAoB,4CAqEjI,CAAC;AAEF,eAAe,eAAe,CAAC"}